[U-Boot] [PATCH] musb: add timeout via CONFIG_MUSB_TIMEOUT

From: Bryan Wu bryan.wu@analog.com
Signed-off-by: Bryan Wu bryan.wu@analog.com Signed-off-by: Mike Frysinger vapier@gentoo.org CC: Ravi Babu ravibabu@ti.com CC: Swaminathan S swami.iyer@ti.com CC: Thomas Abraham t-abraham@ti.com CC: Ajay Kumar Gupta ajay.gupta@ti.com CC: Remy Bohmer linux@bohmer.net --- drivers/usb/musb_hcd.c | 31 +++++++++++++++++++++++++++++++ drivers/usb/musb_hcd.h | 4 ++++ 2 files changed, 35 insertions(+), 0 deletions(-)
diff --git a/drivers/usb/musb_hcd.c b/drivers/usb/musb_hcd.c index 352a0d4..19d978b 100644 --- a/drivers/usb/musb_hcd.c +++ b/drivers/usb/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; } diff --git a/drivers/usb/musb_hcd.h b/drivers/usb/musb_hcd.h index bb83311..b7f571d 100644 --- a/drivers/usb/musb_hcd.h +++ b/drivers/usb/musb_hcd.h @@ -30,6 +30,10 @@ extern unsigned char new[]; #endif
+#ifndef CONFIG_MUSB_TIMEOUT +# define CONFIG_MUSB_TIMEOUT 100000 +#endif + /* This defines the endpoint number used for control transfers */ #define MUSB_CONTROL_EP 0

Hello Mike,
2009/2/10 Mike Frysinger vapier@gentoo.org:
From: Bryan Wu bryan.wu@analog.com
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);
Hmm, I might be mistaken, but looking at this patch you seem to want to timeout at CONFIG_MUSB_TIMEOUT, but actually the timeout ends at CONFIG_MUSB_TIMEOUT-1. Shouldn't it be: if (timeout--) instead of if (--timeout) ??? (some remark applies to all instances in this patch...)
Kind Regards,
Remy

On Tuesday 10 February 2009 15:11:55 Remy Bohmer wrote:
2009/2/10 Mike Frysinger:
From: Bryan Wu bryan.wu@analog.com
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);
Hmm, I might be mistaken, but looking at this patch you seem to want to timeout at CONFIG_MUSB_TIMEOUT, but actually the timeout ends at CONFIG_MUSB_TIMEOUT-1. Shouldn't it be: if (timeout--) instead of if (--timeout) ??? (some remark applies to all instances in this patch...)
looks that way. i was hoping for feedback about the concept from the TI guys who wrote the musb driver to see if this method is ok or they prefer something different ;). -mike
participants (2)
-
Mike Frysinger
-
Remy Bohmer