]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
can: mcp251xfd: move mcp251xfd_timestamp_start()/stop() into mcp251xfd_chip_start...
authorMarc Kleine-Budde <mkl@pengutronix.de>
Wed, 11 Jan 2023 11:10:04 +0000 (12:10 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 30 Sep 2024 14:25:14 +0000 (16:25 +0200)
commit a7801540f325d104de5065850a003f1d9bdc6ad3 upstream.

The mcp251xfd wakes up from Low Power or Sleep Mode when SPI activity
is detected. To avoid this, make sure that the timestamp worker is
stopped before shutting down the chip.

Split the starting of the timestamp worker out of
mcp251xfd_timestamp_init() into the separate function
mcp251xfd_timestamp_start().

Call mcp251xfd_timestamp_init() before mcp251xfd_chip_start(), move
mcp251xfd_timestamp_start() to mcp251xfd_chip_start(). In this way,
mcp251xfd_timestamp_stop() can be called unconditionally by
mcp251xfd_chip_stop().

Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c
drivers/net/can/spi/mcp251xfd/mcp251xfd-timestamp.c
drivers/net/can/spi/mcp251xfd/mcp251xfd.h

index 07e0896d4e9b9e44dab5bd20d613f46abfc24134..6fecfe4cd08041143cd0b1c20390a9e4d0612195 100644 (file)
@@ -744,6 +744,7 @@ static void mcp251xfd_chip_stop(struct mcp251xfd_priv *priv,
 
        mcp251xfd_chip_interrupts_disable(priv);
        mcp251xfd_chip_rx_int_disable(priv);
+       mcp251xfd_timestamp_stop(priv);
        mcp251xfd_chip_sleep(priv);
 }
 
@@ -763,6 +764,8 @@ static int mcp251xfd_chip_start(struct mcp251xfd_priv *priv)
        if (err)
                goto out_chip_stop;
 
+       mcp251xfd_timestamp_start(priv);
+
        err = mcp251xfd_set_bittiming(priv);
        if (err)
                goto out_chip_stop;
@@ -1610,11 +1613,12 @@ static int mcp251xfd_open(struct net_device *ndev)
        if (err)
                goto out_mcp251xfd_ring_free;
 
+       mcp251xfd_timestamp_init(priv);
+
        err = mcp251xfd_chip_start(priv);
        if (err)
                goto out_transceiver_disable;
 
-       mcp251xfd_timestamp_init(priv);
        clear_bit(MCP251XFD_FLAGS_DOWN, priv->flags);
        can_rx_offload_enable(&priv->offload);
 
@@ -1648,7 +1652,6 @@ out_destroy_workqueue:
 out_can_rx_offload_disable:
        can_rx_offload_disable(&priv->offload);
        set_bit(MCP251XFD_FLAGS_DOWN, priv->flags);
-       mcp251xfd_timestamp_stop(priv);
 out_transceiver_disable:
        mcp251xfd_transceiver_disable(priv);
 out_mcp251xfd_ring_free:
@@ -1674,7 +1677,6 @@ static int mcp251xfd_stop(struct net_device *ndev)
        free_irq(ndev->irq, priv);
        destroy_workqueue(priv->wq);
        can_rx_offload_disable(&priv->offload);
-       mcp251xfd_timestamp_stop(priv);
        mcp251xfd_chip_stop(priv, CAN_STATE_STOPPED);
        mcp251xfd_transceiver_disable(priv);
        mcp251xfd_ring_free(priv);
index 1db99aabe85c56b2f7ed669a949510accf83313d..202ca0d24d03b9f5bebba23a9f8d0e6f6422c728 100644 (file)
@@ -48,9 +48,12 @@ void mcp251xfd_timestamp_init(struct mcp251xfd_priv *priv)
        cc->shift = 1;
        cc->mult = clocksource_hz2mult(priv->can.clock.freq, cc->shift);
 
-       timecounter_init(&priv->tc, &priv->cc, ktime_get_real_ns());
-
        INIT_DELAYED_WORK(&priv->timestamp, mcp251xfd_timestamp_work);
+}
+
+void mcp251xfd_timestamp_start(struct mcp251xfd_priv *priv)
+{
+       timecounter_init(&priv->tc, &priv->cc, ktime_get_real_ns());
        schedule_delayed_work(&priv->timestamp,
                              MCP251XFD_TIMESTAMP_WORK_DELAY_SEC * HZ);
 }
index 991662fbba42e8b09b0f72acdb33063f09079bc1..dcbbd2b2fae8273844bd1843209ecd5a2ed3a43c 100644 (file)
@@ -957,6 +957,7 @@ int mcp251xfd_ring_alloc(struct mcp251xfd_priv *priv);
 int mcp251xfd_handle_rxif(struct mcp251xfd_priv *priv);
 int mcp251xfd_handle_tefif(struct mcp251xfd_priv *priv);
 void mcp251xfd_timestamp_init(struct mcp251xfd_priv *priv);
+void mcp251xfd_timestamp_start(struct mcp251xfd_priv *priv);
 void mcp251xfd_timestamp_stop(struct mcp251xfd_priv *priv);
 
 void mcp251xfd_tx_obj_write_sync(struct work_struct *work);