diff options
author | Lino Sanfilippo <LinoSanfilippo@gmx.de> | 2012-12-01 02:39:28 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-12-03 13:52:31 -0500 |
commit | 1c85382e30618f66d4b15e608ff32253beb22649 (patch) | |
tree | ba78c1e14a8b52f554155a8dbd6dfea14c1cf2c8 | |
parent | cb64edb6b89491edfdbae52ba7db9a8b8391d339 (diff) | |
download | linux-3.10-1c85382e30618f66d4b15e608ff32253beb22649.tar.gz linux-3.10-1c85382e30618f66d4b15e608ff32253beb22649.tar.bz2 linux-3.10-1c85382e30618f66d4b15e608ff32253beb22649.zip |
sky2: fix cleanup sequence in probe() function
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>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/marvell/sky2.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/drivers/net/ethernet/marvell/sky2.c b/drivers/net/ethernet/marvell/sky2.c index 78946feab4a..19e6494f6ed 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), |