diff options
Diffstat (limited to 'net/8021q/vlan.c')
| -rw-r--r-- | net/8021q/vlan.c | 13 | 
1 files changed, 11 insertions, 2 deletions
diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c index 3c1c8c14e92..a2ad1525057 100644 --- a/net/8021q/vlan.c +++ b/net/8021q/vlan.c @@ -155,9 +155,10 @@ void unregister_vlan_dev(struct net_device *dev, struct list_head *head)  	BUG_ON(!grp);  	/* Take it out of our own structures, but be sure to interlock with -	 * HW accelerating devices or SW vlan input packet processing. +	 * HW accelerating devices or SW vlan input packet processing if +	 * VLAN is not 0 (leave it there for 802.1p).  	 */ -	if (real_dev->features & NETIF_F_HW_VLAN_FILTER) +	if (vlan_id && (real_dev->features & NETIF_F_HW_VLAN_FILTER))  		ops->ndo_vlan_rx_kill_vid(real_dev, vlan_id);  	grp->nr_vlans--; @@ -419,6 +420,14 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,  	if (is_vlan_dev(dev))  		__vlan_device_event(dev, event); +	if ((event == NETDEV_UP) && +	    (dev->features & NETIF_F_HW_VLAN_FILTER) && +	    dev->netdev_ops->ndo_vlan_rx_add_vid) { +		pr_info("8021q: adding VLAN 0 to HW filter on device %s\n", +			dev->name); +		dev->netdev_ops->ndo_vlan_rx_add_vid(dev, 0); +	} +  	grp = __vlan_find_group(dev);  	if (!grp)  		goto out;  |