netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] (0/7) device_probe enhancement
@ 2003-09-23 21:47 Stephen Hemminger
  2003-09-23 23:39 ` David S. Miller
  2003-09-24  0:40 ` Jeff Garzik
  0 siblings, 2 replies; 5+ messages in thread
From: Stephen Hemminger @ 2003-09-23 21:47 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: netdev

This comes from Al Viro's net device patchset and is updated for 2.6.0-test5 latest.
It adds a second probe list for network devices that are compiled into the kernel,
but allocate their own network device rather than being handed a device.

It is part of the incremental changes to have all network devices using dynamic
allocation.

diff -Nru a/drivers/net/Space.c b/drivers/net/Space.c
--- a/drivers/net/Space.c	Tue Sep 23 12:56:25 2003
+++ b/drivers/net/Space.c	Tue Sep 23 12:56:25 2003
@@ -111,6 +111,11 @@
 	int status;	/* non-zero if autoprobe has failed */
 };
 
+struct devprobe2 {
+	struct net_device *(*probe)(int unit);
+	int status;	/* non-zero if autoprobe has failed */
+};
+
 /*
  * probe_list walks a list of probe functions and calls each so long
  * as a non-zero ioaddr is given, or as long as it hasn't already failed 
@@ -136,6 +141,21 @@
 	return -ENODEV;
 }
 
+static int __init probe_list2(int unit, struct devprobe2 *p, int autoprobe)
+{
+	struct net_device *dev;
+	for (; p->probe; p++) {
+		if (autoprobe && p->status)
+			continue;
+		dev = p->probe(unit);
+		if (!IS_ERR(dev))
+			return 0;
+		if (autoprobe)
+			p->status = PTR_ERR(dev);
+	}
+	return -ENODEV;
+}
+
 /*
  * This is a bit of an artificial separation as there are PCI drivers
  * that also probe for EISA cards (in the PCI group) and there are ISA
@@ -376,6 +396,16 @@
 	return err;
 
 }
+ 
+static void __init ethif_probe2(int unit)
+{
+	unsigned long base_addr = netdev_boot_base("eth", unit);
+
+	if (base_addr == 1)
+		return;
+
+	return;	/* nothing yet */
+}
 
 #ifdef CONFIG_TR
 /* Token-ring device probe */
@@ -445,9 +475,12 @@
 		if (trif_probe(num))
 			break;
 #endif
-	for (num = 0; num < 8; ++num)
+	for (num = 0; num < 8; ++num) {
 		if (ethif_probe(num))
 			break;
+		ethif_probe2(num);
+	}
+
 #ifdef CONFIG_COPS
 	cops_probe(0);
 	cops_probe(1);
diff -Nru a/include/linux/netdevice.h b/include/linux/netdevice.h
--- a/include/linux/netdevice.h	Tue Sep 23 12:56:25 2003
+++ b/include/linux/netdevice.h	Tue Sep 23 12:56:25 2003
@@ -498,6 +498,7 @@
 extern void		probe_old_netdevs(void);
 extern int			netdev_boot_setup_add(char *name, struct ifmap *map);
 extern int 			netdev_boot_setup_check(struct net_device *dev);
+extern unsigned long		netdev_boot_base(const char *prefix, int unit);
 extern struct net_device    *dev_getbyhwaddr(unsigned short type, char *hwaddr);
 extern void		dev_add_pack(struct packet_type *pt);
 extern void		dev_remove_pack(struct packet_type *pt);
diff -Nru a/net/core/dev.c b/net/core/dev.c
--- a/net/core/dev.c	Tue Sep 23 12:56:25 2003
+++ b/net/core/dev.c	Tue Sep 23 12:56:25 2003
@@ -375,6 +375,30 @@
 	return 0;
 }
 
