aboutsummaryrefslogtreecommitdiff
path: root/hw/usb
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2019-05-22 11:47:02 +0200
committerGerd Hoffmann <kraxel@redhat.com>2019-05-29 07:03:56 +0200
commitbfe44898848614cfcb3a269bc965afbe1f0f331c (patch)
tree7cd12d77f2e11738af3abf017aaf2c062d089edb /hw/usb
parent65f14ab98da1da920f98ee8734dc1588b01d6b2b (diff)
downloadqemu-bfe44898848614cfcb3a269bc965afbe1f0f331c.zip
qemu-bfe44898848614cfcb3a269bc965afbe1f0f331c.tar.gz
qemu-bfe44898848614cfcb3a269bc965afbe1f0f331c.tar.bz2
usb-host: avoid libusb_set_configuration calls
Seems some devices become confused when we call libusb_set_configuration(). So before calling the function check whenever the device has multiple configurations in the first place, and in case it hasn't (which is the case for the majority of devices) simply skip the call as it will have no effect anyway. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Message-id: 20190522094702.17619-4-kraxel@redhat.com
Diffstat (limited to 'hw/usb')
-rw-r--r--hw/usb/host-libusb.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/hw/usb/host-libusb.c b/hw/usb/host-libusb.c
index 4e9a45a..4f765d7 100644
--- a/hw/usb/host-libusb.c
+++ b/hw/usb/host-libusb.c
@@ -1225,19 +1225,21 @@ static void usb_host_set_address(USBHostDevice *s, int addr)
static void usb_host_set_config(USBHostDevice *s, int config, USBPacket *p)
{
- int rc;
+ int rc = 0;
trace_usb_host_set_config(s->bus_num, s->addr, config);
usb_host_release_interfaces(s);
- rc = libusb_set_configuration(s->dh, config);
- if (rc != 0) {
- usb_host_libusb_error("libusb_set_configuration", rc);
- p->status = USB_RET_STALL;
- if (rc == LIBUSB_ERROR_NO_DEVICE) {
- usb_host_nodev(s);
+ if (s->ddesc.bNumConfigurations != 1) {
+ rc = libusb_set_configuration(s->dh, config);
+ if (rc != 0) {
+ usb_host_libusb_error("libusb_set_configuration", rc);
+ p->status = USB_RET_STALL;
+ if (rc == LIBUSB_ERROR_NO_DEVICE) {
+ usb_host_nodev(s);
+ }
+ return;
}
- return;
}
p->status = usb_host_claim_interfaces(s, config);
if (p->status != USB_RET_SUCCESS) {