10d1ba665SWarner Losh /** @file 20d1ba665SWarner Losh This header file contains all of the PXE type definitions, 30d1ba665SWarner Losh structure prototypes, global variables and constants that 40d1ba665SWarner Losh are needed for porting PXE to EFI. 50d1ba665SWarner Losh 63245fa21SMitchell Horne Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> 73245fa21SMitchell Horne SPDX-License-Identifier: BSD-2-Clause-Patent 80d1ba665SWarner Losh 90d1ba665SWarner Losh @par Revision Reference: 100d1ba665SWarner Losh 32/64-bit PXE specification: 110d1ba665SWarner Losh alpha-4, 99-Dec-17. 120d1ba665SWarner Losh 130d1ba665SWarner Losh **/ 140d1ba665SWarner Losh 150d1ba665SWarner Losh #ifndef __EFI_PXE_H__ 160d1ba665SWarner Losh #define __EFI_PXE_H__ 170d1ba665SWarner Losh 180d1ba665SWarner Losh #pragma pack(1) 190d1ba665SWarner Losh 200d1ba665SWarner Losh #define PXE_BUSTYPE(a, b, c, d) \ 210d1ba665SWarner Losh ( \ 220d1ba665SWarner Losh (((PXE_UINT32) (d) & 0xFF) << 24) | (((PXE_UINT32) (c) & 0xFF) << 16) | (((PXE_UINT32) (b) & 0xFF) << 8) | \ 230d1ba665SWarner Losh ((PXE_UINT32) (a) & 0xFF) \ 240d1ba665SWarner Losh ) 250d1ba665SWarner Losh 260d1ba665SWarner Losh /// 270d1ba665SWarner Losh /// UNDI ROM ID and devive ID signature. 280d1ba665SWarner Losh /// 290d1ba665SWarner Losh #define PXE_BUSTYPE_PXE PXE_BUSTYPE ('!', 'P', 'X', 'E') 300d1ba665SWarner Losh 310d1ba665SWarner Losh /// 320d1ba665SWarner Losh /// BUS ROM ID signatures. 330d1ba665SWarner Losh /// 340d1ba665SWarner Losh #define PXE_BUSTYPE_PCI PXE_BUSTYPE ('P', 'C', 'I', 'R') 350d1ba665SWarner Losh #define PXE_BUSTYPE_PC_CARD PXE_BUSTYPE ('P', 'C', 'C', 'R') 360d1ba665SWarner Losh #define PXE_BUSTYPE_USB PXE_BUSTYPE ('U', 'S', 'B', 'R') 370d1ba665SWarner Losh #define PXE_BUSTYPE_1394 PXE_BUSTYPE ('1', '3', '9', '4') 380d1ba665SWarner Losh 390d1ba665SWarner Losh #define PXE_SWAP_UINT16(n) ((((PXE_UINT16) (n) & 0x00FF) << 8) | (((PXE_UINT16) (n) & 0xFF00) >> 8)) 400d1ba665SWarner Losh 410d1ba665SWarner Losh #define PXE_SWAP_UINT32(n) \ 420d1ba665SWarner Losh ((((PXE_UINT32)(n) & 0x000000FF) << 24) | \ 430d1ba665SWarner Losh (((PXE_UINT32)(n) & 0x0000FF00) << 8) | \ 440d1ba665SWarner Losh (((PXE_UINT32)(n) & 0x00FF0000) >> 8) | \ 450d1ba665SWarner Losh (((PXE_UINT32)(n) & 0xFF000000) >> 24)) 460d1ba665SWarner Losh 470d1ba665SWarner Losh #define PXE_SWAP_UINT64(n) \ 480d1ba665SWarner Losh ((((PXE_UINT64)(n) & 0x00000000000000FFULL) << 56) | \ 490d1ba665SWarner Losh (((PXE_UINT64)(n) & 0x000000000000FF00ULL) << 40) | \ 500d1ba665SWarner Losh (((PXE_UINT64)(n) & 0x0000000000FF0000ULL) << 24) | \ 510d1ba665SWarner Losh (((PXE_UINT64)(n) & 0x00000000FF000000ULL) << 8) | \ 520d1ba665SWarner Losh (((PXE_UINT64)(n) & 0x000000FF00000000ULL) >> 8) | \ 530d1ba665SWarner Losh (((PXE_UINT64)(n) & 0x0000FF0000000000ULL) >> 24) | \ 540d1ba665SWarner Losh (((PXE_UINT64)(n) & 0x00FF000000000000ULL) >> 40) | \ 550d1ba665SWarner Losh (((PXE_UINT64)(n) & 0xFF00000000000000ULL) >> 56)) 560d1ba665SWarner Losh 570d1ba665SWarner Losh #define PXE_CPBSIZE_NOT_USED 0 ///< zero 580d1ba665SWarner Losh #define PXE_DBSIZE_NOT_USED 0 ///< zero 590d1ba665SWarner Losh #define PXE_CPBADDR_NOT_USED (PXE_UINT64) 0 ///< zero 600d1ba665SWarner Losh #define PXE_DBADDR_NOT_USED (PXE_UINT64) 0 ///< zero 610d1ba665SWarner Losh #define PXE_CONST CONST 620d1ba665SWarner Losh 630d1ba665SWarner Losh #define PXE_VOLATILE volatile 640d1ba665SWarner Losh 650d1ba665SWarner Losh typedef VOID PXE_VOID; 660d1ba665SWarner Losh typedef UINT8 PXE_UINT8; 670d1ba665SWarner Losh typedef UINT16 PXE_UINT16; 680d1ba665SWarner Losh typedef UINT32 PXE_UINT32; 690d1ba665SWarner Losh typedef UINTN PXE_UINTN; 700d1ba665SWarner Losh 710d1ba665SWarner Losh /// 720d1ba665SWarner Losh /// Typedef unsigned long PXE_UINT64. 730d1ba665SWarner Losh /// 740d1ba665SWarner Losh typedef UINT64 PXE_UINT64; 750d1ba665SWarner Losh 760d1ba665SWarner Losh typedef PXE_UINT8 PXE_BOOL; 770d1ba665SWarner Losh #define PXE_FALSE 0 ///< zero 780d1ba665SWarner Losh #define PXE_TRUE (!PXE_FALSE) 790d1ba665SWarner Losh 800d1ba665SWarner Losh typedef PXE_UINT16 PXE_OPCODE; 810d1ba665SWarner Losh 820d1ba665SWarner Losh /// 830d1ba665SWarner Losh /// Return UNDI operational state. 840d1ba665SWarner Losh /// 850d1ba665SWarner Losh #define PXE_OPCODE_GET_STATE 0x0000 860d1ba665SWarner Losh 870d1ba665SWarner Losh /// 880d1ba665SWarner Losh /// Change UNDI operational state from Stopped to Started. 890d1ba665SWarner Losh /// 900d1ba665SWarner Losh #define PXE_OPCODE_START 0x0001 910d1ba665SWarner Losh 920d1ba665SWarner Losh /// 930d1ba665SWarner Losh /// Change UNDI operational state from Started to Stopped. 940d1ba665SWarner Losh /// 950d1ba665SWarner Losh #define PXE_OPCODE_STOP 0x0002 960d1ba665SWarner Losh 970d1ba665SWarner Losh /// 980d1ba665SWarner Losh /// Get UNDI initialization information. 990d1ba665SWarner Losh /// 1000d1ba665SWarner Losh #define PXE_OPCODE_GET_INIT_INFO 0x0003 1010d1ba665SWarner Losh 1020d1ba665SWarner Losh /// 1030d1ba665SWarner Losh /// Get NIC configuration information. 1040d1ba665SWarner Losh /// 1050d1ba665SWarner Losh #define PXE_OPCODE_GET_CONFIG_INFO 0x0004 1060d1ba665SWarner Losh 1070d1ba665SWarner Losh /// 1080d1ba665SWarner Losh /// Changed UNDI operational state from Started to Initialized. 1090d1ba665SWarner Losh /// 1100d1ba665SWarner Losh #define PXE_OPCODE_INITIALIZE 0x0005 1110d1ba665SWarner Losh 1120d1ba665SWarner Losh /// 1130d1ba665SWarner Losh /// Re-initialize the NIC H/W. 1140d1ba665SWarner Losh /// 1150d1ba665SWarner Losh #define PXE_OPCODE_RESET 0x0006 1160d1ba665SWarner Losh 1170d1ba665SWarner Losh /// 1180d1ba665SWarner Losh /// Change the UNDI operational state from Initialized to Started. 1190d1ba665SWarner Losh /// 1200d1ba665SWarner Losh #define PXE_OPCODE_SHUTDOWN 0x0007 1210d1ba665SWarner Losh 1220d1ba665SWarner Losh /// 1230d1ba665SWarner Losh /// Read & change state of external interrupt enables. 1240d1ba665SWarner Losh /// 1250d1ba665SWarner Losh #define PXE_OPCODE_INTERRUPT_ENABLES 0x0008 1260d1ba665SWarner Losh 1270d1ba665SWarner Losh /// 1280d1ba665SWarner Losh /// Read & change state of packet receive filters. 1290d1ba665SWarner Losh /// 1300d1ba665SWarner Losh #define PXE_OPCODE_RECEIVE_FILTERS 0x0009 1310d1ba665SWarner Losh 1320d1ba665SWarner Losh /// 1330d1ba665SWarner Losh /// Read & change station MAC address. 1340d1ba665SWarner Losh /// 1350d1ba665SWarner Losh #define PXE_OPCODE_STATION_ADDRESS 0x000A 1360d1ba665SWarner Losh 1370d1ba665SWarner Losh /// 1380d1ba665SWarner Losh /// Read traffic statistics. 1390d1ba665SWarner Losh /// 1400d1ba665SWarner Losh #define PXE_OPCODE_STATISTICS 0x000B 1410d1ba665SWarner Losh 1420d1ba665SWarner Losh /// 1430d1ba665SWarner Losh /// Convert multicast IP address to multicast MAC address. 1440d1ba665SWarner Losh /// 1450d1ba665SWarner Losh #define PXE_OPCODE_MCAST_IP_TO_MAC 0x000C 1460d1ba665SWarner Losh 1470d1ba665SWarner Losh /// 1480d1ba665SWarner Losh /// Read or change non-volatile storage on the NIC. 1490d1ba665SWarner Losh /// 1500d1ba665SWarner Losh #define PXE_OPCODE_NVDATA 0x000D 1510d1ba665SWarner Losh 1520d1ba665SWarner Losh /// 1530d1ba665SWarner Losh /// Get & clear interrupt status. 1540d1ba665SWarner Losh /// 1550d1ba665SWarner Losh #define PXE_OPCODE_GET_STATUS 0x000E 1560d1ba665SWarner Losh 1570d1ba665SWarner Losh /// 1580d1ba665SWarner Losh /// Fill media header in packet for transmit. 1590d1ba665SWarner Losh /// 1600d1ba665SWarner Losh #define PXE_OPCODE_FILL_HEADER 0x000F 1610d1ba665SWarner Losh 1620d1ba665SWarner Losh /// 1630d1ba665SWarner Losh /// Transmit packet(s). 1640d1ba665SWarner Losh /// 1650d1ba665SWarner Losh #define PXE_OPCODE_TRANSMIT 0x0010 1660d1ba665SWarner Losh 1670d1ba665SWarner Losh /// 1680d1ba665SWarner Losh /// Receive packet. 1690d1ba665SWarner Losh /// 1700d1ba665SWarner Losh #define PXE_OPCODE_RECEIVE 0x0011 1710d1ba665SWarner Losh 1720d1ba665SWarner Losh /// 1730d1ba665SWarner Losh /// Last valid PXE UNDI OpCode number. 1740d1ba665SWarner Losh /// 1750d1ba665SWarner Losh #define PXE_OPCODE_LAST_VALID 0x0011 1760d1ba665SWarner Losh 1770d1ba665SWarner Losh typedef PXE_UINT16 PXE_OPFLAGS; 1780d1ba665SWarner Losh 1790d1ba665SWarner Losh #define PXE_OPFLAGS_NOT_USED 0x0000 1800d1ba665SWarner Losh 1810d1ba665SWarner Losh // 1820d1ba665SWarner Losh // ////////////////////////////////////// 1830d1ba665SWarner Losh // UNDI Get State 1840d1ba665SWarner Losh // 1850d1ba665SWarner Losh // No OpFlags 1860d1ba665SWarner Losh 1870d1ba665SWarner Losh //////////////////////////////////////// 1880d1ba665SWarner Losh // UNDI Start 1890d1ba665SWarner Losh // 1900d1ba665SWarner Losh // No OpFlags 1910d1ba665SWarner Losh 1920d1ba665SWarner Losh //////////////////////////////////////// 1930d1ba665SWarner Losh // UNDI Stop 1940d1ba665SWarner Losh // 1950d1ba665SWarner Losh // No OpFlags 1960d1ba665SWarner Losh 1970d1ba665SWarner Losh //////////////////////////////////////// 1980d1ba665SWarner Losh // UNDI Get Init Info 1990d1ba665SWarner Losh // 2000d1ba665SWarner Losh // No Opflags 2010d1ba665SWarner Losh 2020d1ba665SWarner Losh //////////////////////////////////////// 2030d1ba665SWarner Losh // UNDI Get Config Info 2040d1ba665SWarner Losh // 2050d1ba665SWarner Losh // No Opflags 2060d1ba665SWarner Losh 2070d1ba665SWarner Losh /// 2080d1ba665SWarner Losh /// UNDI Initialize 2090d1ba665SWarner Losh /// 2100d1ba665SWarner Losh #define PXE_OPFLAGS_INITIALIZE_CABLE_DETECT_MASK 0x0001 2110d1ba665SWarner Losh #define PXE_OPFLAGS_INITIALIZE_DETECT_CABLE 0x0000 2120d1ba665SWarner Losh #define PXE_OPFLAGS_INITIALIZE_DO_NOT_DETECT_CABLE 0x0001 2130d1ba665SWarner Losh 2140d1ba665SWarner Losh /// 2150d1ba665SWarner Losh /// 2160d1ba665SWarner Losh /// UNDI Reset 2170d1ba665SWarner Losh /// 2180d1ba665SWarner Losh #define PXE_OPFLAGS_RESET_DISABLE_INTERRUPTS 0x0001 2190d1ba665SWarner Losh #define PXE_OPFLAGS_RESET_DISABLE_FILTERS 0x0002 2200d1ba665SWarner Losh 2210d1ba665SWarner Losh /// 2220d1ba665SWarner Losh /// UNDI Shutdown. 2230d1ba665SWarner Losh /// 2240d1ba665SWarner Losh /// No OpFlags. 2250d1ba665SWarner Losh 2260d1ba665SWarner Losh /// 2270d1ba665SWarner Losh /// UNDI Interrupt Enables. 2280d1ba665SWarner Losh /// 2290d1ba665SWarner Losh /// 2300d1ba665SWarner Losh /// Select whether to enable or disable external interrupt signals. 2310d1ba665SWarner Losh /// Setting both enable and disable will return PXE_STATCODE_INVALID_OPFLAGS. 2320d1ba665SWarner Losh /// 2330d1ba665SWarner Losh #define PXE_OPFLAGS_INTERRUPT_OPMASK 0xC000 2340d1ba665SWarner Losh #define PXE_OPFLAGS_INTERRUPT_ENABLE 0x8000 2350d1ba665SWarner Losh #define PXE_OPFLAGS_INTERRUPT_DISABLE 0x4000 2360d1ba665SWarner Losh #define PXE_OPFLAGS_INTERRUPT_READ 0x0000 2370d1ba665SWarner Losh 2380d1ba665SWarner Losh /// 2390d1ba665SWarner Losh /// Enable receive interrupts. An external interrupt will be generated 2400d1ba665SWarner Losh /// after a complete non-error packet has been received. 2410d1ba665SWarner Losh /// 2420d1ba665SWarner Losh #define PXE_OPFLAGS_INTERRUPT_RECEIVE 0x0001 2430d1ba665SWarner Losh 2440d1ba665SWarner Losh /// 2450d1ba665SWarner Losh /// Enable transmit interrupts. An external interrupt will be generated 2460d1ba665SWarner Losh /// after a complete non-error packet has been transmitted. 2470d1ba665SWarner Losh /// 2480d1ba665SWarner Losh #define PXE_OPFLAGS_INTERRUPT_TRANSMIT 0x0002 2490d1ba665SWarner Losh 2500d1ba665SWarner Losh /// 2510d1ba665SWarner Losh /// Enable command interrupts. An external interrupt will be generated 2520d1ba665SWarner Losh /// when command execution stops. 2530d1ba665SWarner Losh /// 2540d1ba665SWarner Losh #define PXE_OPFLAGS_INTERRUPT_COMMAND 0x0004 2550d1ba665SWarner Losh 2560d1ba665SWarner Losh /// 2570d1ba665SWarner Losh /// Generate software interrupt. Setting this bit generates an external 2580d1ba665SWarner Losh /// interrupt, if it is supported by the hardware. 2590d1ba665SWarner Losh /// 2600d1ba665SWarner Losh #define PXE_OPFLAGS_INTERRUPT_SOFTWARE 0x0008 2610d1ba665SWarner Losh 2620d1ba665SWarner Losh /// 2630d1ba665SWarner Losh /// UNDI Receive Filters. 2640d1ba665SWarner Losh /// 2650d1ba665SWarner Losh /// 2660d1ba665SWarner Losh /// Select whether to enable or disable receive filters. 2670d1ba665SWarner Losh /// Setting both enable and disable will return PXE_STATCODE_INVALID_OPCODE. 2680d1ba665SWarner Losh /// 2690d1ba665SWarner Losh #define PXE_OPFLAGS_RECEIVE_FILTER_OPMASK 0xC000 2700d1ba665SWarner Losh #define PXE_OPFLAGS_RECEIVE_FILTER_ENABLE 0x8000 2710d1ba665SWarner Losh #define PXE_OPFLAGS_RECEIVE_FILTER_DISABLE 0x4000 2720d1ba665SWarner Losh #define PXE_OPFLAGS_RECEIVE_FILTER_READ 0x0000 2730d1ba665SWarner Losh 2740d1ba665SWarner Losh /// 2750d1ba665SWarner Losh /// To reset the contents of the multicast MAC address filter list, 2760d1ba665SWarner Losh /// set this OpFlag: 2770d1ba665SWarner Losh /// 2780d1ba665SWarner Losh #define PXE_OPFLAGS_RECEIVE_FILTER_RESET_MCAST_LIST 0x2000 2790d1ba665SWarner Losh 2800d1ba665SWarner Losh /// 2810d1ba665SWarner Losh /// Enable unicast packet receiving. Packets sent to the current station 2820d1ba665SWarner Losh /// MAC address will be received. 2830d1ba665SWarner Losh /// 2840d1ba665SWarner Losh #define PXE_OPFLAGS_RECEIVE_FILTER_UNICAST 0x0001 2850d1ba665SWarner Losh 2860d1ba665SWarner Losh /// 2870d1ba665SWarner Losh /// Enable broadcast packet receiving. Packets sent to the broadcast 2880d1ba665SWarner Losh /// MAC address will be received. 2890d1ba665SWarner Losh /// 2900d1ba665SWarner Losh #define PXE_OPFLAGS_RECEIVE_FILTER_BROADCAST 0x0002 2910d1ba665SWarner Losh 2920d1ba665SWarner Losh /// 2930d1ba665SWarner Losh /// Enable filtered multicast packet receiving. Packets sent to any 2940d1ba665SWarner Losh /// of the multicast MAC addresses in the multicast MAC address filter 2950d1ba665SWarner Losh /// list will be received. If the filter list is empty, no multicast 2960d1ba665SWarner Losh /// 2970d1ba665SWarner Losh #define PXE_OPFLAGS_RECEIVE_FILTER_FILTERED_MULTICAST 0x0004 2980d1ba665SWarner Losh 2990d1ba665SWarner Losh /// 3000d1ba665SWarner Losh /// Enable promiscuous packet receiving. All packets will be received. 3010d1ba665SWarner Losh /// 3020d1ba665SWarner Losh #define PXE_OPFLAGS_RECEIVE_FILTER_PROMISCUOUS 0x0008 3030d1ba665SWarner Losh 3040d1ba665SWarner Losh /// 3050d1ba665SWarner Losh /// Enable promiscuous multicast packet receiving. All multicast 3060d1ba665SWarner Losh /// packets will be received. 3070d1ba665SWarner Losh /// 3080d1ba665SWarner Losh #define PXE_OPFLAGS_RECEIVE_FILTER_ALL_MULTICAST 0x0010 3090d1ba665SWarner Losh 3100d1ba665SWarner Losh /// 3110d1ba665SWarner Losh /// UNDI Station Address. 3120d1ba665SWarner Losh /// 3130d1ba665SWarner Losh #define PXE_OPFLAGS_STATION_ADDRESS_READ 0x0000 3140d1ba665SWarner Losh #define PXE_OPFLAGS_STATION_ADDRESS_WRITE 0x0000 3150d1ba665SWarner Losh #define PXE_OPFLAGS_STATION_ADDRESS_RESET 0x0001 3160d1ba665SWarner Losh 3170d1ba665SWarner Losh /// 3180d1ba665SWarner Losh /// UNDI Statistics. 3190d1ba665SWarner Losh /// 3200d1ba665SWarner Losh #define PXE_OPFLAGS_STATISTICS_READ 0x0000 3210d1ba665SWarner Losh #define PXE_OPFLAGS_STATISTICS_RESET 0x0001 3220d1ba665SWarner Losh 3230d1ba665SWarner Losh /// 3240d1ba665SWarner Losh /// UNDI MCast IP to MAC. 3250d1ba665SWarner Losh /// 3260d1ba665SWarner Losh /// 3270d1ba665SWarner Losh /// Identify the type of IP address in the CPB. 3280d1ba665SWarner Losh /// 3290d1ba665SWarner Losh #define PXE_OPFLAGS_MCAST_IP_TO_MAC_OPMASK 0x0003 3300d1ba665SWarner Losh #define PXE_OPFLAGS_MCAST_IPV4_TO_MAC 0x0000 3310d1ba665SWarner Losh #define PXE_OPFLAGS_MCAST_IPV6_TO_MAC 0x0001 3320d1ba665SWarner Losh 3330d1ba665SWarner Losh /// 3340d1ba665SWarner Losh /// UNDI NvData. 3350d1ba665SWarner Losh /// 3360d1ba665SWarner Losh /// 3370d1ba665SWarner Losh /// Select the type of non-volatile data operation. 3380d1ba665SWarner Losh /// 3390d1ba665SWarner Losh #define PXE_OPFLAGS_NVDATA_OPMASK 0x0001 3400d1ba665SWarner Losh #define PXE_OPFLAGS_NVDATA_READ 0x0000 3410d1ba665SWarner Losh #define PXE_OPFLAGS_NVDATA_WRITE 0x0001 3420d1ba665SWarner Losh 3430d1ba665SWarner Losh /// 3440d1ba665SWarner Losh /// UNDI Get Status. 3450d1ba665SWarner Losh /// 3460d1ba665SWarner Losh /// 3470d1ba665SWarner Losh /// Return current interrupt status. This will also clear any interrupts 3480d1ba665SWarner Losh /// that are currently set. This can be used in a polling routine. The 3490d1ba665SWarner Losh /// interrupt flags are still set and cleared even when the interrupts 3500d1ba665SWarner Losh /// are disabled. 3510d1ba665SWarner Losh /// 3520d1ba665SWarner Losh #define PXE_OPFLAGS_GET_INTERRUPT_STATUS 0x0001 3530d1ba665SWarner Losh 3540d1ba665SWarner Losh /// 3550d1ba665SWarner Losh /// Return list of transmitted buffers for recycling. Transmit buffers 3560d1ba665SWarner Losh /// must not be changed or unallocated until they have recycled. After 3570d1ba665SWarner Losh /// issuing a transmit command, wait for a transmit complete interrupt. 3580d1ba665SWarner Losh /// When a transmit complete interrupt is received, read the transmitted 3590d1ba665SWarner Losh /// buffers. Do not plan on getting one buffer per interrupt. Some 3600d1ba665SWarner Losh /// NICs and UNDIs may transmit multiple buffers per interrupt. 3610d1ba665SWarner Losh /// 3620d1ba665SWarner Losh #define PXE_OPFLAGS_GET_TRANSMITTED_BUFFERS 0x0002 3630d1ba665SWarner Losh 3640d1ba665SWarner Losh /// 3650d1ba665SWarner Losh /// Return current media status. 3660d1ba665SWarner Losh /// 3670d1ba665SWarner Losh #define PXE_OPFLAGS_GET_MEDIA_STATUS 0x0004 3680d1ba665SWarner Losh 3690d1ba665SWarner Losh /// 3700d1ba665SWarner Losh /// UNDI Fill Header. 3710d1ba665SWarner Losh /// 3720d1ba665SWarner Losh #define PXE_OPFLAGS_FILL_HEADER_OPMASK 0x0001 3730d1ba665SWarner Losh #define PXE_OPFLAGS_FILL_HEADER_FRAGMENTED 0x0001 3740d1ba665SWarner Losh #define PXE_OPFLAGS_FILL_HEADER_WHOLE 0x0000 3750d1ba665SWarner Losh 3760d1ba665SWarner Losh /// 3770d1ba665SWarner Losh /// UNDI Transmit. 3780d1ba665SWarner Losh /// 3790d1ba665SWarner Losh /// 3800d1ba665SWarner Losh /// S/W UNDI only. Return after the packet has been transmitted. A 3810d1ba665SWarner Losh /// transmit complete interrupt will still be generated and the transmit 3820d1ba665SWarner Losh /// buffer will have to be recycled. 3830d1ba665SWarner Losh /// 3840d1ba665SWarner Losh #define PXE_OPFLAGS_SWUNDI_TRANSMIT_OPMASK 0x0001 3850d1ba665SWarner Losh #define PXE_OPFLAGS_TRANSMIT_BLOCK 0x0001 3860d1ba665SWarner Losh #define PXE_OPFLAGS_TRANSMIT_DONT_BLOCK 0x0000 3870d1ba665SWarner Losh 3880d1ba665SWarner Losh #define PXE_OPFLAGS_TRANSMIT_OPMASK 0x0002 3890d1ba665SWarner Losh #define PXE_OPFLAGS_TRANSMIT_FRAGMENTED 0x0002 3900d1ba665SWarner Losh #define PXE_OPFLAGS_TRANSMIT_WHOLE 0x0000 3910d1ba665SWarner Losh 3920d1ba665SWarner Losh /// 3930d1ba665SWarner Losh /// UNDI Receive. 3940d1ba665SWarner Losh /// 3950d1ba665SWarner Losh /// No OpFlags. 3960d1ba665SWarner Losh /// 3970d1ba665SWarner Losh 3980d1ba665SWarner Losh /// 3990d1ba665SWarner Losh /// PXE STATFLAGS. 4000d1ba665SWarner Losh /// 4010d1ba665SWarner Losh typedef PXE_UINT16 PXE_STATFLAGS; 4020d1ba665SWarner Losh 4030d1ba665SWarner Losh #define PXE_STATFLAGS_INITIALIZE 0x0000 4040d1ba665SWarner Losh 4050d1ba665SWarner Losh /// 4060d1ba665SWarner Losh /// Common StatFlags that can be returned by all commands. 4070d1ba665SWarner Losh /// 4080d1ba665SWarner Losh /// 4090d1ba665SWarner Losh /// The COMMAND_COMPLETE and COMMAND_FAILED status flags must be 4100d1ba665SWarner Losh /// implemented by all UNDIs. COMMAND_QUEUED is only needed by UNDIs 4110d1ba665SWarner Losh /// that support command queuing. 4120d1ba665SWarner Losh /// 4130d1ba665SWarner Losh #define PXE_STATFLAGS_STATUS_MASK 0xC000 4140d1ba665SWarner Losh #define PXE_STATFLAGS_COMMAND_COMPLETE 0xC000 4150d1ba665SWarner Losh #define PXE_STATFLAGS_COMMAND_FAILED 0x8000 4160d1ba665SWarner Losh #define PXE_STATFLAGS_COMMAND_QUEUED 0x4000 4170d1ba665SWarner Losh 4180d1ba665SWarner Losh /// 4190d1ba665SWarner Losh /// UNDI Get State. 4200d1ba665SWarner Losh /// 4210d1ba665SWarner Losh #define PXE_STATFLAGS_GET_STATE_MASK 0x0003 4220d1ba665SWarner Losh #define PXE_STATFLAGS_GET_STATE_INITIALIZED 0x0002 4230d1ba665SWarner Losh #define PXE_STATFLAGS_GET_STATE_STARTED 0x0001 4240d1ba665SWarner Losh #define PXE_STATFLAGS_GET_STATE_STOPPED 0x0000 4250d1ba665SWarner Losh 4260d1ba665SWarner Losh /// 4270d1ba665SWarner Losh /// UNDI Start. 4280d1ba665SWarner Losh /// 4290d1ba665SWarner Losh /// No additional StatFlags. 4300d1ba665SWarner Losh /// 4310d1ba665SWarner Losh 4320d1ba665SWarner Losh /// 4330d1ba665SWarner Losh /// UNDI Get Init Info. 4340d1ba665SWarner Losh /// 4350d1ba665SWarner Losh #define PXE_STATFLAGS_CABLE_DETECT_MASK 0x0001 4360d1ba665SWarner Losh #define PXE_STATFLAGS_CABLE_DETECT_NOT_SUPPORTED 0x0000 4370d1ba665SWarner Losh #define PXE_STATFLAGS_CABLE_DETECT_SUPPORTED 0x0001 4380d1ba665SWarner Losh 4390d1ba665SWarner Losh #define PXE_STATFLAGS_GET_STATUS_NO_MEDIA_MASK 0x0002 4400d1ba665SWarner Losh #define PXE_STATFLAGS_GET_STATUS_NO_MEDIA_NOT_SUPPORTED 0x0000 4410d1ba665SWarner Losh #define PXE_STATFLAGS_GET_STATUS_NO_MEDIA_SUPPORTED 0x0002 4420d1ba665SWarner Losh 4430d1ba665SWarner Losh /// 4440d1ba665SWarner Losh /// UNDI Initialize. 4450d1ba665SWarner Losh /// 4460d1ba665SWarner Losh #define PXE_STATFLAGS_INITIALIZED_NO_MEDIA 0x0001 4470d1ba665SWarner Losh 4480d1ba665SWarner Losh /// 4490d1ba665SWarner Losh /// UNDI Reset. 4500d1ba665SWarner Losh /// 4510d1ba665SWarner Losh #define PXE_STATFLAGS_RESET_NO_MEDIA 0x0001 4520d1ba665SWarner Losh 4530d1ba665SWarner Losh /// 4540d1ba665SWarner Losh /// UNDI Shutdown. 4550d1ba665SWarner Losh /// 4560d1ba665SWarner Losh /// No additional StatFlags. 4570d1ba665SWarner Losh 4580d1ba665SWarner Losh /// 4590d1ba665SWarner Losh /// UNDI Interrupt Enables. 4600d1ba665SWarner Losh /// 4610d1ba665SWarner Losh /// 4620d1ba665SWarner Losh /// If set, receive interrupts are enabled. 4630d1ba665SWarner Losh /// 4640d1ba665SWarner Losh #define PXE_STATFLAGS_INTERRUPT_RECEIVE 0x0001 4650d1ba665SWarner Losh 4660d1ba665SWarner Losh /// 4670d1ba665SWarner Losh /// If set, transmit interrupts are enabled. 4680d1ba665SWarner Losh /// 4690d1ba665SWarner Losh #define PXE_STATFLAGS_INTERRUPT_TRANSMIT 0x0002 4700d1ba665SWarner Losh 4710d1ba665SWarner Losh /// 4720d1ba665SWarner Losh /// If set, command interrupts are enabled. 4730d1ba665SWarner Losh /// 4740d1ba665SWarner Losh #define PXE_STATFLAGS_INTERRUPT_COMMAND 0x0004 4750d1ba665SWarner Losh 4760d1ba665SWarner Losh /// 4770d1ba665SWarner Losh /// UNDI Receive Filters. 4780d1ba665SWarner Losh /// 4790d1ba665SWarner Losh 4800d1ba665SWarner Losh /// 4810d1ba665SWarner Losh /// If set, unicast packets will be received. 4820d1ba665SWarner Losh /// 4830d1ba665SWarner Losh #define PXE_STATFLAGS_RECEIVE_FILTER_UNICAST 0x0001 4840d1ba665SWarner Losh 4850d1ba665SWarner Losh /// 4860d1ba665SWarner Losh /// If set, broadcast packets will be received. 4870d1ba665SWarner Losh /// 4880d1ba665SWarner Losh #define PXE_STATFLAGS_RECEIVE_FILTER_BROADCAST 0x0002 4890d1ba665SWarner Losh 4900d1ba665SWarner Losh /// 4910d1ba665SWarner Losh /// If set, multicast packets that match up with the multicast address 4920d1ba665SWarner Losh /// filter list will be received. 4930d1ba665SWarner Losh /// 4940d1ba665SWarner Losh #define PXE_STATFLAGS_RECEIVE_FILTER_FILTERED_MULTICAST 0x0004 4950d1ba665SWarner Losh 4960d1ba665SWarner Losh /// 4970d1ba665SWarner Losh /// If set, all packets will be received. 4980d1ba665SWarner Losh /// 4990d1ba665SWarner Losh #define PXE_STATFLAGS_RECEIVE_FILTER_PROMISCUOUS 0x0008 5000d1ba665SWarner Losh 5010d1ba665SWarner Losh /// 5020d1ba665SWarner Losh /// If set, all multicast packets will be received. 5030d1ba665SWarner Losh /// 5040d1ba665SWarner Losh #define PXE_STATFLAGS_RECEIVE_FILTER_ALL_MULTICAST 0x0010 5050d1ba665SWarner Losh 5060d1ba665SWarner Losh /// 5070d1ba665SWarner Losh /// UNDI Station Address. 5080d1ba665SWarner Losh /// 5090d1ba665SWarner Losh /// No additional StatFlags. 5100d1ba665SWarner Losh /// 5110d1ba665SWarner Losh 5120d1ba665SWarner Losh /// 5130d1ba665SWarner Losh /// UNDI Statistics. 5140d1ba665SWarner Losh /// 5150d1ba665SWarner Losh /// No additional StatFlags. 5160d1ba665SWarner Losh /// 5170d1ba665SWarner Losh 5180d1ba665SWarner Losh /// 5190d1ba665SWarner Losh //// UNDI MCast IP to MAC. 5200d1ba665SWarner Losh //// 5210d1ba665SWarner Losh //// No additional StatFlags. 5220d1ba665SWarner Losh 5230d1ba665SWarner Losh /// 5240d1ba665SWarner Losh /// UNDI NvData. 5250d1ba665SWarner Losh /// 5260d1ba665SWarner Losh /// No additional StatFlags. 5270d1ba665SWarner Losh /// 5280d1ba665SWarner Losh 5290d1ba665SWarner Losh /// 5300d1ba665SWarner Losh /// UNDI Get Status. 5310d1ba665SWarner Losh /// 5320d1ba665SWarner Losh 5330d1ba665SWarner Losh /// 5340d1ba665SWarner Losh /// Use to determine if an interrupt has occurred. 5350d1ba665SWarner Losh /// 5360d1ba665SWarner Losh #define PXE_STATFLAGS_GET_STATUS_INTERRUPT_MASK 0x000F 5370d1ba665SWarner Losh #define PXE_STATFLAGS_GET_STATUS_NO_INTERRUPTS 0x0000 5380d1ba665SWarner Losh 5390d1ba665SWarner Losh /// 5400d1ba665SWarner Losh /// If set, at least one receive interrupt occurred. 5410d1ba665SWarner Losh /// 5420d1ba665SWarner Losh #define PXE_STATFLAGS_GET_STATUS_RECEIVE 0x0001 5430d1ba665SWarner Losh 5440d1ba665SWarner Losh /// 5450d1ba665SWarner Losh /// If set, at least one transmit interrupt occurred. 5460d1ba665SWarner Losh /// 5470d1ba665SWarner Losh #define PXE_STATFLAGS_GET_STATUS_TRANSMIT 0x0002 5480d1ba665SWarner Losh 5490d1ba665SWarner Losh /// 5500d1ba665SWarner Losh /// If set, at least one command interrupt occurred. 5510d1ba665SWarner Losh /// 5520d1ba665SWarner Losh #define PXE_STATFLAGS_GET_STATUS_COMMAND 0x0004 5530d1ba665SWarner Losh 5540d1ba665SWarner Losh /// 5550d1ba665SWarner Losh /// If set, at least one software interrupt occurred. 5560d1ba665SWarner Losh /// 5570d1ba665SWarner Losh #define PXE_STATFLAGS_GET_STATUS_SOFTWARE 0x0008 5580d1ba665SWarner Losh 5590d1ba665SWarner Losh /// 5600d1ba665SWarner Losh /// This flag is set if the transmitted buffer queue is empty. This flag 5610d1ba665SWarner Losh /// will be set if all transmitted buffer addresses get written into the DB. 5620d1ba665SWarner Losh /// 5630d1ba665SWarner Losh #define PXE_STATFLAGS_GET_STATUS_TXBUF_QUEUE_EMPTY 0x0010 5640d1ba665SWarner Losh 5650d1ba665SWarner Losh /// 5660d1ba665SWarner Losh /// This flag is set if no transmitted buffer addresses were written 5670d1ba665SWarner Losh /// into the DB. (This could be because DBsize was too small.) 5680d1ba665SWarner Losh /// 5690d1ba665SWarner Losh #define PXE_STATFLAGS_GET_STATUS_NO_TXBUFS_WRITTEN 0x0020 5700d1ba665SWarner Losh 5710d1ba665SWarner Losh /// 5720d1ba665SWarner Losh /// This flag is set if there is no media detected. 5730d1ba665SWarner Losh /// 5740d1ba665SWarner Losh #define PXE_STATFLAGS_GET_STATUS_NO_MEDIA 0x0040 5750d1ba665SWarner Losh 5760d1ba665SWarner Losh /// 5770d1ba665SWarner Losh /// UNDI Fill Header. 5780d1ba665SWarner Losh /// 5790d1ba665SWarner Losh /// No additional StatFlags. 5800d1ba665SWarner Losh /// 5810d1ba665SWarner Losh 5820d1ba665SWarner Losh /// 5830d1ba665SWarner Losh /// UNDI Transmit. 5840d1ba665SWarner Losh /// 5850d1ba665SWarner Losh /// No additional StatFlags. 5860d1ba665SWarner Losh 5870d1ba665SWarner Losh /// 5880d1ba665SWarner Losh /// UNDI Receive 5890d1ba665SWarner Losh /// . 5900d1ba665SWarner Losh 5910d1ba665SWarner Losh /// 5920d1ba665SWarner Losh /// No additional StatFlags. 5930d1ba665SWarner Losh /// 5940d1ba665SWarner Losh typedef PXE_UINT16 PXE_STATCODE; 5950d1ba665SWarner Losh 5960d1ba665SWarner Losh #define PXE_STATCODE_INITIALIZE 0x0000 5970d1ba665SWarner Losh 5980d1ba665SWarner Losh /// 5990d1ba665SWarner Losh /// Common StatCodes returned by all UNDI commands, UNDI protocol functions 6000d1ba665SWarner Losh /// and BC protocol functions. 6010d1ba665SWarner Losh /// 6020d1ba665SWarner Losh #define PXE_STATCODE_SUCCESS 0x0000 6030d1ba665SWarner Losh 6040d1ba665SWarner Losh #define PXE_STATCODE_INVALID_CDB 0x0001 6050d1ba665SWarner Losh #define PXE_STATCODE_INVALID_CPB 0x0002 6060d1ba665SWarner Losh #define PXE_STATCODE_BUSY 0x0003 6070d1ba665SWarner Losh #define PXE_STATCODE_QUEUE_FULL 0x0004 6080d1ba665SWarner Losh #define PXE_STATCODE_ALREADY_STARTED 0x0005 6090d1ba665SWarner Losh #define PXE_STATCODE_NOT_STARTED 0x0006 6100d1ba665SWarner Losh #define PXE_STATCODE_NOT_SHUTDOWN 0x0007 6110d1ba665SWarner Losh #define PXE_STATCODE_ALREADY_INITIALIZED 0x0008 6120d1ba665SWarner Losh #define PXE_STATCODE_NOT_INITIALIZED 0x0009 6130d1ba665SWarner Losh #define PXE_STATCODE_DEVICE_FAILURE 0x000A 6140d1ba665SWarner Losh #define PXE_STATCODE_NVDATA_FAILURE 0x000B 6150d1ba665SWarner Losh #define PXE_STATCODE_UNSUPPORTED 0x000C 6160d1ba665SWarner Losh #define PXE_STATCODE_BUFFER_FULL 0x000D 6170d1ba665SWarner Losh #define PXE_STATCODE_INVALID_PARAMETER 0x000E 6180d1ba665SWarner Losh #define PXE_STATCODE_INVALID_UNDI 0x000F 6190d1ba665SWarner Losh #define PXE_STATCODE_IPV4_NOT_SUPPORTED 0x0010 6200d1ba665SWarner Losh #define PXE_STATCODE_IPV6_NOT_SUPPORTED 0x0011 6210d1ba665SWarner Losh #define PXE_STATCODE_NOT_ENOUGH_MEMORY 0x0012 6220d1ba665SWarner Losh #define PXE_STATCODE_NO_DATA 0x0013 6230d1ba665SWarner Losh 6240d1ba665SWarner Losh typedef PXE_UINT16 PXE_IFNUM; 6250d1ba665SWarner Losh 6260d1ba665SWarner Losh /// 6270d1ba665SWarner Losh /// This interface number must be passed to the S/W UNDI Start command. 6280d1ba665SWarner Losh /// 6290d1ba665SWarner Losh #define PXE_IFNUM_START 0x0000 6300d1ba665SWarner Losh 6310d1ba665SWarner Losh /// 6320d1ba665SWarner Losh /// This interface number is returned by the S/W UNDI Get State and 6330d1ba665SWarner Losh /// Start commands if information in the CDB, CPB or DB is invalid. 6340d1ba665SWarner Losh /// 6350d1ba665SWarner Losh #define PXE_IFNUM_INVALID 0x0000 6360d1ba665SWarner Losh 6370d1ba665SWarner Losh typedef PXE_UINT16 PXE_CONTROL; 6380d1ba665SWarner Losh 6390d1ba665SWarner Losh /// 6400d1ba665SWarner Losh /// Setting this flag directs the UNDI to queue this command for later 6410d1ba665SWarner Losh /// execution if the UNDI is busy and it supports command queuing. 6420d1ba665SWarner Losh /// If queuing is not supported, a PXE_STATCODE_INVALID_CONTROL error 6430d1ba665SWarner Losh /// is returned. If the queue is full, a PXE_STATCODE_CDB_QUEUE_FULL 6440d1ba665SWarner Losh /// error is returned. 6450d1ba665SWarner Losh /// 6460d1ba665SWarner Losh #define PXE_CONTROL_QUEUE_IF_BUSY 0x0002 6470d1ba665SWarner Losh 6480d1ba665SWarner Losh /// 6490d1ba665SWarner Losh /// These two bit values are used to determine if there are more UNDI 6500d1ba665SWarner Losh /// CDB structures following this one. If the link bit is set, there 6510d1ba665SWarner Losh /// must be a CDB structure following this one. Execution will start 6520d1ba665SWarner Losh /// on the next CDB structure as soon as this one completes successfully. 6530d1ba665SWarner Losh /// If an error is generated by this command, execution will stop. 6540d1ba665SWarner Losh /// 6550d1ba665SWarner Losh #define PXE_CONTROL_LINK 0x0001 6560d1ba665SWarner Losh #define PXE_CONTROL_LAST_CDB_IN_LIST 0x0000 6570d1ba665SWarner Losh 6580d1ba665SWarner Losh typedef PXE_UINT8 PXE_FRAME_TYPE; 6590d1ba665SWarner Losh 6600d1ba665SWarner Losh #define PXE_FRAME_TYPE_NONE 0x00 6610d1ba665SWarner Losh #define PXE_FRAME_TYPE_UNICAST 0x01 6620d1ba665SWarner Losh #define PXE_FRAME_TYPE_BROADCAST 0x02 6630d1ba665SWarner Losh #define PXE_FRAME_TYPE_FILTERED_MULTICAST 0x03 6640d1ba665SWarner Losh #define PXE_FRAME_TYPE_PROMISCUOUS 0x04 6650d1ba665SWarner Losh #define PXE_FRAME_TYPE_PROMISCUOUS_MULTICAST 0x05 6660d1ba665SWarner Losh 6670d1ba665SWarner Losh #define PXE_FRAME_TYPE_MULTICAST PXE_FRAME_TYPE_FILTERED_MULTICAST 6680d1ba665SWarner Losh 6690d1ba665SWarner Losh typedef PXE_UINT32 PXE_IPV4; 6700d1ba665SWarner Losh 6710d1ba665SWarner Losh typedef PXE_UINT32 PXE_IPV6[4]; 6720d1ba665SWarner Losh #define PXE_MAC_LENGTH 32 6730d1ba665SWarner Losh 6740d1ba665SWarner Losh typedef PXE_UINT8 PXE_MAC_ADDR[PXE_MAC_LENGTH]; 6750d1ba665SWarner Losh 6760d1ba665SWarner Losh typedef PXE_UINT8 PXE_IFTYPE; 6770d1ba665SWarner Losh typedef UINT16 PXE_MEDIA_PROTOCOL; 6780d1ba665SWarner Losh 6790d1ba665SWarner Losh /// 6800d1ba665SWarner Losh /// This information is from the ARP section of RFC 1700. 6810d1ba665SWarner Losh /// 6820d1ba665SWarner Losh /// 1 Ethernet (10Mb) [JBP] 6830d1ba665SWarner Losh /// 2 Experimental Ethernet (3Mb) [JBP] 6840d1ba665SWarner Losh /// 3 Amateur Radio AX.25 [PXK] 6850d1ba665SWarner Losh /// 4 Proteon ProNET Token Ring [JBP] 6860d1ba665SWarner Losh /// 5 Chaos [GXP] 6870d1ba665SWarner Losh /// 6 IEEE 802 Networks [JBP] 6880d1ba665SWarner Losh /// 7 ARCNET [JBP] 6890d1ba665SWarner Losh /// 8 Hyperchannel [JBP] 6900d1ba665SWarner Losh /// 9 Lanstar [TU] 6910d1ba665SWarner Losh /// 10 Autonet Short Address [MXB1] 6920d1ba665SWarner Losh /// 11 LocalTalk [JKR1] 6930d1ba665SWarner Losh /// 12 LocalNet (IBM* PCNet or SYTEK* LocalNET) [JXM] 6940d1ba665SWarner Losh /// 13 Ultra link [RXD2] 6950d1ba665SWarner Losh /// 14 SMDS [GXC1] 6960d1ba665SWarner Losh /// 15 Frame Relay [AGM] 6970d1ba665SWarner Losh /// 16 Asynchronous Transmission Mode (ATM) [JXB2] 6980d1ba665SWarner Losh /// 17 HDLC [JBP] 6990d1ba665SWarner Losh /// 18 Fibre Channel [Yakov Rekhter] 7000d1ba665SWarner Losh /// 19 Asynchronous Transmission Mode (ATM) [Mark Laubach] 7010d1ba665SWarner Losh /// 20 Serial Line [JBP] 7020d1ba665SWarner Losh /// 21 Asynchronous Transmission Mode (ATM) [MXB1] 7030d1ba665SWarner Losh /// 7040d1ba665SWarner Losh /// * Other names and brands may be claimed as the property of others. 7050d1ba665SWarner Losh /// 7060d1ba665SWarner Losh #define PXE_IFTYPE_ETHERNET 0x01 7070d1ba665SWarner Losh #define PXE_IFTYPE_TOKENRING 0x04 7080d1ba665SWarner Losh #define PXE_IFTYPE_FIBRE_CHANNEL 0x12 7090d1ba665SWarner Losh 7100d1ba665SWarner Losh typedef struct s_pxe_hw_undi { 7110d1ba665SWarner Losh PXE_UINT32 Signature; ///< PXE_ROMID_SIGNATURE. 7120d1ba665SWarner Losh PXE_UINT8 Len; ///< sizeof(PXE_HW_UNDI). 7130d1ba665SWarner Losh PXE_UINT8 Fudge; ///< makes 8-bit cksum equal zero. 7140d1ba665SWarner Losh PXE_UINT8 Rev; ///< PXE_ROMID_REV. 7150d1ba665SWarner Losh PXE_UINT8 IFcnt; ///< physical connector count lower byte. 7160d1ba665SWarner Losh PXE_UINT8 MajorVer; ///< PXE_ROMID_MAJORVER. 7170d1ba665SWarner Losh PXE_UINT8 MinorVer; ///< PXE_ROMID_MINORVER. 7180d1ba665SWarner Losh PXE_UINT8 IFcntExt; ///< physical connector count upper byte. 7190d1ba665SWarner Losh PXE_UINT8 reserved; ///< zero, not used. 7200d1ba665SWarner Losh PXE_UINT32 Implementation; ///< implementation flags. 7210d1ba665SWarner Losh ///< reserved ///< vendor use. 7220d1ba665SWarner Losh ///< UINT32 Status; ///< status port. 7230d1ba665SWarner Losh ///< UINT32 Command; ///< command port. 7240d1ba665SWarner Losh ///< UINT64 CDBaddr; ///< CDB address port. 7250d1ba665SWarner Losh ///< 7260d1ba665SWarner Losh } PXE_HW_UNDI; 7270d1ba665SWarner Losh 7280d1ba665SWarner Losh /// 7290d1ba665SWarner Losh /// Status port bit definitions. 7300d1ba665SWarner Losh /// 7310d1ba665SWarner Losh 7320d1ba665SWarner Losh /// 7330d1ba665SWarner Losh /// UNDI operation state. 7340d1ba665SWarner Losh /// 7350d1ba665SWarner Losh #define PXE_HWSTAT_STATE_MASK 0xC0000000 7360d1ba665SWarner Losh #define PXE_HWSTAT_BUSY 0xC0000000 7370d1ba665SWarner Losh #define PXE_HWSTAT_INITIALIZED 0x80000000 7380d1ba665SWarner Losh #define PXE_HWSTAT_STARTED 0x40000000 7390d1ba665SWarner Losh #define PXE_HWSTAT_STOPPED 0x00000000 7400d1ba665SWarner Losh 7410d1ba665SWarner Losh /// 7420d1ba665SWarner Losh /// If set, last command failed. 7430d1ba665SWarner Losh /// 7440d1ba665SWarner Losh #define PXE_HWSTAT_COMMAND_FAILED 0x20000000 7450d1ba665SWarner Losh 7460d1ba665SWarner Losh /// 7470d1ba665SWarner Losh /// If set, identifies enabled receive filters. 7480d1ba665SWarner Losh /// 7490d1ba665SWarner Losh #define PXE_HWSTAT_PROMISCUOUS_MULTICAST_RX_ENABLED 0x00001000 7500d1ba665SWarner Losh #define PXE_HWSTAT_PROMISCUOUS_RX_ENABLED 0x00000800 7510d1ba665SWarner Losh #define PXE_HWSTAT_BROADCAST_RX_ENABLED 0x00000400 7520d1ba665SWarner Losh #define PXE_HWSTAT_MULTICAST_RX_ENABLED 0x00000200 7530d1ba665SWarner Losh #define PXE_HWSTAT_UNICAST_RX_ENABLED 0x00000100 7540d1ba665SWarner Losh 7550d1ba665SWarner Losh /// 7560d1ba665SWarner Losh /// If set, identifies enabled external interrupts. 7570d1ba665SWarner Losh /// 7580d1ba665SWarner Losh #define PXE_HWSTAT_SOFTWARE_INT_ENABLED 0x00000080 7590d1ba665SWarner Losh #define PXE_HWSTAT_TX_COMPLETE_INT_ENABLED 0x00000040 7600d1ba665SWarner Losh #define PXE_HWSTAT_PACKET_RX_INT_ENABLED 0x00000020 7610d1ba665SWarner Losh #define PXE_HWSTAT_CMD_COMPLETE_INT_ENABLED 0x00000010 7620d1ba665SWarner Losh 7630d1ba665SWarner Losh /// 7640d1ba665SWarner Losh /// If set, identifies pending interrupts. 7650d1ba665SWarner Losh /// 7660d1ba665SWarner Losh #define PXE_HWSTAT_SOFTWARE_INT_PENDING 0x00000008 7670d1ba665SWarner Losh #define PXE_HWSTAT_TX_COMPLETE_INT_PENDING 0x00000004 7680d1ba665SWarner Losh #define PXE_HWSTAT_PACKET_RX_INT_PENDING 0x00000002 7690d1ba665SWarner Losh #define PXE_HWSTAT_CMD_COMPLETE_INT_PENDING 0x00000001 7700d1ba665SWarner Losh 7710d1ba665SWarner Losh /// 7720d1ba665SWarner Losh /// Command port definitions. 7730d1ba665SWarner Losh /// 7740d1ba665SWarner Losh 7750d1ba665SWarner Losh /// 7760d1ba665SWarner Losh /// If set, CDB identified in CDBaddr port is given to UNDI. 7770d1ba665SWarner Losh /// If not set, other bits in this word will be processed. 7780d1ba665SWarner Losh /// 7790d1ba665SWarner Losh #define PXE_HWCMD_ISSUE_COMMAND 0x80000000 7800d1ba665SWarner Losh #define PXE_HWCMD_INTS_AND_FILTS 0x00000000 7810d1ba665SWarner Losh 7820d1ba665SWarner Losh /// 7830d1ba665SWarner Losh /// Use these to enable/disable receive filters. 7840d1ba665SWarner Losh /// 7850d1ba665SWarner Losh #define PXE_HWCMD_PROMISCUOUS_MULTICAST_RX_ENABLE 0x00001000 7860d1ba665SWarner Losh #define PXE_HWCMD_PROMISCUOUS_RX_ENABLE 0x00000800 7870d1ba665SWarner Losh #define PXE_HWCMD_BROADCAST_RX_ENABLE 0x00000400 7880d1ba665SWarner Losh #define PXE_HWCMD_MULTICAST_RX_ENABLE 0x00000200 7890d1ba665SWarner Losh #define PXE_HWCMD_UNICAST_RX_ENABLE 0x00000100 7900d1ba665SWarner Losh 7910d1ba665SWarner Losh /// 7920d1ba665SWarner Losh /// Use these to enable/disable external interrupts. 7930d1ba665SWarner Losh /// 7940d1ba665SWarner Losh #define PXE_HWCMD_SOFTWARE_INT_ENABLE 0x00000080 7950d1ba665SWarner Losh #define PXE_HWCMD_TX_COMPLETE_INT_ENABLE 0x00000040 7960d1ba665SWarner Losh #define PXE_HWCMD_PACKET_RX_INT_ENABLE 0x00000020 7970d1ba665SWarner Losh #define PXE_HWCMD_CMD_COMPLETE_INT_ENABLE 0x00000010 7980d1ba665SWarner Losh 7990d1ba665SWarner Losh /// 8000d1ba665SWarner Losh /// Use these to clear pending external interrupts. 8010d1ba665SWarner Losh /// 8020d1ba665SWarner Losh #define PXE_HWCMD_CLEAR_SOFTWARE_INT 0x00000008 8030d1ba665SWarner Losh #define PXE_HWCMD_CLEAR_TX_COMPLETE_INT 0x00000004 8040d1ba665SWarner Losh #define PXE_HWCMD_CLEAR_PACKET_RX_INT 0x00000002 8050d1ba665SWarner Losh #define PXE_HWCMD_CLEAR_CMD_COMPLETE_INT 0x00000001 8060d1ba665SWarner Losh 8070d1ba665SWarner Losh typedef struct s_pxe_sw_undi { 8080d1ba665SWarner Losh PXE_UINT32 Signature; ///< PXE_ROMID_SIGNATURE. 8090d1ba665SWarner Losh PXE_UINT8 Len; ///< sizeof(PXE_SW_UNDI). 8100d1ba665SWarner Losh PXE_UINT8 Fudge; ///< makes 8-bit cksum zero. 8110d1ba665SWarner Losh PXE_UINT8 Rev; ///< PXE_ROMID_REV. 8120d1ba665SWarner Losh PXE_UINT8 IFcnt; ///< physical connector count lower byte. 8130d1ba665SWarner Losh PXE_UINT8 MajorVer; ///< PXE_ROMID_MAJORVER. 8140d1ba665SWarner Losh PXE_UINT8 MinorVer; ///< PXE_ROMID_MINORVER. 8150d1ba665SWarner Losh PXE_UINT8 IFcntExt; ///< physical connector count upper byte. 8160d1ba665SWarner Losh PXE_UINT8 reserved1; ///< zero, not used. 8170d1ba665SWarner Losh PXE_UINT32 Implementation; ///< Implementation flags. 8180d1ba665SWarner Losh PXE_UINT64 EntryPoint; ///< API entry point. 8190d1ba665SWarner Losh PXE_UINT8 reserved2[3]; ///< zero, not used. 8200d1ba665SWarner Losh PXE_UINT8 BusCnt; ///< number of bustypes supported. 8210d1ba665SWarner Losh PXE_UINT32 BusType[1]; ///< list of supported bustypes. 8220d1ba665SWarner Losh } PXE_SW_UNDI; 8230d1ba665SWarner Losh 8240d1ba665SWarner Losh typedef union u_pxe_undi { 8250d1ba665SWarner Losh PXE_HW_UNDI hw; 8260d1ba665SWarner Losh PXE_SW_UNDI sw; 8270d1ba665SWarner Losh } PXE_UNDI; 8280d1ba665SWarner Losh 8290d1ba665SWarner Losh /// 8300d1ba665SWarner Losh /// Signature of !PXE structure. 8310d1ba665SWarner Losh /// 8320d1ba665SWarner Losh #define PXE_ROMID_SIGNATURE PXE_BUSTYPE ('!', 'P', 'X', 'E') 8330d1ba665SWarner Losh 8340d1ba665SWarner Losh /// 8350d1ba665SWarner Losh /// !PXE structure format revision 8360d1ba665SWarner Losh /// . 8370d1ba665SWarner Losh #define PXE_ROMID_REV 0x02 8380d1ba665SWarner Losh 8390d1ba665SWarner Losh /// 8400d1ba665SWarner Losh /// UNDI command interface revision. These are the values that get sent 8410d1ba665SWarner Losh /// in option 94 (Client Network Interface Identifier) in the DHCP Discover 8420d1ba665SWarner Losh /// and PXE Boot Server Request packets. 8430d1ba665SWarner Losh /// 8440d1ba665SWarner Losh #define PXE_ROMID_MAJORVER 0x03 8450d1ba665SWarner Losh #define PXE_ROMID_MINORVER 0x01 8460d1ba665SWarner Losh 8470d1ba665SWarner Losh /// 8480d1ba665SWarner Losh /// Implementation flags. 8490d1ba665SWarner Losh /// 8500d1ba665SWarner Losh #define PXE_ROMID_IMP_HW_UNDI 0x80000000 8510d1ba665SWarner Losh #define PXE_ROMID_IMP_SW_VIRT_ADDR 0x40000000 8520d1ba665SWarner Losh #define PXE_ROMID_IMP_64BIT_DEVICE 0x00010000 8530d1ba665SWarner Losh #define PXE_ROMID_IMP_FRAG_SUPPORTED 0x00008000 8540d1ba665SWarner Losh #define PXE_ROMID_IMP_CMD_LINK_SUPPORTED 0x00004000 8550d1ba665SWarner Losh #define PXE_ROMID_IMP_CMD_QUEUE_SUPPORTED 0x00002000 8560d1ba665SWarner Losh #define PXE_ROMID_IMP_MULTI_FRAME_SUPPORTED 0x00001000 8570d1ba665SWarner Losh #define PXE_ROMID_IMP_NVDATA_SUPPORT_MASK 0x00000C00 8580d1ba665SWarner Losh #define PXE_ROMID_IMP_NVDATA_BULK_WRITABLE 0x00000C00 8590d1ba665SWarner Losh #define PXE_ROMID_IMP_NVDATA_SPARSE_WRITABLE 0x00000800 8600d1ba665SWarner Losh #define PXE_ROMID_IMP_NVDATA_READ_ONLY 0x00000400 8610d1ba665SWarner Losh #define PXE_ROMID_IMP_NVDATA_NOT_AVAILABLE 0x00000000 8620d1ba665SWarner Losh #define PXE_ROMID_IMP_STATISTICS_SUPPORTED 0x00000200 8630d1ba665SWarner Losh #define PXE_ROMID_IMP_STATION_ADDR_SETTABLE 0x00000100 8640d1ba665SWarner Losh #define PXE_ROMID_IMP_PROMISCUOUS_MULTICAST_RX_SUPPORTED 0x00000080 8650d1ba665SWarner Losh #define PXE_ROMID_IMP_PROMISCUOUS_RX_SUPPORTED 0x00000040 8660d1ba665SWarner Losh #define PXE_ROMID_IMP_BROADCAST_RX_SUPPORTED 0x00000020 8670d1ba665SWarner Losh #define PXE_ROMID_IMP_FILTERED_MULTICAST_RX_SUPPORTED 0x00000010 8680d1ba665SWarner Losh #define PXE_ROMID_IMP_SOFTWARE_INT_SUPPORTED 0x00000008 8690d1ba665SWarner Losh #define PXE_ROMID_IMP_TX_COMPLETE_INT_SUPPORTED 0x00000004 8700d1ba665SWarner Losh #define PXE_ROMID_IMP_PACKET_RX_INT_SUPPORTED 0x00000002 8710d1ba665SWarner Losh #define PXE_ROMID_IMP_CMD_COMPLETE_INT_SUPPORTED 0x00000001 8720d1ba665SWarner Losh 8730d1ba665SWarner Losh typedef struct s_pxe_cdb { 8740d1ba665SWarner Losh PXE_OPCODE OpCode; 8750d1ba665SWarner Losh PXE_OPFLAGS OpFlags; 8760d1ba665SWarner Losh PXE_UINT16 CPBsize; 8770d1ba665SWarner Losh PXE_UINT16 DBsize; 8780d1ba665SWarner Losh PXE_UINT64 CPBaddr; 8790d1ba665SWarner Losh PXE_UINT64 DBaddr; 8800d1ba665SWarner Losh PXE_STATCODE StatCode; 8810d1ba665SWarner Losh PXE_STATFLAGS StatFlags; 8820d1ba665SWarner Losh PXE_UINT16 IFnum; 8830d1ba665SWarner Losh PXE_CONTROL Control; 8840d1ba665SWarner Losh } PXE_CDB; 8850d1ba665SWarner Losh 8860d1ba665SWarner Losh typedef union u_pxe_ip_addr { 8870d1ba665SWarner Losh PXE_IPV6 IPv6; 8880d1ba665SWarner Losh PXE_IPV4 IPv4; 8890d1ba665SWarner Losh } PXE_IP_ADDR; 8900d1ba665SWarner Losh 8910d1ba665SWarner Losh typedef union pxe_device { 8920d1ba665SWarner Losh /// 8930d1ba665SWarner Losh /// PCI and PC Card NICs are both identified using bus, device 8940d1ba665SWarner Losh /// and function numbers. For PC Card, this may require PC 8950d1ba665SWarner Losh /// Card services to be loaded in the BIOS or preboot 8960d1ba665SWarner Losh /// environment. 8970d1ba665SWarner Losh /// 8980d1ba665SWarner Losh struct { 8990d1ba665SWarner Losh /// 9000d1ba665SWarner Losh /// See S/W UNDI ROMID structure definition for PCI and 9010d1ba665SWarner Losh /// PCC BusType definitions. 9020d1ba665SWarner Losh /// 9030d1ba665SWarner Losh PXE_UINT32 BusType; 9040d1ba665SWarner Losh 9050d1ba665SWarner Losh /// 9060d1ba665SWarner Losh /// Bus, device & function numbers that locate this device. 9070d1ba665SWarner Losh /// 9080d1ba665SWarner Losh PXE_UINT16 Bus; 9090d1ba665SWarner Losh PXE_UINT8 Device; 9100d1ba665SWarner Losh PXE_UINT8 Function; 911*580fcf64SWarner Losh } PCI, PCC; 9120d1ba665SWarner Losh } PXE_DEVICE; 9130d1ba665SWarner Losh 9140d1ba665SWarner Losh /// 9150d1ba665SWarner Losh /// cpb and db definitions 9160d1ba665SWarner Losh /// 9170d1ba665SWarner Losh #define MAX_PCI_CONFIG_LEN 64 ///< # of dwords. 9180d1ba665SWarner Losh #define MAX_EEPROM_LEN 128 ///< # of dwords. 9190d1ba665SWarner Losh #define MAX_XMIT_BUFFERS 32 ///< recycling Q length for xmit_done. 9200d1ba665SWarner Losh #define MAX_MCAST_ADDRESS_CNT 8 9210d1ba665SWarner Losh 9220d1ba665SWarner Losh typedef struct s_pxe_cpb_start_30 { 9230d1ba665SWarner Losh /// 9240d1ba665SWarner Losh /// PXE_VOID Delay(UINTN microseconds); 9250d1ba665SWarner Losh /// 9260d1ba665SWarner Losh /// UNDI will never request a delay smaller than 10 microseconds 9270d1ba665SWarner Losh /// and will always request delays in increments of 10 microseconds. 9280d1ba665SWarner Losh /// The Delay() CallBack routine must delay between n and n + 10 9290d1ba665SWarner Losh /// microseconds before returning control to the UNDI. 9300d1ba665SWarner Losh /// 9310d1ba665SWarner Losh /// This field cannot be set to zero. 9320d1ba665SWarner Losh /// 9330d1ba665SWarner Losh UINT64 Delay; 9340d1ba665SWarner Losh 9350d1ba665SWarner Losh /// 9360d1ba665SWarner Losh /// PXE_VOID Block(UINT32 enable); 9370d1ba665SWarner Losh /// 9380d1ba665SWarner Losh /// UNDI may need to block multi-threaded/multi-processor access to 9390d1ba665SWarner Losh /// critical code sections when programming or accessing the network 9400d1ba665SWarner Losh /// device. To this end, a blocking service is needed by the UNDI. 9410d1ba665SWarner Losh /// When UNDI needs a block, it will call Block() passing a non-zero 9420d1ba665SWarner Losh /// value. When UNDI no longer needs a block, it will call Block() 9430d1ba665SWarner Losh /// with a zero value. When called, if the Block() is already enabled, 9440d1ba665SWarner Losh /// do not return control to the UNDI until the previous Block() is 9450d1ba665SWarner Losh /// disabled. 9460d1ba665SWarner Losh /// 9470d1ba665SWarner Losh /// This field cannot be set to zero. 9480d1ba665SWarner Losh /// 9490d1ba665SWarner Losh UINT64 Block; 9500d1ba665SWarner Losh 9510d1ba665SWarner Losh /// 9520d1ba665SWarner Losh /// PXE_VOID Virt2Phys(UINT64 virtual, UINT64 physical_ptr); 9530d1ba665SWarner Losh /// 9540d1ba665SWarner Losh /// UNDI will pass the virtual address of a buffer and the virtual 9550d1ba665SWarner Losh /// address of a 64-bit physical buffer. Convert the virtual address 9560d1ba665SWarner Losh /// to a physical address and write the result to the physical address 9570d1ba665SWarner Losh /// buffer. If virtual and physical addresses are the same, just 9580d1ba665SWarner Losh /// copy the virtual address to the physical address buffer. 9590d1ba665SWarner Losh /// 9600d1ba665SWarner Losh /// This field can be set to zero if virtual and physical addresses 9610d1ba665SWarner Losh /// are equal. 9620d1ba665SWarner Losh /// 9630d1ba665SWarner Losh UINT64 Virt2Phys; 9640d1ba665SWarner Losh /// 9650d1ba665SWarner Losh /// PXE_VOID Mem_IO(UINT8 read_write, UINT8 len, UINT64 port, 9660d1ba665SWarner Losh /// UINT64 buf_addr); 9670d1ba665SWarner Losh /// 9680d1ba665SWarner Losh /// UNDI will read or write the device io space using this call back 9690d1ba665SWarner Losh /// function. It passes the number of bytes as the len parameter and it 9700d1ba665SWarner Losh /// will be either 1,2,4 or 8. 9710d1ba665SWarner Losh /// 9720d1ba665SWarner Losh /// This field can not be set to zero. 9730d1ba665SWarner Losh /// 9740d1ba665SWarner Losh UINT64 Mem_IO; 9750d1ba665SWarner Losh } PXE_CPB_START_30; 9760d1ba665SWarner Losh 9770d1ba665SWarner Losh typedef struct s_pxe_cpb_start_31 { 9780d1ba665SWarner Losh /// 9790d1ba665SWarner Losh /// PXE_VOID Delay(UINT64 UnqId, UINTN microseconds); 9800d1ba665SWarner Losh /// 9810d1ba665SWarner Losh /// UNDI will never request a delay smaller than 10 microseconds 9820d1ba665SWarner Losh /// and will always request delays in increments of 10 microseconds. 9830d1ba665SWarner Losh /// The Delay() CallBack routine must delay between n and n + 10 9840d1ba665SWarner Losh /// microseconds before returning control to the UNDI. 9850d1ba665SWarner Losh /// 9860d1ba665SWarner Losh /// This field cannot be set to zero. 9870d1ba665SWarner Losh /// 9880d1ba665SWarner Losh UINT64 Delay; 9890d1ba665SWarner Losh 9900d1ba665SWarner Losh /// 9910d1ba665SWarner Losh /// PXE_VOID Block(UINT64 unq_id, UINT32 enable); 9920d1ba665SWarner Losh /// 9930d1ba665SWarner Losh /// UNDI may need to block multi-threaded/multi-processor access to 9940d1ba665SWarner Losh /// critical code sections when programming or accessing the network 9950d1ba665SWarner Losh /// device. To this end, a blocking service is needed by the UNDI. 9960d1ba665SWarner Losh /// When UNDI needs a block, it will call Block() passing a non-zero 9970d1ba665SWarner Losh /// value. When UNDI no longer needs a block, it will call Block() 9980d1ba665SWarner Losh /// with a zero value. When called, if the Block() is already enabled, 9990d1ba665SWarner Losh /// do not return control to the UNDI until the previous Block() is 10000d1ba665SWarner Losh /// disabled. 10010d1ba665SWarner Losh /// 10020d1ba665SWarner Losh /// This field cannot be set to zero. 10030d1ba665SWarner Losh /// 10040d1ba665SWarner Losh UINT64 Block; 10050d1ba665SWarner Losh 10060d1ba665SWarner Losh /// 10070d1ba665SWarner Losh /// PXE_VOID Virt2Phys(UINT64 UnqId, UINT64 virtual, UINT64 physical_ptr); 10080d1ba665SWarner Losh /// 10090d1ba665SWarner Losh /// UNDI will pass the virtual address of a buffer and the virtual 10100d1ba665SWarner Losh /// address of a 64-bit physical buffer. Convert the virtual address 10110d1ba665SWarner Losh /// to a physical address and write the result to the physical address 10120d1ba665SWarner Losh /// buffer. If virtual and physical addresses are the same, just 10130d1ba665SWarner Losh /// copy the virtual address to the physical address buffer. 10140d1ba665SWarner Losh /// 10150d1ba665SWarner Losh /// This field can be set to zero if virtual and physical addresses 10160d1ba665SWarner Losh /// are equal. 10170d1ba665SWarner Losh /// 10180d1ba665SWarner Losh UINT64 Virt2Phys; 10190d1ba665SWarner Losh /// 10200d1ba665SWarner Losh /// PXE_VOID Mem_IO(UINT64 UnqId, UINT8 read_write, UINT8 len, UINT64 port, 10210d1ba665SWarner Losh /// UINT64 buf_addr); 10220d1ba665SWarner Losh /// 10230d1ba665SWarner Losh /// UNDI will read or write the device io space using this call back 10240d1ba665SWarner Losh /// function. It passes the number of bytes as the len parameter and it 10250d1ba665SWarner Losh /// will be either 1,2,4 or 8. 10260d1ba665SWarner Losh /// 10270d1ba665SWarner Losh /// This field can not be set to zero. 10280d1ba665SWarner Losh /// 10290d1ba665SWarner Losh UINT64 Mem_IO; 10300d1ba665SWarner Losh /// 10310d1ba665SWarner Losh /// PXE_VOID Map_Mem(UINT64 unq_id, UINT64 virtual_addr, UINT32 size, 10320d1ba665SWarner Losh /// UINT32 Direction, UINT64 mapped_addr); 10330d1ba665SWarner Losh /// 10340d1ba665SWarner Losh /// UNDI will pass the virtual address of a buffer, direction of the data 10350d1ba665SWarner Losh /// flow from/to the mapped buffer (the constants are defined below) 10360d1ba665SWarner Losh /// and a place holder (pointer) for the mapped address. 10370d1ba665SWarner Losh /// This call will Map the given address to a physical DMA address and write 10380d1ba665SWarner Losh /// the result to the mapped_addr pointer. If there is no need to 10390d1ba665SWarner Losh /// map the given address to a lower address (i.e. the given address is 10400d1ba665SWarner Losh /// associated with a physical address that is already compatible to be 10410d1ba665SWarner Losh /// used with the DMA, it converts the given virtual address to it's 10420d1ba665SWarner Losh /// physical address and write that in the mapped address pointer. 10430d1ba665SWarner Losh /// 10440d1ba665SWarner Losh /// This field can be set to zero if there is no mapping service available. 10450d1ba665SWarner Losh /// 10460d1ba665SWarner Losh UINT64 Map_Mem; 10470d1ba665SWarner Losh 10480d1ba665SWarner Losh /// 10490d1ba665SWarner Losh /// PXE_VOID UnMap_Mem(UINT64 unq_id, UINT64 virtual_addr, UINT32 size, 10500d1ba665SWarner Losh /// UINT32 Direction, UINT64 mapped_addr); 10510d1ba665SWarner Losh /// 10520d1ba665SWarner Losh /// UNDI will pass the virtual and mapped addresses of a buffer. 10530d1ba665SWarner Losh /// This call will un map the given address. 10540d1ba665SWarner Losh /// 10550d1ba665SWarner Losh /// This field can be set to zero if there is no unmapping service available. 10560d1ba665SWarner Losh /// 10570d1ba665SWarner Losh UINT64 UnMap_Mem; 10580d1ba665SWarner Losh 10590d1ba665SWarner Losh /// 10600d1ba665SWarner Losh /// PXE_VOID Sync_Mem(UINT64 unq_id, UINT64 virtual, 10610d1ba665SWarner Losh /// UINT32 size, UINT32 Direction, UINT64 mapped_addr); 10620d1ba665SWarner Losh /// 10630d1ba665SWarner Losh /// UNDI will pass the virtual and mapped addresses of a buffer. 10640d1ba665SWarner Losh /// This call will synchronize the contents of both the virtual and mapped. 10650d1ba665SWarner Losh /// buffers for the given Direction. 10660d1ba665SWarner Losh /// 10670d1ba665SWarner Losh /// This field can be set to zero if there is no service available. 10680d1ba665SWarner Losh /// 10690d1ba665SWarner Losh UINT64 Sync_Mem; 10700d1ba665SWarner Losh 10710d1ba665SWarner Losh /// 10720d1ba665SWarner Losh /// protocol driver can provide anything for this Unique_ID, UNDI remembers 10730d1ba665SWarner Losh /// that as just a 64bit value associated to the interface specified by 10740d1ba665SWarner Losh /// the ifnum and gives it back as a parameter to all the call-back routines 10750d1ba665SWarner Losh /// when calling for that interface! 10760d1ba665SWarner Losh /// 10770d1ba665SWarner Losh UINT64 Unique_ID; 10780d1ba665SWarner Losh } PXE_CPB_START_31; 10790d1ba665SWarner Losh 10800d1ba665SWarner Losh #define TO_AND_FROM_DEVICE 0 10810d1ba665SWarner Losh #define FROM_DEVICE 1 10820d1ba665SWarner Losh #define TO_DEVICE 2 10830d1ba665SWarner Losh 10840d1ba665SWarner Losh #define PXE_DELAY_MILLISECOND 1000 10850d1ba665SWarner Losh #define PXE_DELAY_SECOND 1000000 10860d1ba665SWarner Losh #define PXE_IO_READ 0 10870d1ba665SWarner Losh #define PXE_IO_WRITE 1 10880d1ba665SWarner Losh #define PXE_MEM_READ 2 10890d1ba665SWarner Losh #define PXE_MEM_WRITE 4 10900d1ba665SWarner Losh 10910d1ba665SWarner Losh typedef struct s_pxe_db_get_init_info { 10920d1ba665SWarner Losh /// 10930d1ba665SWarner Losh /// Minimum length of locked memory buffer that must be given to 10940d1ba665SWarner Losh /// the Initialize command. Giving UNDI more memory will generally 10950d1ba665SWarner Losh /// give better performance. 10960d1ba665SWarner Losh /// 10970d1ba665SWarner Losh /// If MemoryRequired is zero, the UNDI does not need and will not 10980d1ba665SWarner Losh /// use system memory to receive and transmit packets. 10990d1ba665SWarner Losh /// 11000d1ba665SWarner Losh PXE_UINT32 MemoryRequired; 11010d1ba665SWarner Losh 11020d1ba665SWarner Losh /// 11030d1ba665SWarner Losh /// Maximum frame data length for Tx/Rx excluding the media header. 11040d1ba665SWarner Losh /// 11050d1ba665SWarner Losh PXE_UINT32 FrameDataLen; 11060d1ba665SWarner Losh 11070d1ba665SWarner Losh /// 11080d1ba665SWarner Losh /// Supported link speeds are in units of mega bits. Common ethernet 11090d1ba665SWarner Losh /// values are 10, 100 and 1000. Unused LinkSpeeds[] entries are zero 11100d1ba665SWarner Losh /// filled. 11110d1ba665SWarner Losh /// 11120d1ba665SWarner Losh PXE_UINT32 LinkSpeeds[4]; 11130d1ba665SWarner Losh 11140d1ba665SWarner Losh /// 11150d1ba665SWarner Losh /// Number of non-volatile storage items. 11160d1ba665SWarner Losh /// 11170d1ba665SWarner Losh PXE_UINT32 NvCount; 11180d1ba665SWarner Losh 11190d1ba665SWarner Losh /// 11200d1ba665SWarner Losh /// Width of non-volatile storage item in bytes. 0, 1, 2 or 4 11210d1ba665SWarner Losh /// 11220d1ba665SWarner Losh PXE_UINT16 NvWidth; 11230d1ba665SWarner Losh 11240d1ba665SWarner Losh /// 11250d1ba665SWarner Losh /// Media header length. This is the typical media header length for 11260d1ba665SWarner Losh /// this UNDI. This information is needed when allocating receive 11270d1ba665SWarner Losh /// and transmit buffers. 11280d1ba665SWarner Losh /// 11290d1ba665SWarner Losh PXE_UINT16 MediaHeaderLen; 11300d1ba665SWarner Losh 11310d1ba665SWarner Losh /// 11320d1ba665SWarner Losh /// Number of bytes in the NIC hardware (MAC) address. 11330d1ba665SWarner Losh /// 11340d1ba665SWarner Losh PXE_UINT16 HWaddrLen; 11350d1ba665SWarner Losh 11360d1ba665SWarner Losh /// 11370d1ba665SWarner Losh /// Maximum number of multicast MAC addresses in the multicast 11380d1ba665SWarner Losh /// MAC address filter list. 11390d1ba665SWarner Losh /// 11400d1ba665SWarner Losh PXE_UINT16 MCastFilterCnt; 11410d1ba665SWarner Losh 11420d1ba665SWarner Losh /// 11430d1ba665SWarner Losh /// Default number and size of transmit and receive buffers that will 11440d1ba665SWarner Losh /// be allocated by the UNDI. If MemoryRequired is non-zero, this 11450d1ba665SWarner Losh /// allocation will come out of the memory buffer given to the Initialize 11460d1ba665SWarner Losh /// command. If MemoryRequired is zero, this allocation will come out of 11470d1ba665SWarner Losh /// memory on the NIC. 11480d1ba665SWarner Losh /// 11490d1ba665SWarner Losh PXE_UINT16 TxBufCnt; 11500d1ba665SWarner Losh PXE_UINT16 TxBufSize; 11510d1ba665SWarner Losh PXE_UINT16 RxBufCnt; 11520d1ba665SWarner Losh PXE_UINT16 RxBufSize; 11530d1ba665SWarner Losh 11540d1ba665SWarner Losh /// 11550d1ba665SWarner Losh /// Hardware interface types defined in the Assigned Numbers RFC 11560d1ba665SWarner Losh /// and used in DHCP and ARP packets. 11570d1ba665SWarner Losh /// See the PXE_IFTYPE typedef and PXE_IFTYPE_xxx macros. 11580d1ba665SWarner Losh /// 11590d1ba665SWarner Losh PXE_UINT8 IFtype; 11600d1ba665SWarner Losh 11610d1ba665SWarner Losh /// 11620d1ba665SWarner Losh /// Supported duplex. See PXE_DUPLEX_xxxxx #defines below. 11630d1ba665SWarner Losh /// 11640d1ba665SWarner Losh PXE_UINT8 SupportedDuplexModes; 11650d1ba665SWarner Losh 11660d1ba665SWarner Losh /// 11670d1ba665SWarner Losh /// Supported loopback options. See PXE_LOOPBACK_xxxxx #defines below. 11680d1ba665SWarner Losh /// 11690d1ba665SWarner Losh PXE_UINT8 SupportedLoopBackModes; 11700d1ba665SWarner Losh } PXE_DB_GET_INIT_INFO; 11710d1ba665SWarner Losh 11720d1ba665SWarner Losh #define PXE_MAX_TXRX_UNIT_ETHER 1500 11730d1ba665SWarner Losh 11740d1ba665SWarner Losh #define PXE_HWADDR_LEN_ETHER 0x0006 11750d1ba665SWarner Losh #define PXE_MAC_HEADER_LEN_ETHER 0x000E 11760d1ba665SWarner Losh 11770d1ba665SWarner Losh #define PXE_DUPLEX_ENABLE_FULL_SUPPORTED 1 11780d1ba665SWarner Losh #define PXE_DUPLEX_FORCE_FULL_SUPPORTED 2 11790d1ba665SWarner Losh 11800d1ba665SWarner Losh #define PXE_LOOPBACK_INTERNAL_SUPPORTED 1 11810d1ba665SWarner Losh #define PXE_LOOPBACK_EXTERNAL_SUPPORTED 2 11820d1ba665SWarner Losh 11830d1ba665SWarner Losh typedef struct s_pxe_pci_config_info { 11840d1ba665SWarner Losh /// 11850d1ba665SWarner Losh /// This is the flag field for the PXE_DB_GET_CONFIG_INFO union. 11860d1ba665SWarner Losh /// For PCI bus devices, this field is set to PXE_BUSTYPE_PCI. 11870d1ba665SWarner Losh /// 11880d1ba665SWarner Losh UINT32 BusType; 11890d1ba665SWarner Losh 11900d1ba665SWarner Losh /// 11910d1ba665SWarner Losh /// This identifies the PCI network device that this UNDI interface. 11920d1ba665SWarner Losh /// is bound to. 11930d1ba665SWarner Losh /// 11940d1ba665SWarner Losh UINT16 Bus; 11950d1ba665SWarner Losh UINT8 Device; 11960d1ba665SWarner Losh UINT8 Function; 11970d1ba665SWarner Losh 11980d1ba665SWarner Losh /// 11990d1ba665SWarner Losh /// This is a copy of the PCI configuration space for this 12000d1ba665SWarner Losh /// network device. 12010d1ba665SWarner Losh /// 12020d1ba665SWarner Losh union { 12030d1ba665SWarner Losh UINT8 Byte[256]; 12040d1ba665SWarner Losh UINT16 Word[128]; 12050d1ba665SWarner Losh UINT32 Dword[64]; 12060d1ba665SWarner Losh } Config; 12070d1ba665SWarner Losh } PXE_PCI_CONFIG_INFO; 12080d1ba665SWarner Losh 12090d1ba665SWarner Losh typedef struct s_pxe_pcc_config_info { 12100d1ba665SWarner Losh /// 12110d1ba665SWarner Losh /// This is the flag field for the PXE_DB_GET_CONFIG_INFO union. 12120d1ba665SWarner Losh /// For PCC bus devices, this field is set to PXE_BUSTYPE_PCC. 12130d1ba665SWarner Losh /// 12140d1ba665SWarner Losh PXE_UINT32 BusType; 12150d1ba665SWarner Losh 12160d1ba665SWarner Losh /// 12170d1ba665SWarner Losh /// This identifies the PCC network device that this UNDI interface 12180d1ba665SWarner Losh /// is bound to. 12190d1ba665SWarner Losh /// 12200d1ba665SWarner Losh PXE_UINT16 Bus; 12210d1ba665SWarner Losh PXE_UINT8 Device; 12220d1ba665SWarner Losh PXE_UINT8 Function; 12230d1ba665SWarner Losh 12240d1ba665SWarner Losh /// 12250d1ba665SWarner Losh /// This is a copy of the PCC configuration space for this 12260d1ba665SWarner Losh /// network device. 12270d1ba665SWarner Losh /// 12280d1ba665SWarner Losh union { 12290d1ba665SWarner Losh PXE_UINT8 Byte[256]; 12300d1ba665SWarner Losh PXE_UINT16 Word[128]; 12310d1ba665SWarner Losh PXE_UINT32 Dword[64]; 12320d1ba665SWarner Losh } Config; 12330d1ba665SWarner Losh } PXE_PCC_CONFIG_INFO; 12340d1ba665SWarner Losh 12350d1ba665SWarner Losh typedef union u_pxe_db_get_config_info { 12360d1ba665SWarner Losh PXE_PCI_CONFIG_INFO pci; 12370d1ba665SWarner Losh PXE_PCC_CONFIG_INFO pcc; 12380d1ba665SWarner Losh } PXE_DB_GET_CONFIG_INFO; 12390d1ba665SWarner Losh 12400d1ba665SWarner Losh typedef struct s_pxe_cpb_initialize { 12410d1ba665SWarner Losh /// 12420d1ba665SWarner Losh /// Address of first (lowest) byte of the memory buffer. This buffer must 12430d1ba665SWarner Losh /// be in contiguous physical memory and cannot be swapped out. The UNDI 12440d1ba665SWarner Losh /// will be using this for transmit and receive buffering. 12450d1ba665SWarner Losh /// 12460d1ba665SWarner Losh PXE_UINT64 MemoryAddr; 12470d1ba665SWarner Losh 12480d1ba665SWarner Losh /// 12490d1ba665SWarner Losh /// MemoryLength must be greater than or equal to MemoryRequired 12500d1ba665SWarner Losh /// returned by the Get Init Info command. 12510d1ba665SWarner Losh /// 12520d1ba665SWarner Losh PXE_UINT32 MemoryLength; 12530d1ba665SWarner Losh 12540d1ba665SWarner Losh /// 12550d1ba665SWarner Losh /// Desired link speed in Mbit/sec. Common ethernet values are 10, 100 12560d1ba665SWarner Losh /// and 1000. Setting a value of zero will auto-detect and/or use the 12570d1ba665SWarner Losh /// default link speed (operation depends on UNDI/NIC functionality). 12580d1ba665SWarner Losh /// 12590d1ba665SWarner Losh PXE_UINT32 LinkSpeed; 12600d1ba665SWarner Losh 12610d1ba665SWarner Losh /// 12620d1ba665SWarner Losh /// Suggested number and size of receive and transmit buffers to 12630d1ba665SWarner Losh /// allocate. If MemoryAddr and MemoryLength are non-zero, this 12640d1ba665SWarner Losh /// allocation comes out of the supplied memory buffer. If MemoryAddr 12650d1ba665SWarner Losh /// and MemoryLength are zero, this allocation comes out of memory 12660d1ba665SWarner Losh /// on the NIC. 12670d1ba665SWarner Losh /// 12680d1ba665SWarner Losh /// If these fields are set to zero, the UNDI will allocate buffer 12690d1ba665SWarner Losh /// counts and sizes as it sees fit. 12700d1ba665SWarner Losh /// 12710d1ba665SWarner Losh PXE_UINT16 TxBufCnt; 12720d1ba665SWarner Losh PXE_UINT16 TxBufSize; 12730d1ba665SWarner Losh PXE_UINT16 RxBufCnt; 12740d1ba665SWarner Losh PXE_UINT16 RxBufSize; 12750d1ba665SWarner Losh 12760d1ba665SWarner Losh /// 12770d1ba665SWarner Losh /// The following configuration parameters are optional and must be zero 12780d1ba665SWarner Losh /// to use the default values. 12790d1ba665SWarner Losh /// 12800d1ba665SWarner Losh PXE_UINT8 DuplexMode; 12810d1ba665SWarner Losh 12820d1ba665SWarner Losh PXE_UINT8 LoopBackMode; 12830d1ba665SWarner Losh } PXE_CPB_INITIALIZE; 12840d1ba665SWarner Losh 12850d1ba665SWarner Losh #define PXE_DUPLEX_DEFAULT 0x00 12860d1ba665SWarner Losh #define PXE_FORCE_FULL_DUPLEX 0x01 12870d1ba665SWarner Losh #define PXE_ENABLE_FULL_DUPLEX 0x02 12880d1ba665SWarner Losh #define PXE_FORCE_HALF_DUPLEX 0x04 12890d1ba665SWarner Losh #define PXE_DISABLE_FULL_DUPLEX 0x08 12900d1ba665SWarner Losh 12910d1ba665SWarner Losh #define LOOPBACK_NORMAL 0 12920d1ba665SWarner Losh #define LOOPBACK_INTERNAL 1 12930d1ba665SWarner Losh #define LOOPBACK_EXTERNAL 2 12940d1ba665SWarner Losh 12950d1ba665SWarner Losh typedef struct s_pxe_db_initialize { 12960d1ba665SWarner Losh /// 12970d1ba665SWarner Losh /// Actual amount of memory used from the supplied memory buffer. This 12980d1ba665SWarner Losh /// may be less that the amount of memory suppllied and may be zero if 12990d1ba665SWarner Losh /// the UNDI and network device do not use external memory buffers. 13000d1ba665SWarner Losh /// 13010d1ba665SWarner Losh /// Memory used by the UNDI and network device is allocated from the 13020d1ba665SWarner Losh /// lowest memory buffer address. 13030d1ba665SWarner Losh /// 13040d1ba665SWarner Losh PXE_UINT32 MemoryUsed; 13050d1ba665SWarner Losh 13060d1ba665SWarner Losh /// 13070d1ba665SWarner Losh /// Actual number and size of receive and transmit buffers that were 13080d1ba665SWarner Losh /// allocated. 13090d1ba665SWarner Losh /// 13100d1ba665SWarner Losh PXE_UINT16 TxBufCnt; 13110d1ba665SWarner Losh PXE_UINT16 TxBufSize; 13120d1ba665SWarner Losh PXE_UINT16 RxBufCnt; 13130d1ba665SWarner Losh PXE_UINT16 RxBufSize; 13140d1ba665SWarner Losh } PXE_DB_INITIALIZE; 13150d1ba665SWarner Losh 13160d1ba665SWarner Losh typedef struct s_pxe_cpb_receive_filters { 13170d1ba665SWarner Losh /// 13180d1ba665SWarner Losh /// List of multicast MAC addresses. This list, if present, will 13190d1ba665SWarner Losh /// replace the existing multicast MAC address filter list. 13200d1ba665SWarner Losh /// 13210d1ba665SWarner Losh PXE_MAC_ADDR MCastList[MAX_MCAST_ADDRESS_CNT]; 13220d1ba665SWarner Losh } PXE_CPB_RECEIVE_FILTERS; 13230d1ba665SWarner Losh 13240d1ba665SWarner Losh typedef struct s_pxe_db_receive_filters { 13250d1ba665SWarner Losh /// 13260d1ba665SWarner Losh /// Filtered multicast MAC address list. 13270d1ba665SWarner Losh /// 13280d1ba665SWarner Losh PXE_MAC_ADDR MCastList[MAX_MCAST_ADDRESS_CNT]; 13290d1ba665SWarner Losh } PXE_DB_RECEIVE_FILTERS; 13300d1ba665SWarner Losh 13310d1ba665SWarner Losh typedef struct s_pxe_cpb_station_address { 13320d1ba665SWarner Losh /// 13330d1ba665SWarner Losh /// If supplied and supported, the current station MAC address 13340d1ba665SWarner Losh /// will be changed. 13350d1ba665SWarner Losh /// 13360d1ba665SWarner Losh PXE_MAC_ADDR StationAddr; 13370d1ba665SWarner Losh } PXE_CPB_STATION_ADDRESS; 13380d1ba665SWarner Losh 13390d1ba665SWarner Losh typedef struct s_pxe_dpb_station_address { 13400d1ba665SWarner Losh /// 13410d1ba665SWarner Losh /// Current station MAC address. 13420d1ba665SWarner Losh /// 13430d1ba665SWarner Losh PXE_MAC_ADDR StationAddr; 13440d1ba665SWarner Losh 13450d1ba665SWarner Losh /// 13460d1ba665SWarner Losh /// Station broadcast MAC address. 13470d1ba665SWarner Losh /// 13480d1ba665SWarner Losh PXE_MAC_ADDR BroadcastAddr; 13490d1ba665SWarner Losh 13500d1ba665SWarner Losh /// 13510d1ba665SWarner Losh /// Permanent station MAC address. 13520d1ba665SWarner Losh /// 13530d1ba665SWarner Losh PXE_MAC_ADDR PermanentAddr; 13540d1ba665SWarner Losh } PXE_DB_STATION_ADDRESS; 13550d1ba665SWarner Losh 13560d1ba665SWarner Losh typedef struct s_pxe_db_statistics { 13570d1ba665SWarner Losh /// 13580d1ba665SWarner Losh /// Bit field identifying what statistic data is collected by the 13590d1ba665SWarner Losh /// UNDI/NIC. 13600d1ba665SWarner Losh /// If bit 0x00 is set, Data[0x00] is collected. 13610d1ba665SWarner Losh /// If bit 0x01 is set, Data[0x01] is collected. 13620d1ba665SWarner Losh /// If bit 0x20 is set, Data[0x20] is collected. 13630d1ba665SWarner Losh /// If bit 0x21 is set, Data[0x21] is collected. 13640d1ba665SWarner Losh /// Etc. 13650d1ba665SWarner Losh /// 13660d1ba665SWarner Losh PXE_UINT64 Supported; 13670d1ba665SWarner Losh 13680d1ba665SWarner Losh /// 13690d1ba665SWarner Losh /// Statistic data. 13700d1ba665SWarner Losh /// 13710d1ba665SWarner Losh PXE_UINT64 Data[64]; 13720d1ba665SWarner Losh } PXE_DB_STATISTICS; 13730d1ba665SWarner Losh 13740d1ba665SWarner Losh /// 13750d1ba665SWarner Losh /// Total number of frames received. Includes frames with errors and 13760d1ba665SWarner Losh /// dropped frames. 13770d1ba665SWarner Losh /// 13780d1ba665SWarner Losh #define PXE_STATISTICS_RX_TOTAL_FRAMES 0x00 13790d1ba665SWarner Losh 13800d1ba665SWarner Losh /// 13810d1ba665SWarner Losh /// Number of valid frames received and copied into receive buffers. 13820d1ba665SWarner Losh /// 13830d1ba665SWarner Losh #define PXE_STATISTICS_RX_GOOD_FRAMES 0x01 13840d1ba665SWarner Losh 13850d1ba665SWarner Losh /// 13860d1ba665SWarner Losh /// Number of frames below the minimum length for the media. 13870d1ba665SWarner Losh /// This would be <64 for ethernet. 13880d1ba665SWarner Losh /// 13890d1ba665SWarner Losh #define PXE_STATISTICS_RX_UNDERSIZE_FRAMES 0x02 13900d1ba665SWarner Losh 13910d1ba665SWarner Losh /// 13920d1ba665SWarner Losh /// Number of frames longer than the maxminum length for the 13930d1ba665SWarner Losh /// media. This would be >1500 for ethernet. 13940d1ba665SWarner Losh /// 13950d1ba665SWarner Losh #define PXE_STATISTICS_RX_OVERSIZE_FRAMES 0x03 13960d1ba665SWarner Losh 13970d1ba665SWarner Losh /// 13980d1ba665SWarner Losh /// Valid frames that were dropped because receive buffers were full. 13990d1ba665SWarner Losh /// 14000d1ba665SWarner Losh #define PXE_STATISTICS_RX_DROPPED_FRAMES 0x04 14010d1ba665SWarner Losh 14020d1ba665SWarner Losh /// 14030d1ba665SWarner Losh /// Number of valid unicast frames received and not dropped. 14040d1ba665SWarner Losh /// 14050d1ba665SWarner Losh #define PXE_STATISTICS_RX_UNICAST_FRAMES 0x05 14060d1ba665SWarner Losh 14070d1ba665SWarner Losh /// 14080d1ba665SWarner Losh /// Number of valid broadcast frames received and not dropped. 14090d1ba665SWarner Losh /// 14100d1ba665SWarner Losh #define PXE_STATISTICS_RX_BROADCAST_FRAMES 0x06 14110d1ba665SWarner Losh 14120d1ba665SWarner Losh /// 14130d1ba665SWarner Losh /// Number of valid mutlicast frames received and not dropped. 14140d1ba665SWarner Losh /// 14150d1ba665SWarner Losh #define PXE_STATISTICS_RX_MULTICAST_FRAMES 0x07 14160d1ba665SWarner Losh 14170d1ba665SWarner Losh /// 14180d1ba665SWarner Losh /// Number of frames w/ CRC or alignment errors. 14190d1ba665SWarner Losh /// 14200d1ba665SWarner Losh #define PXE_STATISTICS_RX_CRC_ERROR_FRAMES 0x08 14210d1ba665SWarner Losh 14220d1ba665SWarner Losh /// 14230d1ba665SWarner Losh /// Total number of bytes received. Includes frames with errors 14240d1ba665SWarner Losh /// and dropped frames. 14250d1ba665SWarner Losh /// 14260d1ba665SWarner Losh #define PXE_STATISTICS_RX_TOTAL_BYTES 0x09 14270d1ba665SWarner Losh 14280d1ba665SWarner Losh /// 14290d1ba665SWarner Losh /// Transmit statistics. 14300d1ba665SWarner Losh /// 14310d1ba665SWarner Losh #define PXE_STATISTICS_TX_TOTAL_FRAMES 0x0A 14320d1ba665SWarner Losh #define PXE_STATISTICS_TX_GOOD_FRAMES 0x0B 14330d1ba665SWarner Losh #define PXE_STATISTICS_TX_UNDERSIZE_FRAMES 0x0C 14340d1ba665SWarner Losh #define PXE_STATISTICS_TX_OVERSIZE_FRAMES 0x0D 14350d1ba665SWarner Losh #define PXE_STATISTICS_TX_DROPPED_FRAMES 0x0E 14360d1ba665SWarner Losh #define PXE_STATISTICS_TX_UNICAST_FRAMES 0x0F 14370d1ba665SWarner Losh #define PXE_STATISTICS_TX_BROADCAST_FRAMES 0x10 14380d1ba665SWarner Losh #define PXE_STATISTICS_TX_MULTICAST_FRAMES 0x11 14390d1ba665SWarner Losh #define PXE_STATISTICS_TX_CRC_ERROR_FRAMES 0x12 14400d1ba665SWarner Losh #define PXE_STATISTICS_TX_TOTAL_BYTES 0x13 14410d1ba665SWarner Losh 14420d1ba665SWarner Losh /// 14430d1ba665SWarner Losh /// Number of collisions detection on this subnet. 14440d1ba665SWarner Losh /// 14450d1ba665SWarner Losh #define PXE_STATISTICS_COLLISIONS 0x14 14460d1ba665SWarner Losh 14470d1ba665SWarner Losh /// 14480d1ba665SWarner Losh /// Number of frames destined for unsupported protocol. 14490d1ba665SWarner Losh /// 14500d1ba665SWarner Losh #define PXE_STATISTICS_UNSUPPORTED_PROTOCOL 0x15 14510d1ba665SWarner Losh 14520d1ba665SWarner Losh /// 14530d1ba665SWarner Losh /// Number of valid frames received that were duplicated. 14540d1ba665SWarner Losh /// 14550d1ba665SWarner Losh #define PXE_STATISTICS_RX_DUPLICATED_FRAMES 0x16 14560d1ba665SWarner Losh 14570d1ba665SWarner Losh /// 14580d1ba665SWarner Losh /// Number of encrypted frames received that failed to decrypt. 14590d1ba665SWarner Losh /// 14600d1ba665SWarner Losh #define PXE_STATISTICS_RX_DECRYPT_ERROR_FRAMES 0x17 14610d1ba665SWarner Losh 14620d1ba665SWarner Losh /// 14630d1ba665SWarner Losh /// Number of frames that failed to transmit after exceeding the retry limit. 14640d1ba665SWarner Losh /// 14650d1ba665SWarner Losh #define PXE_STATISTICS_TX_ERROR_FRAMES 0x18 14660d1ba665SWarner Losh 14670d1ba665SWarner Losh /// 14680d1ba665SWarner Losh /// Number of frames transmitted successfully after more than one attempt. 14690d1ba665SWarner Losh /// 14700d1ba665SWarner Losh #define PXE_STATISTICS_TX_RETRY_FRAMES 0x19 14710d1ba665SWarner Losh 14720d1ba665SWarner Losh typedef struct s_pxe_cpb_mcast_ip_to_mac { 14730d1ba665SWarner Losh /// 14740d1ba665SWarner Losh /// Multicast IP address to be converted to multicast MAC address. 14750d1ba665SWarner Losh /// 14760d1ba665SWarner Losh PXE_IP_ADDR IP; 14770d1ba665SWarner Losh } PXE_CPB_MCAST_IP_TO_MAC; 14780d1ba665SWarner Losh 14790d1ba665SWarner Losh typedef struct s_pxe_db_mcast_ip_to_mac { 14800d1ba665SWarner Losh /// 14810d1ba665SWarner Losh /// Multicast MAC address. 14820d1ba665SWarner Losh /// 14830d1ba665SWarner Losh PXE_MAC_ADDR MAC; 14840d1ba665SWarner Losh } PXE_DB_MCAST_IP_TO_MAC; 14850d1ba665SWarner Losh 14860d1ba665SWarner Losh typedef struct s_pxe_cpb_nvdata_sparse { 14870d1ba665SWarner Losh /// 14880d1ba665SWarner Losh /// NvData item list. Only items in this list will be updated. 14890d1ba665SWarner Losh /// 14900d1ba665SWarner Losh struct { 14910d1ba665SWarner Losh /// 14920d1ba665SWarner Losh /// Non-volatile storage address to be changed. 14930d1ba665SWarner Losh /// 14940d1ba665SWarner Losh PXE_UINT32 Addr; 14950d1ba665SWarner Losh 14960d1ba665SWarner Losh /// 14970d1ba665SWarner Losh /// Data item to write into above storage address. 14980d1ba665SWarner Losh /// 14990d1ba665SWarner Losh union { 15000d1ba665SWarner Losh PXE_UINT8 Byte; 15010d1ba665SWarner Losh PXE_UINT16 Word; 15020d1ba665SWarner Losh PXE_UINT32 Dword; 15030d1ba665SWarner Losh } Data; 15040d1ba665SWarner Losh } Item[MAX_EEPROM_LEN]; 15050d1ba665SWarner Losh } PXE_CPB_NVDATA_SPARSE; 15060d1ba665SWarner Losh 15070d1ba665SWarner Losh /// 15080d1ba665SWarner Losh /// When using bulk update, the size of the CPB structure must be 15090d1ba665SWarner Losh /// the same size as the non-volatile NIC storage. 15100d1ba665SWarner Losh /// 15110d1ba665SWarner Losh typedef union u_pxe_cpb_nvdata_bulk { 15120d1ba665SWarner Losh /// 15130d1ba665SWarner Losh /// Array of byte-wide data items. 15140d1ba665SWarner Losh /// 15150d1ba665SWarner Losh PXE_UINT8 Byte[MAX_EEPROM_LEN << 2]; 15160d1ba665SWarner Losh 15170d1ba665SWarner Losh /// 15180d1ba665SWarner Losh /// Array of word-wide data items. 15190d1ba665SWarner Losh /// 15200d1ba665SWarner Losh PXE_UINT16 Word[MAX_EEPROM_LEN << 1]; 15210d1ba665SWarner Losh 15220d1ba665SWarner Losh /// 15230d1ba665SWarner Losh /// Array of dword-wide data items. 15240d1ba665SWarner Losh /// 15250d1ba665SWarner Losh PXE_UINT32 Dword[MAX_EEPROM_LEN]; 15260d1ba665SWarner Losh } PXE_CPB_NVDATA_BULK; 15270d1ba665SWarner Losh 15280d1ba665SWarner Losh typedef struct s_pxe_db_nvdata { 15290d1ba665SWarner Losh /// 15300d1ba665SWarner Losh /// Arrays of data items from non-volatile storage. 15310d1ba665SWarner Losh /// 15320d1ba665SWarner Losh union { 15330d1ba665SWarner Losh /// 15340d1ba665SWarner Losh /// Array of byte-wide data items. 15350d1ba665SWarner Losh /// 15360d1ba665SWarner Losh PXE_UINT8 Byte[MAX_EEPROM_LEN << 2]; 15370d1ba665SWarner Losh 15380d1ba665SWarner Losh /// 15390d1ba665SWarner Losh /// Array of word-wide data items. 15400d1ba665SWarner Losh /// 15410d1ba665SWarner Losh PXE_UINT16 Word[MAX_EEPROM_LEN << 1]; 15420d1ba665SWarner Losh 15430d1ba665SWarner Losh /// 15440d1ba665SWarner Losh /// Array of dword-wide data items. 15450d1ba665SWarner Losh /// 15460d1ba665SWarner Losh PXE_UINT32 Dword[MAX_EEPROM_LEN]; 15470d1ba665SWarner Losh } Data; 15480d1ba665SWarner Losh } PXE_DB_NVDATA; 15490d1ba665SWarner Losh 15500d1ba665SWarner Losh typedef struct s_pxe_db_get_status { 15510d1ba665SWarner Losh /// 15520d1ba665SWarner Losh /// Length of next receive frame (header + data). If this is zero, 15530d1ba665SWarner Losh /// there is no next receive frame available. 15540d1ba665SWarner Losh /// 15550d1ba665SWarner Losh PXE_UINT32 RxFrameLen; 15560d1ba665SWarner Losh 15570d1ba665SWarner Losh /// 15580d1ba665SWarner Losh /// Reserved, set to zero. 15590d1ba665SWarner Losh /// 15600d1ba665SWarner Losh PXE_UINT32 reserved; 15610d1ba665SWarner Losh 15620d1ba665SWarner Losh /// 15630d1ba665SWarner Losh /// Addresses of transmitted buffers that need to be recycled. 15640d1ba665SWarner Losh /// 15650d1ba665SWarner Losh PXE_UINT64 TxBuffer[MAX_XMIT_BUFFERS]; 15660d1ba665SWarner Losh } PXE_DB_GET_STATUS; 15670d1ba665SWarner Losh 15680d1ba665SWarner Losh typedef struct s_pxe_cpb_fill_header { 15690d1ba665SWarner Losh /// 15700d1ba665SWarner Losh /// Source and destination MAC addresses. These will be copied into 15710d1ba665SWarner Losh /// the media header without doing byte swapping. 15720d1ba665SWarner Losh /// 15730d1ba665SWarner Losh PXE_MAC_ADDR SrcAddr; 15740d1ba665SWarner Losh PXE_MAC_ADDR DestAddr; 15750d1ba665SWarner Losh 15760d1ba665SWarner Losh /// 15770d1ba665SWarner Losh /// Address of first byte of media header. The first byte of packet data 15780d1ba665SWarner Losh /// follows the last byte of the media header. 15790d1ba665SWarner Losh /// 15800d1ba665SWarner Losh PXE_UINT64 MediaHeader; 15810d1ba665SWarner Losh 15820d1ba665SWarner Losh /// 15830d1ba665SWarner Losh /// Length of packet data in bytes (not including the media header). 15840d1ba665SWarner Losh /// 15850d1ba665SWarner Losh PXE_UINT32 PacketLen; 15860d1ba665SWarner Losh 15870d1ba665SWarner Losh /// 15880d1ba665SWarner Losh /// Protocol type. This will be copied into the media header without 15890d1ba665SWarner Losh /// doing byte swapping. Protocol type numbers can be obtained from 15900d1ba665SWarner Losh /// the Assigned Numbers RFC 1700. 15910d1ba665SWarner Losh /// 15920d1ba665SWarner Losh PXE_UINT16 Protocol; 15930d1ba665SWarner Losh 15940d1ba665SWarner Losh /// 15950d1ba665SWarner Losh /// Length of the media header in bytes. 15960d1ba665SWarner Losh /// 15970d1ba665SWarner Losh PXE_UINT16 MediaHeaderLen; 15980d1ba665SWarner Losh } PXE_CPB_FILL_HEADER; 15990d1ba665SWarner Losh 16000d1ba665SWarner Losh #define PXE_PROTOCOL_ETHERNET_IP 0x0800 16010d1ba665SWarner Losh #define PXE_PROTOCOL_ETHERNET_ARP 0x0806 16020d1ba665SWarner Losh #define MAX_XMIT_FRAGMENTS 16 16030d1ba665SWarner Losh 16040d1ba665SWarner Losh typedef struct s_pxe_cpb_fill_header_fragmented { 16050d1ba665SWarner Losh /// 16060d1ba665SWarner Losh /// Source and destination MAC addresses. These will be copied into 16070d1ba665SWarner Losh /// the media header without doing byte swapping. 16080d1ba665SWarner Losh /// 16090d1ba665SWarner Losh PXE_MAC_ADDR SrcAddr; 16100d1ba665SWarner Losh PXE_MAC_ADDR DestAddr; 16110d1ba665SWarner Losh 16120d1ba665SWarner Losh /// 16130d1ba665SWarner Losh /// Length of packet data in bytes (not including the media header). 16140d1ba665SWarner Losh /// 16150d1ba665SWarner Losh PXE_UINT32 PacketLen; 16160d1ba665SWarner Losh 16170d1ba665SWarner Losh /// 16180d1ba665SWarner Losh /// Protocol type. This will be copied into the media header without 16190d1ba665SWarner Losh /// doing byte swapping. Protocol type numbers can be obtained from 16200d1ba665SWarner Losh /// the Assigned Numbers RFC 1700. 16210d1ba665SWarner Losh /// 16220d1ba665SWarner Losh PXE_MEDIA_PROTOCOL Protocol; 16230d1ba665SWarner Losh 16240d1ba665SWarner Losh /// 16250d1ba665SWarner Losh /// Length of the media header in bytes. 16260d1ba665SWarner Losh /// 16270d1ba665SWarner Losh PXE_UINT16 MediaHeaderLen; 16280d1ba665SWarner Losh 16290d1ba665SWarner Losh /// 16300d1ba665SWarner Losh /// Number of packet fragment descriptors. 16310d1ba665SWarner Losh /// 16320d1ba665SWarner Losh PXE_UINT16 FragCnt; 16330d1ba665SWarner Losh 16340d1ba665SWarner Losh /// 16350d1ba665SWarner Losh /// Reserved, must be set to zero. 16360d1ba665SWarner Losh /// 16370d1ba665SWarner Losh PXE_UINT16 reserved; 16380d1ba665SWarner Losh 16390d1ba665SWarner Losh /// 16400d1ba665SWarner Losh /// Array of packet fragment descriptors. The first byte of the media 16410d1ba665SWarner Losh /// header is the first byte of the first fragment. 16420d1ba665SWarner Losh /// 16430d1ba665SWarner Losh struct { 16440d1ba665SWarner Losh /// 16450d1ba665SWarner Losh /// Address of this packet fragment. 16460d1ba665SWarner Losh /// 16470d1ba665SWarner Losh PXE_UINT64 FragAddr; 16480d1ba665SWarner Losh 16490d1ba665SWarner Losh /// 16500d1ba665SWarner Losh /// Length of this packet fragment. 16510d1ba665SWarner Losh /// 16520d1ba665SWarner Losh PXE_UINT32 FragLen; 16530d1ba665SWarner Losh 16540d1ba665SWarner Losh /// 16550d1ba665SWarner Losh /// Reserved, must be set to zero. 16560d1ba665SWarner Losh /// 16570d1ba665SWarner Losh PXE_UINT32 reserved; 16580d1ba665SWarner Losh } FragDesc[MAX_XMIT_FRAGMENTS]; 1659*580fcf64SWarner Losh } PXE_CPB_FILL_HEADER_FRAGMENTED; 16600d1ba665SWarner Losh 16610d1ba665SWarner Losh typedef struct s_pxe_cpb_transmit { 16620d1ba665SWarner Losh /// 16630d1ba665SWarner Losh /// Address of first byte of frame buffer. This is also the first byte 16640d1ba665SWarner Losh /// of the media header. 16650d1ba665SWarner Losh /// 16660d1ba665SWarner Losh PXE_UINT64 FrameAddr; 16670d1ba665SWarner Losh 16680d1ba665SWarner Losh /// 16690d1ba665SWarner Losh /// Length of the data portion of the frame buffer in bytes. Do not 16700d1ba665SWarner Losh /// include the length of the media header. 16710d1ba665SWarner Losh /// 16720d1ba665SWarner Losh PXE_UINT32 DataLen; 16730d1ba665SWarner Losh 16740d1ba665SWarner Losh /// 16750d1ba665SWarner Losh /// Length of the media header in bytes. 16760d1ba665SWarner Losh /// 16770d1ba665SWarner Losh PXE_UINT16 MediaheaderLen; 16780d1ba665SWarner Losh 16790d1ba665SWarner Losh /// 16800d1ba665SWarner Losh /// Reserved, must be zero. 16810d1ba665SWarner Losh /// 16820d1ba665SWarner Losh PXE_UINT16 reserved; 16830d1ba665SWarner Losh } PXE_CPB_TRANSMIT; 16840d1ba665SWarner Losh 16850d1ba665SWarner Losh typedef struct s_pxe_cpb_transmit_fragments { 16860d1ba665SWarner Losh /// 16870d1ba665SWarner Losh /// Length of packet data in bytes (not including the media header). 16880d1ba665SWarner Losh /// 16890d1ba665SWarner Losh PXE_UINT32 FrameLen; 16900d1ba665SWarner Losh 16910d1ba665SWarner Losh /// 16920d1ba665SWarner Losh /// Length of the media header in bytes. 16930d1ba665SWarner Losh /// 16940d1ba665SWarner Losh PXE_UINT16 MediaheaderLen; 16950d1ba665SWarner Losh 16960d1ba665SWarner Losh /// 16970d1ba665SWarner Losh /// Number of packet fragment descriptors. 16980d1ba665SWarner Losh /// 16990d1ba665SWarner Losh PXE_UINT16 FragCnt; 17000d1ba665SWarner Losh 17010d1ba665SWarner Losh /// 17020d1ba665SWarner Losh /// Array of frame fragment descriptors. The first byte of the first 17030d1ba665SWarner Losh /// fragment is also the first byte of the media header. 17040d1ba665SWarner Losh /// 17050d1ba665SWarner Losh struct { 17060d1ba665SWarner Losh /// 17070d1ba665SWarner Losh /// Address of this frame fragment. 17080d1ba665SWarner Losh /// 17090d1ba665SWarner Losh PXE_UINT64 FragAddr; 17100d1ba665SWarner Losh 17110d1ba665SWarner Losh /// 17120d1ba665SWarner Losh /// Length of this frame fragment. 17130d1ba665SWarner Losh /// 17140d1ba665SWarner Losh PXE_UINT32 FragLen; 17150d1ba665SWarner Losh 17160d1ba665SWarner Losh /// 17170d1ba665SWarner Losh /// Reserved, must be set to zero. 17180d1ba665SWarner Losh /// 17190d1ba665SWarner Losh PXE_UINT32 reserved; 17200d1ba665SWarner Losh } FragDesc[MAX_XMIT_FRAGMENTS]; 1721*580fcf64SWarner Losh } PXE_CPB_TRANSMIT_FRAGMENTS; 17220d1ba665SWarner Losh 17230d1ba665SWarner Losh typedef struct s_pxe_cpb_receive { 17240d1ba665SWarner Losh /// 17250d1ba665SWarner Losh /// Address of first byte of receive buffer. This is also the first byte 17260d1ba665SWarner Losh /// of the frame header. 17270d1ba665SWarner Losh /// 17280d1ba665SWarner Losh PXE_UINT64 BufferAddr; 17290d1ba665SWarner Losh 17300d1ba665SWarner Losh /// 17310d1ba665SWarner Losh /// Length of receive buffer. This must be large enough to hold the 17320d1ba665SWarner Losh /// received frame (media header + data). If the length of smaller than 17330d1ba665SWarner Losh /// the received frame, data will be lost. 17340d1ba665SWarner Losh /// 17350d1ba665SWarner Losh PXE_UINT32 BufferLen; 17360d1ba665SWarner Losh 17370d1ba665SWarner Losh /// 17380d1ba665SWarner Losh /// Reserved, must be set to zero. 17390d1ba665SWarner Losh /// 17400d1ba665SWarner Losh PXE_UINT32 reserved; 17410d1ba665SWarner Losh } PXE_CPB_RECEIVE; 17420d1ba665SWarner Losh 17430d1ba665SWarner Losh typedef struct s_pxe_db_receive { 17440d1ba665SWarner Losh /// 17450d1ba665SWarner Losh /// Source and destination MAC addresses from media header. 17460d1ba665SWarner Losh /// 17470d1ba665SWarner Losh PXE_MAC_ADDR SrcAddr; 17480d1ba665SWarner Losh PXE_MAC_ADDR DestAddr; 17490d1ba665SWarner Losh 17500d1ba665SWarner Losh /// 17510d1ba665SWarner Losh /// Length of received frame. May be larger than receive buffer size. 17520d1ba665SWarner Losh /// The receive buffer will not be overwritten. This is how to tell 17530d1ba665SWarner Losh /// if data was lost because the receive buffer was too small. 17540d1ba665SWarner Losh /// 17550d1ba665SWarner Losh PXE_UINT32 FrameLen; 17560d1ba665SWarner Losh 17570d1ba665SWarner Losh /// 17580d1ba665SWarner Losh /// Protocol type from media header. 17590d1ba665SWarner Losh /// 17600d1ba665SWarner Losh PXE_MEDIA_PROTOCOL Protocol; 17610d1ba665SWarner Losh 17620d1ba665SWarner Losh /// 17630d1ba665SWarner Losh /// Length of media header in received frame. 17640d1ba665SWarner Losh /// 17650d1ba665SWarner Losh PXE_UINT16 MediaHeaderLen; 17660d1ba665SWarner Losh 17670d1ba665SWarner Losh /// 17680d1ba665SWarner Losh /// Type of receive frame. 17690d1ba665SWarner Losh /// 17700d1ba665SWarner Losh PXE_FRAME_TYPE Type; 17710d1ba665SWarner Losh 17720d1ba665SWarner Losh /// 17730d1ba665SWarner Losh /// Reserved, must be zero. 17740d1ba665SWarner Losh /// 17750d1ba665SWarner Losh PXE_UINT8 reserved[7]; 17760d1ba665SWarner Losh } PXE_DB_RECEIVE; 17770d1ba665SWarner Losh 17780d1ba665SWarner Losh #pragma pack() 17790d1ba665SWarner Losh 17800d1ba665SWarner Losh #endif 1781