From 75d864432cc41c45d46df9ea7d3afd7cccbc0148 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Thu, 14 Apr 2005 10:10:54 +0000 Subject: Use the magic of common symbols to allow struct dev to effectively grow at link time to accommodate whatever bus objects are included. --- src/include/dev.h | 27 ++++++++++++++------------- src/include/eisa.h | 1 + src/include/mca.h | 1 + src/include/pci.h | 2 +- 4 files changed, 17 insertions(+), 14 deletions(-) (limited to 'src/include') diff --git a/src/include/dev.h b/src/include/dev.h index a9e2916b1..b5a2edda5 100644 --- a/src/include/dev.h +++ b/src/include/dev.h @@ -3,11 +3,6 @@ #include "stdint.h" -/* Bus types */ -#include "pci.h" -#include "eisa.h" -#include "mca.h" - /* Device types */ #include "nic.h" @@ -18,8 +13,7 @@ struct dev_id { uint8_t bus_type; #define PCI_BUS_TYPE 1 #define ISA_BUS_TYPE 2 -#define EISA_BUS_TYPE 3 -#define MCA_BUS_TYPE 4 +#define MCA_BUS_TYPE 3 } __attribute__ ((packed)); /* Dont use sizeof, that will include the padding */ @@ -29,18 +23,25 @@ struct dev { struct dev_operations *dev_op; const char *name; struct dev_id devid; /* device ID string (sent to DHCP server) */ - /* All possible bus types */ - union { - struct pci_device pci; - struct eisa_device eisa; - struct mca_device mca; - }; + /* Pointer to bus information for device. Whatever sets up + * the struct dev must make sure that this points to a buffer + * large enough for the required struct _device. + */ + void *bus; /* All possible device types */ union { struct nic nic; }; }; +/* + * Macro to help create a common symbol with enough space for any + * struct _device. + * + * Use as e.g. DEV_BUS(struct pci_device); + */ +#define DEV_BUS(datatype,symbol) datatype symbol __asm__ ( "_dev_bus" ); + struct dev_operations { void ( *disable ) ( struct dev * ); void ( *print_info ) ( struct dev * ); diff --git a/src/include/eisa.h b/src/include/eisa.h index 4fe14fc69..ed0ccef35 100644 --- a/src/include/eisa.h +++ b/src/include/eisa.h @@ -27,6 +27,7 @@ */ struct dev; struct eisa_device { + char *magic; /* must be first */ struct dev *dev; unsigned int slot; uint16_t ioaddr; diff --git a/src/include/mca.h b/src/include/mca.h index e69b65601..c12b1cabe 100644 --- a/src/include/mca.h +++ b/src/include/mca.h @@ -28,6 +28,7 @@ */ struct dev; struct mca_device { + char *magic; /* must be first */ struct dev *dev; unsigned int slot; unsigned char pos[8]; diff --git a/src/include/pci.h b/src/include/pci.h index 36edc0f58..988259a32 100644 --- a/src/include/pci.h +++ b/src/include/pci.h @@ -232,13 +232,13 @@ #define PCI_MSI_ADDRESS_HI 8 /* Upper 32 bits (if PCI_MSI_FLAGS_64BIT set) */ #define PCI_MSI_DATA_32 8 /* 16 bits of data for 32-bit devices */ #define PCI_MSI_DATA_64 12 /* 16 bits of data for 64-bit devices */ - /* * A physical PCI device * */ struct dev; struct pci_device { + char * magic; /* must be first */ struct dev * dev; uint32_t membase; /* BAR 1 */ uint32_t ioaddr; /* first IO BAR */ -- cgit v1.2.3-55-g7522