]> Pileus Git - ~andy/linux/commitdiff
HID: kye: Add report fixup for Genius Gila Gaming mouse
authorBenjamin Tissoires <benjamin.tissoires@redhat.com>
Tue, 2 Jul 2013 16:10:09 +0000 (18:10 +0200)
committerJiri Kosina <jkosina@suse.cz>
Wed, 3 Jul 2013 16:14:33 +0000 (18:14 +0200)
Genius Gila Gaming Mouse presents an obviously wrong report descriptor.
the Consumer control (report ID 3) is the following:
0x05, 0x0c,                    // Usage Page (Consumer Devices)       105
0x09, 0x01,                    // Usage (Consumer Control)            107
0xa1, 0x01,                    // Collection (Application)            109
0x85, 0x03,                    //   Report ID (3)                     111
0x19, 0x00,                    //   Usage Minimum (0)                 113
0x2a, 0xff, 0x7f,              //   Usage Maximum (32767)             115
0x15, 0x00,                    //   Logical Minimum (0)               118
0x26, 0xff, 0x7f,              //   Logical Maximum (32767)           120
0x75, 0x10,                    //   Report Size (16)                  123
0x95, 0x03,                    //   Report Count (3)                  125
0x81, 0x00,                    //   Input (Data,Arr,Abs)              127
0x75, 0x08,                    //   Report Size (8)                   129
0x95, 0x01,                    //   Report Count (1)                  131
0x81, 0x01,                    //   Input (Cnst,Arr,Abs)              133
0xc0,                          // End Collection                      135

So the first input whithin this report has a count of 3 but a usage range
of 32768. So this value is obviously wrong as it should not be greater than
the report count.

Fixes:
https://bugzilla.redhat.com/show_bug.cgi?id=959721

Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/hid-core.c
drivers/hid/hid-ids.h
drivers/hid/hid-kye.c

index 8f616bd81eee50d05867556724baeb8ed8c3067a..27aa7c76b93d6575c6801041c5be400758019a61 100644 (file)
@@ -1589,6 +1589,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ION, USB_DEVICE_ID_ICADE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_KENSINGTON, USB_DEVICE_ID_KS_SLIMBLADE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_KEYTOUCH, USB_DEVICE_ID_KEYTOUCH_IEC) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_ERGO_525V) },
        { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_I405X) },
        { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X) },
index 3da75dd4c3236385158005df015c96cab6687aba..b2b692ea34572515b3944d439747c1d3be4ef786 100644 (file)
 
 #define USB_VENDOR_ID_KYE              0x0458
 #define USB_DEVICE_ID_KYE_ERGO_525V    0x0087
+#define USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE 0x0138
 #define USB_DEVICE_ID_KYE_GPEN_560     0x5003
 #define USB_DEVICE_ID_KYE_EASYPEN_I405X        0x5010
 #define USB_DEVICE_ID_KYE_MOUSEPEN_I608X       0x5011
index 6af90dbdc3d45e1295db182588c6a8bbae2978ca..1e2ee2aa84a023fc5e4412c7fe8c04666a3e6a8e 100644 (file)
@@ -314,6 +314,25 @@ static __u8 *kye_report_fixup(struct hid_device *hdev, __u8 *rdesc,
                        *rsize = sizeof(easypen_m610x_rdesc_fixed);
                }
                break;
+       case USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE:
+               /*
+                * the fixup that need to be done:
+                *   - change Usage Maximum in the Comsumer Control
+                *     (report ID 3) to a reasonable value
+                */
+               if (*rsize >= 135 &&
+                       /* Usage Page (Consumer Devices) */
+                       rdesc[104] == 0x05 && rdesc[105] == 0x0c &&
+                       /* Usage (Consumer Control) */
+                       rdesc[106] == 0x09 && rdesc[107] == 0x01 &&
+                       /*   Usage Maximum > 12287 */
+                       rdesc[114] == 0x2a && rdesc[116] > 0x2f) {
+                       hid_info(hdev,
+                                "fixing up Genius Gila Gaming Mouse "
+                                "report descriptor\n");
+                       rdesc[116] = 0x2f;
+               }
+               break;
        }
        return rdesc;
 }
@@ -407,6 +426,8 @@ static const struct hid_device_id kye_devices[] = {
                                USB_DEVICE_ID_KYE_MOUSEPEN_I608X) },
        { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
                                USB_DEVICE_ID_KYE_EASYPEN_M610X) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
+                               USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) },
        { }
 };
 MODULE_DEVICE_TABLE(hid, kye_devices);