diff options
author | Stéphane Chatty <chatty@lii-enac.fr> | 2009-08-05 13:37:32 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-08-17 15:28:42 -0700 |
commit | ec21ee093c3833b3d304f54432533fa8de1fe0a5 (patch) | |
tree | d1c7e7ac35b2c8cf49eed1e178498964f4fc3eae | |
parent | d23d594d919018bba506b53e75af37cf6bcbbb19 (diff) | |
download | usbutils-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.c | 12 |
1 files changed, 10 insertions, 2 deletions
@@ -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, |