media: cec: only increase the seqnr if CEC_TRANSMIT would return 0
authorHans Verkuil <hverkuil@xs4all.nl>
Thu, 6 Jul 2017 14:09:52 +0000 (11:09 -0300)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Tue, 18 Jul 2017 15:37:21 +0000 (12:37 -0300)
The transmit code would increase the sequence number first thing, even though
CEC_TRANSMIT would return an error due to a malformatted cec_msg struct later
on.

While valid behavior, this had the disadvantage of producing holes in the
sequence list that made debugging harder.

Only increase the sequence number when the whole message is validated.
When debugging (i.e. with cec-ctl -M) the sequence numbering is now nicely
increasing by 1 per message.

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

index 5a2363cbaeb166c1723180f5e9385fd12679cf8f..a311c52723a1a34b574b7fdc78066a60189a6f4a 100644 (file)
@@ -630,9 +630,7 @@ int cec_transmit_msg_fh(struct cec_adapter *adap, struct cec_msg *msg,
        msg->tx_nack_cnt = 0;
        msg->tx_low_drive_cnt = 0;
        msg->tx_error_cnt = 0;
-       msg->sequence = ++adap->sequence;
-       if (!msg->sequence)
-               msg->sequence = ++adap->sequence;
+       msg->sequence = 0;
 
        if (msg->reply && msg->timeout == 0) {
                /* Make sure the timeout isn't 0. */
@@ -671,6 +669,9 @@ int cec_transmit_msg_fh(struct cec_adapter *adap, struct cec_msg *msg,
                        msg->tx_status = CEC_TX_STATUS_NACK |
                                         CEC_TX_STATUS_MAX_RETRIES;
                        msg->tx_nack_cnt = 1;
+                       msg->sequence = ++adap->sequence;
+                       if (!msg->sequence)
+                               msg->sequence = ++adap->sequence;
                        return 0;
                }
        }
@@ -705,6 +706,10 @@ int cec_transmit_msg_fh(struct cec_adapter *adap, struct cec_msg *msg,
        if (!data)
                return -ENOMEM;
 
+       msg->sequence = ++adap->sequence;
+       if (!msg->sequence)
+               msg->sequence = ++adap->sequence;
+
        if (msg->len > 1 && msg->msg[1] == CEC_MSG_CDC_MESSAGE) {
                msg->msg[2] = adap->phys_addr >> 8;
                msg->msg[3] = adap->phys_addr & 0xff;