david/ipxe
david
/
ipxe
Archived
1
0
Fork 0

[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 <mcb30@ipxe.org>
This commit is contained in:
Michael Brown 2015-12-07 22:30:27 +00:00
parent d6945925d8
commit ee8388ec69
1 changed files with 6 additions and 0 deletions

View File

@ -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 */