[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:
parent
d6945925d8
commit
ee8388ec69
@ -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 */
|
||||
|
Reference in New Issue
Block a user