can: m_can: add support for one shot mode
authorPankaj Sharma <pankj.sharma@samsung.com>
Mon, 21 Oct 2019 12:04:40 +0000 (17:34 +0530)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Mon, 11 Nov 2019 20:58:09 +0000 (21:58 +0100)
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@samsung.com>
Signed-off-by: Sriram Dash <sriram.dash@samsung.com>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/m_can/m_can.c

index 562c8317e3aa81e5ba58239feb110acfd0fe74a4..75e7490c4299e9cdc49e5aac2829b66a414554c6 100644 (file)
@@ -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) {