+
+/**
+ *	netdev_boot_base	- get address from boot time settings
+ *	@prefix: prefix for network device
+ *	@unit: id for network device
+ *
+ * 	Check boot time settings for the base address of device.
+ *	The found settings are set for the device to be used
+ *	later in the device probing.
+ *	Returns 0 if no settings found.
+ */
+unsigned long netdev_boot_base(const char *prefix, int unit)
+{
+	const struct netdev_boot_setup *s = dev_boot_setup;
+	char name[IFNAMSIZ];
+	int i;
+
+	sprintf(name, "%s%d", prefix, unit);
+	for (i = 0; i < NETDEV_BOOT_SETUP_MAX; i++)
+		if (!strcmp(name, s[i].name))
+			return s[i].map.base_addr;
+	return 0;
+}
+
 /*
  * Saves at boot time configured settings for any netdevice.
  */

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

* Re: [PATCH] (0/7) device_probe enhancement
  2003-09-23 21:47 [PATCH] (0/7) device_probe enhancement Stephen Hemminger
@ 2003-09-23 23:39 ` David S. Miller
  2003-09-24  0:25   ` Jeff Garzik
  2003-09-24  0:40 ` Jeff Garzik
  1 sibling, 1 reply; 5+ messages in thread
From: David S. Miller @ 2003-09-23 23:39 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: jgarzik, netdev

On Tue, 23 Sep 2003 14:47:21 -0700
Stephen Hemminger <shemminger@osdl.org> wrote:

> This comes from Al Viro's net device patchset and is updated for
> 2.6.0-test5 latest.  It adds a second probe list for network devices
> that are compiled into the kernel, but allocate their own network
> device rather than being handed a device.  It is part of the
> incremental changes to have all network devices using dynamic
> allocation.

This all looks fine to me.  Jeff, what do you think?  Are you gonna
merge it if it's ok to you?

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

* Re: [PATCH] (0/7) device_probe enhancement
  2003-09-23 23:39 ` David S. Miller
@ 2003-09-24  0:25   ` Jeff Garzik
  0 siblings, 0 replies; 5+ messages in thread
From: Jeff Garzik @ 2003-09-24  0:25 UTC (permalink / raw)
  To: David S. Miller; +Cc: Stephen Hemminger, netdev

David S. Miller wrote:
> On Tue, 23 Sep 2003 14:47:21 -0700
> Stephen Hemminger <shemminger@osdl.org> wrote:
> 
> 
>>This comes from Al Viro's net device patchset and is updated for
>>2.6.0-test5 latest.  It adds a second probe list for network devices
>>that are compiled into the kernel, but allocate their own network
>>device rather than being handed a device.  It is part of the
>>incremental changes to have all network devices using dynamic
>>allocation.
> 
> 
> This all looks fine to me.  Jeff, what do you think?  Are you gonna
> merge it if it's ok to you?


Merging right now.  I have some minor nits to pick, but they can be 
cleaned up later.

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

* Re: [PATCH] (0/7) device_probe enhancement
  2003-09-23 21:47 [PATCH] (0/7) device_probe enhancement Stephen Hemminger
  2003-09-23 23:39 ` David S. Miller
@ 2003-09-24  0:40 ` Jeff Garzik
  2003-09-24 17:03   ` [PATCH] (1/7) de620 -- dynamic allocation (resend) Stephen Hemminger
  1 sibling, 1 reply; 5+ messages in thread
From: Jeff Garzik @ 2003-09-24  0:40 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: netdev

hum.

your first patch applied OK (0/7), but your succeeding patches did not. 
  All of them failed on Space.c.

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

* [PATCH] (1/7) de620 -- dynamic allocation (resend)
  2003-09-24  0:40 ` Jeff Garzik
@ 2003-09-24 17:03   ` Stephen Hemminger
  0 siblings, 0 replies; 5+ messages in thread
From: Stephen Hemminger @ 2003-09-24 17:03 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: netdev

