[U-Boot] [PATCH v2] drivers: net: phy: Ignore PHY ID 0 during PHY probing

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 addr.
Signed-off-by: Alex Marginean alexm.osslist@gmail.com Reviewed-By: Ramon Fried rfried.dev@gmail.com ---
Changes in v2: - continue with next addr instead of returning NULL right away - check get_phy_id return code too
drivers/net/phy/phy.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index c1c1af9abd..d4e7556e6f 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c @@ -727,12 +727,22 @@ 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;

On Fri, Jul 5, 2019 at 4:38 PM Alex Marginean alexm.osslist@gmail.com wrote:
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 addr.
Signed-off-by: Alex Marginean alexm.osslist@gmail.com Reviewed-By: Ramon Fried rfried.dev@gmail.com
Changes in v2: - continue with next addr instead of returning NULL right away - check get_phy_id return code too
drivers/net/phy/phy.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index c1c1af9abd..d4e7556e6f 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c @@ -727,12 +727,22 @@ 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
nits: missing the changes to the comment format :)
* 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;
Other than above, Reviewed-by: Bin Meng bmeng.cn@gmail.com
Regards, Bin
participants (2)
-
Alex Marginean
-
Bin Meng