diff options
author | sanpei <sanpei@FreeBSD.org> | 2003-02-04 13:45:41 +0000 |
---|---|---|
committer | sanpei <sanpei@FreeBSD.org> | 2003-02-04 13:45:41 +0000 |
commit | 43302434ca9eb015b4a94ca6fbdc74a919e71dfa (patch) | |
tree | 623968d34dce60d1b3add8c40e4f012e388234c5 /sys/dev/usb | |
parent | 76ea3678a064748bd1dd3156389e4ad6c6e9365c (diff) | |
download | FreeBSD-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.c | 27 |
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; |