diff options
author | Daniel Drake <dan@reactivated.net> | 2010-04-20 20:14:09 -0300 |
---|---|---|
committer | Pete Batard <pbatard@gmail.com> | 2010-04-21 18:13:53 +0100 |
commit | 21bdd21e59bb01277a90a963adb3ba2ae9038855 (patch) | |
tree | 30ef31181e314368b76359b646c99215c14ee3fa | |
parent | 002cdfaf85f5bc6bd4d13a264d068237885887cb (diff) | |
download | libusb-21bdd21e59bb01277a90a963adb3ba2ae9038855.tar.gz |
Linux: Handle failure to read active configuration during enumerationr269
-rw-r--r-- | libusb/os/linux_usbfs.c | 13 |
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; } } |