[openwrt/openwrt] realtek: pcs: rtl930x: use SerDes hw mode for mode setting

LEDE Commits lede-commits at lists.infradead.org
Sun Jan 18 02:19:15 PST 2026


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

commit eba83bc57e9588b6089982ada879ec3d439ca2ba
Author: Jonas Jelonek <jelonek.jonas at gmail.com>
AuthorDate: Thu Jan 8 12:43:02 2026 +0000

    realtek: pcs: rtl930x: use SerDes hw mode for mode setting
    
    Set and configure the SerDes mode using the SerDes hardware mode types
    instead of PHY_INTERFACE_MODE_*.
    
    Signed-off-by: Jonas Jelonek <jelonek.jonas at gmail.com>
    Link: https://github.com/openwrt/openwrt/pull/21565
    Signed-off-by: Robert Marko <robimarko at gmail.com>
---
 .../files-6.12/drivers/net/pcs/pcs-rtl-otto.c      | 103 ++++++++++-----------
 1 file changed, 51 insertions(+), 52 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 ba16ccc534..e7bb408bd3 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
@@ -955,11 +955,11 @@ static void rtpcs_930x_sds_submode_set(struct rtpcs_serdes *sds,
 }
 
 static void rtpcs_930x_sds_rx_reset(struct rtpcs_serdes *sds,
-				    phy_interface_t phy_if)
+				    enum rtpcs_sds_mode hw_mode)
 {
 	int page = 0x2e; /* 10GR and USXGMII */
 
-	if (phy_if == PHY_INTERFACE_MODE_1000BASEX)
+	if (hw_mode == RTPCS_SDS_MODE_1000BASEX)
 		page = 0x24;
 
 	rtpcs_sds_write_bits(sds, page, 0x15, 4, 4, 0x1);
@@ -1100,7 +1100,7 @@ static void rtpcs_930x_sds_reconfigure_pll(struct rtpcs_serdes *sds, int pll)
 }
 
 static int rtpcs_930x_sds_config_pll(struct rtpcs_serdes *sds,
-				     phy_interface_t interface)
+				     enum rtpcs_sds_mode hw_mode)
 {
 	struct rtpcs_serdes *nb_sds = rtpcs_sds_get_neighbor(sds);
 	int neighbor_speed, neighbor_mode, neighbor_pll;
@@ -1129,12 +1129,12 @@ static int rtpcs_930x_sds_config_pll(struct rtpcs_serdes *sds,
 	neighbor_mode = rtpcs_930x_sds_get_internal_mode(nb_sds);
 	rtpcs_930x_sds_get_pll_data(nb_sds, &neighbor_pll, &neighbor_speed);
 
-	if ((interface == PHY_INTERFACE_MODE_1000BASEX) ||
-	    (interface == PHY_INTERFACE_MODE_SGMII))
+	if ((hw_mode == RTPCS_SDS_MODE_1000BASEX) ||
+	    (hw_mode == RTPCS_SDS_MODE_SGMII))
 		speed = RTSDS_930X_PLL_1000;
-	else if (interface == PHY_INTERFACE_MODE_2500BASEX)
+	else if (hw_mode == RTPCS_SDS_MODE_2500BASEX)
 		speed = RTSDS_930X_PLL_2500;
-	else if (interface == PHY_INTERFACE_MODE_10GBASER)
+	else if (hw_mode == RTPCS_SDS_MODE_10GBASER)
 		speed = RTSDS_930X_PLL_10000;
 	else
 		return -ENOTSUPP;
@@ -1159,8 +1159,8 @@ static int rtpcs_930x_sds_config_pll(struct rtpcs_serdes *sds,
 	if (speed_changed)
 		rtpcs_930x_sds_reset_cmu(sds);
 
-	pr_info("%s: SDS %d using %s PLL for %s\n", __func__, sds->id,
-		pll == RTSDS_930X_PLL_LC ? "LC" : "ring", phy_modes(interface));
+	pr_info("%s: SDS %d using %s PLL for mode %d\n", __func__, sds->id,
+		pll == RTSDS_930X_PLL_LC ? "LC" : "ring", hw_mode);
 
 	return 0;
 }
@@ -1174,11 +1174,11 @@ static void rtpcs_930x_sds_reset_state_machine(struct rtpcs_serdes *sds)
 }
 
 static int rtpcs_930x_sds_init_state_machine(struct rtpcs_serdes *sds,
-					     phy_interface_t interface)
+					     enum rtpcs_sds_mode hw_mode)
 {
 	int loopback, link, cnt = 20, ret = -EBUSY;
 
-	if (interface != PHY_INTERFACE_MODE_10GBASER)
+	if (hw_mode != RTPCS_SDS_MODE_10GBASER)
 		return 0;
 	/*
 	 * After a SerDes mode change it takes some time until the frontend state machine
@@ -1203,9 +1203,9 @@ static int rtpcs_930x_sds_init_state_machine(struct rtpcs_serdes *sds,
 }
 
 static void rtpcs_930x_sds_force_mode(struct rtpcs_serdes *sds,
-				      phy_interface_t interface)
+				      enum rtpcs_sds_mode hw_mode)
 {
-	int mode;
+	u32 mode_val;
 
 	/*
 	 * TODO: Usually one would expect that it is enough to modify the SDS_MODE_SEL_*
@@ -1214,68 +1214,67 @@ static void rtpcs_930x_sds_force_mode(struct rtpcs_serdes *sds,
 	 * if this sequence should quit early in case of errors.
 	 */
 
-	switch (interface) {
-	case PHY_INTERFACE_MODE_SGMII:
-		mode = RTL930X_SDS_MODE_SGMII;
+	switch (hw_mode) {
+	case RTPCS_SDS_MODE_SGMII:
+		mode_val = RTL930X_SDS_MODE_SGMII;
 		break;
-	case PHY_INTERFACE_MODE_1000BASEX:
-		mode = RTL930X_SDS_MODE_1000BASEX;
+	case RTPCS_SDS_MODE_1000BASEX:
+		mode_val = RTL930X_SDS_MODE_1000BASEX;
 		break;
-	case PHY_INTERFACE_MODE_2500BASEX:
-		mode = RTL930X_SDS_MODE_2500BASEX;
+	case RTPCS_SDS_MODE_2500BASEX:
+		mode_val = RTL930X_SDS_MODE_2500BASEX;
 		break;
-	case PHY_INTERFACE_MODE_10GBASER:
-		mode = RTL930X_SDS_MODE_10GBASER;
+	case RTPCS_SDS_MODE_10GBASER:
+		mode_val = RTL930X_SDS_MODE_10GBASER;
 		break;
-	case PHY_INTERFACE_MODE_NA:
-		mode = RTL930X_SDS_OFF;
+	case RTPCS_SDS_MODE_OFF:
+		mode_val = RTL930X_SDS_OFF;
 		break;
 	default:
-		pr_err("%s: SDS %d does not support %s\n", __func__,
-		       sds->id, phy_modes(interface));
+		pr_err("%s: SDS %d does not support mode %d\n", __func__,
+		       sds->id, hw_mode);
 		return;
 	}
 
 	rtpcs_930x_sds_set_power(sds, false);
 	rtpcs_930x_sds_set_internal_mode(sds, RTL930X_SDS_OFF);
-	if (interface == PHY_INTERFACE_MODE_NA)
+	if (hw_mode == RTPCS_SDS_MODE_OFF)
 		return;
 
-	if (rtpcs_930x_sds_config_pll(sds, interface))
-		pr_err("%s: SDS %d could not configure PLL for %s\n", __func__,
-		       sds->id, phy_modes(interface));
+	if (rtpcs_930x_sds_config_pll(sds, hw_mode))
+		pr_err("%s: SDS %d could not configure PLL for mode %d\n", __func__,
+		       sds->id, hw_mode);
 
-	rtpcs_930x_sds_set_internal_mode(sds, mode);
+	rtpcs_930x_sds_set_internal_mode(sds, mode_val);
 	if (rtpcs_930x_sds_wait_clock_ready(sds))
 		pr_err("%s: SDS %d could not sync clock\n", __func__, sds->id);
 
-	if (rtpcs_930x_sds_init_state_machine(sds, interface))
+	if (rtpcs_930x_sds_init_state_machine(sds, hw_mode))
 		pr_err("%s: SDS %d could not reset state machine\n", __func__,
 		       sds->id);
 
 	rtpcs_930x_sds_set_power(sds, true);
-	rtpcs_930x_sds_rx_reset(sds, interface);
+	rtpcs_930x_sds_rx_reset(sds, hw_mode);
 }
 
 static void rtpcs_930x_sds_mode_set(struct rtpcs_serdes *sds,
-				    phy_interface_t phy_mode)
+				    enum rtpcs_sds_mode hw_mode)
 {
-	u32 mode;
-	u32 submode;
+	u32 mode_val, submode_val;
 
-	switch (phy_mode) {
-	case PHY_INTERFACE_MODE_SGMII:
-	case PHY_INTERFACE_MODE_1000BASEX:
-	case PHY_INTERFACE_MODE_2500BASEX:
-	case PHY_INTERFACE_MODE_10GBASER:
-		rtpcs_930x_sds_force_mode(sds, phy_mode);
+	switch (hw_mode) {
+	case RTPCS_SDS_MODE_SGMII:
+	case RTPCS_SDS_MODE_1000BASEX:
+	case RTPCS_SDS_MODE_2500BASEX:
+	case RTPCS_SDS_MODE_10GBASER:
+		rtpcs_930x_sds_force_mode(sds, hw_mode);
 		return;
-	case PHY_INTERFACE_MODE_10G_QXGMII:
-		mode = RTL930X_SDS_MODE_USXGMII;
-		submode = RTL930X_SDS_SUBMODE_USXGMII_QX;
+	case RTPCS_SDS_MODE_USXGMII_10GQXGMII:
+		mode_val = RTL930X_SDS_MODE_USXGMII;
+		submode_val = RTL930X_SDS_SUBMODE_USXGMII_QX;
 		break;
 	default:
-		pr_warn("%s: unsupported mode %s\n", __func__, phy_modes(phy_mode));
+		pr_warn("%s: unsupported mode %d\n", __func__, hw_mode);
 		return;
 	}
 
@@ -1283,11 +1282,11 @@ static void rtpcs_930x_sds_mode_set(struct rtpcs_serdes *sds,
 	rtpcs_930x_sds_set(sds, RTL930X_SDS_OFF);
 
 	/* Set the mode. */
-	rtpcs_930x_sds_set(sds, mode);
+	rtpcs_930x_sds_set(sds, mode_val);
 
 	/* Set the submode if needed. */
-	if (phy_mode == PHY_INTERFACE_MODE_10G_QXGMII)
-		rtpcs_930x_sds_submode_set(sds, submode);
+	if (hw_mode == RTPCS_SDS_MODE_USXGMII_10GQXGMII)
+		rtpcs_930x_sds_submode_set(sds, submode_val);
 }
 
 static void rtpcs_930x_sds_tx_config(struct rtpcs_serdes *sds,
@@ -1868,7 +1867,7 @@ static void rtpcs_930x_sds_do_rx_calibration_2_2(struct rtpcs_serdes *sds)
 	/* Force Rx-Run = 0 */
 	rtpcs_sds_write_bits(sds, 0x2e, 0x15, 8, 8, 0x0);
 
-	rtpcs_930x_sds_rx_reset(sds, PHY_INTERFACE_MODE_10GBASER);
+	rtpcs_930x_sds_rx_reset(sds, RTPCS_SDS_MODE_10GBASER);
 }
 
 static void rtpcs_930x_sds_do_rx_calibration_2_3(struct rtpcs_serdes *sds)
@@ -1920,7 +1919,7 @@ static void rtpcs_930x_sds_do_rx_calibration_2_3(struct rtpcs_serdes *sds)
 
 static void rtpcs_930x_sds_do_rx_calibration_2(struct rtpcs_serdes *sds)
 {
-	rtpcs_930x_sds_rx_reset(sds, PHY_INTERFACE_MODE_10GBASER);
+	rtpcs_930x_sds_rx_reset(sds, RTPCS_SDS_MODE_10GBASER);
 	rtpcs_930x_sds_do_rx_calibration_2_1(sds);
 	rtpcs_930x_sds_do_rx_calibration_2_2(sds);
 	rtpcs_930x_sds_do_rx_calibration_2_3(sds);
@@ -2560,7 +2559,7 @@ static int rtpcs_930x_setup_serdes(struct rtpcs_serdes *sds,
 	rtpcs_930x_sds_set_polarity(sds, sds->tx_pol_inv, sds->rx_pol_inv);
 
 	/* Enable SDS in desired mode */
-	rtpcs_930x_sds_mode_set(sds, if_mode);
+	rtpcs_930x_sds_mode_set(sds, hw_mode);
 
 	/* Enable Fiber RX */
 	rtpcs_sds_write_bits(sds, 0x20, 2, 12, 12, 0);




More information about the lede-commits mailing list