From: Jonas Jelonek Date: Sat, 20 Dec 2025 21:01:20 +0000 (+0000) Subject: realtek: pcs: rtl931x: use hardware mode for mode setting X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=65dc1ecf49fbb426d2875263a3ac50eb44d3e172;p=thirdparty%2Fopenwrt.git realtek: pcs: rtl931x: use hardware mode for mode setting Use the hardware mode instead of PHY_INTERFACE_MODE_* mode for mode setting. Adjust all affected functions and switch cases accordingly. In MII mode setting, drop the case for 2500Base-X as this is a mistake. In the SDK reference code, this doesn't exist [1]. [1] https://github.com/plappermaul/realtek-doc/blob/69d2890a2e2d7a03df6e40e2cd2c32ff5b074dcf/sources/rtk-dms1250/src/hal/phy/phy_rtl9310.c#L817 Signed-off-by: Jonas Jelonek Link: https://github.com/openwrt/openwrt/pull/20736 Signed-off-by: Robert Marko --- 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 2c49d905311..91bcc6f3922 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 @@ -2307,15 +2307,15 @@ static int rtpcs_930x_setup_serdes(struct rtpcs_serdes *sds, __maybe_unused static int rtpcs_931x_sds_fiber_get_symerr(struct rtpcs_serdes *sds, - phy_interface_t mode) + enum rtpcs_sds_mode hw_mode) { int symerr, val, val2; - switch (mode) { - case PHY_INTERFACE_MODE_10GBASER: + switch (hw_mode) { + case RTPCS_SDS_MODE_10GBASER: symerr = rtpcs_sds_read_bits(sds, 0x5, 0x1, 7, 0); break; - case PHY_INTERFACE_MODE_1000BASEX: + case RTPCS_SDS_MODE_1000BASEX: rtpcs_sds_write_bits(sds, 0x41, 0x18, 2, 0, 0x0); val = rtpcs_sds_read_bits(sds, 0x41, 0x3, 15, 8); @@ -2330,12 +2330,12 @@ static int rtpcs_931x_sds_fiber_get_symerr(struct rtpcs_serdes *sds, } static void rtpcs_931x_sds_clear_symerr(struct rtpcs_serdes *sds, - phy_interface_t mode) + enum rtpcs_sds_mode hw_mode) { - switch (mode) { - case PHY_INTERFACE_MODE_SGMII: - case PHY_INTERFACE_MODE_HISGMII: - case PHY_INTERFACE_MODE_XGMII: + switch (hw_mode) { + case RTPCS_SDS_MODE_SGMII: + case RTPCS_SDS_MODE_HISGMII: + case RTPCS_SDS_MODE_XSGMII: for (int i = 0; i < 4; ++i) { rtpcs_sds_write_bits(sds, 0x41, 0x18, 2, 0, i); rtpcs_sds_write_bits(sds, 0x41, 0x3, 15, 8, 0x0); @@ -2353,16 +2353,16 @@ static void rtpcs_931x_sds_clear_symerr(struct rtpcs_serdes *sds, rtpcs_sds_write_bits(sds, 0x81, 0x0, 15, 0, 0x0); rtpcs_sds_write_bits(sds, 0x81, 0x1, 15, 8, 0x0); break; - case PHY_INTERFACE_MODE_1000BASEX: + case RTPCS_SDS_MODE_1000BASEX: rtpcs_sds_write_bits(sds, 0x41, 0x18, 2, 0, 0x0); rtpcs_sds_write_bits(sds, 0x41, 0x3, 15, 8, 0x0); rtpcs_sds_write_bits(sds, 0x41, 0x2, 15, 0, 0x0); break; - case PHY_INTERFACE_MODE_10GBASER: + case RTPCS_SDS_MODE_10GBASER: /* to be verified: clear on read? */ rtpcs_sds_read_bits(sds, 0x5, 0x1, 7, 0); break; - case PHY_INTERFACE_MODE_NA: + case RTPCS_SDS_MODE_OFF: default: break; } @@ -2378,26 +2378,30 @@ static int rtpcs_931x_sds_power(struct rtpcs_serdes *sds, bool power_on) } static void rtpcs_931x_sds_mii_mode_set(struct rtpcs_serdes *sds, - phy_interface_t mode) + enum rtpcs_sds_mode hw_mode) { u32 val; int shift = ((sds->id & 0x3) << 3); - switch (mode) { - case PHY_INTERFACE_MODE_NA: + switch (hw_mode) { + case RTPCS_SDS_MODE_OFF: val = 0x1f; break; - case PHY_INTERFACE_MODE_QSGMII: + case RTPCS_SDS_MODE_QSGMII: val = 0x6; break; - case PHY_INTERFACE_MODE_XGMII: - val = 0x10; /* serdes mode XSGMII */ + case RTPCS_SDS_MODE_XSGMII: + val = 0x10; break; - case PHY_INTERFACE_MODE_USXGMII: - case PHY_INTERFACE_MODE_2500BASEX: + case RTPCS_SDS_MODE_USXGMII_10GSXGMII: + case RTPCS_SDS_MODE_USXGMII_10GDXGMII: + case RTPCS_SDS_MODE_USXGMII_10GQXGMII: + case RTPCS_SDS_MODE_USXGMII_5GSXGMII: + case RTPCS_SDS_MODE_USXGMII_5GDXGMII: + case RTPCS_SDS_MODE_USXGMII_2_5GSXGMII: val = 0xD; break; - case PHY_INTERFACE_MODE_SGMII: + case RTPCS_SDS_MODE_SGMII: val = 0x2; break; default: @@ -2411,33 +2415,37 @@ static void rtpcs_931x_sds_mii_mode_set(struct rtpcs_serdes *sds, } static void rtpcs_931x_sds_fiber_mode_set(struct rtpcs_serdes *sds, - phy_interface_t mode) + enum rtpcs_sds_mode hw_mode) { u32 val; /* clear symbol error count before changing mode */ - rtpcs_931x_sds_clear_symerr(sds, mode); - rtpcs_931x_sds_mii_mode_set(sds, PHY_INTERFACE_MODE_NA); + rtpcs_931x_sds_clear_symerr(sds, hw_mode); + rtpcs_931x_sds_mii_mode_set(sds, RTPCS_SDS_MODE_OFF); - switch (mode) { - case PHY_INTERFACE_MODE_SGMII: + switch (hw_mode) { + case RTPCS_SDS_MODE_SGMII: val = 0x5; break; - case PHY_INTERFACE_MODE_1000BASEX: + case RTPCS_SDS_MODE_1000BASEX: /* serdes mode FIBER1G */ val = 0x9; break; - case PHY_INTERFACE_MODE_10GBASER: - case PHY_INTERFACE_MODE_10GKR: + case RTPCS_SDS_MODE_10GBASER: val = 0x35; break; /* case MII_10GR1000BX_AUTO: val = 0x39; break; */ - case PHY_INTERFACE_MODE_USXGMII: + case RTPCS_SDS_MODE_USXGMII_10GSXGMII: + case RTPCS_SDS_MODE_USXGMII_10GDXGMII: + case RTPCS_SDS_MODE_USXGMII_10GQXGMII: + case RTPCS_SDS_MODE_USXGMII_5GSXGMII: + case RTPCS_SDS_MODE_USXGMII_5GDXGMII: + case RTPCS_SDS_MODE_USXGMII_2_5GSXGMII: val = 0x1B; break; default: @@ -2935,9 +2943,9 @@ 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, mode); + rtpcs_931x_sds_mii_mode_set(sds, hw_mode); else - rtpcs_931x_sds_fiber_mode_set(sds, mode); + rtpcs_931x_sds_fiber_mode_set(sds, hw_mode); } sds->hw_mode = hw_mode;