diff --git a/arm-linux/drivers/net/can/flexcan.c b/arm-linux/drivers/net/can/flexcan.c index 2b25548..f773cb6 100644 --- a/arm-linux/drivers/net/can/flexcan.c +++ b/arm-linux/drivers/net/can/flexcan.c @@ -857,11 +857,26 @@ static int flexcan_chip_start(struct net_device *dev) * _note_: we enable the "error interrupt" * (FLEXCAN_CTRL_ERR_MSK), too. Otherwise we don't get any * warning or bus passive interrupts. + * + * __note__: The above is rubbish and causes interrupt + * flooding. Change it to the 3.18 way without of obeying + * CAN_CTRL_MODE_BERR_REPORTING and without enabling the + * Error interrupts. */ reg_ctrl = flexcan_read(®s->ctrl); reg_ctrl &= ~FLEXCAN_CTRL_TSYN; reg_ctrl |= FLEXCAN_CTRL_BOFF_REC | FLEXCAN_CTRL_LBUF | - FLEXCAN_CTRL_ERR_STATE | FLEXCAN_CTRL_ERR_MSK; + FLEXCAN_CTRL_ERR_STATE /* | FLEXCAN_CTRL_ERR_MSK */; + + /* + * enable the "error interrupt" (FLEXCAN_CTRL_ERR_MSK), + * on most Flexcan cores, too. Otherwise we don't get + * any error warning or passive interrupts. + */ + if (priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING) + reg_ctrl |= FLEXCAN_CTRL_ERR_MSK; + else + reg_ctrl &= ~FLEXCAN_CTRL_ERR_MSK; /* save for later use */ priv->reg_ctrl_default = reg_ctrl;