]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
can: flexcan: flexcan_chip_start(): enable loopback mode in flexcan
authorPankaj Bansal <pankaj.bansal@nxp.com>
Mon, 13 Aug 2018 18:20:48 +0000 (23:50 +0530)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Wed, 28 Nov 2018 15:51:44 +0000 (16:51 +0100)
Self reception disable bit needs to be cleared for loopback mode to work
in flexcan.

Signed-off-by: Pankaj Bansal <pankaj.bansal@nxp.com>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/flexcan.c

index cfdeb5bc77b7711f49f023d8c72cb183906e3ded..f16668b8dd61f89ed77ce54db6bb1c7cd9a0d69c 100644 (file)
@@ -995,7 +995,6 @@ static int flexcan_chip_start(struct net_device *dev)
         * halt now
         * only supervisor access
         * enable warning int
-        * disable local echo
         * enable individual RX masking
         * choose format C
         * set max mailbox number
@@ -1003,8 +1002,8 @@ static int flexcan_chip_start(struct net_device *dev)
        reg_mcr = priv->read(&regs->mcr);
        reg_mcr &= ~FLEXCAN_MCR_MAXMB(0xff);
        reg_mcr |= FLEXCAN_MCR_FRZ | FLEXCAN_MCR_HALT | FLEXCAN_MCR_SUPV |
-               FLEXCAN_MCR_WRN_EN | FLEXCAN_MCR_SRX_DIS | FLEXCAN_MCR_IRMQ |
-               FLEXCAN_MCR_IDAM_C | FLEXCAN_MCR_MAXMB(FLEXCAN_TX_MB);
+               FLEXCAN_MCR_WRN_EN | FLEXCAN_MCR_IRMQ | FLEXCAN_MCR_IDAM_C |
+               FLEXCAN_MCR_MAXMB(FLEXCAN_TX_MB);
 
        /* MCR
         *
@@ -1017,6 +1016,23 @@ static int flexcan_chip_start(struct net_device *dev)
        else
                reg_mcr |= FLEXCAN_MCR_FEN;
 
+       /* MCR
+        *
+        * NOTE: In loopback mode, the CAN_MCR[SRXDIS] cannot be
+        *       asserted because this will impede the self reception
+        *       of a transmitted message. This is not documented in
+        *       earlier versions of flexcan block guide.
+        *
+        * Self Reception:
+        * - enable Self Reception for loopback mode
+        *   (by clearing "Self Reception Disable" bit)
+        * - disable for normal operation
+        */
+       if (priv->can.ctrlmode & CAN_CTRLMODE_LOOPBACK)
+               reg_mcr &= ~FLEXCAN_MCR_SRX_DIS;
+       else
+               reg_mcr |= FLEXCAN_MCR_SRX_DIS;
+
        netdev_dbg(dev, "%s: writing mcr=0x%08x", __func__, reg_mcr);
        priv->write(reg_mcr, &regs->mcr);