diff options
| author | Bryan Wu <bryan.wu@analog.com> | 2009-06-16 05:26:27 -0400 | 
|---|---|---|
| committer | Remy Bohmer <linux@bohmer.net> | 2009-07-09 21:33:15 +0200 | 
| commit | c3a012ce65818beb274195cd47f31ed80d0fbaa5 (patch) | |
| tree | 09c1dfd5704e172da4ac25607b57a4eb79492e53 /drivers/usb/musb/musb_hcd.c | |
| parent | 7984967a9405672db1581402d2c2cfae268d1a67 (diff) | |
| download | olio-uboot-2014.01-c3a012ce65818beb274195cd47f31ed80d0fbaa5.tar.xz olio-uboot-2014.01-c3a012ce65818beb274195cd47f31ed80d0fbaa5.zip | |
usb: musb: add timeout via CONFIG_MUSB_TIMEOUT
Signed-off-by: Bryan Wu <bryan.wu@analog.com>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Signed-off-by: Remy Bohmer <linux@bohmer.net>
Diffstat (limited to 'drivers/usb/musb/musb_hcd.c')
| -rw-r--r-- | drivers/usb/musb/musb_hcd.c | 31 | 
1 files changed, 31 insertions, 0 deletions
| diff --git a/drivers/usb/musb/musb_hcd.c b/drivers/usb/musb/musb_hcd.c index 352a0d4eb..19d978b24 100644 --- a/drivers/usb/musb/musb_hcd.c +++ b/drivers/usb/musb/musb_hcd.c @@ -111,6 +111,7 @@ static int wait_until_ep0_ready(struct usb_device *dev, u32 bit_mask)  {  	u16 csr;  	int result = 1; +	int timeout = CONFIG_MUSB_TIMEOUT;  	while (result > 0) {  		csr = readw(&musbr->txcsr); @@ -152,7 +153,17 @@ static int wait_until_ep0_ready(struct usb_device *dev, u32 bit_mask)  			}  			break;  		} + +		/* Check the timeout */ +		if (--timeout) +			udelay(1); +		else { +			dev->status = USB_ST_CRC_ERR; +			result = -1; +			break; +		}  	} +  	return result;  } @@ -162,6 +173,7 @@ static int wait_until_ep0_ready(struct usb_device *dev, u32 bit_mask)  static u8 wait_until_txep_ready(struct usb_device *dev, u8 ep)  {  	u16 csr; +	int timeout = CONFIG_MUSB_TIMEOUT;  	do {  		if (check_stall(ep, 1)) { @@ -174,6 +186,15 @@ static u8 wait_until_txep_ready(struct usb_device *dev, u8 ep)  			dev->status = USB_ST_CRC_ERR;  			return 0;  		} + +		/* Check the timeout */ +		if (--timeout) +			udelay(1); +		else { +			dev->status = USB_ST_CRC_ERR; +			return -1; +		} +  	} while (csr & MUSB_TXCSR_TXPKTRDY);  	return 1;  } @@ -184,6 +205,7 @@ static u8 wait_until_txep_ready(struct usb_device *dev, u8 ep)  static u8 wait_until_rxep_ready(struct usb_device *dev, u8 ep)  {  	u16 csr; +	int timeout = CONFIG_MUSB_TIMEOUT;  	do {  		if (check_stall(ep, 0)) { @@ -196,6 +218,15 @@ static u8 wait_until_rxep_ready(struct usb_device *dev, u8 ep)  			dev->status = USB_ST_CRC_ERR;  			return 0;  		} + +		/* Check the timeout */ +		if (--timeout) +			udelay(1); +		else { +			dev->status = USB_ST_CRC_ERR; +			return -1; +		} +  	} while (!(csr & MUSB_RXCSR_RXPKTRDY));  	return 1;  } |