(adap->needs_hpd &&
                                 (!adap->is_configured && !adap->is_configuring)) ||
                                kthread_should_stop() ||
-                               (!adap->transmitting &&
+                               (!adap->transmit_in_progress &&
                                 !list_empty(&adap->transmit_queue)),
                                msecs_to_jiffies(CEC_XFER_TIMEOUT_MS));
                        timeout = err == 0;
                        /* Otherwise we just wait for something to happen. */
                        wait_event_interruptible(adap->kthread_waitq,
                                kthread_should_stop() ||
-                               (!adap->transmitting &&
+                               (!adap->transmit_in_progress &&
                                 !list_empty(&adap->transmit_queue)));
                }
 
                        pr_warn("cec-%s: message %*ph timed out\n", adap->name,
                                adap->transmitting->msg.len,
                                adap->transmitting->msg.msg);
+                       adap->transmit_in_progress = false;
                        adap->tx_timeouts++;
                        /* Just give up on this. */
                        cec_data_cancel(adap->transmitting,
                 * If we are still transmitting, or there is nothing new to
                 * transmit, then just continue waiting.
                 */
-               if (adap->transmitting || list_empty(&adap->transmit_queue))
+               if (adap->transmit_in_progress || list_empty(&adap->transmit_queue))
                        goto unlock;
 
                /* Get a new message to transmit */
                if (adap->ops->adap_transmit(adap, data->attempts,
                                             signal_free_time, &data->msg))
                        cec_data_cancel(data, CEC_TX_STATUS_ABORTED);
+               else
+                       adap->transmit_in_progress = true;
 
 unlock:
                mutex_unlock(&adap->lock);
        data = adap->transmitting;
        if (!data) {
                /*
-                * This can happen if a transmit was issued and the cable is
+                * This might happen if a transmit was issued and the cable is
                 * unplugged while the transmit is ongoing. Ignore this
                 * transmit in that case.
                 */
-               dprintk(1, "%s was called without an ongoing transmit!\n",
-                       __func__);
-               goto unlock;
+               if (!adap->transmit_in_progress)
+                       dprintk(1, "%s was called without an ongoing transmit!\n",
+                               __func__);
+               adap->transmit_in_progress = false;
+               goto wake_thread;
        }
+       adap->transmit_in_progress = false;
 
        msg = &data->msg;
 
         * for transmitting or to retry the current message.
         */
        wake_up_interruptible(&adap->kthread_waitq);
-unlock:
        mutex_unlock(&adap->lock);
 }
 EXPORT_SYMBOL_GPL(cec_transmit_done_ts);
                if (adap->monitor_all_cnt)
                        WARN_ON(call_op(adap, adap_monitor_all_enable, false));
                mutex_lock(&adap->devnode.lock);
-               if (adap->needs_hpd || list_empty(&adap->devnode.fhs))
+               if (adap->needs_hpd || list_empty(&adap->devnode.fhs)) {
                        WARN_ON(adap->ops->adap_enable(adap, false));
+                       adap->transmit_in_progress = false;
+                       wake_up_interruptible(&adap->kthread_waitq);
+               }
                mutex_unlock(&adap->devnode.lock);
                if (phys_addr == CEC_PHYS_ADDR_INVALID)
                        return;
 
        mutex_lock(&adap->devnode.lock);
        adap->last_initiator = 0xff;
+       adap->transmit_in_progress = false;
 
        if ((adap->needs_hpd || list_empty(&adap->devnode.fhs)) &&
            adap->ops->adap_enable(adap, true)) {