sky2: fix cleanup sequence in probe() function
authorLino Sanfilippo <LinoSanfilippo@gmx.de>
Sat, 1 Dec 2012 02:39:28 +0000 (02:39 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 3 Dec 2012 18:52:31 +0000 (13:52 -0500)
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>
drivers/net/ethernet/marvell/sky2.c

index 78946fe..19e6494 100644 (file)
@@ -4919,13 +4919,13 @@ static int __devinit sky2_probe(struct pci_dev *pdev,
        err = pci_read_config_dword(pdev, PCI_DEV_REG2, &reg);
        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),