eb1e0a8392
Include two recent fixes from Alex Graf. OBS-URL: https://build.opensuse.org/request/show/511335 OBS-URL: https://build.opensuse.org/package/show/Virtualization/qemu?expand=0&rev=349
55 lines
2.1 KiB
Diff
55 lines
2.1 KiB
Diff
From a049f58c32e0c783d2d524a918d40ba4b22d96b8 Mon Sep 17 00:00:00 2001
|
|
From: Gerd Hoffmann <kraxel@redhat.com>
|
|
Date: Thu, 8 Jun 2017 09:41:22 +0200
|
|
Subject: [PATCH] xhci: only update dequeue ptr on completed transfers
|
|
|
|
The dequeue pointer should only be updated in case the transfer
|
|
is actually completed. If we update it for inflight transfers
|
|
we will not pick them up again after migration, which easily
|
|
triggers with HID devices as they typically have a pending
|
|
transfer, waiting for user input to happen.
|
|
|
|
Fixes: 243afe858b95765b98d16a1f0dd50dca262858ad
|
|
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1451631
|
|
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
|
|
Tested-by: Laurent Vivier <lvivier@redhat.com>
|
|
Message-id: 20170608074122.32099-1-kraxel@redhat.com
|
|
(cherry picked from commit d54fddea989ba4aa2912d49583d86ce01c0d27ea)
|
|
Fixes: https://bugzilla.suse.com/show_bug.cgi?id=1048296
|
|
Signed-off-by: Alexander Graf <agraf@suse.de>
|
|
---
|
|
hw/usb/hcd-xhci.c | 6 ++++--
|
|
1 file changed, 4 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c
|
|
index a2d3143bf4..ed0f13f37b 100644
|
|
--- a/hw/usb/hcd-xhci.c
|
|
+++ b/hw/usb/hcd-xhci.c
|
|
@@ -2119,6 +2119,8 @@ static void xhci_kick_epctx(XHCIEPContext *epctx, unsigned int streamid)
|
|
}
|
|
assert(!xfer->running_retry);
|
|
if (xfer->complete) {
|
|
+ /* update ring dequeue ptr */
|
|
+ xhci_set_ep_state(xhci, epctx, stctx, epctx->state);
|
|
xhci_ep_free_xfer(epctx->retry);
|
|
}
|
|
epctx->retry = NULL;
|
|
@@ -2169,6 +2171,8 @@ static void xhci_kick_epctx(XHCIEPContext *epctx, unsigned int streamid)
|
|
xhci_fire_transfer(xhci, xfer, epctx);
|
|
}
|
|
if (xfer->complete) {
|
|
+ /* update ring dequeue ptr */
|
|
+ xhci_set_ep_state(xhci, epctx, stctx, epctx->state);
|
|
xhci_ep_free_xfer(xfer);
|
|
xfer = NULL;
|
|
}
|
|
@@ -2186,8 +2190,6 @@ static void xhci_kick_epctx(XHCIEPContext *epctx, unsigned int streamid)
|
|
break;
|
|
}
|
|
}
|
|
- /* update ring dequeue ptr */
|
|
- xhci_set_ep_state(xhci, epctx, stctx, epctx->state);
|
|
epctx->kick_active--;
|
|
|
|
ep = xhci_epid_to_usbep(epctx);
|