aboutsummaryrefslogtreecommitdiff
path: root/hw/usb/host-libusb.c
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2019-05-30 13:55:27 +0100
committerPeter Maydell <peter.maydell@linaro.org>2019-05-30 13:55:27 +0100
commit48a8b399619cf3bb745a2e052f9fec142f14d75d (patch)
tree9d3d9eb66b202482b887402c62856fcaff68df01 /hw/usb/host-libusb.c
parent95172e24051ce48237f371849498bfc1027df578 (diff)
parent442bac16a6cd708a9f87adb0a263f9d833f03ed5 (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.c21
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);