aboutsummaryrefslogtreecommitdiff
path: root/hw/usb/host-libusb.c
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2013-10-08 21:58:07 +0200
committerGerd Hoffmann <kraxel@redhat.com>2013-10-22 16:28:49 +0200
commit1294ca797c6bee39d4dbc3e92010873ce4047e0e (patch)
tree8780bb551509105c0ab7a9b066633e32993cbb22 /hw/usb/host-libusb.c
parent5af35d7feccaa7d26b72c6c3d14116421d736b36 (diff)
downloadqemu-1294ca797c6bee39d4dbc3e92010873ce4047e0e.zip
qemu-1294ca797c6bee39d4dbc3e92010873ce4047e0e.tar.gz
qemu-1294ca797c6bee39d4dbc3e92010873ce4047e0e.tar.bz2
usb-host-libusb: Configuration 0 may be a valid configuration
Quoting from: linux/Documentation/ABI/stable/sysfs-bus-usb: Note that some devices, in violation of the USB spec, have a configuration with a value equal to 0. Writing 0 to bConfigurationValue for these devices will install that configuration, rather then unconfigure the device. So don't compare the configuration value against 0 to check for unconfigured devices, instead check for a LIBUSB_ERROR_NOT_FOUND return from libusb_get_active_config_descriptor(). Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Diffstat (limited to 'hw/usb/host-libusb.c')
-rw-r--r--hw/usb/host-libusb.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/hw/usb/host-libusb.c b/hw/usb/host-libusb.c
index 428c7c5..35bae55 100644
--- a/hw/usb/host-libusb.c
+++ b/hw/usb/host-libusb.c
@@ -992,15 +992,14 @@ static int usb_host_claim_interfaces(USBHostDevice *s, int configuration)
udev->ninterfaces = 0;
udev->configuration = 0;
- if (configuration == 0) {
- /* address state - ignore */
- return USB_RET_SUCCESS;
- }
-
usb_host_detach_kernel(s);
rc = libusb_get_active_config_descriptor(s->dev, &conf);
if (rc != 0) {
+ if (rc == LIBUSB_ERROR_NOT_FOUND) {
+ /* address state - ignore */
+ return USB_RET_SUCCESS;
+ }
return USB_RET_STALL;
}