MdeModulePkg/AtaAtapiPassThru: Error handling enhancement for uninstalling protocol interface failure case
Signed-off-by: Feng Tian <feng.tian@intel.com> Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14928 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
0f58371b5d
commit
32e817c995
|
@ -870,52 +870,16 @@ AtaAtapiPassThruStop (
|
||||||
|
|
||||||
Instance = ATA_PASS_THRU_PRIVATE_DATA_FROM_THIS (AtaPassThru);
|
Instance = ATA_PASS_THRU_PRIVATE_DATA_FROM_THIS (AtaPassThru);
|
||||||
|
|
||||||
//
|
Status = gBS->UninstallMultipleProtocolInterfaces (
|
||||||
// Close Non-Blocking timer and free Task list.
|
Controller,
|
||||||
//
|
&gEfiAtaPassThruProtocolGuid, &(Instance->AtaPassThru),
|
||||||
if (Instance->TimerEvent != NULL) {
|
&gEfiExtScsiPassThruProtocolGuid, &(Instance->ExtScsiPassThru),
|
||||||
gBS->CloseEvent (Instance->TimerEvent);
|
NULL
|
||||||
Instance->TimerEvent = NULL;
|
);
|
||||||
|
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return EFI_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
DestroyAsynTaskList (Instance, FALSE);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Disable this ATA host controller.
|
|
||||||
//
|
|
||||||
PciIo = Instance->PciIo;
|
|
||||||
Status = PciIo->Attributes (
|
|
||||||
PciIo,
|
|
||||||
EfiPciIoAttributeOperationSupported,
|
|
||||||
0,
|
|
||||||
&Supports
|
|
||||||
);
|
|
||||||
if (!EFI_ERROR (Status)) {
|
|
||||||
Supports &= EFI_PCI_DEVICE_ENABLE;
|
|
||||||
PciIo->Attributes (
|
|
||||||
PciIo,
|
|
||||||
EfiPciIoAttributeOperationDisable,
|
|
||||||
Supports,
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Restore original PCI attributes
|
|
||||||
//
|
|
||||||
Status = PciIo->Attributes (
|
|
||||||
PciIo,
|
|
||||||
EfiPciIoAttributeOperationSet,
|
|
||||||
Instance->OriginalPciAttributes,
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
ASSERT_EFI_ERROR (Status);
|
|
||||||
|
|
||||||
gBS->UninstallMultipleProtocolInterfaces (
|
|
||||||
Controller,
|
|
||||||
&gEfiAtaPassThruProtocolGuid, &(Instance->AtaPassThru),
|
|
||||||
&gEfiExtScsiPassThruProtocolGuid, &(Instance->ExtScsiPassThru),
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Close protocols opened by AtaAtapiPassThru controller driver
|
// Close protocols opened by AtaAtapiPassThru controller driver
|
||||||
|
@ -927,15 +891,25 @@ AtaAtapiPassThruStop (
|
||||||
Controller
|
Controller
|
||||||
);
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Close Non-Blocking timer and free Task list.
|
||||||
|
//
|
||||||
|
if (Instance->TimerEvent != NULL) {
|
||||||
|
gBS->CloseEvent (Instance->TimerEvent);
|
||||||
|
Instance->TimerEvent = NULL;
|
||||||
|
}
|
||||||
|
DestroyAsynTaskList (Instance, FALSE);
|
||||||
//
|
//
|
||||||
// Free allocated resource
|
// Free allocated resource
|
||||||
//
|
//
|
||||||
DestroyDeviceInfoList(Instance);
|
DestroyDeviceInfoList (Instance);
|
||||||
|
|
||||||
//
|
//
|
||||||
// If the current working mode is AHCI mode, then pre-allocated resource
|
// If the current working mode is AHCI mode, then pre-allocated resource
|
||||||
// for AHCI initialization should be released.
|
// for AHCI initialization should be released.
|
||||||
//
|
//
|
||||||
|
PciIo = Instance->PciIo;
|
||||||
|
|
||||||
if (Instance->Mode == EfiAtaAhciMode) {
|
if (Instance->Mode == EfiAtaAhciMode) {
|
||||||
AhciRegisters = &Instance->AhciRegisters;
|
AhciRegisters = &Instance->AhciRegisters;
|
||||||
PciIo->Unmap (
|
PciIo->Unmap (
|
||||||
|
@ -966,6 +940,37 @@ AtaAtapiPassThruStop (
|
||||||
AhciRegisters->AhciRFis
|
AhciRegisters->AhciRFis
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Disable this ATA host controller.
|
||||||
|
//
|
||||||
|
Status = PciIo->Attributes (
|
||||||
|
PciIo,
|
||||||
|
EfiPciIoAttributeOperationSupported,
|
||||||
|
0,
|
||||||
|
&Supports
|
||||||
|
);
|
||||||
|
if (!EFI_ERROR (Status)) {
|
||||||
|
Supports &= EFI_PCI_DEVICE_ENABLE;
|
||||||
|
PciIo->Attributes (
|
||||||
|
PciIo,
|
||||||
|
EfiPciIoAttributeOperationDisable,
|
||||||
|
Supports,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Restore original PCI attributes
|
||||||
|
//
|
||||||
|
Status = PciIo->Attributes (
|
||||||
|
PciIo,
|
||||||
|
EfiPciIoAttributeOperationSet,
|
||||||
|
Instance->OriginalPciAttributes,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
FreePool (Instance);
|
FreePool (Instance);
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
|
|
Loading…
Reference in New Issue