From bb513c974b9ed0edec3fccb0439968021a285ba1 Mon Sep 17 00:00:00 2001 From: Henrik Brix Andersen Date: Thu, 1 Jun 2023 11:15:08 +0200 Subject: [PATCH] drivers: can: mcan: fix IRQ acknowledge Change the Bosch M_CAN ISRs to only acknowledge the IRQs handled in the given loop iteration (and not all IRQs supported by the given ISR) and move IRQ acknowledge to the front of the ISRs. Fixes: #58631 Signed-off-by: Henrik Brix Andersen --- drivers/can/can_mcan.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/drivers/can/can_mcan.c b/drivers/can/can_mcan.c index cf5aba19729..61240f2d3fd 100644 --- a/drivers/can/can_mcan.c +++ b/drivers/can/can_mcan.c @@ -540,6 +540,11 @@ void can_mcan_line_0_isr(const struct device *dev) } while ((ir & events) != 0U) { + err = can_mcan_write_reg(dev, CAN_MCAN_IR, ir & events); + if (err != 0) { + return; + } + if ((ir & (CAN_MCAN_IR_BO | CAN_MCAN_IR_EP | CAN_MCAN_IR_EW)) != 0U) { can_mcan_state_change_handler(dev); } @@ -562,11 +567,6 @@ void can_mcan_line_0_isr(const struct device *dev) LOG_ERR("Message RAM access failure"); } - err = can_mcan_write_reg(dev, CAN_MCAN_IR, events); - if (err != 0) { - return; - } - err = can_mcan_read_reg(dev, CAN_MCAN_IR, &ir); if (err != 0) { return; @@ -721,6 +721,11 @@ void can_mcan_line_1_isr(const struct device *dev) } while ((ir & events) != 0U) { + err = can_mcan_write_reg(dev, CAN_MCAN_IR, events & ir); + if (err != 0) { + return; + } + if ((ir & CAN_MCAN_IR_RF0N) != 0U) { LOG_DBG("RX FIFO0 INT"); can_mcan_get_message(dev, config->mram_offsets[CAN_MCAN_MRAM_CFG_RX_FIFO0], @@ -741,11 +746,6 @@ void can_mcan_line_1_isr(const struct device *dev) LOG_ERR("Message lost on FIFO1"); } - err = can_mcan_write_reg(dev, CAN_MCAN_IR, events); - if (err != 0) { - return; - } - err = can_mcan_read_reg(dev, CAN_MCAN_IR, &ir); if (err != 0) { return;