diff options
author | Peter Maydell <peter.maydell@linaro.org> | 2021-02-18 15:14:09 +0000 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2021-02-18 15:14:09 +0000 |
commit | b826fb8002e6247a324a546a75eda17ac33674b9 (patch) | |
tree | b010c1fee633006ebf2d6f79d8a206a9067fe6e3 /hw | |
parent | 91416a4254015e1e3f602f2b241b9ddb7879c10b (diff) | |
parent | 6ba5a437ad48f10931592f649b5b7375968f362d (diff) |
Merge remote-tracking branch 'remotes/kraxel/tags/usb-20210218-pull-request' into staging
usb: two bugfixes.
# gpg: Signature made Thu 18 Feb 2021 11:51:44 GMT
# gpg: using RSA key A0328CFFB93A17A79901FE7D4CB6D8EED3E87138
# 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-20210218-pull-request:
usb/pcap: set flag_setup
usb-host: use correct altsetting in usb_host_ep_update
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'hw')
-rw-r--r-- | hw/usb/host-libusb.c | 18 | ||||
-rw-r--r-- | hw/usb/pcap.c | 2 |
2 files changed, 17 insertions, 3 deletions
diff --git a/hw/usb/host-libusb.c b/hw/usb/host-libusb.c index 7dde3d1206..354713a77d 100644 --- a/hw/usb/host-libusb.c +++ b/hw/usb/host-libusb.c @@ -836,7 +836,7 @@ static void usb_host_ep_update(USBHostDevice *s) struct libusb_ss_endpoint_companion_descriptor *endp_ss_comp; #endif uint8_t devep, type; - int pid, ep; + int pid, ep, alt; int rc, i, e; usb_ep_reset(udev); @@ -848,8 +848,20 @@ static void usb_host_ep_update(USBHostDevice *s) conf->bConfigurationValue, true); for (i = 0; i < conf->bNumInterfaces; i++) { - assert(udev->altsetting[i] < conf->interface[i].num_altsetting); - intf = &conf->interface[i].altsetting[udev->altsetting[i]]; + /* + * The udev->altsetting array indexes alternate settings + * by the interface number. Get the 0th alternate setting + * first so that we can grab the interface number, and + * then correct the alternate setting value if necessary. + */ + intf = &conf->interface[i].altsetting[0]; + alt = udev->altsetting[intf->bInterfaceNumber]; + + if (alt != 0) { + assert(alt < conf->interface[i].num_altsetting); + intf = &conf->interface[i].altsetting[alt]; + } + trace_usb_host_parse_interface(s->bus_num, s->addr, intf->bInterfaceNumber, intf->bAlternateSetting, true); diff --git a/hw/usb/pcap.c b/hw/usb/pcap.c index 4350989d3a..dbff00be25 100644 --- a/hw/usb/pcap.c +++ b/hw/usb/pcap.c @@ -127,6 +127,7 @@ static void do_usb_pcap_ctrl(FILE *fp, USBPacket *p, bool setup) .xfer_type = usbmon_xfer_type[USB_ENDPOINT_XFER_CONTROL], .epnum = in ? 0x80 : 0, .devnum = dev->addr, + .flag_setup = setup ? 0 : '-', .flag_data = '=', .length = dev->setup_len, }; @@ -169,6 +170,7 @@ static void do_usb_pcap_data(FILE *fp, USBPacket *p, bool setup) .xfer_type = usbmon_xfer_type[p->ep->type], .epnum = usbmon_epnum(p), .devnum = p->ep->dev->addr, + .flag_setup = '-', .flag_data = '=', .length = p->iov.size, }; |