Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
[linux-2.6-block.git] / net / 8021q / vlan_core.c
index 0beb44f2fe1f0df45b8125cf4b7b9610fa7503e9..f001582345052f8c26e008058ae5f721f8bc224d 100644 (file)
@@ -407,6 +407,8 @@ int vlan_vids_add_by_dev(struct net_device *dev,
                return 0;
 
        list_for_each_entry(vid_info, &vlan_info->vid_list, list) {
+               if (!vlan_hw_filter_capable(by_dev, vid_info->proto))
+                       continue;
                err = vlan_vid_add(dev, vid_info->proto, vid_info->vid);
                if (err)
                        goto unwind;
@@ -417,6 +419,8 @@ unwind:
        list_for_each_entry_continue_reverse(vid_info,
                                             &vlan_info->vid_list,
                                             list) {
+               if (!vlan_hw_filter_capable(by_dev, vid_info->proto))
+                       continue;
                vlan_vid_del(dev, vid_info->proto, vid_info->vid);
        }
 
@@ -436,8 +440,11 @@ void vlan_vids_del_by_dev(struct net_device *dev,
        if (!vlan_info)
                return;
 
-       list_for_each_entry(vid_info, &vlan_info->vid_list, list)
+       list_for_each_entry(vid_info, &vlan_info->vid_list, list) {
+               if (!vlan_hw_filter_capable(by_dev, vid_info->proto))
+                       continue;
                vlan_vid_del(dev, vid_info->proto, vid_info->vid);
+       }
 }
 EXPORT_SYMBOL(vlan_vids_del_by_dev);