mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 10:49:33 +00:00
net: axienet: Fix probe error cleanup
[ Upstream commit59cd4f1926
] The driver did not always clean up all allocated resources when probe failed. Fix the probe cleanup path to clean up everything that was allocated. Fixes:57baf8cc70
("net: axienet: Handle deferred probe on clock properly") Signed-off-by: Robert Hancock <robert.hancock@calian.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
3e08fd4a82
commit
c4934e65c8
1 changed files with 24 additions and 11 deletions
|
@ -1848,7 +1848,7 @@ static int axienet_probe(struct platform_device *pdev)
|
|||
if (IS_ERR(lp->regs)) {
|
||||
dev_err(&pdev->dev, "could not map Axi Ethernet regs.\n");
|
||||
ret = PTR_ERR(lp->regs);
|
||||
goto free_netdev;
|
||||
goto cleanup_clk;
|
||||
}
|
||||
lp->regs_start = ethres->start;
|
||||
|
||||
|
@ -1923,12 +1923,12 @@ static int axienet_probe(struct platform_device *pdev)
|
|||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
goto free_netdev;
|
||||
goto cleanup_clk;
|
||||
}
|
||||
} else {
|
||||
ret = of_get_phy_mode(pdev->dev.of_node, &lp->phy_mode);
|
||||
if (ret)
|
||||
goto free_netdev;
|
||||
goto cleanup_clk;
|
||||
}
|
||||
|
||||
/* Find the DMA node, map the DMA registers, and decode the DMA IRQs */
|
||||
|
@ -1941,7 +1941,7 @@ static int axienet_probe(struct platform_device *pdev)
|
|||
dev_err(&pdev->dev,
|
||||
"unable to get DMA resource\n");
|
||||
of_node_put(np);
|
||||
goto free_netdev;
|
||||
goto cleanup_clk;
|
||||
}
|
||||
lp->dma_regs = devm_ioremap_resource(&pdev->dev,
|
||||
&dmares);
|
||||
|
@ -1961,12 +1961,12 @@ static int axienet_probe(struct platform_device *pdev)
|
|||
if (IS_ERR(lp->dma_regs)) {
|
||||
dev_err(&pdev->dev, "could not map DMA regs\n");
|
||||
ret = PTR_ERR(lp->dma_regs);
|
||||
goto free_netdev;
|
||||
goto cleanup_clk;
|
||||
}
|
||||
if ((lp->rx_irq <= 0) || (lp->tx_irq <= 0)) {
|
||||
dev_err(&pdev->dev, "could not determine irqs\n");
|
||||
ret = -ENOMEM;
|
||||
goto free_netdev;
|
||||
goto cleanup_clk;
|
||||
}
|
||||
|
||||
/* Autodetect the need for 64-bit DMA pointers.
|
||||
|
@ -1996,7 +1996,7 @@ static int axienet_probe(struct platform_device *pdev)
|
|||
ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(addr_width));
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "No suitable DMA available\n");
|
||||
goto free_netdev;
|
||||
goto cleanup_clk;
|
||||
}
|
||||
|
||||
/* Check for Ethernet core IRQ (optional) */
|
||||
|
@ -2027,12 +2027,12 @@ static int axienet_probe(struct platform_device *pdev)
|
|||
if (!lp->phy_node) {
|
||||
dev_err(&pdev->dev, "phy-handle required for 1000BaseX/SGMII\n");
|
||||
ret = -EINVAL;
|
||||
goto free_netdev;
|
||||
goto cleanup_mdio;
|
||||
}
|
||||
lp->pcs_phy = of_mdio_find_device(lp->phy_node);
|
||||
if (!lp->pcs_phy) {
|
||||
ret = -EPROBE_DEFER;
|
||||
goto free_netdev;
|
||||
goto cleanup_mdio;
|
||||
}
|
||||
lp->phylink_config.pcs_poll = true;
|
||||
}
|
||||
|
@ -2046,17 +2046,30 @@ static int axienet_probe(struct platform_device *pdev)
|
|||
if (IS_ERR(lp->phylink)) {
|
||||
ret = PTR_ERR(lp->phylink);
|
||||
dev_err(&pdev->dev, "phylink_create error (%i)\n", ret);
|
||||
goto free_netdev;
|
||||
goto cleanup_mdio;
|
||||
}
|
||||
|
||||
ret = register_netdev(lp->ndev);
|
||||
if (ret) {
|
||||
dev_err(lp->dev, "register_netdev() error (%i)\n", ret);
|
||||
goto free_netdev;
|
||||
goto cleanup_phylink;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
cleanup_phylink:
|
||||
phylink_destroy(lp->phylink);
|
||||
|
||||
cleanup_mdio:
|
||||
if (lp->pcs_phy)
|
||||
put_device(&lp->pcs_phy->dev);
|
||||
if (lp->mii_bus)
|
||||
axienet_mdio_teardown(lp);
|
||||
of_node_put(lp->phy_node);
|
||||
|
||||
cleanup_clk:
|
||||
clk_disable_unprepare(lp->clk);
|
||||
|
||||
free_netdev:
|
||||
free_netdev(ndev);
|
||||
|
||||
|
|
Loading…
Reference in a new issue