mdio: Check MDIO_STAT1_FAULT in mdio45_links_ok()
authorBen Hutchings <bhutchings@solarflare.com>
Wed, 26 Aug 2009 08:16:58 +0000 (08:16 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 27 Aug 2009 00:38:53 +0000 (17:38 -0700)
Some PHYs will report that the link is up even though there is a fault
condition.  Therefore, check the fault flag too.  We must also read
STAT2 to reset this flag.

Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/mdio.c

index 6851bdb2ce29957b2293e4bb59e7bb1b37e6ae4c..7d2e610f14ff4daf57eb1a175f6abefa99cae0a8 100644 (file)
@@ -109,13 +109,20 @@ int mdio45_links_ok(const struct mdio_if_info *mdio, u32 mmd_mask)
                if (mmd_mask & (1 << devad)) {
                        mmd_mask &= ~(1 << devad);
 
-                       /* Read twice because link state is latched and a
-                        * read moves the current state into the register */
+                       /* Reset the latched status and fault flags */
                        mdio->mdio_read(mdio->dev, mdio->prtad,
                                        devad, MDIO_STAT1);
+                       if (devad == MDIO_MMD_PMAPMD || devad == MDIO_MMD_PCS ||
+                           devad == MDIO_MMD_PHYXS || devad == MDIO_MMD_DTEXS)
+                               mdio->mdio_read(mdio->dev, mdio->prtad,
+                                               devad, MDIO_STAT2);
+
+                       /* Check the current status and fault flags */
                        reg = mdio->mdio_read(mdio->dev, mdio->prtad,
                                              devad, MDIO_STAT1);
-                       if (reg < 0 || !(reg & MDIO_STAT1_LSTATUS))
+                       if (reg < 0 ||
+                           (reg & (MDIO_STAT1_FAULT | MDIO_STAT1_LSTATUS)) !=
+                           MDIO_STAT1_LSTATUS)
                                return false;
                }
        }