OSDN Git Service

Merge branch 'broadcom-MDIO-turn-around'
authorDavid S. Miller <davem@davemloft.net>
Thu, 11 Jun 2015 07:32:21 +0000 (00:32 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 11 Jun 2015 07:32:21 +0000 (00:32 -0700)
Florian Fainelli says:

====================
net: broadcom MDIO support for broken turn-around

These two patches update the GENET and UniMAC MDIO controllers to deal with
PHYs that are known to have a broken turn-around bug (e.g: BCM53125 and others)

This utilizes the infrastructure that code recently added to do that in 'net-next'.

Note that the changes look nearly identical and I will try to address the MDIO
code duplication between GENET and UniMAC in a future patch series.

Changes in v2:
- remove brcmphy.h include in mdio-bcm-unimac.c
- use the same comment as with GENET's MDIO read function
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/genet/bcmmii.c
drivers/net/phy/mdio-bcm-unimac.c

index 420949c..6bef04e 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;
index 414fdf1..fc7abc5 100644 (file)
@@ -81,7 +81,13 @@ static int unimac_mdio_read(struct mii_bus *bus, int phy_id, int reg)
                return -ETIMEDOUT;
 
        cmd = __raw_readl(priv->base + MDIO_CMD);
-       if (cmd & 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) && (cmd & MDIO_READ_FAIL))
                return -EIO;
 
        return cmd & 0xffff;