NULL,\r
NULL\r
},\r
+ 0, // EnabledPciAttributes\r
0, // OriginalAttributes\r
0, // PreviousPort\r
0, // PreviousPortMultiplier\r
{ // NonBlocking TaskList\r
NULL,\r
NULL\r
- }\r
+ },\r
+ NULL, // ExitBootEvent\r
};\r
\r
ATAPI_DEVICE_PATH mAtapiDevicePathTemplate = {\r
return Status;\r
}\r
\r
+/**\r
+ Disable the device (especially Bus Master DMA) when exiting the boot\r
+ services.\r
+\r
+ @param[in] Event Event for which this notification function is being\r
+ called.\r
+ @param[in] Context Pointer to the ATA_ATAPI_PASS_THRU_INSTANCE that\r
+ represents the HBA.\r
+**/\r
+VOID\r
+EFIAPI\r
+AtaPassThruExitBootServices (\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
+ )\r
+{\r
+ ATA_ATAPI_PASS_THRU_INSTANCE *Instance;\r
+ EFI_PCI_IO_PROTOCOL *PciIo;\r
+\r
+ DEBUG ((DEBUG_VERBOSE, "%a: Context=0x%p\n", __FUNCTION__, Context));\r
+\r
+ Instance = Context;\r
+ PciIo = Instance->PciIo;\r
+\r
+ PciIo->Attributes (\r
+ PciIo,\r
+ EfiPciIoAttributeOperationDisable,\r
+ Instance->EnabledPciAttributes,\r
+ NULL\r
+ );\r
+}\r
+\r
/**\r
Tests to see if this driver supports a given controller. If a child device is provided,\r
it further tests to see if this driver supports creating a handle for the specified child device.\r
EFI_IDE_CONTROLLER_INIT_PROTOCOL *IdeControllerInit;\r
ATA_ATAPI_PASS_THRU_INSTANCE *Instance;\r
EFI_PCI_IO_PROTOCOL *PciIo;\r
- UINT64 Supports;\r
+ UINT64 EnabledPciAttributes;\r
UINT64 OriginalPciAttributes;\r
\r
Status = EFI_SUCCESS;\r
PciIo,\r
EfiPciIoAttributeOperationSupported,\r
0,\r
- &Supports\r
+ &EnabledPciAttributes\r
);\r
if (!EFI_ERROR (Status)) {\r
- Supports &= (UINT64)EFI_PCI_DEVICE_ENABLE;\r
+ EnabledPciAttributes &= (UINT64)EFI_PCI_DEVICE_ENABLE;\r
Status = PciIo->Attributes (\r
PciIo,\r
EfiPciIoAttributeOperationEnable,\r
- Supports,\r
+ EnabledPciAttributes,\r
NULL\r
);\r
}\r
Instance->ControllerHandle = Controller;\r
Instance->IdeControllerInit = IdeControllerInit;\r
Instance->PciIo = PciIo;\r
+ Instance->EnabledPciAttributes = EnabledPciAttributes;\r
Instance->OriginalPciAttributes = OriginalPciAttributes;\r
Instance->AtaPassThru.Mode = &Instance->AtaPassThruMode;\r
Instance->ExtScsiPassThru.Mode = &Instance->ExtScsiPassThruMode;\r
InitializeListHead(&Instance->DeviceList);\r
InitializeListHead(&Instance->NonBlockingTaskList);\r
\r
+ Status = gBS->CreateEvent (\r
+ EVT_SIGNAL_EXIT_BOOT_SERVICES,\r
+ TPL_CALLBACK,\r
+ AtaPassThruExitBootServices,\r
+ Instance,\r
+ &Instance->ExitBootEvent\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ goto ErrorExit;\r
+ }\r
+\r
Instance->TimerEvent = NULL;\r
\r
Status = gBS->CreateEvent (\r
gBS->CloseEvent (Instance->TimerEvent);\r
}\r
\r
+ if ((Instance != NULL) && (Instance->ExitBootEvent != NULL)) {\r
+ gBS->CloseEvent (Instance->ExitBootEvent);\r
+ }\r
+\r
//\r
// Remove all inserted ATA devices.\r
//\r
EFI_ATA_PASS_THRU_PROTOCOL *AtaPassThru;\r
EFI_PCI_IO_PROTOCOL *PciIo;\r
EFI_AHCI_REGISTERS *AhciRegisters;\r
- UINT64 Supports;\r
\r
DEBUG ((EFI_D_INFO, "==AtaAtapiPassThru Stop== Controller = %x\n", Controller));\r
\r
Instance->TimerEvent = NULL;\r
}\r
DestroyAsynTaskList (Instance, FALSE);\r
+\r
+ //\r
+ // Close event signaled at gBS->ExitBootServices().\r
+ //\r
+ if (Instance->ExitBootEvent != NULL) {\r
+ gBS->CloseEvent (Instance->ExitBootEvent);\r
+ Instance->ExitBootEvent = NULL;\r
+ }\r
+\r
//\r
// Free allocated resource\r
//\r
DestroyDeviceInfoList (Instance);\r
\r
+ PciIo = Instance->PciIo;\r
+\r
+ //\r
+ // Disable this ATA host controller.\r
+ //\r
+ PciIo->Attributes (\r
+ PciIo,\r
+ EfiPciIoAttributeOperationDisable,\r
+ Instance->EnabledPciAttributes,\r
+ NULL\r
+ );\r
+\r
//\r
// If the current working mode is AHCI mode, then pre-allocated resource\r
// for AHCI initialization should be released.\r
//\r
- PciIo = Instance->PciIo;\r
-\r
if (Instance->Mode == EfiAtaAhciMode) {\r
AhciRegisters = &Instance->AhciRegisters;\r
PciIo->Unmap (\r
);\r
}\r
\r
- //\r
- // Disable this ATA host controller.\r
- //\r
- Status = PciIo->Attributes (\r
- PciIo,\r
- EfiPciIoAttributeOperationSupported,\r
- 0,\r
- &Supports\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- Supports &= (UINT64)EFI_PCI_DEVICE_ENABLE;\r
- PciIo->Attributes (\r
- PciIo,\r
- EfiPciIoAttributeOperationDisable,\r
- Supports,\r
- NULL\r
- );\r
- }\r
-\r
//\r
// Restore original PCI attributes\r
//\r
}\r
\r
/**\r
- Sumbit ATAPI request sense command.\r
+ Submit ATAPI request sense command.\r
\r
@param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.\r
@param[in] Target The Target is an array of size TARGET_MAX_BYTES and it represents\r