]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Bus/Pci/UndiRuntimeDxe/Init.c
Save original PCI attributes in start() function and restore it in Stop() for those...
[mirror_edk2.git] / MdeModulePkg / Bus / Pci / UndiRuntimeDxe / Init.c
index 8315bc41d0fc620c5224d4f3c2722b19d6e97f18..3e3391ebee3be4160b7e22181608e0490dbd9c16 100644 (file)
@@ -1,13 +1,13 @@
 /*++\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
@@ -22,7 +22,7 @@ Revision History
 --*/\r
 \r
 #include "Undi32.h"\r
-\r
+#include <Library/BaseLib.h>\r
 //\r
 // Global Variables\r
 //\r
@@ -30,7 +30,7 @@ PXE_SW_UNDI             *pxe = 0;     // 3.0 entry point
 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
@@ -103,7 +103,7 @@ UndiNotifyExitBs (
 \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
@@ -152,15 +152,15 @@ Routine Description:
 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
@@ -266,15 +266,15 @@ Routine Description:
 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
@@ -286,7 +286,8 @@ Returns:
   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
@@ -333,6 +334,20 @@ Returns:
 \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
@@ -380,10 +395,19 @@ Returns:
 \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
@@ -499,22 +523,22 @@ Returns:
   }\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
@@ -553,6 +577,16 @@ UndiErrorDeletePxe:
   }\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
@@ -649,6 +683,17 @@ Returns:
 \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
@@ -711,7 +756,7 @@ Routine Description:
 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
@@ -741,13 +786,13 @@ Routine Description:
 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
@@ -841,15 +886,15 @@ Routine Description:
 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
@@ -981,7 +1026,7 @@ Arguments:
 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
@@ -997,12 +1042,12 @@ Returns:
     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
@@ -1057,12 +1102,12 @@ Returns:
 }\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