diff options
Diffstat (limited to 'net/dsa')
| -rw-r--r-- | net/dsa/dsa2.c | 25 | 
1 files changed, 6 insertions, 19 deletions
diff --git a/net/dsa/dsa2.c b/net/dsa/dsa2.c index 3d21521453fe..dcad3100b164 100644 --- a/net/dsa/dsa2.c +++ b/net/dsa/dsa2.c @@ -1718,7 +1718,6 @@ EXPORT_SYMBOL_GPL(dsa_unregister_switch);  void dsa_switch_shutdown(struct dsa_switch *ds)  {  	struct net_device *master, *slave_dev; -	LIST_HEAD(unregister_list);  	struct dsa_port *dp;  	mutex_lock(&dsa2_mutex); @@ -1729,25 +1728,13 @@ void dsa_switch_shutdown(struct dsa_switch *ds)  		slave_dev = dp->slave;  		netdev_upper_dev_unlink(master, slave_dev); -		/* Just unlinking ourselves as uppers of the master is not -		 * sufficient. When the master net device unregisters, that will -		 * also call dev_close, which we will catch as NETDEV_GOING_DOWN -		 * and trigger a dev_close on our own devices (dsa_slave_close). -		 * In turn, that will call dev_mc_unsync on the master's net -		 * device. If the master is also a DSA switch port, this will -		 * trigger dsa_slave_set_rx_mode which will call dev_mc_sync on -		 * its own master. Lockdep will complain about the fact that -		 * all cascaded masters have the same dsa_master_addr_list_lock_key, -		 * which it normally would not do if the cascaded masters would -		 * be in a proper upper/lower relationship, which we've just -		 * destroyed. -		 * To suppress the lockdep warnings, let's actually unregister -		 * the DSA slave interfaces too, to avoid the nonsensical -		 * multicast address list synchronization on shutdown. -		 */ -		unregister_netdevice_queue(slave_dev, &unregister_list);  	} -	unregister_netdevice_many(&unregister_list); + +	/* Disconnect from further netdevice notifiers on the master, +	 * since netdev_uses_dsa() will now return false. +	 */ +	dsa_switch_for_each_cpu_port(dp, ds) +		dp->master->dsa_ptr = NULL;  	rtnl_unlock();  	mutex_unlock(&dsa2_mutex);  |