summaryrefslogtreecommitdiff
path: root/MdeModulePkg/Bus/Pci/EhciDxe
diff options
context:
space:
mode:
Diffstat (limited to 'MdeModulePkg/Bus/Pci/EhciDxe')
-rw-r--r--MdeModulePkg/Bus/Pci/EhciDxe/ComponentName.c225
-rw-r--r--MdeModulePkg/Bus/Pci/EhciDxe/ComponentName.h147
-rw-r--r--MdeModulePkg/Bus/Pci/EhciDxe/Ehci.c2126
-rw-r--r--MdeModulePkg/Bus/Pci/EhciDxe/Ehci.h250
-rw-r--r--MdeModulePkg/Bus/Pci/EhciDxe/EhciDebug.c258
-rw-r--r--MdeModulePkg/Bus/Pci/EhciDxe/EhciDebug.h75
-rw-r--r--MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf90
-rw-r--r--MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.uni30
-rw-r--r--MdeModulePkg/Bus/Pci/EhciDxe/EhciDxeExtra.uni20
-rw-r--r--MdeModulePkg/Bus/Pci/EhciDxe/EhciReg.c666
-rw-r--r--MdeModulePkg/Bus/Pci/EhciDxe/EhciReg.h363
-rw-r--r--MdeModulePkg/Bus/Pci/EhciDxe/EhciSched.c1052
-rw-r--r--MdeModulePkg/Bus/Pci/EhciDxe/EhciSched.h180
-rw-r--r--MdeModulePkg/Bus/Pci/EhciDxe/EhciUrb.c657
-rw-r--r--MdeModulePkg/Bus/Pci/EhciDxe/EhciUrb.h336
-rw-r--r--MdeModulePkg/Bus/Pci/EhciDxe/UsbHcMem.c566
-rw-r--r--MdeModulePkg/Bus/Pci/EhciDxe/UsbHcMem.h157
17 files changed, 0 insertions, 7198 deletions
diff --git a/MdeModulePkg/Bus/Pci/EhciDxe/ComponentName.c b/MdeModulePkg/Bus/Pci/EhciDxe/ComponentName.c
deleted file mode 100644
index 3181b9da5b..0000000000
--- a/MdeModulePkg/Bus/Pci/EhciDxe/ComponentName.c
+++ /dev/null
@@ -1,225 +0,0 @@
-/** @file
- UEFI Component Name(2) protocol implementation for EHCI driver.
-
-Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
-
-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
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#include "Ehci.h"
-
-
-//
-// EFI Component Name Protocol
-//
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gEhciComponentName = {
- EhciComponentNameGetDriverName,
- EhciComponentNameGetControllerName,
- "eng"
-};
-
-//
-// EFI Component Name 2 Protocol
-//
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gEhciComponentName2 = {
- (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) EhciComponentNameGetDriverName,
- (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) EhciComponentNameGetControllerName,
- "en"
-};
-
-
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mEhciDriverNameTable[] = {
- { "eng;en", L"Usb Ehci Driver" },
- { NULL , NULL }
-};
-
-
-/**
- Retrieves a Unicode string that is the user readable name of the driver.
-
- This function retrieves the user readable name of a driver in the form of a
- Unicode string. If the driver specified by This has a user readable name in
- the language specified by Language, then a pointer to the driver name is
- returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
- by This does not support the language specified by Language,
- then EFI_UNSUPPORTED is returned.
-
- @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
- EFI_COMPONENT_NAME_PROTOCOL instance.
-
- @param Language[in] A pointer to a Null-terminated ASCII string
- array indicating the language. This is the
- language of the driver name that the caller is
- requesting, and it must match one of the
- languages specified in SupportedLanguages. The
- number of languages supported by a driver is up
- to the driver writer. Language is specified
- in RFC 4646 or ISO 639-2 language code format.
-
- @param DriverName[out] A pointer to the Unicode string to return.
- This Unicode string is the name of the
- driver specified by This in the language
- specified by Language.
-
- @retval EFI_SUCCESS The Unicode string for the Driver specified by
- This and the language specified by Language was
- returned in DriverName.
-
- @retval EFI_INVALID_PARAMETER Language is NULL.
-
- @retval EFI_INVALID_PARAMETER DriverName is NULL.
-
- @retval EFI_UNSUPPORTED The driver specified by This does not support
- the language specified by Language.
-
-**/
-EFI_STATUS
-EFIAPI
-EhciComponentNameGetDriverName (
- IN EFI_COMPONENT_NAME_PROTOCOL *This,
- IN CHAR8 *Language,
- OUT CHAR16 **DriverName
- )
-{
- return LookupUnicodeString2 (
- Language,
- This->SupportedLanguages,
- mEhciDriverNameTable,
- DriverName,
- (BOOLEAN)(This == &gEhciComponentName)
- );
-}
-
-/**
- Retrieves a Unicode string that is the user readable name of the controller
- that is being managed by a driver.
-
- This function retrieves the user readable name of the controller specified by
- ControllerHandle and ChildHandle in the form of a Unicode string. If the
- driver specified by This has a user readable name in the language specified by
- Language, then a pointer to the controller name is returned in ControllerName,
- and EFI_SUCCESS is returned. If the driver specified by This is not currently
- managing the controller specified by ControllerHandle and ChildHandle,
- then EFI_UNSUPPORTED is returned. If the driver specified by This does not
- support the language specified by Language, then EFI_UNSUPPORTED is returned.
-
- @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
- EFI_COMPONENT_NAME_PROTOCOL instance.
-
- @param ControllerHandle[in] The handle of a controller that the driver
- specified by This is managing. This handle
- specifies the controller whose name is to be
- returned.
-
- @param ChildHandle[in] The handle of the child controller to retrieve
- the name of. This is an optional parameter that
- may be NULL. It will be NULL for device
- drivers. It will also be NULL for a bus drivers
- that wish to retrieve the name of the bus
- controller. It will not be NULL for a bus
- driver that wishes to retrieve the name of a
- child controller.
-
- @param Language[in] A pointer to a Null-terminated ASCII string
- array indicating the language. This is the
- language of the driver name that the caller is
- requesting, and it must match one of the
- languages specified in SupportedLanguages. The
- number of languages supported by a driver is up
- to the driver writer. Language is specified in
- RFC 4646 or ISO 639-2 language code format.
-
- @param ControllerName[out] A pointer to the Unicode string to return.
- This Unicode string is the name of the
- controller specified by ControllerHandle and
- ChildHandle in the language specified by
- Language from the point of view of the driver
- specified by This.
-
- @retval EFI_SUCCESS The Unicode string for the user readable name in
- the language specified by Language for the
- driver specified by This was returned in
- DriverName.
-
- @retval EFI_INVALID_PARAMETER ControllerHandle is NULL.
-
- @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid
- EFI_HANDLE.
-
- @retval EFI_INVALID_PARAMETER Language is NULL.
-
- @retval EFI_INVALID_PARAMETER ControllerName is NULL.
-
- @retval EFI_UNSUPPORTED The driver specified by This is not currently
- managing the controller specified by
- ControllerHandle and ChildHandle.
-
- @retval EFI_UNSUPPORTED The driver specified by This does not support
- the language specified by Language.
-
-**/
-EFI_STATUS
-EFIAPI
-EhciComponentNameGetControllerName (
- IN EFI_COMPONENT_NAME_PROTOCOL *This,
- IN EFI_HANDLE ControllerHandle,
- IN EFI_HANDLE ChildHandle OPTIONAL,
- IN CHAR8 *Language,
- OUT CHAR16 **ControllerName
- )
-{
- EFI_STATUS Status;
- USB2_HC_DEV *EhciDev;
- EFI_USB2_HC_PROTOCOL *Usb2Hc;
-
- //
- // This is a device driver, so ChildHandle must be NULL.
- //
- if (ChildHandle != NULL) {
- return EFI_UNSUPPORTED;
- }
- //
- // Make sure this driver is currently managing ControllerHandle
- //
- Status = EfiTestManagedDevice (
- ControllerHandle,
- gEhciDriverBinding.DriverBindingHandle,
- &gEfiPciIoProtocolGuid
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
- //
- // Get the device context
- //
- Status = gBS->OpenProtocol (
- ControllerHandle,
- &gEfiUsb2HcProtocolGuid,
- (VOID **) &Usb2Hc,
- gEhciDriverBinding.DriverBindingHandle,
- ControllerHandle,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- EhciDev = EHC_FROM_THIS (Usb2Hc);
-
- return LookupUnicodeString2 (
- Language,
- This->SupportedLanguages,
- EhciDev->ControllerNameTable,
- ControllerName,
- (BOOLEAN)(This == &gEhciComponentName)
- );
-
-}
diff --git a/MdeModulePkg/Bus/Pci/EhciDxe/ComponentName.h b/MdeModulePkg/Bus/Pci/EhciDxe/ComponentName.h
deleted file mode 100644
index 1a17d0bb49..0000000000
--- a/MdeModulePkg/Bus/Pci/EhciDxe/ComponentName.h
+++ /dev/null
@@ -1,147 +0,0 @@
-/** @file
-
- This file contains the delarations for componet name routines.
-
-Copyright (c) 2008 - 2011, Intel Corporation. All rights reserved.<BR>
-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
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef _COMPONENT_NAME_H_
-#define _COMPONENT_NAME_H_
-
-
-/**
- Retrieves a Unicode string that is the user readable name of the driver.
-
- This function retrieves the user readable name of a driver in the form of a
- Unicode string. If the driver specified by This has a user readable name in
- the language specified by Language, then a pointer to the driver name is
- returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
- by This does not support the language specified by Language,
- then EFI_UNSUPPORTED is returned.
-
- @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
- EFI_COMPONENT_NAME_PROTOCOL instance.
-
- @param Language[in] A pointer to a Null-terminated ASCII string
- array indicating the language. This is the
- language of the driver name that the caller is
- requesting, and it must match one of the
- languages specified in SupportedLanguages. The
- number of languages supported by a driver is up
- to the driver writer. Language is specified
- in RFC 4646 or ISO 639-2 language code format.
-
- @param DriverName[out] A pointer to the Unicode string to return.
- This Unicode string is the name of the
- driver specified by This in the language
- specified by Language.
-
- @retval EFI_SUCCESS The Unicode string for the Driver specified by
- This and the language specified by Language was
- returned in DriverName.
-
- @retval EFI_INVALID_PARAMETER Language is NULL.
-
- @retval EFI_INVALID_PARAMETER DriverName is NULL.
-
- @retval EFI_UNSUPPORTED The driver specified by This does not support
- the language specified by Language.
-
-**/
-EFI_STATUS
-EFIAPI
-EhciComponentNameGetDriverName (
- IN EFI_COMPONENT_NAME_PROTOCOL *This,
- IN CHAR8 *Language,
- OUT CHAR16 **DriverName
- );
-
-
-/**
- Retrieves a Unicode string that is the user readable name of the controller
- that is being managed by a driver.
-
- This function retrieves the user readable name of the controller specified by
- ControllerHandle and ChildHandle in the form of a Unicode string. If the
- driver specified by This has a user readable name in the language specified by
- Language, then a pointer to the controller name is returned in ControllerName,
- and EFI_SUCCESS is returned. If the driver specified by This is not currently
- managing the controller specified by ControllerHandle and ChildHandle,
- then EFI_UNSUPPORTED is returned. If the driver specified by This does not
- support the language specified by Language, then EFI_UNSUPPORTED is returned.
-
- @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
- EFI_COMPONENT_NAME_PROTOCOL instance.
-
- @param ControllerHandle[in] The handle of a controller that the driver
- specified by This is managing. This handle
- specifies the controller whose name is to be
- returned.
-
- @param ChildHandle[in] The handle of the child controller to retrieve
- the name of. This is an optional parameter that
- may be NULL. It will be NULL for device
- drivers. It will also be NULL for a bus drivers
- that wish to retrieve the name of the bus
- controller. It will not be NULL for a bus
- driver that wishes to retrieve the name of a
- child controller.
-
- @param Language[in] A pointer to a Null-terminated ASCII string
- array indicating the language. This is the
- language of the driver name that the caller is
- requesting, and it must match one of the
- languages specified in SupportedLanguages. The
- number of languages supported by a driver is up
- to the driver writer. Language is specified in
- RFC 4646 or ISO 639-2 language code format.
-
- @param ControllerName[out] A pointer to the Unicode string to return.
- This Unicode string is the name of the
- controller specified by ControllerHandle and
- ChildHandle in the language specified by
- Language from the point of view of the driver
- specified by This.
-
- @retval EFI_SUCCESS The Unicode string for the user readable name in
- the language specified by Language for the
- driver specified by This was returned in
- DriverName.
-
- @retval EFI_INVALID_PARAMETER ControllerHandle is NULL.
-
- @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid
- EFI_HANDLE.
-
- @retval EFI_INVALID_PARAMETER Language is NULL.
-
- @retval EFI_INVALID_PARAMETER ControllerName is NULL.
-
- @retval EFI_UNSUPPORTED The driver specified by This is not currently
- managing the controller specified by
- ControllerHandle and ChildHandle.
-
- @retval EFI_UNSUPPORTED The driver specified by This does not support
- the language specified by Language.
-
-**/
-EFI_STATUS
-EFIAPI
-EhciComponentNameGetControllerName (
- IN EFI_COMPONENT_NAME_PROTOCOL *This,
- IN EFI_HANDLE ControllerHandle,
- IN EFI_HANDLE ChildHandle OPTIONAL,
- IN CHAR8 *Language,
- OUT CHAR16 **ControllerName
- );
-
-#endif
-
diff --git a/MdeModulePkg/Bus/Pci/EhciDxe/Ehci.c b/MdeModulePkg/Bus/Pci/EhciDxe/Ehci.c
deleted file mode 100644
index 5173a9d599..0000000000
--- a/MdeModulePkg/Bus/Pci/EhciDxe/Ehci.c
+++ /dev/null
@@ -1,2126 +0,0 @@
-/** @file
- The Ehci controller driver.
-
- EhciDxe driver is responsible for managing the behavior of EHCI controller.
- It implements the interfaces of monitoring the status of all ports and transferring
- Control, Bulk, Interrupt and Isochronous requests to Usb2.0 device.
-
- Note that EhciDxe driver is enhanced to guarantee that the EHCI controller get attached
- to the EHCI controller before a UHCI or OHCI driver attaches to the companion UHCI or
- OHCI controller. This way avoids the control transfer on a shared port between EHCI
- and companion host controller when UHCI or OHCI gets attached earlier than EHCI and a
- USB 2.0 device inserts.
-
-Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
-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
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-
-#include "Ehci.h"
-
-//
-// Two arrays used to translate the EHCI port state (change)
-// to the UEFI protocol's port state (change).
-//
-USB_PORT_STATE_MAP mUsbPortStateMap[] = {
- {PORTSC_CONN, USB_PORT_STAT_CONNECTION},
- {PORTSC_ENABLED, USB_PORT_STAT_ENABLE},
- {PORTSC_SUSPEND, USB_PORT_STAT_SUSPEND},
- {PORTSC_OVERCUR, USB_PORT_STAT_OVERCURRENT},
- {PORTSC_RESET, USB_PORT_STAT_RESET},
- {PORTSC_POWER, USB_PORT_STAT_POWER},
- {PORTSC_OWNER, USB_PORT_STAT_OWNER}
-};
-
-USB_PORT_STATE_MAP mUsbPortChangeMap[] = {
- {PORTSC_CONN_CHANGE, USB_PORT_STAT_C_CONNECTION},
- {PORTSC_ENABLE_CHANGE, USB_PORT_STAT_C_ENABLE},
- {PORTSC_OVERCUR_CHANGE, USB_PORT_STAT_C_OVERCURRENT}
-};
-
-EFI_DRIVER_BINDING_PROTOCOL
-gEhciDriverBinding = {
- EhcDriverBindingSupported,
- EhcDriverBindingStart,
- EhcDriverBindingStop,
- 0x30,
- NULL,
- NULL
-};
-
-/**
- Retrieves the capability of root hub ports.
-
- @param This This EFI_USB_HC_PROTOCOL instance.
- @param MaxSpeed Max speed supported by the controller.
- @param PortNumber Number of the root hub ports.
- @param Is64BitCapable Whether the controller supports 64-bit memory
- addressing.
-
- @retval EFI_SUCCESS Host controller capability were retrieved successfully.
- @retval EFI_INVALID_PARAMETER Either of the three capability pointer is NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-EhcGetCapability (
- IN EFI_USB2_HC_PROTOCOL *This,
- OUT UINT8 *MaxSpeed,
- OUT UINT8 *PortNumber,
- OUT UINT8 *Is64BitCapable
- )
-{
- USB2_HC_DEV *Ehc;
- EFI_TPL OldTpl;
-
- if ((MaxSpeed == NULL) || (PortNumber == NULL) || (Is64BitCapable == NULL)) {
- return EFI_INVALID_PARAMETER;
- }
-
- OldTpl = gBS->RaiseTPL (EHC_TPL);
- Ehc = EHC_FROM_THIS (This);
-
- *MaxSpeed = EFI_USB_SPEED_HIGH;
- *PortNumber = (UINT8) (Ehc->HcStructParams & HCSP_NPORTS);
- *Is64BitCapable = (UINT8) Ehc->Support64BitDma;
-
- DEBUG ((EFI_D_INFO, "EhcGetCapability: %d ports, 64 bit %d\n", *PortNumber, *Is64BitCapable));
-
- gBS->RestoreTPL (OldTpl);
- return EFI_SUCCESS;
-}
-
-
-/**
- Provides software reset for the USB host controller.
-
- @param This This EFI_USB2_HC_PROTOCOL instance.
- @param Attributes A bit mask of the reset operation to perform.
-
- @retval EFI_SUCCESS The reset operation succeeded.
- @retval EFI_INVALID_PARAMETER Attributes is not valid.
- @retval EFI_UNSUPPOURTED The type of reset specified by Attributes is
- not currently supported by the host controller.
- @retval EFI_DEVICE_ERROR Host controller isn't halted to reset.
-
-**/
-EFI_STATUS
-EFIAPI
-EhcReset (
- IN EFI_USB2_HC_PROTOCOL *This,
- IN UINT16 Attributes
- )
-{
- USB2_HC_DEV *Ehc;
- EFI_TPL OldTpl;
- EFI_STATUS Status;
- UINT32 DbgCtrlStatus;
-
- Ehc = EHC_FROM_THIS (This);
-
- if (Ehc->DevicePath != NULL) {
- //
- // Report Status Code to indicate reset happens
- //
- REPORT_STATUS_CODE_WITH_DEVICE_PATH (
- EFI_PROGRESS_CODE,
- (EFI_IO_BUS_USB | EFI_IOB_PC_RESET),
- Ehc->DevicePath
- );
- }
-
- OldTpl = gBS->RaiseTPL (EHC_TPL);
-
- switch (Attributes) {
- case EFI_USB_HC_RESET_GLOBAL:
- //
- // Flow through, same behavior as Host Controller Reset
- //
- case EFI_USB_HC_RESET_HOST_CONTROLLER:
- //
- // Host Controller must be Halt when Reset it
- //
- if (Ehc->DebugPortNum != 0) {
- DbgCtrlStatus = EhcReadDbgRegister(Ehc, 0);
- if ((DbgCtrlStatus & (USB_DEBUG_PORT_IN_USE | USB_DEBUG_PORT_OWNER)) == (USB_DEBUG_PORT_IN_USE | USB_DEBUG_PORT_OWNER)) {
- Status = EFI_SUCCESS;
- goto ON_EXIT;
- }
- }
-
- if (!EhcIsHalt (Ehc)) {
- Status = EhcHaltHC (Ehc, EHC_GENERIC_TIMEOUT);
-
- if (EFI_ERROR (Status)) {
- Status = EFI_DEVICE_ERROR;
- goto ON_EXIT;
- }
- }
-
- //
- // Clean up the asynchronous transfers, currently only
- // interrupt supports asynchronous operation.
- //
- EhciDelAllAsyncIntTransfers (Ehc);
- EhcAckAllInterrupt (Ehc);
- EhcFreeSched (Ehc);
-
- Status = EhcResetHC (Ehc, EHC_RESET_TIMEOUT);
-
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- Status = EhcInitHC (Ehc);
- break;
-
- case EFI_USB_HC_RESET_GLOBAL_WITH_DEBUG:
- case EFI_USB_HC_RESET_HOST_WITH_DEBUG:
- Status = EFI_UNSUPPORTED;
- break;
-
- default:
- Status = EFI_INVALID_PARAMETER;
- }
-
-ON_EXIT:
- DEBUG ((EFI_D_INFO, "EhcReset: exit status %r\n", Status));
- gBS->RestoreTPL (OldTpl);
- return Status;
-}
-
-
-/**
- Retrieve the current state of the USB host controller.
-
- @param This This EFI_USB2_HC_PROTOCOL instance.
- @param State Variable to return the current host controller
- state.
-
- @retval EFI_SUCCESS Host controller state was returned in State.
- @retval EFI_INVALID_PARAMETER State is NULL.
- @retval EFI_DEVICE_ERROR An error was encountered while attempting to
- retrieve the host controller's current state.
-
-**/
-EFI_STATUS
-EFIAPI
-EhcGetState (
- IN EFI_USB2_HC_PROTOCOL *This,
- OUT EFI_USB_HC_STATE *State
- )
-{
- EFI_TPL OldTpl;
- USB2_HC_DEV *Ehc;
-
- if (State == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- OldTpl = gBS->RaiseTPL (EHC_TPL);
- Ehc = EHC_FROM_THIS (This);
-
- if (EHC_REG_BIT_IS_SET (Ehc, EHC_USBSTS_OFFSET, USBSTS_HALT)) {
- *State = EfiUsbHcStateHalt;
- } else {
- *State = EfiUsbHcStateOperational;
- }
-
- gBS->RestoreTPL (OldTpl);
-
- DEBUG ((EFI_D_INFO, "EhcGetState: current state %d\n", *State));
- return EFI_SUCCESS;
-}
-
-
-/**
- Sets the USB host controller to a specific state.
-
- @param This This EFI_USB2_HC_PROTOCOL instance.
- @param State The state of the host controller that will be set.
-
- @retval EFI_SUCCESS The USB host controller was successfully placed
- in the state specified by State.
- @retval EFI_INVALID_PARAMETER State is invalid.
- @retval EFI_DEVICE_ERROR Failed to set the state due to device error.
-
-**/
-EFI_STATUS
-EFIAPI
-EhcSetState (
- IN EFI_USB2_HC_PROTOCOL *This,
- IN EFI_USB_HC_STATE State
- )
-{
- USB2_HC_DEV *Ehc;
- EFI_TPL OldTpl;
- EFI_STATUS Status;
- EFI_USB_HC_STATE CurState;
-
- Status = EhcGetState (This, &CurState);
-
- if (EFI_ERROR (Status)) {
- return EFI_DEVICE_ERROR;
- }
-
- if (CurState == State) {
- return EFI_SUCCESS;
- }
-
- OldTpl = gBS->RaiseTPL (EHC_TPL);
- Ehc = EHC_FROM_THIS (This);
-
- switch (State) {
- case EfiUsbHcStateHalt:
- Status = EhcHaltHC (Ehc, EHC_GENERIC_TIMEOUT);
- break;
-
- case EfiUsbHcStateOperational:
- if (EHC_REG_BIT_IS_SET (Ehc, EHC_USBSTS_OFFSET, USBSTS_SYS_ERROR)) {
- Status = EFI_DEVICE_ERROR;
- break;
- }
-
- //
- // Software must not write a one to this field unless the host controller
- // is in the Halted state. Doing so will yield undefined results.
- // refers to Spec[EHCI1.0-2.3.1]
- //
- if (!EHC_REG_BIT_IS_SET (Ehc, EHC_USBSTS_OFFSET, USBSTS_HALT)) {
- Status = EFI_DEVICE_ERROR;
- break;
- }
-
- Status = EhcRunHC (Ehc, EHC_GENERIC_TIMEOUT);
- break;
-
- case EfiUsbHcStateSuspend:
- Status = EFI_UNSUPPORTED;
- break;
-
- default:
- Status = EFI_INVALID_PARAMETER;
- }
-
- DEBUG ((EFI_D_INFO, "EhcSetState: exit status %r\n", Status));
- gBS->RestoreTPL (OldTpl);
- return Status;
-}
-
-
-/**
- Retrieves the current status of a USB root hub port.
-
- @param This This EFI_USB2_HC_PROTOCOL instance.
- @param PortNumber The root hub port to retrieve the state from.
- This value is zero-based.
- @param PortStatus Variable to receive the port state.
-
- @retval EFI_SUCCESS The status of the USB root hub port specified.
- by PortNumber was returned in PortStatus.
- @retval EFI_INVALID_PARAMETER PortNumber is invalid.
- @retval EFI_DEVICE_ERROR Can't read register.
-
-**/
-EFI_STATUS
-EFIAPI
-EhcGetRootHubPortStatus (
- IN EFI_USB2_HC_PROTOCOL *This,
- IN UINT8 PortNumber,
- OUT EFI_USB_PORT_STATUS *PortStatus
- )
-{
- USB2_HC_DEV *Ehc;
- EFI_TPL OldTpl;
- UINT32 Offset;
- UINT32 State;
- UINT32 TotalPort;
- UINTN Index;
- UINTN MapSize;
- EFI_STATUS Status;
- UINT32 DbgCtrlStatus;
-
- if (PortStatus == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- OldTpl = gBS->RaiseTPL (EHC_TPL);
-
- Ehc = EHC_FROM_THIS (This);
- Status = EFI_SUCCESS;
-
- TotalPort = (Ehc->HcStructParams & HCSP_NPORTS);
-
- if (PortNumber >= TotalPort) {
- Status = EFI_INVALID_PARAMETER;
- goto ON_EXIT;
- }
-
- Offset = (UINT32) (EHC_PORT_STAT_OFFSET + (4 * PortNumber));
- PortStatus->PortStatus = 0;
- PortStatus->PortChangeStatus = 0;
-
- if ((Ehc->DebugPortNum != 0) && (PortNumber == (Ehc->DebugPortNum - 1))) {
- DbgCtrlStatus = EhcReadDbgRegister(Ehc, 0);
- if ((DbgCtrlStatus & (USB_DEBUG_PORT_IN_USE | USB_DEBUG_PORT_OWNER)) == (USB_DEBUG_PORT_IN_USE | USB_DEBUG_PORT_OWNER)) {
- goto ON_EXIT;
- }
- }
-
- State = EhcReadOpReg (Ehc, Offset);
-
- //
- // Identify device speed. If in K state, it is low speed.
- // If the port is enabled after reset, the device is of
- // high speed. The USB bus driver should retrieve the actual
- // port speed after reset.
- //
- if (EHC_BIT_IS_SET (State, PORTSC_LINESTATE_K)) {
- PortStatus->PortStatus |= USB_PORT_STAT_LOW_SPEED;
-
- } else if (EHC_BIT_IS_SET (State, PORTSC_ENABLED)) {
- PortStatus->PortStatus |= USB_PORT_STAT_HIGH_SPEED;
- }
-
- //
- // Convert the EHCI port/port change state to UEFI status
- //
- MapSize = sizeof (mUsbPortStateMap) / sizeof (USB_PORT_STATE_MAP);
-
- for (Index = 0; Index < MapSize; Index++) {
- if (EHC_BIT_IS_SET (State, mUsbPortStateMap[Index].HwState)) {
- PortStatus->PortStatus = (UINT16) (PortStatus->PortStatus | mUsbPortStateMap[Index].UefiState);
- }
- }
-
- MapSize = sizeof (mUsbPortChangeMap) / sizeof (USB_PORT_STATE_MAP);
-
- for (Index = 0; Index < MapSize; Index++) {
- if (EHC_BIT_IS_SET (State, mUsbPortChangeMap[Index].HwState)) {
- PortStatus->PortChangeStatus = (UINT16) (PortStatus->PortChangeStatus | mUsbPortChangeMap[Index].UefiState);
- }
- }
-
-ON_EXIT:
- gBS->RestoreTPL (OldTpl);
- return Status;
-}
-
-
-/**
- Sets a feature for the specified root hub port.
-
- @param This This EFI_USB2_HC_PROTOCOL instance.
- @param PortNumber Root hub port to set.
- @param PortFeature Feature to set.
-
- @retval EFI_SUCCESS The feature specified by PortFeature was set.
- @retval EFI_INVALID_PARAMETER PortNumber is invalid or PortFeature is invalid.
- @retval EFI_DEVICE_ERROR Can't read register.
-
-**/
-EFI_STATUS
-EFIAPI
-EhcSetRootHubPortFeature (
- IN EFI_USB2_HC_PROTOCOL *This,
- IN UINT8 PortNumber,
- IN EFI_USB_PORT_FEATURE PortFeature
- )
-{
- USB2_HC_DEV *Ehc;
- EFI_TPL OldTpl;
- UINT32 Offset;
- UINT32 State;
- UINT32 TotalPort;
- EFI_STATUS Status;
-
- OldTpl = gBS->RaiseTPL (EHC_TPL);
- Ehc = EHC_FROM_THIS (This);
- Status = EFI_SUCCESS;
-
- TotalPort = (Ehc->HcStructParams & HCSP_NPORTS);
-
- if (PortNumber >= TotalPort) {
- Status = EFI_INVALID_PARAMETER;
- goto ON_EXIT;
- }
-
- Offset = (UINT32) (EHC_PORT_STAT_OFFSET + (4 * PortNumber));
- State = EhcReadOpReg (Ehc, Offset);
-
- //
- // Mask off the port status change bits, these bits are
- // write clean bit
- //
- State &= ~PORTSC_CHANGE_MASK;
-
- switch (PortFeature) {
- case EfiUsbPortEnable:
- //
- // Sofeware can't set this bit, Port can only be enable by
- // EHCI as a part of the reset and enable
- //
- State |= PORTSC_ENABLED;
- EhcWriteOpReg (Ehc, Offset, State);
- break;
-
- case EfiUsbPortSuspend:
- State |= PORTSC_SUSPEND;
- EhcWriteOpReg (Ehc, Offset, State);
- break;
-
- case EfiUsbPortReset:
- //
- // Make sure Host Controller not halt before reset it
- //
- if (EhcIsHalt (Ehc)) {
- Status = EhcRunHC (Ehc, EHC_GENERIC_TIMEOUT);
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_INFO, "EhcSetRootHubPortFeature :failed to start HC - %r\n", Status));
- break;
- }
- }
-
- //
- // Set one to PortReset bit must also set zero to PortEnable bit
- //
- State |= PORTSC_RESET;
- State &= ~PORTSC_ENABLED;
- EhcWriteOpReg (Ehc, Offset, State);
- break;
-
- case EfiUsbPortPower:
- //
- // Set port power bit when PPC is 1
- //
- if ((Ehc->HcCapParams & HCSP_PPC) == HCSP_PPC) {
- State |= PORTSC_POWER;
- EhcWriteOpReg (Ehc, Offset, State);
- }
- break;
-
- case EfiUsbPortOwner:
- State |= PORTSC_OWNER;
- EhcWriteOpReg (Ehc, Offset, State);
- break;
-
- default:
- Status = EFI_INVALID_PARAMETER;
- }
-
-ON_EXIT:
- DEBUG ((EFI_D_INFO, "EhcSetRootHubPortFeature: exit status %r\n", Status));
-
- gBS->RestoreTPL (OldTpl);
- return Status;
-}
-
-
-/**
- Clears a feature for the specified root hub port.
-
- @param This A pointer to the EFI_USB2_HC_PROTOCOL instance.
- @param PortNumber Specifies the root hub port whose feature is
- requested to be cleared.
- @param PortFeature Indicates the feature selector associated with the
- feature clear request.
-
- @retval EFI_SUCCESS The feature specified by PortFeature was cleared
- for the USB root hub port specified by PortNumber.
- @retval EFI_INVALID_PARAMETER PortNumber is invalid or PortFeature is invalid.
- @retval EFI_DEVICE_ERROR Can't read register.
-
-**/
-EFI_STATUS
-EFIAPI
-EhcClearRootHubPortFeature (
- IN EFI_USB2_HC_PROTOCOL *This,
- IN UINT8 PortNumber,
- IN EFI_USB_PORT_FEATURE PortFeature
- )
-{
- USB2_HC_DEV *Ehc;
- EFI_TPL OldTpl;
- UINT32 Offset;
- UINT32 State;
- UINT32 TotalPort;
- EFI_STATUS Status;
-
- OldTpl = gBS->RaiseTPL (EHC_TPL);
- Ehc = EHC_FROM_THIS (This);
- Status = EFI_SUCCESS;
-
- TotalPort = (Ehc->HcStructParams & HCSP_NPORTS);
-
- if (PortNumber >= TotalPort) {
- Status = EFI_INVALID_PARAMETER;
- goto ON_EXIT;
- }
-
- Offset = EHC_PORT_STAT_OFFSET + (4 * PortNumber);
- State = EhcReadOpReg (Ehc, Offset);
- State &= ~PORTSC_CHANGE_MASK;
-
- switch (PortFeature) {
- case EfiUsbPortEnable:
- //
- // Clear PORT_ENABLE feature means disable port.
- //
- State &= ~PORTSC_ENABLED;
- EhcWriteOpReg (Ehc, Offset, State);
- break;
-
- case EfiUsbPortSuspend:
- //
- // A write of zero to this bit is ignored by the host
- // controller. The host controller will unconditionally
- // set this bit to a zero when:
- // 1. software sets the Forct Port Resume bit to a zero from a one.
- // 2. software sets the Port Reset bit to a one frome a zero.
- //
- State &= ~PORSTSC_RESUME;
- EhcWriteOpReg (Ehc, Offset, State);
- break;
-
- case EfiUsbPortReset:
- //
- // Clear PORT_RESET means clear the reset signal.
- //
- State &= ~PORTSC_RESET;
- EhcWriteOpReg (Ehc, Offset, State);
- break;
-
- case EfiUsbPortOwner:
- //
- // Clear port owner means this port owned by EHC
- //
- State &= ~PORTSC_OWNER;
- EhcWriteOpReg (Ehc, Offset, State);
- break;
-
- case EfiUsbPortConnectChange:
- //
- // Clear connect status change
- //
- State |= PORTSC_CONN_CHANGE;
- EhcWriteOpReg (Ehc, Offset, State);
- break;
-
- case EfiUsbPortEnableChange:
- //
- // Clear enable status change
- //
- State |= PORTSC_ENABLE_CHANGE;
- EhcWriteOpReg (Ehc, Offset, State);
- break;
-
- case EfiUsbPortOverCurrentChange:
- //
- // Clear PortOverCurrent change
- //
- State |= PORTSC_OVERCUR_CHANGE;
- EhcWriteOpReg (Ehc, Offset, State);
- break;
-
- case EfiUsbPortPower:
- //
- // Clear port power bit when PPC is 1
- //
- if ((Ehc->HcCapParams & HCSP_PPC) == HCSP_PPC) {
- State &= ~PORTSC_POWER;
- EhcWriteOpReg (Ehc, Offset, State);
- }
- break;
- case EfiUsbPortSuspendChange:
- case EfiUsbPortResetChange:
- //
- // Not supported or not related operation
- //
- break;
-
- default:
- Status = EFI_INVALID_PARAMETER;
- break;
- }
-
-ON_EXIT:
- DEBUG ((EFI_D_INFO, "EhcClearRootHubPortFeature: exit status %r\n", Status));
- gBS->RestoreTPL (OldTpl);
- return Status;
-}
-
-
-/**
- Submits control transfer to a target USB device.
-
- @param This This EFI_USB2_HC_PROTOCOL instance.
- @param DeviceAddress The target device address.
- @param DeviceSpeed Target device speed.
- @param MaximumPacketLength Maximum packet size the default control transfer
- endpoint is capable of sending or receiving.
- @param Request USB device request to send.
- @param TransferDirection Specifies the data direction for the data stage
- @param Data Data buffer to be transmitted or received from USB
- device.
- @param DataLength The size (in bytes) of the data buffer.
- @param TimeOut Indicates the maximum timeout, in millisecond.
- @param Translator Transaction translator to be used by this device.
- @param TransferResult Return the result of this control transfer.
-
- @retval EFI_SUCCESS Transfer was completed successfully.
- @retval EFI_OUT_OF_RESOURCES The transfer failed due to lack of resources.
- @retval EFI_INVALID_PARAMETER Some parameters are invalid.
- @retval EFI_TIMEOUT Transfer failed due to timeout.
- @retval EFI_DEVICE_ERROR Transfer failed due to host controller or device error.
-
-**/
-EFI_STATUS
-EFIAPI
-EhcControlTransfer (
- IN EFI_USB2_HC_PROTOCOL *This,
- IN UINT8 DeviceAddress,
- IN UINT8 DeviceSpeed,
- IN UINTN MaximumPacketLength,
- IN EFI_USB_DEVICE_REQUEST *Request,
- IN EFI_USB_DATA_DIRECTION TransferDirection,
- IN OUT VOID *Data,
- IN OUT UINTN *DataLength,
- IN UINTN TimeOut,
- IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Translator,
- OUT UINT32 *TransferResult
- )
-{
- USB2_HC_DEV *Ehc;
- URB *Urb;
- EFI_TPL OldTpl;
- UINT8 Endpoint;
- EFI_STATUS Status;
-
- //
- // Validate parameters
- //
- if ((Request == NULL) || (TransferResult == NULL)) {
- return EFI_INVALID_PARAMETER;
- }
-
- if ((TransferDirection != EfiUsbDataIn) &&
- (TransferDirection != EfiUsbDataOut) &&
- (TransferDirection != EfiUsbNoData)) {
- return EFI_INVALID_PARAMETER;
- }
-
- if ((TransferDirection == EfiUsbNoData) &&
- ((Data != NULL) || (*DataLength != 0))) {
- return EFI_INVALID_PARAMETER;
- }
-
- if ((TransferDirection != EfiUsbNoData) &&
- ((Data == NULL) || (*DataLength == 0))) {
- return EFI_INVALID_PARAMETER;
- }
-
- if ((MaximumPacketLength != 8) && (MaximumPacketLength != 16) &&
- (MaximumPacketLength != 32) && (MaximumPacketLength != 64)) {
- return EFI_INVALID_PARAMETER;
- }
-
- if ((DeviceSpeed == EFI_USB_SPEED_LOW) && (MaximumPacketLength != 8)) {
- return EFI_INVALID_PARAMETER;
- }
-
- OldTpl = gBS->RaiseTPL (EHC_TPL);
- Ehc = EHC_FROM_THIS (This);
-
- Status = EFI_DEVICE_ERROR;
- *TransferResult = EFI_USB_ERR_SYSTEM;
-
- if (EhcIsHalt (Ehc) || EhcIsSysError (Ehc)) {
- DEBUG ((EFI_D_ERROR, "EhcControlTransfer: HC halted at entrance\n"));
-
- EhcAckAllInterrupt (Ehc);
- goto ON_EXIT;
- }
-
- EhcAckAllInterrupt (Ehc);
-
- //
- // Create a new URB, insert it into the asynchronous
- // schedule list, then poll the execution status.
- //
- //
- // Encode the direction in address, although default control
- // endpoint is bidirectional. EhcCreateUrb expects this
- // combination of Ep addr and its direction.
- //
- Endpoint = (UINT8) (0 | ((TransferDirection == EfiUsbDataIn) ? 0x80 : 0));
- Urb = EhcCreateUrb (
- Ehc,
- DeviceAddress,
- Endpoint,
- DeviceSpeed,
- 0,
- MaximumPacketLength,
- Translator,
- EHC_CTRL_TRANSFER,
- Request,
- Data,
- *DataLength,
- NULL,
- NULL,
- 1
- );
-
- if (Urb == NULL) {
- DEBUG ((EFI_D_ERROR, "EhcControlTransfer: failed to create URB"));
-
- Status = EFI_OUT_OF_RESOURCES;
- goto ON_EXIT;
- }
-
- EhcLinkQhToAsync (Ehc, Urb->Qh);
- Status = EhcExecTransfer (Ehc, Urb, TimeOut);
- EhcUnlinkQhFromAsync (Ehc, Urb->Qh);
-
- //
- // Get the status from URB. The result is updated in EhcCheckUrbResult
- // which is called by EhcExecTransfer
- //
- *TransferResult = Urb->Result;
- *DataLength = Urb->Completed;
-
- if (*TransferResult == EFI_USB_NOERROR) {
- Status = EFI_SUCCESS;
- }
-
- EhcAckAllInterrupt (Ehc);
- EhcFreeUrb (Ehc, Urb);
-
-ON_EXIT:
- Ehc->PciIo->Flush (Ehc->PciIo);
- gBS->RestoreTPL (OldTpl);
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "EhcControlTransfer: error - %r, transfer - %x\n", Status, *TransferResult));
- }
-
- return Status;
-}
-
-
-/**
- Submits bulk transfer to a bulk endpoint of a USB device.
-
- @param This This EFI_USB2_HC_PROTOCOL instance.
- @param DeviceAddress Target device address.
- @param EndPointAddress Endpoint number and its direction in bit 7.
- @param DeviceSpeed Device speed, Low speed device doesn't support bulk
- transfer.
- @param MaximumPacketLength Maximum packet size the endpoint is capable of
- sending or receiving.
- @param DataBuffersNumber Number of data buffers prepared for the transfer.
- @param Data Array of pointers to the buffers of data to transmit
- from or receive into.
- @param DataLength The lenght of the data buffer.
- @param DataToggle On input, the initial data toggle for the transfer;
- On output, it is updated to to next data toggle to
- use of the subsequent bulk transfer.
- @param TimeOut Indicates the maximum time, in millisecond, which
- the transfer is allowed to complete.
- @param Translator A pointr to the transaction translator data.
- @param TransferResult A pointer to the detailed result information of the
- bulk transfer.
-
- @retval EFI_SUCCESS The transfer was completed successfully.
- @retval EFI_OUT_OF_RESOURCES The transfer failed due to lack of resource.
- @retval EFI_INVALID_PARAMETER Some parameters are invalid.
- @retval EFI_TIMEOUT The transfer failed due to timeout.
- @retval EFI_DEVICE_ERROR The transfer failed due to host controller error.
-
-**/
-EFI_STATUS
-EFIAPI
-EhcBulkTransfer (
- IN EFI_USB2_HC_PROTOCOL *This,
- IN UINT8 DeviceAddress,
- IN UINT8 EndPointAddress,
- IN UINT8 DeviceSpeed,
- IN UINTN MaximumPacketLength,
- IN UINT8 DataBuffersNumber,
- IN OUT VOID *Data[EFI_USB_MAX_BULK_BUFFER_NUM],
- IN OUT UINTN *DataLength,
- IN OUT UINT8 *DataToggle,
- IN UINTN TimeOut,
- IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Translator,
- OUT UINT32 *TransferResult
- )
-{
- USB2_HC_DEV *Ehc;
- URB *Urb;
- EFI_TPL OldTpl;
- EFI_STATUS Status;
-
- //
- // Validate the parameters
- //
- if ((DataLength == NULL) || (*DataLength == 0) ||
- (Data == NULL) || (Data[0] == NULL) || (TransferResult == NULL)) {
- return EFI_INVALID_PARAMETER;
- }
-
- if ((*DataToggle != 0) && (*DataToggle != 1)) {
- return EFI_INVALID_PARAMETER;
- }
-
- if ((DeviceSpeed == EFI_USB_SPEED_LOW) ||
- ((DeviceSpeed == EFI_USB_SPEED_FULL) && (MaximumPacketLength > 64)) ||
- ((EFI_USB_SPEED_HIGH == DeviceSpeed) && (MaximumPacketLength > 512))) {
- return EFI_INVALID_PARAMETER;
- }
-
- OldTpl = gBS->RaiseTPL (EHC_TPL);
- Ehc = EHC_FROM_THIS (This);
-
- *TransferResult = EFI_USB_ERR_SYSTEM;
- Status = EFI_DEVICE_ERROR;
-
- if (EhcIsHalt (Ehc) || EhcIsSysError (Ehc)) {
- DEBUG ((EFI_D_ERROR, "EhcBulkTransfer: HC is halted\n"));
-
- EhcAckAllInterrupt (Ehc);
- goto ON_EXIT;
- }
-
- EhcAckAllInterrupt (Ehc);
-
- //
- // Create a new URB, insert it into the asynchronous
- // schedule list, then poll the execution status.
- //
- Urb = EhcCreateUrb (
- Ehc,
- DeviceAddress,
- EndPointAddress,
- DeviceSpeed,
- *DataToggle,
- MaximumPacketLength,
- Translator,
- EHC_BULK_TRANSFER,
- NULL,
- Data[0],
- *DataLength,
- NULL,
- NULL,
- 1
- );
-
- if (Urb == NULL) {
- DEBUG ((EFI_D_ERROR, "EhcBulkTransfer: failed to create URB\n"));
-
- Status = EFI_OUT_OF_RESOURCES;
- goto ON_EXIT;
- }
-
- EhcLinkQhToAsync (Ehc, Urb->Qh);
- Status = EhcExecTransfer (Ehc, Urb, TimeOut);
- EhcUnlinkQhFromAsync (Ehc, Urb->Qh);
-
- *TransferResult = Urb->Result;
- *DataLength = Urb->Completed;
- *DataToggle = Urb->DataToggle;
-
- if (*TransferResult == EFI_USB_NOERROR) {
- Status = EFI_SUCCESS;
- }
-
- EhcAckAllInterrupt (Ehc);
- EhcFreeUrb (Ehc, Urb);
-
-ON_EXIT:
- Ehc->PciIo->Flush (Ehc->PciIo);
- gBS->RestoreTPL (OldTpl);
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "EhcBulkTransfer: error - %r, transfer - %x\n", Status, *TransferResult));
- }
-
- return Status;
-}
-
-
-/**
- Submits an asynchronous interrupt transfer to an
- interrupt endpoint of a USB device.
-
- @param This This EFI_USB2_HC_PROTOCOL instance.
- @param DeviceAddress Target device address.
- @param EndPointAddress Endpoint number and its direction encoded in bit 7
- @param DeviceSpeed Indicates device speed.
- @param MaximumPacketLength Maximum packet size the target endpoint is capable
- @param IsNewTransfer If TRUE, to submit an new asynchronous interrupt
- transfer If FALSE, to remove the specified
- asynchronous interrupt.
- @param DataToggle On input, the initial data toggle to use; on output,
- it is updated to indicate the next data toggle.
- @param PollingInterval The he interval, in milliseconds, that the transfer
- is polled.
- @param DataLength The length of data to receive at the rate specified
- by PollingInterval.
- @param Translator Transaction translator to use.
- @param CallBackFunction Function to call at the rate specified by
- PollingInterval.
- @param Context Context to CallBackFunction.
-
- @retval EFI_SUCCESS The request has been successfully submitted or canceled.
- @retval EFI_INVALID_PARAMETER Some parameters are invalid.
- @retval EFI_OUT_OF_RESOURCES The request failed due to a lack of resources.
- @retval EFI_DEVICE_ERROR The transfer failed due to host controller error.
-
-**/
-EFI_STATUS
-EFIAPI
-EhcAsyncInterruptTransfer (
- IN EFI_USB2_HC_PROTOCOL * This,
- IN UINT8 DeviceAddress,
- IN UINT8 EndPointAddress,
- IN UINT8 DeviceSpeed,
- IN UINTN MaximumPacketLength,
- IN BOOLEAN IsNewTransfer,
- IN OUT UINT8 *DataToggle,
- IN UINTN PollingInterval,
- IN UINTN DataLength,
- IN EFI_USB2_HC_TRANSACTION_TRANSLATOR * Translator,
- IN EFI_ASYNC_USB_TRANSFER_CALLBACK CallBackFunction,
- IN VOID *Context OPTIONAL
- )
-{
- USB2_HC_DEV *Ehc;
- URB *Urb;
- EFI_TPL OldTpl;
- EFI_STATUS Status;
- UINT8 *Data;
-
- //
- // Validate parameters
- //
- if (!EHCI_IS_DATAIN (EndPointAddress)) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (IsNewTransfer) {
- if (DataLength == 0) {
- return EFI_INVALID_PARAMETER;
- }
-
- if ((*DataToggle != 1) && (*DataToggle != 0)) {
- return EFI_INVALID_PARAMETER;
- }
-
- if ((PollingInterval > 255) || (PollingInterval < 1)) {
- return EFI_INVALID_PARAMETER;
- }
- }
-
- OldTpl = gBS->RaiseTPL (EHC_TPL);
- Ehc = EHC_FROM_THIS (This);
-
- //
- // Delete Async interrupt transfer request. DataToggle will return
- // the next data toggle to use.
- //
- if (!IsNewTransfer) {
- Status = EhciDelAsyncIntTransfer (Ehc, DeviceAddress, EndPointAddress, DataToggle);
-
- DEBUG ((EFI_D_INFO, "EhcAsyncInterruptTransfer: remove old transfer - %r\n", Status));
- goto ON_EXIT;
- }
-
- Status = EFI_SUCCESS;
-
- if (EhcIsHalt (Ehc) || EhcIsSysError (Ehc)) {
- DEBUG ((EFI_D_ERROR, "EhcAsyncInterruptTransfer: HC is halt\n"));
- EhcAckAllInterrupt (Ehc);
-
- Status = EFI_DEVICE_ERROR;
- goto ON_EXIT;
- }
-
- EhcAckAllInterrupt (Ehc);
-
- Data = AllocatePool (DataLength);
-
- if (Data == NULL) {
- DEBUG ((EFI_D_ERROR, "EhcAsyncInterruptTransfer: failed to allocate buffer\n"));
-
- Status = EFI_OUT_OF_RESOURCES;
- goto ON_EXIT;
- }
-
- Urb = EhcCreateUrb (
- Ehc,
- DeviceAddress,
- EndPointAddress,
- DeviceSpeed,
- *DataToggle,
- MaximumPacketLength,
- Translator,
- EHC_INT_TRANSFER_ASYNC,
- NULL,
- Data,
- DataLength,
- CallBackFunction,
- Context,
- PollingInterval
- );
-
- if (Urb == NULL) {
- DEBUG ((EFI_D_ERROR, "EhcAsyncInterruptTransfer: failed to create URB\n"));
-
- gBS->FreePool (Data);
- Status = EFI_OUT_OF_RESOURCES;
- goto ON_EXIT;
- }
-
- //
- // New asynchronous transfer must inserted to the head.
- // Check the comments in EhcMoniteAsyncRequests
- //
- EhcLinkQhToPeriod (Ehc, Urb->Qh);
- InsertHeadList (&Ehc->AsyncIntTransfers, &Urb->UrbList);
-
-ON_EXIT:
- Ehc->PciIo->Flush (Ehc->PciIo);
- gBS->RestoreTPL (OldTpl);
-
- return Status;
-}
-
-
-/**
- Submits synchronous interrupt transfer to an interrupt endpoint
- of a USB device.
-
- @param This This EFI_USB2_HC_PROTOCOL instance.
- @param DeviceAddress Target device address.
- @param EndPointAddress Endpoint number and its direction encoded in bit 7
- @param DeviceSpeed Indicates device speed.
- @param MaximumPacketLength Maximum packet size the target endpoint is capable
- of sending or receiving.
- @param Data Buffer of data that will be transmitted to USB
- device or received from USB device.
- @param DataLength On input, the size, in bytes, of the data buffer; On
- output, the number of bytes transferred.
- @param DataToggle On input, the initial data toggle to use; on output,
- it is updated to indicate the next data toggle.
- @param TimeOut Maximum time, in second, to complete.
- @param Translator Transaction translator to use.
- @param TransferResult Variable to receive the transfer result.
-
- @return EFI_SUCCESS The transfer was completed successfully.
- @return EFI_OUT_OF_RESOURCES The transfer failed due to lack of resource.
- @return EFI_INVALID_PARAMETER Some parameters are invalid.
- @return EFI_TIMEOUT The transfer failed due to timeout.
- @return EFI_DEVICE_ERROR The failed due to host controller or device error
-
-**/
-EFI_STATUS
-EFIAPI
-EhcSyncInterruptTransfer (
- IN EFI_USB2_HC_PROTOCOL *This,
- IN UINT8 DeviceAddress,
- IN UINT8 EndPointAddress,
- IN UINT8 DeviceSpeed,
- IN UINTN MaximumPacketLength,
- IN OUT VOID *Data,
- IN OUT UINTN *DataLength,
- IN OUT UINT8 *DataToggle,
- IN UINTN TimeOut,
- IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Translator,
- OUT UINT32 *TransferResult
- )
-{
- USB2_HC_DEV *Ehc;
- EFI_TPL OldTpl;
- URB *Urb;
- EFI_STATUS Status;
-
- //
- // Validates parameters
- //
- if ((DataLength == NULL) || (*DataLength == 0) ||
- (Data == NULL) || (TransferResult == NULL)) {
- return EFI_INVALID_PARAMETER;
- }
-
- if ((*DataToggle != 1) && (*DataToggle != 0)) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (((DeviceSpeed == EFI_USB_SPEED_LOW) && (MaximumPacketLength != 8)) ||
- ((DeviceSpeed == EFI_USB_SPEED_FULL) && (MaximumPacketLength > 64)) ||
- ((DeviceSpeed == EFI_USB_SPEED_HIGH) && (MaximumPacketLength > 3072))) {
- return EFI_INVALID_PARAMETER;
- }
-
- OldTpl = gBS->RaiseTPL (EHC_TPL);
- Ehc = EHC_FROM_THIS (This);
-
- *TransferResult = EFI_USB_ERR_SYSTEM;
- Status = EFI_DEVICE_ERROR;
-
- if (EhcIsHalt (Ehc) || EhcIsSysError (Ehc)) {
- DEBUG ((EFI_D_ERROR, "EhcSyncInterruptTransfer: HC is halt\n"));
-
- EhcAckAllInterrupt (Ehc);
- goto ON_EXIT;
- }
-
- EhcAckAllInterrupt (Ehc);
-
- Urb = EhcCreateUrb (
- Ehc,
- DeviceAddress,
- EndPointAddress,
- DeviceSpeed,
- *DataToggle,
- MaximumPacketLength,
- Translator,
- EHC_INT_TRANSFER_SYNC,
- NULL,
- Data,
- *DataLength,
- NULL,
- NULL,
- 1
- );
-
- if (Urb == NULL) {
- DEBUG ((EFI_D_ERROR, "EhcSyncInterruptTransfer: failed to create URB\n"));
-
- Status = EFI_OUT_OF_RESOURCES;
- goto ON_EXIT;
- }
-
- EhcLinkQhToPeriod (Ehc, Urb->Qh);
- Status = EhcExecTransfer (Ehc, Urb, TimeOut);
- EhcUnlinkQhFromPeriod (Ehc, Urb->Qh);
-
- *TransferResult = Urb->Result;
- *DataLength = Urb->Completed;
- *DataToggle = Urb->DataToggle;
-
- if (*TransferResult == EFI_USB_NOERROR) {
- Status = EFI_SUCCESS;
- }
-
-ON_EXIT:
- Ehc->PciIo->Flush (Ehc->PciIo);
- gBS->RestoreTPL (OldTpl);
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "EhcSyncInterruptTransfer: error - %r, transfer - %x\n", Status, *TransferResult));
- }
-
- return Status;
-}
-
-
-/**
- Submits isochronous transfer to a target USB device.
-
- @param This This EFI_USB2_HC_PROTOCOL instance.
- @param DeviceAddress Target device address.
- @param EndPointAddress End point address with its direction.
- @param DeviceSpeed Device speed, Low speed device doesn't support this
- type.
- @param MaximumPacketLength Maximum packet size that the endpoint is capable of
- sending or receiving.
- @param DataBuffersNumber Number of data buffers prepared for the transfer.
- @param Data Array of pointers to the buffers of data that will
- be transmitted to USB device or received from USB
- device.
- @param DataLength The size, in bytes, of the data buffer.
- @param Translator Transaction translator to use.
- @param TransferResult Variable to receive the transfer result.
-
- @return EFI_UNSUPPORTED Isochronous transfer is unsupported.
-
-**/
-EFI_STATUS
-EFIAPI
-EhcIsochronousTransfer (
- IN EFI_USB2_HC_PROTOCOL *This,
- IN UINT8 DeviceAddress,
- IN UINT8 EndPointAddress,
- IN UINT8 DeviceSpeed,
- IN UINTN MaximumPacketLength,
- IN UINT8 DataBuffersNumber,
- IN OUT VOID *Data[EFI_USB_MAX_ISO_BUFFER_NUM],
- IN UINTN DataLength,
- IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Translator,
- OUT UINT32 *TransferResult
- )
-{
- return EFI_UNSUPPORTED;
-}
-
-
-/**
- Submits Async isochronous transfer to a target USB device.
-
- @param This This EFI_USB2_HC_PROTOCOL instance.
- @param DeviceAddress Target device address.
- @param EndPointAddress End point address with its direction.
- @param DeviceSpeed Device speed, Low speed device doesn't support this
- type.
- @param MaximumPacketLength Maximum packet size that the endpoint is capable of
- sending or receiving.
- @param DataBuffersNumber Number of data buffers prepared for the transfer.
- @param Data Array of pointers to the buffers of data that will
- be transmitted to USB device or received from USB
- device.
- @param DataLength The size, in bytes, of the data buffer.
- @param Translator Transaction translator to use.
- @param IsochronousCallBack Function to be called when the transfer complete.
- @param Context Context passed to the call back function as
- parameter.
-
- @return EFI_UNSUPPORTED Isochronous transfer isn't supported.
-
-**/
-EFI_STATUS
-EFIAPI
-EhcAsyncIsochronousTransfer (
- IN EFI_USB2_HC_PROTOCOL *This,
- IN UINT8 DeviceAddress,
- IN UINT8 EndPointAddress,
- IN UINT8 DeviceSpeed,
- IN UINTN MaximumPacketLength,
- IN UINT8 DataBuffersNumber,
- IN OUT VOID *Data[EFI_USB_MAX_ISO_BUFFER_NUM],
- IN UINTN DataLength,
- IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Translator,
- IN EFI_ASYNC_USB_TRANSFER_CALLBACK IsochronousCallBack,
- IN VOID *Context
- )
-{
- return EFI_UNSUPPORTED;
-}
-
-/**
- Entry point for EFI drivers.
-
- @param ImageHandle EFI_HANDLE.
- @param SystemTable EFI_SYSTEM_TABLE.
-
- @return EFI_SUCCESS Success.
- EFI_DEVICE_ERROR Fail.
-
-**/
-EFI_STATUS
-EFIAPI
-EhcDriverEntryPoint (
- IN EFI_HANDLE ImageHandle,
- IN EFI_SYSTEM_TABLE *SystemTable
- )
-{
- return EfiLibInstallDriverBindingComponentName2 (
- ImageHandle,
- SystemTable,
- &gEhciDriverBinding,
- ImageHandle,
- &gEhciComponentName,
- &gEhciComponentName2
- );
-}
-
-
-/**
- Test to see if this driver supports ControllerHandle. Any
- ControllerHandle that has Usb2HcProtocol installed will
- be supported.
-
- @param This Protocol instance pointer.
- @param Controller Handle of device to test.
- @param RemainingDevicePath Not used.
-
- @return EFI_SUCCESS This driver supports this device.
- @return EFI_UNSUPPORTED This driver does not support this device.
-
-**/
-EFI_STATUS
-EFIAPI
-EhcDriverBindingSupported (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
- )
-{
- EFI_STATUS Status;
- EFI_PCI_IO_PROTOCOL *PciIo;
- USB_CLASSC UsbClassCReg;
-
- //
- // Test whether there is PCI IO Protocol attached on the controller handle.
- //
- Status = gBS->OpenProtocol (
- Controller,
- &gEfiPciIoProtocolGuid,
- (VOID **) &PciIo,
- This->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_BY_DRIVER
- );
-
- if (EFI_ERROR (Status)) {
- return EFI_UNSUPPORTED;
- }
-
- Status = PciIo->Pci.Read (
- PciIo,
- EfiPciIoWidthUint8,
- PCI_CLASSCODE_OFFSET,
- sizeof (USB_CLASSC) / sizeof (UINT8),
- &UsbClassCReg
- );
-
- if (EFI_ERROR (Status)) {
- Status = EFI_UNSUPPORTED;
- goto ON_EXIT;
- }
-
- //
- // Test whether the controller belongs to Ehci type
- //
- if ((UsbClassCReg.BaseCode != PCI_CLASS_SERIAL) || (UsbClassCReg.SubClassCode != PCI_CLASS_SERIAL_USB)
- || ((UsbClassCReg.ProgInterface != PCI_IF_EHCI) && (UsbClassCReg.ProgInterface != PCI_IF_UHCI) && (UsbClassCReg.ProgInterface != PCI_IF_OHCI))) {
-
- Status = EFI_UNSUPPORTED;
- }
-
-ON_EXIT:
- gBS->CloseProtocol (
- Controller,
- &gEfiPciIoProtocolGuid,
- This->DriverBindingHandle,
- Controller
- );
-
- return Status;
-}
-
-/**
- Get the usb debug port related information.
-
- @param Ehc The EHCI device.
-
- @retval RETURN_SUCCESS Get debug port number, bar and offset successfully.
- @retval Others The usb host controller does not supported usb debug port capability.
-
-**/
-EFI_STATUS
-EhcGetUsbDebugPortInfo (
- IN USB2_HC_DEV *Ehc
- )
-{
- EFI_PCI_IO_PROTOCOL *PciIo;
- UINT16 PciStatus;
- UINT8 CapabilityPtr;
- UINT8 CapabilityId;
- UINT16 DebugPort;
- EFI_STATUS Status;
-
- ASSERT (Ehc->PciIo != NULL);
- PciIo = Ehc->PciIo;
-
- //
- // Detect if the EHCI host controller support Capaility Pointer.
- //
- Status = PciIo->Pci.Read (
- PciIo,
- EfiPciIoWidthUint8,
- PCI_PRIMARY_STATUS_OFFSET,
- sizeof (UINT16),
- &PciStatus
- );
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- if ((PciStatus & EFI_PCI_STATUS_CAPABILITY) == 0) {
- //
- // The Pci Device Doesn't Support Capability Pointer.
- //
- return EFI_UNSUPPORTED;
- }
-
- //
- // Get Pointer To Capability List
- //
- Status = PciIo->Pci.Read (
- PciIo,
- EfiPciIoWidthUint8,
- PCI_CAPBILITY_POINTER_OFFSET,
- 1,
- &CapabilityPtr
- );
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- //
- // Find Capability ID 0xA, Which Is For Debug Port
- //
- while (CapabilityPtr != 0) {
- Status = PciIo->Pci.Read (
- PciIo,
- EfiPciIoWidthUint8,
- CapabilityPtr,
- 1,
- &CapabilityId
- );
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- if (CapabilityId == EHC_DEBUG_PORT_CAP_ID) {
- break;
- }
-
- Status = PciIo->Pci.Read (
- PciIo,
- EfiPciIoWidthUint8,
- CapabilityPtr + 1,
- 1,
- &CapabilityPtr
- );
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
- }
-
- //
- // No Debug Port Capability Found
- //
- if (CapabilityPtr == 0) {
- return EFI_UNSUPPORTED;
- }
-
- //
- // Get The Base Address Of Debug Port Register In Debug Port Capability Register
- //
- Status = PciIo->Pci.Read (
- Ehc->PciIo,
- EfiPciIoWidthUint8,
- CapabilityPtr + 2,
- sizeof (UINT16),
- &DebugPort
- );
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- Ehc->DebugPortOffset = DebugPort & 0x1FFF;
- Ehc->DebugPortBarNum = (UINT8)((DebugPort >> 13) - 1);
- Ehc->DebugPortNum = (UINT8)((Ehc->HcStructParams & 0x00F00000) >> 20);
-
- return EFI_SUCCESS;
-}
-
-
-/**
- Create and initialize a USB2_HC_DEV.
-
- @param PciIo The PciIo on this device.
- @param DevicePath The device path of host controller.
- @param OriginalPciAttributes Original PCI attributes.
-
- @return The allocated and initialized USB2_HC_DEV structure if created,
- otherwise NULL.
-
-**/
-USB2_HC_DEV *
-EhcCreateUsb2Hc (
- IN EFI_PCI_IO_PROTOCOL *PciIo,
- IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
- IN UINT64 OriginalPciAttributes
- )
-{
- USB2_HC_DEV *Ehc;
- EFI_STATUS Status;
-
- Ehc = AllocateZeroPool (sizeof (USB2_HC_DEV));
-
- if (Ehc == NULL) {
- return NULL;
- }
-
- //
- // Init EFI_USB2_HC_PROTOCOL interface and private data structure
- //
- Ehc->Signature = USB2_HC_DEV_SIGNATURE;
-
- Ehc->Usb2Hc.GetCapability = EhcGetCapability;
- Ehc->Usb2Hc.Reset = EhcReset;
- Ehc->Usb2Hc.GetState = EhcGetState;
- Ehc->Usb2Hc.SetState = EhcSetState;
- Ehc->Usb2Hc.ControlTransfer = EhcControlTransfer;
- Ehc->Usb2Hc.BulkTransfer = EhcBulkTransfer;
- Ehc->Usb2Hc.AsyncInterruptTransfer = EhcAsyncInterruptTransfer;
- Ehc->Usb2Hc.SyncInterruptTransfer = EhcSyncInterruptTransfer;
- Ehc->Usb2Hc.IsochronousTransfer = EhcIsochronousTransfer;
- Ehc->Usb2Hc.AsyncIsochronousTransfer = EhcAsyncIsochronousTransfer;
- Ehc->Usb2Hc.GetRootHubPortStatus = EhcGetRootHubPortStatus;
- Ehc->Usb2Hc.SetRootHubPortFeature = EhcSetRootHubPortFeature;
- Ehc->Usb2Hc.ClearRootHubPortFeature = EhcClearRootHubPortFeature;
- Ehc->Usb2Hc.MajorRevision = 0x2;
- Ehc->Usb2Hc.MinorRevision = 0x0;
-
- Ehc->PciIo = PciIo;
- Ehc->DevicePath = DevicePath;
- Ehc->OriginalPciAttributes = OriginalPciAttributes;
-
- InitializeListHead (&Ehc->AsyncIntTransfers);
-
- Ehc->HcStructParams = EhcReadCapRegister (Ehc, EHC_HCSPARAMS_OFFSET);
- Ehc->HcCapParams = EhcReadCapRegister (Ehc, EHC_HCCPARAMS_OFFSET);
- Ehc->CapLen = EhcReadCapRegister (Ehc, EHC_CAPLENGTH_OFFSET) & 0x0FF;
-
- DEBUG ((EFI_D_INFO, "EhcCreateUsb2Hc: capability length %d\n", Ehc->CapLen));
-
- //
- // EHCI Controllers with a CapLen of 0 are ignored.
- //
- if (Ehc->CapLen == 0) {
- gBS->FreePool (Ehc);
- return NULL;
- }
-
- EhcGetUsbDebugPortInfo (Ehc);
-
- //
- // Create AsyncRequest Polling Timer
- //
- Status = gBS->CreateEvent (
- EVT_TIMER | EVT_NOTIFY_SIGNAL,
- TPL_NOTIFY,
- EhcMonitorAsyncRequests,
- Ehc,
- &Ehc->PollTimer
- );
-
- if (EFI_ERROR (Status)) {
- gBS->FreePool (Ehc);
- return NULL;
- }
-
- return Ehc;
-}
-
-/**
- One notified function to stop the Host Controller when gBS->ExitBootServices() called.
-
- @param Event Pointer to this event
- @param Context Event handler private data
-
-**/
-VOID
-EFIAPI
-EhcExitBootService (
- EFI_EVENT Event,
- VOID *Context
- )
-
-{
- USB2_HC_DEV *Ehc;
-
- Ehc = (USB2_HC_DEV *) Context;
-
- //
- // Reset the Host Controller
- //
- EhcResetHC (Ehc, EHC_RESET_TIMEOUT);
-}
-
-
-/**
- Starting the Usb EHCI Driver.
-
- @param This Protocol instance pointer.
- @param Controller Handle of device to test.
- @param RemainingDevicePath Not used.
-
- @return EFI_SUCCESS supports this device.
- @return EFI_UNSUPPORTED do not support this device.
- @return EFI_DEVICE_ERROR cannot be started due to device Error.
- @return EFI_OUT_OF_RESOURCES cannot allocate resources.
-
-**/
-EFI_STATUS
-EFIAPI
-EhcDriverBindingStart (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
- )
-{
- EFI_STATUS Status;
- USB2_HC_DEV *Ehc;
- EFI_PCI_IO_PROTOCOL *PciIo;
- EFI_PCI_IO_PROTOCOL *Instance;
- UINT64 Supports;
- UINT64 OriginalPciAttributes;
- BOOLEAN PciAttributesSaved;
- USB_CLASSC UsbClassCReg;
- EFI_HANDLE *HandleBuffer;
- UINTN NumberOfHandles;
- UINTN Index;
- UINTN CompanionSegmentNumber;
- UINTN CompanionBusNumber;
- UINTN CompanionDeviceNumber;
- UINTN CompanionFunctionNumber;
- UINTN EhciSegmentNumber;
- UINTN EhciBusNumber;
- UINTN EhciDeviceNumber;
- UINTN EhciFunctionNumber;
- UINT32 State;
- EFI_DEVICE_PATH_PROTOCOL *HcDevicePath;
-
- //
- // Open the PciIo Protocol, then enable the USB host controller
- //
- Status = gBS->OpenProtocol (
- Controller,
- &gEfiPciIoProtocolGuid,
- (VOID **) &PciIo,
- This->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_BY_DRIVER
- );
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- //
- // Open Device Path Protocol for on USB host controller
- //
- HcDevicePath = NULL;
- Status = gBS->OpenProtocol (
- Controller,
- &gEfiDevicePathProtocolGuid,
- (VOID **) &HcDevicePath,
- This->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
-
- PciAttributesSaved = FALSE;
- //
- // Save original PCI attributes
- //
- Status = PciIo->Attributes (
- PciIo,
- EfiPciIoAttributeOperationGet,
- 0,
- &OriginalPciAttributes
- );
-
- if (EFI_ERROR (Status)) {
- goto CLOSE_PCIIO;
- }
- PciAttributesSaved = TRUE;
-
- Status = PciIo->Attributes (
- PciIo,
- EfiPciIoAttributeOperationSupported,
- 0,
- &Supports
- );
- if (!EFI_ERROR (Status)) {
- Supports &= (UINT64)EFI_PCI_DEVICE_ENABLE;
- Status = PciIo->Attributes (
- PciIo,
- EfiPciIoAttributeOperationEnable,
- Supports,
- NULL
- );
- }
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "EhcDriverBindingStart: failed to enable controller\n"));
- goto CLOSE_PCIIO;
- }
-
- //
- // Get the Pci device class code.
- //
- Status = PciIo->Pci.Read (
- PciIo,
- EfiPciIoWidthUint8,
- PCI_CLASSCODE_OFFSET,
- sizeof (USB_CLASSC) / sizeof (UINT8),
- &UsbClassCReg
- );
-
- if (EFI_ERROR (Status)) {
- Status = EFI_UNSUPPORTED;
- goto CLOSE_PCIIO;
- }
- //
- // Determine if the device is UHCI or OHCI host controller or not. If yes, then find out the
- // companion usb ehci host controller and force EHCI driver get attached to it before
- // UHCI or OHCI driver attaches to UHCI or OHCI host controller.
- //
- if ((UsbClassCReg.ProgInterface == PCI_IF_UHCI || UsbClassCReg.ProgInterface == PCI_IF_OHCI) &&
- (UsbClassCReg.BaseCode == PCI_CLASS_SERIAL) &&
- (UsbClassCReg.SubClassCode == PCI_CLASS_SERIAL_USB)) {
- Status = PciIo->GetLocation (
- PciIo,
- &CompanionSegmentNumber,
- &CompanionBusNumber,
- &CompanionDeviceNumber,
- &CompanionFunctionNumber
- );
- if (EFI_ERROR (Status)) {
- goto CLOSE_PCIIO;
- }
-
- Status = gBS->LocateHandleBuffer (
- ByProtocol,
- &gEfiPciIoProtocolGuid,
- NULL,
- &NumberOfHandles,
- &HandleBuffer
- );
- if (EFI_ERROR (Status)) {
- goto CLOSE_PCIIO;
- }
-
- for (Index = 0; Index < NumberOfHandles; Index++) {
- //
- // Get the device path on this handle
- //
- Status = gBS->HandleProtocol (
- HandleBuffer[Index],
- &gEfiPciIoProtocolGuid,
- (VOID **)&Instance
- );
- ASSERT_EFI_ERROR (Status);
-
- Status = Instance->Pci.Read (
- Instance,
- EfiPciIoWidthUint8,
- PCI_CLASSCODE_OFFSET,
- sizeof (USB_CLASSC) / sizeof (UINT8),
- &UsbClassCReg
- );
-
- if (EFI_ERROR (Status)) {
- Status = EFI_UNSUPPORTED;
- goto CLOSE_PCIIO;
- }
-
- if ((UsbClassCReg.ProgInterface == PCI_IF_EHCI) &&
- (UsbClassCReg.BaseCode == PCI_CLASS_SERIAL) &&
- (UsbClassCReg.SubClassCode == PCI_CLASS_SERIAL_USB)) {
- Status = Instance->GetLocation (
- Instance,
- &EhciSegmentNumber,
- &EhciBusNumber,
- &EhciDeviceNumber,
- &EhciFunctionNumber
- );
- if (EFI_ERROR (Status)) {
- goto CLOSE_PCIIO;
- }
- //
- // Currently, the judgment on the companion usb host controller is through the
- // same bus number, which may vary on different platform.
- //
- if (EhciBusNumber == CompanionBusNumber) {
- gBS->CloseProtocol (
- Controller,
- &gEfiPciIoProtocolGuid,
- This->DriverBindingHandle,
- Controller
- );
- EhcDriverBindingStart(This, HandleBuffer[Index], NULL);
- }
- }
- }
- Status = EFI_NOT_FOUND;
- goto CLOSE_PCIIO;
- }
-
- //
- // Create then install USB2_HC_PROTOCOL
- //
- Ehc = EhcCreateUsb2Hc (PciIo, HcDevicePath, OriginalPciAttributes);
-
- if (Ehc == NULL) {
- DEBUG ((EFI_D_ERROR, "EhcDriverBindingStart: failed to create USB2_HC\n"));
-
- Status = EFI_OUT_OF_RESOURCES;
- goto CLOSE_PCIIO;
- }
-
- //
- // Enable 64-bit DMA support in the PCI layer if this controller
- // supports it.
- //
- if (EHC_BIT_IS_SET (Ehc->HcCapParams, HCCP_64BIT)) {
- Status = PciIo->Attributes (
- PciIo,
- EfiPciIoAttributeOperationEnable,
- EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE,
- NULL
- );
- if (!EFI_ERROR (Status)) {
- Ehc->Support64BitDma = TRUE;
- } else {
- DEBUG ((EFI_D_WARN,
- "%a: failed to enable 64-bit DMA on 64-bit capable controller @ %p (%r)\n",
- __FUNCTION__, Controller, Status));
- }
- }
-
- Status = gBS->InstallProtocolInterface (
- &Controller,
- &gEfiUsb2HcProtocolGuid,
- EFI_NATIVE_INTERFACE,
- &Ehc->Usb2Hc
- );
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "EhcDriverBindingStart: failed to install USB2_HC Protocol\n"));
- goto FREE_POOL;
- }
-
- //
- // Robustnesss improvement such as for Duet platform
- // Default is not required.
- //
- if (FeaturePcdGet (PcdTurnOffUsbLegacySupport)) {
- EhcClearLegacySupport (Ehc);
- }
-
- if (Ehc->DebugPortNum != 0) {
- State = EhcReadDbgRegister(Ehc, 0);
- if ((State & (USB_DEBUG_PORT_IN_USE | USB_DEBUG_PORT_OWNER)) != (USB_DEBUG_PORT_IN_USE | USB_DEBUG_PORT_OWNER)) {
- EhcResetHC (Ehc, EHC_RESET_TIMEOUT);
- }
- }
-
- Status = EhcInitHC (Ehc);
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "EhcDriverBindingStart: failed to init host controller\n"));
- goto UNINSTALL_USBHC;
- }
-
- //
- // Start the asynchronous interrupt monitor
- //
- Status = gBS->SetTimer (Ehc->PollTimer, TimerPeriodic, EHC_ASYNC_POLL_INTERVAL);
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "EhcDriverBindingStart: failed to start async interrupt monitor\n"));
-
- EhcHaltHC (Ehc, EHC_GENERIC_TIMEOUT);
- 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.
- //
- AddUnicodeString2 (
- "eng",
- gEhciComponentName.SupportedLanguages,
- &Ehc->ControllerNameTable,
- L"Enhanced Host Controller (USB 2.0)",
- TRUE
- );
- AddUnicodeString2 (
- "en",
- gEhciComponentName2.SupportedLanguages,
- &Ehc->ControllerNameTable,
- L"Enhanced Host Controller (USB 2.0)",
- FALSE
- );
-
-
- DEBUG ((EFI_D_INFO, "EhcDriverBindingStart: EHCI started for controller @ %p\n", Controller));
- return EFI_SUCCESS;
-
-UNINSTALL_USBHC:
- gBS->UninstallProtocolInterface (
- Controller,
- &gEfiUsb2HcProtocolGuid,
- &Ehc->Usb2Hc
- );
-
-FREE_POOL:
- EhcFreeSched (Ehc);
- gBS->CloseEvent (Ehc->PollTimer);
- gBS->FreePool (Ehc);
-
-CLOSE_PCIIO:
- if (PciAttributesSaved) {
- //
- // Restore original PCI attributes
- //
- PciIo->Attributes (
- PciIo,
- EfiPciIoAttributeOperationSet,
- OriginalPciAttributes,
- NULL
- );
- }
-
- gBS->CloseProtocol (
- Controller,
- &gEfiPciIoProtocolGuid,
- This->DriverBindingHandle,
- Controller
- );
-
- return Status;
-}
-
-
-/**
- Stop this driver on ControllerHandle. Support stopping any child handles
- created by this driver.
-
- @param This Protocol instance pointer.
- @param Controller Handle of device to stop driver on.
- @param NumberOfChildren Number of Children in the ChildHandleBuffer.
- @param ChildHandleBuffer List of handles for the children we need to stop.
-
- @return EFI_SUCCESS Success.
- @return EFI_DEVICE_ERROR Fail.
-
-**/
-EFI_STATUS
-EFIAPI
-EhcDriverBindingStop (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN UINTN NumberOfChildren,
- IN EFI_HANDLE *ChildHandleBuffer
- )
-{
- EFI_STATUS Status;
- EFI_USB2_HC_PROTOCOL *Usb2Hc;
- EFI_PCI_IO_PROTOCOL *PciIo;
- USB2_HC_DEV *Ehc;
-
- //
- // Test whether the Controller handler passed in is a valid
- // Usb controller handle that should be supported, if not,
- // return the error status directly
- //
- Status = gBS->OpenProtocol (
- Controller,
- &gEfiUsb2HcProtocolGuid,
- (VOID **) &Usb2Hc,
- This->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- Ehc = EHC_FROM_THIS (Usb2Hc);
- PciIo = Ehc->PciIo;
-
- Status = gBS->UninstallProtocolInterface (
- Controller,
- &gEfiUsb2HcProtocolGuid,
- Usb2Hc
- );
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- //
- // Stop AsyncRequest Polling timer then stop the EHCI driver
- // and uninstall the EHCI protocl.
- //
- gBS->SetTimer (Ehc->PollTimer, TimerCancel, EHC_ASYNC_POLL_INTERVAL);
- EhcHaltHC (Ehc, EHC_GENERIC_TIMEOUT);
-
- if (Ehc->PollTimer != NULL) {
- gBS->CloseEvent (Ehc->PollTimer);
- }
-
- if (Ehc->ExitBootServiceEvent != NULL) {
- gBS->CloseEvent (Ehc->ExitBootServiceEvent);
- }
-
- EhcFreeSched (Ehc);
-
- if (Ehc->ControllerNameTable != NULL) {
- FreeUnicodeStringTable (Ehc->ControllerNameTable);
- }
-
- //
- // Disable routing of all ports to EHCI controller, so all ports are
- // routed back to the UHCI or OHCI controller.
- //
- EhcClearOpRegBit (Ehc, EHC_CONFIG_FLAG_OFFSET, CONFIGFLAG_ROUTE_EHC);
-
- //
- // Restore original PCI attributes
- //
- PciIo->Attributes (
- PciIo,
- EfiPciIoAttributeOperationSet,
- Ehc->OriginalPciAttributes,
- NULL
- );
-
- gBS->CloseProtocol (
- Controller,
- &gEfiPciIoProtocolGuid,
- This->DriverBindingHandle,
- Controller
- );
-
- FreePool (Ehc);
-
- return EFI_SUCCESS;
-}
-
diff --git a/MdeModulePkg/Bus/Pci/EhciDxe/Ehci.h b/MdeModulePkg/Bus/Pci/EhciDxe/Ehci.h
deleted file mode 100644
index 3415816c53..0000000000
--- a/MdeModulePkg/Bus/Pci/EhciDxe/Ehci.h
+++ /dev/null
@@ -1,250 +0,0 @@
-/** @file
-
- Provides some data struct used by EHCI controller driver.
-
-Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
-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
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef _EFI_EHCI_H_
-#define _EFI_EHCI_H_
-
-
-#include <Uefi.h>
-
-#include <Protocol/Usb2HostController.h>
-#include <Protocol/PciIo.h>
-
-#include <Guid/EventGroup.h>
-
-#include <Library/DebugLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/UefiDriverEntryPoint.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiLib.h>
-#include <Library/BaseLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/PcdLib.h>
-#include <Library/ReportStatusCodeLib.h>
-
-#include <IndustryStandard/Pci.h>
-
-typedef struct _USB2_HC_DEV USB2_HC_DEV;
-
-#include "UsbHcMem.h"
-#include "EhciReg.h"
-#include "EhciUrb.h"
-#include "EhciSched.h"
-#include "EhciDebug.h"
-#include "ComponentName.h"
-
-//
-// EHC timeout experience values
-//
-
-#define EHC_1_MICROSECOND 1
-#define EHC_1_MILLISECOND (1000 * EHC_1_MICROSECOND)
-#define EHC_1_SECOND (1000 * EHC_1_MILLISECOND)
-
-//
-// EHCI register operation timeout, set by experience
-//
-#define EHC_RESET_TIMEOUT (1 * EHC_1_SECOND)
-#define EHC_GENERIC_TIMEOUT (10 * EHC_1_MILLISECOND)
-
-//
-// Wait for roothub port power stable, refers to Spec[EHCI1.0-2.3.9]
-//
-#define EHC_ROOT_PORT_RECOVERY_STALL (20 * EHC_1_MILLISECOND)
-
-//
-// Sync and Async transfer polling interval, set by experience,
-// and the unit of Async is 100us, means 1ms as interval.
-//
-#define EHC_SYNC_POLL_INTERVAL (1 * EHC_1_MILLISECOND)
-#define EHC_ASYNC_POLL_INTERVAL EFI_TIMER_PERIOD_MILLISECONDS(1)
-
-//
-// EHCI debug port control status register bit definition
-//
-#define USB_DEBUG_PORT_IN_USE BIT10
-#define USB_DEBUG_PORT_ENABLE BIT28
-#define USB_DEBUG_PORT_OWNER BIT30
-
-//
-// EHC raises TPL to TPL_NOTIFY to serialize all its operations
-// to protect shared data structures.
-//
-#define EHC_TPL TPL_NOTIFY
-
-//
-//Iterate through the double linked list. NOT delete safe
-//
-#define EFI_LIST_FOR_EACH(Entry, ListHead) \
- for(Entry = (ListHead)->ForwardLink; Entry != (ListHead); Entry = Entry->ForwardLink)
-
-//
-//Iterate through the double linked list. This is delete-safe.
-//Don't touch NextEntry
-//
-#define EFI_LIST_FOR_EACH_SAFE(Entry, NextEntry, ListHead) \
- for(Entry = (ListHead)->ForwardLink, NextEntry = Entry->ForwardLink;\
- Entry != (ListHead); Entry = NextEntry, NextEntry = Entry->ForwardLink)
-
-#define EFI_LIST_CONTAINER(Entry, Type, Field) BASE_CR(Entry, Type, Field)
-
-
-#define EHC_LOW_32BIT(Addr64) ((UINT32)(((UINTN)(Addr64)) & 0XFFFFFFFF))
-#define EHC_HIGH_32BIT(Addr64) ((UINT32)(RShiftU64((UINTN)(Addr64), 32) & 0XFFFFFFFF))
-#define EHC_BIT_IS_SET(Data, Bit) ((BOOLEAN)(((Data) & (Bit)) == (Bit)))
-
-#define EHC_REG_BIT_IS_SET(Ehc, Offset, Bit) \
- (EHC_BIT_IS_SET(EhcReadOpReg ((Ehc), (Offset)), (Bit)))
-
-#define USB2_HC_DEV_SIGNATURE SIGNATURE_32 ('e', 'h', 'c', 'i')
-#define EHC_FROM_THIS(a) CR(a, USB2_HC_DEV, Usb2Hc, USB2_HC_DEV_SIGNATURE)
-
-struct _USB2_HC_DEV {
- UINTN Signature;
- EFI_USB2_HC_PROTOCOL Usb2Hc;
-
- EFI_PCI_IO_PROTOCOL *PciIo;
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;
- UINT64 OriginalPciAttributes;
- USBHC_MEM_POOL *MemPool;
-
- //
- // Schedule data shared between asynchronous and periodic
- // transfers:
- // ShortReadStop, as its name indicates, is used to terminate
- // the short read except the control transfer. EHCI follows
- // the alternative next QTD point when a short read happens.
- // For control transfer, even the short read happens, try the
- // status stage.
- //
- 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
- // list. It acts as the reclamation header.
- //
- EHC_QH *ReclaimHead;
-
- //
- // Periodic (interrupt) transfer schedule data:
- //
- VOID *PeriodFrame; // the buffer pointed by this pointer is used to store pci bus address of the QH descriptor.
- VOID *PeriodFrameHost; // the buffer pointed by this pointer is used to store host memory address of the QH descriptor.
- VOID *PeriodFrameMap;
-
- EHC_QH *PeriodOne;
- LIST_ENTRY AsyncIntTransfers;
-
- //
- // EHCI configuration data
- //
- UINT32 HcStructParams; // Cache of HC structure parameter, EHC_HCSPARAMS_OFFSET
- UINT32 HcCapParams; // Cache of HC capability parameter, HCCPARAMS
- UINT32 CapLen; // Capability length
-
- //
- // Misc
- //
- EFI_UNICODE_STRING_TABLE *ControllerNameTable;
-
- //
- // EHCI debug port info
- //
- UINT16 DebugPortOffset; // The offset of debug port mmio register
- UINT8 DebugPortBarNum; // The bar number of debug port mmio register
- UINT8 DebugPortNum; // The port number of usb debug port
-
- BOOLEAN Support64BitDma; // Whether 64 bit DMA may be used with this device
-};
-
-
-extern EFI_DRIVER_BINDING_PROTOCOL gEhciDriverBinding;
-extern EFI_COMPONENT_NAME_PROTOCOL gEhciComponentName;
-extern EFI_COMPONENT_NAME2_PROTOCOL gEhciComponentName2;
-
-/**
- Test to see if this driver supports ControllerHandle. Any
- ControllerHandle that has Usb2HcProtocol installed will
- be supported.
-
- @param This Protocol instance pointer.
- @param Controller Handle of device to test.
- @param RemainingDevicePath Not used.
-
- @return EFI_SUCCESS This driver supports this device.
- @return EFI_UNSUPPORTED This driver does not support this device.
-
-**/
-EFI_STATUS
-EFIAPI
-EhcDriverBindingSupported (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
- );
-
-/**
- Starting the Usb EHCI Driver.
-
- @param This Protocol instance pointer.
- @param Controller Handle of device to test.
- @param RemainingDevicePath Not used.
-
- @return EFI_SUCCESS supports this device.
- @return EFI_UNSUPPORTED do not support this device.
- @return EFI_DEVICE_ERROR cannot be started due to device Error.
- @return EFI_OUT_OF_RESOURCES cannot allocate resources.
-
-**/
-EFI_STATUS
-EFIAPI
-EhcDriverBindingStart (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
- );
-
-/**
- Stop this driver on ControllerHandle. Support stopping any child handles
- created by this driver.
-
- @param This Protocol instance pointer.
- @param Controller Handle of device to stop driver on.
- @param NumberOfChildren Number of Children in the ChildHandleBuffer.
- @param ChildHandleBuffer List of handles for the children we need to stop.
-
- @return EFI_SUCCESS Success.
- @return EFI_DEVICE_ERROR Fail.
-
-**/
-EFI_STATUS
-EFIAPI
-EhcDriverBindingStop (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN UINTN NumberOfChildren,
- IN EFI_HANDLE *ChildHandleBuffer
- );
-
-#endif
-
diff --git a/MdeModulePkg/Bus/Pci/EhciDxe/EhciDebug.c b/MdeModulePkg/Bus/Pci/EhciDxe/EhciDebug.c
deleted file mode 100644
index 76368b4748..0000000000
--- a/MdeModulePkg/Bus/Pci/EhciDxe/EhciDebug.c
+++ /dev/null
@@ -1,258 +0,0 @@
-/** @file
-
- This file provides the information dump support for EHCI when in debug mode.
-
-Copyright (c) 2007 - 2013, Intel Corporation. All rights reserved.<BR>
-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
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-
-#include "Ehci.h"
-
-/**
- Dump the status byte in QTD/QH to a more friendly format.
-
- @param State The state in the QTD/QH.
-
-**/
-VOID
-EhcDumpStatus (
- IN UINT32 State
- )
-{
- if (EHC_BIT_IS_SET (State, QTD_STAT_DO_PING)) {
- DEBUG ((EFI_D_VERBOSE, " Do_Ping"));
- } else {
- DEBUG ((EFI_D_VERBOSE, " Do_Out"));
- }
-
- if (EHC_BIT_IS_SET (State, QTD_STAT_DO_CS)) {
- DEBUG ((EFI_D_VERBOSE, " Do_CS"));
- } else {
- DEBUG ((EFI_D_VERBOSE, " Do_SS"));
- }
-
- if (EHC_BIT_IS_SET (State, QTD_STAT_TRANS_ERR)) {
- DEBUG ((EFI_D_VERBOSE, " Transfer_Error"));
- }
-
- if (EHC_BIT_IS_SET (State, QTD_STAT_BABBLE_ERR)) {
- DEBUG ((EFI_D_VERBOSE, " Babble_Error"));
- }
-
- if (EHC_BIT_IS_SET (State, QTD_STAT_BUFF_ERR)) {
- DEBUG ((EFI_D_VERBOSE, " Buffer_Error"));
- }
-
- if (EHC_BIT_IS_SET (State, QTD_STAT_HALTED)) {
- DEBUG ((EFI_D_VERBOSE, " Halted"));
- }
-
- if (EHC_BIT_IS_SET (State, QTD_STAT_ACTIVE)) {
- DEBUG ((EFI_D_VERBOSE, " Active"));
- }
-
- DEBUG ((EFI_D_VERBOSE, "\n"));
-}
-
-
-/**
- Dump the fields of a QTD.
-
- @param Qtd The QTD to dump.
- @param Msg The message to print before the dump.
-
-**/
-VOID
-EhcDumpQtd (
- IN EHC_QTD *Qtd,
- IN CHAR8 *Msg
- )
-{
- QTD_HW *QtdHw;
- UINTN Index;
-
- if (Msg != NULL) {
- DEBUG ((EFI_D_VERBOSE, Msg));
- }
-
- DEBUG ((EFI_D_VERBOSE, "Queue TD @ 0x%p, data length %d\n", Qtd, (UINT32)Qtd->DataLen));
-
- QtdHw = &Qtd->QtdHw;
-
- DEBUG ((EFI_D_VERBOSE, "Next QTD : %x\n", QtdHw->NextQtd));
- DEBUG ((EFI_D_VERBOSE, "AltNext QTD : %x\n", QtdHw->AltNext));
- DEBUG ((EFI_D_VERBOSE, "Status : %x\n", QtdHw->Status));
- EhcDumpStatus (QtdHw->Status);
-
- if (QtdHw->Pid == QTD_PID_SETUP) {
- DEBUG ((EFI_D_VERBOSE, "PID : Setup\n"));
-
- } else if (QtdHw->Pid == QTD_PID_INPUT) {
- DEBUG ((EFI_D_VERBOSE, "PID : IN\n"));
-
- } else if (QtdHw->Pid == QTD_PID_OUTPUT) {
- DEBUG ((EFI_D_VERBOSE, "PID : OUT\n"));
-
- }
-
- DEBUG ((EFI_D_VERBOSE, "Error Count : %d\n", QtdHw->ErrCnt));
- DEBUG ((EFI_D_VERBOSE, "Current Page : %d\n", QtdHw->CurPage));
- DEBUG ((EFI_D_VERBOSE, "IOC : %d\n", QtdHw->Ioc));
- DEBUG ((EFI_D_VERBOSE, "Total Bytes : %d\n", QtdHw->TotalBytes));
- DEBUG ((EFI_D_VERBOSE, "Data Toggle : %d\n", QtdHw->DataToggle));
-
- for (Index = 0; Index < 5; Index++) {
- DEBUG ((EFI_D_VERBOSE, "Page[%d] : 0x%x\n", (UINT32)Index, QtdHw->Page[Index]));
- }
-}
-
-
-/**
- Dump the queue head.
-
- @param Qh The queue head to dump.
- @param Msg The message to print before the dump.
- @param DumpBuf Whether to dump the memory buffer of the associated QTD.
-
-**/
-VOID
-EhcDumpQh (
- IN EHC_QH *Qh,
- IN CHAR8 *Msg,
- IN BOOLEAN DumpBuf
- )
-{
- EHC_QTD *Qtd;
- QH_HW *QhHw;
- LIST_ENTRY *Entry;
- UINTN Index;
-
- if (Msg != NULL) {
- DEBUG ((EFI_D_VERBOSE, Msg));
- }
-
- DEBUG ((EFI_D_VERBOSE, "Queue head @ 0x%p, interval %ld, next qh %p\n",
- Qh, (UINT64)Qh->Interval, Qh->NextQh));
-
- QhHw = &Qh->QhHw;
-
- DEBUG ((EFI_D_VERBOSE, "Hoziontal link: %x\n", QhHw->HorizonLink));
- DEBUG ((EFI_D_VERBOSE, "Device address: %d\n", QhHw->DeviceAddr));
- DEBUG ((EFI_D_VERBOSE, "Inactive : %d\n", QhHw->Inactive));
- DEBUG ((EFI_D_VERBOSE, "EP number : %d\n", QhHw->EpNum));
- DEBUG ((EFI_D_VERBOSE, "EP speed : %d\n", QhHw->EpSpeed));
- DEBUG ((EFI_D_VERBOSE, "DT control : %d\n", QhHw->DtCtrl));
- DEBUG ((EFI_D_VERBOSE, "Reclaim head : %d\n", QhHw->ReclaimHead));
- DEBUG ((EFI_D_VERBOSE, "Max packet len: %d\n", QhHw->MaxPacketLen));
- DEBUG ((EFI_D_VERBOSE, "Ctrl EP : %d\n", QhHw->CtrlEp));
- DEBUG ((EFI_D_VERBOSE, "Nak reload : %d\n", QhHw->NakReload));
-
- DEBUG ((EFI_D_VERBOSE, "SMask : %x\n", QhHw->SMask));
- DEBUG ((EFI_D_VERBOSE, "CMask : %x\n", QhHw->CMask));
- DEBUG ((EFI_D_VERBOSE, "Hub address : %d\n", QhHw->HubAddr));
- DEBUG ((EFI_D_VERBOSE, "Hub port : %d\n", QhHw->PortNum));
- DEBUG ((EFI_D_VERBOSE, "Multiplier : %d\n", QhHw->Multiplier));
-
- DEBUG ((EFI_D_VERBOSE, "Cur QTD : %x\n", QhHw->CurQtd));
-
- DEBUG ((EFI_D_VERBOSE, "Next QTD : %x\n", QhHw->NextQtd));
- DEBUG ((EFI_D_VERBOSE, "AltNext QTD : %x\n", QhHw->AltQtd));
- DEBUG ((EFI_D_VERBOSE, "Status : %x\n", QhHw->Status));
-
- EhcDumpStatus (QhHw->Status);
-
- if (QhHw->Pid == QTD_PID_SETUP) {
- DEBUG ((EFI_D_VERBOSE, "PID : Setup\n"));
-
- } else if (QhHw->Pid == QTD_PID_INPUT) {
- DEBUG ((EFI_D_VERBOSE, "PID : IN\n"));
-
- } else if (QhHw->Pid == QTD_PID_OUTPUT) {
- DEBUG ((EFI_D_VERBOSE, "PID : OUT\n"));
- }
-
- DEBUG ((EFI_D_VERBOSE, "Error Count : %d\n", QhHw->ErrCnt));
- DEBUG ((EFI_D_VERBOSE, "Current Page : %d\n", QhHw->CurPage));
- DEBUG ((EFI_D_VERBOSE, "IOC : %d\n", QhHw->Ioc));
- DEBUG ((EFI_D_VERBOSE, "Total Bytes : %d\n", QhHw->TotalBytes));
- DEBUG ((EFI_D_VERBOSE, "Data Toggle : %d\n", QhHw->DataToggle));
-
- for (Index = 0; Index < 5; Index++) {
- DEBUG ((EFI_D_VERBOSE, "Page[%d] : 0x%x\n", Index, QhHw->Page[Index]));
- }
-
- DEBUG ((EFI_D_VERBOSE, "\n"));
-
- EFI_LIST_FOR_EACH (Entry, &Qh->Qtds) {
- Qtd = EFI_LIST_CONTAINER (Entry, EHC_QTD, QtdList);
- EhcDumpQtd (Qtd, NULL);
-
- if (DumpBuf && (Qtd->DataLen != 0)) {
- EhcDumpBuf (Qtd->Data, Qtd->DataLen);
- }
- }
-}
-
-
-/**
- Dump the buffer in the form of hex.
-
- @param Buf The buffer to dump.
- @param Len The length of buffer.
-
-**/
-VOID
-EhcDumpBuf (
- IN UINT8 *Buf,
- IN UINTN Len
- )
-{
- UINTN Index;
-
- for (Index = 0; Index < Len; Index++) {
- if (Index % 16 == 0) {
- DEBUG ((EFI_D_VERBOSE,"\n"));
- }
-
- DEBUG ((EFI_D_VERBOSE, "%02x ", Buf[Index]));
- }
-
- DEBUG ((EFI_D_VERBOSE, "\n"));
-}
-
-/**
- Dump the EHCI status registers.
-
- @param Ehc USB EHCI Host Controller instance
-
-**/
-VOID
-EhcDumpRegs (
- IN USB2_HC_DEV *Ehc
- )
-{
- UINT8 Index;
-
- DEBUG ((EFI_D_VERBOSE, " EHC_CAPLENGTH_OFFSET = 0x%08x\n", EhcReadCapRegister (Ehc, EHC_CAPLENGTH_OFFSET)));
- DEBUG ((EFI_D_VERBOSE, " EHC_HCSPARAMS_OFFSET = 0x%08x\n", EhcReadCapRegister (Ehc, EHC_HCSPARAMS_OFFSET)));
- DEBUG ((EFI_D_VERBOSE, " EHC_HCCPARAMS_OFFSET = 0x%08x\n", EhcReadCapRegister (Ehc, EHC_HCCPARAMS_OFFSET)));
- DEBUG ((EFI_D_VERBOSE, " EHC_USBCMD_OFFSET = 0x%08x\n", EhcReadOpReg (Ehc, EHC_USBCMD_OFFSET)));
- DEBUG ((EFI_D_VERBOSE, " EHC_USBSTS_OFFSET = 0x%08x\n", EhcReadOpReg (Ehc, EHC_USBSTS_OFFSET)));
- DEBUG ((EFI_D_VERBOSE, " EHC_USBINTR_OFFSET = 0x%08x\n", EhcReadOpReg (Ehc, EHC_USBINTR_OFFSET)));
- DEBUG ((EFI_D_VERBOSE, " EHC_FRINDEX_OFFSET = 0x%08x\n", EhcReadOpReg (Ehc, EHC_FRINDEX_OFFSET)));
- DEBUG ((EFI_D_VERBOSE, " EHC_CTRLDSSEG_OFFSET = 0x%08x\n", EhcReadOpReg (Ehc, EHC_CTRLDSSEG_OFFSET)));
- DEBUG ((EFI_D_VERBOSE, " EHC_FRAME_BASE_OFFSET = 0x%08x\n", EhcReadOpReg (Ehc, EHC_FRAME_BASE_OFFSET)));
- DEBUG ((EFI_D_VERBOSE, " EHC_ASYNC_HEAD_OFFSET = 0x%08x\n", EhcReadOpReg (Ehc, EHC_ASYNC_HEAD_OFFSET)));
- DEBUG ((EFI_D_VERBOSE, " EHC_CONFIG_FLAG_OFFSET = 0x%08x\n", EhcReadOpReg (Ehc, EHC_CONFIG_FLAG_OFFSET)));
- for (Index = 0; Index < (UINT8) (Ehc->HcStructParams & HCSP_NPORTS); Index++) {
- DEBUG ((EFI_D_VERBOSE, " EHC_PORT_STAT_OFFSET(%d) = 0x%08x\n", Index, EhcReadOpReg (Ehc, EHC_PORT_STAT_OFFSET + (4 * Index))));
- }
-}
diff --git a/MdeModulePkg/Bus/Pci/EhciDxe/EhciDebug.h b/MdeModulePkg/Bus/Pci/EhciDxe/EhciDebug.h
deleted file mode 100644
index bc84bb7864..0000000000
--- a/MdeModulePkg/Bus/Pci/EhciDxe/EhciDebug.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/** @file
-
- This file contains the definination for host controller debug support routines.
-
-Copyright (c) 2007 - 2009, Intel Corporation. All rights reserved.<BR>
-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
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef _EFI_EHCI_DEBUG_H_
-#define _EFI_EHCI_DEBUG_H_
-
-
-/**
- Dump the fields of a QTD.
-
- @param Qtd The QTD to dump.
- @param Msg The message to print before the dump.
-
-**/
-VOID
-EhcDumpQtd (
- IN EHC_QTD *Qtd,
- IN CHAR8 *Msg
- );
-
-
-/**
- Dump the queue head.
-
- @param Qh The queue head to dump.
- @param Msg The message to print before the dump.
- @param DumpBuf Whether to dump the memory buffer of the associated QTD.
-
-**/
-VOID
-EhcDumpQh (
- IN EHC_QH *Qh,
- IN CHAR8 *Msg,
- IN BOOLEAN DumpBuf
- );
-
-
-/**
- Dump the buffer in the form of hex.
-
- @param Buf The buffer to dump.
- @param Len The length of buffer.
-
-**/
-VOID
-EhcDumpBuf (
- IN UINT8 *Buf,
- IN UINTN Len
- );
-
-
-/**
- Dump the EHCI status registers.
-
- @param Ehc USB EHCI Host Controller instance
-
-**/
-VOID
-EhcDumpRegs (
- IN USB2_HC_DEV *Ehc
- );
-
-#endif
diff --git a/MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf b/MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf
deleted file mode 100644
index 238923e828..0000000000
--- a/MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf
+++ /dev/null
@@ -1,90 +0,0 @@
-## @file
-# The EhciDxe driver is responsible for managing the behavior of EHCI controller.
-# It implements the interfaces of monitoring the status of all ports and transferring
-# Control, Bulk, Interrupt and Isochronous requests to Usb2.0 device.
-#
-# Note that EhciDxe driver is enhanced to guarantee that the EHCI controller get attached
-# to the EHCI controller before the UHCI driver attaches to the companion UHCI controller.
-# This way avoids the control transfer on a shared port between EHCI and companion host
-# controller when UHCI gets attached earlier than EHCI and a USB 2.0 device inserts.
-#
-# Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
-#
-# 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
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-#
-##
-
-[Defines]
- INF_VERSION = 0x00010005
- BASE_NAME = EhciDxe
- MODULE_UNI_FILE = EhciDxe.uni
- FILE_GUID = BDFE430E-8F2A-4db0-9991-6F856594777E
- MODULE_TYPE = UEFI_DRIVER
- VERSION_STRING = 1.0
-
- ENTRY_POINT = EhcDriverEntryPoint
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-# VALID_ARCHITECTURES = IA32 X64 IPF EBC ARM AARCH64
-#
-# DRIVER_BINDING = gEhciDriverBinding
-# COMPONENT_NAME = gEhciComponentName
-# COMPONENT_NAME2 = gEhciComponentName2
-#
-
-[Sources]
- UsbHcMem.h
- EhciUrb.c
- EhciReg.h
- UsbHcMem.c
- EhciSched.c
- EhciDebug.c
- EhciReg.c
- EhciDebug.h
- ComponentName.c
- ComponentName.h
- EhciUrb.h
- Ehci.h
- EhciSched.h
- Ehci.c
-
-[Packages]
- MdePkg/MdePkg.dec
- MdeModulePkg/MdeModulePkg.dec
-
-[FeaturePcd]
- gEfiMdeModulePkgTokenSpaceGuid.PcdTurnOffUsbLegacySupport ## CONSUMES
-
-[LibraryClasses]
- MemoryAllocationLib
- BaseLib
- UefiLib
- UefiBootServicesTableLib
- UefiDriverEntryPoint
- BaseMemoryLib
- DebugLib
- PcdLib
- ReportStatusCodeLib
-
-[Guids]
- gEfiEventExitBootServicesGuid ## SOMETIMES_CONSUMES ## Event
-
-[Protocols]
- gEfiPciIoProtocolGuid ## TO_START
- gEfiUsb2HcProtocolGuid ## BY_START
-
-# [Event]
-# EVENT_TYPE_PERIODIC_TIMER ## CONSUMES
-#
-
-[UserExtensions.TianoCore."ExtraFiles"]
- EhciDxeExtra.uni
diff --git a/MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.uni b/MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.uni
deleted file mode 100644
index e36ee52663..0000000000
--- a/MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.uni
+++ /dev/null
@@ -1,30 +0,0 @@
-// /** @file
-// The EhciDxe driver is responsible for managing the behavior of EHCI controller.
-//
-// It implements the interfaces of monitoring the status of all ports and transferring
-// Control, Bulk, Interrupt and Isochronous requests to Usb2.0 device.
-//
-// Note that EhciDxe driver is enhanced to guarantee that the EHCI controller get attached
-// to the EHCI controller before the UHCI driver attaches to the companion UHCI controller.
-// This way avoids the control transfer on a shared port between EHCI and companion host
-// controller when UHCI gets attached earlier than EHCI and a USB 2.0 device inserts.
-//
-// Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
-//
-// 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
-// http://opensource.org/licenses/bsd-license.php
-//
-// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-//
-// **/
-
-
-#string STR_MODULE_ABSTRACT #language en-US "Responsible for managing the behavior of EHCI controller"
-
-#string STR_MODULE_DESCRIPTION #language en-US "Implements the interfaces for monitoring the status of all ports and transferring\n"
- "Control, Bulk, Interrupt and Isochronous requests to Usb2.0 device.<BR><BR>\n"
- "Note that EhciDxe driver is enhanced to guarantee that the EHCI controller get attached to the EHCI controller before the UHCI driver attaches to the companion UHCI controller. This method avoids the control transfer on a shared port between EHCI and a companion host controller when UHCI attaches earlier than EHCI and a USB 2.0 device inserts.<BR>"
-
diff --git a/MdeModulePkg/Bus/Pci/EhciDxe/EhciDxeExtra.uni b/MdeModulePkg/Bus/Pci/EhciDxe/EhciDxeExtra.uni
deleted file mode 100644
index 1d625a9f7b..0000000000
--- a/MdeModulePkg/Bus/Pci/EhciDxe/EhciDxeExtra.uni
+++ /dev/null
@@ -1,20 +0,0 @@
-// /** @file
-// EhciDxe Localized Strings and Content
-//
-// Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.<BR>
-//
-// 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
-// http://opensource.org/licenses/bsd-license.php
-//
-// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-//
-// **/
-
-#string STR_PROPERTIES_MODULE_NAME
-#language en-US
-"EHCI Controller DXE Driver"
-
-
diff --git a/MdeModulePkg/Bus/Pci/EhciDxe/EhciReg.c b/MdeModulePkg/Bus/Pci/EhciDxe/EhciReg.c
deleted file mode 100644
index 34836eccf5..0000000000
--- a/MdeModulePkg/Bus/Pci/EhciDxe/EhciReg.c
+++ /dev/null
@@ -1,666 +0,0 @@
-/** @file
-
- The EHCI register operation routines.
-
-Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>
-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
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-
-#include "Ehci.h"
-
-
-/**
- Read EHCI capability register.
-
- @param Ehc The EHCI device.
- @param Offset Capability register address.
-
- @return The register content read.
- @retval If err, return 0xffff.
-
-**/
-UINT32
-EhcReadCapRegister (
- IN USB2_HC_DEV *Ehc,
- IN UINT32 Offset
- )
-{
- UINT32 Data;
- EFI_STATUS Status;
-
- Status = Ehc->PciIo->Mem.Read (
- Ehc->PciIo,
- EfiPciIoWidthUint32,
- EHC_BAR_INDEX,
- (UINT64) Offset,
- 1,
- &Data
- );
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "EhcReadCapRegister: Pci Io read error - %r at %d\n", Status, Offset));
- Data = 0xFFFF;
- }
-
- return Data;
-}
-
-/**
- Read EHCI debug port register.
-
- @param Ehc The EHCI device.
- @param Offset Debug port register offset.
-
- @return The register content read.
- @retval If err, return 0xffff.
-
-**/
-UINT32
-EhcReadDbgRegister (
- IN USB2_HC_DEV *Ehc,
- IN UINT32 Offset
- )
-{
- UINT32 Data;
- EFI_STATUS Status;
-
- Status = Ehc->PciIo->Mem.Read (
- Ehc->PciIo,
- EfiPciIoWidthUint32,
- Ehc->DebugPortBarNum,
- Ehc->DebugPortOffset + Offset,
- 1,
- &Data
- );
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "EhcReadDbgRegister: Pci Io read error - %r at %d\n", Status, Offset));
- Data = 0xFFFF;
- }
-
- return Data;
-}
-
-
-/**
- Read EHCI Operation register.
-
- @param Ehc The EHCI device.
- @param Offset The operation register offset.
-
- @return The register content read.
- @retval If err, return 0xffff.
-
-**/
-UINT32
-EhcReadOpReg (
- IN USB2_HC_DEV *Ehc,
- IN UINT32 Offset
- )
-{
- UINT32 Data;
- EFI_STATUS Status;
-
- ASSERT (Ehc->CapLen != 0);
-
- Status = Ehc->PciIo->Mem.Read (
- Ehc->PciIo,
- EfiPciIoWidthUint32,
- EHC_BAR_INDEX,
- Ehc->CapLen + Offset,
- 1,
- &Data
- );
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "EhcReadOpReg: Pci Io Read error - %r at %d\n", Status, Offset));
- Data = 0xFFFF;
- }
-
- return Data;
-}
-
-
-/**
- Write the data to the EHCI operation register.
-
- @param Ehc The EHCI device.
- @param Offset EHCI operation register offset.
- @param Data The data to write.
-
-**/
-VOID
-EhcWriteOpReg (
- IN USB2_HC_DEV *Ehc,
- IN UINT32 Offset,
- IN UINT32 Data
- )
-{
- EFI_STATUS Status;
-
- ASSERT (Ehc->CapLen != 0);
-
- Status = Ehc->PciIo->Mem.Write (
- Ehc->PciIo,
- EfiPciIoWidthUint32,
- EHC_BAR_INDEX,
- Ehc->CapLen + Offset,
- 1,
- &Data
- );
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "EhcWriteOpReg: Pci Io Write error: %r at %d\n", Status, Offset));
- }
-}
-
-
-/**
- Set one bit of the operational register while keeping other bits.
-
- @param Ehc The EHCI device.
- @param Offset The offset of the operational register.
- @param Bit The bit mask of the register to set.
-
-**/
-VOID
-EhcSetOpRegBit (
- IN USB2_HC_DEV *Ehc,
- IN UINT32 Offset,
- IN UINT32 Bit
- )
-{
- UINT32 Data;
-
- Data = EhcReadOpReg (Ehc, Offset);
- Data |= Bit;
- EhcWriteOpReg (Ehc, Offset, Data);
-}
-
-
-/**
- Clear one bit of the operational register while keeping other bits.
-
- @param Ehc The EHCI device.
- @param Offset The offset of the operational register.
- @param Bit The bit mask of the register to clear.
-
-**/
-VOID
-EhcClearOpRegBit (
- IN USB2_HC_DEV *Ehc,
- IN UINT32 Offset,
- IN UINT32 Bit
- )
-{
- UINT32 Data;
-
- Data = EhcReadOpReg (Ehc, Offset);
- Data &= ~Bit;
- EhcWriteOpReg (Ehc, Offset, Data);
-}
-
-
-/**
- Wait the operation register's bit as specified by Bit
- to become set (or clear).
-
- @param Ehc The EHCI device.
- @param Offset The offset of the operation register.
- @param Bit The bit of the register to wait for.
- @param WaitToSet Wait the bit to set or clear.
- @param Timeout The time to wait before abort (in millisecond).
-
- @retval EFI_SUCCESS The bit successfully changed by host controller.
- @retval EFI_TIMEOUT The time out occurred.
-
-**/
-EFI_STATUS
-EhcWaitOpRegBit (
- IN USB2_HC_DEV *Ehc,
- IN UINT32 Offset,
- IN UINT32 Bit,
- IN BOOLEAN WaitToSet,
- IN UINT32 Timeout
- )
-{
- UINT32 Index;
-
- for (Index = 0; Index < Timeout / EHC_SYNC_POLL_INTERVAL + 1; Index++) {
- if (EHC_REG_BIT_IS_SET (Ehc, Offset, Bit) == WaitToSet) {
- return EFI_SUCCESS;
- }
-
- gBS->Stall (EHC_SYNC_POLL_INTERVAL);
- }
-
- return EFI_TIMEOUT;
-}
-
-
-/**
- Add support for UEFI Over Legacy (UoL) feature, stop
- the legacy USB SMI support.
-
- @param Ehc The EHCI device.
-
-**/
-VOID
-EhcClearLegacySupport (
- IN USB2_HC_DEV *Ehc
- )
-{
- UINT32 ExtendCap;
- EFI_PCI_IO_PROTOCOL *PciIo;
- UINT32 Value;
- UINT32 TimeOut;
-
- DEBUG ((EFI_D_INFO, "EhcClearLegacySupport: called to clear legacy support\n"));
-
- PciIo = Ehc->PciIo;
- ExtendCap = (Ehc->HcCapParams >> 8) & 0xFF;
-
- PciIo->Pci.Read (PciIo, EfiPciIoWidthUint32, ExtendCap, 1, &Value);
- PciIo->Pci.Read (PciIo, EfiPciIoWidthUint32, ExtendCap + 0x4, 1, &Value);
-
- PciIo->Pci.Read (PciIo, EfiPciIoWidthUint32, ExtendCap, 1, &Value);
- Value |= (0x1 << 24);
- PciIo->Pci.Write (PciIo, EfiPciIoWidthUint32, ExtendCap, 1, &Value);
-
- TimeOut = 40;
- while (TimeOut-- != 0) {
- gBS->Stall (500);
-
- PciIo->Pci.Read (PciIo, EfiPciIoWidthUint32, ExtendCap, 1, &Value);
-
- if ((Value & 0x01010000) == 0x01000000) {
- break;
- }
- }
-
- PciIo->Pci.Read (PciIo, EfiPciIoWidthUint32, ExtendCap, 1, &Value);
- PciIo->Pci.Read (PciIo, EfiPciIoWidthUint32, ExtendCap + 0x4, 1, &Value);
-}
-
-
-
-/**
- Set door bell and wait it to be ACKed by host controller.
- This function is used to synchronize with the hardware.
-
- @param Ehc The EHCI device.
- @param Timeout The time to wait before abort (in millisecond, ms).
-
- @retval EFI_SUCCESS Synchronized with the hardware.
- @retval EFI_TIMEOUT Time out happened while waiting door bell to set.
-
-**/
-EFI_STATUS
-EhcSetAndWaitDoorBell (
- IN USB2_HC_DEV *Ehc,
- IN UINT32 Timeout
- )
-{
- EFI_STATUS Status;
- UINT32 Data;
-
- EhcSetOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_IAAD);
-
- Status = EhcWaitOpRegBit (Ehc, EHC_USBSTS_OFFSET, USBSTS_IAA, TRUE, Timeout);
-
- //
- // ACK the IAA bit in USBSTS register. Make sure other
- // interrupt bits are not ACKed. These bits are WC (Write Clean).
- //
- Data = EhcReadOpReg (Ehc, EHC_USBSTS_OFFSET);
- Data &= ~USBSTS_INTACK_MASK;
- Data |= USBSTS_IAA;
-
- EhcWriteOpReg (Ehc, EHC_USBSTS_OFFSET, Data);
-
- return Status;
-}
-
-
-/**
- Clear all the interrutp status bits, these bits
- are Write-Clean.
-
- @param Ehc The EHCI device.
-
-**/
-VOID
-EhcAckAllInterrupt (
- IN USB2_HC_DEV *Ehc
- )
-{
- EhcWriteOpReg (Ehc, EHC_USBSTS_OFFSET, USBSTS_INTACK_MASK);
-}
-
-
-/**
- Enable the periodic schedule then wait EHC to
- actually enable it.
-
- @param Ehc The EHCI device.
- @param Timeout The time to wait before abort (in millisecond, ms).
-
- @retval EFI_SUCCESS The periodical schedule is enabled.
- @retval EFI_TIMEOUT Time out happened while enabling periodic schedule.
-
-**/
-EFI_STATUS
-EhcEnablePeriodSchd (
- IN USB2_HC_DEV *Ehc,
- IN UINT32 Timeout
- )
-{
- EFI_STATUS Status;
-
- EhcSetOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_ENABLE_PERIOD);
-
- Status = EhcWaitOpRegBit (Ehc, EHC_USBSTS_OFFSET, USBSTS_PERIOD_ENABLED, TRUE, Timeout);
- return Status;
-}
-
-
-/**
- Disable periodic schedule.
-
- @param Ehc The EHCI device.
- @param Timeout Time to wait before abort (in millisecond, ms).
-
- @retval EFI_SUCCESS Periodic schedule is disabled.
- @retval EFI_DEVICE_ERROR Fail to disable periodic schedule.
-
-**/
-EFI_STATUS
-EhcDisablePeriodSchd (
- IN USB2_HC_DEV *Ehc,
- IN UINT32 Timeout
- )
-{
- EFI_STATUS Status;
-
- EhcClearOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_ENABLE_PERIOD);
-
- Status = EhcWaitOpRegBit (Ehc, EHC_USBSTS_OFFSET, USBSTS_PERIOD_ENABLED, FALSE, Timeout);
- return Status;
-}
-
-
-
-/**
- Enable asynchrounous schedule.
-
- @param Ehc The EHCI device.
- @param Timeout Time to wait before abort.
-
- @retval EFI_SUCCESS The EHCI asynchronous schedule is enabled.
- @return Others Failed to enable the asynchronous scheudle.
-
-**/
-EFI_STATUS
-EhcEnableAsyncSchd (
- IN USB2_HC_DEV *Ehc,
- IN UINT32 Timeout
- )
-{
- EFI_STATUS Status;
-
- EhcSetOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_ENABLE_ASYNC);
-
- Status = EhcWaitOpRegBit (Ehc, EHC_USBSTS_OFFSET, USBSTS_ASYNC_ENABLED, TRUE, Timeout);
- return Status;
-}
-
-
-
-/**
- Disable asynchrounous schedule.
-
- @param Ehc The EHCI device.
- @param Timeout Time to wait before abort (in millisecond, ms).
-
- @retval EFI_SUCCESS The asynchronous schedule is disabled.
- @return Others Failed to disable the asynchronous schedule.
-
-**/
-EFI_STATUS
-EhcDisableAsyncSchd (
- IN USB2_HC_DEV *Ehc,
- IN UINT32 Timeout
- )
-{
- EFI_STATUS Status;
-
- EhcClearOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_ENABLE_ASYNC);
-
- Status = EhcWaitOpRegBit (Ehc, EHC_USBSTS_OFFSET, USBSTS_ASYNC_ENABLED, FALSE, Timeout);
- return Status;
-}
-
-
-
-/**
- Whether Ehc is halted.
-
- @param Ehc The EHCI device.
-
- @retval TRUE The controller is halted.
- @retval FALSE It isn't halted.
-
-**/
-BOOLEAN
-EhcIsHalt (
- IN USB2_HC_DEV *Ehc
- )
-{
- return EHC_REG_BIT_IS_SET (Ehc, EHC_USBSTS_OFFSET, USBSTS_HALT);
-}
-
-
-/**
- Whether system error occurred.
-
- @param Ehc The EHCI device.
-
- @return TRUE System error happened.
- @return FALSE No system error.
-
-**/
-BOOLEAN
-EhcIsSysError (
- IN USB2_HC_DEV *Ehc
- )
-{
- return EHC_REG_BIT_IS_SET (Ehc, EHC_USBSTS_OFFSET, USBSTS_SYS_ERROR);
-}
-
-
-/**
- Reset the host controller.
-
- @param Ehc The EHCI device.
- @param Timeout Time to wait before abort (in millisecond, ms).
-
- @retval EFI_SUCCESS The host controller is reset.
- @return Others Failed to reset the host.
-
-**/
-EFI_STATUS
-EhcResetHC (
- IN USB2_HC_DEV *Ehc,
- IN UINT32 Timeout
- )
-{
- EFI_STATUS Status;
-
- //
- // Host can only be reset when it is halt. If not so, halt it
- //
- if (!EHC_REG_BIT_IS_SET (Ehc, EHC_USBSTS_OFFSET, USBSTS_HALT)) {
- Status = EhcHaltHC (Ehc, Timeout);
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
- }
-
- EhcSetOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_RESET);
- Status = EhcWaitOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_RESET, FALSE, Timeout);
- return Status;
-}
-
-
-/**
- Halt the host controller.
-
- @param Ehc The EHCI device.
- @param Timeout Time to wait before abort.
-
- @retval EFI_SUCCESS The EHCI is halt.
- @retval EFI_TIMEOUT Failed to halt the controller before Timeout.
-
-**/
-EFI_STATUS
-EhcHaltHC (
- IN USB2_HC_DEV *Ehc,
- IN UINT32 Timeout
- )
-{
- EFI_STATUS Status;
-
- EhcClearOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_RUN);
- Status = EhcWaitOpRegBit (Ehc, EHC_USBSTS_OFFSET, USBSTS_HALT, TRUE, Timeout);
- return Status;
-}
-
-
-/**
- Set the EHCI to run.
-
- @param Ehc The EHCI device.
- @param Timeout Time to wait before abort.
-
- @retval EFI_SUCCESS The EHCI is running.
- @return Others Failed to set the EHCI to run.
-
-**/
-EFI_STATUS
-EhcRunHC (
- IN USB2_HC_DEV *Ehc,
- IN UINT32 Timeout
- )
-{
- EFI_STATUS Status;
-
- EhcSetOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_RUN);
- Status = EhcWaitOpRegBit (Ehc, EHC_USBSTS_OFFSET, USBSTS_HALT, FALSE, Timeout);
- return Status;
-}
-
-
-/**
- Initialize the HC hardware.
- EHCI spec lists the five things to do to initialize the hardware:
- 1. Program CTRLDSSEGMENT
- 2. Set USBINTR to enable interrupts
- 3. Set periodic list base
- 4. Set USBCMD, interrupt threshold, frame list size etc
- 5. Write 1 to CONFIGFLAG to route all ports to EHCI
-
- @param Ehc The EHCI device.
-
- @return EFI_SUCCESS The EHCI has come out of halt state.
- @return EFI_TIMEOUT Time out happened.
-
-**/
-EFI_STATUS
-EhcInitHC (
- IN USB2_HC_DEV *Ehc
- )
-{
- EFI_STATUS Status;
- UINT32 Index;
- UINT32 RegVal;
-
- // This ASSERT crashes the BeagleBoard. There is some issue in the USB stack.
- // This ASSERT needs to be removed so the BeagleBoard will boot. When we fix
- // the USB stack we can put this ASSERT back in
- // ASSERT (EhcIsHalt (Ehc));
-
- //
- // Allocate the periodic frame and associated memeory
- // management facilities if not already done.
- //
- if (Ehc->PeriodFrame != NULL) {
- EhcFreeSched (Ehc);
- }
-
- Status = EhcInitSched (Ehc);
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- //
- // 1. Clear USBINTR to disable all the interrupt. UEFI works by polling
- //
- EhcWriteOpReg (Ehc, EHC_USBINTR_OFFSET, 0);
-
- //
- // 2. Start the Host Controller
- //
- EhcSetOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_RUN);
-
- //
- // 3. Power up all ports if EHCI has Port Power Control (PPC) support
- //
- if (Ehc->HcStructParams & HCSP_PPC) {
- for (Index = 0; Index < (UINT8) (Ehc->HcStructParams & HCSP_NPORTS); Index++) {
- //
- // Do not clear port status bits on initialization. Otherwise devices will
- // not enumerate properly at startup.
- //
- RegVal = EhcReadOpReg(Ehc, (UINT32)(EHC_PORT_STAT_OFFSET + (4 * Index)));
- RegVal &= ~PORTSC_CHANGE_MASK;
- RegVal |= PORTSC_POWER;
- EhcWriteOpReg (Ehc, (UINT32) (EHC_PORT_STAT_OFFSET + (4 * Index)), RegVal);
- }
- }
-
- //
- // Wait roothub port power stable
- //
- gBS->Stall (EHC_ROOT_PORT_RECOVERY_STALL);
-
- //
- // 4. Set all ports routing to EHC
- //
- EhcSetOpRegBit (Ehc, EHC_CONFIG_FLAG_OFFSET, CONFIGFLAG_ROUTE_EHC);
-
- Status = EhcEnablePeriodSchd (Ehc, EHC_GENERIC_TIMEOUT);
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "EhcInitHC: failed to enable period schedule\n"));
- return Status;
- }
-
- Status = EhcEnableAsyncSchd (Ehc, EHC_GENERIC_TIMEOUT);
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "EhcInitHC: failed to enable async schedule\n"));
- return Status;
- }
-
- return EFI_SUCCESS;
-}
diff --git a/MdeModulePkg/Bus/Pci/EhciDxe/EhciReg.h b/MdeModulePkg/Bus/Pci/EhciDxe/EhciReg.h
deleted file mode 100644
index 2347ee125f..0000000000
--- a/MdeModulePkg/Bus/Pci/EhciDxe/EhciReg.h
+++ /dev/null
@@ -1,363 +0,0 @@
-/** @file
-
- This file contains the definination for host controller register operation routines.
-
-Copyright (c) 2007 - 2012, Intel Corporation. All rights reserved.<BR>
-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
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef _EFI_EHCI_REG_H_
-#define _EFI_EHCI_REG_H_
-
-//
-// EHCI register offset
-//
-
-
-//
-// Capability register offset
-//
-#define EHC_CAPLENGTH_OFFSET 0 // Capability register length offset
-#define EHC_HCSPARAMS_OFFSET 0x04 // Structural Parameters 04-07h
-#define EHC_HCCPARAMS_OFFSET 0x08 // Capability parameters offset
-
-//
-// Capability register bit definition
-//
-#define HCSP_NPORTS 0x0F // Number of root hub port
-#define HCSP_PPC 0x10 // Port Power Control
-#define HCCP_64BIT 0x01 // 64-bit addressing capability
-
-//
-// Operational register offset
-//
-#define EHC_USBCMD_OFFSET 0x0 // USB command register offset
-#define EHC_USBSTS_OFFSET 0x04 // Statue register offset
-#define EHC_USBINTR_OFFSET 0x08 // USB interrutp offset
-#define EHC_FRINDEX_OFFSET 0x0C // Frame index offset
-#define EHC_CTRLDSSEG_OFFSET 0x10 // Control data structure segment offset
-#define EHC_FRAME_BASE_OFFSET 0x14 // Frame list base address offset
-#define EHC_ASYNC_HEAD_OFFSET 0x18 // Next asynchronous list address offset
-#define EHC_CONFIG_FLAG_OFFSET 0x40 // Configure flag register offset
-#define EHC_PORT_STAT_OFFSET 0x44 // Port status/control offset
-
-#define EHC_FRAME_LEN 1024
-
-//
-// Register bit definition
-//
-#define CONFIGFLAG_ROUTE_EHC 0x01 // Route port to EHC
-
-#define USBCMD_RUN 0x01 // Run/stop
-#define USBCMD_RESET 0x02 // Start the host controller reset
-#define USBCMD_ENABLE_PERIOD 0x10 // Enable periodic schedule
-#define USBCMD_ENABLE_ASYNC 0x20 // Enable asynchronous schedule
-#define USBCMD_IAAD 0x40 // Interrupt on async advance doorbell
-
-#define USBSTS_IAA 0x20 // Interrupt on async advance
-#define USBSTS_PERIOD_ENABLED 0x4000 // Periodic schedule status
-#define USBSTS_ASYNC_ENABLED 0x8000 // Asynchronous schedule status
-#define USBSTS_HALT 0x1000 // Host controller halted
-#define USBSTS_SYS_ERROR 0x10 // Host system error
-#define USBSTS_INTACK_MASK 0x003F // Mask for the interrupt ACK, the WC
- // (write clean) bits in USBSTS register
-
-#define PORTSC_CONN 0x01 // Current Connect Status
-#define PORTSC_CONN_CHANGE 0x02 // Connect Status Change
-#define PORTSC_ENABLED 0x04 // Port Enable / Disable
-#define PORTSC_ENABLE_CHANGE 0x08 // Port Enable / Disable Change
-#define PORTSC_OVERCUR 0x10 // Over current Active
-#define PORTSC_OVERCUR_CHANGE 0x20 // Over current Change
-#define PORSTSC_RESUME 0x40 // Force Port Resume
-#define PORTSC_SUSPEND 0x80 // Port Suspend State
-#define PORTSC_RESET 0x100 // Port Reset
-#define PORTSC_LINESTATE_K 0x400 // Line Status K-state
-#define PORTSC_LINESTATE_J 0x800 // Line Status J-state
-#define PORTSC_POWER 0x1000 // Port Power
-#define PORTSC_OWNER 0x2000 // Port Owner
-#define PORTSC_CHANGE_MASK 0x2A // Mask of the port change bits,
- // they are WC (write clean)
-//
-// PCI Configuration Registers
-//
-#define EHC_BAR_INDEX 0 // how many bytes away from USB_BASE to 0x10
-
-//
-// Debug port capability id
-//
-#define EHC_DEBUG_PORT_CAP_ID 0x0A
-
-#define EHC_LINK_TERMINATED(Link) (((Link) & 0x01) != 0)
-
-#define EHC_ADDR(High, QhHw32) \
- ((VOID *) (UINTN) (LShiftU64 ((High), 32) | ((QhHw32) & 0xFFFFFFF0)))
-
-#define EHCI_IS_DATAIN(EndpointAddr) EHC_BIT_IS_SET((EndpointAddr), 0x80)
-
-//
-// Structure to map the hardware port states to the
-// UEFI's port states.
-//
-typedef struct {
- UINT16 HwState;
- UINT16 UefiState;
-} USB_PORT_STATE_MAP;
-
-//
-// Ehci Data and Ctrl Structures
-//
-#pragma pack(1)
-typedef struct {
- UINT8 ProgInterface;
- UINT8 SubClassCode;
- UINT8 BaseCode;
-} USB_CLASSC;
-#pragma pack()
-
-/**
- Read EHCI capability register.
-
- @param Ehc The EHCI device.
- @param Offset Capability register address.
-
- @return The register content.
-
-**/
-UINT32
-EhcReadCapRegister (
- IN USB2_HC_DEV *Ehc,
- IN UINT32 Offset
- );
-
-/**
- Read EHCI debug port register.
-
- @param Ehc The EHCI device.
- @param Offset Debug port register address.
-
- @return The register content read.
- @retval If err, return 0xffff.
-
-**/
-UINT32
-EhcReadDbgRegister (
- IN USB2_HC_DEV *Ehc,
- IN UINT32 Offset
- );
-
-/**
- Read EHCI Operation register.
-
- @param Ehc The EHCI device.
- @param Offset The operation register offset.
-
- @return The register content.
-
-**/
-UINT32
-EhcReadOpReg (
- IN USB2_HC_DEV *Ehc,
- IN UINT32 Offset
- );
-
-
-/**
- Write the data to the EHCI operation register.
-
- @param Ehc The EHCI device.
- @param Offset EHCI operation register offset.
- @param Data The data to write.
-
-**/
-VOID
-EhcWriteOpReg (
- IN USB2_HC_DEV *Ehc,
- IN UINT32 Offset,
- IN UINT32 Data
- );
-
-/**
- Set one bit of the operational register while keeping other bits.
-
- @param Ehc The EHCI device.
- @param Offset The offset of the operational register.
- @param Bit The bit mask of the register to set.
-
-**/
-VOID
-EhcSetOpRegBit (
- IN USB2_HC_DEV *Ehc,
- IN UINT32 Offset,
- IN UINT32 Bit
- );
-
-/**
- Clear one bit of the operational register while keeping other bits.
-
- @param Ehc The EHCI device.
- @param Offset The offset of the operational register.
- @param Bit The bit mask of the register to clear.
-
-**/
-VOID
-EhcClearOpRegBit (
- IN USB2_HC_DEV *Ehc,
- IN UINT32 Offset,
- IN UINT32 Bit
- );
-
-/**
- Add support for UEFI Over Legacy (UoL) feature, stop
- the legacy USB SMI support.
-
- @param Ehc The EHCI device.
-
-**/
-VOID
-EhcClearLegacySupport (
- IN USB2_HC_DEV *Ehc
- );
-
-
-
-/**
- Set door bell and wait it to be ACKed by host controller.
- This function is used to synchronize with the hardware.
-
- @param Ehc The EHCI device.
- @param Timeout The time to wait before abort (in millisecond, ms).
-
- @retval EFI_SUCCESS Synchronized with the hardware.
- @retval EFI_TIMEOUT Time out happened while waiting door bell to set.
-
-**/
-EFI_STATUS
-EhcSetAndWaitDoorBell (
- IN USB2_HC_DEV *Ehc,
- IN UINT32 Timeout
- );
-
-
-/**
- Clear all the interrutp status bits, these bits are Write-Clean.
-
- @param Ehc The EHCI device.
-
-**/
-VOID
-EhcAckAllInterrupt (
- IN USB2_HC_DEV *Ehc
- );
-
-
-
-/**
- Whether Ehc is halted.
-
- @param Ehc The EHCI device.
-
- @retval TRUE The controller is halted.
- @retval FALSE It isn't halted.
-
-**/
-BOOLEAN
-EhcIsHalt (
- IN USB2_HC_DEV *Ehc
- );
-
-
-/**
- Whether system error occurred.
-
- @param Ehc The EHCI device.
-
- @retval TRUE System error happened.
- @retval FALSE No system error.
-
-**/
-BOOLEAN
-EhcIsSysError (
- IN USB2_HC_DEV *Ehc
- );
-
-
-/**
- Reset the host controller.
-
- @param Ehc The EHCI device.
- @param Timeout Time to wait before abort (in millisecond, ms).
-
- @retval EFI_SUCCESS The host controller is reset.
- @return Others Failed to reset the host.
-
-**/
-EFI_STATUS
-EhcResetHC (
- IN USB2_HC_DEV *Ehc,
- IN UINT32 Timeout
- );
-
-
-/**
- Halt the host controller.
-
- @param Ehc The EHCI device.
- @param Timeout Time to wait before abort.
-
- @return EFI_SUCCESS The EHCI is halt.
- @return EFI_TIMEOUT Failed to halt the controller before Timeout.
-
-**/
-EFI_STATUS
-EhcHaltHC (
- IN USB2_HC_DEV *Ehc,
- IN UINT32 Timeout
- );
-
-
-/**
- Set the EHCI to run.
-
- @param Ehc The EHCI device.
- @param Timeout Time to wait before abort.
-
- @return EFI_SUCCESS The EHCI is running.
- @return Others Failed to set the EHCI to run.
-
-**/
-EFI_STATUS
-EhcRunHC (
- IN USB2_HC_DEV *Ehc,
- IN UINT32 Timeout
- );
-
-
-
-/**
- Initialize the HC hardware.
- EHCI spec lists the five things to do to initialize the hardware:
- 1. Program CTRLDSSEGMENT
- 2. Set USBINTR to enable interrupts
- 3. Set periodic list base
- 4. Set USBCMD, interrupt threshold, frame list size etc
- 5. Write 1 to CONFIGFLAG to route all ports to EHCI
-
- @param Ehc The EHCI device.
-
- @return EFI_SUCCESS The EHCI has come out of halt state.
- @return EFI_TIMEOUT Time out happened.
-
-**/
-EFI_STATUS
-EhcInitHC (
- IN USB2_HC_DEV *Ehc
- );
-
-#endif
diff --git a/MdeModulePkg/Bus/Pci/EhciDxe/EhciSched.c b/MdeModulePkg/Bus/Pci/EhciDxe/EhciSched.c
deleted file mode 100644
index 036c00b32b..0000000000
--- a/MdeModulePkg/Bus/Pci/EhciDxe/EhciSched.c
+++ /dev/null
@@ -1,1052 +0,0 @@
-/** @file
-
- EHCI transfer scheduling routines.
-
-Copyright (c) 2007 - 2013, Intel Corporation. All rights reserved.<BR>
-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
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#include "Ehci.h"
-
-
-/**
- Create helper QTD/QH for the EHCI device.
-
- @param Ehc The EHCI device.
-
- @retval EFI_OUT_OF_RESOURCES Failed to allocate resource for helper QTD/QH.
- @retval EFI_SUCCESS Helper QH/QTD are created.
-
-**/
-EFI_STATUS
-EhcCreateHelpQ (
- IN USB2_HC_DEV *Ehc
- )
-{
- USB_ENDPOINT Ep;
- EHC_QH *Qh;
- QH_HW *QhHw;
- EHC_QTD *Qtd;
- EFI_PHYSICAL_ADDRESS PciAddr;
-
- //
- // Create an inactive Qtd to terminate the short packet read.
- //
- Qtd = EhcCreateQtd (Ehc, NULL, NULL, 0, QTD_PID_INPUT, 0, 64);
-
- if (Qtd == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- Qtd->QtdHw.Status = QTD_STAT_HALTED;
- Ehc->ShortReadStop = Qtd;
-
- //
- // Create a QH to act as the EHC reclamation header.
- // Set the header to loopback to itself.
- //
- Ep.DevAddr = 0;
- Ep.EpAddr = 1;
- Ep.Direction = EfiUsbDataIn;
- Ep.DevSpeed = EFI_USB_SPEED_HIGH;
- Ep.MaxPacket = 64;
- Ep.HubAddr = 0;
- Ep.HubPort = 0;
- Ep.Toggle = 0;
- Ep.Type = EHC_BULK_TRANSFER;
- Ep.PollRate = 1;
-
- Qh = EhcCreateQh (Ehc, &Ep);
-
- if (Qh == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Qh, sizeof (EHC_QH));
- QhHw = &Qh->QhHw;
- QhHw->HorizonLink = QH_LINK (PciAddr + OFFSET_OF(EHC_QH, QhHw), EHC_TYPE_QH, FALSE);
- QhHw->Status = QTD_STAT_HALTED;
- QhHw->ReclaimHead = 1;
- Qh->NextQh = Qh;
- Ehc->ReclaimHead = Qh;
-
- //
- // Create a dummy QH to act as the terminator for periodical schedule
- //
- Ep.EpAddr = 2;
- Ep.Type = EHC_INT_TRANSFER_SYNC;
-
- Qh = EhcCreateQh (Ehc, &Ep);
-
- if (Qh == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- Qh->QhHw.Status = QTD_STAT_HALTED;
- Ehc->PeriodOne = Qh;
-
- return EFI_SUCCESS;
-}
-
-
-/**
- Initialize the schedule data structure such as frame list.
-
- @param Ehc The EHCI device to init schedule data.
-
- @retval EFI_OUT_OF_RESOURCES Failed to allocate resource to init schedule data.
- @retval EFI_SUCCESS The schedule data is initialized.
-
-**/
-EFI_STATUS
-EhcInitSched (
- IN USB2_HC_DEV *Ehc
- )
-{
- EFI_PCI_IO_PROTOCOL *PciIo;
- VOID *Buf;
- EFI_PHYSICAL_ADDRESS PhyAddr;
- VOID *Map;
- UINTN Pages;
- UINTN Bytes;
- UINTN Index;
- EFI_STATUS Status;
- EFI_PHYSICAL_ADDRESS PciAddr;
-
- //
- // First initialize the periodical schedule data:
- // 1. Allocate and map the memory for the frame list
- // 2. Create the help QTD/QH
- // 3. Initialize the frame entries
- // 4. Set the frame list register
- //
- PciIo = Ehc->PciIo;
-
- Bytes = 4096;
- Pages = EFI_SIZE_TO_PAGES (Bytes);
-
- Status = PciIo->AllocateBuffer (
- PciIo,
- AllocateAnyPages,
- EfiBootServicesData,
- Pages,
- &Buf,
- 0
- );
-
- if (EFI_ERROR (Status)) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- Status = PciIo->Map (
- PciIo,
- EfiPciIoOperationBusMasterCommonBuffer,
- Buf,
- &Bytes,
- &PhyAddr,
- &Map
- );
-
- if (EFI_ERROR (Status) || (Bytes != 4096)) {
- PciIo->FreeBuffer (PciIo, Pages, Buf);
- return EFI_OUT_OF_RESOURCES;
- }
-
- Ehc->PeriodFrame = Buf;
- Ehc->PeriodFrameMap = Map;
-
- //
- // Program the FRAMELISTBASE register with the low 32 bit addr
- //
- EhcWriteOpReg (Ehc, EHC_FRAME_BASE_OFFSET, EHC_LOW_32BIT (PhyAddr));
- //
- // Program the CTRLDSSEGMENT register with the high 32 bit addr
- //
- EhcWriteOpReg (Ehc, EHC_CTRLDSSEG_OFFSET, EHC_HIGH_32BIT (PhyAddr));
-
- //
- // Init memory pool management then create the helper
- // QTD/QH. If failed, previously allocated resources
- // will be freed by EhcFreeSched
- //
- Ehc->MemPool = UsbHcInitMemPool (
- PciIo,
- Ehc->Support64BitDma,
- EHC_HIGH_32BIT (PhyAddr)
- );
-
- if (Ehc->MemPool == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto ErrorExit1;
- }
-
- Status = EhcCreateHelpQ (Ehc);
-
- if (EFI_ERROR (Status)) {
- goto ErrorExit;
- }
-
- //
- // Initialize the frame list entries then set the registers
- //
- Ehc->PeriodFrameHost = AllocateZeroPool (EHC_FRAME_LEN * sizeof (UINTN));
- if (Ehc->PeriodFrameHost == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto ErrorExit;
- }
-
- PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Ehc->PeriodOne, sizeof (EHC_QH));
-
- for (Index = 0; Index < EHC_FRAME_LEN; Index++) {
- //
- // Store the pci bus address of the QH in period frame list which will be accessed by pci bus master.
- //
- ((UINT32 *)(Ehc->PeriodFrame))[Index] = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);
- //
- // Store the host address of the QH in period frame list which will be accessed by host.
- //
- ((UINTN *)(Ehc->PeriodFrameHost))[Index] = (UINTN)Ehc->PeriodOne;
- }
-
- //
- // Second initialize the asynchronous schedule:
- // Only need to set the AsynListAddr register to
- // the reclamation header
- //
- PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Ehc->ReclaimHead, sizeof (EHC_QH));
- EhcWriteOpReg (Ehc, EHC_ASYNC_HEAD_OFFSET, EHC_LOW_32BIT (PciAddr));
- return EFI_SUCCESS;
-
-ErrorExit:
- if (Ehc->PeriodOne != NULL) {
- UsbHcFreeMem (Ehc->MemPool, Ehc->PeriodOne, sizeof (EHC_QH));
- Ehc->PeriodOne = NULL;
- }
-
- if (Ehc->ReclaimHead != NULL) {
- UsbHcFreeMem (Ehc->MemPool, Ehc->ReclaimHead, sizeof (EHC_QH));
- Ehc->ReclaimHead = NULL;
- }
-
- if (Ehc->ShortReadStop != NULL) {
- UsbHcFreeMem (Ehc->MemPool, Ehc->ShortReadStop, sizeof (EHC_QTD));
- Ehc->ShortReadStop = NULL;
- }
-
-ErrorExit1:
- PciIo->FreeBuffer (PciIo, Pages, Buf);
- PciIo->Unmap (PciIo, Map);
-
- return Status;
-}
-
-
-/**
- Free the schedule data. It may be partially initialized.
-
- @param Ehc The EHCI device.
-
-**/
-VOID
-EhcFreeSched (
- IN USB2_HC_DEV *Ehc
- )
-{
- EFI_PCI_IO_PROTOCOL *PciIo;
-
- EhcWriteOpReg (Ehc, EHC_FRAME_BASE_OFFSET, 0);
- EhcWriteOpReg (Ehc, EHC_ASYNC_HEAD_OFFSET, 0);
-
- if (Ehc->PeriodOne != NULL) {
- UsbHcFreeMem (Ehc->MemPool, Ehc->PeriodOne, sizeof (EHC_QH));
- Ehc->PeriodOne = NULL;
- }
-
- if (Ehc->ReclaimHead != NULL) {
- UsbHcFreeMem (Ehc->MemPool, Ehc->ReclaimHead, sizeof (EHC_QH));
- Ehc->ReclaimHead = NULL;
- }
-
- if (Ehc->ShortReadStop != NULL) {
- UsbHcFreeMem (Ehc->MemPool, Ehc->ShortReadStop, sizeof (EHC_QTD));
- Ehc->ShortReadStop = NULL;
- }
-
- if (Ehc->MemPool != NULL) {
- UsbHcFreeMemPool (Ehc->MemPool);
- Ehc->MemPool = NULL;
- }
-
- if (Ehc->PeriodFrame != NULL) {
- PciIo = Ehc->PciIo;
- ASSERT (PciIo != NULL);
-
- PciIo->Unmap (PciIo, Ehc->PeriodFrameMap);
-
- PciIo->FreeBuffer (
- PciIo,
- EFI_SIZE_TO_PAGES (EFI_PAGE_SIZE),
- Ehc->PeriodFrame
- );
-
- Ehc->PeriodFrame = NULL;
- }
-
- if (Ehc->PeriodFrameHost != NULL) {
- FreePool (Ehc->PeriodFrameHost);
- Ehc->PeriodFrameHost = NULL;
- }
-}
-
-
-/**
- Link the queue head to the asynchronous schedule list.
- UEFI only supports one CTRL/BULK transfer at a time
- due to its interfaces. This simplifies the AsynList
- management: A reclamation header is always linked to
- the AsyncListAddr, the only active QH is appended to it.
-
- @param Ehc The EHCI device.
- @param Qh The queue head to link.
-
-**/
-VOID
-EhcLinkQhToAsync (
- IN USB2_HC_DEV *Ehc,
- IN EHC_QH *Qh
- )
-{
- EHC_QH *Head;
- EFI_PHYSICAL_ADDRESS PciAddr;
-
- //
- // Append the queue head after the reclaim header, then
- // fix the hardware visiable parts (EHCI R1.0 page 72).
- // ReclaimHead is always linked to the EHCI's AsynListAddr.
- //
- Head = Ehc->ReclaimHead;
-
- Qh->NextQh = Head->NextQh;
- Head->NextQh = Qh;
-
- PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Qh->NextQh, sizeof (EHC_QH));
- Qh->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);
- PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Head->NextQh, sizeof (EHC_QH));
- Head->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);
-}
-
-
-/**
- Unlink a queue head from the asynchronous schedule list.
- Need to synchronize with hardware.
-
- @param Ehc The EHCI device.
- @param Qh The queue head to unlink.
-
-**/
-VOID
-EhcUnlinkQhFromAsync (
- IN USB2_HC_DEV *Ehc,
- IN EHC_QH *Qh
- )
-{
- EHC_QH *Head;
- EFI_STATUS Status;
- EFI_PHYSICAL_ADDRESS PciAddr;
-
- ASSERT (Ehc->ReclaimHead->NextQh == Qh);
-
- //
- // Remove the QH from reclamation head, then update the hardware
- // visiable part: Only need to loopback the ReclaimHead. The Qh
- // is pointing to ReclaimHead (which is staill in the list).
- //
- Head = Ehc->ReclaimHead;
-
- Head->NextQh = Qh->NextQh;
- Qh->NextQh = NULL;
-
- PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Head->NextQh, sizeof (EHC_QH));
- Head->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);
-
- //
- // Set and wait the door bell to synchronize with the hardware
- //
- Status = EhcSetAndWaitDoorBell (Ehc, EHC_GENERIC_TIMEOUT);
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "EhcUnlinkQhFromAsync: Failed to synchronize with doorbell\n"));
- }
-}
-
-
-/**
- Link a queue head for interrupt transfer to the periodic
- schedule frame list. This code is very much the same as
- that in UHCI.
-
- @param Ehc The EHCI device.
- @param Qh The queue head to link.
-
-**/
-VOID
-EhcLinkQhToPeriod (
- IN USB2_HC_DEV *Ehc,
- IN EHC_QH *Qh
- )
-{
- UINTN Index;
- EHC_QH *Prev;
- EHC_QH *Next;
- EFI_PHYSICAL_ADDRESS PciAddr;
-
- for (Index = 0; Index < EHC_FRAME_LEN; Index += Qh->Interval) {
- //
- // First QH can't be NULL because we always keep PeriodOne
- // heads on the frame list
- //
- ASSERT (!EHC_LINK_TERMINATED (((UINT32*)Ehc->PeriodFrame)[Index]));
- Next = (EHC_QH*)((UINTN*)Ehc->PeriodFrameHost)[Index];
- Prev = NULL;
-
- //
- // Now, insert the queue head (Qh) into this frame:
- // 1. Find a queue head with the same poll interval, just insert
- // Qh after this queue head, then we are done.
- //
- // 2. Find the position to insert the queue head into:
- // Previous head's interval is bigger than Qh's
- // Next head's interval is less than Qh's
- // Then, insert the Qh between then
- //
- while (Next->Interval > Qh->Interval) {
- Prev = Next;
- Next = Next->NextQh;
- }
-
- ASSERT (Next != NULL);
-
- //
- // The entry may have been linked into the frame by early insertation.
- // For example: if insert a Qh with Qh.Interval == 4, and there is a Qh
- // with Qh.Interval == 8 on the frame. If so, we are done with this frame.
- // It isn't necessary to compare all the QH with the same interval to
- // Qh. This is because if there is other QH with the same interval, Qh
- // should has been inserted after that at Frames[0] and at Frames[0] it is
- // impossible for (Next == Qh)
- //
- if (Next == Qh) {
- continue;
- }
-
- if (Next->Interval == Qh->Interval) {
- //
- // If there is a QH with the same interval, it locates at
- // Frames[0], and we can simply insert it after this QH. We
- // are all done.
- //
- ASSERT ((Index == 0) && (Qh->NextQh == NULL));
-
- Prev = Next;
- Next = Next->NextQh;
-
- Qh->NextQh = Next;
- Prev->NextQh = Qh;
-
- Qh->QhHw.HorizonLink = Prev->QhHw.HorizonLink;
- PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Qh, sizeof (EHC_QH));
- Prev->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);
- break;
- }
-
- //
- // OK, find the right position, insert it in. If Qh's next
- // link has already been set, it is in position. This is
- // guarranted by 2^n polling interval.
- //
- if (Qh->NextQh == NULL) {
- Qh->NextQh = Next;
- PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Next, sizeof (EHC_QH));
- Qh->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);
- }
-
- PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Qh, sizeof (EHC_QH));
-
- if (Prev == NULL) {
- ((UINT32*)Ehc->PeriodFrame)[Index] = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);
- ((UINTN*)Ehc->PeriodFrameHost)[Index] = (UINTN)Qh;
- } else {
- Prev->NextQh = Qh;
- Prev->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);
- }
- }
-}
-
-
-/**
- Unlink an interrupt queue head from the periodic
- schedule frame list.
-
- @param Ehc The EHCI device.
- @param Qh The queue head to unlink.
-
-**/
-VOID
-EhcUnlinkQhFromPeriod (
- IN USB2_HC_DEV *Ehc,
- IN EHC_QH *Qh
- )
-{
- UINTN Index;
- EHC_QH *Prev;
- EHC_QH *This;
-
- for (Index = 0; Index < EHC_FRAME_LEN; Index += Qh->Interval) {
- //
- // Frame link can't be NULL because we always keep PeroidOne
- // on the frame list
- //
- ASSERT (!EHC_LINK_TERMINATED (((UINT32*)Ehc->PeriodFrame)[Index]));
- This = (EHC_QH*)((UINTN*)Ehc->PeriodFrameHost)[Index];
- Prev = NULL;
-
- //
- // Walk through the frame's QH list to find the
- // queue head to remove
- //
- while ((This != NULL) && (This != Qh)) {
- Prev = This;
- This = This->NextQh;
- }
-
- //
- // Qh may have already been unlinked from this frame
- // by early action. See the comments in EhcLinkQhToPeriod.
- //
- if (This == NULL) {
- continue;
- }
-
- if (Prev == NULL) {
- //
- // Qh is the first entry in the frame
- //
- ((UINT32*)Ehc->PeriodFrame)[Index] = Qh->QhHw.HorizonLink;
- ((UINTN*)Ehc->PeriodFrameHost)[Index] = (UINTN)Qh->NextQh;
- } else {
- Prev->NextQh = Qh->NextQh;
- Prev->QhHw.HorizonLink = Qh->QhHw.HorizonLink;
- }
- }
-}
-
-
-/**
- Check the URB's execution result and update the URB's
- result accordingly.
-
- @param Ehc The EHCI device.
- @param Urb The URB to check result.
-
- @return Whether the result of URB transfer is finialized.
-
-**/
-BOOLEAN
-EhcCheckUrbResult (
- IN USB2_HC_DEV *Ehc,
- IN URB *Urb
- )
-{
- LIST_ENTRY *Entry;
- EHC_QTD *Qtd;
- QTD_HW *QtdHw;
- UINT8 State;
- BOOLEAN Finished;
- EFI_PHYSICAL_ADDRESS PciAddr;
-
- ASSERT ((Ehc != NULL) && (Urb != NULL) && (Urb->Qh != NULL));
-
- Finished = TRUE;
- Urb->Completed = 0;
-
- Urb->Result = EFI_USB_NOERROR;
-
- if (EhcIsHalt (Ehc) || EhcIsSysError (Ehc)) {
- Urb->Result |= EFI_USB_ERR_SYSTEM;
- goto ON_EXIT;
- }
-
- EFI_LIST_FOR_EACH (Entry, &Urb->Qh->Qtds) {
- Qtd = EFI_LIST_CONTAINER (Entry, EHC_QTD, QtdList);
- QtdHw = &Qtd->QtdHw;
- State = (UINT8) QtdHw->Status;
-
- if (EHC_BIT_IS_SET (State, QTD_STAT_HALTED)) {
- //
- // EHCI will halt the queue head when met some error.
- // If it is halted, the result of URB is finialized.
- //
- if ((State & QTD_STAT_ERR_MASK) == 0) {
- Urb->Result |= EFI_USB_ERR_STALL;
- }
-
- if (EHC_BIT_IS_SET (State, QTD_STAT_BABBLE_ERR)) {
- Urb->Result |= EFI_USB_ERR_BABBLE;
- }
-
- if (EHC_BIT_IS_SET (State, QTD_STAT_BUFF_ERR)) {
- Urb->Result |= EFI_USB_ERR_BUFFER;
- }
-
- if (EHC_BIT_IS_SET (State, QTD_STAT_TRANS_ERR) && (QtdHw->ErrCnt == 0)) {
- Urb->Result |= EFI_USB_ERR_TIMEOUT;
- }
-
- Finished = TRUE;
- goto ON_EXIT;
-
- } else if (EHC_BIT_IS_SET (State, QTD_STAT_ACTIVE)) {
- //
- // The QTD is still active, no need to check furthur.
- //
- Urb->Result |= EFI_USB_ERR_NOTEXECUTE;
-
- Finished = FALSE;
- goto ON_EXIT;
-
- } else {
- //
- // This QTD is finished OK or met short packet read. Update the
- // transfer length if it isn't a setup.
- //
- if (QtdHw->Pid != QTD_PID_SETUP) {
- Urb->Completed += Qtd->DataLen - QtdHw->TotalBytes;
- }
-
- if ((QtdHw->TotalBytes != 0) && (QtdHw->Pid == QTD_PID_INPUT)) {
- EhcDumpQh (Urb->Qh, "Short packet read", FALSE);
-
- //
- // Short packet read condition. If it isn't a setup transfer,
- // no need to check furthur: the queue head will halt at the
- // ShortReadStop. If it is a setup transfer, need to check the
- // Status Stage of the setup transfer to get the finial result
- //
- PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Ehc->ShortReadStop, sizeof (EHC_QTD));
- if (QtdHw->AltNext == QTD_LINK (PciAddr, FALSE)) {
- DEBUG ((EFI_D_VERBOSE, "EhcCheckUrbResult: Short packet read, break\n"));
-
- Finished = TRUE;
- goto ON_EXIT;
- }
-
- DEBUG ((EFI_D_VERBOSE, "EhcCheckUrbResult: Short packet read, continue\n"));
- }
- }
- }
-
-ON_EXIT:
- //
- // Return the data toggle set by EHCI hardware, bulk and interrupt
- // transfer will use this to initialize the next transaction. For
- // Control transfer, it always start a new data toggle sequence for
- // new transfer.
- //
- // NOTICE: don't move DT update before the loop, otherwise there is
- // a race condition that DT is wrong.
- //
- Urb->DataToggle = (UINT8) Urb->Qh->QhHw.DataToggle;
-
- return Finished;
-}
-
-
-/**
- Execute the transfer by polling the URB. This is a synchronous operation.
-
- @param Ehc The EHCI device.
- @param Urb The URB to execute.
- @param TimeOut The time to wait before abort, in millisecond.
-
- @return EFI_DEVICE_ERROR The transfer failed due to transfer error.
- @return EFI_TIMEOUT The transfer failed due to time out.
- @return EFI_SUCCESS The transfer finished OK.
-
-**/
-EFI_STATUS
-EhcExecTransfer (
- IN USB2_HC_DEV *Ehc,
- IN URB *Urb,
- IN UINTN TimeOut
- )
-{
- EFI_STATUS Status;
- UINTN Index;
- UINTN Loop;
- BOOLEAN Finished;
- BOOLEAN InfiniteLoop;
-
- Status = EFI_SUCCESS;
- Loop = TimeOut * EHC_1_MILLISECOND;
- Finished = FALSE;
- InfiniteLoop = FALSE;
-
- //
- // According to UEFI spec section 16.2.4, If Timeout is 0, then the caller
- // must wait for the function to be completed until EFI_SUCCESS or EFI_DEVICE_ERROR
- // is returned.
- //
- if (TimeOut == 0) {
- InfiniteLoop = TRUE;
- }
-
- for (Index = 0; InfiniteLoop || (Index < Loop); Index++) {
- Finished = EhcCheckUrbResult (Ehc, Urb);
-
- if (Finished) {
- break;
- }
-
- gBS->Stall (EHC_1_MICROSECOND);
- }
-
- if (!Finished) {
- DEBUG ((EFI_D_ERROR, "EhcExecTransfer: transfer not finished in %dms\n", (UINT32)TimeOut));
- EhcDumpQh (Urb->Qh, NULL, FALSE);
-
- Status = EFI_TIMEOUT;
-
- } else if (Urb->Result != EFI_USB_NOERROR) {
- DEBUG ((EFI_D_ERROR, "EhcExecTransfer: transfer failed with %x\n", Urb->Result));
- EhcDumpQh (Urb->Qh, NULL, FALSE);
-
- Status = EFI_DEVICE_ERROR;
- }
-
- return Status;
-}
-
-
-/**
- Delete a single asynchronous interrupt transfer for
- the device and endpoint.
-
- @param Ehc The EHCI device.
- @param DevAddr The address of the target device.
- @param EpNum The endpoint of the target.
- @param DataToggle Return the next data toggle to use.
-
- @retval EFI_SUCCESS An asynchronous transfer is removed.
- @retval EFI_NOT_FOUND No transfer for the device is found.
-
-**/
-EFI_STATUS
-EhciDelAsyncIntTransfer (
- IN USB2_HC_DEV *Ehc,
- IN UINT8 DevAddr,
- IN UINT8 EpNum,
- OUT UINT8 *DataToggle
- )
-{
- LIST_ENTRY *Entry;
- LIST_ENTRY *Next;
- URB *Urb;
- EFI_USB_DATA_DIRECTION Direction;
-
- Direction = (((EpNum & 0x80) != 0) ? EfiUsbDataIn : EfiUsbDataOut);
- EpNum &= 0x0F;
-
- EFI_LIST_FOR_EACH_SAFE (Entry, Next, &Ehc->AsyncIntTransfers) {
- Urb = EFI_LIST_CONTAINER (Entry, URB, UrbList);
-
- if ((Urb->Ep.DevAddr == DevAddr) && (Urb->Ep.EpAddr == EpNum) &&
- (Urb->Ep.Direction == Direction)) {
- //
- // Check the URB status to retrieve the next data toggle
- // from the associated queue head.
- //
- EhcCheckUrbResult (Ehc, Urb);
- *DataToggle = Urb->DataToggle;
-
- EhcUnlinkQhFromPeriod (Ehc, Urb->Qh);
- RemoveEntryList (&Urb->UrbList);
-
- gBS->FreePool (Urb->Data);
- EhcFreeUrb (Ehc, Urb);
- return EFI_SUCCESS;
- }
- }
-
- return EFI_NOT_FOUND;
-}
-
-
-/**
- Remove all the asynchronous interrutp transfers.
-
- @param Ehc The EHCI device.
-
-**/
-VOID
-EhciDelAllAsyncIntTransfers (
- IN USB2_HC_DEV *Ehc
- )
-{
- LIST_ENTRY *Entry;
- LIST_ENTRY *Next;
- URB *Urb;
-
- EFI_LIST_FOR_EACH_SAFE (Entry, Next, &Ehc->AsyncIntTransfers) {
- Urb = EFI_LIST_CONTAINER (Entry, URB, UrbList);
-
- EhcUnlinkQhFromPeriod (Ehc, Urb->Qh);
- RemoveEntryList (&Urb->UrbList);
-
- gBS->FreePool (Urb->Data);
- EhcFreeUrb (Ehc, Urb);
- }
-}
-
-
-/**
- Flush data from PCI controller specific address to mapped system
- memory address.
-
- @param Ehc The EHCI device.
- @param Urb The URB to unmap.
-
- @retval EFI_SUCCESS Success to flush data to mapped system memory.
- @retval EFI_DEVICE_ERROR Fail to flush data to mapped system memory.
-
-**/
-EFI_STATUS
-EhcFlushAsyncIntMap (
- IN USB2_HC_DEV *Ehc,
- IN URB *Urb
- )
-{
- EFI_STATUS Status;
- EFI_PHYSICAL_ADDRESS PhyAddr;
- EFI_PCI_IO_PROTOCOL_OPERATION MapOp;
- EFI_PCI_IO_PROTOCOL *PciIo;
- UINTN Len;
- VOID *Map;
-
- PciIo = Ehc->PciIo;
- Len = Urb->DataLen;
-
- if (Urb->Ep.Direction == EfiUsbDataIn) {
- MapOp = EfiPciIoOperationBusMasterWrite;
- } else {
- MapOp = EfiPciIoOperationBusMasterRead;
- }
-
- Status = PciIo->Unmap (PciIo, Urb->DataMap);
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- Urb->DataMap = NULL;
-
- Status = PciIo->Map (PciIo, MapOp, Urb->Data, &Len, &PhyAddr, &Map);
- if (EFI_ERROR (Status) || (Len != Urb->DataLen)) {
- goto ON_ERROR;
- }
-
- Urb->DataPhy = (VOID *) ((UINTN) PhyAddr);
- Urb->DataMap = Map;
- return EFI_SUCCESS;
-
-ON_ERROR:
- return EFI_DEVICE_ERROR;
-}
-
-
-/**
- Update the queue head for next round of asynchronous transfer.
-
- @param Ehc The EHCI device.
- @param Urb The URB to update.
-
-**/
-VOID
-EhcUpdateAsyncRequest (
- IN USB2_HC_DEV *Ehc,
- IN URB *Urb
- )
-{
- LIST_ENTRY *Entry;
- EHC_QTD *FirstQtd;
- QH_HW *QhHw;
- EHC_QTD *Qtd;
- QTD_HW *QtdHw;
- UINTN Index;
- EFI_PHYSICAL_ADDRESS PciAddr;
-
- Qtd = NULL;
-
- if (Urb->Result == EFI_USB_NOERROR) {
- FirstQtd = NULL;
-
- EFI_LIST_FOR_EACH (Entry, &Urb->Qh->Qtds) {
- Qtd = EFI_LIST_CONTAINER (Entry, EHC_QTD, QtdList);
-
- if (FirstQtd == NULL) {
- FirstQtd = Qtd;
- }
-
- //
- // Update the QTD for next round of transfer. Host control
- // may change dt/Total Bytes to Transfer/C_Page/Cerr/Status/
- // Current Offset. These fields need to be updated. DT isn't
- // used by interrupt transfer. It uses DT in queue head.
- // Current Offset is in Page[0], only need to reset Page[0]
- // to initial data buffer.
- //
- QtdHw = &Qtd->QtdHw;
- QtdHw->Status = QTD_STAT_ACTIVE;
- QtdHw->ErrCnt = QTD_MAX_ERR;
- QtdHw->CurPage = 0;
- QtdHw->TotalBytes = (UINT32) Qtd->DataLen;
- //
- // calculate physical address by offset.
- //
- PciAddr = (UINTN)Urb->DataPhy + ((UINTN)Qtd->Data - (UINTN)Urb->Data);
- QtdHw->Page[0] = EHC_LOW_32BIT (PciAddr);
- QtdHw->PageHigh[0]= EHC_HIGH_32BIT (PciAddr);
- }
-
- //
- // Update QH for next round of transfer. Host control only
- // touch the fields in transfer overlay area. Only need to
- // zero out the overlay area and set NextQtd to the first
- // QTD. DateToggle bit is left untouched.
- //
- QhHw = &Urb->Qh->QhHw;
- QhHw->CurQtd = QTD_LINK (0, TRUE);
- QhHw->AltQtd = 0;
-
- QhHw->Status = 0;
- QhHw->Pid = 0;
- QhHw->ErrCnt = 0;
- QhHw->CurPage = 0;
- QhHw->Ioc = 0;
- QhHw->TotalBytes = 0;
-
- for (Index = 0; Index < 5; Index++) {
- QhHw->Page[Index] = 0;
- QhHw->PageHigh[Index] = 0;
- }
-
- PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, FirstQtd, sizeof (EHC_QTD));
- QhHw->NextQtd = QTD_LINK (PciAddr, FALSE);
- }
-
- return ;
-}
-
-
-/**
- Interrupt transfer periodic check handler.
-
- @param Event Interrupt event.
- @param Context Pointer to USB2_HC_DEV.
-
-**/
-VOID
-EFIAPI
-EhcMonitorAsyncRequests (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- USB2_HC_DEV *Ehc;
- EFI_TPL OldTpl;
- LIST_ENTRY *Entry;
- LIST_ENTRY *Next;
- BOOLEAN Finished;
- UINT8 *ProcBuf;
- URB *Urb;
- EFI_STATUS Status;
-
- OldTpl = gBS->RaiseTPL (EHC_TPL);
- Ehc = (USB2_HC_DEV *) Context;
-
- EFI_LIST_FOR_EACH_SAFE (Entry, Next, &Ehc->AsyncIntTransfers) {
- Urb = EFI_LIST_CONTAINER (Entry, URB, UrbList);
-
- //
- // Check the result of URB execution. If it is still
- // active, check the next one.
- //
- Finished = EhcCheckUrbResult (Ehc, Urb);
-
- if (!Finished) {
- continue;
- }
-
- //
- // Flush any PCI posted write transactions from a PCI host
- // bridge to system memory.
- //
- Status = EhcFlushAsyncIntMap (Ehc, Urb);
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "EhcMonitorAsyncRequests: Fail to Flush AsyncInt Mapped Memeory\n"));
- }
-
- //
- // Allocate a buffer then copy the transferred data for user.
- // If failed to allocate the buffer, update the URB for next
- // round of transfer. Ignore the data of this round.
- //
- ProcBuf = NULL;
-
- if (Urb->Result == EFI_USB_NOERROR) {
- ASSERT (Urb->Completed <= Urb->DataLen);
-
- ProcBuf = AllocatePool (Urb->Completed);
-
- if (ProcBuf == NULL) {
- EhcUpdateAsyncRequest (Ehc, Urb);
- continue;
- }
-
- CopyMem (ProcBuf, Urb->Data, Urb->Completed);
- }
-
- EhcUpdateAsyncRequest (Ehc, Urb);
-
- //
- // Leave error recovery to its related device driver. A
- // common case of the error recovery is to re-submit the
- // interrupt transfer which is linked to the head of the
- // list. This function scans from head to tail. So the
- // re-submitted interrupt transfer's callback function
- // will not be called again in this round. Don't touch this
- // URB after the callback, it may have been removed by the
- // callback.
- //
- if (Urb->Callback != NULL) {
- //
- // Restore the old TPL, USB bus maybe connect device in
- // his callback. Some drivers may has a lower TPL restriction.
- //
- gBS->RestoreTPL (OldTpl);
- (Urb->Callback) (ProcBuf, Urb->Completed, Urb->Context, Urb->Result);
- OldTpl = gBS->RaiseTPL (EHC_TPL);
- }
-
- if (ProcBuf != NULL) {
- FreePool (ProcBuf);
- }
- }
-
- gBS->RestoreTPL (OldTpl);
-}
diff --git a/MdeModulePkg/Bus/Pci/EhciDxe/EhciSched.h b/MdeModulePkg/Bus/Pci/EhciDxe/EhciSched.h
deleted file mode 100644
index c03bd619d7..0000000000
--- a/MdeModulePkg/Bus/Pci/EhciDxe/EhciSched.h
+++ /dev/null
@@ -1,180 +0,0 @@
-/** @file
-
- This file contains the definination for host controller schedule routines.
-
-Copyright (c) 2007 - 2009, Intel Corporation. All rights reserved.<BR>
-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
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef _EFI_EHCI_SCHED_H_
-#define _EFI_EHCI_SCHED_H_
-
-
-/**
- Initialize the schedule data structure such as frame list.
-
- @param Ehc The EHCI device to init schedule data for.
-
- @retval EFI_OUT_OF_RESOURCES Failed to allocate resource to init schedule data.
- @retval EFI_SUCCESS The schedule data is initialized.
-
-**/
-EFI_STATUS
-EhcInitSched (
- IN USB2_HC_DEV *Ehc
- );
-
-
-/**
- Free the schedule data. It may be partially initialized.
-
- @param Ehc The EHCI device.
-
-**/
-VOID
-EhcFreeSched (
- IN USB2_HC_DEV *Ehc
- );
-
-
-/**
- Link the queue head to the asynchronous schedule list.
- UEFI only supports one CTRL/BULK transfer at a time
- due to its interfaces. This simplifies the AsynList
- management: A reclamation header is always linked to
- the AsyncListAddr, the only active QH is appended to it.
-
- @param Ehc The EHCI device.
- @param Qh The queue head to link.
-
-**/
-VOID
-EhcLinkQhToAsync (
- IN USB2_HC_DEV *Ehc,
- IN EHC_QH *Qh
- );
-
-
-/**
- Unlink a queue head from the asynchronous schedule list.
- Need to synchronize with hardware.
-
- @param Ehc The EHCI device.
- @param Qh The queue head to unlink.
-
-**/
-VOID
-EhcUnlinkQhFromAsync (
- IN USB2_HC_DEV *Ehc,
- IN EHC_QH *Qh
- );
-
-
-/**
- Link a queue head for interrupt transfer to the periodic
- schedule frame list. This code is very much the same as
- that in UHCI.
-
- @param Ehc The EHCI device.
- @param Qh The queue head to link.
-
-**/
-VOID
-EhcLinkQhToPeriod (
- IN USB2_HC_DEV *Ehc,
- IN EHC_QH *Qh
- );
-
-
-/**
- Unlink an interrupt queue head from the periodic
- schedule frame list.
-
- @param Ehc The EHCI device.
- @param Qh The queue head to unlink.
-
-**/
-VOID
-EhcUnlinkQhFromPeriod (
- IN USB2_HC_DEV *Ehc,
- IN EHC_QH *Qh
- );
-
-
-
-/**
- Execute the transfer by polling the URB. This is a synchronous operation.
-
- @param Ehc The EHCI device.
- @param Urb The URB to execute.
- @param TimeOut The time to wait before abort, in millisecond.
-
- @retval EFI_DEVICE_ERROR The transfer failed due to transfer error.
- @retval EFI_TIMEOUT The transfer failed due to time out.
- @retval EFI_SUCCESS The transfer finished OK.
-
-**/
-EFI_STATUS
-EhcExecTransfer (
- IN USB2_HC_DEV *Ehc,
- IN URB *Urb,
- IN UINTN TimeOut
- );
-
-
-/**
- Delete a single asynchronous interrupt transfer for
- the device and endpoint.
-
- @param Ehc The EHCI device.
- @param DevAddr The address of the target device.
- @param EpNum The endpoint of the target.
- @param DataToggle Return the next data toggle to use.
-
- @retval EFI_SUCCESS An asynchronous transfer is removed.
- @retval EFI_NOT_FOUND No transfer for the device is found.
-
-**/
-EFI_STATUS
-EhciDelAsyncIntTransfer (
- IN USB2_HC_DEV *Ehc,
- IN UINT8 DevAddr,
- IN UINT8 EpNum,
- OUT UINT8 *DataToggle
- );
-
-
-/**
- Remove all the asynchronous interrutp transfers.
-
- @param Ehc The EHCI device.
-
-**/
-VOID
-EhciDelAllAsyncIntTransfers (
- IN USB2_HC_DEV *Ehc
- );
-
-
-/**
- Interrupt transfer periodic check handler.
-
- @param Event Interrupt event.
- @param Context Pointer to USB2_HC_DEV.
-
-**/
-VOID
-EFIAPI
-EhcMonitorAsyncRequests (
- IN EFI_EVENT Event,
- IN VOID *Context
- );
-
-#endif
diff --git a/MdeModulePkg/Bus/Pci/EhciDxe/EhciUrb.c b/MdeModulePkg/Bus/Pci/EhciDxe/EhciUrb.c
deleted file mode 100644
index 6afb327df1..0000000000
--- a/MdeModulePkg/Bus/Pci/EhciDxe/EhciUrb.c
+++ /dev/null
@@ -1,657 +0,0 @@
-/** @file
-
- This file contains URB request, each request is warpped in a
- URB (Usb Request Block).
-
-Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
-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
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#include "Ehci.h"
-
-
-/**
- Create a single QTD to hold the data.
-
- @param Ehc The EHCI device.
- @param Data The cpu memory address of current data not associated with a QTD.
- @param DataPhy The pci bus address of current data not associated with a QTD.
- @param DataLen The length of the data.
- @param PktId Packet ID to use in the QTD.
- @param Toggle Data toggle to use in the QTD.
- @param MaxPacket Maximu packet length of the endpoint.
-
- @return Created QTD or NULL if failed to create one.
-
-**/
-EHC_QTD *
-EhcCreateQtd (
- IN USB2_HC_DEV *Ehc,
- IN UINT8 *Data,
- IN UINT8 *DataPhy,
- IN UINTN DataLen,
- IN UINT8 PktId,
- IN UINT8 Toggle,
- IN UINTN MaxPacket
- )
-{
- EHC_QTD *Qtd;
- QTD_HW *QtdHw;
- UINTN Index;
- UINTN Len;
- UINTN ThisBufLen;
-
- ASSERT (Ehc != NULL);
-
- Qtd = UsbHcAllocateMem (Ehc->MemPool, sizeof (EHC_QTD));
-
- if (Qtd == NULL) {
- return NULL;
- }
-
- Qtd->Signature = EHC_QTD_SIG;
- Qtd->Data = Data;
- Qtd->DataLen = 0;
-
- InitializeListHead (&Qtd->QtdList);
-
- QtdHw = &Qtd->QtdHw;
- QtdHw->NextQtd = QTD_LINK (NULL, TRUE);
- QtdHw->AltNext = QTD_LINK (NULL, TRUE);
- QtdHw->Status = QTD_STAT_ACTIVE;
- QtdHw->Pid = PktId;
- QtdHw->ErrCnt = QTD_MAX_ERR;
- QtdHw->Ioc = 0;
- QtdHw->TotalBytes = 0;
- QtdHw->DataToggle = Toggle;
-
- //
- // Fill in the buffer points
- //
- if (Data != NULL) {
- Len = 0;
-
- for (Index = 0; Index <= QTD_MAX_BUFFER; Index++) {
- //
- // Set the buffer point (Check page 41 EHCI Spec 1.0). No need to
- // compute the offset and clear Reserved fields. This is already
- // done in the data point.
- //
- QtdHw->Page[Index] = EHC_LOW_32BIT (DataPhy);
- QtdHw->PageHigh[Index] = EHC_HIGH_32BIT (DataPhy);
-
- ThisBufLen = QTD_BUF_LEN - (EHC_LOW_32BIT (DataPhy) & QTD_BUF_MASK);
-
- if (Len + ThisBufLen >= DataLen) {
- Len = DataLen;
- break;
- }
-
- Len += ThisBufLen;
- Data += ThisBufLen;
- DataPhy += ThisBufLen;
- }
-
- //
- // Need to fix the last pointer if the Qtd can't hold all the
- // user's data to make sure that the length is in the unit of
- // max packets. If it can hold all the data, there is no such
- // need.
- //
- if (Len < DataLen) {
- Len = Len - Len % MaxPacket;
- }
-
- QtdHw->TotalBytes = (UINT32) Len;
- Qtd->DataLen = Len;
- }
-
- return Qtd;
-}
-
-
-
-/**
- Initialize the queue head for interrupt transfer,
- that is, initialize the following three fields:
- 1. SplitXState in the Status field
- 2. Microframe S-mask
- 3. Microframe C-mask
-
- @param Ep The queue head's related endpoint.
- @param QhHw The queue head to initialize.
-
-**/
-VOID
-EhcInitIntQh (
- IN USB_ENDPOINT *Ep,
- IN QH_HW *QhHw
- )
-{
- //
- // Because UEFI interface can't utilitize an endpoint with
- // poll rate faster than 1ms, only need to set one bit in
- // the queue head. simple. But it may be changed later. If
- // sub-1ms interrupt is supported, need to update the S-Mask
- // here
- //
- if (Ep->DevSpeed == EFI_USB_SPEED_HIGH) {
- QhHw->SMask = QH_MICROFRAME_0;
- return ;
- }
-
- //
- // For low/full speed device, the transfer must go through
- // the split transaction. Need to update three fields
- // 1. SplitXState in the status
- // 2. Microframe S-Mask
- // 3. Microframe C-Mask
- // UEFI USB doesn't exercise admission control. It simplely
- // schedule the high speed transactions in microframe 0, and
- // full/low speed transactions at microframe 1. This also
- // avoid the use of FSTN.
- //
- QhHw->SMask = QH_MICROFRAME_1;
- QhHw->CMask = QH_MICROFRAME_3 | QH_MICROFRAME_4 | QH_MICROFRAME_5;
-}
-
-
-
-/**
- Allocate and initialize a EHCI queue head.
-
- @param Ehci The EHCI device.
- @param Ep The endpoint to create queue head for.
-
- @return Created queue head or NULL if failed to create one.
-
-**/
-EHC_QH *
-EhcCreateQh (
- IN USB2_HC_DEV *Ehci,
- IN USB_ENDPOINT *Ep
- )
-{
- EHC_QH *Qh;
- QH_HW *QhHw;
-
- Qh = UsbHcAllocateMem (Ehci->MemPool, sizeof (EHC_QH));
-
- if (Qh == NULL) {
- return NULL;
- }
-
- Qh->Signature = EHC_QH_SIG;
- Qh->NextQh = NULL;
- Qh->Interval = Ep->PollRate;
-
- InitializeListHead (&Qh->Qtds);
-
- QhHw = &Qh->QhHw;
- QhHw->HorizonLink = QH_LINK (NULL, 0, TRUE);
- QhHw->DeviceAddr = Ep->DevAddr;
- QhHw->Inactive = 0;
- QhHw->EpNum = Ep->EpAddr;
- QhHw->EpSpeed = Ep->DevSpeed;
- QhHw->DtCtrl = 0;
- QhHw->ReclaimHead = 0;
- QhHw->MaxPacketLen = (UINT32) Ep->MaxPacket;
- QhHw->CtrlEp = 0;
- QhHw->NakReload = QH_NAK_RELOAD;
- QhHw->HubAddr = Ep->HubAddr;
- QhHw->PortNum = Ep->HubPort;
- QhHw->Multiplier = 1;
- QhHw->DataToggle = Ep->Toggle;
-
- if (Ep->DevSpeed != EFI_USB_SPEED_HIGH) {
- QhHw->Status |= QTD_STAT_DO_SS;
- }
-
- switch (Ep->Type) {
- case EHC_CTRL_TRANSFER:
- //
- // Special initialization for the control transfer:
- // 1. Control transfer initialize data toggle from each QTD
- // 2. Set the Control Endpoint Flag (C) for low/full speed endpoint.
- //
- QhHw->DtCtrl = 1;
-
- if (Ep->DevSpeed != EFI_USB_SPEED_HIGH) {
- QhHw->CtrlEp = 1;
- }
- break;
-
- case EHC_INT_TRANSFER_ASYNC:
- case EHC_INT_TRANSFER_SYNC:
- //
- // Special initialization for the interrupt transfer
- // to set the S-Mask and C-Mask
- //
- QhHw->NakReload = 0;
- EhcInitIntQh (Ep, QhHw);
- break;
-
- case EHC_BULK_TRANSFER:
- if ((Ep->DevSpeed == EFI_USB_SPEED_HIGH) && (Ep->Direction == EfiUsbDataOut)) {
- QhHw->Status |= QTD_STAT_DO_PING;
- }
-
- break;
- }
-
- return Qh;
-}
-
-
-/**
- Convert the poll interval from application to that
- be used by EHCI interface data structure. Only need
- to get the max 2^n that is less than interval. UEFI
- can't support high speed endpoint with a interval less
- than 8 microframe because interval is specified in
- the unit of ms (millisecond).
-
- @param Interval The interval to convert.
-
- @return The converted interval.
-
-**/
-UINTN
-EhcConvertPollRate (
- IN UINTN Interval
- )
-{
- UINTN BitCount;
-
- if (Interval == 0) {
- return 1;
- }
-
- //
- // Find the index (1 based) of the highest non-zero bit
- //
- BitCount = 0;
-
- while (Interval != 0) {
- Interval >>= 1;
- BitCount++;
- }
-
- return (UINTN)1 << (BitCount - 1);
-}
-
-
-/**
- Free a list of QTDs.
-
- @param Ehc The EHCI device.
- @param Qtds The list head of the QTD.
-
-**/
-VOID
-EhcFreeQtds (
- IN USB2_HC_DEV *Ehc,
- IN LIST_ENTRY *Qtds
- )
-{
- LIST_ENTRY *Entry;
- LIST_ENTRY *Next;
- EHC_QTD *Qtd;
-
- EFI_LIST_FOR_EACH_SAFE (Entry, Next, Qtds) {
- Qtd = EFI_LIST_CONTAINER (Entry, EHC_QTD, QtdList);
-
- RemoveEntryList (&Qtd->QtdList);
- UsbHcFreeMem (Ehc->MemPool, Qtd, sizeof (EHC_QTD));
- }
-}
-
-
-/**
- Free an allocated URB. It is possible for it to be partially inited.
-
- @param Ehc The EHCI device.
- @param Urb The URB to free.
-
-**/
-VOID
-EhcFreeUrb (
- IN USB2_HC_DEV *Ehc,
- IN URB *Urb
- )
-{
- EFI_PCI_IO_PROTOCOL *PciIo;
-
- PciIo = Ehc->PciIo;
-
- if (Urb->RequestPhy != NULL) {
- PciIo->Unmap (PciIo, Urb->RequestMap);
- }
-
- if (Urb->DataMap != NULL) {
- PciIo->Unmap (PciIo, Urb->DataMap);
- }
-
- if (Urb->Qh != NULL) {
- //
- // Ensure that this queue head has been unlinked from the
- // schedule data structures. Free all the associated QTDs
- //
- EhcFreeQtds (Ehc, &Urb->Qh->Qtds);
- UsbHcFreeMem (Ehc->MemPool, Urb->Qh, sizeof (EHC_QH));
- }
-
- gBS->FreePool (Urb);
-}
-
-
-/**
- Create a list of QTDs for the URB.
-
- @param Ehc The EHCI device.
- @param Urb The URB to create QTDs for.
-
- @retval EFI_OUT_OF_RESOURCES Failed to allocate resource for QTD.
- @retval EFI_SUCCESS The QTDs are allocated for the URB.
-
-**/
-EFI_STATUS
-EhcCreateQtds (
- IN USB2_HC_DEV *Ehc,
- IN URB *Urb
- )
-{
- USB_ENDPOINT *Ep;
- EHC_QH *Qh;
- EHC_QTD *Qtd;
- EHC_QTD *StatusQtd;
- EHC_QTD *NextQtd;
- LIST_ENTRY *Entry;
- UINT32 AlterNext;
- UINT8 Toggle;
- UINTN Len;
- UINT8 Pid;
- EFI_PHYSICAL_ADDRESS PhyAddr;
-
- ASSERT ((Urb != NULL) && (Urb->Qh != NULL));
-
- //
- // EHCI follows the alternet next QTD pointer if it meets
- // a short read and the AlterNext pointer is valid. UEFI
- // EHCI driver should terminate the transfer except the
- // control transfer.
- //
- Toggle = 0;
- Qh = Urb->Qh;
- Ep = &Urb->Ep;
- StatusQtd = NULL;
- AlterNext = QTD_LINK (NULL, TRUE);
-
- PhyAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Ehc->ShortReadStop, sizeof (EHC_QTD));
- if (Ep->Direction == EfiUsbDataIn) {
- AlterNext = QTD_LINK (PhyAddr, FALSE);
- }
-
- //
- // Build the Setup and status packets for control transfer
- //
- if (Urb->Ep.Type == EHC_CTRL_TRANSFER) {
- Len = sizeof (EFI_USB_DEVICE_REQUEST);
- Qtd = EhcCreateQtd (Ehc, (UINT8 *)Urb->Request, (UINT8 *)Urb->RequestPhy, Len, QTD_PID_SETUP, 0, Ep->MaxPacket);
-
- if (Qtd == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- InsertTailList (&Qh->Qtds, &Qtd->QtdList);
-
- //
- // Create the status packet now. Set the AlterNext to it. So, when
- // EHCI meets a short control read, it can resume at the status stage.
- // Use the opposite direction of the data stage, or IN if there is
- // no data stage.
- //
- if (Ep->Direction == EfiUsbDataIn) {
- Pid = QTD_PID_OUTPUT;
- } else {
- Pid = QTD_PID_INPUT;
- }
-
- StatusQtd = EhcCreateQtd (Ehc, NULL, NULL, 0, Pid, 1, Ep->MaxPacket);
-
- if (StatusQtd == NULL) {
- goto ON_ERROR;
- }
-
- if (Ep->Direction == EfiUsbDataIn) {
- PhyAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, StatusQtd, sizeof (EHC_QTD));
- AlterNext = QTD_LINK (PhyAddr, FALSE);
- }
-
- Toggle = 1;
- }
-
- //
- // Build the data packets for all the transfers
- //
- if (Ep->Direction == EfiUsbDataIn) {
- Pid = QTD_PID_INPUT;
- } else {
- Pid = QTD_PID_OUTPUT;
- }
-
- Qtd = NULL;
- Len = 0;
-
- while (Len < Urb->DataLen) {
- Qtd = EhcCreateQtd (
- Ehc,
- (UINT8 *) Urb->Data + Len,
- (UINT8 *) Urb->DataPhy + Len,
- Urb->DataLen - Len,
- Pid,
- Toggle,
- Ep->MaxPacket
- );
-
- if (Qtd == NULL) {
- goto ON_ERROR;
- }
-
- Qtd->QtdHw.AltNext = AlterNext;
- InsertTailList (&Qh->Qtds, &Qtd->QtdList);
-
- //
- // Switch the Toggle bit if odd number of packets are included in the QTD.
- //
- if (((Qtd->DataLen + Ep->MaxPacket - 1) / Ep->MaxPacket) % 2) {
- Toggle = (UINT8) (1 - Toggle);
- }
-
- Len += Qtd->DataLen;
- }
-
- //
- // Insert the status packet for control transfer
- //
- if (Ep->Type == EHC_CTRL_TRANSFER) {
- InsertTailList (&Qh->Qtds, &StatusQtd->QtdList);
- }
-
- //
- // OK, all the QTDs needed are created. Now, fix the NextQtd point
- //
- EFI_LIST_FOR_EACH (Entry, &Qh->Qtds) {
- Qtd = EFI_LIST_CONTAINER (Entry, EHC_QTD, QtdList);
-
- //
- // break if it is the last entry on the list
- //
- if (Entry->ForwardLink == &Qh->Qtds) {
- break;
- }
-
- NextQtd = EFI_LIST_CONTAINER (Entry->ForwardLink, EHC_QTD, QtdList);
- PhyAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, NextQtd, sizeof (EHC_QTD));
- Qtd->QtdHw.NextQtd = QTD_LINK (PhyAddr, FALSE);
- }
-
- //
- // Link the QTDs to the queue head
- //
- NextQtd = EFI_LIST_CONTAINER (Qh->Qtds.ForwardLink, EHC_QTD, QtdList);
- PhyAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, NextQtd, sizeof (EHC_QTD));
- Qh->QhHw.NextQtd = QTD_LINK (PhyAddr, FALSE);
- return EFI_SUCCESS;
-
-ON_ERROR:
- EhcFreeQtds (Ehc, &Qh->Qtds);
- return EFI_OUT_OF_RESOURCES;
-}
-
-
-/**
- Create a new URB and its associated QTD.
-
- @param Ehc The EHCI device.
- @param DevAddr The device address.
- @param EpAddr Endpoint addrress & its direction.
- @param DevSpeed The device speed.
- @param Toggle Initial data toggle to use.
- @param MaxPacket The max packet length of the endpoint.
- @param Hub The transaction translator to use.
- @param Type The transaction type.
- @param Request The standard USB request for control transfer.
- @param Data The user data to transfer.
- @param DataLen The length of data buffer.
- @param Callback The function to call when data is transferred.
- @param Context The context to the callback.
- @param Interval The interval for interrupt transfer.
-
- @return Created URB or NULL.
-
-**/
-URB *
-EhcCreateUrb (
- IN USB2_HC_DEV *Ehc,
- IN UINT8 DevAddr,
- IN UINT8 EpAddr,
- IN UINT8 DevSpeed,
- IN UINT8 Toggle,
- IN UINTN MaxPacket,
- IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Hub,
- IN UINTN Type,
- IN EFI_USB_DEVICE_REQUEST *Request,
- IN VOID *Data,
- IN UINTN DataLen,
- IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback,
- IN VOID *Context,
- IN UINTN Interval
- )
-{
- USB_ENDPOINT *Ep;
- EFI_PHYSICAL_ADDRESS PhyAddr;
- EFI_PCI_IO_PROTOCOL_OPERATION MapOp;
- EFI_PCI_IO_PROTOCOL *PciIo;
- EFI_STATUS Status;
- UINTN Len;
- URB *Urb;
- VOID *Map;
-
- Urb = AllocateZeroPool (sizeof (URB));
-
- if (Urb == NULL) {
- return NULL;
- }
-
- Urb->Signature = EHC_URB_SIG;
- InitializeListHead (&Urb->UrbList);
-
- Ep = &Urb->Ep;
- Ep->DevAddr = DevAddr;
- Ep->EpAddr = (UINT8) (EpAddr & 0x0F);
- Ep->Direction = (((EpAddr & 0x80) != 0) ? EfiUsbDataIn : EfiUsbDataOut);
- Ep->DevSpeed = DevSpeed;
- Ep->MaxPacket = MaxPacket;
-
- Ep->HubAddr = 0;
- Ep->HubPort = 0;
-
- if (DevSpeed != EFI_USB_SPEED_HIGH) {
- ASSERT (Hub != NULL);
-
- Ep->HubAddr = Hub->TranslatorHubAddress;
- Ep->HubPort = Hub->TranslatorPortNumber;
- }
-
- Ep->Toggle = Toggle;
- Ep->Type = Type;
- Ep->PollRate = EhcConvertPollRate (Interval);
-
- Urb->Request = Request;
- Urb->Data = Data;
- Urb->DataLen = DataLen;
- Urb->Callback = Callback;
- Urb->Context = Context;
-
- PciIo = Ehc->PciIo;
- Urb->Qh = EhcCreateQh (Ehc, &Urb->Ep);
-
- if (Urb->Qh == NULL) {
- goto ON_ERROR;
- }
-
- //
- // Map the request and user data
- //
- if (Request != NULL) {
- Len = sizeof (EFI_USB_DEVICE_REQUEST);
- MapOp = EfiPciIoOperationBusMasterRead;
- Status = PciIo->Map (PciIo, MapOp, Request, &Len, &PhyAddr, &Map);
-
- if (EFI_ERROR (Status) || (Len != sizeof (EFI_USB_DEVICE_REQUEST))) {
- goto ON_ERROR;
- }
-
- Urb->RequestPhy = (VOID *) ((UINTN) PhyAddr);
- Urb->RequestMap = Map;
- }
-
- if (Data != NULL) {
- Len = DataLen;
-
- if (Ep->Direction == EfiUsbDataIn) {
- MapOp = EfiPciIoOperationBusMasterWrite;
- } else {
- MapOp = EfiPciIoOperationBusMasterRead;
- }
-
- Status = PciIo->Map (PciIo, MapOp, Data, &Len, &PhyAddr, &Map);
-
- if (EFI_ERROR (Status) || (Len != DataLen)) {
- goto ON_ERROR;
- }
-
- Urb->DataPhy = (VOID *) ((UINTN) PhyAddr);
- Urb->DataMap = Map;
- }
-
- Status = EhcCreateQtds (Ehc, Urb);
-
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- return Urb;
-
-ON_ERROR:
- EhcFreeUrb (Ehc, Urb);
- return NULL;
-}
diff --git a/MdeModulePkg/Bus/Pci/EhciDxe/EhciUrb.h b/MdeModulePkg/Bus/Pci/EhciDxe/EhciUrb.h
deleted file mode 100644
index 02e9af81be..0000000000
--- a/MdeModulePkg/Bus/Pci/EhciDxe/EhciUrb.h
+++ /dev/null
@@ -1,336 +0,0 @@
-/** @file
-
- This file contains URB request, each request is warpped in a
- URB (Usb Request Block).
-
-Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
-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
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef _EFI_EHCI_URB_H_
-#define _EFI_EHCI_URB_H_
-
-
-typedef struct _EHC_QTD EHC_QTD;
-typedef struct _EHC_QH EHC_QH;
-typedef struct _URB URB;
-
-//
-// Transfer types, used in URB to identify the transfer type
-//
-#define EHC_CTRL_TRANSFER 0x01
-#define EHC_BULK_TRANSFER 0x02
-#define EHC_INT_TRANSFER_SYNC 0x04
-#define EHC_INT_TRANSFER_ASYNC 0x08
-
-#define EHC_QTD_SIG SIGNATURE_32 ('U', 'S', 'B', 'T')
-#define EHC_QH_SIG SIGNATURE_32 ('U', 'S', 'B', 'H')
-#define EHC_URB_SIG SIGNATURE_32 ('U', 'S', 'B', 'R')
-
-//
-// Hardware related bit definitions
-//
-#define EHC_TYPE_ITD 0x00
-#define EHC_TYPE_QH 0x02
-#define EHC_TYPE_SITD 0x04
-#define EHC_TYPE_FSTN 0x06
-
-#define QH_NAK_RELOAD 3
-#define QH_HSHBW_MULTI 1
-
-#define QTD_MAX_ERR 3
-#define QTD_PID_OUTPUT 0x00
-#define QTD_PID_INPUT 0x01
-#define QTD_PID_SETUP 0x02
-
-#define QTD_STAT_DO_OUT 0
-#define QTD_STAT_DO_SS 0
-#define QTD_STAT_DO_PING 0x01
-#define QTD_STAT_DO_CS 0x02
-#define QTD_STAT_TRANS_ERR 0x08
-#define QTD_STAT_BABBLE_ERR 0x10
-#define QTD_STAT_BUFF_ERR 0x20
-#define QTD_STAT_HALTED 0x40
-#define QTD_STAT_ACTIVE 0x80
-#define QTD_STAT_ERR_MASK (QTD_STAT_TRANS_ERR | QTD_STAT_BABBLE_ERR | QTD_STAT_BUFF_ERR)
-
-#define QTD_MAX_BUFFER 4
-#define QTD_BUF_LEN 4096
-#define QTD_BUF_MASK 0x0FFF
-
-#define QH_MICROFRAME_0 0x01
-#define QH_MICROFRAME_1 0x02
-#define QH_MICROFRAME_2 0x04
-#define QH_MICROFRAME_3 0x08
-#define QH_MICROFRAME_4 0x10
-#define QH_MICROFRAME_5 0x20
-#define QH_MICROFRAME_6 0x40
-#define QH_MICROFRAME_7 0x80
-
-#define USB_ERR_SHORT_PACKET 0x200
-
-//
-// Fill in the hardware link point: pass in a EHC_QH/QH_HW
-// pointer to QH_LINK; A EHC_QTD/QTD_HW pointer to QTD_LINK
-//
-#define QH_LINK(Addr, Type, Term) \
- ((UINT32) ((EHC_LOW_32BIT (Addr) & 0xFFFFFFE0) | (Type) | ((Term) ? 1 : 0)))
-
-#define QTD_LINK(Addr, Term) QH_LINK((Addr), 0, (Term))
-
-//
-// The defination of EHCI hardware used data structure for
-// little endian architecture. The QTD and QH structures
-// are required to be 32 bytes aligned. Don't add members
-// to the head of the associated software strucuture.
-//
-#pragma pack(1)
-typedef struct {
- UINT32 NextQtd;
- UINT32 AltNext;
-
- UINT32 Status : 8;
- UINT32 Pid : 2;
- UINT32 ErrCnt : 2;
- UINT32 CurPage : 3;
- UINT32 Ioc : 1;
- UINT32 TotalBytes : 15;
- UINT32 DataToggle : 1;
-
- UINT32 Page[5];
- UINT32 PageHigh[5];
-} QTD_HW;
-
-typedef struct {
- UINT32 HorizonLink;
- //
- // Endpoint capabilities/Characteristics DWord 1 and DWord 2
- //
- UINT32 DeviceAddr : 7;
- UINT32 Inactive : 1;
- UINT32 EpNum : 4;
- UINT32 EpSpeed : 2;
- UINT32 DtCtrl : 1;
- UINT32 ReclaimHead : 1;
- UINT32 MaxPacketLen : 11;
- UINT32 CtrlEp : 1;
- UINT32 NakReload : 4;
-
- UINT32 SMask : 8;
- UINT32 CMask : 8;
- UINT32 HubAddr : 7;
- UINT32 PortNum : 7;
- UINT32 Multiplier : 2;
-
- //
- // Transaction execution overlay area
- //
- UINT32 CurQtd;
- UINT32 NextQtd;
- UINT32 AltQtd;
-
- UINT32 Status : 8;
- UINT32 Pid : 2;
- UINT32 ErrCnt : 2;
- UINT32 CurPage : 3;
- UINT32 Ioc : 1;
- UINT32 TotalBytes : 15;
- UINT32 DataToggle : 1;
-
- UINT32 Page[5];
- UINT32 PageHigh[5];
-} QH_HW;
-#pragma pack()
-
-
-//
-// Endpoint address and its capabilities
-//
-typedef struct _USB_ENDPOINT {
- UINT8 DevAddr;
- UINT8 EpAddr; // Endpoint address, no direction encoded in
- EFI_USB_DATA_DIRECTION Direction;
- UINT8 DevSpeed;
- UINTN MaxPacket;
- UINT8 HubAddr;
- UINT8 HubPort;
- UINT8 Toggle; // Data toggle, not used for control transfer
- UINTN Type;
- UINTN PollRate; // Polling interval used by EHCI
-} USB_ENDPOINT;
-
-//
-// Software QTD strcture, this is used to manage all the
-// QTD generated from a URB. Don't add fields before QtdHw.
-//
-struct _EHC_QTD {
- QTD_HW QtdHw;
- UINT32 Signature;
- LIST_ENTRY QtdList; // The list of QTDs to one end point
- UINT8 *Data; // Buffer of the original data
- UINTN DataLen; // Original amount of data in this QTD
-};
-
-//
-// Software QH structure. All three different transaction types
-// supported by UEFI USB, that is the control/bulk/interrupt
-// transfers use the queue head and queue token strcuture.
-//
-// Interrupt QHs are linked to periodic frame list in the reversed
-// 2^N tree. Each interrupt QH is linked to the list starting at
-// frame 0. There is a dummy interrupt QH linked to each frame as
-// a sentinental whose polling interval is 1. Synchronous interrupt
-// transfer is linked after this dummy QH.
-//
-// For control/bulk transfer, only synchronous (in the sense of UEFI)
-// transfer is supported. A dummy QH is linked to EHCI AsyncListAddr
-// as the reclamation header. New transfer is inserted after this QH.
-//
-struct _EHC_QH {
- QH_HW QhHw;
- UINT32 Signature;
- EHC_QH *NextQh; // The queue head pointed to by horizontal link
- LIST_ENTRY Qtds; // The list of QTDs to this queue head
- UINTN Interval;
-};
-
-//
-// URB (Usb Request Block) contains information for all kinds of
-// usb requests.
-//
-struct _URB {
- UINT32 Signature;
- LIST_ENTRY UrbList;
-
- //
- // Transaction information
- //
- USB_ENDPOINT Ep;
- EFI_USB_DEVICE_REQUEST *Request; // Control transfer only
- VOID *RequestPhy; // Address of the mapped request
- VOID *RequestMap;
- VOID *Data;
- UINTN DataLen;
- VOID *DataPhy; // Address of the mapped user data
- VOID *DataMap;
- EFI_ASYNC_USB_TRANSFER_CALLBACK Callback;
- VOID *Context;
-
- //
- // Schedule data
- //
- EHC_QH *Qh;
-
- //
- // Transaction result
- //
- UINT32 Result;
- UINTN Completed; // completed data length
- UINT8 DataToggle;
-};
-
-
-
-/**
- Create a single QTD to hold the data.
-
- @param Ehc The EHCI device.
- @param Data The cpu memory address of current data not associated with a QTD.
- @param DataPhy The pci bus address of current data not associated with a QTD.
- @param DataLen The length of the data.
- @param PktId Packet ID to use in the QTD.
- @param Toggle Data toggle to use in the QTD.
- @param MaxPacket Maximu packet length of the endpoint.
-
- @return Created QTD or NULL if failed to create one.
-
-**/
-EHC_QTD *
-EhcCreateQtd (
- IN USB2_HC_DEV *Ehc,
- IN UINT8 *Data,
- IN UINT8 *DataPhy,
- IN UINTN DataLen,
- IN UINT8 PktId,
- IN UINT8 Toggle,
- IN UINTN MaxPacket
- );
-
-
-
-/**
- Allocate and initialize a EHCI queue head.
-
- @param Ehci The EHCI device.
- @param Ep The endpoint to create queue head for.
-
- @return Created queue head or NULL if failed to create one.
-
-**/
-EHC_QH *
-EhcCreateQh (
- IN USB2_HC_DEV *Ehci,
- IN USB_ENDPOINT *Ep
- );
-
-
-/**
- Free an allocated URB. It is possible for it to be partially inited.
-
- @param Ehc The EHCI device.
- @param Urb The URB to free.
-
-**/
-VOID
-EhcFreeUrb (
- IN USB2_HC_DEV *Ehc,
- IN URB *Urb
- );
-
-
-/**
- Create a new URB and its associated QTD.
-
- @param Ehc The EHCI device.
- @param DevAddr The device address.
- @param EpAddr Endpoint addrress & its direction.
- @param DevSpeed The device speed.
- @param Toggle Initial data toggle to use.
- @param MaxPacket The max packet length of the endpoint.
- @param Hub The transaction translator to use.
- @param Type The transaction type.
- @param Request The standard USB request for control transfer.
- @param Data The user data to transfer.
- @param DataLen The length of data buffer.
- @param Callback The function to call when data is transferred.
- @param Context The context to the callback.
- @param Interval The interval for interrupt transfer.
-
- @return Created URB or NULL.
-
-**/
-URB *
-EhcCreateUrb (
- IN USB2_HC_DEV *Ehc,
- IN UINT8 DevAddr,
- IN UINT8 EpAddr,
- IN UINT8 DevSpeed,
- IN UINT8 Toggle,
- IN UINTN MaxPacket,
- IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Hub,
- IN UINTN Type,
- IN EFI_USB_DEVICE_REQUEST *Request,
- IN VOID *Data,
- IN UINTN DataLen,
- IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback,
- IN VOID *Context,
- IN UINTN Interval
- );
-#endif
diff --git a/MdeModulePkg/Bus/Pci/EhciDxe/UsbHcMem.c b/MdeModulePkg/Bus/Pci/EhciDxe/UsbHcMem.c
deleted file mode 100644
index acff7256bd..0000000000
--- a/MdeModulePkg/Bus/Pci/EhciDxe/UsbHcMem.c
+++ /dev/null
@@ -1,566 +0,0 @@
-/** @file
-
- Routine procedures for memory allocate/free.
-
-Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>
-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
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-
-#include "Ehci.h"
-
-
-/**
- Allocate a block of memory to be used by the buffer pool.
-
- @param Pool The buffer pool to allocate memory for.
- @param Pages How many pages to allocate.
-
- @return The allocated memory block or NULL if failed.
-
-**/
-USBHC_MEM_BLOCK *
-UsbHcAllocMemBlock (
- IN USBHC_MEM_POOL *Pool,
- IN UINTN Pages
- )
-{
- USBHC_MEM_BLOCK *Block;
- EFI_PCI_IO_PROTOCOL *PciIo;
- VOID *BufHost;
- VOID *Mapping;
- EFI_PHYSICAL_ADDRESS MappedAddr;
- UINTN Bytes;
- EFI_STATUS Status;
-
- PciIo = Pool->PciIo;
-
- Block = AllocateZeroPool (sizeof (USBHC_MEM_BLOCK));
- if (Block == NULL) {
- return NULL;
- }
-
- //
- // each bit in the bit array represents USBHC_MEM_UNIT
- // bytes of memory in the memory block.
- //
- ASSERT (USBHC_MEM_UNIT * 8 <= EFI_PAGE_SIZE);
-
- Block->BufLen = EFI_PAGES_TO_SIZE (Pages);
- Block->BitsLen = Block->BufLen / (USBHC_MEM_UNIT * 8);
- Block->Bits = AllocateZeroPool (Block->BitsLen);
-
- if (Block->Bits == NULL) {
- gBS->FreePool (Block);
- return NULL;
- }
-
- //
- // Allocate the number of Pages of memory, then map it for
- // bus master read and write.
- //
- Status = PciIo->AllocateBuffer (
- PciIo,
- AllocateAnyPages,
- EfiBootServicesData,
- Pages,
- &BufHost,
- 0
- );
-
- if (EFI_ERROR (Status)) {
- goto FREE_BITARRAY;
- }
-
- Bytes = EFI_PAGES_TO_SIZE (Pages);
- Status = PciIo->Map (
- PciIo,
- EfiPciIoOperationBusMasterCommonBuffer,
- BufHost,
- &Bytes,
- &MappedAddr,
- &Mapping
- );
-
- if (EFI_ERROR (Status) || (Bytes != EFI_PAGES_TO_SIZE (Pages))) {
- goto FREE_BUFFER;
- }
-
- //
- // Check whether the data structure used by the host controller
- // should be restricted into the same 4G
- //
- if (Pool->Check4G && (Pool->Which4G != USB_HC_HIGH_32BIT (MappedAddr))) {
- PciIo->Unmap (PciIo, Mapping);
- goto FREE_BUFFER;
- }
-
- Block->BufHost = BufHost;
- Block->Buf = (UINT8 *) ((UINTN) MappedAddr);
- Block->Mapping = Mapping;
-
- return Block;
-
-FREE_BUFFER:
- PciIo->FreeBuffer (PciIo, Pages, BufHost);
-
-FREE_BITARRAY:
- gBS->FreePool (Block->Bits);
- gBS->FreePool (Block);
- return NULL;
-}
-
-
-/**
- Free the memory block from the memory pool.
-
- @param Pool The memory pool to free the block from.
- @param Block The memory block to free.
-
-**/
-VOID
-UsbHcFreeMemBlock (
- IN USBHC_MEM_POOL *Pool,
- IN USBHC_MEM_BLOCK *Block
- )
-{
- EFI_PCI_IO_PROTOCOL *PciIo;
-
- ASSERT ((Pool != NULL) && (Block != NULL));
-
- PciIo = Pool->PciIo;
-
- //
- // Unmap the common buffer then free the structures
- //
- PciIo->Unmap (PciIo, Block->Mapping);
- PciIo->FreeBuffer (PciIo, EFI_SIZE_TO_PAGES (Block->BufLen), Block->BufHost);
-
- gBS->FreePool (Block->Bits);
- gBS->FreePool (Block);
-}
-
-
-/**
- Alloc some memory from the block.
-
- @param Block The memory block to allocate memory from.
- @param Units Number of memory units to allocate.
-
- @return The pointer to the allocated memory. If couldn't allocate the needed memory,
- the return value is NULL.
-
-**/
-VOID *
-UsbHcAllocMemFromBlock (
- IN USBHC_MEM_BLOCK *Block,
- IN UINTN Units
- )
-{
- UINTN Byte;
- UINT8 Bit;
- UINTN StartByte;
- UINT8 StartBit;
- UINTN Available;
- UINTN Count;
-
- ASSERT ((Block != 0) && (Units != 0));
-
- StartByte = 0;
- StartBit = 0;
- Available = 0;
-
- for (Byte = 0, Bit = 0; Byte < Block->BitsLen;) {
- //
- // If current bit is zero, the corresponding memory unit is
- // available, otherwise we need to restart our searching.
- // Available counts the consective number of zero bit.
- //
- if (!USB_HC_BIT_IS_SET (Block->Bits[Byte], Bit)) {
- Available++;
-
- if (Available >= Units) {
- break;
- }
-
- NEXT_BIT (Byte, Bit);
-
- } else {
- NEXT_BIT (Byte, Bit);
-
- Available = 0;
- StartByte = Byte;
- StartBit = Bit;
- }
- }
-
- if (Available < Units) {
- return NULL;
- }
-
- //
- // Mark the memory as allocated
- //
- Byte = StartByte;
- Bit = StartBit;
-
- for (Count = 0; Count < Units; Count++) {
- ASSERT (!USB_HC_BIT_IS_SET (Block->Bits[Byte], Bit));
-
- Block->Bits[Byte] = (UINT8) (Block->Bits[Byte] | USB_HC_BIT (Bit));
- NEXT_BIT (Byte, Bit);
- }
-
- return Block->BufHost + (StartByte * 8 + StartBit) * USBHC_MEM_UNIT;
-}
-
-/**
- Calculate the corresponding pci bus address according to the Mem parameter.
-
- @param Pool The memory pool of the host controller.
- @param Mem The pointer to host memory.
- @param Size The size of the memory region.
-
- @return the pci memory address
-**/
-EFI_PHYSICAL_ADDRESS
-UsbHcGetPciAddressForHostMem (
- IN USBHC_MEM_POOL *Pool,
- IN VOID *Mem,
- IN UINTN Size
- )
-{
- USBHC_MEM_BLOCK *Head;
- USBHC_MEM_BLOCK *Block;
- UINTN AllocSize;
- EFI_PHYSICAL_ADDRESS PhyAddr;
- UINTN Offset;
-
- Head = Pool->Head;
- AllocSize = USBHC_MEM_ROUND (Size);
-
- if (Mem == NULL) {
- return 0;
- }
-
- for (Block = Head; Block != NULL; Block = Block->Next) {
- //
- // scan the memory block list for the memory block that
- // completely contains the allocated memory.
- //
- if ((Block->BufHost <= (UINT8 *) Mem) && (((UINT8 *) Mem + AllocSize) <= (Block->BufHost + Block->BufLen))) {
- break;
- }
- }
-
- ASSERT ((Block != NULL));
- //
- // calculate the pci memory address for host memory address.
- //
- Offset = (UINT8 *)Mem - Block->BufHost;
- PhyAddr = (EFI_PHYSICAL_ADDRESS)(UINTN) (Block->Buf + Offset);
- return PhyAddr;
-}
-
-
-/**
- Insert the memory block to the pool's list of the blocks.
-
- @param Head The head of the memory pool's block list.
- @param Block The memory block to insert.
-
-**/
-VOID
-UsbHcInsertMemBlockToPool (
- IN USBHC_MEM_BLOCK *Head,
- IN USBHC_MEM_BLOCK *Block
- )
-{
- ASSERT ((Head != NULL) && (Block != NULL));
- Block->Next = Head->Next;
- Head->Next = Block;
-}
-
-
-/**
- Is the memory block empty?
-
- @param Block The memory block to check.
-
- @retval TRUE The memory block is empty.
- @retval FALSE The memory block isn't empty.
-
-**/
-BOOLEAN
-UsbHcIsMemBlockEmpty (
- IN USBHC_MEM_BLOCK *Block
- )
-{
- UINTN Index;
-
- for (Index = 0; Index < Block->BitsLen; Index++) {
- if (Block->Bits[Index] != 0) {
- return FALSE;
- }
- }
-
- return TRUE;
-}
-
-
-/**
- Unlink the memory block from the pool's list.
-
- @param Head The block list head of the memory's pool.
- @param BlockToUnlink The memory block to unlink.
-
-**/
-VOID
-UsbHcUnlinkMemBlock (
- IN USBHC_MEM_BLOCK *Head,
- IN USBHC_MEM_BLOCK *BlockToUnlink
- )
-{
- USBHC_MEM_BLOCK *Block;
-
- ASSERT ((Head != NULL) && (BlockToUnlink != NULL));
-
- for (Block = Head; Block != NULL; Block = Block->Next) {
- if (Block->Next == BlockToUnlink) {
- Block->Next = BlockToUnlink->Next;
- BlockToUnlink->Next = NULL;
- break;
- }
- }
-}
-
-
-/**
- Initialize the memory management pool for the host controller.
-
- @param PciIo The PciIo that can be used to access the host controller.
- @param Check4G Whether the host controller requires allocated memory
- from one 4G address space.
- @param Which4G The 4G memory area each memory allocated should be from.
-
- @retval EFI_SUCCESS The memory pool is initialized.
- @retval EFI_OUT_OF_RESOURCE Fail to init the memory pool.
-
-**/
-USBHC_MEM_POOL *
-UsbHcInitMemPool (
- IN EFI_PCI_IO_PROTOCOL *PciIo,
- IN BOOLEAN Check4G,
- IN UINT32 Which4G
- )
-{
- USBHC_MEM_POOL *Pool;
-
- Pool = AllocatePool (sizeof (USBHC_MEM_POOL));
-
- if (Pool == NULL) {
- return Pool;
- }
-
- Pool->PciIo = PciIo;
- Pool->Check4G = Check4G;
- Pool->Which4G = Which4G;
- Pool->Head = UsbHcAllocMemBlock (Pool, USBHC_MEM_DEFAULT_PAGES);
-
- if (Pool->Head == NULL) {
- gBS->FreePool (Pool);
- Pool = NULL;
- }
-
- return Pool;
-}
-
-
-/**
- Release the memory management pool.
-
- @param Pool The USB memory pool to free.
-
- @retval EFI_SUCCESS The memory pool is freed.
- @retval EFI_DEVICE_ERROR Failed to free the memory pool.
-
-**/
-EFI_STATUS
-UsbHcFreeMemPool (
- IN USBHC_MEM_POOL *Pool
- )
-{
- USBHC_MEM_BLOCK *Block;
-
- ASSERT (Pool->Head != NULL);
-
- //
- // Unlink all the memory blocks from the pool, then free them.
- // UsbHcUnlinkMemBlock can't be used to unlink and free the
- // first block.
- //
- for (Block = Pool->Head->Next; Block != NULL; Block = Pool->Head->Next) {
- UsbHcUnlinkMemBlock (Pool->Head, Block);
- UsbHcFreeMemBlock (Pool, Block);
- }
-
- UsbHcFreeMemBlock (Pool, Pool->Head);
- gBS->FreePool (Pool);
- return EFI_SUCCESS;
-}
-
-
-/**
- Allocate some memory from the host controller's memory pool
- which can be used to communicate with host controller.
-
- @param Pool The host controller's memory pool.
- @param Size Size of the memory to allocate.
-
- @return The allocated memory or NULL.
-
-**/
-VOID *
-UsbHcAllocateMem (
- IN USBHC_MEM_POOL *Pool,
- IN UINTN Size
- )
-{
- USBHC_MEM_BLOCK *Head;
- USBHC_MEM_BLOCK *Block;
- USBHC_MEM_BLOCK *NewBlock;
- VOID *Mem;
- UINTN AllocSize;
- UINTN Pages;
-
- Mem = NULL;
- AllocSize = USBHC_MEM_ROUND (Size);
- Head = Pool->Head;
- ASSERT (Head != NULL);
-
- //
- // First check whether current memory blocks can satisfy the allocation.
- //
- for (Block = Head; Block != NULL; Block = Block->Next) {
- Mem = UsbHcAllocMemFromBlock (Block, AllocSize / USBHC_MEM_UNIT);
-
- if (Mem != NULL) {
- ZeroMem (Mem, Size);
- break;
- }
- }
-
- if (Mem != NULL) {
- return Mem;
- }
-
- //
- // Create a new memory block if there is not enough memory
- // in the pool. If the allocation size is larger than the
- // default page number, just allocate a large enough memory
- // block. Otherwise allocate default pages.
- //
- if (AllocSize > EFI_PAGES_TO_SIZE (USBHC_MEM_DEFAULT_PAGES)) {
- Pages = EFI_SIZE_TO_PAGES (AllocSize) + 1;
- } else {
- Pages = USBHC_MEM_DEFAULT_PAGES;
- }
-
- NewBlock = UsbHcAllocMemBlock (Pool, Pages);
-
- if (NewBlock == NULL) {
- DEBUG ((EFI_D_ERROR, "UsbHcAllocateMem: failed to allocate block\n"));
- return NULL;
- }
-
- //
- // Add the new memory block to the pool, then allocate memory from it
- //
- UsbHcInsertMemBlockToPool (Head, NewBlock);
- Mem = UsbHcAllocMemFromBlock (NewBlock, AllocSize / USBHC_MEM_UNIT);
-
- if (Mem != NULL) {
- ZeroMem (Mem, Size);
- }
-
- return Mem;
-}
-
-
-/**
- Free the allocated memory back to the memory pool.
-
- @param Pool The memory pool of the host controller.
- @param Mem The memory to free.
- @param Size The size of the memory to free.
-
-**/
-VOID
-UsbHcFreeMem (
- IN USBHC_MEM_POOL *Pool,
- IN VOID *Mem,
- IN UINTN Size
- )
-{
- USBHC_MEM_BLOCK *Head;
- USBHC_MEM_BLOCK *Block;
- UINT8 *ToFree;
- UINTN AllocSize;
- UINTN Byte;
- UINTN Bit;
- UINTN Count;
-
- Head = Pool->Head;
- AllocSize = USBHC_MEM_ROUND (Size);
- ToFree = (UINT8 *) Mem;
-
- for (Block = Head; Block != NULL; Block = Block->Next) {
- //
- // scan the memory block list for the memory block that
- // completely contains the memory to free.
- //
- if ((Block->BufHost <= ToFree) && ((ToFree + AllocSize) <= (Block->BufHost + Block->BufLen))) {
- //
- // compute the start byte and bit in the bit array
- //
- Byte = ((ToFree - Block->BufHost) / USBHC_MEM_UNIT) / 8;
- Bit = ((ToFree - Block->BufHost) / USBHC_MEM_UNIT) % 8;
-
- //
- // reset associated bits in bit array
- //
- for (Count = 0; Count < (AllocSize / USBHC_MEM_UNIT); Count++) {
- ASSERT (USB_HC_BIT_IS_SET (Block->Bits[Byte], Bit));
-
- Block->Bits[Byte] = (UINT8) (Block->Bits[Byte] ^ USB_HC_BIT (Bit));
- NEXT_BIT (Byte, Bit);
- }
-
- break;
- }
- }
-
- //
- // If Block == NULL, it means that the current memory isn't
- // in the host controller's pool. This is critical because
- // the caller has passed in a wrong memory point
- //
- ASSERT (Block != NULL);
-
- //
- // Release the current memory block if it is empty and not the head
- //
- if ((Block != Head) && UsbHcIsMemBlockEmpty (Block)) {
- UsbHcUnlinkMemBlock (Head, Block);
- UsbHcFreeMemBlock (Pool, Block);
- }
-
- return ;
-}
diff --git a/MdeModulePkg/Bus/Pci/EhciDxe/UsbHcMem.h b/MdeModulePkg/Bus/Pci/EhciDxe/UsbHcMem.h
deleted file mode 100644
index 84ced8d580..0000000000
--- a/MdeModulePkg/Bus/Pci/EhciDxe/UsbHcMem.h
+++ /dev/null
@@ -1,157 +0,0 @@
-/** @file
-
- This file contains the definination for host controller memory management routines.
-
-Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
-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
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef _EFI_EHCI_MEM_H_
-#define _EFI_EHCI_MEM_H_
-
-#define USB_HC_BIT(a) ((UINTN)(1 << (a)))
-
-#define USB_HC_BIT_IS_SET(Data, Bit) \
- ((BOOLEAN)(((Data) & USB_HC_BIT(Bit)) == USB_HC_BIT(Bit)))
-
-#define USB_HC_HIGH_32BIT(Addr64) \
- ((UINT32)(RShiftU64((UINTN)(Addr64), 32) & 0XFFFFFFFF))
-
-typedef struct _USBHC_MEM_BLOCK USBHC_MEM_BLOCK;
-struct _USBHC_MEM_BLOCK {
- UINT8 *Bits; // Bit array to record which unit is allocated
- UINTN BitsLen;
- UINT8 *Buf;
- UINT8 *BufHost;
- UINTN BufLen; // Memory size in bytes
- VOID *Mapping;
- USBHC_MEM_BLOCK *Next;
-};
-
-//
-// USBHC_MEM_POOL is used to manage the memory used by USB
-// host controller. EHCI requires the control memory and transfer
-// data to be on the same 4G memory.
-//
-typedef struct _USBHC_MEM_POOL {
- EFI_PCI_IO_PROTOCOL *PciIo;
- BOOLEAN Check4G;
- UINT32 Which4G;
- USBHC_MEM_BLOCK *Head;
-} USBHC_MEM_POOL;
-
-//
-// Memory allocation unit, must be 2^n, n>4
-//
-#define USBHC_MEM_UNIT 64
-
-#define USBHC_MEM_UNIT_MASK (USBHC_MEM_UNIT - 1)
-#define USBHC_MEM_DEFAULT_PAGES 16
-
-#define USBHC_MEM_ROUND(Len) (((Len) + USBHC_MEM_UNIT_MASK) & (~USBHC_MEM_UNIT_MASK))
-
-//
-// Advance the byte and bit to the next bit, adjust byte accordingly.
-//
-#define NEXT_BIT(Byte, Bit) \
- do { \
- (Bit)++; \
- if ((Bit) > 7) { \
- (Byte)++; \
- (Bit) = 0; \
- } \
- } while (0)
-
-
-
-/**
- Initialize the memory management pool for the host controller.
-
- @param PciIo The PciIo that can be used to access the host controller.
- @param Check4G Whether the host controller requires allocated memory
- from one 4G address space.
- @param Which4G The 4G memory area each memory allocated should be from.
-
- @retval EFI_SUCCESS The memory pool is initialized.
- @retval EFI_OUT_OF_RESOURCE Fail to init the memory pool.
-
-**/
-USBHC_MEM_POOL *
-UsbHcInitMemPool (
- IN EFI_PCI_IO_PROTOCOL *PciIo,
- IN BOOLEAN Check4G,
- IN UINT32 Which4G
- );
-
-
-/**
- Release the memory management pool.
-
- @param Pool The USB memory pool to free.
-
- @retval EFI_SUCCESS The memory pool is freed.
- @retval EFI_DEVICE_ERROR Failed to free the memory pool.
-
-**/
-EFI_STATUS
-UsbHcFreeMemPool (
- IN USBHC_MEM_POOL *Pool
- );
-
-
-/**
- Allocate some memory from the host controller's memory pool
- which can be used to communicate with host controller.
-
- @param Pool The host controller's memory pool.
- @param Size Size of the memory to allocate.
-
- @return The allocated memory or NULL.
-
-**/
-VOID *
-UsbHcAllocateMem (
- IN USBHC_MEM_POOL *Pool,
- IN UINTN Size
- );
-
-
-/**
- Free the allocated memory back to the memory pool.
-
- @param Pool The memory pool of the host controller.
- @param Mem The memory to free.
- @param Size The size of the memory to free.
-
-**/
-VOID
-UsbHcFreeMem (
- IN USBHC_MEM_POOL *Pool,
- IN VOID *Mem,
- IN UINTN Size
- );
-
-/**
- Calculate the corresponding pci bus address according to the Mem parameter.
-
- @param Pool The memory pool of the host controller.
- @param Mem The pointer to host memory.
- @param Size The size of the memory region.
-
- @return the pci memory address
-**/
-EFI_PHYSICAL_ADDRESS
-UsbHcGetPciAddressForHostMem (
- IN USBHC_MEM_POOL *Pool,
- IN VOID *Mem,
- IN UINTN Size
- );
-
-#endif