This is an automatic generated email to let you know that the following patch 
were queued:

Subject: media: cec: core: avoid confusing "transmit timed out" message
Author:  Hans Verkuil <hverkuil-ci...@xs4all.nl>
Date:    Tue Apr 30 11:13:47 2024 +0100

If, when waiting for a transmit to finish, the wait is interrupted,
then you might get a "transmit timed out" message, even though the
transmit was interrupted and did not actually time out.

Set transmit_in_progress_aborted to true if the
wait_for_completion_killable() call was interrupted and ensure
that the transmit is properly marked as ABORTED.

Signed-off-by: Hans Verkuil <hverkuil-ci...@xs4all.nl>
Reported-by: Yang, Chenyuan <c...@illinois.edu>
Closes: 
https://lore.kernel.org/linux-media/ph7pr11mb57688e64ade4fe82e658d86da0...@ph7pr11mb5768.namprd11.prod.outlook.com/
Fixes: 590a8e564c6e ("media: cec: abort if the current transmit was canceled")
Signed-off-by: Mauro Carvalho Chehab <mche...@kernel.org>

 drivers/media/cec/core/cec-adap.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

---

diff --git a/drivers/media/cec/core/cec-adap.c 
b/drivers/media/cec/core/cec-adap.c
index a493cbce2456..da09834990b8 100644
--- a/drivers/media/cec/core/cec-adap.c
+++ b/drivers/media/cec/core/cec-adap.c
@@ -490,6 +490,15 @@ int cec_thread_func(void *_adap)
                        goto unlock;
                }
 
+               if (adap->transmit_in_progress &&
+                   adap->transmit_in_progress_aborted) {
+                       if (adap->transmitting)
+                               cec_data_cancel(adap->transmitting,
+                                               CEC_TX_STATUS_ABORTED, 0);
+                       adap->transmit_in_progress = false;
+                       adap->transmit_in_progress_aborted = false;
+                       goto unlock;
+               }
                if (adap->transmit_in_progress && timeout) {
                        /*
                         * If we timeout, then log that. Normally this does
@@ -771,6 +780,7 @@ int cec_transmit_msg_fh(struct cec_adapter *adap, struct 
cec_msg *msg,
 {
        struct cec_data *data;
        bool is_raw = msg_is_raw(msg);
+       int err;
 
        if (adap->devnode.unregistered)
                return -ENODEV;
@@ -935,10 +945,13 @@ int cec_transmit_msg_fh(struct cec_adapter *adap, struct 
cec_msg *msg,
         * Release the lock and wait, retake the lock afterwards.
         */
        mutex_unlock(&adap->lock);
-       wait_for_completion_killable(&data->c);
+       err = wait_for_completion_killable(&data->c);
        cancel_delayed_work_sync(&data->work);
        mutex_lock(&adap->lock);
 
+       if (err)
+               adap->transmit_in_progress_aborted = true;
+
        /* Cancel the transmit if it was interrupted */
        if (!data->completed) {
                if (data->msg.tx_status & CEC_TX_STATUS_OK)

Reply via email to