1 #ifndef PXE_H 2 #define PXE_H 3 4 FILE_LICENCE ( GPL2_OR_LATER ); 5 6 #include "pxe_types.h" 7 #include "pxe_api.h" 8 #include <gpxe/device.h> 9 10 /* Parameter block for pxenv_unknown() */ 11 struct s_PXENV_UNKNOWN { 12 PXENV_STATUS_t Status; /**< PXE status code */ 13 } PACKED; 14 15 typedef struct s_PXENV_UNKNOWN PXENV_UNKNOWN_t; 16 17 /* Union used for PXE API calls; we don't know the type of the 18 * structure until we interpret the opcode. Also, Status is available 19 * in the same location for any opcode, and it's convenient to have 20 * non-specific access to it. 21 */ 22 union u_PXENV_ANY { 23 /* Make it easy to read status for any operation */ 24 PXENV_STATUS_t Status; 25 struct s_PXENV_UNKNOWN unknown; 26 struct s_PXENV_UNLOAD_STACK unload_stack; 27 struct s_PXENV_GET_CACHED_INFO get_cached_info; 28 struct s_PXENV_TFTP_READ_FILE restart_tftp; 29 struct s_PXENV_START_UNDI start_undi; 30 struct s_PXENV_STOP_UNDI stop_undi; 31 struct s_PXENV_START_BASE start_base; 32 struct s_PXENV_STOP_BASE stop_base; 33 struct s_PXENV_TFTP_OPEN tftp_open; 34 struct s_PXENV_TFTP_CLOSE tftp_close; 35 struct s_PXENV_TFTP_READ tftp_read; 36 struct s_PXENV_TFTP_READ_FILE tftp_read_file; 37 struct s_PXENV_TFTP_GET_FSIZE tftp_get_fsize; 38 struct s_PXENV_UDP_OPEN udp_open; 39 struct s_PXENV_UDP_CLOSE udp_close; 40 struct s_PXENV_UDP_WRITE udp_write; 41 struct s_PXENV_UDP_READ udp_read; 42 struct s_PXENV_UNDI_STARTUP undi_startup; 43 struct s_PXENV_UNDI_CLEANUP undi_cleanup; 44 struct s_PXENV_UNDI_INITIALIZE undi_initialize; 45 struct s_PXENV_UNDI_RESET undi_reset_adapter; 46 struct s_PXENV_UNDI_SHUTDOWN undi_shutdown; 47 struct s_PXENV_UNDI_OPEN undi_open; 48 struct s_PXENV_UNDI_CLOSE undi_close; 49 struct s_PXENV_UNDI_TRANSMIT undi_transmit; 50 struct s_PXENV_UNDI_SET_MCAST_ADDRESS undi_set_mcast_address; 51 struct s_PXENV_UNDI_SET_STATION_ADDRESS undi_set_station_address; 52 struct s_PXENV_UNDI_SET_PACKET_FILTER undi_set_packet_filter; 53 struct s_PXENV_UNDI_GET_INFORMATION undi_get_information; 54 struct s_PXENV_UNDI_GET_STATISTICS undi_get_statistics; 55 struct s_PXENV_UNDI_CLEAR_STATISTICS undi_clear_statistics; 56 struct s_PXENV_UNDI_INITIATE_DIAGS undi_initiate_diags; 57 struct s_PXENV_UNDI_FORCE_INTERRUPT undi_force_interrupt; 58 struct s_PXENV_UNDI_GET_MCAST_ADDRESS undi_get_mcast_address; 59 struct s_PXENV_UNDI_GET_NIC_TYPE undi_get_nic_type; 60 struct s_PXENV_UNDI_GET_IFACE_INFO undi_get_iface_info; 61 struct s_PXENV_UNDI_GET_STATE undi_get_state; 62 struct s_PXENV_UNDI_ISR undi_isr; 63 struct s_PXENV_FILE_OPEN file_open; 64 struct s_PXENV_FILE_CLOSE file_close; 65 struct s_PXENV_FILE_SELECT file_select; 66 struct s_PXENV_FILE_READ file_read; 67 struct s_PXENV_GET_FILE_SIZE get_file_size; 68 struct s_PXENV_FILE_EXEC file_exec; 69 struct s_PXENV_FILE_API_CHECK file_api_check; 70 struct s_PXENV_FILE_EXIT_HOOK file_exit_hook; 71 }; 72 73 typedef union u_PXENV_ANY PXENV_ANY_t; 74 75 /** An UNDI expansion ROM header */ 76 struct undi_rom_header { 77 /** Signature 78 * 79 * Must be equal to @c ROM_SIGNATURE 80 */ 81 UINT16_t Signature; 82 /** ROM length in 512-byte blocks */ 83 UINT8_t ROMLength; 84 /** Unused */ 85 UINT8_t unused[0x13]; 86 /** Offset of the PXE ROM ID structure */ 87 UINT16_t PXEROMID; 88 /** Offset of the PCI ROM structure */ 89 UINT16_t PCIRHeader; 90 } PACKED; 91 92 /** Signature for an expansion ROM */ 93 #define ROM_SIGNATURE 0xaa55 94 95 /** An UNDI ROM ID structure */ 96 struct undi_rom_id { 97 /** Signature 98 * 99 * Must be equal to @c UNDI_ROM_ID_SIGNATURE 100 */ 101 UINT32_t Signature; 102 /** Length of structure */ 103 UINT8_t StructLength; 104 /** Checksum */ 105 UINT8_t StructCksum; 106 /** Structure revision 107 * 108 * Must be zero. 109 */ 110 UINT8_t StructRev; 111 /** UNDI revision 112 * 113 * Version 2.1.0 is encoded as the byte sequence 0x00, 0x01, 0x02. 114 */ 115 UINT8_t UNDIRev[3]; 116 /** Offset to UNDI loader */ 117 UINT16_t UNDILoader; 118 /** Minimum required stack segment size */ 119 UINT16_t StackSize; 120 /** Minimum required data segment size */ 121 UINT16_t DataSize; 122 /** Minimum required code segment size */ 123 UINT16_t CodeSize; 124 } PACKED; 125 126 /** Signature for an UNDI ROM ID structure */ 127 #define UNDI_ROM_ID_SIGNATURE \ 128 ( ( 'U' << 0 ) + ( 'N' << 8 ) + ( 'D' << 16 ) + ( 'I' << 24 ) ) 129 130 /** A PCI expansion header */ 131 struct pcir_header { 132 /** Signature 133 * 134 * Must be equal to @c PCIR_SIGNATURE 135 */ 136 uint32_t signature; 137 /** PCI vendor ID */ 138 uint16_t vendor_id; 139 /** PCI device ID */ 140 uint16_t device_id; 141 } PACKED; 142 143 /** Signature for an UNDI ROM ID structure */ 144 #define PCIR_SIGNATURE \ 145 ( ( 'P' << 0 ) + ( 'C' << 8 ) + ( 'I' << 16 ) + ( 'R' << 24 ) ) 146 147 148 extern struct net_device *pxe_netdev; 149 150 extern void pxe_set_netdev ( struct net_device *netdev ); 151 152 extern void pxe_set_cached_filename ( const unsigned char *filename ); 153 154 #endif /* PXE_H */ 155