OvmfPkg: QemuVideoDxe: disentangle UEFI driver model use in Stop()

A bus driver needs to pay attention whether its Stop() function is being
called on the "main" controller handle (NumberOfChildren == 0) or on the
child handles (NumberOfChildren > 0).

In QemuVideoDxe, all our resources are associated with the one child
handle (and the Private data structure) *except* the top-level PciIo
protocol reference. Be conscious of which mode Stop() is being called for.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15284 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Laszlo Ersek 2014-03-03 08:40:35 +00:00 committed by jljusten
parent 42d0cad751
commit 99a6dce3c2
1 changed files with 20 additions and 11 deletions

View File

@ -454,8 +454,26 @@ QemuVideoControllerDriverStop (
EFI_STATUS Status;
QEMU_VIDEO_PRIVATE_DATA *Private;
Status = gBS->OpenProtocol (
if (NumberOfChildren == 0) {
//
// Close the PCI I/O Protocol
//
gBS->CloseProtocol (
Controller,
&gEfiPciIoProtocolGuid,
This->DriverBindingHandle,
Controller
);
return EFI_SUCCESS;
}
//
// free all resources for whose access we need the child handle, because the
// child handle is going away
//
ASSERT (NumberOfChildren == 1);
Status = gBS->OpenProtocol (
ChildHandleBuffer[0],
&gEfiGraphicsOutputProtocolGuid,
(VOID **) &GraphicsOutput,
This->DriverBindingHandle,
@ -470,6 +488,7 @@ QemuVideoControllerDriverStop (
// Get our private context information
//
Private = QEMU_VIDEO_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (GraphicsOutput);
ASSERT (Private->Handle == ChildHandleBuffer[0]);
QemuVideoGraphicsOutputDestructor (Private);
//
@ -496,16 +515,6 @@ QemuVideoControllerDriverStop (
NULL
);
//
// Close the PCI I/O Protocol
//
gBS->CloseProtocol (
Controller,
&gEfiPciIoProtocolGuid,
This->DriverBindingHandle,
Controller
);
gBS->CloseProtocol (
Controller,
&gEfiPciIoProtocolGuid,