Lines Matching +full:timing +full:- +full:0
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
35 * Group. This Simplified Specification is provided on a non-confidential
38 * Association, SD Group, SD-3C LLC or other third parties.
44 * is provided "AS-IS" without any representations or warranties of any
45 * kind. No responsibility is assumed by the SD Group, SD-3C LLC or the SD
47 * right of the SD Group, SD-3C LLC, the SD Card Association or any third
50 * SD Group, SD-3C LLC, the SD Card Association or any third party. Nothing
51 * herein shall be construed as an obligation by the SD Group, the SD-3C LLC
53 * information, know-how or other confidential information to any third party.
82 * Per-card data
91 u_char read_only; /* True when the device is read-only */
107 uint32_t quirks; /* Quirks as per mmc_quirk->quirks */
109 char card_sn_string[16];/* Formatted serial # for disk->d_ident */
119 { 0x2, 0x100, "SEM02G", MMC_QUIRK_INAND_CMD38 },
120 { 0x2, 0x100, "SEM04G", MMC_QUIRK_INAND_CMD38 },
121 { 0x2, 0x100, "SEM08G", MMC_QUIRK_INAND_CMD38 },
122 { 0x2, 0x100, "SEM16G", MMC_QUIRK_INAND_CMD38 },
123 { 0x2, 0x100, "SEM32G", MMC_QUIRK_INAND_CMD38 },
129 { 0x70, MMC_QUIRK_OID_ANY, "V10008", MMC_QUIRK_BROKEN_TRIM },
130 { 0x70, MMC_QUIRK_OID_ANY, "V10016", MMC_QUIRK_BROKEN_TRIM },
131 { 0x0, 0x0, NULL, 0x0 }
138 SYSCTL_INT(_hw_mmc, OID_AUTO, debug, CTLFLAG_RWTUN, &mmc_debug, 0,
159 #define MMC_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx)
160 #define MMC_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx)
162 mtx_init(&(_sc)->sc_mtx, device_get_nameunit((_sc)->dev), \
164 #define MMC_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->sc_mtx);
165 #define MMC_ASSERT_LOCKED(_sc) mtx_assert(&(_sc)->sc_mtx, MA_OWNED);
166 #define MMC_ASSERT_UNLOCKED(_sc) mtx_assert(&(_sc)->sc_mtx, MA_NOTOWNED);
190 static bool mmc_host_timing(device_t dev, enum mmc_bus_timing timing);
212 enum mmc_bus_timing timing);
216 enum mmc_bus_timing timing);
218 enum mmc_bus_timing timing);
225 enum mmc_bus_timing timing);
226 static const char *mmc_timing_to_string(enum mmc_bus_timing timing);
245 return (0); in mmc_probe()
254 sc->dev = dev; in mmc_attach()
258 sc->config_intrhook.ich_func = mmc_delayed_attach; in mmc_attach()
259 sc->config_intrhook.ich_arg = sc; in mmc_attach()
260 if (config_intrhook_establish(&sc->config_intrhook) != 0) in mmc_attach()
262 return (0); in mmc_attach()
271 config_intrhook_drain(&sc->config_intrhook); in mmc_detach()
273 if (err != 0) in mmc_detach()
278 return (0); in mmc_detach()
288 if (err != 0) in mmc_suspend()
292 * is selected any longer and sc->last_rca gets set to 0. Otherwise, in mmc_suspend()
298 if (err != 0) in mmc_suspend()
321 enum mmc_bus_timing timing; in mmc_acquire_bus() local
328 if (sc->owner) in mmc_acquire_bus()
330 sc->owner = dev; in mmc_acquire_bus()
341 rca = ivar->rca; in mmc_acquire_bus()
342 if (sc->last_rca != rca) { in mmc_acquire_bus()
348 sc->last_rca = rca; in mmc_acquire_bus()
349 timing = mmcbr_get_timing(busdev); in mmc_acquire_bus()
356 * can trigger re-tuning (via a CRC error on the next in mmc_acquire_bus()
359 * we need to re-tune the host controller if devices in mmc_acquire_bus()
362 if (timing >= bus_timing_mmc_ddr52 && in mmc_acquire_bus()
363 sc->child_count == 1) in mmc_acquire_bus()
364 return (0); in mmc_acquire_bus()
368 "setting bus width to %d bits %s timing\n", in mmc_acquire_bus()
369 (ivar->bus_width == bus_width_4) ? 4 : in mmc_acquire_bus()
370 (ivar->bus_width == bus_width_8) ? 8 : 1, in mmc_acquire_bus()
371 mmc_timing_to_string(timing)); in mmc_acquire_bus()
373 if (mmc_set_card_bus_width(sc, ivar, timing) != in mmc_acquire_bus()
380 mmcbr_set_bus_width(busdev, ivar->bus_width); in mmc_acquire_bus()
382 if (mmc_set_vccq(sc, ivar, timing) != MMC_ERR_NONE) { in mmc_acquire_bus()
387 if (timing >= bus_timing_mmc_hs200 && in mmc_acquire_bus()
388 mmc_retune(busdev, dev, true) != 0) { in mmc_acquire_bus()
390 "address %d failed to re-tune\n", rca); in mmc_acquire_bus()
398 if (sc->last_rca != 0) { in mmc_acquire_bus()
399 if (mmc_select_card(sc, 0) != MMC_ERR_NONE) in mmc_acquire_bus()
401 sc->last_rca = 0; in mmc_acquire_bus()
405 return (0); in mmc_acquire_bus()
416 if (!sc->owner) in mmc_release_bus()
418 if (sc->owner != dev) in mmc_release_bus()
420 sc->owner = NULL; in mmc_release_bus()
438 i >= MMC_OCR_MIN_VOLTAGE_SHIFT; i--) in mmc_highest_voltage()
441 return (-1); in mmc_highest_voltage()
449 sc = (struct mmc_softc *)req->done_data; in mmc_wakeup()
451 req->flags |= MMC_REQ_DONE; in mmc_wakeup()
460 req->done = mmc_wakeup; in mmc_wait_for_req()
461 req->done_data = sc; in mmc_wait_for_req()
463 device_printf(sc->dev, "REQUEST: CMD%d arg %#x flags %#x", in mmc_wait_for_req()
464 req->cmd->opcode, req->cmd->arg, req->cmd->flags); in mmc_wait_for_req()
465 if (req->cmd->data) { in mmc_wait_for_req()
466 printf(" data %d\n", (int)req->cmd->data->len); in mmc_wait_for_req()
470 MMCBR_REQUEST(device_get_parent(sc->dev), sc->dev, req); in mmc_wait_for_req()
472 while ((req->flags & MMC_REQ_DONE) == 0) in mmc_wait_for_req()
473 msleep(req, &sc->sc_mtx, 0, "mmcreq", 0); in mmc_wait_for_req()
475 if (__predict_false(mmc_debug > 2 || (mmc_debug > 0 && in mmc_wait_for_req()
476 req->cmd->error != MMC_ERR_NONE))) in mmc_wait_for_req()
477 device_printf(sc->dev, "CMD%d RESULT: %d\n", in mmc_wait_for_req()
478 req->cmd->opcode, req->cmd->error); in mmc_wait_for_req()
479 return (0); in mmc_wait_for_req()
491 KASSERT(sc->owner != NULL, in mmc_wait_for_request()
496 * Unless no device is selected or re-tuning is already ongoing, in mmc_wait_for_request()
497 * execute re-tuning if a) the bridge is requesting to do so and in mmc_wait_for_request()
498 * re-tuning hasn't been otherwise paused, or b) if a child asked in mmc_wait_for_request()
499 * to be re-tuned prior to pausing (see also mmc_retune_pause()). in mmc_wait_for_request()
501 if (__predict_false(sc->last_rca != 0 && sc->retune_ongoing == 0 && in mmc_wait_for_request()
503 sc->retune_paused == 0) || sc->retune_needed == 1))) { in mmc_wait_for_request()
506 "Re-tuning with%s circuit reset required\n", in mmc_wait_for_request()
512 for (i = 0; i < sc->child_count; i++) { in mmc_wait_for_request()
513 ivar = device_get_ivars(sc->child_list[i]); in mmc_wait_for_request()
514 if (ivar->rca == sc->last_rca) in mmc_wait_for_request()
517 if (ivar->rca != sc->last_rca) in mmc_wait_for_request()
520 sc->retune_ongoing = 1; in mmc_wait_for_request()
522 sc->retune_ongoing = 0; in mmc_wait_for_request()
525 case MMC_ERR_FAILED: /* Re-tune error but still might work */ in mmc_wait_for_request()
533 sc->retune_needed = 0; in mmc_wait_for_request()
545 memset(&cmd, 0, sizeof(cmd)); in mmc_wait_for_command()
550 err = mmc_wait_for_cmd(sc->dev, sc->dev, &cmd, retries); in mmc_wait_for_command()
557 *resp = cmd.resp[0]; in mmc_wait_for_command()
559 return (0); in mmc_wait_for_command()
568 dev = sc->dev; in mmc_idle_cards()
573 memset(&cmd, 0, sizeof(cmd)); in mmc_idle_cards()
575 cmd.arg = 0; in mmc_idle_cards()
578 mmc_wait_for_cmd(sc->dev, sc->dev, &cmd, CMD_RETRIES); in mmc_idle_cards()
592 memset(&cmd, 0, sizeof(cmd)); in mmc_send_app_op_cond()
598 for (i = 0; i < 1000; i++) { in mmc_send_app_op_cond()
599 err = mmc_wait_for_app_cmd(sc->dev, sc->dev, 0, &cmd, in mmc_send_app_op_cond()
603 if ((cmd.resp[0] & MMC_OCR_CARD_BUSY) || in mmc_send_app_op_cond()
604 (ocr & MMC_OCR_VOLTAGE) == 0) in mmc_send_app_op_cond()
610 *rocr = cmd.resp[0]; in mmc_send_app_op_cond()
620 memset(&cmd, 0, sizeof(cmd)); in mmc_send_op_cond()
626 for (i = 0; i < 1000; i++) { in mmc_send_op_cond()
627 err = mmc_wait_for_cmd(sc->dev, sc->dev, &cmd, CMD_RETRIES); in mmc_send_op_cond()
630 if ((cmd.resp[0] & MMC_OCR_CARD_BUSY) || in mmc_send_op_cond()
631 (ocr & MMC_OCR_VOLTAGE) == 0) in mmc_send_op_cond()
637 *rocr = cmd.resp[0]; in mmc_send_op_cond()
647 memset(&cmd, 0, sizeof(cmd)); in mmc_send_if_cond()
649 cmd.arg = (vhs << 8) + 0xAA; in mmc_send_if_cond()
653 err = mmc_wait_for_cmd(sc->dev, sc->dev, &cmd, CMD_RETRIES); in mmc_send_if_cond()
663 dev = sc->dev; in mmc_power_up()
669 mmcbr_set_clock(dev, 0); in mmc_power_up()
671 for (vccq = vccq_330; ; vccq--) { in mmc_power_up()
673 if (mmcbr_switch_vccq(dev) == 0 || vccq == vccq_120) in mmc_power_up()
688 device_t dev = sc->dev; in mmc_power_down()
694 mmcbr_set_clock(dev, 0); in mmc_power_down()
705 sc->retune_paused++; in mmc_select_card()
708 sc->retune_paused--; in mmc_select_card()
720 memset(&cmd, 0, sizeof(cmd)); in mmc_sd_switch()
721 memset(&data, 0, sizeof(data)); in mmc_sd_switch()
722 memset(res, 0, 64); in mmc_sd_switch()
726 cmd.arg = mode << 31; /* 0 - check, 1 - set */ in mmc_sd_switch()
727 cmd.arg |= 0x00FFFFFF; in mmc_sd_switch()
728 cmd.arg &= ~(0xF << (grp * 4)); in mmc_sd_switch()
736 err = mmc_wait_for_cmd(sc->dev, sc->dev, &cmd, CMD_RETRIES); in mmc_sd_switch()
742 enum mmc_bus_timing timing) in mmc_set_card_bus_width() argument
748 if (mmcbr_get_mode(sc->dev) == mode_sd) { in mmc_set_card_bus_width()
749 memset(&cmd, 0, sizeof(cmd)); in mmc_set_card_bus_width()
753 err = mmc_wait_for_app_cmd(sc->dev, sc->dev, ivar->rca, &cmd, in mmc_set_card_bus_width()
755 if (err != 0) in mmc_set_card_bus_width()
757 memset(&cmd, 0, sizeof(cmd)); in mmc_set_card_bus_width()
760 switch (ivar->bus_width) { in mmc_set_card_bus_width()
770 err = mmc_wait_for_app_cmd(sc->dev, sc->dev, ivar->rca, &cmd, in mmc_set_card_bus_width()
773 switch (ivar->bus_width) { in mmc_set_card_bus_width()
775 if (timing == bus_timing_mmc_hs400 || in mmc_set_card_bus_width()
776 timing == bus_timing_mmc_hs400es) in mmc_set_card_bus_width()
781 switch (timing) { in mmc_set_card_bus_width()
794 value = 0; in mmc_set_card_bus_width()
795 switch (timing) { in mmc_set_card_bus_width()
811 err = mmc_switch(sc->dev, sc->dev, ivar->rca, in mmc_set_card_bus_width()
813 ivar->cmd6_time, true); in mmc_set_card_bus_width()
825 enum mmc_bus_timing timing; in mmc_set_power_class() local
828 dev = sc->dev; in mmc_set_power_class()
829 timing = mmcbr_get_timing(dev); in mmc_set_power_class()
830 bus_width = ivar->bus_width; in mmc_set_power_class()
831 if (mmcbr_get_mode(dev) != mode_mmc || ivar->csd.spec_vers < 4 || in mmc_set_power_class()
832 timing == bus_timing_normal || bus_width == bus_width_1) in mmc_set_power_class()
835 value = 0; in mmc_set_power_class()
836 ext_csd = ivar->raw_ext_csd; in mmc_set_power_class()
843 if (timing >= bus_timing_mmc_ddr52 && in mmc_set_power_class()
863 if (timing == bus_timing_mmc_ddr52 && in mmc_set_power_class()
876 device_printf(dev, "No power class support for VDD 0x%x\n", in mmc_set_power_class()
888 if (value == 0) in mmc_set_power_class()
891 return (mmc_switch(dev, dev, ivar->rca, EXT_CSD_CMD_SET_NORMAL, in mmc_set_power_class()
892 EXT_CSD_POWER_CLASS, value, ivar->cmd6_time, true)); in mmc_set_power_class()
897 enum mmc_bus_timing timing) in mmc_set_timing() argument
903 if (mmcbr_get_mode(sc->dev) == mode_sd) { in mmc_set_timing()
904 switch (timing) { in mmc_set_timing()
918 if ((switch_res[16] & 0xf) != value) in mmc_set_timing()
920 mmcbr_set_timing(sc->dev, timing); in mmc_set_timing()
921 mmcbr_update_ios(sc->dev); in mmc_set_timing()
923 switch (timing) { in mmc_set_timing()
941 err = mmc_switch(sc->dev, sc->dev, ivar->rca, in mmc_set_timing()
943 ivar->cmd6_time, false); in mmc_set_timing()
946 mmcbr_set_timing(sc->dev, timing); in mmc_set_timing()
947 mmcbr_update_ios(sc->dev); in mmc_set_timing()
948 err = mmc_switch_status(sc->dev, sc->dev, ivar->rca, in mmc_set_timing()
949 ivar->cmd6_time); in mmc_set_timing()
956 enum mmc_bus_timing timing) in mmc_set_vccq() argument
959 if (isset(&ivar->vccq_120, timing)) in mmc_set_vccq()
960 mmcbr_set_vccq(sc->dev, vccq_120); in mmc_set_vccq()
961 else if (isset(&ivar->vccq_180, timing)) in mmc_set_vccq()
962 mmcbr_set_vccq(sc->dev, vccq_180); in mmc_set_vccq()
964 mmcbr_set_vccq(sc->dev, vccq_330); in mmc_set_vccq()
965 if (mmcbr_switch_vccq(sc->dev) != 0) in mmc_set_vccq()
972 0x55, 0xAA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
976 0xAA, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
980 0x5A, 0x00, 0x00, 0x00
984 0xA5, 0x00, 0x00, 0x00
995 if (mmcbr_get_caps(sc->dev) & MMC_CAP_8_BIT_DATA) { in mmc_test_bus_width()
996 mmcbr_set_bus_width(sc->dev, bus_width_8); in mmc_test_bus_width()
997 mmcbr_update_ios(sc->dev); in mmc_test_bus_width()
999 sc->squelched++; /* Errors are expected, squelch reporting. */ in mmc_test_bus_width()
1000 memset(&cmd, 0, sizeof(cmd)); in mmc_test_bus_width()
1001 memset(&data, 0, sizeof(data)); in mmc_test_bus_width()
1003 cmd.arg = 0; in mmc_test_bus_width()
1010 mmc_wait_for_cmd(sc->dev, sc->dev, &cmd, 0); in mmc_test_bus_width()
1012 memset(&cmd, 0, sizeof(cmd)); in mmc_test_bus_width()
1013 memset(&data, 0, sizeof(data)); in mmc_test_bus_width()
1015 cmd.arg = 0; in mmc_test_bus_width()
1022 err = mmc_wait_for_cmd(sc->dev, sc->dev, &cmd, 0); in mmc_test_bus_width()
1023 sc->squelched--; in mmc_test_bus_width()
1025 mmcbr_set_bus_width(sc->dev, bus_width_1); in mmc_test_bus_width()
1026 mmcbr_update_ios(sc->dev); in mmc_test_bus_width()
1028 if (err == MMC_ERR_NONE && memcmp(buf, p8ok, 8) == 0) in mmc_test_bus_width()
1032 if (mmcbr_get_caps(sc->dev) & MMC_CAP_4_BIT_DATA) { in mmc_test_bus_width()
1033 mmcbr_set_bus_width(sc->dev, bus_width_4); in mmc_test_bus_width()
1034 mmcbr_update_ios(sc->dev); in mmc_test_bus_width()
1036 sc->squelched++; /* Errors are expected, squelch reporting. */ in mmc_test_bus_width()
1037 memset(&cmd, 0, sizeof(cmd)); in mmc_test_bus_width()
1038 memset(&data, 0, sizeof(data)); in mmc_test_bus_width()
1040 cmd.arg = 0; in mmc_test_bus_width()
1047 mmc_wait_for_cmd(sc->dev, sc->dev, &cmd, 0); in mmc_test_bus_width()
1049 memset(&cmd, 0, sizeof(cmd)); in mmc_test_bus_width()
1050 memset(&data, 0, sizeof(data)); in mmc_test_bus_width()
1052 cmd.arg = 0; in mmc_test_bus_width()
1059 err = mmc_wait_for_cmd(sc->dev, sc->dev, &cmd, 0); in mmc_test_bus_width()
1060 sc->squelched--; in mmc_test_bus_width()
1062 mmcbr_set_bus_width(sc->dev, bus_width_1); in mmc_test_bus_width()
1063 mmcbr_update_ios(sc->dev); in mmc_test_bus_width()
1065 if (err == MMC_ERR_NONE && memcmp(buf, p4ok, 4) == 0) in mmc_test_bus_width()
1074 const int i = (bit_len / 32) - (start / 32) - 1; in mmc_get_bits()
1079 retval |= bits[i - 1] << (32 - shift); in mmc_get_bits()
1080 return (retval & ((1llu << size) - 1)); in mmc_get_bits()
1089 memset(cid, 0, sizeof(*cid)); in mmc_decode_cid_sd()
1090 cid->mid = mmc_get_bits(raw_cid, 128, 120, 8); in mmc_decode_cid_sd()
1091 cid->oid = mmc_get_bits(raw_cid, 128, 104, 16); in mmc_decode_cid_sd()
1092 for (i = 0; i < 5; i++) in mmc_decode_cid_sd()
1093 cid->pnm[i] = mmc_get_bits(raw_cid, 128, 96 - i * 8, 8); in mmc_decode_cid_sd()
1094 cid->pnm[5] = 0; in mmc_decode_cid_sd()
1095 cid->prv = mmc_get_bits(raw_cid, 128, 56, 8); in mmc_decode_cid_sd()
1096 cid->psn = mmc_get_bits(raw_cid, 128, 24, 32); in mmc_decode_cid_sd()
1097 cid->mdt_year = mmc_get_bits(raw_cid, 128, 12, 8) + 2000; in mmc_decode_cid_sd()
1098 cid->mdt_month = mmc_get_bits(raw_cid, 128, 8, 4); in mmc_decode_cid_sd()
1107 memset(cid, 0, sizeof(*cid)); in mmc_decode_cid_mmc()
1108 cid->mid = mmc_get_bits(raw_cid, 128, 120, 8); in mmc_decode_cid_mmc()
1109 cid->oid = mmc_get_bits(raw_cid, 128, 104, 8); in mmc_decode_cid_mmc()
1110 for (i = 0; i < 6; i++) in mmc_decode_cid_mmc()
1111 cid->pnm[i] = mmc_get_bits(raw_cid, 128, 96 - i * 8, 8); in mmc_decode_cid_mmc()
1112 cid->pnm[6] = 0; in mmc_decode_cid_mmc()
1113 cid->prv = mmc_get_bits(raw_cid, 128, 48, 8); in mmc_decode_cid_mmc()
1114 cid->psn = mmc_get_bits(raw_cid, 128, 16, 32); in mmc_decode_cid_mmc()
1115 cid->mdt_month = mmc_get_bits(raw_cid, 128, 12, 4); in mmc_decode_cid_mmc()
1116 cid->mdt_year = mmc_get_bits(raw_cid, 128, 8, 4); in mmc_decode_cid_mmc()
1118 cid->mdt_year += 2013; in mmc_decode_cid_mmc()
1120 cid->mdt_year += 1997; in mmc_decode_cid_mmc()
1134 * 22.5MHz/4bit/128-block in mmc_format_card_id_string()
1137 * use as the disk->d_ident string. in mmc_format_card_id_string()
1144 * format it as 0xnnnn instead. in mmc_format_card_id_string()
1146 c1 = (ivar->cid.oid >> 8) & 0x0ff; in mmc_format_card_id_string()
1147 c2 = ivar->cid.oid & 0x0ff; in mmc_format_card_id_string()
1148 if (c1 > 0x1f && c1 < 0x7f && c2 > 0x1f && c2 < 0x7f) in mmc_format_card_id_string()
1151 snprintf(oidstr, sizeof(oidstr), "0x%04x", ivar->cid.oid); in mmc_format_card_id_string()
1152 snprintf(ivar->card_sn_string, sizeof(ivar->card_sn_string), in mmc_format_card_id_string()
1153 "%08X", ivar->cid.psn); in mmc_format_card_id_string()
1154 snprintf(ivar->card_id_string, sizeof(ivar->card_id_string), in mmc_format_card_id_string()
1156 ivar->mode == mode_sd ? "SD" : "MMC", ivar->high_cap ? "HC" : "", in mmc_format_card_id_string()
1157 ivar->cid.pnm, ivar->cid.prv >> 4, ivar->cid.prv & 0x0f, in mmc_format_card_id_string()
1158 ivar->cid.psn, ivar->cid.mdt_month, ivar->cid.mdt_year, in mmc_format_card_id_string()
1159 ivar->cid.mid, oidstr); in mmc_format_card_id_string()
1167 0, 10, 12, 13, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70, 80
1185 memset(csd, 0, sizeof(*csd)); in mmc_decode_csd_sd()
1186 csd->csd_structure = v = mmc_get_bits(raw_csd, 128, 126, 2); in mmc_decode_csd_sd()
1187 if (v == 0) { in mmc_decode_csd_sd()
1190 csd->tacc = (exp[e] * mant[m] + 9) / 10; in mmc_decode_csd_sd()
1191 csd->nsac = mmc_get_bits(raw_csd, 128, 104, 8) * 100; in mmc_decode_csd_sd()
1194 csd->tran_speed = exp[e] * 10000 * mant[m]; in mmc_decode_csd_sd()
1195 csd->ccc = mmc_get_bits(raw_csd, 128, 84, 12); in mmc_decode_csd_sd()
1196 csd->read_bl_len = 1 << mmc_get_bits(raw_csd, 128, 80, 4); in mmc_decode_csd_sd()
1197 csd->read_bl_partial = mmc_get_bits(raw_csd, 128, 79, 1); in mmc_decode_csd_sd()
1198 csd->write_blk_misalign = mmc_get_bits(raw_csd, 128, 78, 1); in mmc_decode_csd_sd()
1199 csd->read_blk_misalign = mmc_get_bits(raw_csd, 128, 77, 1); in mmc_decode_csd_sd()
1200 csd->dsr_imp = mmc_get_bits(raw_csd, 128, 76, 1); in mmc_decode_csd_sd()
1201 csd->vdd_r_curr_min = in mmc_decode_csd_sd()
1203 csd->vdd_r_curr_max = in mmc_decode_csd_sd()
1205 csd->vdd_w_curr_min = in mmc_decode_csd_sd()
1207 csd->vdd_w_curr_max = in mmc_decode_csd_sd()
1211 csd->capacity = ((1 + m) << (e + 2)) * csd->read_bl_len; in mmc_decode_csd_sd()
1212 csd->erase_blk_en = mmc_get_bits(raw_csd, 128, 46, 1); in mmc_decode_csd_sd()
1213 csd->erase_sector = mmc_get_bits(raw_csd, 128, 39, 7) + 1; in mmc_decode_csd_sd()
1214 csd->wp_grp_size = mmc_get_bits(raw_csd, 128, 32, 7); in mmc_decode_csd_sd()
1215 csd->wp_grp_enable = mmc_get_bits(raw_csd, 128, 31, 1); in mmc_decode_csd_sd()
1216 csd->r2w_factor = 1 << mmc_get_bits(raw_csd, 128, 26, 3); in mmc_decode_csd_sd()
1217 csd->write_bl_len = 1 << mmc_get_bits(raw_csd, 128, 22, 4); in mmc_decode_csd_sd()
1218 csd->write_bl_partial = mmc_get_bits(raw_csd, 128, 21, 1); in mmc_decode_csd_sd()
1223 csd->tacc = (exp[e] * mant[m] + 9) / 10; in mmc_decode_csd_sd()
1224 csd->nsac = mmc_get_bits(raw_csd, 128, 104, 8) * 100; in mmc_decode_csd_sd()
1227 csd->tran_speed = exp[e] * 10000 * mant[m]; in mmc_decode_csd_sd()
1228 csd->ccc = mmc_get_bits(raw_csd, 128, 84, 12); in mmc_decode_csd_sd()
1229 csd->read_bl_len = 1 << mmc_get_bits(raw_csd, 128, 80, 4); in mmc_decode_csd_sd()
1230 csd->read_bl_partial = mmc_get_bits(raw_csd, 128, 79, 1); in mmc_decode_csd_sd()
1231 csd->write_blk_misalign = mmc_get_bits(raw_csd, 128, 78, 1); in mmc_decode_csd_sd()
1232 csd->read_blk_misalign = mmc_get_bits(raw_csd, 128, 77, 1); in mmc_decode_csd_sd()
1233 csd->dsr_imp = mmc_get_bits(raw_csd, 128, 76, 1); in mmc_decode_csd_sd()
1234 csd->capacity = ((uint64_t)mmc_get_bits(raw_csd, 128, 48, 22) + in mmc_decode_csd_sd()
1236 csd->erase_blk_en = mmc_get_bits(raw_csd, 128, 46, 1); in mmc_decode_csd_sd()
1237 csd->erase_sector = mmc_get_bits(raw_csd, 128, 39, 7) + 1; in mmc_decode_csd_sd()
1238 csd->wp_grp_size = mmc_get_bits(raw_csd, 128, 32, 7); in mmc_decode_csd_sd()
1239 csd->wp_grp_enable = mmc_get_bits(raw_csd, 128, 31, 1); in mmc_decode_csd_sd()
1240 csd->r2w_factor = 1 << mmc_get_bits(raw_csd, 128, 26, 3); in mmc_decode_csd_sd()
1241 csd->write_bl_len = 1 << mmc_get_bits(raw_csd, 128, 22, 4); in mmc_decode_csd_sd()
1242 csd->write_bl_partial = mmc_get_bits(raw_csd, 128, 21, 1); in mmc_decode_csd_sd()
1254 memset(csd, 0, sizeof(*csd)); in mmc_decode_csd_mmc()
1255 csd->csd_structure = mmc_get_bits(raw_csd, 128, 126, 2); in mmc_decode_csd_mmc()
1256 csd->spec_vers = mmc_get_bits(raw_csd, 128, 122, 4); in mmc_decode_csd_mmc()
1259 csd->tacc = exp[e] * mant[m] + 9 / 10; in mmc_decode_csd_mmc()
1260 csd->nsac = mmc_get_bits(raw_csd, 128, 104, 8) * 100; in mmc_decode_csd_mmc()
1263 csd->tran_speed = exp[e] * 10000 * mant[m]; in mmc_decode_csd_mmc()
1264 csd->ccc = mmc_get_bits(raw_csd, 128, 84, 12); in mmc_decode_csd_mmc()
1265 csd->read_bl_len = 1 << mmc_get_bits(raw_csd, 128, 80, 4); in mmc_decode_csd_mmc()
1266 csd->read_bl_partial = mmc_get_bits(raw_csd, 128, 79, 1); in mmc_decode_csd_mmc()
1267 csd->write_blk_misalign = mmc_get_bits(raw_csd, 128, 78, 1); in mmc_decode_csd_mmc()
1268 csd->read_blk_misalign = mmc_get_bits(raw_csd, 128, 77, 1); in mmc_decode_csd_mmc()
1269 csd->dsr_imp = mmc_get_bits(raw_csd, 128, 76, 1); in mmc_decode_csd_mmc()
1270 csd->vdd_r_curr_min = cur_min[mmc_get_bits(raw_csd, 128, 59, 3)]; in mmc_decode_csd_mmc()
1271 csd->vdd_r_curr_max = cur_max[mmc_get_bits(raw_csd, 128, 56, 3)]; in mmc_decode_csd_mmc()
1272 csd->vdd_w_curr_min = cur_min[mmc_get_bits(raw_csd, 128, 53, 3)]; in mmc_decode_csd_mmc()
1273 csd->vdd_w_curr_max = cur_max[mmc_get_bits(raw_csd, 128, 50, 3)]; in mmc_decode_csd_mmc()
1276 csd->capacity = ((1 + m) << (e + 2)) * csd->read_bl_len; in mmc_decode_csd_mmc()
1277 csd->erase_blk_en = 0; in mmc_decode_csd_mmc()
1278 csd->erase_sector = (mmc_get_bits(raw_csd, 128, 42, 5) + 1) * in mmc_decode_csd_mmc()
1280 csd->wp_grp_size = mmc_get_bits(raw_csd, 128, 32, 5); in mmc_decode_csd_mmc()
1281 csd->wp_grp_enable = mmc_get_bits(raw_csd, 128, 31, 1); in mmc_decode_csd_mmc()
1282 csd->r2w_factor = 1 << mmc_get_bits(raw_csd, 128, 26, 3); in mmc_decode_csd_mmc()
1283 csd->write_bl_len = 1 << mmc_get_bits(raw_csd, 128, 22, 4); in mmc_decode_csd_mmc()
1284 csd->write_bl_partial = mmc_get_bits(raw_csd, 128, 21, 1); in mmc_decode_csd_mmc()
1292 memset(scr, 0, sizeof(*scr)); in mmc_app_decode_scr()
1295 if (scr_struct != 0) { in mmc_app_decode_scr()
1300 scr->sda_vsn = mmc_get_bits(raw_scr, 64, 56, 4); in mmc_app_decode_scr()
1301 scr->bus_widths = mmc_get_bits(raw_scr, 64, 48, 4); in mmc_app_decode_scr()
1309 memset(sd_status, 0, sizeof(*sd_status)); in mmc_app_decode_sd_status()
1311 sd_status->bus_width = mmc_get_bits(raw_sd_status, 512, 510, 2); in mmc_app_decode_sd_status()
1312 sd_status->secured_mode = mmc_get_bits(raw_sd_status, 512, 509, 1); in mmc_app_decode_sd_status()
1313 sd_status->card_type = mmc_get_bits(raw_sd_status, 512, 480, 16); in mmc_app_decode_sd_status()
1314 sd_status->prot_area = mmc_get_bits(raw_sd_status, 512, 448, 12); in mmc_app_decode_sd_status()
1315 sd_status->speed_class = mmc_get_bits(raw_sd_status, 512, 440, 8); in mmc_app_decode_sd_status()
1316 sd_status->perf_move = mmc_get_bits(raw_sd_status, 512, 432, 8); in mmc_app_decode_sd_status()
1317 sd_status->au_size = mmc_get_bits(raw_sd_status, 512, 428, 4); in mmc_app_decode_sd_status()
1318 sd_status->erase_size = mmc_get_bits(raw_sd_status, 512, 408, 16); in mmc_app_decode_sd_status()
1319 sd_status->erase_timeout = mmc_get_bits(raw_sd_status, 512, 402, 6); in mmc_app_decode_sd_status()
1320 sd_status->erase_offset = mmc_get_bits(raw_sd_status, 512, 400, 2); in mmc_app_decode_sd_status()
1329 memset(&cmd, 0, sizeof(cmd)); in mmc_all_send_cid()
1331 cmd.arg = 0; in mmc_all_send_cid()
1334 err = mmc_wait_for_cmd(sc->dev, sc->dev, &cmd, CMD_RETRIES); in mmc_all_send_cid()
1345 memset(&cmd, 0, sizeof(cmd)); in mmc_send_csd()
1350 err = mmc_wait_for_cmd(sc->dev, sc->dev, &cmd, CMD_RETRIES); in mmc_send_csd()
1362 memset(&cmd, 0, sizeof(cmd)); in mmc_app_send_scr()
1363 memset(&data, 0, sizeof(data)); in mmc_app_send_scr()
1365 memset(rawscr, 0, 8); in mmc_app_send_scr()
1368 cmd.arg = 0; in mmc_app_send_scr()
1375 err = mmc_wait_for_app_cmd(sc->dev, sc->dev, rca, &cmd, CMD_RETRIES); in mmc_app_send_scr()
1376 rawscr[0] = be32toh(rawscr[0]); in mmc_app_send_scr()
1388 memset(&cmd, 0, sizeof(cmd)); in mmc_app_sd_status()
1389 memset(&data, 0, sizeof(data)); in mmc_app_sd_status()
1391 memset(rawsdstatus, 0, 64); in mmc_app_sd_status()
1394 cmd.arg = 0; in mmc_app_sd_status()
1401 err = mmc_wait_for_app_cmd(sc->dev, sc->dev, rca, &cmd, CMD_RETRIES); in mmc_app_sd_status()
1402 for (i = 0; i < 16; i++) in mmc_app_sd_status()
1413 memset(&cmd, 0, sizeof(cmd)); in mmc_set_relative_addr()
1418 err = mmc_wait_for_cmd(sc->dev, sc->dev, &cmd, CMD_RETRIES); in mmc_set_relative_addr()
1428 memset(&cmd, 0, sizeof(cmd)); in mmc_send_relative_addr()
1430 cmd.arg = 0; in mmc_send_relative_addr()
1433 err = mmc_wait_for_cmd(sc->dev, sc->dev, &cmd, CMD_RETRIES); in mmc_send_relative_addr()
1434 *resp = cmd.resp[0]; in mmc_send_relative_addr()
1444 memset(&cmd, 0, sizeof(cmd)); in mmc_set_blocklen()
1449 err = mmc_wait_for_cmd(sc->dev, sc->dev, &cmd, CMD_RETRIES); in mmc_set_blocklen()
1454 mmc_timing_to_dtr(struct mmc_ivars *ivar, enum mmc_bus_timing timing) in mmc_timing_to_dtr() argument
1457 switch (timing) { in mmc_timing_to_dtr()
1459 return (ivar->tran_speed); in mmc_timing_to_dtr()
1461 return (ivar->hs_tran_speed); in mmc_timing_to_dtr()
1479 return (0); in mmc_timing_to_dtr()
1483 mmc_timing_to_string(enum mmc_bus_timing timing) in mmc_timing_to_string() argument
1486 switch (timing) { in mmc_timing_to_string()
1510 mmc_host_timing(device_t dev, enum mmc_bus_timing timing) in mmc_host_timing() argument
1525 switch (timing) { in mmc_host_timing()
1561 enum mmc_bus_timing timing; in mmc_log_card() local
1563 device_printf(dev, "Card at relative address 0x%04x%s:\n", in mmc_log_card()
1564 ivar->rca, newcard ? " added" : ""); in mmc_log_card()
1565 device_printf(dev, " card: %s\n", ivar->card_id_string); in mmc_log_card()
1566 for (timing = bus_timing_max; timing > bus_timing_normal; timing--) { in mmc_log_card()
1567 if (isset(&ivar->timings, timing)) in mmc_log_card()
1570 device_printf(dev, " quirks: %b\n", ivar->quirks, MMC_QUIRKS_FMT); in mmc_log_card()
1571 device_printf(dev, " bus: %ubit, %uMHz (%s timing)\n", in mmc_log_card()
1572 (ivar->bus_width == bus_width_1 ? 1 : in mmc_log_card()
1573 (ivar->bus_width == bus_width_4 ? 4 : 8)), in mmc_log_card()
1574 mmc_timing_to_dtr(ivar, timing) / 1000000, in mmc_log_card()
1575 mmc_timing_to_string(timing)); in mmc_log_card()
1577 ivar->sec_count, ivar->erase_sector, in mmc_log_card()
1578 ivar->read_only ? ", read-only" : ""); in mmc_log_card()
1596 host_caps = mmcbr_get_caps(sc->dev); in mmc_discover_cards()
1598 device_printf(sc->dev, "Probing cards\n"); in mmc_discover_cards()
1601 sc->squelched++; /* Errors are expected, squelch reporting. */ in mmc_discover_cards()
1603 sc->squelched--; in mmc_discover_cards()
1607 device_printf(sc->dev, "Error reading CID %d\n", err); in mmc_discover_cards()
1611 for (i = 0; i < sc->child_count; i++) { in mmc_discover_cards()
1612 ivar = device_get_ivars(sc->child_list[i]); in mmc_discover_cards()
1613 if (memcmp(ivar->raw_cid, raw_cid, sizeof(raw_cid)) == in mmc_discover_cards()
1614 0) { in mmc_discover_cards()
1615 newcard = 0; in mmc_discover_cards()
1620 device_printf(sc->dev, in mmc_discover_cards()
1623 raw_cid[0], raw_cid[1], raw_cid[2], raw_cid[3]); in mmc_discover_cards()
1628 memcpy(ivar->raw_cid, raw_cid, sizeof(raw_cid)); in mmc_discover_cards()
1630 if (mmcbr_get_ro(sc->dev)) in mmc_discover_cards()
1631 ivar->read_only = 1; in mmc_discover_cards()
1632 ivar->bus_width = bus_width_1; in mmc_discover_cards()
1633 setbit(&ivar->timings, bus_timing_normal); in mmc_discover_cards()
1634 ivar->mode = mmcbr_get_mode(sc->dev); in mmc_discover_cards()
1635 if (ivar->mode == mode_sd) { in mmc_discover_cards()
1636 mmc_decode_cid_sd(ivar->raw_cid, &ivar->cid); in mmc_discover_cards()
1639 device_printf(sc->dev, in mmc_discover_cards()
1643 ivar->rca = resp >> 16; in mmc_discover_cards()
1645 err = mmc_send_csd(sc, ivar->rca, ivar->raw_csd); in mmc_discover_cards()
1647 device_printf(sc->dev, in mmc_discover_cards()
1652 device_printf(sc->dev, in mmc_discover_cards()
1654 newcard ? "New c" : "C", ivar->raw_csd[0], in mmc_discover_cards()
1655 ivar->raw_csd[1], ivar->raw_csd[2], in mmc_discover_cards()
1656 ivar->raw_csd[3]); in mmc_discover_cards()
1657 err = mmc_decode_csd_sd(ivar->raw_csd, &ivar->csd); in mmc_discover_cards()
1659 device_printf(sc->dev, "Error decoding CSD\n"); in mmc_discover_cards()
1662 ivar->sec_count = ivar->csd.capacity / MMC_SECTOR_SIZE; in mmc_discover_cards()
1663 if (ivar->csd.csd_structure > 0) in mmc_discover_cards()
1664 ivar->high_cap = 1; in mmc_discover_cards()
1665 ivar->tran_speed = ivar->csd.tran_speed; in mmc_discover_cards()
1666 ivar->erase_sector = ivar->csd.erase_sector * in mmc_discover_cards()
1667 ivar->csd.write_bl_len / MMC_SECTOR_SIZE; in mmc_discover_cards()
1669 err = mmc_send_status(sc->dev, sc->dev, ivar->rca, in mmc_discover_cards()
1672 device_printf(sc->dev, in mmc_discover_cards()
1676 if ((status & R1_CARD_IS_LOCKED) != 0) { in mmc_discover_cards()
1677 device_printf(sc->dev, in mmc_discover_cards()
1683 err = mmc_select_card(sc, ivar->rca); in mmc_discover_cards()
1685 device_printf(sc->dev, in mmc_discover_cards()
1689 err = mmc_app_send_scr(sc, ivar->rca, ivar->raw_scr); in mmc_discover_cards()
1691 device_printf(sc->dev, in mmc_discover_cards()
1695 mmc_app_decode_scr(ivar->raw_scr, &ivar->scr); in mmc_discover_cards()
1697 if ((ivar->scr.sda_vsn >= 1) && in mmc_discover_cards()
1698 (ivar->csd.ccc & (1 << 10))) { in mmc_discover_cards()
1704 setbit(&ivar->timings, bus_timing_hs); in mmc_discover_cards()
1705 ivar->hs_tran_speed = SD_HS_MAX; in mmc_discover_cards()
1715 * attempt to blindly re-select them, we get timeout in mmc_discover_cards()
1721 (void)mmc_select_card(sc, 0); in mmc_discover_cards()
1722 (void)mmc_select_card(sc, ivar->rca); in mmc_discover_cards()
1723 (void)mmc_app_sd_status(sc, ivar->rca, in mmc_discover_cards()
1724 ivar->raw_sd_status); in mmc_discover_cards()
1725 mmc_app_decode_sd_status(ivar->raw_sd_status, in mmc_discover_cards()
1726 &ivar->sd_status); in mmc_discover_cards()
1727 if (ivar->sd_status.au_size != 0) { in mmc_discover_cards()
1728 ivar->erase_sector = in mmc_discover_cards()
1729 16 << ivar->sd_status.au_size; in mmc_discover_cards()
1733 (ivar->scr.bus_widths & SD_SCR_BUS_WIDTH_4)) in mmc_discover_cards()
1734 ivar->bus_width = bus_width_4; in mmc_discover_cards()
1738 ivar->rca = rca++; in mmc_discover_cards()
1739 err = mmc_set_relative_addr(sc, ivar->rca); in mmc_discover_cards()
1741 device_printf(sc->dev, "Error setting RCA %d\n", err); in mmc_discover_cards()
1745 err = mmc_send_csd(sc, ivar->rca, ivar->raw_csd); in mmc_discover_cards()
1747 device_printf(sc->dev, "Error getting CSD %d\n", err); in mmc_discover_cards()
1751 device_printf(sc->dev, in mmc_discover_cards()
1753 newcard ? "New c" : "C", ivar->raw_csd[0], in mmc_discover_cards()
1754 ivar->raw_csd[1], ivar->raw_csd[2], in mmc_discover_cards()
1755 ivar->raw_csd[3]); in mmc_discover_cards()
1757 mmc_decode_csd_mmc(ivar->raw_csd, &ivar->csd); in mmc_discover_cards()
1758 ivar->sec_count = ivar->csd.capacity / MMC_SECTOR_SIZE; in mmc_discover_cards()
1759 ivar->tran_speed = ivar->csd.tran_speed; in mmc_discover_cards()
1760 ivar->erase_sector = ivar->csd.erase_sector * in mmc_discover_cards()
1761 ivar->csd.write_bl_len / MMC_SECTOR_SIZE; in mmc_discover_cards()
1763 err = mmc_send_status(sc->dev, sc->dev, ivar->rca, &status); in mmc_discover_cards()
1765 device_printf(sc->dev, in mmc_discover_cards()
1769 if ((status & R1_CARD_IS_LOCKED) != 0) { in mmc_discover_cards()
1770 device_printf(sc->dev, in mmc_discover_cards()
1775 err = mmc_select_card(sc, ivar->rca); in mmc_discover_cards()
1777 device_printf(sc->dev, "Error selecting card %d\n", in mmc_discover_cards()
1782 rev = -1; in mmc_discover_cards()
1784 if (ivar->csd.spec_vers >= 4) { in mmc_discover_cards()
1785 err = mmc_send_ext_csd(sc->dev, sc->dev, in mmc_discover_cards()
1786 ivar->raw_ext_csd); in mmc_discover_cards()
1788 device_printf(sc->dev, in mmc_discover_cards()
1792 ext_csd = ivar->raw_ext_csd; in mmc_discover_cards()
1796 if (sec_count != 0) { in mmc_discover_cards()
1797 ivar->sec_count = sec_count; in mmc_discover_cards()
1798 ivar->high_cap = 1; in mmc_discover_cards()
1801 ivar->bus_width = mmc_test_bus_width(sc); in mmc_discover_cards()
1804 if ((card_type & EXT_CSD_CARD_TYPE_HS_52) != 0) { in mmc_discover_cards()
1805 setbit(&ivar->timings, bus_timing_hs); in mmc_discover_cards()
1806 ivar->hs_tran_speed = MMC_TYPE_HS_52_MAX; in mmc_discover_cards()
1807 } else if ((card_type & EXT_CSD_CARD_TYPE_HS_26) != 0) { in mmc_discover_cards()
1808 setbit(&ivar->timings, bus_timing_hs); in mmc_discover_cards()
1809 ivar->hs_tran_speed = MMC_TYPE_HS_26_MAX; in mmc_discover_cards()
1811 if ((card_type & EXT_CSD_CARD_TYPE_DDR_52_1_2V) != 0 && in mmc_discover_cards()
1812 (host_caps & MMC_CAP_SIGNALING_120) != 0) { in mmc_discover_cards()
1813 setbit(&ivar->timings, bus_timing_mmc_ddr52); in mmc_discover_cards()
1814 setbit(&ivar->vccq_120, bus_timing_mmc_ddr52); in mmc_discover_cards()
1816 if ((card_type & EXT_CSD_CARD_TYPE_DDR_52_1_8V) != 0 && in mmc_discover_cards()
1817 (host_caps & MMC_CAP_SIGNALING_180) != 0) { in mmc_discover_cards()
1818 setbit(&ivar->timings, bus_timing_mmc_ddr52); in mmc_discover_cards()
1819 setbit(&ivar->vccq_180, bus_timing_mmc_ddr52); in mmc_discover_cards()
1821 if ((card_type & EXT_CSD_CARD_TYPE_HS200_1_2V) != 0 && in mmc_discover_cards()
1822 (host_caps & MMC_CAP_SIGNALING_120) != 0) { in mmc_discover_cards()
1823 setbit(&ivar->timings, bus_timing_mmc_hs200); in mmc_discover_cards()
1824 setbit(&ivar->vccq_120, bus_timing_mmc_hs200); in mmc_discover_cards()
1826 if ((card_type & EXT_CSD_CARD_TYPE_HS200_1_8V) != 0 && in mmc_discover_cards()
1827 (host_caps & MMC_CAP_SIGNALING_180) != 0) { in mmc_discover_cards()
1828 setbit(&ivar->timings, bus_timing_mmc_hs200); in mmc_discover_cards()
1829 setbit(&ivar->vccq_180, bus_timing_mmc_hs200); in mmc_discover_cards()
1831 if ((card_type & EXT_CSD_CARD_TYPE_HS400_1_2V) != 0 && in mmc_discover_cards()
1832 (host_caps & MMC_CAP_SIGNALING_120) != 0 && in mmc_discover_cards()
1833 ivar->bus_width == bus_width_8) { in mmc_discover_cards()
1834 setbit(&ivar->timings, bus_timing_mmc_hs400); in mmc_discover_cards()
1835 setbit(&ivar->vccq_120, bus_timing_mmc_hs400); in mmc_discover_cards()
1837 if ((card_type & EXT_CSD_CARD_TYPE_HS400_1_8V) != 0 && in mmc_discover_cards()
1838 (host_caps & MMC_CAP_SIGNALING_180) != 0 && in mmc_discover_cards()
1839 ivar->bus_width == bus_width_8) { in mmc_discover_cards()
1840 setbit(&ivar->timings, bus_timing_mmc_hs400); in mmc_discover_cards()
1841 setbit(&ivar->vccq_180, bus_timing_mmc_hs400); in mmc_discover_cards()
1843 if ((card_type & EXT_CSD_CARD_TYPE_HS400_1_2V) != 0 && in mmc_discover_cards()
1845 EXT_CSD_STROBE_SUPPORT_EN) != 0 && in mmc_discover_cards()
1846 (host_caps & MMC_CAP_SIGNALING_120) != 0 && in mmc_discover_cards()
1847 ivar->bus_width == bus_width_8) { in mmc_discover_cards()
1848 setbit(&ivar->timings, bus_timing_mmc_hs400es); in mmc_discover_cards()
1849 setbit(&ivar->vccq_120, bus_timing_mmc_hs400es); in mmc_discover_cards()
1851 if ((card_type & EXT_CSD_CARD_TYPE_HS400_1_8V) != 0 && in mmc_discover_cards()
1853 EXT_CSD_STROBE_SUPPORT_EN) != 0 && in mmc_discover_cards()
1854 (host_caps & MMC_CAP_SIGNALING_180) != 0 && in mmc_discover_cards()
1855 ivar->bus_width == bus_width_8) { in mmc_discover_cards()
1856 setbit(&ivar->timings, bus_timing_mmc_hs400es); in mmc_discover_cards()
1857 setbit(&ivar->vccq_180, bus_timing_mmc_hs400es); in mmc_discover_cards()
1863 ivar->cmd6_time = 500 * 1000; in mmc_discover_cards()
1865 ivar->cmd6_time = 10 * in mmc_discover_cards()
1868 if (ext_csd[EXT_CSD_ERASE_GRP_SIZE] != 0) { in mmc_discover_cards()
1869 ivar->erase_sector = 1024 * in mmc_discover_cards()
1871 err = mmc_switch(sc->dev, sc->dev, ivar->rca, in mmc_discover_cards()
1875 ivar->cmd6_time, true); in mmc_discover_cards()
1877 device_printf(sc->dev, in mmc_discover_cards()
1885 mmc_decode_cid_mmc(ivar->raw_cid, &ivar->cid, rev >= 5); in mmc_discover_cards()
1888 for (quirk = &mmc_quirks[0]; quirk->mid != 0x0; quirk++) { in mmc_discover_cards()
1889 if ((quirk->mid == MMC_QUIRK_MID_ANY || in mmc_discover_cards()
1890 quirk->mid == ivar->cid.mid) && in mmc_discover_cards()
1891 (quirk->oid == MMC_QUIRK_OID_ANY || in mmc_discover_cards()
1892 quirk->oid == ivar->cid.oid) && in mmc_discover_cards()
1893 strncmp(quirk->pnm, ivar->cid.pnm, in mmc_discover_cards()
1894 sizeof(ivar->cid.pnm)) == 0) { in mmc_discover_cards()
1895 ivar->quirks = quirk->quirks; in mmc_discover_cards()
1906 * mid=0x1b oid=0x534d pnm="00000" prv=1.0 mdt=00.2000 in mmc_discover_cards()
1908 if (ivar->csd.read_bl_len != MMC_SECTOR_SIZE || in mmc_discover_cards()
1909 ivar->csd.write_bl_len != MMC_SECTOR_SIZE) in mmc_discover_cards()
1915 mmc_log_card(sc->dev, ivar, newcard); in mmc_discover_cards()
1918 child = device_add_child(sc->dev, NULL, DEVICE_UNIT_ANY); in mmc_discover_cards()
1921 sc->child_list = realloc(sc->child_list, in mmc_discover_cards()
1922 sizeof(device_t) * (sc->child_count + 1), in mmc_discover_cards()
1924 sc->child_list[sc->child_count++] = child; in mmc_discover_cards()
1926 device_printf(sc->dev, "Error adding child\n"); in mmc_discover_cards()
1932 (void)mmc_select_card(sc, 0); in mmc_discover_cards()
1940 mmcbr_get_mode(sc->dev) == mode_sd) in mmc_discover_cards()
1951 if (sc->child_count == 0) { in mmc_update_child_list()
1952 free(sc->child_list, M_DEVBUF); in mmc_update_child_list()
1955 for (i = j = 0; i < sc->child_count; i++) { in mmc_update_child_list()
1957 child = sc->child_list[j++]; in mmc_update_child_list()
1962 sc->child_list[i] = child; in mmc_update_child_list()
1964 sc->child_list = realloc(sc->child_list, sizeof(device_t) * in mmc_update_child_list()
1965 sc->child_count, M_DEVBUF, M_WAITOK); in mmc_update_child_list()
1974 for (i = j = 0; i < sc->child_count; i++) { in mmc_rescan_cards()
1975 ivar = device_get_ivars(sc->child_list[i]); in mmc_rescan_cards()
1976 if (mmc_select_card(sc, ivar->rca) != MMC_ERR_NONE) { in mmc_rescan_cards()
1978 device_printf(sc->dev, in mmc_rescan_cards()
1980 ivar->rca); in mmc_rescan_cards()
1981 err = device_delete_child(sc->dev, sc->child_list[i]); in mmc_rescan_cards()
1982 if (err != 0) { in mmc_rescan_cards()
1990 if (sc->child_count == j) in mmc_rescan_cards()
1992 sc->child_count = j; in mmc_rescan_cards()
1995 (void)mmc_select_card(sc, 0); in mmc_rescan_cards()
2004 err = 0; in mmc_delete_cards()
2005 for (i = j = 0; i < sc->child_count; i++) { in mmc_delete_cards()
2006 ivar = device_get_ivars(sc->child_list[i]); in mmc_delete_cards()
2008 device_printf(sc->dev, in mmc_delete_cards()
2010 ivar->rca); in mmc_delete_cards()
2011 err = device_delete_child(sc->dev, sc->child_list[i]); in mmc_delete_cards()
2012 if (err != 0) { in mmc_delete_cards()
2021 sc->child_count = j; in mmc_delete_cards()
2033 dev = sc->dev; in mmc_go_discovery()
2038 sc->squelched++; /* Errors are expected, squelch reporting. */ in mmc_go_discovery()
2043 device_printf(sc->dev, "Probing bus\n"); in mmc_go_discovery()
2046 if ((bootverbose || mmc_debug) && err == 0) in mmc_go_discovery()
2047 device_printf(sc->dev, in mmc_go_discovery()
2049 if (mmc_send_app_op_cond(sc, 0, &ocr) != MMC_ERR_NONE) { in mmc_go_discovery()
2051 device_printf(sc->dev, "SD probe: failed\n"); in mmc_go_discovery()
2056 if (mmc_send_op_cond(sc, 0, &ocr) != MMC_ERR_NONE) { in mmc_go_discovery()
2058 device_printf(sc->dev, in mmc_go_discovery()
2060 ocr = 0; /* Failed both, powerdown. */ in mmc_go_discovery()
2062 device_printf(sc->dev, in mmc_go_discovery()
2063 "MMC probe: OK (OCR: 0x%08x)\n", ocr); in mmc_go_discovery()
2065 device_printf(sc->dev, "SD probe: OK (OCR: 0x%08x)\n", in mmc_go_discovery()
2067 sc->squelched--; in mmc_go_discovery()
2070 if (mmcbr_get_ocr(dev) != 0) in mmc_go_discovery()
2083 device_printf(sc->dev, "Current OCR: 0x%08x\n", in mmc_go_discovery()
2085 if (mmcbr_get_ocr(dev) == 0) { in mmc_go_discovery()
2086 device_printf(sc->dev, "No compatible cards found on bus\n"); in mmc_go_discovery()
2097 (err ? 0 : MMC_OCR_CCS) | mmcbr_get_ocr(dev), NULL); in mmc_go_discovery()
2116 enum mmc_bus_timing max_timing, timing; in mmc_calculate_clock() local
2119 dev = sc->dev; in mmc_calculate_clock()
2124 for (i = 0; i < sc->child_count; i++) { in mmc_calculate_clock()
2125 ivar = device_get_ivars(sc->child_list[i]); in mmc_calculate_clock()
2126 if (isclr(&ivar->timings, max_timing) || in mmc_calculate_clock()
2128 for (timing = max_timing - 1; timing >= in mmc_calculate_clock()
2129 bus_timing_normal; timing--) { in mmc_calculate_clock()
2130 if (isset(&ivar->timings, timing) && in mmc_calculate_clock()
2131 mmc_host_timing(dev, timing)) { in mmc_calculate_clock()
2132 max_timing = timing; in mmc_calculate_clock()
2148 "setting transfer rate to %d.%03dMHz (%s timing)\n", in mmc_calculate_clock()
2156 * timing mode selection" of the eMMC specification v5.1, too, and in mmc_calculate_clock()
2162 timing = hs400 == true ? bus_timing_mmc_hs200 : max_timing; in mmc_calculate_clock()
2163 for (i = 0; i < sc->child_count; i++) { in mmc_calculate_clock()
2164 ivar = device_get_ivars(sc->child_list[i]); in mmc_calculate_clock()
2165 if ((ivar->timings & ~(1 << bus_timing_normal)) == 0) in mmc_calculate_clock()
2168 rca = ivar->rca; in mmc_calculate_clock()
2175 if (timing == bus_timing_mmc_hs200 || /* includes HS400 */ in mmc_calculate_clock()
2176 timing == bus_timing_mmc_hs400es) { in mmc_calculate_clock()
2177 if (mmc_set_vccq(sc, ivar, timing) != MMC_ERR_NONE) { in mmc_calculate_clock()
2184 if (timing == bus_timing_mmc_hs200) { /* includes HS400 */ in mmc_calculate_clock()
2186 if (mmc_set_card_bus_width(sc, ivar, timing) != in mmc_calculate_clock()
2192 mmcbr_set_bus_width(dev, ivar->bus_width); in mmc_calculate_clock()
2194 } else if (timing == bus_timing_mmc_hs400es) { in mmc_calculate_clock()
2195 if (mmc_switch_to_hs400(sc, ivar, max_dtr, timing) != in mmc_calculate_clock()
2198 "%d failed to set %s timing\n", rca, in mmc_calculate_clock()
2199 mmc_timing_to_string(timing)); in mmc_calculate_clock()
2205 if (mmc_set_timing(sc, ivar, timing) != MMC_ERR_NONE) { in mmc_calculate_clock()
2207 "failed to set %s timing\n", rca, in mmc_calculate_clock()
2208 mmc_timing_to_string(timing)); in mmc_calculate_clock()
2212 if (timing == bus_timing_mmc_ddr52) { in mmc_calculate_clock()
2217 if (mmc_set_card_bus_width(sc, ivar, timing) != in mmc_calculate_clock()
2223 mmcbr_set_bus_width(dev, ivar->bus_width); in mmc_calculate_clock()
2225 if (mmc_set_vccq(sc, ivar, timing) != MMC_ERR_NONE) { in mmc_calculate_clock()
2242 if (timing <= bus_timing_uhs_sdr25 || in mmc_calculate_clock()
2243 timing == bus_timing_mmc_ddr52) in mmc_calculate_clock()
2246 if (mmcbr_tune(dev, hs400) != 0) { in mmc_calculate_clock()
2255 "failed to set %s timing\n", rca, in mmc_calculate_clock()
2266 (void)mmc_select_card(sc, 0); in mmc_calculate_clock()
2271 * Switch from HS200 to HS400 (either initially or for re-tuning) or directly
2272 * to HS400ES. This follows the sequences described in "6.6.2.3 HS400 timing
2282 dev = sc->dev; in mmc_switch_to_hs400()
2285 * Both clock and timing must be set as appropriate for high speed in mmc_switch_to_hs400()
2289 mmcbr_set_clock(dev, ivar->hs_tran_speed); in mmc_switch_to_hs400()
2301 mmcbr_set_bus_width(dev, ivar->bus_width); in mmc_switch_to_hs400()
2314 * Switch from HS400 to HS200 (for re-tuning).
2323 dev = sc->dev; in mmc_switch_to_hs200()
2326 * Both clock and timing must initially be set as appropriate for in mmc_switch_to_hs200()
2330 mmcbr_set_clock(dev, ivar->hs_tran_speed); in mmc_switch_to_hs200()
2337 * in EXT_CSD_BUS_WIDTH and update bus width and timing in ios. in mmc_switch_to_hs200()
2342 mmcbr_set_bus_width(dev, ivar->bus_width); in mmc_switch_to_hs200()
2343 mmcbr_set_timing(sc->dev, bus_timing_hs); in mmc_switch_to_hs200()
2362 enum mmc_bus_timing timing; in mmc_retune() local
2368 if (sc->retune_needed != 1 && sc->retune_paused != 0) in mmc_retune()
2371 timing = mmcbr_get_timing(busdev); in mmc_retune()
2372 if (timing == bus_timing_mmc_hs400) { in mmc_retune()
2375 * the devices in HS400 mode so periodic re-tuning isn't in mmc_retune()
2379 * the switch timing dance. in mmc_retune()
2382 return (0); in mmc_retune()
2389 if (err != 0 && timing == bus_timing_mmc_hs400) in mmc_retune()
2392 case 0: in mmc_retune()
2399 if (timing == bus_timing_mmc_hs400) { in mmc_retune()
2400 if (mmc_switch_to_hs400(sc, ivar, clock, timing) != in mmc_retune()
2416 KASSERT(sc->owner != NULL, in mmc_retune_pause()
2420 if (retune == true && sc->retune_paused == 0) in mmc_retune_pause()
2421 sc->retune_needed = 1; in mmc_retune_pause()
2422 sc->retune_paused++; in mmc_retune_pause()
2434 KASSERT(sc->owner != NULL, in mmc_retune_unpause()
2437 KASSERT(sc->retune_paused != 0, in mmc_retune_unpause()
2438 ("%s: Re-tune pause count already at 0", __func__)); in mmc_retune_unpause()
2440 sc->retune_paused--; in mmc_retune_unpause()
2446 device_t dev = sc->dev; in mmc_scan()
2450 if (err != 0) { in mmc_scan()
2456 if (err != 0) { in mmc_scan()
2472 *result = ivar->csd.spec_vers; in mmc_read_ivar()
2475 *result = ivar->csd.dsr_imp; in mmc_read_ivar()
2478 *result = ivar->sec_count; in mmc_read_ivar()
2481 *result = ivar->rca; in mmc_read_ivar()
2490 *result = ivar->read_only; in mmc_read_ivar()
2493 *result = ivar->high_cap; in mmc_read_ivar()
2496 *result = ivar->mode; in mmc_read_ivar()
2499 *result = ivar->bus_width; in mmc_read_ivar()
2502 *result = ivar->erase_sector; in mmc_read_ivar()
2508 *result = ivar->cmd6_time; in mmc_read_ivar()
2511 *result = ivar->quirks; in mmc_read_ivar()
2514 *(char **)result = ivar->card_id_string; in mmc_read_ivar()
2517 *(char **)result = ivar->card_sn_string; in mmc_read_ivar()
2520 return (0); in mmc_read_ivar()
2539 config_intrhook_disestablish(&sc->config_intrhook); in mmc_delayed_attach()
2546 sbuf_printf(sb, "rca=0x%04x", mmc_get_rca(child)); in mmc_child_location()
2547 return (0); in mmc_child_location()