Lines Matching +full:hs400 +full:- +full:cmd +full:- +full:int +full:- +full:delay
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 */
137 static int mmc_debug;
142 static int mmc_acquire_bus(device_t busdev, device_t dev);
143 static int mmc_attach(device_t dev);
144 static int mmc_child_location(device_t dev, device_t child, struct sbuf *sb);
145 static int mmc_detach(device_t dev);
146 static int mmc_probe(device_t dev);
147 static int mmc_read_ivar(device_t bus, device_t child, int which,
149 static int mmc_release_bus(device_t busdev, device_t dev);
150 static int mmc_resume(device_t dev);
153 static int mmc_suspend(device_t dev);
154 static int mmc_wait_for_request(device_t busdev, device_t dev,
156 static int mmc_write_ivar(device_t bus, device_t child, int which,
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);
168 static int mmc_all_send_cid(struct mmc_softc *sc, uint32_t *rawcid);
172 static int mmc_app_sd_status(struct mmc_softc *sc, uint16_t rca,
174 static int mmc_app_send_scr(struct mmc_softc *sc, uint16_t rca,
176 static int mmc_calculate_clock(struct mmc_softc *sc);
181 static int mmc_decode_csd_sd(uint32_t *raw_csd, struct mmc_csd *csd);
183 static int mmc_delete_cards(struct mmc_softc *sc, bool final);
187 static uint32_t mmc_get_bits(uint32_t *bits, int bit_len, int start,
188 int size);
189 static int mmc_highest_voltage(uint32_t ocr);
192 static void mmc_ms_delay(int ms);
193 static void mmc_log_card(device_t dev, struct mmc_ivars *ivar, int newcard);
197 static int mmc_retune(device_t busdev, device_t dev, bool reset);
199 static int mmc_sd_switch(struct mmc_softc *sc, uint8_t mode, uint8_t grp,
201 static int mmc_select_card(struct mmc_softc *sc, uint16_t rca);
203 static int mmc_send_app_op_cond(struct mmc_softc *sc, uint32_t ocr,
205 static int mmc_send_csd(struct mmc_softc *sc, uint16_t rca, uint32_t *rawcsd);
206 static int mmc_send_if_cond(struct mmc_softc *sc, uint8_t vhs);
207 static int mmc_send_op_cond(struct mmc_softc *sc, uint32_t ocr,
209 static int mmc_send_relative_addr(struct mmc_softc *sc, uint32_t *resp);
210 static int mmc_set_blocklen(struct mmc_softc *sc, uint32_t len);
211 static int mmc_set_card_bus_width(struct mmc_softc *sc, struct mmc_ivars *ivar,
213 static int mmc_set_power_class(struct mmc_softc *sc, struct mmc_ivars *ivar);
214 static int mmc_set_relative_addr(struct mmc_softc *sc, uint16_t resp);
215 static int mmc_set_timing(struct mmc_softc *sc, struct mmc_ivars *ivar,
217 static int mmc_set_vccq(struct mmc_softc *sc, struct mmc_ivars *ivar,
219 static int mmc_switch_to_hs200(struct mmc_softc *sc, struct mmc_ivars *ivar,
221 static int mmc_switch_to_hs400(struct mmc_softc *sc, struct mmc_ivars *ivar,
223 static int mmc_test_bus_width(struct mmc_softc *sc);
228 static int mmc_wait_for_command(struct mmc_softc *sc, uint32_t opcode,
229 uint32_t arg, uint32_t flags, uint32_t *resp, int retries);
230 static int mmc_wait_for_req(struct mmc_softc *sc, struct mmc_request *req);
234 mmc_ms_delay(int ms) in mmc_ms_delay()
237 DELAY(1000 * ms); /* XXX BAD */ in mmc_ms_delay()
240 static int
248 static int
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()
265 static int
269 int err; in mmc_detach()
271 config_intrhook_drain(&sc->config_intrhook); in mmc_detach()
281 static int
285 int err; in mmc_suspend()
292 * is selected any longer and sc->last_rca gets set to 0. Otherwise, in mmc_suspend()
305 static int
314 static int
319 int err; in mmc_acquire_bus()
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()
356 * can trigger re-tuning (via a CRC error on the next in mmc_acquire_bus()
357 * CMD), even if not switching between devices an the in mmc_acquire_bus()
359 * we need to re-tune the host controller if devices in mmc_acquire_bus()
363 sc->child_count == 1) 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()
380 mmcbr_set_bus_width(busdev, ivar->bus_width); 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()
401 sc->last_rca = 0; in mmc_acquire_bus()
408 static int
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()
432 static int
435 int i; in mmc_highest_voltage()
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()
456 static int
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()
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()
482 static int
487 int err, i; in mmc_wait_for_request()
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()
527 case MMC_ERR_BADCRC: /* Switch failure on HS400 recovery */ in mmc_wait_for_request()
533 sc->retune_needed = 0; in mmc_wait_for_request()
538 static int
540 uint32_t arg, uint32_t flags, uint32_t *resp, int retries) in mmc_wait_for_command()
542 struct mmc_command cmd; in mmc_wait_for_command() local
543 int err; in mmc_wait_for_command()
545 memset(&cmd, 0, sizeof(cmd)); in mmc_wait_for_command()
546 cmd.opcode = opcode; in mmc_wait_for_command()
547 cmd.arg = arg; in mmc_wait_for_command()
548 cmd.flags = flags; in mmc_wait_for_command()
549 cmd.data = NULL; in mmc_wait_for_command()
550 err = mmc_wait_for_cmd(sc->dev, sc->dev, &cmd, retries); in mmc_wait_for_command()
555 memcpy(resp, cmd.resp, 4 * sizeof(uint32_t)); in mmc_wait_for_command()
557 *resp = cmd.resp[0]; in mmc_wait_for_command()
566 struct mmc_command cmd; in mmc_idle_cards() local
568 dev = sc->dev; in mmc_idle_cards()
573 memset(&cmd, 0, sizeof(cmd)); in mmc_idle_cards()
574 cmd.opcode = MMC_GO_IDLE_STATE; in mmc_idle_cards()
575 cmd.arg = 0; in mmc_idle_cards()
576 cmd.flags = MMC_RSP_NONE | MMC_CMD_BC; in mmc_idle_cards()
577 cmd.data = NULL; in mmc_idle_cards()
578 mmc_wait_for_cmd(sc->dev, sc->dev, &cmd, CMD_RETRIES); in mmc_idle_cards()
586 static int
589 struct mmc_command cmd; in mmc_send_app_op_cond() local
590 int err = MMC_ERR_NONE, i; in mmc_send_app_op_cond()
592 memset(&cmd, 0, sizeof(cmd)); in mmc_send_app_op_cond()
593 cmd.opcode = ACMD_SD_SEND_OP_COND; in mmc_send_app_op_cond()
594 cmd.arg = ocr; in mmc_send_app_op_cond()
595 cmd.flags = MMC_RSP_R3 | MMC_CMD_BCR; in mmc_send_app_op_cond()
596 cmd.data = NULL; 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()
610 *rocr = cmd.resp[0]; in mmc_send_app_op_cond()
614 static int
617 struct mmc_command cmd; in mmc_send_op_cond() local
618 int err = MMC_ERR_NONE, i; in mmc_send_op_cond()
620 memset(&cmd, 0, sizeof(cmd)); in mmc_send_op_cond()
621 cmd.opcode = MMC_SEND_OP_COND; in mmc_send_op_cond()
622 cmd.arg = ocr; in mmc_send_op_cond()
623 cmd.flags = MMC_RSP_R3 | MMC_CMD_BCR; in mmc_send_op_cond()
624 cmd.data = NULL; 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()
637 *rocr = cmd.resp[0]; in mmc_send_op_cond()
641 static int
644 struct mmc_command cmd; in mmc_send_if_cond() local
645 int err; in mmc_send_if_cond()
647 memset(&cmd, 0, sizeof(cmd)); in mmc_send_if_cond()
648 cmd.opcode = SD_SEND_IF_COND; in mmc_send_if_cond()
649 cmd.arg = (vhs << 8) + 0xAA; in mmc_send_if_cond()
650 cmd.flags = MMC_RSP_R7 | MMC_CMD_BCR; in mmc_send_if_cond()
651 cmd.data = NULL; 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()
671 for (vccq = vccq_330; ; vccq--) { in mmc_power_up()
688 device_t dev = sc->dev; in mmc_power_down()
699 static int
702 int err, flags; in mmc_select_card()
705 if (mmcbr_get_bus_type(sc->dev) == bus_type_spi) in mmc_select_card()
709 sc->retune_paused++; in mmc_select_card()
712 sc->retune_paused--; in mmc_select_card()
716 static int
720 int err; in mmc_sd_switch()
721 struct mmc_command cmd; in mmc_sd_switch() local
724 memset(&cmd, 0, sizeof(cmd)); in mmc_sd_switch()
728 cmd.opcode = SD_SWITCH_FUNC; in mmc_sd_switch()
729 cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC; in mmc_sd_switch()
730 cmd.arg = mode << 31; /* 0 - check, 1 - set */ in mmc_sd_switch()
731 cmd.arg |= 0x00FFFFFF; in mmc_sd_switch()
732 cmd.arg &= ~(0xF << (grp * 4)); in mmc_sd_switch()
733 cmd.arg |= value << (grp * 4); in mmc_sd_switch()
734 cmd.data = &data; in mmc_sd_switch()
740 err = mmc_wait_for_cmd(sc->dev, sc->dev, &cmd, CMD_RETRIES); in mmc_sd_switch()
744 static int
748 struct mmc_command cmd; in mmc_set_card_bus_width() local
749 int err; in mmc_set_card_bus_width()
752 if (mmcbr_get_mode(sc->dev) == mode_sd) { in mmc_set_card_bus_width()
753 memset(&cmd, 0, sizeof(cmd)); in mmc_set_card_bus_width()
754 cmd.opcode = ACMD_SET_CLR_CARD_DETECT; in mmc_set_card_bus_width()
755 cmd.flags = MMC_RSP_R1 | MMC_CMD_AC; in mmc_set_card_bus_width()
756 cmd.arg = SD_CLR_CARD_DETECT; in mmc_set_card_bus_width()
757 err = mmc_wait_for_app_cmd(sc->dev, sc->dev, ivar->rca, &cmd, in mmc_set_card_bus_width()
761 memset(&cmd, 0, sizeof(cmd)); in mmc_set_card_bus_width()
762 cmd.opcode = ACMD_SET_BUS_WIDTH; in mmc_set_card_bus_width()
763 cmd.flags = MMC_RSP_R1 | MMC_CMD_AC; in mmc_set_card_bus_width()
764 switch (ivar->bus_width) { in mmc_set_card_bus_width()
766 cmd.arg = SD_BUS_WIDTH_1; in mmc_set_card_bus_width()
769 cmd.arg = SD_BUS_WIDTH_4; in mmc_set_card_bus_width()
774 err = mmc_wait_for_app_cmd(sc->dev, sc->dev, ivar->rca, &cmd, in mmc_set_card_bus_width()
777 switch (ivar->bus_width) { in mmc_set_card_bus_width()
815 err = mmc_switch(sc->dev, sc->dev, ivar->rca, in mmc_set_card_bus_width()
817 ivar->cmd6_time, true); in mmc_set_card_bus_width()
822 static int
832 dev = sc->dev; in mmc_set_power_class()
834 bus_width = ivar->bus_width; in mmc_set_power_class()
835 if (mmcbr_get_mode(dev) != mode_mmc || ivar->csd.spec_vers < 4 || in mmc_set_power_class()
840 ext_csd = ivar->raw_ext_csd; in mmc_set_power_class()
895 return (mmc_switch(dev, dev, ivar->rca, EXT_CSD_CMD_SET_NORMAL, in mmc_set_power_class()
896 EXT_CSD_POWER_CLASS, value, ivar->cmd6_time, true)); in mmc_set_power_class()
899 static int
905 int err; in mmc_set_timing()
908 if (mmcbr_get_bus_type(sc->dev) == bus_type_spi) in mmc_set_timing()
911 if (mmcbr_get_mode(sc->dev) == mode_sd) { in mmc_set_timing()
928 mmcbr_set_timing(sc->dev, timing); in mmc_set_timing()
929 mmcbr_update_ios(sc->dev); in mmc_set_timing()
949 err = mmc_switch(sc->dev, sc->dev, ivar->rca, in mmc_set_timing()
951 ivar->cmd6_time, false); in mmc_set_timing()
954 mmcbr_set_timing(sc->dev, timing); in mmc_set_timing()
955 mmcbr_update_ios(sc->dev); in mmc_set_timing()
956 err = mmc_switch_status(sc->dev, sc->dev, ivar->rca, in mmc_set_timing()
957 ivar->cmd6_time); in mmc_set_timing()
962 static int
967 if (isset(&ivar->vccq_120, timing)) in mmc_set_vccq()
968 mmcbr_set_vccq(sc->dev, vccq_120); in mmc_set_vccq()
969 else if (isset(&ivar->vccq_180, timing)) in mmc_set_vccq()
970 mmcbr_set_vccq(sc->dev, vccq_180); in mmc_set_vccq()
972 mmcbr_set_vccq(sc->dev, vccq_330); in mmc_set_vccq()
973 if (mmcbr_switch_vccq(sc->dev) != 0) in mmc_set_vccq()
995 static int
998 struct mmc_command cmd; in mmc_test_bus_width() local
1001 int err; in mmc_test_bus_width()
1003 if (mmcbr_get_caps(sc->dev) & MMC_CAP_8_BIT_DATA) { in mmc_test_bus_width()
1004 mmcbr_set_bus_width(sc->dev, bus_width_8); in mmc_test_bus_width()
1005 mmcbr_update_ios(sc->dev); in mmc_test_bus_width()
1007 sc->squelched++; /* Errors are expected, squelch reporting. */ in mmc_test_bus_width()
1008 memset(&cmd, 0, sizeof(cmd)); in mmc_test_bus_width()
1010 cmd.opcode = MMC_BUSTEST_W; in mmc_test_bus_width()
1011 cmd.arg = 0; in mmc_test_bus_width()
1012 cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC; in mmc_test_bus_width()
1013 cmd.data = &data; in mmc_test_bus_width()
1018 mmc_wait_for_cmd(sc->dev, sc->dev, &cmd, 0); in mmc_test_bus_width()
1020 memset(&cmd, 0, sizeof(cmd)); in mmc_test_bus_width()
1022 cmd.opcode = MMC_BUSTEST_R; in mmc_test_bus_width()
1023 cmd.arg = 0; in mmc_test_bus_width()
1024 cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC; in mmc_test_bus_width()
1025 cmd.data = &data; in mmc_test_bus_width()
1030 err = mmc_wait_for_cmd(sc->dev, sc->dev, &cmd, 0); in mmc_test_bus_width()
1031 sc->squelched--; in mmc_test_bus_width()
1033 mmcbr_set_bus_width(sc->dev, bus_width_1); in mmc_test_bus_width()
1034 mmcbr_update_ios(sc->dev); in mmc_test_bus_width()
1040 if (mmcbr_get_caps(sc->dev) & MMC_CAP_4_BIT_DATA) { in mmc_test_bus_width()
1041 mmcbr_set_bus_width(sc->dev, bus_width_4); in mmc_test_bus_width()
1042 mmcbr_update_ios(sc->dev); in mmc_test_bus_width()
1044 sc->squelched++; /* Errors are expected, squelch reporting. */ in mmc_test_bus_width()
1045 memset(&cmd, 0, sizeof(cmd)); in mmc_test_bus_width()
1047 cmd.opcode = MMC_BUSTEST_W; in mmc_test_bus_width()
1048 cmd.arg = 0; in mmc_test_bus_width()
1049 cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC; in mmc_test_bus_width()
1050 cmd.data = &data; in mmc_test_bus_width()
1055 mmc_wait_for_cmd(sc->dev, sc->dev, &cmd, 0); in mmc_test_bus_width()
1057 memset(&cmd, 0, sizeof(cmd)); in mmc_test_bus_width()
1059 cmd.opcode = MMC_BUSTEST_R; in mmc_test_bus_width()
1060 cmd.arg = 0; in mmc_test_bus_width()
1061 cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC; in mmc_test_bus_width()
1062 cmd.data = &data; in mmc_test_bus_width()
1067 err = mmc_wait_for_cmd(sc->dev, sc->dev, &cmd, 0); in mmc_test_bus_width()
1068 sc->squelched--; in mmc_test_bus_width()
1070 mmcbr_set_bus_width(sc->dev, bus_width_1); in mmc_test_bus_width()
1071 mmcbr_update_ios(sc->dev); in mmc_test_bus_width()
1080 mmc_get_bits(uint32_t *bits, int bit_len, int start, int size) in mmc_get_bits()
1082 const int i = (bit_len / 32) - (start / 32) - 1; in mmc_get_bits()
1083 const int shift = start & 31; in mmc_get_bits()
1087 retval |= bits[i - 1] << (32 - shift); in mmc_get_bits()
1088 return (retval & ((1llu << size) - 1)); in mmc_get_bits()
1094 int i; in mmc_decode_cid_sd()
1098 cid->mid = mmc_get_bits(raw_cid, 128, 120, 8); in mmc_decode_cid_sd()
1099 cid->oid = mmc_get_bits(raw_cid, 128, 104, 16); in mmc_decode_cid_sd()
1101 cid->pnm[i] = mmc_get_bits(raw_cid, 128, 96 - i * 8, 8); in mmc_decode_cid_sd()
1102 cid->pnm[5] = 0; in mmc_decode_cid_sd()
1103 cid->prv = mmc_get_bits(raw_cid, 128, 56, 8); in mmc_decode_cid_sd()
1104 cid->psn = mmc_get_bits(raw_cid, 128, 24, 32); in mmc_decode_cid_sd()
1105 cid->mdt_year = mmc_get_bits(raw_cid, 128, 12, 8) + 2000; in mmc_decode_cid_sd()
1106 cid->mdt_month = mmc_get_bits(raw_cid, 128, 8, 4); in mmc_decode_cid_sd()
1112 int i; in mmc_decode_cid_mmc()
1116 cid->mid = mmc_get_bits(raw_cid, 128, 120, 8); in mmc_decode_cid_mmc()
1117 cid->oid = mmc_get_bits(raw_cid, 128, 104, 8); in mmc_decode_cid_mmc()
1119 cid->pnm[i] = mmc_get_bits(raw_cid, 128, 96 - i * 8, 8); in mmc_decode_cid_mmc()
1120 cid->pnm[6] = 0; in mmc_decode_cid_mmc()
1121 cid->prv = mmc_get_bits(raw_cid, 128, 48, 8); in mmc_decode_cid_mmc()
1122 cid->psn = mmc_get_bits(raw_cid, 128, 16, 32); in mmc_decode_cid_mmc()
1123 cid->mdt_month = mmc_get_bits(raw_cid, 128, 12, 4); in mmc_decode_cid_mmc()
1124 cid->mdt_year = mmc_get_bits(raw_cid, 128, 8, 4); in mmc_decode_cid_mmc()
1126 cid->mdt_year += 2013; in mmc_decode_cid_mmc()
1128 cid->mdt_year += 1997; in mmc_decode_cid_mmc()
1142 * 22.5MHz/4bit/128-block in mmc_format_card_id_string()
1145 * use as the disk->d_ident string. in mmc_format_card_id_string()
1154 c1 = (ivar->cid.oid >> 8) & 0x0ff; in mmc_format_card_id_string()
1155 c2 = ivar->cid.oid & 0x0ff; in mmc_format_card_id_string()
1159 snprintf(oidstr, sizeof(oidstr), "0x%04x", ivar->cid.oid); in mmc_format_card_id_string()
1160 snprintf(ivar->card_sn_string, sizeof(ivar->card_sn_string), in mmc_format_card_id_string()
1161 "%08X", ivar->cid.psn); in mmc_format_card_id_string()
1162 snprintf(ivar->card_id_string, sizeof(ivar->card_id_string), in mmc_format_card_id_string()
1164 ivar->mode == mode_sd ? "SD" : "MMC", ivar->high_cap ? "HC" : "", in mmc_format_card_id_string()
1165 ivar->cid.pnm, ivar->cid.prv >> 4, ivar->cid.prv & 0x0f, in mmc_format_card_id_string()
1166 ivar->cid.psn, ivar->cid.mdt_month, ivar->cid.mdt_year, in mmc_format_card_id_string()
1167 ivar->cid.mid, oidstr); in mmc_format_card_id_string()
1170 static const int exp[8] = {
1174 static const int mant[16] = {
1178 static const int cur_min[8] = {
1182 static const int cur_max[8] = {
1186 static int
1189 int v; in mmc_decode_csd_sd()
1190 int m; in mmc_decode_csd_sd()
1191 int e; in mmc_decode_csd_sd()
1194 csd->csd_structure = v = mmc_get_bits(raw_csd, 128, 126, 2); in mmc_decode_csd_sd()
1198 csd->tacc = (exp[e] * mant[m] + 9) / 10; in mmc_decode_csd_sd()
1199 csd->nsac = mmc_get_bits(raw_csd, 128, 104, 8) * 100; in mmc_decode_csd_sd()
1202 csd->tran_speed = exp[e] * 10000 * mant[m]; in mmc_decode_csd_sd()
1203 csd->ccc = mmc_get_bits(raw_csd, 128, 84, 12); in mmc_decode_csd_sd()
1204 csd->read_bl_len = 1 << mmc_get_bits(raw_csd, 128, 80, 4); in mmc_decode_csd_sd()
1205 csd->read_bl_partial = mmc_get_bits(raw_csd, 128, 79, 1); in mmc_decode_csd_sd()
1206 csd->write_blk_misalign = mmc_get_bits(raw_csd, 128, 78, 1); in mmc_decode_csd_sd()
1207 csd->read_blk_misalign = mmc_get_bits(raw_csd, 128, 77, 1); in mmc_decode_csd_sd()
1208 csd->dsr_imp = mmc_get_bits(raw_csd, 128, 76, 1); in mmc_decode_csd_sd()
1209 csd->vdd_r_curr_min = in mmc_decode_csd_sd()
1211 csd->vdd_r_curr_max = in mmc_decode_csd_sd()
1213 csd->vdd_w_curr_min = in mmc_decode_csd_sd()
1215 csd->vdd_w_curr_max = in mmc_decode_csd_sd()
1219 csd->capacity = ((1 + m) << (e + 2)) * csd->read_bl_len; in mmc_decode_csd_sd()
1220 csd->erase_blk_en = mmc_get_bits(raw_csd, 128, 46, 1); in mmc_decode_csd_sd()
1221 csd->erase_sector = mmc_get_bits(raw_csd, 128, 39, 7) + 1; in mmc_decode_csd_sd()
1222 csd->wp_grp_size = mmc_get_bits(raw_csd, 128, 32, 7); in mmc_decode_csd_sd()
1223 csd->wp_grp_enable = mmc_get_bits(raw_csd, 128, 31, 1); in mmc_decode_csd_sd()
1224 csd->r2w_factor = 1 << mmc_get_bits(raw_csd, 128, 26, 3); in mmc_decode_csd_sd()
1225 csd->write_bl_len = 1 << mmc_get_bits(raw_csd, 128, 22, 4); in mmc_decode_csd_sd()
1226 csd->write_bl_partial = mmc_get_bits(raw_csd, 128, 21, 1); in mmc_decode_csd_sd()
1231 csd->tacc = (exp[e] * mant[m] + 9) / 10; in mmc_decode_csd_sd()
1232 csd->nsac = mmc_get_bits(raw_csd, 128, 104, 8) * 100; in mmc_decode_csd_sd()
1235 csd->tran_speed = exp[e] * 10000 * mant[m]; in mmc_decode_csd_sd()
1236 csd->ccc = mmc_get_bits(raw_csd, 128, 84, 12); in mmc_decode_csd_sd()
1237 csd->read_bl_len = 1 << mmc_get_bits(raw_csd, 128, 80, 4); in mmc_decode_csd_sd()
1238 csd->read_bl_partial = mmc_get_bits(raw_csd, 128, 79, 1); in mmc_decode_csd_sd()
1239 csd->write_blk_misalign = mmc_get_bits(raw_csd, 128, 78, 1); in mmc_decode_csd_sd()
1240 csd->read_blk_misalign = mmc_get_bits(raw_csd, 128, 77, 1); in mmc_decode_csd_sd()
1241 csd->dsr_imp = mmc_get_bits(raw_csd, 128, 76, 1); in mmc_decode_csd_sd()
1242 csd->capacity = ((uint64_t)mmc_get_bits(raw_csd, 128, 48, 22) + in mmc_decode_csd_sd()
1244 csd->erase_blk_en = mmc_get_bits(raw_csd, 128, 46, 1); in mmc_decode_csd_sd()
1245 csd->erase_sector = mmc_get_bits(raw_csd, 128, 39, 7) + 1; in mmc_decode_csd_sd()
1246 csd->wp_grp_size = mmc_get_bits(raw_csd, 128, 32, 7); in mmc_decode_csd_sd()
1247 csd->wp_grp_enable = mmc_get_bits(raw_csd, 128, 31, 1); in mmc_decode_csd_sd()
1248 csd->r2w_factor = 1 << mmc_get_bits(raw_csd, 128, 26, 3); in mmc_decode_csd_sd()
1249 csd->write_bl_len = 1 << mmc_get_bits(raw_csd, 128, 22, 4); in mmc_decode_csd_sd()
1250 csd->write_bl_partial = mmc_get_bits(raw_csd, 128, 21, 1); in mmc_decode_csd_sd()
1259 int m; in mmc_decode_csd_mmc()
1260 int e; in mmc_decode_csd_mmc()
1263 csd->csd_structure = mmc_get_bits(raw_csd, 128, 126, 2); in mmc_decode_csd_mmc()
1264 csd->spec_vers = mmc_get_bits(raw_csd, 128, 122, 4); in mmc_decode_csd_mmc()
1267 csd->tacc = exp[e] * mant[m] + 9 / 10; in mmc_decode_csd_mmc()
1268 csd->nsac = mmc_get_bits(raw_csd, 128, 104, 8) * 100; in mmc_decode_csd_mmc()
1271 csd->tran_speed = exp[e] * 10000 * mant[m]; in mmc_decode_csd_mmc()
1272 csd->ccc = mmc_get_bits(raw_csd, 128, 84, 12); in mmc_decode_csd_mmc()
1273 csd->read_bl_len = 1 << mmc_get_bits(raw_csd, 128, 80, 4); in mmc_decode_csd_mmc()
1274 csd->read_bl_partial = mmc_get_bits(raw_csd, 128, 79, 1); in mmc_decode_csd_mmc()
1275 csd->write_blk_misalign = mmc_get_bits(raw_csd, 128, 78, 1); in mmc_decode_csd_mmc()
1276 csd->read_blk_misalign = mmc_get_bits(raw_csd, 128, 77, 1); in mmc_decode_csd_mmc()
1277 csd->dsr_imp = mmc_get_bits(raw_csd, 128, 76, 1); in mmc_decode_csd_mmc()
1278 csd->vdd_r_curr_min = cur_min[mmc_get_bits(raw_csd, 128, 59, 3)]; in mmc_decode_csd_mmc()
1279 csd->vdd_r_curr_max = cur_max[mmc_get_bits(raw_csd, 128, 56, 3)]; in mmc_decode_csd_mmc()
1280 csd->vdd_w_curr_min = cur_min[mmc_get_bits(raw_csd, 128, 53, 3)]; in mmc_decode_csd_mmc()
1281 csd->vdd_w_curr_max = cur_max[mmc_get_bits(raw_csd, 128, 50, 3)]; in mmc_decode_csd_mmc()
1284 csd->capacity = ((1 + m) << (e + 2)) * csd->read_bl_len; in mmc_decode_csd_mmc()
1285 csd->erase_blk_en = 0; in mmc_decode_csd_mmc()
1286 csd->erase_sector = (mmc_get_bits(raw_csd, 128, 42, 5) + 1) * in mmc_decode_csd_mmc()
1288 csd->wp_grp_size = mmc_get_bits(raw_csd, 128, 32, 5); in mmc_decode_csd_mmc()
1289 csd->wp_grp_enable = mmc_get_bits(raw_csd, 128, 31, 1); in mmc_decode_csd_mmc()
1290 csd->r2w_factor = 1 << mmc_get_bits(raw_csd, 128, 26, 3); in mmc_decode_csd_mmc()
1291 csd->write_bl_len = 1 << mmc_get_bits(raw_csd, 128, 22, 4); in mmc_decode_csd_mmc()
1292 csd->write_bl_partial = mmc_get_bits(raw_csd, 128, 21, 1); in mmc_decode_csd_mmc()
1298 unsigned int scr_struct; in mmc_app_decode_scr()
1308 scr->sda_vsn = mmc_get_bits(raw_scr, 64, 56, 4); in mmc_app_decode_scr()
1309 scr->bus_widths = mmc_get_bits(raw_scr, 64, 48, 4); in mmc_app_decode_scr()
1319 sd_status->bus_width = mmc_get_bits(raw_sd_status, 512, 510, 2); in mmc_app_decode_sd_status()
1320 sd_status->secured_mode = mmc_get_bits(raw_sd_status, 512, 509, 1); in mmc_app_decode_sd_status()
1321 sd_status->card_type = mmc_get_bits(raw_sd_status, 512, 480, 16); in mmc_app_decode_sd_status()
1322 sd_status->prot_area = mmc_get_bits(raw_sd_status, 512, 448, 12); in mmc_app_decode_sd_status()
1323 sd_status->speed_class = mmc_get_bits(raw_sd_status, 512, 440, 8); in mmc_app_decode_sd_status()
1324 sd_status->perf_move = mmc_get_bits(raw_sd_status, 512, 432, 8); in mmc_app_decode_sd_status()
1325 sd_status->au_size = mmc_get_bits(raw_sd_status, 512, 428, 4); in mmc_app_decode_sd_status()
1326 sd_status->erase_size = mmc_get_bits(raw_sd_status, 512, 408, 16); in mmc_app_decode_sd_status()
1327 sd_status->erase_timeout = mmc_get_bits(raw_sd_status, 512, 402, 6); in mmc_app_decode_sd_status()
1328 sd_status->erase_offset = mmc_get_bits(raw_sd_status, 512, 400, 2); in mmc_app_decode_sd_status()
1331 static int
1334 struct mmc_command cmd; in mmc_all_send_cid() local
1335 int err; in mmc_all_send_cid()
1337 memset(&cmd, 0, sizeof(cmd)); in mmc_all_send_cid()
1338 cmd.opcode = MMC_ALL_SEND_CID; in mmc_all_send_cid()
1339 cmd.arg = 0; in mmc_all_send_cid()
1340 cmd.flags = MMC_RSP_R2 | MMC_CMD_BCR; in mmc_all_send_cid()
1341 cmd.data = NULL; in mmc_all_send_cid()
1342 err = mmc_wait_for_cmd(sc->dev, sc->dev, &cmd, CMD_RETRIES); in mmc_all_send_cid()
1343 memcpy(rawcid, cmd.resp, 4 * sizeof(uint32_t)); in mmc_all_send_cid()
1347 static int
1350 struct mmc_command cmd; in mmc_send_csd() local
1351 int err; in mmc_send_csd()
1353 memset(&cmd, 0, sizeof(cmd)); in mmc_send_csd()
1354 cmd.opcode = MMC_SEND_CSD; in mmc_send_csd()
1355 cmd.arg = rca << 16; in mmc_send_csd()
1356 cmd.flags = MMC_RSP_R2 | MMC_CMD_BCR; in mmc_send_csd()
1357 cmd.data = NULL; in mmc_send_csd()
1358 err = mmc_wait_for_cmd(sc->dev, sc->dev, &cmd, CMD_RETRIES); in mmc_send_csd()
1359 memcpy(rawcsd, cmd.resp, 4 * sizeof(uint32_t)); in mmc_send_csd()
1363 static int
1366 int err; in mmc_app_send_scr()
1367 struct mmc_command cmd; in mmc_app_send_scr() local
1370 memset(&cmd, 0, sizeof(cmd)); in mmc_app_send_scr()
1374 cmd.opcode = ACMD_SEND_SCR; in mmc_app_send_scr()
1375 cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC; in mmc_app_send_scr()
1376 cmd.arg = 0; in mmc_app_send_scr()
1377 cmd.data = &data; in mmc_app_send_scr()
1383 err = mmc_wait_for_app_cmd(sc->dev, sc->dev, rca, &cmd, CMD_RETRIES); in mmc_app_send_scr()
1389 static int
1392 struct mmc_command cmd; in mmc_app_sd_status() local
1394 int err, i; in mmc_app_sd_status()
1396 memset(&cmd, 0, sizeof(cmd)); in mmc_app_sd_status()
1400 cmd.opcode = ACMD_SD_STATUS; in mmc_app_sd_status()
1401 cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC; in mmc_app_sd_status()
1402 cmd.arg = 0; in mmc_app_sd_status()
1403 cmd.data = &data; in mmc_app_sd_status()
1409 err = mmc_wait_for_app_cmd(sc->dev, sc->dev, rca, &cmd, CMD_RETRIES); in mmc_app_sd_status()
1415 static int
1418 struct mmc_command cmd; in mmc_set_relative_addr() local
1419 int err; in mmc_set_relative_addr()
1421 memset(&cmd, 0, sizeof(cmd)); in mmc_set_relative_addr()
1422 cmd.opcode = MMC_SET_RELATIVE_ADDR; in mmc_set_relative_addr()
1423 cmd.arg = resp << 16; in mmc_set_relative_addr()
1424 cmd.flags = MMC_RSP_R6 | MMC_CMD_BCR; in mmc_set_relative_addr()
1425 cmd.data = NULL; in mmc_set_relative_addr()
1426 err = mmc_wait_for_cmd(sc->dev, sc->dev, &cmd, CMD_RETRIES); in mmc_set_relative_addr()
1430 static int
1433 struct mmc_command cmd; in mmc_send_relative_addr() local
1434 int err; in mmc_send_relative_addr()
1436 memset(&cmd, 0, sizeof(cmd)); in mmc_send_relative_addr()
1437 cmd.opcode = SD_SEND_RELATIVE_ADDR; in mmc_send_relative_addr()
1438 cmd.arg = 0; in mmc_send_relative_addr()
1439 cmd.flags = MMC_RSP_R6 | MMC_CMD_BCR; in mmc_send_relative_addr()
1440 cmd.data = NULL; in mmc_send_relative_addr()
1441 err = mmc_wait_for_cmd(sc->dev, sc->dev, &cmd, CMD_RETRIES); in mmc_send_relative_addr()
1442 *resp = cmd.resp[0]; in mmc_send_relative_addr()
1446 static int
1449 struct mmc_command cmd; in mmc_set_blocklen() local
1450 int err; in mmc_set_blocklen()
1452 memset(&cmd, 0, sizeof(cmd)); in mmc_set_blocklen()
1453 cmd.opcode = MMC_SET_BLOCKLEN; in mmc_set_blocklen()
1454 cmd.arg = len; in mmc_set_blocklen()
1455 cmd.flags = MMC_RSP_R1 | MMC_CMD_AC; in mmc_set_blocklen()
1456 cmd.data = NULL; in mmc_set_blocklen()
1457 err = mmc_wait_for_cmd(sc->dev, sc->dev, &cmd, CMD_RETRIES); in mmc_set_blocklen()
1467 return (ivar->tran_speed); in mmc_timing_to_dtr()
1469 return (ivar->hs_tran_speed); in mmc_timing_to_dtr()
1510 return ("HS400"); in mmc_timing_to_string()
1512 return ("HS400 with enhanced strobe"); in mmc_timing_to_string()
1520 int host_caps; in mmc_host_timing()
1567 mmc_log_card(device_t dev, struct mmc_ivars *ivar, int newcard) in mmc_log_card()
1572 ivar->rca, newcard ? " added" : ""); in mmc_log_card()
1573 device_printf(dev, " card: %s\n", ivar->card_id_string); in mmc_log_card()
1574 for (timing = bus_timing_max; timing > bus_timing_normal; timing--) { in mmc_log_card()
1575 if (isset(&ivar->timings, timing)) in mmc_log_card()
1578 device_printf(dev, " quirks: %b\n", ivar->quirks, MMC_QUIRKS_FMT); in mmc_log_card()
1580 (ivar->bus_width == bus_width_1 ? 1 : in mmc_log_card()
1581 (ivar->bus_width == bus_width_4 ? 4 : 8)), in mmc_log_card()
1585 ivar->sec_count, ivar->erase_sector, in mmc_log_card()
1586 ivar->read_only ? ", read-only" : ""); in mmc_log_card()
1598 int err, host_caps, i, newcard; in mmc_discover_cards()
1604 host_caps = mmcbr_get_caps(sc->dev); in mmc_discover_cards()
1606 device_printf(sc->dev, "Probing cards\n"); in mmc_discover_cards()
1609 sc->squelched++; /* Errors are expected, squelch reporting. */ in mmc_discover_cards()
1611 sc->squelched--; in mmc_discover_cards()
1615 device_printf(sc->dev, "Error reading CID %d\n", err); in mmc_discover_cards()
1619 for (i = 0; i < sc->child_count; i++) { in mmc_discover_cards()
1620 ivar = device_get_ivars(sc->child_list[i]); in mmc_discover_cards()
1621 if (memcmp(ivar->raw_cid, raw_cid, sizeof(raw_cid)) == in mmc_discover_cards()
1628 device_printf(sc->dev, in mmc_discover_cards()
1636 memcpy(ivar->raw_cid, raw_cid, sizeof(raw_cid)); in mmc_discover_cards()
1638 if (mmcbr_get_ro(sc->dev)) in mmc_discover_cards()
1639 ivar->read_only = 1; in mmc_discover_cards()
1640 ivar->bus_width = bus_width_1; in mmc_discover_cards()
1641 setbit(&ivar->timings, bus_timing_normal); in mmc_discover_cards()
1642 ivar->mode = mmcbr_get_mode(sc->dev); in mmc_discover_cards()
1643 if (ivar->mode == mode_sd) { in mmc_discover_cards()
1644 mmc_decode_cid_sd(ivar->raw_cid, &ivar->cid); in mmc_discover_cards()
1647 device_printf(sc->dev, in mmc_discover_cards()
1651 ivar->rca = resp >> 16; in mmc_discover_cards()
1653 err = mmc_send_csd(sc, ivar->rca, ivar->raw_csd); in mmc_discover_cards()
1655 device_printf(sc->dev, in mmc_discover_cards()
1660 device_printf(sc->dev, in mmc_discover_cards()
1662 newcard ? "New c" : "C", ivar->raw_csd[0], in mmc_discover_cards()
1663 ivar->raw_csd[1], ivar->raw_csd[2], in mmc_discover_cards()
1664 ivar->raw_csd[3]); in mmc_discover_cards()
1665 err = mmc_decode_csd_sd(ivar->raw_csd, &ivar->csd); in mmc_discover_cards()
1667 device_printf(sc->dev, "Error decoding CSD\n"); in mmc_discover_cards()
1670 ivar->sec_count = ivar->csd.capacity / MMC_SECTOR_SIZE; in mmc_discover_cards()
1671 if (ivar->csd.csd_structure > 0) in mmc_discover_cards()
1672 ivar->high_cap = 1; in mmc_discover_cards()
1673 ivar->tran_speed = ivar->csd.tran_speed; in mmc_discover_cards()
1674 ivar->erase_sector = ivar->csd.erase_sector * in mmc_discover_cards()
1675 ivar->csd.write_bl_len / MMC_SECTOR_SIZE; in mmc_discover_cards()
1677 err = mmc_send_status(sc->dev, sc->dev, ivar->rca, in mmc_discover_cards()
1680 device_printf(sc->dev, in mmc_discover_cards()
1685 device_printf(sc->dev, in mmc_discover_cards()
1691 err = mmc_select_card(sc, ivar->rca); in mmc_discover_cards()
1693 device_printf(sc->dev, in mmc_discover_cards()
1697 err = mmc_app_send_scr(sc, ivar->rca, ivar->raw_scr); in mmc_discover_cards()
1699 device_printf(sc->dev, in mmc_discover_cards()
1703 mmc_app_decode_scr(ivar->raw_scr, &ivar->scr); in mmc_discover_cards()
1705 if ((ivar->scr.sda_vsn >= 1) && in mmc_discover_cards()
1706 (ivar->csd.ccc & (1 << 10))) { in mmc_discover_cards()
1712 setbit(&ivar->timings, bus_timing_hs); in mmc_discover_cards()
1713 ivar->hs_tran_speed = SD_HS_MAX; in mmc_discover_cards()
1723 * attempt to blindly re-select them, we get timeout in mmc_discover_cards()
1730 (void)mmc_select_card(sc, ivar->rca); in mmc_discover_cards()
1731 (void)mmc_app_sd_status(sc, ivar->rca, in mmc_discover_cards()
1732 ivar->raw_sd_status); in mmc_discover_cards()
1733 mmc_app_decode_sd_status(ivar->raw_sd_status, in mmc_discover_cards()
1734 &ivar->sd_status); in mmc_discover_cards()
1735 if (ivar->sd_status.au_size != 0) { in mmc_discover_cards()
1736 ivar->erase_sector = in mmc_discover_cards()
1737 16 << ivar->sd_status.au_size; in mmc_discover_cards()
1741 (ivar->scr.bus_widths & SD_SCR_BUS_WIDTH_4)) in mmc_discover_cards()
1742 ivar->bus_width = bus_width_4; in mmc_discover_cards()
1746 ivar->rca = rca++; in mmc_discover_cards()
1747 err = mmc_set_relative_addr(sc, ivar->rca); in mmc_discover_cards()
1749 device_printf(sc->dev, "Error setting RCA %d\n", err); in mmc_discover_cards()
1753 err = mmc_send_csd(sc, ivar->rca, ivar->raw_csd); in mmc_discover_cards()
1755 device_printf(sc->dev, "Error getting CSD %d\n", err); in mmc_discover_cards()
1759 device_printf(sc->dev, in mmc_discover_cards()
1761 newcard ? "New c" : "C", ivar->raw_csd[0], in mmc_discover_cards()
1762 ivar->raw_csd[1], ivar->raw_csd[2], in mmc_discover_cards()
1763 ivar->raw_csd[3]); in mmc_discover_cards()
1765 mmc_decode_csd_mmc(ivar->raw_csd, &ivar->csd); in mmc_discover_cards()
1766 ivar->sec_count = ivar->csd.capacity / MMC_SECTOR_SIZE; in mmc_discover_cards()
1767 ivar->tran_speed = ivar->csd.tran_speed; in mmc_discover_cards()
1768 ivar->erase_sector = ivar->csd.erase_sector * in mmc_discover_cards()
1769 ivar->csd.write_bl_len / MMC_SECTOR_SIZE; in mmc_discover_cards()
1771 err = mmc_send_status(sc->dev, sc->dev, ivar->rca, &status); in mmc_discover_cards()
1773 device_printf(sc->dev, in mmc_discover_cards()
1778 device_printf(sc->dev, in mmc_discover_cards()
1783 err = mmc_select_card(sc, ivar->rca); in mmc_discover_cards()
1785 device_printf(sc->dev, "Error selecting card %d\n", in mmc_discover_cards()
1790 rev = -1; in mmc_discover_cards()
1792 if (ivar->csd.spec_vers >= 4) { in mmc_discover_cards()
1793 err = mmc_send_ext_csd(sc->dev, sc->dev, in mmc_discover_cards()
1794 ivar->raw_ext_csd); in mmc_discover_cards()
1796 device_printf(sc->dev, in mmc_discover_cards()
1800 ext_csd = ivar->raw_ext_csd; in mmc_discover_cards()
1805 ivar->sec_count = sec_count; in mmc_discover_cards()
1806 ivar->high_cap = 1; in mmc_discover_cards()
1809 ivar->bus_width = mmc_test_bus_width(sc); in mmc_discover_cards()
1813 setbit(&ivar->timings, bus_timing_hs); in mmc_discover_cards()
1814 ivar->hs_tran_speed = MMC_TYPE_HS_52_MAX; in mmc_discover_cards()
1816 setbit(&ivar->timings, bus_timing_hs); in mmc_discover_cards()
1817 ivar->hs_tran_speed = MMC_TYPE_HS_26_MAX; in mmc_discover_cards()
1821 setbit(&ivar->timings, bus_timing_mmc_ddr52); in mmc_discover_cards()
1822 setbit(&ivar->vccq_120, bus_timing_mmc_ddr52); in mmc_discover_cards()
1826 setbit(&ivar->timings, bus_timing_mmc_ddr52); in mmc_discover_cards()
1827 setbit(&ivar->vccq_180, bus_timing_mmc_ddr52); in mmc_discover_cards()
1831 setbit(&ivar->timings, bus_timing_mmc_hs200); in mmc_discover_cards()
1832 setbit(&ivar->vccq_120, bus_timing_mmc_hs200); in mmc_discover_cards()
1836 setbit(&ivar->timings, bus_timing_mmc_hs200); in mmc_discover_cards()
1837 setbit(&ivar->vccq_180, bus_timing_mmc_hs200); in mmc_discover_cards()
1841 ivar->bus_width == bus_width_8) { in mmc_discover_cards()
1842 setbit(&ivar->timings, bus_timing_mmc_hs400); in mmc_discover_cards()
1843 setbit(&ivar->vccq_120, bus_timing_mmc_hs400); in mmc_discover_cards()
1847 ivar->bus_width == bus_width_8) { in mmc_discover_cards()
1848 setbit(&ivar->timings, bus_timing_mmc_hs400); in mmc_discover_cards()
1849 setbit(&ivar->vccq_180, bus_timing_mmc_hs400); 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_120, bus_timing_mmc_hs400es); in mmc_discover_cards()
1863 ivar->bus_width == bus_width_8) { in mmc_discover_cards()
1864 setbit(&ivar->timings, bus_timing_mmc_hs400es); in mmc_discover_cards()
1865 setbit(&ivar->vccq_180, bus_timing_mmc_hs400es); in mmc_discover_cards()
1871 ivar->cmd6_time = 500 * 1000; in mmc_discover_cards()
1873 ivar->cmd6_time = 10 * in mmc_discover_cards()
1877 ivar->erase_sector = 1024 * in mmc_discover_cards()
1879 err = mmc_switch(sc->dev, sc->dev, ivar->rca, in mmc_discover_cards()
1883 ivar->cmd6_time, true); in mmc_discover_cards()
1885 device_printf(sc->dev, in mmc_discover_cards()
1893 mmc_decode_cid_mmc(ivar->raw_cid, &ivar->cid, rev >= 5); in mmc_discover_cards()
1896 for (quirk = &mmc_quirks[0]; quirk->mid != 0x0; quirk++) { in mmc_discover_cards()
1897 if ((quirk->mid == MMC_QUIRK_MID_ANY || in mmc_discover_cards()
1898 quirk->mid == ivar->cid.mid) && in mmc_discover_cards()
1899 (quirk->oid == MMC_QUIRK_OID_ANY || in mmc_discover_cards()
1900 quirk->oid == ivar->cid.oid) && in mmc_discover_cards()
1901 strncmp(quirk->pnm, ivar->cid.pnm, in mmc_discover_cards()
1902 sizeof(ivar->cid.pnm)) == 0) { in mmc_discover_cards()
1903 ivar->quirks = quirk->quirks; in mmc_discover_cards()
1916 if (ivar->csd.read_bl_len != MMC_SECTOR_SIZE || in mmc_discover_cards()
1917 ivar->csd.write_bl_len != MMC_SECTOR_SIZE) in mmc_discover_cards()
1923 mmc_log_card(sc->dev, ivar, newcard); in mmc_discover_cards()
1926 child = device_add_child(sc->dev, NULL, DEVICE_UNIT_ANY); in mmc_discover_cards()
1929 sc->child_list = realloc(sc->child_list, in mmc_discover_cards()
1930 sizeof(device_t) * (sc->child_count + 1), in mmc_discover_cards()
1932 sc->child_list[sc->child_count++] = child; in mmc_discover_cards()
1934 device_printf(sc->dev, "Error adding child\n"); in mmc_discover_cards()
1948 mmcbr_get_mode(sc->dev) == mode_sd) in mmc_discover_cards()
1957 int i, j; in mmc_update_child_list()
1959 if (sc->child_count == 0) { in mmc_update_child_list()
1960 free(sc->child_list, M_DEVBUF); in mmc_update_child_list()
1963 for (i = j = 0; i < sc->child_count; i++) { in mmc_update_child_list()
1965 child = sc->child_list[j++]; in mmc_update_child_list()
1970 sc->child_list[i] = child; in mmc_update_child_list()
1972 sc->child_list = realloc(sc->child_list, sizeof(device_t) * in mmc_update_child_list()
1973 sc->child_count, M_DEVBUF, M_WAITOK); in mmc_update_child_list()
1980 int err, i, j; in mmc_rescan_cards()
1982 for (i = j = 0; i < sc->child_count; i++) { in mmc_rescan_cards()
1983 ivar = device_get_ivars(sc->child_list[i]); in mmc_rescan_cards()
1984 if (mmc_select_card(sc, ivar->rca) != MMC_ERR_NONE) { in mmc_rescan_cards()
1986 device_printf(sc->dev, in mmc_rescan_cards()
1988 ivar->rca); in mmc_rescan_cards()
1989 err = device_delete_child(sc->dev, sc->child_list[i]); in mmc_rescan_cards()
1998 if (sc->child_count == j) in mmc_rescan_cards()
2000 sc->child_count = j; in mmc_rescan_cards()
2006 static int
2010 int err, i, j; in mmc_delete_cards()
2013 for (i = j = 0; i < sc->child_count; i++) { in mmc_delete_cards()
2014 ivar = device_get_ivars(sc->child_list[i]); in mmc_delete_cards()
2016 device_printf(sc->dev, in mmc_delete_cards()
2018 ivar->rca); in mmc_delete_cards()
2019 err = device_delete_child(sc->dev, sc->child_list[i]); in mmc_delete_cards()
2029 sc->child_count = j; in mmc_delete_cards()
2039 int err; in mmc_go_discovery()
2041 dev = sc->dev; in mmc_go_discovery()
2046 sc->squelched++; /* Errors are expected, squelch reporting. */ in mmc_go_discovery()
2051 device_printf(sc->dev, "Probing bus\n"); in mmc_go_discovery()
2055 device_printf(sc->dev, in mmc_go_discovery()
2059 device_printf(sc->dev, "SD probe: failed\n"); in mmc_go_discovery()
2066 device_printf(sc->dev, in mmc_go_discovery()
2070 device_printf(sc->dev, in mmc_go_discovery()
2073 device_printf(sc->dev, "SD probe: OK (OCR: 0x%08x)\n", in mmc_go_discovery()
2075 sc->squelched--; in mmc_go_discovery()
2091 device_printf(sc->dev, "Current OCR: 0x%08x\n", in mmc_go_discovery()
2094 device_printf(sc->dev, "No compatible cards found on bus\n"); in mmc_go_discovery()
2116 static int
2121 int i; in mmc_calculate_clock()
2125 bool changed, hs400; in mmc_calculate_clock() local
2127 dev = sc->dev; in mmc_calculate_clock()
2132 for (i = 0; i < sc->child_count; i++) { in mmc_calculate_clock()
2133 ivar = device_get_ivars(sc->child_list[i]); in mmc_calculate_clock()
2134 if (isclr(&ivar->timings, max_timing) || in mmc_calculate_clock()
2136 for (timing = max_timing - 1; timing >= in mmc_calculate_clock()
2137 bus_timing_normal; timing--) { in mmc_calculate_clock()
2138 if (isset(&ivar->timings, timing) && in mmc_calculate_clock()
2162 * HS400 must be tuned in HS200 mode, so in case of HS400 we begin in mmc_calculate_clock()
2167 * speed mode as does HS400 (see mmc_switch_to_hs400()). in mmc_calculate_clock()
2169 hs400 = max_timing == bus_timing_mmc_hs400; in mmc_calculate_clock()
2170 timing = hs400 == true ? bus_timing_mmc_hs200 : max_timing; in mmc_calculate_clock()
2171 for (i = 0; i < sc->child_count; i++) { in mmc_calculate_clock()
2172 ivar = device_get_ivars(sc->child_list[i]); in mmc_calculate_clock()
2173 if ((ivar->timings & ~(1 << bus_timing_normal)) == 0) in mmc_calculate_clock()
2176 rca = ivar->rca; in mmc_calculate_clock()
2183 if (timing == bus_timing_mmc_hs200 || /* includes HS400 */ in mmc_calculate_clock()
2192 if (timing == bus_timing_mmc_hs200) { /* includes HS400 */ in mmc_calculate_clock()
2200 mmcbr_set_bus_width(dev, ivar->bus_width); in mmc_calculate_clock()
2231 mmcbr_set_bus_width(dev, ivar->bus_width); in mmc_calculate_clock()
2254 if (mmcbr_tune(dev, hs400) != 0) { in mmc_calculate_clock()
2260 if (hs400 == true && mmc_switch_to_hs400(sc, ivar, max_dtr, in mmc_calculate_clock()
2279 * Switch from HS200 to HS400 (either initially or for re-tuning) or directly
2280 * to HS400ES. This follows the sequences described in "6.6.2.3 HS400 timing
2283 static int
2288 int err; in mmc_switch_to_hs400()
2290 dev = sc->dev; in mmc_switch_to_hs400()
2294 * before eventually switching to HS400/HS400ES; mmc_set_timing() in mmc_switch_to_hs400()
2297 mmcbr_set_clock(dev, ivar->hs_tran_speed); in mmc_switch_to_hs400()
2309 mmcbr_set_bus_width(dev, ivar->bus_width); in mmc_switch_to_hs400()
2312 /* Finally, switch to HS400/HS400ES mode. */ in mmc_switch_to_hs400()
2322 * Switch from HS400 to HS200 (for re-tuning).
2324 static int
2329 int err; in mmc_switch_to_hs200()
2331 dev = sc->dev; in mmc_switch_to_hs200()
2338 mmcbr_set_clock(dev, ivar->hs_tran_speed); in mmc_switch_to_hs200()
2350 mmcbr_set_bus_width(dev, ivar->bus_width); in mmc_switch_to_hs200()
2351 mmcbr_set_timing(sc->dev, bus_timing_hs); in mmc_switch_to_hs200()
2363 static int
2368 int err; in mmc_retune()
2376 if (sc->retune_needed != 1 && sc->retune_paused != 0) in mmc_retune()
2383 * the devices in HS400 mode so periodic re-tuning isn't in mmc_retune()
2424 KASSERT(sc->owner != NULL, in mmc_retune_pause()
2428 if (retune == true && sc->retune_paused == 0) in mmc_retune_pause()
2429 sc->retune_needed = 1; in mmc_retune_pause()
2430 sc->retune_paused++; in mmc_retune_pause()
2442 KASSERT(sc->owner != NULL, in mmc_retune_unpause()
2445 KASSERT(sc->retune_paused != 0, in mmc_retune_unpause()
2446 ("%s: Re-tune pause count already at 0", __func__)); in mmc_retune_unpause()
2448 sc->retune_paused--; in mmc_retune_unpause()
2454 device_t dev = sc->dev; in mmc_scan()
2455 int err; in mmc_scan()
2471 static int
2472 mmc_read_ivar(device_t bus, device_t child, int which, uintptr_t *result) in mmc_read_ivar()
2480 *result = ivar->csd.spec_vers; in mmc_read_ivar()
2483 *result = ivar->csd.dsr_imp; in mmc_read_ivar()
2486 *result = ivar->sec_count; in mmc_read_ivar()
2489 *result = ivar->rca; in mmc_read_ivar()
2498 *result = ivar->read_only; in mmc_read_ivar()
2501 *result = ivar->high_cap; in mmc_read_ivar()
2504 *result = ivar->mode; in mmc_read_ivar()
2507 *result = ivar->bus_width; in mmc_read_ivar()
2510 *result = ivar->erase_sector; in mmc_read_ivar()
2516 *result = ivar->cmd6_time; in mmc_read_ivar()
2519 *result = ivar->quirks; in mmc_read_ivar()
2522 *(char **)result = ivar->card_id_string; in mmc_read_ivar()
2525 *(char **)result = ivar->card_sn_string; in mmc_read_ivar()
2531 static int
2532 mmc_write_ivar(device_t bus, device_t child, int which, uintptr_t value) in mmc_write_ivar()
2547 config_intrhook_disestablish(&sc->config_intrhook); in mmc_delayed_attach()
2550 static int