summaryrefslogtreecommitdiffstats
path: root/EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c
diff options
context:
space:
mode:
Diffstat (limited to 'EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c')
-rw-r--r--EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c32
1 files changed, 24 insertions, 8 deletions
diff --git a/EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c b/EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c
index 0031baea52..967da9900a 100644
--- a/EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c
+++ b/EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c
@@ -870,6 +870,7 @@ EmuSnpDriverBindingStop (
EFI_STATUS Status;
EMU_SNP_PRIVATE_DATA *Private = NULL;
EFI_SIMPLE_NETWORK_PROTOCOL *Snp;
+ VOID *EmuIoThunk;
//
// Complete all outstanding transactions to Controller.
@@ -914,27 +915,42 @@ EmuSnpDriverBindingStop (
}
Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (Snp);
- Status = Private->IoThunk->Close (Private->IoThunk);
+ ASSERT (Private->DeviceHandle == ChildHandleBuffer[0]);
+ ASSERT (Private->EfiHandle == ControllerHandle);
Status = gBS->CloseProtocol(
- ChildHandleBuffer[0],
+ ControllerHandle,
&gEmuIoThunkProtocolGuid,
This->DriverBindingHandle,
Private->DeviceHandle
);
+ ASSERT_EFI_ERROR (Status);
Status = gBS->UninstallMultipleProtocolInterfaces(
- ChildHandleBuffer[0],
+ Private->DeviceHandle,
&gEfiSimpleNetworkProtocolGuid, &Private->Snp,
&gEfiDevicePathProtocolGuid, Private->DevicePath,
NULL
);
+ if (EFI_ERROR (Status)) {
+ gBS->OpenProtocol (
+ ControllerHandle,
+ &gEmuIoThunkProtocolGuid,
+ &EmuIoThunk,
+ This->DriverBindingHandle,
+ Private->DeviceHandle,
+ EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
+ );
+ } else {
+ Status = Private->IoThunk->Close (Private->IoThunk);
+ ASSERT_EFI_ERROR (Status);
+
+ FreePool (Private->DevicePath);
+ FreeUnicodeStringTable (Private->ControllerNameTable);
+ FreePool (Private);
+ }
- FreePool (Private->DevicePath);
- FreeUnicodeStringTable (Private->ControllerNameTable);
- FreePool (Private);
-
- return EFI_SUCCESS;
+ return Status;
}