netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] netdrvr/ibmlana: modularization cleanup
@ 2007-10-29 19:33 Jeff Garzik
  2007-10-29 19:33 ` [PATCH 2/2] netdrvr/ibmlana: move away from legacy MCA API Jeff Garzik
  0 siblings, 1 reply; 4+ messages in thread
From: Jeff Garzik @ 2007-10-29 19:33 UTC (permalink / raw)
  To: netdev, linux-kernel; +Cc: akpm

* move alloc_netdev() call, register_netdev() call, and associated failure
  cleanup into ibmlana_probe()

* move per-net_device cleanup into ibmlana_remove_one()

Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
---
 drivers/net/ibmlana.c |  109 +++++++++++++++++++++++++++++--------------------
 1 files changed, 64 insertions(+), 45 deletions(-)

diff --git a/drivers/net/ibmlana.c b/drivers/net/ibmlana.c
index 91d83ac..006d0d7 100644
--- a/drivers/net/ibmlana.c
+++ b/drivers/net/ibmlana.c
@@ -890,11 +890,14 @@ static void ibmlana_set_multicast_list(struct net_device *dev)
  * hardware check
  * ------------------------------------------------------------------------ */
 
+static int ibmlana_irq;
+static int ibmlana_io;
 static int startslot;		/* counts through slots when probing multiple devices */
 
-static int ibmlana_probe(struct net_device *dev)
+static int ibmlana_probe(struct net_device **dev_out)
 {
-	int slot, z;
+	struct net_device *dev;
+	int slot, z, rc;
 	int base = 0, irq = 0, iobase = 0, memlen = 0;
 	ibmlana_priv *priv;
 	ibmlana_medium medium;
@@ -904,6 +907,13 @@ static int ibmlana_probe(struct net_device *dev)
 	if (MCA_bus == 0)
 		return -ENODEV;
 
+	dev = alloc_etherdev(sizeof(ibmlana_priv));
+	if (!dev)
+		return -ENOMEM;
+
+	dev->irq = ibmlana_irq;
+	dev->base_addr = ibmlana_io;
+
 	base = dev->mem_start;
 	irq = dev->irq;
 
@@ -924,8 +934,10 @@ static int ibmlana_probe(struct net_device *dev)
 	}
 
 	/* nothing found ? */
-	if (slot == -1)
-		return (base != 0 || irq != 0) ? -ENXIO : -ENODEV;
+	if (slot == -1) {
+		rc = (base != 0 || irq != 0) ? -ENXIO : -ENODEV;
+		goto err_out;
+	}
 
 	/* announce success */
 	printk(KERN_INFO "%s: IBM LAN Adapter/A found in slot %d\n", dev->name, slot + 1);
@@ -934,7 +946,8 @@ static int ibmlana_probe(struct net_device *dev)
 	if (!request_region(iobase, IBM_LANA_IORANGE, DRV_NAME)) {
 		printk(KERN_ERR "%s: cannot allocate I/O range at %#x!\n", DRV_NAME, iobase);
 		startslot = slot + 1;
-		return -EBUSY;
+		rc = -EBUSY;
+		goto err_out;
 	}
 
 	priv = netdev_priv(dev);
@@ -955,8 +968,8 @@ static int ibmlana_probe(struct net_device *dev)
 	if (!priv->base) {
 		printk(KERN_ERR "%s: cannot remap memory!\n", DRV_NAME);
 		startslot = slot + 1;
-		release_region(iobase, IBM_LANA_IORANGE);
-		return -EBUSY;
+		rc = -EBUSY;
+		goto err_out_reg;
 	}
 
 	/* make procfs entries */
@@ -996,73 +1009,79 @@ static int ibmlana_probe(struct net_device *dev)
 
 	startslot = slot + 1;
 
+	rc = register_netdev(dev);
+	if (rc)
+		goto err_out_claimed;
+
+	*dev_out = dev;
 	return 0;
+
+err_out_claimed:
+	mca_mark_as_unused(priv->slot);
+	mca_set_adapter_name(priv->slot, "");
+	mca_set_adapter_procfn(priv->slot, NULL, NULL);
+	iounmap(priv->base);
+err_out_reg:
+	release_region(iobase, IBM_LANA_IORANGE);
+err_out:
+	free_netdev(dev);
+	return rc;
+}
+
+static void ibmlana_remove_one(struct net_device *_dev)
+{
+	struct net_device *dev = _dev;
+	ibmlana_priv *priv = netdev_priv(dev);
+
+	unregister_netdev(dev);
+	/*DeinitBoard(dev); */
+	release_region(dev->base_addr, IBM_LANA_IORANGE);
+	mca_mark_as_unused(priv->slot);
+	mca_set_adapter_name(priv->slot, "");
+	mca_set_adapter_procfn(priv->slot, NULL, NULL);
+	iounmap(priv->base);
+	free_netdev(dev);
 }
 
 /* ------------------------------------------------------------------------
  * modularization support
  * ------------------------------------------------------------------------ */
 
-#ifdef MODULE
-
 #define DEVMAX 5
 
 static struct net_device *moddevs[DEVMAX];
-static int irq;
-static int io;
 
-module_param(irq, int, 0);
-module_param(io, int, 0);
+module_param_named(irq, ibmlana_irq, int, 0);
+module_param_named(io, ibmlana_io, int, 0);
 MODULE_PARM_DESC(irq, "IBM LAN/A IRQ number");
 MODULE_PARM_DESC(io, "IBM LAN/A I/O base address");
 MODULE_LICENSE("GPL");
 
-int init_module(void)
+static int __init ibmlana_init_module(void)
 {
 	int z;
 
 	startslot = 0;
 	for (z = 0; z < DEVMAX; z++) {
-		struct net_device *dev = alloc_etherdev(sizeof(ibmlana_priv));
-		if (!dev)
-			break;
-		dev->irq = irq;
-		dev->base_addr = io;
-		if (ibmlana_probe(dev)) {
-			free_netdev(dev);
-			break;
-		}
-		if (register_netdev(dev)) {
-			ibmlana_priv *priv = netdev_priv(dev);
-			release_region(dev->base_addr, IBM_LANA_IORANGE);
-			mca_mark_as_unused(priv->slot);
-			mca_set_adapter_name(priv->slot, "");
-			mca_set_adapter_procfn(priv->slot, NULL, NULL);
-			iounmap(priv->base);
-			free_netdev(dev);
+		struct net_device *dev = NULL;
+
+		if (ibmlana_probe(&dev))
 			break;
-		}
+
 		moddevs[z] = dev;
 	}
 	return (z > 0) ? 0 : -EIO;
 }
 
-void cleanup_module(void)
+static void __exit ibmlana_cleanup_module(void)
 {
 	int z;
 	for (z = 0; z < DEVMAX; z++) {
 		struct net_device *dev = moddevs[z];
-		if (dev) {
-			ibmlana_priv *priv = netdev_priv(dev);
-			unregister_netdev(dev);
-			/*DeinitBoard(dev); */
-			release_region(dev->base_addr, IBM_LANA_IORANGE);
-			mca_mark_as_unused(priv->slot);
-			mca_set_adapter_name(priv->slot, "");
-			mca_set_adapter_procfn(priv->slot, NULL, NULL);
-			iounmap(priv->base);
-			free_netdev(dev);
-		}
+		if (dev)
+			ibmlana_remove_one(dev);
 	}
 }
-#endif				/* MODULE */
+
+module_init(ibmlana_init_module);
+module_exit(ibmlana_cleanup_module);
-- 
1.5.2.4


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

* [PATCH 2/2] netdrvr/ibmlana: move away from legacy MCA API
  2007-10-29 19:33 [PATCH 1/2] netdrvr/ibmlana: modularization cleanup Jeff Garzik
@ 2007-10-29 19:33 ` Jeff Garzik
  2007-10-29 19:39   ` Jan Engelhardt
  0 siblings, 1 reply; 4+ messages in thread
From: Jeff Garzik @ 2007-10-29 19:33 UTC (permalink / raw)
  To: netdev, linux-kernel; +Cc: akpm

Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
---
 drivers/net/ibmlana.c |  119 +++++++++++++++++++++----------------------------
 1 files changed, 51 insertions(+), 68 deletions(-)

diff --git a/drivers/net/ibmlana.c b/drivers/net/ibmlana.c
index 006d0d7..188c0a9 100644
--- a/drivers/net/ibmlana.c
+++ b/drivers/net/ibmlana.c
@@ -83,7 +83,7 @@ History:
 #include <linux/interrupt.h>
 #include <linux/delay.h>
 #include <linux/time.h>
-#include <linux/mca-legacy.h>
+#include <linux/mca.h>
 #include <linux/module.h>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
@@ -161,13 +161,13 @@ static void PrTime(void)
 
 /* deduce resources out of POS registers */
 
-static void getaddrs(int slot, int *base, int *memlen, int *iobase,
-		     int *irq, ibmlana_medium * medium)
+static void getaddrs(struct mca_device *mdev, int *base, int *memlen,
+		     int *iobase, int *irq, ibmlana_medium *medium)
 {
 	u_char pos0, pos1;
 
-	pos0 = mca_read_stored_pos(slot, 2);
-	pos1 = mca_read_stored_pos(slot, 3);
+	pos0 = mca_device_read_stored_pos(mdev, 2);
+	pos1 = mca_device_read_stored_pos(mdev, 3);
 
 	*base = 0xc0000 + ((pos1 & 0xf0) << 9);
 	*memlen = (pos1 & 0x01) ? 0x8000 : 0x4000;
@@ -744,6 +744,7 @@ static irqreturn_t irq_handler(int irq, void *device)
 
 /* MCA info */
 
+#if 0 /* info available elsewhere, but this is kept for reference */
 static int ibmlana_getinfo(char *buf, int slot, void *d)
 {
 	int len = 0, i;
@@ -771,6 +772,7 @@ static int ibmlana_getinfo(char *buf, int slot, void *d)
 
 	return len;
 }
+#endif
 
 /* open driver.  Means also initialization and start of LANCE */
 
@@ -894,19 +896,26 @@ static int ibmlana_irq;
 static int ibmlana_io;
 static int startslot;		/* counts through slots when probing multiple devices */
 
-static int ibmlana_probe(struct net_device **dev_out)
+static short ibmlana_adapter_ids[] __initdata = {
+	IBM_LANA_ID,
+	0x0000
+};
+
+static char *ibmlana_adapter_names[] __initdata = {
+	"IBM LAN Adapter/A",
+	NULL
+};
+
+static int ibmlana_init_one(struct device *kdev)
 {
+	struct mca_device *mdev = to_mca_device(kdev);
 	struct net_device *dev;
-	int slot, z, rc;
+	int slot = mdev->slot, z, rc;
 	int base = 0, irq = 0, iobase = 0, memlen = 0;
 	ibmlana_priv *priv;
 	ibmlana_medium medium;
 	DECLARE_MAC_BUF(mac);
 
-	/* can't work without an MCA bus ;-) */
-	if (MCA_bus == 0)
-		return -ENODEV;
-
 	dev = alloc_etherdev(sizeof(ibmlana_priv));
 	if (!dev)
 		return -ENOMEM;
@@ -917,25 +926,16 @@ static int ibmlana_probe(struct net_device **dev_out)
 	base = dev->mem_start;
 	irq = dev->irq;
 
-	for (slot = startslot; (slot = mca_find_adapter(IBM_LANA_ID, slot)) != -1; slot++) {
-		/* deduce card addresses */
-		getaddrs(slot, &base, &memlen, &iobase, &irq, &medium);
-
-		/* slot already in use ? */
-		if (mca_is_adapter_used(slot))
-			continue;
-		/* were we looking for something different ? */
-		if (dev->irq && dev->irq != irq)
-			continue;
-		if (dev->mem_start && dev->mem_start != base)
-			continue;
-		/* found something that matches */
-		break;
-	}
+	/* deduce card addresses */
+	getaddrs(mdev, &base, &memlen, &iobase, &irq, &medium);
 
-	/* nothing found ? */
-	if (slot == -1) {
-		rc = (base != 0 || irq != 0) ? -ENXIO : -ENODEV;
+	/* were we looking for something different ? */
+	if (dev->irq && dev->irq != irq) {
+		rc = -ENODEV;
+		goto err_out;
+	}
+	if (dev->mem_start && dev->mem_start != base) {
+		rc = -ENODEV;
 		goto err_out;
 	}
 
@@ -952,11 +952,10 @@ static int ibmlana_probe(struct net_device **dev_out)
 
 	priv = netdev_priv(dev);
 	priv->slot = slot;
-	priv->realirq = irq;
+	priv->realirq = mca_device_transform_irq(mdev, irq);
 	priv->medium = medium;
 	spin_lock_init(&priv->lock);
 
-
 	/* set base + irq for this device (irq not allocated so far) */
 
 	dev->irq = 0;
@@ -972,18 +971,14 @@ static int ibmlana_probe(struct net_device **dev_out)
 		goto err_out_reg;
 	}
 
-	/* make procfs entries */
-	mca_set_adapter_name(slot, "IBM LAN Adapter/A");
-	mca_set_adapter_procfn(slot, (MCA_ProcFn) ibmlana_getinfo, dev);
-
-	mca_mark_as_used(slot);
+	mca_device_set_name(mdev, ibmlana_adapter_names[mdev->index]);
+	mca_device_set_claim(mdev, 1);
 
 	/* set methods */
 
 	dev->open = ibmlana_open;
 	dev->stop = ibmlana_close;
 	dev->hard_start_xmit = ibmlana_tx;
-	dev->do_ioctl = NULL;
 	dev->set_multicast_list = ibmlana_set_multicast_list;
 	dev->flags |= IFF_MULTICAST;
 
@@ -1013,13 +1008,11 @@ static int ibmlana_probe(struct net_device **dev_out)
 	if (rc)
 		goto err_out_claimed;
 
-	*dev_out = dev;
+	dev_set_drvdata(kdev, dev);
 	return 0;
 
 err_out_claimed:
-	mca_mark_as_unused(priv->slot);
-	mca_set_adapter_name(priv->slot, "");
-	mca_set_adapter_procfn(priv->slot, NULL, NULL);
+	mca_device_set_claim(mdev, 0);
 	iounmap(priv->base);
 err_out_reg:
 	release_region(iobase, IBM_LANA_IORANGE);
@@ -1028,59 +1021,49 @@ err_out:
 	return rc;
 }
 
-static void ibmlana_remove_one(struct net_device *_dev)
+static int ibmlana_remove_one(struct device *kdev)
 {
-	struct net_device *dev = _dev;
+	struct mca_device *mdev = to_mca_device(kdev);
+	struct net_device *dev = dev_get_drvdata(kdev);
 	ibmlana_priv *priv = netdev_priv(dev);
 
 	unregister_netdev(dev);
 	/*DeinitBoard(dev); */
 	release_region(dev->base_addr, IBM_LANA_IORANGE);
-	mca_mark_as_unused(priv->slot);
-	mca_set_adapter_name(priv->slot, "");
-	mca_set_adapter_procfn(priv->slot, NULL, NULL);
+	mca_device_set_claim(mdev, 0);
 	iounmap(priv->base);
 	free_netdev(dev);
+	return 0;
 }
 
 /* ------------------------------------------------------------------------
  * modularization support
  * ------------------------------------------------------------------------ */
 
-#define DEVMAX 5
-
-static struct net_device *moddevs[DEVMAX];
-
 module_param_named(irq, ibmlana_irq, int, 0);
 module_param_named(io, ibmlana_io, int, 0);
 MODULE_PARM_DESC(irq, "IBM LAN/A IRQ number");
 MODULE_PARM_DESC(io, "IBM LAN/A I/O base address");
 MODULE_LICENSE("GPL");
 
+static struct mca_driver ibmlana_driver = {
+	.id_table = ibmlana_adapter_ids,
+	.driver = {
+		.name	= "ibmlana",
+		.bus	= &mca_bus_type,
+		.probe	= ibmlana_init_one,
+		.remove	= ibmlana_remove_one,
+	},
+};
+
 static int __init ibmlana_init_module(void)
 {
-	int z;
-
-	startslot = 0;
-	for (z = 0; z < DEVMAX; z++) {
-		struct net_device *dev = NULL;
-
-		if (ibmlana_probe(&dev))
-			break;
-
-		moddevs[z] = dev;
-	}
-	return (z > 0) ? 0 : -EIO;
+	return mca_register_driver(&ibmlana_driver);
 }
 
 static void __exit ibmlana_cleanup_module(void)
 {
-	int z;
-	for (z = 0; z < DEVMAX; z++) {
-		struct net_device *dev = moddevs[z];
-		if (dev)
-			ibmlana_remove_one(dev);
-	}
+	mca_unregister_driver(&ibmlana_driver);
 }
 
 module_init(ibmlana_init_module);
-- 
1.5.2.4


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

* Re: [PATCH 2/2] netdrvr/ibmlana: move away from legacy MCA API
  2007-10-29 19:33 ` [PATCH 2/2] netdrvr/ibmlana: move away from legacy MCA API Jeff Garzik
