summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarshal Gohel2025-06-17 13:03:47 +0000
committerRobert Marko2025-07-30 10:48:26 +0000
commitd802e6310a013a4255392c73967a243a773c8799 (patch)
treec41ce9f2e2e075b5580c5e70b5b34cabdc64cc6c
parent848887b491fdb252ac888c353c4d8fef38b6b741 (diff)
downloadopenwrt-d802e6310a013a4255392c73967a243a773c8799.tar.gz
realtek: rtl931x: Support enable/disable SMI Polling for SerDes ports
During PHY matching, the SMI polling must be disabled to avoid conflicts during the complex detection routine. Only after this finished, SMI polling is allowed again. This was implemented for all realtek families besides RTL931x. Signed-off-by: Harshal Gohel <hg@simonwunderlich.de> Signed-off-by: Sharadanand Karanjkar <sk@simonwunderlich.de> Link: https://github.com/openwrt/openwrt/pull/19603 Signed-off-by: Robert Marko <robimarko@gmail.com>
-rw-r--r--target/linux/realtek/files-6.12/drivers/net/phy/rtl83xx-phy.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/target/linux/realtek/files-6.12/drivers/net/phy/rtl83xx-phy.c b/target/linux/realtek/files-6.12/drivers/net/phy/rtl83xx-phy.c
index 65e7e12117..85399151db 100644
--- a/target/linux/realtek/files-6.12/drivers/net/phy/rtl83xx-phy.c
+++ b/target/linux/realtek/files-6.12/drivers/net/phy/rtl83xx-phy.c
@@ -120,7 +120,10 @@ static u64 disable_polling(int port)
sw_w32_mask(BIT(port), 0, RTL930X_SMI_POLL_CTRL);
break;
case RTL9310_FAMILY_ID:
- pr_warn("%s not implemented for RTL931X\n", __func__);
+ saved_state = sw_r32(RTL931X_SMI_PORT_POLLING_CTRL + 4);
+ saved_state <<= 32;
+ saved_state |= sw_r32(RTL931X_SMI_PORT_POLLING_CTRL);
+ sw_w32_mask(BIT(port % 32), 0, RTL931X_SMI_PORT_POLLING_CTRL + ((port >> 5) << 2));
break;
}
@@ -145,7 +148,8 @@ static int resume_polling(u64 saved_state)
sw_w32(saved_state, RTL930X_SMI_POLL_CTRL);
break;
case RTL9310_FAMILY_ID:
- pr_warn("%s not implemented for RTL931X\n", __func__);
+ sw_w32(saved_state >> 32, RTL931X_SMI_PORT_POLLING_CTRL + 4);
+ sw_w32(saved_state, RTL931X_SMI_PORT_POLLING_CTRL);
break;
}