1 /** @file 2 EFI internal structures for the EFI UNDI driver. 3 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 9 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. 12 13 **/ 14 15 #ifndef _UNDI_32_H_ 16 #define _UNDI_32_H_ 17 18 #include <Uefi.h> 19 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> 25 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> 35 36 #include <IndustryStandard/Pci.h> 37 38 39 #include "E100b.h" 40 41 extern EFI_DRIVER_BINDING_PROTOCOL gUndiDriverBinding; 42 extern EFI_COMPONENT_NAME_PROTOCOL gUndiComponentName; 43 extern EFI_COMPONENT_NAME2_PROTOCOL gUndiComponentName2; 44 45 #define MAX_NIC_INTERFACES 16 46 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 50 51 // 52 // UNDI_CALL_TABLE.state can have the following values 53 // 54 #define DONT_CHECK -1 55 #define ANY_STATE -1 56 #define MUST_BE_STARTED 1 57 #define MUST_BE_INITIALIZED 2 58 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) 63 64 typedef struct { 65 UINTN 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; 72 } UNDI32_DEV; 73 74 typedef struct { 75 UINT16 cpbsize; 76 UINT16 dbsize; 77 UINT16 opflags; 78 UINT16 state; 79 VOID (*api_ptr)(); 80 } UNDI_CALL_TABLE; 81 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); 87 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); 92 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); 96 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]; 100 101 // 102 // functions defined in e100b.c 103 // 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); 110 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); 121 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); 125 126 UINT16 next(UINT16); 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); 131 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); 138 139 BOOLEAN PhyDetect (NIC_DATA_INSTANCE *AdapterInfo); 140 VOID PhyReset (NIC_DATA_INSTANCE *AdapterInfo); 141 VOID 142 MdiWrite ( 143 IN NIC_DATA_INSTANCE *AdapterInfo, 144 IN UINT8 RegAddress, 145 IN UINT8 PhyAddress, 146 IN UINT16 DataValue 147 ); 148 149 VOID 150 MdiRead( 151 IN NIC_DATA_INSTANCE *AdapterInfo, 152 IN UINT8 RegAddress, 153 IN UINT8 PhyAddress, 154 IN OUT UINT16 *DataValue 155 ); 156 157 BOOLEAN SetupPhy (NIC_DATA_INSTANCE *AdapterInfo); 158 VOID FindPhySpeedAndDpx (NIC_DATA_INSTANCE *AdapterInfo, UINT32 PhyId); 159 160 161 162 // 163 // functions defined in init.c 164 // 165 EFI_STATUS 166 InstallConfigTable ( 167 IN VOID 168 ); 169 170 EFI_STATUS 171 EFIAPI 172 InitializeUNDIDriver ( 173 IN EFI_HANDLE ImageHandle, 174 IN EFI_SYSTEM_TABLE *SystemTable 175 ); 176 177 VOID 178 UNDI_notify_virtual ( 179 EFI_EVENT event, 180 VOID *context 181 ); 182 183 EFI_STATUS 184 EFIAPI 185 UndiDriverSupported ( 186 IN EFI_DRIVER_BINDING_PROTOCOL *This, 187 IN EFI_HANDLE Controller, 188 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath 189 ); 190 191 EFI_STATUS 192 EFIAPI 193 UndiDriverStart ( 194 IN EFI_DRIVER_BINDING_PROTOCOL *This, 195 IN EFI_HANDLE Controller, 196 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath 197 ); 198 199 EFI_STATUS 200 EFIAPI 201 UndiDriverStop ( 202 IN EFI_DRIVER_BINDING_PROTOCOL *This, 203 IN EFI_HANDLE Controller, 204 IN UINTN NumberOfChildren, 205 IN EFI_HANDLE *ChildHandleBuffer 206 ); 207 208 EFI_STATUS 209 AppendMac2DevPath ( 210 IN OUT EFI_DEVICE_PATH_PROTOCOL **DevPtr, 211 IN EFI_DEVICE_PATH_PROTOCOL *BaseDevPtr, 212 IN NIC_DATA_INSTANCE *AdapterInfo 213 ); 214 215 VOID 216 TmpDelay ( 217 IN UINT64 UnqId, 218 IN UINTN MicroSeconds 219 ); 220 221 VOID 222 TmpMemIo ( 223 IN UINT64 UnqId, 224 IN UINT8 ReadWrite, 225 IN UINT8 Len, 226 IN UINT64 Port, 227 IN UINT64 BufAddr 228 ); 229 230 // 231 // functions defined in decode.c 232 // 233 VOID 234 UNDI_GetState ( 235 IN PXE_CDB *CdbPtr, 236 IN NIC_DATA_INSTANCE *AdapterInfo 237 ); 238 239 VOID 240 UNDI_Start ( 241 IN PXE_CDB *CdbPtr, 242 IN NIC_DATA_INSTANCE *AdapterInfo 243 ); 244 245 VOID 246 UNDI_Stop ( 247 IN PXE_CDB *CdbPtr, 248 IN NIC_DATA_INSTANCE *AdapterInfo 249 ); 250 251 VOID 252 UNDI_GetInitInfo ( 253 IN PXE_CDB *CdbPtr, 254 IN NIC_DATA_INSTANCE *AdapterInfo 255 ); 256 257 VOID 258 UNDI_GetConfigInfo ( 259 IN PXE_CDB *CdbPtr, 260 IN NIC_DATA_INSTANCE *AdapterInfo 261 ); 262 263 VOID 264 UNDI_Initialize ( 265 IN PXE_CDB *CdbPtr, 266 NIC_DATA_INSTANCE *AdapterInfo 267 ); 268 269 VOID 270 UNDI_Reset ( 271 IN PXE_CDB *CdbPtr, 272 IN NIC_DATA_INSTANCE *AdapterInfo 273 ); 274 275 VOID 276 UNDI_Shutdown ( 277 IN PXE_CDB *CdbPtr, 278 IN NIC_DATA_INSTANCE *AdapterInfo 279 ); 280 281 VOID 282 UNDI_Interrupt ( 283 IN PXE_CDB *CdbPtr, 284 IN NIC_DATA_INSTANCE *AdapterInfo 285 ); 286 287 VOID 288 UNDI_RecFilter ( 289 IN PXE_CDB *CdbPtr, 290 IN NIC_DATA_INSTANCE *AdapterInfo 291 ); 292 293 VOID 294 UNDI_StnAddr ( 295 IN PXE_CDB *CdbPtr, 296 IN NIC_DATA_INSTANCE *AdapterInfo 297 ); 298 299 VOID 300 UNDI_Statistics ( 301 IN PXE_CDB *CdbPtr, 302 IN NIC_DATA_INSTANCE *AdapterInfo 303 ); 304 305 VOID 306 UNDI_ip2mac ( 307 IN PXE_CDB *CdbPtr, 308 IN NIC_DATA_INSTANCE *AdapterInfo 309 ); 310 311 VOID 312 UNDI_NVData ( 313 IN PXE_CDB *CdbPtr, 314 IN NIC_DATA_INSTANCE *AdapterInfo 315 ); 316 317 VOID 318 UNDI_Status ( 319 IN PXE_CDB *CdbPtr, 320 IN NIC_DATA_INSTANCE *AdapterInfo 321 ); 322 323 VOID 324 UNDI_FillHeader ( 325 IN PXE_CDB *CdbPtr, 326 IN NIC_DATA_INSTANCE *AdapterInfo 327 ); 328 329 VOID 330 UNDI_Transmit ( 331 IN PXE_CDB *CdbPtr, 332 IN NIC_DATA_INSTANCE *AdapterInfo 333 ); 334 335 VOID 336 UNDI_Receive ( 337 IN PXE_CDB *CdbPtr, 338 IN NIC_DATA_INSTANCE *AdapterInfo 339 ); 340 341 VOID UNDI_APIEntry_new(UINT64); 342 VOID UNDI_APIEntry_Common(UINT64); 343 344 PXE_IPV4 convert_mcip(PXE_MAC_ADDR *); 345 INT32 validate_mcip (PXE_MAC_ADDR *MCastAddr); 346 347 VOID PxeStructInit (PXE_SW_UNDI *PxePtr); 348 VOID PxeUpdate (NIC_DATA_INSTANCE *NicPtr, PXE_SW_UNDI *PxePtr); 349 350 // 351 // functions defined in UndiAipImpl.c 352 // 353 354 /** 355 Returns the current state information for the adapter. 356 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. 360 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. 366 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. 374 375 **/ 376 EFI_STATUS 377 EFIAPI 378 UndiAipGetInfo ( 379 IN EFI_ADAPTER_INFORMATION_PROTOCOL *This, 380 IN EFI_GUID *InformationType, 381 OUT VOID **InformationBlock, 382 OUT UINTN *InformationBlockSize 383 ); 384 385 /** 386 Sets state information for an adapter. 387 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 390 is returned. 391 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. 397 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(). 404 405 **/ 406 EFI_STATUS 407 EFIAPI 408 UndiAipSetInfo ( 409 IN EFI_ADAPTER_INFORMATION_PROTOCOL *This, 410 IN EFI_GUID *InformationType, 411 IN VOID *InformationBlock, 412 IN UINTN InformationBlockSize 413 ); 414 415 /** 416 Get a list of supported information types for this instance of the protocol. 417 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. 422 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 425 by This. 426 @param[out] InfoTypesBufferCount A pointer to the number of GUID pointers present in InfoTypesBuffer. 427 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. 435 436 **/ 437 EFI_STATUS 438 EFIAPI 439 UndiAipGetSupportedTypes ( 440 IN EFI_ADAPTER_INFORMATION_PROTOCOL *This, 441 OUT EFI_GUID **InfoTypesBuffer, 442 OUT UINTN *InfoTypesBufferCount 443 ); 444 445 #endif 446