2 EFI internal structures for the EFI UNDI driver.
4 Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
14 #include <Guid/EventGroup.h>
15 #include <Protocol/PciIo.h>
16 #include <Protocol/NetworkInterfaceIdentifier.h>
17 #include <Protocol/DevicePath.h>
18 #include <Protocol/AdapterInformation.h>
20 #include <Library/UefiDriverEntryPoint.h>
21 #include <Library/UefiRuntimeLib.h>
22 #include <Library/DebugLib.h>
23 #include <Library/BaseMemoryLib.h>
24 #include <Library/UefiBootServicesTableLib.h>
25 #include <Library/UefiLib.h>
26 #include <Library/BaseLib.h>
27 #include <Library/DevicePathLib.h>
28 #include <Library/MemoryAllocationLib.h>
30 #include <IndustryStandard/Pci.h>
35 extern EFI_DRIVER_BINDING_PROTOCOL gUndiDriverBinding
;
36 extern EFI_COMPONENT_NAME_PROTOCOL gUndiComponentName
;
37 extern EFI_COMPONENT_NAME2_PROTOCOL gUndiComponentName2
;
39 #define MAX_NIC_INTERFACES 16
41 #define EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_REVISION_31 0x00010001
42 #define PXE_ROMID_MINORVER_31 0x10
43 #define PXE_STATFLAGS_DB_WRITE_TRUNCATED 0x2000
46 // UNDI_CALL_TABLE.state can have the following values
50 #define MUST_BE_STARTED 1
51 #define MUST_BE_INITIALIZED 2
53 #define UNDI_DEV_SIGNATURE SIGNATURE_32('u','n','d','i')
54 #define UNDI_DEV_FROM_THIS(a) CR(a, UNDI32_DEV, NIIProtocol_31, UNDI_DEV_SIGNATURE)
55 #define UNDI_DEV_FROM_NIC(a) CR(a, UNDI32_DEV, NicInfo, UNDI_DEV_SIGNATURE)
56 #define UNDI_DEV_FROM_AIP(a) CR(a, UNDI32_DEV, Aip, UNDI_DEV_SIGNATURE)
60 EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL NIIProtocol_31
;
61 EFI_ADAPTER_INFORMATION_PROTOCOL Aip
;
62 EFI_HANDLE DeviceHandle
;
63 EFI_DEVICE_PATH_PROTOCOL
*Undi32BaseDevPath
;
64 EFI_DEVICE_PATH_PROTOCOL
*Undi32DevPath
;
65 NIC_DATA_INSTANCE NicInfo
;
76 typedef VOID (*ptr
)(VOID
);
77 typedef VOID (*bsptr_30
)(UINTN
);
78 typedef VOID (*virtphys_30
)(UINT64
, UINT64
);
79 typedef VOID (*block_30
)(UINT32
);
80 typedef VOID (*mem_io_30
)(UINT8
, UINT8
, UINT64
, UINT64
);
82 typedef VOID (*bsptr
)(UINT64
, UINTN
);
83 typedef VOID (*virtphys
)(UINT64
, UINT64
, UINT64
);
84 typedef VOID (*block
)(UINT64
, UINT32
);
85 typedef VOID (*mem_io
)(UINT64
, UINT8
, UINT8
, UINT64
, UINT64
);
87 typedef VOID (*map_mem
)(UINT64
, UINT64
, UINT32
, UINT32
, UINT64
);
88 typedef VOID (*unmap_mem
)(UINT64
, UINT64
, UINT32
, UINT32
, UINT64
);
89 typedef VOID (*sync_mem
)(UINT64
, UINT64
, UINT32
, UINT32
, UINT64
);
91 extern UNDI_CALL_TABLE api_table
[];
92 extern PXE_SW_UNDI
*pxe_31
; // !pxe structure for 3.1 drivers
93 extern UNDI32_DEV
*UNDI32DeviceList
[MAX_NIC_INTERFACES
];
96 // functions defined in e100b.c
98 UINT8
InByte (NIC_DATA_INSTANCE
*AdapterInfo
, UINT32 Port
);
99 UINT16
InWord (NIC_DATA_INSTANCE
*AdapterInfo
, UINT32 Port
);
100 UINT32
InLong (NIC_DATA_INSTANCE
*AdapterInfo
, UINT32 Port
);
101 VOID
OutByte (NIC_DATA_INSTANCE
*AdapterInfo
, UINT8 Data
, UINT32 Port
);
102 VOID
OutWord (NIC_DATA_INSTANCE
*AdapterInfo
, UINT16 Data
, UINT32 Port
);
103 VOID
OutLong (NIC_DATA_INSTANCE
*AdapterInfo
, UINT32 Data
, UINT32 Port
);
105 UINTN
E100bInit (NIC_DATA_INSTANCE
*AdapterInfo
);
106 UINTN
E100bReset (NIC_DATA_INSTANCE
*AdapterInfo
, INT32 OpFlags
);
107 UINTN
E100bShutdown (NIC_DATA_INSTANCE
*AdapterInfo
);
108 UINTN
E100bTransmit (NIC_DATA_INSTANCE
*AdapterInfo
, UINT64 cpb
, UINT16 opflags
);
109 UINTN
E100bReceive (NIC_DATA_INSTANCE
*AdapterInfo
, UINT64 cpb
, UINT64 db
);
110 UINTN
E100bSetfilter (NIC_DATA_INSTANCE
*AdapterInfo
, UINT16 New_filter
,
111 UINT64 cpb
, UINT32 cpbsize
);
112 UINTN
E100bStatistics(NIC_DATA_INSTANCE
*AdapterInfo
, UINT64 db
, UINT16 dbsize
);
113 UINT8
E100bSetupIAAddr (NIC_DATA_INSTANCE
*AdapterInfo
);
114 UINT8
E100bSetInterruptState (NIC_DATA_INSTANCE
*AdapterInfo
);
116 UINT8
E100bGetEepromAddrLen (NIC_DATA_INSTANCE
*AdapterInfo
);
117 UINT16
E100bReadEeprom (NIC_DATA_INSTANCE
*AdapterInfo
, INT32 Location
, UINT8 address_len
);
118 INT16
E100bReadEepromAndStationAddress (NIC_DATA_INSTANCE
*AdapterInfo
);
121 UINT8
SetupCBlink (NIC_DATA_INSTANCE
*AdapterInfo
);
122 VOID
SetFreeCB (NIC_DATA_INSTANCE
*AdapterInfo
,TxCB
*);
123 TxCB
*GetFreeCB (NIC_DATA_INSTANCE
*AdapterInfo
);
124 UINT16
CheckCBList (NIC_DATA_INSTANCE
*AdapterInfo
);
126 UINT8
SelectiveReset (NIC_DATA_INSTANCE
*AdapterInfo
);
127 UINT16
InitializeChip (NIC_DATA_INSTANCE
*AdapterInfo
);
128 UINT8
SetupReceiveQueues (NIC_DATA_INSTANCE
*AdapterInfo
);
129 VOID
Recycle_RFD (NIC_DATA_INSTANCE
*AdapterInfo
, UINT16
);
130 VOID
XmitWaitForCompletion (NIC_DATA_INSTANCE
*AdapterInfo
);
131 INT8
CommandWaitForCompletion (TxCB
*cmd_ptr
, NIC_DATA_INSTANCE
*AdapterInfo
);
133 BOOLEAN
PhyDetect (NIC_DATA_INSTANCE
*AdapterInfo
);
134 VOID
PhyReset (NIC_DATA_INSTANCE
*AdapterInfo
);
137 IN NIC_DATA_INSTANCE
*AdapterInfo
,
145 IN NIC_DATA_INSTANCE
*AdapterInfo
,
148 IN OUT UINT16
*DataValue
151 BOOLEAN
SetupPhy (NIC_DATA_INSTANCE
*AdapterInfo
);
152 VOID
FindPhySpeedAndDpx (NIC_DATA_INSTANCE
*AdapterInfo
, UINT32 PhyId
);
157 // functions defined in init.c
166 InitializeUNDIDriver (
167 IN EFI_HANDLE ImageHandle
,
168 IN EFI_SYSTEM_TABLE
*SystemTable
172 UNDI_notify_virtual (
179 UndiDriverSupported (
180 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
181 IN EFI_HANDLE Controller
,
182 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
188 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
189 IN EFI_HANDLE Controller
,
190 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
196 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
197 IN EFI_HANDLE Controller
,
198 IN UINTN NumberOfChildren
,
199 IN EFI_HANDLE
*ChildHandleBuffer
204 IN OUT EFI_DEVICE_PATH_PROTOCOL
**DevPtr
,
205 IN EFI_DEVICE_PATH_PROTOCOL
*BaseDevPtr
,
206 IN NIC_DATA_INSTANCE
*AdapterInfo
212 IN UINTN MicroSeconds
225 // functions defined in decode.c
230 IN NIC_DATA_INSTANCE
*AdapterInfo
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 NIC_DATA_INSTANCE
*AdapterInfo
266 IN 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
335 VOID EFIAPI
UNDI_APIEntry_new(UINT64
);
336 VOID
UNDI_APIEntry_Common(UINT64
);
338 PXE_IPV4
convert_mcip(PXE_MAC_ADDR
*);
339 INT32
validate_mcip (PXE_MAC_ADDR
*MCastAddr
);
341 VOID
PxeStructInit (PXE_SW_UNDI
*PxePtr
);
342 VOID
PxeUpdate (NIC_DATA_INSTANCE
*NicPtr
, PXE_SW_UNDI
*PxePtr
);
345 // functions defined in UndiAipImpl.c
349 Returns the current state information for the adapter.
351 This function returns information of type InformationType from the adapter.
352 If an adapter does not support the requested informational type, then
353 EFI_UNSUPPORTED is returned.
355 @param[in] This A pointer to the EFI_ADAPTER_INFORMATION_PROTOCOL instance.
356 @param[in] InformationType A pointer to an EFI_GUID that defines the contents of InformationBlock.
357 @param[out] InforamtionBlock The service returns a pointer to the buffer with the InformationBlock
358 structure which contains details about the data specific to InformationType.
359 @param[out] InforamtionBlockSize The driver returns the size of the InformationBlock in bytes.
361 @retval EFI_SUCCESS The InformationType information was retrieved.
362 @retval EFI_UNSUPPORTED The InformationType is not known.
363 @retval EFI_DEVICE_ERROR The device reported an error.
364 @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.
365 @retval EFI_INVALID_PARAMETER This is NULL.
366 @retval EFI_INVALID_PARAMETER InformationBlock is NULL.
367 @retval EFI_INVALID_PARAMETER InformationBlockSize is NULL.
373 IN EFI_ADAPTER_INFORMATION_PROTOCOL
*This
,
374 IN EFI_GUID
*InformationType
,
375 OUT VOID
**InformationBlock
,
376 OUT UINTN
*InformationBlockSize
380 Sets state information for an adapter.
382 This function sends information of type InformationType for an adapter.
383 If an adapter does not support the requested information type, then EFI_UNSUPPORTED
386 @param[in] This A pointer to the EFI_ADAPTER_INFORMATION_PROTOCOL instance.
387 @param[in] InformationType A pointer to an EFI_GUID that defines the contents of InformationBlock.
388 @param[in] InforamtionBlock A pointer to the InformationBlock structure which contains details
389 about the data specific to InformationType.
390 @param[in] InforamtionBlockSize The size of the InformationBlock in bytes.
392 @retval EFI_SUCCESS The information was received and interpreted successfully.
393 @retval EFI_UNSUPPORTED The InformationType is not known.
394 @retval EFI_DEVICE_ERROR The device reported an error.
395 @retval EFI_INVALID_PARAMETER This is NULL.
396 @retval EFI_INVALID_PARAMETER InformationBlock is NULL.
397 @retval EFI_WRITE_PROTECTED The InformationType cannot be modified using EFI_ADAPTER_INFO_SET_INFO().
403 IN EFI_ADAPTER_INFORMATION_PROTOCOL
*This
,
404 IN EFI_GUID
*InformationType
,
405 IN VOID
*InformationBlock
,
406 IN UINTN InformationBlockSize
410 Get a list of supported information types for this instance of the protocol.
412 This function returns a list of InformationType GUIDs that are supported on an
413 adapter with this instance of EFI_ADAPTER_INFORMATION_PROTOCOL. The list is returned
414 in InfoTypesBuffer, and the number of GUID pointers in InfoTypesBuffer is returned in
415 InfoTypesBufferCount.
417 @param[in] This A pointer to the EFI_ADAPTER_INFORMATION_PROTOCOL instance.
418 @param[out] InfoTypesBuffer A pointer to the list of InformationType GUID pointers that are supported
420 @param[out] InfoTypesBufferCount A pointer to the number of GUID pointers present in InfoTypesBuffer.
422 @retval EFI_SUCCESS The list of information type GUIDs that are supported on this adapter was
423 returned in InfoTypesBuffer. The number of information type GUIDs was
424 returned in InfoTypesBufferCount.
425 @retval EFI_INVALID_PARAMETER This is NULL.
426 @retval EFI_INVALID_PARAMETER InfoTypesBuffer is NULL.
427 @retval EFI_INVALID_PARAMETER InfoTypesBufferCount is NULL.
428 @retval EFI_OUT_OF_RESOURCES There is not enough pool memory to store the results.
433 UndiAipGetSupportedTypes (
434 IN EFI_ADAPTER_INFORMATION_PROTOCOL
*This
,
435 OUT EFI_GUID
**InfoTypesBuffer
,
436 OUT UINTN
*InfoTypesBufferCount