[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20230724101059.2228381-1-daniel.mack@holoplot.com>
Date: Mon, 24 Jul 2023 12:10:59 +0200
From: Daniel Mack <daniel.mack@...oplot.com>
To: netdev@...r.kernel.org
Cc: andrew@...n.ch,
f.fainelli@...il.com,
olteanv@...il.com,
Daniel Mack <daniel.mack@...oplot.com>
Subject: [PATCH] net: dsa: mv88e6xxx: use distinct FIDs for each bridge
Allow setups with overlapping VLAN IDs in different bridges by settting
the FID of all bridge ports to the index of the bridge.
Read the FID back when detecting overlaps.
Signed-off-by: Daniel Mack <daniel.mack@...oplot.com>
---
drivers/net/dsa/mv88e6xxx/chip.c | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
index c7d51a539451..dff271981c69 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.c
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
@@ -2028,6 +2028,7 @@ static int mv88e6xxx_port_check_hw_vlan(struct dsa_switch *ds, int port,
struct mv88e6xxx_chip *chip = ds->priv;
struct mv88e6xxx_vtu_entry vlan;
int err;
+ u16 fid;
/* DSA and CPU ports have to be members of multiple vlans */
if (dsa_port_is_dsa(dp) || dsa_port_is_cpu(dp))
@@ -2037,11 +2038,16 @@ static int mv88e6xxx_port_check_hw_vlan(struct dsa_switch *ds, int port,
if (err)
return err;
+ err = mv88e6xxx_port_get_fid(chip, port, &fid);
+ if (err)
+ return err;
+
if (!vlan.valid)
return 0;
dsa_switch_for_each_user_port(other_dp, ds) {
struct net_device *other_br;
+ u16 other_fid;
if (vlan.member[other_dp->index] ==
MV88E6XXX_G1_VTU_DATA_MEMBER_TAG_NON_MEMBER)
@@ -2054,6 +2060,10 @@ static int mv88e6xxx_port_check_hw_vlan(struct dsa_switch *ds, int port,
if (!other_br)
continue;
+ err = mv88e6xxx_port_get_fid(chip, other_dp->index, &other_fid);
+ if (err == 0 && fid != other_fid)
+ continue;
+
dev_err(ds->dev, "p%d: hw VLAN %d already used by port %d in %s\n",
port, vlan.vid, other_dp->index, netdev_name(other_br));
return -EOPNOTSUPP;
@@ -2948,6 +2958,11 @@ static int mv88e6xxx_port_bridge_join(struct dsa_switch *ds, int port,
*tx_fwd_offload = true;
}
+ /* Set the port's FID to the bridge index so bridges can have
+ * overlapping VLANs.
+ */
+ err = mv88e6xxx_port_set_fid(chip, port, bridge.num);
+
unlock:
mv88e6xxx_reg_unlock(chip);
--
2.41.0
Powered by blists - more mailing lists