realtek: pcs: rtl931x: improve mode setting functions
authorJonas Jelonek <jelonek.jonas@gmail.com>
Sat, 20 Dec 2025 22:18:23 +0000 (22:18 +0000)
committerRobert Marko <robimarko@gmail.com>
Mon, 29 Dec 2025 16:06:19 +0000 (17:06 +0100)
Improve the current mode setting functions to address a few issues:
- add missing mode from SDK reference (instead of using the
  corresponding value as a default value)
- use and return error values
- give internal variable a more meaningful name
- consistently use lowercase letters in hex values

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

index 2b737bc35b64f8e68051162fef78b3ec8584a89a..21ff31371dcc81506039a69789f37b986d06bbab 100644 (file)
@@ -2377,21 +2377,24 @@ static int rtpcs_931x_sds_power(struct rtpcs_serdes *sds, bool power_on)
                                 BIT(sds->id), en_val);
 }
 
-static void rtpcs_931x_sds_mii_mode_set(struct rtpcs_serdes *sds,
-                                       enum rtpcs_sds_mode hw_mode)
+static int rtpcs_931x_sds_mii_mode_set(struct rtpcs_serdes *sds,
+                                      enum rtpcs_sds_mode hw_mode)
 {
-       u32 val;
+       u32 mode_val;
        int shift = ((sds->id & 0x3) << 3);
 
        switch (hw_mode) {
        case RTPCS_SDS_MODE_OFF:
-               val = 0x1f;
+               mode_val = 0x1f;
                break;
        case RTPCS_SDS_MODE_QSGMII:
-               val = 0x6;
+               mode_val = 0x6;
+               break;
+       case RTPCS_SDS_MODE_HISGMII:
+               mode_val = 0x12;
                break;
        case RTPCS_SDS_MODE_XSGMII:
-               val = 0x10;
+               mode_val = 0x10;
                break;
        case RTPCS_SDS_MODE_USXGMII_10GSXGMII:
        case RTPCS_SDS_MODE_USXGMII_10GDXGMII:
@@ -2399,25 +2402,25 @@ static void rtpcs_931x_sds_mii_mode_set(struct rtpcs_serdes *sds,
        case RTPCS_SDS_MODE_USXGMII_5GSXGMII:
        case RTPCS_SDS_MODE_USXGMII_5GDXGMII:
        case RTPCS_SDS_MODE_USXGMII_2_5GSXGMII:
-               val = 0xD;
+               mode_val = 0xd;
                break;
        case RTPCS_SDS_MODE_SGMII:
-               val = 0x2;
+               mode_val = 0x2;
                break;
        default:
-               return;
+               return -EINVAL;
        }
 
-       val |= BIT(7); /* force mode bit */
-       regmap_write_bits(sds->ctrl->map,
-                         RTL931X_SERDES_MODE_CTRL + 4 * (sds->id >> 2),
-                         0xff << shift, val << shift);
+       mode_val |= BIT(7); /* force mode bit */
+       return regmap_write_bits(sds->ctrl->map,
+                                RTL931X_SERDES_MODE_CTRL + 4 * (sds->id >> 2),
+                                0xff << shift, mode_val << shift);
 }
 
-static void rtpcs_931x_sds_fiber_mode_set(struct rtpcs_serdes *sds,
-                                         enum rtpcs_sds_mode hw_mode)
+static int rtpcs_931x_sds_fiber_mode_set(struct rtpcs_serdes *sds,
+                                        enum rtpcs_sds_mode hw_mode)
 {
-       u32 val;
+       u32 mode_val;
 
        /* clear symbol error count before changing mode */
        rtpcs_931x_sds_clear_symerr(sds, hw_mode);
@@ -2425,23 +2428,23 @@ static void rtpcs_931x_sds_fiber_mode_set(struct rtpcs_serdes *sds,
 
        switch (hw_mode) {
        case RTPCS_SDS_MODE_OFF:
-               val = 0x3f;
+               mode_val = 0x3f;
                break;
 
        case RTPCS_SDS_MODE_SGMII:
-               val = 0x5;
+               mode_val = 0x5;
                break;
 
        case RTPCS_SDS_MODE_1000BASEX:
                /* serdes mode FIBER1G */
-               val = 0x9;
+               mode_val = 0x9;
                break;
 
        case RTPCS_SDS_MODE_10GBASER:
-               val = 0x35;
+               mode_val = 0x35;
                break;
 /*      case MII_10GR1000BX_AUTO:
-                val = 0x39;
+                mode_val = 0x39;
                 break; */
 
        case RTPCS_SDS_MODE_USXGMII_10GSXGMII:
@@ -2450,14 +2453,17 @@ static void rtpcs_931x_sds_fiber_mode_set(struct rtpcs_serdes *sds,
        case RTPCS_SDS_MODE_USXGMII_5GSXGMII:
        case RTPCS_SDS_MODE_USXGMII_5GDXGMII:
        case RTPCS_SDS_MODE_USXGMII_2_5GSXGMII:
-               val = 0x1B;
+               mode_val = 0x1b;
+               break;
+       case RTPCS_SDS_MODE_HISGMII:
+               mode_val = 0x25;
                break;
        default:
-               val = 0x25;
+               return -ENOTSUPP;
        }
 
-       pr_info("%s writing analog SerDes Mode value %02x\n", __func__, val);
-       rtpcs_sds_write_bits(sds, 0x1F, 0x9, 11, 6, val);
+       pr_info("%s writing analog SerDes Mode value %02x\n", __func__, mode_val);
+       return rtpcs_sds_write_bits(sds, 0x1f, 0x9, 11, 6, mode_val);
 }
 
 static void rtpcs_931x_sds_reset(struct rtpcs_serdes *sds)
@@ -2939,10 +2945,14 @@ 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)
-                       rtpcs_931x_sds_mii_mode_set(sds, hw_mode);
+                       ret = rtpcs_931x_sds_mii_mode_set(sds, hw_mode);
                else
-                       rtpcs_931x_sds_fiber_mode_set(sds, hw_mode);
+                       ret = rtpcs_931x_sds_fiber_mode_set(sds, hw_mode);
        }
+
+       if (ret < 0)
+               return ret;
+
        sds->hw_mode = hw_mode;
 
        return 0;