[-- Attachment #1: Type: text/plain, Size: 1360 bytes --]

Convert de620 (original from Al Viro)
	* switched de620 to dynamic allocation
	* de620: embedded ->priv
	* de620: fixed IO before request_region()
	+ fetch and don't clobber command line baseaddr

This applies against 2.6.0-test5 bk latest with the probe2 (0/7) applied.
Revision history of Space.c were:  

======== Space.c 1.1..1.40 ========
D 1.40 03/09/23 05:56:25-07:00 shemminger@osdl.org[shemminger] 42 41 34/1/481
P drivers/net/Space.c
C Import patch 0-probe2
------------------------------------------------
D 1.39 03/09/23 12:09:54-07:00 shemminger@osdl.org 41 40 8/6/474
P drivers/net/Space.c
C [NET]: Fix boot param string setup in Space.c
------------------------------------------------
D 1.38 03/09/23 12:08:59-07:00 shemminger@osdl.org 40 39 3/6/477
P drivers/net/Space.c
C [NET]: Fix inaccurate comments in Space.c
------------------------------------------------
D 1.37 03/09/23 12:08:25-07:00 shemminger@osdl.org 39 38 3/11/480
P drivers/net/Space.c
C [NET]: No need for alloc_divert_blk in Space.c
------------------------------------------------
D 1.36 03/09/12 13:40:26-04:00 mzyngier@freesurf.fr[jgarzik] 38 37 0/4/491
P drivers/net/Space.c
C depca update
------------------------------------------------
D 1.35 03/09/08 10:01:25-04:00 shemminger@osdl.org[jgarzik] 37 36 0/5/495
P drivers/net/Space.c
C (1/4) sdla - move out of Space.c


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 1-de620.patch --]
[-- Type: text/x-diff; name="1-de620.patch", Size: 4399 bytes --]

diff -Nru a/drivers/net/Space.c b/drivers/net/Space.c
--- a/drivers/net/Space.c	Wed Sep 24 09:54:28 2003
+++ b/drivers/net/Space.c	Wed Sep 24 09:54:28 2003
@@ -97,7 +97,7 @@
 extern struct net_device *ltpc_probe(void);
   
 /* Detachable devices ("pocket adaptors") */
-extern int de620_probe(struct net_device *);
+extern struct net_device *de620_probe(int unit);
 
 /* Fibre Channel adapters */
 extern int iph5526_probe(struct net_device *dev);
@@ -296,7 +296,7 @@
 	{NULL, 0},
 };
 
-static struct devprobe parport_probes[] __initdata = {
+static struct devprobe2 parport_probes[] __initdata = {
 #ifdef CONFIG_DE620		/* D-Link DE-620 adapter */
 	{de620_probe, 0},
 #endif
@@ -387,8 +387,7 @@
 	    probe_list(dev, mips_probes) == 0 ||
 	    probe_list(dev, eisa_probes) == 0 ||
 	    probe_list(dev, mca_probes) == 0 ||
-	    probe_list(dev, isa_probes) == 0 ||
-	    probe_list(dev, parport_probes) == 0) 
+	    probe_list(dev, isa_probes) == 0)
 		err = register_netdev(dev);
 
 	if (err)
@@ -404,7 +403,7 @@
 	if (base_addr == 1)
 		return;
 
-	return;	/* nothing yet */
+	probe_list2(unit, parport_probes, base_addr == 0);
 }
 
 #ifdef CONFIG_TR
diff -Nru a/drivers/net/de620.c b/drivers/net/de620.c
--- a/drivers/net/de620.c	Wed Sep 24 09:54:28 2003
+++ b/drivers/net/de620.c	Wed Sep 24 09:54:28 2003
@@ -226,7 +226,6 @@
 
 /* Initialization */
 static int	adapter_init(struct net_device *);
-int		de620_probe(struct net_device *);
 static int	read_eeprom(struct net_device *);
 
 
@@ -814,11 +813,16 @@
  *
  * Check if there is a DE-620 connected
  */
