[openwrt/openwrt] realtek: pcs: rtl930x: use SerDes hw mode in calibration

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


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

commit a282999087a6cad68b1709ef1d7e5813bf3fa61e
Author: Jonas Jelonek <jelonek.jonas at gmail.com>
AuthorDate: Sun Jan 11 20:06:58 2026 +0000

    realtek: pcs: rtl930x: use SerDes hw mode in calibration
    
    Completely replace usage of PHY_INTERFACE_MODE_* in the vast amount of
    calibration functions with the SerDes hardware 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      | 118 ++++++++++-----------
 1 file changed, 59 insertions(+), 59 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 e7bb408bd3..47bcc9a119 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
@@ -1754,7 +1754,7 @@ static void rtpcs_930x_sds_rxcal_tap_get(struct rtpcs_serdes *sds,
 }
 
 static void rtpcs_930x_sds_do_rx_calibration_1(struct rtpcs_serdes *sds,
-					       phy_interface_t phy_mode)
+					       enum rtpcs_sds_mode hw_mode)
 {
 	/* From both rtl9300_rxCaliConf_serdes_myParam and rtl9300_rxCaliConf_phy_myParam */
 	int tap0_init_val = 0x1f; /* Initial Decision Fed Equalizer 0 tap */
@@ -1830,9 +1830,9 @@ static void rtpcs_930x_sds_do_rx_calibration_1(struct rtpcs_serdes *sds,
 
 	/* TODO: make this work for DAC cables of different lengths */
 	/* For a 10GBit serdes wit Fibre, SDS 8 or 9 */
-	if (phy_mode == PHY_INTERFACE_MODE_10GBASER ||
-	    phy_mode == PHY_INTERFACE_MODE_1000BASEX ||
-	    phy_mode == PHY_INTERFACE_MODE_SGMII)
+	if (hw_mode == RTPCS_SDS_MODE_10GBASER ||
+	    hw_mode == RTPCS_SDS_MODE_1000BASEX ||
+	    hw_mode == RTPCS_SDS_MODE_SGMII)
 		rtpcs_sds_write_bits(sds, 0x2e, 0x16,  3,  2, 0x02);
 	else
 		pr_err("%s not PHY-based or SerDes, implement DAC!\n", __func__);
@@ -1926,14 +1926,14 @@ static void rtpcs_930x_sds_do_rx_calibration_2(struct rtpcs_serdes *sds)
 }
 
 static void rtpcs_930x_sds_rxcal_3_1(struct rtpcs_serdes *sds,
-				     phy_interface_t phy_mode)
+				     enum rtpcs_sds_mode hw_mode)
 {
 	pr_info("start_1.3.1");
 
 	/* ##1.3.1 */
-	if (phy_mode != PHY_INTERFACE_MODE_10GBASER &&
-	    phy_mode != PHY_INTERFACE_MODE_1000BASEX &&
-	    phy_mode != PHY_INTERFACE_MODE_SGMII)
+	if (hw_mode != RTPCS_SDS_MODE_10GBASER &&
+	    hw_mode != RTPCS_SDS_MODE_1000BASEX &&
+	    hw_mode != RTPCS_SDS_MODE_SGMII)
 		rtpcs_sds_write_bits(sds, 0x2e, 0xc, 8, 8, 0);
 
 	rtpcs_sds_write_bits(sds, 0x2e, 0x17, 7, 7, 0x0);
@@ -1943,16 +1943,16 @@ static void rtpcs_930x_sds_rxcal_3_1(struct rtpcs_serdes *sds,
 }
 
 static void rtpcs_930x_sds_rxcal_3_2(struct rtpcs_serdes *sds,
-				     phy_interface_t phy_mode)
+				     enum rtpcs_sds_mode hw_mode)
 {
 	u32 sum10 = 0, avg10, int10;
 	int dac_long_cable_offset;
 	bool eq_hold_enabled;
 	int i;
 
-	if (phy_mode == PHY_INTERFACE_MODE_10GBASER ||
-	    phy_mode == PHY_INTERFACE_MODE_1000BASEX ||
-	    phy_mode == PHY_INTERFACE_MODE_SGMII) {
+	if (hw_mode == RTPCS_SDS_MODE_10GBASER ||
+	    hw_mode == RTPCS_SDS_MODE_1000BASEX ||
+	    hw_mode == RTPCS_SDS_MODE_SGMII) {
 		/* rtl9300_rxCaliConf_serdes_myParam */
 		dac_long_cable_offset = 3;
 		eq_hold_enabled = true;
@@ -1962,7 +1962,7 @@ static void rtpcs_930x_sds_rxcal_3_2(struct rtpcs_serdes *sds,
 		eq_hold_enabled = false;
 	}
 
-	if (phy_mode != PHY_INTERFACE_MODE_10GBASER)
+	if (hw_mode != RTPCS_SDS_MODE_10GBASER)
 		pr_warn("%s: LEQ only valid for 10GR!\n", __func__);
 
 	pr_info("start_1.3.2");
@@ -1977,27 +1977,27 @@ static void rtpcs_930x_sds_rxcal_3_2(struct rtpcs_serdes *sds,
 
 	pr_info("sum10:%u, avg10:%u, int10:%u", sum10, avg10, int10);
 
-	if (phy_mode == PHY_INTERFACE_MODE_10GBASER ||
-	    phy_mode == PHY_INTERFACE_MODE_1000BASEX ||
-	    phy_mode == PHY_INTERFACE_MODE_SGMII) {
+	if (hw_mode == RTPCS_SDS_MODE_10GBASER ||
+	    hw_mode == RTPCS_SDS_MODE_1000BASEX ||
+	    hw_mode == RTPCS_SDS_MODE_SGMII) {
 		if (dac_long_cable_offset) {
 			rtpcs_930x_sds_rxcal_leq_offset_manual(sds, 1,
 							       dac_long_cable_offset);
 			rtpcs_sds_write_bits(sds, 0x2e, 0x17, 7, 7,
 					     eq_hold_enabled);
-			if (phy_mode == PHY_INTERFACE_MODE_10GBASER)
+			if (hw_mode == RTPCS_SDS_MODE_10GBASER)
 				rtpcs_930x_sds_rxcal_leq_manual(sds,
 								true, avg10);
 		} else {
 			if (sum10 >= 5) {
 				rtpcs_930x_sds_rxcal_leq_offset_manual(sds, 1, 3);
 				rtpcs_sds_write_bits(sds, 0x2e, 0x17, 7, 7, 0x1);
-				if (phy_mode == PHY_INTERFACE_MODE_10GBASER)
+				if (hw_mode == RTPCS_SDS_MODE_10GBASER)
 					rtpcs_930x_sds_rxcal_leq_manual(sds, true, avg10);
 			} else {
 				rtpcs_930x_sds_rxcal_leq_offset_manual(sds, 1, 0);
 				rtpcs_sds_write_bits(sds, 0x2e, 0x17, 7, 7, 0x1);
-				if (phy_mode == PHY_INTERFACE_MODE_10GBASER)
+				if (hw_mode == RTPCS_SDS_MODE_10GBASER)
 					rtpcs_930x_sds_rxcal_leq_manual(sds, true, avg10);
 			}
 		}
@@ -2010,14 +2010,14 @@ static void rtpcs_930x_sds_rxcal_3_2(struct rtpcs_serdes *sds,
 
 __always_unused
 static void rtpcs_930x_sds_do_rx_calibration_3(struct rtpcs_serdes *sds,
-					       phy_interface_t phy_mode)
+					       enum rtpcs_sds_mode hw_mode)
 {
-	rtpcs_930x_sds_rxcal_3_1(sds, phy_mode);
+	rtpcs_930x_sds_rxcal_3_1(sds, hw_mode);
 
-	if (phy_mode == PHY_INTERFACE_MODE_10GBASER ||
-	    phy_mode == PHY_INTERFACE_MODE_1000BASEX ||
-	    phy_mode == PHY_INTERFACE_MODE_SGMII)
-		rtpcs_930x_sds_rxcal_3_2(sds, phy_mode);
+	if (hw_mode == RTPCS_SDS_MODE_10GBASER ||
+	    hw_mode == RTPCS_SDS_MODE_1000BASEX ||
+	    hw_mode == RTPCS_SDS_MODE_SGMII)
+		rtpcs_930x_sds_rxcal_3_2(sds, hw_mode);
 }
 
 static void rtpcs_930x_sds_do_rx_calibration_4_1(struct rtpcs_serdes *sds)
@@ -2079,9 +2079,9 @@ static void rtpcs_930x_sds_do_rx_calibration_5_2(struct rtpcs_serdes *sds)
 }
 
 static void rtpcs_930x_sds_do_rx_calibration_5(struct rtpcs_serdes *sds,
-					       phy_interface_t phy_mode)
+					       enum rtpcs_sds_mode hw_mode)
 {
-	if (phy_mode == PHY_INTERFACE_MODE_10GBASER) /* dfeTap1_4Enable true */
+	if (hw_mode == RTPCS_SDS_MODE_10GBASER) /* dfeTap1_4Enable true */
 		rtpcs_930x_sds_do_rx_calibration_5_2(sds);
 }
 
@@ -2101,14 +2101,14 @@ static void rtpcs_930x_sds_do_rx_calibration_dfe_disable(struct rtpcs_serdes *sd
 }
 
 static void rtpcs_930x_sds_do_rx_calibration(struct rtpcs_serdes *sds,
-					     phy_interface_t phy_mode)
+					     enum rtpcs_sds_mode hw_mode)
 {
 	u32 latch_sts;
 
-	rtpcs_930x_sds_do_rx_calibration_1(sds, phy_mode);
+	rtpcs_930x_sds_do_rx_calibration_1(sds, hw_mode);
 	rtpcs_930x_sds_do_rx_calibration_2(sds);
 	rtpcs_930x_sds_do_rx_calibration_4(sds);
-	rtpcs_930x_sds_do_rx_calibration_5(sds, phy_mode);
+	rtpcs_930x_sds_do_rx_calibration_5(sds, hw_mode);
 	mdelay(20);
 
 	/* Do this only for 10GR mode, SDS active in mode 0x1a */
@@ -2120,27 +2120,27 @@ static void rtpcs_930x_sds_do_rx_calibration(struct rtpcs_serdes *sds,
 		if (latch_sts) {
 			rtpcs_930x_sds_do_rx_calibration_dfe_disable(sds);
 			rtpcs_930x_sds_do_rx_calibration_4(sds);
-			rtpcs_930x_sds_do_rx_calibration_5(sds, phy_mode);
+			rtpcs_930x_sds_do_rx_calibration_5(sds, hw_mode);
 		}
 	}
 }
 
 static int rtpcs_930x_sds_sym_err_reset(struct rtpcs_serdes *sds,
-					phy_interface_t phy_mode)
+					enum rtpcs_sds_mode hw_mode)
 {
-	switch (phy_mode) {
-	case PHY_INTERFACE_MODE_XGMII:
+	switch (hw_mode) {
+	case RTPCS_SDS_MODE_XSGMII:
 		break;
 
-	case PHY_INTERFACE_MODE_10GBASER:
+	case RTPCS_SDS_MODE_10GBASER:
 		/* Read twice to clear */
 		rtpcs_sds_read(sds, 5, 1);
 		rtpcs_sds_read(sds, 5, 1);
 		break;
 
-	case PHY_INTERFACE_MODE_1000BASEX:
-	case PHY_INTERFACE_MODE_SGMII:
-	case PHY_INTERFACE_MODE_10G_QXGMII:
+	case RTPCS_SDS_MODE_1000BASEX:
+	case RTPCS_SDS_MODE_SGMII:
+	case RTPCS_SDS_MODE_USXGMII_10GQXGMII:
 		rtpcs_sds_write_bits(sds, 0x1, 24, 2, 0, 0);
 		rtpcs_sds_write_bits(sds, 0x1, 3, 15, 8, 0);
 		rtpcs_sds_write_bits(sds, 0x1, 2, 15, 0, 0);
@@ -2155,18 +2155,18 @@ static int rtpcs_930x_sds_sym_err_reset(struct rtpcs_serdes *sds,
 }
 
 static u32 rtpcs_930x_sds_sym_err_get(struct rtpcs_serdes *sds,
-				      phy_interface_t phy_mode)
+				      enum rtpcs_sds_mode hw_mode)
 {
 	u32 v = 0;
 
-	switch (phy_mode) {
-	case PHY_INTERFACE_MODE_XGMII:
-	case PHY_INTERFACE_MODE_10G_QXGMII:
+	switch (hw_mode) {
+	case RTPCS_SDS_MODE_XSGMII:
+	case RTPCS_SDS_MODE_USXGMII_10GQXGMII:
 		break;
 
-	case PHY_INTERFACE_MODE_1000BASEX:
-	case PHY_INTERFACE_MODE_SGMII:
-	case PHY_INTERFACE_MODE_10GBASER:
+	case RTPCS_SDS_MODE_1000BASEX:
+	case RTPCS_SDS_MODE_SGMII:
+	case RTPCS_SDS_MODE_10GBASER:
 		v = rtpcs_sds_read(sds, 5, 1);
 		return v & 0xff;
 
@@ -2178,32 +2178,32 @@ static u32 rtpcs_930x_sds_sym_err_get(struct rtpcs_serdes *sds,
 }
 
 static int rtpcs_930x_sds_check_calibration(struct rtpcs_serdes *sds,
-					    phy_interface_t phy_mode)
+					    enum rtpcs_sds_mode hw_mode)
 {
 	u32 errors1, errors2;
 
-	rtpcs_930x_sds_sym_err_reset(sds, phy_mode);
-	rtpcs_930x_sds_sym_err_reset(sds, phy_mode);
+	rtpcs_930x_sds_sym_err_reset(sds, hw_mode);
+	rtpcs_930x_sds_sym_err_reset(sds, hw_mode);
 
 	/* Count errors during 1ms */
-	errors1 = rtpcs_930x_sds_sym_err_get(sds, phy_mode);
+	errors1 = rtpcs_930x_sds_sym_err_get(sds, hw_mode);
 	mdelay(1);
-	errors2 = rtpcs_930x_sds_sym_err_get(sds, phy_mode);
+	errors2 = rtpcs_930x_sds_sym_err_get(sds, hw_mode);
 
-	switch (phy_mode) {
-	case PHY_INTERFACE_MODE_1000BASEX:
-	case PHY_INTERFACE_MODE_SGMII:
-	case PHY_INTERFACE_MODE_XGMII:
+	switch (hw_mode) {
+	case RTPCS_SDS_MODE_1000BASEX:
+	case RTPCS_SDS_MODE_SGMII:
+	case RTPCS_SDS_MODE_XSGMII:
 		if ((errors2 - errors1 > 100) ||
 		    (errors1 >= 0xffff00) || (errors2 >= 0xffff00)) {
 			pr_info("%s XSGMII error rate too high\n", __func__);
 			return 1;
 		}
 		break;
-	case PHY_INTERFACE_MODE_10GBASER:
-	case PHY_INTERFACE_MODE_10G_QXGMII:
+	case RTPCS_SDS_MODE_10GBASER:
+	case RTPCS_SDS_MODE_USXGMII_10GQXGMII:
 		if (errors2 > 0) {
-			pr_info("%s: %s error rate too high\n", __func__, phy_modes(phy_mode));
+			pr_info("%s: 10G error rate too high\n", __func__);
 			return 1;
 		}
 		break;
@@ -2567,10 +2567,10 @@ static int rtpcs_930x_setup_serdes(struct rtpcs_serdes *sds,
 	/* Calibrate SerDes receiver in loopback mode */
 	rtpcs_930x_sds_10g_idle(sds);
 	do {
-		rtpcs_930x_sds_do_rx_calibration(sds, if_mode);
+		rtpcs_930x_sds_do_rx_calibration(sds, hw_mode);
 		calib_tries++;
 		mdelay(50);
-	} while (rtpcs_930x_sds_check_calibration(sds, if_mode) && calib_tries < 3);
+	} while (rtpcs_930x_sds_check_calibration(sds, hw_mode) && calib_tries < 3);
 	if (calib_tries >= 3)
 		pr_warn("%s: SerDes RX calibration failed\n", __func__);
 




More information about the lede-commits mailing list