]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
drivers: net: phy: Ignore PHY ID 0 during PHY probing
authorAlex Marginean <alexm.osslist@gmail.com>
Fri, 5 Jul 2019 09:28:55 +0000 (12:28 +0300)
committerJoe Hershberger <joe.hershberger@ni.com>
Thu, 18 Jul 2019 21:37:13 +0000 (16:37 -0500)
Current code fails to probe some C45 PHYs that also respond to C22 reads.
This is the case for PHYs like Aquantia AQR112, Marvell 88X2242 (as
previously posted on the u-boot list).
If the PHY ID reads all 0s just ignore it and try the next devad.

Signed-off-by: Alex Marginean <alexm.osslist@gmail.com>
Reviewed-By: Ramon Fried <rfried.dev@gmail.com>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Acked-by: Joe Hershberger <joe.hershberger@ni.com>
drivers/net/phy/phy.c

index c1c1af9abdbe9a8a60c4de06bfea921fd6b3df12..ae37dd6c1e37cd4e5c736a7bcff94b60d7069627 100644 (file)
@@ -727,12 +727,23 @@ static struct phy_device *create_phy_by_mask(struct mii_dev *bus,
        while (phy_mask) {
                int addr = ffs(phy_mask) - 1;
                int r = get_phy_id(bus, addr, devad, &phy_id);
+
+               /*
+                * If the PHY ID is flat 0 we ignore it.  There are C45 PHYs
+                * that return all 0s for C22 reads (like Aquantia AQR112) and
+                * there are C22 PHYs that return all 0s for C45 reads (like
+                * Atheros AR8035).
+                */
+               if (r == 0 && phy_id == 0)
+                       goto next;
+
                /* If the PHY ID is mostly f's, we didn't find anything */
                if (r == 0 && (phy_id & 0x1fffffff) != 0x1fffffff) {
                        is_c45 = (devad == MDIO_DEVAD_NONE) ? false : true;
                        return phy_device_create(bus, addr, phy_id, is_c45,
                                                 interface);
                }
+next:
                phy_mask &= ~(1 << addr);
        }
        return NULL;