]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/SataControllerDxe/SataController.c
OvmfPkg: SataControllerDxe: add cascading error handling to Start()
[mirror_edk2.git] / OvmfPkg / SataControllerDxe / SataController.c
index e5d10e234e88c3135892b9b400c5db409e4f4504..5e7e23b26164ea0ccf7e7a9f3ccd41a8a2676223 100644 (file)
@@ -411,8 +411,7 @@ SataControllerStart (
                   EFI_OPEN_PROTOCOL_BY_DRIVER\r
                   );\r
   if (EFI_ERROR (Status)) {\r
-    DEBUG ((EFI_D_ERROR, "SataControllerStart error return status = %r\n", Status));\r
-    return Status;\r
+    goto Bail;\r
   }\r
 \r
   //\r
@@ -421,7 +420,7 @@ SataControllerStart (
   SataPrivateData = AllocateZeroPool (sizeof (EFI_SATA_CONTROLLER_PRIVATE_DATA));\r
   if (SataPrivateData == NULL) {\r
     Status = EFI_OUT_OF_RESOURCES;\r
-    goto Done;\r
+    goto ClosePciIo;\r
   }\r
 \r
   //\r
@@ -444,7 +443,9 @@ SataControllerStart (
                         sizeof (PciData.Hdr.ClassCode),\r
                         PciData.Hdr.ClassCode\r
                         );\r
-  ASSERT_EFI_ERROR (Status);\r
+  if (EFI_ERROR (Status)) {\r
+    goto FreeSataPrivateData;\r
+  }\r
 \r
   if (IS_PCI_IDE (&PciData)) {\r
     SataPrivateData->IdeInit.ChannelCount = IDE_MAX_CHANNEL;\r
@@ -467,19 +468,19 @@ SataControllerStart (
   SataPrivateData->DisqualifiedModes = AllocateZeroPool ((sizeof (EFI_ATA_COLLECTIVE_MODE)) * ChannelDeviceCount);\r
   if (SataPrivateData->DisqualifiedModes == NULL) {\r
     Status = EFI_OUT_OF_RESOURCES;\r
-    goto Done;\r
+    goto FreeSataPrivateData;\r
   }\r
 \r
   SataPrivateData->IdentifyData = AllocateZeroPool ((sizeof (EFI_IDENTIFY_DATA)) * ChannelDeviceCount);\r
   if (SataPrivateData->IdentifyData == NULL) {\r
     Status = EFI_OUT_OF_RESOURCES;\r
-    goto Done;\r
+    goto FreeDisqualifiedModes;\r
   }\r
 \r
   SataPrivateData->IdentifyValid = AllocateZeroPool ((sizeof (BOOLEAN)) * ChannelDeviceCount);\r
   if (SataPrivateData->IdentifyValid == NULL) {\r
     Status = EFI_OUT_OF_RESOURCES;\r
-    goto Done;\r
+    goto FreeIdentifyData;\r
   }\r
 \r
   //\r
@@ -492,31 +493,35 @@ SataControllerStart (
                   NULL\r
                   );\r
 \r
-Done:\r
   if (EFI_ERROR (Status)) {\r
-\r
-    gBS->CloseProtocol (\r
-          Controller,\r
-          &gEfiPciIoProtocolGuid,\r
-          This->DriverBindingHandle,\r
-          Controller\r
-          );\r
-    if (SataPrivateData != NULL) {\r
-      if (SataPrivateData->DisqualifiedModes != NULL) {\r
-        FreePool (SataPrivateData->DisqualifiedModes);\r
-      }\r
-      if (SataPrivateData->IdentifyData != NULL) {\r
-        FreePool (SataPrivateData->IdentifyData);\r
-      }\r
-      if (SataPrivateData->IdentifyValid != NULL) {\r
-        FreePool (SataPrivateData->IdentifyValid);\r
-      }\r
-      FreePool (SataPrivateData);\r
-    }\r
+    goto FreeIdentifyValid;\r
   }\r
 \r
   DEBUG ((EFI_D_INFO, "SataControllerStart END status = %r\n", Status));\r
+  return Status;\r
+\r
+FreeIdentifyValid:\r
+  FreePool (SataPrivateData->IdentifyValid);\r
+\r
+FreeIdentifyData:\r
+  FreePool (SataPrivateData->IdentifyData);\r
+\r
+FreeDisqualifiedModes:\r
+  FreePool (SataPrivateData->DisqualifiedModes);\r
+\r
+FreeSataPrivateData:\r
+  FreePool (SataPrivateData);\r
+\r
+ClosePciIo:\r
+  gBS->CloseProtocol (\r
+         Controller,\r
+         &gEfiPciIoProtocolGuid,\r
+         This->DriverBindingHandle,\r
+         Controller\r
+         );\r
 \r
+Bail:\r
+  DEBUG ((EFI_D_ERROR, "SataControllerStart error return status = %r\n", Status));\r
   return Status;\r
 }\r
 \r