diff options
| -rw-r--r-- | drivers/usb/host/ehci-hcd.c | 10 | ||||
| -rw-r--r-- | drivers/usb/host/ohci-hcd.c | 7 | ||||
| -rw-r--r-- | include/usb.h | 6 | 
3 files changed, 16 insertions, 7 deletions
| diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 6eb38a413..70c02c9de 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); diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c index d24697896..bc8bb2061 100644 --- a/drivers/usb/host/ohci-hcd.c +++ b/drivers/usb/host/ohci-hcd.c @@ -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 (;;) { diff --git a/include/usb.h b/include/usb.h index afd65e318..98576b73a 100644 --- a/include/usb.h +++ b/include/usb.h @@ -42,6 +42,12 @@  #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; |