summaryrefslogtreecommitdiffstats
path: root/src/include/dev.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/include/dev.h')
-rw-r--r--src/include/dev.h146
1 files changed, 39 insertions, 107 deletions
diff --git a/src/include/dev.h b/src/include/dev.h
index bd352eb70..aa9ccac31 100644
--- a/src/include/dev.h
+++ b/src/include/dev.h
@@ -1,126 +1,58 @@
#ifndef DEV_H
#define DEV_H
-#include "isa.h"
-#include "pci.h"
+#include "stdint.h"
+#include "nic.h"
/* Need to check the packing of this struct if Etherboot is ported */
-struct dev_id
-{
- unsigned short vendor_id;
- unsigned short device_id;
- unsigned char bus_type;
+struct dev_id {
+ uint16_t vendor_id;
+ uint16_t device_id;
+ uint8_t bus_type;
#define PCI_BUS_TYPE 1
#define ISA_BUS_TYPE 2
-};
+} __attribute__ ((packed));
/* Dont use sizeof, that will include the padding */
#define DEV_ID_SIZE 8
-
-struct pci_probe_state
-{
-#ifdef CONFIG_PCI
- struct pci_device dev;
- int advance;
-#else
- int dummy;
-#endif
-};
-struct isa_probe_state
-{
-#ifdef CONFIG_ISA
- const struct isa_driver *driver;
- int advance;
-#else
- int dummy;
-#endif
+struct dev {
+ const char *name;
+ struct dev_id devid; /* device ID string (sent to DHCP server) */
+ struct dev_operations *dev_op;
+ /* All possible device types */
+ union {
+ struct nic nic;
+ };
};
-union probe_state
-{
- struct pci_probe_state pci;
- struct isa_probe_state isa;
+struct dev_operations {
+ void ( *disable ) ( struct dev * );
+ int ( *load_configuration ) ( struct dev * );
+ int ( *load ) ( struct dev * );
};
-struct dev
-{
- void (*disable)P((struct dev *));
- struct dev_id devid; /* device ID string (sent to DHCP server) */
- int index; /* Index of next device on this controller to probe */
- int type; /* Type of device I am probing for */
- int how_probe; /* First, next or awake */
- int to_probe; /* Flavor of device I am probing */
- int failsafe; /* Failsafe probe requested */
- int type_index; /* Index of this device (within type) */
-#define PROBE_NONE 0
-#define PROBE_PCI 1
-#define PROBE_ISA 2
- union probe_state state;
+struct boot_driver {
+ char *name;
+ int (*probe) ( struct dev * );
};
-
-#define NIC_DRIVER 0
-#define DISK_DRIVER 1
-#define FLOPPY_DRIVER 2
-
-#define BRIDGE_DRIVER 1000
-
-#define PROBE_FIRST (-1)
-#define PROBE_NEXT 0
-#define PROBE_AWAKE 1 /* After calling disable bring up the same device */
-
-/* The probe result codes are selected
- * to allow them to be fed back into the probe
- * routine and get a successful probe.
- */
-#define PROBE_FAILED PROBE_FIRST
-#define PROBE_WORKED PROBE_NEXT
-
-extern int probe(struct dev *dev);
-extern void disable(struct dev *dev);
-
-/* Boot option values
- * option & BOOT_TYPE_MASK should equal a driver for probing
- */
-
-#define BOOT_NIC 0x0 /* Boot from a nic */
-#define BOOT_DISK 0x1 /* Boot from disk */
-#define BOOT_FLOPPY 0x2 /* Boot from a floppy */
-
-#define BOOT_NOTHING 0x3 /* Last valid boot choice */
-
-/* Do magic failsafe boot processing */
-#define BOOT_FAILSAFE 0x8
-
-#define BOOT_BITS 4
-#define BOOT_MASK ((1 << (BOOT_BITS)) - 1)
-#define BOOT_TYPE_MASK ((1 << (BOOT_BITS - 1)) - 1)
-
-#define MAX_BOOT_ENTRIES 3
-
-#define BOOT_ALL_VALUE (1<<BOOT_FIRST|1<<BOOT_SECOND|1<<BOOT_THIRD)
-
-/* These could be customised for different languages perhaps */
-#if BOOT_ALL_VALUE&(1<<BOOT_DISK)
-#define BOOT_DISK_PROMPT "(D)isk "
-#else
-#define BOOT_DISK_PROMPT
-#endif
-
-#if BOOT_ALL_VALUE&(1<<BOOT_FLOPPY)
-#define BOOT_FLOPPY_PROMPT "(F)loppy "
-#else
-#define BOOT_FLOPPY_PROMPT
-#endif
-
-#define ASK_PROMPT \
- "Boot from (N)etwork " BOOT_DISK_PROMPT BOOT_FLOPPY_PROMPT "or (Q)uit? "
-
-#define ANS_NETWORK 'N'
-#define ANS_DISK 'D'
-#define ANS_FLOPPY 'F'
-#define ANS_QUIT 'Q'
-#define ANS_DEFAULT '\n'
+#define BOOT_DRIVER( driver_name, probe_func ) \
+ static struct boot_driver boot_driver \
+ __attribute__ ((used,__section__(".boot_drivers"))) = { \
+ .name = driver_name, \
+ .probe = probe_func, \
+ };
+
+/* Functions in dev.c */
+extern void print_drivers ( void );
+extern int probe ( struct dev *dev );
+extern void disable ( struct dev *dev );
+static inline int load_configuration ( struct dev *dev ) {
+ return dev->dev_op->load_configuration ( dev );
+}
+static inline int load ( struct dev *dev ) {
+ return dev->dev_op->load ( dev );
+}
#endif /* DEV_H */