* sky2: fix cleanup sequence in probe() function
@ 2012-12-01 12:39 Lino Sanfilippo
2012-12-03 18:53 ` David Miller
0 siblings, 1 reply; 2+ messages in thread
From: Lino Sanfilippo @ 2012-12-01 12:39 UTC (permalink / raw)
To: shemminger, mlindner; +Cc: davem, netdev
The cleanup sequence in sky2_probe() that is called in case of an error is
mixed up in different places:
- pci_disable_device() is not called in each case the device has been enabled
before
- same for pci_disable_msi(): test_msi() may return with an error != EOPNOTSUPP
(due to failure of request_irq()). In that case msi is not disabled
- also failure of register_netdev() does not disable msi
This patch fixes the concerning parts.
Signed-off-by: Lino Sanfilippo <LinoSanfilippo@gmx.de>
---
drivers/net/ethernet/marvell/sky2.c | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/drivers/net/ethernet/marvell/sky2.c b/drivers/net/ethernet/marvell/sky2.c
index b20d2fd..eea58f6 100644
--- a/drivers/net/ethernet/marvell/sky2.c
+++ b/drivers/net/ethernet/marvell/sky2.c
@@ -4919,13 +4919,13 @@ static int __devinit sky2_probe(struct pci_dev *pdev,
err = pci_read_config_dword(pdev, PCI_DEV_REG2, ®);
if (err) {
dev_err(&pdev->dev, "PCI read config failed\n");
- goto err_out;
+ goto err_out_disable;
}
if (~reg == 0) {
dev_err(&pdev->dev, "PCI configuration read error\n");
err = -EIO;
- goto err_out;
+ goto err_out_disable;
}
err = pci_request_regions(pdev, DRV_NAME);
@@ -5012,10 +5012,11 @@ static int __devinit sky2_probe(struct pci_dev *pdev,
if (!disable_msi && pci_enable_msi(pdev) == 0) {
err = sky2_test_msi(hw);
- if (err == -EOPNOTSUPP)
+ if (err) {
pci_disable_msi(pdev);
- else if (err)
- goto err_out_free_netdev;
+ if (err != -EOPNOTSUPP)
+ goto err_out_free_netdev;
+ }
}
err = register_netdev(dev);
@@ -5063,10 +5064,10 @@ err_out_unregister_dev1:
err_out_free_dev1:
free_netdev(dev1);
err_out_unregister:
- if (hw->flags & SKY2_HW_USE_MSI)
- pci_disable_msi(pdev);
unregister_netdev(dev);
err_out_free_netdev:
+ if (hw->flags & SKY2_HW_USE_MSI)
+ pci_disable_msi(pdev);
free_netdev(dev);
err_out_free_pci:
pci_free_consistent(pdev, hw->st_size * sizeof(struct sky2_status_le),
--
1.7.9.5
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: sky2: fix cleanup sequence in probe() function
2012-12-01 12:39 sky2: fix cleanup sequence in probe() function Lino Sanfilippo
@ 2012-12-03 18:53 ` David Miller
0 siblings, 0 replies; 2+ messages in thread
From: David Miller @ 2012-12-03 18:53 UTC (permalink / raw)
To: LinoSanfilippo; +Cc: shemminger, mlindner, netdev
From: Lino Sanfilippo <LinoSanfilippo@gmx.de>
Date: Sat, 1 Dec 2012 13:39:28 +0100
> The cleanup sequence in sky2_probe() that is called in case of an error is
> mixed up in different places:
>
> - pci_disable_device() is not called in each case the device has been enabled
> before
>
> - same for pci_disable_msi(): test_msi() may return with an error != EOPNOTSUPP
> (due to failure of request_irq()). In that case msi is not disabled
>
> - also failure of register_netdev() does not disable msi
>
> This patch fixes the concerning parts.
>
> Signed-off-by: Lino Sanfilippo <LinoSanfilippo@gmx.de>
This looks clearly correct to me, so I've applied it to net-next, thanks.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2012-12-03 18:53 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-12-01 12:39 sky2: fix cleanup sequence in probe() function Lino Sanfilippo
2012-12-03 18:53 ` David Miller
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).