Skip to content

Commit

Permalink
net: dsa: mv88e6xxx: add cross-chip bridging
Browse files Browse the repository at this point in the history
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>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Vivien Didelot authored and David S. Miller committed Apr 1, 2017
1 parent 40ef2c9 commit aec5ac8
Showing 1 changed file with 33 additions and 1 deletion.
34 changes: 33 additions & 1 deletion drivers/net/dsa/mv88e6xxx/chip.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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 = {
Expand Down

0 comments on commit aec5ac8

Please sign in to comment.