Clear all status-related fields before transmitting the message.

Also set the sequence counter only for messages with a non-zero timeout (== 
they wait for
a reply) and make sure the sequence counter is never 0.

Signed-off-by: Hans Verkuil <hans.verk...@cisco.com>

diff --git a/drivers/staging/media/cec/cec-adap.c 
b/drivers/staging/media/cec/cec-adap.c
index 4d86a6c..fc752de 100644
--- a/drivers/staging/media/cec/cec-adap.c
+++ b/drivers/staging/media/cec/cec-adap.c
@@ -574,6 +574,17 @@ int cec_transmit_msg_fh(struct cec_adapter *adap, struct 
cec_msg *msg,
        unsigned int timeout;
        int res = 0;

+       msg->rx_ts = 0;
+       msg->tx_ts = 0;
+       msg->rx_status = 0;
+       msg->tx_status = 0;
+       msg->tx_arb_lost_cnt = 0;
+       msg->tx_nack_cnt = 0;
+       msg->tx_low_drive_cnt = 0;
+       msg->tx_error_cnt = 0;
+       msg->sequence = 0;
+       msg->flags = 0;
+
        if (msg->reply && msg->timeout == 0) {
                /* Make sure the timeout isn't 0. */
                msg->timeout = 1000;
@@ -640,14 +651,12 @@ int cec_transmit_msg_fh(struct cec_adapter *adap, struct 
cec_msg *msg,
                dprintk(2, "cec_transmit_msg: %*ph%s\n",
                        msg->len, msg->msg, !block ? " (nb)" : "");

-       msg->rx_ts = 0;
-       msg->tx_ts = 0;
-       msg->rx_status = 0;
-       msg->tx_status = 0;
-       msg->tx_arb_lost_cnt = 0;
-       msg->tx_nack_cnt = 0;
-       msg->tx_low_drive_cnt = 0;
-       msg->tx_error_cnt = 0;
+       if (msg->timeout) {
+               msg->sequence = ++adap->sequence;
+               if (!msg->sequence)
+                       msg->sequence = ++adap->sequence;
+       }
+
        data->msg = *msg;
        data->fh = fh;
        data->adap = adap;
@@ -673,7 +682,6 @@ int cec_transmit_msg_fh(struct cec_adapter *adap, struct 
cec_msg *msg,
        init_completion(&data->c);
        INIT_DELAYED_WORK(&data->work, cec_wait_timeout);

-       data->msg.sequence = adap->sequence++;
        if (fh)
                list_add_tail(&data->xfer_list, &fh->xfer_list);
        list_add_tail(&data->list, &adap->transmit_queue);
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to