Skip to content

Commit daca8f8

Browse files
henrikbrixandersenjgl-meta
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 <hebad@vestas.com> (cherry picked from commit fc078f9)
1 parent a287c88 commit daca8f8

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
@@ -58,6 +58,14 @@ static inline int can_sja1000_enter_reset_mode(const struct device *dev)
5858
return 0;
5959
}
6060

61+
static inline void can_sja1000_leave_reset_mode_nowait(const struct device *dev)
62+
{
63+
uint8_t mod;
64+
65+
mod = can_sja1000_read_reg(dev, CAN_SJA1000_MOD);
66+
can_sja1000_write_reg(dev, CAN_SJA1000_MOD, mod & ~(CAN_SJA1000_MOD_RM));
67+
}
68+
6169
static inline int can_sja1000_leave_reset_mode(const struct device *dev)
6270
{
6371
int retries = CAN_SJA1000_RESET_MODE_RETRIES;
@@ -609,7 +617,7 @@ static void can_sja1000_handle_error_warning_irq(const struct device *dev)
609617
can_sja1000_tx_done(dev, -ENETUNREACH);
610618
#ifdef CONFIG_CAN_AUTO_BUS_OFF_RECOVERY
611619
if (data->started) {
612-
(void)can_sja1000_leave_reset_mode(dev);
620+
can_sja1000_leave_reset_mode_nowait(dev);
613621
}
614622
#endif /* CONFIG_CAN_AUTO_BUS_OFF_RECOVERY */
615623
} else if ((sr & CAN_SJA1000_SR_ES) != 0) {

0 commit comments

Comments
 (0)