New device probing mechanism
[people/xl0/gpxe.git] / src / core / dev.c
1 #include "etherboot.h"
2 #include "stddef.h"
3 #include "dev.h"
4
5 /* Defined by linker */
6 extern struct boot_driver boot_drivers[];
7 extern struct boot_driver boot_drivers_end[];
8
9 /* Current attempted boot driver */
10 static struct boot_driver *boot_driver = boot_drivers;
11
12 /* Current boot device */
13 struct dev dev;
14
15 /* Print all drivers */
16 void print_drivers ( void ) {
17         struct boot_driver *driver;
18
19         for ( driver = boot_drivers ; driver < boot_drivers_end ; driver++ ) {
20                 printf ( "%s ", driver->name );
21         }
22 }
23
24 /* Get the next available boot device */
25 int probe ( struct dev *dev ) {
26         
27         for ( ; boot_driver < boot_drivers_end ; boot_driver++ ) {
28                 dev->name = "unknown";
29                 if ( boot_driver->probe ( dev ) )
30                         return 1;
31         }
32         
33         /* No more boot devices found */
34         boot_driver = boot_drivers;
35         return 0;
36 }
37
38 /* Disable a device */
39 void disable ( struct dev *dev ) {
40         if ( dev->dev_op ) {
41                 dev->dev_op->disable ( dev );
42                 dev->dev_op = NULL;
43         }
44 }