aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHeiner Kallweit <hkallweit1@gmail.com>2019-04-24 15:41:06 -0400
committerDavid S. Miller <davem@davemloft.net>2019-04-26 11:56:54 -0400
commit8c90b795e90f7753d23c18e8b95dd71b4a18c5d9 (patch)
treeef795fb4f37c2ac2639bf8b535b74c2b95ee3e7e
parentf7abc0618a4a5f0e138e24bb31234a88bfdb18ae (diff)
net: phy: improve genphy_soft_reset
PHY's behave differently when being reset. Some reset registers to defaults, some don't. Some trigger an autoneg restart, some don't. So let's also set the autoneg restart bit when resetting. Then PHY behavior should be more consistent. Clearing BMCR_ISOLATE serves the same purpose and is borrowed from genphy_restart_aneg. BMCR holds the speed / duplex settings in fixed mode. Therefore we may have an issue if a soft reset resets BMCR to its default. So better call genphy_setup_forced() afterwards in fixed mode. We've seen no related complaint in the last >10 yrs, so let's treat it as an improvement. Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/phy/phy_device.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
index b9192ae92e40..f794ff3a10c2 100644
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
@@ -1815,13 +1815,25 @@ EXPORT_SYMBOL(genphy_read_status);
1815 */ 1815 */
1816int genphy_soft_reset(struct phy_device *phydev) 1816int genphy_soft_reset(struct phy_device *phydev)
1817{ 1817{
1818 u16 res = BMCR_RESET;
1818 int ret; 1819 int ret;
1819 1820
1820 ret = phy_set_bits(phydev, MII_BMCR, BMCR_RESET); 1821 if (phydev->autoneg == AUTONEG_ENABLE)
1822 res |= BMCR_ANRESTART;
1823
1824 ret = phy_modify(phydev, MII_BMCR, BMCR_ISOLATE, res);
1821 if (ret < 0) 1825 if (ret < 0)
1822 return ret; 1826 return ret;
1823 1827
1824 return phy_poll_reset(phydev); 1828 ret = phy_poll_reset(phydev);
1829 if (ret)
1830 return ret;
1831
1832 /* BMCR may be reset to defaults */
1833 if (phydev->autoneg == AUTONEG_DISABLE)
1834 ret = genphy_setup_forced(phydev);
1835
1836 return ret;
1825} 1837}
1826EXPORT_SYMBOL(genphy_soft_reset); 1838EXPORT_SYMBOL(genphy_soft_reset);
1827 1839