#ifndef _UNDI_H #define _UNDI_H /** @file * * UNDI driver * */ #include #include /** An UNDI device * * This structure is used by assembly code as well as C; do not alter * this structure without editing pxeprefix.S to match. */ struct undi_device { /** PXENV+ structure address */ SEGOFF16_t pxenv; /** !PXE structure address */ SEGOFF16_t ppxe; /** Entry point */ SEGOFF16_t entry; /** Free base memory after load */ UINT16_t fbms; /** Free base memory prior to load */ UINT16_t restore_fbms; /** PCI bus:dev.fn, or @c UNDI_NO_PCI_BUSDEVFN */ UINT16_t pci_busdevfn; /** ISAPnP card select number, or @c UNDI_NO_ISAPNP_CSN */ UINT16_t isapnp_csn; /** ISAPnP read port, or @c UNDI_NO_ISAPNP_READ_PORT */ UINT16_t isapnp_read_port; /** PCI vendor ID * * Filled in only for the preloaded UNDI device by pxeprefix.S */ UINT16_t pci_vendor; /** PCI device ID * * Filled in only for the preloaded UNDI device by pxeprefix.S */ UINT16_t pci_device; /** Padding */ UINT16_t pad; /** Generic device */ struct device dev; /** Driver-private data * * Use undi_set_drvdata() and undi_get_drvdata() to access this * field. */ void *priv; } __attribute__ (( packed )); /** PCI bus:dev.fn field is invalid */ #define UNDI_NO_PCI_BUSDEVFN 0xffff /** ISAPnP card select number field is invalid */ #define UNDI_NO_ISAPNP_CSN 0xffff /** ISAPnP read port field is invalid */ #define UNDI_NO_ISAPNP_READ_PORT 0xffff /** * Set UNDI driver-private data * * @v undi UNDI device * @v priv Private data */ static inline void undi_set_drvdata ( struct undi_device *undi, void *priv ) { undi->priv = priv; } /** * Get UNDI driver-private data * * @v undi UNDI device * @ret priv Private data */ static inline void * undi_get_drvdata ( struct undi_device *undi ) { return undi->priv; } #endif /* _UNDI_H */