Skip to content

Commit 466dfa0

Browse files
viviendavem330
authored andcommitted
net: dsa: mv88e6xxx: assign dynamic FDB to bridges
Give a new bridge a fresh FDB, assign it to its members, and restore a fresh FDB to a port leaving a bridge. Signed-off-by: Vivien Didelot <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 2db9ce1 commit 466dfa0

File tree

1 file changed

+39
-2
lines changed

1 file changed

+39
-2
lines changed

drivers/net/dsa/mv88e6xxx.c

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2093,19 +2093,56 @@ int mv88e6xxx_port_bridge_join(struct dsa_switch *ds, int port,
20932093
struct net_device *bridge)
20942094
{
20952095
struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
2096+
u16 fid;
2097+
int i, err;
2098+
2099+
mutex_lock(&ps->smi_mutex);
2100+
2101+
/* Get or create the bridge FID and assign it to the port */
2102+
for (i = 0; i < ps->num_ports; ++i)
2103+
if (ps->ports[i].bridge_dev == bridge)
2104+
break;
2105+
2106+
if (i < ps->num_ports)
2107+
err = _mv88e6xxx_port_fid_get(ds, i, &fid);
2108+
else
2109+
err = _mv88e6xxx_fid_new(ds, &fid);
2110+
if (err)
2111+
goto unlock;
2112+
2113+
err = _mv88e6xxx_port_fid_set(ds, port, fid);
2114+
if (err)
2115+
goto unlock;
20962116

20972117
ps->ports[port].bridge_dev = bridge;
2118+
unlock:
2119+
mutex_unlock(&ps->smi_mutex);
20982120

2099-
return 0;
2121+
return err;
21002122
}
21012123

21022124
int mv88e6xxx_port_bridge_leave(struct dsa_switch *ds, int port)
21032125
{
21042126
struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
2127+
u16 fid;
2128+
int err;
2129+
2130+
mutex_lock(&ps->smi_mutex);
2131+
2132+
/* Give the port a fresh Filtering Information Database */
2133+
err = _mv88e6xxx_fid_new(ds, &fid);
2134+
if (err)
2135+
goto unlock;
2136+
2137+
err = _mv88e6xxx_port_fid_set(ds, port, fid);
2138+
if (err)
2139+
goto unlock;
21052140

21062141
ps->ports[port].bridge_dev = NULL;
2142+
unlock:
2143+
mutex_unlock(&ps->smi_mutex);
21072144

2108-
return 0;
2145+
return err;
21092146
}
21102147

21112148
static int mv88e6xxx_setup_port_default_vlan(struct dsa_switch *ds, int port)

0 commit comments

Comments
 (0)