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: c18476d0c5 ("realtek: RTL931x: disable USXGMII SerDes setup")
Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/21365
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
This commit is contained in:
Jonas Jelonek 2026-01-02 17:49:02 +00:00 committed by Hauke Mehrtens
parent b63f68e409
commit 2055a4df78

View file

@ -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;