Commit 37b91f25 authored by Stephen Hemminger's avatar Stephen Hemminger

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

New infrastructure to allow probing older builtin drivers (like ISA)
Originally by Al Viro, updated to apply agains jgarzik/net-drivers-2.5-exp
parent b9db942b
......@@ -110,6 +110,11 @@ struct devprobe
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 @@ static int __init probe_list(struct net_device *dev, struct devprobe *plist)
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 @@ static int __init ethif_probe(int unit)
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 @@ static int __init net_olddevs_init(void)
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);
......
......@@ -496,6 +496,7 @@ extern rwlock_t dev_base_lock; /* Device list lock */
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 struct net_device *__dev_getfirstbyhwtype(unsigned short type);
extern struct net_device *dev_getfirstbyhwtype(unsigned short type);
......
......@@ -371,6 +371,30 @@ int netdev_boot_setup_check(struct net_device *dev)
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.
*/
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment