[openwrt/openwrt] realtek: pcs: rtl931x: fix SerDes mode application
LEDE Commits
lede-commits at lists.infradead.org
Mon Dec 29 08:06:32 PST 2025
robimarko pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/a0805af66c6aa6106ff04ffdd6b190623fd80a7e
commit a0805af66c6aa6106ff04ffdd6b190623fd80a7e
Author: Jonas Jelonek <jelonek.jonas at gmail.com>
AuthorDate: Sat Dec 20 23:53:20 2025 +0000
realtek: pcs: rtl931x: fix SerDes mode application
The SerDes mode setting at the end of rtpcs_931x_setup_serdes is
currently broken although it is mostly similar to what the SDK does [1].
It prevents several modes from being set, especially fiber modes. This
seems to be one (if not the only) issue for currently missing SFP
support.
Add a small helper function which takes cares of setting the mode, to
keep the still valid different procedure when using XSGMII mode. Only
this helper is called in rtpcs_931x_setup_serdes to keep it clean there.
As a functional change, call mode application in every case, not just
for SGMII, QSGMII and USXGMII. We can assume the SDK is misleading in
this case, either accidentially or on purpose. This makes SFP modules
work in theory. In practice, there still seem to be device-specific
issues which need to be fixed later. These issues may include no link
detection or link flapping.
[1] https://github.com/plappermaul/realtek-doc/blob/f7f85ffc14c6e575ad94f2b427106de533b888fe/sources/rtk-dms1250/src/dal/mango/dal_mango_construct.c#L2266
Signed-off-by: Jonas Jelonek <jelonek.jonas at gmail.com>
Link: https://github.com/openwrt/openwrt/pull/20736
Signed-off-by: Robert Marko <robimarko at gmail.com>
---
.../files-6.12/drivers/net/pcs/pcs-rtl-otto.c | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/target/linux/realtek/files-6.12/drivers/net/pcs/pcs-rtl-otto.c b/target/linux/realtek/files-6.12/drivers/net/pcs/pcs-rtl-otto.c
index a28b01d59f..e00e19b1f3 100644
--- a/target/linux/realtek/files-6.12/drivers/net/pcs/pcs-rtl-otto.c
+++ b/target/linux/realtek/files-6.12/drivers/net/pcs/pcs-rtl-otto.c
@@ -2476,6 +2476,15 @@ static int rtpcs_931x_sds_set_ip_mode(struct rtpcs_serdes *sds,
return rtpcs_sds_write_bits(sds, 0x1f, 0x9, 11, 6, mode_val);
}
+static int rtpcs_931x_sds_set_mode(struct rtpcs_serdes *sds,
+ enum rtpcs_sds_mode hw_mode)
+{
+ if (hw_mode == RTPCS_SDS_MODE_XSGMII)
+ return rtpcs_931x_sds_set_mac_mode(sds, hw_mode);
+ else
+ return rtpcs_931x_sds_set_ip_mode(sds, hw_mode);
+}
+
static void rtpcs_931x_sds_reset(struct rtpcs_serdes *sds)
{
struct rtpcs_ctrl *ctrl = sds->ctrl;
@@ -2951,16 +2960,7 @@ static int rtpcs_931x_setup_serdes(struct rtpcs_serdes *sds,
rtpcs_931x_sds_power(sds, true);
- if (mode == PHY_INTERFACE_MODE_XGMII ||
- mode == PHY_INTERFACE_MODE_QSGMII ||
- mode == PHY_INTERFACE_MODE_SGMII ||
- mode == PHY_INTERFACE_MODE_USXGMII) {
- if (mode == PHY_INTERFACE_MODE_XGMII)
- ret = rtpcs_931x_sds_set_mac_mode(sds, hw_mode);
- else
- ret = rtpcs_931x_sds_set_ip_mode(sds, hw_mode);
- }
-
+ ret = rtpcs_931x_sds_set_mode(sds, hw_mode);
if (ret < 0)
return ret;
More information about the lede-commits
mailing list