cec_data_cancel(data, CEC_TX_STATUS_ABORTED);
        }
        if (adap->transmitting)
-               cec_data_cancel(adap->transmitting, CEC_TX_STATUS_ABORTED);
+               adap->transmit_in_progress_aborted = true;
 
        /* Cancel the pending timeout work. */
        list_for_each_entry_safe(data, n, &adap->wait_queue, list) {
                if (data->attempts == 0)
                        data->attempts = attempts;
 
+               adap->transmit_in_progress_aborted = false;
                /* Tell the adapter to transmit, cancel on error */
                if (adap->ops->adap_transmit(adap, data->attempts,
                                             signal_free_time, &data->msg))
        struct cec_msg *msg;
        unsigned int attempts_made = arb_lost_cnt + nack_cnt +
                                     low_drive_cnt + error_cnt;
+       bool done = status & (CEC_TX_STATUS_MAX_RETRIES | CEC_TX_STATUS_OK);
+       bool aborted = adap->transmit_in_progress_aborted;
 
        dprintk(2, "%s: status 0x%02x\n", __func__, status);
        if (attempts_made < 1)
                goto wake_thread;
        }
        adap->transmit_in_progress = false;
+       adap->transmit_in_progress_aborted = false;
 
        msg = &data->msg;
 
         * the hardware didn't signal that it retried itself (by setting
         * CEC_TX_STATUS_MAX_RETRIES), then we will retry ourselves.
         */
-       if (data->attempts > attempts_made &&
-           !(status & (CEC_TX_STATUS_MAX_RETRIES | CEC_TX_STATUS_OK))) {
+       if (!aborted && data->attempts > attempts_made && !done) {
                /* Retry this message */
                data->attempts -= attempts_made;
                if (msg->timeout)
                goto wake_thread;
        }
 
+       if (aborted && !done)
+               status |= CEC_TX_STATUS_ABORTED;
        data->attempts = 0;
 
        /* Always set CEC_TX_STATUS_MAX_RETRIES on error */
        WARN_ON(adap->ops->adap_enable(adap, false));
        adap->last_initiator = 0xff;
        adap->transmit_in_progress = false;
+       adap->transmit_in_progress_aborted = false;
+       if (adap->transmitting)
+               cec_data_cancel(adap->transmitting, CEC_TX_STATUS_ABORTED);
        mutex_unlock(&adap->devnode.lock);
 }
 
 
  * @wait_queue:                queue of transmits waiting for a reply
  * @transmitting:      CEC messages currently being transmitted
  * @transmit_in_progress: true if a transmit is in progress
+ * @transmit_in_progress_aborted: true if a transmit is in progress is to be
+ *                     aborted. This happens if the logical address is
+ *                     invalidated while the transmit is ongoing. In that
+ *                     case the transmit will finish, but will not retransmit
+ *                     and be marked as ABORTED.
  * @kthread_config:    kthread used to configure a CEC adapter
  * @config_completion: used to signal completion of the config kthread
  * @kthread:           main CEC processing thread
        struct list_head wait_queue;
        struct cec_data *transmitting;
        bool transmit_in_progress;
+       bool transmit_in_progress_aborted;
 
        struct task_struct *kthread_config;
        struct completion config_completion;