cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

quirks.c (20403B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * USB device quirk handling logic and table
      4 *
      5 * Copyright (c) 2007 Oliver Neukum
      6 * Copyright (c) 2007 Greg Kroah-Hartman <gregkh@suse.de>
      7 */
      8
      9#include <linux/moduleparam.h>
     10#include <linux/usb.h>
     11#include <linux/usb/quirks.h>
     12#include <linux/usb/hcd.h>
     13#include "usb.h"
     14
     15struct quirk_entry {
     16	u16 vid;
     17	u16 pid;
     18	u32 flags;
     19};
     20
     21static DEFINE_MUTEX(quirk_mutex);
     22
     23static struct quirk_entry *quirk_list;
     24static unsigned int quirk_count;
     25
     26static char quirks_param[128];
     27
     28static int quirks_param_set(const char *value, const struct kernel_param *kp)
     29{
     30	char *val, *p, *field;
     31	u16 vid, pid;
     32	u32 flags;
     33	size_t i;
     34	int err;
     35
     36	val = kstrdup(value, GFP_KERNEL);
     37	if (!val)
     38		return -ENOMEM;
     39
     40	err = param_set_copystring(val, kp);
     41	if (err) {
     42		kfree(val);
     43		return err;
     44	}
     45
     46	mutex_lock(&quirk_mutex);
     47
     48	if (!*val) {
     49		quirk_count = 0;
     50		kfree(quirk_list);
     51		quirk_list = NULL;
     52		goto unlock;
     53	}
     54
     55	for (quirk_count = 1, i = 0; val[i]; i++)
     56		if (val[i] == ',')
     57			quirk_count++;
     58
     59	if (quirk_list) {
     60		kfree(quirk_list);
     61		quirk_list = NULL;
     62	}
     63
     64	quirk_list = kcalloc(quirk_count, sizeof(struct quirk_entry),
     65			     GFP_KERNEL);
     66	if (!quirk_list) {
     67		quirk_count = 0;
     68		mutex_unlock(&quirk_mutex);
     69		kfree(val);
     70		return -ENOMEM;
     71	}
     72
     73	for (i = 0, p = val; p && *p;) {
     74		/* Each entry consists of VID:PID:flags */
     75		field = strsep(&p, ":");
     76		if (!field)
     77			break;
     78
     79		if (kstrtou16(field, 16, &vid))
     80			break;
     81
     82		field = strsep(&p, ":");
     83		if (!field)
     84			break;
     85
     86		if (kstrtou16(field, 16, &pid))
     87			break;
     88
     89		field = strsep(&p, ",");
     90		if (!field || !*field)
     91			break;
     92
     93		/* Collect the flags */
     94		for (flags = 0; *field; field++) {
     95			switch (*field) {
     96			case 'a':
     97				flags |= USB_QUIRK_STRING_FETCH_255;
     98				break;
     99			case 'b':
    100				flags |= USB_QUIRK_RESET_RESUME;
    101				break;
    102			case 'c':
    103				flags |= USB_QUIRK_NO_SET_INTF;
    104				break;
    105			case 'd':
    106				flags |= USB_QUIRK_CONFIG_INTF_STRINGS;
    107				break;
    108			case 'e':
    109				flags |= USB_QUIRK_RESET;
    110				break;
    111			case 'f':
    112				flags |= USB_QUIRK_HONOR_BNUMINTERFACES;
    113				break;
    114			case 'g':
    115				flags |= USB_QUIRK_DELAY_INIT;
    116				break;
    117			case 'h':
    118				flags |= USB_QUIRK_LINEAR_UFRAME_INTR_BINTERVAL;
    119				break;
    120			case 'i':
    121				flags |= USB_QUIRK_DEVICE_QUALIFIER;
    122				break;
    123			case 'j':
    124				flags |= USB_QUIRK_IGNORE_REMOTE_WAKEUP;
    125				break;
    126			case 'k':
    127				flags |= USB_QUIRK_NO_LPM;
    128				break;
    129			case 'l':
    130				flags |= USB_QUIRK_LINEAR_FRAME_INTR_BINTERVAL;
    131				break;
    132			case 'm':
    133				flags |= USB_QUIRK_DISCONNECT_SUSPEND;
    134				break;
    135			case 'n':
    136				flags |= USB_QUIRK_DELAY_CTRL_MSG;
    137				break;
    138			case 'o':
    139				flags |= USB_QUIRK_HUB_SLOW_RESET;
    140				break;
    141			/* Ignore unrecognized flag characters */
    142			}
    143		}
    144
    145		quirk_list[i++] = (struct quirk_entry)
    146			{ .vid = vid, .pid = pid, .flags = flags };
    147	}
    148
    149	if (i < quirk_count)
    150		quirk_count = i;
    151
    152unlock:
    153	mutex_unlock(&quirk_mutex);
    154	kfree(val);
    155
    156	return 0;
    157}
    158
    159static const struct kernel_param_ops quirks_param_ops = {
    160	.set = quirks_param_set,
    161	.get = param_get_string,
    162};
    163
    164static struct kparam_string quirks_param_string = {
    165	.maxlen = sizeof(quirks_param),
    166	.string = quirks_param,
    167};
    168
    169device_param_cb(quirks, &quirks_param_ops, &quirks_param_string, 0644);
    170MODULE_PARM_DESC(quirks, "Add/modify USB quirks by specifying quirks=vendorID:productID:quirks");
    171
    172/* Lists of quirky USB devices, split in device quirks and interface quirks.
    173 * Device quirks are applied at the very beginning of the enumeration process,
    174 * right after reading the device descriptor. They can thus only match on device
    175 * information.
    176 *
    177 * Interface quirks are applied after reading all the configuration descriptors.
    178 * They can match on both device and interface information.
    179 *
    180 * Note that the DELAY_INIT and HONOR_BNUMINTERFACES quirks do not make sense as
    181 * interface quirks, as they only influence the enumeration process which is run
    182 * before processing the interface quirks.
    183 *
    184 * Please keep the lists ordered by:
    185 * 	1) Vendor ID
    186 * 	2) Product ID
    187 * 	3) Class ID
    188 */
    189static const struct usb_device_id usb_quirk_list[] = {
    190	/* CBM - Flash disk */
    191	{ USB_DEVICE(0x0204, 0x6025), .driver_info = USB_QUIRK_RESET_RESUME },
    192
    193	/* WORLDE Controller KS49 or Prodipe MIDI 49C USB controller */
    194	{ USB_DEVICE(0x0218, 0x0201), .driver_info =
    195			USB_QUIRK_CONFIG_INTF_STRINGS },
    196
    197	/* WORLDE easy key (easykey.25) MIDI controller  */
    198	{ USB_DEVICE(0x0218, 0x0401), .driver_info =
    199			USB_QUIRK_CONFIG_INTF_STRINGS },
    200
    201	/* HP 5300/5370C scanner */
    202	{ USB_DEVICE(0x03f0, 0x0701), .driver_info =
    203			USB_QUIRK_STRING_FETCH_255 },
    204
    205	/* HP v222w 16GB Mini USB Drive */
    206	{ USB_DEVICE(0x03f0, 0x3f40), .driver_info = USB_QUIRK_DELAY_INIT },
    207
    208	/* Creative SB Audigy 2 NX */
    209	{ USB_DEVICE(0x041e, 0x3020), .driver_info = USB_QUIRK_RESET_RESUME },
    210
    211	/* USB3503 */
    212	{ USB_DEVICE(0x0424, 0x3503), .driver_info = USB_QUIRK_RESET_RESUME },
    213
    214	/* Microsoft Wireless Laser Mouse 6000 Receiver */
    215	{ USB_DEVICE(0x045e, 0x00e1), .driver_info = USB_QUIRK_RESET_RESUME },
    216
    217	/* Microsoft LifeCam-VX700 v2.0 */
    218	{ USB_DEVICE(0x045e, 0x0770), .driver_info = USB_QUIRK_RESET_RESUME },
    219
    220	/* Microsoft Surface Dock Ethernet (RTL8153 GigE) */
    221	{ USB_DEVICE(0x045e, 0x07c6), .driver_info = USB_QUIRK_NO_LPM },
    222
    223	/* Cherry Stream G230 2.0 (G85-231) and 3.0 (G85-232) */
    224	{ USB_DEVICE(0x046a, 0x0023), .driver_info = USB_QUIRK_RESET_RESUME },
    225
    226	/* Logitech HD Webcam C270 */
    227	{ USB_DEVICE(0x046d, 0x0825), .driver_info = USB_QUIRK_RESET_RESUME },
    228
    229	/* Logitech HD Pro Webcams C920, C920-C, C922, C925e and C930e */
    230	{ USB_DEVICE(0x046d, 0x082d), .driver_info = USB_QUIRK_DELAY_INIT },
    231	{ USB_DEVICE(0x046d, 0x0841), .driver_info = USB_QUIRK_DELAY_INIT },
    232	{ USB_DEVICE(0x046d, 0x0843), .driver_info = USB_QUIRK_DELAY_INIT },
    233	{ USB_DEVICE(0x046d, 0x085b), .driver_info = USB_QUIRK_DELAY_INIT },
    234	{ USB_DEVICE(0x046d, 0x085c), .driver_info = USB_QUIRK_DELAY_INIT },
    235
    236	/* Logitech ConferenceCam CC3000e */
    237	{ USB_DEVICE(0x046d, 0x0847), .driver_info = USB_QUIRK_DELAY_INIT },
    238	{ USB_DEVICE(0x046d, 0x0848), .driver_info = USB_QUIRK_DELAY_INIT },
    239
    240	/* Logitech PTZ Pro Camera */
    241	{ USB_DEVICE(0x046d, 0x0853), .driver_info = USB_QUIRK_DELAY_INIT },
    242
    243	/* Logitech Screen Share */
    244	{ USB_DEVICE(0x046d, 0x086c), .driver_info = USB_QUIRK_NO_LPM },
    245
    246	/* Logitech Quickcam Fusion */
    247	{ USB_DEVICE(0x046d, 0x08c1), .driver_info = USB_QUIRK_RESET_RESUME },
    248
    249	/* Logitech Quickcam Orbit MP */
    250	{ USB_DEVICE(0x046d, 0x08c2), .driver_info = USB_QUIRK_RESET_RESUME },
    251
    252	/* Logitech Quickcam Pro for Notebook */
    253	{ USB_DEVICE(0x046d, 0x08c3), .driver_info = USB_QUIRK_RESET_RESUME },
    254
    255	/* Logitech Quickcam Pro 5000 */
    256	{ USB_DEVICE(0x046d, 0x08c5), .driver_info = USB_QUIRK_RESET_RESUME },
    257
    258	/* Logitech Quickcam OEM Dell Notebook */
    259	{ USB_DEVICE(0x046d, 0x08c6), .driver_info = USB_QUIRK_RESET_RESUME },
    260
    261	/* Logitech Quickcam OEM Cisco VT Camera II */
    262	{ USB_DEVICE(0x046d, 0x08c7), .driver_info = USB_QUIRK_RESET_RESUME },
    263
    264	/* Logitech Harmony 700-series */
    265	{ USB_DEVICE(0x046d, 0xc122), .driver_info = USB_QUIRK_DELAY_INIT },
    266
    267	/* Philips PSC805 audio device */
    268	{ USB_DEVICE(0x0471, 0x0155), .driver_info = USB_QUIRK_RESET_RESUME },
    269
    270	/* Plantronic Audio 655 DSP */
    271	{ USB_DEVICE(0x047f, 0xc008), .driver_info = USB_QUIRK_RESET_RESUME },
    272
    273	/* Plantronic Audio 648 USB */
    274	{ USB_DEVICE(0x047f, 0xc013), .driver_info = USB_QUIRK_RESET_RESUME },
    275
    276	/* Artisman Watchdog Dongle */
    277	{ USB_DEVICE(0x04b4, 0x0526), .driver_info =
    278			USB_QUIRK_CONFIG_INTF_STRINGS },
    279
    280	/* Microchip Joss Optical infrared touchboard device */
    281	{ USB_DEVICE(0x04d8, 0x000c), .driver_info =
    282			USB_QUIRK_CONFIG_INTF_STRINGS },
    283
    284	/* CarrolTouch 4000U */
    285	{ USB_DEVICE(0x04e7, 0x0009), .driver_info = USB_QUIRK_RESET_RESUME },
    286
    287	/* CarrolTouch 4500U */
    288	{ USB_DEVICE(0x04e7, 0x0030), .driver_info = USB_QUIRK_RESET_RESUME },
    289
    290	/* Samsung Android phone modem - ID conflict with SPH-I500 */
    291	{ USB_DEVICE(0x04e8, 0x6601), .driver_info =
    292			USB_QUIRK_CONFIG_INTF_STRINGS },
    293
    294	/* Elan Touchscreen */
    295	{ USB_DEVICE(0x04f3, 0x0089), .driver_info =
    296			USB_QUIRK_DEVICE_QUALIFIER },
    297
    298	{ USB_DEVICE(0x04f3, 0x009b), .driver_info =
    299			USB_QUIRK_DEVICE_QUALIFIER },
    300
    301	{ USB_DEVICE(0x04f3, 0x010c), .driver_info =
    302			USB_QUIRK_DEVICE_QUALIFIER },
    303
    304	{ USB_DEVICE(0x04f3, 0x0125), .driver_info =
    305			USB_QUIRK_DEVICE_QUALIFIER },
    306
    307	{ USB_DEVICE(0x04f3, 0x016f), .driver_info =
    308			USB_QUIRK_DEVICE_QUALIFIER },
    309
    310	{ USB_DEVICE(0x04f3, 0x0381), .driver_info =
    311			USB_QUIRK_NO_LPM },
    312
    313	{ USB_DEVICE(0x04f3, 0x21b8), .driver_info =
    314			USB_QUIRK_DEVICE_QUALIFIER },
    315
    316	/* Roland SC-8820 */
    317	{ USB_DEVICE(0x0582, 0x0007), .driver_info = USB_QUIRK_RESET_RESUME },
    318
    319	/* Edirol SD-20 */
    320	{ USB_DEVICE(0x0582, 0x0027), .driver_info = USB_QUIRK_RESET_RESUME },
    321
    322	/* Alcor Micro Corp. Hub */
    323	{ USB_DEVICE(0x058f, 0x9254), .driver_info = USB_QUIRK_RESET_RESUME },
    324
    325	/* appletouch */
    326	{ USB_DEVICE(0x05ac, 0x021a), .driver_info = USB_QUIRK_RESET_RESUME },
    327
    328	/* Genesys Logic hub, internally used by KY-688 USB 3.1 Type-C Hub */
    329	{ USB_DEVICE(0x05e3, 0x0612), .driver_info = USB_QUIRK_NO_LPM },
    330
    331	/* ELSA MicroLink 56K */
    332	{ USB_DEVICE(0x05cc, 0x2267), .driver_info = USB_QUIRK_RESET_RESUME },
    333
    334	/* Genesys Logic hub, internally used by Moshi USB to Ethernet Adapter */
    335	{ USB_DEVICE(0x05e3, 0x0616), .driver_info = USB_QUIRK_NO_LPM },
    336
    337	/* Avision AV600U */
    338	{ USB_DEVICE(0x0638, 0x0a13), .driver_info =
    339	  USB_QUIRK_STRING_FETCH_255 },
    340
    341	/* Saitek Cyborg Gold Joystick */
    342	{ USB_DEVICE(0x06a3, 0x0006), .driver_info =
    343			USB_QUIRK_CONFIG_INTF_STRINGS },
    344
    345	/* Agfa SNAPSCAN 1212U */
    346	{ USB_DEVICE(0x06bd, 0x0001), .driver_info = USB_QUIRK_RESET_RESUME },
    347
    348	/* Guillemot Webcam Hercules Dualpix Exchange (2nd ID) */
    349	{ USB_DEVICE(0x06f8, 0x0804), .driver_info = USB_QUIRK_RESET_RESUME },
    350
    351	/* Guillemot Webcam Hercules Dualpix Exchange*/
    352	{ USB_DEVICE(0x06f8, 0x3005), .driver_info = USB_QUIRK_RESET_RESUME },
    353
    354	/* Guillemot Hercules DJ Console audio card (BZ 208357) */
    355	{ USB_DEVICE(0x06f8, 0xb000), .driver_info =
    356			USB_QUIRK_ENDPOINT_IGNORE },
    357
    358	/* Midiman M-Audio Keystation 88es */
    359	{ USB_DEVICE(0x0763, 0x0192), .driver_info = USB_QUIRK_RESET_RESUME },
    360
    361	/* SanDisk Ultra Fit and Ultra Flair */
    362	{ USB_DEVICE(0x0781, 0x5583), .driver_info = USB_QUIRK_NO_LPM },
    363	{ USB_DEVICE(0x0781, 0x5591), .driver_info = USB_QUIRK_NO_LPM },
    364
    365	/* M-Systems Flash Disk Pioneers */
    366	{ USB_DEVICE(0x08ec, 0x1000), .driver_info = USB_QUIRK_RESET_RESUME },
    367
    368	/* Baum Vario Ultra */
    369	{ USB_DEVICE(0x0904, 0x6101), .driver_info =
    370			USB_QUIRK_LINEAR_FRAME_INTR_BINTERVAL },
    371	{ USB_DEVICE(0x0904, 0x6102), .driver_info =
    372			USB_QUIRK_LINEAR_FRAME_INTR_BINTERVAL },
    373	{ USB_DEVICE(0x0904, 0x6103), .driver_info =
    374			USB_QUIRK_LINEAR_FRAME_INTR_BINTERVAL },
    375
    376	/* Sound Devices USBPre2 */
    377	{ USB_DEVICE(0x0926, 0x0202), .driver_info =
    378			USB_QUIRK_ENDPOINT_IGNORE },
    379
    380	/* Sound Devices MixPre-D */
    381	{ USB_DEVICE(0x0926, 0x0208), .driver_info =
    382			USB_QUIRK_ENDPOINT_IGNORE },
    383
    384	/* Keytouch QWERTY Panel keyboard */
    385	{ USB_DEVICE(0x0926, 0x3333), .driver_info =
    386			USB_QUIRK_CONFIG_INTF_STRINGS },
    387
    388	/* Kingston DataTraveler 3.0 */
    389	{ USB_DEVICE(0x0951, 0x1666), .driver_info = USB_QUIRK_NO_LPM },
    390
    391	/* X-Rite/Gretag-Macbeth Eye-One Pro display colorimeter */
    392	{ USB_DEVICE(0x0971, 0x2000), .driver_info = USB_QUIRK_NO_SET_INTF },
    393
    394	/* ELMO L-12F document camera */
    395	{ USB_DEVICE(0x09a1, 0x0028), .driver_info = USB_QUIRK_DELAY_CTRL_MSG },
    396
    397	/* Broadcom BCM92035DGROM BT dongle */
    398	{ USB_DEVICE(0x0a5c, 0x2021), .driver_info = USB_QUIRK_RESET_RESUME },
    399
    400	/* MAYA44USB sound device */
    401	{ USB_DEVICE(0x0a92, 0x0091), .driver_info = USB_QUIRK_RESET_RESUME },
    402
    403	/* ASUS Base Station(T100) */
    404	{ USB_DEVICE(0x0b05, 0x17e0), .driver_info =
    405			USB_QUIRK_IGNORE_REMOTE_WAKEUP },
    406
    407	/* Realtek Semiconductor Corp. Mass Storage Device (Multicard Reader)*/
    408	{ USB_DEVICE(0x0bda, 0x0151), .driver_info = USB_QUIRK_CONFIG_INTF_STRINGS },
    409
    410	/* Realtek hub in Dell WD19 (Type-C) */
    411	{ USB_DEVICE(0x0bda, 0x0487), .driver_info = USB_QUIRK_NO_LPM },
    412
    413	/* Generic RTL8153 based ethernet adapters */
    414	{ USB_DEVICE(0x0bda, 0x8153), .driver_info = USB_QUIRK_NO_LPM },
    415
    416	/* SONiX USB DEVICE Touchpad */
    417	{ USB_DEVICE(0x0c45, 0x7056), .driver_info =
    418			USB_QUIRK_IGNORE_REMOTE_WAKEUP },
    419
    420	/* Action Semiconductor flash disk */
    421	{ USB_DEVICE(0x10d6, 0x2200), .driver_info =
    422			USB_QUIRK_STRING_FETCH_255 },
    423
    424	/* novation SoundControl XL */
    425	{ USB_DEVICE(0x1235, 0x0061), .driver_info = USB_QUIRK_RESET_RESUME },
    426
    427	/* Huawei 4G LTE module */
    428	{ USB_DEVICE(0x12d1, 0x15bb), .driver_info =
    429			USB_QUIRK_DISCONNECT_SUSPEND },
    430	{ USB_DEVICE(0x12d1, 0x15c3), .driver_info =
    431			USB_QUIRK_DISCONNECT_SUSPEND },
    432
    433	/* SKYMEDI USB_DRIVE */
    434	{ USB_DEVICE(0x1516, 0x8628), .driver_info = USB_QUIRK_RESET_RESUME },
    435
    436	/* Razer - Razer Blade Keyboard */
    437	{ USB_DEVICE(0x1532, 0x0116), .driver_info =
    438			USB_QUIRK_LINEAR_UFRAME_INTR_BINTERVAL },
    439
    440	/* Lenovo USB-C to Ethernet Adapter RTL8153-04 */
    441	{ USB_DEVICE(0x17ef, 0x720c), .driver_info = USB_QUIRK_NO_LPM },
    442
    443	/* Lenovo Powered USB-C Travel Hub (4X90S92381, RTL8153 GigE) */
    444	{ USB_DEVICE(0x17ef, 0x721e), .driver_info = USB_QUIRK_NO_LPM },
    445
    446	/* Lenovo ThinkCenter A630Z TI024Gen3 usb-audio */
    447	{ USB_DEVICE(0x17ef, 0xa012), .driver_info =
    448			USB_QUIRK_DISCONNECT_SUSPEND },
    449
    450	/* Lenovo ThinkPad USB-C Dock Gen2 Ethernet (RTL8153 GigE) */
    451	{ USB_DEVICE(0x17ef, 0xa387), .driver_info = USB_QUIRK_NO_LPM },
    452
    453	/* BUILDWIN Photo Frame */
    454	{ USB_DEVICE(0x1908, 0x1315), .driver_info =
    455			USB_QUIRK_HONOR_BNUMINTERFACES },
    456
    457	/* Protocol and OTG Electrical Test Device */
    458	{ USB_DEVICE(0x1a0a, 0x0200), .driver_info =
    459			USB_QUIRK_LINEAR_UFRAME_INTR_BINTERVAL },
    460
    461	/* Terminus Technology Inc. Hub */
    462	{ USB_DEVICE(0x1a40, 0x0101), .driver_info = USB_QUIRK_HUB_SLOW_RESET },
    463
    464	/* Corsair K70 RGB */
    465	{ USB_DEVICE(0x1b1c, 0x1b13), .driver_info = USB_QUIRK_DELAY_INIT |
    466	  USB_QUIRK_DELAY_CTRL_MSG },
    467
    468	/* Corsair Strafe */
    469	{ USB_DEVICE(0x1b1c, 0x1b15), .driver_info = USB_QUIRK_DELAY_INIT |
    470	  USB_QUIRK_DELAY_CTRL_MSG },
    471
    472	/* Corsair Strafe RGB */
    473	{ USB_DEVICE(0x1b1c, 0x1b20), .driver_info = USB_QUIRK_DELAY_INIT |
    474	  USB_QUIRK_DELAY_CTRL_MSG },
    475
    476	/* Corsair K70 LUX RGB */
    477	{ USB_DEVICE(0x1b1c, 0x1b33), .driver_info = USB_QUIRK_DELAY_INIT },
    478
    479	/* Corsair K70 LUX */
    480	{ USB_DEVICE(0x1b1c, 0x1b36), .driver_info = USB_QUIRK_DELAY_INIT },
    481
    482	/* Corsair K70 RGB RAPDIFIRE */
    483	{ USB_DEVICE(0x1b1c, 0x1b38), .driver_info = USB_QUIRK_DELAY_INIT |
    484	  USB_QUIRK_DELAY_CTRL_MSG },
    485
    486	/* MIDI keyboard WORLDE MINI */
    487	{ USB_DEVICE(0x1c75, 0x0204), .driver_info =
    488			USB_QUIRK_CONFIG_INTF_STRINGS },
    489
    490	/* Acer C120 LED Projector */
    491	{ USB_DEVICE(0x1de1, 0xc102), .driver_info = USB_QUIRK_NO_LPM },
    492
    493	/* Blackmagic Design Intensity Shuttle */
    494	{ USB_DEVICE(0x1edb, 0xbd3b), .driver_info = USB_QUIRK_NO_LPM },
    495
    496	/* Blackmagic Design UltraStudio SDI */
    497	{ USB_DEVICE(0x1edb, 0xbd4f), .driver_info = USB_QUIRK_NO_LPM },
    498
    499	/* Hauppauge HVR-950q */
    500	{ USB_DEVICE(0x2040, 0x7200), .driver_info =
    501			USB_QUIRK_CONFIG_INTF_STRINGS },
    502
    503	/* Raydium Touchscreen */
    504	{ USB_DEVICE(0x2386, 0x3114), .driver_info = USB_QUIRK_NO_LPM },
    505
    506	{ USB_DEVICE(0x2386, 0x3119), .driver_info = USB_QUIRK_NO_LPM },
    507
    508	{ USB_DEVICE(0x2386, 0x350e), .driver_info = USB_QUIRK_NO_LPM },
    509
    510	/* DJI CineSSD */
    511	{ USB_DEVICE(0x2ca3, 0x0031), .driver_info = USB_QUIRK_NO_LPM },
    512
    513	/* DELL USB GEN2 */
    514	{ USB_DEVICE(0x413c, 0xb062), .driver_info = USB_QUIRK_NO_LPM | USB_QUIRK_RESET_RESUME },
    515
    516	/* VCOM device */
    517	{ USB_DEVICE(0x4296, 0x7570), .driver_info = USB_QUIRK_CONFIG_INTF_STRINGS },
    518
    519	/* INTEL VALUE SSD */
    520	{ USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME },
    521
    522	{ }  /* terminating entry must be last */
    523};
    524
    525static const struct usb_device_id usb_interface_quirk_list[] = {
    526	/* Logitech UVC Cameras */
    527	{ USB_VENDOR_AND_INTERFACE_INFO(0x046d, USB_CLASS_VIDEO, 1, 0),
    528	  .driver_info = USB_QUIRK_RESET_RESUME },
    529
    530	{ }  /* terminating entry must be last */
    531};
    532
    533static const struct usb_device_id usb_amd_resume_quirk_list[] = {
    534	/* Lenovo Mouse with Pixart controller */
    535	{ USB_DEVICE(0x17ef, 0x602e), .driver_info = USB_QUIRK_RESET_RESUME },
    536
    537	/* Pixart Mouse */
    538	{ USB_DEVICE(0x093a, 0x2500), .driver_info = USB_QUIRK_RESET_RESUME },
    539	{ USB_DEVICE(0x093a, 0x2510), .driver_info = USB_QUIRK_RESET_RESUME },
    540	{ USB_DEVICE(0x093a, 0x2521), .driver_info = USB_QUIRK_RESET_RESUME },
    541	{ USB_DEVICE(0x03f0, 0x2b4a), .driver_info = USB_QUIRK_RESET_RESUME },
    542
    543	/* Logitech Optical Mouse M90/M100 */
    544	{ USB_DEVICE(0x046d, 0xc05a), .driver_info = USB_QUIRK_RESET_RESUME },
    545
    546	{ }  /* terminating entry must be last */
    547};
    548
    549/*
    550 * Entries for endpoints that should be ignored when parsing configuration
    551 * descriptors.
    552 *
    553 * Matched for devices with USB_QUIRK_ENDPOINT_IGNORE.
    554 */
    555static const struct usb_device_id usb_endpoint_ignore[] = {
    556	{ USB_DEVICE_INTERFACE_NUMBER(0x06f8, 0xb000, 5), .driver_info = 0x01 },
    557	{ USB_DEVICE_INTERFACE_NUMBER(0x06f8, 0xb000, 5), .driver_info = 0x81 },
    558	{ USB_DEVICE_INTERFACE_NUMBER(0x0926, 0x0202, 1), .driver_info = 0x85 },
    559	{ USB_DEVICE_INTERFACE_NUMBER(0x0926, 0x0208, 1), .driver_info = 0x85 },
    560	{ }
    561};
    562
    563bool usb_endpoint_is_ignored(struct usb_device *udev,
    564			     struct usb_host_interface *intf,
    565			     struct usb_endpoint_descriptor *epd)
    566{
    567	const struct usb_device_id *id;
    568	unsigned int address;
    569
    570	for (id = usb_endpoint_ignore; id->match_flags; ++id) {
    571		if (!usb_match_device(udev, id))
    572			continue;
    573
    574		if (!usb_match_one_id_intf(udev, intf, id))
    575			continue;
    576
    577		address = id->driver_info;
    578		if (address == epd->bEndpointAddress)
    579			return true;
    580	}
    581
    582	return false;
    583}
    584
    585static bool usb_match_any_interface(struct usb_device *udev,
    586				    const struct usb_device_id *id)
    587{
    588	unsigned int i;
    589
    590	for (i = 0; i < udev->descriptor.bNumConfigurations; ++i) {
    591		struct usb_host_config *cfg = &udev->config[i];
    592		unsigned int j;
    593
    594		for (j = 0; j < cfg->desc.bNumInterfaces; ++j) {
    595			struct usb_interface_cache *cache;
    596			struct usb_host_interface *intf;
    597
    598			cache = cfg->intf_cache[j];
    599			if (cache->num_altsetting == 0)
    600				continue;
    601
    602			intf = &cache->altsetting[0];
    603			if (usb_match_one_id_intf(udev, intf, id))
    604				return true;
    605		}
    606	}
    607
    608	return false;
    609}
    610
    611static int usb_amd_resume_quirk(struct usb_device *udev)
    612{
    613	struct usb_hcd *hcd;
    614
    615	hcd = bus_to_hcd(udev->bus);
    616	/* The device should be attached directly to root hub */
    617	if (udev->level == 1 && hcd->amd_resume_bug == 1)
    618		return 1;
    619
    620	return 0;
    621}
    622
    623static u32 usb_detect_static_quirks(struct usb_device *udev,
    624				    const struct usb_device_id *id)
    625{
    626	u32 quirks = 0;
    627
    628	for (; id->match_flags; id++) {
    629		if (!usb_match_device(udev, id))
    630			continue;
    631
    632		if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_INFO) &&
    633		    !usb_match_any_interface(udev, id))
    634			continue;
    635
    636		quirks |= (u32)(id->driver_info);
    637	}
    638
    639	return quirks;
    640}
    641
    642static u32 usb_detect_dynamic_quirks(struct usb_device *udev)
    643{
    644	u16 vid = le16_to_cpu(udev->descriptor.idVendor);
    645	u16 pid = le16_to_cpu(udev->descriptor.idProduct);
    646	int i, flags = 0;
    647
    648	mutex_lock(&quirk_mutex);
    649
    650	for (i = 0; i < quirk_count; i++) {
    651		if (vid == quirk_list[i].vid && pid == quirk_list[i].pid) {
    652			flags = quirk_list[i].flags;
    653			break;
    654		}
    655	}
    656
    657	mutex_unlock(&quirk_mutex);
    658
    659	return flags;
    660}
    661
    662/*
    663 * Detect any quirks the device has, and do any housekeeping for it if needed.
    664 */
    665void usb_detect_quirks(struct usb_device *udev)
    666{
    667	udev->quirks = usb_detect_static_quirks(udev, usb_quirk_list);
    668
    669	/*
    670	 * Pixart-based mice would trigger remote wakeup issue on AMD
    671	 * Yangtze chipset, so set them as RESET_RESUME flag.
    672	 */
    673	if (usb_amd_resume_quirk(udev))
    674		udev->quirks |= usb_detect_static_quirks(udev,
    675				usb_amd_resume_quirk_list);
    676
    677	udev->quirks ^= usb_detect_dynamic_quirks(udev);
    678
    679	if (udev->quirks)
    680		dev_dbg(&udev->dev, "USB quirks for this device: %x\n",
    681			udev->quirks);
    682
    683#ifdef CONFIG_USB_DEFAULT_PERSIST
    684	if (!(udev->quirks & USB_QUIRK_RESET))
    685		udev->persist_enabled = 1;
    686#else
    687	/* Hubs are automatically enabled for USB-PERSIST */
    688	if (udev->descriptor.bDeviceClass == USB_CLASS_HUB)
    689		udev->persist_enabled = 1;
    690#endif	/* CONFIG_USB_DEFAULT_PERSIST */
    691}
    692
    693void usb_detect_interface_quirks(struct usb_device *udev)
    694{
    695	u32 quirks;
    696
    697	quirks = usb_detect_static_quirks(udev, usb_interface_quirk_list);
    698	if (quirks == 0)
    699		return;
    700
    701	dev_dbg(&udev->dev, "USB interface quirks for this device: %x\n",
    702		quirks);
    703	udev->quirks |= quirks;
    704}
    705
    706void usb_release_quirk_list(void)
    707{
    708	mutex_lock(&quirk_mutex);
    709	kfree(quirk_list);
    710	quirk_list = NULL;
    711	mutex_unlock(&quirk_mutex);
    712}