3 Copyright (c) 2006, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 Initialization functions for EFI UNDI32 driver
25 #include <Library/BaseLib.h>
29 PXE_SW_UNDI
*pxe
= 0; // 3.0 entry point
30 PXE_SW_UNDI
*pxe_31
= 0; // 3.1 entry
31 UNDI32_DEV
*UNDI32DeviceList
[MAX_NIC_INTERFACES
];
33 NII_TABLE
*UndiDataPointer
= NULL
;
45 When address mapping changes to virtual this should make the appropriate
50 (Standard Event handler)
57 // TODO: Context - add argument and description to function comment
63 Pxe31Pointer
= (VOID
*) pxe_31
;
67 (VOID
**) &Pxe31Pointer
71 // UNDI32DeviceList is an array of pointers
73 for (Index
= 0; Index
< pxe_31
->IFcnt
; Index
++) {
74 UNDI32DeviceList
[Index
]->NIIProtocol_31
.ID
= (UINT64
) (UINTN
) Pxe31Pointer
;
77 (VOID
**) &(UNDI32DeviceList
[Index
])
83 (VOID
**) &(pxe_31
->EntryPoint
)
85 pxe_31
= Pxe31Pointer
;
88 for (Index
= 0; Index
<= PXE_OPCODE_LAST_VALID
; Index
++) {
91 (VOID
**) &api_table
[Index
].api_ptr
106 When EFI is shuting down the boot services, we need to install a
107 configuration table for UNDI to work at runtime!
111 (Standard Event handler)
118 // TODO: Context - add argument and description to function comment
120 InstallConfigTable ();
123 // UNDI Class Driver Global Variables
125 EFI_DRIVER_BINDING_PROTOCOL gUndiDriverBinding
= {
137 UndiDriverSupported (
138 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
139 IN EFI_HANDLE Controller
,
140 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
146 Test to see if this driver supports ControllerHandle. Any ControllerHandle
147 than contains a DevicePath, PciIo protocol, Class code of 2, Vendor ID of 0x8086,
148 and DeviceId of (D100_DEVICE_ID || D102_DEVICE_ID || ICH3_DEVICE_ID_1 ||
149 ICH3_DEVICE_ID_2 || ICH3_DEVICE_ID_3 || ICH3_DEVICE_ID_4 || ICH3_DEVICE_ID_5 ||
150 ICH3_DEVICE_ID_6 || ICH3_DEVICE_ID_7 || ICH3_DEVICE_ID_8) can be supported.
154 This - Protocol instance pointer.
156 Controller - Handle of device to test.
158 RemainingDevicePath - Not used.
162 EFI_SUCCESS - This driver supports this device.
164 other - This driver does not support this device.
169 EFI_PCI_IO_PROTOCOL
*PciIo
;
172 Status
= gBS
->OpenProtocol (
174 &gEfiDevicePathProtocolGuid
,
176 This
->DriverBindingHandle
,
178 EFI_OPEN_PROTOCOL_TEST_PROTOCOL
180 if (EFI_ERROR (Status
)) {
184 Status
= gBS
->OpenProtocol (
186 &gEfiPciIoProtocolGuid
,
188 This
->DriverBindingHandle
,
190 EFI_OPEN_PROTOCOL_BY_DRIVER
192 if (EFI_ERROR (Status
)) {
196 Status
= PciIo
->Pci
.Read (
200 sizeof (PCI_CONFIG_HEADER
),
204 if (!EFI_ERROR (Status
)) {
205 Status
= EFI_UNSUPPORTED
;
207 if (Pci
.Hdr
.ClassCode
[2] == 0x02 && Pci
.Hdr
.VendorId
== PCI_VENDOR_ID_INTEL
) {
208 switch (Pci
.Hdr
.DeviceId
) {
211 case ICH3_DEVICE_ID_1
:
212 case ICH3_DEVICE_ID_2
:
213 case ICH3_DEVICE_ID_3
:
214 case ICH3_DEVICE_ID_4
:
215 case ICH3_DEVICE_ID_5
:
216 case ICH3_DEVICE_ID_6
:
217 case ICH3_DEVICE_ID_7
:
218 case ICH3_DEVICE_ID_8
:
235 Status
= EFI_SUCCESS
;
242 &gEfiPciIoProtocolGuid
,
243 This
->DriverBindingHandle
,
253 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
254 IN EFI_HANDLE Controller
,
255 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
261 Start this driver on Controller by opening PciIo and DevicePath protocol.
262 Initialize PXE structures, create a copy of the Controller Device Path with the
263 NIC's MAC address appended to it, install the NetworkInterfaceIdentifier protocol
264 on the newly created Device Path.
268 This - Protocol instance pointer.
270 Controller - Handle of device to work with.
272 RemainingDevicePath - Not used, always produce all possible children.
276 EFI_SUCCESS - This driver is added to Controller.
278 other - This driver does not support this device.
283 EFI_DEVICE_PATH_PROTOCOL
*UndiDevicePath
;
284 PCI_CONFIG_HEADER
*CfgHdr
;
285 UNDI32_DEV
*UNDI32Device
;
287 UINT8
*TmpPxePointer
;
288 EFI_PCI_IO_PROTOCOL
*PciIoFncs
;
292 Status
= gBS
->OpenProtocol (
294 &gEfiPciIoProtocolGuid
,
295 (VOID
**) &PciIoFncs
,
296 This
->DriverBindingHandle
,
298 EFI_OPEN_PROTOCOL_BY_DRIVER
301 if (EFI_ERROR (Status
)) {
305 Status
= gBS
->OpenProtocol (
307 &gEfiDevicePathProtocolGuid
,
308 (VOID
**) &UndiDevicePath
,
309 This
->DriverBindingHandle
,
311 EFI_OPEN_PROTOCOL_BY_DRIVER
314 if (EFI_ERROR (Status
)) {
317 &gEfiPciIoProtocolGuid
,
318 This
->DriverBindingHandle
,
325 Status
= gBS
->AllocatePool (
326 EfiRuntimeServicesData
,
328 (VOID
**) &UNDI32Device
331 if (EFI_ERROR (Status
)) {
335 ZeroMem ((CHAR8
*) UNDI32Device
, sizeof (UNDI32_DEV
));
338 // Get original PCI attributes
340 Status
= PciIoFncs
->Attributes (
342 EfiPciIoAttributeOperationGet
,
344 &UNDI32Device
->NicInfo
.OriginalPciAttributes
347 if (EFI_ERROR (Status
)) {
352 // allocate and initialize both (old and new) the !pxe structures here,
353 // there should only be one copy of each of these structure for any number
354 // of NICs this undi supports. Also, these structures need to be on a
355 // paragraph boundary as per the spec. so, while allocating space for these,
356 // make sure that there is space for 2 !pxe structures (old and new) and a
357 // 32 bytes padding for alignment adjustment (in case)
359 TmpPxePointer
= NULL
;
360 if (pxe_31
== NULL
) {
361 Status
= gBS
->AllocatePool (
362 EfiRuntimeServicesData
,
363 (sizeof (PXE_SW_UNDI
) + sizeof (PXE_SW_UNDI
) + 32),
364 (VOID
**) &TmpPxePointer
367 if (EFI_ERROR (Status
)) {
368 goto UndiErrorDeleteDevice
;
373 sizeof (PXE_SW_UNDI
) + sizeof (PXE_SW_UNDI
) + 32
376 // check for paragraph alignment here, assuming that the pointer is
377 // already 8 byte aligned.
379 if (((UINTN
) TmpPxePointer
& 0x0F) != 0) {
380 pxe_31
= (PXE_SW_UNDI
*) ((UINTN
) (TmpPxePointer
+ 8));
382 pxe_31
= (PXE_SW_UNDI
*) TmpPxePointer
;
385 // assuming that the sizeof pxe_31 is a 16 byte multiple
387 pxe
= (PXE_SW_UNDI
*) ((CHAR8
*) (pxe_31
) + sizeof (PXE_SW_UNDI
));
389 PxeStructInit (pxe
, 0x30);
390 PxeStructInit (pxe_31
, 0x31);
393 UNDI32Device
->NIIProtocol
.ID
= (UINT64
) (UINTN
) (pxe
);
394 UNDI32Device
->NIIProtocol_31
.ID
= (UINT64
) (UINTN
) (pxe_31
);
396 Status
= PciIoFncs
->Attributes (
398 EfiPciIoAttributeOperationSupported
,
402 if (!EFI_ERROR (Status
)) {
403 Supports
&= EFI_PCI_DEVICE_ENABLE
;
404 Status
= PciIoFncs
->Attributes (
406 EfiPciIoAttributeOperationEnable
,
412 // Read all the registers from device's PCI Configuration space
414 Status
= PciIoFncs
->Pci
.Read (
419 &UNDI32Device
->NicInfo
.Config
422 CfgHdr
= (PCI_CONFIG_HEADER
*) &(UNDI32Device
->NicInfo
.Config
[0]);
425 // make sure that this device is a PCI bus master
428 NewCommand
= (UINT16
) (CfgHdr
->Command
| PCI_COMMAND_MASTER
| PCI_COMMAND_IO
);
429 if (CfgHdr
->Command
!= NewCommand
) {
430 PciIoFncs
->Pci
.Write (
437 CfgHdr
->Command
= NewCommand
;
441 // make sure that the latency timer is at least 32
443 if (CfgHdr
->LatencyTimer
< 32) {
444 CfgHdr
->LatencyTimer
= 32;
445 PciIoFncs
->Pci
.Write (
450 &CfgHdr
->LatencyTimer
454 // the IfNum index for the current interface will be the total number
455 // of interfaces initialized so far
457 UNDI32Device
->NIIProtocol
.IfNum
= pxe
->IFcnt
;
458 UNDI32Device
->NIIProtocol_31
.IfNum
= pxe_31
->IFcnt
;
460 PxeUpdate (&UNDI32Device
->NicInfo
, pxe
);
461 PxeUpdate (&UNDI32Device
->NicInfo
, pxe_31
);
463 UNDI32Device
->NicInfo
.Io_Function
= PciIoFncs
;
464 UNDI32DeviceList
[UNDI32Device
->NIIProtocol
.IfNum
] = UNDI32Device
;
465 UNDI32Device
->Undi32BaseDevPath
= UndiDevicePath
;
467 Status
= AppendMac2DevPath (
468 &UNDI32Device
->Undi32DevPath
,
469 UNDI32Device
->Undi32BaseDevPath
,
470 &UNDI32Device
->NicInfo
474 goto UndiErrorDeletePxe
;
477 UNDI32Device
->Signature
= UNDI_DEV_SIGNATURE
;
479 UNDI32Device
->NIIProtocol
.Revision
= EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_REVISION
;
480 UNDI32Device
->NIIProtocol
.Type
= EfiNetworkInterfaceUndi
;
481 UNDI32Device
->NIIProtocol
.MajorVer
= PXE_ROMID_MAJORVER
;
482 UNDI32Device
->NIIProtocol
.MinorVer
= PXE_ROMID_MINORVER
;
483 UNDI32Device
->NIIProtocol
.ImageSize
= 0;
484 UNDI32Device
->NIIProtocol
.ImageAddr
= 0;
485 UNDI32Device
->NIIProtocol
.Ipv6Supported
= FALSE
;
487 UNDI32Device
->NIIProtocol
.StringId
[0] = 'U';
488 UNDI32Device
->NIIProtocol
.StringId
[1] = 'N';
489 UNDI32Device
->NIIProtocol
.StringId
[2] = 'D';
490 UNDI32Device
->NIIProtocol
.StringId
[3] = 'I';
492 UNDI32Device
->NIIProtocol_31
.Revision
= EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_REVISION_31
;
493 UNDI32Device
->NIIProtocol_31
.Type
= EfiNetworkInterfaceUndi
;
494 UNDI32Device
->NIIProtocol_31
.MajorVer
= PXE_ROMID_MAJORVER
;
495 UNDI32Device
->NIIProtocol_31
.MinorVer
= PXE_ROMID_MINORVER_31
;
496 UNDI32Device
->NIIProtocol_31
.ImageSize
= 0;
497 UNDI32Device
->NIIProtocol_31
.ImageAddr
= 0;
498 UNDI32Device
->NIIProtocol_31
.Ipv6Supported
= FALSE
;
500 UNDI32Device
->NIIProtocol_31
.StringId
[0] = 'U';
501 UNDI32Device
->NIIProtocol_31
.StringId
[1] = 'N';
502 UNDI32Device
->NIIProtocol_31
.StringId
[2] = 'D';
503 UNDI32Device
->NIIProtocol_31
.StringId
[3] = 'I';
505 UNDI32Device
->DeviceHandle
= NULL
;
508 // install both the 3.0 and 3.1 NII protocols.
510 Status
= gBS
->InstallMultipleProtocolInterfaces (
511 &UNDI32Device
->DeviceHandle
,
512 &gEfiNetworkInterfaceIdentifierProtocolGuid_31
,
513 &UNDI32Device
->NIIProtocol_31
,
514 &gEfiNetworkInterfaceIdentifierProtocolGuid
,
515 &UNDI32Device
->NIIProtocol
,
516 &gEfiDevicePathProtocolGuid
,
517 UNDI32Device
->Undi32DevPath
,
521 if (EFI_ERROR (Status
)) {
522 goto UndiErrorDeleteDevicePath
;
526 // if the table exists, free it and alloc again, or alloc it directly
528 if (UndiDataPointer
!= NULL
) {
529 Status
= gBS
->FreePool(UndiDataPointer
);
531 if (EFI_ERROR (Status
)) {
532 goto UndiErrorDeleteDevicePath
;
535 Len
= (pxe_31
->IFcnt
* sizeof (NII_ENTRY
)) + sizeof (UndiDataPointer
);
536 Status
= gBS
->AllocatePool (EfiRuntimeServicesData
, Len
, (VOID
**) &UndiDataPointer
);
538 if (EFI_ERROR (Status
)) {
539 goto UndiErrorAllocDataPointer
;
543 // Open For Child Device
545 Status
= gBS
->OpenProtocol (
547 &gEfiPciIoProtocolGuid
,
548 (VOID
**) &PciIoFncs
,
549 This
->DriverBindingHandle
,
550 UNDI32Device
->DeviceHandle
,
551 EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
555 UndiErrorAllocDataPointer
:
556 gBS
->UninstallMultipleProtocolInterfaces (
557 &UNDI32Device
->DeviceHandle
,
558 &gEfiNetworkInterfaceIdentifierProtocolGuid_31
,
559 &UNDI32Device
->NIIProtocol_31
,
560 &gEfiNetworkInterfaceIdentifierProtocolGuid
,
561 &UNDI32Device
->NIIProtocol
,
562 &gEfiDevicePathProtocolGuid
,
563 UNDI32Device
->Undi32DevPath
,
567 UndiErrorDeleteDevicePath
:
568 UNDI32DeviceList
[UNDI32Device
->NIIProtocol
.IfNum
] = NULL
;
569 gBS
->FreePool (UNDI32Device
->Undi32DevPath
);
572 PxeUpdate (NULL
, pxe
);
573 PxeUpdate (NULL
, pxe_31
);
574 if (TmpPxePointer
!= NULL
) {
575 gBS
->FreePool (TmpPxePointer
);
579 UndiErrorDeleteDevice
:
581 // Restore original PCI attributes
583 PciIoFncs
->Attributes (
585 EfiPciIoAttributeOperationSet
,
586 UNDI32Device
->NicInfo
.OriginalPciAttributes
,
590 gBS
->FreePool (UNDI32Device
);
595 &gEfiDevicePathProtocolGuid
,
596 This
->DriverBindingHandle
,
602 &gEfiPciIoProtocolGuid
,
603 This
->DriverBindingHandle
,
613 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
614 IN EFI_HANDLE Controller
,
615 IN UINTN NumberOfChildren
,
616 IN EFI_HANDLE
*ChildHandleBuffer
621 Stop this driver on Controller by removing NetworkInterfaceIdentifier protocol and
622 closing the DevicePath and PciIo protocols on Controller.
625 This - Protocol instance pointer.
626 Controller - Handle of device to stop driver on.
627 NumberOfChildren - How many children need to be stopped.
628 ChildHandleBuffer - Not used.
631 EFI_SUCCESS - This driver is removed Controller.
632 other - This driver was not removed from this device.
635 // TODO: EFI_DEVICE_ERROR - add return value to function comment
638 BOOLEAN AllChildrenStopped
;
640 UNDI32_DEV
*UNDI32Device
;
641 EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL
*NIIProtocol
;
642 EFI_PCI_IO_PROTOCOL
*PciIo
;
645 // Complete all outstanding transactions to Controller.
646 // Don't allow any new transaction to Controller to be started.
648 if (NumberOfChildren
== 0) {
651 // Close the bus driver
653 Status
= gBS
->CloseProtocol (
655 &gEfiDevicePathProtocolGuid
,
656 This
->DriverBindingHandle
,
660 Status
= gBS
->CloseProtocol (
662 &gEfiPciIoProtocolGuid
,
663 This
->DriverBindingHandle
,
670 AllChildrenStopped
= TRUE
;
672 for (Index
= 0; Index
< NumberOfChildren
; Index
++) {
674 Status
= gBS
->OpenProtocol (
675 ChildHandleBuffer
[Index
],
676 &gEfiNetworkInterfaceIdentifierProtocolGuid
,
677 (VOID
**) &NIIProtocol
,
678 This
->DriverBindingHandle
,
680 EFI_OPEN_PROTOCOL_GET_PROTOCOL
682 if (!EFI_ERROR (Status
)) {
684 UNDI32Device
= UNDI_DEV_FROM_THIS (NIIProtocol
);
687 // Restore original PCI attributes
689 Status
= UNDI32Device
->NicInfo
.Io_Function
->Attributes (
690 UNDI32Device
->NicInfo
.Io_Function
,
691 EfiPciIoAttributeOperationSet
,
692 UNDI32Device
->NicInfo
.OriginalPciAttributes
,
695 ASSERT_EFI_ERROR (Status
);
697 Status
= gBS
->CloseProtocol (
699 &gEfiPciIoProtocolGuid
,
700 This
->DriverBindingHandle
,
701 ChildHandleBuffer
[Index
]
704 Status
= gBS
->UninstallMultipleProtocolInterfaces (
705 ChildHandleBuffer
[Index
],
706 &gEfiDevicePathProtocolGuid
,
707 UNDI32Device
->Undi32DevPath
,
708 &gEfiNetworkInterfaceIdentifierProtocolGuid_31
,
709 &UNDI32Device
->NIIProtocol_31
,
710 &gEfiNetworkInterfaceIdentifierProtocolGuid
,
711 &UNDI32Device
->NIIProtocol
,
715 if (EFI_ERROR (Status
)) {
718 &gEfiPciIoProtocolGuid
,
720 This
->DriverBindingHandle
,
721 ChildHandleBuffer
[Index
],
722 EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
725 gBS
->FreePool (UNDI32Device
->Undi32DevPath
);
726 gBS
->FreePool (UNDI32Device
);
730 if (EFI_ERROR (Status
)) {
731 AllChildrenStopped
= FALSE
;
735 if (!AllChildrenStopped
) {
736 return EFI_DEVICE_ERROR
;
746 IN UINTN MicroSeconds
752 Use the EFI boot services to produce a pause. This is also the routine which
753 gets replaced during RunTime by the O/S in the NIC_DATA_INSTANCE so it can
758 UnqId - Runtime O/S routine might use this, this temp routine does not use it
760 MicroSeconds - Determines the length of pause.
768 gBS
->Stall ((UINT32
) MicroSeconds
);
783 Use the PCI IO abstraction to issue memory or I/O reads and writes. This is also the routine which
784 gets replaced during RunTime by the O/S in the NIC_DATA_INSTANCE so it can do it's own I/O abstractions.
788 UnqId - Runtime O/S routine may use this field, this temp routine does not.
790 ReadWrite - Determine if it is an I/O or Memory Read/Write Operation.
792 Len - Determines the width of the data operation.
794 Port - What port to Read/Write from.
796 BuffAddr - Address to read to or write from.
804 EFI_PCI_IO_PROTOCOL_WIDTH Width
;
805 NIC_DATA_INSTANCE
*AdapterInfo
;
807 Width
= (EFI_PCI_IO_PROTOCOL_WIDTH
) 0;
808 AdapterInfo
= (NIC_DATA_INSTANCE
*) (UINTN
) UnqId
;
811 Width
= (EFI_PCI_IO_PROTOCOL_WIDTH
) 1;
815 Width
= (EFI_PCI_IO_PROTOCOL_WIDTH
) 2;
819 Width
= (EFI_PCI_IO_PROTOCOL_WIDTH
) 3;
825 AdapterInfo
->Io_Function
->Io
.Read (
826 AdapterInfo
->Io_Function
,
831 (VOID
*) (UINTN
) (BuffAddr
)
836 AdapterInfo
->Io_Function
->Io
.Write (
837 AdapterInfo
->Io_Function
,
842 (VOID
*) (UINTN
) (BuffAddr
)
847 AdapterInfo
->Io_Function
->Mem
.Read (
848 AdapterInfo
->Io_Function
,
853 (VOID
*) (UINTN
) (BuffAddr
)
858 AdapterInfo
->Io_Function
->Mem
.Write (
859 AdapterInfo
->Io_Function
,
864 (VOID
*) (UINTN
) (BuffAddr
)
874 IN OUT EFI_DEVICE_PATH_PROTOCOL
**DevPtr
,
875 IN EFI_DEVICE_PATH_PROTOCOL
*BaseDevPtr
,
876 IN NIC_DATA_INSTANCE
*AdapterInfo
882 Using the NIC data structure information, read the EEPROM to get the MAC address and then allocate space
883 for a new devicepath (**DevPtr) which will contain the original device path the NIC was found on (*BaseDevPtr)
884 and an added MAC node.
888 DevPtr - Pointer which will point to the newly created device path with the MAC node attached.
890 BaseDevPtr - Pointer to the device path which the UNDI device driver is latching on to.
892 AdapterInfo - Pointer to the NIC data structure information which the UNDI driver is layering on..
896 EFI_SUCCESS - A MAC address was successfully appended to the Base Device Path.
898 other - Not enough resources available to create new Device Path node.
902 EFI_MAC_ADDRESS MACAddress
;
903 PCI_CONFIG_HEADER
*CfgHdr
;
908 MAC_ADDR_DEVICE_PATH MacAddrNode
;
909 EFI_DEVICE_PATH_PROTOCOL
*EndNode
;
916 // set the environment ready (similar to UNDI_Start call) so that we can
917 // execute the other UNDI_ calls to get the mac address
918 // we are using undi 3.1 style
920 AdapterInfo
->Delay
= TmpDelay
;
921 AdapterInfo
->Virt2Phys
= (VOID
*) 0;
922 AdapterInfo
->Block
= (VOID
*) 0;
923 AdapterInfo
->Map_Mem
= (VOID
*) 0;
924 AdapterInfo
->UnMap_Mem
= (VOID
*) 0;
925 AdapterInfo
->Sync_Mem
= (VOID
*) 0;
926 AdapterInfo
->Mem_Io
= TmpMemIo
;
928 // these tmp call-backs follow 3.1 undi style
929 // i.e. they have the unique_id parameter.
931 AdapterInfo
->VersionFlag
= 0x31;
932 AdapterInfo
->Unique_ID
= (UINT64
) (UINTN
) AdapterInfo
;
937 CfgHdr
= (PCI_CONFIG_HEADER
*) &(AdapterInfo
->Config
[0]);
938 AdapterInfo
->ioaddr
= 0;
939 AdapterInfo
->RevID
= CfgHdr
->RevID
;
941 AddrLen
= E100bGetEepromAddrLen (AdapterInfo
);
943 for (Index
= 0, Index2
= 0; Index
< 3; Index
++) {
944 Val
= E100bReadEeprom (AdapterInfo
, Index
, AddrLen
);
945 MACAddress
.Addr
[Index2
++] = (UINT8
) Val
;
946 MACAddress
.Addr
[Index2
++] = (UINT8
) (Val
>> 8);
949 SetMem (MACAddress
.Addr
+ Index2
, sizeof (EFI_MAC_ADDRESS
) - Index2
, 0);
950 //for (; Index2 < sizeof (EFI_MAC_ADDRESS); Index2++) {
951 // MACAddress.Addr[Index2] = 0;
956 AdapterInfo
->Delay
= (VOID
*) 0;
957 AdapterInfo
->Mem_Io
= (VOID
*) 0;
960 // fill the mac address node first
962 ZeroMem ((CHAR8
*) &MacAddrNode
, sizeof MacAddrNode
);
964 (CHAR8
*) &MacAddrNode
.MacAddress
,
965 (CHAR8
*) &MACAddress
,
966 sizeof (EFI_MAC_ADDRESS
)
969 MacAddrNode
.Header
.Type
= MESSAGING_DEVICE_PATH
;
970 MacAddrNode
.Header
.SubType
= MSG_MAC_ADDR_DP
;
971 MacAddrNode
.Header
.Length
[0] = sizeof (MacAddrNode
);
972 MacAddrNode
.Header
.Length
[1] = 0;
975 // find the size of the base dev path.
977 EndNode
= BaseDevPtr
;
979 while (!IsDevicePathEnd (EndNode
)) {
980 EndNode
= NextDevicePathNode (EndNode
);
983 BasePathLen
= (UINT16
) ((UINTN
) (EndNode
) - (UINTN
) (BaseDevPtr
));
986 // create space for full dev path
988 TotalPathLen
= (UINT16
) (BasePathLen
+ sizeof (MacAddrNode
) + sizeof (EFI_DEVICE_PATH_PROTOCOL
));
990 Status
= gBS
->AllocatePool (
991 EfiRuntimeServicesData
,
996 if (Status
!= EFI_SUCCESS
) {
1000 // copy the base path, mac addr and end_dev_path nodes
1002 *DevPtr
= (EFI_DEVICE_PATH_PROTOCOL
*) DevicePtr
;
1003 CopyMem (DevicePtr
, (CHAR8
*) BaseDevPtr
, BasePathLen
);
1004 DevicePtr
+= BasePathLen
;
1005 CopyMem (DevicePtr
, (CHAR8
*) &MacAddrNode
, sizeof (MacAddrNode
));
1006 DevicePtr
+= sizeof (MacAddrNode
);
1007 CopyMem (DevicePtr
, (CHAR8
*) EndNode
, sizeof (EFI_DEVICE_PATH_PROTOCOL
));
1013 InstallConfigTable (
1018 Routine Description:
1020 Install a GUID/Pointer pair into the system's configuration table.
1028 EFI_SUCCESS - Install a GUID/Pointer pair into the system's configuration table.
1030 other - Did not successfully install the GUID/Pointer pair into the configuration table.
1033 // TODO: VOID - add argument and description to function comment
1036 EFI_CONFIGURATION_TABLE
*CfgPtr
;
1039 NII_TABLE
*UndiData
;
1041 if (pxe_31
== NULL
) {
1045 if(UndiDataPointer
== NULL
) {
1049 UndiData
= (NII_TABLE
*)UndiDataPointer
;
1051 UndiData
->NumEntries
= pxe_31
->IFcnt
;
1052 UndiData
->NextLink
= NULL
;
1054 for (Index
= 0; Index
< pxe_31
->IFcnt
; Index
++) {
1055 UndiData
->NiiEntry
[Index
].InterfacePointer
= &UNDI32DeviceList
[Index
]->NIIProtocol_31
;
1056 UndiData
->NiiEntry
[Index
].DevicePathPointer
= UNDI32DeviceList
[Index
]->Undi32DevPath
;
1060 // see if there is an entry in the config table already
1062 CfgPtr
= gST
->ConfigurationTable
;
1064 for (Index
= 0; Index
< gST
->NumberOfTableEntries
; Index
++) {
1065 Status
= CompareGuid (
1066 &CfgPtr
->VendorGuid
,
1067 &gEfiNetworkInterfaceIdentifierProtocolGuid_31
1069 if (Status
!= EFI_SUCCESS
) {
1076 if (Index
< gST
->NumberOfTableEntries
) {
1077 TmpData
= (NII_TABLE
*) CfgPtr
->VendorTable
;
1080 // go to the last link
1082 while (TmpData
->NextLink
!= NULL
) {
1083 TmpData
= TmpData
->NextLink
;
1086 TmpData
->NextLink
= UndiData
;
1091 UndiData
= (NII_TABLE
*) CfgPtr
->VendorTable
;
1095 // create an entry in the configuration table for our GUID
1097 Status
= gBS
->InstallConfigurationTable (
1098 &gEfiNetworkInterfaceIdentifierProtocolGuid_31
,
1106 Install driver binding protocol of UNDI.
1108 @param[in] ImageHandle The firmware allocated handle for the EFI image.
1109 @param[in] SystemTable A pointer to the EFI System Table.
1111 @retval EFI_SUCCESS The entry point is executed successfully.
1112 @retval other Some error occurs when executing this entry point.
1118 IN EFI_HANDLE ImageHandle
,
1119 IN EFI_SYSTEM_TABLE
*SystemTable
1125 Status
= EfiLibInstallDriverBinding (
1128 &gUndiDriverBinding
,
1131 ASSERT_EFI_ERROR (Status
);
1133 Status
= gBS
->CreateEvent (
1134 EVT_SIGNAL_EXIT_BOOT_SERVICES
,
1140 ASSERT_EFI_ERROR (Status
);
1142 Status
= gBS
->CreateEvent (
1143 EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE
,
1149 ASSERT_EFI_ERROR (Status
);