Review note (patch commit message starts below ---):
I am currently setting HID_QUIRK_NO_INIT_REPORTS for these devices
(which works), however this seems to largely to be the same as
HID_QUIRK_NOGET that is otherwise automatically set on all boot-class
interfaces, just the submission is skipped further down the code path.

I do not understand the implications of using one versus the other and
would love clarification from someone more knowledgable - it seems they
are both commonly used for these HID quirks.

I wonder if other platforms skip reports on all interfaces of a device
whose first interface is a boot class device? This quirk seems to be
getting more common with 'fancy' custom controllers.

Example of the relevant dmesg errors I am working around:
[   12.041388] hid-generic 0003:1B1C:1B11.0003: usb_submit_urb(ctrl) failed: -1
[   12.041445] hid-generic 0003:1B1C:1B11.0003: timeout initializing reports
[   12.043245] input: Corsair Corsair K95 RGB Gaming Keyboard  as 
/devices/pci0000:00/0000:00:14.0/usb1/1-9/1-9.1/1-9.1:1.1/0003:1B1C:1B11.0003/input/input6
[   12.095412] hid-generic 0003:1B1C:1B11.0003: input,hidraw2: USB HID v1.11 
Keyboard [Corsair Corsair K95 RGB Gaming Keyboard ] on 
usb-0000:00:14.0-9.1/input1
[   22.100992] hid-generic 0003:1B1C:1B11.0004: timeout initializing reports
[   22.102080] hid-generic 0003:1B1C:1B11.0004: hiddev0,hidraw3: USB HID v1.11 
Device [Corsair Corsair K95 RGB Gaming Keyboard ] on usb-0000:00:14.0-9.1/input2
[   32.106963] hid-generic 0003:1B1C:1B11.0005: usb_submit_urb(ctrl) failed: -1
[   32.107020] hid-generic 0003:1B1C:1B11.0005: timeout initializing reports
[   32.108630] hid-generic 0003:1B1C:1B11.0005: hiddev0,hidraw4: USB HID v1.11 
Device [Corsair Corsair K95 RGB Gaming Keyboard ] on usb-0000:00:14.0-9.1/input3

---
These devices feature multiple interfaces/endpoints: a legacy BIOS/boot 
interface (endpoint 0x81), as well as 2 corsair-specific keyboard interfaces 
(endpoint 0x82, 0x83 IN/0x03 OUT) and an RGB LED control interface (endpoint 
0x84 IN/0x04 OUT)

Because the extra 3 interfaces are not of subclass USB_INTERFACE_SUBCLASS_BOOT, 
HID_QUIRK_NOGET is not automatically set on them and a 10s timeout per-endpoint 
(30s per device) occurs initialising reports on boot.  We configure 
HID_QUIRK_NO_INIT_REPORTS for these devices.

Additionally the left-side G1-G18 macro keys on the K95RGB generate output on 
the un-opened 0x82/0x83 endpoints which causes the keyboard to stop responding 
waiting for this event to be collected.  We enable HID_QUIRK_ALWAYS_POLL to 
prevent this situation from occurring.

Signed-off-by: Trent Lloyd <[email protected]>
---
 drivers/hid/hid-ids.h           | 7 +++++++
 drivers/hid/usbhid/hid-quirks.c | 5 +++++
 2 files changed, 12 insertions(+)

diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index b04b082..ed54462 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -243,6 +243,13 @@
 #define USB_DEVICE_ID_CODEMERCS_IOW_FIRST      0x1500
 #define USB_DEVICE_ID_CODEMERCS_IOW_LAST       0x15ff
 
+#define USB_VENDOR_ID_CORSAIR           0x1b1c
+#define USB_DEVICE_ID_CORSAIR_K70R      0x1b09
+#define USB_DEVICE_ID_CORSAIR_K95RGB    0x1b11
+#define USB_DEVICE_ID_CORSAIR_M65RGB    0x1b12
+#define USB_DEVICE_ID_CORSAIR_K70RGB    0x1b13
+#define USB_DEVICE_ID_CORSAIR_K65RGB    0x1b17
+
 #define USB_VENDOR_ID_CREATIVELABS     0x041e
 #define USB_DEVICE_ID_PRODIKEYS_PCMIDI 0x2801
 
diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c
index 53e7de7..be00ea1 100644
--- a/drivers/hid/usbhid/hid-quirks.c
+++ b/drivers/hid/usbhid/hid-quirks.c
@@ -70,6 +70,11 @@ static const struct hid_blacklist {
        { USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_3AXIS_5BUTTON_STICK, 
HID_QUIRK_NOGET },
        { USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_AXIS_295, HID_QUIRK_NOGET },
        { USB_VENDOR_ID_CHICONY, 
USB_DEVICE_ID_CHICONY_PIXART_USB_OPTICAL_MOUSE, HID_QUIRK_ALWAYS_POLL },
+       { USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_K70R, 
HID_QUIRK_NO_INIT_REPORTS },
+       { USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_M65RGB, 
HID_QUIRK_NO_INIT_REPORTS },
+       { USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_K95RGB, 
HID_QUIRK_NO_INIT_REPORTS | HID_QUIRK_ALWAYS_POLL },
+       { USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_K70RGB, 
HID_QUIRK_NO_INIT_REPORTS },
+       { USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_K65RGB, 
HID_QUIRK_NO_INIT_REPORTS },
        { USB_VENDOR_ID_DMI, USB_DEVICE_ID_DMI_ENC, HID_QUIRK_NOGET },
        { USB_VENDOR_ID_ELAN, USB_DEVICE_ID_ELAN_TOUCHSCREEN, 
HID_QUIRK_ALWAYS_POLL },
        { USB_VENDOR_ID_ELAN, USB_DEVICE_ID_ELAN_TOUCHSCREEN_009B, 
HID_QUIRK_ALWAYS_POLL },
-- 
2.4.3
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to