diff --git a/drivers/net/can/spi/mcp251x.c b/drivers/net/can/spi/mcp251x.c index 88d065718e9905f20f4c97a58f5618ba46c01f29..22126d4077c0c32ffbadb9ba7ba512e31da81e27 100644 --- a/drivers/net/can/spi/mcp251x.c +++ b/drivers/net/can/spi/mcp251x.c @@ -1223,16 +1223,36 @@ static int mcp251x_open(struct net_device *net) priv->tx_skb = NULL; priv->tx_len = 0; - if (!dev_fwnode(&spi->dev)) - flags = IRQF_TRIGGER_FALLING; + if (!dev_fwnode(&spi->dev)) + flags = IRQF_TRIGGER_FALLING; - ret = request_threaded_irq(spi->irq, NULL, mcp251x_can_ist, - flags | IRQF_ONESHOT, dev_name(&spi->dev), - priv); - if (ret) { - dev_err(&spi->dev, "failed to acquire irq %d\n", spi->irq); - goto out_close; - } + ret = mcp251x_hw_wake(spi); + if (ret) + goto out_free_irq; + + ret = mcp251x_setup(net, spi); + if (ret) + goto out_free_irq; + + ret = mcp251x_set_normal_mode(spi); + if (ret) + goto out_free_irq; + + can_led_event(net, CAN_LED_EVENT_OPEN); + + netif_wake_queue(net); + + // 在此处释放锁 + mutex_unlock(&priv->mcp_lock); + + // 请求中断 + ret = request_threaded_irq(spi->irq, NULL, mcp251x_can_ist, + flags | IRQF_ONESHOT, dev_name(&spi->dev), + priv); + if (ret) { + dev_err(&spi->dev, "failed to acquire irq %d\n", spi->irq); + goto out_close; + } ret = mcp251x_hw_wake(spi); if (ret)