mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 04:18:39 +08:00
net: dsa: Move VLAN filtering syncing out of dsa_switch_bridge_leave
Most of dsa_switch_bridge_leave was, in fact, dealing with the syncing of VLAN filtering for switches on which that is a global setting. Separate the two phases to prepare for the cross-chip related bugfix in the following commit. Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com> Reviewed-by: Vladimir Oltean <olteanv@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
51d555cfdc
commit
381a730182
@ -113,26 +113,15 @@ static int dsa_switch_bridge_join(struct dsa_switch *ds,
|
||||
return dsa_tag_8021q_bridge_join(ds, info);
|
||||
}
|
||||
|
||||
static int dsa_switch_bridge_leave(struct dsa_switch *ds,
|
||||
struct dsa_notifier_bridge_info *info)
|
||||
static int dsa_switch_sync_vlan_filtering(struct dsa_switch *ds,
|
||||
struct dsa_notifier_bridge_info *info)
|
||||
{
|
||||
struct dsa_switch_tree *dst = ds->dst;
|
||||
struct netlink_ext_ack extack = {0};
|
||||
bool change_vlan_filtering = false;
|
||||
bool vlan_filtering;
|
||||
struct dsa_port *dp;
|
||||
int err;
|
||||
|
||||
if (dst->index == info->tree_index && ds->index == info->sw_index &&
|
||||
ds->ops->port_bridge_leave)
|
||||
ds->ops->port_bridge_leave(ds, info->port, info->bridge);
|
||||
|
||||
if ((dst->index != info->tree_index || ds->index != info->sw_index) &&
|
||||
ds->ops->crosschip_bridge_leave)
|
||||
ds->ops->crosschip_bridge_leave(ds, info->tree_index,
|
||||
info->sw_index, info->port,
|
||||
info->bridge);
|
||||
|
||||
if (ds->needs_standalone_vlan_filtering &&
|
||||
!br_vlan_enabled(info->bridge.dev)) {
|
||||
change_vlan_filtering = true;
|
||||
@ -172,6 +161,29 @@ static int dsa_switch_bridge_leave(struct dsa_switch *ds,
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dsa_switch_bridge_leave(struct dsa_switch *ds,
|
||||
struct dsa_notifier_bridge_info *info)
|
||||
{
|
||||
struct dsa_switch_tree *dst = ds->dst;
|
||||
int err;
|
||||
|
||||
if (dst->index == info->tree_index && ds->index == info->sw_index &&
|
||||
ds->ops->port_bridge_leave)
|
||||
ds->ops->port_bridge_leave(ds, info->port, info->bridge);
|
||||
|
||||
if ((dst->index != info->tree_index || ds->index != info->sw_index) &&
|
||||
ds->ops->crosschip_bridge_leave)
|
||||
ds->ops->crosschip_bridge_leave(ds, info->tree_index,
|
||||
info->sw_index, info->port,
|
||||
info->bridge);
|
||||
|
||||
err = dsa_switch_sync_vlan_filtering(ds, info);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return dsa_tag_8021q_bridge_leave(ds, info);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user