From 1ae7aca2d3a283cf75f1cdf2df404ecb97423236 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Mon, 3 Jun 2019 13:45:50 +0200 Subject: [PATCH 7/9] usb-host: avoid libusb_set_configuration calls MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit RH-Author: Gerd Hoffmann Message-id: <20190603134550.30153-5-kraxel@redhat.com> Patchwork-id: 88450 O-Subject: [RHEL-7.7 qemu-kvm-rhev PATCH 4/4] usb-host: avoid libusb_set_configuration calls Bugzilla: 1710861 RH-Acked-by: Philippe Mathieu-Daudé RH-Acked-by: Dr. David Alan Gilbert RH-Acked-by: Max Reitz RH-Acked-by: Miroslav Rezanina 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 Message-id: 20190522094702.17619-4-kraxel@redhat.com (cherry picked from commit bfe44898848614cfcb3a269bc965afbe1f0f331c) Signed-off-by: Miroslav Rezanina --- hw/usb/host-libusb.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/hw/usb/host-libusb.c b/hw/usb/host-libusb.c index 1d7e386..878c515 100644 --- a/hw/usb/host-libusb.c +++ b/hw/usb/host-libusb.c @@ -1216,19 +1216,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) { -- 1.8.3.1