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

media: cec: check for non-OK/NACK conditions while claiming a LA

During the configuration phase of a CEC adapter it is trying to claim a
free logical address by polling.

However, the code doesn't check if there were errors other than OK or NACK,
those are just treated as if the poll was NACKed.

Instead check for such errors and retry the poll. And if the problem persists
then don't claim this LA since there is something weird going on.
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarHans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent 7cf7b2e9
...@@ -1180,6 +1180,8 @@ static int cec_config_log_addr(struct cec_adapter *adap, ...@@ -1180,6 +1180,8 @@ static int cec_config_log_addr(struct cec_adapter *adap,
{ {
struct cec_log_addrs *las = &adap->log_addrs; struct cec_log_addrs *las = &adap->log_addrs;
struct cec_msg msg = { }; struct cec_msg msg = { };
const unsigned int max_retries = 2;
unsigned int i;
int err; int err;
if (cec_has_log_addr(adap, log_addr)) if (cec_has_log_addr(adap, log_addr))
...@@ -1188,6 +1190,8 @@ static int cec_config_log_addr(struct cec_adapter *adap, ...@@ -1188,6 +1190,8 @@ static int cec_config_log_addr(struct cec_adapter *adap,
/* Send poll message */ /* Send poll message */
msg.len = 1; msg.len = 1;
msg.msg[0] = (log_addr << 4) | log_addr; msg.msg[0] = (log_addr << 4) | log_addr;
for (i = 0; i < max_retries; i++) {
err = cec_transmit_msg_fh(adap, &msg, NULL, true); err = cec_transmit_msg_fh(adap, &msg, NULL, true);
/* /*
...@@ -1200,8 +1204,31 @@ static int cec_config_log_addr(struct cec_adapter *adap, ...@@ -1200,8 +1204,31 @@ static int cec_config_log_addr(struct cec_adapter *adap,
if (err) if (err)
return err; return err;
/*
* The message was aborted due to a disconnect or
* unconfigure, just bail out.
*/
if (msg.tx_status & CEC_TX_STATUS_ABORTED)
return -EINTR;
if (msg.tx_status & CEC_TX_STATUS_OK) if (msg.tx_status & CEC_TX_STATUS_OK)
return 0; return 0;
if (msg.tx_status & CEC_TX_STATUS_NACK)
break;
/*
* Retry up to max_retries times if the message was neither
* OKed or NACKed. This can happen due to e.g. a Lost
* Arbitration condition.
*/
}
/*
* If we are unable to get an OK or a NACK after max_retries attempts
* (and note that each attempt already consists of four polls), then
* then we assume that something is really weird and that it is not a
* good idea to try and claim this logical address.
*/
if (i == max_retries)
return 0;
/* /*
* Message not acknowledged, so this logical * Message not acknowledged, so this logical
......
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