If the link changes during speed and duplex reading the values may be out of sync;
abort the update if the link state changes during the read
Signed-off-by: Madalin Bucur <redacted>
---
drivers/net/phy/phy_device.c | 10 ++++++++++
1 files changed, 10 insertions(+), 0 deletions(-)
diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
index a1e132c..e88f49a 100644
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
@@ -824,6 +824,16 @@ int genphy_read_status(struct phy_device *phydev)
lpa &= adv;
+ err = phy_read(phydev, MII_BMSR);
+
+ if (err < 0)
+ return err;
+
+ /* if the link changed while reading speed and duplex
+ * abort the speed and duplex update */
+ if (((err & BMSR_LSTATUS) == 0) != (phydev->link == 0))
+ return 0;
+
phydev->speed = SPEED_10;
phydev->duplex = DUPLEX_HALF;
phydev->pause = phydev->asym_pause = 0;
--
1.7.0.1