fixed DMA not be stopped issue when gBS->ExitBootServices called.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8058 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@@ -1449,6 +1449,33 @@ EhcCreateUsb2Hc (
|
||||
return Ehc;
|
||||
}
|
||||
|
||||
/**
|
||||
One notified function to stop the Host Controller when gBS->ExitBootServices() called.
|
||||
|
||||
@param Event Pointer to this event
|
||||
@param Context Event hanlder private data
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
EhcExitBootService (
|
||||
EFI_EVENT Event,
|
||||
VOID *Context
|
||||
)
|
||||
|
||||
{
|
||||
USB2_HC_DEV *Ehc;
|
||||
|
||||
Ehc = (USB2_HC_DEV *) Context;
|
||||
|
||||
//
|
||||
// Stop the Host Controller
|
||||
//
|
||||
EhcHaltHC (Ehc, EHC_GENERIC_TIMEOUT);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Starting the Usb EHCI Driver.
|
||||
@@ -1584,6 +1611,21 @@ EhcDriverBindingStart (
|
||||
goto UNINSTALL_USBHC;
|
||||
}
|
||||
|
||||
//
|
||||
// Create event to stop the HC when exit boot service.
|
||||
//
|
||||
Status = gBS->CreateEventEx (
|
||||
EVT_NOTIFY_SIGNAL,
|
||||
TPL_NOTIFY,
|
||||
EhcExitBootService,
|
||||
Ehc,
|
||||
&gEfiEventExitBootServicesGuid,
|
||||
&Ehc->ExitBootServiceEvent
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto UNINSTALL_USBHC;
|
||||
}
|
||||
|
||||
//
|
||||
// Install the component name protocol, don't fail the start
|
||||
// because of something for display.
|
||||
@@ -1712,6 +1754,10 @@ EhcDriverBindingStop (
|
||||
gBS->CloseEvent (Ehc->PollTimer);
|
||||
}
|
||||
|
||||
if (Ehc->ExitBootServiceEvent != NULL) {
|
||||
gBS->CloseEvent (Ehc->ExitBootServiceEvent);
|
||||
}
|
||||
|
||||
EhcFreeSched (Ehc);
|
||||
|
||||
if (Ehc->ControllerNameTable != NULL) {
|
||||
|
@@ -22,6 +22,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#include <Protocol/Usb2HostController.h>
|
||||
#include <Protocol/PciIo.h>
|
||||
|
||||
#include <Guid/EventGroup.h>
|
||||
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/UefiDriverEntryPoint.h>
|
||||
@@ -120,6 +122,12 @@ struct _USB2_HC_DEV {
|
||||
EHC_QTD *ShortReadStop;
|
||||
EFI_EVENT PollTimer;
|
||||
|
||||
//
|
||||
// ExitBootServicesEvent is used to stop the EHC DMA operation
|
||||
// after exit boot service.
|
||||
//
|
||||
EFI_EVENT ExitBootServiceEvent;
|
||||
|
||||
//
|
||||
// Asynchronous(bulk and control) transfer schedule data:
|
||||
// ReclaimHead is used as the head of the asynchronous transfer
|
||||
|
@@ -71,6 +71,9 @@
|
||||
DebugLib
|
||||
PcdLib
|
||||
|
||||
[Guids]
|
||||
gEfiEventExitBootServicesGuid ## PRODUCES ## Event
|
||||
|
||||
[Protocols]
|
||||
gEfiPciIoProtocolGuid ## TO_START
|
||||
gEfiUsb2HcProtocolGuid ## BY_START
|
||||
|
@@ -2,7 +2,7 @@
|
||||
|
||||
The UHCI driver model and HC protocol routines.
|
||||
|
||||
Copyright (c) 2004 - 2008, Intel Corporation
|
||||
Copyright (c) 2004 - 2009, Intel Corporation
|
||||
All rights reserved. This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
@@ -1517,6 +1517,10 @@ UhciFreeDev (
|
||||
gBS->CloseEvent (Uhc->AsyncIntMonitor);
|
||||
}
|
||||
|
||||
if (Uhc->ExitBootServiceEvent != NULL) {
|
||||
gBS->CloseEvent (Uhc->ExitBootServiceEvent);
|
||||
}
|
||||
|
||||
if (Uhc->MemPool != NULL) {
|
||||
UsbHcFreeMemPool (Uhc->MemPool);
|
||||
}
|
||||
@@ -1572,6 +1576,31 @@ UhciCleanDevUp (
|
||||
UhciFreeDev (Uhc);
|
||||
}
|
||||
|
||||
/**
|
||||
One notified function to stop the Host Controller when gBS->ExitBootServices() called.
|
||||
|
||||
@param Event Pointer to this event
|
||||
@param Context Event hanlder private data
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
UhcExitBootService (
|
||||
EFI_EVENT Event,
|
||||
VOID *Context
|
||||
)
|
||||
{
|
||||
USB_HC_DEV *Uhc;
|
||||
|
||||
Uhc = (USB_HC_DEV *) Context;
|
||||
|
||||
//
|
||||
// Stop the Host Controller
|
||||
//
|
||||
UhciStopHc (Uhc, UHC_GENERIC_TIMEOUT);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
Starting the Usb UHCI Driver.
|
||||
@@ -1703,6 +1732,21 @@ UhciDriverBindingStart (
|
||||
goto FREE_UHC;
|
||||
}
|
||||
|
||||
//
|
||||
// Create event to stop the HC when exit boot service.
|
||||
//
|
||||
Status = gBS->CreateEventEx (
|
||||
EVT_NOTIFY_SIGNAL,
|
||||
TPL_NOTIFY,
|
||||
UhcExitBootService,
|
||||
Uhc,
|
||||
&gEfiEventExitBootServicesGuid,
|
||||
&Uhc->ExitBootServiceEvent
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto UNINSTALL_USBHC;
|
||||
}
|
||||
|
||||
//
|
||||
// Install the component name protocol
|
||||
//
|
||||
@@ -1730,6 +1774,14 @@ UhciDriverBindingStart (
|
||||
UhciWriteReg (Uhc->PciIo, USBCMD_OFFSET, USBCMD_RS | USBCMD_MAXP);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
|
||||
UNINSTALL_USBHC:
|
||||
gBS->UninstallMultipleProtocolInterfaces (
|
||||
Controller,
|
||||
&gEfiUsb2HcProtocolGuid,
|
||||
&Uhc->Usb2Hc,
|
||||
NULL
|
||||
);
|
||||
|
||||
FREE_UHC:
|
||||
UhciFreeDev (Uhc);
|
||||
|
@@ -2,7 +2,7 @@
|
||||
|
||||
The definition for UHCI driver model and HC protocol routines.
|
||||
|
||||
Copyright (c) 2004 - 2007, Intel Corporation
|
||||
Copyright (c) 2004 - 2009, Intel Corporation
|
||||
All rights reserved. This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
@@ -23,6 +23,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#include <Protocol/UsbHostController.h>
|
||||
#include <Protocol/PciIo.h>
|
||||
|
||||
#include <Guid/EventGroup.h>
|
||||
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/UefiDriverEntryPoint.h>
|
||||
@@ -137,6 +139,12 @@ struct _USB_HC_DEV {
|
||||
USBHC_MEM_POOL *MemPool;
|
||||
EFI_UNICODE_STRING_TABLE *CtrlNameTable;
|
||||
VOID *FrameMapping;
|
||||
|
||||
//
|
||||
// ExitBootServicesEvent is used to stop the EHC DMA operation
|
||||
// after exit boot service.
|
||||
//
|
||||
EFI_EVENT ExitBootServiceEvent;
|
||||
};
|
||||
|
||||
extern EFI_DRIVER_BINDING_PROTOCOL gUhciDriverBinding;
|
||||
|
@@ -72,6 +72,8 @@
|
||||
DebugLib
|
||||
PcdLib
|
||||
|
||||
[Guids]
|
||||
gEfiEventExitBootServicesGuid ## PRODUCES ## Event
|
||||
|
||||
[Protocols]
|
||||
gEfiPciIoProtocolGuid ## TO_START
|
||||
|
Reference in New Issue
Block a user