Commit f3854973 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab

[media] cec: fix report_current_latency

In the (very) small print of the REPORT_CURRENT_LATENCY message there is a
line that says that the last byte of the message (audio out delay) is only
present if the 'audio out compensated' value is 3.

I missed this, and so if this message was sent with a total length of 6 (i.e.
without the audio out delay byte), then it was rejected by the framework
since a minimum length of 7 was expected.

Fix this minimum length check and update the wrappers in cec-funcs.h to do
the right thing based on the message length.
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent 4bfb934b
...@@ -851,7 +851,7 @@ static const u8 cec_msg_size[256] = { ...@@ -851,7 +851,7 @@ static const u8 cec_msg_size[256] = {
[CEC_MSG_REQUEST_ARC_TERMINATION] = 2 | DIRECTED, [CEC_MSG_REQUEST_ARC_TERMINATION] = 2 | DIRECTED,
[CEC_MSG_TERMINATE_ARC] = 2 | DIRECTED, [CEC_MSG_TERMINATE_ARC] = 2 | DIRECTED,
[CEC_MSG_REQUEST_CURRENT_LATENCY] = 4 | BCAST, [CEC_MSG_REQUEST_CURRENT_LATENCY] = 4 | BCAST,
[CEC_MSG_REPORT_CURRENT_LATENCY] = 7 | BCAST, [CEC_MSG_REPORT_CURRENT_LATENCY] = 6 | BCAST,
[CEC_MSG_CDC_MESSAGE] = 2 | BCAST, [CEC_MSG_CDC_MESSAGE] = 2 | BCAST,
}; };
......
...@@ -1665,14 +1665,15 @@ static inline void cec_msg_report_current_latency(struct cec_msg *msg, ...@@ -1665,14 +1665,15 @@ static inline void cec_msg_report_current_latency(struct cec_msg *msg,
__u8 audio_out_compensated, __u8 audio_out_compensated,
__u8 audio_out_delay) __u8 audio_out_delay)
{ {
msg->len = 7; msg->len = 6;
msg->msg[0] |= 0xf; /* broadcast */ msg->msg[0] |= 0xf; /* broadcast */
msg->msg[1] = CEC_MSG_REPORT_CURRENT_LATENCY; msg->msg[1] = CEC_MSG_REPORT_CURRENT_LATENCY;
msg->msg[2] = phys_addr >> 8; msg->msg[2] = phys_addr >> 8;
msg->msg[3] = phys_addr & 0xff; msg->msg[3] = phys_addr & 0xff;
msg->msg[4] = video_latency; msg->msg[4] = video_latency;
msg->msg[5] = (low_latency_mode << 2) | audio_out_compensated; msg->msg[5] = (low_latency_mode << 2) | audio_out_compensated;
msg->msg[6] = audio_out_delay; if (audio_out_compensated == 3)
msg->msg[msg->len++] = audio_out_delay;
} }
static inline void cec_ops_report_current_latency(const struct cec_msg *msg, static inline void cec_ops_report_current_latency(const struct cec_msg *msg,
...@@ -1686,7 +1687,10 @@ static inline void cec_ops_report_current_latency(const struct cec_msg *msg, ...@@ -1686,7 +1687,10 @@ static inline void cec_ops_report_current_latency(const struct cec_msg *msg,
*video_latency = msg->msg[4]; *video_latency = msg->msg[4];
*low_latency_mode = (msg->msg[5] >> 2) & 1; *low_latency_mode = (msg->msg[5] >> 2) & 1;
*audio_out_compensated = msg->msg[5] & 3; *audio_out_compensated = msg->msg[5] & 3;
*audio_out_delay = msg->msg[6]; if (*audio_out_compensated == 3 && msg->len >= 7)
*audio_out_delay = msg->msg[6];
else
*audio_out_delay = 0;
} }
static inline void cec_msg_request_current_latency(struct cec_msg *msg, static inline void cec_msg_request_current_latency(struct cec_msg *msg,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment