From f6c27b22f6f84b13ad230dcf3afa7f11efe7a8bc Mon Sep 17 00:00:00 2001 From: Daniel Golle Date: Sat, 2 Mar 2024 04:48:08 +0000 Subject: [PATCH] generic: 6.6: fix realtek PHY detection patch Avoid crashing the kernel when trying to detect early versions of RealTek RTL8221B 2.5G Ethernet PHY. Signed-off-by: Daniel Golle --- ...tek-detect-early-version-of-RTL8221B.patch | 43 +++++++++++++++---- ...ealtek-support-interrupt-of-RTL8221B.patch | 4 +- 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/target/linux/generic/pending-6.6/730-net-phy-realtek-detect-early-version-of-RTL8221B.patch b/target/linux/generic/pending-6.6/730-net-phy-realtek-detect-early-version-of-RTL8221B.patch index 2a8e742a7408..1d30a1965474 100644 --- a/target/linux/generic/pending-6.6/730-net-phy-realtek-detect-early-version-of-RTL8221B.patch +++ b/target/linux/generic/pending-6.6/730-net-phy-realtek-detect-early-version-of-RTL8221B.patch @@ -1,4 +1,4 @@ -From 0de82310d2b32e78ff79d42c08b1122a6ede3778 Mon Sep 17 00:00:00 2001 +From e52faf1564a8bcaf866f9a6c7bf0e8a8748afb15 Mon Sep 17 00:00:00 2001 From: Daniel Golle Date: Sun, 30 Apr 2023 00:15:41 +0100 Subject: [PATCH] net: phy: realtek: detect early version of RTL8221B @@ -10,11 +10,22 @@ Implement custom identify function using the PKGID instead of iterating over the implemented MMDs. Signed-off-by: Daniel Golle +--- + drivers/net/phy/realtek.c | 50 ++++++++++++++++++++++++++++++++++++++- + 1 file changed, 49 insertions(+), 1 deletion(-) --- a/drivers/net/phy/realtek.c +++ b/drivers/net/phy/realtek.c -@@ -782,6 +782,38 @@ static int rtl8226_match_phy_device(stru - rtlgen_supports_2_5gbps(phydev); +@@ -81,6 +81,7 @@ + + #define RTL_GENERIC_PHYID 0x001cc800 + #define RTL_8211FVD_PHYID 0x001cc878 ++#define RTL_8221B_VB_CG 0x001cc849 + + MODULE_DESCRIPTION("Realtek PHY driver"); + MODULE_AUTHOR("Johnson Leung"); +@@ -801,6 +802,54 @@ static int rtl822x_probe(struct phy_devi + return 0; } +static int rtl8221b_vb_cg_match_phy_device(struct phy_device *phydev) @@ -22,7 +33,15 @@ Signed-off-by: Daniel Golle + int val; + u32 id; + -+ if (phydev->drv->read_mmd) { ++ if (phydev->is_c45) { ++ if (phydev->c45_ids.device_ids[1]) ++ return phydev->c45_ids.device_ids[1] == RTL_8221B_VB_CG; ++ } else { ++ if (phydev->phy_id) ++ return phydev->phy_id == RTL_8221B_VB_CG; ++ } ++ ++ if (phydev->mdio.bus->read_c45) { + val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PKGID1); + if (val < 0) + return 0; @@ -46,13 +65,21 @@ Signed-off-by: Daniel Golle + id |= val; + } + -+ return (id == 0x001cc849); ++ if (id != RTL_8221B_VB_CG) ++ return 0; ++ ++ if (phydev->is_c45) ++ phydev->c45_ids.device_ids[1] = id; ++ else ++ phydev->phy_id = id; ++ ++ return 1; +} + - static int rtl822x_probe(struct phy_device *phydev) + static int rtlgen_resume(struct phy_device *phydev) { - struct device *dev = &phydev->mdio.dev; -@@ -1134,7 +1166,7 @@ static struct phy_driver realtek_drvs[] + int ret = genphy_resume(phydev); +@@ -1134,7 +1183,7 @@ static struct phy_driver realtek_drvs[] .write_page = rtl821x_write_page, .soft_reset = genphy_soft_reset, }, { diff --git a/target/linux/generic/pending-6.6/741-net-phy-realtek-support-interrupt-of-RTL8221B.patch b/target/linux/generic/pending-6.6/741-net-phy-realtek-support-interrupt-of-RTL8221B.patch index 3c68bf8bbd0b..aab0d3f7d502 100644 --- a/target/linux/generic/pending-6.6/741-net-phy-realtek-support-interrupt-of-RTL8221B.patch +++ b/target/linux/generic/pending-6.6/741-net-phy-realtek-support-interrupt-of-RTL8221B.patch @@ -1,6 +1,6 @@ --- a/drivers/net/phy/realtek.c +++ b/drivers/net/phy/realtek.c -@@ -1009,6 +1009,51 @@ static int rtl8221b_config_init(struct p +@@ -1026,6 +1026,51 @@ static int rtl8221b_config_init(struct p return 0; } @@ -52,7 +52,7 @@ static struct phy_driver realtek_drvs[] = { { PHY_ID_MATCH_EXACT(0x00008201), -@@ -1171,6 +1216,8 @@ static struct phy_driver realtek_drvs[] +@@ -1188,6 +1233,8 @@ static struct phy_driver realtek_drvs[] .get_features = rtl822x_get_features, .config_init = rtl8221b_config_init, .config_aneg = rtl822x_config_aneg, -- 2.30.2