static int ixgbe_set_vf_mac(struct ixgbe_adapter *adapter,
                            int vf, unsigned char *mac_addr)
 {
+       s32 retval;
+
        ixgbe_del_mac_filter(adapter, adapter->vfinfo[vf].vf_mac_addresses, vf);
-       memcpy(adapter->vfinfo[vf].vf_mac_addresses, mac_addr, ETH_ALEN);
-       ixgbe_add_mac_filter(adapter, adapter->vfinfo[vf].vf_mac_addresses, vf);
+       retval = ixgbe_add_mac_filter(adapter, mac_addr, vf);
+       if (retval >= 0)
+               memcpy(adapter->vfinfo[vf].vf_mac_addresses, mac_addr,
+                      ETH_ALEN);
+       else
+               memset(adapter->vfinfo[vf].vf_mac_addresses, 0, ETH_ALEN);
 
-       return 0;
+       return retval;
 }
 
 int ixgbe_vf_configuration(struct pci_dev *pdev, unsigned int event_mask)
 int ixgbe_ndo_set_vf_mac(struct net_device *netdev, int vf, u8 *mac)
 {
        struct ixgbe_adapter *adapter = netdev_priv(netdev);
+       s32 retval;
 
        if (vf >= adapter->num_vfs)
                return -EINVAL;
 
-       if (is_zero_ether_addr(mac)) {
-               adapter->vfinfo[vf].pf_set_mac = false;
-               dev_info(&adapter->pdev->dev, "removing MAC on VF %d\n", vf);
-       } else if (is_valid_ether_addr(mac)) {
-               adapter->vfinfo[vf].pf_set_mac = true;
+       if (is_valid_ether_addr(mac)) {
                dev_info(&adapter->pdev->dev, "setting MAC %pM on VF %d\n",
                         mac, vf);
                dev_info(&adapter->pdev->dev, "Reload the VF driver to make this change effective.");
-               if (test_bit(__IXGBE_DOWN, &adapter->state)) {
-                       dev_warn(&adapter->pdev->dev, "The VF MAC address has been set, but the PF device is not up.\n");
-                       dev_warn(&adapter->pdev->dev, "Bring the PF device up before attempting to use the VF device.\n");
+
+               retval = ixgbe_set_vf_mac(adapter, vf, mac);
+               if (retval >= 0) {
+                       adapter->vfinfo[vf].pf_set_mac = true;
+
+                       if (test_bit(__IXGBE_DOWN, &adapter->state)) {
+                               dev_warn(&adapter->pdev->dev, "The VF MAC address has been set, but the PF device is not up.\n");
+                               dev_warn(&adapter->pdev->dev, "Bring the PF device up before attempting to use the VF device.\n");
+                       }
+               } else {
+                       dev_warn(&adapter->pdev->dev, "The VF MAC address was NOT set due to invalid or duplicate MAC address.\n");
+               }
+       } else if (is_zero_ether_addr(mac)) {
+               unsigned char *vf_mac_addr =
+                                          adapter->vfinfo[vf].vf_mac_addresses;
+
+               /* nothing to do */
+               if (is_zero_ether_addr(vf_mac_addr))
+                       return 0;
+
+               dev_info(&adapter->pdev->dev, "removing MAC on VF %d\n", vf);
+
+               retval = ixgbe_del_mac_filter(adapter, vf_mac_addr, vf);
+               if (retval >= 0) {
+                       adapter->vfinfo[vf].pf_set_mac = false;
+                       memcpy(vf_mac_addr, mac, ETH_ALEN);
+               } else {
+                       dev_warn(&adapter->pdev->dev, "Could NOT remove the VF MAC address.\n");
                }
        } else {
-               return -EINVAL;
+               retval = -EINVAL;
        }
 
-       return ixgbe_set_vf_mac(adapter, vf, mac);
+       return retval;
 }
 
 static int ixgbe_enable_port_vlan(struct ixgbe_adapter *adapter, int vf,