diff options
| -rw-r--r-- | drivers/net/phy/micrel.c | 23 | 
1 files changed, 22 insertions, 1 deletions
| diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c index 499185eaf413..cf6312fafea5 100644 --- a/drivers/net/phy/micrel.c +++ b/drivers/net/phy/micrel.c @@ -514,6 +514,27 @@ static int ksz8873mll_read_status(struct phy_device *phydev)  	return 0;  } +static int ksz9031_read_status(struct phy_device *phydev) +{ +	int err; +	int regval; + +	err = genphy_read_status(phydev); +	if (err) +		return err; + +	/* Make sure the PHY is not broken. Read idle error count, +	 * and reset the PHY if it is maxed out. +	 */ +	regval = phy_read(phydev, MII_STAT1000); +	if ((regval & 0xFF) == 0xFF) { +		phy_init_hw(phydev); +		phydev->link = 0; +	} + +	return 0; +} +  static int ksz8873mll_config_aneg(struct phy_device *phydev)  {  	return 0; @@ -772,7 +793,7 @@ static struct phy_driver ksphy_driver[] = {  	.driver_data	= &ksz9021_type,  	.config_init	= ksz9031_config_init,  	.config_aneg	= genphy_config_aneg, -	.read_status	= genphy_read_status, +	.read_status	= ksz9031_read_status,  	.ack_interrupt	= kszphy_ack_interrupt,  	.config_intr	= kszphy_config_intr,  	.suspend	= genphy_suspend, | 
