xref: /freebsd/sys/contrib/edk2/Include/Uefi/UefiPxe.h (revision 580fcf642ea2d5a1e60f24947d1c2e97007e44e9)
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