[usb] Reset endpoints without waiting for a new transfer to be enqueued
authorMichael Brown <mcb30@ipxe.org>
Mon, 23 Mar 2015 15:05:28 +0000 (15:05 +0000)
committerMichael Brown <mcb30@ipxe.org>
Mon, 23 Mar 2015 15:21:35 +0000 (15:21 +0000)
commitde6f4e3ede895b45325c5d062d25a94d1dd37e2e
tree220b52023811b1c21c8c59855027e2f43a200a6f
parent661189eedef6d895a0b3b2c793cbdfba731bdc7d
[usb] Reset endpoints without waiting for a new transfer to be enqueued

The current endpoint reset logic defers the reset until the caller
attempts to enqueue a new transfer to that endpoint.  This is
insufficient when dealing with endpoints behind a transaction
translator, since the transaction translator is a resource shared
between multiple endpoints.

We cannot reset the endpoint as part of the completion handling, since
that would introduce recursive calls to usb_poll().  Instead, we
add the endpoint to a list of halted endpoints, and perform the reset
on the next call to usb_step().

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/drivers/bus/usb.c
src/include/ipxe/usb.h