RE: [PATCH v5] can: mcan: m_can_handle_bus_errors(): add support for handling DLEC error on CAN-FD frames

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> -----Original Message-----
> From: Marc Kleine-Budde [mailto:mkl@xxxxxxxxxxxxxx]
> Sent: 18 October 2022 13:50
> To: linux-can@xxxxxxxxxxxxxxx
> Cc: Vivek Yadav <vivek.2311@xxxxxxxxxxx>; Chandrasekar Ramakrishnan
> <rcsekar@xxxxxxxxxxx>; Marc Kleine-Budde <mkl@xxxxxxxxxxxxxx>
> Subject: [PATCH v5] can: mcan: m_can_handle_bus_errors(): add support for
> handling DLEC error on CAN-FD frames
> 
> From: Vivek Yadav <vivek.2311@xxxxxxxxxxx>
> 
> When a frame in CAN FD format has reached the data phase, the next CAN
> event (error or valid frame) will be shown in DLEC.
> 
> Utilize the dedicated flag (Data Phase Last Error Code: DLEC flag) to
> determine the type of last error that occurred in the data phase of a
CAN-FD
> frame and handle the bus errors.
> 
Looks good to me,
Reviewed-by: Chandrasekar Ramakrishnan <rcsekar@xxxxxxxxxxx>

> Signed-off-by: Vivek Yadav <vivek.2311@xxxxxxxxxxx>
> Signed-off-by: Marc Kleine-Budde <mkl@xxxxxxxxxxxxxx>
> ---
> Changes since v4:
> - fix indention for GENMASK
> - fix GENMASK
> - reduce scope of dlec
> - add netdev_dbg() for arbitration phase
> 
>  drivers/net/can/m_can/m_can.c | 11 ++++++++++-
>  1 file changed, 10 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/can/m_can/m_can.c
> b/drivers/net/can/m_can/m_can.c index ebdd3c164d7b..34c76ee87c6e
> 100644
> --- a/drivers/net/can/m_can/m_can.c
> +++ b/drivers/net/can/m_can/m_can.c
> @@ -156,6 +156,7 @@ enum m_can_reg {
>  #define PSR_EW		BIT(6)
>  #define PSR_EP		BIT(5)
>  #define PSR_LEC_MASK	GENMASK(2, 0)
> +#define PSR_DLEC_MASK	GENMASK(10, 8)
> 
>  /* Interrupt Register (IR) */
>  #define IR_ALL_INT	0xffffffff
> @@ -875,9 +876,17 @@ static int m_can_handle_bus_errors(struct
> net_device *dev, u32 irqstatus,
>  	/* handle lec errors on the bus */
>  	if (cdev->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING) {
>  		u8 lec = FIELD_GET(PSR_LEC_MASK, psr);
> +		u8 dlec = FIELD_GET(PSR_DLEC_MASK, psr);
> 
> -		if (is_lec_err(lec))
> +		if (is_lec_err(lec)) {
> +			netdev_dbg(dev, "Arbitration phase error
> detected\n");
>  			work_done += m_can_handle_lec_err(dev, lec);
> +		}
> +
> +		if (is_lec_err(dlec)) {
> +			netdev_dbg(dev, "Data phase error detected\n");
> +			work_done += m_can_handle_lec_err(dev, dlec);
> +		}
>  	}
> 
>  	/* handle protocol errors in arbitration phase */
> --
> 2.35.1
> 





[Index of Archives]     [Automotive Discussions]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]     [CAN Bus]

  Powered by Linux