diff options
Diffstat (limited to 'drivers/net/team/team.c')
| -rw-r--r-- | drivers/net/team/team.c | 24 | 
1 files changed, 18 insertions, 6 deletions
| diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c index aac133a1e27a..154a3c0a6dfd 100644 --- a/drivers/net/team/team.c +++ b/drivers/net/team/team.c @@ -1275,10 +1275,12 @@ static int team_port_add(struct team *team, struct net_device *port_dev,  		}  	} -	netif_addr_lock_bh(dev); -	dev_uc_sync_multiple(port_dev, dev); -	dev_mc_sync_multiple(port_dev, dev); -	netif_addr_unlock_bh(dev); +	if (dev->flags & IFF_UP) { +		netif_addr_lock_bh(dev); +		dev_uc_sync_multiple(port_dev, dev); +		dev_mc_sync_multiple(port_dev, dev); +		netif_addr_unlock_bh(dev); +	}  	port->index = -1;  	list_add_tail_rcu(&port->list, &team->port_list); @@ -1349,8 +1351,10 @@ static int team_port_del(struct team *team, struct net_device *port_dev)  	netdev_rx_handler_unregister(port_dev);  	team_port_disable_netpoll(port);  	vlan_vids_del_by_dev(port_dev, dev); -	dev_uc_unsync(port_dev, dev); -	dev_mc_unsync(port_dev, dev); +	if (dev->flags & IFF_UP) { +		dev_uc_unsync(port_dev, dev); +		dev_mc_unsync(port_dev, dev); +	}  	dev_close(port_dev);  	team_port_leave(team, port); @@ -1700,6 +1704,14 @@ static int team_open(struct net_device *dev)  static int team_close(struct net_device *dev)  { +	struct team *team = netdev_priv(dev); +	struct team_port *port; + +	list_for_each_entry(port, &team->port_list, list) { +		dev_uc_unsync(port->dev, dev); +		dev_mc_unsync(port->dev, dev); +	} +  	return 0;  } | 
