Lines Matching refs:sc
184 void umass_disco(struct umass_softc *sc);
187 usbd_status umass_polled_transfer(struct umass_softc *sc,
189 usbd_status umass_setup_transfer(struct umass_softc *sc,
193 usbd_status umass_setup_ctrl_transfer(struct umass_softc *sc,
197 void umass_clear_endpoint_stall(struct umass_softc *sc, int endpt,
201 void umass_reset(struct umass_softc *sc, transfer_cb_f cb, void *priv);
234 void umass_bbb_dump_cbw(struct umass_softc *sc,
236 void umass_bbb_dump_csw(struct umass_softc *sc,
238 void umass_dump_buffer(struct umass_softc *sc, u_int8_t *buffer,
293 struct umass_softc *sc = (struct umass_softc *)self; in umass_attach() local
302 sc->sc_udev = uaa->device; in umass_attach()
303 sc->sc_iface = uaa->iface; in umass_attach()
304 sc->sc_ifaceno = uaa->ifaceno; in umass_attach()
308 sc->sc_wire = quirk->uq_wire; in umass_attach()
309 sc->sc_cmd = quirk->uq_cmd; in umass_attach()
310 sc->sc_quirks = quirk->uq_flags; in umass_attach()
311 sc->sc_busquirks = quirk->uq_busquirks; in umass_attach()
314 (*quirk->uq_fixup)(sc); in umass_attach()
316 sc->sc_wire = UMASS_WPROTO_UNSPEC; in umass_attach()
317 sc->sc_cmd = UMASS_CPROTO_UNSPEC; in umass_attach()
318 sc->sc_quirks = 0; in umass_attach()
319 sc->sc_busquirks = 0; in umass_attach()
322 id = usbd_get_interface_descriptor(sc->sc_iface); in umass_attach()
326 if (sc->sc_wire == UMASS_WPROTO_UNSPEC) { in umass_attach()
329 sc->sc_wire = UMASS_WPROTO_CBI; in umass_attach()
332 sc->sc_wire = UMASS_WPROTO_CBI_I; in umass_attach()
336 sc->sc_wire = UMASS_WPROTO_BBB; in umass_attach()
341 sc->sc_dev.dv_xname, in umass_attach()
347 if (sc->sc_cmd == UMASS_CPROTO_UNSPEC) { in umass_attach()
350 sc->sc_cmd = UMASS_CPROTO_SCSI; in umass_attach()
353 sc->sc_cmd = UMASS_CPROTO_UFI; in umass_attach()
358 sc->sc_cmd = UMASS_CPROTO_ATAPI; in umass_attach()
361 sc->sc_cmd = UMASS_CPROTO_RBC; in umass_attach()
366 sc->sc_dev.dv_xname, in umass_attach()
372 switch (sc->sc_wire) { in umass_attach()
387 switch (sc->sc_cmd) { in umass_attach()
408 printf("%s: using %s over %s\n", sc->sc_dev.dv_xname, sCommand, in umass_attach()
412 err = (*quirk->uq_init)(sc); in umass_attach()
414 umass_disco(sc); in umass_attach()
431 ed = usbd_interface2endpoint_descriptor(sc->sc_iface, i); in umass_attach()
434 sc->sc_dev.dv_xname); in umass_attach()
439 sc->sc_epaddr[UMASS_BULKIN] = ed->bEndpointAddress; in umass_attach()
442 sc->sc_epaddr[UMASS_BULKOUT] = ed->bEndpointAddress; in umass_attach()
443 } else if (sc->sc_wire == UMASS_WPROTO_CBI_I in umass_attach()
446 sc->sc_epaddr[UMASS_INTRIN] = ed->bEndpointAddress; in umass_attach()
450 sc->sc_dev.dv_xname, in umass_attach()
458 if (!sc->sc_epaddr[UMASS_BULKIN] || !sc->sc_epaddr[UMASS_BULKOUT] || in umass_attach()
459 (sc->sc_wire == UMASS_WPROTO_CBI_I && in umass_attach()
460 !sc->sc_epaddr[UMASS_INTRIN])) { in umass_attach()
462 sc->sc_dev.dv_xname, sc->sc_epaddr[UMASS_BULKIN], in umass_attach()
463 sc->sc_epaddr[UMASS_BULKOUT], in umass_attach()
464 sc->sc_epaddr[UMASS_INTRIN])); in umass_attach()
471 if (sc->sc_wire == UMASS_WPROTO_BBB) { in umass_attach()
472 sc->maxlun = umass_bbb_get_max_lun(sc); in umass_attach()
474 sc->maxlun = 0; in umass_attach()
479 sc->sc_dev.dv_xname, sc->sc_iface, in umass_attach()
480 sc->sc_epaddr[UMASS_BULKOUT])); in umass_attach()
481 err = usbd_open_pipe(sc->sc_iface, sc->sc_epaddr[UMASS_BULKOUT], in umass_attach()
483 &sc->sc_pipe[UMASS_BULKOUT]); in umass_attach()
486 sc->sc_dev.dv_xname, sc->sc_epaddr[UMASS_BULKOUT])); in umass_attach()
487 umass_disco(sc); in umass_attach()
491 sc->sc_dev.dv_xname, sc->sc_iface, in umass_attach()
492 sc->sc_epaddr[UMASS_BULKIN])); in umass_attach()
493 err = usbd_open_pipe(sc->sc_iface, sc->sc_epaddr[UMASS_BULKIN], in umass_attach()
494 USBD_EXCLUSIVE_USE, &sc->sc_pipe[UMASS_BULKIN]); in umass_attach()
497 sc->sc_dev.dv_xname, sc->sc_epaddr[UMASS_BULKIN])); in umass_attach()
498 umass_disco(sc); in umass_attach()
513 if (sc->sc_wire == UMASS_WPROTO_CBI_I) { in umass_attach()
515 sc->sc_dev.dv_xname, sc->sc_iface, in umass_attach()
516 sc->sc_epaddr[UMASS_INTRIN])); in umass_attach()
517 err = usbd_open_pipe(sc->sc_iface, sc->sc_epaddr[UMASS_INTRIN], in umass_attach()
518 USBD_EXCLUSIVE_USE, &sc->sc_pipe[UMASS_INTRIN]); in umass_attach()
521 sc->sc_dev.dv_xname, in umass_attach()
522 sc->sc_epaddr[UMASS_INTRIN])); in umass_attach()
523 umass_disco(sc); in umass_attach()
529 sc->transfer_state = TSTATE_IDLE; in umass_attach()
533 sc->transfer_xfer[i] = usbd_alloc_xfer(uaa->device); in umass_attach()
534 if (sc->transfer_xfer[i] == NULL) { in umass_attach()
536 sc->sc_dev.dv_xname)); in umass_attach()
537 umass_disco(sc); in umass_attach()
542 switch (sc->sc_wire) { in umass_attach()
552 sc->data_buffer = usbd_alloc_buffer(sc->transfer_xfer[bno], in umass_attach()
554 if (sc->data_buffer == NULL) { in umass_attach()
555 umass_disco(sc); in umass_attach()
564 switch (sc->sc_wire) { in umass_attach()
566 sc->sc_methods = &umass_bbb_methods; in umass_attach()
570 sc->sc_methods = &umass_cbi_methods; in umass_attach()
573 umass_disco(sc); in umass_attach()
578 switch (sc->sc_cmd) { in umass_attach()
583 error = umass_scsi_attach(sc); in umass_attach()
587 printf("%s: isdata not configured\n", sc->sc_dev.dv_xname); in umass_attach()
592 sc->sc_dev.dv_xname, sc->sc_cmd); in umass_attach()
593 umass_disco(sc); in umass_attach()
597 printf("%s: bus attach failed\n", sc->sc_dev.dv_xname); in umass_attach()
598 umass_disco(sc); in umass_attach()
602 DPRINTF(UDMASS_GEN, ("%s: Attach finished\n", sc->sc_dev.dv_xname)); in umass_attach()
608 struct umass_softc *sc = (struct umass_softc *)self; in umass_detach() local
611 DPRINTF(UDMASS_USB, ("%s: detached\n", sc->sc_dev.dv_xname)); in umass_detach()
615 if (sc->sc_pipe[i] != NULL) in umass_detach()
616 usbd_abort_pipe(sc->sc_pipe[i]); in umass_detach()
621 if (--sc->sc_refcnt >= 0) { in umass_detach()
623 printf("%s: waiting for refcnt\n", sc->sc_dev.dv_xname); in umass_detach()
626 usb_detach_wait(&sc->sc_dev); in umass_detach()
630 if (sc->transfer_state != TSTATE_IDLE && sc->transfer_priv) { in umass_detach()
631 sc->transfer_state = TSTATE_IDLE; in umass_detach()
632 sc->transfer_cb(sc, sc->transfer_priv, in umass_detach()
633 sc->transfer_datalen, in umass_detach()
635 sc->transfer_priv = NULL; in umass_detach()
639 rv = umass_scsi_detach(sc, flags); in umass_detach()
643 umass_disco(sc); in umass_detach()
649 umass_disco(struct umass_softc *sc) in umass_disco() argument
657 if (sc->sc_pipe[i] != NULL) { in umass_disco()
658 usbd_close_pipe(sc->sc_pipe[i]); in umass_disco()
659 sc->sc_pipe[i] = NULL; in umass_disco()
664 usbd_abort_pipe(sc->sc_udev->default_pipe); in umass_disco()
668 if (sc->transfer_xfer[i] != NULL) { in umass_disco()
669 usbd_free_xfer(sc->transfer_xfer[i]); in umass_disco()
670 sc->transfer_xfer[i] = NULL; in umass_disco()
680 umass_polled_transfer(struct umass_softc *sc, struct usbd_xfer *xfer) in umass_polled_transfer() argument
684 if (usbd_is_dying(sc->sc_udev)) in umass_polled_transfer()
694 if (sc->polling_depth) { in umass_polled_transfer()
695 if (sc->next_polled_xfer) in umass_polled_transfer()
697 "pending\n", sc->sc_dev.dv_xname, xfer, in umass_polled_transfer()
698 sc->next_polled_xfer); in umass_polled_transfer()
701 sc->sc_dev.dv_xname, xfer)); in umass_polled_transfer()
702 sc->next_polled_xfer = xfer; in umass_polled_transfer()
707 sc->polling_depth++; in umass_polled_transfer()
711 sc->sc_dev.dv_xname, xfer)); in umass_polled_transfer()
713 if (err && err != USBD_IN_PROGRESS && sc->next_polled_xfer == NULL) { in umass_polled_transfer()
715 sc->sc_dev.dv_xname, usbd_errstr(err))); in umass_polled_transfer()
716 sc->polling_depth--; in umass_polled_transfer()
725 if (sc->next_polled_xfer != NULL) { in umass_polled_transfer()
727 "transaction %p\n", sc->next_polled_xfer)); in umass_polled_transfer()
728 xfer = sc->next_polled_xfer; in umass_polled_transfer()
729 sc->next_polled_xfer = NULL; in umass_polled_transfer()
733 sc->polling_depth--; in umass_polled_transfer()
739 umass_setup_transfer(struct umass_softc *sc, struct usbd_pipe *pipe, in umass_setup_transfer() argument
745 if (usbd_is_dying(sc->sc_udev)) in umass_setup_transfer()
750 usbd_setup_xfer(xfer, pipe, (void *)sc, buffer, buflen, in umass_setup_transfer()
751 flags | sc->sc_xfer_flags, sc->timeout, sc->sc_methods->wire_state); in umass_setup_transfer()
753 if (sc->sc_udev->bus->use_polling) { in umass_setup_transfer()
755 "buflen=%d flags=0x%x timeout=%d\n", sc->sc_dev.dv_xname, in umass_setup_transfer()
756 buffer, buflen, flags | sc->sc_xfer_flags, sc->timeout)); in umass_setup_transfer()
757 err = umass_polled_transfer(sc, xfer); in umass_setup_transfer()
761 "flags=0x%x timeout=%d\n", sc->sc_dev.dv_xname, in umass_setup_transfer()
762 buffer, buflen, flags | sc->sc_xfer_flags, sc->timeout)); in umass_setup_transfer()
766 sc->sc_dev.dv_xname, usbd_errstr(err))); in umass_setup_transfer()
775 umass_setup_ctrl_transfer(struct umass_softc *sc, usb_device_request_t *req, in umass_setup_ctrl_transfer() argument
780 if (usbd_is_dying(sc->sc_udev)) in umass_setup_ctrl_transfer()
785 usbd_setup_default_xfer(xfer, sc->sc_udev, (void *) sc, in umass_setup_ctrl_transfer()
787 flags | sc->sc_xfer_flags, sc->sc_methods->wire_state); in umass_setup_ctrl_transfer()
789 if (sc->sc_udev->bus->use_polling) { in umass_setup_ctrl_transfer()
791 "buflen=%d flags=0x%x\n", sc->sc_dev.dv_xname, buffer, in umass_setup_ctrl_transfer()
792 buflen, flags | sc->sc_xfer_flags)); in umass_setup_ctrl_transfer()
793 err = umass_polled_transfer(sc, xfer); in umass_setup_ctrl_transfer()
796 "flags=0x%x\n", sc->sc_dev.dv_xname, buffer, buflen, in umass_setup_ctrl_transfer()
797 flags | sc->sc_xfer_flags)); in umass_setup_ctrl_transfer()
802 sc->sc_dev.dv_xname, usbd_errstr(err))); in umass_setup_ctrl_transfer()
812 umass_adjust_transfer(struct umass_softc *sc) in umass_adjust_transfer() argument
814 switch (sc->sc_cmd) { in umass_adjust_transfer()
816 sc->cbw.bCDBLength = UFI_COMMAND_LENGTH; in umass_adjust_transfer()
818 switch (sc->cbw.CBWCDB[0]) { in umass_adjust_transfer()
820 if (sc->transfer_datalen > SID_SCSI2_HDRLEN + SID_SCSI2_ALEN) { in umass_adjust_transfer()
821 sc->transfer_datalen = SID_SCSI2_HDRLEN + SID_SCSI2_ALEN; in umass_adjust_transfer()
822 sc->cbw.CBWCDB[4] = sc->transfer_datalen; in umass_adjust_transfer()
826 if (sc->transfer_datalen > 8) { in umass_adjust_transfer()
827 sc->transfer_datalen = 8; in umass_adjust_transfer()
828 sc->cbw.CBWCDB[7] = 0; in umass_adjust_transfer()
829 sc->cbw.CBWCDB[8] = 8; in umass_adjust_transfer()
833 if (sc->transfer_datalen > 18) { in umass_adjust_transfer()
834 sc->transfer_datalen = 18; in umass_adjust_transfer()
835 sc->cbw.CBWCDB[4] = 18; in umass_adjust_transfer()
841 sc->cbw.bCDBLength = UFI_COMMAND_LENGTH; in umass_adjust_transfer()
847 umass_clear_endpoint_stall(struct umass_softc *sc, int endpt, in umass_clear_endpoint_stall() argument
850 if (usbd_is_dying(sc->sc_udev)) in umass_clear_endpoint_stall()
854 sc->sc_dev.dv_xname, sc->sc_epaddr[endpt])); in umass_clear_endpoint_stall()
856 usbd_clear_endpoint_toggle(sc->sc_pipe[endpt]); in umass_clear_endpoint_stall()
858 sc->sc_req.bmRequestType = UT_WRITE_ENDPOINT; in umass_clear_endpoint_stall()
859 sc->sc_req.bRequest = UR_CLEAR_FEATURE; in umass_clear_endpoint_stall()
860 USETW(sc->sc_req.wValue, UF_ENDPOINT_HALT); in umass_clear_endpoint_stall()
861 USETW(sc->sc_req.wIndex, sc->sc_epaddr[endpt]); in umass_clear_endpoint_stall()
862 USETW(sc->sc_req.wLength, 0); in umass_clear_endpoint_stall()
863 umass_setup_ctrl_transfer(sc, &sc->sc_req, NULL, 0, 0, xfer); in umass_clear_endpoint_stall()
868 umass_reset(struct umass_softc *sc, transfer_cb_f cb, void *priv)
870 sc->transfer_cb = cb;
871 sc->transfer_priv = priv;
874 sc->reset(sc, STATUS_CMD_OK);
883 umass_bbb_reset(struct umass_softc *sc, int status) in umass_bbb_reset() argument
885 if (usbd_is_dying(sc->sc_udev)) in umass_bbb_reset()
905 sc->sc_dev.dv_xname)); in umass_bbb_reset()
907 sc->transfer_state = TSTATE_BBB_RESET1; in umass_bbb_reset()
908 sc->transfer_status = status; in umass_bbb_reset()
911 sc->sc_req.bmRequestType = UT_WRITE_CLASS_INTERFACE; in umass_bbb_reset()
912 sc->sc_req.bRequest = UR_BBB_RESET; in umass_bbb_reset()
913 USETW(sc->sc_req.wValue, 0); in umass_bbb_reset()
914 USETW(sc->sc_req.wIndex, sc->sc_ifaceno); in umass_bbb_reset()
915 USETW(sc->sc_req.wLength, 0); in umass_bbb_reset()
916 umass_setup_ctrl_transfer(sc, &sc->sc_req, NULL, 0, 0, in umass_bbb_reset()
917 sc->transfer_xfer[XFER_BBB_RESET1]); in umass_bbb_reset()
921 umass_bbb_transfer(struct umass_softc *sc, int lun, void *cmd, int cmdlen, in umass_bbb_transfer() argument
929 sc->sc_dev.dv_xname, *(u_char *)cmd)); in umass_bbb_transfer()
931 if (usbd_is_dying(sc->sc_udev)) { in umass_bbb_transfer()
932 sc->polled_xfer_status = USBD_IOERROR; in umass_bbb_transfer()
937 sc->timeout = timeout + USBD_DEFAULT_TIMEOUT; in umass_bbb_transfer()
980 USETDW(sc->cbw.dCBWSignature, CBWSIGNATURE); in umass_bbb_transfer()
981 USETDW(sc->cbw.dCBWTag, dCBWtag); in umass_bbb_transfer()
983 USETDW(sc->cbw.dCBWDataTransferLength, datalen); in umass_bbb_transfer()
985 sc->cbw.bCBWFlags = (dir == DIR_IN? CBWFLAGS_IN:CBWFLAGS_OUT); in umass_bbb_transfer()
986 sc->cbw.bCBWLUN = lun; in umass_bbb_transfer()
987 sc->cbw.bCDBLength = cmdlen; in umass_bbb_transfer()
988 bzero(sc->cbw.CBWCDB, sizeof(sc->cbw.CBWCDB)); in umass_bbb_transfer()
989 memcpy(sc->cbw.CBWCDB, cmd, cmdlen); in umass_bbb_transfer()
991 DIF(UDMASS_BBB, umass_bbb_dump_cbw(sc, &sc->cbw)); in umass_bbb_transfer()
994 sc->transfer_dir = dir; in umass_bbb_transfer()
995 sc->transfer_data = data; in umass_bbb_transfer()
996 sc->transfer_datalen = datalen; in umass_bbb_transfer()
997 sc->transfer_actlen = 0; in umass_bbb_transfer()
998 sc->transfer_cb = cb; in umass_bbb_transfer()
999 sc->transfer_priv = priv; in umass_bbb_transfer()
1000 sc->transfer_status = STATUS_CMD_OK; in umass_bbb_transfer()
1003 sc->transfer_state = TSTATE_BBB_COMMAND; in umass_bbb_transfer()
1006 umass_adjust_transfer(sc); in umass_bbb_transfer()
1007 if ((err = umass_setup_transfer(sc, sc->sc_pipe[UMASS_BULKOUT], in umass_bbb_transfer()
1008 &sc->cbw, UMASS_BBB_CBW_SIZE, 0, in umass_bbb_transfer()
1009 sc->transfer_xfer[XFER_BBB_CBW]))) in umass_bbb_transfer()
1010 umass_bbb_reset(sc, STATUS_WIRE_FAILED); in umass_bbb_transfer()
1012 if (sc->sc_udev->bus->use_polling) in umass_bbb_transfer()
1013 sc->polled_xfer_status = err; in umass_bbb_transfer()
1019 struct umass_softc *sc = (struct umass_softc *) priv; in umass_bbb_state() local
1022 if (usbd_is_dying(sc->sc_udev)) in umass_bbb_state()
1037 sc->sc_dev.dv_xname, sc->transfer_state, in umass_bbb_state()
1038 states[sc->transfer_state], xfer, usbd_errstr(err))); in umass_bbb_state()
1040 switch (sc->transfer_state) { in umass_bbb_state()
1047 sc->sc_dev.dv_xname)); in umass_bbb_state()
1052 umass_bbb_reset(sc, STATUS_WIRE_FAILED); in umass_bbb_state()
1057 sc->transfer_state = TSTATE_BBB_DATA; in umass_bbb_state()
1058 if (sc->transfer_dir == DIR_IN) { in umass_bbb_state()
1059 if (umass_setup_transfer(sc, sc->sc_pipe[UMASS_BULKIN], in umass_bbb_state()
1060 sc->data_buffer, sc->transfer_datalen, in umass_bbb_state()
1062 sc->transfer_xfer[XFER_BBB_DATA])) in umass_bbb_state()
1063 umass_bbb_reset(sc, STATUS_WIRE_FAILED); in umass_bbb_state()
1066 } else if (sc->transfer_dir == DIR_OUT) { in umass_bbb_state()
1067 memcpy(sc->data_buffer, sc->transfer_data, in umass_bbb_state()
1068 sc->transfer_datalen); in umass_bbb_state()
1069 if (umass_setup_transfer(sc, sc->sc_pipe[UMASS_BULKOUT], in umass_bbb_state()
1070 sc->data_buffer, sc->transfer_datalen, in umass_bbb_state()
1072 sc->transfer_xfer[XFER_BBB_DATA])) in umass_bbb_state()
1073 umass_bbb_reset(sc, STATUS_WIRE_FAILED); in umass_bbb_state()
1078 sc->sc_dev.dv_xname)); in umass_bbb_state()
1085 if (sc->transfer_dir != DIR_NONE) { in umass_bbb_state()
1088 &sc->transfer_actlen, NULL); in umass_bbb_state()
1090 sc->sc_dev.dv_xname, sc->transfer_actlen)); in umass_bbb_state()
1094 "%s\n", sc->sc_dev.dv_xname, in umass_bbb_state()
1095 (sc->transfer_dir == DIR_IN?"in":"out"), in umass_bbb_state()
1096 sc->transfer_datalen,usbd_errstr(err))); in umass_bbb_state()
1099 sc->transfer_state = TSTATE_BBB_DCLEAR; in umass_bbb_state()
1100 umass_clear_endpoint_stall(sc, in umass_bbb_state()
1101 (sc->transfer_dir == DIR_IN? in umass_bbb_state()
1103 sc->transfer_xfer[XFER_BBB_DCLEAR]); in umass_bbb_state()
1108 umass_bbb_reset(sc,STATUS_WIRE_FAILED); in umass_bbb_state()
1116 DIF(UDMASS_BBB, if (sc->transfer_dir == DIR_IN) in umass_bbb_state()
1117 umass_dump_buffer(sc, sc->data_buffer, in umass_bbb_state()
1118 sc->transfer_datalen, 48)); in umass_bbb_state()
1130 " failed, %s\n", sc->sc_dev.dv_xname, in umass_bbb_state()
1131 (sc->transfer_dir == DIR_IN? "in":"out"), in umass_bbb_state()
1133 umass_bbb_reset(sc, STATUS_WIRE_FAILED); in umass_bbb_state()
1138 if (sc->transfer_state == TSTATE_BBB_COMMAND || in umass_bbb_state()
1139 sc->transfer_state == TSTATE_BBB_DATA || in umass_bbb_state()
1140 sc->transfer_state == TSTATE_BBB_DCLEAR) { in umass_bbb_state()
1144 sc->transfer_state = TSTATE_BBB_STATUS1; in umass_bbb_state()
1145 next_xfer = sc->transfer_xfer[XFER_BBB_CSW1]; in umass_bbb_state()
1148 sc->transfer_state = TSTATE_BBB_STATUS2; in umass_bbb_state()
1149 next_xfer = sc->transfer_xfer[XFER_BBB_CSW2]; in umass_bbb_state()
1153 if (umass_setup_transfer(sc, sc->sc_pipe[UMASS_BULKIN], in umass_bbb_state()
1154 &sc->csw, UMASS_BBB_CSW_SIZE, 0, next_xfer)) { in umass_bbb_state()
1155 umass_bbb_reset(sc, STATUS_WIRE_FAILED); in umass_bbb_state()
1165 sc->sc_dev.dv_xname, usbd_errstr(err), in umass_bbb_state()
1166 (sc->transfer_state == TSTATE_BBB_STATUS1? in umass_bbb_state()
1172 if (sc->transfer_state == TSTATE_BBB_STATUS1) { in umass_bbb_state()
1173 sc->transfer_state = TSTATE_BBB_SCLEAR; in umass_bbb_state()
1174 umass_clear_endpoint_stall(sc, UMASS_BULKIN, in umass_bbb_state()
1175 sc->transfer_xfer[XFER_BBB_SCLEAR]); in umass_bbb_state()
1178 umass_bbb_reset(sc, STATUS_WIRE_FAILED); in umass_bbb_state()
1183 DIF(UDMASS_BBB, umass_bbb_dump_csw(sc, &sc->csw)); in umass_bbb_state()
1186 if ((sc->sc_quirks & UMASS_QUIRK_WRONG_CSWSIG) && in umass_bbb_state()
1187 UGETDW(sc->csw.dCSWSignature) == CSWSIGNATURE_OLYMPUS_C1) in umass_bbb_state()
1188 USETDW(sc->csw.dCSWSignature, CSWSIGNATURE); in umass_bbb_state()
1191 if (sc->sc_quirks & UMASS_QUIRK_WRONG_CSWTAG) in umass_bbb_state()
1192 USETDW(sc->csw.dCSWTag, UGETDW(sc->cbw.dCBWTag)); in umass_bbb_state()
1195 if (UGETDW(sc->csw.dCSWSignature) != CSWSIGNATURE) { in umass_bbb_state()
1200 sc->sc_dev.dv_xname, in umass_bbb_state()
1201 UGETDW(sc->csw.dCSWSignature), in umass_bbb_state()
1204 umass_bbb_reset(sc, STATUS_WIRE_FAILED); in umass_bbb_state()
1206 } else if (UGETDW(sc->csw.dCSWTag) in umass_bbb_state()
1207 != UGETDW(sc->cbw.dCBWTag)) { in umass_bbb_state()
1209 sc->sc_dev.dv_xname, in umass_bbb_state()
1210 UGETDW(sc->csw.dCSWTag), in umass_bbb_state()
1211 UGETDW(sc->cbw.dCBWTag)); in umass_bbb_state()
1213 umass_bbb_reset(sc, STATUS_WIRE_FAILED); in umass_bbb_state()
1217 } else if (sc->csw.bCSWStatus > CSWSTATUS_PHASE) { in umass_bbb_state()
1219 sc->sc_dev.dv_xname, in umass_bbb_state()
1220 sc->csw.bCSWStatus, in umass_bbb_state()
1223 umass_bbb_reset(sc, STATUS_WIRE_FAILED); in umass_bbb_state()
1225 } else if (sc->csw.bCSWStatus == CSWSTATUS_PHASE) { in umass_bbb_state()
1227 sc->sc_dev.dv_xname, in umass_bbb_state()
1228 UGETDW(sc->csw.dCSWDataResidue)); in umass_bbb_state()
1230 umass_bbb_reset(sc, STATUS_WIRE_FAILED); in umass_bbb_state()
1233 } else if (sc->transfer_actlen > sc->transfer_datalen) { in umass_bbb_state()
1236 sc->sc_dev.dv_xname, in umass_bbb_state()
1237 sc->transfer_actlen, sc->transfer_datalen); in umass_bbb_state()
1239 } else if (sc->transfer_datalen - sc->transfer_actlen in umass_bbb_state()
1240 != UGETDW(sc->csw.dCSWDataResidue)) { in umass_bbb_state()
1242 sc->sc_dev.dv_xname, in umass_bbb_state()
1243 sc->transfer_datalen - sc->transfer_actlen, in umass_bbb_state()
1244 UGETDW(sc->csw.dCSWDataResidue))); in umass_bbb_state()
1246 umass_bbb_reset(sc, STATUS_WIRE_FAILED); in umass_bbb_state()
1249 } else if (sc->csw.bCSWStatus == CSWSTATUS_FAILED) { in umass_bbb_state()
1251 sc->sc_dev.dv_xname, in umass_bbb_state()
1252 UGETDW(sc->csw.dCSWDataResidue))); in umass_bbb_state()
1255 sc->transfer_state = TSTATE_IDLE; in umass_bbb_state()
1256 sc->transfer_cb(sc, sc->transfer_priv, in umass_bbb_state()
1257 UGETDW(sc->csw.dCSWDataResidue), in umass_bbb_state()
1263 u_int32_t residue = UGETDW(sc->csw.dCSWDataResidue); in umass_bbb_state()
1264 sc->transfer_state = TSTATE_IDLE; in umass_bbb_state()
1265 if (sc->transfer_dir == DIR_IN) { in umass_bbb_state()
1266 if (residue == sc->transfer_datalen) { in umass_bbb_state()
1267 if (sc->cbw.CBWCDB[0] == INQUIRY) in umass_bbb_state()
1268 SET(sc->sc_quirks, in umass_bbb_state()
1270 if (ISSET(sc->sc_quirks, in umass_bbb_state()
1272 USETDW(sc->csw.dCSWDataResidue, 0); in umass_bbb_state()
1274 sc->transfer_actlen = sc->transfer_datalen - in umass_bbb_state()
1275 UGETDW(sc->csw.dCSWDataResidue); in umass_bbb_state()
1276 memcpy(sc->transfer_data, sc->data_buffer, in umass_bbb_state()
1277 sc->transfer_actlen); in umass_bbb_state()
1279 sc->transfer_cb(sc, sc->transfer_priv, in umass_bbb_state()
1280 UGETDW(sc->csw.dCSWDataResidue), in umass_bbb_state()
1290 sc->sc_dev.dv_xname, usbd_errstr(err))); in umass_bbb_state()
1292 sc->transfer_state = TSTATE_BBB_RESET2; in umass_bbb_state()
1293 umass_clear_endpoint_stall(sc, UMASS_BULKIN, in umass_bbb_state()
1294 sc->transfer_xfer[XFER_BBB_RESET2]); in umass_bbb_state()
1300 " failed, %s\n", sc->sc_dev.dv_xname, in umass_bbb_state()
1304 sc->transfer_state = TSTATE_BBB_RESET3; in umass_bbb_state()
1305 umass_clear_endpoint_stall(sc, UMASS_BULKOUT, in umass_bbb_state()
1306 sc->transfer_xfer[XFER_BBB_RESET3]); in umass_bbb_state()
1312 " failed, %s\n", sc->sc_dev.dv_xname, in umass_bbb_state()
1316 sc->transfer_state = TSTATE_IDLE; in umass_bbb_state()
1317 if (sc->transfer_priv) { in umass_bbb_state()
1318 sc->transfer_cb(sc, sc->transfer_priv, in umass_bbb_state()
1319 sc->transfer_datalen, in umass_bbb_state()
1320 sc->transfer_status); in umass_bbb_state()
1328 sc->sc_dev.dv_xname, sc->transfer_state); in umass_bbb_state()
1337 umass_cbi_adsc(struct umass_softc *sc, char *buffer, int buflen, in umass_cbi_adsc() argument
1340 sc->sc_req.bmRequestType = UT_WRITE_CLASS_INTERFACE; in umass_cbi_adsc()
1341 sc->sc_req.bRequest = UR_CBI_ADSC; in umass_cbi_adsc()
1342 USETW(sc->sc_req.wValue, 0); in umass_cbi_adsc()
1343 USETW(sc->sc_req.wIndex, sc->sc_ifaceno); in umass_cbi_adsc()
1344 USETW(sc->sc_req.wLength, buflen); in umass_cbi_adsc()
1345 return umass_setup_ctrl_transfer(sc, &sc->sc_req, buffer, in umass_cbi_adsc()
1351 umass_cbi_reset(struct umass_softc *sc, int status) in umass_cbi_reset() argument
1356 if (usbd_is_dying(sc->sc_udev)) in umass_cbi_reset()
1374 sc->sc_dev.dv_xname)); in umass_cbi_reset()
1376 sc->transfer_state = TSTATE_CBI_RESET1; in umass_cbi_reset()
1377 sc->transfer_status = status; in umass_cbi_reset()
1383 sc->cbl[0] = 0x1d; /* Command Block Reset */ in umass_cbi_reset()
1384 sc->cbl[1] = 0x04; in umass_cbi_reset()
1386 sc->cbl[i] = 0xff; in umass_cbi_reset()
1388 umass_cbi_adsc(sc, sc->cbl, SEND_DIAGNOSTIC_CMDLEN, in umass_cbi_reset()
1389 sc->transfer_xfer[XFER_CBI_RESET1]); in umass_cbi_reset()
1394 umass_cbi_transfer(struct umass_softc *sc, int lun, in umass_cbi_transfer() argument
1401 sc->sc_dev.dv_xname, *(u_char *)cmd, datalen)); in umass_cbi_transfer()
1403 if (usbd_is_dying(sc->sc_udev)) { in umass_cbi_transfer()
1404 sc->polled_xfer_status = USBD_IOERROR; in umass_cbi_transfer()
1409 sc->timeout = timeout + USBD_DEFAULT_TIMEOUT; in umass_cbi_transfer()
1429 sc->transfer_dir = dir; in umass_cbi_transfer()
1430 sc->transfer_data = data; in umass_cbi_transfer()
1431 sc->transfer_datalen = datalen; in umass_cbi_transfer()
1432 sc->transfer_actlen = 0; in umass_cbi_transfer()
1433 sc->transfer_cb = cb; in umass_cbi_transfer()
1434 sc->transfer_priv = priv; in umass_cbi_transfer()
1435 sc->transfer_status = STATUS_CMD_OK; in umass_cbi_transfer()
1438 sc->transfer_state = TSTATE_CBI_COMMAND; in umass_cbi_transfer()
1441 sc->cbw.bCDBLength = cmdlen; in umass_cbi_transfer()
1442 bzero(sc->cbw.CBWCDB, sizeof(sc->cbw.CBWCDB)); in umass_cbi_transfer()
1443 memcpy(sc->cbw.CBWCDB, cmd, cmdlen); in umass_cbi_transfer()
1444 umass_adjust_transfer(sc); in umass_cbi_transfer()
1445 if ((err = umass_cbi_adsc(sc, (void *)sc->cbw.CBWCDB, sc->cbw.bCDBLength, in umass_cbi_transfer()
1446 sc->transfer_xfer[XFER_CBI_CB]))) in umass_cbi_transfer()
1447 umass_cbi_reset(sc, STATUS_WIRE_FAILED); in umass_cbi_transfer()
1449 if (sc->sc_udev->bus->use_polling) in umass_cbi_transfer()
1450 sc->polled_xfer_status = err; in umass_cbi_transfer()
1456 struct umass_softc *sc = (struct umass_softc *) priv; in umass_cbi_state() local
1458 if (usbd_is_dying(sc->sc_udev)) in umass_cbi_state()
1466 sc->sc_dev.dv_xname, sc->transfer_state, in umass_cbi_state()
1467 states[sc->transfer_state], xfer, usbd_errstr(err))); in umass_cbi_state()
1469 switch (sc->transfer_state) { in umass_cbi_state()
1475 sc->sc_dev.dv_xname)); in umass_cbi_state()
1485 sc->transfer_state = TSTATE_IDLE; in umass_cbi_state()
1486 sc->transfer_cb(sc, sc->transfer_priv, in umass_cbi_state()
1487 sc->transfer_datalen, in umass_cbi_state()
1493 sc->sc_dev.dv_xname)); in umass_cbi_state()
1494 umass_cbi_reset(sc, STATUS_WIRE_FAILED); in umass_cbi_state()
1499 sc->transfer_state = TSTATE_CBI_DATA; in umass_cbi_state()
1500 if (sc->transfer_dir == DIR_IN) { in umass_cbi_state()
1501 if (umass_setup_transfer(sc, sc->sc_pipe[UMASS_BULKIN], in umass_cbi_state()
1502 sc->data_buffer, sc->transfer_datalen, in umass_cbi_state()
1504 sc->transfer_xfer[XFER_CBI_DATA])) in umass_cbi_state()
1505 umass_cbi_reset(sc, STATUS_WIRE_FAILED); in umass_cbi_state()
1508 } else if (sc->transfer_dir == DIR_OUT) { in umass_cbi_state()
1509 memcpy(sc->data_buffer, sc->transfer_data, in umass_cbi_state()
1510 sc->transfer_datalen); in umass_cbi_state()
1511 if (umass_setup_transfer(sc, sc->sc_pipe[UMASS_BULKOUT], in umass_cbi_state()
1512 sc->data_buffer, sc->transfer_datalen, in umass_cbi_state()
1514 sc->transfer_xfer[XFER_CBI_DATA])) in umass_cbi_state()
1515 umass_cbi_reset(sc, STATUS_WIRE_FAILED); in umass_cbi_state()
1520 sc->sc_dev.dv_xname)); in umass_cbi_state()
1527 if (sc->transfer_dir != DIR_NONE) { in umass_cbi_state()
1530 &sc->transfer_actlen, NULL); in umass_cbi_state()
1532 sc->sc_dev.dv_xname, sc->transfer_actlen)); in umass_cbi_state()
1536 "%s\n", sc->sc_dev.dv_xname, in umass_cbi_state()
1537 (sc->transfer_dir == DIR_IN?"in":"out"), in umass_cbi_state()
1538 sc->transfer_datalen,usbd_errstr(err))); in umass_cbi_state()
1541 sc->transfer_state = TSTATE_CBI_DCLEAR; in umass_cbi_state()
1542 umass_clear_endpoint_stall(sc, in umass_cbi_state()
1543 (sc->transfer_dir == DIR_IN? in umass_cbi_state()
1545 sc->transfer_xfer[XFER_CBI_DCLEAR]); in umass_cbi_state()
1550 umass_cbi_reset(sc, STATUS_WIRE_FAILED); in umass_cbi_state()
1556 if (sc->transfer_dir == DIR_IN) in umass_cbi_state()
1557 memcpy(sc->transfer_data, sc->data_buffer, in umass_cbi_state()
1558 sc->transfer_actlen); in umass_cbi_state()
1560 DIF(UDMASS_CBI, if (sc->transfer_dir == DIR_IN) in umass_cbi_state()
1561 umass_dump_buffer(sc, sc->transfer_data, in umass_cbi_state()
1562 sc->transfer_actlen, 48)); in umass_cbi_state()
1565 if (sc->sc_wire == UMASS_WPROTO_CBI_I) { in umass_cbi_state()
1566 sc->transfer_state = TSTATE_CBI_STATUS; in umass_cbi_state()
1567 memset(&sc->sbl, 0, sizeof(sc->sbl)); in umass_cbi_state()
1568 if (umass_setup_transfer(sc, sc->sc_pipe[UMASS_INTRIN], in umass_cbi_state()
1569 &sc->sbl, sizeof(sc->sbl), in umass_cbi_state()
1571 sc->transfer_xfer[XFER_CBI_STATUS])) in umass_cbi_state()
1572 umass_cbi_reset(sc, STATUS_WIRE_FAILED); in umass_cbi_state()
1577 sc->transfer_state = TSTATE_IDLE; in umass_cbi_state()
1578 sc->transfer_cb(sc, sc->transfer_priv, in umass_cbi_state()
1579 sc->transfer_datalen - sc->transfer_actlen, in umass_cbi_state()
1587 sc->sc_dev.dv_xname)); in umass_cbi_state()
1592 sc->transfer_state = TSTATE_CBI_SCLEAR; in umass_cbi_state()
1593 umass_clear_endpoint_stall(sc, UMASS_INTRIN, in umass_cbi_state()
1594 sc->transfer_xfer[XFER_CBI_SCLEAR]); in umass_cbi_state()
1596 umass_cbi_reset(sc, STATUS_WIRE_FAILED); in umass_cbi_state()
1607 sc->sc_dev.dv_xname, actlen)); in umass_cbi_state()
1612 if (sc->sc_cmd == UMASS_CPROTO_UFI) { in umass_cbi_state()
1622 sc->sc_dev.dv_xname, in umass_cbi_state()
1623 sc->sbl.ufi.asc, sc->sbl.ufi.ascq)); in umass_cbi_state()
1625 if ((sc->sbl.ufi.asc == 0 && sc->sbl.ufi.ascq == 0) || in umass_cbi_state()
1626 sc->sc_sense) in umass_cbi_state()
1632 sc->transfer_state = TSTATE_IDLE; in umass_cbi_state()
1633 sc->transfer_cb(sc, sc->transfer_priv, in umass_cbi_state()
1634 sc->transfer_datalen - sc->transfer_actlen, status); in umass_cbi_state()
1639 sc->sc_dev.dv_xname, in umass_cbi_state()
1640 sc->sbl.common.type, sc->sbl.common.value)); in umass_cbi_state()
1642 if (sc->sbl.common.type == IDB_TYPE_CCI) { in umass_cbi_state()
1644 switch (sc->sbl.common.value & in umass_cbi_state()
1659 sc->transfer_state = TSTATE_IDLE; in umass_cbi_state()
1660 sc->transfer_cb(sc, sc->transfer_priv, in umass_cbi_state()
1661 sc->transfer_datalen - sc->transfer_actlen, in umass_cbi_state()
1670 sc->sc_dev.dv_xname, usbd_errstr(err)); in umass_cbi_state()
1671 umass_cbi_reset(sc, STATUS_WIRE_FAILED); in umass_cbi_state()
1673 sc->transfer_state = TSTATE_IDLE; in umass_cbi_state()
1674 sc->transfer_cb(sc, sc->transfer_priv, in umass_cbi_state()
1675 sc->transfer_datalen, STATUS_CMD_FAILED); in umass_cbi_state()
1682 sc->sc_dev.dv_xname, usbd_errstr(err)); in umass_cbi_state()
1683 umass_cbi_reset(sc, STATUS_WIRE_FAILED); in umass_cbi_state()
1685 sc->transfer_state = TSTATE_IDLE; in umass_cbi_state()
1686 sc->transfer_cb(sc, sc->transfer_priv, in umass_cbi_state()
1687 sc->transfer_datalen, STATUS_CMD_FAILED); in umass_cbi_state()
1695 sc->sc_dev.dv_xname, usbd_errstr(err)); in umass_cbi_state()
1697 sc->transfer_state = TSTATE_CBI_RESET2; in umass_cbi_state()
1698 umass_clear_endpoint_stall(sc, UMASS_BULKIN, in umass_cbi_state()
1699 sc->transfer_xfer[XFER_CBI_RESET2]); in umass_cbi_state()
1705 sc->sc_dev.dv_xname, usbd_errstr(err)); in umass_cbi_state()
1708 sc->transfer_state = TSTATE_CBI_RESET3; in umass_cbi_state()
1709 umass_clear_endpoint_stall(sc, UMASS_BULKOUT, in umass_cbi_state()
1710 sc->transfer_xfer[XFER_CBI_RESET3]); in umass_cbi_state()
1716 sc->sc_dev.dv_xname, usbd_errstr(err)); in umass_cbi_state()
1719 sc->transfer_state = TSTATE_IDLE; in umass_cbi_state()
1720 if (sc->transfer_priv) { in umass_cbi_state()
1721 sc->transfer_cb(sc, sc->transfer_priv, in umass_cbi_state()
1722 sc->transfer_datalen, in umass_cbi_state()
1723 sc->transfer_status); in umass_cbi_state()
1732 sc->sc_dev.dv_xname, sc->transfer_state); in umass_cbi_state()
1737 umass_bbb_get_max_lun(struct umass_softc *sc) in umass_bbb_get_max_lun() argument
1744 DPRINTF(UDMASS_BBB, ("%s: Get Max Lun\n", sc->sc_dev.dv_xname)); in umass_bbb_get_max_lun()
1750 USETW(req.wIndex, sc->sc_ifaceno); in umass_bbb_get_max_lun()
1753 err = usbd_do_request_flags(sc->sc_udev, &req, &buf, in umass_bbb_get_max_lun()
1764 sc->sc_dev.dv_xname, usbd_errstr(err))); in umass_bbb_get_max_lun()
1768 DPRINTF(UDMASS_BBB, ("%s: Max Lun %d\n", sc->sc_dev.dv_xname, maxlun)); in umass_bbb_get_max_lun()
1774 umass_bbb_dump_cbw(struct umass_softc *sc, struct umass_bbb_cbw *cbw) in umass_bbb_dump_cbw() argument
1785 sc->sc_dev.dv_xname, tag, clen, in umass_bbb_dump_cbw()
1794 umass_bbb_dump_csw(struct umass_softc *sc, struct umass_bbb_csw *csw) in umass_bbb_dump_csw() argument
1802 "res = %d, status = 0x%02x (%s)\n", sc->sc_dev.dv_xname, in umass_bbb_dump_csw()
1811 umass_dump_buffer(struct umass_softc *sc, u_int8_t *buffer, int buflen, in umass_dump_buffer() argument
1827 sc->sc_dev.dv_xname, s1, s2)); in umass_dump_buffer()
1835 sc->sc_dev.dv_xname, s1, s2, s3)); in umass_dump_buffer()