summaryrefslogtreecommitdiffstats
path: root/sys/dev/usb
diff options
context:
space:
mode:
authorsanpei <sanpei@FreeBSD.org>2003-02-04 13:45:41 +0000
committersanpei <sanpei@FreeBSD.org>2003-02-04 13:45:41 +0000
commit43302434ca9eb015b4a94ca6fbdc74a919e71dfa (patch)
tree623968d34dce60d1b3add8c40e4f012e388234c5 /sys/dev/usb
parent76ea3678a064748bd1dd3156389e4ad6c6e9365c (diff)
downloadFreeBSD-src-43302434ca9eb015b4a94ca6fbdc74a919e71dfa.zip
FreeBSD-src-43302434ca9eb015b4a94ca6fbdc74a919e71dfa.tar.gz
Fix `umass0: BBB bulk-in clear stall failed, IOERROR' problem with
some USB devices. (Make sure to set xfer data length when we force a short inquiry.) Obtained from: NetBSD(sys/dev/usb/umass_scsipi.c rev.1.8) Original idea from: Shingo WATANABE <nabe@nabechan.org>
Diffstat (limited to 'sys/dev/usb')
-rw-r--r--sys/dev/usb/umass.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/sys/dev/usb/umass.c b/sys/dev/usb/umass.c
index 1afc3ee..f1a2e3c 100644
--- a/sys/dev/usb/umass.c
+++ b/sys/dev/usb/umass.c
@@ -327,6 +327,14 @@ Static struct umass_devdescr_t umass_devdescrs[] = {
UMASS_PROTO_ATAPI | UMASS_PROTO_CBI_I,
RS_NO_CLEAR_UA
},
+ { USB_VENDOR_GENESYS, USB_PRODUCT_GENESYS_GL641USB2IDE, RID_WILDCARD,
+ UMASS_PROTO_SCSI | UMASS_PROTO_BBB,
+ FORCE_SHORT_INQUIRY | NO_START_STOP | IGNORE_RESIDUE
+ },
+ { USB_VENDOR_GENESYS, USB_PRODUCT_GENESYS_GL641USB, RID_WILDCARD,
+ UMASS_PROTO_SCSI | UMASS_PROTO_BBB,
+ FORCE_SHORT_INQUIRY | NO_START_STOP | IGNORE_RESIDUE
+ },
{ USB_VENDOR_HP, USB_PRODUCT_HP_CDW8200, RID_WILDCARD,
UMASS_PROTO_ATAPI | UMASS_PROTO_CBI_I,
NO_TEST_UNIT_READY | NO_START_STOP
@@ -341,6 +349,10 @@ Static struct umass_devdescr_t umass_devdescrs[] = {
UMASS_PROTO_SCSI | UMASS_PROTO_BBB,
NO_TEST_UNIT_READY
},
+ { USB_VENDOR_MELCO, USB_PRODUCT_MELCO_DUBPXXG, RID_WILDCARD,
+ UMASS_PROTO_SCSI | UMASS_PROTO_BBB,
+ FORCE_SHORT_INQUIRY | NO_START_STOP | IGNORE_RESIDUE
+ },
{ USB_VENDOR_MICROTECH, USB_PRODUCT_MICROTECH_DPCM, RID_WILDCARD,
UMASS_PROTO_SCSI | UMASS_PROTO_CBI,
NO_TEST_UNIT_READY | NO_START_STOP
@@ -2370,6 +2382,9 @@ umass_cam_action(struct cam_sim *sim, union ccb *ccb)
*/
if (sc->transform(sc, cmd, cmdlen, &rcmd, &rcmdlen)) {
+ if ((sc->quirks & FORCE_SHORT_INQUIRY) && (rcmd[0] == INQUIRY)) {
+ csio->dxfer_len = SHORT_INQUIRY_LENGTH;
+ }
sc->transfer(sc, ccb->ccb_h.target_lun, rcmd, rcmdlen,
csio->data_ptr,
csio->dxfer_len, dir,
@@ -2562,6 +2577,9 @@ umass_cam_cb(struct umass_softc *sc, void *priv, int residue, int status)
(unsigned char *) &sc->cam_scsi_sense,
sizeof(sc->cam_scsi_sense),
&rcmd, &rcmdlen)) {
+ if ((sc->quirks & FORCE_SHORT_INQUIRY) && (rcmd[0] == INQUIRY)) {
+ csio->sense_len = SHORT_INQUIRY_LENGTH;
+ }
sc->transfer(sc, ccb->ccb_h.target_lun,
rcmd, rcmdlen,
&csio->sense_data,
@@ -2753,6 +2771,15 @@ umass_scsi_transform(struct umass_softc *sc, unsigned char *cmd, int cmdlen,
return 1;
}
/* fallthrough */
+ case INQUIRY:
+ /* some drives wedge when asked for full inquiry information. */
+ if (sc->quirks & FORCE_SHORT_INQUIRY) {
+ memcpy(*rcmd, cmd, cmdlen);
+ *rcmdlen = cmdlen;
+ (*rcmd)[4] = SHORT_INQUIRY_LENGTH;
+ return 1;
+ }
+ /* fallthrough */
default:
*rcmd = cmd; /* We don't need to copy it */
*rcmdlen = cmdlen;
OpenPOWER on IntegriCloud