netdev
[Top] [All Lists]

[PATCH] (1/12) Probe2 infrastructure for 2.6 experimental

To: jgarzik@xxxxxxxxx
Subject: [PATCH] (1/12) Probe2 infrastructure for 2.6 experimental
From: Stephen Hemminger <shemminger@xxxxxxxx>
Date: Tue, 14 Oct 2003 15:34:10 -0700
Cc: netdev@xxxxxxxxxxx
Sender: netdev-bounce@xxxxxxxxxxx
New infrastructure to allow probing older builtin drivers (like ISA)
Originally by Al Viro, updated to apply agains jgarzik/net-drivers-2.5-exp

diff -Nru a/drivers/net/Space.c b/drivers/net/Space.c
--- a/drivers/net/Space.c       Fri Oct 10 10:07:40 2003
+++ b/drivers/net/Space.c       Fri Oct 10 10:07:40 2003
@@ -110,6 +110,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 
@@ -135,6 +140,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
@@ -372,6 +392,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 */
@@ -440,7 +470,8 @@
                trif_probe(num);
 #endif
        for (num = 0; num < 8; ++num)
-               ethif_probe(num);
+               if (!ethif_probe(num))
+                       ethif_probe2(num);
 
 #ifdef CONFIG_COPS
        cops_probe(0);
diff -Nru a/include/linux/netdevice.h b/include/linux/netdevice.h
--- a/include/linux/netdevice.h Fri Oct 10 10:07:40 2003
+++ b/include/linux/netdevice.h Fri Oct 10 10:07:40 2003
@@ -496,6 +496,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    Fri Oct 10 10:07:40 2003
+++ b/net/core/dev.c    Fri Oct 10 10:07:40 2003
@@ -371,6 +371,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.
  */

<Prev in Thread] Current Thread [Next in Thread>