All checks were successful
target_linux_generic / Update target_linux_generic (openwrt-25.12) (push) Successful in 8s
46 lines
1.9 KiB
Diff
46 lines
1.9 KiB
Diff
From b4d5cd20507b252c746fa6971d82ac96f3b3e5b7 Mon Sep 17 00:00:00 2001
|
|
From: Christian Marangi <ansuelsmth@gmail.com>
|
|
Date: Sat, 23 Aug 2025 15:44:29 +0200
|
|
Subject: net: phy: as21xxx: better handle PHY HW reset on soft-reboot
|
|
|
|
On soft-reboot, with a reset GPIO defined for an Aeonsemi PHY, the
|
|
special match_phy_device fails to correctly identify that the PHY
|
|
needs to load the firmware again.
|
|
|
|
This is caused by the fact that PHY ID is read BEFORE the PHY reset
|
|
GPIO (if present) is asserted, so we can be in the scenario where the
|
|
phydev have the previous PHY ID (with the PHY firmware loaded) but
|
|
after reset the generic AS21xxx PHY is present in the PHY ID registers.
|
|
|
|
To better handle this, skip reading the PHY ID register only for the PHY
|
|
that are not AS21xxx (by matching for the Aeonsemi Vendor) and always
|
|
read the PHY ID for the other case to handle both firmware already
|
|
loaded or an HW reset.
|
|
|
|
Fixes: 830877d89edc ("net: phy: Add support for Aeonsemi AS21xxx PHYs")
|
|
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|
Link: https://patch.msgid.link/20250823134431.4854-2-ansuelsmth@gmail.com
|
|
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|
---
|
|
drivers/net/phy/as21xxx.c | 7 ++++---
|
|
1 file changed, 4 insertions(+), 3 deletions(-)
|
|
|
|
--- a/drivers/net/phy/as21xxx.c
|
|
+++ b/drivers/net/phy/as21xxx.c
|
|
@@ -884,11 +884,12 @@ static int as21xxx_match_phy_device(stru
|
|
u32 phy_id;
|
|
int ret;
|
|
|
|
- /* Skip PHY that are not AS21xxx or already have firmware loaded */
|
|
- if (phydev->c45_ids.device_ids[MDIO_MMD_PCS] != PHY_ID_AS21XXX)
|
|
+ /* Skip PHY that are not AS21xxx */
|
|
+ if (!phy_id_compare_vendor(phydev->c45_ids.device_ids[MDIO_MMD_PCS],
|
|
+ PHY_VENDOR_AEONSEMI))
|
|
return genphy_match_phy_device(phydev, phydrv);
|
|
|
|
- /* Read PHY ID to handle firmware just loaded */
|
|
+ /* Read PHY ID to handle firmware loaded or HW reset */
|
|
ret = phy_read_mmd(phydev, MDIO_MMD_PCS, MII_PHYSID1);
|
|
if (ret < 0)
|
|
return ret;
|