Lines Matching +full:io +full:- +full:hv

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
64 FEATURE(mmccam, "CAM-based MMC/SD/SDIO stack");
137 CAM_DEBUG((softc)->periph->path, CAM_DEBUG_PROBE, \
138 ("Probe %s to %s\n", text[(softc)->action], \
140 (softc)->action = (newaction); \
184 /* XPort functions -- an interface to CAM at periph side */
195 device->quirk = NULL; in mmc_alloc_device()
196 device->mintags = 0; in mmc_alloc_device()
197 device->maxtags = 0; in mmc_alloc_device()
198 bzero(&device->inq_data, sizeof(device->inq_data)); in mmc_alloc_device()
199 device->inq_flags = 0; in mmc_alloc_device()
200 device->queue_flags = 0; in mmc_alloc_device()
201 device->serial_num = NULL; in mmc_alloc_device()
202 device->serial_num_len = 0; in mmc_alloc_device()
214 if (target->target_id == CAM_TARGET_WILDCARD in mmc_dev_async()
215 || device->lun_id == CAM_LUN_WILDCARD) in mmc_dev_async()
219 (device->flags & CAM_DEV_UNCONFIGURED) == 0) { in mmc_dev_async()
220 device->flags |= CAM_DEV_UNCONFIGURED; in mmc_dev_async()
241 request_ccb->ccb_h.status = cpi.ccb_h.status; in mmc_scan_lun()
249 request_ccb->ccb_h.status = CAM_REQ_CMP; /* XXX signal error ? */ in mmc_scan_lun()
259 if ((old_periph->flags & CAM_PERIPH_INVALID) == 0) { in mmc_scan_lun()
261 // softc = (mmcprobe_softc *)old_periph->softc; in mmc_scan_lun()
263 // TAILQ_INSERT_TAIL(&softc->request_ccbs, in mmc_scan_lun()
264 // &request_ccb->ccb_h, periph_links.tqe); in mmc_scan_lun()
265 // softc->restart = 1; in mmc_scan_lun()
268 request_ccb->ccb_h.status = CAM_REQ_CMP_ERR; in mmc_scan_lun()
271 request_ccb->ccb_h.status = CAM_REQ_CMP_ERR; in mmc_scan_lun()
289 request_ccb->ccb_h.status = status; in mmc_scan_lun()
300 CAM_DEBUG(start_ccb->ccb_h.path, CAM_DEBUG_TRACE, in mmc_action()
301 ("mmc_action! func_code=%x, action %s\n", start_ccb->ccb_h.func_code, in mmc_action()
302 xpt_action_name(start_ccb->ccb_h.func_code))); in mmc_action()
303 switch (start_ccb->ccb_h.func_code) { in mmc_action()
309 CAM_DEBUG(start_ccb->ccb_h.path, CAM_DEBUG_INFO, in mmc_action()
311 mmc_scan_lun(start_ccb->ccb_h.path->periph, in mmc_action()
312 start_ccb->ccb_h.path, start_ccb->crcn.flags, in mmc_action()
335 xpt_path_assert(start_ccb->ccb_h.path, MA_OWNED); in mmc_dev_advinfo()
336 start_ccb->ccb_h.status = CAM_REQ_INVALID; in mmc_dev_advinfo()
337 device = start_ccb->ccb_h.path->device; in mmc_dev_advinfo()
338 cdai = &start_ccb->cdai; in mmc_dev_advinfo()
339 CAM_DEBUG(start_ccb->ccb_h.path, CAM_DEBUG_TRACE, in mmc_dev_advinfo()
340 ("%s: request %x\n", __func__, cdai->buftype)); in mmc_dev_advinfo()
343 if (cdai->flags & CDAI_FLAG_STORE) in mmc_dev_advinfo()
346 switch(cdai->buftype) { in mmc_dev_advinfo()
348 cdai->provsiz = device->device_id_len; in mmc_dev_advinfo()
349 if (device->device_id_len == 0) in mmc_dev_advinfo()
351 amt = MIN(cdai->provsiz, cdai->bufsiz); in mmc_dev_advinfo()
352 memcpy(cdai->buf, device->device_id, amt); in mmc_dev_advinfo()
355 cdai->provsiz = device->serial_num_len; in mmc_dev_advinfo()
356 if (device->serial_num_len == 0) in mmc_dev_advinfo()
358 amt = MIN(cdai->provsiz, cdai->bufsiz); in mmc_dev_advinfo()
359 memcpy(cdai->buf, device->serial_num, amt); in mmc_dev_advinfo()
362 cdai->provsiz = 0; in mmc_dev_advinfo()
365 cdai->provsiz = sizeof(struct mmc_params); in mmc_dev_advinfo()
366 amt = MIN(cdai->provsiz, cdai->bufsiz); in mmc_dev_advinfo()
367 memcpy(cdai->buf, &device->mmc_ident_data, amt); in mmc_dev_advinfo()
373 start_ccb->ccb_h.status = CAM_REQ_CMP; in mmc_dev_advinfo()
381 struct cam_path *path = periph->path; in mmc_announce_periph_sbuf()
385 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("mmc_announce_periph_sbuf")); in mmc_announce_periph_sbuf()
394 xpt_path_inq(&cpi, periph->path); in mmc_announce_periph_sbuf()
412 if (xpt_create_path(&ccb->ccb_h.path, NULL, pathid, in mmccam_start_discovery()
418 KASSERT(xpt_path_sim_device(ccb->ccb_h.path) != NULL, in mmccam_start_discovery()
424 /* This func is called per attached device :-( */
430 sbuf_printf(sb, "Relative addr: %08x\n", ident_data->card_rca); in mmc_print_ident()
432 if (ident_data->card_features & CARD_FEATURE_MMC) { in mmc_print_ident()
436 if (ident_data->card_features & CARD_FEATURE_MEMORY) { in mmc_print_ident()
440 if (ident_data->card_features & CARD_FEATURE_SDHC) { in mmc_print_ident()
441 sbuf_printf(sb, "%sHigh-Capacity", space ? " " : ""); in mmc_print_ident()
444 if (ident_data->card_features & CARD_FEATURE_SD20) { in mmc_print_ident()
445 sbuf_printf(sb, "%sSD2.0-Conditions", space ? " " : ""); in mmc_print_ident()
448 if (ident_data->card_features & CARD_FEATURE_SDIO) { in mmc_print_ident()
452 if (ident_data->card_features & CARD_FEATURE_18V) { in mmc_print_ident()
453 sbuf_printf(sb, "%s1.8-Signaling", space ? " " : ""); in mmc_print_ident()
457 if (ident_data->card_features & CARD_FEATURE_MEMORY) in mmc_print_ident()
459 ident_data->card_ocr); in mmc_print_ident()
461 if (ident_data->card_features & CARD_FEATURE_SDIO) { in mmc_print_ident()
462 sbuf_printf(sb, "Card IO OCR: %08x\n", ident_data->io_ocr); in mmc_print_ident()
464 ident_data->sdio_func_count); in mmc_print_ident()
471 mmc_print_ident(&device->mmc_ident_data, sb); in mmc_proto_announce_sbuf()
483 if (ccb->ccb_h.func_code != XPT_MMC_IO) in mmc_proto_debug_out()
486 CAM_DEBUG(ccb->ccb_h.path, in mmc_proto_debug_out()
515 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("mmcprobe_register\n")); in mmcprobe_register()
532 softc->flags = 0; in mmcprobe_register()
533 softc->acmd41_count = 0; in mmcprobe_register()
534 periph->softc = softc; in mmcprobe_register()
535 softc->periph = periph; in mmcprobe_register()
536 softc->action = PROBE_INVALID; in mmcprobe_register()
537 softc->restart = 0; in mmcprobe_register()
540 memset(&periph->path->device->mmc_ident_data, 0, sizeof(struct mmc_params)); in mmcprobe_register()
547 CAM_DEBUG(periph->path, CAM_DEBUG_PROBE, ("Probe started\n")); in mmcprobe_register()
549 if (periph->path->device->flags & CAM_DEV_UNCONFIGURED) in mmcprobe_register()
566 i >= MMC_OCR_MIN_VOLTAGE_SHIFT; i--) in mmc_highest_voltage()
569 return (-1); in mmc_highest_voltage()
575 ccb->ccb_h.func_code = cmd; in init_standard_ccb()
576 ccb->ccb_h.flags = CAM_DIR_OUT; in init_standard_ccb()
577 ccb->ccb_h.retry_count = 0; in init_standard_ccb()
578 ccb->ccb_h.timeout = 15 * 1000; in init_standard_ccb()
579 ccb->ccb_h.cbfcnp = mmcprobe_done; in init_standard_ccb()
590 CAM_DEBUG(start_ccb->ccb_h.path, CAM_DEBUG_PROBE, ("mmcprobe_start\n")); in mmcprobe_start()
591 softc = (mmcprobe_softc *)periph->softc; in mmcprobe_start()
592 path = start_ccb->ccb_h.path; in mmcprobe_start()
593 mmcio = &start_ccb->mmcio; in mmcprobe_start()
594 cts = &start_ccb->cts.proto_specific.mmc; in mmcprobe_start()
595 struct mmc_params *mmcp = &path->device->mmc_ident_data; in mmcprobe_start()
597 memset(&mmcio->cmd, 0, sizeof(struct mmc_command)); in mmcprobe_start()
599 if (softc->restart) { in mmcprobe_start()
600 softc->restart = 0; in mmcprobe_start()
601 if (path->device->flags & CAM_DEV_UNCONFIGURED) in mmcprobe_start()
602 softc->action = PROBE_RESET; in mmcprobe_start()
604 softc->action = PROBE_IDENTIFY; in mmcprobe_start()
608 switch (softc->action) { in mmcprobe_start()
610 CAM_DEBUG(start_ccb->ccb_h.path, CAM_DEBUG_PROBE, ("Start with PROBE_RESET\n")); in mmcprobe_start()
613 CAM_DEBUG(start_ccb->ccb_h.path, CAM_DEBUG_PROBE, ("Start with PROBE_IDENTIFY\n")); in mmcprobe_start()
618 CAM_DEBUG(start_ccb->ccb_h.path, CAM_DEBUG_PROBE, ("power off the card\n")); in mmcprobe_start()
620 cts->ios.power_mode = power_off; in mmcprobe_start()
621 cts->ios_valid = MMC_PM; in mmcprobe_start()
625 CAM_DEBUG(start_ccb->ccb_h.path, CAM_DEBUG_PROBE, ("get the host ocr\n")); in mmcprobe_start()
631 uint32_t host_caps = cts->host_caps; in mmcprobe_start()
633 softc->flags |= PROBE_FLAG_HOST_CAN_DO_18V; in mmcprobe_start()
634 uint32_t hv = mmc_highest_voltage(softc->host_ocr); in mmcprobe_start() local
635 CAM_DEBUG(start_ccb->ccb_h.path, CAM_DEBUG_PROBE, ("reseting the bus\n")); in mmcprobe_start()
637 cts->ios.vdd = hv; in mmcprobe_start()
638 cts->ios.bus_mode = opendrain; in mmcprobe_start()
639 cts->ios.chip_select = cs_dontcare; in mmcprobe_start()
640 cts->ios.power_mode = power_up; in mmcprobe_start()
641 cts->ios.bus_width = bus_width_1; in mmcprobe_start()
642 cts->ios.clock = 0; in mmcprobe_start()
643 cts->ios_valid = MMC_VDD | MMC_PM | MMC_BM | in mmcprobe_start()
649 CAM_DEBUG(start_ccb->ccb_h.path, CAM_DEBUG_PROBE, ("setting the ID freq\n")); in mmcprobe_start()
651 cts->ios.power_mode = power_on; in mmcprobe_start()
652 cts->ios.clock = CARD_ID_FREQUENCY; in mmcprobe_start()
653 cts->ios.timing = bus_timing_normal; in mmcprobe_start()
654 cts->ios_valid = MMC_PM | MMC_CLK | MMC_BT; in mmcprobe_start()
660 cts->ios.chip_select = cs_high; in mmcprobe_start()
661 cts->ios_valid = MMC_CS; in mmcprobe_start()
665 CAM_DEBUG(start_ccb->ccb_h.path, CAM_DEBUG_PROBE, ("Send first XPT_MMC_IO\n")); in mmcprobe_start()
667 mmcio->cmd.opcode = MMC_GO_IDLE_STATE; /* CMD 0 */ in mmcprobe_start()
668 mmcio->cmd.arg = 0; in mmcprobe_start()
669 mmcio->cmd.flags = MMC_RSP_NONE | MMC_CMD_BC; in mmcprobe_start()
670 mmcio->cmd.data = NULL; in mmcprobe_start()
671 mmcio->stop.opcode = 0; in mmcprobe_start()
677 CAM_DEBUG(start_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_start()
681 cam_fill_mmcio(&start_ccb->mmcio, in mmcprobe_start()
692 CAM_DEBUG(start_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_start()
695 mmcio->cmd.opcode = SD_SEND_IF_COND; /* CMD 8 */ in mmcprobe_start()
696 mmcio->cmd.arg = (1 << 8) + 0xAA; in mmcprobe_start()
697 mmcio->cmd.flags = MMC_RSP_R7 | MMC_CMD_BCR; in mmcprobe_start()
698 mmcio->stop.opcode = 0; in mmcprobe_start()
702 CAM_DEBUG(start_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_start()
705 mmcio->cmd.opcode = IO_SEND_OP_COND; /* CMD 5 */ in mmcprobe_start()
706 mmcio->cmd.arg = mmcp->io_ocr; in mmcprobe_start()
707 mmcio->cmd.flags = MMC_RSP_R4; in mmcprobe_start()
708 mmcio->stop.opcode = 0; in mmcprobe_start()
712 CAM_DEBUG(start_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_start()
715 mmcio->cmd.opcode = MMC_SEND_OP_COND; /* CMD 1 */ in mmcprobe_start()
716 mmcio->cmd.arg = MMC_OCR_CCS | mmcp->card_ocr; /* CCS + ocr */; in mmcprobe_start()
717 mmcio->cmd.flags = MMC_RSP_R3 | MMC_CMD_BCR; in mmcprobe_start()
718 mmcio->stop.opcode = 0; in mmcprobe_start()
723 if (softc->flags & PROBE_FLAG_ACMD_SENT) { in mmcprobe_start()
724 mmcio->cmd.opcode = ACMD_SD_SEND_OP_COND; /* CMD 41 */ in mmcprobe_start()
729 uint32_t cmd_arg = MMC_OCR_CCS | mmcp->card_ocr; /* CCS + ocr */ in mmcprobe_start()
730 if (softc->acmd41_count < 10 && mmcp->card_ocr != 0 ) in mmcprobe_start()
732 mmcio->cmd.arg = cmd_arg; in mmcprobe_start()
733 mmcio->cmd.flags = MMC_RSP_R3 | MMC_CMD_BCR; in mmcprobe_start()
734 softc->acmd41_count++; in mmcprobe_start()
736 mmcio->cmd.opcode = MMC_APP_CMD; /* CMD 55 */ in mmcprobe_start()
737 mmcio->cmd.arg = 0; /* rca << 16 */ in mmcprobe_start()
738 mmcio->cmd.flags = MMC_RSP_R1 | MMC_CMD_AC; in mmcprobe_start()
740 mmcio->stop.opcode = 0; in mmcprobe_start()
745 mmcio->cmd.opcode = MMC_ALL_SEND_CID; in mmcprobe_start()
746 mmcio->cmd.arg = 0; in mmcprobe_start()
747 mmcio->cmd.flags = MMC_RSP_R2 | MMC_CMD_BCR; in mmcprobe_start()
748 mmcio->stop.opcode = 0; in mmcprobe_start()
752 mmcio->cmd.opcode = SD_SEND_RELATIVE_ADDR; in mmcprobe_start()
753 mmcio->cmd.arg = 0; in mmcprobe_start()
754 mmcio->cmd.flags = MMC_RSP_R6 | MMC_CMD_BCR; in mmcprobe_start()
755 mmcio->stop.opcode = 0; in mmcprobe_start()
759 mmcio->cmd.opcode = MMC_SET_RELATIVE_ADDR; in mmcprobe_start()
760 mmcio->cmd.arg = MMC_PROPOSED_RCA << 16; in mmcprobe_start()
761 mmcio->cmd.flags = MMC_RSP_R1 | MMC_CMD_AC; in mmcprobe_start()
762 mmcio->stop.opcode = 0; in mmcprobe_start()
766 mmcio->cmd.opcode = MMC_SELECT_CARD; in mmcprobe_start()
767 mmcio->cmd.arg = (uint32_t)path->device->mmc_ident_data.card_rca << 16; in mmcprobe_start()
768 mmcio->cmd.flags = MMC_RSP_R1B | MMC_CMD_AC; in mmcprobe_start()
769 mmcio->stop.opcode = 0; in mmcprobe_start()
773 mmcio->cmd.opcode = MMC_SEND_CSD; in mmcprobe_start()
774 mmcio->cmd.arg = (uint32_t)path->device->mmc_ident_data.card_rca << 16; in mmcprobe_start()
775 mmcio->cmd.flags = MMC_RSP_R2 | MMC_CMD_BCR; in mmcprobe_start()
776 mmcio->stop.opcode = 0; in mmcprobe_start()
779 CAM_DEBUG(start_ccb->ccb_h.path, CAM_DEBUG_PROBE, ("Start with PROBE_DONE\n")); in mmcprobe_start()
781 cts->ios.bus_mode = pushpull; in mmcprobe_start()
782 cts->ios_valid = MMC_BM; in mmcprobe_start()
790 …CAM_DEBUG(start_ccb->ccb_h.path, CAM_DEBUG_PROBE, ("probestart: invalid action state 0x%x\n", soft… in mmcprobe_start()
794 start_ccb->ccb_h.flags |= CAM_DEV_QFREEZE; in mmcprobe_start()
800 free(periph->softc, M_CAMXPT); in mmcprobe_cleanup()
813 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, ("mmcprobe_done\n")); in mmcprobe_done()
814 softc = (mmcprobe_softc *)periph->softc; in mmcprobe_done()
815 path = done_ccb->ccb_h.path; in mmcprobe_done()
816 priority = done_ccb->ccb_h.pinfo.priority; in mmcprobe_done()
818 switch (softc->action) { in mmcprobe_done()
823 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, ("done with PROBE_RESET\n")); in mmcprobe_done()
829 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, ("done with PROBE_POWER_OFF\n")); in mmcprobe_done()
836 cts = &done_ccb->cts.proto_specific.mmc; in mmcprobe_done()
837 softc->host_ocr = cts->host_ocr; in mmcprobe_done()
838 …CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, ("done with PROBE_GET_HOST_OCR (Got OCR=%x\n", so… in mmcprobe_done()
844 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, ("done with PROBE_RESET_BUS\n")); in mmcprobe_done()
850 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, ("done with PROBE_SET_ID_FREQ\n")); in mmcprobe_done()
856 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, ("done with PROBE_SET_CS\n")); in mmcprobe_done()
862 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, ("done with PROBE_GO_IDLE_STATE\n")); in mmcprobe_done()
863 mmcio = &done_ccb->mmcio; in mmcprobe_done()
864 err = mmcio->cmd.error; in mmcprobe_done()
867 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_done()
872 if ((path->device->flags & CAM_DEV_UNCONFIGURED) == 0) { in mmcprobe_done()
873 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_done()
881 path->device->protocol = PROTO_MMCSD; in mmcprobe_done()
887 mmcio = &done_ccb->mmcio; in mmcprobe_done()
888 err = mmcio->cmd.error; in mmcprobe_done()
889 struct mmc_params *mmcp = &path->device->mmc_ident_data; in mmcprobe_done()
891 if (err != MMC_ERR_NONE || mmcio->cmd.resp[0] != 0x1AA) { in mmcprobe_done()
892 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_done()
894 err, mmcio->cmd.resp[0])); in mmcprobe_done()
896 mmcp->card_features |= CARD_FEATURE_SD20; in mmcprobe_done()
897 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_done()
905 mmcio = &done_ccb->mmcio; in mmcprobe_done()
906 err = mmcio->cmd.error; in mmcprobe_done()
908 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_done()
910 err, mmcio->cmd.resp[0])); in mmcprobe_done()
916 mmcio = &done_ccb->mmcio; in mmcprobe_done()
917 err = mmcio->cmd.error; in mmcprobe_done()
918 struct mmc_params *mmcp = &path->device->mmc_ident_data; in mmcprobe_done()
920 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_done()
922 err, mmcio->cmd.resp[0], in mmcprobe_done()
923 mmcio->cmd.resp[1], in mmcprobe_done()
924 mmcio->cmd.resp[2], in mmcprobe_done()
925 mmcio->cmd.resp[3])); in mmcprobe_done()
935 mmcp->card_features |= CARD_FEATURE_SDIO; in mmcprobe_done()
936 uint32_t ioifcond = mmcio->cmd.resp[0]; in mmcprobe_done()
939 mmcp->sdio_func_count = R4_IO_NUM_FUNCTIONS(ioifcond); in mmcprobe_done()
940 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_done()
941 ("SDIO card: %d functions\n", mmcp->sdio_func_count)); in mmcprobe_done()
943 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_done()
948 if (io_ocr != 0 && mmcp->io_ocr == 0) { in mmcprobe_done()
949 mmcp->io_ocr = io_ocr; in mmcprobe_done()
950 break; /* Retry, this time with non-0 OCR */ in mmcprobe_done()
952 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_done()
953 ("SDIO OCR: %08x\n", mmcp->io_ocr)); in mmcprobe_done()
956 /* Combo card -- proceed to memory initialization */ in mmcprobe_done()
959 /* No memory portion -- get RCA and select card */ in mmcprobe_done()
966 mmcio = &done_ccb->mmcio; in mmcprobe_done()
967 err = mmcio->cmd.error; in mmcprobe_done()
968 struct mmc_params *mmcp = &path->device->mmc_ident_data; in mmcprobe_done()
971 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_done()
973 err, mmcio->cmd.resp[0])); in mmcprobe_done()
977 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_done()
978 ("MMC card, OCR %08x\n", mmcio->cmd.resp[0])); in mmcprobe_done()
980 if (mmcp->card_ocr == 0) { in mmcprobe_done()
981 /* We haven't sent the OCR to the card yet -- do it */ in mmcprobe_done()
982 mmcp->card_ocr = mmcio->cmd.resp[0]; in mmcprobe_done()
983 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_done()
984 ("-> sending OCR to card\n")); in mmcprobe_done()
988 if (!(mmcio->cmd.resp[0] & MMC_OCR_CARD_BUSY)) { in mmcprobe_done()
989 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_done()
994 mmcp->card_features |= CARD_FEATURE_MMC | CARD_FEATURE_MEMORY; in mmcprobe_done()
1000 mmcio = &done_ccb->mmcio; in mmcprobe_done()
1001 err = mmcio->cmd.error; in mmcprobe_done()
1004 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_done()
1006 err, mmcio->cmd.resp[0])); in mmcprobe_done()
1011 if (!(softc->flags & PROBE_FLAG_ACMD_SENT)) { in mmcprobe_done()
1013 softc->flags |= PROBE_FLAG_ACMD_SENT; in mmcprobe_done()
1017 softc->flags &= ~PROBE_FLAG_ACMD_SENT; in mmcprobe_done()
1018 if ((mmcio->cmd.resp[0] & MMC_OCR_CARD_BUSY) || in mmcprobe_done()
1019 (mmcio->cmd.arg & MMC_OCR_VOLTAGE) == 0) { in mmcprobe_done()
1020 struct mmc_params *mmcp = &path->device->mmc_ident_data; in mmcprobe_done()
1021 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_done()
1022 ("Card OCR: %08x\n", mmcio->cmd.resp[0])); in mmcprobe_done()
1023 if (mmcp->card_ocr == 0) { in mmcprobe_done()
1024 mmcp->card_ocr = mmcio->cmd.resp[0]; in mmcprobe_done()
1025 /* Now when we know OCR that we want -- send it to card */ in mmcprobe_done()
1026 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_done()
1027 ("-> sending OCR to card\n")); in mmcprobe_done()
1030 * are processing the answer to ACMD41 -> move on in mmcprobe_done()
1035 mmcp->card_features |= CARD_FEATURE_MEMORY; in mmcprobe_done()
1038 if (mmcio->cmd.resp[0] & MMC_OCR_CCS) { in mmcprobe_done()
1039 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_done()
1041 mmcp->card_features |= CARD_FEATURE_SDHC; in mmcprobe_done()
1045 if (mmcio->cmd.resp[0] & MMC_OCR_S18A) { in mmcprobe_done()
1046 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_done()
1048 mmcp->card_features |= CARD_FEATURE_18V; in mmcprobe_done()
1049 if (softc->flags & PROBE_FLAG_HOST_CAN_DO_18V) { in mmcprobe_done()
1050 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_done()
1052 done_ccb->ccb_h.func_code = XPT_SET_TRAN_SETTINGS; in mmcprobe_done()
1053 done_ccb->ccb_h.flags = CAM_DIR_NONE; in mmcprobe_done()
1054 done_ccb->ccb_h.retry_count = 0; in mmcprobe_done()
1055 done_ccb->ccb_h.timeout = 100; in mmcprobe_done()
1056 done_ccb->ccb_h.cbfcnp = NULL; in mmcprobe_done()
1057 done_ccb->cts.proto_specific.mmc.ios.vccq = vccq_180; in mmcprobe_done()
1058 done_ccb->cts.proto_specific.mmc.ios_valid = MMC_VCCQ; in mmcprobe_done()
1063 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_done()
1064 ("Card not ready: %08x\n", mmcio->cmd.resp[0])); in mmcprobe_done()
1073 mmcio = &done_ccb->mmcio; in mmcprobe_done()
1074 err = mmcio->cmd.error; in mmcprobe_done()
1077 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_done()
1083 struct mmc_params *mmcp = &path->device->mmc_ident_data; in mmcprobe_done()
1084 memcpy(mmcp->card_cid, mmcio->cmd.resp, 4 * sizeof(uint32_t)); in mmcprobe_done()
1085 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_done()
1087 mmcp->card_cid[0], in mmcprobe_done()
1088 mmcp->card_cid[1], in mmcprobe_done()
1089 mmcp->card_cid[2], in mmcprobe_done()
1090 mmcp->card_cid[3])); in mmcprobe_done()
1091 if (mmcp->card_features & CARD_FEATURE_MMC) in mmcprobe_done()
1098 mmcio = &done_ccb->mmcio; in mmcprobe_done()
1099 err = mmcio->cmd.error; in mmcprobe_done()
1100 struct mmc_params *mmcp = &path->device->mmc_ident_data; in mmcprobe_done()
1101 uint16_t rca = mmcio->cmd.resp[0] >> 16; in mmcprobe_done()
1102 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_done()
1104 path->device->mmc_ident_data.card_rca = rca; in mmcprobe_done()
1106 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_done()
1113 if (mmcp->card_features & CARD_FEATURE_MEMORY) in mmcprobe_done()
1120 mmcio = &done_ccb->mmcio; in mmcprobe_done()
1121 err = mmcio->cmd.error; in mmcprobe_done()
1123 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_done()
1128 path->device->mmc_ident_data.card_rca = MMC_PROPOSED_RCA; in mmcprobe_done()
1132 mmcio = &done_ccb->mmcio; in mmcprobe_done()
1133 err = mmcio->cmd.error; in mmcprobe_done()
1136 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_done()
1142 struct mmc_params *mmcp = &path->device->mmc_ident_data; in mmcprobe_done()
1143 memcpy(mmcp->card_csd, mmcio->cmd.resp, 4 * sizeof(uint32_t)); in mmcprobe_done()
1144 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_done()
1146 mmcp->card_csd[0], in mmcprobe_done()
1147 mmcp->card_csd[1], in mmcprobe_done()
1148 mmcp->card_csd[2], in mmcprobe_done()
1149 mmcp->card_csd[3])); in mmcprobe_done()
1154 mmcio = &done_ccb->mmcio; in mmcprobe_done()
1155 err = mmcio->cmd.error; in mmcprobe_done()
1157 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_done()
1167 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_done()
1168 ("mmcprobe_done: invalid action state 0x%x\n", softc->action)); in mmcprobe_done()
1172 if (softc->action == PROBE_INVALID && in mmcprobe_done()
1173 (path->device->flags & CAM_DEV_UNCONFIGURED) == 0) { in mmcprobe_done()
1177 if (softc->action != PROBE_INVALID) in mmcprobe_done()
1181 CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE, in mmcprobe_done()
1184 if (softc->action == PROBE_DONE) { in mmcprobe_done()
1186 if (periph->path->device->flags & CAM_DEV_UNCONFIGURED) { in mmcprobe_done()
1187 path->device->flags &= ~CAM_DEV_UNCONFIGURED; in mmcprobe_done()
1188 xpt_acquire_device(path->device); in mmcprobe_done()
1189 done_ccb->ccb_h.func_code = XPT_GDEV_TYPE; in mmcprobe_done()
1195 if (softc->action == PROBE_DONE || softc->action == PROBE_INVALID) { in mmcprobe_done()
1206 cpi->version_num = 1; in mmc_path_inq()
1207 cpi->hba_inquiry = 0; in mmc_path_inq()
1208 cpi->target_sprt = 0; in mmc_path_inq()
1209 cpi->hba_misc = PIM_NOBUSRESET | PIM_SEQSCAN; in mmc_path_inq()
1210 cpi->hba_eng_cnt = 0; in mmc_path_inq()
1211 cpi->max_target = 0; in mmc_path_inq()
1212 cpi->max_lun = 0; in mmc_path_inq()
1213 cpi->initiator_id = 1; in mmc_path_inq()
1214 cpi->maxio = maxio; in mmc_path_inq()
1215 strlcpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN); in mmc_path_inq()
1216 strlcpy(cpi->hba_vid, hba, HBA_IDLEN); in mmc_path_inq()
1217 strlcpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN); in mmc_path_inq()
1218 cpi->unit_number = cam_sim_unit(sim); in mmc_path_inq()
1219 cpi->bus_id = cam_sim_bus(sim); in mmc_path_inq()
1220 cpi->protocol = PROTO_MMCSD; in mmc_path_inq()
1221 cpi->protocol_version = SCSI_REV_0; in mmc_path_inq()
1222 cpi->transport = XPORT_MMCSD; in mmc_path_inq()
1223 cpi->transport_version = 1; in mmc_path_inq()
1225 cpi->base_transfer_speed = 100; /* XXX WTF? */ in mmc_path_inq()
1227 cpi->ccb_h.status = CAM_REQ_CMP; in mmc_path_inq()