aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHector Martin <marcan@marcan.st>2023-10-29 15:37:41 +0900
committerMarek Vasut <marex@denx.de>2023-12-01 14:06:04 +0100
commit9d88bd4dcf1628bf129163eb5a25c48068423601 (patch)
tree0bd914cb820c24ebe01fb1cd8cc7316730698997
parent6f64f0ae230f9e8f68c5d9bf56ffee438fa60a6a (diff)
downloadu-boot-9d88bd4dcf1628bf129163eb5a25c48068423601.zip
u-boot-9d88bd4dcf1628bf129163eb5a25c48068423601.tar.gz
u-boot-9d88bd4dcf1628bf129163eb5a25c48068423601.tar.bz2
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@marcan.st> Reviewed-by: Marek Vasut <marex@denx.de>
-rw-r--r--drivers/usb/host/xhci-ring.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
index e02a6e3..db8b8f2 100644
--- a/drivers/usb/host/xhci-ring.c
+++ b/drivers/usb/host/xhci-ring.c
@@ -671,6 +671,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);
+
ring = virt_dev->eps[ep_index].ring;
/*
* How much data is (potentially) left before the 64KB boundary?