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.verkuil@xxxxxxxxx> 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html