Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1612312

[PATCH net-next 9/9] net: dsa: mv88e6xxx: add cross-chip bridging

From Vivien Didelot <vivien.didelot@savoirfairelinux.com>
Newsgroups linux.kernel
Subject [PATCH net-next 9/9] net: dsa: mv88e6xxx: add cross-chip bridging
Date 2017-03-29 22:40 +0200
Message-ID <tqsxR-3KK-29@gated-at.bofh.it> (permalink)
References <tqsxQ-3KK-7@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


Implement the DSA cross-chip bridging operations by remapping the local
ports an external source port can egress frames to, when this cross-chip
port joins or leaves a bridge.

The PVT is no longer configured with all ones allowing any external
frame to egress any local port. Only DSA and CPU ports, as well as
bridge group members, can egress frames on local ports.

Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
---
 drivers/net/dsa/mv88e6xxx/chip.c | 34 +++++++++++++++++++++++++++++++++-
 1 file changed, 33 insertions(+), 1 deletion(-)

diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
index 31c296a04f03..52ff1bd11a05 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.c
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
@@ -1222,7 +1222,7 @@ static int mv88e6xxx_pvt_map(struct mv88e6xxx_chip *chip, int dev, int port)
 
 	/* Skip the local source device, which uses in-chip port VLAN */
 	if (dev != chip->ds->index)
-		pvlan = mv88e6xxx_port_mask(chip);
+		pvlan = mv88e6xxx_port_vlan(chip, dev, port);
 
 	return mv88e6xxx_g2_pvt_write(chip, dev, port, pvlan);
 }
@@ -2203,6 +2203,36 @@ static void mv88e6xxx_port_bridge_leave(struct dsa_switch *ds, int port,
 	mutex_unlock(&chip->reg_lock);
 }
 
+static int mv88e6xxx_crosschip_bridge_join(struct dsa_switch *ds, int dev,
+					   int port, struct net_device *br)
+{
+	struct mv88e6xxx_chip *chip = ds->priv;
+	int err;
+
+	if (!mv88e6xxx_has_pvt(chip))
+		return 0;
+
+	mutex_lock(&chip->reg_lock);
+	err = mv88e6xxx_pvt_map(chip, dev, port);
+	mutex_unlock(&chip->reg_lock);
+
+	return err;
+}
+
+static void mv88e6xxx_crosschip_bridge_leave(struct dsa_switch *ds, int dev,
+					     int port, struct net_device *br)
+{
+	struct mv88e6xxx_chip *chip = ds->priv;
+
+	if (!mv88e6xxx_has_pvt(chip))
+		return;
+
+	mutex_lock(&chip->reg_lock);
+	if (mv88e6xxx_pvt_map(chip, dev, port))
+		dev_err(ds->dev, "failed to remap cross-chip Port VLAN\n");
+	mutex_unlock(&chip->reg_lock);
+}
+
 static int mv88e6xxx_software_reset(struct mv88e6xxx_chip *chip)
 {
 	if (chip->info->ops->reset)
@@ -4313,6 +4343,8 @@ static const struct dsa_switch_ops mv88e6xxx_switch_ops = {
 	.port_mdb_add           = mv88e6xxx_port_mdb_add,
 	.port_mdb_del           = mv88e6xxx_port_mdb_del,
 	.port_mdb_dump          = mv88e6xxx_port_mdb_dump,
+	.crosschip_bridge_join	= mv88e6xxx_crosschip_bridge_join,
+	.crosschip_bridge_leave	= mv88e6xxx_crosschip_bridge_leave,
 };
 
 static struct dsa_switch_driver mv88e6xxx_switch_drv = {
-- 
2.12.1

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCH net-next 0/9] net: dsa: mv88e6xxx: program cross-chip bridging Vivien Didelot <vivien.didelot@savoirfairelinux.com> - 2017-03-29 22:40 +0200
  [PATCH net-next 1/9] net: dsa: mv88e6xxx: move PVT description in info Vivien Didelot <vivien.didelot@savoirfairelinux.com> - 2017-03-29 22:40 +0200
    Re: [PATCH net-next 1/9] net: dsa: mv88e6xxx: move PVT description  in info Andrew Lunn <andrew@lunn.ch> - 2017-03-30 15:40 +0200
  [PATCH net-next 9/9] net: dsa: mv88e6xxx: add cross-chip bridging Vivien Didelot <vivien.didelot@savoirfairelinux.com> - 2017-03-29 22:40 +0200
  [PATCH net-next 3/9] net: dsa: mv88e6xxx: program the PVT with all ones Vivien Didelot <vivien.didelot@savoirfairelinux.com> - 2017-03-29 22:40 +0200
    Re: [PATCH net-next 3/9] net: dsa: mv88e6xxx: program the PVT with  all ones Andrew Lunn <andrew@lunn.ch> - 2017-03-30 15:50 +0200
      Re: [PATCH net-next 3/9] net: dsa: mv88e6xxx: program the PVT with all ones Vivien Didelot <vivien.didelot@savoirfairelinux.com> - 2017-03-30 16:20 +0200
  [PATCH net-next 6/9] net: dsa: mv88e6xxx: factorize in-chip bridge map Vivien Didelot <vivien.didelot@savoirfairelinux.com> - 2017-03-29 22:40 +0200
    Re: [PATCH net-next 6/9] net: dsa: mv88e6xxx: factorize in-chip  bridge map Andrew Lunn <andrew@lunn.ch> - 2017-03-30 16:10 +0200
  [PATCH net-next 2/9] net: dsa: mv88e6xxx: use 4-bit port for PVT data Vivien Didelot <vivien.didelot@savoirfairelinux.com> - 2017-03-29 22:40 +0200
    Re: [PATCH net-next 2/9] net: dsa: mv88e6xxx: use 4-bit port for PVT  data Andrew Lunn <andrew@lunn.ch> - 2017-03-30 15:40 +0200

csiph-web