The error paths are badly broken.

Bonus:
- remove duplicate initialization of sp;
- remove useless NULL initialization of dev;
- USE_IO_OPS is not used (and the driver does not seem to care about
  posted writes, rejoice).

Signed-off-by: Francois Romieu <[EMAIL PROTECTED]>

---

 drivers/net/ipg.c |   93 ++++++++++++++++++++++++-----------------------------
 1 files changed, 42 insertions(+), 51 deletions(-)

5ea54e95a2319311aaae857ecf2adb7fbe068c92
diff --git a/drivers/net/ipg.c b/drivers/net/ipg.c
index 42396ca..da0fa22 100644
--- a/drivers/net/ipg.c
+++ b/drivers/net/ipg.c
@@ -2914,11 +2914,8 @@ static void ipg_remove(struct pci_dev *p
        /* Un-register Ethernet device. */
        unregister_netdev(dev);
 
-#ifdef USE_IO_OPS
-       ioport_unmap(ioaddr);
-#else
-       iounmap(sp->ioaddr);
-#endif
+       pci_iounmap(pdev, sp->ioaddr);
+
        pci_release_regions(pdev);
 
        free_netdev(dev);
@@ -2929,19 +2926,15 @@ #endif
 static int __devinit ipg_probe(struct pci_dev *pdev,
                               const struct pci_device_id *id)
 {
-       int err, i;
-       struct net_device *dev = NULL;
+       unsigned int i = id->driver_data;
        struct ipg_nic_private *sp;
+       struct net_device *dev;
        void __iomem *ioaddr;
-       unsigned long pio_start, pio_len;
-       unsigned long mmio_start;
+       int rc;
 
-       err = pci_enable_device(pdev);
-       if (err)
-               return err;
-
-       /* Get the index for the driver description string. */
-       i = id->driver_data;
+       rc = pci_enable_device(pdev);
+       if (rc < 0)
+               goto out;
 
        printk(KERN_INFO "%s found.\n", nics_supported[i].NICname);
        printk(KERN_INFO "Bus %x Slot %x\n",
@@ -2949,10 +2942,14 @@ static int __devinit ipg_probe(struct pc
 
        pci_set_master(pdev);
 
-       if (!pci_dma_supported(pdev, 0xFFFFFFFF)) {
-               printk(KERN_INFO "pci_dma_supported out.\n");
-               err = -ENODEV;
-               goto out;
+       rc = pci_set_dma_mask(pdev, DMA_40BIT_MASK);
+       if (rc < 0) {
+               rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+               if (rc < 0) {
+                       printk(KERN_ERR "%s: DMA config failed.\n",
+                              pci_name(pdev));
+                       goto err_disable_0;
+               }
        }
 
        /*
@@ -2960,9 +2957,9 @@ static int __devinit ipg_probe(struct pc
         */
        dev = alloc_etherdev(sizeof(struct ipg_nic_private));
        if (!dev) {
-               printk(KERN_ERR "ipg: alloc_etherdev failed\n");
-               err = -ENOMEM;
-               goto out;
+               printk(KERN_ERR "%s: alloc_etherdev failed\n", pci_name(pdev));
+               rc = -ENOMEM;
+               goto err_disable_0;
        }
 
        sp = netdev_priv(dev);
@@ -2981,50 +2978,44 @@ static int __devinit ipg_probe(struct pc
        SET_MODULE_OWNER(dev);
        SET_NETDEV_DEV(dev, &pdev->dev);
 
-       err = pci_request_regions(pdev, DRV_NAME);
-       if (err)
-               goto out;
-
-       pio_start = pci_resource_start(pdev, 0) & 0xffffff80;
-       pio_len = pci_resource_len(pdev, 0);
-       mmio_start = pci_resource_start(pdev, 1) & 0xffffff80;
+       rc = pci_request_regions(pdev, DRV_NAME);
+       if (rc)
+               goto err_free_dev_1;
 
-#ifdef USE_IO_OPS
-       ioaddr = ioport_map(pio_start, pio_len);
-       if (!ioaddr) {
-               printk(KERN_ERR "%s cannot map PIO\n", pci_name(pdev));
-               err = -EIO;
-               goto out;
-       }
-#else
-       ioaddr = ioremap(mmio_start, netdev_io_size);
+       ioaddr = pci_iomap(pdev, 1, pci_resource_len(pdev, 1));
        if (!ioaddr) {
                printk(KERN_ERR "%s cannot map MMIO\n", pci_name(pdev));
-               err = -EIO;
-               goto out;
+               rc = -EIO;
+               goto err_release_regions_2;
        }
-#endif
-       sp = netdev_priv(dev);
+
        /* Save the pointer to the PCI device information. */
        sp->ioaddr = ioaddr;
        sp->pdev = pdev;
 
        pci_set_drvdata(pdev, dev);
 
-       err = ipg_hw_init(dev);
-       if (err)
-               goto out;
+       rc = ipg_hw_init(dev);
+       if (rc < 0)
+               goto err_unmap_3;
 
-       err = register_netdev(dev);
-       if (err)
-               goto out;
+       rc = register_netdev(dev);
+       if (rc < 0)
+               goto err_unmap_3;
 
        printk(KERN_INFO "Ethernet device registered as: %s\n", dev->name);
-       return 0;
+out:
+       return rc;
 
-      out:
+err_unmap_3:
+       pci_iounmap(pdev, ioaddr);
+err_release_regions_2:
+       pci_release_regions(pdev);
+err_free_dev_1:
+       free_netdev(dev);
+err_disable_0:
        pci_disable_device(pdev);
-       return err;
+       goto out;
 }
 
 static void ipg_set_phy_default_param(unsigned char rev,
-- 
1.3.1

-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to