> -----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 >