1bcecde140a561c64e297225904afebebd62336cejljusten/** @file
2bcecde140a561c64e297225904afebebd62336cejljusten  These are PXE Specification 2.1-compliant data structures and defines.
3bcecde140a561c64e297225904afebebd62336cejljusten
4bcecde140a561c64e297225904afebebd62336cejljusten  This file relies upon the existence of a PXE-compliant ROM
5bcecde140a561c64e297225904afebebd62336cejljusten  in memory, as defined by the Preboot Execution Environment
6bcecde140a561c64e297225904afebebd62336cejljusten  Specification (PXE), Version 2.1, located at
7bcecde140a561c64e297225904afebebd62336cejljusten
8bcecde140a561c64e297225904afebebd62336cejljusten  http://developer.intel.com/ial/wfm/wfmspecs.htm
9bcecde140a561c64e297225904afebebd62336cejljusten
10bcecde140a561c64e297225904afebebd62336cejljustenCopyright (c) 1999 - 2010, Intel Corporation. All rights reserved.<BR>
11bcecde140a561c64e297225904afebebd62336cejljusten
12bcecde140a561c64e297225904afebebd62336cejljustenThis program and the accompanying materials
13bcecde140a561c64e297225904afebebd62336cejljustenare licensed and made available under the terms and conditions
14bcecde140a561c64e297225904afebebd62336cejljustenof the BSD License which accompanies this distribution.  The
15bcecde140a561c64e297225904afebebd62336cejljustenfull text of the license may be found at
16bcecde140a561c64e297225904afebebd62336cejljustenhttp://opensource.org/licenses/bsd-license.php
17bcecde140a561c64e297225904afebebd62336cejljusten
18bcecde140a561c64e297225904afebebd62336cejljustenTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
19bcecde140a561c64e297225904afebebd62336cejljustenWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
20bcecde140a561c64e297225904afebebd62336cejljusten
21bcecde140a561c64e297225904afebebd62336cejljusten**/
22bcecde140a561c64e297225904afebebd62336cejljusten
23bcecde140a561c64e297225904afebebd62336cejljusten#ifndef _PXEDEF_H_
24bcecde140a561c64e297225904afebebd62336cejljusten#define _PXEDEF_H_
25bcecde140a561c64e297225904afebebd62336cejljusten
26bcecde140a561c64e297225904afebebd62336cejljusten#pragma pack(1)
27bcecde140a561c64e297225904afebebd62336cejljusten
28bcecde140a561c64e297225904afebebd62336cejljusten//
29bcecde140a561c64e297225904afebebd62336cejljusten//    PXE structure signatures
30bcecde140a561c64e297225904afebebd62336cejljusten//
31bcecde140a561c64e297225904afebebd62336cejljusten#define BC_ROMID_SIG        "$BC$"
32bcecde140a561c64e297225904afebebd62336cejljusten#define UNDI_ROMID_SIG      "UNDI"
33bcecde140a561c64e297225904afebebd62336cejljusten#define BUSD_ROMID_SIG      "BUSD"
34bcecde140a561c64e297225904afebebd62336cejljusten
35bcecde140a561c64e297225904afebebd62336cejljusten#define PXE_SIG             "!PXE"
36bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_SIG           "PXENV+"
37bcecde140a561c64e297225904afebebd62336cejljusten
38bcecde140a561c64e297225904afebebd62336cejljusten#define BC_ROMID_REV        0x00
39bcecde140a561c64e297225904afebebd62336cejljusten#define UNDI_ROMID_REV      0x00
40bcecde140a561c64e297225904afebebd62336cejljusten#define BUSD_ROMID_REV      0x00
41bcecde140a561c64e297225904afebebd62336cejljusten
42bcecde140a561c64e297225904afebebd62336cejljusten#define PXE_REV             0x00
43bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_REV           0x0201
44bcecde140a561c64e297225904afebebd62336cejljusten
45bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_PTR           SIGNATURE_32 ('P', 'X', 'E', 'N')
46bcecde140a561c64e297225904afebebd62336cejljusten#define PXE_PTR             SIGNATURE_32 ('!', 'P', 'X', 'E')
47bcecde140a561c64e297225904afebebd62336cejljusten#define UNDI_ROMID_SIG_PTR  SIGNATURE_32 ('U', 'N', 'D', 'I')
48bcecde140a561c64e297225904afebebd62336cejljusten
49bcecde140a561c64e297225904afebebd62336cejljustentypedef UINT16  SEGSEL; // Real mode segment or protected mode selector.
50bcecde140a561c64e297225904afebebd62336cejljustentypedef UINT16  OFF16;  // Unsigned 16bit offset.
51bcecde140a561c64e297225904afebebd62336cejljustentypedef UINT32  ADDR32;
52bcecde140a561c64e297225904afebebd62336cejljusten
53bcecde140a561c64e297225904afebebd62336cejljusten//
54bcecde140a561c64e297225904afebebd62336cejljusten//    Bus types
55bcecde140a561c64e297225904afebebd62336cejljusten//
56bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_BUS_ISA     0
57bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_BUS_EISA    1
58bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_BUS_MCA     2
59bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_BUS_PCI     3
60bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_BUS_VESA    4
61bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_BUS_PCMCIA  5
62bcecde140a561c64e297225904afebebd62336cejljusten
63bcecde140a561c64e297225904afebebd62336cejljusten//
64bcecde140a561c64e297225904afebebd62336cejljusten//
65bcecde140a561c64e297225904afebebd62336cejljusten//    Result codes returned in AX by a PXENV API service.
66bcecde140a561c64e297225904afebebd62336cejljusten//
67bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_EXIT_SUCCESS  0x0000
68bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_EXIT_FAILURE  0x0001
69bcecde140a561c64e297225904afebebd62336cejljusten
70bcecde140a561c64e297225904afebebd62336cejljusten//
71bcecde140a561c64e297225904afebebd62336cejljusten//    Status codes returned in the status word of PXENV API parameter structures.
72bcecde140a561c64e297225904afebebd62336cejljusten//
73bcecde140a561c64e297225904afebebd62336cejljusten//    Generic API errors - these do not match up with the M0x or E0x messages
74bcecde140a561c64e297225904afebebd62336cejljusten//    that are reported by the loader.
75bcecde140a561c64e297225904afebebd62336cejljusten//
76bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_STATUS_SUCCESS          0x00
77bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_STATUS_FAILURE          0x01
78bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_STATUS_BAD_FUNC         0x02
79bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_STATUS_UNSUPPORTED      0x03
80bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_STATUS_KEEP_UNDI        0x04
81bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_STATUS_KEEP_ALL         0x05
82bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_STATUS_OUT_OF_RESOURCES 0x06
83bcecde140a561c64e297225904afebebd62336cejljusten
84bcecde140a561c64e297225904afebebd62336cejljustentypedef enum {
85bcecde140a561c64e297225904afebebd62336cejljusten  PxeEnvStatus_Success,
86bcecde140a561c64e297225904afebebd62336cejljusten  PxeEnvStatus_Failure,
87bcecde140a561c64e297225904afebebd62336cejljusten  PxeEnvStatus_BadFunc,
88bcecde140a561c64e297225904afebebd62336cejljusten  PxeEnvStatus_Unsupported,
89bcecde140a561c64e297225904afebebd62336cejljusten  PxeEnvStatus_KeepUndi,
90bcecde140a561c64e297225904afebebd62336cejljusten  PxeEnvStatus_KeepAll
91bcecde140a561c64e297225904afebebd62336cejljusten} EFI_PXE_STATUS;
92bcecde140a561c64e297225904afebebd62336cejljusten
93bcecde140a561c64e297225904afebebd62336cejljusten/* Driver errors (0x60 to 0x6F) */
94bcecde140a561c64e297225904afebebd62336cejljusten
95bcecde140a561c64e297225904afebebd62336cejljusten// These errors are for UNDI compatible NIC drivers.
96bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_STATUS_UNDI_INVALID_FUNCTION          0x60
97bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_STATUS_UNDI_MEDIATEST_FAILED          0x61
98bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_STATUS_UNDI_CANNOT_INIT_NIC_FOR_MCAST 0x62
99bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_STATUS_UNDI_CANNOT_INITIALIZE_NIC     0x63
100bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_STATUS_UNDI_CANNOT_INITIALIZE_PHY     0x64
101bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_STATUS_UNDI_CANNOT_READ_CONFIG_DATA   0x65
102bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_STATUS_UNDI_CANNOT_READ_INIT_DATA     0x66
103bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_STATUS_UNDI_BAD_MAC_ADDR              0x67
104bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_STATUS_UNDI_BAD_EEPROM_CKSUM          0x68
105bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_STATUS_UNDI_ERROR_SETTING_ISR         0x69
106bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_STATUS_UNDI_INVALID_STATE             0x6A
107bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_STATUS_UNDI_TRANSMIT_ERROR            0x6B
108bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_STATUS_UNDI_INVALID_PARAMETER         0x6C
109bcecde140a561c64e297225904afebebd62336cejljusten
110bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
111bcecde140a561c64e297225904afebebd62336cejljusten  UINT16  Seg_Addr;
112bcecde140a561c64e297225904afebebd62336cejljusten  UINT32  Phy_Addr;
113bcecde140a561c64e297225904afebebd62336cejljusten  UINT16  Seg_Size;
114bcecde140a561c64e297225904afebebd62336cejljusten} NEWSEGDESC_T;
115bcecde140a561c64e297225904afebebd62336cejljusten
116bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
117bcecde140a561c64e297225904afebebd62336cejljusten  OFF16   Offset;
118bcecde140a561c64e297225904afebebd62336cejljusten  SEGSEL  Segment;
119bcecde140a561c64e297225904afebebd62336cejljusten} SEGOFF16;
120bcecde140a561c64e297225904afebebd62336cejljusten
121bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
122bcecde140a561c64e297225904afebebd62336cejljusten  UINT8   Signature[4]; ///< Structure signature is not NULL terminated.
123bcecde140a561c64e297225904afebebd62336cejljusten  UINT8   StructLength; ///< Length of this structure in bytes.
124bcecde140a561c64e297225904afebebd62336cejljusten  UINT8   StructCksum;  ///< Use to make byte checksum of this structure == zero.
125bcecde140a561c64e297225904afebebd62336cejljusten  UINT8   StructRev;    ///< Structure format revision number.
126bcecde140a561c64e297225904afebebd62336cejljusten  UINT8   UNDI_Rev[3];  ///< API revision number stored in Intel order.
127bcecde140a561c64e297225904afebebd62336cejljusten  //
128bcecde140a561c64e297225904afebebd62336cejljusten  // Revision 2.1.0 == 0x00, 0x01, 0x02
129bcecde140a561c64e297225904afebebd62336cejljusten  //
130bcecde140a561c64e297225904afebebd62336cejljusten  UINT16  UNDI_Loader;  ///< Offset of UNDI loader routine in the option ROM image.
131bcecde140a561c64e297225904afebebd62336cejljusten  UINT16  StackSize;    ///< Minimum stack segment size, in bytes, needed to load and run the UNDI.
132bcecde140a561c64e297225904afebebd62336cejljusten  UINT16  DataSize;     ///< UNDI runtime code and data
133bcecde140a561c64e297225904afebebd62336cejljusten  UINT16  CodeSize;     ///< segment sizes.
134bcecde140a561c64e297225904afebebd62336cejljusten  UINT8   BusType[4];   ///< 'ISAR', 'EISA', 'PCIR', 'PCCR'
135bcecde140a561c64e297225904afebebd62336cejljusten} UNDI_ROMID_T;
136bcecde140a561c64e297225904afebebd62336cejljusten
137bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
138bcecde140a561c64e297225904afebebd62336cejljusten  UINT8   Signature[4]; ///< Structure signature is not NULL terminated.
139bcecde140a561c64e297225904afebebd62336cejljusten  UINT8   StructLength; ///< Length of this structure in bytes.
140bcecde140a561c64e297225904afebebd62336cejljusten  UINT8   StructCksum;  ///< Use to make byte checksum of this structure == zero.
141bcecde140a561c64e297225904afebebd62336cejljusten  UINT8   StructRev;    ///< Structure format revision number.
142bcecde140a561c64e297225904afebebd62336cejljusten  UINT8   BC_Rev[3];    ///< API revision number stored in Intel order.
143bcecde140a561c64e297225904afebebd62336cejljusten  //
144bcecde140a561c64e297225904afebebd62336cejljusten  // Revision 2.1.0 == 0x00, 0x01, 0x02
145bcecde140a561c64e297225904afebebd62336cejljusten  //
146bcecde140a561c64e297225904afebebd62336cejljusten  UINT16  BC_Loader;          ///< Offset of base-code loader routine in the option ROM image.
147bcecde140a561c64e297225904afebebd62336cejljusten  UINT16  StackSize;          ///< Minimum stack segment size (bytes) needed to load/run base-code.
148bcecde140a561c64e297225904afebebd62336cejljusten  UINT16  DataSize;           ///< Base-code runtime code and data
149bcecde140a561c64e297225904afebebd62336cejljusten  UINT16  CodeSize;           ///< segment sizes.
150bcecde140a561c64e297225904afebebd62336cejljusten} BC_ROMID_T;
151bcecde140a561c64e297225904afebebd62336cejljusten
152bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
153bcecde140a561c64e297225904afebebd62336cejljusten  UINT8         Signature[4]; ///< Structure signature is not NULL terminated.
154bcecde140a561c64e297225904afebebd62336cejljusten  UINT8         StructLength; ///< Length of this structure in bytes.
155bcecde140a561c64e297225904afebebd62336cejljusten  UINT8         StructCksum;  ///< Use to make byte checksum of this  structure == zero.
156bcecde140a561c64e297225904afebebd62336cejljusten  UINT8         StructRev;    ///< Structure format revision number.
157bcecde140a561c64e297225904afebebd62336cejljusten  UINT8         Reserved1;    ///< must be zero
158bcecde140a561c64e297225904afebebd62336cejljusten  ///
159bcecde140a561c64e297225904afebebd62336cejljusten  ///   UNDI_ROMID_T __FAR *UNDI;// Far pointer to UNDI ROMID
160bcecde140a561c64e297225904afebebd62336cejljusten  ///
161bcecde140a561c64e297225904afebebd62336cejljusten  SEGOFF16      Undi;
162bcecde140a561c64e297225904afebebd62336cejljusten
163bcecde140a561c64e297225904afebebd62336cejljusten  ///
164bcecde140a561c64e297225904afebebd62336cejljusten  ///    BC_ROMID_T __FAR *Base;  //   Far pointer to base-code ROMID
165bcecde140a561c64e297225904afebebd62336cejljusten  ///
166bcecde140a561c64e297225904afebebd62336cejljusten  SEGOFF16      Base;
167bcecde140a561c64e297225904afebebd62336cejljusten
168bcecde140a561c64e297225904afebebd62336cejljusten  ///
169bcecde140a561c64e297225904afebebd62336cejljusten  ///    UINT16 (__FAR __CDECL *EntryPointSP)(UINT16 func, VOID __FAR *param);
170bcecde140a561c64e297225904afebebd62336cejljusten  /// 16bit stack segment API entry point.  This will be seg:off in
171bcecde140a561c64e297225904afebebd62336cejljusten  /// real mode and sel:off in 16:16 protected mode.
172bcecde140a561c64e297225904afebebd62336cejljusten  ///
173bcecde140a561c64e297225904afebebd62336cejljusten  SEGOFF16      EntryPointSP;
174bcecde140a561c64e297225904afebebd62336cejljusten
175bcecde140a561c64e297225904afebebd62336cejljusten  ///
176bcecde140a561c64e297225904afebebd62336cejljusten  ///    UINT16 (__FAR __CDECL *EntryPointESP)(UINT16 func, VOID __FAR *param);
177bcecde140a561c64e297225904afebebd62336cejljusten  /// 32bit stack segment API entry point.  This will be sel:off.
178bcecde140a561c64e297225904afebebd62336cejljusten  /// In real mode, sel == 0
179bcecde140a561c64e297225904afebebd62336cejljusten  ///
180bcecde140a561c64e297225904afebebd62336cejljusten  SEGOFF16      EntryPointESP;
181bcecde140a561c64e297225904afebebd62336cejljusten  ///
182bcecde140a561c64e297225904afebebd62336cejljusten  ///    UINT16 (__FAR __CDECL *StatusCallout)(UINT16 param);
183bcecde140a561c64e297225904afebebd62336cejljusten  /// Address of DHCP/TFTP status callout routine.
184bcecde140a561c64e297225904afebebd62336cejljusten  ///
185bcecde140a561c64e297225904afebebd62336cejljusten  SEGOFF16      StatusCallout;
186bcecde140a561c64e297225904afebebd62336cejljusten  UINT8         Reserved2;      ///< must be zero
187bcecde140a561c64e297225904afebebd62336cejljusten  UINT8         SegDescCnt;     ///< Number of segment descriptors in this structure.
188bcecde140a561c64e297225904afebebd62336cejljusten  UINT16        FirstSelector;  ///< First segment descriptor in GDT assigned to PXE.
189bcecde140a561c64e297225904afebebd62336cejljusten  NEWSEGDESC_T  Stack;
190bcecde140a561c64e297225904afebebd62336cejljusten  NEWSEGDESC_T  UNDIData;
191bcecde140a561c64e297225904afebebd62336cejljusten  NEWSEGDESC_T  UNDICode;
192bcecde140a561c64e297225904afebebd62336cejljusten  NEWSEGDESC_T  UNDICodeWrite;
193bcecde140a561c64e297225904afebebd62336cejljusten  NEWSEGDESC_T  BC_Data;
194bcecde140a561c64e297225904afebebd62336cejljusten  NEWSEGDESC_T  BC_Code;
195bcecde140a561c64e297225904afebebd62336cejljusten  NEWSEGDESC_T  BC_CodeWrite;
196bcecde140a561c64e297225904afebebd62336cejljusten} PXE_T;
197bcecde140a561c64e297225904afebebd62336cejljusten
198bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
199bcecde140a561c64e297225904afebebd62336cejljusten  CHAR8       Signature[6];     ///< "PXENV+"
200bcecde140a561c64e297225904afebebd62336cejljusten  UINT16      Version;          ///< PXE version number.  LSB is minor version.  MSB is major version.
201bcecde140a561c64e297225904afebebd62336cejljusten  UINT8       StructLength;     ///< Length of PXE-2.0 Entry Point structure in bytes.
202bcecde140a561c64e297225904afebebd62336cejljusten  UINT8       StructCksum;      ///< Used to make structure checksum equal zero.
203bcecde140a561c64e297225904afebebd62336cejljusten  UINT32      RMEntry;          ///< Real mode API entry point  segment:offset.
204bcecde140a561c64e297225904afebebd62336cejljusten  UINT32      PMEntryOff;       ///< Protected mode API entry point
205bcecde140a561c64e297225904afebebd62336cejljusten  UINT16      PMEntrySeg;       ///< segment:offset.  This will always be zero.  Protected mode API calls
206bcecde140a561c64e297225904afebebd62336cejljusten                                ///< must be made through the API entry points in the PXE Runtime ID structure.
207bcecde140a561c64e297225904afebebd62336cejljusten
208bcecde140a561c64e297225904afebebd62336cejljusten  UINT16      StackSeg;     ///< Real mode stack segment.
209bcecde140a561c64e297225904afebebd62336cejljusten  UINT16      StackSize;    ///< Stack segment size in bytes.
210bcecde140a561c64e297225904afebebd62336cejljusten  UINT16      BaseCodeSeg;  ///< Real mode base-code code segment.
211bcecde140a561c64e297225904afebebd62336cejljusten  UINT16      BaseCodeSize; ///< Base-code code segment size
212bcecde140a561c64e297225904afebebd62336cejljusten  UINT16      BaseDataSeg;  ///< Real mode base-code data segment.
213bcecde140a561c64e297225904afebebd62336cejljusten  UINT16      BaseDataSize; ///< Base-code data segment size
214bcecde140a561c64e297225904afebebd62336cejljusten  UINT16      UNDIDataSeg;  ///< Real mode UNDI data segment.
215bcecde140a561c64e297225904afebebd62336cejljusten  UINT16      UNDIDataSize; ///< UNDI data segment size in bytes.
216bcecde140a561c64e297225904afebebd62336cejljusten  UINT16      UNDICodeSeg;  ///< Real mode UNDI code segment.
217bcecde140a561c64e297225904afebebd62336cejljusten  UINT16      UNDICodeSize; ///< UNDI code segment size in bytes.
218bcecde140a561c64e297225904afebebd62336cejljusten  PXE_T       *RuntimePtr;  ///< Real mode segment:offset pointer to PXE Runtime ID structure.
219bcecde140a561c64e297225904afebebd62336cejljusten} PXENV_T;
220bcecde140a561c64e297225904afebebd62336cejljusten
221bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
222bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16    Status;
223bcecde140a561c64e297225904afebebd62336cejljusten  IN OUT UINT16 Ax;
224bcecde140a561c64e297225904afebebd62336cejljusten  IN OUT UINT16 Bx;
225bcecde140a561c64e297225904afebebd62336cejljusten  IN OUT UINT16 Dx;
226bcecde140a561c64e297225904afebebd62336cejljusten  IN OUT UINT16 Di;
227bcecde140a561c64e297225904afebebd62336cejljusten  IN OUT UINT16 Es;
228bcecde140a561c64e297225904afebebd62336cejljusten  IN OUT UINT16 Undi_Ds;
229bcecde140a561c64e297225904afebebd62336cejljusten  IN OUT UINT16 Undi_Cs;
230bcecde140a561c64e297225904afebebd62336cejljusten  OUT SEGOFF16  PXEptr;
231bcecde140a561c64e297225904afebebd62336cejljusten  OUT SEGOFF16  PXENVptr;
232bcecde140a561c64e297225904afebebd62336cejljusten} UNDI_LOADER_T;
233bcecde140a561c64e297225904afebebd62336cejljusten
234bcecde140a561c64e297225904afebebd62336cejljusten//
235bcecde140a561c64e297225904afebebd62336cejljusten//  Put in some UNDI-specific arguments
236bcecde140a561c64e297225904afebebd62336cejljusten//
237bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_START_UNDI              0x0000
238bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_STARTUP            0x0001
239bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_CLEANUP            0x0002
240bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_INITIALIZE         0x0003
241bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_RESET_NIC          0x0004
242bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_SHUTDOWN           0x0005
243bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_OPEN               0x0006
244bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_CLOSE              0x0007
245bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_TRANSMIT           0x0008
246bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_SET_MCAST_ADDR     0x0009
247bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_SET_STATION_ADDR   0x000A
248bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_SET_PACKET_FILTER  0x000B
249bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_GET_INFORMATION    0x000C
250bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_GET_STATISTICS     0x000D
251bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_CLEAR_STATISTICS   0x000E
252bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_INITIATE_DIAGS     0x000F
253bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_FORCE_INTERRUPT    0x0010
254bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_GET_MCAST_ADDR     0x0011
255bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_GET_NIC_TYPE       0x0012
256bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_GET_NDIS_INFO      0x0013
257bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_ISR                0x0014
258bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_STOP_UNDI               0x0015
259bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_GET_STATE          0x0016
260bcecde140a561c64e297225904afebebd62336cejljusten
261bcecde140a561c64e297225904afebebd62336cejljusten#define ADDR_LEN                      16
262bcecde140a561c64e297225904afebebd62336cejljusten#define MAXNUM_MCADDR                 8
263bcecde140a561c64e297225904afebebd62336cejljusten#define IPLEN                         4       ///< length of an IP address
264bcecde140a561c64e297225904afebebd62336cejljusten#define XMT_DESTADDR                  0x0000  ///< destination address given
265bcecde140a561c64e297225904afebebd62336cejljusten#define XMT_BROADCAST                 0x0001  ///< use broadcast address
266bcecde140a561c64e297225904afebebd62336cejljusten
267bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
268bcecde140a561c64e297225904afebebd62336cejljusten  UINT16  MCastAddrCount;                     ///< In: Number of multi-cast
269bcecde140a561c64e297225904afebebd62336cejljusten
270bcecde140a561c64e297225904afebebd62336cejljusten  /* addresses. */
271bcecde140a561c64e297225904afebebd62336cejljusten  UINT8   MCastAddr[MAXNUM_MCADDR][ADDR_LEN]; /* In: */
272bcecde140a561c64e297225904afebebd62336cejljusten
273bcecde140a561c64e297225904afebebd62336cejljusten  /* list of multi-cast addresses. */
274bcecde140a561c64e297225904afebebd62336cejljusten
275bcecde140a561c64e297225904afebebd62336cejljusten  /* Each address can take up to */
276bcecde140a561c64e297225904afebebd62336cejljusten
277bcecde140a561c64e297225904afebebd62336cejljusten  /* ADDR_LEN bytes and a maximum */
278bcecde140a561c64e297225904afebebd62336cejljusten
279bcecde140a561c64e297225904afebebd62336cejljusten  /* of MAXNUM_MCADDR address can */
280bcecde140a561c64e297225904afebebd62336cejljusten
281bcecde140a561c64e297225904afebebd62336cejljusten  /* be provided*/
282bcecde140a561c64e297225904afebebd62336cejljusten} PXENV_UNDI_MCAST_ADDR_T;
283bcecde140a561c64e297225904afebebd62336cejljusten
284bcecde140a561c64e297225904afebebd62336cejljusten/* Definitions of TFTP API parameter structures.
285bcecde140a561c64e297225904afebebd62336cejljusten */
286bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
287bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16  Status;       ///< Out: PXENV_STATUS_xxx
288bcecde140a561c64e297225904afebebd62336cejljusten  IN UINT16   Ax;           ///< In: These register fields must be
289bcecde140a561c64e297225904afebebd62336cejljusten  IN UINT16   Bx;           ///<     filled in with the same data
290bcecde140a561c64e297225904afebebd62336cejljusten  IN UINT16   Dx;           ///<     that was passed to the MLID
291bcecde140a561c64e297225904afebebd62336cejljusten  IN UINT16   Di;           ///<     option ROM boot code by the
292bcecde140a561c64e297225904afebebd62336cejljusten  IN UINT16   Es;           ///<     system BIOS.
293bcecde140a561c64e297225904afebebd62336cejljusten} PXENV_START_UNDI_T;
294bcecde140a561c64e297225904afebebd62336cejljusten
295bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
296bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16  Status;       ///< Out: PXENV_STATUS_xxx
297bcecde140a561c64e297225904afebebd62336cejljusten} PXENV_UNDI_STARTUP_T;
298bcecde140a561c64e297225904afebebd62336cejljusten
299bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
300bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16  Status;       ///< Out: PXENV_STATUS_xxx
301bcecde140a561c64e297225904afebebd62336cejljusten} PXENV_UNDI_CLEANUP_T;
302bcecde140a561c64e297225904afebebd62336cejljusten
303bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
304bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16  Status;       ///< Out: PXENV_STATUS_xxx
305bcecde140a561c64e297225904afebebd62336cejljusten
306bcecde140a561c64e297225904afebebd62336cejljusten  ///
307bcecde140a561c64e297225904afebebd62336cejljusten  ///  This is an input parameter and is a 32-bit physical address of
308bcecde140a561c64e297225904afebebd62336cejljusten  ///  a memory  copy of the  driver module in  the protocol.ini file
309bcecde140a561c64e297225904afebebd62336cejljusten  ///  obtained from the  Protocol Manager  driver(refer to  NDIS 2.0
310bcecde140a561c64e297225904afebebd62336cejljusten  ///  specifications).   This parameter  is basically  supported for
311bcecde140a561c64e297225904afebebd62336cejljusten  ///  the universal NDIS driver to pass the information contained in
312bcecde140a561c64e297225904afebebd62336cejljusten  ///  protocol.ini   file  to  the  NIC   driver  for  any  specific
313bcecde140a561c64e297225904afebebd62336cejljusten  ///  configuration of   the   NIC.      (Note   that   the   module
314bcecde140a561c64e297225904afebebd62336cejljusten  ///  identification in the  protocol.ini  file  was  done  by  NDIS
315bcecde140a561c64e297225904afebebd62336cejljusten  ///  itself.)  This value can be NULL for for any other application
316bcecde140a561c64e297225904afebebd62336cejljusten  ///  interfacing to the Universal NIC Driver.
317bcecde140a561c64e297225904afebebd62336cejljusten  ///
318bcecde140a561c64e297225904afebebd62336cejljusten  IN UINT32   ProtocolIni;
319bcecde140a561c64e297225904afebebd62336cejljusten  UINT8       Reserved[8];
320bcecde140a561c64e297225904afebebd62336cejljusten} PXENV_UNDI_INITIALIZE_T;
321bcecde140a561c64e297225904afebebd62336cejljusten
322bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
323bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16                  Status;       ///< Out: PXENV_STATUS_xxx
324bcecde140a561c64e297225904afebebd62336cejljusten  IN PXENV_UNDI_MCAST_ADDR_T  R_Mcast_Buf;  ///< multicast address list
325bcecde140a561c64e297225904afebebd62336cejljusten  /* see note below  */
326bcecde140a561c64e297225904afebebd62336cejljusten} PXENV_UNDI_RESET_T;
327bcecde140a561c64e297225904afebebd62336cejljusten
328bcecde140a561c64e297225904afebebd62336cejljusten/*++
329bcecde140a561c64e297225904afebebd62336cejljusten    Note: The  NIC  driver  does  not  remember  the  multicast
330bcecde140a561c64e297225904afebebd62336cejljusten    addresses provided in any  call.    So  the  application  must
331bcecde140a561c64e297225904afebebd62336cejljusten    provide the multicast address  list with all  the calls that
332bcecde140a561c64e297225904afebebd62336cejljusten    reset the receive unit of the adapter.
333bcecde140a561c64e297225904afebebd62336cejljusten  --*/
334bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
335bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16  Status;                     ///< Out: PXENV_STATUS_xxx
336bcecde140a561c64e297225904afebebd62336cejljusten} PXENV_UNDI_SHUTDOWN_T;
337bcecde140a561c64e297225904afebebd62336cejljusten
338bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
339bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16                  Status;     ///< Out: PXENV_STATUS_xxx
340bcecde140a561c64e297225904afebebd62336cejljusten
341bcecde140a561c64e297225904afebebd62336cejljusten  ///
342bcecde140a561c64e297225904afebebd62336cejljusten  ///  This is  an input parameter and is  adapter specific.  This is
343bcecde140a561c64e297225904afebebd62336cejljusten  ///  supported  for Universal NDIS 2.0 driver to pass down the Open
344bcecde140a561c64e297225904afebebd62336cejljusten  ///  flags  provided  by   the  protocol   driver  (See   NDIS  2.0
345bcecde140a561c64e297225904afebebd62336cejljusten  ///  specifications).  This can be zero.
346bcecde140a561c64e297225904afebebd62336cejljusten  ///
347bcecde140a561c64e297225904afebebd62336cejljusten  IN UINT16                   OpenFlag;   ///< In: See description below
348bcecde140a561c64e297225904afebebd62336cejljusten  IN UINT16                   PktFilter;  ///< In: Filter for receiving
349bcecde140a561c64e297225904afebebd62336cejljusten
350bcecde140a561c64e297225904afebebd62336cejljusten  /* packet. It takes the following */
351bcecde140a561c64e297225904afebebd62336cejljusten
352bcecde140a561c64e297225904afebebd62336cejljusten  /* values, multiple values can be */
353bcecde140a561c64e297225904afebebd62336cejljusten
354bcecde140a561c64e297225904afebebd62336cejljusten  /* ORed together. */
355bcecde140a561c64e297225904afebebd62336cejljusten#define FLTR_DIRECTED 0x0001                ///< directed/multicast
356bcecde140a561c64e297225904afebebd62336cejljusten#define FLTR_BRDCST   0x0002                ///< broadcast packets
357bcecde140a561c64e297225904afebebd62336cejljusten#define FLTR_PRMSCS   0x0004                ///< any packet on LAN
358bcecde140a561c64e297225904afebebd62336cejljusten#define FLTR_SRC_RTG  0x0008                ///< source routing packet
359bcecde140a561c64e297225904afebebd62336cejljusten  IN PXENV_UNDI_MCAST_ADDR_T  McastBuffer;  /* In: */
360bcecde140a561c64e297225904afebebd62336cejljusten  /* See t_PXENV_UNDI_MCAST_ADDR. */
361bcecde140a561c64e297225904afebebd62336cejljusten} PXENV_UNDI_OPEN_T;
362bcecde140a561c64e297225904afebebd62336cejljusten
363bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
364bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16  Status; ///< Out: PXENV_STATUS_xxx
365bcecde140a561c64e297225904afebebd62336cejljusten} PXENV_UNDI_CLOSE_T;
366bcecde140a561c64e297225904afebebd62336cejljusten
367bcecde140a561c64e297225904afebebd62336cejljusten#define MAX_DATA_BLKS 8
368bcecde140a561c64e297225904afebebd62336cejljusten
369bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
370bcecde140a561c64e297225904afebebd62336cejljusten  IN UINT16 ImmedLength;  ///< In: Data buffer length in
371bcecde140a561c64e297225904afebebd62336cejljusten
372bcecde140a561c64e297225904afebebd62336cejljusten  /* bytes. */
373bcecde140a561c64e297225904afebebd62336cejljusten  UINT16    XmitOffset;   ///< 16-bit segment & offset of the
374bcecde140a561c64e297225904afebebd62336cejljusten  UINT16    XmitSegment;  ///< immediate data buffer.
375bcecde140a561c64e297225904afebebd62336cejljusten  UINT16    DataBlkCount; ///< In: Number of data blocks.
376bcecde140a561c64e297225904afebebd62336cejljusten  struct DataBlk {
377bcecde140a561c64e297225904afebebd62336cejljusten    UINT8   TDPtrType;    ///< 0 => 32 bit Phys pointer in TDDataPtr, not supported in this version of LSA
378bcecde140a561c64e297225904afebebd62336cejljusten                          ///< 1 => seg:offser in TDDataPtr which can be a real mode or 16-bit protected mode pointer
379bcecde140a561c64e297225904afebebd62336cejljusten    UINT8   TDRsvdByte;         ///< Reserved, must be zero.
380bcecde140a561c64e297225904afebebd62336cejljusten    UINT16  TDDataLen;          ///< Data block length in bytes.
381bcecde140a561c64e297225904afebebd62336cejljusten    UINT16  TDDataPtrOffset;    ///< Far pointer to data buffer.
382bcecde140a561c64e297225904afebebd62336cejljusten    UINT16  TDDataPtrSegment;   ///< Far pointer to data buffer.
383bcecde140a561c64e297225904afebebd62336cejljusten  } DataBlock[MAX_DATA_BLKS];
384bcecde140a561c64e297225904afebebd62336cejljusten}
385bcecde140a561c64e297225904afebebd62336cejljustenPXENV_UNDI_TBD_T;
386bcecde140a561c64e297225904afebebd62336cejljusten
387bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
388bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16  Status;           ///< Out: PXENV_STATUS_xxx
389bcecde140a561c64e297225904afebebd62336cejljusten
390bcecde140a561c64e297225904afebebd62336cejljusten  ///
391bcecde140a561c64e297225904afebebd62336cejljusten  ///  This is the protocol  of  the  upper  layer  that  is  calling
392bcecde140a561c64e297225904afebebd62336cejljusten  ///  NICTransmit call.   If the  upper layer  has filled  the media
393bcecde140a561c64e297225904afebebd62336cejljusten  ///  header this field must be 0.
394bcecde140a561c64e297225904afebebd62336cejljusten  ///
395bcecde140a561c64e297225904afebebd62336cejljusten  IN UINT8    Protocol;
396bcecde140a561c64e297225904afebebd62336cejljusten#define P_UNKNOWN 0
397bcecde140a561c64e297225904afebebd62336cejljusten#define P_IP      1
398bcecde140a561c64e297225904afebebd62336cejljusten#define P_ARP     2
399bcecde140a561c64e297225904afebebd62336cejljusten#define P_RARP    3
400bcecde140a561c64e297225904afebebd62336cejljusten
401bcecde140a561c64e297225904afebebd62336cejljusten  ///
402bcecde140a561c64e297225904afebebd62336cejljusten  ///  If  this flag is  0, the NIC  driver expects a  pointer to the
403bcecde140a561c64e297225904afebebd62336cejljusten  ///  destination media  address in the field  DestMediaAddr.  If 1,
404bcecde140a561c64e297225904afebebd62336cejljusten  ///  the   NIC  driver   fills  the   broadcast  address   for  the
405bcecde140a561c64e297225904afebebd62336cejljusten  ///  destination.
406bcecde140a561c64e297225904afebebd62336cejljusten  ///
407bcecde140a561c64e297225904afebebd62336cejljusten  IN UINT8    XmitFlag;
408bcecde140a561c64e297225904afebebd62336cejljusten#define XMT_DESTADDR  0x0000    ///< destination address given
409bcecde140a561c64e297225904afebebd62336cejljusten#define XMT_BROADCAST 0x0001    ///< use broadcast address
410bcecde140a561c64e297225904afebebd62336cejljusten
411bcecde140a561c64e297225904afebebd62336cejljusten  ///
412bcecde140a561c64e297225904afebebd62336cejljusten  ///  This  is a pointer to the  hardware address of the destination
413bcecde140a561c64e297225904afebebd62336cejljusten  ///  media.  It  can be  null if  the destination  is not  known in
414bcecde140a561c64e297225904afebebd62336cejljusten  ///  which case the XmitFlag contains 1 for broadcast.  Destination
415bcecde140a561c64e297225904afebebd62336cejljusten  ///  media address  must be  obtained by  the upper  level protocol
416bcecde140a561c64e297225904afebebd62336cejljusten  ///  (with  Address Resolution Protocol) and NIC driver does not do
417bcecde140a561c64e297225904afebebd62336cejljusten  ///  any address resolution.
418bcecde140a561c64e297225904afebebd62336cejljusten  ///
419bcecde140a561c64e297225904afebebd62336cejljusten  IN UINT16   DestAddrOffset;   ///< 16-bit segment & offset of the
420bcecde140a561c64e297225904afebebd62336cejljusten  IN UINT16   DestAddrSegment;  ///< destination media address
421bcecde140a561c64e297225904afebebd62336cejljusten
422bcecde140a561c64e297225904afebebd62336cejljusten
423bcecde140a561c64e297225904afebebd62336cejljusten  IN UINT16   TBDOffset;  ///< 16-bit segment & offset of the
424bcecde140a561c64e297225904afebebd62336cejljusten  IN UINT16   TBDSegment; ///< transmit buffer descriptor of type
425bcecde140a561c64e297225904afebebd62336cejljusten
426bcecde140a561c64e297225904afebebd62336cejljusten  /// XmitBufferDesc
427bcecde140a561c64e297225904afebebd62336cejljusten  IN UINT32   Reserved[2];
428bcecde140a561c64e297225904afebebd62336cejljusten} PXENV_UNDI_TRANSMIT_T;
429bcecde140a561c64e297225904afebebd62336cejljusten
430bcecde140a561c64e297225904afebebd62336cejljusten
431bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
432bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16                  Status;       ///<  Out: PXENV_STATUS_xxx
433bcecde140a561c64e297225904afebebd62336cejljusten  IN PXENV_UNDI_MCAST_ADDR_T  McastBuffer;  ///<  In:
434bcecde140a561c64e297225904afebebd62336cejljusten} PXENV_UNDI_SET_MCAST_ADDR_T;
435bcecde140a561c64e297225904afebebd62336cejljusten
436bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
437bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16  Status;                   ///< Out: PXENV_STATUS_xxx
438bcecde140a561c64e297225904afebebd62336cejljusten  IN UINT8    StationAddress[ADDR_LEN]; ///< new address to be set
439bcecde140a561c64e297225904afebebd62336cejljusten} PXENV_UNDI_SET_STATION_ADDR_T;
440bcecde140a561c64e297225904afebebd62336cejljusten
441bcecde140a561c64e297225904afebebd62336cejljustentypedef struct s_PXENV_UNDI_SET_PACKET_FILTER {
442bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16  Status;                   ///< Out: PXENV_STATUS_xxx
443bcecde140a561c64e297225904afebebd62336cejljusten  IN UINT8    Filter;                   ///< In: Receive filter value.
444bcecde140a561c64e297225904afebebd62336cejljusten} PXENV_UNDI_SET_PACKET_FILTER_T;
445bcecde140a561c64e297225904afebebd62336cejljusten
446bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
447bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16  Status;       ///< Out: PXENV_STATUS_xxx
448bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16  BaseIo;       ///< Out: Adapter's Base IO
449bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16  IntNumber;    ///< Out: IRQ number
450bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16  MaxTranUnit;  ///< Out: MTU
451bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16  HwType;       ///< Out: type of protocol at hardware level
452bcecde140a561c64e297225904afebebd62336cejljusten
453bcecde140a561c64e297225904afebebd62336cejljusten#define ETHER_TYPE      1
454bcecde140a561c64e297225904afebebd62336cejljusten#define EXP_ETHER_TYPE  2
455bcecde140a561c64e297225904afebebd62336cejljusten#define IEEE_TYPE       6
456bcecde140a561c64e297225904afebebd62336cejljusten#define ARCNET_TYPE     7
457bcecde140a561c64e297225904afebebd62336cejljusten  /*++
458bcecde140a561c64e297225904afebebd62336cejljusten        other numbers can  be obtained from  rfc1010 for "Assigned
459bcecde140a561c64e297225904afebebd62336cejljusten        Numbers".  This number may not be validated by the application
460bcecde140a561c64e297225904afebebd62336cejljusten        and hence adding new numbers to the list should be fine at any
461bcecde140a561c64e297225904afebebd62336cejljusten        time.
462bcecde140a561c64e297225904afebebd62336cejljusten    --*/
463bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16  HwAddrLen;                    ///< Out: actual length of hardware address
464bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT8   CurrentNodeAddress[ADDR_LEN]; ///< Out: Current hardware address
465bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT8   PermNodeAddress[ADDR_LEN];    ///< Out: Permanent hardware address
466bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16  ROMAddress;                   ///< Out: ROM address
467bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16  RxBufCt;                      ///< Out: receive Queue length
468bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16  TxBufCt;                      ///< Out: Transmit Queue length
469bcecde140a561c64e297225904afebebd62336cejljusten} PXENV_UNDI_GET_INFORMATION_T;
470bcecde140a561c64e297225904afebebd62336cejljusten
471bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
472bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16  Status;                       ///< Out: PXENV_STATUS_xxx
473bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT32  XmtGoodFrames;                ///< Out: No. of good transmissions
474bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT32  RcvGoodFrames;                ///< Out: No. of good frames received
475bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT32  RcvCRCErrors;                 ///< Out: No. of frames with CRC error
476bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT32  RcvResourceErrors;            ///< Out: no. of frames discarded
477bcecde140a561c64e297225904afebebd62336cejljusten  /* Out: receive Queue full */
478bcecde140a561c64e297225904afebebd62336cejljusten} PXENV_UNDI_GET_STATISTICS_T;
479bcecde140a561c64e297225904afebebd62336cejljusten
480bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
481bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16  Status;               ///< Out: PXENV_STATUS_xxx
482bcecde140a561c64e297225904afebebd62336cejljusten} PXENV_UNDI_CLEAR_STATISTICS_T;
483bcecde140a561c64e297225904afebebd62336cejljusten
484bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
485bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16  Status;               ///< Out: PXENV_STATUS_xxx
486bcecde140a561c64e297225904afebebd62336cejljusten} PXENV_UNDI_INITIATE_DIAGS_T;
487bcecde140a561c64e297225904afebebd62336cejljusten
488bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
489bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16  Status;               ///< Out: PXENV_STATUS_xxx
490bcecde140a561c64e297225904afebebd62336cejljusten} PXENV_UNDI_FORCE_INTERRUPT_T;
491bcecde140a561c64e297225904afebebd62336cejljusten
492bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
493bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16  Status;               ///< Out: PXENV_STATUS_xxx
494bcecde140a561c64e297225904afebebd62336cejljusten  IN UINT32   InetAddr;             ///< In: IP Multicast Address
495bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT8   MediaAddr[ADDR_LEN];  ///< Out: corresponding hardware
496bcecde140a561c64e297225904afebebd62336cejljusten  /*      multicast address */
497bcecde140a561c64e297225904afebebd62336cejljusten} PXENV_UNDI_GET_MCAST_ADDR_T;
498bcecde140a561c64e297225904afebebd62336cejljusten
499bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
500bcecde140a561c64e297225904afebebd62336cejljusten    OUT UINT16  Vendor_ID;  ///< OUT:
501bcecde140a561c64e297225904afebebd62336cejljusten    OUT UINT16  Dev_ID;     ///< OUT:
502bcecde140a561c64e297225904afebebd62336cejljusten    OUT UINT8   Base_Class; ///< OUT:
503bcecde140a561c64e297225904afebebd62336cejljusten    OUT UINT8   Sub_Class;  ///< OUT:
504bcecde140a561c64e297225904afebebd62336cejljusten    OUT UINT8   Prog_Intf;  ///< OUT: program interface
505bcecde140a561c64e297225904afebebd62336cejljusten    OUT UINT8   Rev;        ///< OUT: Revision number
506bcecde140a561c64e297225904afebebd62336cejljusten    OUT UINT16  BusDevFunc; ///< OUT: Bus, Device  & Function numbers
507bcecde140a561c64e297225904afebebd62336cejljusten    OUT UINT16  SubVendor_ID; ///< OUT:
508bcecde140a561c64e297225904afebebd62336cejljusten    OUT UINT16  SubDevice_ID; ///< OUT:
509bcecde140a561c64e297225904afebebd62336cejljusten} PCI_INFO_T;
510bcecde140a561c64e297225904afebebd62336cejljusten
511bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
512bcecde140a561c64e297225904afebebd62336cejljusten    OUT UINT32  EISA_Dev_ID;  ///< Out:
513bcecde140a561c64e297225904afebebd62336cejljusten    OUT UINT8   Base_Class;   ///< OUT:
514bcecde140a561c64e297225904afebebd62336cejljusten    OUT UINT8   Sub_Class;    ///< OUT:
515bcecde140a561c64e297225904afebebd62336cejljusten    OUT UINT8   Prog_Intf;    ///< OUT: program interface
516bcecde140a561c64e297225904afebebd62336cejljusten    OUT UINT16  CardSelNum;   ///< OUT: Card Selector Number
517bcecde140a561c64e297225904afebebd62336cejljusten    OUT UINT8   Reserved;     ///< to make it 10 bytes
518bcecde140a561c64e297225904afebebd62336cejljusten} PNP_INFO_T;
519bcecde140a561c64e297225904afebebd62336cejljusten
520bcecde140a561c64e297225904afebebd62336cejljusten
521bcecde140a561c64e297225904afebebd62336cejljustentypedef union {
522bcecde140a561c64e297225904afebebd62336cejljusten  PCI_INFO_T Pci;
523bcecde140a561c64e297225904afebebd62336cejljusten  PNP_INFO_T Pnp;
524bcecde140a561c64e297225904afebebd62336cejljusten} PCI_PNP_INFO_T;
525bcecde140a561c64e297225904afebebd62336cejljusten
526bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
527bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16  Status;         ///< OUT: PXENV_STATUS_xxx
528bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT8   NicType;        ///< OUT: 2=PCI, 3=PnP
529bcecde140a561c64e297225904afebebd62336cejljusten  PCI_PNP_INFO_T PciPnpInfo;
530bcecde140a561c64e297225904afebebd62336cejljusten} PXENV_UNDI_GET_NIC_TYPE_T;
531bcecde140a561c64e297225904afebebd62336cejljusten
532bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
533bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16  Status;           ///< OUT: PXENV_STATUS_xxx
534bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT8   IfaceType[16];    ///< OUT: Type name of MAC, AsciiZ
535bcecde140a561c64e297225904afebebd62336cejljusten
536bcecde140a561c64e297225904afebebd62336cejljusten  /*      format.  This is used by the */
537bcecde140a561c64e297225904afebebd62336cejljusten
538bcecde140a561c64e297225904afebebd62336cejljusten  /*      Universal NDIS Driver to fill */
539bcecde140a561c64e297225904afebebd62336cejljusten
540bcecde140a561c64e297225904afebebd62336cejljusten  /*      the driver type in it's MAC */
541bcecde140a561c64e297225904afebebd62336cejljusten
542bcecde140a561c64e297225904afebebd62336cejljusten  /*      Service specific */
543bcecde140a561c64e297225904afebebd62336cejljusten
544bcecde140a561c64e297225904afebebd62336cejljusten  /*      characteristic table */
545bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT32  LinkSpeed;    ///< OUT:
546bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT32  ServiceFlags; ///< OUT: as defined in NDIS Spec 2.0X
547bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT32  Reserved[4];  ///< OUT: will be filled with 0s till defined
548bcecde140a561c64e297225904afebebd62336cejljusten} PXENV_UNDI_GET_NDIS_INFO_T;
549bcecde140a561c64e297225904afebebd62336cejljusten
550bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
551bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16    Status;   ///< OUT: PXENV_STATUS_xxx
552bcecde140a561c64e297225904afebebd62336cejljusten  IN OUT UINT16 FuncFlag; ///< In: PXENV_UNDI_ISR_IN_xxx
553bcecde140a561c64e297225904afebebd62336cejljusten
554bcecde140a561c64e297225904afebebd62336cejljusten  /* Out: PXENV_UNDI_ISR_OUT_xxx */
555bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16    BufferLength;
556bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16    FrameLength;
557bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16    FrameHeaderLength;
558bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16    FrameOffset;
559bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16    FrameSegSel;
560bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT8     ProtType;
561bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT8     PktType;
562bcecde140a561c64e297225904afebebd62336cejljusten} PXENV_UNDI_ISR_T;
563bcecde140a561c64e297225904afebebd62336cejljusten
564bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_ISR_IN_START 1 /* This function must be first */
565bcecde140a561c64e297225904afebebd62336cejljusten
566bcecde140a561c64e297225904afebebd62336cejljusten/* when an interrupt is received. */
567bcecde140a561c64e297225904afebebd62336cejljusten
568bcecde140a561c64e297225904afebebd62336cejljusten/* It will tell us if the intr */
569bcecde140a561c64e297225904afebebd62336cejljusten
570bcecde140a561c64e297225904afebebd62336cejljusten/* was generated by our device. */
571bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_ISR_IN_PROCESS 2 /* Call to start processing one of */
572bcecde140a561c64e297225904afebebd62336cejljusten
573bcecde140a561c64e297225904afebebd62336cejljusten/* our interrupts. */
574bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_ISR_IN_GET_NEXT  3 /* Call to start/continue receiving */
575bcecde140a561c64e297225904afebebd62336cejljusten
576bcecde140a561c64e297225904afebebd62336cejljusten/* data from receive buffer(s). */
577bcecde140a561c64e297225904afebebd62336cejljusten
578bcecde140a561c64e297225904afebebd62336cejljusten/*++
579bcecde140a561c64e297225904afebebd62336cejljusten
580bcecde140a561c64e297225904afebebd62336cejljusten     Possible responses from PXENV_UNDI_ISR_IN_START
581bcecde140a561c64e297225904afebebd62336cejljusten
582bcecde140a561c64e297225904afebebd62336cejljusten --*/
583bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_ISR_OUT_OURS 0 ///< This is our interrupt.  Deal  with it.
584bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_ISR_OUT_NOT_OURS 1 ///< This is not our interrupt.
585bcecde140a561c64e297225904afebebd62336cejljusten
586bcecde140a561c64e297225904afebebd62336cejljusten/*++
587bcecde140a561c64e297225904afebebd62336cejljusten
588bcecde140a561c64e297225904afebebd62336cejljusten     Possible responses from PXENV_UNDI_ISR_IN_PROCESS and
589bcecde140a561c64e297225904afebebd62336cejljusten     PXENV_UNDI_ISR_IN_PROCESS
590bcecde140a561c64e297225904afebebd62336cejljusten
591bcecde140a561c64e297225904afebebd62336cejljusten--*/
592bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_ISR_OUT_DONE 0       ///< We are done processing this  interrupt.
593bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_ISR_OUT_TRANSMIT 2   ///< We completed a transmit interrupt.
594bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_ISR_OUT_RECEIVE  3   ///< Get data from receive buffer.
595bcecde140a561c64e297225904afebebd62336cejljusten
596bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_ISR_OUT_BUSY     4 /* ? */
597bcecde140a561c64e297225904afebebd62336cejljusten
598bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
599bcecde140a561c64e297225904afebebd62336cejljusten  UINT16  Status;                     ///< Out: PXENV_STATUS_xxx
600bcecde140a561c64e297225904afebebd62336cejljusten} PXENV_STOP_UNDI_T;
601bcecde140a561c64e297225904afebebd62336cejljusten
602bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_STARTED      1     ///< not even initialized
603bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_INITIALIZED  2     ///< initialized and closed (not opened)
604bcecde140a561c64e297225904afebebd62336cejljusten#define PXENV_UNDI_OPENED       3     ///< initialized & opened
605bcecde140a561c64e297225904afebebd62336cejljusten
606bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
607bcecde140a561c64e297225904afebebd62336cejljusten  OUT UINT16  Status;                 ///< Out: PXENV_STATUS_xxx
608bcecde140a561c64e297225904afebebd62336cejljusten  UINT16      UNDI_State;
609bcecde140a561c64e297225904afebebd62336cejljusten} PXENV_UNDI_GET_STATE_T;
610bcecde140a561c64e297225904afebebd62336cejljusten
611bcecde140a561c64e297225904afebebd62336cejljusten#pragma pack()
612bcecde140a561c64e297225904afebebd62336cejljusten
613bcecde140a561c64e297225904afebebd62336cejljusten#endif
614