Revision: 14928
          http://sourceforge.net/p/edk2/code/14928
Author:   erictian
Date:     2013-12-03 07:10:56 +0000 (Tue, 03 Dec 2013)
Log Message:
-----------
MdeModulePkg/AtaAtapiPassThru: Error handling enhancement for uninstalling 
protocol interface failure case

Signed-off-by: Feng Tian <[email protected]>
Reviewed-by: Ruiyu Ni <[email protected]>

Modified Paths:
--------------
    trunk/edk2/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.c

Modified: trunk/edk2/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.c
===================================================================
--- trunk/edk2/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.c 
2013-12-03 07:04:08 UTC (rev 14927)
+++ trunk/edk2/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.c 
2013-12-03 07:10:56 UTC (rev 14928)
@@ -870,54 +870,18 @@
 
   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
   //
   gBS->CloseProtocol (
@@ -928,14 +892,24 @@
          );
 
   //
+  // 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 @@
              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;

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Rapidly troubleshoot problems before they affect your business. Most IT 
organizations don't have a clear picture of how application performance 
affects their revenue. With AppDynamics, you get 100% visibility into your 
Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro!
http://pubads.g.doubleclick.net/gampad/clk?id=84349351&iu=/4140/ostg.clktrk
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to