[Linux-kernel-mentees] [PATCH] cec-follower: fix cec-tuner.cpp

Hans Verkuil hverkuil at xs4all.nl
Thu Sep 19 08:42:14 UTC 2019


Hi Jiunn,

On 9/19/19 4:17 AM, Jiunn Chang wrote:
> Export code from cec-processing.cpp to cec-tuner.cpp so testing logic
> does not break for PRESUMED_OK which replies on the feature abort
> message.  Also needed it a boolean for broadcast messages that should
> not be aborted.
> 
> Signed-off-by: Jiunn Chang <c0d1n61at3 at gmail.com>
> ---
>  utils/cec-follower/cec-processing.cpp |  4 +--
>  utils/cec-follower/cec-tuner.cpp      | 37 +++++++++++++++++++++++++++
>  2 files changed, 39 insertions(+), 2 deletions(-)
> 
> diff --git a/utils/cec-follower/cec-processing.cpp b/utils/cec-follower/cec-processing.cpp
> index 15cedddf..c6ef1d09 100644
> --- a/utils/cec-follower/cec-processing.cpp
> +++ b/utils/cec-follower/cec-processing.cpp
> @@ -608,7 +608,7 @@ static void processMsg(struct node *node, struct cec_msg &msg, unsigned me)
>  	case CEC_MSG_DECK_STATUS:
>  		return;
>  
> -	/* Tuner Centric Messages */
> +	/* Tuner/Record/Timer Messages */
>  
>  	case CEC_MSG_GIVE_TUNER_DEVICE_STATUS:
>  	case CEC_MSG_TUNER_DEVICE_STATUS:
> @@ -630,7 +630,7 @@ static void processMsg(struct node *node, struct cec_msg &msg, unsigned me)
>  	case CEC_MSG_TIMER_CLEARED_STATUS:
>  	case CEC_MSG_TIMER_STATUS:
>  		process_tuner_record_timer_msgs(node, msg, me);
> -		break;
> +		return;
>  
>  		/* Dynamic Auto Lipsync */
>  
> diff --git a/utils/cec-follower/cec-tuner.cpp b/utils/cec-follower/cec-tuner.cpp
> index 5e794d71..bb727ae7 100644
> --- a/utils/cec-follower/cec-tuner.cpp
> +++ b/utils/cec-follower/cec-tuner.cpp
> @@ -7,8 +7,40 @@
>  
>  #include "cec-follower.h"
>  
> +static void reply_feature_abort(struct node *node, struct cec_msg *msg, __u8 reason = CEC_OP_ABORT_UNRECOGNIZED_OP)

Don't copy this! That's code duplication for no reason.

Just drop static from the function in cec-processing.cpp and add the prototype to
cec-follower.h.

> +{
> +	unsigned la = cec_msg_initiator(msg);
> +	__u8 opcode = cec_msg_opcode(msg);
> +	__u64 ts_now = get_ts();
> +
> +	if (cec_msg_is_broadcast(msg) || cec_msg_initiator(msg) == CEC_LOG_ADDR_UNREGISTERED)
> +		return;
> +	if (reason == CEC_OP_ABORT_UNRECOGNIZED_OP) {
> +		la_info[la].feature_aborted[opcode].count++;
> +		if (la_info[la].feature_aborted[opcode].count == 2) {
> +			/* If the Abort Reason was "Unrecognized opcode", the Initiator should not send
> +			   the same message to the same Follower again at that time to avoid saturating
> +			   the bus. */
> +			warn("Received message %s from LA %d (%s) shortly after\n",
> +				opcode2s(msg).c_str(), la, la2s(la));
> +			warn("replying Feature Abort [Unrecognized Opcode] to the same message.\n");
> +		}
> +	}
> +	else if (la_info[la].feature_aborted[opcode].count) {
> +		warn("Replying Feature Abort with abort reason different than [Unrecognized Opcode]\n");
> +		warn("to message that has previously been replied Feature Abort to with [Unrecognized Opcode].\n");
> +	}
> +	else
> +		la_info[la].feature_aborted[opcode].ts = ts_now;
> +
> +	cec_msg_reply_feature_abort(msg, reason);
> +	transmit(node, msg);
> +}
> +
>  void process_tuner_record_timer_msgs(struct node *node, struct cec_msg &msg, unsigned me)
>  {
> +	bool is_bcast = cec_msg_is_broadcast(&msg);
> +
>  	switch (msg.msg[1]) {
>  
>  
> @@ -136,4 +168,9 @@ void process_tuner_record_timer_msgs(struct node *node, struct cec_msg &msg, uns
>  	default:
>  		break;
>  	}
> +
> +	if (is_bcast)
> +		return;
> +
> +	reply_feature_abort(node, &msg);
>  }
> 

Regards,

	Hans


More information about the Linux-kernel-mentees mailing list