2 EFI internal structures for the EFI UNDI driver.
4 Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
20 #include <Guid/EventGroup.h>
21 #include <Protocol/PciIo.h>
22 #include <Protocol/NetworkInterfaceIdentifier.h>
23 #include <Protocol/DevicePath.h>
24 #include <Protocol/AdapterInformation.h>
26 #include <Library/UefiDriverEntryPoint.h>
27 #include <Library/UefiRuntimeLib.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>
36 #include <IndustryStandard/Pci.h>
41 extern EFI_DRIVER_BINDING_PROTOCOL gUndiDriverBinding
;
42 extern EFI_COMPONENT_NAME_PROTOCOL gUndiComponentName
;
43 extern EFI_COMPONENT_NAME2_PROTOCOL gUndiComponentName2
;
45 #define MAX_NIC_INTERFACES 16
47 #define EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_REVISION_31 0x00010001
48 #define PXE_ROMID_MINORVER_31 0x10
49 #define PXE_STATFLAGS_DB_WRITE_TRUNCATED 0x2000
52 // UNDI_CALL_TABLE.state can have the following values
56 #define MUST_BE_STARTED 1
57 #define MUST_BE_INITIALIZED 2
59 #define UNDI_DEV_SIGNATURE SIGNATURE_32('u','n','d','i')
60 #define UNDI_DEV_FROM_THIS(a) CR(a, UNDI32_DEV, NIIProtocol_31, UNDI_DEV_SIGNATURE)
61 #define UNDI_DEV_FROM_NIC(a) CR(a, UNDI32_DEV, NicInfo, UNDI_DEV_SIGNATURE)
62 #define UNDI_DEV_FROM_AIP(a) CR(a, UNDI32_DEV, Aip, UNDI_DEV_SIGNATURE)
66 EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL NIIProtocol_31
;
67 EFI_ADAPTER_INFORMATION_PROTOCOL Aip
;
68 EFI_HANDLE DeviceHandle
;
69 EFI_DEVICE_PATH_PROTOCOL
*Undi32BaseDevPath
;
70 EFI_DEVICE_PATH_PROTOCOL
*Undi32DevPath
;
71 NIC_DATA_INSTANCE NicInfo
;
82 typedef VOID (*ptr
)(VOID
);
83 typedef VOID (*bsptr_30
)(UINTN
);
84 typedef VOID (*virtphys_30
)(UINT64
, UINT64
);
85 typedef VOID (*block_30
)(UINT32
);
86 typedef VOID (*mem_io_30
)(UINT8
, UINT8
, UINT64
, UINT64
);
88 typedef VOID (*bsptr
)(UINT64
, UINTN
);
89 typedef VOID (*virtphys
)(UINT64
, UINT64
, UINT64
);
90 typedef VOID (*block
)(UINT64
, UINT32
);
91 typedef VOID (*mem_io
)(UINT64
, UINT8
, UINT8
, UINT64
, UINT64
);
93 typedef VOID (*map_mem
)(UINT64
, UINT64
, UINT32
, UINT32
, UINT64
);
94 typedef VOID (*unmap_mem
)(UINT64
, UINT64
, UINT32
, UINT32
, UINT64
);
95 typedef VOID (*sync_mem
)(UINT64
, UINT64
, UINT32
, UINT32
, UINT64
);
97 extern UNDI_CALL_TABLE api_table
[];
98 extern PXE_SW_UNDI
*pxe_31
; // !pxe structure for 3.1 drivers
99 extern UNDI32_DEV
*UNDI32DeviceList
[MAX_NIC_INTERFACES
];
102 // functions defined in e100b.c
104 UINT8
InByte (NIC_DATA_INSTANCE
*AdapterInfo
, UINT32 Port
);
105 UINT16
InWord (NIC_DATA_INSTANCE
*AdapterInfo
, UINT32 Port
);
106 UINT32
InLong (NIC_DATA_INSTANCE
*AdapterInfo
, UINT32 Port
);
107 VOID
OutByte (NIC_DATA_INSTANCE
*AdapterInfo
, UINT8 Data
, UINT32 Port
);
108 VOID
OutWord (NIC_DATA_INSTANCE
*AdapterInfo
, UINT16 Data
, UINT32 Port
);
109 VOID
OutLong (NIC_DATA_INSTANCE
*AdapterInfo
, UINT32 Data
, UINT32 Port
);
111 UINTN
E100bInit (NIC_DATA_INSTANCE
*AdapterInfo
);
112 UINTN
E100bReset (NIC_DATA_INSTANCE
*AdapterInfo
, INT32 OpFlags
);
113 UINTN
E100bShutdown (NIC_DATA_INSTANCE
*AdapterInfo
);
114 UINTN
E100bTransmit (NIC_DATA_INSTANCE
*AdapterInfo
, UINT64 cpb
, UINT16 opflags
);
115 UINTN
E100bReceive (NIC_DATA_INSTANCE
*AdapterInfo
, UINT64 cpb
, UINT64 db
);
116 UINTN
E100bSetfilter (NIC_DATA_INSTANCE
*AdapterInfo
, UINT16 New_filter
,
117 UINT64 cpb
, UINT32 cpbsize
);
118 UINTN
E100bStatistics(NIC_DATA_INSTANCE
*AdapterInfo
, UINT64 db
, UINT16 dbsize
);
119 UINT8
E100bSetupIAAddr (NIC_DATA_INSTANCE
*AdapterInfo
);
120 UINT8
E100bSetInterruptState (NIC_DATA_INSTANCE
*AdapterInfo
);
122 UINT8
E100bGetEepromAddrLen (NIC_DATA_INSTANCE
*AdapterInfo
);
123 UINT16
E100bReadEeprom (NIC_DATA_INSTANCE
*AdapterInfo
, INT32 Location
, UINT8 address_len
);
124 INT16
E100bReadEepromAndStationAddress (NIC_DATA_INSTANCE
*AdapterInfo
);
127 UINT8
SetupCBlink (NIC_DATA_INSTANCE
*AdapterInfo
);
128 VOID
SetFreeCB (NIC_DATA_INSTANCE
*AdapterInfo
,TxCB
*);
129 TxCB
*GetFreeCB (NIC_DATA_INSTANCE
*AdapterInfo
);
130 UINT16
CheckCBList (NIC_DATA_INSTANCE
*AdapterInfo
);
132 UINT8
SelectiveReset (NIC_DATA_INSTANCE
*AdapterInfo
);
133 UINT16
InitializeChip (NIC_DATA_INSTANCE
*AdapterInfo
);
134 UINT8
SetupReceiveQueues (NIC_DATA_INSTANCE
*AdapterInfo
);
135 VOID
Recycle_RFD (NIC_DATA_INSTANCE
*AdapterInfo
, UINT16
);
136 VOID
XmitWaitForCompletion (NIC_DATA_INSTANCE
*AdapterInfo
);
137 INT8
CommandWaitForCompletion (TxCB
*cmd_ptr
, NIC_DATA_INSTANCE
*AdapterInfo
);
139 BOOLEAN
PhyDetect (NIC_DATA_INSTANCE
*AdapterInfo
);
140 VOID
PhyReset (NIC_DATA_INSTANCE
*AdapterInfo
);
143 IN NIC_DATA_INSTANCE
*AdapterInfo
,
151 IN NIC_DATA_INSTANCE
*AdapterInfo
,
154 IN OUT UINT16
*DataValue
157 BOOLEAN
SetupPhy (NIC_DATA_INSTANCE
*AdapterInfo
);
158 VOID
FindPhySpeedAndDpx (NIC_DATA_INSTANCE
*AdapterInfo
, UINT32 PhyId
);
163 // functions defined in init.c
172 InitializeUNDIDriver (
173 IN EFI_HANDLE ImageHandle
,
174 IN EFI_SYSTEM_TABLE
*SystemTable
178 UNDI_notify_virtual (
185 UndiDriverSupported (
186 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
187 IN EFI_HANDLE Controller
,
188 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
194 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
195 IN EFI_HANDLE Controller
,
196 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
202 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
203 IN EFI_HANDLE Controller
,
204 IN UINTN NumberOfChildren
,
205 IN EFI_HANDLE
*ChildHandleBuffer
210 IN OUT EFI_DEVICE_PATH_PROTOCOL
**DevPtr
,
211 IN EFI_DEVICE_PATH_PROTOCOL
*BaseDevPtr
,
212 IN NIC_DATA_INSTANCE
*AdapterInfo
218 IN UINTN MicroSeconds
231 // functions defined in decode.c
236 IN NIC_DATA_INSTANCE
*AdapterInfo
242 IN NIC_DATA_INSTANCE
*AdapterInfo
248 IN NIC_DATA_INSTANCE
*AdapterInfo
254 IN NIC_DATA_INSTANCE
*AdapterInfo
260 IN NIC_DATA_INSTANCE
*AdapterInfo
266 NIC_DATA_INSTANCE
*AdapterInfo
272 IN NIC_DATA_INSTANCE
*AdapterInfo
278 IN NIC_DATA_INSTANCE
*AdapterInfo
284 IN NIC_DATA_INSTANCE
*AdapterInfo
290 IN NIC_DATA_INSTANCE
*AdapterInfo
296 IN NIC_DATA_INSTANCE
*AdapterInfo
302 IN NIC_DATA_INSTANCE
*AdapterInfo
308 IN NIC_DATA_INSTANCE
*AdapterInfo
314 IN NIC_DATA_INSTANCE
*AdapterInfo
320 IN NIC_DATA_INSTANCE
*AdapterInfo
326 IN NIC_DATA_INSTANCE
*AdapterInfo
332 IN NIC_DATA_INSTANCE
*AdapterInfo
338 IN NIC_DATA_INSTANCE
*AdapterInfo
341 VOID
UNDI_APIEntry_new(UINT64
);
342 VOID
UNDI_APIEntry_Common(UINT64
);
344 PXE_IPV4
convert_mcip(PXE_MAC_ADDR
*);
345 INT32
validate_mcip (PXE_MAC_ADDR
*MCastAddr
);
347 VOID
PxeStructInit (PXE_SW_UNDI
*PxePtr
);
348 VOID
PxeUpdate (NIC_DATA_INSTANCE
*NicPtr
, PXE_SW_UNDI
*PxePtr
);
351 // functions defined in UndiAipImpl.c
355 Returns the current state information for the adapter.
357 This function returns information of type InformationType from the adapter.
358 If an adapter does not support the requested informational type, then
359 EFI_UNSUPPORTED is returned.
361 @param[in] This A pointer to the EFI_ADAPTER_INFORMATION_PROTOCOL instance.
362 @param[in] InformationType A pointer to an EFI_GUID that defines the contents of InformationBlock.
363 @param[out] InforamtionBlock The service returns a pointer to the buffer with the InformationBlock
364 structure which contains details about the data specific to InformationType.
365 @param[out] InforamtionBlockSize The driver returns the size of the InformationBlock in bytes.
367 @retval EFI_SUCCESS The InformationType information was retrieved.
368 @retval EFI_UNSUPPORTED The InformationType is not known.
369 @retval EFI_DEVICE_ERROR The device reported an error.
370 @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.
371 @retval EFI_INVALID_PARAMETER This is NULL.
372 @retval EFI_INVALID_PARAMETER InformationBlock is NULL.
373 @retval EFI_INVALID_PARAMETER InformationBlockSize is NULL.
379 IN EFI_ADAPTER_INFORMATION_PROTOCOL
*This
,
380 IN EFI_GUID
*InformationType
,
381 OUT VOID
**InformationBlock
,
382 OUT UINTN
*InformationBlockSize
386 Sets state information for an adapter.
388 This function sends information of type InformationType for an adapter.
389 If an adapter does not support the requested information type, then EFI_UNSUPPORTED
392 @param[in] This A pointer to the EFI_ADAPTER_INFORMATION_PROTOCOL instance.
393 @param[in] InformationType A pointer to an EFI_GUID that defines the contents of InformationBlock.
394 @param[in] InforamtionBlock A pointer to the InformationBlock structure which contains details
395 about the data specific to InformationType.
396 @param[in] InforamtionBlockSize The size of the InformationBlock in bytes.
398 @retval EFI_SUCCESS The information was received and interpreted successfully.
399 @retval EFI_UNSUPPORTED The InformationType is not known.
400 @retval EFI_DEVICE_ERROR The device reported an error.
401 @retval EFI_INVALID_PARAMETER This is NULL.
402 @retval EFI_INVALID_PARAMETER InformationBlock is NULL.
403 @retval EFI_WRITE_PROTECTED The InformationType cannot be modified using EFI_ADAPTER_INFO_SET_INFO().
409 IN EFI_ADAPTER_INFORMATION_PROTOCOL
*This
,
410 IN EFI_GUID
*InformationType
,
411 IN VOID
*InformationBlock
,
412 IN UINTN InformationBlockSize
416 Get a list of supported information types for this instance of the protocol.
418 This function returns a list of InformationType GUIDs that are supported on an
419 adapter with this instance of EFI_ADAPTER_INFORMATION_PROTOCOL. The list is returned
420 in InfoTypesBuffer, and the number of GUID pointers in InfoTypesBuffer is returned in
421 InfoTypesBufferCount.
423 @param[in] This A pointer to the EFI_ADAPTER_INFORMATION_PROTOCOL instance.
424 @param[out] InfoTypesBuffer A pointer to the list of InformationType GUID pointers that are supported
426 @param[out] InfoTypesBufferCount A pointer to the number of GUID pointers present in InfoTypesBuffer.
428 @retval EFI_SUCCESS The list of information type GUIDs that are supported on this adapter was
429 returned in InfoTypesBuffer. The number of information type GUIDs was
430 returned in InfoTypesBufferCount.
431 @retval EFI_INVALID_PARAMETER This is NULL.
432 @retval EFI_INVALID_PARAMETER InfoTypesBuffer is NULL.
433 @retval EFI_INVALID_PARAMETER InfoTypesBufferCount is NULL.
434 @retval EFI_OUT_OF_RESOURCES There is not enough pool memory to store the results.
439 UndiAipGetSupportedTypes (
440 IN EFI_ADAPTER_INFORMATION_PROTOCOL
*This
,
441 OUT EFI_GUID
**InfoTypesBuffer
,
442 OUT UINTN
*InfoTypesBufferCount