[PATCHv2 5/7] cec-pin: add error injection support

Hans Verkuil hverkuil at xs4all.nl
Tue Mar 6 22:48:05 UTC 2018


On 05/03/18 14:51, Hans Verkuil wrote:
> From: Hans Verkuil <hans.verkuil at cisco.com>
> 
> Implement all the error injection commands.
> 
> The state machine gets new states for the various error situations,
> helper functions are added to detect whether an error injection is
> active and the actual error injections are implemented.
> 
> Signed-off-by: Hans Verkuil <hans.verkuil at cisco.com>
> ---
>  drivers/media/cec/cec-pin-priv.h |  38 ++-
>  drivers/media/cec/cec-pin.c      | 542 +++++++++++++++++++++++++++++++++++----
>  2 files changed, 521 insertions(+), 59 deletions(-)
> 
> diff --git a/drivers/media/cec/cec-pin-priv.h b/drivers/media/cec/cec-pin-priv.h
> index 779384f18689..c9349f68e554 100644
> --- a/drivers/media/cec/cec-pin-priv.h
> +++ b/drivers/media/cec/cec-pin-priv.h

<snip>

> +static bool tx_error_inj(struct cec_pin *pin, unsigned int mode_offset,
> +			 int arg_idx, u8 *arg)
> +{
> +#ifdef CONFIG_CEC_PIN_ERROR_INJ
> +	u16 cmd = cec_pin_tx_error_inj(pin);
> +	u64 e = pin->error_inj[cmd];
> +	unsigned int mode = (e >> mode_offset) & CEC_ERROR_INJ_MODE_MASK;
> +
> +	if (arg_idx) {

Oops, this should be arg_idx >= 0. It's -1 if there is no argument associated
with the error injection command.

> +		u8 pos = pin->error_inj_args[cmd][arg_idx];
> +
> +		if (arg)
> +			*arg = pos;
> +		else if (pos != pin->tx_bit)
> +			return false;
> +	}
> +
> +	switch (mode) {
> +	case CEC_ERROR_INJ_MODE_ONCE:
> +		pin->error_inj[cmd] &= ~(CEC_ERROR_INJ_MODE_MASK << mode_offset);
> +		return true;
> +	case CEC_ERROR_INJ_MODE_ALWAYS:
> +		return true;
> +	case CEC_ERROR_INJ_MODE_TOGGLE:
> +		return pin->tx_toggle;
> +	default:
> +		return false;
> +	}
> +#else
> +	return false;
> +#endif
> +}

<snip>

> +		case EOM_BIT:
> +			v = pin->tx_bit / 10 ==
> +				pin->tx_msg.len + pin->tx_extra_bytes - 1;
> +			if (pin->tx_msg.len > 1 && tx_early_eom(pin)) {

tx_early_eom should only be called for the second-to-last byte.

> +				/* Error injection: set EOM one byte early */
> +				v = pin->tx_bit / 10 ==
> +					pin->tx_msg.len + pin->tx_extra_bytes - 2;
> +				pin->tx_post_eom = true;
> +			}
> +			if (tx_no_eom(pin)) {

Ditto for tx_no_eom: only call for the last byte.

Otherwise for mode 'once' this error injection command will be cleared
before the end of the message is reached.

> +				/* Error injection: no EOM */
> +				v = false;
> +			}
>  			pin->state = v ? CEC_ST_TX_DATA_BIT_1_LOW :
> -				CEC_ST_TX_DATA_BIT_0_LOW;
> +					 CEC_ST_TX_DATA_BIT_0_LOW;
>  			break;

Regards,

	Hans


More information about the dri-devel mailing list