static const u32 test_pattern[] = {
                0x5A5A5A5A, 0xA5A5A5A5, 0x00000000, 0xFFFFFFFF};
 
+       if (ixgbe_removed(adapter->hw.hw_addr)) {
+               *data = 1;
+               return 1;
+       }
        for (pat = 0; pat < ARRAY_SIZE(test_pattern); pat++) {
                before = ixgbe_read_reg(&adapter->hw, reg);
                ixgbe_write_reg(&adapter->hw, reg, test_pattern[pat] & write);
 {
        u32 val, before;
 
+       if (ixgbe_removed(adapter->hw.hw_addr)) {
+               *data = 1;
+               return 1;
+       }
        before = ixgbe_read_reg(&adapter->hw, reg);
        ixgbe_write_reg(&adapter->hw, reg, write & mask);
        val = ixgbe_read_reg(&adapter->hw, reg);
        u32 value, before, after;
        u32 i, toggle;
 
+       if (ixgbe_removed(adapter->hw.hw_addr)) {
+               e_err(drv, "Adapter removed - register test blocked\n");
+               *data = 1;
+               return 1;
+       }
        switch (adapter->hw.mac.type) {
        case ixgbe_mac_82598EB:
                toggle = 0x7FFFF3FF;
        struct ixgbe_adapter *adapter = netdev_priv(netdev);
        bool if_running = netif_running(netdev);
 
+       if (ixgbe_removed(adapter->hw.hw_addr)) {
+               e_err(hw, "Adapter removed - test blocked\n");
+               data[0] = 1;
+               data[1] = 1;
+               data[2] = 1;
+               data[3] = 1;
+               eth_test->flags |= ETH_TEST_FL_FAILED;
+               return;
+       }
        set_bit(__IXGBE_TESTING, &adapter->state);
        if (eth_test->flags == ETH_TEST_FL_OFFLINE) {
                struct ixgbe_hw *hw = &adapter->hw;
 
                return;
        hw->hw_addr = NULL;
        e_dev_err("Adapter removed\n");
+       ixgbe_service_event_schedule(adapter);
 }
 
 void ixgbe_check_remove(struct ixgbe_hw *hw, u32 reg)
        u32 rxdctl;
        u8 reg_idx = ring->reg_idx;
 
+       if (ixgbe_removed(hw->hw_addr))
+               return;
        /* RXDCTL.EN will return 0 on 82598 if link is down, so skip it */
        if (hw->mac.type == ixgbe_mac_82598EB &&
            !(IXGBE_READ_REG(hw, IXGBE_LINKS) & IXGBE_LINKS_UP))
        u32 rxdctl;
        u8 reg_idx = ring->reg_idx;
 
+       if (ixgbe_removed(hw->hw_addr))
+               return;
        rxdctl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(reg_idx));
        rxdctl &= ~IXGBE_RXDCTL_ENABLE;
 
        struct ixgbe_hw *hw = &adapter->hw;
        int err;
 
+       if (ixgbe_removed(hw->hw_addr))
+               return;
        /* lock SFP init bit to prevent race conditions with the watchdog */
        while (test_and_set_bit(__IXGBE_IN_SFP_INIT, &adapter->state))
                usleep_range(1000, 2000);
        struct ixgbe_adapter *adapter = container_of(work,
                                                     struct ixgbe_adapter,
                                                     service_task);
+       if (ixgbe_removed(adapter->hw.hw_addr)) {
+               if (!test_bit(__IXGBE_DOWN, &adapter->state)) {
+                       rtnl_lock();
+                       ixgbe_down(adapter);
+                       rtnl_unlock();
+               }
+               ixgbe_service_event_complete(adapter);
+               return;
+       }
        ixgbe_reset_subtask(adapter);
        ixgbe_sfp_detection_subtask(adapter);
        ixgbe_sfp_link_config_subtask(adapter);