realtek: pcs: avoid unneeded SerDes reconfiguration
authorJonas Jelonek <jelonek.jonas@gmail.com>
Sun, 25 Jan 2026 23:28:14 +0000 (23:28 +0000)
committerRobert Marko <robimarko@gmail.com>
Sun, 1 Feb 2026 10:47:25 +0000 (11:47 +0100)
Avoid to reconfigure a SerDes when it has been configured for a mode
before. This usually applies to switches which drive multiple ports on a
single SerDes. For those, the phylink subsystem triggers PCS
configuration everytime although it's a single SerDes. For example, on
switches with XSGMII-connected RTL8218D the particular SerDes is
configured eight times but only a single run is needed.

Add a proper check to pcs_config which checks the mode stored in the
SerDes instance against the requested mode. Other 'settings' should be
executed though, e.g. setting autoneg. While at it, drop the check if
there is a 'setup_serdes' implementation. It's just a driver-internal
interface and all variants implement this now.

Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/21763
Signed-off-by: Robert Marko <robimarko@gmail.com>
target/linux/realtek/files-6.12/drivers/net/pcs/pcs-rtl-otto.c

index 0628a8d4a04b3447afdf63f2596fea14b232c611..993cdf8cdcff3e64142a888f9bc3e7448fc155b4 100644 (file)
@@ -3701,15 +3701,18 @@ static int rtpcs_pcs_config(struct phylink_pcs *pcs, unsigned int neg_mode,
                return -ENOTSUPP;
        }
 
-       dev_info(ctrl->dev, "configure SerDes %u for mode %s\n", sds->id,
-                phy_modes(interface));
-
        mutex_lock(&ctrl->lock);
 
-       if (ctrl->cfg->setup_serdes) {
+       if (sds->hw_mode != hw_mode) {
+               dev_info(ctrl->dev, "configure SerDes %u for mode %s\n", sds->id,
+                        phy_modes(interface));
+
                ret = ctrl->cfg->setup_serdes(sds, hw_mode);
                if (ret < 0)
                        goto out;
+       } else {
+               dev_dbg(ctrl->dev, "SerDes %u already in mode %s, no change\n",
+                        sds->id, phy_modes(interface));
        }
 
        if (ctrl->cfg->set_autoneg) {
@@ -3721,7 +3724,6 @@ static int rtpcs_pcs_config(struct phylink_pcs *pcs, unsigned int neg_mode,
        ret = 0;
 out:
        mutex_unlock(&ctrl->lock);
-
        return ret;
 }