et131x: fix error paths in et131x_pci_setup.
authorFrancois Romieu <romieu@fr.zoreil.com>
Sun, 23 Oct 2011 17:11:35 +0000 (19:11 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Sun, 27 Nov 2011 00:20:36 +0000 (16:20 -0800)
Wrong status code and unbalanced phy_connect.

Signed-off-by: Francois Romieu <romieu@fr.zoreil.com>
Acked-by: Mark Einon <mark.einon@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/et131x/et131x.c

index 35270a82923ae851bdf1eebdfa6cb541a696a599..debc07c52e705757a98d11c1fef6edd0d254f560 100644 (file)
@@ -4402,6 +4402,7 @@ static void __devexit et131x_pci_remove(struct pci_dev *pdev)
        struct et131x_adapter *adapter = netdev_priv(netdev);
 
        unregister_netdev(netdev);
+       phy_disconnect(adapter->phydev);
        mdiobus_unregister(adapter->mii_bus);
        kfree(adapter->mii_bus->irq);
        mdiobus_free(adapter->mii_bus);
@@ -5250,40 +5251,6 @@ static const struct net_device_ops et131x_netdev_ops = {
        .ndo_do_ioctl           = et131x_ioctl,
 };
 
-/**
- * et131x_device_alloc
- *
- * Returns pointer to the allocated and initialized net_device struct for
- * this device.
- *
- * Create instances of net_device and wl_private for the new adapter and
- * register the device's entry points in the net_device structure.
- */
-struct net_device *et131x_device_alloc(void)
-{
-       struct net_device *netdev;
-
-       /* Alloc net_device and adapter structs */
-       netdev = alloc_etherdev(sizeof(struct et131x_adapter));
-
-       if (!netdev) {
-               printk(KERN_ERR "et131x: Alloc of net_device struct failed\n");
-               return NULL;
-       }
-
-       /*
-        * Setup the function registration table (and other data) for a
-        * net_device
-        */
-       netdev->watchdog_timeo = ET131X_TX_TIMEOUT;
-       netdev->netdev_ops     = &et131x_netdev_ops;
-
-       /* Poll? */
-       /* netdev->poll               = &et131x_poll; */
-       /* netdev->poll_controller    = &et131x_poll_controller; */
-       return netdev;
-}
-
 /**
  * et131x_pci_setup - Perform device initialization
  * @pdev: a pointer to the device's pci_dev structure
@@ -5299,24 +5266,26 @@ struct net_device *et131x_device_alloc(void)
 static int __devinit et131x_pci_setup(struct pci_dev *pdev,
                               const struct pci_device_id *ent)
 {
-       int result;
        struct net_device *netdev;
        struct et131x_adapter *adapter;
+       int rc;
        int ii;
 
-       result = pci_enable_device(pdev);
-       if (result) {
+       rc = pci_enable_device(pdev);
+       if (rc < 0) {
                dev_err(&pdev->dev, "pci_enable_device() failed\n");
-               goto err_out;
+               goto out;
        }
 
        /* Perform some basic PCI checks */
        if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
                dev_err(&pdev->dev, "Can't find PCI device's base address\n");
+               rc = -ENODEV;
                goto err_disable;
        }
 
-       if (pci_request_regions(pdev, DRIVER_NAME)) {
+       rc = pci_request_regions(pdev, DRIVER_NAME);
+       if (rc < 0) {
                dev_err(&pdev->dev, "Can't get PCI resources\n");
                goto err_disable;
        }
@@ -5325,46 +5294,50 @@ static int __devinit et131x_pci_setup(struct pci_dev *pdev,
 
        /* Check the DMA addressing support of this device */
        if (!dma_set_mask(&pdev->dev, DMA_BIT_MASK(64))) {
-               result = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(64));
-               if (result) {
+               rc = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(64));
+               if (rc < 0) {
                        dev_err(&pdev->dev,
                          "Unable to obtain 64 bit DMA for consistent allocations\n");
                        goto err_release_res;
                }
        } else if (!dma_set_mask(&pdev->dev, DMA_BIT_MASK(32))) {
-               result = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32));
-               if (result) {
+               rc = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32));
+               if (rc < 0) {
                        dev_err(&pdev->dev,
                          "Unable to obtain 32 bit DMA for consistent allocations\n");
                        goto err_release_res;
                }
        } else {
                dev_err(&pdev->dev, "No usable DMA addressing method\n");
-               result = -EIO;
+               rc = -EIO;
                goto err_release_res;
        }
 
        /* Allocate netdev and private adapter structs */
