net: phy: clear phydev->suspended after soft reset
authorHeiner Kallweit <hkallweit1@gmail.com>
Thu, 23 Apr 2020 19:38:42 +0000 (21:38 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 24 Apr 2020 23:47:51 +0000 (16:47 -0700)
If a soft reset is triggered whilst PHY is in power-down, then
phydev->suspended will remain set. Seems we didn't face any issue yet
caused by this, but better reset the suspended flag after soft reset.

See also the following from 22.2.4.1.1
Resetting a PHY is accomplished by setting bit 0.15 to a logic one.
This action shall set the status and control registers to their default
states.

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/phy/phy_device.c

index c8f8fd9..7e1ddd5 100644 (file)
@@ -1082,8 +1082,12 @@ int phy_init_hw(struct phy_device *phydev)
        if (!phydev->drv)
                return 0;
 
-       if (phydev->drv->soft_reset)
+       if (phydev->drv->soft_reset) {
                ret = phydev->drv->soft_reset(phydev);
+               /* see comment in genphy_soft_reset for an explanation */
+               if (!ret)
+                       phydev->suspended = 0;
+       }
 
        if (ret < 0)
                return ret;
@@ -2157,6 +2161,12 @@ int genphy_soft_reset(struct phy_device *phydev)
        if (ret < 0)
                return ret;
 
+       /* Clause 22 states that setting bit BMCR_RESET sets control registers
+        * to their default value. Therefore the POWER DOWN bit is supposed to
+        * be cleared after soft reset.
+        */
+       phydev->suspended = 0;
+
        ret = phy_poll_reset(phydev);
        if (ret)
                return ret;