]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
realtek: pcs: rtl930x: gate TX tuning on attachment and baud rate
authorJonas Jelonek <jelonek.jonas@gmail.com>
Fri, 10 Jul 2026 13:38:15 +0000 (13:38 +0000)
committerJonas Jelonek <jelonek.jonas@gmail.com>
Wed, 15 Jul 2026 17:37:01 +0000 (19:37 +0200)
TX amp/pre-emphasis tuning depends on the SerDes' real baud rate class
rather than hw_mode, so key config_attachment's dispatch on that instead.

At 1G/2.5G, attachment doesn't change meaningful: even a non-adaptive
fiber receiver needs little compensation on a short trace, so
PHY-attached and fiber links already use the same config there. At 10G,
real channel loss is high enough that it matters: PHY-attached links
equalize on the PHY's own far-end receiver and need less amp drive,
while genuine fiber/DAC links, which have no adaptive receiver
downstream, need the full config. Real DAC-vs-fiber detection doesn't
exist yet, so both of those still share one config for now.

Make use of the PLL speed enum for now, though it is a bit blurry and
may not represent the real baud rate in some cases, e.g. QSGMII (1.25G
PLL with multiplier -> 5G).

Link: https://github.com/openwrt/openwrt/pull/24232
Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c

index 33db840a4c70f0158c4898c12bc6f1a3e793b68f..5fe7119318df49aafd358140189850197fa88745 100644 (file)
@@ -1691,6 +1691,17 @@ static const struct rtpcs_sds_tx_config rtpcs_930x_sds_tx_config_10g = {
        .main_amp = 0x10, .impedance = 0x8
 };
 
+/*
+ * PHY-attached 10G-class links (XSGMII, USXGMII): weaker than the fiber/DAC
+ * value above since the far-end PHY equalizes on its own. main_amp reuses
+ * the 1G/2.5G fiber override's value, also the vendor SDK's genuine-fiber
+ * (non-DAC) 10G value; a non-adaptive receiver needing no more than this
+ * should be a safe upper bound for a PHY that equalizes on top.
+ */
+static const struct rtpcs_sds_tx_config rtpcs_930x_sds_tx_config_phy = {
+       .main_amp = 0x9, .impedance = 0x8
+};
+
 /*
  * RTL930X needs a special mapping from logic SerDes ID to physical SerDes ID,
  * which takes the page into account. This applies to most of read/write calls.
@@ -2989,6 +3000,7 @@ static int rtpcs_930x_sds_config_attachment(struct rtpcs_serdes *sds,
                                            enum rtpcs_sds_mode hw_mode)
 {
        const struct rtpcs_sds_tx_config *tx_cfg;
+       enum rtpcs_sds_pll_speed speed;
        int ret;
 
        if (sds->type != RTPCS_SDS_TYPE_10G)
@@ -3002,19 +3014,26 @@ static int rtpcs_930x_sds_config_attachment(struct rtpcs_serdes *sds,
        if (ret < 0)
                return ret;
 
-       switch (hw_mode) {
-       case RTPCS_SDS_MODE_1000BASEX:
-       case RTPCS_SDS_MODE_SGMII:
+       ret = rtpcs_sds_select_pll_speed(hw_mode, &speed);
+       if (ret < 0)
+               return ret;
+
+       switch (speed) {
+       case RTPCS_SDS_PLL_SPD_1000:
                tx_cfg = &rtpcs_930x_sds_tx_config_1g;
                break;
-       case RTPCS_SDS_MODE_2500BASEX:
+       case RTPCS_SDS_PLL_SPD_2500:
                tx_cfg = &rtpcs_930x_sds_tx_config_2g5;
                break;
-       case RTPCS_SDS_MODE_10GBASER:
-       case RTPCS_SDS_MODE_XSGMII:
-       case RTPCS_SDS_MODE_USXGMII_10GSXGMII:
-       case RTPCS_SDS_MODE_USXGMII_10GQXGMII:
-               tx_cfg = &rtpcs_930x_sds_tx_config_10g;
+       case RTPCS_SDS_PLL_SPD_10000:
+               /*
+                * PHY-attached links equalize on the PHY's own far-end
+                * receiver, less amp drive needed. Real DAC-vs-fiber
+                * detection doesn't exist yet, so both of those share
+                * the same config for now.
+                */
+               tx_cfg = (attachment == RTPCS_SDS_ATTACH_PHY) ? &rtpcs_930x_sds_tx_config_phy
+                                                             : &rtpcs_930x_sds_tx_config_10g;
                break;
        default:
                return -EOPNOTSUPP;