4 Copyright (c) 2006 - 2007, Intel Corporation.
5 All rights reserved. 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.
19 EFI internal structures for the EFI UNDI driver
32 #include <Guid/EventGroup.h>
33 #include <Protocol/PciIo.h>
34 #include <Protocol/NetworkInterfaceIdentifier.h>
35 #include <Protocol/DevicePath.h>
37 #include <Library/UefiDriverEntryPoint.h>
38 #include <Library/UefiRuntimeLib.h>
39 #include <Library/DebugLib.h>
40 #include <Library/BaseMemoryLib.h>
41 #include <Library/UefiBootServicesTableLib.h>
42 #include <Library/UefiLib.h>
44 #include <IndustryStandard/Pci.h>
49 #define MAX_NIC_INTERFACES 16
51 #define EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_REVISION_31 0x00010001
52 #define PXE_ROMID_MINORVER_31 0x10
53 #define PXE_STATFLAGS_DB_WRITE_TRUNCATED 0x2000
56 // UNDI_CALL_TABLE.state can have the following values
60 #define MUST_BE_STARTED 1
61 #define MUST_BE_INITIALIZED 2
63 #define UNDI_DEV_SIGNATURE EFI_SIGNATURE_32('u','n','d','i')
64 #define UNDI_DEV_FROM_THIS(a) CR(a, UNDI32_DEV, NIIProtocol_31, UNDI_DEV_SIGNATURE)
65 #define UNDI_DEV_FROM_NIC(a) CR(a, UNDI32_DEV, NicInfo, UNDI_DEV_SIGNATURE)
69 EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL NIIProtocol_31
;
70 EFI_HANDLE DeviceHandle
;
71 EFI_DEVICE_PATH_PROTOCOL
*Undi32BaseDevPath
;
72 EFI_DEVICE_PATH_PROTOCOL
*Undi32DevPath
;
73 NIC_DATA_INSTANCE NicInfo
;
85 EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL
*InterfacePointer
;
86 EFI_DEVICE_PATH_PROTOCOL
*DevicePathPointer
;
89 typedef struct NII_CONFIG_ENTRY
{
91 UINT32 Reserved
; // padding for alignment
92 struct NII_CONFIG_ENTRY
*NextLink
;
93 NII_ENTRY NiiEntry
[1];
96 typedef VOID (*ptr
)(VOID
);
97 typedef VOID (*bsptr_30
)(UINTN
);
98 typedef VOID (*virtphys_30
)(UINT64
, UINT64
);
99 typedef VOID (*block_30
)(UINT32
);
100 typedef VOID (*mem_io_30
)(UINT8
, UINT8
, UINT64
, UINT64
);
102 typedef VOID (*bsptr
)(UINT64
, UINTN
);
103 typedef VOID (*virtphys
)(UINT64
, UINT64
, UINT64
);
104 typedef VOID (*block
)(UINT64
, UINT32
);
105 typedef VOID (*mem_io
)(UINT64
, UINT8
, UINT8
, UINT64
, UINT64
);
107 typedef VOID (*map_mem
)(UINT64
, UINT64
, UINT32
, UINT32
, UINT64
);
108 typedef VOID (*unmap_mem
)(UINT64
, UINT64
, UINT32
, UINT32
, UINT64
);
109 typedef VOID (*sync_mem
)(UINT64
, UINT64
, UINT32
, UINT32
, UINT64
);
111 extern UNDI_CALL_TABLE api_table
[];
112 extern PXE_SW_UNDI
*pxe_31
; // !pxe structure for 3.1 drivers
113 extern UNDI32_DEV
*UNDI32DeviceList
[MAX_NIC_INTERFACES
];
116 // functions defined in e100b.c
118 UINT8
InByte (NIC_DATA_INSTANCE
*AdapterInfo
, UINT32 Port
);
119 UINT16
InWord (NIC_DATA_INSTANCE
*AdapterInfo
, UINT32 Port
);
120 UINT32
InLong (NIC_DATA_INSTANCE
*AdapterInfo
, UINT32 Port
);
121 VOID
OutByte (NIC_DATA_INSTANCE
*AdapterInfo
, UINT8 Data
, UINT32 Port
);
122 VOID
OutWord (NIC_DATA_INSTANCE
*AdapterInfo
, UINT16 Data
, UINT32 Port
);
123 VOID
OutLong (NIC_DATA_INSTANCE
*AdapterInfo
, UINT32 Data
, UINT32 Port
);
125 UINTN
E100bInit (NIC_DATA_INSTANCE
*AdapterInfo
);
126 UINTN
E100bReset (NIC_DATA_INSTANCE
*AdapterInfo
, INT32 OpFlags
);
127 UINTN
E100bShutdown (NIC_DATA_INSTANCE
*AdapterInfo
);
128 UINTN
E100bTransmit (NIC_DATA_INSTANCE
*AdapterInfo
, UINT64 cpb
, UINT16 opflags
);
129 UINTN
E100bReceive (NIC_DATA_INSTANCE
*AdapterInfo
, UINT64 cpb
, UINT64 db
);
130 UINTN
E100bSetfilter (NIC_DATA_INSTANCE
*AdapterInfo
, UINT16 New_filter
,
131 UINT64 cpb
, UINT32 cpbsize
);
132 UINTN
E100bStatistics(NIC_DATA_INSTANCE
*AdapterInfo
, UINT64 db
, UINT16 dbsize
);
133 UINT8
E100bSetupIAAddr (NIC_DATA_INSTANCE
*AdapterInfo
);
134 UINT8
E100bSetInterruptState (NIC_DATA_INSTANCE
*AdapterInfo
);
136 UINT8
E100bGetEepromAddrLen (NIC_DATA_INSTANCE
*AdapterInfo
);
137 UINT16
E100bReadEeprom (NIC_DATA_INSTANCE
*AdapterInfo
, INT32 Location
, UINT8 address_len
);
138 INT16
E100bReadEepromAndStationAddress (NIC_DATA_INSTANCE
*AdapterInfo
);
141 UINT8
SetupCBlink (NIC_DATA_INSTANCE
*AdapterInfo
);
142 VOID
SetFreeCB (NIC_DATA_INSTANCE
*AdapterInfo
,TxCB
*);
143 TxCB
*GetFreeCB (NIC_DATA_INSTANCE
*AdapterInfo
);
144 UINT16
CheckCBList (NIC_DATA_INSTANCE
*AdapterInfo
);
146 UINT8
SelectiveReset (NIC_DATA_INSTANCE
*AdapterInfo
);
147 UINT16
InitializeChip (NIC_DATA_INSTANCE
*AdapterInfo
);
148 UINT8
SetupReceiveQueues (NIC_DATA_INSTANCE
*AdapterInfo
);
149 VOID
Recycle_RFD (NIC_DATA_INSTANCE
*AdapterInfo
, UINT16
);
150 VOID
XmitWaitForCompletion (NIC_DATA_INSTANCE
*AdapterInfo
);
151 INT8
CommandWaitForCompletion (TxCB
*cmd_ptr
, NIC_DATA_INSTANCE
*AdapterInfo
);
153 BOOLEAN
PhyDetect (NIC_DATA_INSTANCE
*AdapterInfo
);
154 VOID
PhyReset (NIC_DATA_INSTANCE
*AdapterInfo
);
157 IN NIC_DATA_INSTANCE
*AdapterInfo
,
165 IN NIC_DATA_INSTANCE
*AdapterInfo
,
168 IN OUT UINT16
*DataValue
171 BOOLEAN
SetupPhy (NIC_DATA_INSTANCE
*AdapterInfo
);
172 VOID
FindPhySpeedAndDpx (NIC_DATA_INSTANCE
*AdapterInfo
, UINT32 PhyId
);
177 // functions defined in init.c
186 InitializeUNDIDriver (
187 IN EFI_HANDLE ImageHandle
,
188 IN EFI_SYSTEM_TABLE
*SystemTable
192 UNDI_notify_virtual (
206 UndiDriverSupported (
207 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
208 IN EFI_HANDLE Controller
,
209 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
215 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
216 IN EFI_HANDLE Controller
,
217 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
223 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
224 IN EFI_HANDLE Controller
,
225 IN UINTN NumberOfChildren
,
226 IN EFI_HANDLE
*ChildHandleBuffer
231 IN OUT EFI_DEVICE_PATH_PROTOCOL
**DevPtr
,
232 IN EFI_DEVICE_PATH_PROTOCOL
*BaseDevPtr
,
233 IN NIC_DATA_INSTANCE
*AdapterInfo
239 IN UINTN MicroSeconds
252 // functions defined in decode.c
257 IN NIC_DATA_INSTANCE
*AdapterInfo
263 IN NIC_DATA_INSTANCE
*AdapterInfo
269 IN NIC_DATA_INSTANCE
*AdapterInfo
275 IN NIC_DATA_INSTANCE
*AdapterInfo
281 IN NIC_DATA_INSTANCE
*AdapterInfo
287 NIC_DATA_INSTANCE
*AdapterInfo
293 IN NIC_DATA_INSTANCE
*AdapterInfo
299 IN NIC_DATA_INSTANCE
*AdapterInfo
305 IN NIC_DATA_INSTANCE
*AdapterInfo
311 IN NIC_DATA_INSTANCE
*AdapterInfo
317 IN NIC_DATA_INSTANCE
*AdapterInfo
323 IN NIC_DATA_INSTANCE
*AdapterInfo
329 IN NIC_DATA_INSTANCE
*AdapterInfo
335 IN NIC_DATA_INSTANCE
*AdapterInfo
341 IN NIC_DATA_INSTANCE
*AdapterInfo
347 IN NIC_DATA_INSTANCE
*AdapterInfo
353 IN NIC_DATA_INSTANCE
*AdapterInfo
359 IN NIC_DATA_INSTANCE
*AdapterInfo
362 VOID
UNDI_APIEntry_new(UINT64
);
363 VOID
UNDI_APIEntry_Common(UINT64
);
365 PXE_IPV4
convert_mcip(PXE_MAC_ADDR
*);
366 INT32
validate_mcip (PXE_MAC_ADDR
*MCastAddr
);
368 VOID
PxeStructInit (PXE_SW_UNDI
*PxePtr
);
369 VOID
PxeUpdate (NIC_DATA_INSTANCE
*NicPtr
, PXE_SW_UNDI
*PxePtr
);