can: mcp251x: mcp251x_restart_work_handler(): Fix potential force_quit race condition
authorTimo Schlüßler <schluessler@krause.de>
Fri, 11 Oct 2019 13:38:19 +0000 (15:38 +0200)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Tue, 5 Nov 2019 11:44:22 +0000 (12:44 +0100)
In mcp251x_restart_work_handler() the variable to stop the interrupt
handler (priv->force_quit) is reset after the chip is restarted and thus
a interrupt might occur.

This patch fixes the potential race condition by resetting force_quit
before enabling interrupts.

Signed-off-by: Timo Schlüßler <schluessler@krause.de>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/spi/mcp251x.c

index bee9f7b8dad61d27e1c1cd16a0f4a8e706aa0622..bb20a9b75cc66bd2ea3ec1406bbb8d3dac3435a7 100644 (file)
@@ -717,6 +717,7 @@ static void mcp251x_restart_work_handler(struct work_struct *ws)
        if (priv->after_suspend) {
                mcp251x_hw_reset(spi);
                mcp251x_setup(net, spi);
+               priv->force_quit = 0;
                if (priv->after_suspend & AFTER_SUSPEND_RESTART) {
                        mcp251x_set_normal_mode(spi);
                } else if (priv->after_suspend & AFTER_SUSPEND_UP) {
@@ -728,7 +729,6 @@ static void mcp251x_restart_work_handler(struct work_struct *ws)
                        mcp251x_hw_sleep(spi);
                }
                priv->after_suspend = 0;
-               priv->force_quit = 0;
        }
 
        if (priv->restart_tx) {