/*++\r
\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
+Copyright (c) 2006, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
\r
Module Name:\r
\r
--*/\r
\r
#include "Undi32.h"\r
-\r
+#include <Library/BaseLib.h>\r
//\r
// Global Variables\r
//\r
PXE_SW_UNDI *pxe_31 = 0; // 3.1 entry\r
UNDI32_DEV *UNDI32DeviceList[MAX_NIC_INTERFACES];\r
\r
-NII_TABLE *UnidiDataPointer=NULL; \r
+NII_TABLE *UndiDataPointer = NULL;\r
\r
VOID\r
EFIAPI\r
\r
Routine Description:\r
\r
- When EFI is shuting down the boot services, we need to install a \r
+ When EFI is shuting down the boot services, we need to install a\r
configuration table for UNDI to work at runtime!\r
\r
Arguments:\r
Arguments:\r
\r
This - Protocol instance pointer.\r
- \r
+\r
Controller - Handle of device to test.\r
- \r
+\r
RemainingDevicePath - Not used.\r
\r
Returns:\r
\r
EFI_SUCCESS - This driver supports this device.\r
- \r
+\r
other - This driver does not support this device.\r
\r
--*/\r
Arguments:\r
\r
This - Protocol instance pointer.\r
- \r
+\r
Controller - Handle of device to work with.\r
- \r
+\r
RemainingDevicePath - Not used, always produce all possible children.\r
\r
Returns:\r
\r
EFI_SUCCESS - This driver is added to Controller.\r
- \r
+\r
other - This driver does not support this device.\r
\r
--*/\r
UINT16 NewCommand;\r
UINT8 *TmpPxePointer;\r
EFI_PCI_IO_PROTOCOL *PciIoFncs;\r
- UINTN Len; \r
+ UINTN Len;\r
+ UINT64 Supports;\r
\r
Status = gBS->OpenProtocol (\r
Controller,\r
\r
ZeroMem ((CHAR8 *) UNDI32Device, sizeof (UNDI32_DEV));\r
\r
+ //\r
+ // Get original PCI attributes\r
+ //\r
+ Status = PciIoFncs->Attributes (\r
+ PciIoFncs,\r
+ EfiPciIoAttributeOperationGet,\r
+ 0,\r
+ &UNDI32Device->NicInfo.OriginalPciAttributes\r
+ );\r
+\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
//\r
// allocate and initialize both (old and new) the !pxe structures here,\r
// there should only be one copy of each of these structure for any number\r
\r
Status = PciIoFncs->Attributes (\r
PciIoFncs,\r
- EfiPciIoAttributeOperationEnable,\r
- EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_MEMORY | EFI_PCI_IO_ATTRIBUTE_IO | EFI_PCI_IO_ATTRIBUTE_BUS_MASTER,\r
- NULL\r
+ EfiPciIoAttributeOperationSupported,\r
+ 0,\r
+ &Supports\r
);\r
+ if (!EFI_ERROR (Status)) {\r
+ Supports &= EFI_PCI_DEVICE_ENABLE;\r
+ Status = PciIoFncs->Attributes (\r
+ PciIoFncs,\r
+ EfiPciIoAttributeOperationEnable,\r
+ Supports,\r
+ NULL\r
+ );\r
+ }\r
//\r
// Read all the registers from device's PCI Configuration space\r
//\r
}\r
\r
//\r
- // if the table exists, free it and alloc again, or alloc it directly \r
+ // if the table exists, free it and alloc again, or alloc it directly\r
//\r
- if (UnidiDataPointer != NULL) {\r
- Status = gBS->FreePool(UnidiDataPointer);\r
+ if (UndiDataPointer != NULL) {\r
+ Status = gBS->FreePool(UndiDataPointer);\r
}\r
if (EFI_ERROR (Status)) {\r
goto UndiErrorDeleteDevicePath;\r
}\r
\r
- Len = (pxe_31->IFcnt * sizeof (NII_ENTRY)) + sizeof (UnidiDataPointer);\r
- Status = gBS->AllocatePool (EfiRuntimeServicesData, Len, (VOID **) &UnidiDataPointer);\r
+ Len = (pxe_31->IFcnt * sizeof (NII_ENTRY)) + sizeof (UndiDataPointer);\r
+ Status = gBS->AllocatePool (EfiRuntimeServicesData, Len, (VOID **) &UndiDataPointer);\r
\r
if (EFI_ERROR (Status)) {\r
goto UndiErrorAllocDataPointer;\r
}\r
- \r
+\r
//\r
// Open For Child Device\r
//\r
}\r
\r
UndiErrorDeleteDevice:\r
+ //\r
+ // Restore original PCI attributes\r
+ //\r
+ PciIoFncs->Attributes (\r
+ PciIoFncs,\r
+ EfiPciIoAttributeOperationSet,\r
+ UNDI32Device->NicInfo.OriginalPciAttributes,\r
+ NULL\r
+ );\r
+\r
gBS->FreePool (UNDI32Device);\r
\r
UndiError:\r
\r
UNDI32Device = UNDI_DEV_FROM_THIS (NIIProtocol);\r
\r
+ //\r
+ // Restore original PCI attributes\r
+ //\r
+ Status = UNDI32Device->NicInfo.Io_Function->Attributes (\r
+ UNDI32Device->NicInfo.Io_Function,\r
+ EfiPciIoAttributeOperationSet,\r
+ UNDI32Device->NicInfo.OriginalPciAttributes,\r
+ NULL\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
Status = gBS->CloseProtocol (\r
Controller,\r
&gEfiPciIoProtocolGuid,\r
Arguments:\r
\r
UnqId - Runtime O/S routine might use this, this temp routine does not use it\r
- \r
+\r
MicroSeconds - Determines the length of pause.\r
\r
Returns:\r
Arguments:\r
\r
UnqId - Runtime O/S routine may use this field, this temp routine does not.\r
- \r
+\r
ReadWrite - Determine if it is an I/O or Memory Read/Write Operation.\r
- \r
+\r
Len - Determines the width of the data operation.\r
- \r
+\r
Port - What port to Read/Write from.\r
- \r
+\r
BuffAddr - Address to read to or write from.\r
\r
Returns:\r
Arguments:\r
\r
DevPtr - Pointer which will point to the newly created device path with the MAC node attached.\r
- \r
+\r
BaseDevPtr - Pointer to the device path which the UNDI device driver is latching on to.\r
- \r
+\r
AdapterInfo - Pointer to the NIC data structure information which the UNDI driver is layering on..\r
\r
Returns:\r
\r
EFI_SUCCESS - A MAC address was successfully appended to the Base Device Path.\r
- \r
+\r
other - Not enough resources available to create new Device Path node.\r
\r
--*/\r
Returns:\r
\r
EFI_SUCCESS - Install a GUID/Pointer pair into the system's configuration table.\r
- \r
+\r
other - Did not successfully install the GUID/Pointer pair into the configuration table.\r
\r
--*/\r
return EFI_SUCCESS;\r
}\r
\r
- if(UnidiDataPointer == NULL) { \r
+ if(UndiDataPointer == NULL) {\r
return EFI_SUCCESS;\r
}\r
- \r
- UndiData = (NII_TABLE *)UnidiDataPointer; \r
- \r
+\r
+ UndiData = (NII_TABLE *)UndiDataPointer;\r
+\r
UndiData->NumEntries = pxe_31->IFcnt;\r
UndiData->NextLink = NULL;\r
\r
}\r
\r
/**\r
- \r
+\r
Install driver binding protocol of UNDI.\r
- \r
- @param[in] ImageHandle The firmware allocated handle for the EFI image. \r
+\r
+ @param[in] ImageHandle The firmware allocated handle for the EFI image.\r
@param[in] SystemTable A pointer to the EFI System Table.\r
- \r
+\r
@retval EFI_SUCCESS The entry point is executed successfully.\r
@retval other Some error occurs when executing this entry point.\r
\r