can: mcp251xfd: mcp251xfd_open(): open_candev() first
authorMarc Kleine-Budde <mkl@pengutronix.de>
Fri, 22 Oct 2021 16:45:05 +0000 (18:45 +0200)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Sat, 8 Jan 2022 19:17:41 +0000 (20:17 +0100)
This patch exchanges the order of open_candev() and
pm_runtime_get_sync(), so that open_candev() is called first.

A usual reason why open_candev() fails is missing CAN bit rate
configuration. It makes no sense to resume the device from PM sleep
first just to put it to sleep if the bit rate is not configured.

Link: https://lore.kernel.org/all/20220105154300.1258636-5-mkl@pengutronix.de
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c

index bf2ebd46ff83d166791d54247ed8008c0a2b3f36..161e12cdf8e8977595a24d931003fcd62c22f330 100644 (file)
@@ -2503,19 +2503,19 @@ static int mcp251xfd_open(struct net_device *ndev)
        const struct spi_device *spi = priv->spi;
        int err;
 
+       err = open_candev(ndev);
+       if (err)
+               return err;
+
        err = pm_runtime_get_sync(ndev->dev.parent);
        if (err < 0) {
                pm_runtime_put_noidle(ndev->dev.parent);
-               return err;
+               goto out_close_candev;
        }
 
-       err = open_candev(ndev);
-       if (err)
-               goto out_pm_runtime_put;
-
        err = mcp251xfd_ring_alloc(priv);
        if (err)
-               goto out_close_candev;
+               goto out_pm_runtime_put;
 
        err = mcp251xfd_transceiver_enable(priv);
        if (err)
@@ -2551,11 +2551,11 @@ static int mcp251xfd_open(struct net_device *ndev)
        mcp251xfd_transceiver_disable(priv);
  out_mcp251xfd_ring_free:
        mcp251xfd_ring_free(priv);
- out_close_candev:
-       close_candev(ndev);
  out_pm_runtime_put:
        mcp251xfd_chip_stop(priv, CAN_STATE_STOPPED);
        pm_runtime_put(ndev->dev.parent);
+ out_close_candev:
+       close_candev(ndev);
 
        return err;
 }