Gentle Ping! > From: Pankaj Sharma <pankj.sharma@xxxxxxxxxxx> > Subject: [PATCH v3] can: m_can: add support for one shot mode > > According to the CAN Specification (see ISO 11898-1:2015, 8.3.4 Recovery > Management), the M_CAN provides means for automatic retransmission of > frames that have lost arbitration or that have been disturbed by errors during > transmission. By default automatic retransmission is enabled. > > The Bosch MCAN controller has support for disabling automatic retransmission. > > To support time-triggered communication as described in ISO 11898-1:2015, > chapter 9.2, the automatic retransmission may be disabled via CCCR.DAR. > > CAN_CTRLMODE_ONE_SHOT is used for disabling automatic retransmission. > > Signed-off-by: Pankaj Sharma <pankj.sharma@xxxxxxxxxxx> > Signed-off-by: Sriram Dash <sriram.dash@xxxxxxxxxxx> > --- > > changes in v3: > - resolving build errors for net-next branch > > changes in v2: > - rebase to net-next > > drivers/net/can/m_can/m_can.c | 12 +++++++++--- > 1 file changed, 9 insertions(+), 3 deletions(-) > > diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c > index 562c8317e3aa..75e7490c4299 100644 > --- a/drivers/net/can/m_can/m_can.c > +++ b/drivers/net/can/m_can/m_can.c > @@ -123,6 +123,7 @@ enum m_can_reg { > #define CCCR_CME_CANFD_BRS 0x2 > #define CCCR_TXP BIT(14) > #define CCCR_TEST BIT(7) > +#define CCCR_DAR BIT(6) > #define CCCR_MON BIT(5) > #define CCCR_CSR BIT(4) > #define CCCR_CSA BIT(3) > @@ -1135,7 +1136,7 @@ static void m_can_chip_config(struct net_device > *dev) > if (cdev->version == 30) { > /* Version 3.0.x */ > > - cccr &= ~(CCCR_TEST | CCCR_MON | > + cccr &= ~(CCCR_TEST | CCCR_MON | CCCR_DAR | > (CCCR_CMR_MASK << CCCR_CMR_SHIFT) | > (CCCR_CME_MASK << CCCR_CME_SHIFT)); > > @@ -1145,7 +1146,7 @@ static void m_can_chip_config(struct net_device > *dev) > } else { > /* Version 3.1.x or 3.2.x */ > cccr &= ~(CCCR_TEST | CCCR_MON | CCCR_BRSE | CCCR_FDOE > | > - CCCR_NISO); > + CCCR_NISO | CCCR_DAR); > > /* Only 3.2.x has NISO Bit implemented */ > if (cdev->can.ctrlmode & CAN_CTRLMODE_FD_NON_ISO) @@ - > 1165,6 +1166,10 @@ static void m_can_chip_config(struct net_device *dev) > if (cdev->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) > cccr |= CCCR_MON; > > + /* Disable Auto Retransmission (all versions) */ > + if (cdev->can.ctrlmode & CAN_CTRLMODE_ONE_SHOT) > + cccr |= CCCR_DAR; > + > /* Write config */ > m_can_write(cdev, M_CAN_CCCR, cccr); > m_can_write(cdev, M_CAN_TEST, test); > @@ -1310,7 +1315,8 @@ static int m_can_dev_setup(struct m_can_classdev > *m_can_dev) > m_can_dev->can.ctrlmode_supported = CAN_CTRLMODE_LOOPBACK | > CAN_CTRLMODE_LISTENONLY | > CAN_CTRLMODE_BERR_REPORTING | > - CAN_CTRLMODE_FD; > + CAN_CTRLMODE_FD | > + CAN_CTRLMODE_ONE_SHOT; > > /* Set properties depending on M_CAN version */ > switch (m_can_dev->version) { > -- > 2.17.1