realtek: dsa: Use DSA allocated LAG ids
authorSven Eckelmann <[email protected]>
Sun, 9 Nov 2025 08:30:52 +0000 (09:30 +0100)
committerHauke Mehrtens <[email protected]>
Tue, 11 Nov 2025 00:06:49 +0000 (01:06 +0100)
It is not necessary to have a private LAG id allocation when the shared DSA
code already provides the complete infrastructure for it.

Signed-off-by: Sven Eckelmann <[email protected]>
Link: https://github.com/openwrt/openwrt/pull/20707
Signed-off-by: Hauke Mehrtens <[email protected]>
target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/dsa.c
target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.h

index 1787904b5b80f21d9446843d04941f2b2966274b..362b80ffd48d8665635530b512f33dbe6ea3bedf 100644 (file)
@@ -2400,34 +2400,32 @@ static int rtl83xx_port_lag_join(struct dsa_switch *ds,
                                  struct netlink_ext_ack *extack)
 {
        struct rtl838x_switch_priv *priv = ds->priv;
-       int i, err = 0;
+       int err = 0;
+       int group;
 
        if (!rtl83xx_lag_can_offload(ds, lag.dev, info))
                return -EOPNOTSUPP;
 
        mutex_lock(&priv->reg_mutex);
 
-       for (i = 0; i < priv->ds->num_lag_ids; i++) {
-               if ((!priv->lag_devs[i]) || (priv->lag_devs[i] == lag.dev))
-                       break;
-       }
        if (port >= priv->cpu_port) {
                err = -EINVAL;
                goto out;
        }
-       pr_info("port_lag_join: group %d, port %d\n",i, port);
-       if (!priv->lag_devs[i])
-               priv->lag_devs[i] = lag.dev;
 
-       if (priv->lag_primary[i] == -1) {
-               priv->lag_primary[i] = port;
-       } else
+       group = dsa_lag_id(ds->dst, lag.dev);
+
+       pr_info("port_lag_join: group %d, port %d\n", group, port);
+
+       if (priv->lag_primary[group] == -1)
+               priv->lag_primary[group] = port;
+       else
                priv->is_lagmember[port] = 1;
 
        priv->lagmembers |= (1ULL << port);
 
        pr_debug("lag_members = %llX\n", priv->lagmembers);
-       err = rtl83xx_lag_add(priv->ds, i, port, info);
+       err = rtl83xx_lag_add(priv->ds, group, port, info);
        if (err) {
                err = -EINVAL;
                goto out;
@@ -2442,19 +2440,14 @@ out:
 static int rtl83xx_port_lag_leave(struct dsa_switch *ds, int port,
                                  struct dsa_lag lag)
 {
-       int i, group = -1, err;
+       int group, err;
        struct rtl838x_switch_priv *priv = ds->priv;
 
        mutex_lock(&priv->reg_mutex);
-       for (i = 0; i < priv->ds->num_lag_ids; i++) {
-               if (priv->lags_port_members[i] & BIT_ULL(port)) {
-                       group = i;
-                       break;
-               }
-       }
 
+       group = dsa_lag_id(ds->dst, lag.dev);
        if (group == -1) {
-               pr_info("port_lag_leave: port %d is not a member\n", port);
+               pr_info("port_lag_leave: group %d not set\n", port);
                err = -EINVAL;
                goto out;
        }
@@ -2465,7 +2458,7 @@ static int rtl83xx_port_lag_leave(struct dsa_switch *ds, int port,
        }
        pr_info("port_lag_del: group %d, port %d\n",group, port);
        priv->lagmembers &=~ (1ULL << port);
-       priv->lag_primary[i] = -1;
+       priv->lag_primary[group] = -1;
        priv->is_lagmember[port] = 0;
        pr_debug("lag_members = %llX\n", priv->lagmembers);
        err = rtl83xx_lag_del(priv->ds, group, port);
@@ -2473,8 +2466,6 @@ static int rtl83xx_port_lag_leave(struct dsa_switch *ds, int port,
                err = -EINVAL;
                goto out;
        }
-       if (!priv->lags_port_members[i])
-               priv->lag_devs[i] = NULL;
 
 out:
        mutex_unlock(&priv->reg_mutex);
index 292a9893cb066267f3a42946f541d3e6eb453799..ca9558f8df29540614a119092d30225f8117bd77 100644 (file)
@@ -1165,7 +1165,6 @@ struct rtl838x_switch_priv {
        int l2_bucket_size;
        struct dentry *dbgfs_dir;
        u64 lags_port_members[MAX_LAGS];
-       struct net_device *lag_devs[MAX_LAGS];
        u32 lag_primary[MAX_LAGS];
        u32 is_lagmember[57];
        u64 lagmembers;