mirror of
https://git.openwrt.org/openwrt/openwrt.git
synced 2026-05-05 09:56:12 +02:00
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 <jelonek.jonas@gmail.com> Link: https://github.com/openwrt/openwrt/pull/23120 Signed-off-by: Robert Marko <robimarko@gmail.com>
This commit is contained in:
parent
23f04f6af8
commit
9eb0edfe2b
@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user