
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