diff options
| author | Shinya Kuribayashi <shinya.kuribayashi@necel.com> | 2008-01-16 16:11:14 +0900 | 
|---|---|---|
| committer | Ben Warren <biggerbadderben@gmail.com> | 2008-01-16 17:37:35 -0500 | 
| commit | d1276c76c1e2b5035296689280ba1acb2c425104 (patch) | |
| tree | 2ef8ecc21b7d213e0ee6664306acdd5d0aaff44f | |
| parent | 18ee320ff63edbf7b27bbeb05f0e12a52302c68a (diff) | |
| download | olio-uboot-2014.01-d1276c76c1e2b5035296689280ba1acb2c425104.tar.xz olio-uboot-2014.01-d1276c76c1e2b5035296689280ba1acb2c425104.zip | |
drivers/net/rtl8139.c: Fix tx timeout
"to = (currticks() + RTL_TIMEOUT)" has possibilities to wrap around. If it
does, the condition "(currticks() < to)" becomes invalid and immediately
leads to tx timeout error. This patch introduces the fine-graded udely(10)
loops to ease the impact of wrapping around.
Signed-off-by: Shinya Kuribayashi <shinya.kuribayashi@necel.com>
Cc: Masami Komiya <mkomiya@sonare.it>
Cc: Lucas Jin <lucasjin@gmail.com>
Signed-off-by: Ben Warren <biggerbadderben@gmail.com>
| -rw-r--r-- | drivers/net/rtl8139.c | 17 | 
1 files changed, 7 insertions, 10 deletions
| diff --git a/drivers/net/rtl8139.c b/drivers/net/rtl8139.c index 4c248054c..5d7ae7482 100644 --- a/drivers/net/rtl8139.c +++ b/drivers/net/rtl8139.c @@ -80,10 +80,7 @@  #if defined(CONFIG_CMD_NET) && defined(CONFIG_NET_MULTI) && \  	defined(CONFIG_RTL8139) -#define TICKS_PER_SEC	CFG_HZ -#define TICKS_PER_MS	(TICKS_PER_SEC/1000) - -#define RTL_TIMEOUT	(1*TICKS_PER_SEC) +#define RTL_TIMEOUT	100000  #define ETH_FRAME_LEN		1514  #define ETH_ALEN		6 @@ -414,9 +411,10 @@ static void rtl_reset(struct eth_device *dev)  static int rtl_transmit(struct eth_device *dev, volatile void *packet, int length)  { -	unsigned int status, to; +	unsigned int status;  	unsigned long txstatus;  	unsigned int len = length; +	int i = 0;  	ioaddr = dev->iobase; @@ -436,8 +434,6 @@ static int rtl_transmit(struct eth_device *dev, volatile void *packet, int lengt  	outl(((TX_FIFO_THRESH<<11) & 0x003f0000) | len,  		ioaddr + TxStatus0 + cur_tx*4); -	to = currticks() + RTL_TIMEOUT; -  	do {  		status = inw(ioaddr + IntrStatus);  		/* Only acknlowledge interrupt sources we can properly handle @@ -445,7 +441,8 @@ static int rtl_transmit(struct eth_device *dev, volatile void *packet, int lengt  		 * rtl_poll() function.	 */  		outw(status & (TxOK | TxErr | PCIErr), ioaddr + IntrStatus);  		if ((status & (TxOK | TxErr | PCIErr)) != 0) break; -	} while (currticks() < to); +		udelay(10); +	} while (i++ < RTL_TIMEOUT);  	txstatus = inl(ioaddr + TxStatus0 + cur_tx*4); @@ -458,8 +455,8 @@ static int rtl_transmit(struct eth_device *dev, volatile void *packet, int lengt  		return length;  	} else {  #ifdef	DEBUG_TX -		printf("tx timeout/error (%d ticks), status %hX txstatus %X\n", -			currticks()-to, status, txstatus); +		printf("tx timeout/error (%d usecs), status %hX txstatus %X\n", +		       10*i, status, txstatus);  #endif  		rtl_reset(dev); |