[PATCH 21/27] UBUNTU: SAUCE: net/phy: abort genphy_read_status when link changes during speed and duplex reading

Madalin Bucur bcollins at ubuntu.com
Mon Jun 11 23:02:47 UTC 2012


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

This patch is being maintained and will eventually be merged upstream by
Freescale directly. The powerpc-e500mc flavour uses this.

Signed-off-by: Madalin Bucur <madalin.bucur at freescale.com>
Signed-off-by: Ben Collins <bcollins at ubuntu.com>
---
 drivers/net/phy/phy_device.c |   10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
index f53bc32..163e1e7 100644
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
@@ -808,6 +808,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.9.5





More information about the kernel-team mailing list