summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStéphane Chatty <chatty@lii-enac.fr>2009-08-05 13:37:32 +0200
committerGreg Kroah-Hartman <gregkh@suse.de>2009-08-17 15:28:42 -0700
commitec21ee093c3833b3d304f54432533fa8de1fe0a5 (patch)
treed1c7e7ac35b2c8cf49eed1e178498964f4fc3eae
parentd23d594d919018bba506b53e75af37cf6bcbbb19 (diff)
downloadusbutils-ec21ee093c3833b3d304f54432533fa8de1fe0a5.tar.gz
make HID devices a bit more robust
here is a new patch for lsusb. With some devices, the first attempt to get the HID report descriptors returns incomplete data. The HID code in the kernel deals with this by retrying up to 4 times. I did the same in lsusb. Added retries in report descriptor retrieval Signed-off-by: Stephane Chatty <chatty@enac.fr> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--lsusb.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/lsusb.c b/lsusb.c
index a733f5f..f6e2f06 100644
--- a/lsusb.c
+++ b/lsusb.c
@@ -2247,15 +2247,23 @@ static void dump_hid_device(struct usb_dev_handle *dev, struct usb_interface_des
continue;
}
if (usb_claim_interface(dev, interface->bInterfaceNumber) == 0) {
- if ((n = usb_control_msg(dev,
+ int retries = 4;
+ n = 0;
+ while (n < len && retries--)
+ n = usb_control_msg(dev,
USB_ENDPOINT_IN | USB_TYPE_STANDARD
| USB_RECIP_INTERFACE,
USB_REQ_GET_DESCRIPTOR,
(USB_DT_REPORT << 8),
interface->bInterfaceNumber,
dbuf, len,
- CTRL_TIMEOUT)) > 0)
+ CTRL_TIMEOUT);
+
+ if (n > 0) {
+ if (n < len)
+ printf(" Warning: incomplete report descriptor\n");
dump_report_desc(dbuf, n);
+ }
usb_release_interface(dev, interface->bInterfaceNumber);
} else {
/* recent Linuxes require claim() for RECIP_INTERFACE,