int i;
        u32 reg;
 
+       if (test_and_set_bit(__I40E_VF_DISABLE, &pf->state))
+               return;
+
        /* warn the VF */
        clear_bit(I40E_VF_STAT_ACTIVE, &vf->vf_states);
 
        /* tell the VF the reset is done */
        wr32(hw, I40E_VFGEN_RSTAT1(vf->vf_id), I40E_VFR_VFACTIVE);
        i40e_flush(hw);
+       clear_bit(__I40E_VF_DISABLE, &pf->state);
 }
 
 /**
 
        if (!pf->vf)
                return;
+       while (test_and_set_bit(__I40E_VF_DISABLE, &pf->state))
+               usleep_range(1000, 2000);
 
        /* Disable IOV before freeing resources. This lets any VF drivers
         * running in the host get themselves cleaned up before we yank
 
        msleep(20); /* let any messages in transit get finished up */
 
-       /* Disable interrupt 0 so we don't try to handle the VFLR. */
-       i40e_irq_dynamic_disable_icr0(pf);
-
        /* free up vf resources */
        tmp = pf->num_alloc_vfs;
        pf->num_alloc_vfs = 0;
                dev_warn(&pf->pdev->dev,
                         "unable to disable SR-IOV because VFs are assigned.\n");
        }
-
-       /* Re-enable interrupt 0. */
-       i40e_irq_dynamic_enable_icr0(pf);
+       clear_bit(__I40E_VF_DISABLE, &pf->state);
 }
 
 #ifdef CONFIG_PCI_IOV