can: sja1000: Add support for CAN_CTRLMODE_PRESUME_ACK
authorNikita Edward Baruzdin <nebaruzdin@gmail.com>
Fri, 11 Jul 2014 12:13:23 +0000 (16:13 +0400)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Tue, 15 Jul 2014 07:34:27 +0000 (09:34 +0200)
SJA1000 has a self test mode (STM) which does not require
acknowledgement for the successful message transmission. In this mode a
node test is possible without any other active node on the bus.

This patch adds a possibility to set STM for SJA1000 controller through
specifying the corresponding CAN_CTRLMODE_PRESUME_ACK netlink flag.

Signed-off-by: Nikita Edward Baruzdin <nebaruzdin@gmail.com>
Acked-by: Oliver Hartkopp <socketcan@hartkopp.net>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/sja1000/sja1000.c

index 45400d9aeedbcffc2500026574034945d143b018..d1692154ed1b094ab100bc40ddcc2783d1dfdac7 100644 (file)
@@ -141,6 +141,7 @@ static void set_normal_mode(struct net_device *dev)
 {
        struct sja1000_priv *priv = netdev_priv(dev);
        unsigned char status = priv->read_reg(priv, SJA1000_MOD);
+       u8 mod_reg_val = 0x00;
        int i;
 
        for (i = 0; i < 100; i++) {
@@ -158,9 +159,10 @@ static void set_normal_mode(struct net_device *dev)
 
                /* set chip to normal mode */
                if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY)
-                       priv->write_reg(priv, SJA1000_MOD, MOD_LOM);
-               else
-                       priv->write_reg(priv, SJA1000_MOD, 0x00);
+                       mod_reg_val |= MOD_LOM;
+               if (priv->can.ctrlmode & CAN_CTRLMODE_PRESUME_ACK)
+                       mod_reg_val |= MOD_STM;
+               priv->write_reg(priv, SJA1000_MOD, mod_reg_val);
 
                udelay(10);
 
@@ -632,7 +634,8 @@ struct net_device *alloc_sja1000dev(int sizeof_priv)
                                       CAN_CTRLMODE_LISTENONLY |
                                       CAN_CTRLMODE_3_SAMPLES |
                                       CAN_CTRLMODE_ONE_SHOT |
-                                      CAN_CTRLMODE_BERR_REPORTING;
+                                      CAN_CTRLMODE_BERR_REPORTING |
+                                      CAN_CTRLMODE_PRESUME_ACK;
 
        spin_lock_init(&priv->cmdreg_lock);