Add second probe list used for devices which allocate their own network device. Restore earlier behaviour where we probe for up to eight network devices, even if some don't exist. This is for the case where boot parameters set values for second or third device. diff -Nru a/drivers/net/Space.c b/drivers/net/Space.c --- a/drivers/net/Space.c Mon Sep 29 10:38:06 2003 +++ b/drivers/net/Space.c Mon Sep 29 10:38:06 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 */ @@ -433,17 +463,17 @@ #ifdef CONFIG_SBNI for (num = 0; num < 8; ++num) - if (sbni_probe(num)) - break; + sbni_probe(num); #endif #ifdef CONFIG_TR for (num = 0; num < 8; ++num) - if (trif_probe(num)) - break; + trif_probe(num); #endif - for (num = 0; num < 8; ++num) - if (ethif_probe(num)) - break; + for (num = 0; num < 8; ++num) { + if (!ethif_probe(num)) + 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 Mon Sep 29 10:38:06 2003 +++ b/include/linux/netdevice.h Mon Sep 29 10:38:06 2003 @@ -499,6 +499,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 Mon Sep 29 10:38:06 2003 +++ b/net/core/dev.c Mon Sep 29 10:38:06 2003 @@ -372,6 +372,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. */