scp->scsi_done(scp);
 
                if (cmd_is_tmf) {
-                       spin_lock_irqsave(&cfg->tmf_waitq.lock, lock_flags);
+                       spin_lock_irqsave(&cfg->tmf_slock, lock_flags);
                        cfg->tmf_active = false;
                        wake_up_all_locked(&cfg->tmf_waitq);
-                       spin_unlock_irqrestore(&cfg->tmf_waitq.lock,
-                                              lock_flags);
+                       spin_unlock_irqrestore(&cfg->tmf_slock, lock_flags);
                }
        } else
                complete(&cmd->cevent);
        struct device *dev = &cfg->dev->dev;
        ulong lock_flags;
        int rc = 0;
+       ulong to;
 
        cmd = cmd_checkout(afu);
        if (unlikely(!cmd)) {
                goto out;
        }
 
-       /* If a Task Management Function is active, do not send one more.
-        */
-       spin_lock_irqsave(&cfg->tmf_waitq.lock, lock_flags);
+       /* When Task Management Function is active do not send another */
+       spin_lock_irqsave(&cfg->tmf_slock, lock_flags);
        if (cfg->tmf_active)
-               wait_event_interruptible_locked_irq(cfg->tmf_waitq,
-                                                   !cfg->tmf_active);
+               wait_event_interruptible_lock_irq(cfg->tmf_waitq,
+                                                 !cfg->tmf_active,
+                                                 cfg->tmf_slock);
        cfg->tmf_active = true;
        cmd->cmd_tmf = true;
-       spin_unlock_irqrestore(&cfg->tmf_waitq.lock, lock_flags);
+       spin_unlock_irqrestore(&cfg->tmf_slock, lock_flags);
 
        cmd->rcb.ctx_id = afu->ctx_hndl;
        cmd->rcb.port_sel = port_sel;
        rc = send_cmd(afu, cmd);
        if (unlikely(rc)) {
                cmd_checkin(cmd);
-               spin_lock_irqsave(&cfg->tmf_waitq.lock, lock_flags);
+               spin_lock_irqsave(&cfg->tmf_slock, lock_flags);
                cfg->tmf_active = false;
-               spin_unlock_irqrestore(&cfg->tmf_waitq.lock, lock_flags);
+               spin_unlock_irqrestore(&cfg->tmf_slock, lock_flags);
                goto out;
        }
 
-       spin_lock_irqsave(&cfg->tmf_waitq.lock, lock_flags);
-       wait_event_interruptible_locked_irq(cfg->tmf_waitq, !cfg->tmf_active);
-       spin_unlock_irqrestore(&cfg->tmf_waitq.lock, lock_flags);
+       spin_lock_irqsave(&cfg->tmf_slock, lock_flags);
+       to = msecs_to_jiffies(5000);
+       to = wait_event_interruptible_lock_irq_timeout(cfg->tmf_waitq,
+                                                      !cfg->tmf_active,
+                                                      cfg->tmf_slock,
+                                                      to);
+       if (!to) {
+               cfg->tmf_active = false;
+               dev_err(dev, "%s: TMF timed out!\n", __func__);
+               rc = -1;
+       }
+       spin_unlock_irqrestore(&cfg->tmf_slock, lock_flags);
 out:
        return rc;
 }
                            get_unaligned_be32(&((u32 *)scp->cmnd)[2]),
                            get_unaligned_be32(&((u32 *)scp->cmnd)[3]));
 
-       /* If a Task Management Function is active, wait for it to complete
+       /*
+        * If a Task Management Function is active, wait for it to complete
         * before continuing with regular commands.
         */
-       spin_lock_irqsave(&cfg->tmf_waitq.lock, lock_flags);
+       spin_lock_irqsave(&cfg->tmf_slock, lock_flags);
        if (cfg->tmf_active) {
-               spin_unlock_irqrestore(&cfg->tmf_waitq.lock, lock_flags);
+               spin_unlock_irqrestore(&cfg->tmf_slock, lock_flags);
                rc = SCSI_MLQUEUE_HOST_BUSY;
                goto out;
        }
-       spin_unlock_irqrestore(&cfg->tmf_waitq.lock, lock_flags);
+       spin_unlock_irqrestore(&cfg->tmf_slock, lock_flags);
 
        switch (cfg->state) {
        case STATE_RESET:
        /* If a Task Management Function is active, wait for it to complete
         * before continuing with remove.
         */
-       spin_lock_irqsave(&cfg->tmf_waitq.lock, lock_flags);
+       spin_lock_irqsave(&cfg->tmf_slock, lock_flags);
        if (cfg->tmf_active)
-               wait_event_interruptible_locked_irq(cfg->tmf_waitq,
-                                                   !cfg->tmf_active);
-       spin_unlock_irqrestore(&cfg->tmf_waitq.lock, lock_flags);
+               wait_event_interruptible_lock_irq(cfg->tmf_waitq,
+                                                 !cfg->tmf_active,
+                                                 cfg->tmf_slock);
+       spin_unlock_irqrestore(&cfg->tmf_slock, lock_flags);
 
        cfg->state = STATE_FAILTERM;
        cxlflash_stop_term_user_contexts(cfg);