Lines Matching refs:sc
124 #define DPRINTF_UMASS(sc, m, fmt, ...) \ argument
128 (sc) ? (const char *)(sc)->sc_name : \
322 typedef void (umass_callback_t)(struct umass_softc *sc, union ccb *ccb,
330 typedef uint8_t (umass_transform_t)(struct umass_softc *sc, uint8_t *cmd_ptr,
463 struct umass_softc *sc; member
472 static void umass_dev_delete(struct umass_softc *sc, unsigned int dev_unit);
538 static int32_t umass_attach_dev(struct umass_softc *sc, unsigned int dev_unit);
539 static void umass_detach_dev_sub(struct umass_softc *sc, int dev_unit, int flag);
917 struct umass_softc *sc = in umass_attach() local
931 sc->sc_dev = dev; in umass_attach()
932 sc->sc_udev = uaa->device; in umass_attach()
933 sc->sc_proto = temp.proto; in umass_attach()
934 sc->sc_quirks = temp.quirks; in umass_attach()
935 sc->sc_unit = device_get_unit(dev); in umass_attach()
936 sc->data_ccb = NULL; in umass_attach()
937 sc->sc_detach_status = FALSE; in umass_attach()
938 sc->sc_super_disk = FALSE; in umass_attach()
944 (void)snprintf_s((char *)sc->sc_name, sizeof(sc->sc_name), sizeof(sc->sc_name) - 1, in umass_attach()
949 mtx_init(&sc->sc_mtx, device_get_nameunit(dev), in umass_attach()
951 mtx_init(&sc->sc_umass_mtx, device_get_nameunit(dev), in umass_attach()
954 (void)LOS_EventInit(&sc->sc_event); in umass_attach()
964 sc->sc_iface_no = id->bInterfaceNumber; in umass_attach()
968 switch (sc->sc_proto & UMASS_PROTO_COMMAND) { in umass_attach()
983 sc->sc_proto & UMASS_PROTO_COMMAND); in umass_attach()
989 switch (sc->sc_proto & UMASS_PROTO_WIRE) { in umass_attach()
1001 sc->sc_proto & UMASS_PROTO_WIRE); in umass_attach()
1004 PRINTK("; quirks = 0x%04x\n", sc->sc_quirks); in umass_attach()
1006 if (sc->sc_quirks & ALT_IFACE_1) { in umass_attach()
1011 DPRINTF_UMASS(sc, UDMASS_USB, "could not switch to " in umass_attach()
1018 if (sc->sc_proto & UMASS_PROTO_BBB) { in umass_attach()
1020 &uaa->info.bIfaceIndex, sc->sc_xfer, umass_bbb_config, in umass_attach()
1021 UMASS_T_BBB_MAX, sc, &sc->sc_mtx); in umass_attach()
1024 sc->sc_last_xfer_index = UMASS_T_BBB_COMMAND; in umass_attach()
1026 } else if (sc->sc_proto & (UMASS_PROTO_CBI | UMASS_PROTO_CBI_I)) { in umass_attach()
1028 &uaa->info.bIfaceIndex, sc->sc_xfer, umass_cbi_config, in umass_attach()
1029 UMASS_T_CBI_MAX, sc, &sc->sc_mtx); in umass_attach()
1032 sc->sc_last_xfer_index = UMASS_T_CBI_COMMAND; in umass_attach()
1056 if (sc->sc_xfer[x] != NULL) in umass_attach()
1057 usbd_xfer_set_interval(sc->sc_xfer[x], iv); in umass_attach()
1061 sc->sc_transform = in umass_attach()
1062 (sc->sc_proto & UMASS_PROTO_SCSI) ? &umass_scsi_transform : in umass_attach()
1063 (sc->sc_proto & UMASS_PROTO_UFI) ? &umass_ufi_transform : in umass_attach()
1064 (sc->sc_proto & UMASS_PROTO_ATAPI) ? &umass_atapi_transform : in umass_attach()
1065 (sc->sc_proto & UMASS_PROTO_RBC) ? &umass_rbc_transform : in umass_attach()
1070 if (sc->sc_quirks & SHUTTLE_INIT) { in umass_attach()
1071 umass_init_shuttle(sc); in umass_attach()
1075 if (((sc->sc_proto & UMASS_PROTO_WIRE) == UMASS_PROTO_BBB) && in umass_attach()
1076 !(sc->sc_quirks & NO_GETMAXLUN)) in umass_attach()
1077 sc->sc_maxlun = umass_bbb_get_max_lun(sc); in umass_attach()
1079 sc->sc_maxlun = 0; in umass_attach()
1082 sc->cam_scsi_sense.opcode = REQUEST_SENSE; in umass_attach()
1083 sc->cam_scsi_test_unit_ready.opcode = TEST_UNIT_READY; in umass_attach()
1086 sc->data_ccb = (union ccb *)malloc(sizeof(union ccb)); in umass_attach()
1087 if (sc->data_ccb == NULL) in umass_attach()
1089 …sc->data_ccb->csio.data_ptr = (uint8_t *)memalign(USB_CACHE_ALIGN_SIZE, SKB_DATA_ALIGN(SOFT_CACHE_… in umass_attach()
1090 if (sc->data_ccb->csio.data_ptr == NULL) in umass_attach()
1092 sc->data_ccb->csio.dxfer_len = SOFT_CACHE_SIZE; in umass_attach()
1094 DPRINTF_UMASS(sc, UDMASS_GEN, "Attach finished\n"); in umass_attach()
1097 if (umass_attach_dev(sc, device_get_unit(dev))) { in umass_attach()
1101 p_umsf = sc; in umass_attach()
1112 struct umass_softc *sc = (struct umass_softc *)device_get_softc(dev); in umass_detach() local
1115 DPRINTF_UMASS(sc, UDMASS_USB, "\n"); in umass_detach()
1117 sc->sc_detach_status = TRUE; in umass_detach()
1120 usbd_transfer_unsetup(sc->sc_xfer, UMASS_T_MAX); in umass_detach()
1122 mtx_lock(&sc->sc_mtx); in umass_detach()
1125 umass_cancel_ccb(sc); in umass_detach()
1127 mtx_lock(&sc->sc_umass_mtx); in umass_detach()
1128 if (sc->data_ccb != NULL) { in umass_detach()
1129 if (sc->data_ccb->csio.data_ptr != NULL) { in umass_detach()
1130 free((void*)sc->data_ccb->csio.data_ptr); in umass_detach()
1131 sc->data_ccb->csio.data_ptr = NULL; in umass_detach()
1133 free(sc->data_ccb); in umass_detach()
1134 sc->data_ccb = NULL; in umass_detach()
1136 mtx_unlock(&sc->sc_umass_mtx); in umass_detach()
1138 umass_detach_dev_sub(sc, dev_unit, 0); in umass_detach()
1143 mtx_unlock(&sc->sc_mtx); in umass_detach()
1144 sc->sc_detach_status = FALSE; in umass_detach()
1145 mtx_destroy(&sc->sc_mtx); in umass_detach()
1146 mtx_destroy(&sc->sc_umass_mtx); in umass_detach()
1153 umass_init_shuttle(struct umass_softc *sc) in umass_init_shuttle() argument
1166 req.wIndex[0] = sc->sc_iface_no; in umass_init_shuttle()
1169 err = usbd_do_request(sc->sc_udev, NULL, &req, &status); in umass_init_shuttle()
1171 DPRINTF_UMASS(sc, UDMASS_GEN, "request failed in %s %d, err=%d\n", in umass_init_shuttle()
1174 DPRINTF_UMASS(sc, UDMASS_GEN, "Shuttle init returned 0x%02x%02x\n", in umass_init_shuttle()
1183 umass_transfer_start(struct umass_softc *sc, uint8_t xfer_index) in umass_transfer_start() argument
1185 DPRINTF_UMASS(sc, UDMASS_GEN, "transfer index = " in umass_transfer_start()
1188 if (sc->sc_xfer[xfer_index]) { in umass_transfer_start()
1189 sc->sc_last_xfer_index = xfer_index; in umass_transfer_start()
1190 usbd_transfer_start(sc->sc_xfer[xfer_index]); in umass_transfer_start()
1192 umass_cancel_ccb(sc); in umass_transfer_start()
1197 umass_cancel_ccb(struct umass_softc *sc) in umass_cancel_ccb() argument
1201 mtx_assert(&sc->sc_mtx, MA_OWNED); in umass_cancel_ccb()
1203 umass_ccb = sc->sc_transfer.ccb; in umass_cancel_ccb()
1204 sc->sc_transfer.ccb = NULL; in umass_cancel_ccb()
1205 sc->sc_last_xfer_index = 0; in umass_cancel_ccb()
1208 (sc->sc_transfer.callback) in umass_cancel_ccb()
1209 (sc, umass_ccb, (sc->sc_transfer.data_len - in umass_cancel_ccb()
1210 sc->sc_transfer.actlen), STATUS_WIRE_FAILED); in umass_cancel_ccb()
1217 struct umass_softc *sc = (struct umass_softc *)usbd_xfer_softc(xfer); in umass_tr_error() local
1220 DPRINTF_UMASS(sc, UDMASS_GEN, "transfer error, %s -> " in umass_tr_error()
1223 umass_cancel_ccb(sc); in umass_tr_error()
1232 umass_scsi_inquiry_data(struct umass_softc *sc, void *data, int len) in umass_scsi_inquiry_data() argument
1266 DPRINTF_UMASS(sc, UDMASS_BBB, "SCSI: LUN-%d %s %s\n", sc->sc_transfer.lun, name, in umass_scsi_inquiry_data()
1281 struct umass_softc *sc = (struct umass_softc *)usbd_xfer_softc(xfer); in umass_t_bbb_reset1_callback() local
1287 umass_transfer_start(sc, UMASS_T_BBB_RESET2); in umass_t_bbb_reset1_callback()
1305 DPRINTF_UMASS(sc, UDMASS_BBB, "BBB reset!\n"); in umass_t_bbb_reset1_callback()
1310 req.wIndex[0] = sc->sc_iface_no; in umass_t_bbb_reset1_callback()
1346 struct umass_softc *sc = (struct umass_softc *)usbd_xfer_softc(xfer); in umass_t_bbb_data_clear_stall_callback() local
1351 umass_transfer_start(sc, next_xfer); in umass_t_bbb_data_clear_stall_callback()
1355 if (usbd_clear_stall_callback(xfer, sc->sc_xfer[stall_xfer])) { in umass_t_bbb_data_clear_stall_callback()
1369 struct umass_softc *sc = (struct umass_softc *)usbd_xfer_softc(xfer); in umass_t_bbb_command_callback() local
1377 (sc, ((sc->sc_transfer.dir == DIR_IN) ? UMASS_T_BBB_DATA_READ : in umass_t_bbb_command_callback()
1378 (sc->sc_transfer.dir == DIR_OUT) ? UMASS_T_BBB_DATA_WRITE : in umass_t_bbb_command_callback()
1384 sc->sc_status_try = 0; in umass_t_bbb_command_callback()
1390 tag = UGETDW(sc->cbw.dCBWTag) + 1; in umass_t_bbb_command_callback()
1392 USETDW(sc->cbw.dCBWSignature, CBWSIGNATURE); in umass_t_bbb_command_callback()
1393 USETDW(sc->cbw.dCBWTag, tag); in umass_t_bbb_command_callback()
1404 USETDW(sc->cbw.dCBWDataTransferLength, sc->sc_transfer.data_len); in umass_t_bbb_command_callback()
1415 sc->cbw.bCBWFlags = ((sc->sc_transfer.dir == DIR_IN) ? in umass_t_bbb_command_callback()
1417 sc->cbw.bCBWLUN = sc->sc_transfer.lun; in umass_t_bbb_command_callback()
1419 if (sc->sc_transfer.cmd_len > sizeof(sc->cbw.CBWCDB)) { in umass_t_bbb_command_callback()
1420 sc->sc_transfer.cmd_len = sizeof(sc->cbw.CBWCDB); in umass_t_bbb_command_callback()
1421 DPRINTF_UMASS(sc, UDMASS_BBB, "Truncating long command!\n"); in umass_t_bbb_command_callback()
1423 sc->cbw.bCDBLength = sc->sc_transfer.cmd_len; in umass_t_bbb_command_callback()
1426 ret = memcpy_s(sc->cbw.CBWCDB, CBWCDBLENGTH, in umass_t_bbb_command_callback()
1427 sc->sc_transfer.cmd_data, sc->sc_transfer.cmd_len); in umass_t_bbb_command_callback()
1429 DPRINTF_UMASS(sc, UDMASS_BBB, "memcpy_s fail, %d\n", ret); in umass_t_bbb_command_callback()
1434 (void)memset_s(sc->cbw.CBWCDB + sc->sc_transfer.cmd_len, in umass_t_bbb_command_callback()
1435 sizeof(sc->cbw.CBWCDB) - sc->sc_transfer.cmd_len, 0, in umass_t_bbb_command_callback()
1436 sizeof(sc->cbw.CBWCDB) - sc->sc_transfer.cmd_len); in umass_t_bbb_command_callback()
1438 DIF(UDMASS_BBB, umass_bbb_dump_cbw(sc, &sc->cbw)); in umass_t_bbb_command_callback()
1441 usbd_copy_in(pc, 0, &sc->cbw, sizeof(sc->cbw)); in umass_t_bbb_command_callback()
1442 usbd_xfer_set_frame_len(xfer, 0, sizeof(sc->cbw)); in umass_t_bbb_command_callback()
1458 struct umass_softc *sc = (struct umass_softc *)usbd_xfer_softc(xfer); in umass_t_bbb_data_callback() local
1466 sc->sc_transfer.data_rem -= actlen; in umass_t_bbb_data_callback()
1467 sc->sc_transfer.data_ptr += actlen; in umass_t_bbb_data_callback()
1468 sc->sc_transfer.actlen += actlen; in umass_t_bbb_data_callback()
1472 sc->sc_transfer.data_rem = 0; in umass_t_bbb_data_callback()
1475 DPRINTF_UMASS(sc, UDMASS_BBB, "max_bulk=%u, data_rem=%u\n", in umass_t_bbb_data_callback()
1476 max_bulk, sc->sc_transfer.data_rem); in umass_t_bbb_data_callback()
1478 if (sc->sc_transfer.data_rem == 0) { in umass_t_bbb_data_callback()
1479 umass_transfer_start(sc, UMASS_T_BBB_STATUS); in umass_t_bbb_data_callback()
1482 if (max_bulk > sc->sc_transfer.data_rem) { in umass_t_bbb_data_callback()
1483 max_bulk = sc->sc_transfer.data_rem; in umass_t_bbb_data_callback()
1485 usbd_xfer_set_timeout(xfer, sc->sc_transfer.data_timeout); in umass_t_bbb_data_callback()
1487 usbd_xfer_set_frame_data(xfer, 0, sc->sc_transfer.data_ptr, in umass_t_bbb_data_callback()
1497 umass_transfer_start(sc, xfer_index); in umass_t_bbb_data_callback()
1532 struct umass_softc *sc = (struct umass_softc *)usbd_xfer_softc(xfer); in umass_t_bbb_status_callback() local
1533 union ccb *umass_ccb = sc->sc_transfer.ccb; in umass_t_bbb_status_callback()
1546 sc->sc_status_try = 1; in umass_t_bbb_status_callback()
1550 if (actlen < (int)sizeof(sc->csw)) { in umass_t_bbb_status_callback()
1551 (void)memset_s(&sc->csw, sizeof(sc->csw), 0, sizeof(sc->csw)); in umass_t_bbb_status_callback()
1556 usbd_copy_out(pc, 0, &sc->csw, actlen); in umass_t_bbb_status_callback()
1558 DIF(UDMASS_BBB, umass_bbb_dump_csw(sc, &sc->csw)); in umass_t_bbb_status_callback()
1560 residue = UGETDW(sc->csw.dCSWDataResidue); in umass_t_bbb_status_callback()
1562 if ((!residue) || (sc->sc_quirks & IGNORE_RESIDUE)) { in umass_t_bbb_status_callback()
1563 residue = (sc->sc_transfer.data_len - in umass_t_bbb_status_callback()
1564 sc->sc_transfer.actlen); in umass_t_bbb_status_callback()
1566 if (residue > sc->sc_transfer.data_len) { in umass_t_bbb_status_callback()
1567 DPRINTF_UMASS(sc, UDMASS_BBB, "truncating residue from %d " in umass_t_bbb_status_callback()
1568 "to %d bytes\n", residue, sc->sc_transfer.data_len); in umass_t_bbb_status_callback()
1569 residue = sc->sc_transfer.data_len; in umass_t_bbb_status_callback()
1572 if (sc->sc_quirks & WRONG_CSWSIG) { in umass_t_bbb_status_callback()
1573 uint32_t temp = UGETDW(sc->csw.dCSWSignature); in umass_t_bbb_status_callback()
1577 USETDW(sc->csw.dCSWSignature, CSWSIGNATURE); in umass_t_bbb_status_callback()
1581 if (UGETDW(sc->csw.dCSWSignature) != CSWSIGNATURE) { in umass_t_bbb_status_callback()
1582 DPRINTF_UMASS(sc, UDMASS_BBB, "bad CSW signature 0x%08x != 0x%08x\n", in umass_t_bbb_status_callback()
1583 UGETDW(sc->csw.dCSWSignature), CSWSIGNATURE); in umass_t_bbb_status_callback()
1590 } else if (UGETDW(sc->csw.dCSWTag) != UGETDW(sc->cbw.dCBWTag)) { in umass_t_bbb_status_callback()
1591 DPRINTF_UMASS(sc, UDMASS_BBB, "Invalid CSW: tag 0x%08x should be " in umass_t_bbb_status_callback()
1592 "0x%08x\n", UGETDW(sc->csw.dCSWTag), in umass_t_bbb_status_callback()
1593 UGETDW(sc->cbw.dCBWTag)); in umass_t_bbb_status_callback()
1595 } else if (sc->csw.bCSWStatus > CSWSTATUS_PHASE) { in umass_t_bbb_status_callback()
1596 DPRINTF_UMASS(sc, UDMASS_BBB, "Invalid CSW: status %d > %d\n", in umass_t_bbb_status_callback()
1597 sc->csw.bCSWStatus, CSWSTATUS_PHASE); in umass_t_bbb_status_callback()
1599 } else if (sc->csw.bCSWStatus == CSWSTATUS_PHASE) { in umass_t_bbb_status_callback()
1600 DPRINTF_UMASS(sc, UDMASS_BBB, "Phase error, residue = " in umass_t_bbb_status_callback()
1603 } else if (sc->sc_transfer.actlen > sc->sc_transfer.data_len) { in umass_t_bbb_status_callback()
1604 DPRINTF_UMASS(sc, UDMASS_BBB, "Buffer overrun %d > %d\n", in umass_t_bbb_status_callback()
1605 sc->sc_transfer.actlen, sc->sc_transfer.data_len); in umass_t_bbb_status_callback()
1607 } else if (sc->csw.bCSWStatus == CSWSTATUS_FAILED) { in umass_t_bbb_status_callback()
1608 DPRINTF_UMASS(sc, UDMASS_BBB, "Command failed, residue = " in umass_t_bbb_status_callback()
1611 sc->sc_transfer.ccb = NULL; in umass_t_bbb_status_callback()
1613 sc->sc_last_xfer_index = UMASS_T_BBB_COMMAND; in umass_t_bbb_status_callback()
1615 (sc->sc_transfer.callback) in umass_t_bbb_status_callback()
1616 (sc, umass_ccb, residue, STATUS_CMD_FAILED); in umass_t_bbb_status_callback()
1618 sc->sc_transfer.ccb = NULL; in umass_t_bbb_status_callback()
1620 sc->sc_last_xfer_index = UMASS_T_BBB_COMMAND; in umass_t_bbb_status_callback()
1622 (sc->sc_transfer.callback) in umass_t_bbb_status_callback()
1623 (sc, umass_ccb, residue, STATUS_CMD_OK); in umass_t_bbb_status_callback()
1634 DPRINTF_UMASS(sc, UDMASS_BBB, "Failed to read CSW: %s, try %d\n", in umass_t_bbb_status_callback()
1635 usbd_errstr(error), sc->sc_status_try); in umass_t_bbb_status_callback()
1638 (sc->sc_status_try)) { in umass_t_bbb_status_callback()
1641 sc->sc_status_try = 1; in umass_t_bbb_status_callback()
1642 umass_transfer_start(sc, UMASS_T_BBB_DATA_RD_CS); in umass_t_bbb_status_callback()
1649 umass_command_start(struct umass_softc *sc, uint8_t dir, in umass_command_start() argument
1654 if (sc->sc_detach_status) in umass_command_start()
1666 sc->sc_transfer.dir = data_len ? dir : DIR_NONE; in umass_command_start()
1667 sc->sc_transfer.data_ptr = (uint8_t *)data_ptr; in umass_command_start()
1668 sc->sc_transfer.data_len = data_len; in umass_command_start()
1669 sc->sc_transfer.data_rem = data_len; in umass_command_start()
1670 sc->sc_transfer.data_timeout = (data_timeout + UMASS_TIMEOUT); in umass_command_start()
1672 sc->sc_transfer.actlen = 0; in umass_command_start()
1673 sc->sc_transfer.callback = callback; in umass_command_start()
1674 sc->sc_transfer.ccb = umass_ccb; in umass_command_start()
1676 if (sc->sc_xfer[sc->sc_last_xfer_index]) { in umass_command_start()
1677 usbd_transfer_start(sc->sc_xfer[sc->sc_last_xfer_index]); in umass_command_start()
1679 umass_cancel_ccb(sc); in umass_command_start()
1682 (void)LOS_EventRead(&sc->sc_event, 0xFF, in umass_command_start()
1689 umass_bbb_get_max_lun(struct umass_softc *sc) in umass_bbb_get_max_lun() argument
1699 req.wIndex[0] = sc->sc_iface_no; in umass_bbb_get_max_lun()
1703 err = usbd_do_request(sc->sc_udev, NULL, &req, &buf); in umass_bbb_get_max_lun()
1709 sc->sc_name, usbd_errstr(err)); in umass_bbb_get_max_lun()
1719 umass_cbi_start_status(struct umass_softc *sc) in umass_cbi_start_status() argument
1721 if (sc->sc_xfer[UMASS_T_CBI_STATUS]) { in umass_cbi_start_status()
1722 umass_transfer_start(sc, UMASS_T_CBI_STATUS); in umass_cbi_start_status()
1724 union ccb *umass_ccb = sc->sc_transfer.ccb; in umass_cbi_start_status()
1726 sc->sc_transfer.ccb = NULL; in umass_cbi_start_status()
1728 sc->sc_last_xfer_index = UMASS_T_CBI_COMMAND; in umass_cbi_start_status()
1730 (sc->sc_transfer.callback) in umass_cbi_start_status()
1731 (sc, umass_ccb, (sc->sc_transfer.data_len - in umass_cbi_start_status()
1732 sc->sc_transfer.actlen), STATUS_CMD_UNKNOWN); in umass_cbi_start_status()
1739 struct umass_softc *sc = (struct umass_softc *)usbd_xfer_softc(xfer); in umass_t_cbi_reset1_callback() local
1748 umass_transfer_start(sc, UMASS_T_CBI_RESET2); in umass_t_cbi_reset1_callback()
1765 DPRINTF_UMASS(sc, UDMASS_CBI, "CBI reset!\n"); in umass_t_cbi_reset1_callback()
1770 req.wIndex[0] = sc->sc_iface_no; in umass_t_cbi_reset1_callback()
1802 umass_transfer_start(sc, UMASS_T_CBI_RESET2); in umass_t_cbi_reset1_callback()
1817 struct umass_softc *sc = (struct umass_softc *)usbd_xfer_softc(xfer); in umass_t_cbi_reset3_callback() local
1820 (xfer, (sc->sc_xfer[UMASS_T_CBI_RESET4] && in umass_t_cbi_reset3_callback()
1821 sc->sc_xfer[UMASS_T_CBI_STATUS]) ? in umass_t_cbi_reset3_callback()
1837 struct umass_softc *sc = (struct umass_softc *)usbd_xfer_softc(xfer); in umass_t_cbi_data_clear_stall_callback() local
1843 umass_cbi_start_status(sc); in umass_t_cbi_data_clear_stall_callback()
1845 umass_transfer_start(sc, next_xfer); in umass_t_cbi_data_clear_stall_callback()
1850 if (usbd_clear_stall_callback(xfer, sc->sc_xfer[stall_xfer])) { in umass_t_cbi_data_clear_stall_callback()
1864 struct umass_softc *sc = (struct umass_softc *)usbd_xfer_softc(xfer); in umass_t_cbi_command_callback() local
1865 union ccb *umass_ccb = sc->sc_transfer.ccb; in umass_t_cbi_command_callback()
1872 if (sc->sc_transfer.dir == DIR_NONE) { in umass_t_cbi_command_callback()
1873 umass_cbi_start_status(sc); in umass_t_cbi_command_callback()
1876 (sc, (sc->sc_transfer.dir == DIR_IN) ? in umass_t_cbi_command_callback()
1894 req.wIndex[0] = sc->sc_iface_no; in umass_t_cbi_command_callback()
1896 req.wLength[0] = sc->sc_transfer.cmd_len; in umass_t_cbi_command_callback()
1902 usbd_copy_in(pc, 0, sc->sc_transfer.cmd_data, in umass_t_cbi_command_callback()
1903 sc->sc_transfer.cmd_len); in umass_t_cbi_command_callback()
1906 usbd_xfer_set_frame_len(xfer, 1, sc->sc_transfer.cmd_len); in umass_t_cbi_command_callback()
1908 sc->sc_transfer.cmd_len ? 2 : 1); in umass_t_cbi_command_callback()
1911 umass_cbi_dump_cmd(sc, in umass_t_cbi_command_callback()
1912 sc->sc_transfer.cmd_data, in umass_t_cbi_command_callback()
1913 sc->sc_transfer.cmd_len)); in umass_t_cbi_command_callback()
1927 (sc->sc_transfer.callback == &umass_cam_cb)) { in umass_t_cbi_command_callback()
1928 sc->sc_transfer.ccb = NULL; in umass_t_cbi_command_callback()
1929 (sc->sc_transfer.callback) in umass_t_cbi_command_callback()
1930 (sc, umass_ccb, sc->sc_transfer.data_len, in umass_t_cbi_command_callback()
1935 sc->sc_last_xfer_index = UMASS_T_CBI_COMMAND; in umass_t_cbi_command_callback()
1944 struct umass_softc *sc = (struct umass_softc *)usbd_xfer_softc(xfer); in umass_t_cbi_data_read_callback() local
1952 sc->sc_transfer.data_rem -= actlen; in umass_t_cbi_data_read_callback()
1953 sc->sc_transfer.data_ptr += actlen; in umass_t_cbi_data_read_callback()
1954 sc->sc_transfer.actlen += actlen; in umass_t_cbi_data_read_callback()
1958 sc->sc_transfer.data_rem = 0; in umass_t_cbi_data_read_callback()
1961 DPRINTF_UMASS(sc, UDMASS_CBI, "max_bulk=%d, data_rem=%d\n", in umass_t_cbi_data_read_callback()
1962 max_bulk, sc->sc_transfer.data_rem); in umass_t_cbi_data_read_callback()
1964 if (sc->sc_transfer.data_rem == 0) { in umass_t_cbi_data_read_callback()
1965 umass_cbi_start_status(sc); in umass_t_cbi_data_read_callback()
1968 if (max_bulk > sc->sc_transfer.data_rem) { in umass_t_cbi_data_read_callback()
1969 max_bulk = sc->sc_transfer.data_rem; in umass_t_cbi_data_read_callback()
1971 usbd_xfer_set_timeout(xfer, sc->sc_transfer.data_timeout); in umass_t_cbi_data_read_callback()
1973 usbd_xfer_set_frame_data(xfer, 0, sc->sc_transfer.data_ptr, in umass_t_cbi_data_read_callback()
1981 (sc->sc_transfer.callback != &umass_cam_cb)) { in umass_t_cbi_data_read_callback()
1984 umass_transfer_start(sc, UMASS_T_CBI_DATA_RD_CS); in umass_t_cbi_data_read_callback()
2000 struct umass_softc *sc = (struct umass_softc *)usbd_xfer_softc(xfer); in umass_t_cbi_data_write_callback() local
2008 sc->sc_transfer.data_rem -= actlen; in umass_t_cbi_data_write_callback()
2009 sc->sc_transfer.data_ptr += actlen; in umass_t_cbi_data_write_callback()
2010 sc->sc_transfer.actlen += actlen; in umass_t_cbi_data_write_callback()
2014 sc->sc_transfer.data_rem = 0; in umass_t_cbi_data_write_callback()
2017 DPRINTF_UMASS(sc, UDMASS_CBI, "max_bulk=%d, data_rem=%d\n", in umass_t_cbi_data_write_callback()
2018 max_bulk, sc->sc_transfer.data_rem); in umass_t_cbi_data_write_callback()
2020 if (sc->sc_transfer.data_rem == 0) { in umass_t_cbi_data_write_callback()
2021 umass_cbi_start_status(sc); in umass_t_cbi_data_write_callback()
2024 if (max_bulk > sc->sc_transfer.data_rem) { in umass_t_cbi_data_write_callback()
2025 max_bulk = sc->sc_transfer.data_rem; in umass_t_cbi_data_write_callback()
2027 usbd_xfer_set_timeout(xfer, sc->sc_transfer.data_timeout); in umass_t_cbi_data_write_callback()
2029 usbd_xfer_set_frame_data(xfer, 0, sc->sc_transfer.data_ptr, in umass_t_cbi_data_write_callback()
2037 (sc->sc_transfer.callback != &umass_cam_cb)) { in umass_t_cbi_data_write_callback()
2040 umass_transfer_start(sc, UMASS_T_CBI_DATA_WR_CS); in umass_t_cbi_data_write_callback()
2056 struct umass_softc *sc = (struct umass_softc *)usbd_xfer_softc(xfer); in umass_t_cbi_status_callback() local
2057 union ccb *umass_ccb = sc->sc_transfer.ccb; in umass_t_cbi_status_callback()
2068 if (actlen < (int)sizeof(sc->sbl)) { in umass_t_cbi_status_callback()
2072 usbd_copy_out(pc, 0, &sc->sbl, sizeof(sc->sbl)); in umass_t_cbi_status_callback()
2074 residue = (sc->sc_transfer.data_len - in umass_t_cbi_status_callback()
2075 sc->sc_transfer.actlen); in umass_t_cbi_status_callback()
2079 if (sc->sc_proto & UMASS_PROTO_UFI) { in umass_t_cbi_status_callback()
2086 DPRINTF_UMASS(sc, UDMASS_CBI, "UFI CCI, ASC = 0x%02x, " in umass_t_cbi_status_callback()
2087 "ASCQ = 0x%02x\n", sc->sbl.ufi.asc, in umass_t_cbi_status_callback()
2088 sc->sbl.ufi.ascq); in umass_t_cbi_status_callback()
2090 status = (((sc->sbl.ufi.asc == 0) && in umass_t_cbi_status_callback()
2091 (sc->sbl.ufi.ascq == 0)) ? in umass_t_cbi_status_callback()
2094 sc->sc_transfer.ccb = NULL; in umass_t_cbi_status_callback()
2096 sc->sc_last_xfer_index = UMASS_T_CBI_COMMAND; in umass_t_cbi_status_callback()
2098 (sc->sc_transfer.callback) in umass_t_cbi_status_callback()
2099 (sc, umass_ccb, residue, status); in umass_t_cbi_status_callback()
2106 DPRINTF_UMASS(sc, UDMASS_CBI, "type=0x%02x, value=0x%02x\n", in umass_t_cbi_status_callback()
2107 sc->sbl.common.type, sc->sbl.common.value); in umass_t_cbi_status_callback()
2109 if (sc->sbl.common.type == IDB_TYPE_CCI) { in umass_t_cbi_status_callback()
2110 status = (sc->sbl.common.value & IDB_VALUE_STATUS_MASK); in umass_t_cbi_status_callback()
2117 sc->sc_transfer.ccb = NULL; in umass_t_cbi_status_callback()
2119 sc->sc_last_xfer_index = UMASS_T_CBI_COMMAND; in umass_t_cbi_status_callback()
2121 (sc->sc_transfer.callback) in umass_t_cbi_status_callback()
2122 (sc, umass_ccb, residue, status); in umass_t_cbi_status_callback()
2137 DPRINTF_UMASS(sc, UDMASS_CBI, "Failed to read CSW: %s\n", in umass_t_cbi_status_callback()
2149 umass_cam_cb(struct umass_softc *sc, union ccb *umass_ccb, uint32_t residue, in umass_cam_cb() argument
2157 (void)LOS_EventWrite(&sc->sc_event, 0x01); in umass_cam_cb()
2163 (void)LOS_EventWrite(&sc->sc_event, 0x02); in umass_cam_cb()
2167 (void)LOS_EventWrite(&sc->sc_event, 0x04); in umass_cam_cb()
2177 umass_scsi_transform(struct umass_softc *sc, uint8_t *cmd_ptr, in umass_scsi_transform() argument
2183 (cmd_len > sizeof(sc->sc_transfer.cmd_data))) { in umass_scsi_transform()
2184 DPRINTF_UMASS(sc, UDMASS_SCSI, "Invalid command " in umass_scsi_transform()
2188 sc->sc_transfer.cmd_len = cmd_len; in umass_scsi_transform()
2192 if (sc->sc_quirks & NO_TEST_UNIT_READY) { in umass_scsi_transform()
2193 DPRINTF_UMASS(sc, UDMASS_SCSI, "Converted TEST_UNIT_READY " in umass_scsi_transform()
2195 ret = memset_s(sc->sc_transfer.cmd_data, sizeof(sc->sc_transfer.cmd_data), 0, cmd_len); in umass_scsi_transform()
2200 sc->sc_transfer.cmd_data[0] = START_STOP_UNIT; in umass_scsi_transform()
2201 sc->sc_transfer.cmd_data[4] = SSS_START; in umass_scsi_transform()
2211 if (sc->sc_quirks & FORCE_SHORT_INQUIRY) { in umass_scsi_transform()
2212 ret = memcpy_s(sc->sc_transfer.cmd_data, UMASS_MAX_CMDLEN, cmd_ptr, cmd_len); in umass_scsi_transform()
2217 sc->sc_transfer.cmd_data[4] = SHORT_INQUIRY_LENGTH; in umass_scsi_transform()
2223 ret = memcpy_s(sc->sc_transfer.cmd_data, UMASS_MAX_CMDLEN, cmd_ptr, cmd_len); in umass_scsi_transform()
2233 umass_rbc_transform(struct umass_softc *sc, uint8_t *cmd_ptr, uint8_t cmd_len) in umass_rbc_transform() argument
2238 (cmd_len > sizeof(sc->sc_transfer.cmd_data))) { in umass_rbc_transform()
2239 DPRINTF_UMASS(sc, UDMASS_SCSI, "Invalid command " in umass_rbc_transform()
2264 ret = memcpy_s(sc->sc_transfer.cmd_data, UMASS_MAX_CMDLEN, cmd_ptr, cmd_len); in umass_rbc_transform()
2270 if ((sc->sc_quirks & RBC_PAD_TO_12) && (cmd_len < 12)) { in umass_rbc_transform()
2271 ret = memset_s(sc->sc_transfer.cmd_data + cmd_len, in umass_rbc_transform()
2279 sc->sc_transfer.cmd_len = cmd_len; in umass_rbc_transform()
2284 DPRINTF_UMASS(sc, UDMASS_SCSI, "Unsupported RBC " in umass_rbc_transform()
2291 umass_ufi_transform(struct umass_softc *sc, uint8_t *cmd_ptr, in umass_ufi_transform() argument
2297 (cmd_len > sizeof(sc->sc_transfer.cmd_data))) { in umass_ufi_transform()
2298 DPRINTF_UMASS(sc, UDMASS_SCSI, "Invalid command " in umass_ufi_transform()
2303 sc->sc_transfer.cmd_len = UFI_COMMAND_LENGTH; in umass_ufi_transform()
2306 ret = memset_s(sc->sc_transfer.cmd_data, UMASS_MAX_CMDLEN, 0, UFI_COMMAND_LENGTH); in umass_ufi_transform()
2319 if (sc->sc_quirks & NO_TEST_UNIT_READY) { in umass_ufi_transform()
2324 DPRINTF_UMASS(sc, UDMASS_UFI, "Converted TEST_UNIT_READY " in umass_ufi_transform()
2327 sc->sc_transfer.cmd_data[0] = START_STOP_UNIT; in umass_ufi_transform()
2328 sc->sc_transfer.cmd_data[4] = SSS_START; in umass_ufi_transform()
2362 DPRINTF_UMASS(sc, UDMASS_SCSI, "Unsupported UFI " in umass_ufi_transform()
2367 ret = memcpy_s(sc->sc_transfer.cmd_data, UMASS_MAX_CMDLEN, cmd_ptr, cmd_len); in umass_ufi_transform()
2380 umass_atapi_transform(struct umass_softc *sc, uint8_t *cmd_ptr, in umass_atapi_transform() argument
2386 (cmd_len > sizeof(sc->sc_transfer.cmd_data))) { in umass_atapi_transform()
2387 DPRINTF_UMASS(sc, UDMASS_SCSI, "Invalid command " in umass_atapi_transform()
2392 sc->sc_transfer.cmd_len = ATAPI_COMMAND_LENGTH; in umass_atapi_transform()
2395 ret = memset_s(sc->sc_transfer.cmd_data, UMASS_MAX_CMDLEN, 0, ATAPI_COMMAND_LENGTH); in umass_atapi_transform()
2412 if (sc->sc_quirks & FORCE_SHORT_INQUIRY) { in umass_atapi_transform()
2413 ret = memcpy_s(sc->sc_transfer.cmd_data, UMASS_MAX_CMDLEN, cmd_ptr, cmd_len); in umass_atapi_transform()
2418 sc->sc_transfer.cmd_data[4] = SHORT_INQUIRY_LENGTH; in umass_atapi_transform()
2424 if (sc->sc_quirks & NO_TEST_UNIT_READY) { in umass_atapi_transform()
2425 DPRINTF_UMASS(sc, UDMASS_SCSI, "Converted TEST_UNIT_READY " in umass_atapi_transform()
2427 sc->sc_transfer.cmd_data[0] = START_STOP_UNIT; in umass_atapi_transform()
2428 sc->sc_transfer.cmd_data[4] = SSS_START; in umass_atapi_transform()
2471 DPRINTF_UMASS(sc, UDMASS_SCSI, "Unsupported ATAPI " in umass_atapi_transform()
2477 ret = memcpy_s(sc->sc_transfer.cmd_data, UMASS_MAX_CMDLEN, cmd_ptr, cmd_len); in umass_atapi_transform()
2487 umass_no_transform(struct umass_softc *sc, uint8_t *cmd, in umass_no_transform() argument
2495 umass_bbb_dump_cbw(struct umass_softc *sc, umass_bbb_cbw_t *cbw) in umass_bbb_dump_cbw() argument
2506 DPRINTF_UMASS(sc, UDMASS_BBB, "CBW %d: cmd = %db " in umass_bbb_dump_cbw()
2516 umass_bbb_dump_csw(struct umass_softc *sc, umass_bbb_csw_t *csw) in umass_bbb_dump_csw() argument
2523 DPRINTF_UMASS(sc, UDMASS_BBB, "CSW %d: sig = 0x%08x (%s), tag = 0x%08x, " in umass_bbb_dump_csw()
2533 umass_cbi_dump_cmd(struct umass_softc *sc, void *cmd, uint8_t cmdlen) in umass_cbi_dump_cmd() argument
2536 uint8_t dir = sc->sc_transfer.dir; in umass_cbi_dump_cmd()
2538 DPRINTF_UMASS(sc, UDMASS_BBB, "cmd = %db " in umass_cbi_dump_cmd()
2543 sc->sc_transfer.data_len, in umass_cbi_dump_cmd()
2688 umass_test_unit_ready(struct umass_softc *sc) in umass_test_unit_ready() argument
2693 if((sc == NULL) || (sc->data_ccb == NULL)) { in umass_test_unit_ready()
2697 (void)umass_scsi_transform(sc, scsi_test_unit_ready, SCSICMD_TESTUNITREADY8_SIZEOF); in umass_test_unit_ready()
2698 res = umass_command_start(sc, DIR_NONE, NULL, 0, 1000, umass_cam_cb, sc->data_ccb); in umass_test_unit_ready()
2703 status = sc->data_ccb->csio.status; in umass_test_unit_ready()
2712 umass_read_capacity_16(struct umass_softc *sc) in umass_read_capacity_16() argument
2718 (void)umass_scsi_transform(sc, scsi_read_capacity_16, SCSICMD_READCAPACITY16_SIZEOF); in umass_read_capacity_16()
2719 res = (uint32_t)umass_command_start(sc, DIR_IN, sc->data_ccb->csio.data_ptr, in umass_read_capacity_16()
2721 (uint32_t)1000, umass_cam_cb, sc->data_ccb); in umass_read_capacity_16()
2726 ret = memcpy_s((void *)&resp, sizeof(resp), sc->data_ccb->csio.data_ptr, in umass_read_capacity_16()
2733 sc->info.sectornum= usbhost_getbe64(resp.lba) + 1; in umass_read_capacity_16()
2734 sc->info.sectorsize= usbhost_getbe32(resp.blklen); in umass_read_capacity_16()
2740 umass_read_capacity(struct umass_softc *sc) in umass_read_capacity() argument
2745 if ((sc == NULL) || (sc->data_ccb == NULL)) { in umass_read_capacity()
2749 (void)umass_scsi_transform(sc, scsi_read_capacity, SCSICMD_READCAPACITY10_SIZEOF); in umass_read_capacity()
2750 ret = umass_command_start(sc, DIR_IN, sc->data_ccb->csio.data_ptr, in umass_read_capacity()
2752 1000, umass_cam_cb, sc->data_ccb); in umass_read_capacity()
2757 ret = memcpy_s((void *)&resp, sizeof(resp), sc->data_ccb->csio.data_ptr, in umass_read_capacity()
2766 ret = umass_read_capacity_16(sc); in umass_read_capacity()
2771 sc->sc_super_disk = TRUE; in umass_read_capacity()
2776 sc->info.sectornum= usbhost_getbe32(resp.lba) + 1; in umass_read_capacity()
2777 sc->info.sectorsize= usbhost_getbe32(resp.blklen); in umass_read_capacity()
2778 sc->sc_super_disk = FALSE; in umass_read_capacity()
2784 umass_read10(struct umass_softc *sc, size_t startsector, uint16_t blocksize, in umass_read10() argument
2793 if ((sc == NULL) || (sc->data_ccb == NULL)) { in umass_read10()
2797 if ((sc->info.sectornum < (startsector + nsectors)) || (sc->info.sectorsize < blocksize)) in umass_read10()
2812 (void)umass_scsi_transform(sc, (uint8_t *)&cdb, SCSICMD_READ10_SIZEOF); in umass_read10()
2813 ret = umass_command_start(sc, DIR_IN, (void *)data_buf, blocksize * nsectors, 0, in umass_read10()
2814 umass_cam_cb, sc->data_ccb); in umass_read10()
2822 if (!LOS_IsUserAddressRange((vaddr_t)buf, blocksize * nsectors - sc->data_ccb->csio.resid)) { in umass_read10()
2823 …ret = memcpy_s(buf, nsectors * blocksize, data_buf, blocksize * nsectors - sc->data_ccb->csio.resi… in umass_read10()
2825 ret = ((nsectors * blocksize >= blocksize * nsectors - sc->data_ccb->csio.resid) ? in umass_read10()
2826 …LOS_ArchCopyToUser(buf, data_buf, blocksize * nsectors - sc->data_ccb->csio.resid) : ERANGE_AND_RE… in umass_read10()
2834 status = sc->data_ccb->csio.status; in umass_read10()
2843 umass_read16(struct umass_softc *sc, uint64_t startsector, uint16_t blocksize, in umass_read16() argument
2853 if ((sc == NULL) || (sc->data_ccb == NULL)) { in umass_read16()
2857 if ((sc->info.sectornum < (startsector + nsectors)) || (sc->info.sectorsize < blocksize)) in umass_read16()
2871 (void)umass_scsi_transform(sc, (uint8_t *)&cdb, SCSICMD_READ16_SIZEOF); in umass_read16()
2872 res = umass_command_start(sc, DIR_IN, (void *)data_buf, blocksize * nsectors, 0, in umass_read16()
2873 umass_cam_cb, sc->data_ccb); in umass_read16()
2881 if (!LOS_IsUserAddressRange((vaddr_t)buf, blocksize * nsectors - sc->data_ccb->csio.resid)) { in umass_read16()
2882 …ret = memcpy_s(buf, nsectors * blocksize, data_buf, blocksize * nsectors - sc->data_ccb->csio.resi… in umass_read16()
2884 ret = ((nsectors * blocksize >= blocksize * nsectors - sc->data_ccb->csio.resid) ? in umass_read16()
2885 …LOS_ArchCopyToUser(buf, data_buf, blocksize * nsectors - sc->data_ccb->csio.resid) : ERANGE_AND_RE… in umass_read16()
2893 status = sc->data_ccb->csio.status; in umass_read16()
2902 umass_write10(struct umass_softc *sc, size_t startsector, uint16_t blocksize, in umass_write10() argument
2911 if((sc == NULL) || (sc->data_ccb == NULL)) { in umass_write10()
2915 if ((sc->info.sectornum < (startsector + nsectors)) || (sc->info.sectorsize < blocksize)) in umass_write10()
2940 (void)umass_scsi_transform(sc, (uint8_t *)&cdb, SCSICMD_WRITE10_SIZEOF); in umass_write10()
2941 ret = umass_command_start(sc, DIR_OUT, (void *)data_buf, blocksize * nsectors, 1000, in umass_write10()
2942 umass_cam_cb, sc->data_ccb); in umass_write10()
2948 status = sc->data_ccb->csio.status; in umass_write10()
2957 umass_write16(struct umass_softc *sc, uint64_t startsector, uint16_t blocksize, in umass_write16() argument
2967 if((sc == NULL) || (sc->data_ccb == NULL)) { in umass_write16()
2971 if ((sc->info.sectornum < (startsector + nsectors)) || (sc->info.sectorsize < blocksize)) { in umass_write16()
2998 (void)umass_scsi_transform(sc, (uint8_t *)&cdb, SCSICMD_WRITE16_SIZEOF); in umass_write16()
2999 res = umass_command_start(sc, DIR_OUT, (void *)data_buf, blocksize * nsectors, 1000, in umass_write16()
3000 umass_cam_cb, sc->data_ccb); in umass_write16()
3007 status = sc->data_ccb->csio.status; in umass_write16()
3016 umass_inquiry(struct umass_softc *sc) in umass_inquiry() argument
3021 if ((sc == NULL) || (sc->data_ccb == NULL)) { in umass_inquiry()
3025 (void)umass_scsi_transform(sc, scsi_inquiry, SCSICMD_INQUIRY_SIZEOF); in umass_inquiry()
3026 ret = umass_command_start(sc, DIR_IN, sc->data_ccb->csio.data_ptr, SCSIRESP_INQUIRY_SIZEOF, in umass_inquiry()
3027 1000, umass_cam_cb, sc->data_ccb); in umass_inquiry()
3032 status = sc->data_ccb->csio.status; in umass_inquiry()
3038 ret = umass_scsi_inquiry_data(sc, sc->data_ccb->csio.data_ptr, SCSIRESP_INQUIRY_SIZEOF); in umass_inquiry()
3052 umass_request_sense(struct umass_softc *sc) in umass_request_sense() argument
3056 if ((sc == NULL) || (sc->data_ccb == NULL)) { in umass_request_sense()
3060 (void)umass_scsi_transform(sc, scsi_request_sense, SCSICMD_REQUESTSENSE_SIZEOF); in umass_request_sense()
3061 ret = umass_command_start(sc, DIR_IN, sc->data_ccb->csio.data_ptr, SCSIRESP_FIXEDSENSEDATA_SIZEOF, in umass_request_sense()
3062 1000, umass_cam_cb, sc->data_ccb); in umass_request_sense()
3067 status = sc->data_ccb->csio.status; in umass_request_sense()
3084 struct umass_softc *sc = p_umsf; in umass_status() local
3095 if (sc == NULL) { in umass_status()
3099 cmd = sc->sc_transfer.cmd_data[0]; in umass_status()
3100 lun = sc->sc_transfer.lun; in umass_status()
3101 max = sc->sc_maxlun + 1; in umass_status()
3102 speed = sc->sc_udev->speed; in umass_status()
3103 phase = sc->sc_last_xfer_index; in umass_status()
3104 state = USB_GET_STATE(sc->sc_xfer[phase]); in umass_status()
3105 vid = UGETW(sc->sc_udev->ddesc.idVendor); in umass_status()
3106 pid = UGETW(sc->sc_udev->ddesc.idProduct); in umass_status()
3107 tag = UGETDW(sc->cbw.dCBWTag); in umass_status()
3108 residuce = UGETDW(sc->csw.dCSWDataResidue); in umass_status()
3111 if (sc->sc_transfer.ccb) { in umass_status()
3174 struct umass_softc *sc = (struct umass_softc *)((struct drv_data*)umass_inode->data)->priv; in umass_read() local
3176 mtx_lock(&sc->sc_umass_mtx); in umass_read()
3177 if (sc->sc_super_disk == TRUE) { in umass_read()
3178 status = umass_read16(sc, start_sector, (uint16_t)sc->info.sectorsize, nsectors, buffer); in umass_read()
3180 status = umass_read10(sc, (size_t)start_sector, (uint16_t)sc->info.sectorsize, nsectors, buffer); in umass_read()
3182 mtx_unlock(&sc->sc_umass_mtx); in umass_read()
3195 struct umass_softc *sc = (struct umass_softc *)((struct drv_data*)umass_inode->data)->priv; in umass_write() local
3197 mtx_lock(&sc->sc_umass_mtx); in umass_write()
3198 if (sc->sc_super_disk == TRUE) { in umass_write()
3199 status = umass_write16(sc, start_sector, (uint16_t)sc->info.sectorsize, nsectors, buffer); in umass_write()
3201 status = umass_write10(sc, (size_t)start_sector, (uint16_t)sc->info.sectorsize, nsectors, buffer); in umass_write()
3203 mtx_unlock(&sc->sc_umass_mtx); in umass_write()
3214 struct umass_softc *sc; in umass_geometry() local
3219 sc = (struct umass_softc *)(struct umass_softc *)((struct drv_data*)umass_inode->data)->priv; in umass_geometry()
3221 if (sc == NULL) in umass_geometry()
3224 mtx_lock(&sc->sc_umass_mtx); in umass_geometry()
3228 ugeometry->geo_nsectors = sc->info.sectornum; in umass_geometry()
3229 ugeometry->geo_sectorsize = sc->info.sectorsize; in umass_geometry()
3230 mtx_unlock(&sc->sc_umass_mtx); in umass_geometry()
3255 umass_dev_is_ready(struct umass_softc *sc) in umass_dev_is_ready() argument
3261 mtx_lock(&sc->sc_umass_mtx); in umass_dev_is_ready()
3262 for (lun = 0; lun <= sc->sc_maxlun; lun++) { in umass_dev_is_ready()
3263 sc->sc_transfer.lun = lun; in umass_dev_is_ready()
3264 if (umass_inquiry(sc) < 0) in umass_dev_is_ready()
3268 ret = umass_test_unit_ready(sc); in umass_dev_is_ready()
3270 sc->sc_transfer.lun = valid_lun; in umass_dev_is_ready()
3271 ret = umass_read_capacity(sc); in umass_dev_is_ready()
3273 mtx_unlock(&sc->sc_umass_mtx); in umass_dev_is_ready()
3277 mtx_unlock(&sc->sc_umass_mtx); in umass_dev_is_ready()
3281 ret = umass_request_sense(sc); in umass_dev_is_ready()
3284 mtx_unlock(&sc->sc_umass_mtx); in umass_dev_is_ready()
3288 mtx_unlock(&sc->sc_umass_mtx); in umass_dev_is_ready()
3293 umass_attach_dev_sub(struct umass_softc *sc, unsigned int dev_unit) in umass_attach_dev_sub() argument
3309 dev = sc->sc_dev; in umass_attach_dev_sub()
3310 udev = sc->sc_udev; in umass_attach_dev_sub()
3321 ret = los_disk_init(devname, &g_dev_umass_ops, (void *)sc, disk_id, NULL); in umass_attach_dev_sub()
3354 umass_detach_dev_sub(struct umass_softc *sc, int dev_unit, int flag) in umass_detach_dev_sub() argument
3368 dev = sc->sc_dev; in umass_detach_dev_sub()
3369 udev = sc->sc_udev; in umass_detach_dev_sub()
3395 umass_dev_delete(sc, dev_unit); in umass_detach_dev_sub()
3414 struct umass_softc *sc; in umass_dev_status_check() local
3420 sc = dev[i].sc; in umass_dev_status_check()
3421 ret = umass_dev_is_ready(sc); in umass_dev_status_check()
3424 umass_detach_dev_sub(sc, dev[i].dev_unit, 1); in umass_dev_status_check()
3436 ret = umass_attach_dev_sub(sc, dev[i].dev_unit); in umass_dev_status_check()
3461 umass_dev_add(struct umass_softc *sc, int dev_unit) in umass_dev_add() argument
3470 g_umass_dev_array[id].sc = sc; in umass_dev_add()
3477 umass_dev_delete(struct umass_softc *sc, unsigned int dev_unit) in umass_dev_delete() argument
3487 g_umass_dev_array[id].sc == sc) { in umass_dev_delete()
3489 g_umass_dev_array[id].sc = NULL; in umass_dev_delete()
3559 umass_attach_dev(struct umass_softc *sc, unsigned int dev_unit) in umass_attach_dev() argument
3569 umass_dev_add(sc, dev_unit); in umass_attach_dev()
3572 ret = umass_dev_is_ready(sc); in umass_attach_dev()
3574 ret = umass_attach_dev_sub(sc, dev_unit); in umass_attach_dev()
3577 umass_dev_delete(sc, dev_unit); in umass_attach_dev()