]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
realtek: rtl931x: Support enable/disable SMI Polling for SerDes ports 19603/head
authorHarshal Gohel <hg@simonwunderlich.de>
Tue, 17 Jun 2025 13:03:47 +0000 (13:03 +0000)
committerRobert Marko <robimarko@gmail.com>
Wed, 30 Jul 2025 10:48:26 +0000 (12:48 +0200)
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>
target/linux/realtek/files-6.12/drivers/net/phy/rtl83xx-phy.c

index 65e7e12117ec2d8be501c60a9135acc8d0132578..85399151dbe282b1cc1e9ab95c744fd996b75c4a 100644 (file)
@@ -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;
        }