Skip to content

Commit 7a57354

Browse files
vanyuan599marckleinebudde
authored andcommitted
can: mcp251x: add error handling for power enable in open and resume
Add missing error handling for mcp251x_power_enable() calls in both mcp251x_open() and mcp251x_can_resume() functions. In mcp251x_open(), if power enable fails, jump to error path to close candev without attempting to disable power again. In mcp251x_can_resume(), properly check return values of power enable calls for both power and transceiver regulators. If any fails, return the error code to the PM framework and log the failure. This ensures the driver properly handles power control failures and maintains correct device state. Signed-off-by: Wenyuan Li <[email protected]> Link: https://patch.msgid.link/[email protected] [mkl: fix patch description] [mkl: mcp251x_can_resume(): replace goto by return] Signed-off-by: Marc Kleine-Budde <[email protected]>
1 parent cadf601 commit 7a57354

1 file changed

Lines changed: 24 additions & 5 deletions

File tree

drivers/net/can/spi/mcp251x.c

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1225,7 +1225,11 @@ static int mcp251x_open(struct net_device *net)
12251225
}
12261226

12271227
mutex_lock(&priv->mcp_lock);
1228-
mcp251x_power_enable(priv->transceiver, 1);
1228+
ret = mcp251x_power_enable(priv->transceiver, 1);
1229+
if (ret) {
1230+
dev_err(&spi->dev, "failed to enable transceiver power: %pe\n", ERR_PTR(ret));
1231+
goto out_close_candev;
1232+
}
12291233

12301234
priv->force_quit = 0;
12311235
priv->tx_skb = NULL;
@@ -1272,6 +1276,7 @@ static int mcp251x_open(struct net_device *net)
12721276
mcp251x_hw_sleep(spi);
12731277
out_close:
12741278
mcp251x_power_enable(priv->transceiver, 0);
1279+
out_close_candev:
12751280
close_candev(net);
12761281
mutex_unlock(&priv->mcp_lock);
12771282
if (release_irq)
@@ -1516,11 +1521,25 @@ static int __maybe_unused mcp251x_can_resume(struct device *dev)
15161521
{
15171522
struct spi_device *spi = to_spi_device(dev);
15181523
struct mcp251x_priv *priv = spi_get_drvdata(spi);
1524+
int ret = 0;
15191525

1520-
if (priv->after_suspend & AFTER_SUSPEND_POWER)
1521-
mcp251x_power_enable(priv->power, 1);
1522-
if (priv->after_suspend & AFTER_SUSPEND_UP)
1523-
mcp251x_power_enable(priv->transceiver, 1);
1526+
if (priv->after_suspend & AFTER_SUSPEND_POWER) {
1527+
ret = mcp251x_power_enable(priv->power, 1);
1528+
if (ret) {
1529+
dev_err(dev, "failed to restore power: %pe\n", ERR_PTR(ret));
1530+
return ret;
1531+
}
1532+
}
1533+
1534+
if (priv->after_suspend & AFTER_SUSPEND_UP) {
1535+
ret = mcp251x_power_enable(priv->transceiver, 1);
1536+
if (ret) {
1537+
dev_err(dev, "failed to restore transceiver power: %pe\n", ERR_PTR(ret));
1538+
if (priv->after_suspend & AFTER_SUSPEND_POWER)
1539+
mcp251x_power_enable(priv->power, 0);
1540+
return ret;
1541+
}
1542+
}
15241543

15251544
if (priv->after_suspend & (AFTER_SUSPEND_POWER | AFTER_SUSPEND_UP))
15261545
queue_work(priv->wq, &priv->restart_work);

0 commit comments

Comments
 (0)