Felipe Balbi
2014-01-20 20:45:11 UTC
If the HW reports the endpoint as Halted, there's
no need to start any URB for that endpoint, we can
simply return -EPIPE and this will tell upper layers
that the endpoint is, indeed, halted.
This patch fixes usbtest's set/clear halt test #13
on xHCI-based hosts.
Cc: <***@vger.kernel.org>
Signed-off-by: Felipe Balbi <***@ti.com>
---
Hi Sarah,
seems like this has been broken for quite a long
time.
I tested the patch on an AM437x which has XHCI Host and
the same IP configured as device as well (two dwc3 instances,
basically).
It has been running for the past hour or so without any failures
when running testusb -t 13 -c 5000 -s 2048 -a in a loop, but
if you think there's a better way to fix this, let me know. I just
didn't understand why xhci-hcd still queues the URB even though
HW already told us the endpoint is halted. Any comments ?
cheers
drivers/usb/host/xhci-ring.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
index 53c2e29..e9df61a 100644
--- a/drivers/usb/host/xhci-ring.c
+++ b/drivers/usb/host/xhci-ring.c
@@ -2959,7 +2959,8 @@ static int prepare_ring(struct xhci_hcd *xhci, struct xhci_ring *ep_ring,
/* XXX not sure if this should be -ENOENT or not */
return -EINVAL;
case EP_STATE_HALTED:
- xhci_dbg(xhci, "WARN halted endpoint, queueing URB anyway.\n");
+ xhci_dbg(xhci, "WARN halted endpoint.\n");
+ return -EPIPE;
case EP_STATE_STOPPED:
case EP_STATE_RUNNING:
break;
no need to start any URB for that endpoint, we can
simply return -EPIPE and this will tell upper layers
that the endpoint is, indeed, halted.
This patch fixes usbtest's set/clear halt test #13
on xHCI-based hosts.
Cc: <***@vger.kernel.org>
Signed-off-by: Felipe Balbi <***@ti.com>
---
Hi Sarah,
seems like this has been broken for quite a long
time.
I tested the patch on an AM437x which has XHCI Host and
the same IP configured as device as well (two dwc3 instances,
basically).
It has been running for the past hour or so without any failures
when running testusb -t 13 -c 5000 -s 2048 -a in a loop, but
if you think there's a better way to fix this, let me know. I just
didn't understand why xhci-hcd still queues the URB even though
HW already told us the endpoint is halted. Any comments ?
cheers
drivers/usb/host/xhci-ring.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
index 53c2e29..e9df61a 100644
--- a/drivers/usb/host/xhci-ring.c
+++ b/drivers/usb/host/xhci-ring.c
@@ -2959,7 +2959,8 @@ static int prepare_ring(struct xhci_hcd *xhci, struct xhci_ring *ep_ring,
/* XXX not sure if this should be -ENOENT or not */
return -EINVAL;
case EP_STATE_HALTED:
- xhci_dbg(xhci, "WARN halted endpoint, queueing URB anyway.\n");
+ xhci_dbg(xhci, "WARN halted endpoint.\n");
+ return -EPIPE;
case EP_STATE_STOPPED:
case EP_STATE_RUNNING:
break;
--
1.8.4.GIT
1.8.4.GIT