From: Michael Brown Date: Mon, 7 Dec 2015 22:30:27 +0000 (+0000) Subject: [xhci] Ensure that zero-length packets are not part of a TRB chain X-Git-Tag: v1.20.1~650 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ee8388ec6950ea596ddb374dcc2abb940db70aea;p=thirdparty%2Fipxe.git [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 --- diff --git a/src/drivers/usb/xhci.c b/src/drivers/usb/xhci.c index 67de0a832..48ac6a307 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 */