diff options
Diffstat (limited to 'drivers/net/phy/smsc.c')
| -rw-r--r-- | drivers/net/phy/smsc.c | 28 | 
1 files changed, 27 insertions, 1 deletions
diff --git a/drivers/net/phy/smsc.c b/drivers/net/phy/smsc.c index 6d6192316b3..88e3991464e 100644 --- a/drivers/net/phy/smsc.c +++ b/drivers/net/phy/smsc.c @@ -56,6 +56,32 @@ static int smsc_phy_config_init(struct phy_device *phydev)  	return smsc_phy_ack_interrupt (phydev);  } +static int lan87xx_config_init(struct phy_device *phydev) +{ +	/* +	 * Make sure the EDPWRDOWN bit is NOT set. Setting this bit on +	 * LAN8710/LAN8720 PHY causes the PHY to misbehave, likely due +	 * to a bug on the chip. +	 * +	 * When the system is powered on with the network cable being +	 * disconnected all the way until after ifconfig ethX up is +	 * issued for the LAN port with this PHY, connecting the cable +	 * afterwards does not cause LINK change detection, while the +	 * expected behavior is the Link UP being detected. +	 */ +	int rc = phy_read(phydev, MII_LAN83C185_CTRL_STATUS); +	if (rc < 0) +		return rc; + +	rc &= ~MII_LAN83C185_EDPWRDOWN; + +	rc = phy_write(phydev, MII_LAN83C185_CTRL_STATUS, rc); +	if (rc < 0) +		return rc; + +	return smsc_phy_ack_interrupt(phydev); +} +  static int lan911x_config_init(struct phy_device *phydev)  {  	return smsc_phy_ack_interrupt(phydev); @@ -162,7 +188,7 @@ static struct phy_driver smsc_phy_driver[] = {  	/* basic functions */  	.config_aneg	= genphy_config_aneg,  	.read_status	= genphy_read_status, -	.config_init	= smsc_phy_config_init, +	.config_init	= lan87xx_config_init,  	/* IRQ related */  	.ack_interrupt	= smsc_phy_ack_interrupt,  |