i40e_update_vsi_stats(vsi);
 }
 
+/**
+ * i40e_count_filters - counts VSI mac filters
+ * @vsi: the VSI to be searched
+ *
+ * Returns count of mac filters
+ **/
+int i40e_count_filters(struct i40e_vsi *vsi)
+{
+       struct i40e_mac_filter *f;
+       struct hlist_node *h;
+       int bkt;
+       int cnt = 0;
+
+       hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist)
+               ++cnt;
+
+       return cnt;
+}
+
 /**
  * i40e_find_filter - Search VSI filter list for specific mac/vlan filter
  * @vsi: the VSI to be searched
 
                i40e_vsi_release(pf->vsi[vf->lan_vsi_idx]);
                vf->lan_vsi_idx = 0;
                vf->lan_vsi_id = 0;
-               vf->num_mac = 0;
        }
 
        /* do the accounting and remove additional ADq VSI's */
                                           struct virtchnl_ether_addr_list *al)
 {
        struct i40e_pf *pf = vf->pf;
+       struct i40e_vsi *vsi = pf->vsi[vf->lan_vsi_idx];
+       int mac2add_cnt = 0;
        int i;
 
-       /* If this VF is not privileged, then we can't add more than a limited
-        * number of addresses. Check to make sure that the additions do not
-        * push us over the limit.
-        */
-       if (!test_bit(I40E_VIRTCHNL_VF_CAP_PRIVILEGE, &vf->vf_caps) &&
-           (vf->num_mac + al->num_elements) > I40E_VC_MAX_MAC_ADDR_PER_VF) {
-               dev_err(&pf->pdev->dev,
-                       "Cannot add more MAC addresses, VF is not trusted, switch the VF to trusted to add more functionality\n");
-               return -EPERM;
-       }
-
        for (i = 0; i < al->num_elements; i++) {
+               struct i40e_mac_filter *f;
                u8 *addr = al->list[i].addr;
 
                if (is_broadcast_ether_addr(addr) ||
                                "VF attempting to override administratively set MAC address, bring down and up the VF interface to resume normal operation\n");
                        return -EPERM;
                }
+
+               /*count filters that really will be added*/
+               f = i40e_find_mac(vsi, addr);
+               if (!f)
+                       ++mac2add_cnt;
        }
 
+       /* If this VF is not privileged, then we can't add more than a limited
+        * number of addresses. Check to make sure that the additions do not
+        * push us over the limit.
+        */
+       if (!test_bit(I40E_VIRTCHNL_VF_CAP_PRIVILEGE, &vf->vf_caps) &&
+           (i40e_count_filters(vsi) + mac2add_cnt) >
+                   I40E_VC_MAX_MAC_ADDR_PER_VF) {
+               dev_err(&pf->pdev->dev,
+                       "Cannot add more MAC addresses, VF is not trusted, switch the VF to trusted to add more functionality\n");
+               return -EPERM;
+       }
        return 0;
 }
 
                                ret = I40E_ERR_PARAM;
                                spin_unlock_bh(&vsi->mac_filter_hash_lock);
                                goto error_param;
-                       } else {
-                               vf->num_mac++;
                        }
                }
        }
                        ret = I40E_ERR_INVALID_MAC_ADDR;
                        goto error_param;
                }
-
-               if (vf->pf_set_mac &&
-                   ether_addr_equal(al->list[i].addr,
-                                    vf->default_lan_addr.addr)) {
-                       dev_err(&pf->pdev->dev,
-                               "MAC addr %pM has been set by PF, cannot delete it for VF %d, reset VF to change MAC addr\n",
-                               vf->default_lan_addr.addr, vf->vf_id);
-                       ret = I40E_ERR_PARAM;
-                       goto error_param;
-               }
        }
        vsi = pf->vsi[vf->lan_vsi_idx];
 
                        ret = I40E_ERR_INVALID_MAC_ADDR;
                        spin_unlock_bh(&vsi->mac_filter_hash_lock);
                        goto error_param;
-               } else {
-                       vf->num_mac--;
                }
 
        spin_unlock_bh(&vsi->mac_filter_hash_lock);