From e9bb1debb7f6e57b7c70480afc62c562b00a0cbf Mon Sep 17 00:00:00 2001 From: Sven Eckelmann Date: Sun, 9 Nov 2025 09:30:52 +0100 Subject: [PATCH] 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 Link: https://github.com/openwrt/openwrt/pull/20707 Signed-off-by: Hauke Mehrtens --- .../files-6.12/drivers/net/dsa/rtl83xx/dsa.c | 37 +++++++------------ .../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; -- 2.30.2