提交 5be93bdd 编写于 作者: M Marc Kleine-Budde

can: flexcan: fix shutdown: first disable chip, then all interrupts

When shutting down the CAN interface (ifconfig canX down) during high CAN bus
loads, the CAN core might hang and freeze the whole CPU.

This patch fixes the shutdown sequence by first disabling the CAN core then
disabling all interrupts.

Cc: linux-stable <stable@vger.kernel.org>
Signed-off-by: NMarc Kleine-Budde <mkl@pengutronix.de>
上级 635d61a3
...@@ -827,14 +827,16 @@ static void flexcan_chip_stop(struct net_device *dev) ...@@ -827,14 +827,16 @@ static void flexcan_chip_stop(struct net_device *dev)
struct flexcan_regs __iomem *regs = priv->base; struct flexcan_regs __iomem *regs = priv->base;
u32 reg; u32 reg;
/* Disable all interrupts */
flexcan_write(0, &regs->imask1);
/* Disable + halt module */ /* Disable + halt module */
reg = flexcan_read(&regs->mcr); reg = flexcan_read(&regs->mcr);
reg |= FLEXCAN_MCR_MDIS | FLEXCAN_MCR_HALT; reg |= FLEXCAN_MCR_MDIS | FLEXCAN_MCR_HALT;
flexcan_write(reg, &regs->mcr); flexcan_write(reg, &regs->mcr);
/* Disable all interrupts */
flexcan_write(0, &regs->imask1);
flexcan_write(priv->reg_ctrl_default & ~FLEXCAN_CTRL_ERR_ALL,
&regs->ctrl);
if (priv->reg_xceiver) if (priv->reg_xceiver)
regulator_disable(priv->reg_xceiver); regulator_disable(priv->reg_xceiver);
priv->can.state = CAN_STATE_STOPPED; priv->can.state = CAN_STATE_STOPPED;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册