From c50b1342c67a30129effa255fcc3759306e64d70 Mon Sep 17 00:00:00 2001 From: Jeremiah Lott Date: Wed, 23 Sep 2009 11:21:54 -0400 Subject: Fix race condition in fec driver where interrupt occuring during driver probe caused a kernel panic. --- drivers/net/fec.c | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/drivers/net/fec.c b/drivers/net/fec.c index c9fd82d3a80d..721761a4428e 100644 --- a/drivers/net/fec.c +++ b/drivers/net/fec.c @@ -1879,6 +1879,21 @@ fec_probe(struct platform_device *pdev) platform_set_drvdata(pdev, ndev); + fep->clk = clk_get(&pdev->dev, "fec_clk"); + if (IS_ERR(fep->clk)) { + ret = PTR_ERR(fep->clk); + goto failed_clk; + } + clk_enable(fep->clk); + + ret = fec_enet_init(ndev, 0); + if (ret) + goto failed_init; + + ret = register_netdev(ndev); + if (ret) + goto failed_register; + /* This device has up to three irqs on some platforms */ for (i = 0; i < 3; i++) { irq = platform_get_irq(pdev, i); @@ -1895,34 +1910,14 @@ fec_probe(struct platform_device *pdev) } } - fep->clk = clk_get(&pdev->dev, "fec_clk"); - if (IS_ERR(fep->clk)) { - ret = PTR_ERR(fep->clk); - goto failed_clk; - } - clk_enable(fep->clk); - - ret = fec_enet_init(ndev, 0); - if (ret) - goto failed_init; - - ret = register_netdev(ndev); - if (ret) - goto failed_register; - return 0; +failed_irq: failed_register: failed_init: clk_disable(fep->clk); clk_put(fep->clk); failed_clk: - for (i = 0; i < 3; i++) { - irq = platform_get_irq(pdev, i); - if (irq > 0) - free_irq(irq, ndev); - } -failed_irq: iounmap((void __iomem *)ndev->base_addr); failed_ioremap: free_netdev(ndev); -- cgit v1.2.3