~ubuntu-branches/ubuntu/trusty/virtualbox-lts-xenial/trusty-proposed

« back to all changes in this revision

Viewing changes to src/VBox/Devices/EFI/Firmware/IntelFrameworkModulePkg/Csm/BiosThunk/Snp16Dxe/BiosSnp16.h

  • Committer: Package Import Robot
  • Author(s): Gianfranco Costamagna
  • Date: 2016-02-23 14:28:26 UTC
  • Revision ID: package-import@ubuntu.com-20160223142826-bdu69el2z6wa2a44
Tags: upstream-4.3.36-dfsg
ImportĀ upstreamĀ versionĀ 4.3.36-dfsg

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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