Skip to content

Commit 375f755

Browse files
houweitaoomarckleinebudde
authored andcommitted
can: mcp251x: add error check when wq alloc failed
add error check when workqueue alloc failed, and remove redundant code to make it clear. Fixes: e000016 ("can: Driver for the Microchip MCP251x SPI CAN controllers") Signed-off-by: Weitao Hou <[email protected]> Acked-by: Willem de Bruijn <[email protected]> Tested-by: Sean Nyekjaer <[email protected]> Signed-off-by: Marc Kleine-Budde <[email protected]>
1 parent d4b890a commit 375f755

File tree

1 file changed

+22
-27
lines changed

1 file changed

+22
-27
lines changed

drivers/net/can/spi/mcp251x.c

Lines changed: 22 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -664,17 +664,6 @@ static int mcp251x_power_enable(struct regulator *reg, int enable)
664664
return regulator_disable(reg);
665665
}
666666

667-
static void mcp251x_open_clean(struct net_device *net)
668-
{
669-
struct mcp251x_priv *priv = netdev_priv(net);
670-
struct spi_device *spi = priv->spi;
671-
672-
free_irq(spi->irq, priv);
673-
mcp251x_hw_sleep(spi);
674-
mcp251x_power_enable(priv->transceiver, 0);
675-
close_candev(net);
676-
}
677-
678667
static int mcp251x_stop(struct net_device *net)
679668
{
680669
struct mcp251x_priv *priv = netdev_priv(net);
@@ -940,37 +929,43 @@ static int mcp251x_open(struct net_device *net)
940929
flags | IRQF_ONESHOT, DEVICE_NAME, priv);
941930
if (ret) {
942931
dev_err(&spi->dev, "failed to acquire irq %d\n", spi->irq);
943-
mcp251x_power_enable(priv->transceiver, 0);
944-
close_candev(net);
945-
goto open_unlock;
932+
goto out_close;
946933
}
947934

948935
priv->wq = alloc_workqueue("mcp251x_wq", WQ_FREEZABLE | WQ_MEM_RECLAIM,
949936
0);
937+
if (!priv->wq) {
938+
ret = -ENOMEM;
939+
goto out_clean;
940+
}
950941
INIT_WORK(&priv->tx_work, mcp251x_tx_work_handler);
951942
INIT_WORK(&priv->restart_work, mcp251x_restart_work_handler);
952943

953944
ret = mcp251x_hw_reset(spi);
954-
if (ret) {
955-
mcp251x_open_clean(net);
956-
goto open_unlock;
957-
}
945+
if (ret)
946+
goto out_free_wq;
958947
ret = mcp251x_setup(net, spi);
959-
if (ret) {
960-
mcp251x_open_clean(net);
961-
goto open_unlock;
962-
}
948+
if (ret)
949+
goto out_free_wq;
963950
ret = mcp251x_set_normal_mode(spi);
964-
if (ret) {
965-
mcp251x_open_clean(net);
966-
goto open_unlock;
967-
}
951+
if (ret)
952+
goto out_free_wq;
968953

969954
can_led_event(net, CAN_LED_EVENT_OPEN);
970955

971956
netif_wake_queue(net);
957+
mutex_unlock(&priv->mcp_lock);
972958

973-
open_unlock:
959+
return 0;
960+
961+
out_free_wq:
962+
destroy_workqueue(priv->wq);
963+
out_clean:
964+
free_irq(spi->irq, priv);
965+
mcp251x_hw_sleep(spi);
966+
out_close:
967+
mcp251x_power_enable(priv->transceiver, 0);
968+
close_candev(net);
974969
mutex_unlock(&priv->mcp_lock);
975970
return ret;
976971
}

0 commit comments

Comments
 (0)