summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Drake <dan@reactivated.net>2010-04-20 20:14:09 -0300
committerPete Batard <pbatard@gmail.com>2010-04-21 18:13:53 +0100
commit21bdd21e59bb01277a90a963adb3ba2ae9038855 (patch)
tree30ef31181e314368b76359b646c99215c14ee3fa
parent002cdfaf85f5bc6bd4d13a264d068237885887cb (diff)
downloadlibusb-21bdd21e59bb01277a90a963adb3ba2ae9038855.tar.gz
Linux: Handle failure to read active configuration during enumerationr269
-rw-r--r--libusb/os/linux_usbfs.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/libusb/os/linux_usbfs.c b/libusb/os/linux_usbfs.c
index b398577..470b511 100644
--- a/libusb/os/linux_usbfs.c
+++ b/libusb/os/linux_usbfs.c
@@ -646,7 +646,8 @@ static int usbfs_get_active_config(struct libusb_device *dev, int fd)
if (errno == ENODEV)
return LIBUSB_ERROR_NO_DEVICE;
- usbi_err(DEVICE_CTX(dev),
+ /* we hit this error path frequently with buggy devices :( */
+ usbi_warn(DEVICE_CTX(dev),
"get_configuration failed ret=%d errno=%d", r, errno);
return LIBUSB_ERROR_IO;
}
@@ -716,7 +717,13 @@ static int initialize_device(struct libusb_device *dev, uint8_t busnum,
"determine active configuration descriptor", path);
} else {
active_config = usbfs_get_active_config(dev, fd);
- if (active_config < 0) {
+ if (active_config == LIBUSB_ERROR_IO) {
+ /* buggy devices sometimes fail to report their active config.
+ * assume unconfigured and continue the probing */
+ usbi_warn(DEVICE_CTX(dev), "couldn't query active "
+ "configuration, assumung unconfigured");
+ device_configured = 0;
+ } else if (active_config < 0) {
close(fd);
return active_config;
} else if (active_config == 0) {
@@ -725,7 +732,7 @@ static int initialize_device(struct libusb_device *dev, uint8_t busnum,
* not support buggy devices in these circumstances.
* stick to the specs: a configuration value of 0 means
* unconfigured. */
- usbi_dbg("assuming unconfigured device");
+ usbi_dbg("active cfg 0? assuming unconfigured device");
device_configured = 0;
}
}