[PATCH 2/3] ipg: leaks in ipg_probe

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux