media: cec: fix wrong tx/rx_status values when canceling a msg
authorHans Verkuil <hans.verkuil@cisco.com>
Tue, 22 May 2018 11:33:13 +0000 (07:33 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Mon, 28 May 2018 20:25:25 +0000 (16:25 -0400)
When a message was canceled it could return tx_status with
both OK and MAX_RETRIES set, which is illegal.

If a canceled message was waiting for a reply, then rx_status
wasn't updated, so set that as well.

Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/media/cec/cec-adap.c

index 002ed4c..b7fad0e 100644 (file)
@@ -339,12 +339,19 @@ static void cec_data_cancel(struct cec_data *data)
                        data->adap->transmit_queue_sz--;
        }
 
-       /* Mark it as an error */
-       data->msg.tx_ts = ktime_get_ns();
-       data->msg.tx_status |= CEC_TX_STATUS_ERROR |
-                              CEC_TX_STATUS_MAX_RETRIES;
-       data->msg.tx_error_cnt++;
-       data->attempts = 0;
+       if (data->msg.tx_status & CEC_TX_STATUS_OK) {
+               /* Mark the canceled RX as a timeout */
+               data->msg.rx_ts = ktime_get_ns();
+               data->msg.rx_status = CEC_RX_STATUS_TIMEOUT;
+       } else {
+               /* Mark the canceled TX as an error */
+               data->msg.tx_ts = ktime_get_ns();
+               data->msg.tx_status |= CEC_TX_STATUS_ERROR |
+                                      CEC_TX_STATUS_MAX_RETRIES;
+               data->msg.tx_error_cnt++;
+               data->attempts = 0;
+       }
+
        /* Queue transmitted message for monitoring purposes */
        cec_queue_msg_monitor(data->adap, &data->msg, 1);