linux/drivers/net/can
Sean Nyekjaer e707180ae2 can: flexcan: fix possible deadlock and out-of-order reception after wakeup
When suspending, and 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
calls flexcan_suspend() but fails to call flexcan_noirq_suspend(). That
means 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 fixes the deadlock when using self wakeup, by calling
flexcan_exit_stop_mode() from flexcan_resume() instead of
flexcan_noirq_resume().

This also fixes another issue: CAN frames are received out-of-order in
first IRQ handler run after wakeup.

The problem is that the wakeup latency from frame reception to the IRQ
handler (where the CAN frames are sorted by timestamp) is much bigger
than the time stamp counter wrap around time. This means it's
impossible to sort the CAN frames by timestamp.

The reason is that the controller exits stop mode during noirq resume,
which means it receives frames immediately, but interrupt handling is
still not possible.

So exit stop mode during resume stage instead of noirq resume fixes this
issue.

Fixes: de3578c198 ("can: flexcan: add self wakeup support")
Signed-off-by: Sean Nyekjaer <sean@geanix.com>
Tested-by: Sean Nyekjaer <sean@geanix.com>
Signed-off-by: Joakim Zhang <qiangqing.zhang@nxp.com>
Cc: linux-stable <stable@vger.kernel.org> # >= v5.0
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
2019-12-08 11:52:02 +01:00
..
c_can can: c_can: c_can_plaform: fix checkpatch warnings 2019-11-11 21:58:08 +01:00
cc770 treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 495 2019-06-19 17:09:52 +02:00
ifi_canfd can: ifi: use devm_platform_ioremap_resource() to simplify code 2019-11-11 21:58:09 +01:00
m_can Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2019-11-22 16:27:24 -08:00
mscan treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 344 2019-06-05 17:37:07 +02:00
peak_canfd can: peak_canfd: provide hw timestamps in rx skbs 2019-11-11 21:58:09 +01:00
rcar can: rcar: use devm_platform_ioremap_resource() to simplify code 2019-11-11 21:58:10 +01:00
sja1000 can: peak_pci: Make structure peak_pciec_i2c_bit_ops constant 2019-08-20 13:41:25 +02:00
softing net/can: using dev_get_drvdata directly 2019-07-05 15:24:41 -07:00
spi can: mcp251x: only reset hardware as required 2019-11-11 21:57:28 +01:00
usb can: ucan: fix non-atomic allocation in completion handler 2019-12-03 11:15:08 +01:00
at91_can.c can: mark expected switch fall-throughs 2019-07-25 20:09:42 -05:00
dev.c can: dev: can_restart(): remove unused code 2019-11-11 21:57:28 +01:00
flexcan.c can: flexcan: fix possible deadlock and out-of-order reception after wakeup 2019-12-08 11:52:02 +01:00
grcan.c can: grcan: use devm_platform_ioremap_resource() to simplify code 2019-11-11 21:58:09 +01:00
janz-ican3.c net: Remove dev_err() usage after platform_get_irq() 2019-07-30 14:37:35 -07:00
Kconfig can: kvaser_pciefd: Add driver for Kvaser PCIEcan devices 2019-07-24 10:31:53 +02:00
kvaser_pciefd.c can: kvaser_pciefd: the PWM generator is running at the bus frequency of the system. 2019-09-03 10:23:57 +02:00
led.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
Makefile can: kvaser_pciefd: Add driver for Kvaser PCIEcan devices 2019-07-24 10:31:53 +02:00
pch_can.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 340 2019-06-05 17:37:07 +02:00
rx-offload.c can: rx-offload: Prepare for CAN FD support 2019-11-11 21:58:10 +01:00
slcan.c can: slcan: Fix use-after-free Read in slcan_open 2019-12-03 11:15:08 +01:00
sun4i_can.c can: sun4i: use devm_platform_ioremap_resource() to simplify code 2019-11-11 21:58:10 +01:00
ti_hecc.c can: rx-offload: Prepare for CAN FD support 2019-11-11 21:58:10 +01:00
vcan.c can: make use of preallocated can_ml_priv for per device struct can_dev_rcv_lists 2019-09-04 13:29:15 +02:00
vxcan.c can: make use of preallocated can_ml_priv for per device struct can_dev_rcv_lists 2019-09-04 13:29:15 +02:00
xilinx_can.c can: xilinx_can: Fix missing Rx can packets on CANFD2.0 2019-12-08 11:52:02 +01:00