Added a generalised ISA device-probing mechanism.
[people/lynusvaz/gpxe.git] / src / include / isa.h
index fe5c557..7ac97ea 100644 (file)
@@ -2,27 +2,78 @@
 #define ISA_H
 
 #include "isa_ids.h"
+#include "dev.h"
 
-struct dev;
+/*
+ * A physical ISA device
+ *
+ */
+struct isa_device {
+       char *magic; /* must be first */
+       unsigned int probe_idx;
+       uint16_t ioaddr;
+       int already_tried;
+};
+
+/*
+ * An individual ISA device, identified by probe address
+ *
+ */
+struct isa_probe_addr {
+       uint16_t addr;
+} __attribute__ (( packed ));
 
-struct isa_driver
-{
-       int type;
+/*
+ * An ISA driver, with a probe address list and a probe_addr method.
+ * probe_addr() should return 1 if a card is physically present,
+ * leaving the other operations (read MAC address etc.) down to the
+ * main probe() routine.
+ *
+ */
+struct isa_driver {
        const char *name;
-       int (*probe)(struct dev *, unsigned short *);
-       unsigned short *ioaddrs;
+       struct isa_probe_addr *probe_addrs;
+       unsigned int addr_count;
+       int ( * probe_addr ) ( uint16_t addr );
+       uint16_t mfg_id;
+       uint16_t prod_id;
 };
 
-#ifndef __HYPERSTONE__
-#define __isa_driver   __attribute__ ((used,__section__(".drivers.isa")))
-#else 
-#define __isa_driver   __attribute__ ((used,__section__(".drivisa")))
-#endif
+/*
+ * Define an ISA driver
+ *
+ */
+#define ISA_DRIVER( _name, _probe_addrs, _probe_addr, _mfg_id, _prod_id ) { \
+       .name = _name,                                                      \
+       .probe_addrs = _probe_addrs,                                        \
+       .addr_count = sizeof ( _probe_addrs ) / sizeof ( probe_addrs[0] ),  \
+       .probe_addr = _probe_addr,                                          \
+       .mfg_id = _mfg_id,                                                  \
+       .prod_id = _prod_id,                                                \
+}
+
+/*
+ * ISA_ROM is parsed by parserom.pl to generate Makefile rules and
+ * files for rom-o-matic.
+ *
+ */
+#define ISA_ROM( IMAGE, DESCRIPTION )
 
-extern const struct isa_driver isa_drivers[];
-extern const struct isa_driver isa_drivers_end[];
+/*
+ * Functions in isa.c
+ *
+ */
+extern int find_isa_device ( struct isa_device *eisa,
+                            struct isa_driver *driver );
+extern int find_isa_boot_device ( struct dev *dev,
+                                 struct isa_driver *driver );
 
-#define ISA_ROM(IMAGE, DESCRIPTION)
+/*
+ * config.c defines isa_extra_probe_addrs and isa_extra_probe_addr_count.
+ *
+ */
+extern struct isa_probe_addr isa_extra_probe_addrs[];
+extern unsigned int isa_extra_probe_addr_count;
 
 #endif /* ISA_H */