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:
Feng Tian 2013-12-03 07:10:56 +00:00 committed by erictian
parent 0f58371b5d
commit 32e817c995
1 changed files with 51 additions and 46 deletions

View File

@ -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;