aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/can
diff options
context:
space:
mode:
authorDavid Jander <david@protonic.nl>2014-08-27 05:58:05 -0400
committerMarc Kleine-Budde <mkl@pengutronix.de>2014-09-18 05:15:15 -0400
commitfc05b884a31dbf259cc73cc856e634ec3acbebb6 (patch)
tree13a85ec5cd1e282ba0afa03bf9caaf6ac660b288 /drivers/net/can
parentc32fe4ad3e4861b2bfa1f44114c564935a123dda (diff)
can: flexcan: correctly initialize mailboxes
Apparently mailboxes may contain random data at startup, causing some of them being prepared for message reception. This causes overruns being missed or even confusing the IRQ check for trasmitted messages, increasing the transmit counter instead of the error counter. This patch initializes all mailboxes after the FIFO as RX_INACTIVE. Signed-off-by: David Jander <david@protonic.nl> Cc: linux-stable <stable@vger.kernel.org> Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Diffstat (limited to 'drivers/net/can')
-rw-r--r--drivers/net/can/flexcan.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c
index 76dcbca6c80c..fc0769527e6b 100644
--- a/drivers/net/can/flexcan.c
+++ b/drivers/net/can/flexcan.c
@@ -812,6 +812,7 @@ static int flexcan_chip_start(struct net_device *dev)
812 struct flexcan_regs __iomem *regs = priv->base; 812 struct flexcan_regs __iomem *regs = priv->base;
813 int err; 813 int err;
814 u32 reg_mcr, reg_ctrl; 814 u32 reg_mcr, reg_ctrl;
815 int i;
815 816
816 /* enable module */ 817 /* enable module */
817 err = flexcan_chip_enable(priv); 818 err = flexcan_chip_enable(priv);
@@ -878,6 +879,12 @@ static int flexcan_chip_start(struct net_device *dev)
878 netdev_dbg(dev, "%s: writing ctrl=0x%08x", __func__, reg_ctrl); 879 netdev_dbg(dev, "%s: writing ctrl=0x%08x", __func__, reg_ctrl);
879 flexcan_write(reg_ctrl, &regs->ctrl); 880 flexcan_write(reg_ctrl, &regs->ctrl);
880 881
882 /* clear and invalidate all mailboxes first */
883 for (i = FLEXCAN_TX_BUF_ID; i < ARRAY_SIZE(regs->cantxfg); i++) {
884 flexcan_write(FLEXCAN_MB_CODE_RX_INACTIVE,
885 &regs->cantxfg[i].can_ctrl);
886 }
887
881 /* mark TX mailbox as INACTIVE */ 888 /* mark TX mailbox as INACTIVE */
882 flexcan_write(FLEXCAN_MB_CODE_TX_INACTIVE, 889 flexcan_write(FLEXCAN_MB_CODE_TX_INACTIVE,
883 &regs->cantxfg[FLEXCAN_TX_BUF_ID].can_ctrl); 890 &regs->cantxfg[FLEXCAN_TX_BUF_ID].can_ctrl);