In the next patch we'll add another PCI operation to
SataControllerStart(), which, on error, has to be rolled back similarly to
other actions already being done in SataControllerStart(). Since that PCI
operation won't provide a non-NULL pointer on success, its rollback isn't
really suitable for the current error handling in SataControllerStart().
Employ the traditional cascading labels instead.
Cc: Alexander Graf <agraf@suse.de>
Cc: Reza Jelveh <reza.jelveh@tuhh.de>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Hannes Reinecke <hare@suse.de>
Cc: Gabriel L. Somlo <somlo@cmu.edu>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Tested-by: Gabriel Somlo <somlo@cmu.edu>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18527
6f19259b-4bc3-4df7-8a09-
765794883524
EFI_OPEN_PROTOCOL_BY_DRIVER\r
);\r
if (EFI_ERROR (Status)) {\r
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
SataPrivateData = AllocateZeroPool (sizeof (EFI_SATA_CONTROLLER_PRIVATE_DATA));\r
if (SataPrivateData == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
SataPrivateData = AllocateZeroPool (sizeof (EFI_SATA_CONTROLLER_PRIVATE_DATA));\r
if (SataPrivateData == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
sizeof (PciData.Hdr.ClassCode),\r
PciData.Hdr.ClassCode\r
);\r
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
\r
if (IS_PCI_IDE (&PciData)) {\r
SataPrivateData->IdeInit.ChannelCount = IDE_MAX_CHANNEL;\r
SataPrivateData->DisqualifiedModes = AllocateZeroPool ((sizeof (EFI_ATA_COLLECTIVE_MODE)) * ChannelDeviceCount);\r
if (SataPrivateData->DisqualifiedModes == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
SataPrivateData->DisqualifiedModes = AllocateZeroPool ((sizeof (EFI_ATA_COLLECTIVE_MODE)) * ChannelDeviceCount);\r
if (SataPrivateData->DisqualifiedModes == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\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
}\r
\r
SataPrivateData->IdentifyData = AllocateZeroPool ((sizeof (EFI_IDENTIFY_DATA)) * ChannelDeviceCount);\r
if (SataPrivateData->IdentifyData == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
+ goto FreeDisqualifiedModes;\r
}\r
\r
SataPrivateData->IdentifyValid = AllocateZeroPool ((sizeof (BOOLEAN)) * ChannelDeviceCount);\r
if (SataPrivateData->IdentifyValid == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
}\r
\r
SataPrivateData->IdentifyValid = AllocateZeroPool ((sizeof (BOOLEAN)) * ChannelDeviceCount);\r
if (SataPrivateData->IdentifyValid == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
+ goto FreeIdentifyData;\r
if (EFI_ERROR (Status)) {\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
}\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
+Bail:\r
+ DEBUG ((EFI_D_ERROR, "SataControllerStart error return status = %r\n", Status));\r