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