david/ipxe
david
/
ipxe
Archived
1
0
Fork 0
This repository has been archived on 2020-12-06. You can view files and clone it, but cannot push or open issues or pull requests.
ipxe/src/core/isa_probe.c

67 lines
1.6 KiB
C

#ifdef CONFIG_ISA
/*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2, or (at
* your option) any later version.
*/
#include "etherboot.h"
#include "nic.h"
#include "isa.h"
void isa_enumerate(void)
{
const struct isa_driver *driver;
for(driver = isa_drivers; driver < isa_drivers_end; driver++) {
printf("%s ", driver->name);
}
}
int isa_probe(struct dev *dev, const char *type_name)
{
/*
* NIC probing is in the order the drivers were linked togeter.
* If for some reason you want to change the order,
* just change the order you list the drivers in.
*/
struct isa_probe_state *state = &dev->state.isa;
printf("Probing isa %s...\n", type_name);
if (dev->how_probe == PROBE_FIRST) {
state->advance = 0;
state->driver = isa_drivers;
dev->index = -1;
}
for(;;)
{
if ((dev->how_probe != PROBE_AWAKE) && state->advance) {
state->driver++;
dev->index = -1;
}
state->advance = 1;
if (state->driver >= isa_drivers_end)
break;
if (state->driver->type != dev->type)
continue;
if (dev->how_probe != PROBE_AWAKE) {
dev->type_index++;
}
printf("[%s]", state->driver->name);
dev->devid.bus_type = ISA_BUS_TYPE;
/* FIXME how do I handle dev->index + PROBE_AGAIN?? */
/* driver will fill in vendor and device IDs */
if (state->driver->probe(dev, state->driver->ioaddrs)) {
state->advance = (dev->index == -1);
return PROBE_WORKED;
}
putchar('\n');
}
return PROBE_FAILED;
}
#endif