Change the _mv88e6xxx_port_based_vlan_map function for a _mv88e6xxx_port_map_vlantable which takes a dsa_port structure as parameter. This allows us to iterate on dsa_port's bridge device pointer and thus get rid of the private bridge_dev structure.
Signed-off-by: Vivien Didelot <vivien.dide...@savoirfairelinux.com> --- drivers/net/dsa/mv88e6xxx.c | 48 ++++++++++++++++++++++----------------------- drivers/net/dsa/mv88e6xxx.h | 1 - 2 files changed, 24 insertions(+), 25 deletions(-) diff --git a/drivers/net/dsa/mv88e6xxx.c b/drivers/net/dsa/mv88e6xxx.c index 0687894..89d0206 100644 --- a/drivers/net/dsa/mv88e6xxx.c +++ b/drivers/net/dsa/mv88e6xxx.c @@ -1111,27 +1111,29 @@ static int _mv88e6xxx_port_state(struct dsa_switch *ds, int port, u8 state) return ret; } -static int _mv88e6xxx_port_based_vlan_map(struct dsa_switch *ds, int port) +static int _mv88e6xxx_port_map_vlantable(struct dsa_switch *ds, + struct dsa_port *dp) { struct mv88e6xxx_priv_state *ps = ds_to_priv(ds); - struct net_device *bridge = ps->ports[port].bridge_dev; const u16 mask = (1 << ps->info->num_ports) - 1; u16 output_ports = 0; + int port = dp->port; + struct dsa_port *intp; int reg; - int i; /* allow CPU port or DSA link(s) to send frames to every port */ if (dsa_is_cpu_port(ds, port) || dsa_is_dsa_port(ds, port)) { output_ports = mask; } else { - for (i = 0; i < ps->info->num_ports; ++i) { + dsa_switch_for_each_port(ds, intp, ps->info->num_ports) { /* allow sending frames to every group member */ - if (bridge && ps->ports[i].bridge_dev == bridge) - output_ports |= BIT(i); + if (intp->br && intp->br == dp->br) + output_ports |= BIT(intp->port); /* allow sending frames to CPU port and DSA link(s) */ - if (dsa_is_cpu_port(ds, i) || dsa_is_dsa_port(ds, i)) - output_ports |= BIT(i); + if (dsa_is_cpu_port(ds, intp->port) || + dsa_is_dsa_port(ds, intp->port)) + output_ports |= BIT(intp->port); } } @@ -2207,16 +2209,15 @@ int mv88e6xxx_port_bridge_join(struct dsa_switch *ds, struct dsa_port *dp, struct net_device *bridge) { struct mv88e6xxx_priv_state *ps = ds_to_priv(ds); - int i, err; + struct dsa_port *intp; + int err; mutex_lock(&ps->smi_mutex); - /* Assign the bridge and remap each port's VLANTable */ - ps->ports[dp->port].bridge_dev = bridge; - - for (i = 0; i < ps->info->num_ports; ++i) { - if (ps->ports[i].bridge_dev == bridge) { - err = _mv88e6xxx_port_based_vlan_map(ds, i); + /* Remap each port's VLANTable */ + dsa_switch_for_each_port(ds, intp, ps->info->num_ports) { + if (intp->br == bridge) { + err = _mv88e6xxx_port_map_vlantable(ds, intp); if (err) break; } @@ -2231,17 +2232,16 @@ void mv88e6xxx_port_bridge_leave(struct dsa_switch *ds, struct dsa_port *dp, struct net_device *bridge) { struct mv88e6xxx_priv_state *ps = ds_to_priv(ds); - int i; + struct dsa_port *intp; mutex_lock(&ps->smi_mutex); - /* Unassign the bridge and remap each port's VLANTable */ - ps->ports[dp->port].bridge_dev = NULL; - - for (i = 0; i < ps->info->num_ports; ++i) - if (i == dp->port || ps->ports[i].bridge_dev == bridge) - if (_mv88e6xxx_port_based_vlan_map(ds, i)) - netdev_warn(ds->ports[i], "failed to remap\n"); + /* Remap each port's VLANTable */ + dsa_switch_for_each_port(ds, intp, ps->info->num_ports) + if (intp == dp || intp->br == bridge) + if (_mv88e6xxx_port_map_vlantable(ds, intp)) + netdev_warn(ds->ports[intp->port], + "failed to remap\n"); mutex_unlock(&ps->smi_mutex); } @@ -2573,7 +2573,7 @@ static int mv88e6xxx_setup_port(struct dsa_switch *ds, struct dsa_port *dp) if (ret) goto abort; - ret = _mv88e6xxx_port_based_vlan_map(ds, dp->port); + ret = _mv88e6xxx_port_map_vlantable(ds, dp); if (ret) goto abort; diff --git a/drivers/net/dsa/mv88e6xxx.h b/drivers/net/dsa/mv88e6xxx.h index c49a514..56e3347 100644 --- a/drivers/net/dsa/mv88e6xxx.h +++ b/drivers/net/dsa/mv88e6xxx.h @@ -378,7 +378,6 @@ struct mv88e6xxx_vtu_stu_entry { }; struct mv88e6xxx_priv_port { - struct net_device *bridge_dev; u8 state; }; -- 2.8.0