From 76d0a9362c6a6a7d88aa18c84c4186c9107ecaef Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Mon, 3 Feb 2020 12:41:08 +0100 Subject: [PATCH 1/2] usb-host: wait for cancel complete After canceling transfers call into libvirt so it can process the request, and wait for it to complete. Also cancel all pending transfers before exiting qemu. Buglink: https://bugzilla.redhat.com//show_bug.cgi?id=1749745 Signed-off-by: Gerd Hoffmann Message-id: 20200203114108.23952-1-kraxel@redhat.com --- hw/usb/host-libusb.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/hw/usb/host-libusb.c b/hw/usb/host-libusb.c index 2594700901..2ac7a936fb 100644 --- a/hw/usb/host-libusb.c +++ b/hw/usb/host-libusb.c @@ -354,9 +354,7 @@ static USBHostRequest *usb_host_req_alloc(USBHostDevice *s, USBPacket *p, static void usb_host_req_free(USBHostRequest *r) { - if (r->host) { - QTAILQ_REMOVE(&r->host->requests, r, next); - } + QTAILQ_REMOVE(&r->host->requests, r, next); libusb_free_transfer(r->xfer); g_free(r->buffer); g_free(r); @@ -468,12 +466,7 @@ static void usb_host_req_abort(USBHostRequest *r) usb_packet_complete(USB_DEVICE(s), r->p); } r->p = NULL; - } - QTAILQ_REMOVE(&r->host->requests, r, next); - r->host = NULL; - - if (inflight) { libusb_cancel_transfer(r->xfer); } } @@ -962,6 +955,13 @@ static void usb_host_abort_xfers(USBHostDevice *s) QTAILQ_FOREACH_SAFE(r, &s->requests, next, rtmp) { usb_host_req_abort(r); } + + while (QTAILQ_FIRST(&s->requests) != NULL) { + struct timeval tv; + memset(&tv, 0, sizeof(tv)); + tv.tv_usec = 2500; + libusb_handle_events_timeout(ctx, &tv); + } } static int usb_host_close(USBHostDevice *s) @@ -1011,6 +1011,7 @@ static void usb_host_exit_notifier(struct Notifier *n, void *data) USBHostDevice *s = container_of(n, USBHostDevice, exit); if (s->dh) { + usb_host_abort_xfers(s); usb_host_release_interfaces(s); libusb_reset_device(s->dh); usb_host_attach_kernel(s); From 8ddcc43592f215a7523774704df6c60d12d9f647 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 17 Jan 2020 08:37:16 +0100 Subject: [PATCH 2/2] uas: fix super speed bMaxPacketSize0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For usb2 bMaxPacketSize0 is "n", for usb3 it is "1 << n", so it must be 9 not 64 ... rom "Universal Serial Bus 3.1 Specification": If the device is operating at Gen X speed, the bMaxPacketSize0 field shall be set to 09H indicating a 512-byte maximum packet. An Enhanced SuperSpeed device shall not support any other maximum packet sizes for the default control pipe (endpoint 0) control endpoint. We now announce a 512-byte maximum packet. Fixes: 89a453d4a5c ("uas-uas: usb3 streams") Reported-by: Benjamin David Lunt Signed-off-by: Gerd Hoffmann Reviewed-by: Philippe Mathieu-Daudé Message-id: 20200117073716.31335-1-kraxel@redhat.com --- hw/usb/dev-uas.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/usb/dev-uas.c b/hw/usb/dev-uas.c index 9825ec37d0..11a8684cc2 100644 --- a/hw/usb/dev-uas.c +++ b/hw/usb/dev-uas.c @@ -303,7 +303,7 @@ static const USBDescDevice desc_device_high = { static const USBDescDevice desc_device_super = { .bcdUSB = 0x0300, - .bMaxPacketSize0 = 64, + .bMaxPacketSize0 = 9, .bNumConfigurations = 1, .confs = (USBDescConfig[]) { {