[openwrt/openwrt] realtek: dsa: Use DSA allocated LAG ids

LEDE Commits lede-commits at lists.infradead.org
Mon Nov 10 16:07:47 PST 2025


hauke pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/e9bb1debb7f6e57b7c70480afc62c562b00a0cbf

commit e9bb1debb7f6e57b7c70480afc62c562b00a0cbf
Author: Sven Eckelmann <se at simonwunderlich.de>
AuthorDate: Sun Nov 9 09:30:52 2025 +0100

    realtek: dsa: Use DSA allocated LAG ids
    
    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 <se at simonwunderlich.de>
    Link: https://github.com/openwrt/openwrt/pull/20707
    Signed-off-by: Hauke Mehrtens <hauke at hauke-m.de>
---
 .../files-6.12/drivers/net/dsa/rtl83xx/dsa.c       | 37 ++++++++--------------
 .../files-6.12/drivers/net/dsa/rtl83xx/rtl838x.h   |  1 -
 2 files changed, 14 insertions(+), 24 deletions(-)

diff --git a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/dsa.c b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/dsa.c
index 1787904b5b..362b80ffd4 100644
--- a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/dsa.c
+++ b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/dsa.c
@@ -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);
diff --git a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.h b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.h
index 292a9893cb..ca9558f8df 100644
--- a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.h
+++ b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.h
@@ -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;




More information about the lede-commits mailing list