aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hid
diff options
context:
space:
mode:
authorJiri Kosina <jkosina@suse.cz>2009-11-05 08:08:03 -0500
committerJiri Kosina <jkosina@suse.cz>2009-11-05 08:08:03 -0500
commit5b915d9e6dc3d22fedde91dfef1cb1a8fa9a1870 (patch)
tree9fbb2a7cdef4b0c760affdf5425adcdc43f9e428 /drivers/hid
parent73cdcf567aaa4b348a1150c85ac5917c32f3c7f9 (diff)
HID: fixup quirk for NCR devices
NCR devices are terminally broken by design -- they claim themselves to contain proper input applications in their HID report descriptor, but behave very badly if treated in standard way. According to NCR developers, the devices get confused when queried for reports in a standard way, rendering them unusable. NCR is shipping application called "RPSL" that can be used to drive these devices through hiddev, under the assumption that in-kernel driver doesn't perform initial report query. If it does, neither in-kernel nor hiddev-based driver can operate with these devices any more. Introduce a quirk that skips the report query for all NCR devices. The previous NOGET quirk was wrong and had been introduced because I misunderstood the nature of brokenness of these devices. Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers/hid')
-rw-r--r--drivers/hid/usbhid/hid-core.c3
-rw-r--r--drivers/hid/usbhid/hid-quirks.c2
2 files changed, 3 insertions, 2 deletions
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
index 3f56e9c02e65..0258289f3b3e 100644
--- a/drivers/hid/usbhid/hid-core.c
+++ b/drivers/hid/usbhid/hid-core.c
@@ -996,7 +996,8 @@ static int usbhid_start(struct hid_device *hid)
996 usbhid->urbctrl->transfer_dma = usbhid->ctrlbuf_dma; 996 usbhid->urbctrl->transfer_dma = usbhid->ctrlbuf_dma;
997 usbhid->urbctrl->transfer_flags |= (URB_NO_TRANSFER_DMA_MAP | URB_NO_SETUP_DMA_MAP); 997 usbhid->urbctrl->transfer_flags |= (URB_NO_TRANSFER_DMA_MAP | URB_NO_SETUP_DMA_MAP);
998 998
999 usbhid_init_reports(hid); 999 if (!(hid->quirks & HID_QUIRK_NO_INIT_REPORTS))
1000 usbhid_init_reports(hid);
1000 1001
1001 set_bit(HID_STARTED, &usbhid->iofl); 1002 set_bit(HID_STARTED, &usbhid->iofl);
1002 1003
diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c
index 2d445b270215..c3b02f59792b 100644
--- a/drivers/hid/usbhid/hid-quirks.c
+++ b/drivers/hid/usbhid/hid-quirks.c
@@ -281,7 +281,7 @@ u32 usbhid_lookup_quirk(const u16 idVendor, const u16 idProduct)
281 if (idVendor == USB_VENDOR_ID_NCR && 281 if (idVendor == USB_VENDOR_ID_NCR &&
282 idProduct >= USB_DEVICE_ID_NCR_FIRST && 282 idProduct >= USB_DEVICE_ID_NCR_FIRST &&
283 idProduct <= USB_DEVICE_ID_NCR_LAST) 283 idProduct <= USB_DEVICE_ID_NCR_LAST)
284 return HID_QUIRK_NOGET; 284 return HID_QUIRK_NO_INIT_REPORTS;
285 285
286 down_read(&dquirks_rwsem); 286 down_read(&dquirks_rwsem);
287 bl_entry = usbhid_exists_dquirk(idVendor, idProduct); 287 bl_entry = usbhid_exists_dquirk(idVendor, idProduct);