|
|
@@ -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;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|