Commits
Sean Nyekjaer committed c849379b7fa
can: flexcan: fix deadlock when using self wakeup When suspending, when there is still can traffic on the interfaces the flexcan immediately wakes the platform again. As it should :-). But it throws this error msg: [ 3169.378661] PM: noirq suspend of devices failed On the way down to suspend the interface that throws the error message does call flexcan_suspend but fails to call flexcan_noirq_suspend. That means the flexcan_enter_stop_mode is called, but on the way out of suspend the driver only calls flexcan_resume and skips flexcan_noirq_resume, thus it doesn't call flexcan_exit_stop_mode. This leaves the flexcan in stop mode, and with the current driver it can't recover from this even with a soft reboot, it requires a hard reboot. This patch can fix deadlock when using self wakeup, it happenes to be able to fix another issue that frames out-of-order in first IRQ handler run after wakeup. In wakeup case, after system resume, frames received out-of-order,the problem is wakeup latency from frame reception to IRQ handler is much bigger than the counter overflow. This means it's impossible to sort the CAN frames by timestamp. The reason is that controller exits stop mode during noirq resume, then it can receive the frame immediately. If noirq reusme stage consumes much time, it will extend interrupt response time. Fixes: de3578c198c6 ("can: flexcan: add self wakeup support") Signed-off-by: Sean Nyekjaer <sean@geanix.com> Signed-off-by: Joakim Zhang <qiangqing.zhang@nxp.com>