]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c
MdeModulePkg/PeiMain: Support EFI_PEI_CORE_FV_LOCATION_PPI
[mirror_edk2.git] / EmulatorPkg / EmuSnpDxe / EmuSnpDxe.c
index 09d16fd8b664ded35274db4c41798cbf8590c1e0..967da9900aed357c46d17f7b28c1156c0f7b4afc 100644 (file)
@@ -42,7 +42,7 @@ EFI_SIMPLE_NETWORK_PROTOCOL gEmuSnpTemplate = {
   NULL                      // Mode\r
  };\r
 \r
-EFI_SIMPLE_NETWORK_MODE gEmuSnpModeTemplate = {                 \r
+EFI_SIMPLE_NETWORK_MODE gEmuSnpModeTemplate = {\r
   EfiSimpleNetworkStopped,      //  State\r
   NET_ETHER_ADDR_LEN,           //  HwAddressSize\r
   NET_ETHER_HEADER_SIZE,        //  MediaHeaderSize\r
@@ -870,6 +870,7 @@ EmuSnpDriverBindingStop (
   EFI_STATUS                  Status;\r
   EMU_SNP_PRIVATE_DATA        *Private = NULL;\r
   EFI_SIMPLE_NETWORK_PROTOCOL *Snp;\r
+  VOID                        *EmuIoThunk;\r
 \r
   //\r
   // Complete all outstanding transactions to Controller.\r
@@ -914,27 +915,42 @@ EmuSnpDriverBindingStop (
   }\r
 \r
   Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (Snp);\r
-  Status = Private->IoThunk->Close (Private->IoThunk);\r
+  ASSERT (Private->DeviceHandle == ChildHandleBuffer[0]);\r
+  ASSERT (Private->EfiHandle    == ControllerHandle);\r
 \r
   Status = gBS->CloseProtocol(\r
-                  ChildHandleBuffer[0],\r
+                  ControllerHandle,\r
                   &gEmuIoThunkProtocolGuid,\r
                   This->DriverBindingHandle,\r
                   Private->DeviceHandle\r
                   );\r
+  ASSERT_EFI_ERROR (Status);\r
 \r
   Status = gBS->UninstallMultipleProtocolInterfaces(\r
-                  ChildHandleBuffer[0],\r
+                  Private->DeviceHandle,\r
                   &gEfiSimpleNetworkProtocolGuid,   &Private->Snp,\r
                   &gEfiDevicePathProtocolGuid,      Private->DevicePath,\r
                   NULL\r
                   );\r
+  if (EFI_ERROR (Status)) {\r
+    gBS->OpenProtocol (\r
+           ControllerHandle,\r
+           &gEmuIoThunkProtocolGuid,\r
+           &EmuIoThunk,\r
+           This->DriverBindingHandle,\r
+           Private->DeviceHandle,\r
+           EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
+           );\r
+  } else {\r
+    Status = Private->IoThunk->Close (Private->IoThunk);\r
+    ASSERT_EFI_ERROR (Status);\r
+\r
+    FreePool (Private->DevicePath);\r
+    FreeUnicodeStringTable (Private->ControllerNameTable);\r
+    FreePool (Private);\r
+  }\r
 \r
-  FreePool (Private->DevicePath);\r
-  FreeUnicodeStringTable (Private->ControllerNameTable);\r
-  FreePool (Private);\r
-\r
-  return EFI_SUCCESS;\r
+  return Status;\r
 }\r
 \r
 \r