The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/usb/quirk/usb_quirk.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /* $FreeBSD$ */
    2 /*-
    3  * SPDX-License-Identifier: BSD-2-Clause-NetBSD
    4  *
    5  * Copyright (c) 1998 The NetBSD Foundation, Inc. All rights reserved.
    6  * Copyright (c) 1998 Lennart Augustsson. All rights reserved.
    7  * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
    8  *
    9  * Redistribution and use in source and binary forms, with or without
   10  * modification, are permitted provided that the following conditions
   11  * are met:
   12  * 1. Redistributions of source code must retain the above copyright
   13  *    notice, this list of conditions and the following disclaimer.
   14  * 2. Redistributions in binary form must reproduce the above copyright
   15  *    notice, this list of conditions and the following disclaimer in the
   16  *    documentation and/or other materials provided with the distribution.
   17  *
   18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   19  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   21  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   22  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   23  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   24  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   26  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   27  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   28  * SUCH DAMAGE.
   29  */
   30 
   31 #include <sys/stdint.h>
   32 #include <sys/stddef.h>
   33 #include <sys/param.h>
   34 #include <sys/queue.h>
   35 #include <sys/types.h>
   36 #include <sys/systm.h>
   37 #include <sys/kernel.h>
   38 #include <sys/bus.h>
   39 #include <sys/module.h>
   40 #include <sys/lock.h>
   41 #include <sys/mutex.h>
   42 #include <sys/condvar.h>
   43 #include <sys/sysctl.h>
   44 #include <sys/sx.h>
   45 #include <sys/unistd.h>
   46 #include <sys/callout.h>
   47 #include <sys/malloc.h>
   48 #include <sys/priv.h>
   49 
   50 #include <dev/usb/usb.h>
   51 #include <dev/usb/usb_ioctl.h>
   52 #include <dev/usb/usbdi.h>
   53 #include "usbdevs.h"
   54 
   55 #define USB_DEBUG_VAR usb_debug
   56 #include <dev/usb/usb_debug.h>
   57 #include <dev/usb/usb_dynamic.h>
   58 
   59 #include <dev/usb/quirk/usb_quirk.h>
   60 
   61 MODULE_DEPEND(usb_quirk, usb, 1, 1, 1);
   62 MODULE_VERSION(usb_quirk, 1);
   63 
   64 #define USB_DEV_QUIRKS_MAX 384
   65 #define USB_SUB_QUIRKS_MAX 8
   66 #define USB_QUIRK_ENVROOT "hw.usb.quirk."
   67 
   68 struct usb_quirk_entry {
   69         uint16_t vid;
   70         uint16_t pid;
   71         uint16_t lo_rev;
   72         uint16_t hi_rev;
   73         uint16_t quirks[USB_SUB_QUIRKS_MAX];
   74 };
   75 
   76 static struct mtx usb_quirk_mtx;
   77 
   78 #define USB_QUIRK_VP(v,p,l,h,...) \
   79   { .vid = (v), .pid = (p), .lo_rev = (l), .hi_rev = (h), \
   80     .quirks = { __VA_ARGS__ } }
   81 #define USB_QUIRK(v,p,l,h,...) \
   82   USB_QUIRK_VP(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, l, h, __VA_ARGS__)
   83 
   84 static struct usb_quirk_entry usb_quirks[USB_DEV_QUIRKS_MAX] = {
   85         USB_QUIRK(ASUS, LCM, 0x0000, 0xffff, UQ_HID_IGNORE),
   86         USB_QUIRK(INSIDEOUT, EDGEPORT4, 0x094, 0x094, UQ_SWAP_UNICODE),
   87         USB_QUIRK(DALLAS, J6502, 0x0a2, 0x0a2, UQ_BAD_ADC),
   88         USB_QUIRK(DALLAS, J6502, 0x0a2, 0x0a2, UQ_AU_NO_XU),
   89         USB_QUIRK(ALTEC, ADA70, 0x103, 0x103, UQ_BAD_ADC),
   90         USB_QUIRK(ALTEC, ASC495, 0x000, 0x000, UQ_BAD_AUDIO),
   91         USB_QUIRK(QTRONIX, 980N, 0x110, 0x110, UQ_SPUR_BUT_UP),
   92         USB_QUIRK(ALCOR2, KBD_HUB, 0x001, 0x001, UQ_SPUR_BUT_UP),
   93         USB_QUIRK(MCT, HUB0100, 0x102, 0x102, UQ_BUS_POWERED),
   94         USB_QUIRK(MCT, USB232, 0x102, 0x102, UQ_BUS_POWERED),
   95         USB_QUIRK(TI, UTUSB41, 0x110, 0x110, UQ_POWER_CLAIM),
   96         USB_QUIRK(TELEX, MIC1, 0x009, 0x009, UQ_AU_NO_FRAC),
   97         USB_QUIRK(SILICONPORTALS, YAPPHONE, 0x100, 0x100, UQ_AU_INP_ASYNC),
   98         USB_QUIRK(LOGITECH, UN53B, 0x0000, 0xffff, UQ_NO_STRINGS),
   99         USB_QUIRK(LOGITECH, G510S, 0x0000, 0xFFFF, UQ_KBD_BOOTPROTO),
  100         USB_QUIRK(REALTEK, RTL8196EU, 0x0000, 0xffff, UQ_CFG_INDEX_1),
  101         USB_QUIRK(ELSA, MODEM1, 0x0000, 0xffff, UQ_CFG_INDEX_1),
  102         USB_QUIRK(PLANEX2, MZKUE150N, 0x0000, 0xffff, UQ_CFG_INDEX_1),
  103         USB_QUIRK(CISCOLINKSYS, USB3GIGV1, 0x0000, 0xffff, UQ_CFG_INDEX_1),
  104         USB_QUIRK(REALTEK, RTL8156, 0x0000, 0xffff, UQ_CFG_INDEX_2),
  105         /* Quirks for printer devices */
  106         USB_QUIRK(HP, 895C, 0x0000, 0xffff, UQ_BROKEN_BIDIR),
  107         USB_QUIRK(HP, 880C, 0x0000, 0xffff, UQ_BROKEN_BIDIR),
  108         USB_QUIRK(HP, 815C, 0x0000, 0xffff, UQ_BROKEN_BIDIR),
  109         USB_QUIRK(HP, 810C, 0x0000, 0xffff, UQ_BROKEN_BIDIR),
  110         USB_QUIRK(HP, 830C, 0x0000, 0xffff, UQ_BROKEN_BIDIR),
  111         USB_QUIRK(HP, 1220C, 0x0000, 0xffff, UQ_BROKEN_BIDIR),
  112         USB_QUIRK(XEROX, WCM15, 0x0000, 0xffff, UQ_BROKEN_BIDIR),
  113         /* Devices which should be ignored by uhid */
  114         USB_QUIRK(APC, UPS, 0x0000, 0xffff, UQ_HID_IGNORE),
  115         USB_QUIRK(BELKIN, F6H375USB, 0x0000, 0xffff, UQ_HID_IGNORE),
  116         USB_QUIRK(BELKIN, F6C550AVR, 0x0000, 0xffff, UQ_HID_IGNORE),
  117         USB_QUIRK(BELKIN, F6C1250TWRK, 0x0000, 0xffff, UQ_HID_IGNORE),
  118         USB_QUIRK(BELKIN, F6C1500TWRK, 0x0000, 0xffff, UQ_HID_IGNORE),
  119         USB_QUIRK(BELKIN, F6C900UNV, 0x0000, 0xffff, UQ_HID_IGNORE),
  120         USB_QUIRK(BELKIN, F6C100UNV, 0x0000, 0xffff, UQ_HID_IGNORE),
  121         USB_QUIRK(BELKIN, F6C120UNV, 0x0000, 0xffff, UQ_HID_IGNORE),
  122         USB_QUIRK(BELKIN, F6C800UNV, 0x0000, 0xffff, UQ_HID_IGNORE),
  123         USB_QUIRK(BELKIN, F6C1100UNV, 0x0000, 0xffff, UQ_HID_IGNORE),
  124         USB_QUIRK(CYBERPOWER, BC900D, 0x0000, 0xffff, UQ_HID_IGNORE),
  125         USB_QUIRK(CYBERPOWER, 1500CAVRLCD, 0x0000, 0xffff, UQ_HID_IGNORE),
  126         USB_QUIRK(CYBERPOWER, OR2200LCDRM2U, 0x0000, 0xffff, UQ_HID_IGNORE),
  127         USB_QUIRK(DELL2, VARIOUS_UPS, 0x0000, 0xffff, UQ_HID_IGNORE),
  128         USB_QUIRK(CYPRESS, SILVERSHIELD, 0x0000, 0xffff, UQ_HID_IGNORE),
  129         USB_QUIRK(DELORME, EARTHMATE, 0x0000, 0xffff, UQ_HID_IGNORE),
  130         USB_QUIRK(DREAMLINK, DL100B, 0x0000, 0xffff, UQ_HID_IGNORE),
  131         USB_QUIRK(MICROCHIP, PICOLCD20X2, 0x0000, 0xffff, UQ_HID_IGNORE),
  132         USB_QUIRK(MICROCHIP, PICOLCD4X20, 0x0000, 0xffff, UQ_HID_IGNORE),
  133         USB_QUIRK(LIEBERT, POWERSURE_PXT, 0x0000, 0xffff, UQ_HID_IGNORE),
  134         USB_QUIRK(LIEBERT2, PSI1000, 0x0000, 0xffff, UQ_HID_IGNORE),
  135         USB_QUIRK(LIEBERT2, POWERSURE_PSA, 0x0000, 0xffff, UQ_HID_IGNORE),
  136         USB_QUIRK(MGE, UPS1, 0x0000, 0xffff, UQ_HID_IGNORE),
  137         USB_QUIRK(MGE, UPS2, 0x0000, 0xffff, UQ_HID_IGNORE),
  138         USB_QUIRK(POWERCOM, IMPERIAL_SERIES, 0x0000, 0xffff, UQ_HID_IGNORE),
  139         USB_QUIRK(POWERCOM, SMART_KING_PRO, 0x0000, 0xffff, UQ_HID_IGNORE),
  140         USB_QUIRK(POWERCOM, WOW, 0x0000, 0xffff, UQ_HID_IGNORE),
  141         USB_QUIRK(POWERCOM, VANGUARD, 0x0000, 0xffff, UQ_HID_IGNORE),
  142         USB_QUIRK(POWERCOM, BLACK_KNIGHT_PRO, 0x0000, 0xffff, UQ_HID_IGNORE),
  143         USB_QUIRK(TRIPPLITE2, AVR550U, 0x0000, 0xffff, UQ_HID_IGNORE),
  144         USB_QUIRK(TRIPPLITE2, AVR750U, 0x0000, 0xffff, UQ_HID_IGNORE),
  145         USB_QUIRK(TRIPPLITE2, ECO550UPS, 0x0000, 0xffff, UQ_HID_IGNORE),
  146         USB_QUIRK(TRIPPLITE2, T750_INTL, 0x0000, 0xffff, UQ_HID_IGNORE),
  147         USB_QUIRK(TRIPPLITE2, RT_2200_INTL, 0x0000, 0xffff, UQ_HID_IGNORE),
  148         USB_QUIRK(TRIPPLITE2, OMNI1000LCD, 0x0000, 0xffff, UQ_HID_IGNORE),
  149         USB_QUIRK(TRIPPLITE2, OMNI900LCD, 0x0000, 0xffff, UQ_HID_IGNORE),
  150         USB_QUIRK(TRIPPLITE2, SMART_2200RMXL2U, 0x0000, 0xffff, UQ_HID_IGNORE),
  151         USB_QUIRK(TRIPPLITE2, UPS_3014, 0x0000, 0xffff, UQ_HID_IGNORE),
  152         USB_QUIRK(TRIPPLITE2, SU1500RTXL2UA, 0x0000, 0xffff, UQ_HID_IGNORE),
  153         USB_QUIRK(TRIPPLITE2, SU6000RT4U, 0x0000, 0xffff, UQ_HID_IGNORE),
  154         USB_QUIRK(TRIPPLITE2, SU1500RTXL2UA_2, 0x0000, 0xffff, UQ_HID_IGNORE),
  155         USB_QUIRK(APPLE, IPHONE, 0x0000, 0xffff, UQ_HID_IGNORE),
  156         USB_QUIRK(APPLE, IPHONE_3G, 0x0000, 0xffff, UQ_HID_IGNORE),
  157         USB_QUIRK(MEGATEC, UPS, 0x0000, 0xffff, UQ_HID_IGNORE),
  158         /* Devices which should be ignored by both ukbd and uhid */
  159         USB_QUIRK(CYPRESS, WISPY1A, 0x0000, 0xffff, UQ_KBD_IGNORE, UQ_HID_IGNORE),
  160         USB_QUIRK(METAGEEK, WISPY1B, 0x0000, 0xffff, UQ_KBD_IGNORE, UQ_HID_IGNORE),
  161         USB_QUIRK(METAGEEK, WISPY24X, 0x0000, 0xffff, UQ_KBD_IGNORE, UQ_HID_IGNORE),
  162         USB_QUIRK(METAGEEK2, WISPYDBX, 0x0000, 0xffff, UQ_KBD_IGNORE, UQ_HID_IGNORE),
  163         USB_QUIRK(TENX, UAUDIO0, 0x0101, 0x0101, UQ_AUDIO_SWAP_LR),
  164         /* MS keyboards do weird things */
  165         USB_QUIRK(MICROSOFT, NATURAL4000, 0x0000, 0xFFFF, UQ_KBD_BOOTPROTO),
  166         USB_QUIRK(MICROSOFT, WLINTELLIMOUSE, 0x0000, 0xffff, UQ_MS_LEADING_BYTE),
  167         /* Quirk for Corsair Vengeance K60 keyboard */
  168         USB_QUIRK(CORSAIR, K60, 0x0000, 0xffff, UQ_KBD_BOOTPROTO),
  169         /* Quirk for Corsair Gaming K68 keyboard */
  170         USB_QUIRK(CORSAIR, K68, 0x0000, 0xffff, UQ_KBD_BOOTPROTO),
  171         /* Quirk for Corsair Vengeance K70 keyboard */
  172         USB_QUIRK(CORSAIR, K70, 0x0000, 0xffff, UQ_KBD_BOOTPROTO),
  173         /* Quirk for Corsair K70 RGB keyboard */
  174         USB_QUIRK(CORSAIR, K70_RGB, 0x0000, 0xffff, UQ_KBD_BOOTPROTO),
  175         /* Quirk for Corsair STRAFE Gaming keyboard */
  176         USB_QUIRK(CORSAIR, STRAFE, 0x0000, 0xffff, UQ_KBD_BOOTPROTO),
  177         USB_QUIRK(CORSAIR, STRAFE2, 0x0000, 0xffff, UQ_KBD_BOOTPROTO),
  178         /* Quirk for Kensington Slimblade Trackball */
  179         USB_QUIRK(KENSINGTON, SLIMBLADE, 0x0000, 0xffff, UQ_MS_VENDOR_BTN),
  180         /* umodem(4) device quirks */
  181         USB_QUIRK(METRICOM, RICOCHET_GS, 0x100, 0x100, UQ_ASSUME_CM_OVER_DATA),
  182         USB_QUIRK(SANYO, SCP4900, 0x000, 0x000, UQ_ASSUME_CM_OVER_DATA),
  183         USB_QUIRK(MOTOROLA2, T720C, 0x001, 0x001, UQ_ASSUME_CM_OVER_DATA),
  184         USB_QUIRK(EICON, DIVA852, 0x100, 0x100, UQ_ASSUME_CM_OVER_DATA),
  185         USB_QUIRK(SIEMENS2, ES75, 0x000, 0x000, UQ_ASSUME_CM_OVER_DATA),
  186         USB_QUIRK(QUALCOMM, CDMA_MSM, 0x0000, 0xffff, UQ_ASSUME_CM_OVER_DATA),
  187         USB_QUIRK(QUALCOMM2, CDMA_MSM, 0x0000, 0xffff, UQ_ASSUME_CM_OVER_DATA),
  188         USB_QUIRK(CURITEL, UM150, 0x0000, 0xffff, UQ_ASSUME_CM_OVER_DATA),
  189         USB_QUIRK(CURITEL, UM175, 0x0000, 0xffff, UQ_ASSUME_CM_OVER_DATA),
  190         USB_QUIRK(VERTEX, VW110L, 0x0000, 0xffff, UQ_ASSUME_CM_OVER_DATA),
  191         USB_QUIRK(BALTECH, SMARTCARDREADER, 0x0000, 0xffff, UQ_IGNORE_CDC_CM),
  192 
  193         /* USB Mass Storage Class Quirks */
  194         USB_QUIRK_VP(USB_VENDOR_ASAHIOPTICAL, 0, UQ_MSC_NO_RS_CLEAR_UA,
  195             UQ_MATCH_VENDOR_ONLY),
  196         USB_QUIRK(ADDON, ATTACHE, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  197             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_IGNORE_RESIDUE),
  198         USB_QUIRK(ADDON, A256MB, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  199             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_IGNORE_RESIDUE),
  200         USB_QUIRK(ADDON, DISKPRO512, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  201             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_IGNORE_RESIDUE),
  202         USB_QUIRK(ADDONICS2, CABLE_205, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  203             UQ_MSC_FORCE_PROTO_SCSI),
  204         USB_QUIRK(AIPTEK, POCKETCAM3M, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  205             UQ_MSC_FORCE_PROTO_SCSI),
  206         USB_QUIRK(ALCOR, UMCR_9361, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  207             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_GETMAXLUN),
  208         USB_QUIRK(ALCOR, TRANSCEND, 0x0000, 0xffff, UQ_MSC_NO_GETMAXLUN,
  209             UQ_MSC_NO_SYNC_CACHE, UQ_MSC_NO_TEST_UNIT_READY),
  210         USB_QUIRK(APACER, HT202, 0x0000, 0xffff, UQ_MSC_NO_TEST_UNIT_READY,
  211             UQ_MSC_NO_SYNC_CACHE),
  212         USB_QUIRK(ASAHIOPTICAL, OPTIO230, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  213             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY),
  214         USB_QUIRK(ASAHIOPTICAL, OPTIO330, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  215             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY),
  216         USB_QUIRK(ATP, EUSB, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE),
  217         USB_QUIRK(BELKIN, USB2SCSI, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  218             UQ_MSC_FORCE_PROTO_SCSI),
  219         USB_QUIRK(CASIO, QV_DIGICAM, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI,
  220             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY),
  221         USB_QUIRK(CCYU, ED1064, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  222             UQ_MSC_FORCE_PROTO_SCSI),
  223         USB_QUIRK(CENTURY, EX35QUAT, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  224             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_FORCE_SHORT_INQ,
  225             UQ_MSC_NO_START_STOP, UQ_MSC_IGNORE_RESIDUE),
  226         USB_QUIRK(CREATIVE, NOMAD, 0x0001, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  227             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_READ_CAP_OFFBY1),
  228         USB_QUIRK(CYPRESS, XX6830XX, 0x0000, 0xffff, UQ_MSC_NO_GETMAXLUN,
  229             UQ_MSC_NO_SYNC_CACHE),
  230         USB_QUIRK(EMTEC, DANEELEC4GB, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE),
  231         USB_QUIRK(DESKNOTE, UCR_61S2B, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  232             UQ_MSC_FORCE_PROTO_SCSI),
  233         USB_QUIRK(DMI, CFSM_RW, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI,
  234             UQ_MSC_NO_GETMAXLUN),
  235         USB_QUIRK(EMTEC, RUF2PS, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE),
  236         USB_QUIRK(EPSON, STYLUS_875DC, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI,
  237             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY),
  238         USB_QUIRK(EPSON, STYLUS_895, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  239             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_GETMAXLUN),
  240         USB_QUIRK(FEIYA, 5IN1, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  241             UQ_MSC_FORCE_PROTO_SCSI),
  242         USB_QUIRK(FEIYA, ELANGO, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE),
  243         USB_QUIRK(FREECOM, DVD, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI),
  244         USB_QUIRK(FUJIPHOTO, MASS0100, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI_I,
  245             UQ_MSC_FORCE_PROTO_ATAPI, UQ_MSC_NO_RS_CLEAR_UA, UQ_MSC_NO_SYNC_CACHE),
  246         USB_QUIRK(GARMIN, DAKOTA20, 0x0000, 0xffff, UQ_MSC_NO_INQUIRY),
  247         USB_QUIRK(GARMIN, FORERUNNER230, 0x0000, 0xffff, UQ_MSC_NO_INQUIRY),
  248         USB_QUIRK(GARMIN, GPSMAP62S, 0x0000, 0xffff, UQ_MSC_NO_INQUIRY),
  249         USB_QUIRK(GARMIN, EDGETOURINGPLUS, 0x0000, 0xffff, UQ_MSC_NO_INQUIRY),
  250         USB_QUIRK(GARMIN, INSTINCTSOLAR, 0x0000, 0xffff, UQ_MSC_NO_INQUIRY),
  251         USB_QUIRK(GENESYS, GL641USB2IDE, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  252             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_FORCE_SHORT_INQ,
  253             UQ_MSC_NO_START_STOP, UQ_MSC_IGNORE_RESIDUE, UQ_MSC_NO_SYNC_CACHE),
  254         USB_QUIRK(GENESYS, GL641USB2IDE_2, 0x0000, 0xffff,
  255             UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_ATAPI,
  256             UQ_MSC_FORCE_SHORT_INQ, UQ_MSC_NO_START_STOP,
  257             UQ_MSC_IGNORE_RESIDUE),
  258         USB_QUIRK(GENESYS, GL641USB, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  259             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_FORCE_SHORT_INQ,
  260             UQ_MSC_NO_START_STOP, UQ_MSC_IGNORE_RESIDUE),
  261         USB_QUIRK(GENESYS, GL641USB_2, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  262             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_WRONG_CSWSIG),
  263         USB_QUIRK(HAGIWARA, FG, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  264             UQ_MSC_FORCE_PROTO_SCSI),
  265         USB_QUIRK(HAGIWARA, FGSM, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  266             UQ_MSC_FORCE_PROTO_SCSI),
  267         USB_QUIRK(HITACHI, DVDCAM_DZ_MV100A, 0x0000, 0xffff,
  268             UQ_MSC_FORCE_WIRE_CBI, UQ_MSC_FORCE_PROTO_SCSI,
  269             UQ_MSC_NO_GETMAXLUN),
  270         USB_QUIRK(HITACHI, DVDCAM_USB, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI_I,
  271             UQ_MSC_FORCE_PROTO_ATAPI, UQ_MSC_NO_INQUIRY),
  272         USB_QUIRK(HP, CDW4E, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_ATAPI),
  273         USB_QUIRK(HP, CDW8200, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI_I,
  274             UQ_MSC_FORCE_PROTO_ATAPI, UQ_MSC_NO_TEST_UNIT_READY,
  275             UQ_MSC_NO_START_STOP),
  276         USB_QUIRK(HUAWEI, E3372_INIT, 0, 0xffff, UQ_MSC_NO_INQUIRY,
  277             UQ_MSC_NO_GETMAXLUN),
  278         USB_QUIRK(IMAGINATION, DBX1, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  279             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_WRONG_CSWSIG),
  280         USB_QUIRK(INSYSTEM, USBCABLE, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI,
  281             UQ_MSC_FORCE_PROTO_ATAPI, UQ_MSC_NO_TEST_UNIT_READY,
  282             UQ_MSC_NO_START_STOP, UQ_MSC_ALT_IFACE_1),
  283         USB_QUIRK(INSYSTEM, ATAPI, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI,
  284             UQ_MSC_FORCE_PROTO_RBC),
  285         USB_QUIRK(INSYSTEM, STORAGE_V2, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI,
  286             UQ_MSC_FORCE_PROTO_RBC),
  287         USB_QUIRK(VIALABS, VL701, 0x0000, 0xffff, UQ_MSC_NO_INQUIRY),
  288         USB_QUIRK(IODATA, IU_CD2, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  289             UQ_MSC_FORCE_PROTO_SCSI),
  290         USB_QUIRK(IODATA, DVR_UEH8, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  291             UQ_MSC_FORCE_PROTO_SCSI),
  292         USB_QUIRK(IOMEGA, ZIP100, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  293             UQ_MSC_FORCE_PROTO_SCSI,
  294             UQ_MSC_NO_TEST_UNIT_READY), /* XXX ZIP drives can also use ATAPI */
  295         USB_QUIRK(JMICRON, JMS566, 0x0000, 0xffff, UQ_MSC_NO_GETMAXLUN),
  296         USB_QUIRK(JMICRON, JMS567, 0x0000, 0xffff, UQ_MSC_NO_GETMAXLUN),
  297         USB_QUIRK(JMICRON, JM20337, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  298             UQ_MSC_FORCE_PROTO_SCSI,
  299             UQ_MSC_NO_SYNC_CACHE),
  300         USB_QUIRK(KINGSTON, HYPERX3_0, 0x0000, 0xffff, UQ_MSC_NO_INQUIRY),
  301         USB_QUIRK(KINGSTON, DATATRAVELER3_0, 0x0000, 0xffff, UQ_MSC_NO_PREVENT_ALLOW, UQ_MSC_NO_SYNC_CACHE),
  302         USB_QUIRK(KYOCERA, FINECAM_L3, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  303             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY),
  304         USB_QUIRK(KYOCERA, FINECAM_S3X, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI,
  305             UQ_MSC_FORCE_PROTO_ATAPI, UQ_MSC_NO_INQUIRY),
  306         USB_QUIRK(KYOCERA, FINECAM_S4, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI,
  307             UQ_MSC_FORCE_PROTO_ATAPI, UQ_MSC_NO_INQUIRY),
  308         USB_QUIRK(KYOCERA, FINECAM_S5, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  309             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY),
  310         USB_QUIRK(LACIE, HD, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI,
  311             UQ_MSC_FORCE_PROTO_RBC),
  312         USB_QUIRK(LEXAR, CF_READER, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  313             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY),
  314         USB_QUIRK(LEXAR, JUMPSHOT, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI),
  315         USB_QUIRK(LEXAR, JUMPDRIVE, 0x0000, 0xffff, UQ_MSC_NO_INQUIRY),
  316         USB_QUIRK(LOGITEC, LDR_H443SU2, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI),
  317         USB_QUIRK(LOGITEC, LDR_H443U2, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  318             UQ_MSC_FORCE_PROTO_SCSI,),
  319         USB_QUIRK(MELCO, DUBPXXG, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  320             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_FORCE_SHORT_INQ,
  321             UQ_MSC_NO_START_STOP, UQ_MSC_IGNORE_RESIDUE),
  322         USB_QUIRK(MICROTECH, DPCM, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI,
  323             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_TEST_UNIT_READY,
  324             UQ_MSC_NO_START_STOP),
  325         USB_QUIRK(MICRON, REALSSD, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE),
  326         USB_QUIRK(MICROTECH, SCSIDB25, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  327             UQ_MSC_FORCE_PROTO_SCSI),
  328         USB_QUIRK(MICROTECH, SCSIHD50, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  329             UQ_MSC_FORCE_PROTO_SCSI),
  330         USB_QUIRK(MINOLTA, E223, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI),
  331         USB_QUIRK(MINOLTA, F300, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  332             UQ_MSC_FORCE_PROTO_SCSI),
  333         USB_QUIRK(MITSUMI, CDRRW, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI |
  334             UQ_MSC_FORCE_PROTO_ATAPI),
  335         USB_QUIRK(MOTOROLA2, E398, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  336             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_FORCE_SHORT_INQ,
  337             UQ_MSC_NO_INQUIRY_EVPD, UQ_MSC_NO_GETMAXLUN),
  338         USB_QUIRK_VP(USB_VENDOR_MPMAN, 0, UQ_MSC_NO_SYNC_CACHE,
  339             UQ_MATCH_VENDOR_ONLY),
  340         USB_QUIRK(MSYSTEMS, DISKONKEY, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  341             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_IGNORE_RESIDUE, UQ_MSC_NO_GETMAXLUN,
  342             UQ_MSC_NO_RS_CLEAR_UA),
  343         USB_QUIRK(MSYSTEMS, DISKONKEY2, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  344             UQ_MSC_FORCE_PROTO_ATAPI),
  345         USB_QUIRK(MYSON, HEDEN, 0x0000, 0xffff, UQ_MSC_IGNORE_RESIDUE,
  346             UQ_MSC_NO_SYNC_CACHE),
  347         USB_QUIRK(NEODIO, ND3260, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  348             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_FORCE_SHORT_INQ),
  349         USB_QUIRK(NETAC, CF_CARD, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  350             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY),
  351         USB_QUIRK(NETAC, ONLYDISK, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  352             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_IGNORE_RESIDUE),
  353         USB_QUIRK(NETCHIP, CLIK_40, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_ATAPI,
  354             UQ_MSC_NO_INQUIRY),
  355         USB_QUIRK(NETCHIP, POCKETBOOK, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE),
  356         USB_QUIRK(NIKON, D300, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  357             UQ_MSC_FORCE_PROTO_SCSI),
  358         USB_QUIRK(OLYMPUS, C1, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  359             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_WRONG_CSWSIG),
  360         USB_QUIRK(OLYMPUS, C700, 0x0000, 0xffff, UQ_MSC_NO_GETMAXLUN),
  361         /* Selected Olympus DSLR and EVIL models.  See ../usbdevs for more
  362          * details.
  363          *
  364          * Not all quirks apply to all models.  The commented-out entries are
  365          * correct for that model.
  366          */
  367         USB_QUIRK(OLYMPUS, E_1, 0x0000, 0xffff, UQ_MSC_NO_GETMAXLUN,
  368             UQ_MSC_NO_TEST_UNIT_READY, UQ_MSC_NO_PREVENT_ALLOW,
  369             UQ_MSC_NO_SYNC_CACHE),
  370         /*
  371          * Product code 0x118.
  372          * USB_QUIRK(OLYMPUS, E_300, 0x0000, 0xffff, UQ_MSC_NO_GETMAXLUN,
  373          *     UQ_MSC_NO_TEST_UNIT_READY, UQ_MSC_NO_PREVENT_ALLOW,
  374          *     UQ_MSC_NO_SYNC_CACHE),
  375          * USB_QUIRK(OLYMPUS, E_30, 0x0000, 0xffff, UQ_MSC_NO_GETMAXLUN,
  376          *     UQ_MSC_NO_TEST_UNIT_READY, UQ_MSC_NO_PREVENT_ALLOW,
  377          *     UQ_MSC_NO_SYNC_CACHE), */
  378         USB_QUIRK(OLYMPUS, E_330, 0x0000, 0xffff, UQ_MSC_NO_GETMAXLUN,
  379             UQ_MSC_NO_TEST_UNIT_READY, UQ_MSC_NO_PREVENT_ALLOW,
  380             UQ_MSC_NO_SYNC_CACHE, UQ_MSC_NO_START_STOP),
  381         USB_QUIRK(OLYMPUS, E_PM1, 0x0000, 0xffff, UQ_MSC_NO_GETMAXLUN,
  382             UQ_MSC_NO_TEST_UNIT_READY, UQ_MSC_NO_PREVENT_ALLOW,
  383             UQ_MSC_NO_SYNC_CACHE, UQ_MSC_NO_START_STOP),
  384         /* Product code 0x12e.
  385          * USB_QUIRK(OLYMPUS, E_PM2, 0x0000, 0xffff, 0),
  386          * USB_QUIRK(OLYMPUS, E_M1MarkII, 0x0000, 0xffff, UQ_MSC_NO_GETMAXLUN,
  387          *     UQ_MSC_NO_TEST_UNIT_READY, UQ_MSC_NO_PREVENT_ALLOW,
  388          *     UQ_MSC_NO_SYNC_CACHE),
  389          * USB_QUIRK(OLYMPUS, E_M5MarkIII, 0x0000, 0xffff, 0),
  390          */
  391         USB_QUIRK(OLYMPUS, E_M1, 0x0000, 0xffff, UQ_MSC_NO_GETMAXLUN,
  392             UQ_MSC_NO_TEST_UNIT_READY, UQ_MSC_NO_PREVENT_ALLOW,
  393             UQ_MSC_NO_SYNC_CACHE, UQ_MSC_NO_START_STOP),
  394         USB_QUIRK(ONSPEC, SDS_HOTFIND_D, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  395             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_GETMAXLUN, UQ_MSC_NO_SYNC_CACHE),
  396         USB_QUIRK(ONSPEC, CFMS_RW, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI),
  397         USB_QUIRK(ONSPEC, CFSM_COMBO, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI),
  398         USB_QUIRK(ONSPEC, CFSM_READER, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI),
  399         USB_QUIRK(ONSPEC, CFSM_READER2, 0x0000, 0xffff,
  400             UQ_MSC_FORCE_PROTO_SCSI),
  401         USB_QUIRK(ONSPEC, MDCFE_B_CF_READER, 0x0000, 0xffff,
  402             UQ_MSC_FORCE_PROTO_SCSI),
  403         USB_QUIRK(ONSPEC, MDSM_B_READER, 0x0000, 0xffff,
  404             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY),
  405         USB_QUIRK(ONSPEC, READER, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI),
  406         USB_QUIRK(ONSPEC, UCF100, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  407             UQ_MSC_FORCE_PROTO_ATAPI, UQ_MSC_NO_INQUIRY, UQ_MSC_NO_GETMAXLUN),
  408         USB_QUIRK(ONSPEC2, IMAGEMATE_SDDR55, 0x0000, 0xffff,
  409             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_GETMAXLUN),
  410         USB_QUIRK(PANASONIC, KXL840AN, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  411             UQ_MSC_FORCE_PROTO_ATAPI, UQ_MSC_NO_GETMAXLUN),
  412         USB_QUIRK(PANASONIC, KXLCB20AN, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  413             UQ_MSC_FORCE_PROTO_SCSI),
  414         USB_QUIRK(PANASONIC, KXLCB35AN, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  415             UQ_MSC_FORCE_PROTO_SCSI),
  416         USB_QUIRK(PANASONIC, LS120CAM, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_UFI),
  417         USB_QUIRK(PLEXTOR, 40_12_40U, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  418             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_TEST_UNIT_READY),
  419         USB_QUIRK(PNY, ATTACHE2, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  420             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_IGNORE_RESIDUE,
  421             UQ_MSC_NO_START_STOP),
  422         USB_QUIRK(PROLIFIC, PL2506, 0x0000, 0xffff,
  423             UQ_MSC_NO_SYNC_CACHE, UQ_MSC_NO_PREVENT_ALLOW),
  424         USB_QUIRK_VP(USB_VENDOR_SAMSUNG_TECHWIN,
  425             USB_PRODUCT_SAMSUNG_TECHWIN_DIGIMAX_410, UQ_MSC_FORCE_WIRE_BBB,
  426             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY),
  427         USB_QUIRK(SANDISK, SDDR05A, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI,
  428             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_READ_CAP_OFFBY1,
  429             UQ_MSC_NO_GETMAXLUN),
  430         USB_QUIRK(SANDISK, SDDR09, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI,
  431             UQ_MSC_READ_CAP_OFFBY1, UQ_MSC_NO_GETMAXLUN),
  432         USB_QUIRK(SANDISK, SDDR12, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI,
  433             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_READ_CAP_OFFBY1,
  434             UQ_MSC_NO_GETMAXLUN),
  435         USB_QUIRK(SANDISK, SDCZ2_128, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  436             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_IGNORE_RESIDUE,
  437             UQ_MSC_NO_SYNC_CACHE),
  438         USB_QUIRK(SANDISK, SDCZ2_256, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  439             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_IGNORE_RESIDUE),
  440         USB_QUIRK(SANDISK, SDCZ4_128, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  441             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_IGNORE_RESIDUE),
  442         USB_QUIRK(SANDISK, SDCZ4_256, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  443             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_IGNORE_RESIDUE),
  444         USB_QUIRK(SANDISK, SDCZ48_32, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE,
  445             UQ_MSC_NO_TEST_UNIT_READY),
  446         USB_QUIRK(SANDISK, SDDR31, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  447             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_READ_CAP_OFFBY1),
  448         USB_QUIRK(SANDISK, IMAGEMATE_SDDR289, 0x0000, 0xffff,
  449             UQ_MSC_NO_SYNC_CACHE, UQ_MSC_NO_GETMAXLUN),
  450         USB_QUIRK(SCANLOGIC, SL11R, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  451             UQ_MSC_FORCE_PROTO_ATAPI, UQ_MSC_NO_INQUIRY),
  452         USB_QUIRK(SHUTTLE, EUSB, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI_I,
  453             UQ_MSC_FORCE_PROTO_ATAPI, UQ_MSC_NO_TEST_UNIT_READY,
  454             UQ_MSC_NO_START_STOP, UQ_MSC_SHUTTLE_INIT),
  455         USB_QUIRK(SHUTTLE, CDRW, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI,
  456             UQ_MSC_FORCE_PROTO_ATAPI),
  457         USB_QUIRK(SHUTTLE, CF, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI,
  458             UQ_MSC_FORCE_PROTO_ATAPI),
  459         USB_QUIRK(SHUTTLE, EUSBATAPI, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI,
  460             UQ_MSC_FORCE_PROTO_ATAPI),
  461         USB_QUIRK(SHUTTLE, EUSBCFSM, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI),
  462         USB_QUIRK(SHUTTLE, EUSCSI, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  463             UQ_MSC_FORCE_PROTO_SCSI),
  464         USB_QUIRK(SHUTTLE, HIFD, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI,
  465             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_GETMAXLUN),
  466         USB_QUIRK(SHUTTLE, SDDR09, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI,
  467             UQ_MSC_NO_GETMAXLUN),
  468         USB_QUIRK(SHUTTLE, ZIOMMC, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI,
  469             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_GETMAXLUN),
  470         USB_QUIRK(SIGMATEL, I_BEAD100, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  471             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_SHUTTLE_INIT),
  472         USB_QUIRK(SIIG, WINTERREADER, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  473             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_IGNORE_RESIDUE),
  474         USB_QUIRK(SKANHEX, MD_7425, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  475             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY),
  476         USB_QUIRK(SKANHEX, SX_520Z, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  477             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY),
  478         USB_QUIRK(SONY, HANDYCAM, 0x0500, 0x0500, UQ_MSC_FORCE_WIRE_CBI,
  479             UQ_MSC_FORCE_PROTO_RBC, UQ_MSC_RBC_PAD_TO_12),
  480         USB_QUIRK(SONY, CLIE_40_MS, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  481             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY),
  482         USB_QUIRK(SONY, DSC, 0x0500, 0x0500, UQ_MSC_FORCE_WIRE_CBI,
  483             UQ_MSC_FORCE_PROTO_RBC, UQ_MSC_RBC_PAD_TO_12),
  484         USB_QUIRK(SONY, DSC, 0x0600, 0x0600, UQ_MSC_FORCE_WIRE_CBI,
  485             UQ_MSC_FORCE_PROTO_RBC, UQ_MSC_RBC_PAD_TO_12),
  486         USB_QUIRK(SONY, DSC, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI,
  487             UQ_MSC_FORCE_PROTO_RBC),
  488         USB_QUIRK(SONY, HANDYCAM, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI,
  489             UQ_MSC_FORCE_PROTO_RBC),
  490         USB_QUIRK(SONY, MSC, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI,
  491             UQ_MSC_FORCE_PROTO_RBC),
  492         USB_QUIRK(SONY, MS_MSC_U03, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI,
  493             UQ_MSC_FORCE_PROTO_UFI, UQ_MSC_NO_GETMAXLUN),
  494         USB_QUIRK(SONY, MS_NW_MS7, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  495             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_GETMAXLUN),
  496         USB_QUIRK(SONY, MS_PEG_N760C, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  497             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY),
  498         USB_QUIRK(SONY, MSACUS1, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  499             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_GETMAXLUN),
  500         USB_QUIRK(SONY, PORTABLE_HDD_V2, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  501             UQ_MSC_FORCE_PROTO_SCSI),
  502         USB_QUIRK(STMICRO, ST72682, 0x0000, 0xffff, UQ_MSC_NO_PREVENT_ALLOW),
  503         USB_QUIRK(SUPERTOP, IDE, 0x0000, 0xffff, UQ_MSC_IGNORE_RESIDUE,
  504             UQ_MSC_NO_SYNC_CACHE),
  505         USB_QUIRK(SUPERTOP, FLASHDRIVE, 0x0000, 0xffff, UQ_MSC_NO_TEST_UNIT_READY,
  506             UQ_MSC_NO_SYNC_CACHE),
  507         USB_QUIRK(TAUGA, CAMERAMATE, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI),
  508         USB_QUIRK(TEAC, FD05PUB, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI,
  509             UQ_MSC_FORCE_PROTO_UFI),
  510         USB_QUIRK(TECLAST, TLC300, 0x0000, 0xffff, UQ_MSC_NO_TEST_UNIT_READY,
  511             UQ_MSC_NO_SYNC_CACHE),
  512         USB_QUIRK(TREK, MEMKEY, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  513             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY),
  514         USB_QUIRK(TREK, THUMBDRIVE_8MB, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  515             UQ_MSC_FORCE_PROTO_ATAPI, UQ_MSC_IGNORE_RESIDUE),
  516         USB_QUIRK(TRUMPION, C3310, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI,
  517             UQ_MSC_FORCE_PROTO_UFI),
  518         USB_QUIRK(TRUMPION, MP3, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_RBC),
  519         USB_QUIRK(TRUMPION, T33520, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI),
  520         USB_QUIRK(TWINMOS, MDIV, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  521             UQ_MSC_FORCE_PROTO_SCSI),
  522         USB_QUIRK(VIA, USB2IDEBRIDGE, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  523             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_SYNC_CACHE),
  524         USB_QUIRK(VIVITAR, 35XX, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  525             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY),
  526         USB_QUIRK(WESTERN, COMBO, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  527             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_FORCE_SHORT_INQ,
  528             UQ_MSC_NO_START_STOP, UQ_MSC_IGNORE_RESIDUE),
  529         USB_QUIRK(WESTERN, EXTHDD, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  530             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_FORCE_SHORT_INQ,
  531             UQ_MSC_NO_START_STOP, UQ_MSC_IGNORE_RESIDUE),
  532         USB_QUIRK(WESTERN, MYBOOK, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  533             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY_EVPD,
  534             UQ_MSC_NO_SYNC_CACHE),
  535         USB_QUIRK(WESTERN, MYPASSPORT_00, 0x0000, 0xffff, UQ_MSC_FORCE_SHORT_INQ),
  536         USB_QUIRK(WESTERN, MYPASSPORT_01, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE),
  537         USB_QUIRK(WESTERN, MYPASSPORT_02, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE),
  538         USB_QUIRK(WESTERN, MYPASSPORT_03, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE),
  539         USB_QUIRK(WESTERN, MYPASSPORT_04, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE),
  540         USB_QUIRK(WESTERN, MYPASSPORT_05, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE),
  541         USB_QUIRK(WESTERN, MYPASSPORT_06, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE),
  542         USB_QUIRK(WESTERN, MYPASSPORT_07, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE),
  543         USB_QUIRK(WESTERN, MYPASSPORT_08, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE),
  544         USB_QUIRK(WESTERN, MYPASSPORT_09, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE),
  545         USB_QUIRK(WESTERN, MYPASSPORT_10, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE),
  546         USB_QUIRK(WESTERN, MYPASSPORT_11, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE),
  547         USB_QUIRK(WESTERN, MYPASSPORTES_00, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE),
  548         USB_QUIRK(WESTERN, MYPASSPORTES_01, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE),
  549         USB_QUIRK(WESTERN, MYPASSPORTES_02, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE),
  550         USB_QUIRK(WESTERN, MYPASSPORTES_03, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE),
  551         USB_QUIRK(WESTERN, MYPASSPORTES_04, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE),
  552         USB_QUIRK(WESTERN, MYPASSPORTES_05, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE),
  553         USB_QUIRK(WESTERN, MYPASSPORTES_06, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE),
  554         USB_QUIRK(WESTERN, MYPASSPORTES_07, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE),
  555         USB_QUIRK(WESTERN, MYPASSPORTES_08, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE),
  556         USB_QUIRK(WESTERN, MYPASSPORTES_09, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE),
  557         USB_QUIRK(WINMAXGROUP, FLASH64MC, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  558             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY),
  559         USB_QUIRK(YANO, FW800HD, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  560             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_FORCE_SHORT_INQ,
  561             UQ_MSC_NO_START_STOP, UQ_MSC_IGNORE_RESIDUE),
  562         USB_QUIRK(YANO, U640MO, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI_I,
  563             UQ_MSC_FORCE_PROTO_ATAPI, UQ_MSC_FORCE_SHORT_INQ),
  564         USB_QUIRK(YEDATA, FLASHBUSTERU, 0x0000, 0x007F, UQ_MSC_FORCE_WIRE_CBI,
  565             UQ_MSC_FORCE_PROTO_UFI, UQ_MSC_NO_RS_CLEAR_UA, UQ_MSC_FLOPPY_SPEED,
  566             UQ_MSC_NO_TEST_UNIT_READY, UQ_MSC_NO_GETMAXLUN),
  567         USB_QUIRK(YEDATA, FLASHBUSTERU, 0x0080, 0x0080, UQ_MSC_FORCE_WIRE_CBI_I,
  568             UQ_MSC_FORCE_PROTO_UFI, UQ_MSC_NO_RS_CLEAR_UA, UQ_MSC_FLOPPY_SPEED,
  569             UQ_MSC_NO_TEST_UNIT_READY, UQ_MSC_NO_GETMAXLUN),
  570         USB_QUIRK(YEDATA, FLASHBUSTERU, 0x0081, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI_I,
  571             UQ_MSC_FORCE_PROTO_UFI, UQ_MSC_NO_RS_CLEAR_UA, UQ_MSC_FLOPPY_SPEED,
  572             UQ_MSC_NO_GETMAXLUN),
  573         USB_QUIRK(ZORAN, EX20DSC, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI,
  574             UQ_MSC_FORCE_PROTO_ATAPI),
  575         USB_QUIRK(MEIZU, M6_SL, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
  576             UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY, UQ_MSC_NO_SYNC_CACHE),
  577         USB_QUIRK(TOSHIBA, TRANSMEMORY, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE,
  578             UQ_MSC_NO_PREVENT_ALLOW),
  579         USB_QUIRK(VIALABS, USB30SATABRIDGE, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE),
  580         USB_QUIRK(QUALCOMMINC, ZTE_MF730M, 0x0000, 0xffff, UQ_MSC_NO_GETMAXLUN,
  581             UQ_MSC_NO_INQUIRY, UQ_CFG_INDEX_0),
  582         USB_QUIRK(SMART2, G2MEMKEY, 0x0000, 0xffff, UQ_MSC_NO_INQUIRY),
  583         USB_QUIRK(RALINK, RT_STOR, 0x0001, 0x0001, UQ_MSC_IGNORE),
  584         USB_QUIRK(REALTEK, RTW8821CU_CD, 0x0001, 0x0001, UQ_MSC_IGNORE),
  585         /* Non-standard USB MIDI devices */
  586         USB_QUIRK(ROLAND, UM1, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
  587         USB_QUIRK(ROLAND, SC8850, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
  588         USB_QUIRK(ROLAND, SD90, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
  589         USB_QUIRK(ROLAND, UM880N, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
  590         USB_QUIRK(ROLAND, UA100, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
  591         USB_QUIRK(ROLAND, UM4, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
  592         USB_QUIRK(ROLAND, U8, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
  593         USB_QUIRK(ROLAND, UM2, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
  594         USB_QUIRK(ROLAND, SC8820, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
  595         USB_QUIRK(ROLAND, PC300, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
  596         USB_QUIRK(ROLAND, SK500, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
  597         USB_QUIRK(ROLAND, SCD70, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
  598         USB_QUIRK(ROLAND, UM550, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
  599         USB_QUIRK(ROLAND, SD20, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
  600         USB_QUIRK(ROLAND, SD80, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
  601         USB_QUIRK(ROLAND, UA700, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
  602         USB_QUIRK(ROLAND, PCR300, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
  603         USB_QUIRK(EGO, M4U, 0x0000, 0xffff, UQ_SINGLE_CMD_MIDI),
  604         USB_QUIRK(LOGILINK, U2M, 0x0000, 0xffff, UQ_SINGLE_CMD_MIDI),
  605         USB_QUIRK(MEDELI, DD305, 0x0000, 0xffff, UQ_SINGLE_CMD_MIDI, UQ_MATCH_VENDOR_ONLY),
  606         USB_QUIRK(REDOCTANE, GHMIDI, 0x0000, 0xffff, UQ_SINGLE_CMD_MIDI),
  607         USB_QUIRK(TEXTECH, U2M_1, 0x0000, 0xffff, UQ_SINGLE_CMD_MIDI),
  608         USB_QUIRK(TEXTECH, U2M_2, 0x0000, 0xffff, UQ_SINGLE_CMD_MIDI),
  609         USB_QUIRK(WCH2, U2M, 0x0000, 0xffff, UQ_SINGLE_CMD_MIDI),
  610 
  611         /* Non-standard USB AUDIO devices */
  612         USB_QUIRK(MAUDIO, FASTTRACKULTRA, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
  613         USB_QUIRK(MAUDIO, FASTTRACKULTRA8R, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
  614         USB_QUIRK(CMEDIA, CM6206, 0x0000, 0xffff, UQ_AU_SET_SPDIF_CM6206),
  615         USB_QUIRK(PLOYTEC, SPL_CRIMSON_1, 0x0000, 0xffff, UQ_CFG_INDEX_1),
  616         USB_QUIRK(ROLAND, UA25EX_AD, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
  617 
  618         /*
  619          * Quirks for manufacturers which USB devices does not respond
  620          * after issuing non-supported commands:
  621          */
  622         USB_QUIRK(ALCOR, DUMMY, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE, UQ_MSC_NO_TEST_UNIT_READY, UQ_MATCH_VENDOR_ONLY),
  623         USB_QUIRK(APPLE, DUMMY, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE, UQ_MATCH_VENDOR_ONLY),
  624         USB_QUIRK(FEIYA, DUMMY, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE, UQ_MATCH_VENDOR_ONLY),
  625         USB_QUIRK(REALTEK, DUMMY, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE, UQ_MATCH_VENDOR_ONLY),
  626         USB_QUIRK(INITIO, DUMMY, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE, UQ_MATCH_VENDOR_ONLY),
  627 
  628         /* DYMO LabelManager Pnp */
  629         USB_QUIRK(DYMO, LABELMANAGERPNP, 0x0000, 0xffff, UQ_MSC_DYMO_EJECT),
  630 
  631         /* Holtek USB gaming keyboard */
  632         USB_QUIRK(HOLTEK, F85, 0x0000, 0xffff, UQ_KBD_BOOTPROTO),
  633 };
  634 #undef USB_QUIRK_VP
  635 #undef USB_QUIRK
  636 
  637 static const char *usb_quirk_str[USB_QUIRK_MAX] = {
  638         [UQ_NONE]               = "UQ_NONE",
  639         [UQ_MATCH_VENDOR_ONLY]  = "UQ_MATCH_VENDOR_ONLY",
  640         [UQ_AUDIO_SWAP_LR]      = "UQ_AUDIO_SWAP_LR",
  641         [UQ_AU_INP_ASYNC]       = "UQ_AU_INP_ASYNC",
  642         [UQ_AU_NO_FRAC]         = "UQ_AU_NO_FRAC",
  643         [UQ_AU_NO_XU]           = "UQ_AU_NO_XU",
  644         [UQ_BAD_ADC]            = "UQ_BAD_ADC",
  645         [UQ_BAD_AUDIO]          = "UQ_BAD_AUDIO",
  646         [UQ_BROKEN_BIDIR]       = "UQ_BROKEN_BIDIR",
  647         [UQ_BUS_POWERED]        = "UQ_BUS_POWERED",
  648         [UQ_HID_IGNORE]         = "UQ_HID_IGNORE",
  649         [UQ_KBD_IGNORE]         = "UQ_KBD_IGNORE",
  650         [UQ_KBD_BOOTPROTO]      = "UQ_KBD_BOOTPROTO",
  651         [UQ_UMS_IGNORE]         = "UQ_UMS_IGNORE",
  652         [UQ_MS_BAD_CLASS]       = "UQ_MS_BAD_CLASS",
  653         [UQ_MS_LEADING_BYTE]    = "UQ_MS_LEADING_BYTE",
  654         [UQ_MS_REVZ]            = "UQ_MS_REVZ",
  655         [UQ_MS_VENDOR_BTN]      = "UQ_MS_VENDOR_BTN",
  656         [UQ_NO_STRINGS]         = "UQ_NO_STRINGS",
  657         [UQ_POWER_CLAIM]        = "UQ_POWER_CLAIM",
  658         [UQ_SPUR_BUT_UP]        = "UQ_SPUR_BUT_UP",
  659         [UQ_SWAP_UNICODE]       = "UQ_SWAP_UNICODE",
  660         [UQ_CFG_INDEX_1]        = "UQ_CFG_INDEX_1",
  661         [UQ_CFG_INDEX_2]        = "UQ_CFG_INDEX_2",
  662         [UQ_CFG_INDEX_3]        = "UQ_CFG_INDEX_3",
  663         [UQ_CFG_INDEX_4]        = "UQ_CFG_INDEX_4",
  664         [UQ_CFG_INDEX_0]        = "UQ_CFG_INDEX_0",
  665         [UQ_ASSUME_CM_OVER_DATA]        = "UQ_ASSUME_CM_OVER_DATA",
  666         [UQ_IGNORE_CDC_CM]      = "UQ_IGNORE_CDC_CM",
  667         [UQ_MSC_NO_TEST_UNIT_READY]     = "UQ_MSC_NO_TEST_UNIT_READY",
  668         [UQ_MSC_NO_RS_CLEAR_UA]         = "UQ_MSC_NO_RS_CLEAR_UA",
  669         [UQ_MSC_NO_START_STOP]          = "UQ_MSC_NO_START_STOP",
  670         [UQ_MSC_NO_GETMAXLUN]           = "UQ_MSC_NO_GETMAXLUN",
  671         [UQ_MSC_NO_INQUIRY]             = "UQ_MSC_NO_INQUIRY",
  672         [UQ_MSC_NO_INQUIRY_EVPD]        = "UQ_MSC_NO_INQUIRY_EVPD",
  673         [UQ_MSC_NO_PREVENT_ALLOW]       = "UQ_MSC_NO_PREVENT_ALLOW",
  674         [UQ_MSC_NO_SYNC_CACHE]          = "UQ_MSC_NO_SYNC_CACHE",
  675         [UQ_MSC_SHUTTLE_INIT]           = "UQ_MSC_SHUTTLE_INIT",
  676         [UQ_MSC_ALT_IFACE_1]            = "UQ_MSC_ALT_IFACE_1",
  677         [UQ_MSC_FLOPPY_SPEED]           = "UQ_MSC_FLOPPY_SPEED",
  678         [UQ_MSC_IGNORE_RESIDUE]         = "UQ_MSC_IGNORE_RESIDUE",
  679         [UQ_MSC_WRONG_CSWSIG]           = "UQ_MSC_WRONG_CSWSIG",
  680         [UQ_MSC_RBC_PAD_TO_12]          = "UQ_MSC_RBC_PAD_TO_12",
  681         [UQ_MSC_READ_CAP_OFFBY1]        = "UQ_MSC_READ_CAP_OFFBY1",
  682         [UQ_MSC_FORCE_SHORT_INQ]        = "UQ_MSC_FORCE_SHORT_INQ",
  683         [UQ_MSC_FORCE_WIRE_BBB]         = "UQ_MSC_FORCE_WIRE_BBB",
  684         [UQ_MSC_FORCE_WIRE_CBI]         = "UQ_MSC_FORCE_WIRE_CBI",
  685         [UQ_MSC_FORCE_WIRE_CBI_I]       = "UQ_MSC_FORCE_WIRE_CBI_I",
  686         [UQ_MSC_FORCE_PROTO_SCSI]       = "UQ_MSC_FORCE_PROTO_SCSI",
  687         [UQ_MSC_FORCE_PROTO_ATAPI]      = "UQ_MSC_FORCE_PROTO_ATAPI",
  688         [UQ_MSC_FORCE_PROTO_UFI]        = "UQ_MSC_FORCE_PROTO_UFI",
  689         [UQ_MSC_FORCE_PROTO_RBC]        = "UQ_MSC_FORCE_PROTO_RBC",
  690         [UQ_MSC_IGNORE]                 = "UQ_MSC_IGNORE",
  691         [UQ_MSC_EJECT_HUAWEI]           = "UQ_MSC_EJECT_HUAWEI",
  692         [UQ_MSC_EJECT_SIERRA]           = "UQ_MSC_EJECT_SIERRA",
  693         [UQ_MSC_EJECT_SCSIEJECT]        = "UQ_MSC_EJECT_SCSIEJECT",
  694         [UQ_MSC_EJECT_REZERO]           = "UQ_MSC_EJECT_REZERO",
  695         [UQ_MSC_EJECT_ZTESTOR]          = "UQ_MSC_EJECT_ZTESTOR",
  696         [UQ_MSC_EJECT_CMOTECH]          = "UQ_MSC_EJECT_CMOTECH",
  697         [UQ_MSC_EJECT_WAIT]             = "UQ_MSC_EJECT_WAIT",
  698         [UQ_MSC_EJECT_SAEL_M460]        = "UQ_MSC_EJECT_SAEL_M460",
  699         [UQ_MSC_EJECT_HUAWEISCSI]       = "UQ_MSC_EJECT_HUAWEISCSI",
  700         [UQ_MSC_EJECT_HUAWEISCSI2]      = "UQ_MSC_EJECT_HUAWEISCSI2",
  701         [UQ_MSC_EJECT_TCT]              = "UQ_MSC_EJECT_TCT",
  702         [UQ_BAD_MIDI]                   = "UQ_BAD_MIDI",
  703         [UQ_AU_VENDOR_CLASS]            = "UQ_AU_VENDOR_CLASS",
  704         [UQ_SINGLE_CMD_MIDI]            = "UQ_SINGLE_CMD_MIDI",
  705         [UQ_MSC_DYMO_EJECT]             = "UQ_MSC_DYMO_EJECT",
  706         [UQ_AU_SET_SPDIF_CM6206]        = "UQ_AU_SET_SPDIF_CM6206",
  707         [UQ_WMT_IGNORE]                 = "UQ_WMT_IGNORE",
  708 };
  709 
  710 /*------------------------------------------------------------------------*
  711  *      usb_quirkstr
  712  *
  713  * This function converts an USB quirk code into a string.
  714  *------------------------------------------------------------------------*/
  715 static const char *
  716 usb_quirkstr(uint16_t quirk)
  717 {
  718         return ((quirk < USB_QUIRK_MAX && usb_quirk_str[quirk] != NULL) ?
  719             usb_quirk_str[quirk] : "UQ_UNKNOWN");
  720 }
  721 
  722 /*------------------------------------------------------------------------*
  723  *      usb_strquirk
  724  *
  725  * This function converts a string into a USB quirk code.
  726  *
  727  * Returns:
  728  * Less than USB_QUIRK_MAX: Quirk code
  729  * Else: Quirk code not found
  730  *------------------------------------------------------------------------*/
  731 static uint16_t
  732 usb_strquirk(const char *str, size_t len)
  733 {
  734         const char *quirk;
  735         uint16_t x;
  736 
  737         for (x = 0; x != USB_QUIRK_MAX; x++) {
  738                 quirk = usb_quirkstr(x);
  739                 if (strncmp(str, quirk, len) == 0 &&
  740                     quirk[len] == 0)
  741                         break;
  742         }
  743         return (x);
  744 }
  745 
  746 /*------------------------------------------------------------------------*
  747  *      usb_test_quirk_by_info
  748  *
  749  * Returns:
  750  * 0: Quirk not found
  751  * Else: Quirk found
  752  *------------------------------------------------------------------------*/
  753 static uint8_t
  754 usb_test_quirk_by_info(const struct usbd_lookup_info *info, uint16_t quirk)
  755 {
  756         uint16_t x;
  757         uint16_t y;
  758 
  759         if (quirk == UQ_NONE)
  760                 goto done;
  761 
  762         USB_MTX_LOCK(&usb_quirk_mtx);
  763 
  764         for (x = 0; x != USB_DEV_QUIRKS_MAX; x++) {
  765                 /* see if quirk information does not match */
  766                 if ((usb_quirks[x].vid != info->idVendor) ||
  767                     (usb_quirks[x].lo_rev > info->bcdDevice) ||
  768                     (usb_quirks[x].hi_rev < info->bcdDevice)) {
  769                         continue;
  770                 }
  771                 /* see if quirk only should match vendor ID */
  772                 if (usb_quirks[x].pid != info->idProduct) {
  773                         if (usb_quirks[x].pid != 0)
  774                                 continue;
  775 
  776                         for (y = 0; y != USB_SUB_QUIRKS_MAX; y++) {
  777                                 if (usb_quirks[x].quirks[y] == UQ_MATCH_VENDOR_ONLY)
  778                                         break;
  779                         }
  780                         if (y == USB_SUB_QUIRKS_MAX)
  781                                 continue;
  782                 }
  783                 /* lookup quirk */
  784                 for (y = 0; y != USB_SUB_QUIRKS_MAX; y++) {
  785                         if (usb_quirks[x].quirks[y] == quirk) {
  786                                 USB_MTX_UNLOCK(&usb_quirk_mtx);
  787                                 DPRINTF("Found quirk '%s'.\n", usb_quirkstr(quirk));
  788                                 return (1);
  789                         }
  790                 }
  791         }
  792         USB_MTX_UNLOCK(&usb_quirk_mtx);
  793 done:
  794         return (0);                     /* no quirk match */
  795 }
  796 
  797 static struct usb_quirk_entry *
  798 usb_quirk_get_entry(uint16_t vid, uint16_t pid,
  799     uint16_t lo_rev, uint16_t hi_rev, uint8_t do_alloc)
  800 {
  801         uint16_t x;
  802 
  803         USB_MTX_ASSERT(&usb_quirk_mtx, MA_OWNED);
  804 
  805         if ((vid | pid | lo_rev | hi_rev) == 0) {
  806                 /* all zero - special case */
  807                 return (usb_quirks + USB_DEV_QUIRKS_MAX - 1);
  808         }
  809         /* search for an existing entry */
  810         for (x = 0; x != USB_DEV_QUIRKS_MAX; x++) {
  811                 /* see if quirk information does not match */
  812                 if ((usb_quirks[x].vid != vid) ||
  813                     (usb_quirks[x].pid != pid) ||
  814                     (usb_quirks[x].lo_rev != lo_rev) ||
  815                     (usb_quirks[x].hi_rev != hi_rev)) {
  816                         continue;
  817                 }
  818                 return (usb_quirks + x);
  819         }
  820 
  821         if (do_alloc == 0) {
  822                 /* no match */
  823                 return (NULL);
  824         }
  825         /* search for a free entry */
  826         for (x = 0; x != USB_DEV_QUIRKS_MAX; x++) {
  827                 /* see if quirk information does not match */
  828                 if ((usb_quirks[x].vid |
  829                     usb_quirks[x].pid |
  830                     usb_quirks[x].lo_rev |
  831                     usb_quirks[x].hi_rev) != 0) {
  832                         continue;
  833                 }
  834                 usb_quirks[x].vid = vid;
  835                 usb_quirks[x].pid = pid;
  836                 usb_quirks[x].lo_rev = lo_rev;
  837                 usb_quirks[x].hi_rev = hi_rev;
  838 
  839                 return (usb_quirks + x);
  840         }
  841 
  842         /* no entry found */
  843         return (NULL);
  844 }
  845 
  846 /*------------------------------------------------------------------------*
  847  *      usb_quirk_ioctl - handle quirk IOCTLs
  848  *
  849  * Returns:
  850  * 0: Success
  851  * Else: Failure
  852  *------------------------------------------------------------------------*/
  853 static int
  854 usb_quirk_ioctl(unsigned long cmd, caddr_t data,
  855     int fflag, struct thread *td)
  856 {
  857         struct usb_gen_quirk *pgq;
  858         struct usb_quirk_entry *pqe;
  859         uint32_t x;
  860         uint32_t y;
  861         int err;
  862 
  863         switch (cmd) {
  864         case USB_DEV_QUIRK_GET:
  865                 pgq = (void *)data;
  866                 x = pgq->index % USB_SUB_QUIRKS_MAX;
  867                 y = pgq->index / USB_SUB_QUIRKS_MAX;
  868                 if (y >= USB_DEV_QUIRKS_MAX) {
  869                         return (EINVAL);
  870                 }
  871                 USB_MTX_LOCK(&usb_quirk_mtx);
  872                 /* copy out data */
  873                 pgq->vid = usb_quirks[y].vid;
  874                 pgq->pid = usb_quirks[y].pid;
  875                 pgq->bcdDeviceLow = usb_quirks[y].lo_rev;
  876                 pgq->bcdDeviceHigh = usb_quirks[y].hi_rev;
  877                 strlcpy(pgq->quirkname,
  878                     usb_quirkstr(usb_quirks[y].quirks[x]),
  879                     sizeof(pgq->quirkname));
  880                 USB_MTX_UNLOCK(&usb_quirk_mtx);
  881                 return (0);             /* success */
  882 
  883         case USB_QUIRK_NAME_GET:
  884                 pgq = (void *)data;
  885                 x = pgq->index;
  886                 if (x >= USB_QUIRK_MAX) {
  887                         return (EINVAL);
  888                 }
  889                 strlcpy(pgq->quirkname,
  890                     usb_quirkstr(x), sizeof(pgq->quirkname));
  891                 return (0);             /* success */
  892 
  893         case USB_DEV_QUIRK_ADD:
  894                 pgq = (void *)data;
  895 
  896                 /* check privileges */
  897                 err = priv_check(curthread, PRIV_DRIVER);
  898                 if (err) {
  899                         return (err);
  900                 }
  901                 /* convert quirk string into numerical */
  902                 for (y = 0; y != USB_DEV_QUIRKS_MAX; y++) {
  903                         if (strcmp(pgq->quirkname, usb_quirkstr(y)) == 0) {
  904                                 break;
  905                         }
  906                 }
  907                 if (y == USB_DEV_QUIRKS_MAX) {
  908                         return (EINVAL);
  909                 }
  910                 if (y == UQ_NONE) {
  911                         return (EINVAL);
  912                 }
  913                 USB_MTX_LOCK(&usb_quirk_mtx);
  914                 pqe = usb_quirk_get_entry(pgq->vid, pgq->pid,
  915                     pgq->bcdDeviceLow, pgq->bcdDeviceHigh, 1);
  916                 if (pqe == NULL) {
  917                         USB_MTX_UNLOCK(&usb_quirk_mtx);
  918                         return (EINVAL);
  919                 }
  920                 for (x = 0; x != USB_SUB_QUIRKS_MAX; x++) {
  921                         if (pqe->quirks[x] == UQ_NONE) {
  922                                 pqe->quirks[x] = y;
  923                                 break;
  924                         }
  925                 }
  926                 USB_MTX_UNLOCK(&usb_quirk_mtx);
  927                 if (x == USB_SUB_QUIRKS_MAX) {
  928                         return (ENOMEM);
  929                 }
  930                 return (0);             /* success */
  931 
  932         case USB_DEV_QUIRK_REMOVE:
  933                 pgq = (void *)data;
  934                 /* check privileges */
  935                 err = priv_check(curthread, PRIV_DRIVER);
  936                 if (err) {
  937                         return (err);
  938                 }
  939                 /* convert quirk string into numerical */
  940                 for (y = 0; y != USB_DEV_QUIRKS_MAX; y++) {
  941                         if (strcmp(pgq->quirkname, usb_quirkstr(y)) == 0) {
  942                                 break;
  943                         }
  944                 }
  945                 if (y == USB_DEV_QUIRKS_MAX) {
  946                         return (EINVAL);
  947                 }
  948                 if (y == UQ_NONE) {
  949                         return (EINVAL);
  950                 }
  951                 USB_MTX_LOCK(&usb_quirk_mtx);
  952                 pqe = usb_quirk_get_entry(pgq->vid, pgq->pid,
  953                     pgq->bcdDeviceLow, pgq->bcdDeviceHigh, 0);
  954                 if (pqe == NULL) {
  955                         USB_MTX_UNLOCK(&usb_quirk_mtx);
  956                         return (EINVAL);
  957                 }
  958                 for (x = 0; x != USB_SUB_QUIRKS_MAX; x++) {
  959                         if (pqe->quirks[x] == y) {
  960                                 pqe->quirks[x] = UQ_NONE;
  961                                 break;
  962                         }
  963                 }
  964                 if (x == USB_SUB_QUIRKS_MAX) {
  965                         USB_MTX_UNLOCK(&usb_quirk_mtx);
  966                         return (ENOMEM);
  967                 }
  968                 for (x = 0; x != USB_SUB_QUIRKS_MAX; x++) {
  969                         if (pqe->quirks[x] != UQ_NONE) {
  970                                 break;
  971                         }
  972                 }
  973                 if (x == USB_SUB_QUIRKS_MAX) {
  974                         /* all quirk entries are unused - release */
  975                         memset(pqe, 0, sizeof(*pqe));
  976                 }
  977                 USB_MTX_UNLOCK(&usb_quirk_mtx);
  978                 return (0);             /* success */
  979 
  980         default:
  981                 break;
  982         }
  983         return (ENOIOCTL);
  984 }
  985 
  986 /*------------------------------------------------------------------------*
  987  *      usb_quirk_strtou16
  988  *
  989  * Helper function to scan a 16-bit integer.
  990  *------------------------------------------------------------------------*/
  991 static uint16_t
  992 usb_quirk_strtou16(const char **pptr, const char *name, const char *what)
  993 {
  994         unsigned long value;
  995         char *end;
  996 
  997         value = strtoul(*pptr, &end, 0);
  998         if (value > 65535 || *pptr == end || (*end != ' ' && *end != '\t')) {
  999                 printf("%s: %s 16-bit %s value set to zero\n",
 1000                     name, what, *end == 0 ? "incomplete" : "invalid");
 1001                 return (0);
 1002         }
 1003         *pptr = end + 1;
 1004         return ((uint16_t)value);
 1005 }
 1006 
 1007 /*------------------------------------------------------------------------*
 1008  *      usb_quirk_add_entry_from_str
 1009  *
 1010  * Add a USB quirk entry from string.
 1011  *     "VENDOR PRODUCT LO_REV HI_REV QUIRK[,QUIRK[,...]]"
 1012  *------------------------------------------------------------------------*/
 1013 static void
 1014 usb_quirk_add_entry_from_str(const char *name, const char *env)
 1015 {
 1016         struct usb_quirk_entry entry = { };
 1017         struct usb_quirk_entry *new;
 1018         uint16_t quirk_idx;
 1019         uint16_t quirk;
 1020         const char *end;
 1021 
 1022         /* check for invalid environment variable */
 1023         if (name == NULL || env == NULL)
 1024                 return;
 1025 
 1026         if (bootverbose)
 1027                 printf("Adding USB QUIRK '%s' = '%s'\n", name, env);
 1028 
 1029         /* parse device information */
 1030         entry.vid = usb_quirk_strtou16(&env, name, "Vendor ID");
 1031         entry.pid = usb_quirk_strtou16(&env, name, "Product ID");
 1032         entry.lo_rev = usb_quirk_strtou16(&env, name, "Low revision");
 1033         entry.hi_rev = usb_quirk_strtou16(&env, name, "High revision");
 1034 
 1035         /* parse quirk information */
 1036         quirk_idx = 0;
 1037         while (*env != 0 && quirk_idx != USB_SUB_QUIRKS_MAX) {
 1038                 /* skip whitespace before quirks */
 1039                 while (*env == ' ' || *env == '\t')
 1040                         env++;
 1041 
 1042                 /* look for quirk separation character */
 1043                 end = strchr(env, ',');
 1044                 if (end == NULL)
 1045                         end = env + strlen(env);
 1046 
 1047                 /* lookup quirk in string table */
 1048                 quirk = usb_strquirk(env, end - env);
 1049                 if (quirk < USB_QUIRK_MAX) {
 1050                         entry.quirks[quirk_idx++] = quirk;
 1051                 } else {
 1052                         printf("%s: unknown USB quirk '%.*s' (skipped)\n",
 1053                             name, (int)(end - env), env);
 1054                 }
 1055                 env = end;
 1056 
 1057                 /* skip quirk delimiter, if any */
 1058                 if (*env != 0)
 1059                         env++;
 1060         }
 1061 
 1062         /* register quirk */
 1063         if (quirk_idx != 0) {
 1064                 if (*env != 0) {
 1065                         printf("%s: Too many USB quirks, only %d allowed!\n",
 1066                             name, USB_SUB_QUIRKS_MAX);
 1067                 }
 1068                 USB_MTX_LOCK(&usb_quirk_mtx);
 1069                 new = usb_quirk_get_entry(entry.vid, entry.pid,
 1070                     entry.lo_rev, entry.hi_rev, 1);
 1071                 if (new == NULL)
 1072                         printf("%s: USB quirks table is full!\n", name);
 1073                 else
 1074                         memcpy(new->quirks, entry.quirks, sizeof(entry.quirks));
 1075                 USB_MTX_UNLOCK(&usb_quirk_mtx);
 1076         } else {
 1077                 printf("%s: No USB quirks found!\n", name);
 1078         }
 1079 }
 1080 
 1081 static void
 1082 usb_quirk_init(void *arg)
 1083 {
 1084         char envkey[sizeof(USB_QUIRK_ENVROOT) + 2];     /* 2 digits max, 0 to 99 */
 1085         int i;
 1086 
 1087         /* initialize mutex */
 1088         mtx_init(&usb_quirk_mtx, "USB quirk", NULL, MTX_DEF);
 1089 
 1090         /* look for quirks defined by the environment variable */
 1091         for (i = 0; i != 100; i++) {
 1092                 snprintf(envkey, sizeof(envkey), USB_QUIRK_ENVROOT "%d", i);
 1093 
 1094                 /* Stop at first undefined var */
 1095                 if (!testenv(envkey))
 1096                         break;
 1097 
 1098                 /* parse environment variable */
 1099                 usb_quirk_add_entry_from_str(envkey, kern_getenv(envkey));
 1100         }
 1101 
 1102         /* register our function */
 1103         usb_test_quirk_p = &usb_test_quirk_by_info;
 1104         usb_quirk_ioctl_p = &usb_quirk_ioctl;
 1105 }
 1106 
 1107 static void
 1108 usb_quirk_uninit(void *arg)
 1109 {
 1110         usb_quirk_unload(arg);
 1111 
 1112         /* destroy mutex */
 1113         mtx_destroy(&usb_quirk_mtx);
 1114 }
 1115 
 1116 SYSINIT(usb_quirk_init, SI_SUB_LOCK, SI_ORDER_FIRST, usb_quirk_init, NULL);
 1117 SYSUNINIT(usb_quirk_uninit, SI_SUB_LOCK, SI_ORDER_ANY, usb_quirk_uninit, NULL);

Cache object: 84a05fa705037e9949b2edfc290c4a22


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.