summaryrefslogtreecommitdiff
path: root/drivers/usb/host/ehci-hcd.c
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2011-02-07 22:42:16 (GMT)
committerRemy Bohmer <linux@bohmer.net>2011-02-19 19:32:34 (GMT)
commit96820a35873b4c005f732432c6a168decc9d22b9 (patch)
tree181c14ab100fc6075409b23b43b00b363dacdc4e /drivers/usb/host/ehci-hcd.c
parentefb063390d2d1e712c2c8110911616244d562c4b (diff)
downloadu-boot-96820a35873b4c005f732432c6a168decc9d22b9.tar.xz
Fix EHCI usb submit timeout and unify with OHCI
Changed both to use a common timeout for URB submission, since they were using different values and EHCI's was too short. Also fixed EHCI to actually check if urb submission succeeded, rather than silently continuing into the weeds. Change-Id: I7f71499ffaa05187d8e5618db2419e1606007b82 Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'drivers/usb/host/ehci-hcd.c')
-rw-r--r--drivers/usb/host/ehci-hcd.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
index 6eb38a4..70c02c9 100644
--- a/drivers/usb/host/ehci-hcd.c
+++ b/drivers/usb/host/ehci-hcd.c
@@ -319,6 +319,7 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,
uint32_t endpt, token, usbsts;
uint32_t c, toggle;
uint32_t cmd;
+ int timeout;
int ret = 0;
debug("dev=%p, pipe=%lx, buffer=%p, length=%d, req=%p\n", dev, pipe,
@@ -447,6 +448,7 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,
/* Wait for TDs to be processed. */
ts = get_timer(0);
vtd = td;
+ timeout = USB_TIMEOUT_MS(pipe);
do {
/* Invalidate dcache */
ehci_invalidate_dcache(&qh_list);
@@ -454,7 +456,13 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,
if (!(token & 0x80))
break;
WATCHDOG_RESET();
- } while (get_timer(ts) < CONFIG_SYS_HZ);
+ } while (get_timer(ts) < timeout);
+
+ /* Check that the TD processing happened */
+ if (token & 0x80) {
+ printf("EHCI timed out on TD - token=%#x\n", token);
+ goto fail;
+ }
/* Disable async schedule. */
cmd = ehci_readl(&hcor->or_usbcmd);