From: Francois Romieu <romieu@fr.zoreil.com>
To: Pekka Enberg <penberg@cs.helsinki.fi>
Cc: David Vrabel <dvrabel@cantab.net>,
linux-kernel@vger.kernel.org, netdev@vger.kernel.org,
david@pleyades.net
Subject: [PATCH 2/3] ipg: leaks in ipg_probe
Date: Tue, 2 May 2006 01:10:50 +0200 [thread overview]
Message-ID: <20060501231050.GC7419@electric-eye.fr.zoreil.com> (raw)
In-Reply-To: <1146506939.23931.2.camel@localhost>
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 <romieu@fr.zoreil.com>
---
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
next prev parent reply other threads:[~2006-05-01 23:11 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-04-27 14:29 IP1000 gigabit nic driver David Gómez
2006-04-27 18:56 ` Francois Romieu
2006-04-27 22:26 ` David Vrabel
2006-04-28 7:57 ` David Gómez
2006-04-28 10:58 ` Pekka Enberg
2006-04-28 11:37 ` David Gómez
2006-04-28 11:51 ` Pekka J Enberg
2006-04-28 11:59 ` Pekka J Enberg
2006-04-28 15:30 ` David Gómez
2006-04-28 16:08 ` Stephen Hemminger
2006-04-28 21:58 ` David Gómez
[not found] ` <20060428154251.23fcfc41@localhost.localdomain>
2006-04-29 7:30 ` David Gómez
2006-04-29 10:29 ` Pekka Enberg
2006-04-29 10:35 ` Arjan van de Ven
2006-04-29 12:21 ` David Gómez
2006-04-29 20:35 ` Pekka Enberg
2006-04-30 9:26 ` Pekka Enberg
2006-04-30 23:40 ` David Vrabel
2006-05-01 9:31 ` Pekka Enberg
2006-05-03 12:43 ` Andrew Morton
2006-05-03 13:06 ` Pekka J Enberg
2006-05-03 14:15 ` David Vrabel
2006-05-01 9:43 ` Pekka Enberg
2006-05-01 11:32 ` David Vrabel
2006-05-01 18:08 ` Pekka Enberg
2006-05-01 23:10 ` [PATCH 1/3] ipg: removal of unreachable code Francois Romieu
2006-05-02 6:36 ` Pekka J Enberg
2006-05-01 23:10 ` Francois Romieu [this message]
2006-05-02 6:41 ` [PATCH 2/3] ipg: leaks in ipg_probe Pekka J Enberg
2006-05-02 18:33 ` Francois Romieu
2006-05-02 19:04 ` Pekka Enberg
2006-05-02 22:30 ` [PATCH] ipg: removing more dead code David Gómez
2006-05-03 13:12 ` Pekka J Enberg
2006-05-03 21:00 ` [PATCH 2/3] ipg: leaks in ipg_probe David Gómez
2006-05-01 23:12 ` [PATCH 3/3] ipg: plug leaks in the error path of ipg_nic_open Francois Romieu
2006-05-02 6:45 ` Pekka J Enberg
2006-05-02 21:44 ` [PATCH 1/2] ipg: sanitize the pci device table Francois Romieu
2006-05-02 21:45 ` [PATCH 2/2] ipg: redundancy with mii.h Francois Romieu
2006-05-02 21:55 ` Francois Romieu
2006-05-03 6:16 ` Pekka J Enberg
2006-05-03 23:35 ` Francois Romieu
2006-05-04 6:52 ` David Vrabel
2006-05-05 0:24 ` Francois Romieu
2006-05-04 13:44 ` Pekka Enberg
2006-05-04 23:55 ` Francois Romieu
2006-05-20 21:03 ` David Vrabel
2006-05-21 7:23 ` Pekka Enberg
2006-05-21 10:16 ` Francois Romieu
2006-05-22 3:22 ` jesse\(建興\)
2006-05-23 6:50 ` jesse\(建興\)
2006-05-01 20:38 ` IP1000 gigabit nic driver Francois Romieu
2006-05-01 20:41 ` Lennert Buytenhek
2006-05-02 0:36 ` David Vrabel
2006-05-01 19:39 ` David Gómez
2006-04-29 12:58 ` David Vrabel
2006-04-28 11:59 ` Ingo Oeser
2006-04-28 7:54 ` David Gómez
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20060501231050.GC7419@electric-eye.fr.zoreil.com \
--to=romieu@fr.zoreil.com \
--cc=david@pleyades.net \
--cc=dvrabel@cantab.net \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=penberg@cs.helsinki.fi \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®