[openwrt/openwrt] realtek: pcs: rtl931x: streamline hardware mode setting

LEDE Commits lede-commits at lists.infradead.org
Mon Dec 29 08:06:31 PST 2025


robimarko pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/9efcc52a7bf61a3728ffb87f54c03ca1e8840c66

commit 9efcc52a7bf61a3728ffb87f54c03ca1e8840c66
Author: Jonas Jelonek <jelonek.jonas at gmail.com>
AuthorDate: Sat Dec 20 23:34:10 2025 +0000

    realtek: pcs: rtl931x: streamline hardware mode setting
    
    The SDK and our code for finally applying the hardware mode are quite
    confusing. There are two different "places" where a mode can be set,
    in a SerDes register and in a global SerDes mode register. Neither the
    SDK nor any of the datasheet/documentation serve any explanation for
    that. The functions are just named "fiber_mode_set" and "mii_mode_set"
    which is basically as useless as it can be to understand it.
    
    Try to get rid off this confusion by naming the functions
    'sds_set_mac_mode' and 'sds_set_ip_mode' to make clear where the mode
    is set. While at it, also clarify the naming of 'config_mode' by
    renaming it to 'config_hw_mode'.
    
    The naming is based on the following assumption:
    
    > Realtek uses an SerDes IP core design (probably from another vendor)
    > in their switch. This supports a variety of modes and must be
    > configured properly for each mode. Usually, changing the mode in the
    > MAC's registers triggers a proper configuration of the SerDes IP block
    > in the background.
    
    > However, for some modes this seems to be incomplete, at least missing
    > important parts so it doesn't work on its own in the end. In this
    > case, the SerDes IP block needs to be configured manually with the
    > missing bits to make it work.
    
    There are several places in the SDK that support this assumption, both
    for RTL931X and RTL930X (as they are somewhat similar), e.g. [1].
    
    [1] https://github.com/plappermaul/realtek-doc/blob/f7f85ffc14c6e575ad94f2b427106de533b888fe/sources/rtk-dms1250/src/dal/longan/dal_longan_sds.c#L1746
    
    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      | 29 +++++++++++++++-------
 1 file changed, 20 insertions(+), 9 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 21ff31371d..a28b01d59f 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
@@ -2377,7 +2377,12 @@ static int rtpcs_931x_sds_power(struct rtpcs_serdes *sds, bool power_on)
 				 BIT(sds->id), en_val);
 }
 
-static int rtpcs_931x_sds_mii_mode_set(struct rtpcs_serdes *sds,
+/*
+ * rtpcs_931x_sds_set_mac_mode
+ *
+ * Set the SerDes mode in the MAC's registers.
+ */
+static int rtpcs_931x_sds_set_mac_mode(struct rtpcs_serdes *sds,
 				       enum rtpcs_sds_mode hw_mode)
 {
 	u32 mode_val;
@@ -2417,14 +2422,19 @@ static int rtpcs_931x_sds_mii_mode_set(struct rtpcs_serdes *sds,
 				 0xff << shift, mode_val << shift);
 }
 
-static int rtpcs_931x_sds_fiber_mode_set(struct rtpcs_serdes *sds,
-					 enum rtpcs_sds_mode hw_mode)
+/*
+ * rtpcs_931x_sds_set_ip_mode
+ *
+ * Set the SerDes mode in the SerDes IP block's registers.
+ */
+static int rtpcs_931x_sds_set_ip_mode(struct rtpcs_serdes *sds,
+				      enum rtpcs_sds_mode hw_mode)
 {
 	u32 mode_val;
 
 	/* clear symbol error count before changing mode */
 	rtpcs_931x_sds_clear_symerr(sds, hw_mode);
-	rtpcs_931x_sds_mii_mode_set(sds, RTPCS_SDS_MODE_OFF);
+	rtpcs_931x_sds_set_mac_mode(sds, RTPCS_SDS_MODE_OFF);
 
 	switch (hw_mode) {
 	case RTPCS_SDS_MODE_OFF:
@@ -2735,8 +2745,9 @@ static int rtpcs_931x_sds_config_fiber_1g(struct rtpcs_serdes *sds)
 	return 0;
 }
 
-static int rtpcs_931x_sds_config_mode(struct rtpcs_serdes *sds,
-				      enum rtpcs_sds_mode hw_mode, int chiptype)
+static int rtpcs_931x_sds_config_hw_mode(struct rtpcs_serdes *sds,
+					 enum rtpcs_sds_mode hw_mode,
+					 int chiptype)
 {
 	struct rtpcs_serdes *even_sds = rtpcs_sds_get_even(sds);
 
@@ -2912,7 +2923,7 @@ static int rtpcs_931x_setup_serdes(struct rtpcs_serdes *sds,
 		return -ENOTSUPP;
 	}
 
-	ret = rtpcs_931x_sds_config_mode(sds, hw_mode, chiptype);
+	ret = rtpcs_931x_sds_config_hw_mode(sds, hw_mode, chiptype);
 	if (ret < 0)
 		return ret;
 
@@ -2945,9 +2956,9 @@ static int rtpcs_931x_setup_serdes(struct rtpcs_serdes *sds,
 	    mode == PHY_INTERFACE_MODE_SGMII ||
 	    mode == PHY_INTERFACE_MODE_USXGMII) {
 		if (mode == PHY_INTERFACE_MODE_XGMII)
-			ret = rtpcs_931x_sds_mii_mode_set(sds, hw_mode);
+			ret = rtpcs_931x_sds_set_mac_mode(sds, hw_mode);
 		else
-			ret = rtpcs_931x_sds_fiber_mode_set(sds, hw_mode);
+			ret = rtpcs_931x_sds_set_ip_mode(sds, hw_mode);
 	}
 
 	if (ret < 0)




More information about the lede-commits mailing list