qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] xhci: only update dequeue ptr on completed tran


From: Laurent Vivier
Subject: Re: [Qemu-devel] [PATCH] xhci: only update dequeue ptr on completed transfers
Date: Thu, 8 Jun 2017 09:49:47 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.1.0

On 08/06/2017 09:41, Gerd Hoffmann wrote:
> 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 <address@hidden>

Tested-by: Laurent Vivier <address@hidden>

> ---
>  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 a0c7960a7b..760135c0d2 100644
> --- a/hw/usb/hcd-xhci.c
> +++ b/hw/usb/hcd-xhci.c
> @@ -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);
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]