#ifndef PXE_H #define PXE_H #include "pxe_types.h" #include "pxe_api.h" #include /* Parameter block for pxenv_unknown() */ struct s_PXENV_UNKNOWN { PXENV_STATUS_t Status; /**< PXE status code */ } PACKED; typedef struct s_PXENV_UNKNOWN PXENV_UNKNOWN_t; /* Union used for PXE API calls; we don't know the type of the * structure until we interpret the opcode. Also, Status is available * in the same location for any opcode, and it's convenient to have * non-specific access to it. */ union u_PXENV_ANY { /* Make it easy to read status for any operation */ PXENV_STATUS_t Status; struct s_PXENV_UNKNOWN unknown; struct s_PXENV_UNLOAD_STACK unload_stack; struct s_PXENV_GET_CACHED_INFO get_cached_info; struct s_PXENV_TFTP_READ_FILE restart_tftp; struct s_PXENV_START_UNDI start_undi; struct s_PXENV_STOP_UNDI stop_undi; struct s_PXENV_START_BASE start_base; struct s_PXENV_STOP_BASE stop_base; struct s_PXENV_TFTP_OPEN tftp_open; struct s_PXENV_TFTP_CLOSE tftp_close; struct s_PXENV_TFTP_READ tftp_read; struct s_PXENV_TFTP_READ_FILE tftp_read_file; struct s_PXENV_TFTP_GET_FSIZE tftp_get_fsize; struct s_PXENV_UDP_OPEN udp_open; struct s_PXENV_UDP_CLOSE udp_close; struct s_PXENV_UDP_WRITE udp_write; struct s_PXENV_UDP_READ udp_read; struct s_PXENV_UNDI_STARTUP undi_startup; struct s_PXENV_UNDI_CLEANUP undi_cleanup; struct s_PXENV_UNDI_INITIALIZE undi_initialize; struct s_PXENV_UNDI_RESET undi_reset_adapter; struct s_PXENV_UNDI_SHUTDOWN undi_shutdown; struct s_PXENV_UNDI_OPEN undi_open; struct s_PXENV_UNDI_CLOSE undi_close; struct s_PXENV_UNDI_TRANSMIT undi_transmit; struct s_PXENV_UNDI_SET_MCAST_ADDRESS undi_set_mcast_address; struct s_PXENV_UNDI_SET_STATION_ADDRESS undi_set_station_address; struct s_PXENV_UNDI_SET_PACKET_FILTER undi_set_packet_filter; struct s_PXENV_UNDI_GET_INFORMATION undi_get_information; struct s_PXENV_UNDI_GET_STATISTICS undi_get_statistics; struct s_PXENV_UNDI_CLEAR_STATISTICS undi_clear_statistics; struct s_PXENV_UNDI_INITIATE_DIAGS undi_initiate_diags; struct s_PXENV_UNDI_FORCE_INTERRUPT undi_force_interrupt; struct s_PXENV_UNDI_GET_MCAST_ADDRESS undi_get_mcast_address; struct s_PXENV_UNDI_GET_NIC_TYPE undi_get_nic_type; struct s_PXENV_UNDI_GET_IFACE_INFO undi_get_iface_info; struct s_PXENV_UNDI_GET_STATE undi_get_state; struct s_PXENV_UNDI_ISR undi_isr; }; typedef union u_PXENV_ANY PXENV_ANY_t; /** A PXE device */ struct pxe_device { /** Generic device */ struct device dev; /** Driver-private data * * Use pxe_set_drvdata() and pxe_get_drvdata() to access this * field. */ void *priv; /** PXENV+ structure address */ SEGOFF16_t pxenv; /** !PXE structure address */ SEGOFF16_t ppxe; /** Entry point */ SEGOFF16_t entry; /** MAC address */ MAC_ADDR_t hwaddr; /** Assigned IRQ number */ UINT16_t irq; /** ROM address */ SEGSEL_t rom; }; /** * Set PXE driver-private data * * @v pxe PXE device * @v priv Private data */ static inline void pxe_set_drvdata ( struct pxe_device *pxe, void *priv ) { pxe->priv = priv; } /** * Get PXE driver-private data * * @v pxe PXE device * @ret priv Private data */ static inline void * pxe_get_drvdata ( struct pxe_device *pxe ) { return pxe->priv; } extern int pxe_call ( struct pxe_device *pxe, unsigned int function, void *params, size_t params_len ); extern int undi_probe ( struct pxe_device *pxe ); extern void undi_remove ( struct pxe_device *pxe ); extern struct net_device *pxe_netdev; #endif /* PXE_H */