net/phy: tune get_phy_c45_ids to support more c45 phy
authorShengzhou Liu <Shengzhou.Liu@freescale.com>
Fri, 26 Jun 2015 09:58:52 +0000 (17:58 +0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 29 Jun 2015 00:05:58 +0000 (17:05 -0700)
As some C45 10G PHYs(e.g. Cortina CS4315/CS4340 PHY) have
zero Devices In package, current driver can't get correct
devices_in_package value by non-zero Devices In package.
so let's probe more with zero Devices In package to support
more C45 PHYs.

Signed-off-by: Shengzhou Liu <Shengzhou.Liu@freescale.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/phy/phy_device.c

index d551df6..0302483 100644 (file)
@@ -230,7 +230,7 @@ static int get_phy_c45_ids(struct mii_bus *bus, int addr, u32 *phy_id,
        for (i = 1;
             i < num_ids && c45_ids->devices_in_package == 0;
             i++) {
-               reg_addr = MII_ADDR_C45 | i << 16 | MDIO_DEVS2;
+retry:         reg_addr = MII_ADDR_C45 | i << 16 | MDIO_DEVS2;
                phy_reg = mdiobus_read(bus, addr, reg_addr);
                if (phy_reg < 0)
                        return -EIO;
@@ -242,12 +242,20 @@ static int get_phy_c45_ids(struct mii_bus *bus, int addr, u32 *phy_id,
                        return -EIO;
                c45_ids->devices_in_package |= (phy_reg & 0xffff);
 
-               /* If mostly Fs, there is no device there,
-                * let's get out of here.
-                */
                if ((c45_ids->devices_in_package & 0x1fffffff) == 0x1fffffff) {
-                       *phy_id = 0xffffffff;
-                       return 0;
+                       if (i) {
+                               /*  If mostly Fs, there is no device there,
+                                *  then let's continue to probe more, as some
+                                *  10G PHYs have zero Devices In package,
+                                *  e.g. Cortina CS4315/CS4340 PHY.
+                                */
+                               i = 0;
+                               goto retry;
+                       } else {
+                               /* no device there, let's get out of here */
+                               *phy_id = 0xffffffff;
+                               return 0;
+                       }
                }
        }