1 /* $FreeBSD: head/sys/dev/usb/quirk/usb_quirk.c 276239 2014-12-26 10:53:22Z hselasky $ */
3 * Copyright (c) 1998 The NetBSD Foundation, Inc. All rights reserved.
4 * Copyright (c) 1998 Lennart Augustsson. All rights reserved.
5 * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 #include <sys/stdint.h>
30 #include <sys/param.h>
31 #include <sys/queue.h>
32 #include <sys/types.h>
33 #include <sys/systm.h>
34 #include <sys/kernel.h>
36 #include <sys/module.h>
38 #include <sys/condvar.h>
39 #include <sys/sysctl.h>
40 #include <sys/unistd.h>
41 #include <sys/callout.h>
42 #include <sys/malloc.h>
44 #include <sys/thread2.h>
46 #include <bus/u4b/usb.h>
47 #include <bus/u4b/usb_ioctl.h>
48 #include <bus/u4b/usbdi.h>
51 #define USB_DEBUG_VAR usb_debug
52 #include <bus/u4b/usb_debug.h>
53 #include <bus/u4b/usb_dynamic.h>
55 #include <bus/u4b/quirk/usb_quirk.h>
57 MODULE_DEPEND(usb_quirk
, usb
, 1, 1, 1);
58 MODULE_VERSION(usb_quirk
, 1);
60 #define USB_DEV_QUIRKS_MAX 384
61 #define USB_SUB_QUIRKS_MAX 8
63 struct usb_quirk_entry
{
68 uint16_t quirks
[USB_SUB_QUIRKS_MAX
];
71 static struct lock usb_quirk_lock
;
73 #define USB_QUIRK_VP(v,p,l,h,...) \
74 { .vid = (v), .pid = (p), .lo_rev = (l), .hi_rev = (h), \
75 .quirks = { __VA_ARGS__ } }
76 #define USB_QUIRK(v,p,l,h,...) \
77 USB_QUIRK_VP(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, l, h, __VA_ARGS__)
79 static struct usb_quirk_entry usb_quirks
[USB_DEV_QUIRKS_MAX
] = {
80 USB_QUIRK(ASUS
, LCM
, 0x0000, 0xffff, UQ_HID_IGNORE
),
81 USB_QUIRK(INSIDEOUT
, EDGEPORT4
, 0x094, 0x094, UQ_SWAP_UNICODE
),
82 USB_QUIRK(DALLAS
, J6502
, 0x0a2, 0x0a2, UQ_BAD_ADC
),
83 USB_QUIRK(DALLAS
, J6502
, 0x0a2, 0x0a2, UQ_AU_NO_XU
),
84 USB_QUIRK(ALTEC
, ADA70
, 0x103, 0x103, UQ_BAD_ADC
),
85 USB_QUIRK(ALTEC
, ASC495
, 0x000, 0x000, UQ_BAD_AUDIO
),
86 USB_QUIRK(QTRONIX
, 980N
, 0x110, 0x110, UQ_SPUR_BUT_UP
),
87 USB_QUIRK(ALCOR2
, KBD_HUB
, 0x001, 0x001, UQ_SPUR_BUT_UP
),
88 USB_QUIRK(MCT
, HUB0100
, 0x102, 0x102, UQ_BUS_POWERED
),
89 USB_QUIRK(MCT
, USB232
, 0x102, 0x102, UQ_BUS_POWERED
),
90 USB_QUIRK(TI
, UTUSB41
, 0x110, 0x110, UQ_POWER_CLAIM
),
91 USB_QUIRK(TELEX
, MIC1
, 0x009, 0x009, UQ_AU_NO_FRAC
),
92 USB_QUIRK(SILICONPORTALS
, YAPPHONE
, 0x100, 0x100, UQ_AU_INP_ASYNC
),
93 USB_QUIRK(LOGITECH
, UN53B
, 0x0000, 0xffff, UQ_NO_STRINGS
),
94 USB_QUIRK(REALTEK
, RTL8196EU
, 0x0000, 0xffff, UQ_CFG_INDEX_1
),
95 USB_QUIRK(ELSA
, MODEM1
, 0x0000, 0xffff, UQ_CFG_INDEX_1
),
96 USB_QUIRK(PLANEX2
, MZKUE150N
, 0x0000, 0xffff, UQ_CFG_INDEX_1
),
97 /* Quirks for printer devices */
98 USB_QUIRK(HP
, 895C
, 0x0000, 0xffff, UQ_BROKEN_BIDIR
),
99 USB_QUIRK(HP
, 880C
, 0x0000, 0xffff, UQ_BROKEN_BIDIR
),
100 USB_QUIRK(HP
, 815C
, 0x0000, 0xffff, UQ_BROKEN_BIDIR
),
101 USB_QUIRK(HP
, 810C
, 0x0000, 0xffff, UQ_BROKEN_BIDIR
),
102 USB_QUIRK(HP
, 830C
, 0x0000, 0xffff, UQ_BROKEN_BIDIR
),
103 USB_QUIRK(HP
, 1220C
, 0x0000, 0xffff, UQ_BROKEN_BIDIR
),
104 USB_QUIRK(XEROX
, WCM15
, 0x0000, 0xffff, UQ_BROKEN_BIDIR
),
105 /* Devices which should be ignored by uhid */
106 USB_QUIRK(APC
, UPS
, 0x0000, 0xffff, UQ_HID_IGNORE
),
107 USB_QUIRK(BELKIN
, F6C550AVR
, 0x0000, 0xffff, UQ_HID_IGNORE
),
108 USB_QUIRK(CYBERPOWER
, 1500CAVRLCD
, 0x0000, 0xffff, UQ_HID_IGNORE
),
109 USB_QUIRK(CYPRESS
, SILVERSHIELD
, 0x0000, 0xffff, UQ_HID_IGNORE
),
110 USB_QUIRK(DELORME
, EARTHMATE
, 0x0000, 0xffff, UQ_HID_IGNORE
),
111 USB_QUIRK(DREAMLINK
, DL100B
, 0x0000, 0xffff, UQ_HID_IGNORE
),
112 USB_QUIRK(ITUNERNET
, USBLCD2X20
, 0x0000, 0xffff, UQ_HID_IGNORE
),
113 USB_QUIRK(ITUNERNET
, USBLCD4X20
, 0x0000, 0xffff, UQ_HID_IGNORE
),
114 USB_QUIRK(LIEBERT
, POWERSURE_PXT
, 0x0000, 0xffff, UQ_HID_IGNORE
),
115 USB_QUIRK(LIEBERT2
, PSI1000
, 0x0000, 0xffff, UQ_HID_IGNORE
),
116 USB_QUIRK(MGE
, UPS1
, 0x0000, 0xffff, UQ_HID_IGNORE
),
117 USB_QUIRK(MGE
, UPS2
, 0x0000, 0xffff, UQ_HID_IGNORE
),
118 USB_QUIRK(APPLE
, IPHONE
, 0x0000, 0xffff, UQ_HID_IGNORE
),
119 USB_QUIRK(APPLE
, IPHONE_3G
, 0x0000, 0xffff, UQ_HID_IGNORE
),
120 USB_QUIRK(MEGATEC
, UPS
, 0x0000, 0xffff, UQ_HID_IGNORE
),
121 /* Devices which should be ignored by both ukbd and uhid */
122 USB_QUIRK(CYPRESS
, WISPY1A
, 0x0000, 0xffff, UQ_KBD_IGNORE
, UQ_HID_IGNORE
),
123 USB_QUIRK(METAGEEK
, WISPY1B
, 0x0000, 0xffff, UQ_KBD_IGNORE
, UQ_HID_IGNORE
),
124 USB_QUIRK(METAGEEK
, WISPY24X
, 0x0000, 0xffff, UQ_KBD_IGNORE
, UQ_HID_IGNORE
),
125 USB_QUIRK(METAGEEK2
, WISPYDBX
, 0x0000, 0xffff, UQ_KBD_IGNORE
, UQ_HID_IGNORE
),
126 USB_QUIRK(TENX
, UAUDIO0
, 0x0101, 0x0101, UQ_AUDIO_SWAP_LR
),
127 /* MS keyboards do weird things */
128 USB_QUIRK(MICROSOFT
, NATURAL4000
, 0x0000, 0xFFFF, UQ_KBD_BOOTPROTO
),
129 USB_QUIRK(MICROSOFT
, WLINTELLIMOUSE
, 0x0000, 0xffff, UQ_MS_LEADING_BYTE
),
130 /* Quirk for Corsair Vengeance K60 keyboard */
131 USB_QUIRK(CORSAIR
, K60
, 0x0000, 0xffff, UQ_KBD_BOOTPROTO
),
132 /* Quirk for Corsair Vengeance K70 keyboard */
133 USB_QUIRK(CORSAIR
, K70
, 0x0000, 0xffff, UQ_KBD_BOOTPROTO
),
134 /* Quirk for Corsair STRAFE Gaming keyboard */
135 USB_QUIRK(CORSAIR
, STRAFE
, 0x0000, 0xffff, UQ_KBD_BOOTPROTO
),
136 /* umodem(4) device quirks */
137 USB_QUIRK(METRICOM
, RICOCHET_GS
, 0x100, 0x100, UQ_ASSUME_CM_OVER_DATA
),
138 USB_QUIRK(SANYO
, SCP4900
, 0x000, 0x000, UQ_ASSUME_CM_OVER_DATA
),
139 USB_QUIRK(MOTOROLA2
, T720C
, 0x001, 0x001, UQ_ASSUME_CM_OVER_DATA
),
140 USB_QUIRK(EICON
, DIVA852
, 0x100, 0x100, UQ_ASSUME_CM_OVER_DATA
),
141 USB_QUIRK(SIEMENS2
, ES75
, 0x000, 0x000, UQ_ASSUME_CM_OVER_DATA
),
142 USB_QUIRK(QUALCOMM
, CDMA_MSM
, 0x0000, 0xffff, UQ_ASSUME_CM_OVER_DATA
),
143 USB_QUIRK(QUALCOMM2
, CDMA_MSM
, 0x0000, 0xffff, UQ_ASSUME_CM_OVER_DATA
),
144 USB_QUIRK(CURITEL
, UM150
, 0x0000, 0xffff, UQ_ASSUME_CM_OVER_DATA
),
145 USB_QUIRK(CURITEL
, UM175
, 0x0000, 0xffff, UQ_ASSUME_CM_OVER_DATA
),
146 USB_QUIRK(VERTEX
, VW110L
, 0x0000, 0xffff, UQ_ASSUME_CM_OVER_DATA
),
148 /* USB Mass Storage Class Quirks */
149 USB_QUIRK_VP(USB_VENDOR_ASAHIOPTICAL
, 0, UQ_MSC_NO_RS_CLEAR_UA
,
150 UQ_MATCH_VENDOR_ONLY
),
151 USB_QUIRK(ADDON
, ATTACHE
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
152 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_IGNORE_RESIDUE
),
153 USB_QUIRK(ADDON
, A256MB
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
154 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_IGNORE_RESIDUE
),
155 USB_QUIRK(ADDON
, DISKPRO512
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
156 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_IGNORE_RESIDUE
),
157 USB_QUIRK(ADDONICS2
, CABLE_205
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
158 UQ_MSC_FORCE_PROTO_SCSI
),
159 USB_QUIRK(AIPTEK
, POCKETCAM3M
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
160 UQ_MSC_FORCE_PROTO_SCSI
),
161 USB_QUIRK(ALCOR
, UMCR_9361
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
162 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_NO_GETMAXLUN
),
163 USB_QUIRK(ALCOR
, TRANSCEND
, 0x0000, 0xffff, UQ_MSC_NO_GETMAXLUN
,
164 UQ_MSC_NO_SYNC_CACHE
, UQ_MSC_NO_TEST_UNIT_READY
),
165 USB_QUIRK(APACER
, HT202
, 0x0000, 0xffff, UQ_MSC_NO_TEST_UNIT_READY
,
166 UQ_MSC_NO_SYNC_CACHE
),
167 USB_QUIRK(ASAHIOPTICAL
, OPTIO230
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
168 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_NO_INQUIRY
),
169 USB_QUIRK(ASAHIOPTICAL
, OPTIO330
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
170 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_NO_INQUIRY
),
171 USB_QUIRK(ATP
, EUSB
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
),
172 USB_QUIRK(BELKIN
, USB2SCSI
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
173 UQ_MSC_FORCE_PROTO_SCSI
),
174 USB_QUIRK(CASIO
, QV_DIGICAM
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI
,
175 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_NO_INQUIRY
),
176 USB_QUIRK(CCYU
, ED1064
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
177 UQ_MSC_FORCE_PROTO_SCSI
),
178 USB_QUIRK(CENTURY
, EX35QUAT
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
179 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_FORCE_SHORT_INQ
,
180 UQ_MSC_NO_START_STOP
, UQ_MSC_IGNORE_RESIDUE
),
181 USB_QUIRK(CYPRESS
, XX6830XX
, 0x0000, 0xffff, UQ_MSC_NO_GETMAXLUN
,
182 UQ_MSC_NO_SYNC_CACHE
),
183 USB_QUIRK(DESKNOTE
, UCR_61S2B
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
184 UQ_MSC_FORCE_PROTO_SCSI
),
185 USB_QUIRK(DMI
, CFSM_RW
, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI
,
186 UQ_MSC_NO_GETMAXLUN
),
187 USB_QUIRK(EMTEC
, RUF2PS
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
),
188 USB_QUIRK(EPSON
, STYLUS_875DC
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI
,
189 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_NO_INQUIRY
),
190 USB_QUIRK(EPSON
, STYLUS_895
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
191 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_NO_GETMAXLUN
),
192 USB_QUIRK(FEIYA
, 5IN1
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
193 UQ_MSC_FORCE_PROTO_SCSI
),
194 USB_QUIRK(FEIYA
, ELANGO
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
),
195 USB_QUIRK(FREECOM
, DVD
, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI
),
196 USB_QUIRK(FUJIPHOTO
, MASS0100
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI_I
,
197 UQ_MSC_FORCE_PROTO_ATAPI
, UQ_MSC_NO_RS_CLEAR_UA
, UQ_MSC_NO_SYNC_CACHE
),
198 USB_QUIRK(GENESYS
, GL641USB2IDE
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
199 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_FORCE_SHORT_INQ
,
200 UQ_MSC_NO_START_STOP
, UQ_MSC_IGNORE_RESIDUE
, UQ_MSC_NO_SYNC_CACHE
),
201 USB_QUIRK(GENESYS
, GL641USB2IDE_2
, 0x0000, 0xffff,
202 UQ_MSC_FORCE_WIRE_BBB
, UQ_MSC_FORCE_PROTO_ATAPI
,
203 UQ_MSC_FORCE_SHORT_INQ
, UQ_MSC_NO_START_STOP
,
204 UQ_MSC_IGNORE_RESIDUE
),
205 USB_QUIRK(GENESYS
, GL641USB
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
206 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_FORCE_SHORT_INQ
,
207 UQ_MSC_NO_START_STOP
, UQ_MSC_IGNORE_RESIDUE
),
208 USB_QUIRK(GENESYS
, GL641USB_2
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
209 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_WRONG_CSWSIG
),
210 USB_QUIRK(HAGIWARA
, FG
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
211 UQ_MSC_FORCE_PROTO_SCSI
),
212 USB_QUIRK(HAGIWARA
, FGSM
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
213 UQ_MSC_FORCE_PROTO_SCSI
),
214 USB_QUIRK(HITACHI
, DVDCAM_DZ_MV100A
, 0x0000, 0xffff,
215 UQ_MSC_FORCE_WIRE_CBI
, UQ_MSC_FORCE_PROTO_SCSI
,
216 UQ_MSC_NO_GETMAXLUN
),
217 USB_QUIRK(HITACHI
, DVDCAM_USB
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI_I
,
218 UQ_MSC_FORCE_PROTO_ATAPI
, UQ_MSC_NO_INQUIRY
),
219 USB_QUIRK(HP
, CDW4E
, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_ATAPI
),
220 USB_QUIRK(HP
, CDW8200
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI_I
,
221 UQ_MSC_FORCE_PROTO_ATAPI
, UQ_MSC_NO_TEST_UNIT_READY
,
222 UQ_MSC_NO_START_STOP
),
223 USB_QUIRK(IMAGINATION
, DBX1
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
224 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_WRONG_CSWSIG
),
225 USB_QUIRK(INSYSTEM
, USBCABLE
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI
,
226 UQ_MSC_FORCE_PROTO_ATAPI
, UQ_MSC_NO_TEST_UNIT_READY
,
227 UQ_MSC_NO_START_STOP
, UQ_MSC_ALT_IFACE_1
),
228 USB_QUIRK(INSYSTEM
, ATAPI
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI
,
229 UQ_MSC_FORCE_PROTO_RBC
),
230 USB_QUIRK(INSYSTEM
, STORAGE_V2
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI
,
231 UQ_MSC_FORCE_PROTO_RBC
),
232 USB_QUIRK(IODATA
, IU_CD2
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
233 UQ_MSC_FORCE_PROTO_SCSI
),
234 USB_QUIRK(IODATA
, DVR_UEH8
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
235 UQ_MSC_FORCE_PROTO_SCSI
),
236 USB_QUIRK(IOMEGA
, ZIP100
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
237 UQ_MSC_FORCE_PROTO_SCSI
,
238 UQ_MSC_NO_TEST_UNIT_READY
), /* XXX ZIP drives can also use ATAPI */
239 USB_QUIRK(JMICRON
, JM20337
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
240 UQ_MSC_FORCE_PROTO_SCSI
,
241 UQ_MSC_NO_SYNC_CACHE
),
242 USB_QUIRK(KINGSTON
, HYPERX3_0
, 0x0000, 0xffff, UQ_MSC_NO_INQUIRY
),
243 USB_QUIRK(KYOCERA
, FINECAM_L3
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
244 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_NO_INQUIRY
),
245 USB_QUIRK(KYOCERA
, FINECAM_S3X
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI
,
246 UQ_MSC_FORCE_PROTO_ATAPI
, UQ_MSC_NO_INQUIRY
),
247 USB_QUIRK(KYOCERA
, FINECAM_S4
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI
,
248 UQ_MSC_FORCE_PROTO_ATAPI
, UQ_MSC_NO_INQUIRY
),
249 USB_QUIRK(KYOCERA
, FINECAM_S5
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
250 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_NO_INQUIRY
),
251 USB_QUIRK(LACIE
, HD
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI
,
252 UQ_MSC_FORCE_PROTO_RBC
),
253 USB_QUIRK(LEXAR
, CF_READER
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
254 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_NO_INQUIRY
),
255 USB_QUIRK(LEXAR
, JUMPSHOT
, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI
),
256 USB_QUIRK(LEXAR
, JUMPDRIVE
, 0x0000, 0xffff, UQ_MSC_NO_INQUIRY
),
257 USB_QUIRK(LOGITEC
, LDR_H443SU2
, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI
),
258 USB_QUIRK(LOGITEC
, LDR_H443U2
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
259 UQ_MSC_FORCE_PROTO_SCSI
,),
260 USB_QUIRK(MELCO
, DUBPXXG
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
261 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_FORCE_SHORT_INQ
,
262 UQ_MSC_NO_START_STOP
, UQ_MSC_IGNORE_RESIDUE
),
263 USB_QUIRK(MICROTECH
, DPCM
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI
,
264 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_NO_TEST_UNIT_READY
,
265 UQ_MSC_NO_START_STOP
),
266 USB_QUIRK(MICRON
, REALSSD
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
),
267 USB_QUIRK(MICROTECH
, SCSIDB25
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
268 UQ_MSC_FORCE_PROTO_SCSI
),
269 USB_QUIRK(MICROTECH
, SCSIHD50
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
270 UQ_MSC_FORCE_PROTO_SCSI
),
271 USB_QUIRK(MINOLTA
, E223
, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI
),
272 USB_QUIRK(MINOLTA
, F300
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
273 UQ_MSC_FORCE_PROTO_SCSI
),
274 USB_QUIRK(MITSUMI
, CDRRW
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI
|
275 UQ_MSC_FORCE_PROTO_ATAPI
),
276 USB_QUIRK(MOTOROLA2
, E398
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
277 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_FORCE_SHORT_INQ
,
278 UQ_MSC_NO_INQUIRY_EVPD
, UQ_MSC_NO_GETMAXLUN
),
279 USB_QUIRK_VP(USB_VENDOR_MPMAN
, 0, UQ_MSC_NO_SYNC_CACHE
,
280 UQ_MATCH_VENDOR_ONLY
),
281 USB_QUIRK(MSYSTEMS
, DISKONKEY
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
282 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_IGNORE_RESIDUE
, UQ_MSC_NO_GETMAXLUN
,
283 UQ_MSC_NO_RS_CLEAR_UA
),
284 USB_QUIRK(MSYSTEMS
, DISKONKEY2
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
285 UQ_MSC_FORCE_PROTO_ATAPI
),
286 USB_QUIRK(MYSON
, HEDEN
, 0x0000, 0xffff, UQ_MSC_IGNORE_RESIDUE
,
287 UQ_MSC_NO_SYNC_CACHE
),
288 USB_QUIRK(NEODIO
, ND3260
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
289 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_FORCE_SHORT_INQ
),
290 USB_QUIRK(NETAC
, CF_CARD
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
291 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_NO_INQUIRY
),
292 USB_QUIRK(NETAC
, ONLYDISK
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
293 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_IGNORE_RESIDUE
),
294 USB_QUIRK(NETCHIP
, CLIK_40
, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_ATAPI
,
296 USB_QUIRK(NETCHIP
, POCKETBOOK
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
),
297 USB_QUIRK(NIKON
, D300
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
298 UQ_MSC_FORCE_PROTO_SCSI
),
299 USB_QUIRK(OLYMPUS
, C1
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
300 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_WRONG_CSWSIG
),
301 USB_QUIRK(OLYMPUS
, C700
, 0x0000, 0xffff, UQ_MSC_NO_GETMAXLUN
),
302 USB_QUIRK(ONSPEC
, SDS_HOTFIND_D
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
303 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_NO_GETMAXLUN
, UQ_MSC_NO_SYNC_CACHE
),
304 USB_QUIRK(ONSPEC
, CFMS_RW
, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI
),
305 USB_QUIRK(ONSPEC
, CFSM_COMBO
, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI
),
306 USB_QUIRK(ONSPEC
, CFSM_READER
, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI
),
307 USB_QUIRK(ONSPEC
, CFSM_READER2
, 0x0000, 0xffff,
308 UQ_MSC_FORCE_PROTO_SCSI
),
309 USB_QUIRK(ONSPEC
, MDCFE_B_CF_READER
, 0x0000, 0xffff,
310 UQ_MSC_FORCE_PROTO_SCSI
),
311 USB_QUIRK(ONSPEC
, MDSM_B_READER
, 0x0000, 0xffff,
312 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_NO_INQUIRY
),
313 USB_QUIRK(ONSPEC
, READER
, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI
),
314 USB_QUIRK(ONSPEC
, UCF100
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
315 UQ_MSC_FORCE_PROTO_ATAPI
, UQ_MSC_NO_INQUIRY
, UQ_MSC_NO_GETMAXLUN
),
316 USB_QUIRK(ONSPEC2
, IMAGEMATE_SDDR55
, 0x0000, 0xffff,
317 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_NO_GETMAXLUN
),
318 USB_QUIRK(PANASONIC
, KXL840AN
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
319 UQ_MSC_FORCE_PROTO_ATAPI
, UQ_MSC_NO_GETMAXLUN
),
320 USB_QUIRK(PANASONIC
, KXLCB20AN
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
321 UQ_MSC_FORCE_PROTO_SCSI
),
322 USB_QUIRK(PANASONIC
, KXLCB35AN
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
323 UQ_MSC_FORCE_PROTO_SCSI
),
324 USB_QUIRK(PANASONIC
, LS120CAM
, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_UFI
),
325 USB_QUIRK(PLEXTOR
, 40_12_40U
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
326 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_NO_TEST_UNIT_READY
),
327 USB_QUIRK(PNY
, ATTACHE2
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
328 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_IGNORE_RESIDUE
,
329 UQ_MSC_NO_START_STOP
),
330 USB_QUIRK(PROLIFIC
, PL2506
, 0x0000, 0xffff,
331 UQ_MSC_NO_SYNC_CACHE
),
332 USB_QUIRK_VP(USB_VENDOR_SAMSUNG_TECHWIN
,
333 USB_PRODUCT_SAMSUNG_TECHWIN_DIGIMAX_410
, UQ_MSC_FORCE_WIRE_BBB
,
334 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_NO_INQUIRY
),
335 USB_QUIRK(SANDISK
, SDDR05A
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI
,
336 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_READ_CAP_OFFBY1
,
337 UQ_MSC_NO_GETMAXLUN
),
338 USB_QUIRK(SANDISK
, SDDR09
, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI
,
339 UQ_MSC_READ_CAP_OFFBY1
, UQ_MSC_NO_GETMAXLUN
),
340 USB_QUIRK(SANDISK
, SDDR12
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI
,
341 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_READ_CAP_OFFBY1
,
342 UQ_MSC_NO_GETMAXLUN
),
343 USB_QUIRK(SANDISK
, SDCZ2_128
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
344 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_IGNORE_RESIDUE
,
345 UQ_MSC_NO_SYNC_CACHE
),
346 USB_QUIRK(SANDISK
, SDCZ2_256
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
347 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_IGNORE_RESIDUE
),
348 USB_QUIRK(SANDISK
, SDCZ4_128
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
349 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_IGNORE_RESIDUE
),
350 USB_QUIRK(SANDISK
, SDCZ4_256
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
351 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_IGNORE_RESIDUE
),
352 USB_QUIRK(SANDISK
, SDDR31
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
353 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_READ_CAP_OFFBY1
),
354 USB_QUIRK(SANDISK
, IMAGEMATE_SDDR289
, 0x0000, 0xffff,
355 UQ_MSC_NO_SYNC_CACHE
, UQ_MSC_NO_GETMAXLUN
),
356 USB_QUIRK(SCANLOGIC
, SL11R
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
357 UQ_MSC_FORCE_PROTO_ATAPI
, UQ_MSC_NO_INQUIRY
),
358 USB_QUIRK(SHUTTLE
, EUSB
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI_I
,
359 UQ_MSC_FORCE_PROTO_ATAPI
, UQ_MSC_NO_TEST_UNIT_READY
,
360 UQ_MSC_NO_START_STOP
, UQ_MSC_SHUTTLE_INIT
),
361 USB_QUIRK(SHUTTLE
, CDRW
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI
,
362 UQ_MSC_FORCE_PROTO_ATAPI
),
363 USB_QUIRK(SHUTTLE
, CF
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI
,
364 UQ_MSC_FORCE_PROTO_ATAPI
),
365 USB_QUIRK(SHUTTLE
, EUSBATAPI
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI
,
366 UQ_MSC_FORCE_PROTO_ATAPI
),
367 USB_QUIRK(SHUTTLE
, EUSBCFSM
, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI
),
368 USB_QUIRK(SHUTTLE
, EUSCSI
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
369 UQ_MSC_FORCE_PROTO_SCSI
),
370 USB_QUIRK(SHUTTLE
, HIFD
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI
,
371 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_NO_GETMAXLUN
),
372 USB_QUIRK(SHUTTLE
, SDDR09
, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI
,
373 UQ_MSC_NO_GETMAXLUN
),
374 USB_QUIRK(SHUTTLE
, ZIOMMC
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI
,
375 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_NO_GETMAXLUN
),
376 USB_QUIRK(SIGMATEL
, I_BEAD100
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
377 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_SHUTTLE_INIT
),
378 USB_QUIRK(SIIG
, WINTERREADER
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
379 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_IGNORE_RESIDUE
),
380 USB_QUIRK(SKANHEX
, MD_7425
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
381 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_NO_INQUIRY
),
382 USB_QUIRK(SKANHEX
, SX_520Z
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
383 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_NO_INQUIRY
),
384 USB_QUIRK(SONY
, HANDYCAM
, 0x0500, 0x0500, UQ_MSC_FORCE_WIRE_CBI
,
385 UQ_MSC_FORCE_PROTO_RBC
, UQ_MSC_RBC_PAD_TO_12
),
386 USB_QUIRK(SONY
, CLIE_40_MS
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
387 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_NO_INQUIRY
),
388 USB_QUIRK(SONY
, DSC
, 0x0500, 0x0500, UQ_MSC_FORCE_WIRE_CBI
,
389 UQ_MSC_FORCE_PROTO_RBC
, UQ_MSC_RBC_PAD_TO_12
),
390 USB_QUIRK(SONY
, DSC
, 0x0600, 0x0600, UQ_MSC_FORCE_WIRE_CBI
,
391 UQ_MSC_FORCE_PROTO_RBC
, UQ_MSC_RBC_PAD_TO_12
),
392 USB_QUIRK(SONY
, DSC
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI
,
393 UQ_MSC_FORCE_PROTO_RBC
),
394 USB_QUIRK(SONY
, HANDYCAM
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI
,
395 UQ_MSC_FORCE_PROTO_RBC
),
396 USB_QUIRK(SONY
, MSC
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI
,
397 UQ_MSC_FORCE_PROTO_RBC
),
398 USB_QUIRK(SONY
, MS_MSC_U03
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI
,
399 UQ_MSC_FORCE_PROTO_UFI
, UQ_MSC_NO_GETMAXLUN
),
400 USB_QUIRK(SONY
, MS_NW_MS7
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
401 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_NO_GETMAXLUN
),
402 USB_QUIRK(SONY
, MS_PEG_N760C
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
403 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_NO_INQUIRY
),
404 USB_QUIRK(SONY
, MSACUS1
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
405 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_NO_GETMAXLUN
),
406 USB_QUIRK(SONY
, PORTABLE_HDD_V2
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
407 UQ_MSC_FORCE_PROTO_SCSI
),
408 USB_QUIRK(STMICRO
, ST72682
, 0x0000, 0xffff, UQ_MSC_NO_PREVENT_ALLOW
),
409 USB_QUIRK(SUPERTOP
, IDE
, 0x0000, 0xffff, UQ_MSC_IGNORE_RESIDUE
,
410 UQ_MSC_NO_SYNC_CACHE
),
411 USB_QUIRK(SUPERTOP
, FLASHDRIVE
, 0x0000, 0xffff, UQ_MSC_NO_TEST_UNIT_READY
,
412 UQ_MSC_NO_SYNC_CACHE
),
413 USB_QUIRK(TAUGA
, CAMERAMATE
, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI
),
414 USB_QUIRK(TEAC
, FD05PUB
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI
,
415 UQ_MSC_FORCE_PROTO_UFI
),
416 USB_QUIRK(TECLAST
, TLC300
, 0x0000, 0xffff, UQ_MSC_NO_TEST_UNIT_READY
,
417 UQ_MSC_NO_SYNC_CACHE
),
418 USB_QUIRK(TREK
, MEMKEY
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
419 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_NO_INQUIRY
),
420 USB_QUIRK(TREK
, THUMBDRIVE_8MB
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
421 UQ_MSC_FORCE_PROTO_ATAPI
, UQ_MSC_IGNORE_RESIDUE
),
422 USB_QUIRK(TRUMPION
, C3310
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI
,
423 UQ_MSC_FORCE_PROTO_UFI
),
424 USB_QUIRK(TRUMPION
, MP3
, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_RBC
),
425 USB_QUIRK(TRUMPION
, T33520
, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI
),
426 USB_QUIRK(TWINMOS
, MDIV
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
427 UQ_MSC_FORCE_PROTO_SCSI
),
428 USB_QUIRK(VIA
, USB2IDEBRIDGE
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
429 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_NO_SYNC_CACHE
),
430 USB_QUIRK(VIVITAR
, 35XX
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
431 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_NO_INQUIRY
),
432 USB_QUIRK(WESTERN
, COMBO
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
433 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_FORCE_SHORT_INQ
,
434 UQ_MSC_NO_START_STOP
, UQ_MSC_IGNORE_RESIDUE
),
435 USB_QUIRK(WESTERN
, EXTHDD
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
436 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_FORCE_SHORT_INQ
,
437 UQ_MSC_NO_START_STOP
, UQ_MSC_IGNORE_RESIDUE
),
438 USB_QUIRK(WESTERN
, MYBOOK
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
439 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_NO_INQUIRY_EVPD
,
440 UQ_MSC_NO_SYNC_CACHE
),
441 USB_QUIRK(WESTERN
, MYPASSPORT_00
, 0x0000, 0xffff, UQ_MSC_FORCE_SHORT_INQ
),
442 USB_QUIRK(WESTERN
, MYPASSPORT_01
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
),
443 USB_QUIRK(WESTERN
, MYPASSPORT_02
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
),
444 USB_QUIRK(WESTERN
, MYPASSPORT_03
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
),
445 USB_QUIRK(WESTERN
, MYPASSPORT_04
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
),
446 USB_QUIRK(WESTERN
, MYPASSPORT_05
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
),
447 USB_QUIRK(WESTERN
, MYPASSPORT_06
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
),
448 USB_QUIRK(WESTERN
, MYPASSPORT_07
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
),
449 USB_QUIRK(WESTERN
, MYPASSPORT_08
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
),
450 USB_QUIRK(WESTERN
, MYPASSPORT_09
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
),
451 USB_QUIRK(WESTERN
, MYPASSPORT_10
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
),
452 USB_QUIRK(WESTERN
, MYPASSPORT_11
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
),
453 USB_QUIRK(WESTERN
, MYPASSPORTES_00
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
),
454 USB_QUIRK(WESTERN
, MYPASSPORTES_01
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
),
455 USB_QUIRK(WESTERN
, MYPASSPORTES_02
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
),
456 USB_QUIRK(WESTERN
, MYPASSPORTES_03
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
),
457 USB_QUIRK(WESTERN
, MYPASSPORTES_04
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
),
458 USB_QUIRK(WESTERN
, MYPASSPORTES_05
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
),
459 USB_QUIRK(WESTERN
, MYPASSPORTES_06
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
),
460 USB_QUIRK(WESTERN
, MYPASSPORTES_07
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
),
461 USB_QUIRK(WESTERN
, MYPASSPORTES_08
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
),
462 USB_QUIRK(WESTERN
, MYPASSPORTES_09
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
),
463 USB_QUIRK(WINMAXGROUP
, FLASH64MC
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
464 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_NO_INQUIRY
),
465 USB_QUIRK(YANO
, FW800HD
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
466 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_FORCE_SHORT_INQ
,
467 UQ_MSC_NO_START_STOP
, UQ_MSC_IGNORE_RESIDUE
),
468 USB_QUIRK(YANO
, U640MO
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI_I
,
469 UQ_MSC_FORCE_PROTO_ATAPI
, UQ_MSC_FORCE_SHORT_INQ
),
470 USB_QUIRK(YEDATA
, FLASHBUSTERU
, 0x0000, 0x007F, UQ_MSC_FORCE_WIRE_CBI
,
471 UQ_MSC_FORCE_PROTO_UFI
, UQ_MSC_NO_RS_CLEAR_UA
, UQ_MSC_FLOPPY_SPEED
,
472 UQ_MSC_NO_TEST_UNIT_READY
, UQ_MSC_NO_GETMAXLUN
),
473 USB_QUIRK(YEDATA
, FLASHBUSTERU
, 0x0080, 0x0080, UQ_MSC_FORCE_WIRE_CBI_I
,
474 UQ_MSC_FORCE_PROTO_UFI
, UQ_MSC_NO_RS_CLEAR_UA
, UQ_MSC_FLOPPY_SPEED
,
475 UQ_MSC_NO_TEST_UNIT_READY
, UQ_MSC_NO_GETMAXLUN
),
476 USB_QUIRK(YEDATA
, FLASHBUSTERU
, 0x0081, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI_I
,
477 UQ_MSC_FORCE_PROTO_UFI
, UQ_MSC_NO_RS_CLEAR_UA
, UQ_MSC_FLOPPY_SPEED
,
478 UQ_MSC_NO_GETMAXLUN
),
479 USB_QUIRK(ZORAN
, EX20DSC
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI
,
480 UQ_MSC_FORCE_PROTO_ATAPI
),
481 USB_QUIRK(MEIZU
, M6_SL
, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB
,
482 UQ_MSC_FORCE_PROTO_SCSI
, UQ_MSC_NO_INQUIRY
, UQ_MSC_NO_SYNC_CACHE
),
483 USB_QUIRK(TOSHIBA
, TRANSMEMORY
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
,
484 UQ_MSC_NO_PREVENT_ALLOW
),
485 USB_QUIRK(VIALABS
, USB30SATABRIDGE
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
),
486 USB_QUIRK(QUALCOMMINC
, ZTE_MF730M
, 0x0000, 0xffff, UQ_MSC_NO_GETMAXLUN
,
487 UQ_MSC_NO_INQUIRY
, UQ_CFG_INDEX_0
),
489 /* Non-standard USB MIDI devices */
490 USB_QUIRK(ROLAND
, UM1
, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS
),
491 USB_QUIRK(ROLAND
, SC8850
, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS
),
492 USB_QUIRK(ROLAND
, SD90
, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS
),
493 USB_QUIRK(ROLAND
, UM880N
, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS
),
494 USB_QUIRK(ROLAND
, UA100
, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS
),
495 USB_QUIRK(ROLAND
, UM4
, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS
),
496 USB_QUIRK(ROLAND
, U8
, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS
),
497 USB_QUIRK(ROLAND
, UM2
, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS
),
498 USB_QUIRK(ROLAND
, SC8820
, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS
),
499 USB_QUIRK(ROLAND
, PC300
, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS
),
500 USB_QUIRK(ROLAND
, SK500
, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS
),
501 USB_QUIRK(ROLAND
, SCD70
, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS
),
502 USB_QUIRK(ROLAND
, UM550
, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS
),
503 USB_QUIRK(ROLAND
, SD20
, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS
),
504 USB_QUIRK(ROLAND
, SD80
, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS
),
505 USB_QUIRK(ROLAND
, UA700
, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS
),
506 USB_QUIRK(EGO
, M4U
, 0x0000, 0xffff, UQ_SINGLE_CMD_MIDI
),
507 USB_QUIRK(LOGILINK
, U2M
, 0x0000, 0xffff, UQ_SINGLE_CMD_MIDI
),
508 USB_QUIRK(MEDELI
, DD305
, 0x0000, 0xffff, UQ_SINGLE_CMD_MIDI
, UQ_MATCH_VENDOR_ONLY
),
509 USB_QUIRK(REDOCTANE
, GHMIDI
, 0x0000, 0xffff, UQ_SINGLE_CMD_MIDI
),
510 USB_QUIRK(TEXTECH
, U2M_1
, 0x0000, 0xffff, UQ_SINGLE_CMD_MIDI
),
511 USB_QUIRK(TEXTECH
, U2M_2
, 0x0000, 0xffff, UQ_SINGLE_CMD_MIDI
),
512 USB_QUIRK(WCH2
, U2M
, 0x0000, 0xffff, UQ_SINGLE_CMD_MIDI
),
514 /* Non-standard USB AUDIO devices */
515 USB_QUIRK(MAUDIO
, FASTTRACKULTRA
, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS
),
516 USB_QUIRK(MAUDIO
, FASTTRACKULTRA8R
, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS
),
519 * Quirks for manufacturers which USB devices does not respond
520 * after issuing non-supported commands:
522 USB_QUIRK(ALCOR
, DUMMY
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
, UQ_MSC_NO_TEST_UNIT_READY
, UQ_MATCH_VENDOR_ONLY
),
523 USB_QUIRK(APPLE
, DUMMY
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
, UQ_MATCH_VENDOR_ONLY
),
524 USB_QUIRK(FEIYA
, DUMMY
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
, UQ_MATCH_VENDOR_ONLY
),
525 USB_QUIRK(REALTEK
, DUMMY
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
, UQ_MATCH_VENDOR_ONLY
),
526 USB_QUIRK(INITIO
, DUMMY
, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE
, UQ_MATCH_VENDOR_ONLY
),
531 static const char *usb_quirk_str
[USB_QUIRK_MAX
] = {
532 [UQ_NONE
] = "UQ_NONE",
533 [UQ_MATCH_VENDOR_ONLY
] = "UQ_MATCH_VENDOR_ONLY",
534 [UQ_AUDIO_SWAP_LR
] = "UQ_AUDIO_SWAP_LR",
535 [UQ_AU_INP_ASYNC
] = "UQ_AU_INP_ASYNC",
536 [UQ_AU_NO_FRAC
] = "UQ_AU_NO_FRAC",
537 [UQ_AU_NO_XU
] = "UQ_AU_NO_XU",
538 [UQ_BAD_ADC
] = "UQ_BAD_ADC",
539 [UQ_BAD_AUDIO
] = "UQ_BAD_AUDIO",
540 [UQ_BROKEN_BIDIR
] = "UQ_BROKEN_BIDIR",
541 [UQ_BUS_POWERED
] = "UQ_BUS_POWERED",
542 [UQ_HID_IGNORE
] = "UQ_HID_IGNORE",
543 [UQ_KBD_IGNORE
] = "UQ_KBD_IGNORE",
544 [UQ_KBD_BOOTPROTO
] = "UQ_KBD_BOOTPROTO",
545 [UQ_UMS_IGNORE
] = "UQ_UMS_IGNORE",
546 [UQ_MS_BAD_CLASS
] = "UQ_MS_BAD_CLASS",
547 [UQ_MS_LEADING_BYTE
] = "UQ_MS_LEADING_BYTE",
548 [UQ_MS_REVZ
] = "UQ_MS_REVZ",
549 [UQ_NO_STRINGS
] = "UQ_NO_STRINGS",
550 [UQ_POWER_CLAIM
] = "UQ_POWER_CLAIM",
551 [UQ_SPUR_BUT_UP
] = "UQ_SPUR_BUT_UP",
552 [UQ_SWAP_UNICODE
] = "UQ_SWAP_UNICODE",
553 [UQ_CFG_INDEX_1
] = "UQ_CFG_INDEX_1",
554 [UQ_CFG_INDEX_2
] = "UQ_CFG_INDEX_2",
555 [UQ_CFG_INDEX_3
] = "UQ_CFG_INDEX_3",
556 [UQ_CFG_INDEX_4
] = "UQ_CFG_INDEX_4",
557 [UQ_CFG_INDEX_0
] = "UQ_CFG_INDEX_0",
558 [UQ_ASSUME_CM_OVER_DATA
] = "UQ_ASSUME_CM_OVER_DATA",
559 [UQ_MSC_NO_TEST_UNIT_READY
] = "UQ_MSC_NO_TEST_UNIT_READY",
560 [UQ_MSC_NO_RS_CLEAR_UA
] = "UQ_MSC_NO_RS_CLEAR_UA",
561 [UQ_MSC_NO_START_STOP
] = "UQ_MSC_NO_START_STOP",
562 [UQ_MSC_NO_GETMAXLUN
] = "UQ_MSC_NO_GETMAXLUN",
563 [UQ_MSC_NO_INQUIRY
] = "UQ_MSC_NO_INQUIRY",
564 [UQ_MSC_NO_INQUIRY_EVPD
] = "UQ_MSC_NO_INQUIRY_EVPD",
565 [UQ_MSC_NO_PREVENT_ALLOW
] = "UQ_MSC_NO_PREVENT_ALLOW",
566 [UQ_MSC_NO_SYNC_CACHE
] = "UQ_MSC_NO_SYNC_CACHE",
567 [UQ_MSC_SHUTTLE_INIT
] = "UQ_MSC_SHUTTLE_INIT",
568 [UQ_MSC_ALT_IFACE_1
] = "UQ_MSC_ALT_IFACE_1",
569 [UQ_MSC_FLOPPY_SPEED
] = "UQ_MSC_FLOPPY_SPEED",
570 [UQ_MSC_IGNORE_RESIDUE
] = "UQ_MSC_IGNORE_RESIDUE",
571 [UQ_MSC_WRONG_CSWSIG
] = "UQ_MSC_WRONG_CSWSIG",
572 [UQ_MSC_RBC_PAD_TO_12
] = "UQ_MSC_RBC_PAD_TO_12",
573 [UQ_MSC_READ_CAP_OFFBY1
] = "UQ_MSC_READ_CAP_OFFBY1",
574 [UQ_MSC_FORCE_SHORT_INQ
] = "UQ_MSC_FORCE_SHORT_INQ",
575 [UQ_MSC_FORCE_WIRE_BBB
] = "UQ_MSC_FORCE_WIRE_BBB",
576 [UQ_MSC_FORCE_WIRE_CBI
] = "UQ_MSC_FORCE_WIRE_CBI",
577 [UQ_MSC_FORCE_WIRE_CBI_I
] = "UQ_MSC_FORCE_WIRE_CBI_I",
578 [UQ_MSC_FORCE_PROTO_SCSI
] = "UQ_MSC_FORCE_PROTO_SCSI",
579 [UQ_MSC_FORCE_PROTO_ATAPI
] = "UQ_MSC_FORCE_PROTO_ATAPI",
580 [UQ_MSC_FORCE_PROTO_UFI
] = "UQ_MSC_FORCE_PROTO_UFI",
581 [UQ_MSC_FORCE_PROTO_RBC
] = "UQ_MSC_FORCE_PROTO_RBC",
582 [UQ_MSC_EJECT_HUAWEI
] = "UQ_MSC_EJECT_HUAWEI",
583 [UQ_MSC_EJECT_SIERRA
] = "UQ_MSC_EJECT_SIERRA",
584 [UQ_MSC_EJECT_SCSIEJECT
] = "UQ_MSC_EJECT_SCSIEJECT",
585 [UQ_MSC_EJECT_REZERO
] = "UQ_MSC_EJECT_REZERO",
586 [UQ_MSC_EJECT_ZTESTOR
] = "UQ_MSC_EJECT_ZTESTOR",
587 [UQ_MSC_EJECT_CMOTECH
] = "UQ_MSC_EJECT_CMOTECH",
588 [UQ_MSC_EJECT_WAIT
] = "UQ_MSC_EJECT_WAIT",
589 [UQ_MSC_EJECT_SAEL_M460
] = "UQ_MSC_EJECT_SAEL_M460",
590 [UQ_MSC_EJECT_HUAWEISCSI
] = "UQ_MSC_EJECT_HUAWEISCSI",
591 [UQ_MSC_EJECT_HUAWEISCSI2
] = "UQ_MSC_EJECT_HUAWEISCSI2",
592 [UQ_MSC_EJECT_TCT
] = "UQ_MSC_EJECT_TCT",
593 [UQ_BAD_MIDI
] = "UQ_BAD_MIDI",
594 [UQ_AU_VENDOR_CLASS
] = "UQ_AU_VENDOR_CLASS",
595 [UQ_SINGLE_CMD_MIDI
] = "UQ_SINGLE_CMD_MIDI",
598 /*------------------------------------------------------------------------*
601 * This function converts an USB quirk code into a string.
602 *------------------------------------------------------------------------*/
604 usb_quirkstr(uint16_t quirk
)
606 return ((quirk
< USB_QUIRK_MAX
) ?
607 usb_quirk_str
[quirk
] : "USB_QUIRK_UNKNOWN");
610 /*------------------------------------------------------------------------*
611 * usb_test_quirk_by_info
616 *------------------------------------------------------------------------*/
618 usb_test_quirk_by_info(const struct usbd_lookup_info
*info
, uint16_t quirk
)
623 if (quirk
== UQ_NONE
)
626 lockmgr(&usb_quirk_lock
, LK_EXCLUSIVE
);
628 for (x
= 0; x
!= USB_DEV_QUIRKS_MAX
; x
++) {
629 /* see if quirk information does not match */
630 if ((usb_quirks
[x
].vid
!= info
->idVendor
) ||
631 (usb_quirks
[x
].lo_rev
> info
->bcdDevice
) ||
632 (usb_quirks
[x
].hi_rev
< info
->bcdDevice
)) {
635 /* see if quirk only should match vendor ID */
636 if (usb_quirks
[x
].pid
!= info
->idProduct
) {
637 if (usb_quirks
[x
].pid
!= 0)
640 for (y
= 0; y
!= USB_SUB_QUIRKS_MAX
; y
++) {
641 if (usb_quirks
[x
].quirks
[y
] == UQ_MATCH_VENDOR_ONLY
)
644 if (y
== USB_SUB_QUIRKS_MAX
)
648 for (y
= 0; y
!= USB_SUB_QUIRKS_MAX
; y
++) {
649 if (usb_quirks
[x
].quirks
[y
] == quirk
) {
650 lockmgr(&usb_quirk_lock
, LK_RELEASE
);
651 DPRINTF("Found quirk '%s'.\n", usb_quirkstr(quirk
));
658 lockmgr(&usb_quirk_lock
, LK_RELEASE
);
660 return (0); /* no quirk match */
663 static struct usb_quirk_entry
*
664 usb_quirk_get_entry(uint16_t vid
, uint16_t pid
,
665 uint16_t lo_rev
, uint16_t hi_rev
, uint8_t do_alloc
)
669 KKASSERT(lockowned(&usb_quirk_lock
));
671 if ((vid
| pid
| lo_rev
| hi_rev
) == 0) {
672 /* all zero - special case */
673 return (usb_quirks
+ USB_DEV_QUIRKS_MAX
- 1);
675 /* search for an existing entry */
676 for (x
= 0; x
!= USB_DEV_QUIRKS_MAX
; x
++) {
677 /* see if quirk information does not match */
678 if ((usb_quirks
[x
].vid
!= vid
) ||
679 (usb_quirks
[x
].pid
!= pid
) ||
680 (usb_quirks
[x
].lo_rev
!= lo_rev
) ||
681 (usb_quirks
[x
].hi_rev
!= hi_rev
)) {
684 return (usb_quirks
+ x
);
691 /* search for a free entry */
692 for (x
= 0; x
!= USB_DEV_QUIRKS_MAX
; x
++) {
693 /* see if quirk information does not match */
694 if ((usb_quirks
[x
].vid
|
696 usb_quirks
[x
].lo_rev
|
697 usb_quirks
[x
].hi_rev
) != 0) {
700 usb_quirks
[x
].vid
= vid
;
701 usb_quirks
[x
].pid
= pid
;
702 usb_quirks
[x
].lo_rev
= lo_rev
;
703 usb_quirks
[x
].hi_rev
= hi_rev
;
705 return (usb_quirks
+ x
);
712 /*------------------------------------------------------------------------*
713 * usb_quirk_ioctl - handle quirk IOCTLs
718 *------------------------------------------------------------------------*/
720 usb_quirk_ioctl(unsigned long cmd
, caddr_t data
,
721 int fflag
, struct thread
*td
)
723 struct usb_gen_quirk
*pgq
;
724 struct usb_quirk_entry
*pqe
;
730 case USB_DEV_QUIRK_GET
:
732 x
= pgq
->index
% USB_SUB_QUIRKS_MAX
;
733 y
= pgq
->index
/ USB_SUB_QUIRKS_MAX
;
734 if (y
>= USB_DEV_QUIRKS_MAX
) {
737 lockmgr(&usb_quirk_lock
, LK_EXCLUSIVE
);
739 pgq
->vid
= usb_quirks
[y
].vid
;
740 pgq
->pid
= usb_quirks
[y
].pid
;
741 pgq
->bcdDeviceLow
= usb_quirks
[y
].lo_rev
;
742 pgq
->bcdDeviceHigh
= usb_quirks
[y
].hi_rev
;
743 strlcpy(pgq
->quirkname
,
744 usb_quirkstr(usb_quirks
[y
].quirks
[x
]),
745 sizeof(pgq
->quirkname
));
746 lockmgr(&usb_quirk_lock
, LK_RELEASE
);
747 return (0); /* success */
749 case USB_QUIRK_NAME_GET
:
752 if (x
>= USB_QUIRK_MAX
) {
755 strlcpy(pgq
->quirkname
,
756 usb_quirkstr(x
), sizeof(pgq
->quirkname
));
757 return (0); /* success */
759 case USB_DEV_QUIRK_ADD
:
762 /* check privileges */
763 err
= priv_check(curthread
, PRIV_DRIVER
);
767 /* convert quirk string into numerical */
768 for (y
= 0; y
!= USB_DEV_QUIRKS_MAX
; y
++) {
769 if (strcmp(pgq
->quirkname
, usb_quirkstr(y
)) == 0) {
773 if (y
== USB_DEV_QUIRKS_MAX
) {
779 lockmgr(&usb_quirk_lock
, LK_EXCLUSIVE
);
780 pqe
= usb_quirk_get_entry(pgq
->vid
, pgq
->pid
,
781 pgq
->bcdDeviceLow
, pgq
->bcdDeviceHigh
, 1);
783 lockmgr(&usb_quirk_lock
, LK_RELEASE
);
786 for (x
= 0; x
!= USB_SUB_QUIRKS_MAX
; x
++) {
787 if (pqe
->quirks
[x
] == UQ_NONE
) {
792 lockmgr(&usb_quirk_lock
, LK_RELEASE
);
793 if (x
== USB_SUB_QUIRKS_MAX
) {
796 return (0); /* success */
798 case USB_DEV_QUIRK_REMOVE
:
800 /* check privileges */
801 err
= priv_check(curthread
, PRIV_DRIVER
);
805 /* convert quirk string into numerical */
806 for (y
= 0; y
!= USB_DEV_QUIRKS_MAX
; y
++) {
807 if (strcmp(pgq
->quirkname
, usb_quirkstr(y
)) == 0) {
811 if (y
== USB_DEV_QUIRKS_MAX
) {
817 lockmgr(&usb_quirk_lock
, LK_EXCLUSIVE
);
818 pqe
= usb_quirk_get_entry(pgq
->vid
, pgq
->pid
,
819 pgq
->bcdDeviceLow
, pgq
->bcdDeviceHigh
, 0);
821 lockmgr(&usb_quirk_lock
, LK_RELEASE
);
824 for (x
= 0; x
!= USB_SUB_QUIRKS_MAX
; x
++) {
825 if (pqe
->quirks
[x
] == y
) {
826 pqe
->quirks
[x
] = UQ_NONE
;
830 if (x
== USB_SUB_QUIRKS_MAX
) {
831 lockmgr(&usb_quirk_lock
, LK_RELEASE
);
834 for (x
= 0; x
!= USB_SUB_QUIRKS_MAX
; x
++) {
835 if (pqe
->quirks
[x
] != UQ_NONE
) {
839 if (x
== USB_SUB_QUIRKS_MAX
) {
840 /* all quirk entries are unused - release */
841 memset(pqe
, 0, sizeof(*pqe
));
843 lockmgr(&usb_quirk_lock
, LK_RELEASE
);
844 return (0); /* success */
853 usb_quirk_init(void *arg
)
855 /* initialize mutex */
856 lockinit(&usb_quirk_lock
, "USB quirk", 0, 0);
858 /* register our function */
859 usb_test_quirk_p
= &usb_test_quirk_by_info
;
860 usb_quirk_ioctl_p
= &usb_quirk_ioctl
;
864 usb_quirk_uninit(void *arg
)
866 usb_quirk_unload(arg
);
869 lockuninit(&usb_quirk_lock
);
872 SYSINIT(usb_quirk_init
, SI_SUB_DRIVERS
, SI_ORDER_FIRST
, usb_quirk_init
, NULL
);
873 SYSUNINIT(usb_quirk_uninit
, SI_SUB_DRIVERS
, SI_ORDER_ANY
, usb_quirk_uninit
, NULL
);