b9f0d98
From 3685c18e17f12438d0a83331c1b6a5b00fade7a1 Mon Sep 17 00:00:00 2001
b9f0d98
From: Benjamin Tissoires <benjamin.tissoires@redhat.com>
b9f0d98
Date: Tue, 02 Jul 2013 16:10:09 +0000
b9f0d98
Subject: HID: kye: Add report fixup for Genius Gila Gaming mouse
b9f0d98
b9f0d98
Genius Gila Gaming Mouse presents an obviously wrong report descriptor.
b9f0d98
the Consumer control (report ID 3) is the following:
b9f0d98
0x05, 0x0c,                    // Usage Page (Consumer Devices)       105
b9f0d98
0x09, 0x01,                    // Usage (Consumer Control)            107
b9f0d98
0xa1, 0x01,                    // Collection (Application)            109
b9f0d98
0x85, 0x03,                    //   Report ID (3)                     111
b9f0d98
0x19, 0x00,                    //   Usage Minimum (0)                 113
b9f0d98
0x2a, 0xff, 0x7f,              //   Usage Maximum (32767)             115
b9f0d98
0x15, 0x00,                    //   Logical Minimum (0)               118
b9f0d98
0x26, 0xff, 0x7f,              //   Logical Maximum (32767)           120
b9f0d98
0x75, 0x10,                    //   Report Size (16)                  123
b9f0d98
0x95, 0x03,                    //   Report Count (3)                  125
b9f0d98
0x81, 0x00,                    //   Input (Data,Arr,Abs)              127
b9f0d98
0x75, 0x08,                    //   Report Size (8)                   129
b9f0d98
0x95, 0x01,                    //   Report Count (1)                  131
b9f0d98
0x81, 0x01,                    //   Input (Cnst,Arr,Abs)              133
b9f0d98
0xc0,                          // End Collection                      135
b9f0d98
b9f0d98
So the first input whithin this report has a count of 3 but a usage range
b9f0d98
of 32768. So this value is obviously wrong as it should not be greater than
b9f0d98
the report count.
b9f0d98
b9f0d98
Fixes:
b9f0d98
https://bugzilla.redhat.com/show_bug.cgi?id=959721
b9f0d98
b9f0d98
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
b9f0d98
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
b9f0d98
---
b9f0d98
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
b9f0d98
index 8f616bd..27aa7c7 100644
b9f0d98
--- a/drivers/hid/hid-core.c
b9f0d98
+++ b/drivers/hid/hid-core.c
b9f0d98
@@ -1589,6 +1589,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
b9f0d98
 	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ION, USB_DEVICE_ID_ICADE) },
b9f0d98
 	{ HID_USB_DEVICE(USB_VENDOR_ID_KENSINGTON, USB_DEVICE_ID_KS_SLIMBLADE) },
b9f0d98
 	{ HID_USB_DEVICE(USB_VENDOR_ID_KEYTOUCH, USB_DEVICE_ID_KEYTOUCH_IEC) },
b9f0d98
+	{ HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) },
b9f0d98
 	{ HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_ERGO_525V) },
b9f0d98
 	{ HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_I405X) },
b9f0d98
 	{ HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X) },
b9f0d98
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
b9f0d98
index 3da75dd..b2b692e 100644
b9f0d98
--- a/drivers/hid/hid-ids.h
b9f0d98
+++ b/drivers/hid/hid-ids.h
b9f0d98
@@ -474,6 +474,7 @@
b9f0d98
 
b9f0d98
 #define USB_VENDOR_ID_KYE		0x0458
b9f0d98
 #define USB_DEVICE_ID_KYE_ERGO_525V	0x0087
b9f0d98
+#define USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE	0x0138
b9f0d98
 #define USB_DEVICE_ID_KYE_GPEN_560	0x5003
b9f0d98
 #define USB_DEVICE_ID_KYE_EASYPEN_I405X	0x5010
b9f0d98
 #define USB_DEVICE_ID_KYE_MOUSEPEN_I608X	0x5011
b9f0d98
diff --git a/drivers/hid/hid-kye.c b/drivers/hid/hid-kye.c
b9f0d98
index 6af90db..1e2ee2aa 100644
b9f0d98
--- a/drivers/hid/hid-kye.c
b9f0d98
+++ b/drivers/hid/hid-kye.c
b9f0d98
@@ -314,6 +314,25 @@ static __u8 *kye_report_fixup(struct hid_device *hdev, __u8 *rdesc,
b9f0d98
 			*rsize = sizeof(easypen_m610x_rdesc_fixed);
b9f0d98
 		}
b9f0d98
 		break;
b9f0d98
+	case USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE:
b9f0d98
+		/*
b9f0d98
+		 * the fixup that need to be done:
b9f0d98
+		 *   - change Usage Maximum in the Comsumer Control
b9f0d98
+		 *     (report ID 3) to a reasonable value
b9f0d98
+		 */
b9f0d98
+		if (*rsize >= 135 &&
b9f0d98
+			/* Usage Page (Consumer Devices) */
b9f0d98
+			rdesc[104] == 0x05 && rdesc[105] == 0x0c &&
b9f0d98
+			/* Usage (Consumer Control) */
b9f0d98
+			rdesc[106] == 0x09 && rdesc[107] == 0x01 &&
b9f0d98
+			/*   Usage Maximum > 12287 */
b9f0d98
+			rdesc[114] == 0x2a && rdesc[116] > 0x2f) {
b9f0d98
+			hid_info(hdev,
b9f0d98
+				 "fixing up Genius Gila Gaming Mouse "
b9f0d98
+				 "report descriptor\n");
b9f0d98
+			rdesc[116] = 0x2f;
b9f0d98
+		}
b9f0d98
+		break;
b9f0d98
 	}
b9f0d98
 	return rdesc;
b9f0d98
 }
b9f0d98
@@ -407,6 +426,8 @@ static const struct hid_device_id kye_devices[] = {
b9f0d98
 				USB_DEVICE_ID_KYE_MOUSEPEN_I608X) },
b9f0d98
 	{ HID_USB_DEVICE(USB_VENDOR_ID_KYE,
b9f0d98
 				USB_DEVICE_ID_KYE_EASYPEN_M610X) },
b9f0d98
+	{ HID_USB_DEVICE(USB_VENDOR_ID_KYE,
b9f0d98
+				USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) },
b9f0d98
 	{ }
b9f0d98
 };
b9f0d98
 MODULE_DEVICE_TABLE(hid, kye_devices);
b9f0d98
--
b9f0d98
cgit v0.9.2