{\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
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
FreePool (SataPrivateData);\r
}\r
\r
+ //\r
+ // Restore original PCI attributes\r
+ //\r
+ SataPrivateData->PciIo->Attributes (\r
+ SataPrivateData->PciIo,\r
+ EfiPciIoAttributeOperationSet,\r
+ SataPrivateData->OriginalPciAttributes,\r
+ NULL\r
+ );\r
+\r
//\r
// Close protocols opened by Sata Controller driver\r
//\r