1 /** @file
2 
3 Copyright (c) 1999 - 2010, Intel Corporation. All rights reserved.<BR>
4 
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions
7 of the BSD License which accompanies this distribution.  The
8 full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
10 
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 
14 **/
15 
16 #ifndef _BIOS_SNP_16_H_
17 #define _BIOS_SNP_16_H_
18 
19 #include <Uefi.h>
20 
21 #include <Protocol/LegacyBios.h>
22 #include <Protocol/SimpleNetwork.h>
23 #include <Protocol/PciIo.h>
24 #include <Protocol/NetworkInterfaceIdentifier.h>
25 #include <Protocol/DevicePath.h>
26 
27 #include <Library/UefiDriverEntryPoint.h>
28 #include <Library/DebugLib.h>
29 #include <Library/BaseMemoryLib.h>
30 #include <Library/UefiBootServicesTableLib.h>
31 #include <Library/UefiLib.h>
32 #include <Library/BaseLib.h>
33 #include <Library/DevicePathLib.h>
34 #include <Library/MemoryAllocationLib.h>
35 
36 #include <Guid/EventGroup.h>
37 
38 #include <IndustryStandard/Pci.h>
39 
40 #include "Pxe.h"
41 
42 //
43 // BIOS Simple Network Protocol Device Structure
44 //
45 #define EFI_SIMPLE_NETWORK_DEV_SIGNATURE    SIGNATURE_32 ('s', 'n', '1', '6')
46 
47 #define INIT_PXE_STATUS                     0xabcd
48 
49 #define EFI_SIMPLE_NETWORK_MAX_TX_FIFO_SIZE 64
50 
51 typedef struct {
52   UINT32  First;
53   UINT32  Last;
54   VOID *  Data[EFI_SIMPLE_NETWORK_MAX_TX_FIFO_SIZE];
55 } EFI_SIMPLE_NETWORK_DEV_FIFO;
56 
57 typedef struct {
58   UINTN                                     Signature;
59   EFI_HANDLE                                Handle;
60   EFI_SIMPLE_NETWORK_PROTOCOL               SimpleNetwork;
61   EFI_SIMPLE_NETWORK_MODE                   SimpleNetworkMode;
62   EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL Nii;
63   EFI_DEVICE_PATH_PROTOCOL                  *DevicePath;
64   EFI_PCI_IO_PROTOCOL                       *PciIo;
65   EFI_LEGACY_BIOS_PROTOCOL                  *LegacyBios;
66 
67   //
68   // Local Data for Simple Network Protocol interface goes here
69   //
70   BOOLEAN                                   UndiLoaded;
71   EFI_EVENT                                 EfiBootEvent;
72   EFI_EVENT                                 LegacyBootEvent;
73   UINT16                                    PxeEntrySegment;
74   UINT16                                    PxeEntryOffset;
75   EFI_SIMPLE_NETWORK_DEV_FIFO               TxBufferFifo;
76   EFI_DEVICE_PATH_PROTOCOL                  *BaseDevicePath;
77   PXE_T                                     *Pxe;                   ///< Pointer to !PXE structure
78   PXENV_UNDI_GET_INFORMATION_T              GetInformation;         ///< Data from GET INFORMATION
79   PXENV_UNDI_GET_NIC_TYPE_T                 GetNicType;             ///< Data from GET NIC TYPE
80   PXENV_UNDI_GET_NDIS_INFO_T                GetNdisInfo;            ///< Data from GET NDIS INFO
81   BOOLEAN                                   IsrValid;               ///< TRUE if Isr contains valid data
82   PXENV_UNDI_ISR_T                          Isr;                    ///< Data from ISR
83   PXENV_UNDI_TBD_T                          *Xmit;                  //
84   VOID                                      *TxRealModeMediaHeader; ///< < 1 MB Size = 0x100
85   VOID                                      *TxRealModeDataBuffer;  ///< < 1 MB Size = GetInformation.MaxTranUnit
86   VOID                                      *TxDestAddr;            ///< < 1 MB Size = 16
87   UINT8                                     InterruptStatus;        ///< returned/cleared by GetStatus, set in ISR
88   UINTN                                     UndiLoaderTablePages;
89   UINTN                                     DestinationDataSegmentPages;
90   UINTN                                     DestinationStackSegmentPages;
91   UINTN                                     DestinationCodeSegmentPages;
92   VOID                                      *UndiLoaderTable;
93   VOID                                      *DestinationDataSegment;
94   VOID                                      *DestinationStackSegment;
95   VOID                                      *DestinationCodeSegment;
96 } EFI_SIMPLE_NETWORK_DEV;
97 
98 #define EFI_SIMPLE_NETWORK_DEV_FROM_THIS(a) \
99   CR (a, \
100       EFI_SIMPLE_NETWORK_DEV, \
101       SimpleNetwork, \
102       EFI_SIMPLE_NETWORK_DEV_SIGNATURE \
103       )
104 
105 //
106 // Global Variables
107 //
108 extern EFI_DRIVER_BINDING_PROTOCOL  gBiosSnp16DriverBinding;
109 extern EFI_COMPONENT_NAME_PROTOCOL  gBiosSnp16ComponentName;
110 extern EFI_COMPONENT_NAME2_PROTOCOL gBiosSnp16ComponentName2;
111 
112 
113 //
114 // Driver Binding Protocol functions
115 //
116 /**
117   Tests to see if this driver supports a given controller.
118 
119   @param This                 A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
120   @param Controller           The handle of the controller to test.
121   @param RemainingDevicePath  A pointer to the remaining portion of a device path.
122 
123   @retval EFI_SUCCESS    The driver supports given controller.
124   @retval EFI_UNSUPPORT  The driver doesn't support given controller.
125   @retval Other          Other errors prevent driver finishing to test
126                          if the driver supports given controller.
127 **/
128 EFI_STATUS
129 EFIAPI
130 BiosSnp16DriverBindingSupported (
131   IN EFI_DRIVER_BINDING_PROTOCOL  *This,
132   IN EFI_HANDLE                   Controller,
133   IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath
134   )
135 ;
136 
137 /**
138   Starts the Snp device controller
139 
140   @param This                 A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
141   @param Controller           The handle of the controller to test.
142   @param RemainingDevicePath  A pointer to the remaining portion of a device path.
143 
144   @retval  EFI_SUCCESS          - The device was started.
145   @retval  EFI_DEVICE_ERROR     - The device could not be started due to a device error.
146   @retval  EFI_OUT_OF_RESOURCES - The request could not be completed due to a lack of resources.
147 **/
148 EFI_STATUS
149 EFIAPI
150 BiosSnp16DriverBindingStart (
151   IN EFI_DRIVER_BINDING_PROTOCOL  *This,
152   IN EFI_HANDLE                   Controller,
153   IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath
154   )
155 ;
156 
157 /**
158   Stops the device by given device controller.
159 
160   @param This               A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
161   @param Controller         The handle of the controller to test.
162   @param NumberOfChildren   The number of child device handles in ChildHandleBuffer.
163   @param ChildHandleBuffer  An array of child handles to be freed. May be NULL if
164                             NumberOfChildren is 0.
165 
166   @retval  EFI_SUCCESS      - The device was stopped.
167   @retval  EFI_DEVICE_ERROR - The device could not be stopped due to a device error.
168 **/
169 EFI_STATUS
170 EFIAPI
171 BiosSnp16DriverBindingStop (
172   IN  EFI_DRIVER_BINDING_PROTOCOL  *This,
173   IN  EFI_HANDLE                   Controller,
174   IN  UINTN                        NumberOfChildren,
175   IN  EFI_HANDLE                   *ChildHandleBuffer
176   )
177 ;
178 
179 //
180 // Simple Network Protocol functions
181 //
182 /**
183   Call 16 bit UNDI ROM to start the network interface
184 
185   @param This       A pointer to EFI_SIMPLE_NETWORK_PROTOCOL structure.
186 
187   @retval EFI_DEVICE_ERROR Network interface has not be initialized.
188   @retval EFI_DEVICE_ERROR Fail to execute 16 bit ROM call.
189   @retval EFI_SUCESS       Success operation.
190 **/
191 EFI_STATUS
192 EFIAPI
193 Undi16SimpleNetworkStart (
194   IN EFI_SIMPLE_NETWORK_PROTOCOL  *This
195   )
196 ;
197 
198 /**
199   Call 16 bit UNDI ROM to stop the network interface
200 
201   @param This       A pointer to EFI_SIMPLE_NETWORK_PROTOCOL structure.
202 
203   @retval EFI_DEVICE_ERROR Network interface has not be initialized.
204   @retval EFI_DEVICE_ERROR Fail to execute 16 bit ROM call.
205   @retval EFI_SUCESS       Success operation.
206 **/
207 EFI_STATUS
208 EFIAPI
209 Undi16SimpleNetworkStop (
210   IN EFI_SIMPLE_NETWORK_PROTOCOL  *This
211   )
212 ;
213 
214 /**
215   Initialize network interface
216 
217   @param This                 A pointer to EFI_SIMPLE_NETWORK_PROTOCOL structure.
218   @param ExtraRxBufferSize    The size of extra request receive buffer.
219   @param ExtraTxBufferSize    The size of extra request transmit buffer.
220 
221   @retval EFI_DEVICE_ERROR Fail to execute 16 bit ROM call.
222   @retval EFI_SUCESS       Success operation.
223 **/
224 EFI_STATUS
225 EFIAPI
226 Undi16SimpleNetworkInitialize (
227   IN EFI_SIMPLE_NETWORK_PROTOCOL                     *This,
228   IN UINTN                                           ExtraRxBufferSize  OPTIONAL,
229   IN UINTN                                           ExtraTxBufferSize  OPTIONAL
230   )
231 ;
232 
233 /**
234   Reset network interface.
235 
236   @param This                 A pointer to EFI_SIMPLE_NETWORK_PROTOCOL structure.
237   @param ExtendedVerification Need extended verfication.
238 
239   @retval EFI_INVALID_PARAMETER Invalid This paramter.
240   @retval EFI_DEVICE_ERROR      Network device has not been initialized.
241   @retval EFI_NOT_STARTED       Network device has been stopped.
242   @retval EFI_DEVICE_ERROR      Invalid status for network device
243   @retval EFI_SUCCESS           Success operation.
244 **/
245 EFI_STATUS
246 EFIAPI
247 Undi16SimpleNetworkReset (
248   IN EFI_SIMPLE_NETWORK_PROTOCOL  *This,
249   IN BOOLEAN                      ExtendedVerification
250   )
251 ;
252 
253 /**
254   Shutdown network interface.
255 
256   @param This                 A pointer to EFI_SIMPLE_NETWORK_PROTOCOL structure.
257 
258   @retval EFI_INVALID_PARAMETER Invalid This paramter.
259   @retval EFI_DEVICE_ERROR      Network device has not been initialized.
260   @retval EFI_NOT_STARTED       Network device has been stopped.
261   @retval EFI_DEVICE_ERROR      Invalid status for network device
262   @retval EFI_SUCCESS           Success operation.
263 **/
264 EFI_STATUS
265 EFIAPI
266 Undi16SimpleNetworkShutdown (
267   IN EFI_SIMPLE_NETWORK_PROTOCOL  *This
268   )
269 ;
270 
271 /**
272   Reset network interface.
273 
274   @param This                 A pointer to EFI_SIMPLE_NETWORK_PROTOCOL structure.
275   @param Enable               Enable mask value
276   @param Disable              Disable mask value
277   @param ResetMCastFilter     Whether reset multi cast filter or not
278   @param MCastFilterCnt       Count of mutli cast filter for different MAC address
279   @param MCastFilter          Buffer for mustli cast filter for different MAC address.
280 
281   @retval EFI_INVALID_PARAMETER Invalid This paramter.
282   @retval EFI_DEVICE_ERROR      Network device has not been initialized.
283   @retval EFI_NOT_STARTED       Network device has been stopped.
284   @retval EFI_DEVICE_ERROR      Invalid status for network device
285   @retval EFI_SUCCESS           Success operation.
286 **/
287 EFI_STATUS
288 EFIAPI
289 Undi16SimpleNetworkReceiveFilters (
290   IN EFI_SIMPLE_NETWORK_PROTOCOL                     * This,
291   IN UINT32                                          Enable,
292   IN UINT32                                          Disable,
293   IN BOOLEAN                                         ResetMCastFilter,
294   IN UINTN                                           MCastFilterCnt     OPTIONAL,
295   IN EFI_MAC_ADDRESS                                 * MCastFilter OPTIONAL
296   )
297 ;
298 
299 /**
300   Set new MAC address.
301 
302   @param This                 A pointer to EFI_SIMPLE_NETWORK_PROTOCOL structure.
303   @param Reset                Whether reset station MAC address to permenent address
304   @param New                  A pointer to New address
305 
306   @retval EFI_INVALID_PARAMETER Invalid This paramter.
307   @retval EFI_DEVICE_ERROR      Network device has not been initialized.
308   @retval EFI_NOT_STARTED       Network device has been stopped.
309   @retval EFI_DEVICE_ERROR      Invalid status for network device
310   @retval EFI_SUCCESS           Success operation.
311 **/
312 EFI_STATUS
313 EFIAPI
314 Undi16SimpleNetworkStationAddress (
315   IN EFI_SIMPLE_NETWORK_PROTOCOL  * This,
316   IN BOOLEAN                      Reset,
317   IN EFI_MAC_ADDRESS              * New OPTIONAL
318   )
319 ;
320 
321 /**
322   Collect statistics.
323 
324   @param This                 A pointer to EFI_SIMPLE_NETWORK_PROTOCOL structure.
325   @param Reset                Whether cleanup old statistics data.
326   @param StatisticsSize       The buffer of statistics table.
327   @param StatisticsTable      A pointer to statistics buffer.
328 
329   @retval EFI_INVALID_PARAMETER Invalid This paramter.
330   @retval EFI_DEVICE_ERROR      Network device has not been initialized.
331   @retval EFI_NOT_STARTED       Network device has been stopped.
332   @retval EFI_DEVICE_ERROR      Invalid status for network device
333   @retval EFI_SUCCESS           Success operation.
334 **/
335 EFI_STATUS
336 EFIAPI
337 Undi16SimpleNetworkStatistics (
338   IN EFI_SIMPLE_NETWORK_PROTOCOL  * This,
339   IN BOOLEAN                      Reset,
340   IN OUT UINTN                    *StatisticsSize OPTIONAL,
341   OUT EFI_NETWORK_STATISTICS      * StatisticsTable OPTIONAL
342   )
343 ;
344 
345 /**
346   Translate IP address to MAC address.
347 
348   @param This                 A pointer to EFI_SIMPLE_NETWORK_PROTOCOL structure.
349   @param IPv6                 IPv6 or IPv4
350   @param IP                   A pointer to given Ip address.
351   @param MAC                  On return, translated MAC address.
352 
353   @retval EFI_INVALID_PARAMETER Invalid This paramter.
354   @retval EFI_INVALID_PARAMETER Invalid IP address.
355   @retval EFI_INVALID_PARAMETER Invalid return buffer for holding MAC address.
356   @retval EFI_UNSUPPORTED       Do not support IPv6
357   @retval EFI_DEVICE_ERROR      Network device has not been initialized.
358   @retval EFI_NOT_STARTED       Network device has been stopped.
359   @retval EFI_DEVICE_ERROR      Invalid status for network device
360   @retval EFI_SUCCESS           Success operation.
361 **/
362 EFI_STATUS
363 EFIAPI
364 Undi16SimpleNetworkMCastIpToMac (
365   IN EFI_SIMPLE_NETWORK_PROTOCOL  *This,
366   IN BOOLEAN                      IPv6,
367   IN EFI_IP_ADDRESS               *IP,
368   OUT EFI_MAC_ADDRESS             *MAC
369   )
370 ;
371 
372 /**
373   Performs read and write operations on the NVRAM device attached to a
374   network interface.
375 
376   @param  This       The protocol instance pointer.
377   @param  ReadWrite  TRUE for read operations, FALSE for write operations.
378   @param  Offset     Byte offset in the NVRAM device at which to start the read or
379                      write operation. This must be a multiple of NvRamAccessSize and
380                      less than NvRamSize.
381   @param  BufferSize The number of bytes to read or write from the NVRAM device.
382                      This must also be a multiple of NvramAccessSize.
383   @param  Buffer     A pointer to the data buffer.
384 
385   @retval EFI_SUCCESS           The NVRAM access was performed.
386   @retval EFI_NOT_STARTED       The network interface has not been started.
387   @retval EFI_INVALID_PARAMETER One or more of the parameters has an unsupported value.
388   @retval EFI_DEVICE_ERROR      The command could not be sent to the network interface.
389   @retval EFI_UNSUPPORTED       This function is not supported by the network interface.
390 
391 **/
392 EFI_STATUS
393 EFIAPI
394 Undi16SimpleNetworkNvData (
395   IN EFI_SIMPLE_NETWORK_PROTOCOL  *This,
396   IN BOOLEAN                      Write,
397   IN UINTN                        Offset,
398   IN UINTN                        BufferSize,
399   IN OUT VOID                     *Buffer
400   )
401 ;
402 
403 /**
404   Reads the current interrupt status and recycled transmit buffer status from
405   a network interface.
406 
407   @param  This            The protocol instance pointer.
408   @param  InterruptStatus A pointer to the bit mask of the currently active interrupts
409                           If this is NULL, the interrupt status will not be read from
410                           the device. If this is not NULL, the interrupt status will
411                           be read from the device. When the  interrupt status is read,
412                           it will also be cleared. Clearing the transmit  interrupt
413                           does not empty the recycled transmit buffer array.
414   @param  TxBuf           Recycled transmit buffer address. The network interface will
415                           not transmit if its internal recycled transmit buffer array
416                           is full. Reading the transmit buffer does not clear the
417                           transmit interrupt. If this is NULL, then the transmit buffer
418                           status will not be read. If there are no transmit buffers to
419                           recycle and TxBuf is not NULL, * TxBuf will be set to NULL.
420 
421   @retval EFI_SUCCESS           The status of the network interface was retrieved.
422   @retval EFI_NOT_STARTED       The network interface has not been started.
423   @retval EFI_INVALID_PARAMETER One or more of the parameters has an unsupported value.
424   @retval EFI_DEVICE_ERROR      The command could not be sent to the network interface.
425   @retval EFI_UNSUPPORTED       This function is not supported by the network interface.
426 
427 **/
428 EFI_STATUS
429 EFIAPI
430 Undi16SimpleNetworkGetStatus (
431   IN EFI_SIMPLE_NETWORK_PROTOCOL  * This,
432   OUT UINT32                      *InterruptStatus OPTIONAL,
433   OUT VOID                        **TxBuf OPTIONAL
434   )
435 ;
436 
437 /**
438   Places a packet in the transmit queue of a network interface.
439 
440   @param  This       The protocol instance pointer.
441   @param  HeaderSize The size, in bytes, of the media header to be filled in by
442                      the Transmit() function. If HeaderSize is non-zero, then it
443                      must be equal to This->Mode->MediaHeaderSize and the DestAddr
444                      and Protocol parameters must not be NULL.
445   @param  BufferSize The size, in bytes, of the entire packet (media header and
446                      data) to be transmitted through the network interface.
447   @param  Buffer     A pointer to the packet (media header followed by data) to be
448                      transmitted. This parameter cannot be NULL. If HeaderSize is zero,
449                      then the media header in Buffer must already be filled in by the
450                      caller. If HeaderSize is non-zero, then the media header will be
451                      filled in by the Transmit() function.
452   @param  SrcAddr    The source HW MAC address. If HeaderSize is zero, then this parameter
453                      is ignored. If HeaderSize is non-zero and SrcAddr is NULL, then
454                      This->Mode->CurrentAddress is used for the source HW MAC address.
455   @param  DestAddr   The destination HW MAC address. If HeaderSize is zero, then this
456                      parameter is ignored.
457   @param  Protocol   The type of header to build. If HeaderSize is zero, then this
458                      parameter is ignored. See RFC 1700, section "Ether Types", for
459                      examples.
460 
461   @retval EFI_SUCCESS           The packet was placed on the transmit queue.
462   @retval EFI_NOT_STARTED       The network interface has not been started.
463   @retval EFI_NOT_READY         The network interface is too busy to accept this transmit request.
464   @retval EFI_BUFFER_TOO_SMALL  The BufferSize parameter is too small.
465   @retval EFI_INVALID_PARAMETER One or more of the parameters has an unsupported value.
466   @retval EFI_DEVICE_ERROR      The command could not be sent to the network interface.
467   @retval EFI_UNSUPPORTED       This function is not supported by the network interface.
468 
469 **/
470 EFI_STATUS
471 EFIAPI
472 Undi16SimpleNetworkTransmit (
473   IN EFI_SIMPLE_NETWORK_PROTOCOL  *This,
474   IN UINTN                        HeaderSize,
475   IN UINTN                        BufferSize,
476   IN VOID                         *Buffer,
477   IN EFI_MAC_ADDRESS              *SrcAddr OPTIONAL,
478   IN EFI_MAC_ADDRESS              *DestAddr OPTIONAL,
479   IN UINT16                       *Protocol OPTIONAL
480   )
481 ;
482 
483 /**
484   Receives a packet from a network interface.
485 
486   @param  This       The protocol instance pointer.
487   @param  HeaderSize The size, in bytes, of the media header received on the network
488                      interface. If this parameter is NULL, then the media header size
489                      will not be returned.
490   @param  BufferSize On entry, the size, in bytes, of Buffer. On exit, the size, in
491                      bytes, of the packet that was received on the network interface.
492   @param  Buffer     A pointer to the data buffer to receive both the media header and
493                      the data.
494   @param  SrcAddr    The source HW MAC address. If this parameter is NULL, the
495                      HW MAC source address will not be extracted from the media
496                      header.
497   @param  DestAddr   The destination HW MAC address. If this parameter is NULL,
498                      the HW MAC destination address will not be extracted from the
499                      media header.
500   @param  Protocol   The media header type. If this parameter is NULL, then the
501                      protocol will not be extracted from the media header. See
502                      RFC 1700 section "Ether Types" for examples.
503 
504   @retval  EFI_SUCCESS           The received data was stored in Buffer, and BufferSize has
505                                  been updated to the number of bytes received.
506   @retval  EFI_NOT_STARTED       The network interface has not been started.
507   @retval  EFI_NOT_READY         The network interface is too busy to accept this transmit
508                                  request.
509   @retval  EFI_BUFFER_TOO_SMALL  The BufferSize parameter is too small.
510   @retval  EFI_INVALID_PARAMETER One or more of the parameters has an unsupported value.
511   @retval  EFI_DEVICE_ERROR      The command could not be sent to the network interface.
512   @retval  EFI_UNSUPPORTED       This function is not supported by the network interface.
513 
514 **/
515 EFI_STATUS
516 EFIAPI
517 Undi16SimpleNetworkReceive (
518   IN EFI_SIMPLE_NETWORK_PROTOCOL  *This,
519   OUT UINTN                       *HeaderSize OPTIONAL,
520   IN OUT UINTN                    *BufferSize,
521   OUT VOID                        *Buffer,
522   OUT EFI_MAC_ADDRESS             *SrcAddr OPTIONAL,
523   OUT EFI_MAC_ADDRESS             *DestAddr OPTIONAL,
524   OUT UINT16                      *Protocol OPTIONAL
525   )
526 ;
527 
528 /**
529   wait for a packet to be received.
530 
531   @param Event      Event used with WaitForEvent() to wait for a packet to be received.
532   @param Context    Event Context
533 
534 **/
535 VOID
536 EFIAPI
537 Undi16SimpleNetworkWaitForPacket (
538   IN EFI_EVENT               Event,
539   IN VOID                    *Context
540   )
541 ;
542 
543 /**
544   Check whether packet is ready for receive.
545 
546   @param This The protocol instance pointer.
547 
548   @retval  EFI_SUCCESS           Receive data is ready.
549   @retval  EFI_NOT_STARTED       The network interface has not been started.
550   @retval  EFI_NOT_READY         The network interface is too busy to accept this transmit
551                                  request.
552   @retval  EFI_BUFFER_TOO_SMALL  The BufferSize parameter is too small.
553   @retval  EFI_INVALID_PARAMETER One or more of the parameters has an unsupported value.
554   @retval  EFI_DEVICE_ERROR      The command could not be sent to the network interface.
555   @retval  EFI_UNSUPPORTED       This function is not supported by the network interface.
556 **/
557 EFI_STATUS
558 Undi16SimpleNetworkCheckForPacket (
559   IN EFI_SIMPLE_NETWORK_PROTOCOL *This
560   )
561 ;
562 
563 /**
564  Cache Interrupt verctor address converted from IVT number.
565 
566  @param VectorNumber  IVT number
567 
568  @retval EFI_SUCCESS Success to operation.
569 **/
570 EFI_STATUS
571 CacheVectorAddress (
572   UINT8   VectorNumber
573   )
574 ;
575 
576 /**
577  Get interrupt vector address according to IVT number.
578 
579  @param VectorNumber    Given IVT number
580 
581  @return cached interrupt vector address.
582 **/
583 EFI_STATUS
584 RestoreCachedVectorAddress (
585   UINT8   VectorNumber
586   )
587 ;
588 
589 /**
590   If available, launch the BaseCode from a NIC option ROM.
591   This should install the !PXE and PXENV+ structures in memory for
592   subsequent use.
593 
594 
595   @param SimpleNetworkDevice    Simple network device instance
596   @param RomAddress             The ROM base address for NIC rom.
597 
598   @retval EFI_NOT_FOUND         The check sum does not match
599   @retval EFI_NOT_FOUND         Rom ID offset is wrong
600   @retval EFI_NOT_FOUND         No Rom ID structure is found
601 **/
602 EFI_STATUS
603 LaunchBaseCode (
604   EFI_SIMPLE_NETWORK_DEV  *SimpleNetworkDevice,
605   UINTN                   RomAddress
606   )
607 ;
608 
609 /**
610   PXE
611   START UNDI
612   Op-Code: PXENV_START_UNDI (0000h)
613   Input: Far pointer to a PXENV_START_UNDI_T parameter structure that has been initialized by the caller.
614   Output: PXENV_EXIT_SUCCESS or PXENV_EXIT_FAILURE must be returned in AX. The status field in
615   the parameter structure must be set to one of the values represented by the PXENV_STATUS_xxx
616   constants.
617   Description: This service is used to pass the BIOS parameter registers to the UNDI driver. The UNDI driver is
618   responsible for saving the information it needs to communicate with the hardware.
619   This service is also responsible for hooking the Int 1Ah service routine
620   Note: This API service must be called only once during UNDI Option ROM boot.
621   The UNDI driver is responsible for saving this information and using it every time
622   PXENV_UNDI_STARTUP is called.
623   Service cannot be used in protected mode.
624   typedef struct  {
625       PXENV_STATUS Status;
626       UINT16 AX;
627       UINT16 BX;
628       UINT16 DX;
629       UINT16 DI;
630       UINT16 ES;
631   } PXENV_START_UNDI_T;
632   Set before calling API service
633   AX, BX, DX, DI, ES: BIOS initialization parameter registers. These
634   fields should contain the same information passed to the option ROM
635   initialization routine by the Host System BIOS. Information about the
636   contents of these registers can be found in the [PnP], [PCI] and
637   [BBS] specifications.
638   Returned from API service
639   Status: See the PXENV_STATUS_xxx constants.
640 
641   @param  SimpleNetworkDevice   Device instance
642   @param  PxeUndiTable          Point to structure which hold paramter and return value
643                                 for option ROM call.
644 
645   @return Return value of PXE option ROM far call.
646 **/
647 EFI_STATUS
648 PxeStartUndi (
649   IN EFI_SIMPLE_NETWORK_DEV               *SimpleNetworkDevice,
650   IN OUT PXENV_START_UNDI_T               *PxeUndiTable
651   )
652 ;
653 
654 /**
655   PXE
656   UNDI STARTUP
657   Op-Code: PXENV_UNDI_STARTUP (0001h)
658   Input: Far pointer to a PXENV_UNDI_STARTUP_T parameter structure that has been initialized by the
659   caller.
660   Output: PXENV_EXIT_SUCCESS or PXENV_EXIT_FAILURE must be returned in AX. The status field in
661   the parameter structure must be set to one of the values represented by the
662   PXENV_STATUS_xxx constants.
663   Description: This API is responsible for initializing the contents of the UNDI code & data segment for proper
664   operation. Information from the !PXE structure and the first PXENV_START_UNDI API call is used
665   to complete this initialization. The rest of the UNDI APIs will not be available until this call has
666   been completed.
667   Note: PXENV_UNDI_STARTUP must not be called again without first calling
668   PXENV_UNDI_SHUTDOWN.
669   PXENV_UNDI_STARTUP and PXENV_UNDI_SHUTDOWN are no longer responsible for
670   chaining interrupt 1Ah. This must be done by the PXENV_START_UNDI and
671   PXENV_STOP_UNDI API calls.
672   This service cannot be used in protected mode.
673   typedef struct
674   {
675       PXENV_STATUS Status;
676   } PXENV_UNDI_STARTUP_T;
677   Set before calling API service
678   N/A
679   Returned from API service
680   Status: See the PXENV_STATUS_xxx constants.
681 
682   @param  SimpleNetworkDevice   Device instance
683   @param  PxeUndiTable          Point to structure which hold paramter and return value
684                                 for option ROM call.
685 
686   @return Return value of PXE option ROM far call.
687 **/
688 EFI_STATUS
689 PxeUndiStartup (
690   IN EFI_SIMPLE_NETWORK_DEV               *SimpleNetworkDevice,
691   IN OUT PXENV_UNDI_STARTUP_T             *PxeUndiTable
692   )
693 ;
694 
695 /**
696   PXE
697   UNDI CLEANUP
698   Op-Code: PXENV_UNDI_CLEANUP (0002h)
699   Input: Far pointer to a PXENV_UNDI_CLEANUP_T parameter structure.
700   Output: PXENV_EXIT_SUCCESS or PXENV_EXIT_FAILURE must be returned in AX. The status field
701   in the parameter structure must be set to one of the values represented by the
702   PXENV_STATUS_xxx constants.
703   Description: This call will prepare the network adapter driver to be unloaded from memory. This call must be
704   made just before unloading the Universal NIC Driver. The rest of the API will not be available
705   after this call executes.
706   This service cannot be used in protected mode.
707   typedef struct {
708       PXENX_STATUS Status;
709   } PXENV_UNDI_CLEANUP_T;
710   Set before calling API service
711   N/A
712   Returned from API service
713   Status: See the PXENV_STATUS_xxx constants.
714 
715   @param  SimpleNetworkDevice   Device instance
716   @param  PxeUndiTable          Point to structure which hold paramter and return value
717                                 for option ROM call.
718 
719   @return Return value of PXE option ROM far call.
720 **/
721 EFI_STATUS
722 PxeUndiCleanup (
723   IN EFI_SIMPLE_NETWORK_DEV               *SimpleNetworkDevice,
724   IN OUT PXENV_UNDI_CLEANUP_T             *PxeUndiTable
725   )
726 ;
727 
728 /**
729   PXE
730   UNDI INITIALIZE
731   Op-Code: PXENV_UNDI_INITIALIZE (0003h)
732   Input: Far pointer to a PXENV_UNDI_INITIALIZE_T parameter structure that has been initialized by the
733   caller.
734   Output: PXENV_EXIT_SUCCESS or PXENV_EXIT_FAILURE must be returned in AX. The status field in
735   the parameter structure must be set to one of the values represented by the PXENV_STATUS_xxx
736   constants.
737   Description: This call resets the adapter and programs it with default parameters. The default parameters used
738   are those supplied to the most recent UNDI_STARTUP call. This routine does not enable the
739   receive and transmit units of the network adapter to readily receive or transmit packets. The
740   application must call PXENV_UNDI_OPEN to logically connect the network adapter to the network.
741   This call must be made by an application to establish an interface to the network adapter driver.
742   Note: When the PXE code makes this call to initialize the network adapter, it passes a NULL pointer for
743   the Protocol field in the parameter structure.
744   typedef struct {
745     PXENV_STATUS Status;
746     ADDR32 ProtocolIni;
747     UINT8 reserved[8];
748   } PXENV_UNDI_INITIALIZE_T;
749   Set before calling API service
750   ProtocolIni: Physical address of a memory copy of the driver
751   module from the protocol.ini file obtained from the protocol manager
752   driver (refer to the NDIS 2.0 specification). This parameter is
753   supported for the universal NDIS driver to pass the information
754   contained in the protocol.ini file to the NIC driver for any specific
755   configuration of the NIC. (Note that the module identification in the
756   protocol.ini file was done by NDIS.) This value can be NULL for any
757   other application interfacing to the universal NIC driver
758   Returned from API service
759   Status: See the PXENV_STATUS_xxx constants.
760 
761   @param  SimpleNetworkDevice   Device instance.
762   @param  PxeUndiTable          Point to structure which hold paramter and return value
763                                 for option ROM call.
764 
765   @return Return value of PXE option ROM far call.
766 **/
767 EFI_STATUS
768 PxeUndiInitialize (
769   IN EFI_SIMPLE_NETWORK_DEV               *SimpleNetworkDevice,
770   IN OUT PXENV_UNDI_INITIALIZE_T          *PxeUndiTable
771   )
772 ;
773 
774 /**
775   Wrapper routine for reset adapter.
776 
777   PXE
778   UNDI RESET ADAPTER
779   Op-Code: PXENV_UNDI_RESET_ADAPTER (0004h)
780   Input: Far pointer to a PXENV_UNDI_RESET_ADAPTER_t parameter structure that has been initialized
781   by the caller.
782   Output: PXENV_EXIT_SUCCESS or PXENV_EXIT_FAILURE must be returned in AX. The status field in
783   the parameter structure must be set to one of the values represented by the PXENV_STATUS_xxx
784   constants.
785   Description: This call resets and reinitializes the network adapter with the same set of parameters supplied to
786   Initialize Routine. Unlike Initialize, this call opens the adapter that is, it connects logically to the
787   network. This routine cannot be used to replace Initialize or Shutdown calls.
788   typedef struct {
789     PXENV_STATUS Status;
790     PXENV_UNDI_MCAST_ADDRESS_t    R_Mcast_Buf;
791   } PXENV_UNDI_RESET_T;
792 
793   #define MAXNUM_MCADDR 8
794 
795   typedef struct {
796     UINT16 MCastAddrCount;
797     MAC_ADDR McastAddr[MAXNUM_MCADDR];
798   } PXENV_UNDI_MCAST_ADDRESS_t;
799 
800   Set before calling API service
801   R_Mcast_Buf: This is a structure of MCastAddrCount and
802   McastAddr.
803   MCastAddrCount: Number of multicast MAC addresses in the
804   buffer.
805   McastAddr: List of up to MAXNUM_MCADDR multicast MAC
806   addresses.
807   Returned from API service
808   Status: See the PXENV_STATUS_xxx constants.
809 
810   @param  SimpleNetworkDevice   Device instance.
811   @param  PxeUndiTable          Point to structure which hold paramter and return value
812                                 for option ROM call.
813   @param  RxFilter             Filter setting mask value for PXE recive .
814 
815   @return Return value of PXE option ROM far call.
816 **/
817 EFI_STATUS
818 PxeUndiResetNic (
819   IN EFI_SIMPLE_NETWORK_DEV               *SimpleNetworkDevice,
820   IN OUT PXENV_UNDI_RESET_T               *PxeUndiTable,
821   IN UINT16                               RxFilter
822   )
823 ;
824 
825 /**
826   PXE
827   UNDI SHUTDOWN
828   Op-Code: PXENV_UNDI_SHUTDOWN (0005h)
829   Input: Far pointer to a PXENV_UNDI_SHUTDOWN_T parameter.
830   Output: PXENV_EXIT_SUCCESS or PXENV_EXIT_FAILURE must be returned in AX. The status field in
831   the parameter structure must be set to one of the values represented by the PXENV_STATUS_xxx
832   constants.
833   Description: This call resets the network adapter and leaves it in a safe state for another driver to program it.
834   Note: The contents of the PXENV_UNDI_STARTUP parameter structure need to be saved by the
835   Universal NIC Driver in case PXENV_UNDI_INITIALIZE is called again.
836   typedef struct
837   {
838     PXENV_STATUS Status;
839   } PXENV_UNDI_SHUTDOWN_T;
840   Set before calling API service
841   N/A
842   Returned from API service
843   Status: See the PXENV_STATUS_xxx constants.
844 
845   @param  SimpleNetworkDevice   Device instance
846   @param  PxeUndiTable          Point to structure which hold paramter and return value
847                                 for option ROM call.
848 
849   @return Return value of PXE option ROM far call.
850 **/
851 EFI_STATUS
852 PxeUndiShutdown (
853   IN EFI_SIMPLE_NETWORK_DEV               *SimpleNetworkDevice,
854   IN OUT PXENV_UNDI_SHUTDOWN_T            *PxeUndiTable
855   )
856 ;
857 
858 /**
859   PXE
860   UNDI OPEN
861   Op-Code: PXENV_UNDI_OPEN (0006h)
862   Input: Far pointer to a PXENV_UNDI_OPEN_T parameter structure that has been initialized by the caller.
863   Output: PXENV_EXIT_SUCCESS or PXENV_EXIT_FAILURE must be returned in AX. The status field in
864   the parameter structure must be set to one of the values represented by the PXENV_STATUS_xxx
865   constants.
866   Description: This call activates the adapter network connection and sets the adapter ready to accept packets
867   for transmit and receive.
868   typedef struct {
869     PXENV_STATUS Status;
870     UINT16 OpenFlag;
871     UINT16 PktFilter;
872       #define FLTR_DIRECTED 0x0001
873       #define FLTR_BRDCST 0x0002
874       #define FLTR_PRMSCS 0x0004
875       #define FLTR_SRC_RTG 0x0008
876     PXENV_UNDI_MCAST_ADDRESS_t R_Mcast_Buf;
877   } PXENV_UNDI_OPEN_T;
878   Set before calling API service
879   OpenFlag: This is an adapter specific input parameter. This is
880   supported for the universal NDIS 2.0 driver to pass in the open flags
881   provided by the protocol driver. (See the NDIS 2.0 specification.)
882   This can be zero.
883   PktFilter: Filter for receiving packets. This can be one, or more, of
884   the FLTR_xxx constants. Multiple values are arithmetically or-ed
885   together.
886   directed packets are packets that may come to your MAC address
887   or the multicast MAC address.
888   R_Mcast_Buf: See definition in UNDI RESET ADAPTER (0004h).
889   Returned from API service
890   Status: See the PXENV_STATUS_xxx constants.
891 
892   @param  SimpleNetworkDevice   Device instance
893   @param  PxeUndiTable          Point to structure which hold paramter and return value
894                                 for option ROM call.
895 
896   @return Return value of PXE option ROM far call.
897 **/
898 EFI_STATUS
899 PxeUndiOpen (
900   IN EFI_SIMPLE_NETWORK_DEV               *SimpleNetworkDevice,
901   IN OUT PXENV_UNDI_OPEN_T                *PxeUndiTable
902   )
903 ;
904 
905 /**
906   PXE
907   UNDI CLOSE
908   Op-Code: PXENV_UNDI_CLOSE (0007h)
909   Input: Far pointer to a PXENV_UNDI_CLOSE_T parameter.
910   Output: PXENV_EXIT_SUCCESS or PXENV_EXIT_FAILURE must be returned in AX. The status field in
911   the parameter structure must be set to one of the values represented by the PXENV_STATUS_xxx
912   constants.
913   Description: This call disconnects the network adapter from the network. Packets cannot be transmitted or
914   received until the network adapter is open again.
915   typedef struct {
916     PXENV_STATUS Status;
917   } PXENV_UNDI_CLOSE_T;
918   Set before calling API service
919   N/A
920   Returned from API service
921   Status: See the PXENV_STATUS_xxx constants.
922 
923   @param  SimpleNetworkDevice   Device instance
924   @param  PxeUndiTable          Point to structure which hold paramter and return value
925                                 for option ROM call.
926 
927   @return Return value of PXE option ROM far call.
928 **/
929 EFI_STATUS
930 PxeUndiClose (
931   IN EFI_SIMPLE_NETWORK_DEV               *SimpleNetworkDevice,
932   IN OUT PXENV_UNDI_CLOSE_T               *PxeUndiTable
933   )
934 ;
935 
936 /**
937   PXE
938   UNDI TRANSMIT PACKET
939   Op-Code: PXENV_UNDI_TRANSMIT (0008h)
940   Input: Far pointer to a PXENV_UNDI_TRANSMIT_T parameter structure that
941   has been initialized by the caller.
942   Output: PXENV_EXIT_SUCCESS or PXENV_EXIT_FAILURE must be returned in AX.
943   The status code must be set to one of the values represented by the
944   PXENV_STATUS_xxx constants.
945   Description: This call transmits a buffer to the network. The media header
946   for the packet can be filled by the calling protocol, but it might not be.
947   The network adapter driver will fill it if required by the values in the
948   parameter block. The packet is buffered for transmission provided there is
949   an available buffer, and the function returns PXENV_EXIT_SUCCESS. If no
950   buffer is available the function returns PXENV_EXIT_FAILURE with a status
951   code of PXE_UNDI_STATUS__OUT OF_RESOURCE. The number of buffers is
952   implementation-dependent. An interrupt is generated on completion of the
953   transmission of one or more packets. A call to PXENV_UNDI_TRANSMIT is
954   permitted in the context of a transmit complete interrupt.
955 
956   typedef struct {
957     PXENV_STATUS Status;
958     UINT8 Protocol;
959       #define P_UNKNOWN 0
960       #define P_IP 1
961       #define P_ARP 2
962       #define P_RARP 3
963     UINT8 XmitFlag;
964       #define XMT_DESTADDR 0x0000
965       #define XMT_BROADCAST 0x0001
966     SEGOFF16 DestAddr;
967     SEGOFF16 TBD;
968     UINT32 Reserved[2];
969   } t_PXENV_UNDI_TRANSMIT;
970 
971   #define MAX_DATA_BLKS 8
972 
973   typedef struct {
974     UINT16 ImmedLength;
975     SEGOFF16 Xmit;
976     UINT16 DataBlkCount;
977     struct DataBlk {
978       UINT8 TDPtrType;
979       UINT8 TDRsvdByte;
980       UINT16 TDDataLen;
981       SEGOFF16 TDDataPtr;
982     } DataBlock[MAX_DATA_BLKS];
983   } PXENV_UNDI_TBD_T
984 
985   Set before calling API service
986   Protocol: This is the protocol of the upper layer that is calling UNDI
987   TRANSMIT call. If the upper layer has filled the media header, this
988   field must be P_UNKNOWN.
989   XmitFlag: If this flag is XMT_DESTADDR, the NIC driver expects a
990   pointer to the destination media address in the field DestAddr. If
991   XMT_BROADCAST, the NIC driver fills the broadcast address for the
992   destination.
993   TBD: Segment:Offset address of the transmit buffer descriptor.
994   ImmedLength: Length of the immediate transmit buffer: Xmit.
995   Xmit: Segment:Offset of the immediate transmit buffer.
996   DataBlkCount: Number of blocks in this transmit buffer.
997   TDPtrType:
998   0 => 32-bit physical address in TDDataPtr (not supported in this
999   version of PXE)
1000   1 => segment:offset in TDDataPtr which can be a real mode or 16-bit
1001   protected mode pointer
1002   TDRsvdByte: Reserved must be zero.
1003   TDDatalen: Data block length in bytes.
1004   TDDataPtr: Segment:Offset of the transmit block.
1005   DataBlock: Array of transmit data blocks.
1006   Returned from API service
1007   Status: See the PXENV_STATUS_xxx constants
1008 
1009   @param  SimpleNetworkDevice   Device instance
1010   @param  PxeUndiTable          Point to structure which hold paramter and return value
1011                                 for option ROM call.
1012 
1013   @return Return value of PXE option ROM far call.
1014 **/
1015 EFI_STATUS
1016 PxeUndiTransmit (
1017   IN EFI_SIMPLE_NETWORK_DEV               *SimpleNetworkDevice,
1018   IN OUT PXENV_UNDI_TRANSMIT_T            *PxeUndiTable
1019   )
1020 ;
1021 
1022 /**
1023   PXE
1024   UNDI SET MULTICAST ADDRESS
1025   Op-Code: PXENV_UNDI_SET_MCAST_ADDRESS (0009h)
1026   Input: Far pointer to a PXENV_TFTP_SET_MCAST_ADDRESS_t parameter structure that has been
1027   initialized by the caller.
1028   Output: PXENV_EXIT_SUCCESS or PXENV_EXIT_FAILURE must be returned in AX. The status field in
1029   the parameter structure must be set to one of the values represented by the PXENV_STATUS_xxx
1030   constants.
1031   Description: This call changes the current list of multicast addresses to the input list and resets the network
1032   adapter to accept it. If the number of multicast addresses is zero, multicast is disabled.
1033   typedef struct {
1034     PXENV_STATUS Status;
1035     PXENV_UNDI_MCAST_ADDRESS_t R_Mcast_Buf;
1036   } PXENV_UNDI_SET_MCAST_ADDR_T;
1037   Set before calling API service
1038   R_Mcast_Buf: See description in the UNDI RESET ADAPTER
1039   (0004h) API.
1040   Returned from API service
1041   Status: See the PXENV_STATUS_xxx constants
1042 
1043   @param  SimpleNetworkDevice   Device instance
1044   @param  PxeUndiTable          Point to structure which hold paramter and return value
1045                                 for option ROM call.
1046 
1047   @return Return value of PXE option ROM far call.
1048 **/
1049 EFI_STATUS
1050 PxeUndiSetMcastAddr (
1051   IN EFI_SIMPLE_NETWORK_DEV               *SimpleNetworkDevice,
1052   IN OUT PXENV_UNDI_SET_MCAST_ADDR_T      *PxeUndiTable
1053   )
1054 ;
1055 
1056 /**
1057   PXE
1058   UNDI SET STATION ADDRESS
1059   Op-Code: PXENV_UNDI_SET_STATION_ADDRESS (000Ah)
1060   Input: Far pointer to a PXENV_UNDI_SET_STATION_ADDRESS_t parameter structure that has been
1061   initialized by the caller.
1062   Output: PXENV_EXIT_SUCCESS or PXENV_EXIT_FAILURE must be returned in AX. The status field in
1063   the parameter structure must be set to one of the values represented by the PXENV_STATUS_xxx
1064   constants.
1065   Description: This call sets the MAC address to be the input value and is called before opening the network
1066   adapter. Later, the open call uses this variable as a temporary MAC address to program the
1067   adapter individual address registers.
1068   typedef struct {
1069     PXENV_STATUS Status;
1070     MAC_ADDR StationAddress;
1071   } PXENV_UNDI_SET_STATION_ADDR_T;
1072   Set before calling API service
1073   StationAddress: Temporary MAC address to be used for
1074   transmit and receive.
1075   Returned from API service
1076   Status: See the PXENV_STATUS_xxx constants.
1077 
1078   @param  SimpleNetworkDevice   Device instance
1079   @param  PxeUndiTable          Point to structure which hold paramter and return value
1080                                 for option ROM call.
1081 
1082   @return Return value of PXE option ROM far call.
1083 **/
1084 EFI_STATUS
1085 PxeUndiSetStationAddr (
1086   IN EFI_SIMPLE_NETWORK_DEV               *SimpleNetworkDevice,
1087   IN OUT PXENV_UNDI_SET_STATION_ADDR_T    *PxeUndiTable
1088   )
1089 ;
1090 
1091 /**
1092   PXE
1093   UNDI SET PACKET FILTER
1094   Op-Code: PXENV_UNDI_SET_PACKET_FILTER (000Bh)
1095   Input: Far pointer to a PXENV_UNDI_SET_PACKET_FILTER_T parameter structure that has been
1096   initialized by the caller.
1097   Output: PXENV_EXIT_SUCCESS or PXENV_EXIT_FAILURE must be returned in AX. The status field in
1098   the parameter structure must be set to one of the values represented by the PXENV_STATUS_xxx
1099   constants.
1100   Description: This call resets the adapter's receive unit to accept a new filter, different from the one provided with
1101   the open call.
1102   typedef struct {
1103     PXENV_STATUS Status;
1104     UINT8 filter;
1105   } PXENV_UNDI_SET_PACKET_FILTER_T;
1106   Set before calling API service
1107   Filter: See the receive filter values in the UNDI OPEN
1108   (0006h) API description.
1109   Returned from API service
1110   Status: See the PXENV_STATUS_xxx constants.
1111 
1112   @param  SimpleNetworkDevice   Device instance
1113   @param  PxeUndiTable          Point to structure which hold paramter and return value
1114                                 for option ROM call.
1115 
1116   @return Return value of PXE option ROM far call.
1117 **/
1118 EFI_STATUS
1119 PxeUndiSetPacketFilter (
1120   IN EFI_SIMPLE_NETWORK_DEV               *SimpleNetworkDevice,
1121   IN OUT PXENV_UNDI_SET_PACKET_FILTER_T   *PxeUndiTable
1122   )
1123 ;
1124 
1125 /**
1126   PXE
1127   UNDI GET INFORMATION
1128   Op-Code: PXENV_UNDI_GET_INFORMATION (000Ch)
1129   Input: Far pointer to a PXENV_UNDI_GET_INFORMATION_T parameter structure that has been
1130   initialized by the caller.
1131   Output: PXENV_EXIT_SUCCESS or PXENV_EXIT_FAILURE must be returned in AX. The status field in
1132   the parameter structure must be set to one of the values represented by the
1133   PXENV_STATUS_xxx constants.
1134   Description: This call copies the network adapter variables, including the MAC address, into the input buffer.
1135   Note: The PermNodeAddress field must be valid after PXENV_START_UNDI and
1136   PXENV_UNDI_STARTUP have been issued. All other fields must be valid after
1137   PXENV_START_UNDI, PXENV_UNDI_STARTUP and PXENV_UNDI_INITIALIZE have been
1138   called.
1139   typedef struct {
1140     PXENV_STATUS Status;
1141     UINT16 BaseIo;
1142     UINT16 IntNumber;
1143     UINT16 MaxTranUnit;
1144     UINT16 HwType;
1145       #define ETHER_TYPE 1
1146       #define EXP_ETHER_TYPE 2
1147       #define IEEE_TYPE 6
1148       #define ARCNET_TYPE 7
1149     UINT16 HwAddrLen;
1150     MAC_ADDR CurrentNodeAddress;
1151     MAC_ADDR PermNodeAddress;
1152     SEGSEL ROMAddress;
1153     UINT16 RxBufCt;
1154     UINT16 TxBufCt;
1155   } PXENV_UNDI_GET_INFORMATION_T;
1156   Set before calling API service
1157   N/A
1158   Returned from API service
1159   Status: See the PXENV_STATUS_xxx constants.
1160   BaseIO: Adapter base I/O address.
1161   IntNumber: Adapter IRQ number.
1162   MaxTranUnit: Adapter maximum transmit unit.
1163   HWType: Type of protocol at the hardware level.
1164   HWAddrLen: Length of the hardware address.
1165   CurrentNodeAddress: Current hardware address.
1166   PermNodeAddress: Permanent hardware address.
1167   ROMAddress: Real mode ROM segment address.
1168   RxBufCnt: Receive queue length.
1169   TxBufCnt: Transmit queue length.
1170 
1171   @param  SimpleNetworkDevice   Device instance
1172   @param  PxeUndiTable          Point to structure which hold paramter and return value
1173                                 for option ROM call.
1174 
1175   @return Return value of PXE option ROM far call.
1176 **/
1177 EFI_STATUS
1178 PxeUndiGetInformation (
1179   IN EFI_SIMPLE_NETWORK_DEV               *SimpleNetworkDevice,
1180   IN OUT PXENV_UNDI_GET_INFORMATION_T     *PxeUndiTable
1181   )
1182 ;
1183 
1184 /**
1185   PXE
1186   UNDI GET STATISTICS
1187   Op-Code: PXENV_UNDI_GET_STATISTICS (000Dh)
1188   Input: Far pointer to a PXENV_UNDI_GET_STATISTICS_T parameter structure that has been initialized
1189   by the caller.
1190   Output: PXENV_EXIT_SUCCESS or PXENV_EXIT_FAILURE must be returned in AX. The status field in
1191   the parameter structure must be set to one of the values represented by the PXENV_STATUS_xxx
1192   constants.
1193   Description: This call reads statistical information from the network adapter, and returns.
1194   typedef struct {
1195     PXENV_STATUS Status;
1196     UINT32 XmtGoodFrames;
1197     UINT32 RcvGoodFrames;
1198     UINT32 RcvCRCErrors;
1199     UINT32 RcvResourceErrors;
1200   } PXENV_UNDI_GET_STATISTICS_T;
1201   Set before calling API service
1202   N/A
1203   Returned from API service
1204   Status: See the PXENV_STATUS_xxx constants.
1205   XmtGoodFrames: Number of successful transmissions.
1206   RcvGoodFrames: Number of good frames received.
1207   RcvCRCErrors: Number of frames received with CRC
1208   error.
1209   RcvResourceErrors: Number of frames discarded
1210   because receive queue was full.
1211 
1212   @param  SimpleNetworkDevice   Device instance
1213   @param  PxeUndiTable          Point to structure which hold paramter and return value
1214                                 for option ROM call.
1215 
1216   @return Return value of PXE option ROM far call.
1217 **/
1218 EFI_STATUS
1219 PxeUndiGetStatistics (
1220   IN EFI_SIMPLE_NETWORK_DEV               *SimpleNetworkDevice,
1221   IN OUT PXENV_UNDI_GET_STATISTICS_T      *PxeUndiTable
1222   )
1223 ;
1224 
1225 /**
1226   PXE
1227   UNDI CLEAR STATISTICS
1228   Op-Code: PXENV_UNDI_CLEAR_STATISTICS (000Eh)
1229   Input: Far pointer to a PXENV_UNDI_CLEAR_STATISTICS_T parameter.
1230   Output: PXENV_EXIT_SUCCESS or PXENV_EXIT_FAILURE must be returned in AX. The status field in
1231   the parameter structure must be set to one of the values represented by the
1232   PXENV_STATUS_xxx constants.
1233   Description: This call clears the statistical information from the network adapter.
1234   typedef struct {
1235     PXENV_STATUS Status;
1236   } PXENV_UNDI_CLEAR_STATISTICS_T;
1237   Set before calling API service
1238   N/A
1239   Returned from API service
1240   Status: See the PXENV_STATUS_xxx constants.
1241 
1242   @param  SimpleNetworkDevice   Device instance
1243   @param  PxeUndiTable          Point to structure which hold paramter and return value
1244                                 for option ROM call.
1245 
1246   @return Return value of PXE option ROM far call.
1247 **/
1248 EFI_STATUS
1249 PxeUndiClearStatistics (
1250   IN EFI_SIMPLE_NETWORK_DEV               *SimpleNetworkDevice,
1251   IN OUT PXENV_UNDI_CLEAR_STATISTICS_T    *PxeUndiTable
1252   )
1253 ;
1254 
1255 /**
1256   PXE
1257   UNDI INITIATE DIAGS
1258   Op-Code: PXENV_UNDI_INITIATE_DIAGS (000Fh)
1259   Input: Far pointer to a PXENV_UNDI_INITIATE_DIAGS_T parameter.
1260   Output: PXENV_EXIT_SUCCESS or PXENV_EXIT_FAILURE must be returned in AX. The status field in
1261   the parameter structure must be set to one of the values represented by the
1262   PXENV_STATUS_xxx constants.
1263   Description: This call can be used to initiate the run-time diagnostics. It causes the network adapter to run
1264   hardware diagnostics and to update its status information.
1265   typedef struct {
1266     PXENV_STATUS Status;
1267   } PXENV_UNDI_INITIATE_DIAGS_T;
1268   Set before calling API service
1269   N/A
1270   Returned from API service
1271   Status: See the PXENV_STATUS_xxx constants.
1272 
1273   @param  SimpleNetworkDevice   Device instance
1274   @param  PxeUndiTable          Point to structure which hold paramter and return value
1275                                 for option ROM call.
1276 
1277   @return Return value of PXE option ROM far call.
1278 **/
1279 EFI_STATUS
1280 PxeUndiInitiateDiags (
1281   IN EFI_SIMPLE_NETWORK_DEV               *SimpleNetworkDevice,
1282   IN OUT PXENV_UNDI_INITIATE_DIAGS_T      *PxeUndiTable
1283   )
1284 ;
1285 
1286 /**
1287   PXE
1288   UNDI FORCE INTERRUPT
1289   Op-Code: PXENV_UNDI_FORCE_INTERRUPT (0010h)
1290   Input: Far pointer to a PXENV_UNDI_FORCE_INTERRUPT_T parameter structure that has been
1291   initialized by the caller.
1292   Output: PXENV_EXIT_SUCCESS or PXENV_EXIT_FAILURE must be returned in AX. The status field in
1293   the parameter structure must be set to one of the values represented by the PXENV_STATUS_xxx
1294   constants.
1295   Description: This call forces the network adapter to generate an interrupt. When a receive interrupt occurs, the
1296   network adapter driver usually queues the packet and calls the application's callback receive
1297   routine with a pointer to the packet received. Then, the callback routine either can copy the packet
1298   to its buffer or can decide to delay the copy to a later time. If the packet is not immediately copied,
1299   the network adapter driver does not remove it from the input queue. When the application wants to
1300   copy the packet, it can call the PXENV_UNDI_FORCE_INTERRUPT routine to simulate the receive
1301   interrupt.
1302   typedef struct {
1303     PXENV_STATUS Status;
1304   } PXENV_UNDI_FORCE_INTERRUPT_T;
1305   Set before calling API service
1306   N/A
1307   Returned from API service
1308   Status: See the PXENV_STATUS_xxx constants.
1309 
1310   @param  SimpleNetworkDevice   Device instance
1311   @param  PxeUndiTable          Point to structure which hold paramter and return value
1312                                 for option ROM call.
1313 
1314   @return Return value of PXE option ROM far call.
1315 **/
1316 EFI_STATUS
1317 PxeUndiForceInterrupt (
1318   IN EFI_SIMPLE_NETWORK_DEV               *SimpleNetworkDevice,
1319   IN OUT PXENV_UNDI_FORCE_INTERRUPT_T     *PxeUndiTable
1320   )
1321 ;
1322 
1323 /**
1324   PXE
1325   UNDI GET MULTICAST ADDRESS
1326   Op-Code: PXENV_UNDI_GET_MCAST_ADDRESS (0011h)
1327   Input: Far pointer to a PXENV_GET_MCAST_ADDRESS_t parameter structure that has been initialized
1328   by the caller.
1329   Output: PXENV_EXIT_SUCCESS or PXENV_EXIT_FAILURE must be returned in AX. The status field in
1330   the parameter structure must be set to one of the values represented by the PXENV_STATUS_xxx
1331   constants.
1332   Description: This call converts the given IP multicast address to a hardware multicast address.
1333   typedef struct  {
1334     PXENV_STATUS Status;
1335     IP4 InetAddr;
1336     MAC_ADDR MediaAddr;
1337   } PXENV_UNDI_GET_MCAST_ADDR_T;
1338   Set before calling API service
1339   InetAddr: IP multicast address.
1340   Returned from API service
1341   Status: See the PXENV_STATUS_xxx constants.
1342   MediaAddr: MAC multicast address.
1343 
1344   @param  SimpleNetworkDevice   Device instance
1345   @param  PxeUndiTable          Point to structure which hold paramter and return value
1346                                 for option ROM call.
1347 
1348   @return Return value of PXE option ROM far call.
1349 **/
1350 EFI_STATUS
1351 PxeUndiGetMcastAddr (
1352   IN EFI_SIMPLE_NETWORK_DEV               *SimpleNetworkDevice,
1353   IN OUT PXENV_UNDI_GET_MCAST_ADDR_T      *PxeUndiTable
1354   )
1355 ;
1356 
1357 /**
1358   PXE
1359   UNDI GET NIC TYPE
1360   Op-Code: PXENV_UNDI_GET_NIC_TYPE (0012h)
1361   Input: Far pointer to a PXENV_UNDI_GET_NIC_TYPE_T parameter structure that has been initialized by
1362   the caller.
1363   Output: PXENV_EXIT_SUCCESS or PXENV_EXIT_FAILURE must be returned in AX. The status field in
1364   the parameter structure must be set to one of the values represented by the PXENV_STATUS_xxx
1365   constants. If the PXENV_EXIT_SUCCESS is returned the parameter structure must contain the
1366   NIC information.
1367   Description: This call, if successful, provides the NIC-specific information necessary to identify the network
1368   adapter that is used to boot the system.
1369   Note: The application first gets the DHCPDISCOVER packet using GET_CACHED_INFO and checks if
1370   the UNDI is supported before making this call. If the UNDI is not supported, the NIC-specific
1371   information can be obtained from the DHCPDISCOVER packet itself.
1372   PXENV_START_UNDI, PXENV_UNDI_STARTUP and PXENV_UNDI_INITIALIZE must be called
1373   before the information provided is valid.
1374   typedef {
1375     PXENV_STATUS Status;
1376     UINT8 NicType;
1377       #define PCI_NIC 2
1378       #define PnP_NIC 3
1379       #define CardBus_NIC 4
1380     Union {
1381       Struct {
1382         UINT16 Vendor_ID;
1383         UINT16 Dev_ID;
1384         UINT8 Base_Class;
1385         UINT8 Sub_Class;
1386         UINT8 Prog_Intf;
1387         UINT8 Rev;
1388         UINT16 BusDevFunc;
1389         UINT16 SubVendor_ID;
1390         UINT16 SubDevice_ID;
1391       } pci, cardbus;
1392       struct {
1393         UINT32 EISA_Dev_ID;
1394         UINT8 Base_Class;
1395         UINT8 Sub_Class;
1396         UINT8 Prog_Intf;
1397         UINT16 CardSelNum;
1398       } pnp;
1399     } info;
1400   } PXENV_UNDI_GET_NIC_TYPE_T;
1401   Set before calling API service
1402   N/A
1403   Returned from API service
1404   Status: See the PXENV_STATUS_xxx constants.
1405   NICType: Type of NIC information stored in the parameter
1406   structure.
1407   Info: Information about the fields in this union can be found
1408   in the [PnP] and [PCI] specifications
1409 
1410   @param  SimpleNetworkDevice   Device instance
1411   @param  PxeUndiTable          Point to structure which hold paramter and return value
1412                                 for option ROM call.
1413 
1414   @return Return value of PXE option ROM far call.
1415 **/
1416 EFI_STATUS
1417 PxeUndiGetNicType (
1418   IN EFI_SIMPLE_NETWORK_DEV               *SimpleNetworkDevice,
1419   IN OUT PXENV_UNDI_GET_NIC_TYPE_T        *PxeUndiTable
1420   )
1421 ;
1422 
1423 /**
1424   PXE
1425   UNDI GET IFACE INFO
1426   Op-Code: PXENV_UNDI_GET_IFACE_INFO (0013h)
1427   Input: Far pointer to a PXENV_UNDI_GET_IFACE_INFO_t parameter structure that has been initialized
1428   by the caller.
1429   Output: PXENV_EXIT_SUCCESS or PXENV_EXIT_FAILURE must be returned in AX. The status field in
1430   the parameter structure must be set to one of the values represented by the PXENV_STATUS_xxx
1431   constants. If the PXENV_EXIT_SUCCESS is returned, the parameter structure must contain the
1432   interface specific information.
1433   Description: This call, if successful, provides the network interface specific information such as the interface
1434   type at the link layer (Ethernet, Tokenring) and the link speed. This information can be used in the
1435   universal drivers such as NDIS or Miniport to communicate to the upper protocol modules.
1436   Note: UNDI follows the NDIS2 specification in giving this information. It is the responsibility of the
1437   universal driver to translate/convert this information into a format that is required in its specification
1438   or to suit the expectation of the upper level protocol modules.
1439   PXENV_START_UNDI, PXENV_UNDI_STARTUP and PXENV_UNDI_INITIALIZE must be called
1440   before the information provided is valid.
1441   typedef struct {
1442     PXENV_STATUS Status
1443     UINT8 IfaceType[16];
1444     UINT32 LinkSpeed;
1445     UINT32 ServiceFlags;
1446     UINT32 Reserved[4];
1447   } PXENV_UNDI_GET_NDIS_INFO_T;
1448   Set before calling API service
1449   N/A
1450   Returned from API service
1451   Status: See the PXENV_STATUS_xxx constants.
1452   IfaceType: Name of MAC type in ASCIIZ format. This is
1453   used by the universal NDIS driver to specify its driver type
1454   to the protocol driver.
1455   LinkSpeed: Defined in the NDIS 2.0 specification.
1456   ServiceFlags: Defined in the NDIS 2.0 specification.
1457   Reserved: Must be zero.
1458 
1459   @param  SimpleNetworkDevice   Device instance
1460   @param  PxeUndiTable          Point to structure which hold paramter and return value
1461                                 for option ROM call.
1462 
1463   @return Return value of PXE option ROM far call.
1464 **/
1465 EFI_STATUS
1466 PxeUndiGetNdisInfo (
1467   IN EFI_SIMPLE_NETWORK_DEV               *SimpleNetworkDevice,
1468   IN OUT PXENV_UNDI_GET_NDIS_INFO_T       *PxeUndiTable
1469   )
1470 ;
1471 
1472 /**
1473   PXE
1474   UNDI ISR
1475   Op-Code: PXENV_UNDI_ISR (0014h)
1476   Input: Far pointer to a PXENV_UNDI_ISR_T parameter structure that has been initialized by the caller.
1477   Output: PXENV_EXIT_SUCCESS or PXENV_EXIT_FAILURE must be returned in AX. The status field in
1478   the parameter structure must be set to one of the values represented by the PXENV_STATUS_xxx
1479   constants.
1480   Description: This API function will be called at different levels of processing the interrupt. The FuncFlag field in
1481   the parameter block indicates the operation to be performed for the call. This field is filled with the
1482   status of that operation on return.
1483   Note: Interrupt Service Routine Operation:
1484   In this design the UNDI does not hook the interrupt for the Network Interface. Instead, the
1485   application or the protocol driver hooks the interrupt and calls UNDI with the PXENV_UNDI_ISR
1486   API call for interrupt verification (PXENV_UNDI_ISR_IN_START) and processing
1487   (PXENV_UNDI_ISR_IN_PROCESS and PXENV_UNDI_ISR_GET_NEXT).
1488   When the Network Interface HW generates an interrupt the protocol driver interrupt service
1489   routine (ISR) gets control and takes care of the interrupt processing at the PIC level. The ISR then
1490   calls the UNDI using the PXENV_UNDI_ISR API with the value PXENV_UNDI_ISR_IN_START for
1491   the FuncFlag parameter. At this time UNDI must disable the interrupts at the Network Interface
1492   level and read any status values required to further process the interrupt. UNDI must return as
1493   quickly as possible with one of the two values, PXENV_UNDI_ISR_OUT_OURS or
1494   PXENV_UNDI_ISR_OUT_NOT_OURS, for the parameter FuncFlag depending on whether the
1495   interrupt was generated by this particular Network Interface or not.
1496   If the value returned in FuncFlag is PXENV_UNDI_ISR_OUT_NOT_OURS, then the interrupt was
1497   not generated by our NIC, and interrupt processing is complete.
1498   If the value returned in FuncFlag is PXENV_UNDI_ISR_OUT_OURS, the protocol driver must start
1499   a handler thread and send an end-of-interrupt (EOI) command to the PIC. Interrupt processing is
1500   now complete.
1501   The protocol driver strategy routine will call UNDI using this same API with FuncFlag equal to
1502   PXENV_UNDI_ISR_IN_PROCESS. At this time UNDI must find the cause of this interrupt and
1503   return the status in the FuncFlag. It first checks if there is a frame received and if so it returns the
1504   first buffer pointer of that frame in the parameter block.
1505   The protocol driver calls UNDI repeatedly with the FuncFlag equal to
1506   PXENV_UNDI_ISR_IN_GET_NEXT to get all the buffers in a frame and also all the received
1507   frames in the queue. On this call, UNDI must remember the previous buffer given to the protoco,l
1508   remove it from the receive queue and recycle it. In case of a multi-buffered frame, if the previous
1509   buffer is not the last buffer in the frame it must return the next buffer in the frame in the parameter
1510   block. Otherwise it must return the first buffer in the next frame.
1511   If there is no received frame pending to be processed, UNDI processes the transmit completes and
1512   if there is no other interrupt status to be processed, UNDI re-enables the interrupt at the
1513   NETWORK INTERFACE level and returns PXENV_UNDI_ISR_OUT_DONE in the FuncFlag.
1514   IMPORTANT: It is possible for the protocol driver to be interrupted again while in the
1515   strategy routine when the UNDI re-enables interrupts.
1516 
1517   @param  SimpleNetworkDevice   Device instance
1518   @param  PxeUndiTable          Point to structure which hold paramter and return value
1519                                 for option ROM call.
1520 
1521   @return Return value of PXE option ROM far call.
1522 **/
1523 EFI_STATUS
1524 PxeUndiIsr (
1525   IN EFI_SIMPLE_NETWORK_DEV               *SimpleNetworkDevice,
1526   IN OUT PXENV_UNDI_ISR_T                 *PxeUndiTable
1527   )
1528 ;
1529 
1530 /**
1531   PXE
1532   STOP UNDI
1533   Op-Code: PXENV_STOP_UNDI (0015h)
1534   Input: Far pointer to a PXENV_STOP_UNDI_T parameter structure that has been initialized by the caller.
1535   Output: PXENV_EXIT_SUCCESS or PXENV_EXIT_FAILURE must be returned in AX. The status field in
1536   the parameter structure must be set to one of the values represented by the PXENV_STATUS_xxx
1537   constants.
1538   Description: This routine is responsible for unhooking the Int 1Ah service routine.
1539   Note: This API service must be called only once at the end of UNDI Option ROM boot. One of the valid
1540   status codes is PXENV_STATUS_KEEP. If this status is returned, UNDI must not be removed from
1541   base memory. Also, UNDI must not be removed from base memory if BC is not removed from base
1542   memory.
1543   Service cannot be used in protected mode.
1544   typedef struct {
1545     PXENV_STATUS Status;
1546   } PXENV_STOP_UNDI_T;
1547   Set before calling API service
1548   N/A
1549   Returned from API service
1550   Status: See the PXENV_STATUS_xxx constants.
1551 
1552   @param  SimpleNetworkDevice   Device instance
1553   @param  PxeUndiTable          Point to structure which hold paramter and return value
1554                                 for option ROM call.
1555 
1556   @return Return value of PXE option ROM far call.
1557 **/
1558 EFI_STATUS
1559 PxeUndiStop (
1560   IN EFI_SIMPLE_NETWORK_DEV               *SimpleNetworkDevice,
1561   IN OUT PXENV_STOP_UNDI_T                *PxeUndiTable
1562   )
1563 ;
1564 
1565 /**
1566   PXE
1567   UNDI GET STATE
1568   Op-Code: PXENV_UNDI_GET_STATE (0015h)
1569   Input: Far pointer to a PXENV_UNDI_GET_STATE_T parameter.
1570   Output: PXENV_EXIT_SUCCESS or PXENV_EXIT_FAILURE must be returned in AX. The status field in
1571   the parameter structure must be set to one of the values represented by the PXENV_STATUS_xxx
1572   constants. The UNDI_STATE field in the parameter structure must be set to one of the valid state
1573   constants
1574   Description: This call can be used to obtain state of the UNDI engine in order to avoid issuing adverse call
1575   sequences
1576   typedef struct {
1577     #define PXE_UNDI_GET_STATE_STARTED 1
1578     #define PXE_UNDI_GET_STATE_INITIALIZED 2
1579     #define PXE_UNDI_GET_STATE_OPENED 3
1580     PXENV_STATUS Status;
1581     UINT8 UNDIstate;
1582   } PXENV_UNDI_GET_STATE_T;
1583   Set before calling API service
1584   N/A
1585   Returned from API service
1586   Status: See the PXENV_STATUS_xxx constants.
1587   State: See definitions of the state constants.
1588   Note. UNDI implementation is responsible for maintaining
1589   internal state machine.
1590   UNDI ISR
1591   Op-Code: PXENV_UNDI_ISR (0014h)
1592   Input: Far pointer to a t_PXENV_UNDI_ISR parameter structure that has been initialized by the caller.
1593   Output: PXENV_EXIT_SUCCESS or PXENV_EXIT_FAILURE must be returned in AX. The status field in
1594   the parameter structure must be set to one of the values represented by the PXENV_STATUS_xxx
1595   constants.
1596   Description: This API function will be called at different levels of processing the interrupt. The FuncFlag field in
1597   the parameter block indicates the operation to be performed for the call. This field is filled with the
1598   status of that operation on return.
1599 
1600   @param  SimpleNetworkDevice   Device instance
1601   @param  PxeUndiTable          Point to structure which hold paramter and return value
1602                                 for option ROM call.
1603 
1604   @return Return value of PXE option ROM far call.
1605 **/
1606 EFI_STATUS
1607 PxeUndiGetState (
1608   IN EFI_SIMPLE_NETWORK_DEV               *SimpleNetworkDevice,
1609   IN OUT PXENV_UNDI_GET_STATE_T           *PxeUndiTable
1610   )
1611 ;
1612 
1613 /**
1614   Effect the Far Call into the PXE Layer
1615 
1616   Note: When using a 32-bit stack segment do not push 32-bit words onto the stack. The PXE API
1617   services will not work, unless there are three 16-bit parameters pushed onto the stack.
1618       push DS                                 ;Far pointer to parameter structure
1619       push offset pxe_data_call_struct        ;is pushed onto stack.
1620       push Index                              ;UINT16 is pushed onto stack.
1621       call dword ptr (s_PXE ptr es:[di]).EntryPointSP
1622       add sp, 6 ;Caller cleans up stack.
1623 
1624   @param SimpleNetworkDevice    Device instance for simple network
1625   @param Table                 Point to parameter/retun value table for legacy far call
1626   @param TableSize              The size of paramter/return value table
1627   @param CallIndex              The index of legacy call.
1628 
1629   @return EFI_STATUS
1630 **/
1631 EFI_STATUS
1632 MakePxeCall (
1633   EFI_SIMPLE_NETWORK_DEV  *SimpleNetworkDevice,
1634   IN OUT VOID             *Table,
1635   IN UINTN                TableSize,
1636   IN UINT16               CallIndex
1637   )
1638 ;
1639 
1640 /**
1641   Allocate buffer below 1M for real mode.
1642 
1643   @param NumPages     The number pages want to be allocated.
1644   @param Buffer       On return, allocated buffer.
1645 
1646   @return Status of allocating pages.
1647 **/
1648 EFI_STATUS
1649 BiosSnp16AllocatePagesBelowOneMb (
1650   UINTN  NumPages,
1651   VOID   **Buffer
1652   )
1653 ;
1654 
1655 #endif
1656