The interface for network device VLAN extension was confusing. The kill_vid function is only really useful for devices that do hardware filtering. Devices that only do VLAN receiption without filtering were being forced to provide the hook, and there were bugs in those devices. Many drivers had kill_vid routine that called vlan_group_set_device, with NULL, but that is done already. Signed-off-by: Stephen Hemminger --- a/net/8021q/vlan.c 2007-06-01 08:18:32.000000000 -0700 +++ b/net/8021q/vlan.c 2007-06-01 08:28:02.000000000 -0700 @@ -240,10 +240,8 @@ static int unregister_vlan_dev(struct ne * interlock with HW accelerating devices or SW vlan * input packet processing. */ - if (real_dev->features & - (NETIF_F_HW_VLAN_RX | NETIF_F_HW_VLAN_FILTER)) { + if (real_dev->features & NETIF_F_HW_VLAN_FILTER) real_dev->vlan_rx_kill_vid(real_dev, vlan_id); - } vlan_group_set_device(grp, vlan_id, NULL); synchronize_net(); @@ -409,16 +407,14 @@ static struct net_device *register_vlan_ } if ((real_dev->features & NETIF_F_HW_VLAN_RX) && - (real_dev->vlan_rx_register == NULL || - real_dev->vlan_rx_kill_vid == NULL)) { + !real_dev->vlan_rx_register) { printk(VLAN_DBG "%s: Device %s has buggy VLAN hw accel.\n", __FUNCTION__, real_dev->name); goto out_put_dev; } if ((real_dev->features & NETIF_F_HW_VLAN_FILTER) && - (real_dev->vlan_rx_add_vid == NULL || - real_dev->vlan_rx_kill_vid == NULL)) { + (!real_dev->vlan_rx_add_vid || !real_dev->vlan_rx_kill_vid)) { printk(VLAN_DBG "%s: Device %s has buggy VLAN hw accel.\n", __FUNCTION__, real_dev->name); goto out_put_dev; -- Stephen Hemminger - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html