INIT_WORK(&reprobe->work, iwl_mvm_reprobe_wk);
                schedule_work(&reprobe->work);
        } else if (mvm->fwrt.cur_fw_img == IWL_UCODE_REGULAR &&
-                  mvm->hw_registered) {
+                  mvm->hw_registered &&
+                  !test_bit(STATUS_TRANS_DEAD, &mvm->trans->status)) {
                /* don't let the transport/FW power down */
                iwl_mvm_ref(mvm, IWL_MVM_REF_UCODE_DOWN);
 
 {
        struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode);
 
-       iwl_mvm_dump_nic_error_log(mvm);
+       if (!test_bit(STATUS_TRANS_DEAD, &mvm->trans->status))
+               iwl_mvm_dump_nic_error_log(mvm);
 
        iwl_mvm_nic_restart(mvm, true);
 }
 
  * @fh_mask: current unmasked fh causes
  * @hw_mask: current unmasked hw causes
  * @in_rescan: true if we have triggered a device rescan
- * @scheduled_for_removal: true if we have scheduled a device removal
  */
 struct iwl_trans_pcie {
        struct iwl_rxq *rxq;
        cpumask_t affinity_mask[IWL_MAX_RX_HW_QUEUES];
        u16 tx_cmd_queue_size;
        bool in_rescan;
-       bool scheduled_for_removal;
 };
 
 static inline struct iwl_trans_pcie *
 
                if (iwlwifi_mod_params.remove_when_gone && cntrl == ~0U) {
                        struct iwl_trans_pcie_removal *removal;
 
-                       if (trans_pcie->scheduled_for_removal)
+                       if (test_bit(STATUS_TRANS_DEAD, &trans->status))
                                goto err;
 
                        IWL_ERR(trans, "Device gone - scheduling removal!\n");
                         * we don't need to clear this flag, because
                         * the trans will be freed and reallocated.
                        */
-                       trans_pcie->scheduled_for_removal = true;
+                       set_bit(STATUS_TRANS_DEAD, &trans->status);
 
                        removal->pdev = to_pci_dev(trans->dev);
                        INIT_WORK(&removal->work, iwl_trans_pcie_removal_wk);
        u8 wr_ptr;
 
        /* Make sure the NIC is still alive in the bus */
-       if (trans_pcie->scheduled_for_removal)
-               return -EIO;
+       if (test_bit(STATUS_TRANS_DEAD, &trans->status))
+               return -ENODEV;
 
        if (!test_bit(txq_idx, trans_pcie->queue_used))
                return -EINVAL;
 
        lockdep_assert_held(&trans_pcie->reg_lock);
 
        /* Make sure the NIC is still alive in the bus */
-       if (trans_pcie->scheduled_for_removal)
-               return -EIO;
+       if (test_bit(STATUS_TRANS_DEAD, &trans->status))
+               return -ENODEV;
 
        if (!(cmd->flags & CMD_SEND_IN_IDLE) &&
            !trans_pcie->ref_cmd_in_flight) {
 
 int iwl_trans_pcie_send_hcmd(struct iwl_trans *trans, struct iwl_host_cmd *cmd)
 {
-       struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
-
        /* Make sure the NIC is still alive in the bus */
-       if (trans_pcie->scheduled_for_removal)
-               return -EIO;
+       if (test_bit(STATUS_TRANS_DEAD, &trans->status))
+               return -ENODEV;
 
        if (!(cmd->flags & CMD_SEND_IN_RFKILL) &&
            test_bit(STATUS_RFKILL_OPMODE, &trans->status)) {