return;
        hw->hw_addr = NULL;
        dev_err(&adapter->pdev->dev, "Adapter removed\n");
-       schedule_work(&adapter->watchdog_task);
+       if (test_bit(__IXGBEVF_WORK_INIT, &adapter->state))
+               schedule_work(&adapter->watchdog_task);
 }
 
 static void ixgbevf_check_remove(struct ixgbe_hw *hw, u32 reg)
        adapter->watchdog_timer.function = ixgbevf_watchdog;
        adapter->watchdog_timer.data = (unsigned long)adapter;
 
+       if (IXGBE_REMOVED(hw->hw_addr)) {
+               err = -EIO;
+               goto err_sw_init;
+       }
        INIT_WORK(&adapter->reset_task, ixgbevf_reset_task);
        INIT_WORK(&adapter->watchdog_task, ixgbevf_watchdog_task);
+       set_bit(__IXGBEVF_WORK_INIT, &adapter->state);
 
        err = ixgbevf_init_interrupt_scheme(adapter);
        if (err)
        struct net_device *netdev = pci_get_drvdata(pdev);
        struct ixgbevf_adapter *adapter = netdev_priv(netdev);
 
+       if (!test_bit(__IXGBEVF_WORK_INIT, &adapter->state))
+               return PCI_ERS_RESULT_DISCONNECT;
+
        rtnl_lock();
        netif_device_detach(netdev);