diff options
| author | Vipin Kumar <vipin.kumar@st.com> | 2012-03-26 00:09:56 +0000 | 
|---|---|---|
| committer | Joe Hershberger <joe.hershberger@ni.com> | 2012-04-04 10:47:21 -0500 | 
| commit | 13edd1706c56371dc6a67f7bef874f6d8b7af8eb (patch) | |
| tree | 47d3dd15ce60a8bfc0ec7b6318f9764bcc6917eb /drivers/net/designware.c | |
| parent | aa51005c3f7e517164fa000d68672041f6c4191f (diff) | |
| download | olio-uboot-2014.01-13edd1706c56371dc6a67f7bef874f6d8b7af8eb.tar.xz olio-uboot-2014.01-13edd1706c56371dc6a67f7bef874f6d8b7af8eb.zip | |
net/designware: Try configuring phy on each dw_eth_init
Phy autonegotiation works only when the ethernet cable is plugged in.
Since the phy was configured only at the init time, a plugged in cable
was necessary to initialize the phy properly.
This patch keeps a flag to check if the phy initialization has
succeeded, and calls configure_phy routine at every init if this flag
reports otherwise.
Signed-off-by: Vipin Kumar <vipin.kumar@st.com>
Signed-off-by: Amit Virdi <amit.virdi@st.com>
Diffstat (limited to 'drivers/net/designware.c')
| -rw-r--r-- | drivers/net/designware.c | 48 | 
1 files changed, 28 insertions, 20 deletions
| diff --git a/drivers/net/designware.c b/drivers/net/designware.c index 933032cfd..ebb1fff80 100644 --- a/drivers/net/designware.c +++ b/drivers/net/designware.c @@ -32,6 +32,8 @@  #include <asm/io.h>  #include "designware.h" +static int configure_phy(struct eth_device *dev); +  static void tx_descs_init(struct eth_device *dev)  {  	struct dw_eth_dev *priv = dev->priv; @@ -144,6 +146,9 @@ static int dw_eth_init(struct eth_device *dev, bd_t *bis)  	struct eth_dma_regs *dma_p = priv->dma_regs_p;  	u32 conf; +	if (priv->phy_configured != 1) +		configure_phy(dev); +  	/* Reset ethernet hardware */  	if (mac_reset(dev) < 0)  		return -1; @@ -422,23 +427,26 @@ static int configure_phy(struct eth_device *dev)  	eth_mdio_read(dev, phy_addr, MII_LPA, &anlpar);  	eth_mdio_read(dev, phy_addr, MII_STAT1000, &btsr); -	if (btsr & (PHY_1000BTSR_1000FD | PHY_1000BTSR_1000HD)) { -		priv->speed = SPEED_1000M; -		if (btsr & PHY_1000BTSR_1000FD) -			priv->duplex = FULL_DUPLEX; -		else -			priv->duplex = HALF_DUPLEX; -	} else { -		if (anlpar & LPA_100) -			priv->speed = SPEED_100M; -		else -			priv->speed = SPEED_10M; +	if (bmsr & BMSR_ANEGCOMPLETE) { +		if (btsr & (PHY_1000BTSR_1000FD | PHY_1000BTSR_1000HD)) { +			priv->speed = SPEED_1000M; +			if (btsr & PHY_1000BTSR_1000FD) +				priv->duplex = FULL_DUPLEX; +			else +				priv->duplex = HALF_DUPLEX; +		} else { +			if (anlpar & LPA_100) +				priv->speed = SPEED_100M; +			else +				priv->speed = SPEED_10M; -		if (anlpar & (LPA_10FULL | LPA_100FULL)) -			priv->duplex = FULL_DUPLEX; -		else -			priv->duplex = HALF_DUPLEX; -	} +			if (anlpar & (LPA_10FULL | LPA_100FULL)) +				priv->duplex = FULL_DUPLEX; +			else +				priv->duplex = HALF_DUPLEX; +		} +	} else +		return -1;  #else  	if (eth_mdio_read(dev, phy_addr, MII_BMCR, &ctrl) < 0)  		return -1; @@ -455,6 +463,8 @@ static int configure_phy(struct eth_device *dev)  	else  		priv->speed = SPEED_10M;  #endif +	priv->phy_configured = 1; +  	return 0;  } @@ -515,14 +525,12 @@ int designware_initialize(u32 id, ulong base_addr, u32 phy_addr)  	priv->dma_regs_p = (struct eth_dma_regs *)(base_addr +  			DW_DMA_BASE_OFFSET);  	priv->address = phy_addr; +	priv->phy_configured = 0;  	if (mac_reset(dev) < 0)  		return -1; -	if (configure_phy(dev) < 0) { -		printf("Phy could not be configured\n"); -		return -1; -	} +	configure_phy(dev);  	dev->init = dw_eth_init;  	dev->send = dw_eth_send; |