From: Cunhao Lu <1579567540@qq.com> The close path cancels restart_work in close_candev() only after freeing the IRQ, disabling RX offload and stopping the controller. A concurrent restart can re-enable the controller and interrupts after IRQ teardown, or requeue timestamp work that accesses registers after runtime suspend has disabled the controller clocks. Call close_candev_cancel_restart_sync() at the start of ndo_stop(), while the resources needed by a running restart are still available. Keep close_candev() after IRQ teardown for final cancellation and echo cleanup. Fixes: ff60bfbaf67f ("can: rockchip_canfd: add driver for Rockchip CAN-FD controller") Cc: stable@vger.kernel.org Signed-off-by: Cunhao Lu <1579567540@qq.com> --- Changes in v7: - Keep close cancellation separate from restart and open error handling. --- drivers/net/can/rockchip/rockchip_canfd-core.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/net/can/rockchip/rockchip_canfd-core.c b/drivers/net/can/rockchip/rockchip_canfd-core.c index 1cae86973da5..59a79fe057e6 100644 --- a/drivers/net/can/rockchip/rockchip_canfd-core.c +++ b/drivers/net/can/rockchip/rockchip_canfd-core.c @@ -758,6 +758,7 @@ static int rkcanfd_stop(struct net_device *ndev) { struct rkcanfd_priv *priv = netdev_priv(ndev); + close_candev_cancel_restart_sync(ndev); netif_stop_queue(ndev); rkcanfd_chip_interrupts_disable(priv); -- 2.34.1