]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
net: phy: fix autoneg mismatch case in genphy_read_status
authorHeiner Kallweit <hkallweit1@gmail.com>
Tue, 2 Apr 2019 18:43:30 +0000 (20:43 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 4 Apr 2019 04:47:54 +0000 (21:47 -0700)
The original patch didn't consider the case that autoneg process
finishes successfully but both link partners have no mode in common.
In this case there's no link, nevertheless we may be interested in
what the link partner advertised.

Like phydev->link we set phydev->autoneg_complete in
genphy_update_link() and use the stored value in genphy_read_status().
This way we don't have to read register BMSR again.

Fixes: b6163f194c69 ("net: phy: improve genphy_read_status")
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/phy/phy_device.c
include/linux/phy.h

index 67fc581e359838da28bb5d6b4fd1ff21fbafbe39..72fc714c9427c43b8832eda4f15954078c41cb71 100644 (file)
@@ -1723,10 +1723,8 @@ int genphy_update_link(struct phy_device *phydev)
        if (status < 0)
                return status;
 
-       if ((status & BMSR_LSTATUS) == 0)
-               phydev->link = 0;
-       else
-               phydev->link = 1;
+       phydev->link = status & BMSR_LSTATUS ? 1 : 0;
+       phydev->autoneg_complete = status & BMSR_ANEGCOMPLETE ? 1 : 0;
 
        return 0;
 }
@@ -1757,7 +1755,7 @@ int genphy_read_status(struct phy_device *phydev)
 
        linkmode_zero(phydev->lp_advertising);
 
-       if (phydev->autoneg == AUTONEG_ENABLE && phydev->link) {
+       if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) {
                if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
                                      phydev->supported) ||
                    linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
index ad88f063e50f473616833a427f6211415923dc73..ab7439b3da2bd8c651f5d53bf67f41e87039e497 100644 (file)
@@ -390,6 +390,7 @@ struct phy_device {
        unsigned autoneg:1;
        /* The most recently read link state */
        unsigned link:1;
+       unsigned autoneg_complete:1;
 
        /* Interrupts are enabled */
        unsigned interrupts:1;