Commit 4950c2ba authored by Heiner Kallweit's avatar Heiner Kallweit Committed by David S. Miller

net: phy: fix autoneg mismatch case in genphy_read_status

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: b6163f19 ("net: phy: improve genphy_read_status")
Signed-off-by: default avatarHeiner Kallweit <hkallweit1@gmail.com>
Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 49ffba36
...@@ -1723,10 +1723,8 @@ int genphy_update_link(struct phy_device *phydev) ...@@ -1723,10 +1723,8 @@ int genphy_update_link(struct phy_device *phydev)
if (status < 0) if (status < 0)
return status; return status;
if ((status & BMSR_LSTATUS) == 0) phydev->link = status & BMSR_LSTATUS ? 1 : 0;
phydev->link = 0; phydev->autoneg_complete = status & BMSR_ANEGCOMPLETE ? 1 : 0;
else
phydev->link = 1;
return 0; return 0;
} }
...@@ -1757,7 +1755,7 @@ int genphy_read_status(struct phy_device *phydev) ...@@ -1757,7 +1755,7 @@ int genphy_read_status(struct phy_device *phydev)
linkmode_zero(phydev->lp_advertising); 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, if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
phydev->supported) || phydev->supported) ||
linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
......
...@@ -390,6 +390,7 @@ struct phy_device { ...@@ -390,6 +390,7 @@ struct phy_device {
unsigned autoneg:1; unsigned autoneg:1;
/* The most recently read link state */ /* The most recently read link state */
unsigned link:1; unsigned link:1;
unsigned autoneg_complete:1;
/* Interrupts are enabled */ /* Interrupts are enabled */
unsigned interrupts:1; unsigned interrupts:1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment