This ports U-Boot commit 9d88bd4dcf1628bf129163eb5a25c48068423601:

| Author:     Hector Martin <[email protected]>
| 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 <[email protected]>

Signed-off-by: Ahmad Fatoum <[email protected]>
---
 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


Reply via email to