-       netdev = et131x_device_alloc();
+       netdev = alloc_etherdev(sizeof(struct et131x_adapter));
        if (!netdev) {
                dev_err(&pdev->dev, "Couldn't alloc netdev struct\n");
-               result = -ENOMEM;
+               rc = -ENOMEM;
                goto err_release_res;
        }
 
+       netdev->watchdog_timeo = ET131X_TX_TIMEOUT;
+       netdev->netdev_ops     = &et131x_netdev_ops;
+
        SET_NETDEV_DEV(netdev, &pdev->dev);
        et131x_set_ethtool_ops(netdev);
 
        adapter = et131x_adapter_init(netdev, pdev);
 
-       /* Initialise the PCI setup for the device */
-       et131x_pci_init(adapter, pdev);
+       rc = et131x_pci_init(adapter, pdev);
+       if (rc < 0)
+               goto err_free_dev;
 
        /* Map the bus-relative registers to system virtual memory */
        adapter->regs = pci_ioremap_bar(pdev, 0);
        if (!adapter->regs) {
                dev_err(&pdev->dev, "Cannot map device registers\n");
-               result = -ENOMEM;
+               rc = -ENOMEM;
                goto err_free_dev;
        }
 
@@ -5378,8 +5351,8 @@ static int __devinit et131x_pci_setup(struct pci_dev *pdev,
        et131x_disable_interrupts(adapter);
 
        /* Allocate DMA memory */
-       result = et131x_adapter_memory_alloc(adapter);
-       if (result) {
+       rc = et131x_adapter_memory_alloc(adapter);
+       if (rc < 0) {
                dev_err(&pdev->dev, "Could not alloc adapater memory (DMA)\n");
                goto err_iounmap;
        }
@@ -5397,6 +5370,8 @@ static int __devinit et131x_pci_setup(struct pci_dev *pdev,
        adapter->boot_coma = 0;
        et1310_disable_phy_coma(adapter);
 
+       rc = -ENOMEM;
+
        /* Setup the mii_bus struct */
        adapter->mii_bus = mdiobus_alloc();
        if (!adapter->mii_bus) {
@@ -5420,13 +5395,14 @@ static int __devinit et131x_pci_setup(struct pci_dev *pdev,
        for (ii = 0; ii < PHY_MAX_ADDR; ii++)
                adapter->mii_bus->irq[ii] = PHY_POLL;
 
-       if (mdiobus_register(adapter->mii_bus)) {
+       rc = mdiobus_register(adapter->mii_bus);
+       if (rc < 0) {
                dev_err(&pdev->dev, "failed to register MII bus\n");
-               mdiobus_free(adapter->mii_bus);
                goto err_mdio_free_irq;
        }
 
-       if (et131x_mii_probe(netdev)) {
+       rc = et131x_mii_probe(netdev);
+       if (rc < 0) {
                dev_err(&pdev->dev, "failed to probe MII bus\n");
                goto err_mdio_unregister;
        }
@@ -5442,10 +5418,10 @@ static int __devinit et131x_pci_setup(struct pci_dev *pdev,
         */
 
        /* Register the net_device struct with the Linux network layer */
-       result = register_netdev(netdev);
-       if (result != 0) {
+       rc = register_netdev(netdev);
+       if (rc < 0) {
                dev_err(&pdev->dev, "register_netdev() failed\n");
-               goto err_mdio_unregister;
+               goto err_phy_disconnect;
        }
 
        /* Register the net_device struct with the PCI subsystem. Save a copy
@@ -5454,9 +5430,11 @@ static int __devinit et131x_pci_setup(struct pci_dev *pdev,
         */
        pci_set_drvdata(pdev, netdev);
        pci_save_state(adapter->pdev);
+out:
+       return rc;
 
-       return result;
-
+err_phy_disconnect:
+       phy_disconnect(adapter->phydev);
 err_mdio_unregister:
        mdiobus_unregister(adapter->mii_bus);
 err_mdio_free_irq:
@@ -5474,8 +5452,7 @@ err_release_res:
        pci_release_regions(pdev);
 err_disable:
        pci_disable_device(pdev);
-err_out:
-       return result;
+       goto out;
 }
 
 static DEFINE_PCI_DEVICE_TABLE(et131x_pci_table) = {