From: Jonas Jelonek Date: Fri, 2 Jan 2026 17:49:02 +0000 (+0000) Subject: realtek: pcs: rtl931x: soften early exit for USXGMII X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F21365%2Fhead;p=thirdparty%2Fopenwrt.git realtek: pcs: rtl931x: soften early exit for USXGMII Now that the PCS driver keeps track of how many links are registered per SerDes, we can also decide which real hardware mode to use when USXGMII is set. While there is still no proper setup for 10G-QXGMII or XSGMII, the existing USXGMII 10G-SXGMII setup seems to work properly. Soften the condition when to exit early so that single 10G port USXGMII can be setup properly. Fixes: c18476d0c581 ("realtek: RTL931x: disable USXGMII SerDes setup") Signed-off-by: Jonas Jelonek Link: https://github.com/openwrt/openwrt/pull/21365 Signed-off-by: Hauke Mehrtens --- 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 06647938d26..efa5287f18f 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 @@ -2906,6 +2906,13 @@ static int rtpcs_931x_setup_serdes(struct rtpcs_serdes *sds, u32 sds_id = sds->id; int ret, chiptype = 0; + ret = rtpcs_sds_determine_hw_mode(sds, mode, &hw_mode); + if (ret < 0) { + dev_err(ctrl->dev, "SerDes %u doesn't support %s mode\n", sds_id, + phy_modes(mode)); + return -ENOTSUPP; + } + /* * TODO: USXGMII is currently the swiss army knife to declare 10G * multi port PHYs. Real devices use other modes instead. Especially @@ -2913,9 +2920,12 @@ static int rtpcs_931x_setup_serdes(struct rtpcs_serdes *sds, * - RTL8224 is driven in 10G_QXGMII * - RTL8218D/E are driven in (Realtek proprietary) XSGMII (10G SGMII) * - * For now disable all USXGMII SerDes handling and rely on U-Boot setup. + * For now, disable "USXGMII" modes we cannot configure properly. Only + * USXGMII_10GSXGMII is configured properly for now. */ - if (mode == PHY_INTERFACE_MODE_USXGMII) + if (hw_mode == RTPCS_SDS_MODE_USXGMII_10GDXGMII || + hw_mode == RTPCS_SDS_MODE_USXGMII_10GQXGMII || + hw_mode == RTPCS_SDS_MODE_XSGMII) return 0; pr_info("%s: set sds %d to mode %d\n", __func__, sds_id, mode); @@ -2949,13 +2959,6 @@ static int rtpcs_931x_setup_serdes(struct rtpcs_serdes *sds, /* this was in rtl931x_phylink_mac_config in dsa/rtl83xx/dsa.c before */ band = rtpcs_931x_sds_cmu_band_get(sds, mode); - ret = rtpcs_sds_determine_hw_mode(sds, mode, &hw_mode); - if (ret < 0) { - dev_err(ctrl->dev, "SerDes %u doesn't support %s mode\n", sds_id, - phy_modes(mode)); - return -ENOTSUPP; - } - ret = rtpcs_931x_sds_config_hw_mode(sds, hw_mode, chiptype); if (ret < 0) return ret;