netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [patch 2/4] Update e100 driver to use devres.
@ 2007-08-15 18:59 Brandon Philips
  2007-08-16 11:34 ` Tejun Heo
  0 siblings, 1 reply; 3+ messages in thread
From: Brandon Philips @ 2007-08-15 18:59 UTC (permalink / raw)
  To: netdev, e1000-devel; +Cc: teheo, Brandon Philips

[-- Attachment #1: e100-devres.patch --]
[-- Type: text/plain, Size: 5613 bytes --]

devres manages device resources and is currently used by all libata low level
drivers.   When devres is used in a driver the complexity of error handling in
the device probe and remove functions can be reduced.

In this case e100_free(), e100_remove() and all of the gotos in e100_probe have
been removed.  

Signed-off-by: Brandon Philips <bphilips@suse.de>

---
 drivers/net/e100.c |   78 +++++++++++++----------------------------------------
 1 file changed, 20 insertions(+), 58 deletions(-)

Index: linux-2.6/drivers/net/e100.c
===================================================================
--- linux-2.6.orig/drivers/net/e100.c
+++ linux-2.6/drivers/net/e100.c
@@ -2517,18 +2517,11 @@ static int e100_do_ioctl(struct net_devi
 
 static int e100_alloc(struct nic *nic)
 {
-	nic->mem = pci_alloc_consistent(nic->pdev, sizeof(struct mem),
-		&nic->dma_addr);
-	return nic->mem ? 0 : -ENOMEM;
-}
+	struct device *dev = &nic->pdev->dev;
 
-static void e100_free(struct nic *nic)
-{
-	if(nic->mem) {
-		pci_free_consistent(nic->pdev, sizeof(struct mem),
-			nic->mem, nic->dma_addr);
-		nic->mem = NULL;
-	}
+	nic->mem = dmam_alloc_coherent(dev, sizeof(struct mem),
+		&nic->dma_addr, GFP_ATOMIC);
+	return nic->mem ? 0 : -ENOMEM;
 }
 
 static int e100_open(struct net_device *netdev)
@@ -2554,8 +2547,10 @@ static int __devinit e100_probe(struct p
 	struct net_device *netdev;
 	struct nic *nic;
 	int err;
+	void __iomem **iomap;
+	int bar;
 
-	if(!(netdev = alloc_etherdev(sizeof(struct nic)))) {
+	if (!(netdev = devm_alloc_etherdev(&pdev->dev, sizeof(struct nic)))) {
 		if(((1 << debug) - 1) & NETIF_MSG_PROBE)
 			printk(KERN_ERR PFX "Etherdev alloc failed, abort.\n");
 		return -ENOMEM;
@@ -2585,26 +2580,28 @@ static int __devinit e100_probe(struct p
 	nic->msg_enable = (1 << debug) - 1;
 	pci_set_drvdata(pdev, netdev);
 
-	if((err = pci_enable_device(pdev))) {
+	if ((err = pcim_enable_device(pdev))) {
 		DPRINTK(PROBE, ERR, "Cannot enable PCI device, aborting.\n");
-		goto err_out_free_dev;
+		return err;
 	}
 
 	if(!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
 		DPRINTK(PROBE, ERR, "Cannot find proper PCI device "
 			"base address, aborting.\n");
 		err = -ENODEV;
-		goto err_out_disable_pdev;
+		return err;
 	}
 
-	if((err = pci_request_regions(pdev, DRV_NAME))) {
+	bar = use_io ? 1 : 0;
+	if((err = pcim_iomap_regions(pdev, 1 << bar, DRV_NAME))) {
 		DPRINTK(PROBE, ERR, "Cannot obtain PCI resources, aborting.\n");
-		goto err_out_disable_pdev;
+		return err;
 	}
+	iomap = pcim_iomap_table(pdev)[bar];
 
 	if((err = pci_set_dma_mask(pdev, DMA_32BIT_MASK))) {
 		DPRINTK(PROBE, ERR, "No usable DMA configuration, aborting.\n");
-		goto err_out_free_res;
+		return err;
 	}
 
 	SET_MODULE_OWNER(netdev);
@@ -2613,12 +2610,6 @@ static int __devinit e100_probe(struct p
 	if (use_io)
 		DPRINTK(PROBE, INFO, "using i/o access mode\n");
 
-	nic->csr = pci_iomap(pdev, (use_io ? 1 : 0), sizeof(struct csr));
-	if(!nic->csr) {
-		DPRINTK(PROBE, ERR, "Cannot map device registers, aborting.\n");
-		err = -ENOMEM;
-		goto err_out_free_res;
-	}
 
 	if(ent->driver_data)
 		nic->flags |= ich;
@@ -2650,11 +2641,11 @@ static int __devinit e100_probe(struct p
 
 	if((err = e100_alloc(nic))) {
 		DPRINTK(PROBE, ERR, "Cannot alloc driver memory, aborting.\n");
-		goto err_out_iounmap;
+		return err;
 	}
 
 	if((err = e100_eeprom_load(nic)))
-		goto err_out_free;
+		return err;
 
 	e100_phy_init(nic);
 
@@ -2664,8 +2655,7 @@ static int __devinit e100_probe(struct p
 		if (!eeprom_bad_csum_allow) {
 			DPRINTK(PROBE, ERR, "Invalid MAC address from "
 			        "EEPROM, aborting.\n");
-			err = -EAGAIN;
-			goto err_out_free;
+			return -EAGAIN;
 		} else {
 			DPRINTK(PROBE, ERR, "Invalid MAC address from EEPROM, "
 			        "you MUST configure one.\n");
@@ -2685,7 +2675,7 @@ static int __devinit e100_probe(struct p
 	strcpy(netdev->name, "eth%d");
 	if((err = register_netdev(netdev))) {
 		DPRINTK(PROBE, ERR, "Cannot register net device, aborting.\n");
-		goto err_out_free;
+		return err;
 	}
 
 	DPRINTK(PROBE, INFO, "addr 0x%llx, irq %d, "
@@ -2695,36 +2685,8 @@ static int __devinit e100_probe(struct p
 		netdev->dev_addr[3], netdev->dev_addr[4], netdev->dev_addr[5]);
 
 	return 0;
-
-err_out_free:
-	e100_free(nic);
-err_out_iounmap:
-	pci_iounmap(pdev, nic->csr);
-err_out_free_res:
-	pci_release_regions(pdev);
-err_out_disable_pdev:
-	pci_disable_device(pdev);
-err_out_free_dev:
-	pci_set_drvdata(pdev, NULL);
-	free_netdev(netdev);
-	return err;
 }
 
-static void __devexit e100_remove(struct pci_dev *pdev)
-{
-	struct net_device *netdev = pci_get_drvdata(pdev);
-
-	if(netdev) {
-		struct nic *nic = netdev_priv(netdev);
-		unregister_netdev(netdev);
-		e100_free(nic);
-		iounmap(nic->csr);
-		free_netdev(netdev);
-		pci_release_regions(pdev);
-		pci_disable_device(pdev);
-		pci_set_drvdata(pdev, NULL);
-	}
-}
 
 #ifdef CONFIG_PM
 static int e100_suspend(struct pci_dev *pdev, pm_message_t state)
@@ -2875,7 +2837,7 @@ static struct pci_driver e100_driver = {
 	.name =         DRV_NAME,
 	.id_table =     e100_id_table,
 	.probe =        e100_probe,
-	.remove =       __devexit_p(e100_remove),
+	.remove =       __devexit_p(netdev_pci_remove_one),
 #ifdef CONFIG_PM
 	/* Power Management hooks */
 	.suspend =      e100_suspend,

-- 

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [patch 2/4] Update e100 driver to use devres.
  2007-08-15 18:59 [patch 2/4] Update e100 driver to use devres Brandon Philips
@ 2007-08-16 11:34 ` Tejun Heo
  2007-08-16 15:54   ` Brandon Philips
  0 siblings, 1 reply; 3+ messages in thread
From: Tejun Heo @ 2007-08-16 11:34 UTC (permalink / raw)
  To: Brandon Philips; +Cc: netdev, e1000-devel

Brandon Philips wrote:
> @@ -2554,8 +2547,10 @@ static int __devinit e100_probe(struct p
>  	struct net_device *netdev;
>  	struct nic *nic;
>  	int err;
> +	void __iomem **iomap;
> +	int bar;
>  
> -	if(!(netdev = alloc_etherdev(sizeof(struct nic)))) {
> +	if (!(netdev = devm_alloc_etherdev(&pdev->dev, sizeof(struct nic)))) {
>  		if(((1 << debug) - 1) & NETIF_MSG_PROBE)
>  			printk(KERN_ERR PFX "Etherdev alloc failed, abort.\n");
>  		return -ENOMEM;
> @@ -2585,26 +2580,28 @@ static int __devinit e100_probe(struct p
>  	nic->msg_enable = (1 << debug) - 1;
>  	pci_set_drvdata(pdev, netdev);
>  
> -	if((err = pci_enable_device(pdev))) {
> +	if ((err = pcim_enable_device(pdev))) {
>  		DPRINTK(PROBE, ERR, "Cannot enable PCI device, aborting.\n");
> -		goto err_out_free_dev;
> +		return err;
>  	}
>  
>  	if(!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
>  		DPRINTK(PROBE, ERR, "Cannot find proper PCI device "
>  			"base address, aborting.\n");
>  		err = -ENODEV;
> -		goto err_out_disable_pdev;
> +		return err;
>  	}
>  
> -	if((err = pci_request_regions(pdev, DRV_NAME))) {
> +	bar = use_io ? 1 : 0;
> +	if((err = pcim_iomap_regions(pdev, 1 << bar, DRV_NAME))) {
>  		DPRINTK(PROBE, ERR, "Cannot obtain PCI resources, aborting.\n");
> -		goto err_out_disable_pdev;
> +		return err;
>  	}
> +	iomap = pcim_iomap_table(pdev)[bar];

Type mismatch.  Didn't compiler warn about it?

>  
>  	if((err = pci_set_dma_mask(pdev, DMA_32BIT_MASK))) {
>  		DPRINTK(PROBE, ERR, "No usable DMA configuration, aborting.\n");
> -		goto err_out_free_res;
> +		return err;
>  	}
>  
>  	SET_MODULE_OWNER(netdev);
> @@ -2613,12 +2610,6 @@ static int __devinit e100_probe(struct p
>  	if (use_io)
>  		DPRINTK(PROBE, INFO, "using i/o access mode\n");
>  
> -	nic->csr = pci_iomap(pdev, (use_io ? 1 : 0), sizeof(struct csr));
> -	if(!nic->csr) {
> -		DPRINTK(PROBE, ERR, "Cannot map device registers, aborting.\n");
> -		err = -ENOMEM;
> -		goto err_out_free_res;
> -	}

nic->csr initialization seems missing.  Have you tested the patched code?

-- 
tejun

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [patch 2/4] Update e100 driver to use devres.
  2007-08-16 11:34 ` Tejun Heo
