return -ENOMEM;
                        }
                }
+       }
 
+       /* Do not assume that I40E_VLAN_ANY should be reset to VLAN 0 */
+       if (vid > 0 && !vsi->info.pvid) {
                list_for_each_entry(f, &vsi->mac_filter_list, list) {
                        if (i40e_find_filter(vsi, f->macaddr, I40E_VLAN_ANY,
                                             is_vf, is_netdev)) {
 
                        "VF %d has already configured VLAN filters and the administrator is requesting a port VLAN override.\nPlease unload and reload the VF driver for this change to take effect.\n",
                        vf_id);
 
+       /* Check for condition where there was already a port VLAN ID
+        * filter set and now it is being deleted by setting it to zero.
+        * Before deleting all the old VLAN filters we must add new ones
+        * with -1 (I40E_VLAN_ANY) or otherwise we're left with all our
+        * MAC addresses deleted.
+        */
+       if (!(vlan_id || qos) && vsi->info.pvid)
+               ret = i40e_vsi_add_vlan(vsi, I40E_VLAN_ANY);
+
        if (vsi->info.pvid) {
                /* kill old VLAN */
                ret = i40e_vsi_kill_vlan(vsi, (le16_to_cpu(vsi->info.pvid) &
                                 vsi->back->hw.aq.asq_last_status);
                        goto error_pvid;
                }
+               /* Kill non-vlan MAC filters - ignore error return since
+                * there might not be any non-vlan MAC filters.
+                */
+               i40e_vsi_kill_vlan(vsi, I40E_VLAN_ANY);
        }
 
        if (ret) {