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