mirror of
https://github.com/opnsense/src.git
synced 2026-06-06 07:12:52 -04:00
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>
This commit is contained in:
parent
ab0a90de0a
commit
8541fbec79
1 changed files with 27 additions and 0 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in a new issue