The link status register latches link-down events. Therefore, if link
is reported as being up, there's no need for a second read.

Signed-off-by: Heiner Kallweit <hkallwe...@gmail.com>
---
 drivers/net/phy/phy-c45.c    | 2 ++
 drivers/net/phy/phy_device.c | 6 +++++-
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/drivers/net/phy/phy-c45.c b/drivers/net/phy/phy-c45.c
index d429c6a3e..19334fe5f 100644
--- a/drivers/net/phy/phy-c45.c
+++ b/drivers/net/phy/phy-c45.c
@@ -147,6 +147,8 @@ int genphy_c45_read_link(struct phy_device *phydev)
                        val = phy_read_mmd(phydev, devad, MDIO_STAT1);
                        if (val < 0)
                                return val;
+                       else if (val & MDIO_STAT1_LSTATUS)
+                               continue;
                }
 
                val = phy_read_mmd(phydev, devad, MDIO_STAT1);
diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
index d490cd2a8..9369e1323 100644
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
@@ -1735,8 +1735,12 @@ int genphy_update_link(struct phy_device *phydev)
         */
        if (!phy_polling_mode(phydev)) {
                status = phy_read(phydev, MII_BMSR);
-               if (status < 0)
+               if (status < 0) {
                        return status;
+               } else if (status & BMSR_LSTATUS) {
+                       phydev->link = 1;
+                       return 0;
+               }
        }
 
        /* Read link and autonegotiation status */
-- 
2.20.1

Reply via email to