Commit d54fddea authored by Gerd Hoffmann's avatar Gerd Hoffmann
Browse files

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: 243afe85
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1451631


Signed-off-by: default avatarGerd Hoffmann <kraxel@redhat.com>
Tested-by: default avatarLaurent Vivier <lvivier@redhat.com>
Message-id: 20170608074122.32099-1-kraxel@redhat.com
parent 475df9d8
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -1912,6 +1912,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;
@@ -1962,6 +1964,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;
        }
@@ -1979,8 +1983,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);