linux/drivers/hid/usbhid/hid-quirks.c
<<
>>
Prefs
   1/*
   2 *  USB HID quirks support for Linux
   3 *
   4 *  Copyright (c) 1999 Andreas Gal
   5 *  Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
   6 *  Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
   7 *  Copyright (c) 2006-2007 Jiri Kosina
   8 *  Copyright (c) 2007 Paul Walmsley
   9 */
  10
  11/*
  12 * This program is free software; you can redistribute it and/or modify it
  13 * under the terms of the GNU General Public License as published by the Free
  14 * Software Foundation; either version 2 of the License, or (at your option)
  15 * any later version.
  16 */
  17
  18#include <linux/hid.h>
  19
  20#define USB_VENDOR_ID_A4TECH            0x09da
  21#define USB_DEVICE_ID_A4TECH_WCP32PU    0x0006
  22
  23#define USB_VENDOR_ID_AASHIMA           0x06d6
  24#define USB_DEVICE_ID_AASHIMA_GAMEPAD   0x0025
  25#define USB_DEVICE_ID_AASHIMA_PREDATOR  0x0026
  26
  27#define USB_VENDOR_ID_ACECAD            0x0460
  28#define USB_DEVICE_ID_ACECAD_FLAIR      0x0004
  29#define USB_DEVICE_ID_ACECAD_302        0x0008
  30
  31#define USB_VENDOR_ID_AIPTEK            0x08ca
  32#define USB_DEVICE_ID_AIPTEK_01         0x0001
  33#define USB_DEVICE_ID_AIPTEK_10         0x0010
  34#define USB_DEVICE_ID_AIPTEK_20         0x0020
  35#define USB_DEVICE_ID_AIPTEK_21         0x0021
  36#define USB_DEVICE_ID_AIPTEK_22         0x0022
  37#define USB_DEVICE_ID_AIPTEK_23         0x0023
  38#define USB_DEVICE_ID_AIPTEK_24         0x0024
  39
  40#define USB_VENDOR_ID_AIRCABLE          0x16CA
  41#define USB_DEVICE_ID_AIRCABLE1         0x1502
  42
  43#define USB_VENDOR_ID_ALCOR             0x058f
  44#define USB_DEVICE_ID_ALCOR_USBRS232    0x9720
  45
  46#define USB_VENDOR_ID_ALPS              0x0433
  47#define USB_DEVICE_ID_IBM_GAMEPAD       0x1101
  48
  49#define USB_VENDOR_ID_APPLE             0x05ac
  50#define USB_DEVICE_ID_APPLE_MIGHTYMOUSE 0x0304
  51#define USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI       0x020e
  52#define USB_DEVICE_ID_APPLE_FOUNTAIN_ISO        0x020f
  53#define USB_DEVICE_ID_APPLE_GEYSER_ANSI 0x0214
  54#define USB_DEVICE_ID_APPLE_GEYSER_ISO  0x0215
  55#define USB_DEVICE_ID_APPLE_GEYSER_JIS  0x0216
  56#define USB_DEVICE_ID_APPLE_GEYSER3_ANSI        0x0217
  57#define USB_DEVICE_ID_APPLE_GEYSER3_ISO 0x0218
  58#define USB_DEVICE_ID_APPLE_GEYSER3_JIS 0x0219
  59#define USB_DEVICE_ID_APPLE_GEYSER4_ANSI        0x021a
  60#define USB_DEVICE_ID_APPLE_GEYSER4_ISO 0x021b
  61#define USB_DEVICE_ID_APPLE_GEYSER4_JIS 0x021c
  62#define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY    0x030a
  63#define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY     0x030b
  64#define USB_DEVICE_ID_APPLE_IRCONTROL4  0x8242
  65
  66#define USB_VENDOR_ID_ASUS              0x0b05
  67#define USB_DEVICE_ID_ASUS_LCM          0x1726
  68
  69#define USB_VENDOR_ID_ATEN              0x0557
  70#define USB_DEVICE_ID_ATEN_UC100KM      0x2004
  71#define USB_DEVICE_ID_ATEN_CS124U       0x2202
  72#define USB_DEVICE_ID_ATEN_2PORTKVM     0x2204
  73#define USB_DEVICE_ID_ATEN_4PORTKVM     0x2205
  74#define USB_DEVICE_ID_ATEN_4PORTKVMC    0x2208
  75
  76#define USB_VENDOR_ID_BELKIN           0x050d
  77#define USB_DEVICE_ID_FLIP_KVM         0x3201
  78
  79#define USB_VENDOR_ID_BERKSHIRE         0x0c98
  80#define USB_DEVICE_ID_BERKSHIRE_PCWD    0x1140
  81
  82#define USB_VENDOR_ID_CHERRY            0x046a
  83#define USB_DEVICE_ID_CHERRY_CYMOTION   0x0023
  84
  85#define USB_VENDOR_ID_CHIC              0x05fe
  86#define USB_DEVICE_ID_CHIC_GAMEPAD      0x0014
  87
  88#define USB_VENDOR_ID_CIDC              0x1677
  89
  90#define USB_VENDOR_ID_CMEDIA            0x0d8c
  91#define USB_DEVICE_ID_CM109             0x000e
  92
  93#define USB_VENDOR_ID_CODEMERCS         0x07c0
  94#define USB_DEVICE_ID_CODEMERCS_IOW_FIRST       0x1500
  95#define USB_DEVICE_ID_CODEMERCS_IOW_LAST        0x15ff
  96
  97#define USB_VENDOR_ID_CYPRESS           0x04b4
  98#define USB_DEVICE_ID_CYPRESS_MOUSE     0x0001
  99#define USB_DEVICE_ID_CYPRESS_HIDCOM    0x5500
 100#define USB_DEVICE_ID_CYPRESS_ULTRAMOUSE        0x7417
 101#define USB_DEVICE_ID_CYPRESS_BARCODE_1 0xde61
 102#define USB_DEVICE_ID_CYPRESS_BARCODE_2 0xde64
 103
 104#define USB_VENDOR_ID_DELL              0x413c
 105#define USB_DEVICE_ID_DELL_W7658        0x2005
 106
 107#define USB_VENDOR_ID_DELORME           0x1163
 108#define USB_DEVICE_ID_DELORME_EARTHMATE 0x0100
 109#define USB_DEVICE_ID_DELORME_EM_LT20   0x0200
 110
 111#define USB_VENDOR_ID_ELO               0x04E7
 112#define USB_DEVICE_ID_ELO_TS2700        0x0020
 113
 114#define USB_VENDOR_ID_ESSENTIAL_REALITY 0x0d7f
 115#define USB_DEVICE_ID_ESSENTIAL_REALITY_P5 0x0100
 116
 117#define USB_VENDOR_ID_GAMERON           0x0810
 118#define USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR  0x0001
 119
 120#define USB_VENDOR_ID_GENERAL_TOUCH     0x0dfc
 121
 122#define USB_VENDOR_ID_GLAB              0x06c2
 123#define USB_DEVICE_ID_4_PHIDGETSERVO_30 0x0038
 124#define USB_DEVICE_ID_1_PHIDGETSERVO_30 0x0039
 125#define USB_DEVICE_ID_0_0_4_IF_KIT      0x0040
 126#define USB_DEVICE_ID_0_16_16_IF_KIT    0x0044
 127#define USB_DEVICE_ID_8_8_8_IF_KIT      0x0045
 128#define USB_DEVICE_ID_0_8_7_IF_KIT      0x0051
 129#define USB_DEVICE_ID_0_8_8_IF_KIT      0x0053
 130#define USB_DEVICE_ID_PHIDGET_MOTORCONTROL      0x0058
 131
 132#define USB_VENDOR_ID_GOTOP             0x08f2
 133#define USB_DEVICE_ID_SUPER_Q2          0x007f
 134#define USB_DEVICE_ID_GOGOPEN           0x00ce
 135#define USB_DEVICE_ID_PENPOWER          0x00f4
 136
 137#define USB_VENDOR_ID_GRIFFIN           0x077d
 138#define USB_DEVICE_ID_POWERMATE         0x0410
 139#define USB_DEVICE_ID_SOUNDKNOB         0x04AA
 140
 141#define USB_VENDOR_ID_GTCO              0x078c
 142#define USB_DEVICE_ID_GTCO_90           0x0090
 143#define USB_DEVICE_ID_GTCO_100          0x0100
 144#define USB_DEVICE_ID_GTCO_101          0x0101
 145#define USB_DEVICE_ID_GTCO_103          0x0103
 146#define USB_DEVICE_ID_GTCO_104          0x0104
 147#define USB_DEVICE_ID_GTCO_105          0x0105
 148#define USB_DEVICE_ID_GTCO_106          0x0106
 149#define USB_DEVICE_ID_GTCO_107          0x0107
 150#define USB_DEVICE_ID_GTCO_108          0x0108
 151#define USB_DEVICE_ID_GTCO_200          0x0200
 152#define USB_DEVICE_ID_GTCO_201          0x0201
 153#define USB_DEVICE_ID_GTCO_202          0x0202
 154#define USB_DEVICE_ID_GTCO_203          0x0203
 155#define USB_DEVICE_ID_GTCO_204          0x0204
 156#define USB_DEVICE_ID_GTCO_205          0x0205
 157#define USB_DEVICE_ID_GTCO_206          0x0206
 158#define USB_DEVICE_ID_GTCO_207          0x0207
 159#define USB_DEVICE_ID_GTCO_300          0x0300
 160#define USB_DEVICE_ID_GTCO_301          0x0301
 161#define USB_DEVICE_ID_GTCO_302          0x0302
 162#define USB_DEVICE_ID_GTCO_303          0x0303
 163#define USB_DEVICE_ID_GTCO_304          0x0304
 164#define USB_DEVICE_ID_GTCO_305          0x0305
 165#define USB_DEVICE_ID_GTCO_306          0x0306
 166#define USB_DEVICE_ID_GTCO_307          0x0307
 167#define USB_DEVICE_ID_GTCO_308          0x0308
 168#define USB_DEVICE_ID_GTCO_309          0x0309
 169#define USB_DEVICE_ID_GTCO_400          0x0400
 170#define USB_DEVICE_ID_GTCO_401          0x0401
 171#define USB_DEVICE_ID_GTCO_402          0x0402
 172#define USB_DEVICE_ID_GTCO_403          0x0403
 173#define USB_DEVICE_ID_GTCO_404          0x0404
 174#define USB_DEVICE_ID_GTCO_405          0x0405
 175#define USB_DEVICE_ID_GTCO_500          0x0500
 176#define USB_DEVICE_ID_GTCO_501          0x0501
 177#define USB_DEVICE_ID_GTCO_502          0x0502
 178#define USB_DEVICE_ID_GTCO_503          0x0503
 179#define USB_DEVICE_ID_GTCO_504          0x0504
 180#define USB_DEVICE_ID_GTCO_1000         0x1000
 181#define USB_DEVICE_ID_GTCO_1001         0x1001
 182#define USB_DEVICE_ID_GTCO_1002         0x1002
 183#define USB_DEVICE_ID_GTCO_1003         0x1003
 184#define USB_DEVICE_ID_GTCO_1004         0x1004
 185#define USB_DEVICE_ID_GTCO_1005         0x1005
 186#define USB_DEVICE_ID_GTCO_1006         0x1006
 187
 188#define USB_VENDOR_ID_HAPP              0x078b
 189#define USB_DEVICE_ID_UGCI_DRIVING      0x0010
 190#define USB_DEVICE_ID_UGCI_FLYING       0x0020
 191#define USB_DEVICE_ID_UGCI_FIGHTING     0x0030
 192
 193#define USB_VENDOR_ID_IMATION           0x0718
 194#define USB_DEVICE_ID_DISC_STAKKA       0xd000
 195
 196#define USB_VENDOR_ID_KBGEAR            0x084e
 197#define USB_DEVICE_ID_KBGEAR_JAMSTUDIO  0x1001
 198
 199#define USB_VENDOR_ID_LD                0x0f11
 200#define USB_DEVICE_ID_LD_CASSY          0x1000
 201#define USB_DEVICE_ID_LD_POCKETCASSY    0x1010
 202#define USB_DEVICE_ID_LD_MOBILECASSY    0x1020
 203#define USB_DEVICE_ID_LD_JWM            0x1080
 204#define USB_DEVICE_ID_LD_DMMP           0x1081
 205#define USB_DEVICE_ID_LD_UMIP           0x1090
 206#define USB_DEVICE_ID_LD_XRAY1          0x1100
 207#define USB_DEVICE_ID_LD_XRAY2          0x1101
 208#define USB_DEVICE_ID_LD_VIDEOCOM       0x1200
 209#define USB_DEVICE_ID_LD_COM3LAB        0x2000
 210#define USB_DEVICE_ID_LD_TELEPORT       0x2010
 211#define USB_DEVICE_ID_LD_NETWORKANALYSER 0x2020
 212#define USB_DEVICE_ID_LD_POWERCONTROL   0x2030
 213#define USB_DEVICE_ID_LD_MACHINETEST    0x2040
 214
 215#define USB_VENDOR_ID_LOGITECH          0x046d
 216#define USB_DEVICE_ID_LOGITECH_RECEIVER 0xc101
 217#define USB_DEVICE_ID_LOGITECH_HARMONY  0xc110
 218#define USB_DEVICE_ID_LOGITECH_HARMONY_2 0xc111
 219#define USB_DEVICE_ID_LOGITECH_HARMONY_3 0xc112
 220#define USB_DEVICE_ID_LOGITECH_HARMONY_4 0xc113
 221#define USB_DEVICE_ID_LOGITECH_HARMONY_5 0xc114
 222#define USB_DEVICE_ID_LOGITECH_HARMONY_6 0xc115
 223#define USB_DEVICE_ID_LOGITECH_HARMONY_7 0xc116
 224#define USB_DEVICE_ID_LOGITECH_HARMONY_8 0xc117
 225#define USB_DEVICE_ID_LOGITECH_HARMONY_9 0xc118
 226#define USB_DEVICE_ID_LOGITECH_HARMONY_10 0xc119
 227#define USB_DEVICE_ID_LOGITECH_HARMONY_11 0xc11a
 228#define USB_DEVICE_ID_LOGITECH_HARMONY_12 0xc11b
 229#define USB_DEVICE_ID_LOGITECH_HARMONY_13 0xc11c
 230#define USB_DEVICE_ID_LOGITECH_HARMONY_14 0xc11d
 231#define USB_DEVICE_ID_LOGITECH_HARMONY_15 0xc11e
 232#define USB_DEVICE_ID_LOGITECH_HARMONY_16 0xc11f
 233#define USB_DEVICE_ID_LOGITECH_HARMONY_17 0xc120
 234#define USB_DEVICE_ID_LOGITECH_HARMONY_18 0xc121
 235#define USB_DEVICE_ID_LOGITECH_HARMONY_19 0xc122
 236#define USB_DEVICE_ID_LOGITECH_HARMONY_20 0xc123
 237#define USB_DEVICE_ID_LOGITECH_HARMONY_21 0xc124
 238#define USB_DEVICE_ID_LOGITECH_HARMONY_22 0xc125
 239#define USB_DEVICE_ID_LOGITECH_HARMONY_23 0xc126
 240#define USB_DEVICE_ID_LOGITECH_HARMONY_24 0xc127
 241#define USB_DEVICE_ID_LOGITECH_HARMONY_25 0xc128
 242#define USB_DEVICE_ID_LOGITECH_HARMONY_26 0xc129
 243#define USB_DEVICE_ID_LOGITECH_HARMONY_27 0xc12a
 244#define USB_DEVICE_ID_LOGITECH_HARMONY_28 0xc12b
 245#define USB_DEVICE_ID_LOGITECH_HARMONY_29 0xc12c
 246#define USB_DEVICE_ID_LOGITECH_HARMONY_30 0xc12d
 247#define USB_DEVICE_ID_LOGITECH_HARMONY_31 0xc12e
 248#define USB_DEVICE_ID_LOGITECH_HARMONY_32 0xc12f
 249#define USB_DEVICE_ID_LOGITECH_HARMONY_33 0xc130
 250#define USB_DEVICE_ID_LOGITECH_HARMONY_34 0xc131
 251#define USB_DEVICE_ID_LOGITECH_HARMONY_35 0xc132
 252#define USB_DEVICE_ID_LOGITECH_HARMONY_36 0xc133
 253#define USB_DEVICE_ID_LOGITECH_HARMONY_37 0xc134
 254#define USB_DEVICE_ID_LOGITECH_HARMONY_38 0xc135
 255#define USB_DEVICE_ID_LOGITECH_HARMONY_39 0xc136
 256#define USB_DEVICE_ID_LOGITECH_HARMONY_40 0xc137
 257#define USB_DEVICE_ID_LOGITECH_HARMONY_41 0xc138
 258#define USB_DEVICE_ID_LOGITECH_HARMONY_42 0xc139
 259#define USB_DEVICE_ID_LOGITECH_HARMONY_43 0xc13a
 260#define USB_DEVICE_ID_LOGITECH_HARMONY_44 0xc13b
 261#define USB_DEVICE_ID_LOGITECH_HARMONY_45 0xc13c
 262#define USB_DEVICE_ID_LOGITECH_HARMONY_46 0xc13d
 263#define USB_DEVICE_ID_LOGITECH_HARMONY_47 0xc13e
 264#define USB_DEVICE_ID_LOGITECH_HARMONY_48 0xc13f
 265#define USB_DEVICE_ID_LOGITECH_HARMONY_49 0xc140
 266#define USB_DEVICE_ID_LOGITECH_HARMONY_50 0xc141
 267#define USB_DEVICE_ID_LOGITECH_HARMONY_51 0xc142
 268#define USB_DEVICE_ID_LOGITECH_HARMONY_52 0xc143
 269#define USB_DEVICE_ID_LOGITECH_HARMONY_53 0xc144
 270#define USB_DEVICE_ID_LOGITECH_HARMONY_54 0xc145
 271#define USB_DEVICE_ID_LOGITECH_HARMONY_55 0xc146
 272#define USB_DEVICE_ID_LOGITECH_HARMONY_56 0xc147
 273#define USB_DEVICE_ID_LOGITECH_HARMONY_57 0xc148
 274#define USB_DEVICE_ID_LOGITECH_HARMONY_58 0xc149
 275#define USB_DEVICE_ID_LOGITECH_HARMONY_59 0xc14a
 276#define USB_DEVICE_ID_LOGITECH_HARMONY_60 0xc14b
 277#define USB_DEVICE_ID_LOGITECH_HARMONY_61 0xc14c
 278#define USB_DEVICE_ID_LOGITECH_HARMONY_62 0xc14d
 279#define USB_DEVICE_ID_LOGITECH_HARMONY_63 0xc14e
 280#define USB_DEVICE_ID_LOGITECH_HARMONY_64 0xc14f
 281#define USB_DEVICE_ID_LOGITECH_WHEEL    0xc294
 282#define USB_DEVICE_ID_LOGITECH_KBD      0xc311
 283#define USB_DEVICE_ID_S510_RECEIVER     0xc50c
 284#define USB_DEVICE_ID_S510_RECEIVER_2   0xc517
 285#define USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500   0xc512
 286#define USB_DEVICE_ID_MX3000_RECEIVER   0xc513
 287#define USB_DEVICE_ID_DINOVO_EDGE       0xc714
 288
 289#define USB_VENDOR_ID_MCC               0x09db
 290#define USB_DEVICE_ID_MCC_PMD1024LS     0x0076
 291#define USB_DEVICE_ID_MCC_PMD1208LS     0x007a
 292
 293#define USB_VENDOR_ID_MGE               0x0463
 294#define USB_DEVICE_ID_MGE_UPS           0xffff
 295#define USB_DEVICE_ID_MGE_UPS1          0x0001
 296
 297#define USB_VENDOR_ID_MICROSOFT         0x045e
 298#define USB_DEVICE_ID_SIDEWINDER_GV     0x003b
 299
 300#define USB_VENDOR_ID_NCR               0x0404
 301#define USB_DEVICE_ID_NCR_FIRST         0x0300
 302#define USB_DEVICE_ID_NCR_LAST          0x03ff
 303
 304#define USB_VENDOR_ID_NATIONAL_SEMICONDUCTOR 0x0400
 305#define USB_DEVICE_ID_N_S_HARMONY       0xc359
 306
 307#define USB_VENDOR_ID_NEC               0x073e
 308#define USB_DEVICE_ID_NEC_USB_GAME_PAD  0x0301
 309
 310#define USB_VENDOR_ID_ONTRAK            0x0a07
 311#define USB_DEVICE_ID_ONTRAK_ADU100     0x0064
 312
 313#define USB_VENDOR_ID_PANJIT            0x134c
 314
 315#define USB_VENDOR_ID_PANTHERLORD       0x0810
 316#define USB_DEVICE_ID_PANTHERLORD_TWIN_USB_JOYSTICK     0x0001
 317
 318#define USB_VENDOR_ID_PETALYNX          0x18b1
 319#define USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE    0x0037
 320
 321#define USB_VENDOR_ID_PLAYDOTCOM        0x0b43
 322#define USB_DEVICE_ID_PLAYDOTCOM_EMS_USBII      0x0003
 323
 324#define USB_VENDOR_ID_SAITEK            0x06a3
 325#define USB_DEVICE_ID_SAITEK_RUMBLEPAD  0xff17
 326
 327#define USB_VENDOR_ID_SONY                      0x054c
 328#define USB_DEVICE_ID_SONY_PS3_CONTROLLER       0x0268
 329
 330#define USB_VENDOR_ID_SUN               0x0430
 331#define USB_DEVICE_ID_RARITAN_KVM_DONGLE        0xcdab
 332
 333#define USB_VENDOR_ID_TOPMAX            0x0663
 334#define USB_DEVICE_ID_TOPMAX_COBRAPAD   0x0103
 335
 336#define USB_VENDOR_ID_TURBOX            0x062a
 337#define USB_DEVICE_ID_TURBOX_KEYBOARD   0x0201
 338
 339#define USB_VENDOR_ID_VERNIER           0x08f7
 340#define USB_DEVICE_ID_VERNIER_LABPRO    0x0001
 341#define USB_DEVICE_ID_VERNIER_GOTEMP    0x0002
 342#define USB_DEVICE_ID_VERNIER_SKIP      0x0003
 343#define USB_DEVICE_ID_VERNIER_CYCLOPS   0x0004
 344
 345#define USB_VENDOR_ID_WACOM             0x056a
 346
 347#define USB_VENDOR_ID_WISEGROUP         0x0925
 348#define USB_DEVICE_ID_1_PHIDGETSERVO_20 0x8101
 349#define USB_DEVICE_ID_4_PHIDGETSERVO_20 0x8104
 350#define USB_DEVICE_ID_8_8_4_IF_KIT      0x8201
 351#define USB_DEVICE_ID_QUAD_USB_JOYPAD   0x8800
 352#define USB_DEVICE_ID_DUAL_USB_JOYPAD   0x8866
 353
 354#define USB_VENDOR_ID_WISEGROUP_LTD     0x6677
 355#define USB_DEVICE_ID_SMARTJOY_DUAL_PLUS 0x8802
 356
 357#define USB_VENDOR_ID_YEALINK           0x6993
 358#define USB_DEVICE_ID_YEALINK_P1K_P4K_B2K       0xb001
 359
 360/*
 361 * Alphabetically sorted blacklist by quirk type.
 362 */
 363
 364static const struct hid_blacklist {
 365        __u16 idVendor;
 366        __u16 idProduct;
 367        __u32 quirks;
 368} hid_blacklist[] = {
 369
 370        { USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU, HID_QUIRK_2WHEEL_MOUSE_HACK_7 },
 371        { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE, HID_QUIRK_2WHEEL_MOUSE_HACK_5 },
 372
 373        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RECEIVER, HID_QUIRK_BAD_RELATIVE_KEYS },
 374
 375        { USB_VENDOR_ID_AASHIMA, USB_DEVICE_ID_AASHIMA_GAMEPAD, HID_QUIRK_BADPAD },
 376        { USB_VENDOR_ID_AASHIMA, USB_DEVICE_ID_AASHIMA_PREDATOR, HID_QUIRK_BADPAD },
 377        { USB_VENDOR_ID_ALPS, USB_DEVICE_ID_IBM_GAMEPAD, HID_QUIRK_BADPAD },
 378        { USB_VENDOR_ID_CHIC, USB_DEVICE_ID_CHIC_GAMEPAD, HID_QUIRK_BADPAD },
 379        { USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR, HID_QUIRK_MULTI_INPUT },
 380        { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_DRIVING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
 381        { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FLYING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
 382        { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FIGHTING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
 383        { USB_VENDOR_ID_NEC, USB_DEVICE_ID_NEC_USB_GAME_PAD, HID_QUIRK_BADPAD },
 384        { USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_RUMBLEPAD, HID_QUIRK_BADPAD },
 385        { USB_VENDOR_ID_TOPMAX, USB_DEVICE_ID_TOPMAX_COBRAPAD, HID_QUIRK_BADPAD },
 386        
 387        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_EDGE, HID_QUIRK_DUPLICATE_USAGES },
 388
 389        { USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM, HID_QUIRK_HIDDEV },
 390        { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4, HID_QUIRK_HIDDEV | HID_QUIRK_IGNORE_HIDINPUT },
 391        { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_SIDEWINDER_GV, HID_QUIRK_HIDINPUT },
 392
 393        { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_01, HID_QUIRK_IGNORE },
 394        { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_10, HID_QUIRK_IGNORE },
 395        { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_20, HID_QUIRK_IGNORE },
 396        { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_21, HID_QUIRK_IGNORE },
 397        { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_22, HID_QUIRK_IGNORE },
 398        { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_23, HID_QUIRK_IGNORE },
 399        { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_24, HID_QUIRK_IGNORE },
 400        { USB_VENDOR_ID_AIRCABLE, USB_DEVICE_ID_AIRCABLE1, HID_QUIRK_IGNORE },
 401        { USB_VENDOR_ID_ALCOR, USB_DEVICE_ID_ALCOR_USBRS232, HID_QUIRK_IGNORE },
 402        { USB_VENDOR_ID_ASUS, USB_DEVICE_ID_ASUS_LCM, HID_QUIRK_IGNORE},
 403        { USB_VENDOR_ID_BERKSHIRE, USB_DEVICE_ID_BERKSHIRE_PCWD, HID_QUIRK_IGNORE },
 404        { USB_VENDOR_ID_CIDC, 0x0103, HID_QUIRK_IGNORE },
 405        { USB_VENDOR_ID_CMEDIA, USB_DEVICE_ID_CM109, HID_QUIRK_IGNORE },
 406        { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_HIDCOM, HID_QUIRK_IGNORE },
 407        { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_ULTRAMOUSE, HID_QUIRK_IGNORE },
 408        { USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EARTHMATE, HID_QUIRK_IGNORE },
 409        { USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EM_LT20, HID_QUIRK_IGNORE },
 410        { USB_VENDOR_ID_ESSENTIAL_REALITY, USB_DEVICE_ID_ESSENTIAL_REALITY_P5, HID_QUIRK_IGNORE },
 411        { USB_VENDOR_ID_GENERAL_TOUCH, 0x0001, HID_QUIRK_IGNORE },
 412        { USB_VENDOR_ID_GENERAL_TOUCH, 0x0002, HID_QUIRK_IGNORE },
 413        { USB_VENDOR_ID_GENERAL_TOUCH, 0x0003, HID_QUIRK_IGNORE },
 414        { USB_VENDOR_ID_GENERAL_TOUCH, 0x0004, HID_QUIRK_IGNORE },
 415        { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_4_PHIDGETSERVO_30, HID_QUIRK_IGNORE },
 416        { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_1_PHIDGETSERVO_30, HID_QUIRK_IGNORE },
 417        { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_0_4_IF_KIT, HID_QUIRK_IGNORE },
 418        { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_16_16_IF_KIT, HID_QUIRK_IGNORE },
 419        { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_8_8_8_IF_KIT, HID_QUIRK_IGNORE },
 420        { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_8_7_IF_KIT, HID_QUIRK_IGNORE },
 421        { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_8_8_IF_KIT, HID_QUIRK_IGNORE },
 422        { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_PHIDGET_MOTORCONTROL, HID_QUIRK_IGNORE },
 423        { USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_SUPER_Q2, HID_QUIRK_IGNORE },
 424        { USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_GOGOPEN, HID_QUIRK_IGNORE },
 425        { USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_PENPOWER, HID_QUIRK_IGNORE },
 426        { USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_POWERMATE, HID_QUIRK_IGNORE },
 427        { USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_SOUNDKNOB, HID_QUIRK_IGNORE },
 428        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_90, HID_QUIRK_IGNORE },
 429        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_100, HID_QUIRK_IGNORE },
 430        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_101, HID_QUIRK_IGNORE },
 431        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_103, HID_QUIRK_IGNORE },
 432        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_104, HID_QUIRK_IGNORE },
 433        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_105, HID_QUIRK_IGNORE },
 434        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_106, HID_QUIRK_IGNORE },
 435        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_107, HID_QUIRK_IGNORE },
 436        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_108, HID_QUIRK_IGNORE },
 437        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_200, HID_QUIRK_IGNORE },
 438        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_201, HID_QUIRK_IGNORE },
 439        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_202, HID_QUIRK_IGNORE },
 440        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_203, HID_QUIRK_IGNORE },
 441        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_204, HID_QUIRK_IGNORE },
 442        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_205, HID_QUIRK_IGNORE },
 443        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_206, HID_QUIRK_IGNORE },
 444        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_207, HID_QUIRK_IGNORE },
 445        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_300, HID_QUIRK_IGNORE },
 446        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_301, HID_QUIRK_IGNORE },
 447        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_302, HID_QUIRK_IGNORE },
 448        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_303, HID_QUIRK_IGNORE },
 449        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_304, HID_QUIRK_IGNORE },
 450        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_305, HID_QUIRK_IGNORE },
 451        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_306, HID_QUIRK_IGNORE },
 452        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_307, HID_QUIRK_IGNORE },
 453        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_308, HID_QUIRK_IGNORE },
 454        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_309, HID_QUIRK_IGNORE },
 455        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_400, HID_QUIRK_IGNORE },
 456        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_401, HID_QUIRK_IGNORE },
 457        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_402, HID_QUIRK_IGNORE },
 458        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_403, HID_QUIRK_IGNORE },
 459        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_404, HID_QUIRK_IGNORE },
 460        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_405, HID_QUIRK_IGNORE },
 461        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_500, HID_QUIRK_IGNORE },
 462        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_501, HID_QUIRK_IGNORE },
 463        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_502, HID_QUIRK_IGNORE },
 464        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_503, HID_QUIRK_IGNORE },
 465        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_504, HID_QUIRK_IGNORE },
 466        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1000, HID_QUIRK_IGNORE },
 467        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1001, HID_QUIRK_IGNORE },
 468        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1002, HID_QUIRK_IGNORE },
 469        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1003, HID_QUIRK_IGNORE },
 470        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1004, HID_QUIRK_IGNORE },
 471        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1005, HID_QUIRK_IGNORE },
 472        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1006, HID_QUIRK_IGNORE },
 473        { USB_VENDOR_ID_IMATION, USB_DEVICE_ID_DISC_STAKKA, HID_QUIRK_IGNORE },
 474        { USB_VENDOR_ID_KBGEAR, USB_DEVICE_ID_KBGEAR_JAMSTUDIO, HID_QUIRK_IGNORE },
 475        { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY, HID_QUIRK_IGNORE },
 476        { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY, HID_QUIRK_IGNORE },
 477        { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOBILECASSY, HID_QUIRK_IGNORE },
 478        { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_JWM, HID_QUIRK_IGNORE },
 479        { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_DMMP, HID_QUIRK_IGNORE },
 480        { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIP, HID_QUIRK_IGNORE },
 481        { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_XRAY1, HID_QUIRK_IGNORE },
 482        { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_XRAY2, HID_QUIRK_IGNORE },
 483        { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_VIDEOCOM, HID_QUIRK_IGNORE },
 484        { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_COM3LAB, HID_QUIRK_IGNORE },
 485        { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_TELEPORT, HID_QUIRK_IGNORE },
 486        { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_NETWORKANALYSER, HID_QUIRK_IGNORE },
 487        { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POWERCONTROL, HID_QUIRK_IGNORE },
 488        { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MACHINETEST, HID_QUIRK_IGNORE },
 489        { USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1024LS, HID_QUIRK_IGNORE },
 490        { USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1208LS, HID_QUIRK_IGNORE },
 491        { USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS, HID_QUIRK_IGNORE },
 492        { USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS1, HID_QUIRK_IGNORE },
 493        { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100, HID_QUIRK_IGNORE },
 494        { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 20, HID_QUIRK_IGNORE },
 495        { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 30, HID_QUIRK_IGNORE },
 496        { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 100, HID_QUIRK_IGNORE },
 497        { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 108, HID_QUIRK_IGNORE },
 498        { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 118, HID_QUIRK_IGNORE },
 499        { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 200, HID_QUIRK_IGNORE },
 500        { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 300, HID_QUIRK_IGNORE },
 501        { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 400, HID_QUIRK_IGNORE },
 502        { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 500, HID_QUIRK_IGNORE },
 503        { USB_VENDOR_ID_PANJIT, 0x0001, HID_QUIRK_IGNORE },
 504        { USB_VENDOR_ID_PANJIT, 0x0002, HID_QUIRK_IGNORE },
 505        { USB_VENDOR_ID_PANJIT, 0x0003, HID_QUIRK_IGNORE },
 506        { USB_VENDOR_ID_PANJIT, 0x0004, HID_QUIRK_IGNORE },
 507        { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_LABPRO, HID_QUIRK_IGNORE },
 508        { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_GOTEMP, HID_QUIRK_IGNORE },
 509        { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_SKIP, HID_QUIRK_IGNORE },
 510        { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_CYCLOPS, HID_QUIRK_IGNORE },
 511        { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_4_PHIDGETSERVO_20, HID_QUIRK_IGNORE },
 512        { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_1_PHIDGETSERVO_20, HID_QUIRK_IGNORE },
 513        { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_8_8_4_IF_KIT, HID_QUIRK_IGNORE },
 514        { USB_VENDOR_ID_YEALINK, USB_DEVICE_ID_YEALINK_P1K_P4K_B2K, HID_QUIRK_IGNORE },
 515
 516        { USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_FLAIR, HID_QUIRK_IGNORE },
 517        { USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_302, HID_QUIRK_IGNORE },
 518
 519        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500, HID_QUIRK_LOGITECH_IGNORE_DOUBLED_WHEEL | HID_QUIRK_LOGITECH_EXPANDED_KEYMAP },
 520
 521        { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE, HID_QUIRK_MIGHTYMOUSE | HID_QUIRK_INVERT_HWHEEL },
 522
 523        { USB_VENDOR_ID_PANTHERLORD, USB_DEVICE_ID_PANTHERLORD_TWIN_USB_JOYSTICK, HID_QUIRK_MULTI_INPUT | HID_QUIRK_SKIP_OUTPUT_REPORTS },
 524        { USB_VENDOR_ID_PLAYDOTCOM, USB_DEVICE_ID_PLAYDOTCOM_EMS_USBII, HID_QUIRK_MULTI_INPUT },
 525
 526        { USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER, HID_QUIRK_SONY_PS3_CONTROLLER },
 527
 528        { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_UC100KM, HID_QUIRK_NOGET },
 529        { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_CS124U, HID_QUIRK_NOGET },
 530        { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_2PORTKVM, HID_QUIRK_NOGET },
 531        { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVM, HID_QUIRK_NOGET },
 532        { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVMC, HID_QUIRK_NOGET },
 533        { USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2700, HID_QUIRK_NOGET },
 534        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WHEEL, HID_QUIRK_NOGET },
 535        { USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE, HID_QUIRK_NOGET },
 536        { USB_VENDOR_ID_SUN, USB_DEVICE_ID_RARITAN_KVM_DONGLE, HID_QUIRK_NOGET },
 537        { USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_TURBOX_KEYBOARD, HID_QUIRK_NOGET },
 538        { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_DUAL_USB_JOYPAD, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT },
 539        { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_QUAD_USB_JOYPAD, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT },
 540
 541        { USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SMARTJOY_DUAL_PLUS, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT },
 542
 543        { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
 544        { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
 545        { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
 546        { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_POWERBOOK_ISO_KEYBOARD},
 547        { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
 548        { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
 549        { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_POWERBOOK_ISO_KEYBOARD},
 550        { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
 551        { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
 552        { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_POWERBOOK_ISO_KEYBOARD},
 553        { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
 554        { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
 555        { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
 556
 557        { USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_W7658, HID_QUIRK_RESET_LEDS },
 558        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_KBD, HID_QUIRK_RESET_LEDS },
 559        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY, HID_QUIRK_IGNORE },
 560        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_2, HID_QUIRK_IGNORE },
 561        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_3, HID_QUIRK_IGNORE },
 562        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_4, HID_QUIRK_IGNORE },
 563        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_5, HID_QUIRK_IGNORE },
 564        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_6, HID_QUIRK_IGNORE },
 565        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_7, HID_QUIRK_IGNORE },
 566        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_8, HID_QUIRK_IGNORE },
 567        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_9, HID_QUIRK_IGNORE },
 568        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_10, HID_QUIRK_IGNORE },
 569        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_11, HID_QUIRK_IGNORE },
 570        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_12, HID_QUIRK_IGNORE },
 571        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_13, HID_QUIRK_IGNORE },
 572        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_14, HID_QUIRK_IGNORE },
 573        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_15, HID_QUIRK_IGNORE },
 574        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_16, HID_QUIRK_IGNORE },
 575        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_17, HID_QUIRK_IGNORE },
 576        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_18, HID_QUIRK_IGNORE },
 577        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_19, HID_QUIRK_IGNORE },
 578        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_20, HID_QUIRK_IGNORE },
 579        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_21, HID_QUIRK_IGNORE },
 580        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_22, HID_QUIRK_IGNORE },
 581        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_23, HID_QUIRK_IGNORE },
 582        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_24, HID_QUIRK_IGNORE },
 583        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_25, HID_QUIRK_IGNORE },
 584        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_26, HID_QUIRK_IGNORE },
 585        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_27, HID_QUIRK_IGNORE },
 586        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_28, HID_QUIRK_IGNORE },
 587        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_29, HID_QUIRK_IGNORE },
 588        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_30, HID_QUIRK_IGNORE },
 589        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_31, HID_QUIRK_IGNORE },
 590        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_32, HID_QUIRK_IGNORE },
 591        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_33, HID_QUIRK_IGNORE },
 592        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_34, HID_QUIRK_IGNORE },
 593        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_35, HID_QUIRK_IGNORE },
 594        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_36, HID_QUIRK_IGNORE },
 595        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_37, HID_QUIRK_IGNORE },
 596        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_38, HID_QUIRK_IGNORE },
 597        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_39, HID_QUIRK_IGNORE },
 598        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_40, HID_QUIRK_IGNORE },
 599        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_41, HID_QUIRK_IGNORE },
 600        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_42, HID_QUIRK_IGNORE },
 601        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_43, HID_QUIRK_IGNORE },
 602        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_44, HID_QUIRK_IGNORE },
 603        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_45, HID_QUIRK_IGNORE },
 604        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_46, HID_QUIRK_IGNORE },
 605        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_47, HID_QUIRK_IGNORE },
 606        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_48, HID_QUIRK_IGNORE },
 607        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_49, HID_QUIRK_IGNORE },
 608        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_50, HID_QUIRK_IGNORE },
 609        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_51, HID_QUIRK_IGNORE },
 610        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_52, HID_QUIRK_IGNORE },
 611        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_53, HID_QUIRK_IGNORE },
 612        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_54, HID_QUIRK_IGNORE },
 613        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_55, HID_QUIRK_IGNORE },
 614        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_56, HID_QUIRK_IGNORE },
 615        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_57, HID_QUIRK_IGNORE },
 616        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_58, HID_QUIRK_IGNORE },
 617        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_59, HID_QUIRK_IGNORE },
 618        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_60, HID_QUIRK_IGNORE },
 619        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_61, HID_QUIRK_IGNORE },
 620        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_62, HID_QUIRK_IGNORE },
 621        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_63, HID_QUIRK_IGNORE },
 622        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_64, HID_QUIRK_IGNORE },
 623        { USB_VENDOR_ID_NATIONAL_SEMICONDUCTOR, USB_DEVICE_ID_N_S_HARMONY, HID_QUIRK_IGNORE },
 624
 625        { 0, 0 }
 626};
 627
 628/* Quirks for devices which require report descriptor fixup go here */
 629static const struct hid_rdesc_blacklist {
 630        __u16 idVendor;
 631        __u16 idProduct;
 632        __u32 quirks;
 633} hid_rdesc_blacklist[] = {
 634
 635        { USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION, HID_QUIRK_RDESC_CYMOTION },
 636
 637        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER, HID_QUIRK_RDESC_LOGITECH },
 638        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER, HID_QUIRK_RDESC_LOGITECH },
 639        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER_2, HID_QUIRK_RDESC_LOGITECH },
 640
 641        { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS, HID_QUIRK_RDESC_MACBOOK_JIS },
 642
 643        { USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE, HID_QUIRK_RDESC_PETALYNX },
 644
 645        { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_1, HID_QUIRK_RDESC_SWAPPED_MIN_MAX },
 646        { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_2, HID_QUIRK_RDESC_SWAPPED_MIN_MAX },
 647
 648        { 0, 0 }
 649};
 650
 651/* Dynamic HID quirks list - specified at runtime */
 652struct quirks_list_struct {
 653        struct hid_blacklist hid_bl_item;
 654        struct list_head node;
 655};
 656
 657static LIST_HEAD(dquirks_list);
 658static DECLARE_RWSEM(dquirks_rwsem);
 659
 660/* Runtime ("dynamic") quirks manipulation functions */
 661
 662/**
 663 * usbhid_exists_dquirk: find any dynamic quirks for a USB HID device
 664 * @idVendor: the 16-bit USB vendor ID, in native byteorder
 665 * @idProduct: the 16-bit USB product ID, in native byteorder
 666 *
 667 * Description:
 668 *         Scans dquirks_list for a matching dynamic quirk and returns
 669 *         the pointer to the relevant struct hid_blacklist if found.
 670 *         Must be called with a read lock held on dquirks_rwsem.
 671 *
 672 * Returns: NULL if no quirk found, struct hid_blacklist * if found.
 673 */
 674static struct hid_blacklist *usbhid_exists_dquirk(const u16 idVendor,
 675                const u16 idProduct)
 676{
 677        struct quirks_list_struct *q;
 678        struct hid_blacklist *bl_entry = NULL;
 679
 680        list_for_each_entry(q, &dquirks_list, node) {
 681                if (q->hid_bl_item.idVendor == idVendor &&
 682                                q->hid_bl_item.idProduct == idProduct) {
 683                        bl_entry = &q->hid_bl_item;
 684                        break;
 685                }
 686        }
 687
 688        if (bl_entry != NULL)
 689                dbg_hid("Found dynamic quirk 0x%x for USB HID vendor 0x%hx prod 0x%hx\n",
 690                                bl_entry->quirks, bl_entry->idVendor,
 691                                bl_entry->idProduct);
 692
 693        return bl_entry;
 694}
 695
 696
 697/**
 698 * usbhid_modify_dquirk: add/replace a HID quirk
 699 * @idVendor: the 16-bit USB vendor ID, in native byteorder
 700 * @idProduct: the 16-bit USB product ID, in native byteorder
 701 * @quirks: the u32 quirks value to add/replace
 702 *
 703 * Description:
 704 *         If an dynamic quirk exists in memory for this (idVendor,
 705 *         idProduct) pair, replace its quirks value with what was
 706 *         provided.  Otherwise, add the quirk to the dynamic quirks list.
 707 *
 708 * Returns: 0 OK, -error on failure.
 709 */
 710int usbhid_modify_dquirk(const u16 idVendor, const u16 idProduct,
 711                const u32 quirks)
 712{
 713        struct quirks_list_struct *q_new, *q;
 714        int list_edited = 0;
 715
 716        if (!idVendor) {
 717                dbg_hid("Cannot add a quirk with idVendor = 0\n");
 718                return -EINVAL;
 719        }
 720
 721        q_new = kmalloc(sizeof(struct quirks_list_struct), GFP_KERNEL);
 722        if (!q_new) {
 723                dbg_hid("Could not allocate quirks_list_struct\n");
 724                return -ENOMEM;
 725        }
 726
 727        q_new->hid_bl_item.idVendor = idVendor;
 728        q_new->hid_bl_item.idProduct = idProduct;
 729        q_new->hid_bl_item.quirks = quirks;
 730
 731        down_write(&dquirks_rwsem);
 732
 733        list_for_each_entry(q, &dquirks_list, node) {
 734
 735                if (q->hid_bl_item.idVendor == idVendor &&
 736                                q->hid_bl_item.idProduct == idProduct) {
 737
 738                        list_replace(&q->node, &q_new->node);
 739                        kfree(q);
 740                        list_edited = 1;
 741                        break;
 742
 743                }
 744
 745        }
 746
 747        if (!list_edited)
 748                list_add_tail(&q_new->node, &dquirks_list);
 749
 750        up_write(&dquirks_rwsem);
 751
 752        return 0;
 753}
 754
 755/**
 756 * usbhid_remove_all_dquirks: remove all runtime HID quirks from memory
 757 *
 758 * Description:
 759 *         Free all memory associated with dynamic quirks - called before
 760 *         module unload.
 761 *
 762 */
 763static void usbhid_remove_all_dquirks(void)
 764{
 765        struct quirks_list_struct *q, *temp;
 766
 767        down_write(&dquirks_rwsem);
 768        list_for_each_entry_safe(q, temp, &dquirks_list, node) {
 769                list_del(&q->node);
 770                kfree(q);
 771        }
 772        up_write(&dquirks_rwsem);
 773
 774}
 775
 776/** 
 777 * usbhid_quirks_init: apply USB HID quirks specified at module load time
 778 */
 779int usbhid_quirks_init(char **quirks_param)
 780{
 781        u16 idVendor, idProduct;
 782        u32 quirks;
 783        int n = 0, m;
 784
 785        for (; quirks_param[n] && n < MAX_USBHID_BOOT_QUIRKS; n++) {
 786
 787                m = sscanf(quirks_param[n], "0x%hx:0x%hx:0x%x",
 788                                &idVendor, &idProduct, &quirks);
 789
 790                if (m != 3 ||
 791                                usbhid_modify_dquirk(idVendor, idProduct, quirks) != 0) {
 792                        printk(KERN_WARNING
 793                                        "Could not parse HID quirk module param %s\n",
 794                                        quirks_param[n]);
 795                }
 796        }
 797
 798        return 0;
 799}
 800
 801/**
 802 * usbhid_quirks_exit: release memory associated with dynamic_quirks
 803 *
 804 * Description:
 805 *     Release all memory associated with dynamic quirks.  Called upon
 806 *     module unload.
 807 *
 808 * Returns: nothing
 809 */
 810void usbhid_quirks_exit(void)
 811{
 812        usbhid_remove_all_dquirks();
 813}
 814
 815/**
 816 * usbhid_exists_squirk: return any static quirks for a USB HID device
 817 * @idVendor: the 16-bit USB vendor ID, in native byteorder
 818 * @idProduct: the 16-bit USB product ID, in native byteorder
 819 *
 820 * Description:
 821 *     Given a USB vendor ID and product ID, return a pointer to
 822 *     the hid_blacklist entry associated with that device.
 823 *
 824 * Returns: pointer if quirk found, or NULL if no quirks found.
 825 */
 826static const struct hid_blacklist *usbhid_exists_squirk(const u16 idVendor,
 827                const u16 idProduct)
 828{
 829        const struct hid_blacklist *bl_entry = NULL;
 830        int n = 0;
 831
 832        for (; hid_blacklist[n].idVendor; n++)
 833                if (hid_blacklist[n].idVendor == idVendor &&
 834                                hid_blacklist[n].idProduct == idProduct)
 835                        bl_entry = &hid_blacklist[n];
 836
 837        if (bl_entry != NULL)
 838                dbg_hid("Found squirk 0x%x for USB HID vendor 0x%hx prod 0x%hx\n",
 839                                bl_entry->quirks, bl_entry->idVendor, 
 840                                bl_entry->idProduct);
 841        return bl_entry;
 842}
 843
 844/**
 845 * usbhid_lookup_quirk: return any quirks associated with a USB HID device
 846 * @idVendor: the 16-bit USB vendor ID, in native byteorder
 847 * @idProduct: the 16-bit USB product ID, in native byteorder
 848 *
 849 * Description:
 850 *     Given a USB vendor ID and product ID, return any quirks associated
 851 *     with that device.
 852 *
 853 * Returns: a u32 quirks value.
 854 */
 855u32 usbhid_lookup_quirk(const u16 idVendor, const u16 idProduct)
 856{
 857        u32 quirks = 0;
 858        const struct hid_blacklist *bl_entry = NULL;
 859
 860        /* Ignore all Wacom devices */
 861        if (idVendor == USB_VENDOR_ID_WACOM)
 862                return HID_QUIRK_IGNORE;
 863
 864        /* ignore all Code Mercenaries IOWarrior devices */
 865        if (idVendor == USB_VENDOR_ID_CODEMERCS)
 866                if (idProduct >= USB_DEVICE_ID_CODEMERCS_IOW_FIRST &&
 867                                idProduct <= USB_DEVICE_ID_CODEMERCS_IOW_LAST)
 868                        return HID_QUIRK_IGNORE;
 869
 870        /* NCR devices must not be queried for reports */
 871        if (idVendor == USB_VENDOR_ID_NCR &&
 872                        idProduct >= USB_DEVICE_ID_NCR_FIRST &&
 873                        idProduct <= USB_DEVICE_ID_NCR_LAST)
 874                        return HID_QUIRK_NOGET;
 875
 876        down_read(&dquirks_rwsem);
 877        bl_entry = usbhid_exists_dquirk(idVendor, idProduct);
 878        if (!bl_entry)
 879                bl_entry = usbhid_exists_squirk(idVendor, idProduct);
 880        if (bl_entry)
 881                quirks = bl_entry->quirks;
 882        up_read(&dquirks_rwsem);
 883
 884        return quirks;
 885}
 886
 887/*
 888 * Cherry Cymotion keyboard have an invalid HID report descriptor,
 889 * that needs fixing before we can parse it.
 890 */
 891static void usbhid_fixup_cymotion_descriptor(char *rdesc, int rsize)
 892{
 893        if (rsize >= 17 && rdesc[11] == 0x3c && rdesc[12] == 0x02) {
 894                printk(KERN_INFO "Fixing up Cherry Cymotion report descriptor\n");
 895                rdesc[11] = rdesc[16] = 0xff;
 896                rdesc[12] = rdesc[17] = 0x03;
 897        }
 898}
 899
 900
 901/*
 902 * Certain Logitech keyboards send in report #3 keys which are far
 903 * above the logical maximum described in descriptor. This extends
 904 * the original value of 0x28c of logical maximum to 0x104d
 905 */
 906static void usbhid_fixup_logitech_descriptor(unsigned char *rdesc, int rsize)
 907{
 908        if (rsize >= 90 && rdesc[83] == 0x26
 909                        && rdesc[84] == 0x8c
 910                        && rdesc[85] == 0x02) {
 911                printk(KERN_INFO "Fixing up Logitech keyboard report descriptor\n");
 912                rdesc[84] = rdesc[89] = 0x4d;
 913                rdesc[85] = rdesc[90] = 0x10;
 914        }
 915}
 916
 917/* Petalynx Maxter Remote has maximum for consumer page set too low */
 918static void usbhid_fixup_petalynx_descriptor(unsigned char *rdesc, int rsize)
 919{
 920        if (rsize >= 60 && rdesc[39] == 0x2a
 921                        && rdesc[40] == 0xf5
 922                        && rdesc[41] == 0x00
 923                        && rdesc[59] == 0x26
 924                        && rdesc[60] == 0xf9
 925                        && rdesc[61] == 0x00) {
 926                printk(KERN_INFO "Fixing up Petalynx Maxter Remote report descriptor\n");
 927                rdesc[60] = 0xfa;
 928                rdesc[40] = 0xfa;
 929        }
 930}
 931
 932/*
 933 * Some USB barcode readers from cypress have usage min and usage max in
 934 * the wrong order
 935 */
 936static void usbhid_fixup_cypress_descriptor(unsigned char *rdesc, int rsize)
 937{
 938        short fixed = 0;
 939        int i;
 940
 941        for (i = 0; i < rsize - 4; i++) {
 942                if (rdesc[i] == 0x29 && rdesc [i+2] == 0x19) {
 943                        unsigned char tmp;
 944
 945                        rdesc[i] = 0x19; rdesc[i+2] = 0x29;
 946                        tmp = rdesc[i+3];
 947                        rdesc[i+3] = rdesc[i+1];
 948                        rdesc[i+1] = tmp;
 949                }
 950        }
 951
 952        if (fixed)
 953                printk(KERN_INFO "Fixing up Cypress report descriptor\n");
 954}
 955
 956/*
 957 * MacBook JIS keyboard has wrong logical maximum
 958 */
 959static void usbhid_fixup_macbook_descriptor(unsigned char *rdesc, int rsize)
 960{
 961        if (rsize >= 60 && rdesc[53] == 0x65
 962                        && rdesc[59] == 0x65) {
 963                printk(KERN_INFO "Fixing up MacBook JIS keyboard report descriptor\n");
 964                rdesc[53] = rdesc[59] = 0xe7;
 965        }
 966}
 967
 968
 969static void __usbhid_fixup_report_descriptor(__u32 quirks, char *rdesc, unsigned rsize)
 970{
 971        if ((quirks & HID_QUIRK_RDESC_CYMOTION))
 972                usbhid_fixup_cymotion_descriptor(rdesc, rsize);
 973
 974        if (quirks & HID_QUIRK_RDESC_LOGITECH)
 975                usbhid_fixup_logitech_descriptor(rdesc, rsize);
 976
 977        if (quirks & HID_QUIRK_RDESC_SWAPPED_MIN_MAX)
 978                usbhid_fixup_cypress_descriptor(rdesc, rsize);
 979
 980        if (quirks & HID_QUIRK_RDESC_PETALYNX)
 981                usbhid_fixup_petalynx_descriptor(rdesc, rsize);
 982
 983        if (quirks & HID_QUIRK_RDESC_MACBOOK_JIS)
 984                usbhid_fixup_macbook_descriptor(rdesc, rsize);
 985}
 986
 987/**
 988 * usbhid_fixup_report_descriptor: check if report descriptor needs fixup
 989 *
 990 * Description:
 991 *      Walks the hid_rdesc_blacklist[] array and checks whether the device
 992 *      is known to have broken report descriptor that needs to be fixed up
 993 *      prior to entering the HID parser
 994 *
 995 * Returns: nothing
 996 */
 997void usbhid_fixup_report_descriptor(const u16 idVendor, const u16 idProduct,
 998                                    char *rdesc, unsigned rsize, char **quirks_param)
 999{
1000        int n, m;
1001        u16 paramVendor, paramProduct;
1002        u32 quirks;
1003
1004        /* static rdesc quirk entries */
1005        for (n = 0; hid_rdesc_blacklist[n].idVendor; n++)
1006                if (hid_rdesc_blacklist[n].idVendor == idVendor &&
1007                                hid_rdesc_blacklist[n].idProduct == idProduct)
1008                        __usbhid_fixup_report_descriptor(hid_rdesc_blacklist[n].quirks,
1009                                        rdesc, rsize);
1010
1011        /* runtime rdesc quirk entries handling */
1012        for (n = 0; quirks_param[n] && n < MAX_USBHID_BOOT_QUIRKS; n++) {
1013                m = sscanf(quirks_param[n], "0x%hx:0x%hx:0x%x",
1014                                &paramVendor, &paramProduct, &quirks);
1015
1016                if (m != 3)
1017                        printk(KERN_WARNING
1018                                "Could not parse HID quirk module param %s\n",
1019                                quirks_param[n]);
1020                else if (paramVendor == idVendor && paramProduct == idProduct)
1021                        __usbhid_fixup_report_descriptor(quirks, rdesc, rsize);
1022        }
1023
1024}
1025
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.