summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSven Eckelmann2025-11-09 08:30:52 +0000
committerHauke Mehrtens2025-11-11 00:06:49 +0000
commite9bb1debb7f6e57b7c70480afc62c562b00a0cbf (patch)
treefb88d1759ef805d180196d7e54143156cf4ce455
parentca014cfd729ff64f652d273c65f47d598019a3d0 (diff)
downloadopenwrt-e9bb1debb7f6e57b7c70480afc62c562b00a0cbf.tar.gz
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@simonwunderlich.de> Link: https://github.com/openwrt/openwrt/pull/20707 Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
-rw-r--r--target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/dsa.c37
-rw-r--r--target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.h1
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;