From 9eb0edfe2b14e39fbd3d66762a5977394de4185b Mon Sep 17 00:00:00 2001 From: Jonas Jelonek Date: Thu, 23 Apr 2026 11:29:44 +0000 Subject: [PATCH] realtek: pcs: rtl93xx: add remaining USXGMII submodes Complete the USXGMII submode table with the four values that were missing so far: 0x01 10GDX (2 x 5G) 0x03 5GSX (1 x 5G) 0x04 5GDX (2 x 2.5G) 0x05 2_5GSX (1 x 2.5G) Together with the existing 10GSX (0x00) and 10GQX (0x02) this covers all six USXGMII modes the driver declares. Add a corresponding mapping to the hw_mode table too to cover them properly there. Replace the switch in rtpcs_93xx_sds_apply_usxgmii_submode() with a sparse lookup table indexed by hw_mode, using -1 as the sentinel for modes without a submode value. Non-USXGMII modes silently no-op as before; a USXGMII mode hitting a SerDes without an allocated submode register now returns -EOPNOTSUPP, catching configuration mismatches that would previously have been silently dropped. Signed-off-by: Jonas Jelonek Link: https://github.com/openwrt/openwrt/pull/23120 Signed-off-by: Robert Marko --- .../files-6.18/drivers/net/pcs/pcs-rtl-otto.c | 38 ++++++++++++------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c b/target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c index 6514e4cc5c..93b26071ce 100644 --- a/target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c +++ b/target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c @@ -87,7 +87,11 @@ #define RTPCS_93XX_SDS_MODE_OFF 0x1f #define RTPCS_93XX_SDS_USXGMII_SUBMODE_10GSX 0x00 +#define RTPCS_93XX_SDS_USXGMII_SUBMODE_10GDX 0x01 #define RTPCS_93XX_SDS_USXGMII_SUBMODE_10GQX 0x02 +#define RTPCS_93XX_SDS_USXGMII_SUBMODE_5GSX 0x03 +#define RTPCS_93XX_SDS_USXGMII_SUBMODE_5GDX 0x04 +#define RTPCS_93XX_SDS_USXGMII_SUBMODE_2_5GSX 0x05 /* Registers of the internal SerDes of the 9310 */ #define RTPCS_931X_MAC_GROUP0_1_CTRL (0x13a4) @@ -1194,7 +1198,11 @@ static const s16 rtpcs_93xx_sds_hw_mode_vals[RTPCS_SDS_MODE_MAX] = { [RTPCS_SDS_MODE_QSGMII] = RTPCS_93XX_SDS_MODE_QSGMII, [RTPCS_SDS_MODE_XSGMII] = RTPCS_93XX_SDS_MODE_XSGMII, [RTPCS_SDS_MODE_USXGMII_10GSXGMII] = RTPCS_93XX_SDS_MODE_USXGMII, + [RTPCS_SDS_MODE_USXGMII_10GDXGMII] = RTPCS_93XX_SDS_MODE_USXGMII, [RTPCS_SDS_MODE_USXGMII_10GQXGMII] = RTPCS_93XX_SDS_MODE_USXGMII, + [RTPCS_SDS_MODE_USXGMII_5GSXGMII] = RTPCS_93XX_SDS_MODE_USXGMII, + [RTPCS_SDS_MODE_USXGMII_5GDXGMII] = RTPCS_93XX_SDS_MODE_USXGMII, + [RTPCS_SDS_MODE_USXGMII_2_5GSXGMII] = RTPCS_93XX_SDS_MODE_USXGMII, }; static int rtpcs_93xx_sds_set_autoneg(struct rtpcs_serdes *sds, unsigned int neg_mode, @@ -1425,26 +1433,28 @@ pll_setup: return ret; } +static const s16 rtpcs_93xx_sds_usxgmii_submodes[RTPCS_SDS_MODE_MAX] = { + [0 ... RTPCS_SDS_MODE_MAX - 1] = -1, + [RTPCS_SDS_MODE_USXGMII_10GSXGMII] = RTPCS_93XX_SDS_USXGMII_SUBMODE_10GSX, + [RTPCS_SDS_MODE_USXGMII_10GDXGMII] = RTPCS_93XX_SDS_USXGMII_SUBMODE_10GDX, + [RTPCS_SDS_MODE_USXGMII_10GQXGMII] = RTPCS_93XX_SDS_USXGMII_SUBMODE_10GQX, + [RTPCS_SDS_MODE_USXGMII_5GSXGMII] = RTPCS_93XX_SDS_USXGMII_SUBMODE_5GSX, + [RTPCS_SDS_MODE_USXGMII_5GDXGMII] = RTPCS_93XX_SDS_USXGMII_SUBMODE_5GDX, + [RTPCS_SDS_MODE_USXGMII_2_5GSXGMII] = RTPCS_93XX_SDS_USXGMII_SUBMODE_2_5GSX, +}; + static int rtpcs_93xx_sds_apply_usxgmii_submode(struct rtpcs_serdes *sds, enum rtpcs_sds_mode hw_mode) { - u8 submode; + s16 val = rtpcs_93xx_sds_usxgmii_submodes[hw_mode]; + + if (val < 0) + return 0; if (!sds->swcore_regs.usxgmii_submode) - return 0; + return -EOPNOTSUPP; - switch (hw_mode) { - case RTPCS_SDS_MODE_USXGMII_10GSXGMII: - submode = RTPCS_93XX_SDS_USXGMII_SUBMODE_10GSX; - break; - case RTPCS_SDS_MODE_USXGMII_10GQXGMII: - submode = RTPCS_93XX_SDS_USXGMII_SUBMODE_10GQX; - break; - default: - return 0; - } - - return regmap_field_write(sds->swcore_regs.usxgmii_submode, submode); + return regmap_field_write(sds->swcore_regs.usxgmii_submode, val); } /*