IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
)\r
{\r
+ UINTN BailLogMask;\r
EFI_STATUS Status;\r
EFI_PCI_IO_PROTOCOL *PciIo;\r
+ UINT64 OriginalPciAttributes;\r
PCI_TYPE00 PciData;\r
EFI_SATA_CONTROLLER_PRIVATE_DATA *SataPrivateData;\r
UINT32 Data32;\r
\r
DEBUG ((EFI_D_INFO, "SataControllerStart START\n"));\r
\r
+ BailLogMask = DEBUG_ERROR;\r
SataPrivateData = NULL;\r
\r
//\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
);\r
if (EFI_ERROR (Status)) {\r
+ if (Status == EFI_ALREADY_STARTED) {\r
+ //\r
+ // This is an expected condition for OpenProtocol() / BY_DRIVER, in a\r
+ // DriverBindingStart() member function; degrade the log mask to\r
+ // DEBUG_INFO.\r
+ //\r
+ BailLogMask = DEBUG_INFO;\r
+ }\r
goto Bail;\r
}\r
\r
+ //\r
+ // Save original PCI attributes, and enable IO space access, memory space\r
+ // access, and Bus Master (DMA).\r
+ //\r
+ Status = PciIo->Attributes (PciIo, EfiPciIoAttributeOperationGet, 0,\r
+ &OriginalPciAttributes);\r
+ if (EFI_ERROR (Status)) {\r
+ goto ClosePciIo;\r
+ }\r
+ Status = PciIo->Attributes (PciIo, EfiPciIoAttributeOperationEnable,\r
+ EFI_PCI_DEVICE_ENABLE, NULL);\r
+ if (EFI_ERROR (Status)) {\r
+ goto ClosePciIo;\r
+ }\r
+\r
//\r
// Allocate Sata Private Data structure\r
//\r
SataPrivateData = AllocateZeroPool (sizeof (EFI_SATA_CONTROLLER_PRIVATE_DATA));\r
if (SataPrivateData == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
- goto ClosePciIo;\r
+ goto RestorePciAttributes;\r
}\r
\r
//\r
//\r
SataPrivateData->Signature = SATA_CONTROLLER_SIGNATURE;\r
SataPrivateData->PciIo = PciIo;\r
+ SataPrivateData->OriginalPciAttributes = OriginalPciAttributes;\r
SataPrivateData->IdeInit.GetChannelInfo = IdeInitGetChannelInfo;\r
SataPrivateData->IdeInit.NotifyPhase = IdeInitNotifyPhase;\r
SataPrivateData->IdeInit.SubmitData = IdeInitSubmitData;\r
FreeSataPrivateData:\r
FreePool (SataPrivateData);\r
\r
+RestorePciAttributes:\r
+ PciIo->Attributes (PciIo, EfiPciIoAttributeOperationSet,\r
+ OriginalPciAttributes, NULL);\r
+\r
ClosePciIo:\r
gBS->CloseProtocol (\r
Controller,\r
);\r
\r
Bail:\r
- DEBUG ((EFI_D_ERROR, "SataControllerStart error return status = %r\n", Status));\r
+ DEBUG ((BailLogMask, "SataControllerStart error return status = %r\n",\r
+ Status));\r
return Status;\r
}\r
\r
EFI_STATUS Status;\r
EFI_IDE_CONTROLLER_INIT_PROTOCOL *IdeInit;\r
EFI_SATA_CONTROLLER_PRIVATE_DATA *SataPrivateData;\r
+ EFI_PCI_IO_PROTOCOL *PciIo;\r
+ UINT64 OriginalPciAttributes;\r
\r
//\r
// Open the produced protocol\r
SataPrivateData = SATA_CONTROLLER_PRIVATE_DATA_FROM_THIS (IdeInit);\r
ASSERT (SataPrivateData != NULL);\r
\r
+ PciIo = SataPrivateData->PciIo;\r
+ OriginalPciAttributes = SataPrivateData->OriginalPciAttributes;\r
+\r
//\r
// Uninstall the IDE Controller Init Protocol from this instance\r
//\r
return Status;\r
}\r
\r
- if (SataPrivateData != NULL) {\r
- if (SataPrivateData->DisqualifiedModes != NULL) {\r
- FreePool (SataPrivateData->DisqualifiedModes);\r
- }\r
- if (SataPrivateData->IdentifyData != NULL) {\r
- FreePool (SataPrivateData->IdentifyData);\r
- }\r
- if (SataPrivateData->IdentifyValid != NULL) {\r
- FreePool (SataPrivateData->IdentifyValid);\r
- }\r
- FreePool (SataPrivateData);\r
+ if (SataPrivateData->DisqualifiedModes != NULL) {\r
+ FreePool (SataPrivateData->DisqualifiedModes);\r
+ }\r
+ if (SataPrivateData->IdentifyData != NULL) {\r
+ FreePool (SataPrivateData->IdentifyData);\r
}\r
+ if (SataPrivateData->IdentifyValid != NULL) {\r
+ FreePool (SataPrivateData->IdentifyValid);\r
+ }\r
+ FreePool (SataPrivateData);\r
+\r
+ //\r
+ // Restore original PCI attributes\r
+ //\r
+ PciIo->Attributes (\r
+ PciIo,\r
+ EfiPciIoAttributeOperationSet,\r
+ OriginalPciAttributes,\r
+ NULL\r
+ );\r
\r
//\r
// Close protocols opened by Sata Controller driver\r