]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.c
MdeModulePkg/AtaAtapiPassThru: Error handling enhancement for uninstalling protocol...
[mirror_edk2.git] / MdeModulePkg / Bus / Ata / AtaAtapiPassThru / AtaAtapiPassThru.c
index cc575b98c7c23672b773aa72ef01576652f40dc9..c397a04cf702b65334138e299e7929d821f4d6db 100644 (file)
@@ -870,53 +870,17 @@ AtaAtapiPassThruStop (
 \r
   Instance = ATA_PASS_THRU_PRIVATE_DATA_FROM_THIS (AtaPassThru);\r
 \r
-  //\r
-  // Close Non-Blocking timer and free Task list.\r
-  //\r
-  if (Instance->TimerEvent != NULL) {\r
-    gBS->CloseEvent (Instance->TimerEvent);\r
-    Instance->TimerEvent = NULL;\r
-  }\r
-  DestroyAsynTaskList (Instance, FALSE);\r
+  Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                  Controller,\r
+                  &gEfiAtaPassThruProtocolGuid, &(Instance->AtaPassThru),\r
+                  &gEfiExtScsiPassThruProtocolGuid, &(Instance->ExtScsiPassThru),\r
+                  NULL\r
+                  );\r
 \r
-  //\r
-  // Disable this ATA host controller.\r
-  //\r
-  PciIo  = Instance->PciIo;\r
-  Status = PciIo->Attributes (\r
-                    PciIo,\r
-                    EfiPciIoAttributeOperationSupported,\r
-                    0,\r
-                    &Supports\r
-                    );\r
-  if (!EFI_ERROR (Status)) {\r
-    Supports &= EFI_PCI_DEVICE_ENABLE;\r
-    PciIo->Attributes (\r
-             PciIo,\r
-             EfiPciIoAttributeOperationDisable,\r
-             Supports,\r
-             NULL\r
-             );\r
+  if (EFI_ERROR (Status)) {\r
+    return EFI_DEVICE_ERROR;\r
   }\r
 \r
-  //\r
-  // Restore original PCI attributes\r
-  //\r
-  Status = PciIo->Attributes (\r
-                    PciIo,\r
-                    EfiPciIoAttributeOperationSet,\r
-                    Instance->OriginalPciAttributes,\r
-                    NULL\r
-                    );\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  gBS->UninstallMultipleProtocolInterfaces (\r
-         Controller,\r
-         &gEfiAtaPassThruProtocolGuid, &(Instance->AtaPassThru),\r
-         &gEfiExtScsiPassThruProtocolGuid, &(Instance->ExtScsiPassThru),\r
-         NULL\r
-         );\r
-\r
   //\r
   // Close protocols opened by AtaAtapiPassThru controller driver\r
   //\r
@@ -927,15 +891,25 @@ AtaAtapiPassThruStop (
          Controller\r
          );\r
 \r
+  //\r
+  // Close Non-Blocking timer and free Task list.\r
+  //\r
+  if (Instance->TimerEvent != NULL) {\r
+    gBS->CloseEvent (Instance->TimerEvent);\r
+    Instance->TimerEvent = NULL;\r
+  }\r
+  DestroyAsynTaskList (Instance, FALSE);\r
   //\r
   // Free allocated resource\r
   //\r
-  DestroyDeviceInfoList(Instance);\r
+  DestroyDeviceInfoList (Instance);\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
@@ -966,6 +940,37 @@ AtaAtapiPassThruStop (
              AhciRegisters->AhciRFis\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 &= 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
+  Status = PciIo->Attributes (\r
+                    PciIo,\r
+                    EfiPciIoAttributeOperationSet,\r
+                    Instance->OriginalPciAttributes,\r
+                    NULL\r
+                    );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
   FreePool (Instance);\r
 \r
   return Status;\r