Skip to content

Commit fc078f9

Browse files
henrikbrixandersenjhedberg
authored andcommitted
drivers: can: sja1000: do not attempt to sleep in IRQ context
The can_sja1000_handle_error_warning_irq() function should only attempt to start bus-off recovery, but not wait for the result. Fixes: #63712 Signed-off-by: Henrik Brix Andersen <[email protected]>
1 parent f09b67b commit fc078f9

File tree

1 file changed

+9
-1
lines changed

1 file changed

+9
-1
lines changed

drivers/can/can_sja1000.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,14 @@ static inline int can_sja1000_enter_reset_mode(const struct device *dev)
5353
return 0;
5454
}
5555

56+
static inline void can_sja1000_leave_reset_mode_nowait(const struct device *dev)
57+
{
58+
uint8_t mod;
59+
60+
mod = can_sja1000_read_reg(dev, CAN_SJA1000_MOD);
61+
can_sja1000_write_reg(dev, CAN_SJA1000_MOD, mod & ~(CAN_SJA1000_MOD_RM));
62+
}
63+
5664
static inline int can_sja1000_leave_reset_mode(const struct device *dev)
5765
{
5866
int retries = CAN_SJA1000_RESET_MODE_RETRIES;
@@ -590,7 +598,7 @@ static void can_sja1000_handle_error_warning_irq(const struct device *dev)
590598
can_sja1000_tx_done(dev, -ENETUNREACH);
591599
#ifdef CONFIG_CAN_AUTO_BUS_OFF_RECOVERY
592600
if (data->started) {
593-
(void)can_sja1000_leave_reset_mode(dev);
601+
can_sja1000_leave_reset_mode_nowait(dev);
594602
}
595603
#endif /* CONFIG_CAN_AUTO_BUS_OFF_RECOVERY */
596604
} else if ((sr & CAN_SJA1000_SR_ES) != 0) {

0 commit comments

Comments
 (0)