This ports U-Boot commit 9d88bd4dcf1628bf129163eb5a25c48068423601: | Author: Hector Martin <marcan@xxxxxxxxx> | AuthorDate: Sun Oct 29 15:37:41 2023 +0900 | | usb: xhci: Recover from halted bulk endpoints | | There is currently no codepath to recover from this case. In principle | we could require that the upper layer do this explicitly, but let's just | do it in xHCI when the next bulk transfer is started, since that | reasonably implies whatever caused the problem has been dealt with. | | Signed-off-by: Hector Martin <marcan@xxxxxxxxx> Signed-off-by: Ahmad Fatoum <a.fatoum@xxxxxxxxxxxxxx> --- drivers/usb/host/xhci-ring.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 1b9a5b7867e0..6a859dbbfac9 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c @@ -695,6 +695,14 @@ int xhci_bulk_tx(struct usb_device *udev, unsigned long pipe, ep_ctx = xhci_get_ep_ctx(ctrl, virt_dev->out_ctx, ep_index); + /* + * If the endpoint was halted due to a prior error, resume it before + * the next transfer. It is the responsibility of the upper layer to + * have dealt with whatever caused the error. + */ + if ((le32_to_cpu(ep_ctx->ep_info) & EP_STATE_MASK) == EP_STATE_HALTED) + reset_ep(udev, ep_index, timeout_ms); + ring = virt_dev->eps[ep_index].ring; /* * How much data is (potentially) left before the 64KB boundary? -- 2.39.2