set_bit(__ICE_MDD_EVENT_PENDING, pf->state);
        }
        if (oicr & PFINT_OICR_VFLR_M) {
-               ena_mask &= ~PFINT_OICR_VFLR_M;
-               set_bit(__ICE_VFLR_EVENT_PENDING, pf->state);
+               /* disable any further VFLR event notifications */
+               if (test_bit(__ICE_VF_RESETS_DISABLED, pf->state)) {
+                       u32 reg = rd32(hw, PFINT_OICR_ENA);
+
+                       reg &= ~PFINT_OICR_VFLR_M;
+                       wr32(hw, PFINT_OICR_ENA, reg);
+               } else {
+                       ena_mask &= ~PFINT_OICR_VFLR_M;
+                       set_bit(__ICE_VFLR_EVENT_PENDING, pf->state);
+               }
        }
 
        if (oicr & PFINT_OICR_GRST_M) {
                msleep(100);
        }
 
+       if (test_bit(ICE_FLAG_SRIOV_ENA, pf->flags)) {
+               set_bit(__ICE_VF_RESETS_DISABLED, pf->state);
+               ice_free_vfs(pf);
+       }
+
        set_bit(__ICE_DOWN, pf->state);
        ice_service_task_stop(pf);
 
-       if (test_bit(ICE_FLAG_SRIOV_ENA, pf->flags))
-               ice_free_vfs(pf);
        ice_vsi_release_all(pf);
        ice_free_irq_msix_misc(pf);
        ice_for_each_vsi(pf, i) {
 
        while (test_and_set_bit(__ICE_VF_DIS, pf->state))
                usleep_range(1000, 2000);
 
-       /* Avoid wait time by stopping all VFs at the same time */
-       ice_for_each_vf(pf, i)
-               if (test_bit(ICE_VF_STATE_QS_ENA, pf->vf[i].vf_states))
-                       ice_dis_vf_qs(&pf->vf[i]);
-
        /* Disable IOV before freeing resources. This lets any VF drivers
         * running in the host get themselves cleaned up before we yank
         * the carpet out from underneath their feet.
        else
                dev_warn(dev, "VFs are assigned - not disabling SR-IOV\n");
 
+       /* Avoid wait time by stopping all VFs at the same time */
+       ice_for_each_vf(pf, i)
+               if (test_bit(ICE_VF_STATE_QS_ENA, pf->vf[i].vf_states))
+                       ice_dis_vf_qs(&pf->vf[i]);
+
        tmp = pf->num_alloc_vfs;
        pf->num_qps_per_vf = 0;
        pf->num_alloc_vfs = 0;
  * @vf: pointer to the VF structure
  * @is_vflr: true if VFLR was issued, false if not
  *
- * Returns true if the VF is reset, false otherwise.
+ * Returns true if the VF is currently in reset, resets successfully, or resets
+ * are disabled and false otherwise.
  */
 bool ice_reset_vf(struct ice_vf *vf, bool is_vflr)
 {
 
        dev = ice_pf_to_dev(pf);
 
+       if (test_bit(__ICE_VF_RESETS_DISABLED, pf->state)) {
+               dev_dbg(dev, "Trying to reset VF %d, but all VF resets are disabled\n",
+                       vf->vf_id);
+               return true;
+       }
+
        if (ice_is_vf_disabled(vf)) {
                dev_dbg(dev, "VF is already disabled, there is no need for resetting it, telling VM, all is fine %d\n",
                        vf->vf_id);