Move all Mass Storage Quirks over to the USB quirk module.

Submitted by:	Hans Petter Selasky
This commit is contained in:
Andrew Thompson 2009-12-23 01:16:24 +00:00
parent 7b360bcc6c
commit eb58441685
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=200886
3 changed files with 534 additions and 688 deletions

View File

@ -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) {

View File

@ -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
};

View File

@ -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,20 +313,7 @@ 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
@ -335,8 +324,7 @@ struct umass_devdescr {
#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 @@ umass_get_proto(struct usb_interface *iface)
}
/*
* 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 */
/*
* 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_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 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;
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 */
}
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;
}
default_proto:
ret.proto = umass_get_proto(uaa->iface);
if (ret.proto == 0)
/* Check if the protocol is invalid */
if ((proto & UMASS_PROTO_COMMAND) == 0) {
ret.error = ENXIO;
else
ret.error = 0;
goto done;
}
if ((proto & UMASS_PROTO_WIRE) == 0) {
ret.error = ENXIO;
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);
}