diff options
| author | Peter Tyser <ptyser@xes-inc.com> | 2009-02-04 15:14:05 -0600 | 
|---|---|---|
| committer | Ben Warren <biggerbadderben@gmail.com> | 2009-08-21 10:35:30 -0700 | 
| commit | b1e849f2201bbbf3ca81fde164f154f9caf7f0e9 (patch) | |
| tree | 12133d4f01af09b347e49ac35311edbb925ec6cf /drivers/net/tsec.c | |
| parent | 477fa6378fbd3e47a5e2e83d0dd3970d5b1c8371 (diff) | |
| download | olio-uboot-2014.01-b1e849f2201bbbf3ca81fde164f154f9caf7f0e9.tar.xz olio-uboot-2014.01-b1e849f2201bbbf3ca81fde164f154f9caf7f0e9.zip | |
tsec: Wait for auto-negotiation to complete without link
Previously, waiting for auto-negotiation would only occur if a valid
link had been detected.  Problems arose when attempting to use a
tsec immediately after bootup but before link was achieved, eg:
=> dhcp
Auto-neg error, defaulting to 10BT/HD
eTSEC1: No link.
Auto-neg error, defaulting to 10BT/HD
eTSEC2: No link.
=>
With this patch applied the same operation as above resulted in:
=> dhcp
Waiting for PHY auto negotiation to complete. done
Enet starting in 1000BT/FD
Speed: 1000, full duplex
Signed-off-by: Peter Tyser <ptyser@xes-inc.com>
Signed-off-by: Ben Warren <biggerbadderben@gmail.com>
Diffstat (limited to 'drivers/net/tsec.c')
| -rw-r--r-- | drivers/net/tsec.c | 19 | 
1 files changed, 9 insertions, 10 deletions
| diff --git a/drivers/net/tsec.c b/drivers/net/tsec.c index a9ba68399..9c9fd377c 100644 --- a/drivers/net/tsec.c +++ b/drivers/net/tsec.c @@ -356,8 +356,8 @@ uint mii_cr_init(uint mii_reg, struct tsec_private * priv)  		return MIIM_CR_INIT;  } -/* Parse the status register for link, and then do - * auto-negotiation +/* + * Wait for auto-negotiation to complete, then determine link   */  uint mii_parse_sr(uint mii_reg, struct tsec_private * priv)  { @@ -366,8 +366,7 @@ uint mii_parse_sr(uint mii_reg, struct tsec_private * priv)  	 * (ie - we're capable and it's not done)  	 */  	mii_reg = read_phy_reg(priv, MIIM_STATUS); -	if ((mii_reg & MIIM_STATUS_LINK) && (mii_reg & PHY_BMSR_AUTN_ABLE) -	    && !(mii_reg & PHY_BMSR_AUTN_COMP)) { +	if ((mii_reg & PHY_BMSR_AUTN_ABLE) && !(mii_reg & PHY_BMSR_AUTN_COMP)) {  		int i = 0;  		puts("Waiting for PHY auto negotiation to complete"); @@ -388,15 +387,15 @@ uint mii_parse_sr(uint mii_reg, struct tsec_private * priv)  			mii_reg = read_phy_reg(priv, MIIM_STATUS);  		}  		puts(" done\n"); -		priv->link = 1; + +		/* Link status bit is latched low, read it again */ +		mii_reg = read_phy_reg(priv, MIIM_STATUS); +  		udelay(500000);	/* another 500 ms (results in faster booting) */ -	} else { -		if (mii_reg & MIIM_STATUS_LINK) -			priv->link = 1; -		else -			priv->link = 0;  	} +	priv->link = mii_reg & MIIM_STATUS_LINK ? 1 : 0; +  	return 0;  } |