From ee8388ec6950ea596ddb374dcc2abb940db70aea Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Mon, 7 Dec 2015 22:30:27 +0000 Subject: [PATCH] [xhci] Ensure that zero-length packets are not part of a TRB chain Some xHCI controllers (such as qemu's emulated xHCI controller) do not correctly handle zero-length packets that are part of a TRB chain. The zero-length TRB ends up being squashed and does not result in a zero-length packet as seen by the device. Work around this problem by marking the zero-length packet as belonging to a separate transfer descriptor. Signed-off-by: Michael Brown --- src/drivers/usb/xhci.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/drivers/usb/xhci.c b/src/drivers/usb/xhci.c index 67de0a83..48ac6a30 100644 --- a/src/drivers/usb/xhci.c +++ b/src/drivers/usb/xhci.c @@ -2606,6 +2606,12 @@ static int xhci_endpoint_stream ( struct usb_endpoint *ep, len -= trb_len; trb++; } + + /* Mark zero-length packet (if present) as a separate transfer */ + if ( zlp && ( count > 1 ) ) + trb[-2].normal.flags = 0; + + /* Generate completion for final TRB */ trb[-1].normal.flags = XHCI_TRB_IOC; /* Enqueue TRBs */