@ 2007-08-16 15:54   ` Brandon Philips
  0 siblings, 0 replies; 3+ messages in thread
From: Brandon Philips @ 2007-08-16 15:54 UTC (permalink / raw)
  To: Tejun Heo; +Cc: e1000-devel, netdev

On 20:34 Thu 16 Aug 2007, Tejun Heo wrote:
> Brandon Philips wrote:
> > @@ -2554,8 +2547,10 @@ static int __devinit e100_probe(struct p
> >  	struct net_device *netdev;
> >  	struct nic *nic;
> >  	int err;
> > +	void __iomem **iomap;
> > +	int bar;
> >  
> > -	if(!(netdev = alloc_etherdev(sizeof(struct nic)))) {
> > +	if (!(netdev = devm_alloc_etherdev(&pdev->dev, sizeof(struct nic)))) {
> >  		if(((1 << debug) - 1) & NETIF_MSG_PROBE)
> >  			printk(KERN_ERR PFX "Etherdev alloc failed, abort.\n");
> >  		return -ENOMEM;
> > @@ -2585,26 +2580,28 @@ static int __devinit e100_probe(struct p
> >  	nic->msg_enable = (1 << debug) - 1;
> >  	pci_set_drvdata(pdev, netdev);
> >  
> > -	if((err = pci_enable_device(pdev))) {
> > +	if ((err = pcim_enable_device(pdev))) {
> >  		DPRINTK(PROBE, ERR, "Cannot enable PCI device, aborting.\n");
> > -		goto err_out_free_dev;
> > +		return err;
> >  	}
> >  
> >  	if(!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
> >  		DPRINTK(PROBE, ERR, "Cannot find proper PCI device "
> >  			"base address, aborting.\n");
> >  		err = -ENODEV;
> > -		goto err_out_disable_pdev;
> > +		return err;
> >  	}
> >  
> > -	if((err = pci_request_regions(pdev, DRV_NAME))) {
> > +	bar = use_io ? 1 : 0;
> > +	if((err = pcim_iomap_regions(pdev, 1 << bar, DRV_NAME))) {
> >  		DPRINTK(PROBE, ERR, "Cannot obtain PCI resources, aborting.\n");
> > -		goto err_out_disable_pdev;
> > +		return err;
> >  	}
> > +	iomap = pcim_iomap_table(pdev)[bar];
> 
> Type mismatch.  Didn't compiler warn about it?

s/iomap/nic->csr/

> >  
> >  	if((err = pci_set_dma_mask(pdev, DMA_32BIT_MASK))) {
> >  		DPRINTK(PROBE, ERR, "No usable DMA configuration, aborting.\n");
> > -		goto err_out_free_res;
> > +		return err;
> >  	}
> >  
> >  	SET_MODULE_OWNER(netdev);
> > @@ -2613,12 +2610,6 @@ static int __devinit e100_probe(struct p
> >  	if (use_io)
> >  		DPRINTK(PROBE, INFO, "using i/o access mode\n");
> >  
> > -	nic->csr = pci_iomap(pdev, (use_io ? 1 : 0), sizeof(struct csr));
> > -	if(!nic->csr) {
> > -		DPRINTK(PROBE, ERR, "Cannot map device registers, aborting.\n");
> > -		err = -ENOMEM;
> > -		goto err_out_free_res;
> > -	}
> 
> nic->csr initialization seems missing.  Have you tested the patched code?

No I didn't test it; my e100 box gave up on me.  I shouldn't have sent
this patch since I wasn't able to get it tested.

Thanks,

	Brandon

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2007-08-16 15:54 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-08-15 18:59 [patch 2/4] Update e100 driver to use devres Brandon Philips
2007-08-16 11:34 ` Tejun Heo
2007-08-16 15:54   ` Brandon Philips

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).