-int __init de620_probe(struct net_device *dev)
+struct net_device * __init de620_probe(int unit)
 {
-	static struct net_device_stats de620_netstats;
-	int i;
 	byte checkbyte = 0xa5;
+	struct net_device *dev;
+	int err = -ENOMEM;
+	int i;
+
+	dev = alloc_etherdev(sizeof(struct net_device_stats));
+	if (!dev)
+		goto out;
 
 	SET_MODULE_OWNER(dev);
 
@@ -831,11 +835,23 @@
 	dev->base_addr = io;
 	dev->irq       = irq;
 
+	/* allow overriding parameters on command line */
+	if (unit >= 0) {
+		sprintf(dev->name, "eth%d", unit);
+		netdev_boot_setup_check(dev);
+	}
+	
 	if (de620_debug)
 		printk(version);
 
 	printk(KERN_INFO "D-Link DE-620 pocket adapter");
 
+	if (!request_region(dev->base_addr, 3, "de620")) {
+		printk(" io 0x%3lX, which is busy.\n", dev->base_addr);
+		err = -EBUSY;
+		goto out1;
+	}
+
 	/* Initially, configure basic nibble mode, so we can read the EEPROM */
 	NIC_Cmd = DEF_NIC_CMD;
 	de620_set_register(dev, W_EIP, EIPRegister);
@@ -846,12 +862,8 @@
 
 	if ((checkbyte != 0xa5) || (read_eeprom(dev) != 0)) {
 		printk(" not identified in the printer port\n");
-		return -ENODEV;
-	}
-
-	if (!request_region(dev->base_addr, 3, "de620")) {
-		printk(KERN_ERR "io 0x%3lX, which is busy.\n", dev->base_addr);
-		return -EBUSY;
+		err = -ENODEV;
+		goto out2;
 	}
 
 	/* else, got it! */
@@ -870,10 +882,6 @@
 	else
 		printk(" UTP)\n");
 
-	/* Initialize the device structure. */
-	dev->priv = &de620_netstats;
-
-	memset(dev->priv, 0, sizeof(struct net_device_stats));
 	dev->get_stats 		= get_stats;
 	dev->open 		= de620_open;
 	dev->stop 		= de620_close;
@@ -884,8 +892,6 @@
 	
 	/* base_addr and irq are already set, see above! */
 
-	ether_setup(dev);
-
 	/* dump eeprom */
 	if (de620_debug) {
 		printk("\nEEPROM contents:\n");
@@ -899,7 +905,17 @@
 		printk("SCR = 0x%02x\n", nic_data.SCR);
 	}
 
-	return 0;
+	err = register_netdev(dev);
+	if (err)
+		goto out2;
+	return dev;
+
+out2:
+	release_region(dev->base_addr, 3);
+out1:
+	free_netdev(dev);
+out:
+	return ERR_PTR(err);
 }
 \f
 /**********************************
@@ -994,20 +1010,21 @@
  *
  */
 #ifdef MODULE
-static struct net_device de620_dev;
+static struct net_device *de620_dev;
 
 int init_module(void)
 {
-	de620_dev.init = de620_probe;
-	if (register_netdev(&de620_dev) != 0)
-		return -EIO;
+	de620_dev = de620_probe(-1);
+	if (IS_ERR(de620_dev))
+		return PTR_ERR(de620_dev);
 	return 0;
 }
 
 void cleanup_module(void)
 {
-	unregister_netdev(&de620_dev);
-	release_region(de620_dev.base_addr, 3);
+	unregister_netdev(de620_dev);
+	release_region(de620_dev->base_addr, 3);
+	free_netdev(de620_dev);
 }
 #endif /* MODULE */
 MODULE_LICENSE("GPL");

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

end of thread, other threads:[~2003-09-24 17:03 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-09-23 21:47 [PATCH] (0/7) device_probe enhancement Stephen Hemminger
2003-09-23 23:39 ` David S. Miller
2003-09-24  0:25   ` Jeff Garzik
2003-09-24  0:40 ` Jeff Garzik
2003-09-24 17:03   ` [PATCH] (1/7) de620 -- dynamic allocation (resend) Stephen Hemminger

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