@ 2007-10-29 19:39   ` Jan Engelhardt
  2007-10-29 19:41     ` Jeff Garzik
  0 siblings, 1 reply; 4+ messages in thread
From: Jan Engelhardt @ 2007-10-29 19:39 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: netdev, linux-kernel, akpm


On Oct 29 2007 15:33, Jeff Garzik wrote:
> 
>+#if 0 /* info available elsewhere, but this is kept for reference */

It is available in the git history, yes, is it still needed for reference?

>+static short ibmlana_adapter_ids[] __initdata = {
>+	IBM_LANA_ID,
>+	0x0000
>+};
>+
>+static char *ibmlana_adapter_names[] __initdata = {
>+	"IBM LAN Adapter/A",
>+	NULL
>+};

Can this be const?


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

* Re: [PATCH 2/2] netdrvr/ibmlana: move away from legacy MCA API
  2007-10-29 19:39   ` Jan Engelhardt
@ 2007-10-29 19:41     ` Jeff Garzik
  0 siblings, 0 replies; 4+ messages in thread
From: Jeff Garzik @ 2007-10-29 19:41 UTC (permalink / raw)
  To: Jan Engelhardt; +Cc: netdev, linux-kernel, akpm

Jan Engelhardt wrote:
> On Oct 29 2007 15:33, Jeff Garzik wrote:
>> +#if 0 /* info available elsewhere, but this is kept for reference */
> 
> It is available in the git history, yes, is it still needed for reference?

it's there to see if anyone complains at its removal :)


>> +static short ibmlana_adapter_ids[] __initdata = {
>> +	IBM_LANA_ID,
>> +	0x0000
>> +};
>> +
>> +static char *ibmlana_adapter_names[] __initdata = {
>> +	"IBM LAN Adapter/A",
>> +	NULL
>> +};
> 
> Can this be const?

Not with the initdata marker, no.

	Jeff




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

end of thread, other threads:[~2007-10-29 19:41 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-10-29 19:33 [PATCH 1/2] netdrvr/ibmlana: modularization cleanup Jeff Garzik
2007-10-29 19:33 ` [PATCH 2/2] netdrvr/ibmlana: move away from legacy MCA API Jeff Garzik
2007-10-29 19:39   ` Jan Engelhardt
2007-10-29 19:41     ` Jeff Garzik

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).