diff options
-rw-r--r-- | sys/dev/usb/quirk/usb_quirk.c | 425 | ||||
-rw-r--r-- | sys/dev/usb/quirk/usb_quirk.h | 30 | ||||
-rw-r--r-- | sys/dev/usb/storage/umass.c | 767 |
3 files changed, 534 insertions, 688 deletions
diff --git a/sys/dev/usb/quirk/usb_quirk.c b/sys/dev/usb/quirk/usb_quirk.c index 005a058..e2a0c77 100644 --- a/sys/dev/usb/quirk/usb_quirk.c +++ b/sys/dev/usb/quirk/usb_quirk.c @@ -66,7 +66,7 @@ MODULE_VERSION(usb_quirk, 1); #define USB_QUIRK_ENTRY(v,p,l,h,...) \ .vid = (v), .pid = (p), .lo_rev = (l), .hi_rev = (h), .quirks = { __VA_ARGS__ } -#define USB_DEV_QUIRKS_MAX 128 +#define USB_DEV_QUIRKS_MAX 256 #define USB_SUB_QUIRKS_MAX 8 struct usb_quirk_entry { @@ -183,10 +183,396 @@ static struct usb_quirk_entry usb_quirks[USB_DEV_QUIRKS_MAX] = { {USB_QUIRK_ENTRY(USB_VENDOR_CURITEL, USB_PRODUCT_CURITEL_UM175, 0x0000, 0xFFFF, UQ_ASSUME_CM_OVER_DATA)}, + /* USB Mass Storage Class Quirks */ + {USB_QUIRK_ENTRY(USB_VENDOR_ASAHIOPTICAL, 0, + 0x0000, 0xFFFF, UQ_MSC_NO_RS_CLEAR_UA, UQ_MATCH_VENDOR_ONLY)}, + {USB_QUIRK_ENTRY(USB_VENDOR_ADDON, USB_PRODUCT_ADDON_ATTACHE, 0x0000, + 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_IGNORE_RESIDUE)}, + {USB_QUIRK_ENTRY(USB_VENDOR_ADDON, USB_PRODUCT_ADDON_A256MB, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_IGNORE_RESIDUE)}, + {USB_QUIRK_ENTRY(USB_VENDOR_ADDON, USB_PRODUCT_ADDON_DISKPRO512, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_IGNORE_RESIDUE)}, + {USB_QUIRK_ENTRY(USB_VENDOR_ADDONICS2, USB_PRODUCT_ADDONICS2_CABLE_205, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_AIPTEK, USB_PRODUCT_AIPTEK_POCKETCAM3M, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_AIPTEK2, USB_PRODUCT_AIPTEK2_SUNPLUS_TECH, + 0x0000, 0xFFFF, UQ_MSC_NO_SYNC_CACHE)}, + {USB_QUIRK_ENTRY(USB_VENDOR_ALCOR, USB_PRODUCT_ALCOR_SDCR_6335, + 0x0000, 0xFFFF, UQ_MSC_NO_TEST_UNIT_READY, UQ_MSC_NO_SYNC_CACHE)}, + {USB_QUIRK_ENTRY(USB_VENDOR_ALCOR, USB_PRODUCT_ALCOR_AU6390, + 0x0000, 0xFFFF, UQ_MSC_NO_SYNC_CACHE)}, + {USB_QUIRK_ENTRY(USB_VENDOR_ALCOR, USB_PRODUCT_ALCOR_UMCR_9361, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_GETMAXLUN)}, + {USB_QUIRK_ENTRY(USB_VENDOR_ALCOR, USB_PRODUCT_ALCOR_TRANSCEND, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_GETMAXLUN)}, + {USB_QUIRK_ENTRY(USB_VENDOR_ASAHIOPTICAL, USB_PRODUCT_ASAHIOPTICAL_OPTIO230, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_INQUIRY)}, + {USB_QUIRK_ENTRY(USB_VENDOR_ASAHIOPTICAL, USB_PRODUCT_ASAHIOPTICAL_OPTIO330, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_INQUIRY)}, + {USB_QUIRK_ENTRY(USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_USB2SCSI, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_CASIO, USB_PRODUCT_CASIO_QV_DIGICAM, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_INQUIRY)}, + {USB_QUIRK_ENTRY(USB_VENDOR_CCYU, USB_PRODUCT_CCYU_ED1064, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_CENTURY, USB_PRODUCT_CENTURY_EX35QUAT, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_FORCE_SHORT_INQ, UQ_MSC_NO_START_STOP, + UQ_MSC_IGNORE_RESIDUE)}, + {USB_QUIRK_ENTRY(USB_VENDOR_CYPRESS, USB_PRODUCT_CYPRESS_XX6830XX, + 0x0000, 0xFFFF, UQ_MSC_NO_GETMAXLUN, UQ_MSC_NO_SYNC_CACHE)}, + {USB_QUIRK_ENTRY(USB_VENDOR_DESKNOTE, USB_PRODUCT_DESKNOTE_UCR_61S2B, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_DMI, USB_PRODUCT_DMI_CFSM_RW, + 0x0000, 0xFFFF, UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_GETMAXLUN)}, + {USB_QUIRK_ENTRY(USB_VENDOR_EPSON, USB_PRODUCT_EPSON_STYLUS_875DC, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_INQUIRY)}, + {USB_QUIRK_ENTRY(USB_VENDOR_EPSON, USB_PRODUCT_EPSON_STYLUS_895, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_GETMAXLUN)}, + {USB_QUIRK_ENTRY(USB_VENDOR_FEIYA, USB_PRODUCT_FEIYA_5IN1, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_FREECOM, USB_PRODUCT_FREECOM_DVD, + 0x0000, 0xFFFF, UQ_MSC_FORCE_PROTO_SCSI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_FUJIPHOTO, USB_PRODUCT_FUJIPHOTO_MASS0100, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI_I, UQ_MSC_FORCE_PROTO_ATAPI, + UQ_MSC_NO_RS_CLEAR_UA)}, + {USB_QUIRK_ENTRY(USB_VENDOR_GENESYS, USB_PRODUCT_GENESYS_GL641USB2IDE, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_FORCE_SHORT_INQ, UQ_MSC_NO_START_STOP, UQ_MSC_IGNORE_RESIDUE, + UQ_MSC_NO_SYNC_CACHE)}, + {USB_QUIRK_ENTRY(USB_VENDOR_GENESYS, USB_PRODUCT_GENESYS_GL641USB2IDE_2, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_ATAPI, + UQ_MSC_FORCE_SHORT_INQ, UQ_MSC_NO_START_STOP, UQ_MSC_IGNORE_RESIDUE)}, + {USB_QUIRK_ENTRY(USB_VENDOR_GENESYS, USB_PRODUCT_GENESYS_GL641USB, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_FORCE_SHORT_INQ, UQ_MSC_NO_START_STOP, UQ_MSC_IGNORE_RESIDUE)}, + {USB_QUIRK_ENTRY(USB_VENDOR_GENESYS, USB_PRODUCT_GENESYS_GL641USB_2, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_WRONG_CSWSIG)}, + {USB_QUIRK_ENTRY(USB_VENDOR_HAGIWARA, USB_PRODUCT_HAGIWARA_FG, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_HAGIWARA, USB_PRODUCT_HAGIWARA_FGSM, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_HITACHI, USB_PRODUCT_HITACHI_DVDCAM_DZ_MV100A, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_GETMAXLUN)}, + {USB_QUIRK_ENTRY(USB_VENDOR_HITACHI, USB_PRODUCT_HITACHI_DVDCAM_USB, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI_I, UQ_MSC_FORCE_PROTO_ATAPI, + UQ_MSC_NO_INQUIRY)}, + {USB_QUIRK_ENTRY(USB_VENDOR_HP, USB_PRODUCT_HP_CDW4E, + 0x0000, 0xFFFF, UQ_MSC_FORCE_PROTO_ATAPI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_HP, USB_PRODUCT_HP_CDW8200, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI_I, UQ_MSC_FORCE_PROTO_ATAPI, + UQ_MSC_NO_TEST_UNIT_READY, UQ_MSC_NO_START_STOP)}, + {USB_QUIRK_ENTRY(USB_VENDOR_IMAGINATION, USB_PRODUCT_IMAGINATION_DBX1, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_WRONG_CSWSIG)}, + {USB_QUIRK_ENTRY(USB_VENDOR_INSYSTEM, USB_PRODUCT_INSYSTEM_USBCABLE, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI, UQ_MSC_FORCE_PROTO_ATAPI, + UQ_MSC_NO_TEST_UNIT_READY, UQ_MSC_NO_START_STOP, UQ_MSC_ALT_IFACE_1)}, + {USB_QUIRK_ENTRY(USB_VENDOR_INSYSTEM, USB_PRODUCT_INSYSTEM_ATAPI, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI, UQ_MSC_FORCE_PROTO_RBC)}, + {USB_QUIRK_ENTRY(USB_VENDOR_INSYSTEM, USB_PRODUCT_INSYSTEM_STORAGE_V2, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI, UQ_MSC_FORCE_PROTO_RBC)}, + {USB_QUIRK_ENTRY(USB_VENDOR_IODATA, USB_PRODUCT_IODATA_IU_CD2, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_IODATA, USB_PRODUCT_IODATA_DVR_UEH8, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_IOMEGA, USB_PRODUCT_IOMEGA_ZIP100, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_TEST_UNIT_READY)}, /* XXX ZIP drives can also use ATAPI */ + {USB_QUIRK_ENTRY(USB_VENDOR_KYOCERA, USB_PRODUCT_KYOCERA_FINECAM_L3, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_INQUIRY)}, + {USB_QUIRK_ENTRY(USB_VENDOR_KYOCERA, USB_PRODUCT_KYOCERA_FINECAM_S3X, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI, UQ_MSC_FORCE_PROTO_ATAPI, + UQ_MSC_NO_INQUIRY)}, + {USB_QUIRK_ENTRY(USB_VENDOR_KYOCERA, USB_PRODUCT_KYOCERA_FINECAM_S4, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI, UQ_MSC_FORCE_PROTO_ATAPI, + UQ_MSC_NO_INQUIRY)}, + {USB_QUIRK_ENTRY(USB_VENDOR_KYOCERA, USB_PRODUCT_KYOCERA_FINECAM_S5, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_INQUIRY)}, + {USB_QUIRK_ENTRY(USB_VENDOR_LACIE, USB_PRODUCT_LACIE_HD, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI, UQ_MSC_FORCE_PROTO_RBC)}, + {USB_QUIRK_ENTRY(USB_VENDOR_LEXAR, USB_PRODUCT_LEXAR_CF_READER, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_INQUIRY)}, + {USB_QUIRK_ENTRY(USB_VENDOR_LEXAR, USB_PRODUCT_LEXAR_JUMPSHOT, + 0x0000, 0xFFFF, UQ_MSC_FORCE_PROTO_SCSI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_LOGITEC, USB_PRODUCT_LOGITEC_LDR_H443SU2, + 0x0000, 0xFFFF, UQ_MSC_FORCE_PROTO_SCSI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_LOGITEC, USB_PRODUCT_LOGITEC_LDR_H443U2, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI,)}, + {USB_QUIRK_ENTRY(USB_VENDOR_MELCO, USB_PRODUCT_MELCO_DUBPXXG, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_FORCE_SHORT_INQ, UQ_MSC_NO_START_STOP, UQ_MSC_IGNORE_RESIDUE)}, + {USB_QUIRK_ENTRY(USB_VENDOR_MICROTECH, USB_PRODUCT_MICROTECH_DPCM, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_TEST_UNIT_READY, UQ_MSC_NO_START_STOP)}, + {USB_QUIRK_ENTRY(USB_VENDOR_MICROTECH, USB_PRODUCT_MICROTECH_SCSIDB25, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_MICROTECH, USB_PRODUCT_MICROTECH_SCSIHD50, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_MINOLTA, USB_PRODUCT_MINOLTA_E223, + 0x0000, 0xFFFF, UQ_MSC_FORCE_PROTO_SCSI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_MINOLTA, USB_PRODUCT_MINOLTA_F300, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_MITSUMI, USB_PRODUCT_MITSUMI_CDRRW, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI | UQ_MSC_FORCE_PROTO_ATAPI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_MITSUMI, USB_PRODUCT_MITSUMI_FDD, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_GETMAXLUN)}, + {USB_QUIRK_ENTRY(USB_VENDOR_MOTOROLA2, USB_PRODUCT_MOTOROLA2_E398, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_FORCE_SHORT_INQ, UQ_MSC_NO_INQUIRY_EVPD, UQ_MSC_NO_GETMAXLUN)}, + {USB_QUIRK_ENTRY(USB_VENDOR_MPMAN, 0, + 0x0000, 0xFFFF, UQ_MSC_NO_SYNC_CACHE, UQ_MATCH_VENDOR_ONLY)}, + {USB_QUIRK_ENTRY(USB_VENDOR_MSYSTEMS, USB_PRODUCT_MSYSTEMS_DISKONKEY, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_IGNORE_RESIDUE, UQ_MSC_NO_GETMAXLUN, UQ_MSC_NO_RS_CLEAR_UA)}, + {USB_QUIRK_ENTRY(USB_VENDOR_MSYSTEMS, USB_PRODUCT_MSYSTEMS_DISKONKEY2, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_ATAPI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_MYSON, USB_PRODUCT_MYSON_HEDEN, + 0x0000, 0xFFFF, UQ_MSC_IGNORE_RESIDUE, UQ_MSC_NO_SYNC_CACHE)}, + {USB_QUIRK_ENTRY(USB_VENDOR_MYSON, USB_PRODUCT_MYSON_HEDEN_8813, + 0x0000, 0xFFFF, UQ_MSC_NO_SYNC_CACHE)}, + {USB_QUIRK_ENTRY(USB_VENDOR_MYSON, USB_PRODUCT_MYSON_STARREADER, + 0x0000, 0xFFFF, UQ_MSC_NO_SYNC_CACHE)}, + {USB_QUIRK_ENTRY(USB_VENDOR_NEODIO, USB_PRODUCT_NEODIO_ND3260, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_FORCE_SHORT_INQ)}, + {USB_QUIRK_ENTRY(USB_VENDOR_NETAC, USB_PRODUCT_NETAC_CF_CARD, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_INQUIRY)}, + {USB_QUIRK_ENTRY(USB_VENDOR_NETAC, USB_PRODUCT_NETAC_ONLYDISK, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_IGNORE_RESIDUE)}, + {USB_QUIRK_ENTRY(USB_VENDOR_NETCHIP, USB_PRODUCT_NETCHIP_CLIK_40, + 0x0000, 0xFFFF, UQ_MSC_FORCE_PROTO_ATAPI, UQ_MSC_NO_INQUIRY)}, + {USB_QUIRK_ENTRY(USB_VENDOR_NIKON, USB_PRODUCT_NIKON_D300, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_OLYMPUS, USB_PRODUCT_OLYMPUS_C1, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_WRONG_CSWSIG)}, + {USB_QUIRK_ENTRY(USB_VENDOR_OLYMPUS, USB_PRODUCT_OLYMPUS_C700, + 0x0000, 0xFFFF, UQ_MSC_NO_GETMAXLUN)}, + {USB_QUIRK_ENTRY(USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_SDS_HOTFIND_D, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_GETMAXLUN, UQ_MSC_NO_SYNC_CACHE)}, + {USB_QUIRK_ENTRY(USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_CFMS_RW, + 0x0000, 0xFFFF, UQ_MSC_FORCE_PROTO_SCSI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_CFSM_COMBO, + 0x0000, 0xFFFF, UQ_MSC_FORCE_PROTO_SCSI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_CFSM_READER, + 0x0000, 0xFFFF, UQ_MSC_FORCE_PROTO_SCSI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_CFSM_READER2, + 0x0000, 0xFFFF, UQ_MSC_FORCE_PROTO_SCSI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_MDCFE_B_CF_READER, + 0x0000, 0xFFFF, UQ_MSC_FORCE_PROTO_SCSI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_MDSM_B_READER, + 0x0000, 0xFFFF, UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY)}, + {USB_QUIRK_ENTRY(USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_READER, + 0x0000, 0xFFFF, UQ_MSC_FORCE_PROTO_SCSI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_UCF100, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_ATAPI, + UQ_MSC_NO_INQUIRY | UQ_MSC_NO_GETMAXLUN)}, + {USB_QUIRK_ENTRY(USB_VENDOR_ONSPEC2, USB_PRODUCT_ONSPEC2_IMAGEMATE_SDDR55, + 0x0000, 0xFFFF, UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_GETMAXLUN)}, + {USB_QUIRK_ENTRY(USB_VENDOR_PANASONIC, USB_PRODUCT_PANASONIC_KXL840AN, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_ATAPI, + UQ_MSC_NO_GETMAXLUN)}, + {USB_QUIRK_ENTRY(USB_VENDOR_PANASONIC, USB_PRODUCT_PANASONIC_KXLCB20AN, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_PANASONIC, USB_PRODUCT_PANASONIC_KXLCB35AN, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_PANASONIC, USB_PRODUCT_PANASONIC_LS120CAM, + 0x0000, 0xFFFF, UQ_MSC_FORCE_PROTO_UFI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_PHILIPS, USB_PRODUCT_PHILIPS_SPE3030CC, + 0x0000, 0xFFFF, UQ_MSC_NO_SYNC_CACHE)}, + {USB_QUIRK_ENTRY(USB_VENDOR_PLEXTOR, USB_PRODUCT_PLEXTOR_40_12_40U, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_TEST_UNIT_READY)}, + {USB_QUIRK_ENTRY(USB_VENDOR_PNY, USB_PRODUCT_PNY_ATTACHE2, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_IGNORE_RESIDUE, UQ_MSC_NO_START_STOP)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SAMSUNG_TECHWIN, USB_PRODUCT_SAMSUNG_TECHWIN_DIGIMAX_410, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_INQUIRY)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SANDISK, USB_PRODUCT_SANDISK_SDDR05A, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_READ_CAP_OFFBY1, UQ_MSC_NO_GETMAXLUN)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SANDISK, USB_PRODUCT_SANDISK_SDDR09, + 0x0000, 0xFFFF, UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_READ_CAP_OFFBY1, + UQ_MSC_NO_GETMAXLUN)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SANDISK, USB_PRODUCT_SANDISK_SDDR12, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_READ_CAP_OFFBY1, UQ_MSC_NO_GETMAXLUN)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SANDISK, USB_PRODUCT_SANDISK_SDCZ2_256, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_IGNORE_RESIDUE)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SANDISK, USB_PRODUCT_SANDISK_SDCZ4_128, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_IGNORE_RESIDUE)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SANDISK, USB_PRODUCT_SANDISK_SDCZ4_256, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_IGNORE_RESIDUE)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SANDISK, USB_PRODUCT_SANDISK_SDDR31, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_READ_CAP_OFFBY1)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SCANLOGIC, USB_PRODUCT_SCANLOGIC_SL11R, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_ATAPI, + UQ_MSC_NO_INQUIRY)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_EUSB, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI_I, UQ_MSC_FORCE_PROTO_ATAPI, + UQ_MSC_NO_TEST_UNIT_READY, UQ_MSC_NO_START_STOP, UQ_MSC_SHUTTLE_INIT)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_CDRW, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI, UQ_MSC_FORCE_PROTO_ATAPI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_CF, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI, UQ_MSC_FORCE_PROTO_ATAPI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_EUSBATAPI, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI, UQ_MSC_FORCE_PROTO_ATAPI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_EUSBCFSM, + 0x0000, 0xFFFF, UQ_MSC_FORCE_PROTO_SCSI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_EUSCSI, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_HIFD, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_GETMAXLUN)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_SDDR09, + 0x0000, 0xFFFF, UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_GETMAXLUN)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_ZIOMMC, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_GETMAXLUN)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SIGMATEL, USB_PRODUCT_SIGMATEL_I_BEAD100, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_SHUTTLE_INIT)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SIIG, USB_PRODUCT_SIIG_WINTERREADER, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_IGNORE_RESIDUE)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SKANHEX, USB_PRODUCT_SKANHEX_MD_7425, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_INQUIRY)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SKANHEX, USB_PRODUCT_SKANHEX_SX_520Z, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_INQUIRY)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SONY, USB_PRODUCT_SONY_HANDYCAM, + 0x0500, 0x0500, UQ_MSC_FORCE_WIRE_CBI, UQ_MSC_FORCE_PROTO_RBC, + UQ_MSC_RBC_PAD_TO_12)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_40_MS, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_INQUIRY)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SONY, USB_PRODUCT_SONY_DSC, + 0x0500, 0x0500, UQ_MSC_FORCE_WIRE_CBI, UQ_MSC_FORCE_PROTO_RBC, + UQ_MSC_RBC_PAD_TO_12)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SONY, USB_PRODUCT_SONY_DSC, + 0x0600, 0x0600, UQ_MSC_FORCE_WIRE_CBI, UQ_MSC_FORCE_PROTO_RBC, + UQ_MSC_RBC_PAD_TO_12)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SONY, USB_PRODUCT_SONY_DSC, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI, UQ_MSC_FORCE_PROTO_RBC)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SONY, USB_PRODUCT_SONY_HANDYCAM, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI, UQ_MSC_FORCE_PROTO_RBC)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SONY, USB_PRODUCT_SONY_MSC, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI, UQ_MSC_FORCE_PROTO_RBC)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SONY, USB_PRODUCT_SONY_MS_MSC_U03, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI, UQ_MSC_FORCE_PROTO_UFI, + UQ_MSC_NO_GETMAXLUN)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SONY, USB_PRODUCT_SONY_MS_NW_MS7, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_GETMAXLUN)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SONY, USB_PRODUCT_SONY_MS_PEG_N760C, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_INQUIRY)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SONY, USB_PRODUCT_SONY_MSACUS1, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_GETMAXLUN)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SONY, USB_PRODUCT_SONY_PORTABLE_HDD_V2, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_SUPERTOP, USB_PRODUCT_SUPERTOP_IDE, + 0x0000, 0xFFFF, UQ_MSC_IGNORE_RESIDUE, UQ_MSC_NO_SYNC_CACHE)}, + {USB_QUIRK_ENTRY(USB_VENDOR_TAUGA, USB_PRODUCT_TAUGA_CAMERAMATE, + 0x0000, 0xFFFF, UQ_MSC_FORCE_PROTO_SCSI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_TEAC, USB_PRODUCT_TEAC_FD05PUB, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI, UQ_MSC_FORCE_PROTO_UFI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_TECLAST, USB_PRODUCT_TECLAST_TLC300, + 0x0000, 0xFFFF, UQ_MSC_NO_TEST_UNIT_READY, UQ_MSC_NO_SYNC_CACHE)}, + {USB_QUIRK_ENTRY(USB_VENDOR_TREK, USB_PRODUCT_TREK_MEMKEY, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_INQUIRY)}, + {USB_QUIRK_ENTRY(USB_VENDOR_TREK, USB_PRODUCT_TREK_THUMBDRIVE_8MB, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_ATAPI, + UQ_MSC_IGNORE_RESIDUE)}, + {USB_QUIRK_ENTRY(USB_VENDOR_TRUMPION, USB_PRODUCT_TRUMPION_C3310, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI, UQ_MSC_FORCE_PROTO_UFI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_TRUMPION, USB_PRODUCT_TRUMPION_MP3, + 0x0000, 0xFFFF, UQ_MSC_FORCE_PROTO_RBC)}, + {USB_QUIRK_ENTRY(USB_VENDOR_TRUMPION, USB_PRODUCT_TRUMPION_T33520, + 0x0000, 0xFFFF, UQ_MSC_FORCE_PROTO_SCSI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_TWINMOS, USB_PRODUCT_TWINMOS_MDIV, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_VIA, USB_PRODUCT_VIA_USB2IDEBRIDGE, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_SYNC_CACHE)}, + {USB_QUIRK_ENTRY(USB_VENDOR_VIVITAR, USB_PRODUCT_VIVITAR_35XX, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_INQUIRY)}, + {USB_QUIRK_ENTRY(USB_VENDOR_WESTERN, USB_PRODUCT_WESTERN_COMBO, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_FORCE_SHORT_INQ, UQ_MSC_NO_START_STOP, UQ_MSC_IGNORE_RESIDUE)}, + {USB_QUIRK_ENTRY(USB_VENDOR_WESTERN, USB_PRODUCT_WESTERN_EXTHDD, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_FORCE_SHORT_INQ, UQ_MSC_NO_START_STOP, UQ_MSC_IGNORE_RESIDUE)}, + {USB_QUIRK_ENTRY(USB_VENDOR_WESTERN, USB_PRODUCT_WESTERN_MYBOOK, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_INQUIRY_EVPD)}, + {USB_QUIRK_ENTRY(USB_VENDOR_WESTERN, USB_PRODUCT_WESTERN_MYPASSWORD, + 0x0000, 0xFFFF, UQ_MSC_FORCE_SHORT_INQ)}, + {USB_QUIRK_ENTRY(USB_VENDOR_WINMAXGROUP, USB_PRODUCT_WINMAXGROUP_FLASH64MC, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_INQUIRY)}, + {USB_QUIRK_ENTRY(USB_VENDOR_YANO, USB_PRODUCT_YANO_FW800HD, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_FORCE_SHORT_INQ, UQ_MSC_NO_START_STOP, UQ_MSC_IGNORE_RESIDUE)}, + {USB_QUIRK_ENTRY(USB_VENDOR_YANO, USB_PRODUCT_YANO_U640MO, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI_I, UQ_MSC_FORCE_PROTO_ATAPI, + UQ_MSC_FORCE_SHORT_INQ)}, + {USB_QUIRK_ENTRY(USB_VENDOR_YEDATA, USB_PRODUCT_YEDATA_FLASHBUSTERU, + 0x0000, 0x007F, UQ_MSC_FORCE_WIRE_CBI, UQ_MSC_FORCE_PROTO_UFI, + UQ_MSC_NO_RS_CLEAR_UA, UQ_MSC_FLOPPY_SPEED, + UQ_MSC_NO_TEST_UNIT_READY, UQ_MSC_NO_GETMAXLUN)}, + {USB_QUIRK_ENTRY(USB_VENDOR_YEDATA, USB_PRODUCT_YEDATA_FLASHBUSTERU, + 0x0080, 0x0080, UQ_MSC_FORCE_WIRE_CBI_I, UQ_MSC_FORCE_PROTO_UFI, + UQ_MSC_NO_RS_CLEAR_UA, UQ_MSC_FLOPPY_SPEED, + UQ_MSC_NO_TEST_UNIT_READY, UQ_MSC_NO_GETMAXLUN)}, + {USB_QUIRK_ENTRY(USB_VENDOR_YEDATA, USB_PRODUCT_YEDATA_FLASHBUSTERU, + 0x0081, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI_I, UQ_MSC_FORCE_PROTO_UFI, + UQ_MSC_NO_RS_CLEAR_UA, UQ_MSC_FLOPPY_SPEED, UQ_MSC_NO_GETMAXLUN)}, + {USB_QUIRK_ENTRY(USB_VENDOR_ZORAN, USB_PRODUCT_ZORAN_EX20DSC, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI, UQ_MSC_FORCE_PROTO_ATAPI)}, + {USB_QUIRK_ENTRY(USB_VENDOR_MEIZU, USB_PRODUCT_MEIZU_M6_SL, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_INQUIRY, UQ_MSC_NO_SYNC_CACHE)}, + {USB_QUIRK_ENTRY(USB_VENDOR_ACTIONS, USB_PRODUCT_ACTIONS_MP4, + 0x0000, 0xFFFF, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_SYNC_CACHE)}, + {USB_QUIRK_ENTRY(USB_VENDOR_ASUS, USB_PRODUCT_ASUS_GMSC, + 0x0000, 0xFFFF, UQ_MSC_NO_SYNC_CACHE)}, }; static const char *usb_quirk_str[USB_QUIRK_MAX] = { [UQ_NONE] = "UQ_NONE", + [UQ_MATCH_VENDOR_ONLY] = "UQ_MATCH_VENDOR_ONLY", [UQ_AUDIO_SWAP_LR] = "UQ_AUDIO_SWAP_LR", [UQ_AU_INP_ASYNC] = "UQ_AU_INP_ASYNC", [UQ_AU_NO_FRAC] = "UQ_AU_NO_FRAC", @@ -210,7 +596,29 @@ static const char *usb_quirk_str[USB_QUIRK_MAX] = { [UQ_CFG_INDEX_3] = "UQ_CFG_INDEX_3", [UQ_CFG_INDEX_4] = "UQ_CFG_INDEX_4", [UQ_CFG_INDEX_0] = "UQ_CFG_INDEX_0", - [UQ_ASSUME_CM_OVER_DATA]= "UQ_ASSUME_CM_OVER_DATA", + [UQ_ASSUME_CM_OVER_DATA] = "UQ_ASSUME_CM_OVER_DATA", + [UQ_MSC_NO_TEST_UNIT_READY] = "UQ_MSC_NO_TEST_UNIT_READY", + [UQ_MSC_NO_RS_CLEAR_UA] = "UQ_MSC_NO_RS_CLEAR_UA", + [UQ_MSC_NO_START_STOP] = "UQ_MSC_NO_START_STOP", + [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_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", + [UQ_MSC_FLOPPY_SPEED] = "UQ_MSC_FLOPPY_SPEED", + [UQ_MSC_IGNORE_RESIDUE] = "UQ_MSC_IGNORE_RESIDUE", + [UQ_MSC_WRONG_CSWSIG] = "UQ_MSC_WRONG_CSWSIG", + [UQ_MSC_RBC_PAD_TO_12] = "UQ_MSC_RBC_PAD_TO_12", + [UQ_MSC_READ_CAP_OFFBY1] = "UQ_MSC_READ_CAP_OFFBY1", + [UQ_MSC_FORCE_SHORT_INQ] = "UQ_MSC_FORCE_SHORT_INQ", + [UQ_MSC_FORCE_WIRE_BBB] = "UQ_MSC_FORCE_WIRE_BBB", + [UQ_MSC_FORCE_WIRE_CBI] = "UQ_MSC_FORCE_WIRE_CBI", + [UQ_MSC_FORCE_WIRE_CBI_I] = "UQ_MSC_FORCE_WIRE_CBI_I", + [UQ_MSC_FORCE_PROTO_SCSI] = "UQ_MSC_FORCE_PROTO_SCSI", + [UQ_MSC_FORCE_PROTO_ATAPI] = "UQ_MSC_FORCE_PROTO_ATAPI", + [UQ_MSC_FORCE_PROTO_UFI] = "UQ_MSC_FORCE_PROTO_UFI", + [UQ_MSC_FORCE_PROTO_RBC] = "UQ_MSC_FORCE_PROTO_RBC", }; /*------------------------------------------------------------------------* @@ -246,11 +654,22 @@ usb_test_quirk_by_info(const struct usbd_lookup_info *info, uint16_t quirk) for (x = 0; x != USB_DEV_QUIRKS_MAX; x++) { /* see if quirk information does not match */ if ((usb_quirks[x].vid != info->idVendor) || - (usb_quirks[x].pid != info->idProduct) || (usb_quirks[x].lo_rev > info->bcdDevice) || (usb_quirks[x].hi_rev < info->bcdDevice)) { continue; } + /* see if quirk only should match vendor ID */ + if (usb_quirks[x].pid != info->idProduct) { + if (usb_quirks[x].pid != 0) + continue; + + for (y = 0; y != USB_SUB_QUIRKS_MAX; y++) { + if (usb_quirks[x].quirks[y] == UQ_MATCH_VENDOR_ONLY) + break; + } + if (y == USB_SUB_QUIRKS_MAX) + continue; + } /* lookup quirk */ for (y = 0; y != USB_SUB_QUIRKS_MAX; y++) { if (usb_quirks[x].quirks[y] == quirk) { diff --git a/sys/dev/usb/quirk/usb_quirk.h b/sys/dev/usb/quirk/usb_quirk.h index ee40c2f..3187bca 100644 --- a/sys/dev/usb/quirk/usb_quirk.h +++ b/sys/dev/usb/quirk/usb_quirk.h @@ -30,6 +30,11 @@ /* NOTE: UQ_NONE is not a valid quirk */ enum { /* keep in sync with usb_quirk_str table */ UQ_NONE, + + UQ_MATCH_VENDOR_ONLY, + + /* Various quirks */ + UQ_AUDIO_SWAP_LR, /* left and right sound channels are swapped */ UQ_AU_INP_ASYNC, /* input is async despite claim of adaptive */ UQ_AU_NO_FRAC, /* don't adjust for fractional samples */ @@ -54,6 +59,31 @@ enum { /* keep in sync with usb_quirk_str table */ UQ_CFG_INDEX_4, /* select configuration index 4 by default */ UQ_CFG_INDEX_0, /* select configuration index 0 by default */ UQ_ASSUME_CM_OVER_DATA, /* modem device breaks on cm over data */ + + /* USB Mass Storage Quirks. See "storage/umass.c" for a detailed description. */ + UQ_MSC_NO_TEST_UNIT_READY, + UQ_MSC_NO_RS_CLEAR_UA, + UQ_MSC_NO_START_STOP, + UQ_MSC_NO_GETMAXLUN, + UQ_MSC_NO_INQUIRY, + UQ_MSC_NO_INQUIRY_EVPD, + UQ_MSC_NO_SYNC_CACHE, + UQ_MSC_SHUTTLE_INIT, + UQ_MSC_ALT_IFACE_1, + UQ_MSC_FLOPPY_SPEED, + UQ_MSC_IGNORE_RESIDUE, + UQ_MSC_WRONG_CSWSIG, + UQ_MSC_RBC_PAD_TO_12, + UQ_MSC_READ_CAP_OFFBY1, + UQ_MSC_FORCE_SHORT_INQ, + UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_WIRE_CBI, + UQ_MSC_FORCE_WIRE_CBI_I, + UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_FORCE_PROTO_ATAPI, + UQ_MSC_FORCE_PROTO_UFI, + UQ_MSC_FORCE_PROTO_RBC, + USB_QUIRK_MAX }; diff --git a/sys/dev/usb/storage/umass.c b/sys/dev/usb/storage/umass.c index 36ed09c..0b6ceff 100644 --- a/sys/dev/usb/storage/umass.c +++ b/sys/dev/usb/storage/umass.c @@ -127,6 +127,8 @@ __FBSDID("$FreeBSD$"); #include <dev/usb/usb_device.h> #include "usbdevs.h" +#include <dev/usb/quirk/usb_quirk.h> + #include <cam/cam.h> #include <cam/cam_ccb.h> #include <cam/cam_sim.h> @@ -311,32 +313,18 @@ typedef void (umass_callback_t)(struct umass_softc *sc, union ccb *ccb, typedef uint8_t (umass_transform_t)(struct umass_softc *sc, uint8_t *cmd_ptr, uint8_t cmd_len); -struct umass_devdescr { - uint32_t vid; -#define VID_WILDCARD 0xffffffff -#define VID_EOT 0xfffffffe - uint32_t pid; -#define PID_WILDCARD 0xffffffff -#define PID_EOT 0xfffffffe - uint32_t rid; -#define RID_WILDCARD 0xffffffff -#define RID_EOT 0xfffffffe - - /* wire and command protocol */ - uint16_t proto; -#define UMASS_PROTO_DEFAULT 0x0000 /* use protocol indicated by USB descriptors */ +/* Wire and command protocol */ #define UMASS_PROTO_BBB 0x0001 /* USB wire protocol */ #define UMASS_PROTO_CBI 0x0002 #define UMASS_PROTO_CBI_I 0x0004 -#define UMASS_PROTO_WIRE 0x00ff /* USB wire protocol mask */ -#define UMASS_PROTO_SCSI 0x0100 /* command protocol */ +#define UMASS_PROTO_WIRE 0x00ff /* USB wire protocol mask */ +#define UMASS_PROTO_SCSI 0x0100 /* command protocol */ #define UMASS_PROTO_ATAPI 0x0200 #define UMASS_PROTO_UFI 0x0400 #define UMASS_PROTO_RBC 0x0800 #define UMASS_PROTO_COMMAND 0xff00 /* command protocol mask */ - /* Device specific quirks */ - uint16_t quirks; +/* Device specific quirks */ #define NO_QUIRKS 0x0000 /* * The drive does not support Test Unit Ready. Convert to Start Unit @@ -384,608 +372,6 @@ struct umass_devdescr { * result. */ #define NO_SYNCHRONIZE_CACHE 0x4000 -}; - -static const struct umass_devdescr umass_devdescr[] = { - {USB_VENDOR_ASAHIOPTICAL, PID_WILDCARD, RID_WILDCARD, - UMASS_PROTO_DEFAULT, - RS_NO_CLEAR_UA - }, - {USB_VENDOR_ADDON, USB_PRODUCT_ADDON_ATTACHE, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - IGNORE_RESIDUE - }, - {USB_VENDOR_ADDON, USB_PRODUCT_ADDON_A256MB, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - IGNORE_RESIDUE - }, - {USB_VENDOR_ADDON, USB_PRODUCT_ADDON_DISKPRO512, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - IGNORE_RESIDUE - }, - {USB_VENDOR_ADDONICS2, USB_PRODUCT_ADDONICS2_CABLE_205, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_AIPTEK, USB_PRODUCT_AIPTEK_POCKETCAM3M, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_AIPTEK2, USB_PRODUCT_AIPTEK2_SUNPLUS_TECH, RID_WILDCARD, - UMASS_PROTO_DEFAULT, - NO_SYNCHRONIZE_CACHE - }, - {USB_VENDOR_ALCOR, USB_PRODUCT_ALCOR_SDCR_6335, RID_WILDCARD, - UMASS_PROTO_DEFAULT, - NO_TEST_UNIT_READY | NO_SYNCHRONIZE_CACHE - }, - {USB_VENDOR_ALCOR, USB_PRODUCT_ALCOR_AU6390, RID_WILDCARD, - UMASS_PROTO_DEFAULT, - NO_SYNCHRONIZE_CACHE - }, - {USB_VENDOR_ALCOR, USB_PRODUCT_ALCOR_UMCR_9361, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_GETMAXLUN - }, - {USB_VENDOR_ALCOR, USB_PRODUCT_ALCOR_TRANSCEND, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_GETMAXLUN - }, - {USB_VENDOR_ASAHIOPTICAL, USB_PRODUCT_ASAHIOPTICAL_OPTIO230, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_INQUIRY - }, - {USB_VENDOR_ASAHIOPTICAL, USB_PRODUCT_ASAHIOPTICAL_OPTIO330, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_INQUIRY - }, - {USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_USB2SCSI, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_CASIO, USB_PRODUCT_CASIO_QV_DIGICAM, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_CBI, - NO_INQUIRY - }, - {USB_VENDOR_CCYU, USB_PRODUCT_CCYU_ED1064, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_CENTURY, USB_PRODUCT_CENTURY_EX35QUAT, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - FORCE_SHORT_INQUIRY | NO_START_STOP | IGNORE_RESIDUE - }, - {USB_VENDOR_CYPRESS, USB_PRODUCT_CYPRESS_XX6830XX, RID_WILDCARD, - UMASS_PROTO_DEFAULT, - NO_GETMAXLUN | NO_SYNCHRONIZE_CACHE - }, - {USB_VENDOR_DESKNOTE, USB_PRODUCT_DESKNOTE_UCR_61S2B, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_DMI, USB_PRODUCT_DMI_CFSM_RW, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_GETMAXLUN - }, - {USB_VENDOR_EPSON, USB_PRODUCT_EPSON_STYLUS_875DC, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_CBI, - NO_INQUIRY - }, - {USB_VENDOR_EPSON, USB_PRODUCT_EPSON_STYLUS_895, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_GETMAXLUN - }, - {USB_VENDOR_FEIYA, USB_PRODUCT_FEIYA_5IN1, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_FREECOM, USB_PRODUCT_FREECOM_DVD, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_QUIRKS - }, - {USB_VENDOR_FUJIPHOTO, USB_PRODUCT_FUJIPHOTO_MASS0100, RID_WILDCARD, - 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 - | NO_SYNCHRONIZE_CACHE - }, - {USB_VENDOR_GENESYS, USB_PRODUCT_GENESYS_GL641USB2IDE_2, RID_WILDCARD, - UMASS_PROTO_ATAPI | 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_GENESYS, USB_PRODUCT_GENESYS_GL641USB_2, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - WRONG_CSWSIG - }, - {USB_VENDOR_HAGIWARA, USB_PRODUCT_HAGIWARA_FG, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_HAGIWARA, USB_PRODUCT_HAGIWARA_FGSM, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_HITACHI, USB_PRODUCT_HITACHI_DVDCAM_DZ_MV100A, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_CBI, - NO_GETMAXLUN - }, - {USB_VENDOR_HITACHI, USB_PRODUCT_HITACHI_DVDCAM_USB, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_CBI_I, - NO_INQUIRY - }, - {USB_VENDOR_HP, USB_PRODUCT_HP_CDW4E, RID_WILDCARD, - UMASS_PROTO_ATAPI, - NO_QUIRKS - }, - {USB_VENDOR_HP, USB_PRODUCT_HP_CDW8200, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_CBI_I, - NO_TEST_UNIT_READY | NO_START_STOP - }, - {USB_VENDOR_IMAGINATION, USB_PRODUCT_IMAGINATION_DBX1, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - WRONG_CSWSIG - }, - {USB_VENDOR_INSYSTEM, USB_PRODUCT_INSYSTEM_USBCABLE, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_CBI, - NO_TEST_UNIT_READY | NO_START_STOP | ALT_IFACE_1 - }, - {USB_VENDOR_INSYSTEM, USB_PRODUCT_INSYSTEM_ATAPI, RID_WILDCARD, - UMASS_PROTO_RBC | UMASS_PROTO_CBI, - NO_QUIRKS - }, - {USB_VENDOR_INSYSTEM, USB_PRODUCT_INSYSTEM_STORAGE_V2, RID_WILDCARD, - UMASS_PROTO_RBC | UMASS_PROTO_CBI, - NO_QUIRKS - }, - {USB_VENDOR_IODATA, USB_PRODUCT_IODATA_IU_CD2, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_IODATA, USB_PRODUCT_IODATA_DVR_UEH8, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_IOMEGA, USB_PRODUCT_IOMEGA_ZIP100, RID_WILDCARD, - /* - * XXX This is not correct as there are Zip drives that use - * ATAPI. - */ - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_TEST_UNIT_READY - }, - {USB_VENDOR_KYOCERA, USB_PRODUCT_KYOCERA_FINECAM_L3, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_INQUIRY - }, - {USB_VENDOR_KYOCERA, USB_PRODUCT_KYOCERA_FINECAM_S3X, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_CBI, - NO_INQUIRY - }, - {USB_VENDOR_KYOCERA, USB_PRODUCT_KYOCERA_FINECAM_S4, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_CBI, - NO_INQUIRY - }, - {USB_VENDOR_KYOCERA, USB_PRODUCT_KYOCERA_FINECAM_S5, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_INQUIRY - }, - {USB_VENDOR_LACIE, USB_PRODUCT_LACIE_HD, RID_WILDCARD, - UMASS_PROTO_RBC | UMASS_PROTO_CBI, - NO_QUIRKS - }, - {USB_VENDOR_LEXAR, USB_PRODUCT_LEXAR_CF_READER, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_INQUIRY - }, - {USB_VENDOR_LEXAR, USB_PRODUCT_LEXAR_JUMPSHOT, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_QUIRKS - }, - {USB_VENDOR_LOGITEC, USB_PRODUCT_LOGITEC_LDR_H443SU2, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_QUIRKS - }, - {USB_VENDOR_LOGITEC, USB_PRODUCT_LOGITEC_LDR_H443U2, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {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 - }, - {USB_VENDOR_MICROTECH, USB_PRODUCT_MICROTECH_SCSIDB25, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_MICROTECH, USB_PRODUCT_MICROTECH_SCSIHD50, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_MINOLTA, USB_PRODUCT_MINOLTA_E223, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_QUIRKS - }, - {USB_VENDOR_MINOLTA, USB_PRODUCT_MINOLTA_F300, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_MITSUMI, USB_PRODUCT_MITSUMI_CDRRW, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_CBI, - NO_QUIRKS - }, - {USB_VENDOR_MITSUMI, USB_PRODUCT_MITSUMI_FDD, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_GETMAXLUN - }, - {USB_VENDOR_MOTOROLA2, USB_PRODUCT_MOTOROLA2_E398, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - FORCE_SHORT_INQUIRY | NO_INQUIRY_EVPD | NO_GETMAXLUN - }, - {USB_VENDOR_MPMAN, PID_WILDCARD, RID_WILDCARD, - UMASS_PROTO_DEFAULT, - NO_SYNCHRONIZE_CACHE - }, - {USB_VENDOR_MSYSTEMS, USB_PRODUCT_MSYSTEMS_DISKONKEY, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - IGNORE_RESIDUE | NO_GETMAXLUN | RS_NO_CLEAR_UA - }, - {USB_VENDOR_MSYSTEMS, USB_PRODUCT_MSYSTEMS_DISKONKEY2, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_MYSON, USB_PRODUCT_MYSON_HEDEN, RID_WILDCARD, - UMASS_PROTO_DEFAULT, - IGNORE_RESIDUE | NO_SYNCHRONIZE_CACHE - }, - {USB_VENDOR_MYSON, USB_PRODUCT_MYSON_HEDEN_8813, RID_WILDCARD, - UMASS_PROTO_DEFAULT, - NO_SYNCHRONIZE_CACHE - }, - {USB_VENDOR_MYSON, USB_PRODUCT_MYSON_STARREADER, RID_WILDCARD, - UMASS_PROTO_DEFAULT, - NO_SYNCHRONIZE_CACHE - }, - {USB_VENDOR_NEODIO, USB_PRODUCT_NEODIO_ND3260, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - FORCE_SHORT_INQUIRY - }, - {USB_VENDOR_NETAC, USB_PRODUCT_NETAC_CF_CARD, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_INQUIRY - }, - {USB_VENDOR_NETAC, USB_PRODUCT_NETAC_ONLYDISK, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - IGNORE_RESIDUE - }, - {USB_VENDOR_NETCHIP, USB_PRODUCT_NETCHIP_CLIK_40, RID_WILDCARD, - UMASS_PROTO_ATAPI, - NO_INQUIRY - }, - {USB_VENDOR_NIKON, USB_PRODUCT_NIKON_D300, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_OLYMPUS, USB_PRODUCT_OLYMPUS_C1, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - WRONG_CSWSIG - }, - {USB_VENDOR_OLYMPUS, USB_PRODUCT_OLYMPUS_C700, RID_WILDCARD, - UMASS_PROTO_DEFAULT, - NO_GETMAXLUN - }, - {USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_SDS_HOTFIND_D, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_GETMAXLUN | NO_SYNCHRONIZE_CACHE - }, - {USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_CFMS_RW, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_QUIRKS - }, - {USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_CFSM_COMBO, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_QUIRKS - }, - {USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_CFSM_READER, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_QUIRKS - }, - {USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_CFSM_READER2, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_QUIRKS - }, - {USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_MDCFE_B_CF_READER, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_QUIRKS - }, - {USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_MDSM_B_READER, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_INQUIRY - }, - {USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_READER, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_QUIRKS - }, - {USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_UCF100, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_BBB, - NO_INQUIRY | NO_GETMAXLUN - }, - {USB_VENDOR_ONSPEC2, USB_PRODUCT_ONSPEC2_IMAGEMATE_SDDR55, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_GETMAXLUN - }, - {USB_VENDOR_PANASONIC, USB_PRODUCT_PANASONIC_KXL840AN, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_BBB, - NO_GETMAXLUN - }, - {USB_VENDOR_PANASONIC, USB_PRODUCT_PANASONIC_KXLCB20AN, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_PANASONIC, USB_PRODUCT_PANASONIC_KXLCB35AN, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_PANASONIC, USB_PRODUCT_PANASONIC_LS120CAM, RID_WILDCARD, - UMASS_PROTO_UFI, - NO_QUIRKS - }, - { USB_VENDOR_PHILIPS, USB_PRODUCT_PHILIPS_SPE3030CC, RID_WILDCARD, - UMASS_PROTO_DEFAULT, - NO_SYNCHRONIZE_CACHE - }, - {USB_VENDOR_PLEXTOR, USB_PRODUCT_PLEXTOR_40_12_40U, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_TEST_UNIT_READY - }, - {USB_VENDOR_PNY, USB_PRODUCT_PNY_ATTACHE2, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - IGNORE_RESIDUE | NO_START_STOP - }, - {USB_VENDOR_SAMSUNG_TECHWIN, USB_PRODUCT_SAMSUNG_TECHWIN_DIGIMAX_410, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_INQUIRY - }, - {USB_VENDOR_SANDISK, USB_PRODUCT_SANDISK_SDDR05A, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_CBI, - READ_CAPACITY_OFFBY1 | NO_GETMAXLUN - }, - {USB_VENDOR_SANDISK, USB_PRODUCT_SANDISK_SDDR09, RID_WILDCARD, - UMASS_PROTO_SCSI, - READ_CAPACITY_OFFBY1 | NO_GETMAXLUN - }, - {USB_VENDOR_SANDISK, USB_PRODUCT_SANDISK_SDDR12, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_CBI, - READ_CAPACITY_OFFBY1 | NO_GETMAXLUN - }, - {USB_VENDOR_SANDISK, USB_PRODUCT_SANDISK_SDCZ2_256, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - IGNORE_RESIDUE - }, - {USB_VENDOR_SANDISK, USB_PRODUCT_SANDISK_SDCZ4_128, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - IGNORE_RESIDUE - }, - {USB_VENDOR_SANDISK, USB_PRODUCT_SANDISK_SDCZ4_256, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - IGNORE_RESIDUE - }, - {USB_VENDOR_SANDISK, USB_PRODUCT_SANDISK_SDDR31, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - READ_CAPACITY_OFFBY1 - }, - {USB_VENDOR_SCANLOGIC, USB_PRODUCT_SCANLOGIC_SL11R, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_BBB, - NO_INQUIRY - }, - {USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_EUSB, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_CBI_I, - NO_TEST_UNIT_READY | NO_START_STOP | SHUTTLE_INIT - }, - {USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_CDRW, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_CBI, - NO_QUIRKS - }, - {USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_CF, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_CBI, - NO_QUIRKS - }, - {USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_EUSBATAPI, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_CBI, - NO_QUIRKS - }, - {USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_EUSBCFSM, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_QUIRKS - }, - {USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_EUSCSI, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_HIFD, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_CBI, - NO_GETMAXLUN - }, - {USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_SDDR09, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_GETMAXLUN - }, - {USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_ZIOMMC, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_CBI, - NO_GETMAXLUN - }, - {USB_VENDOR_SIGMATEL, USB_PRODUCT_SIGMATEL_I_BEAD100, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - SHUTTLE_INIT - }, - {USB_VENDOR_SIIG, USB_PRODUCT_SIIG_WINTERREADER, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - IGNORE_RESIDUE - }, - {USB_VENDOR_SKANHEX, USB_PRODUCT_SKANHEX_MD_7425, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_INQUIRY - }, - {USB_VENDOR_SKANHEX, USB_PRODUCT_SKANHEX_SX_520Z, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_INQUIRY - }, - {USB_VENDOR_SONY, USB_PRODUCT_SONY_HANDYCAM, 0x0500, - UMASS_PROTO_RBC | UMASS_PROTO_CBI, - RBC_PAD_TO_12 - }, - {USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_40_MS, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_INQUIRY - }, - {USB_VENDOR_SONY, USB_PRODUCT_SONY_DSC, 0x0500, - UMASS_PROTO_RBC | UMASS_PROTO_CBI, - RBC_PAD_TO_12 - }, - {USB_VENDOR_SONY, USB_PRODUCT_SONY_DSC, 0x0600, - UMASS_PROTO_RBC | UMASS_PROTO_CBI, - RBC_PAD_TO_12 - }, - {USB_VENDOR_SONY, USB_PRODUCT_SONY_DSC, RID_WILDCARD, - UMASS_PROTO_RBC | UMASS_PROTO_CBI, - NO_QUIRKS - }, - {USB_VENDOR_SONY, USB_PRODUCT_SONY_HANDYCAM, RID_WILDCARD, - UMASS_PROTO_RBC | UMASS_PROTO_CBI, - NO_QUIRKS - }, - {USB_VENDOR_SONY, USB_PRODUCT_SONY_MSC, RID_WILDCARD, - UMASS_PROTO_RBC | UMASS_PROTO_CBI, - NO_QUIRKS - }, - {USB_VENDOR_SONY, USB_PRODUCT_SONY_MS_MSC_U03, RID_WILDCARD, - UMASS_PROTO_UFI | UMASS_PROTO_CBI, - NO_GETMAXLUN - }, - {USB_VENDOR_SONY, USB_PRODUCT_SONY_MS_NW_MS7, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_GETMAXLUN - }, - {USB_VENDOR_SONY, USB_PRODUCT_SONY_MS_PEG_N760C, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_INQUIRY - }, - {USB_VENDOR_SONY, USB_PRODUCT_SONY_MSACUS1, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_GETMAXLUN - }, - {USB_VENDOR_SONY, USB_PRODUCT_SONY_PORTABLE_HDD_V2, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_SUPERTOP, USB_PRODUCT_SUPERTOP_IDE, RID_WILDCARD, - UMASS_PROTO_DEFAULT, - IGNORE_RESIDUE | NO_SYNCHRONIZE_CACHE - }, - {USB_VENDOR_TAUGA, USB_PRODUCT_TAUGA_CAMERAMATE, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_QUIRKS - }, - {USB_VENDOR_TEAC, USB_PRODUCT_TEAC_FD05PUB, RID_WILDCARD, - UMASS_PROTO_UFI | UMASS_PROTO_CBI, - NO_QUIRKS - }, - {USB_VENDOR_TECLAST, USB_PRODUCT_TECLAST_TLC300, RID_WILDCARD, - UMASS_PROTO_DEFAULT, - NO_TEST_UNIT_READY | NO_SYNCHRONIZE_CACHE - }, - {USB_VENDOR_TREK, USB_PRODUCT_TREK_MEMKEY, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_INQUIRY - }, - {USB_VENDOR_TREK, USB_PRODUCT_TREK_THUMBDRIVE_8MB, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_BBB, - IGNORE_RESIDUE - }, - {USB_VENDOR_TRUMPION, USB_PRODUCT_TRUMPION_C3310, RID_WILDCARD, - UMASS_PROTO_UFI | UMASS_PROTO_CBI, - NO_QUIRKS - }, - {USB_VENDOR_TRUMPION, USB_PRODUCT_TRUMPION_MP3, RID_WILDCARD, - UMASS_PROTO_RBC, - NO_QUIRKS - }, - {USB_VENDOR_TRUMPION, USB_PRODUCT_TRUMPION_T33520, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_QUIRKS - }, - {USB_VENDOR_TWINMOS, USB_PRODUCT_TWINMOS_MDIV, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_VIA, USB_PRODUCT_VIA_USB2IDEBRIDGE, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_SYNCHRONIZE_CACHE - }, - {USB_VENDOR_VIVITAR, USB_PRODUCT_VIVITAR_35XX, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_INQUIRY - }, - {USB_VENDOR_WESTERN, USB_PRODUCT_WESTERN_COMBO, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - FORCE_SHORT_INQUIRY | NO_START_STOP | IGNORE_RESIDUE - }, - {USB_VENDOR_WESTERN, USB_PRODUCT_WESTERN_EXTHDD, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - FORCE_SHORT_INQUIRY | NO_START_STOP | IGNORE_RESIDUE - }, - {USB_VENDOR_WESTERN, USB_PRODUCT_WESTERN_MYBOOK, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_INQUIRY_EVPD - }, - {USB_VENDOR_WESTERN, USB_PRODUCT_WESTERN_MYPASSWORD, RID_WILDCARD, - UMASS_PROTO_DEFAULT, - FORCE_SHORT_INQUIRY - }, - {USB_VENDOR_WINMAXGROUP, USB_PRODUCT_WINMAXGROUP_FLASH64MC, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_INQUIRY - }, - {USB_VENDOR_YANO, USB_PRODUCT_YANO_FW800HD, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - FORCE_SHORT_INQUIRY | NO_START_STOP | IGNORE_RESIDUE - }, - {USB_VENDOR_YANO, USB_PRODUCT_YANO_U640MO, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_CBI_I, - FORCE_SHORT_INQUIRY - }, - {USB_VENDOR_YEDATA, USB_PRODUCT_YEDATA_FLASHBUSTERU, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_CBI, - NO_GETMAXLUN - }, - {USB_VENDOR_ZORAN, USB_PRODUCT_ZORAN_EX20DSC, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_CBI, - NO_QUIRKS - }, - {USB_VENDOR_MEIZU, USB_PRODUCT_MEIZU_M6_SL, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_INQUIRY | NO_SYNCHRONIZE_CACHE - }, - {USB_VENDOR_ACTIONS, USB_PRODUCT_ACTIONS_MP4, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_SYNCHRONIZE_CACHE - }, - {USB_VENDOR_ASUS, USB_PRODUCT_ASUS_GMSC, RID_WILDCARD, - UMASS_PROTO_DEFAULT, - NO_SYNCHRONIZE_CACHE - }, - {VID_EOT, PID_EOT, RID_EOT, 0, 0} -}; struct umass_softc { @@ -1027,9 +413,8 @@ struct umass_softc { umass_transform_t *sc_transform; uint32_t sc_unit; - - uint16_t sc_proto; /* wire and cmd protocol */ - uint16_t sc_quirks; /* they got it almost right */ + uint32_t sc_quirks; /* they got it almost right */ + uint32_t sc_proto; /* wire and cmd protocol */ uint8_t sc_name[16]; uint8_t sc_iface_no; /* interface number */ @@ -1039,10 +424,10 @@ struct umass_softc { }; struct umass_probe_proto { - uint16_t quirks; - uint16_t proto; + uint32_t quirks; + uint32_t proto; - int32_t error; + int error; }; /* prototypes */ @@ -1366,7 +751,6 @@ umass_get_proto(struct usb_interface *iface) retval |= UMASS_PROTO_ATAPI; break; default: - retval = 0; goto done; } @@ -1382,7 +766,6 @@ umass_get_proto(struct usb_interface *iface) retval |= UMASS_PROTO_BBB; break; default: - retval = 0; goto done; } done: @@ -1390,78 +773,92 @@ done: } /* - * Match the device we are seeing with the - * devices supported. + * Match the device we are seeing with the devices supported. */ static struct umass_probe_proto umass_probe_proto(device_t dev, struct usb_attach_arg *uaa) { - const struct umass_devdescr *udd = umass_devdescr; struct umass_probe_proto ret; + uint32_t quirks = NO_QUIRKS; + uint32_t proto = umass_get_proto(uaa->iface); memset(&ret, 0, sizeof(ret)); - /* - * An entry specifically for Y-E Data devices as they don't fit in - * the device description table. - */ - if ((uaa->info.idVendor == USB_VENDOR_YEDATA) && - (uaa->info.idProduct == USB_PRODUCT_YEDATA_FLASHBUSTERU)) { + /* Search for protocol enforcement */ + + if (usb_test_quirk(uaa, UQ_MSC_FORCE_WIRE_BBB)) { + proto &= ~UMASS_PROTO_WIRE; + proto |= UMASS_PROTO_BBB; + } else if (usb_test_quirk(uaa, UQ_MSC_FORCE_WIRE_CBI)) { + proto &= ~UMASS_PROTO_WIRE; + proto |= UMASS_PROTO_CBI; + } else if (usb_test_quirk(uaa, UQ_MSC_FORCE_WIRE_CBI_I)) { + proto &= ~UMASS_PROTO_WIRE; + proto |= UMASS_PROTO_CBI_I; + } - /* - * Revisions < 1.28 do not handle the interrupt endpoint - * very well. - */ - if (uaa->info.bcdDevice < 0x128) { - ret.proto = UMASS_PROTO_UFI | UMASS_PROTO_CBI; - } else { - ret.proto = UMASS_PROTO_UFI | UMASS_PROTO_CBI_I; - } + if (usb_test_quirk(uaa, UQ_MSC_FORCE_PROTO_SCSI)) { + proto &= ~UMASS_PROTO_COMMAND; + proto |= UMASS_PROTO_SCSI; + } else if (usb_test_quirk(uaa, UQ_MSC_FORCE_PROTO_ATAPI)) { + proto &= ~UMASS_PROTO_COMMAND; + proto |= UMASS_PROTO_ATAPI; + } else if (usb_test_quirk(uaa, UQ_MSC_FORCE_PROTO_UFI)) { + proto &= ~UMASS_PROTO_COMMAND; + proto |= UMASS_PROTO_UFI; + } else if (usb_test_quirk(uaa, UQ_MSC_FORCE_PROTO_RBC)) { + proto &= ~UMASS_PROTO_COMMAND; + proto |= UMASS_PROTO_RBC; + } - /* - * Revisions < 1.28 do not have the TEST UNIT READY command - * Revisions == 1.28 have a broken TEST UNIT READY - */ - if (uaa->info.bcdDevice <= 0x128) { - ret.quirks |= NO_TEST_UNIT_READY; - } - ret.quirks |= RS_NO_CLEAR_UA | FLOPPY_SPEED; + /* Check if the protocol is invalid */ + + if ((proto & UMASS_PROTO_COMMAND) == 0) { + ret.error = ENXIO; goto done; } - /* - * Check the list of supported devices for a match. While looking, - * check for wildcarded and fully matched. First match wins. - */ - for (; udd->vid != VID_EOT; udd++) { - if (((udd->vid == uaa->info.idVendor) || - (udd->vid == VID_WILDCARD)) && - ((udd->pid == uaa->info.idProduct) || - (udd->pid == PID_WILDCARD))) { - if (udd->rid == RID_WILDCARD) { - ret.proto = udd->proto; - ret.quirks = udd->quirks; - if (ret.proto == UMASS_PROTO_DEFAULT) - goto default_proto; - else - goto done; - } else if (udd->rid == uaa->info.bcdDevice) { - ret.proto = udd->proto; - ret.quirks = udd->quirks; - if (ret.proto == UMASS_PROTO_DEFAULT) - goto default_proto; - else - goto done; - } /* else RID does not match */ - } - } -default_proto: - ret.proto = umass_get_proto(uaa->iface); - if (ret.proto == 0) + if ((proto & UMASS_PROTO_WIRE) == 0) { ret.error = ENXIO; - else - ret.error = 0; + goto done; + } + + /* Search for quirks */ + + if (usb_test_quirk(uaa, UQ_MSC_NO_TEST_UNIT_READY)) + quirks |= NO_TEST_UNIT_READY; + if (usb_test_quirk(uaa, UQ_MSC_NO_RS_CLEAR_UA)) + quirks |= RS_NO_CLEAR_UA; + if (usb_test_quirk(uaa, UQ_MSC_NO_START_STOP)) + quirks |= NO_START_STOP; + if (usb_test_quirk(uaa, UQ_MSC_NO_GETMAXLUN)) + quirks |= NO_GETMAXLUN; + if (usb_test_quirk(uaa, UQ_MSC_NO_INQUIRY)) + 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_SYNC_CACHE)) + quirks |= NO_SYNCHRONIZE_CACHE; + if (usb_test_quirk(uaa, UQ_MSC_SHUTTLE_INIT)) + quirks |= SHUTTLE_INIT; + if (usb_test_quirk(uaa, UQ_MSC_ALT_IFACE_1)) + quirks |= ALT_IFACE_1; + if (usb_test_quirk(uaa, UQ_MSC_FLOPPY_SPEED)) + quirks |= FLOPPY_SPEED; + if (usb_test_quirk(uaa, UQ_MSC_IGNORE_RESIDUE)) + quirks |= IGNORE_RESIDUE; + if (usb_test_quirk(uaa, UQ_MSC_WRONG_CSWSIG)) + quirks |= WRONG_CSWSIG; + if (usb_test_quirk(uaa, UQ_MSC_RBC_PAD_TO_12)) + quirks |= RBC_PAD_TO_12; + if (usb_test_quirk(uaa, UQ_MSC_READ_CAP_OFFBY1)) + quirks |= READ_CAPACITY_OFFBY1; + if (usb_test_quirk(uaa, UQ_MSC_FORCE_SHORT_INQ)) + quirks |= FORCE_SHORT_INQUIRY; + done: + ret.quirks = quirks; + ret.proto = proto; return (ret); } |