diff options
author | Hans de Goede <hdegoede@redhat.com> | 2015-01-11 20:34:49 +0100 |
---|---|---|
committer | Marek Vasut <marex@denx.de> | 2015-01-18 12:31:36 +0100 |
commit | dc9a3912709e901eb8e513492fdad9743535b86f (patch) | |
tree | cb0edca10e828d872ebc5730f8a1896b75a0f819 /drivers/usb/musb-new/musb_uboot.c | |
parent | 28a15ef7fd7d97f0634440866c6b7baa7708b5eb (diff) | |
download | u-boot-imx-dc9a3912709e901eb8e513492fdad9743535b86f.zip u-boot-imx-dc9a3912709e901eb8e513492fdad9743535b86f.tar.gz u-boot-imx-dc9a3912709e901eb8e513492fdad9743535b86f.tar.bz2 |
musb-new: Use time based timeouts rather then cpu-cycles based timeouts
CPU cycle based timeouts are no good, because how long they use depends on
CPU speed. Instead use time based timeouts, and wait one second for a
device connection to show up (per the USB spec), and wait USB_TIMEOUT_MS
for various urbs to complete.
This fixes "usb start" taking for ever when no device is plugged into the
otg port.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Diffstat (limited to 'drivers/usb/musb-new/musb_uboot.c')
-rw-r--r-- | drivers/usb/musb-new/musb_uboot.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/drivers/usb/musb-new/musb_uboot.c b/drivers/usb/musb-new/musb_uboot.c index 2676f09..f8a0346 100644 --- a/drivers/usb/musb-new/musb_uboot.c +++ b/drivers/usb/musb-new/musb_uboot.c @@ -57,13 +57,11 @@ static struct urb *construct_urb(struct usb_device *dev, int endpoint_type, return &urb; } -#define MUSB_HOST_TIMEOUT 0x3ffffff - static int submit_urb(struct usb_hcd *hcd, struct urb *urb) { struct musb *host = hcd->hcd_priv; int ret; - int timeout; + unsigned long timeout; ret = musb_urb_enqueue(hcd, urb, 0); if (ret < 0) { @@ -71,12 +69,13 @@ static int submit_urb(struct usb_hcd *hcd, struct urb *urb) return ret; } - timeout = MUSB_HOST_TIMEOUT; + timeout = get_timer(0) + USB_TIMEOUT_MS(urb->pipe); do { if (ctrlc()) return -EIO; host->isr(0, host); - } while ((urb->dev->status & USB_ST_NOT_PROC) && --timeout); + } while ((urb->dev->status & USB_ST_NOT_PROC) && + get_timer(0) < timeout); return urb->status; } @@ -115,7 +114,8 @@ int usb_lowlevel_init(int index, enum usb_init_type init, void **controller) { u8 power; void *mbase; - int timeout = MUSB_HOST_TIMEOUT; + /* USB spec says it may take up to 1 second for a device to connect */ + unsigned long timeout = get_timer(0) + 1000; if (!host) { printf("MUSB host is not registered\n"); @@ -127,8 +127,8 @@ int usb_lowlevel_init(int index, enum usb_init_type init, void **controller) do { if (musb_readb(mbase, MUSB_DEVCTL) & MUSB_DEVCTL_HM) break; - } while (--timeout); - if (!timeout) + } while (get_timer(0) < timeout); + if (get_timer(0) >= timeout) return -ENODEV; power = musb_readb(mbase, MUSB_POWER); |