net: bcmgenet: handle broken turn-around for specific PHYs
authorFlorian Fainelli <f.fainelli@gmail.com>
Wed, 10 Jun 2015 19:24:10 +0000 (12:24 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 11 Jun 2015 07:32:20 +0000 (00:32 -0700)
Some Ethernet PHYs/switches such as Broadcom's BCM53125 have a hardware
bug which makes them not release the MDIO line during turn-around time.
This gets flagged by the GENET MDIO controller as a read failure, and we
fail the read transaction.

Check the MDIO bus phy_ignore_ta_mask bitmask for the PHY we are reading
from and if it is listed in this bitmask, ignore the read failure and
proceed with returning the data we read out of the controller.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/genet/bcmmii.c

index 420949cc55aab6349b75c33f0c4f061aa384d537..6bef04e2f7354b2a9cadeac7eda5ea66e2fd25da 100644 (file)
@@ -47,7 +47,12 @@ static int bcmgenet_mii_read(struct mii_bus *bus, int phy_id, int location)
                           HZ / 100);
        ret = bcmgenet_umac_readl(priv, UMAC_MDIO_CMD);
 
-       if (ret & MDIO_READ_FAIL)
+       /* Some broken devices are known not to release the line during
+        * turn-around, e.g: Broadcom BCM53125 external switches, so check for
+        * that condition here and ignore the MDIO controller read failure
+        * indication.
+        */
+       if (!(bus->phy_ignore_ta_mask & 1 << phy_id) && (ret & MDIO_READ_FAIL))
                return -EIO;
 
        return ret & 0xffff;