Add the UQ_MSC_NO_PREVENT_ALLOW quirk to handle devices that do not support
the 'PREVENT/ALLOW MEDIUM REMOVAL' SCSI command. An example of such a device is the STmicro ST72682. We send the SCSI command for every open and close, which can result in a significant amount of spam on the console during boot. Reviewed by: hps@
This commit is contained in:
parent
f3b05218ea
commit
ef3afadd29
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=242628
@ -390,6 +390,7 @@ static struct usb_quirk_entry usb_quirks[USB_DEV_QUIRKS_MAX] = {
|
||||
UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_GETMAXLUN),
|
||||
USB_QUIRK(SONY, PORTABLE_HDD_V2, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
|
||||
UQ_MSC_FORCE_PROTO_SCSI),
|
||||
USB_QUIRK(STMICRO, ST72682, 0x0000, 0xffff, UQ_MSC_NO_PREVENT_ALLOW),
|
||||
USB_QUIRK(SUPERTOP, IDE, 0x0000, 0xffff, UQ_MSC_IGNORE_RESIDUE,
|
||||
UQ_MSC_NO_SYNC_CACHE),
|
||||
USB_QUIRK(SUPERTOP, FLASHDRIVE, 0x0000, 0xffff, UQ_MSC_NO_TEST_UNIT_READY,
|
||||
@ -523,6 +524,7 @@ static const char *usb_quirk_str[USB_QUIRK_MAX] = {
|
||||
[UQ_MSC_NO_GETMAXLUN] = "UQ_MSC_NO_GETMAXLUN",
|
||||
[UQ_MSC_NO_INQUIRY] = "UQ_MSC_NO_INQUIRY",
|
||||
[UQ_MSC_NO_INQUIRY_EVPD] = "UQ_MSC_NO_INQUIRY_EVPD",
|
||||
[UQ_MSC_NO_PREVENT_ALLOW] = "UQ_MSC_NO_PREVENT_ALLOW",
|
||||
[UQ_MSC_NO_SYNC_CACHE] = "UQ_MSC_NO_SYNC_CACHE",
|
||||
[UQ_MSC_SHUTTLE_INIT] = "UQ_MSC_SHUTTLE_INIT",
|
||||
[UQ_MSC_ALT_IFACE_1] = "UQ_MSC_ALT_IFACE_1",
|
||||
|
@ -75,6 +75,7 @@ enum {
|
||||
UQ_MSC_NO_GETMAXLUN, /* does not support get max LUN */
|
||||
UQ_MSC_NO_INQUIRY, /* fake generic inq response */
|
||||
UQ_MSC_NO_INQUIRY_EVPD, /* does not support inq EVPD */
|
||||
UQ_MSC_NO_PREVENT_ALLOW, /* does not support medium removal */
|
||||
UQ_MSC_NO_SYNC_CACHE, /* does not support sync cache */
|
||||
UQ_MSC_SHUTTLE_INIT, /* requires Shuttle init sequence */
|
||||
UQ_MSC_ALT_IFACE_1, /* switch to alternate interface 1 */
|
||||
|
@ -361,6 +361,8 @@ typedef uint8_t (umass_transform_t)(struct umass_softc *sc, uint8_t *cmd_ptr,
|
||||
* result.
|
||||
*/
|
||||
#define NO_SYNCHRONIZE_CACHE 0x4000
|
||||
/* Device does not support 'PREVENT/ALLOW MEDIUM REMOVAL'. */
|
||||
#define NO_PREVENT_ALLOW 0x8000
|
||||
|
||||
struct umass_softc {
|
||||
|
||||
@ -831,6 +833,8 @@ umass_probe_proto(device_t dev, struct usb_attach_arg *uaa)
|
||||
quirks |= NO_INQUIRY;
|
||||
if (usb_test_quirk(uaa, UQ_MSC_NO_INQUIRY_EVPD))
|
||||
quirks |= NO_INQUIRY_EVPD;
|
||||
if (usb_test_quirk(uaa, UQ_MSC_NO_PREVENT_ALLOW))
|
||||
quirks |= NO_PREVENT_ALLOW;
|
||||
if (usb_test_quirk(uaa, UQ_MSC_NO_SYNC_CACHE))
|
||||
quirks |= NO_SYNCHRONIZE_CACHE;
|
||||
if (usb_test_quirk(uaa, UQ_MSC_SHUTTLE_INIT))
|
||||
@ -2245,6 +2249,13 @@ umass_cam_action(struct cam_sim *sim, union ccb *ccb)
|
||||
if (sc->sc_quirks & FORCE_SHORT_INQUIRY) {
|
||||
ccb->csio.dxfer_len = SHORT_INQUIRY_LENGTH;
|
||||
}
|
||||
} else if (sc->sc_transfer.cmd_data[0] == PREVENT_ALLOW) {
|
||||
if (sc->sc_quirks & NO_PREVENT_ALLOW) {
|
||||
ccb->csio.scsi_status = SCSI_STATUS_OK;
|
||||
ccb->ccb_h.status = CAM_REQ_CMP;
|
||||
xpt_done(ccb);
|
||||
goto done;
|
||||
}
|
||||
} else if (sc->sc_transfer.cmd_data[0] == SYNCHRONIZE_CACHE) {
|
||||
if (sc->sc_quirks & NO_SYNCHRONIZE_CACHE) {
|
||||
ccb->csio.scsi_status = SCSI_STATUS_OK;
|
||||
|
@ -3949,6 +3949,7 @@ product STELERA E1012 0x1012 3G modem
|
||||
/* STMicroelectronics products */
|
||||
product STMICRO BIOCPU 0x2016 Biometric Coprocessor
|
||||
product STMICRO COMMUNICATOR 0x7554 USB Communicator
|
||||
product STMICRO ST72682 0xfada USB 2.0 Flash drive controller
|
||||
|
||||
/* STSN products */
|
||||
product STSN STSN0001 0x0001 Internet Access Device
|
||||
|
Loading…
Reference in New Issue
Block a user