if (ether_addr_equal(netdev->dev_addr, addr->sa_data))
                return 0;
 
+       if (test_bit(__I40E_DOWN, &vsi->back->state) ||
+           test_bit(__I40E_RESET_RECOVERY_PENDING, &vsi->back->state))
+               return -EADDRNOTAVAIL;
+
        if (vsi->type == I40E_VSI_MAIN) {
                i40e_status ret;
                ret = i40e_aq_mac_address_write(&vsi->back->hw,
 {
        struct i40e_mac_filter *f, *add_f;
        bool is_netdev, is_vf;
-       int ret;
 
        is_vf = (vsi->type == I40E_VSI_SRIOV);
        is_netdev = !!(vsi->netdev);
                }
        }
 
-       ret = i40e_sync_vsi_filters(vsi);
-       if (ret) {
-               dev_info(&vsi->back->pdev->dev,
-                        "Could not sync filters for vid %d\n", vid);
-               return ret;
-       }
-
        /* Now if we add a vlan tag, make sure to check if it is the first
         * tag (i.e. a "tag" -1 does exist) and if so replace the -1 "tag"
         * with 0, so we now accept untagged and specified tagged traffic
                                }
                        }
                }
-               ret = i40e_sync_vsi_filters(vsi);
        }
 
-       return ret;
+       if (test_bit(__I40E_DOWN, &vsi->back->state) ||
+           test_bit(__I40E_RESET_RECOVERY_PENDING, &vsi->back->state))
+               return 0;
+
+       return i40e_sync_vsi_filters(vsi);
 }
 
 /**
        struct i40e_mac_filter *f, *add_f;
        bool is_vf, is_netdev;
        int filter_count = 0;
-       int ret;
 
        is_vf = (vsi->type == I40E_VSI_SRIOV);
        is_netdev = !!(netdev);
        list_for_each_entry(f, &vsi->mac_filter_list, list)
                i40e_del_filter(vsi, f->macaddr, vid, is_vf, is_netdev);
 
-       ret = i40e_sync_vsi_filters(vsi);
-       if (ret) {
-               dev_info(&vsi->back->pdev->dev, "Could not sync filters\n");
-               return ret;
-       }
-
        /* go through all the filters for this VSI and if there is only
         * vid == 0 it means there are no other filters, so vid 0 must
         * be replaced with -1. This signifies that we should from now
                }
        }
 
+       if (test_bit(__I40E_DOWN, &vsi->back->state) ||
+           test_bit(__I40E_RESET_RECOVERY_PENDING, &vsi->back->state))
+               return 0;
+
        return i40e_sync_vsi_filters(vsi);
 }