diff options
author | Peter Maydell <peter.maydell@linaro.org> | 2019-05-30 13:55:27 +0100 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2019-05-30 13:55:27 +0100 |
commit | 48a8b399619cf3bb745a2e052f9fec142f14d75d (patch) | |
tree | 9d3d9eb66b202482b887402c62856fcaff68df01 /hw/usb/host-libusb.c | |
parent | 95172e24051ce48237f371849498bfc1027df578 (diff) | |
parent | 442bac16a6cd708a9f87adb0a263f9d833f03ed5 (diff) |
Merge remote-tracking branch 'remotes/kraxel/tags/usb-20190529-pull-request' into staging
usb-hub: port count config option, emulate power switching, cleanups.
usb-tablet, usb-host: bugfixes.
# gpg: Signature made Wed 29 May 2019 07:28:18 BST
# gpg: using RSA key 4CB6D8EED3E87138
# gpg: Good signature from "Gerd Hoffmann (work) <kraxel@redhat.com>" [full]
# gpg: aka "Gerd Hoffmann <gerd@kraxel.org>" [full]
# gpg: aka "Gerd Hoffmann (private) <kraxel@gmail.com>" [full]
# Primary key fingerprint: A032 8CFF B93A 17A7 9901 FE7D 4CB6 D8EE D3E8 7138
* remotes/kraxel/tags/usb-20190529-pull-request:
usb-tablet: fix serial compat property
usb-hub: emulate per port power switching
usb-hub: add usb_hub_port_update()
usb-hub: add helpers to update port state
usb-hub: make number of ports runtime-configurable
usb-hub: tweak feature names
usb-host: avoid libusb_set_configuration calls
usb-host: skip reset for untouched devices
usb: call reset handler before updating state
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'hw/usb/host-libusb.c')
-rw-r--r-- | hw/usb/host-libusb.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/hw/usb/host-libusb.c b/hw/usb/host-libusb.c index 67b7465915..4f765d7f9a 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) { @@ -1459,6 +1461,9 @@ static void usb_host_handle_reset(USBDevice *udev) if (!s->allow_guest_reset) { return; } + if (udev->addr == 0) { + return; + } trace_usb_host_reset(s->bus_num, s->addr); |