From 32e817c9952a957af17de359e6636e4e674caebf Mon Sep 17 00:00:00 2001 From: Feng Tian Date: Tue, 3 Dec 2013 07:10:56 +0000 Subject: MdeModulePkg/AtaAtapiPassThru: Error handling enhancement for uninstalling protocol interface failure case Signed-off-by: Feng Tian Reviewed-by: Ruiyu Ni git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14928 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.c | 95 ++++++++++++---------- 1 file changed, 50 insertions(+), 45 deletions(-) (limited to 'MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.c') diff --git a/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.c b/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.c index cc575b98c7..c397a04cf7 100644 --- a/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.c +++ b/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.c @@ -870,53 +870,17 @@ AtaAtapiPassThruStop ( Instance = ATA_PASS_THRU_PRIVATE_DATA_FROM_THIS (AtaPassThru); - // - // Close Non-Blocking timer and free Task list. - // - if (Instance->TimerEvent != NULL) { - gBS->CloseEvent (Instance->TimerEvent); - Instance->TimerEvent = NULL; - } - DestroyAsynTaskList (Instance, FALSE); + Status = gBS->UninstallMultipleProtocolInterfaces ( + Controller, + &gEfiAtaPassThruProtocolGuid, &(Instance->AtaPassThru), + &gEfiExtScsiPassThruProtocolGuid, &(Instance->ExtScsiPassThru), + NULL + ); - // - // 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 - ); + if (EFI_ERROR (Status)) { + return EFI_DEVICE_ERROR; } - // - // 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 // @@ -927,15 +891,25 @@ AtaAtapiPassThruStop ( 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 // - DestroyDeviceInfoList(Instance); + DestroyDeviceInfoList (Instance); // // If the current working mode is AHCI mode, then pre-allocated resource // for AHCI initialization should be released. // + PciIo = Instance->PciIo; + if (Instance->Mode == EfiAtaAhciMode) { AhciRegisters = &Instance->AhciRegisters; PciIo->Unmap ( @@ -966,6 +940,37 @@ AtaAtapiPassThruStop ( 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); return Status; -- cgit v1.2.3