Lines Matching refs:scsa2usbp

573 	scsa2usb_state_t *scsa2usbp = NULL;
579 if (((scsa2usbp = ddi_get_soft_state(scsa2usb_statep,
581 scsa2usbp->scsa2usb_dip) {
582 *result = scsa2usbp->scsa2usb_dip;
622 scsa2usb_state_t *scsa2usbp;
654 if ((scsa2usbp = ddi_get_soft_state(scsa2usb_statep,
663 scsa2usbp->scsa2usb_dip = dip;
664 scsa2usbp->scsa2usb_instance = instance;
667 scsa2usbp->scsa2usb_log_handle = log_handle =
689 mutex_init(&scsa2usbp->scsa2usb_mutex, NULL, MUTEX_DRIVER,
691 cv_init(&scsa2usbp->scsa2usb_transport_busy_cv, NULL, CV_DRIVER, NULL);
694 usba_init_list(&scsa2usbp->scsa2usb_waitQ[lun], NULL,
697 mutex_enter(&scsa2usbp->scsa2usb_mutex);
698 scsa2usbp->scsa2usb_dip = dip;
699 scsa2usbp->scsa2usb_instance = instance;
700 scsa2usbp->scsa2usb_attrs = SCSA2USB_ALL_ATTRS;
701 scsa2usbp->scsa2usb_dev_data = dev_data;
705 scsa2usbp->scsa2usb_default_pipe = dev_data->dev_default_ph;
708 scsa2usbp->scsa2usb_flags |= SCSA2USB_FLAGS_LOCKS_INIT;
716 scsa2usbp->scsa2usb_intfc_num = dev_data->dev_curr_if;
724 mutex_exit(&scsa2usbp->scsa2usb_mutex);
736 scsa2usbp->scsa2usb_intfc_descr = altif_data->altif_descr;
741 scsa2usbp->scsa2usb_bulkout_ept = ep_data->ep_descr;
745 scsa2usbp->scsa2usb_bulkin_ept = ep_data->ep_descr;
749 scsa2usbp->scsa2usb_intr_ept = ep_data->ep_descr;
758 scsa2usb_override(scsa2usbp);
762 scsa2usbp->scsa2usb_intfc_descr.bInterfaceProtocol,
763 scsa2usbp->scsa2usb_protocol_override,
764 scsa2usbp->scsa2usb_intfc_descr.bInterfaceSubClass,
765 scsa2usbp->scsa2usb_subclass_override);
767 switch (scsa2usbp->scsa2usb_intfc_descr.bInterfaceProtocol) {
769 scsa2usbp->scsa2usb_cmd_protocol |= SCSA2USB_CB_PROTOCOL;
772 scsa2usbp->scsa2usb_cmd_protocol |= SCSA2USB_CBI_PROTOCOL;
776 scsa2usbp->scsa2usb_cmd_protocol |= SCSA2USB_BULK_ONLY_PROTOCOL;
779 if (scsa2usbp->scsa2usb_protocol_override) {
780 scsa2usbp->scsa2usb_cmd_protocol |=
781 scsa2usbp->scsa2usb_protocol_override;
784 scsa2usbp->scsa2usb_intfc_descr.bInterfaceProtocol);
790 scsa2usbp->scsa2usb_intfc_descr.bInterfaceProtocol);
791 mutex_exit(&scsa2usbp->scsa2usb_mutex);
796 switch (scsa2usbp->scsa2usb_intfc_descr.bInterfaceSubClass) {
798 scsa2usbp->scsa2usb_cmd_protocol |= SCSA2USB_SCSI_CMDSET;
802 scsa2usbp->scsa2usb_cmd_protocol |= SCSA2USB_ATAPI_CMDSET;
805 scsa2usbp->scsa2usb_cmd_protocol |= SCSA2USB_UFI_CMDSET;
808 if (scsa2usbp->scsa2usb_subclass_override) {
809 scsa2usbp->scsa2usb_cmd_protocol |=
810 scsa2usbp->scsa2usb_subclass_override;
813 scsa2usbp->scsa2usb_intfc_descr.bInterfaceSubClass);
819 scsa2usbp->scsa2usb_intfc_descr.bInterfaceSubClass);
820 mutex_exit(&scsa2usbp->scsa2usb_mutex);
826 if (SCSA2USB_IS_BULK_ONLY(scsa2usbp) || SCSA2USB_IS_CB(scsa2usbp)) {
827 if ((scsa2usbp->scsa2usb_bulkout_ept.bLength == 0) ||
828 (scsa2usbp->scsa2usb_bulkin_ept.bLength == 0)) {
831 } else if (SCSA2USB_IS_CBI(scsa2usbp)) {
832 if ((scsa2usbp->scsa2usb_bulkout_ept.bLength == 0) ||
833 (scsa2usbp->scsa2usb_bulkin_ept.bLength == 0) ||
834 (scsa2usbp->scsa2usb_intr_ept.bLength == 0)) {
843 mutex_exit(&scsa2usbp->scsa2usb_mutex);
851 scsa2usb_validate_attrs(scsa2usbp);
854 if (scsa2usbp->scsa2usb_dev_data->dev_serial) {
856 scsa2usbp->scsa2usb_log_handle, "Serial Number = %s",
857 scsa2usbp->scsa2usb_dev_data->dev_serial);
864 scsa2usbp->scsa2usb_tran = tran;
869 tran->tran_hba_private = scsa2usbp;
903 mutex_exit(&scsa2usbp->scsa2usb_mutex);
908 scsa2usbp->scsa2usb_flags |= SCSA2USB_FLAGS_HBA_ATTACH_SETUP;
914 USB_DPRINTF_L2(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
916 mutex_exit(&scsa2usbp->scsa2usb_mutex);
922 if (scsa2usb_open_usb_pipes(scsa2usbp) == USB_FAILURE) {
925 mutex_exit(&scsa2usbp->scsa2usb_mutex);
932 scsa2usbp->scsa2usb_lbasize[lun] = DEV_BSIZE;
935 mutex_exit(&scsa2usbp->scsa2usb_mutex);
938 scsa2usb_panic_callb_init(scsa2usbp);
941 mutex_enter(&scsa2usbp->scsa2usb_mutex);
942 scsa2usbp->scsa2usb_dev_state = USB_DEV_ONLINE;
945 scsa2usb_create_pm_components(dip, scsa2usbp);
946 mutex_exit(&scsa2usbp->scsa2usb_mutex);
949 if (usb_register_event_cbs(scsa2usbp->scsa2usb_dip, &scsa2usb_events,
959 scsa2usb_pm_idle_component(scsa2usbp);
962 if (scsa2usbp->scsa2usb_override_str) {
963 USB_DPRINTF_L2(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
965 scsa2usbp->scsa2usb_override_str);
976 scsa2usbp->scsa2usb_ugen_hdl =
979 if (usb_ugen_attach(scsa2usbp->scsa2usb_ugen_hdl, cmd) !=
982 scsa2usbp->scsa2usb_log_handle,
985 usb_ugen_release_hdl(scsa2usbp->scsa2usb_ugen_hdl);
986 scsa2usbp->scsa2usb_ugen_hdl = NULL;
996 if (scsa2usbp) {
997 (void) scsa2usb_cleanup(dip, scsa2usbp);
1012 scsa2usb_state_t *scsa2usbp;
1018 scsa2usbp = (scsa2usb_state_t *)tran->tran_hba_private;
1019 ASSERT(scsa2usbp);
1021 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
1027 if (scsa2usb_cleanup(dip, scsa2usbp) != USB_SUCCESS) {
1054 scsa2usb_state_t *scsa2usbp;
1057 if ((scsa2usbp = ddi_get_soft_state(scsa2usb_statep,
1064 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
1067 mutex_enter(&scsa2usbp->scsa2usb_mutex);
1070 if (scsa2usbp->scsa2usb_busy_proc != curproc) {
1071 while (scsa2usbp->scsa2usb_transport_busy ||
1072 (scsa2usb_all_waitQs_empty(scsa2usbp) !=
1075 &scsa2usbp->scsa2usb_transport_busy_cv,
1076 &scsa2usbp->scsa2usb_mutex);
1078 mutex_exit(&scsa2usbp->scsa2usb_mutex);
1083 scsa2usbp->scsa2usb_transport_busy++;
1084 scsa2usbp->scsa2usb_busy_proc = curproc;
1087 scsa2usbp->scsa2usb_ugen_open_count++;
1089 scsa2usb_raise_power(scsa2usbp);
1091 scsa2usb_close_usb_pipes(scsa2usbp);
1093 mutex_exit(&scsa2usbp->scsa2usb_mutex);
1095 rval = usb_ugen_open(scsa2usbp->scsa2usb_ugen_hdl, devp, flag,
1109 mutex_enter(&scsa2usbp->scsa2usb_mutex);
1112 (usb_ugen_hdl_impl_t *)scsa2usbp->scsa2usb_ugen_hdl;
1118 if (!scsa2usbp->scsa2usb_clones[clone])
1125 mutex_exit(&scsa2usbp->scsa2usb_mutex);
1131 (scsa2usbp->scsa2usb_instance
1136 scsa2usbp->scsa2usb_clones[clone] = (uint8_t)ugen_minor;
1137 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
1141 mutex_exit(&scsa2usbp->scsa2usb_mutex);
1147 mutex_enter(&scsa2usbp->scsa2usb_mutex);
1150 if (--scsa2usbp->scsa2usb_ugen_open_count == 0) {
1151 scsa2usbp->scsa2usb_transport_busy--;
1152 scsa2usbp->scsa2usb_busy_proc = NULL;
1153 cv_signal(&scsa2usbp->scsa2usb_transport_busy_cv);
1155 mutex_exit(&scsa2usbp->scsa2usb_mutex);
1157 scsa2usb_pm_idle_component(scsa2usbp);
1173 scsa2usb_state_t *scsa2usbp = ddi_get_soft_state(scsa2usb_statep,
1176 if (scsa2usbp == NULL) {
1181 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
1185 ugen_minor = scsa2usbp->scsa2usb_clones[clone];
1187 (scsa2usbp->scsa2usb_instance << SCSA2USB_MINOR_INSTANCE_SHIFT)
1189 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
1191 rval = usb_ugen_close(scsa2usbp->scsa2usb_ugen_hdl, dev, flag,
1195 mutex_enter(&scsa2usbp->scsa2usb_mutex);
1197 scsa2usbp->scsa2usb_clones[clone] = 0;
1199 if (--scsa2usbp->scsa2usb_ugen_open_count == 0) {
1200 scsa2usbp->scsa2usb_transport_busy--;
1201 scsa2usbp->scsa2usb_busy_proc = NULL;
1202 cv_signal(&scsa2usbp->scsa2usb_transport_busy_cv);
1204 mutex_exit(&scsa2usbp->scsa2usb_mutex);
1206 scsa2usb_pm_idle_component(scsa2usbp);
1221 scsa2usb_state_t *scsa2usbp = ddi_get_soft_state(scsa2usb_statep,
1224 if (scsa2usbp == NULL) {
1229 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
1233 ugen_minor = scsa2usbp->scsa2usb_clones[clone];
1235 (scsa2usbp->scsa2usb_instance << SCSA2USB_MINOR_INSTANCE_SHIFT)
1238 return (usb_ugen_read(scsa2usbp->scsa2usb_ugen_hdl, dev,
1248 scsa2usb_state_t *scsa2usbp = ddi_get_soft_state(scsa2usb_statep,
1251 if (scsa2usbp == NULL) {
1256 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
1260 ugen_minor = scsa2usbp->scsa2usb_clones[clone];
1262 (scsa2usbp->scsa2usb_instance << SCSA2USB_MINOR_INSTANCE_SHIFT)
1265 return (usb_ugen_write(scsa2usbp->scsa2usb_ugen_hdl,
1278 scsa2usb_state_t *scsa2usbp = ddi_get_soft_state(scsa2usb_statep,
1281 if (scsa2usbp == NULL) {
1286 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
1290 ugen_minor = scsa2usbp->scsa2usb_clones[clone];
1292 (scsa2usbp->scsa2usb_instance << SCSA2USB_MINOR_INSTANCE_SHIFT)
1295 return (usb_ugen_poll(scsa2usbp->scsa2usb_ugen_hdl, dev, events,
1305 scsa2usb_cleanup(dev_info_t *dip, scsa2usb_state_t *scsa2usbp)
1311 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
1315 mutex_enter(&scsa2usbp->scsa2usb_mutex);
1317 if (scsa2usbp->scsa2usb_work_thread_id == NULL) {
1321 mutex_exit(&scsa2usbp->scsa2usb_mutex);
1323 mutex_enter(&scsa2usbp->scsa2usb_mutex);
1325 mutex_exit(&scsa2usbp->scsa2usb_mutex);
1339 usb_unregister_event_cbs(scsa2usbp->scsa2usb_dip, &scsa2usb_events);
1341 if (scsa2usbp->scsa2usb_flags & SCSA2USB_FLAGS_LOCKS_INIT) {
1346 scsa2usb_flush_waitQ(scsa2usbp, lun, CMD_TRAN_ERR);
1347 usba_destroy_list(&scsa2usbp->scsa2usb_waitQ[lun]);
1350 mutex_enter(&scsa2usbp->scsa2usb_mutex);
1351 if (scsa2usbp->scsa2usb_flags &
1354 scsi_hba_tran_free(scsa2usbp->scsa2usb_tran);
1357 if (scsa2usbp->scsa2usb_flags &
1359 scsa2usb_close_usb_pipes(scsa2usbp);
1363 pm = scsa2usbp->scsa2usb_pm;
1365 if (pm && (scsa2usbp->scsa2usb_dev_state !=
1368 mutex_exit(&scsa2usbp->scsa2usb_mutex);
1376 scsa2usbp->scsa2usb_log_handle,
1381 mutex_exit(&scsa2usbp->scsa2usb_mutex);
1386 mutex_enter(&scsa2usbp->scsa2usb_mutex);
1393 if (scsa2usbp->scsa2usb_override_str) {
1394 kmem_free(scsa2usbp->scsa2usb_override_str,
1395 strlen(scsa2usbp->scsa2usb_override_str) + 1);
1396 scsa2usbp->scsa2usb_override_str = NULL;
1403 scsa2usb_panic_callb_fini(scsa2usbp);
1405 mutex_exit(&scsa2usbp->scsa2usb_mutex);
1407 mutex_destroy(&scsa2usbp->scsa2usb_mutex);
1408 cv_destroy(&scsa2usbp->scsa2usb_transport_busy_cv);
1411 usb_client_detach(scsa2usbp->scsa2usb_dip,
1412 scsa2usbp->scsa2usb_dev_data);
1414 if (scsa2usbp->scsa2usb_ugen_hdl) {
1415 (void) usb_ugen_detach(scsa2usbp->scsa2usb_ugen_hdl,
1417 usb_ugen_release_hdl(scsa2usbp->scsa2usb_ugen_hdl);
1420 usb_free_log_hdl(scsa2usbp->scsa2usb_log_handle);
1438 scsa2usb_override(scsa2usb_state_t *scsa2usbp)
1445 usb_dev_descr_t *descr = scsa2usbp->scsa2usb_dev_data->dev_descr;
1447 ASSERT(mutex_owned(&scsa2usbp->scsa2usb_mutex));
1449 scsa2usbp->scsa2usb_subclass_override =
1450 scsa2usbp->scsa2usb_protocol_override = 0;
1452 if (ddi_prop_lookup_string_array(DDI_DEV_T_ANY, scsa2usbp->scsa2usb_dip,
1462 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
1476 scsa2usbp) == USB_FAILURE) {
1489 scsa2usbp->scsa2usb_subclass_override = ov.subclass;
1490 scsa2usbp->scsa2usb_protocol_override = ov.protocol;
1493 scsa2usbp->scsa2usb_log_handle,
1503 scsa2usbp->scsa2usb_attrs &= ~SCSA2USB_ATTRS_PM;
1506 scsa2usbp->scsa2usb_attrs &=
1510 scsa2usbp->scsa2usb_attrs &=
1514 scsa2usbp->scsa2usb_attrs &=
1517 scsa2usbp->scsa2usb_override_str = override_str_cpy;
1536 scsa2usb_state_t *scsa2usbp)
1550 scsa2usb_override_error("format", scsa2usbp);
1560 scsa2usb_override_error("vendor id", scsa2usbp);
1568 scsa2usbp);
1576 scsa2usbp);
1591 scsa2usb_override_error("subclass", scsa2usbp);
1605 scsa2usb_override_error("protocol", scsa2usbp);
1614 scsa2usb_override_error("pm", scsa2usbp);
1623 scsa2usb_override_error("removable", scsa2usbp);
1633 scsa2usbp);
1644 "reduced-cmd-support", scsa2usbp);
1649 scsa2usb_override_error(input_field, scsa2usbp);
1664 scsa2usb_override_error(char *input_field, scsa2usb_state_t *scsa2usbp)
1666 USB_DPRINTF_L1(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
1715 scsa2usb_validate_attrs(scsa2usb_state_t *scsa2usbp)
1718 usb_dev_descr_t *desc = scsa2usbp->scsa2usb_dev_data->dev_descr;
1720 if (!SCSA2USB_IS_BULK_ONLY(scsa2usbp)) {
1721 scsa2usbp->scsa2usb_attrs &= ~SCSA2USB_ATTRS_GET_LUN;
1729 scsa2usbp->scsa2usb_attrs &=
1741 mask = scsa2usbp->scsa2usb_cmd_protocol & SCSA2USB_CMDSET_MASK;
1743 scsa2usbp->scsa2usb_cmd_protocol &= ~mask;
1745 scsa2usbp->scsa2usb_cmd_protocol |= SCSA2USB_UFI_CMDSET;
1748 if (scsa2usbp->scsa2usb_attrs != SCSA2USB_ALL_ATTRS) {
1750 scsa2usbp->scsa2usb_log_handle,
1752 scsa2usbp->scsa2usb_attrs);
1763 scsa2usb_create_luns(scsa2usb_state_t *scsa2usbp)
1772 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
1775 mutex_enter(&scsa2usbp->scsa2usb_mutex);
1778 scsa2usbp->scsa2usb_n_luns = 1;
1785 if ((scsa2usbp->scsa2usb_attrs & SCSA2USB_ATTRS_GET_LUN) == 0) {
1786 USB_DPRINTF_L2(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
1789 if (SCSA2USB_IS_BULK_ONLY(scsa2usbp)) {
1790 scsa2usbp->scsa2usb_n_luns =
1791 scsa2usb_bulk_only_get_max_lun(scsa2usbp);
1795 USB_DPRINTF_L3(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
1796 "scsa2usb_create_luns: %d luns found", scsa2usbp->scsa2usb_n_luns);
1801 for (lun = 0; lun < scsa2usbp->scsa2usb_n_luns; lun++) {
1802 ASSERT(scsa2usbp->scsa2usb_lun_dip[lun] == NULL);
1805 scsa2usb_do_inquiry(scsa2usbp, 0, lun);
1807 dtype = scsa2usbp->scsa2usb_lun_inquiry[lun].
1810 USB_DPRINTF_L3(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
1871 ndi_devi_alloc_sleep(scsa2usbp->scsa2usb_dip, node_name,
1878 scsa2usbp->scsa2usb_log_handle,
1888 scsa2usbp->scsa2usb_log_handle,
1903 scsa2usbp->scsa2usb_log_handle,
1913 scsa2usbp->scsa2usb_log_handle,
1926 scsa2usbp->scsa2usb_log_handle,
1941 scsa2usbp->scsa2usb_log_handle,
1948 mutex_exit(&scsa2usbp->scsa2usb_mutex);
1949 (void) ddi_initchild(scsa2usbp->scsa2usb_dip, cdip);
1950 mutex_enter(&scsa2usbp->scsa2usb_mutex);
1953 usba_get_usba_device(scsa2usbp->scsa2usb_dip));
1955 mutex_exit(&scsa2usbp->scsa2usb_mutex);
1981 scsa2usb_panic_callb_init(scsa2usb_state_t *scsa2usbp)
1996 scsa2usbp->scsa2usb_panic_info =
1998 mutex_init(&scsa2usbp->scsa2usb_panic_info->lockp,
2000 scsa2usbp->scsa2usb_dev_data->dev_iblock_cookie);
2001 scsa2usbp->scsa2usb_panic_info->statep = scsa2usbp;
2002 scsa2usbp->scsa2usb_panic_info->cpr.cc_lockp =
2003 &scsa2usbp->scsa2usb_panic_info->lockp;
2004 scsa2usbp->scsa2usb_panic_info->cpr.cc_id =
2006 (void *)scsa2usbp->scsa2usb_panic_info,
2016 scsa2usb_panic_callb_fini(scsa2usb_state_t *scsa2usbp)
2018 if (scsa2usbp->scsa2usb_panic_info) {
2019 SCSA2USB_CANCEL_CB(scsa2usbp->scsa2usb_panic_info->cpr.cc_id);
2020 mutex_destroy(&scsa2usbp->scsa2usb_panic_info->lockp);
2021 scsa2usbp->scsa2usb_panic_info->statep = NULL;
2022 kmem_free(scsa2usbp->scsa2usb_panic_info,
2024 scsa2usbp->scsa2usb_panic_info = NULL;
2038 scsa2usb_state_t *scsa2usbp;
2043 scsa2usbp = (scsa2usb_state_t *)cpr_infop->statep;
2045 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
2054 if (scsa2usbp->scsa2usb_cur_pkt) {
2061 scsa2usbp->scsa2usb_cur_pkt->pkt_reason = CMD_CMPLT;
2062 mutex_enter(&scsa2usbp->scsa2usb_mutex);
2063 scsa2usb_pkt_completion(scsa2usbp, scsa2usbp->scsa2usb_cur_pkt);
2064 mutex_exit(&scsa2usbp->scsa2usb_mutex);
2069 scsa2usb_flush_waitQ(scsa2usbp, lun, CMD_CMPLT);
2088 scsa2usb_state_t *scsa2usbp;
2092 scsa2usbp = ddi_get_soft_state(scsa2usb_statep, ddi_get_instance(dip));
2094 ASSERT(scsa2usbp != NULL);
2096 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
2099 mutex_enter(&scsa2usbp->scsa2usb_mutex);
2100 switch (scsa2usbp->scsa2usb_dev_state) {
2104 prev_state = scsa2usbp->scsa2usb_dev_state;
2105 scsa2usbp->scsa2usb_dev_state = USB_DEV_SUSPENDED;
2110 if (SCSA2USB_BUSY(scsa2usbp)) {
2112 scsa2usbp->scsa2usb_log_handle,
2116 scsa2usbp->scsa2usb_dev_state = prev_state;
2124 USB_DPRINTF_L2(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
2126 scsa2usbp->scsa2usb_dev_state);
2130 mutex_exit(&scsa2usbp->scsa2usb_mutex);
2132 if ((rval == USB_SUCCESS) && scsa2usbp->scsa2usb_ugen_hdl) {
2133 rval = usb_ugen_detach(scsa2usbp->scsa2usb_ugen_hdl,
2148 scsa2usb_state_t *scsa2usbp =
2151 ASSERT(scsa2usbp != NULL);
2153 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
2156 scsa2usb_restore_device_state(dip, scsa2usbp);
2158 if (scsa2usbp->scsa2usb_ugen_hdl) {
2159 (void) usb_ugen_attach(scsa2usbp->scsa2usb_ugen_hdl,
2171 scsa2usb_restore_device_state(dev_info_t *dip, scsa2usb_state_t *scsa2usbp)
2175 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
2178 mutex_enter(&scsa2usbp->scsa2usb_mutex);
2179 prev_state = scsa2usbp->scsa2usb_dev_state;
2181 scsa2usb_raise_power(scsa2usbp);
2186 mutex_exit(&scsa2usbp->scsa2usb_mutex);
2189 if (usb_check_same_device(dip, scsa2usbp->scsa2usb_log_handle,
2193 mutex_enter(&scsa2usbp->scsa2usb_mutex);
2194 scsa2usbp->scsa2usb_dev_state = USB_DEV_DISCONNECTED;
2195 mutex_exit(&scsa2usbp->scsa2usb_mutex);
2197 scsa2usb_pm_idle_component(scsa2usbp);
2206 mutex_enter(&scsa2usbp->scsa2usb_mutex);
2207 if (scsa2usbp->scsa2usb_pm &&
2208 scsa2usbp->scsa2usb_pm->scsa2usb_wakeup_enabled) {
2209 mutex_exit(&scsa2usbp->scsa2usb_mutex);
2210 (void) usb_handle_remote_wakeup(scsa2usbp->scsa2usb_dip,
2212 mutex_enter(&scsa2usbp->scsa2usb_mutex);
2215 scsa2usbp->scsa2usb_dev_state = USB_DEV_ONLINE;
2216 scsa2usbp->scsa2usb_pkt_state = SCSA2USB_PKT_NONE;
2217 mutex_exit(&scsa2usbp->scsa2usb_mutex);
2219 scsa2usb_pm_idle_component(scsa2usbp);
2235 scsa2usb_state_t *scsa2usbp;
2243 scsa2usbp = (scsa2usb_state_t *)tran->tran_hba_private;
2244 ASSERT(scsa2usbp);
2246 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
2250 mutex_enter(&scsa2usbp->scsa2usb_mutex);
2251 if (!(SCSA2USB_DEVICE_ACCESS_OK(scsa2usbp))) {
2252 mutex_exit(&scsa2usbp->scsa2usb_mutex);
2256 mutex_exit(&scsa2usbp->scsa2usb_mutex);
2258 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
2266 mutex_enter(&scsa2usbp->scsa2usb_mutex);
2267 if (!(scsa2usbp->scsa2usb_attrs & SCSA2USB_ATTRS_RMB)) {
2271 mutex_exit(&scsa2usbp->scsa2usb_mutex);
2287 scsa2usb_state_t *scsa2usbp = (scsa2usb_state_t *)
2299 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
2305 USB_DPRINTF_L2(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
2316 scsa2usbp->scsa2usb_log_handle,
2323 usba_get_usba_device(scsa2usbp->scsa2usb_dip));
2333 mutex_enter(&scsa2usbp->scsa2usb_mutex);
2334 if ((lun >= scsa2usbp->scsa2usb_n_luns) ||
2335 (scsa2usbp->scsa2usb_lun_dip[lun] != NULL)) {
2336 mutex_exit(&scsa2usbp->scsa2usb_mutex);
2341 scsa2usbp->scsa2usb_lun_dip[lun] = cdip;
2342 mutex_exit(&scsa2usbp->scsa2usb_mutex);
2356 scsa2usb_state_t *scsa2usbp = (scsa2usb_state_t *)
2374 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
2377 mutex_enter(&scsa2usbp->scsa2usb_mutex);
2378 if (lun < scsa2usbp->scsa2usb_n_luns) {
2379 if (scsa2usbp->scsa2usb_lun_dip[lun] == cdip) {
2380 scsa2usbp->scsa2usb_lun_dip[lun] = NULL;
2383 mutex_exit(&scsa2usbp->scsa2usb_mutex);
2397 scsa2usb_state_t *scsa2usbp =
2400 ASSERT(scsa2usbp != NULL);
2402 USB_DPRINTF_L2(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
2412 scsa2usb_create_luns(scsa2usbp);
2427 scsa2usb_state_t *scsa2usbp =
2434 ASSERT(scsa2usbp != NULL);
2436 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
2467 mutex_enter(&scsa2usbp->scsa2usb_mutex);
2468 if (scsa2usbp->scsa2usb_warning_given != B_TRUE) {
2470 scsa2usbp->scsa2usb_log_handle,
2473 scsa2usbp->scsa2usb_warning_given = B_TRUE;
2475 mutex_exit(&scsa2usbp->scsa2usb_mutex);
2478 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
2498 scsa2usb_state_t *scsa2usbp;
2503 scsa2usbp = (scsa2usb_state_t *)ADDR2SCSA2USB(ap);
2507 mutex_enter(&scsa2usbp->scsa2usb_mutex);
2508 SCSA2USB_PRINT_SYNC_MSG(scsa2usb_sync_message, scsa2usbp);
2509 mutex_exit(&scsa2usbp->scsa2usb_mutex);
2519 pkt = scsi_hba_pkt_alloc(scsa2usbp->scsa2usb_dip, ap, cmdlen,
2532 mutex_enter(&scsa2usbp->scsa2usb_mutex);
2533 cmd->cmd_tag = scsa2usbp->scsa2usb_tag++;
2534 mutex_exit(&scsa2usbp->scsa2usb_mutex);
2547 scsa2usbp->scsa2usb_dev_data->dev_iblock_cookie);
2549 USB_DPRINTF_L2(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
2566 scsa2usbp->scsa2usb_log_handle,
2571 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
2589 scsa2usb_state_t *scsa2usbp = ADDR2SCSA2USB(ap);
2591 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
2610 scsa2usb_state_t *scsa2usbp = ADDR2SCSA2USB(ap);
2613 mutex_enter(&scsa2usbp->scsa2usb_mutex);
2616 USB_DPRINTF_L3(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
2621 pkt->pkt_time, pkt->pkt_cdbp[0], scsa2usbp->scsa2usb_dev_state,
2622 scsa2usbp->scsa2usb_pkt_state, scsa2usbp->scsa2usb_flags,
2623 scsa2usbp->scsa2usb_pipe_state);
2626 USB_DPRINTF_L1(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
2641 scsa2usb_prepare_pkt(scsa2usbp, pkt);
2642 SCSA2USB_PRINT_SYNC_MSG(scsa2usb_sync_message, scsa2usbp);
2643 mutex_exit(&scsa2usbp->scsa2usb_mutex);
2650 USB_DPRINTF_L2(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
2652 mutex_exit(&scsa2usbp->scsa2usb_mutex);
2658 scsa2usb_prepare_pkt(scsa2usbp, pkt);
2661 if (usba_list_entry_count(&scsa2usbp->scsa2usb_waitQ[lun]) >
2664 scsa2usbp->scsa2usb_log_handle,
2667 mutex_exit(&scsa2usbp->scsa2usb_mutex);
2672 usba_add_to_list(&scsa2usbp->scsa2usb_waitQ[lun], &cmd->cmd_waitQ);
2674 USB_DPRINTF_L3(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
2676 (void *)scsa2usbp->scsa2usb_work_thread_id,
2677 usba_list_entry_count(&scsa2usbp->scsa2usb_waitQ[lun]), lun);
2680 if (scsa2usbp->scsa2usb_work_thread_id == 0) {
2681 if ((usb_async_req(scsa2usbp->scsa2usb_dip,
2683 (void *)scsa2usbp, USB_FLAGS_SLEEP)) != USB_SUCCESS) {
2685 scsa2usbp->scsa2usb_log_handle,
2689 &scsa2usbp->scsa2usb_waitQ[lun],
2691 mutex_exit(&scsa2usbp->scsa2usb_mutex);
2696 mutex_exit(&scsa2usbp->scsa2usb_mutex);
2701 scsa2usbp->scsa2usb_work_thread_id = (kthread_t *)1;
2704 mutex_exit(&scsa2usbp->scsa2usb_mutex);
2718 scsa2usb_state_t *scsa2usbp = (scsa2usb_state_t *)ADDR2SCSA2USB(ap);
2720 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
2724 mutex_enter(&scsa2usbp->scsa2usb_mutex);
2725 if (!(SCSA2USB_DEVICE_ACCESS_OK(scsa2usbp))) {
2726 mutex_exit(&scsa2usbp->scsa2usb_mutex);
2734 mutex_exit(&scsa2usbp->scsa2usb_mutex);
2735 scsa2usb_flush_waitQ(scsa2usbp, ap->a_lun, CMD_ABORTED);
2736 mutex_enter(&scsa2usbp->scsa2usb_mutex);
2738 mutex_exit(&scsa2usbp->scsa2usb_mutex);
2755 scsa2usb_state_t *scsa2usbp = (scsa2usb_state_t *)ADDR2SCSA2USB(ap);
2757 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
2761 scsa2usb_flush_waitQ(scsa2usbp, ap->a_lun, CMD_RESET);
2778 scsa2usb_state_t *scsa2usbp = (scsa2usb_state_t *)ADDR2SCSA2USB(ap);
2779 ASSERT(scsa2usbp);
2782 USB_DPRINTF_L2(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
2789 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
2792 mutex_enter(&scsa2usbp->scsa2usb_mutex);
2795 if (!(SCSA2USB_DEVICE_ACCESS_OK(scsa2usbp))) {
2797 mutex_exit(&scsa2usbp->scsa2usb_mutex);
2806 if (scsa2usbp->scsa2usb_secsz[ap->a_lun] == 0) {
2808 scsa2usbp->scsa2usb_log_handle,
2810 "scsa2usbp->scsa2usb_secsz[ap->a_lun] == 0");
2811 mutex_exit(&scsa2usbp->scsa2usb_mutex);
2816 dev_bsize_cap = scsa2usbp->scsa2usb_totalsec[ap->a_lun];
2818 if (scsa2usbp->scsa2usb_secsz[ap->a_lun] > DEV_BSIZE) {
2820 scsa2usbp->scsa2usb_secsz[ap->a_lun] / DEV_BSIZE;
2821 } else if (scsa2usbp->scsa2usb_secsz[ap->a_lun] <
2824 DEV_BSIZE / scsa2usbp->scsa2usb_secsz[ap->a_lun];
2843 rval = scsa2usbp->scsa2usb_max_bulk_xfer_size;
2857 USB_DPRINTF_L2(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
2862 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
2865 mutex_exit(&scsa2usbp->scsa2usb_mutex);
2881 scsa2usb_state_t *scsa2usbp = (scsa2usb_state_t *)ADDR2SCSA2USB(ap);
2882 ASSERT(scsa2usbp);
2885 USB_DPRINTF_L2(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
2891 mutex_enter(&scsa2usbp->scsa2usb_mutex);
2893 if (!(SCSA2USB_DEVICE_ACCESS_OK(scsa2usbp))) {
2894 mutex_exit(&scsa2usbp->scsa2usb_mutex);
2900 USB_DPRINTF_L2(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
2907 scsa2usbp->scsa2usb_secsz[ap->a_lun] = value;
2912 scsa2usbp->scsa2usb_totalsec[ap->a_lun] = value;
2926 USB_DPRINTF_L2(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
2931 mutex_exit(&scsa2usbp->scsa2usb_mutex);
2946 scsa2usb_prepare_pkt(scsa2usb_state_t *scsa2usbp, struct scsi_pkt *pkt)
2950 USB_DPRINTF_L3(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
2978 scsa2usb_force_invalid_request(scsa2usb_state_t *scsa2usbp,
2983 USB_DPRINTF_L3(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
3005 scsa2usbp->scsa2usb_log_handle,
3025 scsa2usb_cmd_transport(scsa2usb_state_t *scsa2usbp, scsa2usb_cmd_t *cmd)
3030 USB_DPRINTF_L3(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
3032 (void *)cmd->cmd_pkt, (void *)scsa2usbp->scsa2usb_cur_pkt);
3034 ASSERT(mutex_owned(&scsa2usbp->scsa2usb_mutex));
3035 ASSERT(scsa2usbp->scsa2usb_cur_pkt == NULL);
3037 pkt = scsa2usbp->scsa2usb_cur_pkt = cmd->cmd_pkt;
3040 if (SCSA2USB_IS_BULK_ONLY(scsa2usbp)) {
3041 transport = scsa2usb_check_bulkonly_blacklist_attrs(scsa2usbp,
3043 } else if (SCSA2USB_IS_CB(scsa2usbp) || SCSA2USB_IS_CBI(scsa2usbp)) {
3044 transport = scsa2usb_check_ufi_blacklist_attrs(scsa2usbp,
3050 SCSA2USB_SET_PKT_DO_COMP_STATE(scsa2usbp);
3058 if (SCSA2USB_IS_SCSI_CMDSET(scsa2usbp) ||
3059 SCSA2USB_IS_ATAPI_CMDSET(scsa2usbp)) {
3061 scsa2usb_handle_scsi_cmd_sub_class(scsa2usbp, cmd, pkt);
3062 } else if (SCSA2USB_IS_UFI_CMDSET(scsa2usbp)) {
3064 scsa2usb_handle_ufi_subclass_cmd(scsa2usbp, cmd, pkt);
3071 if (SCSA2USB_IS_BULK_ONLY(scsa2usbp)) {
3072 rval = scsa2usb_bulk_only_transport(scsa2usbp, cmd);
3073 } else if (SCSA2USB_IS_CB(scsa2usbp) ||
3074 SCSA2USB_IS_CBI(scsa2usbp)) {
3075 rval = scsa2usb_cbi_transport(scsa2usbp, cmd);
3081 SCSA2USB_SET_PKT_DO_COMP_STATE(scsa2usbp);
3100 scsa2usb_check_bulkonly_blacklist_attrs(scsa2usb_state_t *scsa2usbp,
3104 &scsa2usbp->scsa2usb_lun_inquiry[cmd->cmd_pkt->pkt_address.a_lun];
3106 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
3110 ASSERT(mutex_owned(&scsa2usbp->scsa2usb_mutex));
3118 if (!(scsa2usbp->scsa2usb_attrs & SCSA2USB_ATTRS_DOORLOCK)) {
3145 if (!(scsa2usbp->scsa2usb_attrs & SCSA2USB_ATTRS_START_STOP)) {
3168 } else if (!scsa2usbp->scsa2usb_rcvd_not_ready) {
3184 if (!(scsa2usbp->scsa2usb_attrs & SCSA2USB_ATTRS_INQUIRY)) {
3192 scsa2usb_fake_inquiry(scsa2usbp, inq);
3205 } else if (!(scsa2usbp->scsa2usb_attrs &
3223 scsa2usb_force_invalid_request(scsa2usbp, cmd);
3244 if (!(scsa2usbp->scsa2usb_attrs & SCSA2USB_ATTRS_MODE_SENSE)) {
3249 scsa2usb_force_invalid_request(scsa2usbp, cmd);
3270 scsa2usb_handle_scsi_cmd_sub_class(scsa2usb_state_t *scsa2usbp,
3274 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
3278 ASSERT(mutex_owned(&scsa2usbp->scsa2usb_mutex));
3359 switch (scsa2usbp->
3366 scsa2usbp, pkt));
3444 scsa2usb_force_invalid_request(scsa2usbp, cmd);
3464 USB_DPRINTF_L2(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
3480 scsa2usb_do_tur(scsa2usb_state_t *scsa2usbp, struct scsi_address *ap)
3486 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
3489 ASSERT(mutex_owned(&scsa2usbp->scsa2usb_mutex));
3491 mutex_exit(&scsa2usbp->scsa2usb_mutex);
3494 mutex_enter(&scsa2usbp->scsa2usb_mutex);
3496 scsa2usbp->scsa2usb_log_handle,
3509 mutex_enter(&scsa2usbp->scsa2usb_mutex);
3510 scsa2usb_prepare_pkt(scsa2usbp, turcmd->cmd_pkt);
3512 if (scsa2usb_cmd_transport(scsa2usbp, turcmd) != TRAN_ACCEPT) {
3514 scsa2usbp->scsa2usb_log_handle,
3531 scsa2usbp->scsa2usb_log_handle,
3537 mutex_exit(&scsa2usbp->scsa2usb_mutex);
3539 mutex_enter(&scsa2usbp->scsa2usb_mutex);
3555 scsa2usb_check_ufi_blacklist_attrs(scsa2usb_state_t *scsa2usbp, uchar_t opcode,
3560 ASSERT(mutex_owned(&scsa2usbp->scsa2usb_mutex));
3572 scsa2usb_force_invalid_request(scsa2usbp, cmd);
3576 if (!(scsa2usbp->scsa2usb_attrs & SCSA2USB_ATTRS_GET_CONF)) {
3581 if (!(scsa2usbp->scsa2usb_attrs & SCSA2USB_ATTRS_GET_PERF)) {
3591 if (!(scsa2usbp->scsa2usb_attrs & SCSA2USB_ATTRS_START_STOP)) {
3601 if (!(scsa2usbp->scsa2usb_attrs &
3605 ASSERT(scsa2usbp->scsa2usb_cur_pkt == pkt);
3606 scsa2usbp->scsa2usb_cur_pkt = NULL;
3608 if (scsa2usb_do_tur(scsa2usbp,
3615 scsa2usb_force_invalid_request(scsa2usbp, cmd);
3619 scsa2usbp->scsa2usb_cur_pkt = pkt;
3636 scsa2usb_handle_ufi_subclass_cmd(scsa2usb_state_t *scsa2usbp,
3641 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
3645 ASSERT(mutex_owned(&scsa2usbp->scsa2usb_mutex));
3704 return (scsa2usb_rw_transport(scsa2usbp, pkt));
3726 if (!(scsa2usbp->scsa2usb_attrs & SCSA2USB_ATTRS_BIG_TIMEOUT)) {
3745 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
3787 scsa2usb_rw_transport(scsa2usb_state_t *scsa2usbp, struct scsi_pkt *pkt)
3796 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
3799 ASSERT(mutex_owned(&scsa2usbp->scsa2usb_mutex));
3802 blk_size = scsa2usbp->scsa2usb_lbasize[pkt->pkt_address.a_lun];
3864 (xfer_count > scsa2usbp->scsa2usb_max_bulk_xfer_size)) {
3877 xfer_count = ((scsa2usbp->scsa2usb_max_bulk_xfer_size/
3882 xfer_count = scsa2usbp->scsa2usb_max_bulk_xfer_size;
3913 USB_DPRINTF_L3(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
3931 scsa2usbp->scsa2usb_log_handle,
3935 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
3957 scsa2usb_setup_next_xfer(scsa2usb_state_t *scsa2usbp, scsa2usb_cmd_t *cmd)
3959 int xfer_len = min(scsa2usbp->scsa2usb_max_bulk_xfer_size,
3964 ASSERT(mutex_owned(&scsa2usbp->scsa2usb_mutex));
3966 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
3973 blk_size = scsa2usbp->scsa2usb_lbasize[
4023 cmd->cmd_lba += scsa2usbp->scsa2usb_max_bulk_xfer_size/blk_size;
4029 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
4040 scsa2usb_transport_request(scsa2usb_state_t *scsa2usbp, uint_t lun)
4048 &scsa2usbp->scsa2usb_waitQ[lun])) == NULL) {
4057 if (scsa2usbp->scsa2usb_dev_state == USB_DEV_DISCONNECTED) {
4058 USB_DPRINTF_L2(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
4061 SCSA2USB_SET_PKT_DO_COMP_STATE(scsa2usbp);
4062 scsa2usb_pkt_completion(scsa2usbp, pkt);
4068 scsa2usbp->scsa2usb_log_handle,
4073 rval = scsa2usb_cmd_transport(scsa2usbp, cmd);
4076 scsa2usbp->scsa2usb_log_handle,
4080 if (scsa2usbp->scsa2usb_cur_pkt == NULL) {
4085 ASSERT(pkt == scsa2usbp->scsa2usb_cur_pkt);
4089 scsa2usb_pkt_completion(scsa2usbp, pkt);
4103 (scsa2usb_create_arq_pkt(scsa2usbp,
4105 arqcmd = scsa2usbp->scsa2usb_arq_cmd;
4113 scsa2usb_prepare_pkt(scsa2usbp,
4116 scsa2usbp->scsa2usb_cur_pkt = NULL;
4118 scsa2usbp, arqcmd) == TRAN_ACCEPT) {
4122 scsa2usbp, arqcmd->cmd_pkt, cmd,
4123 scsa2usbp->scsa2usb_arq_bp);
4131 scsa2usbp->scsa2usb_cur_pkt = pkt;
4132 scsa2usb_delete_arq_pkt(scsa2usbp);
4140 SCSA2USB_SET_PKT_DO_COMP_STATE(scsa2usbp);
4141 scsa2usb_pkt_completion(scsa2usbp, pkt);
4143 ASSERT(scsa2usbp->scsa2usb_cur_pkt == NULL);
4154 scsa2usb_state_t *scsa2usbp = (scsa2usb_state_t *)arg;
4158 mutex_enter(&scsa2usbp->scsa2usb_mutex);
4159 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
4161 (void *)scsa2usbp->scsa2usb_work_thread_id);
4163 ASSERT(scsa2usbp->scsa2usb_work_thread_id == (kthread_t *)1);
4164 scsa2usbp->scsa2usb_work_thread_id = curthread;
4167 while (scsa2usbp->scsa2usb_transport_busy) {
4168 cv_wait(&scsa2usbp->scsa2usb_transport_busy_cv,
4169 &scsa2usbp->scsa2usb_mutex);
4171 ASSERT(scsa2usbp->scsa2usb_ugen_open_count == 0);
4172 scsa2usbp->scsa2usb_transport_busy++;
4173 scsa2usbp->scsa2usb_busy_proc = curproc;
4175 scsa2usb_raise_power(scsa2usbp);
4178 (void) scsa2usb_open_usb_pipes(scsa2usbp);
4181 ASSERT(scsa2usbp->scsa2usb_ugen_open_count == 0);
4182 for (lun = 0; lun < scsa2usbp->scsa2usb_n_luns; lun++) {
4183 scsa2usb_transport_request(scsa2usbp, lun);
4188 &scsa2usbp->scsa2usb_waitQ[lun]);
4197 scsa2usbp->scsa2usb_work_thread_id = 0;
4199 ASSERT(scsa2usbp->scsa2usb_ugen_open_count == 0);
4201 scsa2usbp->scsa2usb_transport_busy--;
4202 scsa2usbp->scsa2usb_busy_proc = NULL;
4203 cv_signal(&scsa2usbp->scsa2usb_transport_busy_cv);
4205 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
4208 mutex_exit(&scsa2usbp->scsa2usb_mutex);
4210 scsa2usb_pm_idle_component(scsa2usbp);
4226 scsa2usb_flush_waitQ(scsa2usb_state_t *scsa2usbp, uint_t lun,
4233 mutex_enter(&scsa2usbp->scsa2usb_mutex);
4235 usba_move_list(&scsa2usbp->scsa2usb_waitQ[lun], &head,
4236 scsa2usbp->scsa2usb_dev_data->dev_iblock_cookie);
4237 mutex_exit(&scsa2usbp->scsa2usb_mutex);
4244 mutex_enter(&scsa2usbp->scsa2usb_mutex);
4245 scsa2usbp->scsa2usb_pkt_state = SCSA2USB_PKT_DO_COMP;
4246 scsa2usb_pkt_completion(scsa2usbp, pkt);
4247 mutex_exit(&scsa2usbp->scsa2usb_mutex);
4257 scsa2usb_do_inquiry(scsa2usb_state_t *scsa2usbp, uint_t target, uint_t lun)
4264 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
4268 if (!(scsa2usbp->scsa2usb_attrs & SCSA2USB_ATTRS_INQUIRY)) {
4269 scsa2usb_fake_inquiry(scsa2usbp,
4270 &scsa2usbp->scsa2usb_lun_inquiry[lun]);
4274 ASSERT(mutex_owned(&scsa2usbp->scsa2usb_mutex));
4277 ap.a_hba_tran = scsa2usbp->scsa2usb_tran;
4282 mutex_exit(&scsa2usbp->scsa2usb_mutex);
4285 mutex_enter(&scsa2usbp->scsa2usb_mutex);
4287 scsa2usbp->scsa2usb_log_handle,
4302 USB_DPRINTF_L3(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
4309 scsa2usbp->scsa2usb_log_handle,
4314 mutex_enter(&scsa2usbp->scsa2usb_mutex);
4315 scsa2usbp->scsa2usb_attrs &=
4317 scsa2usb_fake_inquiry(scsa2usbp,
4318 &scsa2usbp->scsa2usb_lun_inquiry[lun]);
4319 mutex_exit(&scsa2usbp->scsa2usb_mutex);
4325 mutex_enter(&scsa2usbp->scsa2usb_mutex);
4335 scsa2usb_fake_inquiry(scsa2usb_state_t *scsa2usbp, struct scsi_inquiry *inqp)
4337 usb_client_dev_data_t *dev_data = scsa2usbp->scsa2usb_dev_data;
4340 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
4392 scsa2usb_create_arq_pkt(scsa2usb_state_t *scsa2usbp, struct scsi_address *ap)
4397 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
4398 "scsa2usb_create_arq_pkt: scsa2usbp: %p, ap: %p",
4399 (void *)scsa2usbp, (void *)ap);
4401 ASSERT(mutex_owned(&scsa2usbp->scsa2usb_mutex));
4403 mutex_exit(&scsa2usbp->scsa2usb_mutex);
4406 mutex_enter(&scsa2usbp->scsa2usb_mutex);
4413 mutex_enter(&scsa2usbp->scsa2usb_mutex);
4420 scsa2usbp->scsa2usb_arq_cmd = arq_cmd;
4421 scsa2usbp->scsa2usb_arq_bp = bp;
4434 scsa2usb_delete_arq_pkt(scsa2usb_state_t *scsa2usbp)
4436 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
4438 (void *)scsa2usbp->scsa2usb_arq_cmd);
4440 ASSERT(mutex_owned(&scsa2usbp->scsa2usb_mutex));
4442 if (scsa2usbp->scsa2usb_arq_cmd != NULL) {
4443 scsi_destroy_pkt(scsa2usbp->scsa2usb_arq_cmd->cmd_pkt);
4444 scsi_free_consistent_buf(scsa2usbp->scsa2usb_arq_bp);
4446 scsa2usbp->scsa2usb_arq_cmd = NULL;
4447 scsa2usbp->scsa2usb_arq_bp = NULL;
4456 scsa2usb_complete_arq_pkt(scsa2usb_state_t *scsa2usbp,
4462 ASSERT(mutex_owned(&scsa2usbp->scsa2usb_mutex));
4479 scsa2usbp->scsa2usb_rcvd_not_ready = B_TRUE;
4494 scsa2usb_open_usb_pipes(scsa2usb_state_t *scsa2usbp)
4500 ASSERT(scsa2usbp);
4501 ASSERT(mutex_owned(&scsa2usbp->scsa2usb_mutex));
4503 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
4505 (void *)scsa2usbp->scsa2usb_dip, scsa2usbp->scsa2usb_flags);
4507 if (!(scsa2usbp->scsa2usb_flags & SCSA2USB_FLAGS_PIPES_OPENED)) {
4516 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
4519 mutex_exit(&scsa2usbp->scsa2usb_mutex);
4522 if ((rval = usb_pipe_open(scsa2usbp->scsa2usb_dip,
4523 &scsa2usbp->scsa2usb_bulkin_ept, &policy, USB_FLAGS_SLEEP,
4524 &scsa2usbp->scsa2usb_bulkin_pipe)) != USB_SUCCESS) {
4525 mutex_enter(&scsa2usbp->scsa2usb_mutex);
4527 scsa2usbp->scsa2usb_log_handle,
4535 if ((rval = usb_pipe_open(scsa2usbp->scsa2usb_dip,
4536 &scsa2usbp->scsa2usb_bulkout_ept, &policy, USB_FLAGS_SLEEP,
4537 &scsa2usbp->scsa2usb_bulkout_pipe)) != USB_SUCCESS) {
4538 usb_pipe_close(scsa2usbp->scsa2usb_dip,
4539 scsa2usbp->scsa2usb_bulkin_pipe,
4542 mutex_enter(&scsa2usbp->scsa2usb_mutex);
4543 scsa2usbp->scsa2usb_bulkin_pipe = NULL;
4546 scsa2usbp->scsa2usb_log_handle,
4553 mutex_enter(&scsa2usbp->scsa2usb_mutex);
4556 if (SCSA2USB_IS_CBI(scsa2usbp)) {
4557 mutex_exit(&scsa2usbp->scsa2usb_mutex);
4559 if ((rval = usb_pipe_open(scsa2usbp->scsa2usb_dip,
4560 &scsa2usbp->scsa2usb_intr_ept, &policy,
4561 USB_FLAGS_SLEEP, &scsa2usbp->scsa2usb_intr_pipe)) !=
4563 usb_pipe_close(scsa2usbp->scsa2usb_dip,
4564 scsa2usbp->scsa2usb_bulkin_pipe,
4567 usb_pipe_close(scsa2usbp->scsa2usb_dip,
4568 scsa2usbp->scsa2usb_bulkout_pipe,
4571 mutex_enter(&scsa2usbp->scsa2usb_mutex);
4572 scsa2usbp->scsa2usb_bulkin_pipe = NULL;
4573 scsa2usbp->scsa2usb_bulkout_pipe = NULL;
4576 scsa2usbp->scsa2usb_log_handle,
4583 mutex_enter(&scsa2usbp->scsa2usb_mutex);
4586 mutex_exit(&scsa2usbp->scsa2usb_mutex);
4589 if (usb_pipe_get_max_bulk_transfer_size(scsa2usbp->scsa2usb_dip,
4591 mutex_enter(&scsa2usbp->scsa2usb_mutex);
4592 scsa2usbp->scsa2usb_max_bulk_xfer_size = sz;
4594 mutex_enter(&scsa2usbp->scsa2usb_mutex);
4595 scsa2usbp->scsa2usb_max_bulk_xfer_size = DEV_BSIZE;
4599 scsa2usbp->scsa2usb_max_bulk_xfer_size = min(
4600 scsa2usbp->scsa2usb_max_bulk_xfer_size,
4603 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
4605 scsa2usbp->scsa2usb_max_bulk_xfer_size);
4608 scsa2usbp->scsa2usb_flags |= SCSA2USB_FLAGS_PIPES_OPENED;
4610 scsa2usbp->scsa2usb_pipe_state = SCSA2USB_PIPE_NORMAL;
4613 scsa2usbp->scsa2usb_pkt_state = SCSA2USB_PKT_NONE;
4625 scsa2usb_close_usb_pipes(scsa2usb_state_t *scsa2usbp)
4629 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
4631 (void *)scsa2usbp);
4633 ASSERT(scsa2usbp);
4634 ASSERT(mutex_owned(&scsa2usbp->scsa2usb_mutex));
4636 if ((scsa2usbp->scsa2usb_flags & SCSA2USB_FLAGS_PIPES_OPENED) == 0) {
4641 scsa2usbp->scsa2usb_pipe_state = SCSA2USB_PIPE_CLOSING;
4643 scsa2usbp->scsa2usb_flags &= ~SCSA2USB_FLAGS_PIPES_OPENED;
4645 mutex_exit(&scsa2usbp->scsa2usb_mutex);
4647 usb_pipe_close(scsa2usbp->scsa2usb_dip,
4648 scsa2usbp->scsa2usb_bulkout_pipe, flags, NULL, NULL);
4650 usb_pipe_close(scsa2usbp->scsa2usb_dip,
4651 scsa2usbp->scsa2usb_bulkin_pipe, flags, NULL, NULL);
4653 mutex_enter(&scsa2usbp->scsa2usb_mutex);
4654 if (SCSA2USB_IS_CBI(scsa2usbp)) {
4655 mutex_exit(&scsa2usbp->scsa2usb_mutex);
4656 usb_pipe_close(scsa2usbp->scsa2usb_dip,
4657 scsa2usbp->scsa2usb_intr_pipe, flags, NULL, NULL);
4658 mutex_enter(&scsa2usbp->scsa2usb_mutex);
4660 scsa2usbp->scsa2usb_bulkout_pipe = NULL;
4661 scsa2usbp->scsa2usb_bulkin_pipe = NULL;
4662 scsa2usbp->scsa2usb_intr_pipe = NULL;
4664 scsa2usbp->scsa2usb_pipe_state = SCSA2USB_PIPE_NORMAL;
4769 scsa2usb_bp_to_mblk(scsa2usb_state_t *scsa2usbp)
4774 scsa2usb_cmd_t *cmd = PKT2CMD(scsa2usbp->scsa2usb_cur_pkt);
4776 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
4779 ASSERT(scsa2usbp->scsa2usb_cur_pkt);
4780 ASSERT(mutex_owned(&scsa2usbp->scsa2usb_mutex));
4795 USB_DPRINTF_L3(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
4798 (void *)mp, (void *)bp, (void *)scsa2usbp->scsa2usb_cur_pkt,
4839 scsa2usb_handle_data_start(scsa2usb_state_t *scsa2usbp,
4851 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
4855 ASSERT(mutex_owned(&scsa2usbp->scsa2usb_mutex));
4869 mutex_exit(&scsa2usbp->scsa2usb_mutex);
4876 scsa2usbp->scsa2usb_bulkin_pipe, req, flags);
4877 mutex_enter(&scsa2usbp->scsa2usb_mutex);
4879 scsa2usbp->scsa2usb_log_handle, "rval = %x", rval);
4881 req2 = scsa2usb_init_bulk_req(scsa2usbp,
4885 mutex_exit(&scsa2usbp->scsa2usb_mutex);
4889 scsa2usbp->scsa2usb_bulkin_pipe, req2, flags);
4890 mutex_enter(&scsa2usbp->scsa2usb_mutex);
4893 scsa2usbp->scsa2usb_log_handle,
4907 scsa2usbp->scsa2usb_log_handle,
4909 scsa2usb_test_mblk(scsa2usbp, B_TRUE);
4916 ept_addr = scsa2usbp->scsa2usb_bulkin_ept.bEndpointAddress;
4920 mutex_exit(&scsa2usbp->scsa2usb_mutex);
4928 rval = usb_pipe_bulk_xfer(scsa2usbp->scsa2usb_bulkin_pipe,
4930 mutex_enter(&scsa2usbp->scsa2usb_mutex);
4944 mutex_exit(&scsa2usbp->scsa2usb_mutex);
4948 scsa2usbp->scsa2usb_bulkin_pipe, req, flags);
4949 mutex_enter(&scsa2usbp->scsa2usb_mutex);
4952 scsa2usbp->scsa2usb_log_handle,
4960 req->bulk_data = scsa2usb_bp_to_mblk(scsa2usbp);
4973 scsa2usbp->scsa2usb_log_handle, "TEST 11: Ho > Do");
4975 scsa2usb_test_mblk(scsa2usbp, B_FALSE);
4980 ept_addr = scsa2usbp->scsa2usb_bulkout_ept.bEndpointAddress;
4983 mutex_exit(&scsa2usbp->scsa2usb_mutex);
4986 rval = usb_pipe_bulk_xfer(scsa2usbp->scsa2usb_bulkout_pipe,
4988 mutex_enter(&scsa2usbp->scsa2usb_mutex);
4993 scsa2usbp->scsa2usb_log_handle,
5002 scsa2usbp, ept_addr,
5003 scsa2usbp-> scsa2usb_bulkin_pipe,
5007 scsa2usbp, ept_addr,
5008 scsa2usbp-> scsa2usb_bulkout_pipe,
5017 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
5032 scsa2usb_handle_data_done(scsa2usb_state_t *scsa2usbp,
5036 struct scsi_pkt *pkt = scsa2usbp->scsa2usb_cur_pkt;
5041 ASSERT(mutex_owned(&scsa2usbp->scsa2usb_mutex));
5043 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
5087 bzero(&scsa2usbp->scsa2usb_lun_inquiry
5091 &scsa2usbp->scsa2usb_lun_inquiry
5096 scsa2usbp->scsa2usb_log_handle,
5098 scsa2usbp->scsa2usb_lun_inquiry
5110 scsa2usbp->
5129 if (max_lba > 0 && (scsa2usbp->scsa2usb_attrs &
5143 scsa2usbp->scsa2usb_log_handle,
5146 scsa2usbp->
5156 scsa2usbp->scsa2usb_log_handle,
5166 scsa2usbp->scsa2usb_last_cmd.status = p[2];
5183 scsa2usbp->scsa2usb_log_handle,
5218 scsa2usb_init_bulk_req(scsa2usb_state_t *scsa2usbp, size_t length,
5223 ASSERT(mutex_owned(&scsa2usbp->scsa2usb_mutex));
5225 req = usb_alloc_bulk_req(scsa2usbp->scsa2usb_dip, length,
5231 req->bulk_client_private = (usb_opaque_t)scsa2usbp; /* statep */
5253 scsa2usb_clear_ept_stall(scsa2usb_state_t *scsa2usbp, uint_t ept_addr,
5257 dev_info_t *dip = scsa2usbp->scsa2usb_dip;
5259 ASSERT(mutex_owned(&scsa2usbp->scsa2usb_mutex));
5260 if (!(SCSA2USB_DEVICE_ACCESS_OK(scsa2usbp))) {
5265 mutex_exit(&scsa2usbp->scsa2usb_mutex);
5271 mutex_enter(&scsa2usbp->scsa2usb_mutex);
5272 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
5285 scsa2usb_pkt_completion(scsa2usb_state_t *scsa2usbp, struct scsi_pkt *pkt)
5291 ASSERT(mutex_owned(&scsa2usbp->scsa2usb_mutex));
5293 USB_DPRINTF_L3(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
5296 (void *)scsa2usbp, pkt->pkt_reason, *(pkt->pkt_scbp),
5314 if ((scsa2usbp->scsa2usb_cur_pkt == pkt) && !ddi_in_panic()) {
5315 SCSA2USB_RESET_CUR_PKT(scsa2usbp);
5317 len = sizeof (scsa2usbp->scsa2usb_last_cmd.cdb);
5318 bzero(scsa2usbp->scsa2usb_last_cmd.cdb, len);
5322 scsa2usbp->scsa2usb_log_handle,
5326 bcopy(pkt->pkt_cdbp, scsa2usbp->scsa2usb_last_cmd.cdb, len);
5331 scsa2usbp->scsa2usb_last_cmd.status = 0;
5338 scsa2usbp->scsa2usb_pkt_state = SCSA2USB_PKT_NONE;
5342 mutex_exit(&scsa2usbp->scsa2usb_mutex);
5344 mutex_enter(&scsa2usbp->scsa2usb_mutex);
5359 scsa2usb_state_t *scsa2usbp =
5365 ASSERT(scsa2usbp != NULL);
5367 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
5370 scsa2usb_restore_device_state(dip, scsa2usbp);
5372 USB_DPRINTF_L0(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
5388 mutex_enter(&scsa2usbp->scsa2usb_mutex);
5389 scsa2usbp->scsa2usb_warning_given = B_FALSE;
5390 mutex_exit(&scsa2usbp->scsa2usb_mutex);
5392 if (scsa2usbp->scsa2usb_ugen_hdl) {
5394 scsa2usbp->scsa2usb_ugen_hdl);
5406 scsa2usb_all_waitQs_empty(scsa2usb_state_t *scsa2usbp)
5412 &scsa2usbp->scsa2usb_waitQ[lun])) {
5429 scsa2usb_state_t *scsa2usbp =
5435 ASSERT(scsa2usbp != NULL);
5437 USB_DPRINTF_L4(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
5440 mutex_enter(&scsa2usbp->scsa2usb_mutex);
5441 scsa2usbp->scsa2usb_dev_state = USB_DEV_DISCONNECTED;
5448 if ((scsa2usbp->scsa2usb_work_thread_id == NULL) &&
5449 (scsa2usbp->scsa2usb_cur_pkt == NULL) &&
5450 (scsa2usb_all_waitQs_empty(scsa2usbp) ==
5455 mutex_exit(&scsa2usbp->scsa2usb_mutex);
5457 mutex_enter(&scsa2usbp->scsa2usb_mutex);
5459 mutex_exit(&scsa2usbp->scsa2usb_mutex);
5473 if (scsa2usbp->scsa2usb_ugen_hdl) {
5475 scsa2usbp->scsa2usb_ugen_hdl);
5490 scsa2usb_create_pm_components(dev_info_t *dip, scsa2usb_state_t *scsa2usbp)
5495 ASSERT(mutex_owned(&scsa2usbp->scsa2usb_mutex));
5497 USB_DPRINTF_L4(DPRINT_MASK_PM, scsa2usbp->scsa2usb_log_handle,
5498 "scsa2usb_create_pm_components: dip = 0x%p, scsa2usbp = 0x%p",
5499 (void *)dip, (void *)scsa2usbp);
5505 if ((scsa2usbp->scsa2usb_attrs & SCSA2USB_ATTRS_PM) == 0) {
5506 USB_DPRINTF_L2(DPRINT_MASK_PM, scsa2usbp->scsa2usb_log_handle,
5515 scsa2usbp->scsa2usb_pm = pm;
5517 mutex_exit(&scsa2usbp->scsa2usb_mutex);
5526 mutex_enter(&scsa2usbp->scsa2usb_mutex);
5528 scsa2usb_raise_power(scsa2usbp);
5529 mutex_exit(&scsa2usbp->scsa2usb_mutex);
5532 mutex_enter(&scsa2usbp->scsa2usb_mutex);
5541 scsa2usb_raise_power(scsa2usb_state_t *scsa2usbp)
5543 USB_DPRINTF_L4(DPRINT_MASK_PM, scsa2usbp->scsa2usb_log_handle,
5546 ASSERT(mutex_owned(&scsa2usbp->scsa2usb_mutex));
5548 if (scsa2usbp->scsa2usb_pm) {
5549 scsa2usb_pm_busy_component(scsa2usbp);
5550 if (scsa2usbp->scsa2usb_pm->scsa2usb_current_power !=
5552 mutex_exit(&scsa2usbp->scsa2usb_mutex);
5553 (void) pm_raise_power(scsa2usbp->scsa2usb_dip,
5555 mutex_enter(&scsa2usbp->scsa2usb_mutex);
5565 scsa2usb_pwrlvl0(scsa2usb_state_t *scsa2usbp)
5569 switch (scsa2usbp->scsa2usb_dev_state) {
5572 if (scsa2usbp->scsa2usb_pm->scsa2usb_pm_busy != 0) {
5580 scsa2usb_cbi_stop_intr_polling(scsa2usbp);
5583 rval = usb_set_device_pwrlvl3(scsa2usbp->scsa2usb_dip);
5586 scsa2usbp->scsa2usb_dev_state = USB_DEV_PWRED_DOWN;
5593 scsa2usbp->scsa2usb_pm->scsa2usb_current_power =
5602 scsa2usb_pwrlvl1(scsa2usb_state_t *scsa2usbp)
5607 rval = usb_set_device_pwrlvl2(scsa2usbp->scsa2usb_dip);
5615 scsa2usb_pwrlvl2(scsa2usb_state_t *scsa2usbp)
5620 rval = usb_set_device_pwrlvl1(scsa2usbp->scsa2usb_dip);
5628 scsa2usb_pwrlvl3(scsa2usb_state_t *scsa2usbp)
5637 if (scsa2usbp->scsa2usb_dev_state != USB_DEV_DISCONNECTED) {
5639 rval = usb_set_device_pwrlvl0(scsa2usbp->scsa2usb_dip);
5642 scsa2usbp->scsa2usb_dev_state = USB_DEV_ONLINE;
5644 scsa2usbp->scsa2usb_pm->scsa2usb_current_power = USB_DEV_OS_FULL_PWR;
5658 scsa2usb_state_t *scsa2usbp;
5662 scsa2usbp = ddi_get_soft_state(scsa2usb_statep, ddi_get_instance(dip));
5664 USB_DPRINTF_L3(DPRINT_MASK_PM, scsa2usbp->scsa2usb_log_handle,
5665 "scsa2usb_power: Begin scsa2usbp (%p): level = %d",
5666 (void *)scsa2usbp, level);
5668 mutex_enter(&scsa2usbp->scsa2usb_mutex);
5669 if (SCSA2USB_BUSY(scsa2usbp)) {
5670 USB_DPRINTF_L2(DPRINT_MASK_PM, scsa2usbp->scsa2usb_log_handle,
5672 mutex_exit(&scsa2usbp->scsa2usb_mutex);
5677 pm = scsa2usbp->scsa2usb_pm;
5679 USB_DPRINTF_L2(DPRINT_MASK_PM, scsa2usbp->scsa2usb_log_handle,
5681 mutex_exit(&scsa2usbp->scsa2usb_mutex);
5688 USB_DPRINTF_L2(DPRINT_MASK_PM, scsa2usbp->scsa2usb_log_handle,
5691 mutex_exit(&scsa2usbp->scsa2usb_mutex);
5698 rval = scsa2usb_pwrlvl0(scsa2usbp);
5701 rval = scsa2usb_pwrlvl1(scsa2usbp);
5704 rval = scsa2usb_pwrlvl2(scsa2usbp);
5707 rval = scsa2usb_pwrlvl3(scsa2usbp);
5711 mutex_exit(&scsa2usbp->scsa2usb_mutex);
5718 scsa2usb_pm_busy_component(scsa2usb_state_t *scsa2usbp)
5720 ASSERT(mutex_owned(&scsa2usbp->scsa2usb_mutex));
5722 if (scsa2usbp->scsa2usb_pm) {
5723 scsa2usbp->scsa2usb_pm->scsa2usb_pm_busy++;
5726 scsa2usbp->scsa2usb_log_handle,
5728 scsa2usbp->scsa2usb_pm->scsa2usb_pm_busy);
5730 mutex_exit(&scsa2usbp->scsa2usb_mutex);
5732 if (pm_busy_component(scsa2usbp->scsa2usb_dip, 0) !=
5734 mutex_enter(&scsa2usbp->scsa2usb_mutex);
5735 ASSERT(scsa2usbp->scsa2usb_pm->scsa2usb_pm_busy > 0);
5736 scsa2usbp->scsa2usb_pm->scsa2usb_pm_busy--;
5739 scsa2usbp->scsa2usb_log_handle,
5741 scsa2usbp->scsa2usb_pm->scsa2usb_pm_busy);
5745 mutex_enter(&scsa2usbp->scsa2usb_mutex);
5755 scsa2usb_pm_idle_component(scsa2usb_state_t *scsa2usbp)
5757 ASSERT(!mutex_owned(&scsa2usbp->scsa2usb_mutex));
5759 if (scsa2usbp->scsa2usb_pm) {
5760 if (pm_idle_component(scsa2usbp->scsa2usb_dip, 0) ==
5762 mutex_enter(&scsa2usbp->scsa2usb_mutex);
5763 ASSERT(scsa2usbp->scsa2usb_pm->scsa2usb_pm_busy > 0);
5764 scsa2usbp->scsa2usb_pm->scsa2usb_pm_busy--;
5767 scsa2usbp->scsa2usb_log_handle,
5769 scsa2usbp->scsa2usb_pm->scsa2usb_pm_busy);
5771 mutex_exit(&scsa2usbp->scsa2usb_mutex);
5783 scsa2usb_print_cdb(scsa2usb_state_t *scsa2usbp, scsa2usb_cmd_t *cmd)
5787 USB_DPRINTF_L3(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,
5805 scsa2usb_test_mblk(scsa2usb_state_t *scsa2usbp, boolean_t large)
5812 ASSERT(mutex_owned(&scsa2usbp->scsa2usb_mutex));
5817 req = scsa2usb_init_bulk_req(scsa2usbp, len,
5825 mutex_exit(&scsa2usbp->scsa2usb_mutex);
5827 rval = usb_pipe_bulk_xfer(scsa2usbp->scsa2usb_bulkout_pipe, req, flags);
5828 mutex_enter(&scsa2usbp->scsa2usb_mutex);
5830 USB_DPRINTF_L1(DPRINT_MASK_SCSA, scsa2usbp->scsa2usb_log_handle,