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