Fix EHCI usb submit timeout and unify with OHCI
authorSimon Glass <sjg@chromium.org>
Mon, 7 Feb 2011 22:42:16 +0000 (14:42 -0800)
committerRemy Bohmer <linux@bohmer.net>
Sat, 19 Feb 2011 19:32:34 +0000 (20:32 +0100)
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>
drivers/usb/host/ehci-hcd.c
drivers/usb/host/ohci-hcd.c
include/usb.h

index 6eb38a4131f0ed83c905f21af4237b3bfbb2b5a8..70c02c9deba8c6391f3270f360c085bc54131deb 100644 (file)
@@ -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);
index d2469789628b4924ae248ca56f5b403feded36fd..bc8bb2061bf5448ab6291bb5af1969c231e4226b 100644 (file)
@@ -1524,12 +1524,7 @@ int submit_common_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
        /* ohci_dump_status(&gohci); */
 #endif
 
-       /* allow more time for a BULK device to react - some are slow */
-#define BULK_TO         5000   /* timeout in milliseconds */
-       if (usb_pipebulk(pipe))
-               timeout = BULK_TO;
-       else
-               timeout = 1000;
+       timeout = USB_TIMEOUT_MS(pipe);
 
        /* wait for it to complete */
        for (;;) {
index afd65e3180fbebeb18706168fe977043f403dd36..98576b73a41dc707bd7563d9ff6a066bda10bb6c 100644 (file)
 
 #define USB_CNTL_TIMEOUT 100 /* 100ms timeout */
 
+/*
+ * This is the timeout to allow for submitting an urb in ms. We allow more
+ * time for a BULK device to react - some are slow.
+ */
+#define USB_TIMEOUT_MS(pipe) (usb_pipebulk(pipe) ? 5000 : 100)
+
 /* device request (setup) */
 struct devrequest {
        unsigned char   requesttype;