summaryrefslogtreecommitdiff
path: root/MdeModulePkg/Bus/Usb/UsbBusDxe
diff options
context:
space:
mode:
authorGuo Mang <mang.guo@intel.com>2016-12-22 15:55:38 +0800
committerGuo Mang <mang.guo@intel.com>2016-12-26 19:14:37 +0800
commit7f05fa00f73038b425002566d3afe6c3ade2ccdb (patch)
tree297e208d4ade33a8bb3d5d20f72c53e0d134e003 /MdeModulePkg/Bus/Usb/UsbBusDxe
parented2ecce34b3830562c4239093a41ba92d76d5f31 (diff)
downloadedk2-platforms-7f05fa00f73038b425002566d3afe6c3ade2ccdb.tar.xz
MdeModulePkg: Move to new location
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Guo Mang <mang.guo@intel.com>
Diffstat (limited to 'MdeModulePkg/Bus/Usb/UsbBusDxe')
-rw-r--r--MdeModulePkg/Bus/Usb/UsbBusDxe/ComponentName.c309
-rw-r--r--MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBus.c1532
-rw-r--r--MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBus.h770
-rw-r--r--MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf79
-rw-r--r--MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.unibin1934 -> 0 bytes
-rw-r--r--MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxeExtra.unibin1336 -> 0 bytes
-rw-r--r--MdeModulePkg/Bus/Usb/UsbBusDxe/UsbDesc.c978
-rw-r--r--MdeModulePkg/Bus/Usb/UsbBusDxe/UsbDesc.h233
-rw-r--r--MdeModulePkg/Bus/Usb/UsbBusDxe/UsbEnumer.c1065
-rw-r--r--MdeModulePkg/Bus/Usb/UsbBusDxe/UsbEnumer.h203
-rw-r--r--MdeModulePkg/Bus/Usb/UsbBusDxe/UsbHub.c1411
-rw-r--r--MdeModulePkg/Bus/Usb/UsbBusDxe/UsbHub.h199
-rw-r--r--MdeModulePkg/Bus/Usb/UsbBusDxe/UsbUtility.c1377
-rw-r--r--MdeModulePkg/Bus/Usb/UsbBusDxe/UsbUtility.h398
14 files changed, 0 insertions, 8554 deletions
diff --git a/MdeModulePkg/Bus/Usb/UsbBusDxe/ComponentName.c b/MdeModulePkg/Bus/Usb/UsbBusDxe/ComponentName.c
deleted file mode 100644
index dc00208632..0000000000
--- a/MdeModulePkg/Bus/Usb/UsbBusDxe/ComponentName.c
+++ /dev/null
@@ -1,309 +0,0 @@
-/** @file
-
- UEFI Component Name(2) protocol implementation for Usb Bus driver.
-
-Copyright (c) 2004 - 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 <Uefi.h>
-
-
-#include <Library/UefiLib.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
-UsbBusComponentNameGetDriverName (
- 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
-UsbBusComponentNameGetControllerName (
- IN EFI_COMPONENT_NAME_PROTOCOL *This,
- IN EFI_HANDLE ControllerHandle,
- IN EFI_HANDLE ChildHandle OPTIONAL,
- IN CHAR8 *Language,
- OUT CHAR16 **ControllerName
- );
-
-
-//
-// EFI Component Name Protocol
-//
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL mUsbBusComponentName = {
- UsbBusComponentNameGetDriverName,
- UsbBusComponentNameGetControllerName,
- "eng"
-};
-
-//
-// EFI Component Name 2 Protocol
-//
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL mUsbBusComponentName2 = {
- (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) UsbBusComponentNameGetDriverName,
- (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) UsbBusComponentNameGetControllerName,
- "en"
-};
-
-
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mUsbBusDriverNameTable[] = {
- { "eng;en", L"Usb Bus 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
-UsbBusComponentNameGetDriverName (
- IN EFI_COMPONENT_NAME_PROTOCOL *This,
- IN CHAR8 *Language,
- OUT CHAR16 **DriverName
- )
-{
- return LookupUnicodeString2 (
- Language,
- This->SupportedLanguages,
- mUsbBusDriverNameTable,
- DriverName,
- (BOOLEAN)(This == &mUsbBusComponentName)
- );
-}
-
-/**
- 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 not a valid EFI_HANDLE.
-
- @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
-UsbBusComponentNameGetControllerName (
- IN EFI_COMPONENT_NAME_PROTOCOL *This,
- IN EFI_HANDLE ControllerHandle,
- IN EFI_HANDLE ChildHandle OPTIONAL,
- IN CHAR8 *Language,
- OUT CHAR16 **ControllerName
- )
-{
- return EFI_UNSUPPORTED;
-}
diff --git a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBus.c b/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBus.c
deleted file mode 100644
index ef002f53bb..0000000000
--- a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBus.c
+++ /dev/null
@@ -1,1532 +0,0 @@
-/** @file
-
- Usb Bus Driver Binding and Bus IO Protocol.
-
-Copyright (c) 2004 - 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 "UsbBus.h"
-
-EFI_USB_IO_PROTOCOL mUsbIoProtocol = {
- UsbIoControlTransfer,
- UsbIoBulkTransfer,
- UsbIoAsyncInterruptTransfer,
- UsbIoSyncInterruptTransfer,
- UsbIoIsochronousTransfer,
- UsbIoAsyncIsochronousTransfer,
- UsbIoGetDeviceDescriptor,
- UsbIoGetActiveConfigDescriptor,
- UsbIoGetInterfaceDescriptor,
- UsbIoGetEndpointDescriptor,
- UsbIoGetStringDescriptor,
- UsbIoGetSupportedLanguages,
- UsbIoPortReset
-};
-
-EFI_DRIVER_BINDING_PROTOCOL mUsbBusDriverBinding = {
- UsbBusControllerDriverSupported,
- UsbBusControllerDriverStart,
- UsbBusControllerDriverStop,
- 0xa,
- NULL,
- NULL
-};
-
-/**
- USB_IO function to execute a control transfer. This
- function will execute the USB transfer. If transfer
- successes, it will sync the internal state of USB bus
- with device state.
-
- @param This The USB_IO instance
- @param Request The control transfer request
- @param Direction Direction for data stage
- @param Timeout The time to wait before timeout
- @param Data The buffer holding the data
- @param DataLength Then length of the data
- @param UsbStatus USB result
-
- @retval EFI_INVALID_PARAMETER The parameters are invalid
- @retval EFI_SUCCESS The control transfer succeeded.
- @retval Others Failed to execute the transfer
-
-**/
-EFI_STATUS
-EFIAPI
-UsbIoControlTransfer (
- IN EFI_USB_IO_PROTOCOL *This,
- IN EFI_USB_DEVICE_REQUEST *Request,
- IN EFI_USB_DATA_DIRECTION Direction,
- IN UINT32 Timeout,
- IN OUT VOID *Data, OPTIONAL
- IN UINTN DataLength, OPTIONAL
- OUT UINT32 *UsbStatus
- )
-{
- USB_DEVICE *Dev;
- USB_INTERFACE *UsbIf;
- USB_ENDPOINT_DESC *EpDesc;
- EFI_TPL OldTpl;
- EFI_STATUS Status;
-
- if (UsbStatus == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- OldTpl = gBS->RaiseTPL (USB_BUS_TPL);
-
- UsbIf = USB_INTERFACE_FROM_USBIO (This);
- Dev = UsbIf->Device;
-
- Status = UsbHcControlTransfer (
- Dev->Bus,
- Dev->Address,
- Dev->Speed,
- Dev->MaxPacket0,
- Request,
- Direction,
- Data,
- &DataLength,
- (UINTN) Timeout,
- &Dev->Translator,
- UsbStatus
- );
-
- if (EFI_ERROR (Status) || (*UsbStatus != EFI_USB_NOERROR)) {
- //
- // Clear TT buffer when CTRL/BULK split transaction failes
- // Clear the TRANSLATOR TT buffer, not parent's buffer
- //
- ASSERT (Dev->Translator.TranslatorHubAddress < Dev->Bus->MaxDevices);
- if (Dev->Translator.TranslatorHubAddress != 0) {
- UsbHubCtrlClearTTBuffer (
- Dev->Bus->Devices[Dev->Translator.TranslatorHubAddress],
- Dev->Translator.TranslatorPortNumber,
- Dev->Address,
- 0,
- USB_ENDPOINT_CONTROL
- );
- }
-
- goto ON_EXIT;
- }
-
- //
- // Some control transfer will change the device's internal
- // status, such as Set_Configuration and Set_Interface.
- // We must synchronize the bus driver's status with that in
- // device. We ignore the Set_Descriptor request because it's
- // hardly used by any device, especially in pre-boot environment
- //
-
- //
- // Reset the endpoint toggle when endpoint stall is cleared
- //
- if ((Request->Request == USB_REQ_CLEAR_FEATURE) &&
- (Request->RequestType == USB_REQUEST_TYPE (EfiUsbNoData, USB_REQ_TYPE_STANDARD,
- USB_TARGET_ENDPOINT)) &&
- (Request->Value == USB_FEATURE_ENDPOINT_HALT)) {
-
- EpDesc = UsbGetEndpointDesc (UsbIf, (UINT8) Request->Index);
-
- if (EpDesc != NULL) {
- EpDesc->Toggle = 0;
- }
- }
-
- //
- // Select a new configuration. This is a dangerous action. Upper driver
- // should stop use its current UsbIo after calling this driver. The old
- // UsbIo will be uninstalled and new UsbIo be installed. We can't use
- // ReinstallProtocol since interfaces in different configuration may be
- // completely irrelevant.
- //
- if ((Request->Request == USB_REQ_SET_CONFIG) &&
- (Request->RequestType == USB_REQUEST_TYPE (EfiUsbNoData, USB_REQ_TYPE_STANDARD,
- USB_TARGET_DEVICE))) {
- //
- // Don't re-create the USB interfaces if configuration isn't changed.
- //
- if ((Dev->ActiveConfig != NULL) &&
- (Request->Value == Dev->ActiveConfig->Desc.ConfigurationValue)) {
-
- goto ON_EXIT;
- }
- DEBUG ((EFI_D_INFO, "UsbIoControlTransfer: configure changed!!! Do NOT use old UsbIo!!!\n"));
-
- if (Dev->ActiveConfig != NULL) {
- UsbRemoveConfig (Dev);
- }
-
- if (Request->Value != 0) {
- Status = UsbSelectConfig (Dev, (UINT8) Request->Value);
- }
-
- //
- // Exit now, Old USB_IO is invalid now
- //
- goto ON_EXIT;
- }
-
- //
- // A new alternative setting is selected for the interface.
- // No need to reinstall UsbIo in this case because only
- // underlying communication endpoints are changed. Functionality
- // should remains the same.
- //
- if ((Request->Request == USB_REQ_SET_INTERFACE) &&
- (Request->RequestType == USB_REQUEST_TYPE (EfiUsbNoData, USB_REQ_TYPE_STANDARD,
- USB_TARGET_INTERFACE)) &&
- (Request->Index == UsbIf->IfSetting->Desc.InterfaceNumber)) {
-
- Status = UsbSelectSetting (UsbIf->IfDesc, (UINT8) Request->Value);
-
- if (!EFI_ERROR (Status)) {
- ASSERT (UsbIf->IfDesc->ActiveIndex < USB_MAX_INTERFACE_SETTING);
- UsbIf->IfSetting = UsbIf->IfDesc->Settings[UsbIf->IfDesc->ActiveIndex];
- }
- }
-
-ON_EXIT:
- gBS->RestoreTPL (OldTpl);
- return Status;
-}
-
-
-/**
- Execute a bulk transfer to the device endpoint.
-
- @param This The USB IO instance.
- @param Endpoint The device endpoint.
- @param Data The data to transfer.
- @param DataLength The length of the data to transfer.
- @param Timeout Time to wait before timeout.
- @param UsbStatus The result of USB transfer.
-
- @retval EFI_SUCCESS The bulk transfer is OK.
- @retval EFI_INVALID_PARAMETER Some parameters are invalid.
- @retval Others Failed to execute transfer, reason returned in
- UsbStatus.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbIoBulkTransfer (
- IN EFI_USB_IO_PROTOCOL *This,
- IN UINT8 Endpoint,
- IN OUT VOID *Data,
- IN OUT UINTN *DataLength,
- IN UINTN Timeout,
- OUT UINT32 *UsbStatus
- )
-{
- USB_DEVICE *Dev;
- USB_INTERFACE *UsbIf;
- USB_ENDPOINT_DESC *EpDesc;
- UINT8 BufNum;
- UINT8 Toggle;
- EFI_TPL OldTpl;
- EFI_STATUS Status;
-
- if ((USB_ENDPOINT_ADDR (Endpoint) == 0) || (USB_ENDPOINT_ADDR(Endpoint) > 15) ||
- (UsbStatus == NULL)) {
-
- return EFI_INVALID_PARAMETER;
- }
-
- OldTpl = gBS->RaiseTPL (USB_BUS_TPL);
-
- UsbIf = USB_INTERFACE_FROM_USBIO (This);
- Dev = UsbIf->Device;
-
- EpDesc = UsbGetEndpointDesc (UsbIf, Endpoint);
-
- if ((EpDesc == NULL) || (USB_ENDPOINT_TYPE (&EpDesc->Desc) != USB_ENDPOINT_BULK)) {
- Status = EFI_INVALID_PARAMETER;
- goto ON_EXIT;
- }
-
- BufNum = 1;
- Toggle = EpDesc->Toggle;
- Status = UsbHcBulkTransfer (
- Dev->Bus,
- Dev->Address,
- Endpoint,
- Dev->Speed,
- EpDesc->Desc.MaxPacketSize,
- BufNum,
- &Data,
- DataLength,
- &Toggle,
- Timeout,
- &Dev->Translator,
- UsbStatus
- );
-
- EpDesc->Toggle = Toggle;
-
- if (EFI_ERROR (Status) || (*UsbStatus != EFI_USB_NOERROR)) {
- //
- // Clear TT buffer when CTRL/BULK split transaction failes.
- // Clear the TRANSLATOR TT buffer, not parent's buffer
- //
- ASSERT (Dev->Translator.TranslatorHubAddress < Dev->Bus->MaxDevices);
- if (Dev->Translator.TranslatorHubAddress != 0) {
- UsbHubCtrlClearTTBuffer (
- Dev->Bus->Devices[Dev->Translator.TranslatorHubAddress],
- Dev->Translator.TranslatorPortNumber,
- Dev->Address,
- 0,
- USB_ENDPOINT_BULK
- );
- }
- }
-
-ON_EXIT:
- gBS->RestoreTPL (OldTpl);
- return Status;
-}
-
-
-/**
- Execute a synchronous interrupt transfer.
-
- @param This The USB IO instance.
- @param Endpoint The device endpoint.
- @param Data The data to transfer.
- @param DataLength The length of the data to transfer.
- @param Timeout Time to wait before timeout.
- @param UsbStatus The result of USB transfer.
-
- @retval EFI_SUCCESS The synchronous interrupt transfer is OK.
- @retval EFI_INVALID_PARAMETER Some parameters are invalid.
- @retval Others Failed to execute transfer, reason returned in
- UsbStatus.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbIoSyncInterruptTransfer (
- IN EFI_USB_IO_PROTOCOL *This,
- IN UINT8 Endpoint,
- IN OUT VOID *Data,
- IN OUT UINTN *DataLength,
- IN UINTN Timeout,
- OUT UINT32 *UsbStatus
- )
-{
- USB_DEVICE *Dev;
- USB_INTERFACE *UsbIf;
- USB_ENDPOINT_DESC *EpDesc;
- EFI_TPL OldTpl;
- UINT8 Toggle;
- EFI_STATUS Status;
-
- if ((USB_ENDPOINT_ADDR (Endpoint) == 0) || (USB_ENDPOINT_ADDR(Endpoint) > 15) ||
- (UsbStatus == NULL)) {
-
- return EFI_INVALID_PARAMETER;
- }
-
- OldTpl = gBS->RaiseTPL (USB_BUS_TPL);
-
- UsbIf = USB_INTERFACE_FROM_USBIO (This);
- Dev = UsbIf->Device;
-
- EpDesc = UsbGetEndpointDesc (UsbIf, Endpoint);
-
- if ((EpDesc == NULL) || (USB_ENDPOINT_TYPE (&EpDesc->Desc) != USB_ENDPOINT_INTERRUPT)) {
- Status = EFI_INVALID_PARAMETER;
- goto ON_EXIT;
- }
-
- Toggle = EpDesc->Toggle;
- Status = UsbHcSyncInterruptTransfer (
- Dev->Bus,
- Dev->Address,
- Endpoint,
- Dev->Speed,
- EpDesc->Desc.MaxPacketSize,
- Data,
- DataLength,
- &Toggle,
- Timeout,
- &Dev->Translator,
- UsbStatus
- );
-
- EpDesc->Toggle = Toggle;
-
-ON_EXIT:
- gBS->RestoreTPL (OldTpl);
- return Status;
-}
-
-
-/**
- Queue a new asynchronous interrupt transfer, or remove the old
- request if (IsNewTransfer == FALSE).
-
- @param This The USB_IO instance.
- @param Endpoint The device endpoint.
- @param IsNewTransfer Whether this is a new request, if it's old, remove
- the request.
- @param PollInterval The interval to poll the transfer result, (in ms).
- @param DataLength The length of perodic data transfer.
- @param Callback The function to call periodicaly when transfer is
- ready.
- @param Context The context to the callback.
-
- @retval EFI_SUCCESS New transfer is queued or old request is removed.
- @retval EFI_INVALID_PARAMETER Some parameters are invalid.
- @retval Others Failed to queue the new request or remove the old
- request.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbIoAsyncInterruptTransfer (
- IN EFI_USB_IO_PROTOCOL *This,
- IN UINT8 Endpoint,
- IN BOOLEAN IsNewTransfer,
- IN UINTN PollInterval, OPTIONAL
- IN UINTN DataLength, OPTIONAL
- IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback, OPTIONAL
- IN VOID *Context OPTIONAL
- )
-{
- USB_DEVICE *Dev;
- USB_INTERFACE *UsbIf;
- USB_ENDPOINT_DESC *EpDesc;
- EFI_TPL OldTpl;
- UINT8 Toggle;
- EFI_STATUS Status;
-
- if ((USB_ENDPOINT_ADDR (Endpoint) == 0) || (USB_ENDPOINT_ADDR (Endpoint) > 15)) {
- return EFI_INVALID_PARAMETER;
- }
-
- OldTpl = gBS->RaiseTPL (USB_BUS_TPL);
- UsbIf = USB_INTERFACE_FROM_USBIO (This);
- Dev = UsbIf->Device;
-
- EpDesc = UsbGetEndpointDesc (UsbIf, Endpoint);
-
- if ((EpDesc == NULL) || (USB_ENDPOINT_TYPE (&EpDesc->Desc) != USB_ENDPOINT_INTERRUPT)) {
- Status = EFI_INVALID_PARAMETER;
- goto ON_EXIT;
- }
-
- Toggle = EpDesc->Toggle;
- Status = UsbHcAsyncInterruptTransfer (
- Dev->Bus,
- Dev->Address,
- Endpoint,
- Dev->Speed,
- EpDesc->Desc.MaxPacketSize,
- IsNewTransfer,
- &Toggle,
- PollInterval,
- DataLength,
- &Dev->Translator,
- Callback,
- Context
- );
-
- EpDesc->Toggle = Toggle;
-
-ON_EXIT:
- gBS->RestoreTPL (OldTpl);
- return Status;
-}
-
-
-/**
- Execute a synchronous isochronous transfer.
-
- @param This The USB IO instance.
- @param DeviceEndpoint The device endpoint.
- @param Data The data to transfer.
- @param DataLength The length of the data to transfer.
- @param UsbStatus The result of USB transfer.
-
- @retval EFI_UNSUPPORTED Currently isochronous transfer isn't supported.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbIoIsochronousTransfer (
- IN EFI_USB_IO_PROTOCOL *This,
- IN UINT8 DeviceEndpoint,
- IN OUT VOID *Data,
- IN UINTN DataLength,
- OUT UINT32 *Status
- )
-{
- return EFI_UNSUPPORTED;
-}
-
-
-/**
- Queue an asynchronous isochronous transfer.
-
- @param This The USB_IO instance.
- @param DeviceEndpoint The device endpoint.
- @param Data The data to transfer.
- @param DataLength The length of perodic data transfer.
- @param IsochronousCallBack The function to call periodicaly when transfer is
- ready.
- @param Context The context to the callback.
-
- @retval EFI_UNSUPPORTED Currently isochronous transfer isn't supported.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbIoAsyncIsochronousTransfer (
- IN EFI_USB_IO_PROTOCOL *This,
- IN UINT8 DeviceEndpoint,
- IN OUT VOID *Data,
- IN UINTN DataLength,
- IN EFI_ASYNC_USB_TRANSFER_CALLBACK IsochronousCallBack,
- IN VOID *Context OPTIONAL
- )
-{
- return EFI_UNSUPPORTED;
-}
-
-
-/**
- Retrieve the device descriptor of the device.
-
- @param This The USB IO instance.
- @param Descriptor The variable to receive the device descriptor.
-
- @retval EFI_SUCCESS The device descriptor is returned.
- @retval EFI_INVALID_PARAMETER The parameter is invalid.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbIoGetDeviceDescriptor (
- IN EFI_USB_IO_PROTOCOL *This,
- OUT EFI_USB_DEVICE_DESCRIPTOR *Descriptor
- )
-{
- USB_DEVICE *Dev;
- USB_INTERFACE *UsbIf;
- EFI_TPL OldTpl;
-
- if (Descriptor == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- OldTpl = gBS->RaiseTPL (USB_BUS_TPL);
-
- UsbIf = USB_INTERFACE_FROM_USBIO (This);
- Dev = UsbIf->Device;
-
- CopyMem (Descriptor, &Dev->DevDesc->Desc, sizeof (EFI_USB_DEVICE_DESCRIPTOR));
-
- gBS->RestoreTPL (OldTpl);
- return EFI_SUCCESS;
-}
-
-
-/**
- Return the configuration descriptor of the current active configuration.
-
- @param This The USB IO instance.
- @param Descriptor The USB configuration descriptor.
-
- @retval EFI_SUCCESS The active configuration descriptor is returned.
- @retval EFI_INVALID_PARAMETER Some parameter is invalid.
- @retval EFI_NOT_FOUND Currently no active configuration is selected.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbIoGetActiveConfigDescriptor (
- IN EFI_USB_IO_PROTOCOL *This,
- OUT EFI_USB_CONFIG_DESCRIPTOR *Descriptor
- )
-{
- USB_DEVICE *Dev;
- USB_INTERFACE *UsbIf;
- EFI_STATUS Status;
- EFI_TPL OldTpl;
-
- if (Descriptor == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- Status = EFI_SUCCESS;
- OldTpl = gBS->RaiseTPL (USB_BUS_TPL);
-
- UsbIf = USB_INTERFACE_FROM_USBIO (This);
- Dev = UsbIf->Device;
-
- if (Dev->ActiveConfig == NULL) {
- Status = EFI_NOT_FOUND;
- goto ON_EXIT;
- }
-
- CopyMem (Descriptor, &(Dev->ActiveConfig->Desc), sizeof (EFI_USB_CONFIG_DESCRIPTOR));
-
-ON_EXIT:
- gBS->RestoreTPL (OldTpl);
- return Status;
-}
-
-
-/**
- Retrieve the active interface setting descriptor for this USB IO instance.
-
- @param This The USB IO instance.
- @param Descriptor The variable to receive active interface setting.
-
- @retval EFI_SUCCESS The active interface setting is returned.
- @retval EFI_INVALID_PARAMETER Some parameter is invalid.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbIoGetInterfaceDescriptor (
- IN EFI_USB_IO_PROTOCOL *This,
- OUT EFI_USB_INTERFACE_DESCRIPTOR *Descriptor
- )
-{
- USB_INTERFACE *UsbIf;
- EFI_TPL OldTpl;
-
- if (Descriptor == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- OldTpl = gBS->RaiseTPL (USB_BUS_TPL);
-
- UsbIf = USB_INTERFACE_FROM_USBIO (This);
- CopyMem (Descriptor, &(UsbIf->IfSetting->Desc), sizeof (EFI_USB_INTERFACE_DESCRIPTOR));
-
- gBS->RestoreTPL (OldTpl);
- return EFI_SUCCESS;
-}
-
-
-/**
- Retrieve the endpoint descriptor from this interface setting.
-
- @param This The USB IO instance.
- @param Index The index (start from zero) of the endpoint to
- retrieve.
- @param Descriptor The variable to receive the descriptor.
-
- @retval EFI_SUCCESS The endpoint descriptor is returned.
- @retval EFI_INVALID_PARAMETER Some parameter is invalid.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbIoGetEndpointDescriptor (
- IN EFI_USB_IO_PROTOCOL *This,
- IN UINT8 Index,
- OUT EFI_USB_ENDPOINT_DESCRIPTOR *Descriptor
- )
-{
- USB_INTERFACE *UsbIf;
- EFI_TPL OldTpl;
-
- OldTpl = gBS->RaiseTPL (USB_BUS_TPL);
-
- UsbIf = USB_INTERFACE_FROM_USBIO (This);
-
- if ((Descriptor == NULL) || (Index > 15)) {
- gBS->RestoreTPL (OldTpl);
- return EFI_INVALID_PARAMETER;
- }
-
- if (Index >= UsbIf->IfSetting->Desc.NumEndpoints) {
- gBS->RestoreTPL (OldTpl);
- return EFI_NOT_FOUND;
- }
-
- CopyMem (
- Descriptor,
- &(UsbIf->IfSetting->Endpoints[Index]->Desc),
- sizeof (EFI_USB_ENDPOINT_DESCRIPTOR)
- );
-
- gBS->RestoreTPL (OldTpl);
- return EFI_SUCCESS;
-}
-
-
-/**
- Retrieve the supported language ID table from the device.
-
- @param This The USB IO instance.
- @param LangIDTable The table to return the language IDs.
- @param TableSize The size, in bytes, of the table LangIDTable.
-
- @retval EFI_SUCCESS The language ID is return.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbIoGetSupportedLanguages (
- IN EFI_USB_IO_PROTOCOL *This,
- OUT UINT16 **LangIDTable,
- OUT UINT16 *TableSize
- )
-{
- USB_DEVICE *Dev;
- USB_INTERFACE *UsbIf;
- EFI_TPL OldTpl;
-
- OldTpl = gBS->RaiseTPL (USB_BUS_TPL);
-
- UsbIf = USB_INTERFACE_FROM_USBIO (This);
- Dev = UsbIf->Device;
-
- *LangIDTable = Dev->LangId;
- *TableSize = (UINT16) (Dev->TotalLangId * sizeof (UINT16));
-
- gBS->RestoreTPL (OldTpl);
- return EFI_SUCCESS;
-}
-
-
-/**
- Retrieve an indexed string in the language of LangID.
-
- @param This The USB IO instance.
- @param LangID The language ID of the string to retrieve.
- @param StringIndex The index of the string.
- @param String The variable to receive the string.
-
- @retval EFI_SUCCESS The string is returned.
- @retval EFI_NOT_FOUND No such string existed.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbIoGetStringDescriptor (
- IN EFI_USB_IO_PROTOCOL *This,
- IN UINT16 LangID,
- IN UINT8 StringIndex,
- OUT CHAR16 **String
- )
-{
- USB_DEVICE *Dev;
- USB_INTERFACE *UsbIf;
- EFI_USB_STRING_DESCRIPTOR *StrDesc;
- EFI_TPL OldTpl;
- UINT8 *Buf;
- UINT8 Index;
- EFI_STATUS Status;
-
- if ((StringIndex == 0) || (LangID == 0)) {
- return EFI_NOT_FOUND;
- }
-
- OldTpl = gBS->RaiseTPL (USB_BUS_TPL);
-
- UsbIf = USB_INTERFACE_FROM_USBIO (This);
- Dev = UsbIf->Device;
-
- //
- // Check whether language ID is supported
- //
- Status = EFI_NOT_FOUND;
-
- for (Index = 0; Index < Dev->TotalLangId; Index++) {
- ASSERT (Index < USB_MAX_LANG_ID);
- if (Dev->LangId[Index] == LangID) {
- break;
- }
- }
-
- if (Index == Dev->TotalLangId) {
- goto ON_EXIT;
- }
-
- //
- // Retrieve the string descriptor then allocate a buffer
- // to hold the string itself.
- //
- StrDesc = UsbGetOneString (Dev, StringIndex, LangID);
-
- if (StrDesc == NULL) {
- goto ON_EXIT;
- }
-
- if (StrDesc->Length <= 2) {
- goto FREE_STR;
- }
-
- Buf = AllocateZeroPool (StrDesc->Length);
-
- if (Buf == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto FREE_STR;
- }
-
- CopyMem (Buf, StrDesc->String, StrDesc->Length - 2);
- *String = (CHAR16 *) Buf;
- Status = EFI_SUCCESS;
-
-FREE_STR:
- gBS->FreePool (StrDesc);
-
-ON_EXIT:
- gBS->RestoreTPL (OldTpl);
- return Status;
-}
-
-
-/**
- Reset the device, then if that succeeds, reconfigure the
- device with its address and current active configuration.
-
- @param This The USB IO instance.
-
- @retval EFI_SUCCESS The device is reset and configured.
- @retval Others Failed to reset the device.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbIoPortReset (
- IN EFI_USB_IO_PROTOCOL *This
- )
-{
- USB_INTERFACE *UsbIf;
- USB_INTERFACE *HubIf;
- USB_DEVICE *Dev;
- EFI_TPL OldTpl;
- EFI_STATUS Status;
- UINT8 DevAddress;
-
- OldTpl = gBS->RaiseTPL (USB_BUS_TPL);
-
- UsbIf = USB_INTERFACE_FROM_USBIO (This);
- Dev = UsbIf->Device;
-
- if (UsbIf->IsHub) {
- Status = EFI_INVALID_PARAMETER;
- goto ON_EXIT;
- }
-
- HubIf = Dev->ParentIf;
- Status = HubIf->HubApi->ResetPort (HubIf, Dev->ParentPort);
-
- if (EFI_ERROR (Status)) {
- DEBUG (( EFI_D_ERROR, "UsbIoPortReset: failed to reset hub port %d@hub %d, %r \n",
- Dev->ParentPort, Dev->ParentAddr, Status));
-
- goto ON_EXIT;
- }
-
- HubIf->HubApi->ClearPortChange (HubIf, Dev->ParentPort);
-
- //
- // Reset the device to its current address. The device now has an address
- // of ZERO after port reset, so need to set Dev->Address to the device again for
- // host to communicate with it.
- //
- DevAddress = Dev->Address;
- Dev->Address = 0;
- Status = UsbSetAddress (Dev, DevAddress);
- Dev->Address = DevAddress;
-
- gBS->Stall (USB_SET_DEVICE_ADDRESS_STALL);
-
- if (EFI_ERROR (Status)) {
- //
- // It may fail due to device disconnection or other reasons.
- //
- DEBUG (( EFI_D_ERROR, "UsbIoPortReset: failed to set address for device %d - %r\n",
- Dev->Address, Status));
-
- goto ON_EXIT;
- }
-
- DEBUG (( EFI_D_INFO, "UsbIoPortReset: device is now ADDRESSED at %d\n", Dev->Address));
-
- //
- // Reset the current active configure, after this device
- // is in CONFIGURED state.
- //
- if (Dev->ActiveConfig != NULL) {
- Status = UsbSetConfig (Dev, Dev->ActiveConfig->Desc.ConfigurationValue);
-
- if (EFI_ERROR (Status)) {
- DEBUG (( EFI_D_ERROR, "UsbIoPortReset: failed to set configure for device %d - %r\n",
- Dev->Address, Status));
- }
- }
-
-ON_EXIT:
- gBS->RestoreTPL (OldTpl);
- return Status;
-}
-
-
-/**
- Install Usb Bus Protocol on host controller, and start the Usb bus.
-
- @param This The USB bus driver binding instance.
- @param Controller The controller to check.
- @param RemainingDevicePath The remaining device patch.
-
- @retval EFI_SUCCESS The controller is controlled by the usb bus.
- @retval EFI_ALREADY_STARTED The controller is already controlled by the usb bus.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate resources.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbBusBuildProtocol (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
- )
-{
- USB_BUS *UsbBus;
- USB_DEVICE *RootHub;
- USB_INTERFACE *RootIf;
- EFI_STATUS Status;
- EFI_STATUS Status2;
-
- UsbBus = AllocateZeroPool (sizeof (USB_BUS));
-
- if (UsbBus == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- UsbBus->Signature = USB_BUS_SIGNATURE;
- UsbBus->HostHandle = Controller;
- UsbBus->MaxDevices = USB_MAX_DEVICES;
-
- Status = gBS->OpenProtocol (
- Controller,
- &gEfiDevicePathProtocolGuid,
- (VOID **) &UsbBus->DevicePath,
- This->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_BY_DRIVER
- );
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "UsbBusStart: Failed to open device path %r\n", Status));
-
- FreePool (UsbBus);
- return Status;
- }
-
- //
- // Get USB_HC2/USB_HC host controller protocol (EHCI/UHCI).
- // This is for backward compatibility with EFI 1.x. In UEFI
- // 2.x, USB_HC2 replaces USB_HC. We will open both USB_HC2
- // and USB_HC because EHCI driver will install both protocols
- // (for the same reason). If we don't consume both of them,
- // the unconsumed one may be opened by others.
- //
- Status = gBS->OpenProtocol (
- Controller,
- &gEfiUsb2HcProtocolGuid,
- (VOID **) &(UsbBus->Usb2Hc),
- This->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_BY_DRIVER
- );
-
- Status2 = gBS->OpenProtocol (
- Controller,
- &gEfiUsbHcProtocolGuid,
- (VOID **) &(UsbBus->UsbHc),
- This->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_BY_DRIVER
- );
-
- if (EFI_ERROR (Status) && EFI_ERROR (Status2)) {
- DEBUG ((EFI_D_ERROR, "UsbBusStart: Failed to open USB_HC/USB2_HC %r\n", Status));
-
- Status = EFI_DEVICE_ERROR;
- goto CLOSE_HC;
- }
-
- if (!EFI_ERROR (Status)) {
- //
- // The EFI_USB2_HC_PROTOCOL is produced for XHCI support.
- // Then its max supported devices are 256. Otherwise it's 128.
- //
- ASSERT (UsbBus->Usb2Hc != NULL);
- if (UsbBus->Usb2Hc->MajorRevision == 0x3) {
- UsbBus->MaxDevices = 256;
- }
- }
-
- UsbHcReset (UsbBus, EFI_USB_HC_RESET_GLOBAL);
- UsbHcSetState (UsbBus, EfiUsbHcStateOperational);
-
- //
- // Install an EFI_USB_BUS_PROTOCOL to host controller to identify it.
- //
- Status = gBS->InstallProtocolInterface (
- &Controller,
- &gEfiCallerIdGuid,
- EFI_NATIVE_INTERFACE,
- &UsbBus->BusId
- );
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "UsbBusStart: Failed to install bus protocol %r\n", Status));
- goto CLOSE_HC;
- }
-
- //
- // Initial the wanted child device path list, and add first RemainingDevicePath
- //
- InitializeListHead (&UsbBus->WantedUsbIoDPList);
- Status = UsbBusAddWantedUsbIoDP (&UsbBus->BusId, RemainingDevicePath);
- ASSERT (!EFI_ERROR (Status));
- //
- // Create a fake usb device for root hub
- //
- RootHub = AllocateZeroPool (sizeof (USB_DEVICE));
-
- if (RootHub == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto UNINSTALL_USBBUS;
- }
-
- RootIf = AllocateZeroPool (sizeof (USB_INTERFACE));
-
- if (RootIf == NULL) {
- FreePool (RootHub);
- Status = EFI_OUT_OF_RESOURCES;
- goto FREE_ROOTHUB;
- }
-
- RootHub->Bus = UsbBus;
- RootHub->NumOfInterface = 1;
- RootHub->Interfaces[0] = RootIf;
- RootHub->Tier = 0;
- RootIf->Signature = USB_INTERFACE_SIGNATURE;
- RootIf->Device = RootHub;
- RootIf->DevicePath = UsbBus->DevicePath;
-
- //
- // Report Status Code here since we will enumerate the USB devices
- //
- REPORT_STATUS_CODE_WITH_DEVICE_PATH (
- EFI_PROGRESS_CODE,
- (EFI_IO_BUS_USB | EFI_IOB_PC_DETECT),
- UsbBus->DevicePath
- );
-
- Status = mUsbRootHubApi.Init (RootIf);
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "UsbBusStart: Failed to init root hub %r\n", Status));
- goto FREE_ROOTHUB;
- }
-
- UsbBus->Devices[0] = RootHub;
-
- DEBUG ((EFI_D_INFO, "UsbBusStart: usb bus started on %p, root hub %p\n", Controller, RootIf));
- return EFI_SUCCESS;
-
-FREE_ROOTHUB:
- if (RootIf != NULL) {
- FreePool (RootIf);
- }
- if (RootHub != NULL) {
- FreePool (RootHub);
- }
-
-UNINSTALL_USBBUS:
- gBS->UninstallProtocolInterface (Controller, &gEfiCallerIdGuid, &UsbBus->BusId);
-
-CLOSE_HC:
- if (UsbBus->Usb2Hc != NULL) {
- gBS->CloseProtocol (
- Controller,
- &gEfiUsb2HcProtocolGuid,
- This->DriverBindingHandle,
- Controller
- );
- }
- if (UsbBus->UsbHc != NULL) {
- gBS->CloseProtocol (
- Controller,
- &gEfiUsbHcProtocolGuid,
- This->DriverBindingHandle,
- Controller
- );
- }
- gBS->CloseProtocol (
- Controller,
- &gEfiDevicePathProtocolGuid,
- This->DriverBindingHandle,
- Controller
- );
- FreePool (UsbBus);
-
- DEBUG ((EFI_D_ERROR, "UsbBusStart: Failed to start bus driver %r\n", Status));
- return Status;
-}
-
-
-/**
- The USB bus driver entry pointer.
-
- @param ImageHandle The driver image handle.
- @param SystemTable The system table.
-
- @return EFI_SUCCESS The component name protocol is installed.
- @return Others Failed to init the usb driver.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbBusDriverEntryPoint (
- IN EFI_HANDLE ImageHandle,
- IN EFI_SYSTEM_TABLE *SystemTable
- )
-{
- return EfiLibInstallDriverBindingComponentName2 (
- ImageHandle,
- SystemTable,
- &mUsbBusDriverBinding,
- ImageHandle,
- &mUsbBusComponentName,
- &mUsbBusComponentName2
- );
-}
-
-
-/**
- Check whether USB bus driver support this device.
-
- @param This The USB bus driver binding protocol.
- @param Controller The controller handle to check.
- @param RemainingDevicePath The remaining device path.
-
- @retval EFI_SUCCESS The bus supports this controller.
- @retval EFI_UNSUPPORTED This device isn't supported.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbBusControllerDriverSupported (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
- )
-{
- EFI_DEV_PATH_PTR DevicePathNode;
- EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
- EFI_USB2_HC_PROTOCOL *Usb2Hc;
- EFI_USB_HC_PROTOCOL *UsbHc;
- EFI_STATUS Status;
-
- //
- // Check whether device path is valid
- //
- if (RemainingDevicePath != NULL) {
- //
- // Check if RemainingDevicePath is the End of Device Path Node,
- // if yes, go on checking other conditions
- //
- if (!IsDevicePathEnd (RemainingDevicePath)) {
- //
- // If RemainingDevicePath isn't the End of Device Path Node,
- // check its validation
- //
- DevicePathNode.DevPath = RemainingDevicePath;
-
- if ((DevicePathNode.DevPath->Type != MESSAGING_DEVICE_PATH) ||
- (DevicePathNode.DevPath->SubType != MSG_USB_DP &&
- DevicePathNode.DevPath->SubType != MSG_USB_CLASS_DP
- && DevicePathNode.DevPath->SubType != MSG_USB_WWID_DP
- )) {
-
- return EFI_UNSUPPORTED;
- }
- }
- }
-
- //
- // Check whether USB_HC2 protocol is installed
- //
- Status = gBS->OpenProtocol (
- Controller,
- &gEfiUsb2HcProtocolGuid,
- (VOID **) &Usb2Hc,
- This->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_BY_DRIVER
- );
- if (Status == EFI_ALREADY_STARTED) {
- return EFI_SUCCESS;
- }
-
- if (EFI_ERROR (Status)) {
- //
- // If failed to open USB_HC2, fall back to USB_HC
- //
- Status = gBS->OpenProtocol (
- Controller,
- &gEfiUsbHcProtocolGuid,
- (VOID **) &UsbHc,
- This->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_BY_DRIVER
- );
- if (Status == EFI_ALREADY_STARTED) {
- return EFI_SUCCESS;
- }
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- //
- // Close the USB_HC used to perform the supported test
- //
- gBS->CloseProtocol (
- Controller,
- &gEfiUsbHcProtocolGuid,
- This->DriverBindingHandle,
- Controller
- );
-
- } else {
-
- //
- // Close the USB_HC2 used to perform the supported test
- //
- gBS->CloseProtocol (
- Controller,
- &gEfiUsb2HcProtocolGuid,
- This->DriverBindingHandle,
- Controller
- );
- }
-
- //
- // Open the EFI Device Path protocol needed to perform the supported test
- //
- Status = gBS->OpenProtocol (
- Controller,
- &gEfiDevicePathProtocolGuid,
- (VOID **) &ParentDevicePath,
- This->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_BY_DRIVER
- );
- if (Status == EFI_ALREADY_STARTED) {
- return EFI_SUCCESS;
- }
-
- if (!EFI_ERROR (Status)) {
- //
- // Close protocol, don't use device path protocol in the Support() function
- //
- gBS->CloseProtocol (
- Controller,
- &gEfiDevicePathProtocolGuid,
- This->DriverBindingHandle,
- Controller
- );
-
- return EFI_SUCCESS;
- }
-
- return Status;
-}
-
-
-/**
- Start to process the controller.
-
- @param This The USB bus driver binding instance.
- @param Controller The controller to check.
- @param RemainingDevicePath The remaining device patch.
-
- @retval EFI_SUCCESS The controller is controlled by the usb bus.
- @retval EFI_ALREADY_STARTED The controller is already controlled by the usb
- bus.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate resources.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbBusControllerDriverStart (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
- )
-{
- EFI_USB_BUS_PROTOCOL *UsbBusId;
- EFI_STATUS Status;
- EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
-
- Status = gBS->OpenProtocol (
- Controller,
- &gEfiDevicePathProtocolGuid,
- (VOID **) &ParentDevicePath,
- This->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
- ASSERT_EFI_ERROR (Status);
-
- //
- // Report Status Code here since we will initialize the host controller
- //
- REPORT_STATUS_CODE_WITH_DEVICE_PATH (
- EFI_PROGRESS_CODE,
- (EFI_IO_BUS_USB | EFI_IOB_PC_INIT),
- ParentDevicePath
- );
-
- //
- // Locate the USB bus protocol, if it is found, USB bus
- // is already started on this controller.
- //
- Status = gBS->OpenProtocol (
- Controller,
- &gEfiCallerIdGuid,
- (VOID **) &UsbBusId,
- This->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
-
- if (EFI_ERROR (Status)) {
- //
- // If first start, build the bus execute environment and install bus protocol
- //
- REPORT_STATUS_CODE (EFI_PROGRESS_CODE, (EFI_IO_BUS_USB | EFI_P_PC_ENABLE));
- Status = UsbBusBuildProtocol (This, Controller, RemainingDevicePath);
- if (EFI_ERROR (Status)) {
- return Status;
- }
- //
- // Try get the Usb Bus protocol interface again
- //
- Status = gBS->OpenProtocol (
- Controller,
- &gEfiCallerIdGuid,
- (VOID **) &UsbBusId,
- This->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
- ASSERT (!EFI_ERROR (Status));
- } else {
- //
- // USB Bus driver need to control the recursive connect policy of the bus, only those wanted
- // usb child device will be recursively connected.
- // The RemainingDevicePath indicate the child usb device which user want to fully recursively connecte this time.
- // All wanted usb child devices will be remembered by the usb bus driver itself.
- // If RemainingDevicePath == NULL, all the usb child devices in the usb bus are wanted devices.
- //
- // Save the passed in RemainingDevicePath this time
- //
- if (RemainingDevicePath != NULL) {
- if (IsDevicePathEnd (RemainingDevicePath)) {
- //
- // If RemainingDevicePath is the End of Device Path Node,
- // skip enumerate any device and return EFI_SUCESSS
- //
- return EFI_SUCCESS;
- }
- }
-
- Status = UsbBusAddWantedUsbIoDP (UsbBusId, RemainingDevicePath);
- ASSERT (!EFI_ERROR (Status));
- //
- // Ensure all wanted child usb devices are fully recursively connected
- //
- Status = UsbBusRecursivelyConnectWantedUsbIo (UsbBusId);
- ASSERT (!EFI_ERROR (Status));
- }
-
-
- return EFI_SUCCESS;
-}
-
-
-/**
- Stop handle the controller by this USB bus driver.
-
- @param This The USB bus driver binding protocol.
- @param Controller The controller to release.
- @param NumberOfChildren The child of USB bus that opened controller
- BY_CHILD.
- @param ChildHandleBuffer The array of child handle.
-
- @retval EFI_SUCCESS The controller or children are stopped.
- @retval EFI_DEVICE_ERROR Failed to stop the driver.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbBusControllerDriverStop (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN UINTN NumberOfChildren,
- IN EFI_HANDLE *ChildHandleBuffer
- )
-{
- USB_BUS *Bus;
- USB_DEVICE *RootHub;
- USB_DEVICE *UsbDev;
- USB_INTERFACE *RootIf;
- USB_INTERFACE *UsbIf;
- EFI_USB_BUS_PROTOCOL *BusId;
- EFI_USB_IO_PROTOCOL *UsbIo;
- EFI_TPL OldTpl;
- UINTN Index;
- EFI_STATUS Status;
- EFI_STATUS ReturnStatus;
-
- Status = EFI_SUCCESS;
-
- if (NumberOfChildren > 0) {
- //
- // BugBug: Raise TPL to callback level instead of USB_BUS_TPL to avoid TPL conflict
- //
- OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
-
- ReturnStatus = EFI_SUCCESS;
- for (Index = 0; Index < NumberOfChildren; Index++) {
- Status = gBS->OpenProtocol (
- ChildHandleBuffer[Index],
- &gEfiUsbIoProtocolGuid,
- (VOID **) &UsbIo,
- This->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
-
- if (EFI_ERROR (Status)) {
- //
- // It is possible that the child has already been released:
- // 1. For combo device, free one device will release others.
- // 2. If a hub is released, all devices on its down facing
- // ports are released also.
- //
- continue;
- }
-
- UsbIf = USB_INTERFACE_FROM_USBIO (UsbIo);
- UsbDev = UsbIf->Device;
-
- ReturnStatus = UsbRemoveDevice (UsbDev);
- }
-
- gBS->RestoreTPL (OldTpl);
- return ReturnStatus;
- }
-
- DEBUG (( EFI_D_INFO, "UsbBusStop: usb bus stopped on %p\n", Controller));
-
- //
- // Locate USB_BUS for the current host controller
- //
- Status = gBS->OpenProtocol (
- Controller,
- &gEfiCallerIdGuid,
- (VOID **) &BusId,
- This->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- Bus = USB_BUS_FROM_THIS (BusId);
-
- //
- // Stop the root hub, then free all the devices
- //
- // BugBug: Raise TPL to callback level instead of USB_BUS_TPL to avoid TPL conflict
- //
- OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
-
- RootHub = Bus->Devices[0];
- RootIf = RootHub->Interfaces[0];
-
- ASSERT (Bus->MaxDevices <= 256);
- ReturnStatus = EFI_SUCCESS;
- for (Index = 1; Index < Bus->MaxDevices; Index++) {
- if (Bus->Devices[Index] != NULL) {
- Status = UsbRemoveDevice (Bus->Devices[Index]);
- if (EFI_ERROR (Status)) {
- ReturnStatus = Status;
- }
- }
- }
-
- gBS->RestoreTPL (OldTpl);
-
- if (!EFI_ERROR (ReturnStatus)) {
- mUsbRootHubApi.Release (RootIf);
- gBS->FreePool (RootIf);
- gBS->FreePool (RootHub);
-
- Status = UsbBusFreeUsbDPList (&Bus->WantedUsbIoDPList);
- ASSERT (!EFI_ERROR (Status));
-
- //
- // Uninstall the bus identifier and close USB_HC/USB2_HC protocols
- //
- gBS->UninstallProtocolInterface (Controller, &gEfiCallerIdGuid, &Bus->BusId);
-
- if (Bus->Usb2Hc != NULL) {
- Status = gBS->CloseProtocol (
- Controller,
- &gEfiUsb2HcProtocolGuid,
- This->DriverBindingHandle,
- Controller
- );
- }
-
- if (Bus->UsbHc != NULL) {
- Status = gBS->CloseProtocol (
- Controller,
- &gEfiUsbHcProtocolGuid,
- This->DriverBindingHandle,
- Controller
- );
- }
-
- if (!EFI_ERROR (Status)) {
- gBS->CloseProtocol (
- Controller,
- &gEfiDevicePathProtocolGuid,
- This->DriverBindingHandle,
- Controller
- );
-
- gBS->FreePool (Bus);
- }
- }
- return Status;
-}
diff --git a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBus.h b/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBus.h
deleted file mode 100644
index 9ede83ab7e..0000000000
--- a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBus.h
+++ /dev/null
@@ -1,770 +0,0 @@
-/** @file
-
- Usb Bus Driver Binding and Bus IO Protocol.
-
-Copyright (c) 2004 - 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_USB_BUS_H_
-#define _EFI_USB_BUS_H_
-
-
-#include <Uefi.h>
-
-#include <Protocol/Usb2HostController.h>
-#include <Protocol/UsbHostController.h>
-#include <Protocol/UsbIo.h>
-#include <Protocol/DevicePath.h>
-
-#include <Library/BaseLib.h>
-#include <Library/DebugLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/UefiDriverEntryPoint.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiLib.h>
-#include <Library/DevicePathLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/ReportStatusCodeLib.h>
-
-
-#include <IndustryStandard/Usb.h>
-
-typedef struct _USB_DEVICE USB_DEVICE;
-typedef struct _USB_INTERFACE USB_INTERFACE;
-typedef struct _USB_BUS USB_BUS;
-typedef struct _USB_HUB_API USB_HUB_API;
-
-
-#include "UsbUtility.h"
-#include "UsbDesc.h"
-#include "UsbHub.h"
-#include "UsbEnumer.h"
-
-//
-// USB bus timeout experience values
-//
-
-#define USB_MAX_LANG_ID 16
-#define USB_MAX_INTERFACE 16
-#define USB_MAX_DEVICES 128
-
-#define USB_BUS_1_MILLISECOND 1000
-
-//
-// Roothub and hub's polling interval, set by experience,
-// The unit of roothub is 100us, means 100ms as interval, and
-// the unit of hub is 1ms, means 64ms as interval.
-//
-#define USB_ROOTHUB_POLL_INTERVAL (100 * 10000U)
-#define USB_HUB_POLL_INTERVAL 64
-
-//
-// Wait for port stable to work, refers to specification
-// [USB20-9.1.2]
-//
-#define USB_WAIT_PORT_STABLE_STALL (100 * USB_BUS_1_MILLISECOND)
-
-//
-// Wait for port statue reg change, set by experience
-//
-#define USB_WAIT_PORT_STS_CHANGE_STALL (100)
-
-//
-// Wait for set device address, refers to specification
-// [USB20-9.2.6.3, it says 2ms]
-//
-#define USB_SET_DEVICE_ADDRESS_STALL (2 * USB_BUS_1_MILLISECOND)
-
-//
-// Wait for retry max packet size, set by experience
-//
-#define USB_RETRY_MAX_PACK_SIZE_STALL (100 * USB_BUS_1_MILLISECOND)
-
-//
-// Wait for hub port power-on, refers to specification
-// [USB20-11.23.2]
-//
-#define USB_SET_PORT_POWER_STALL (2 * USB_BUS_1_MILLISECOND)
-
-//
-// Wait for port reset, refers to specification
-// [USB20-7.1.7.5, it says 10ms for hub and 50ms for
-// root hub]
-//
-// According to USB2.0, Chapter 11.5.1.5 Resetting,
-// the worst case for TDRST is 20ms
-//
-#define USB_SET_PORT_RESET_STALL (20 * USB_BUS_1_MILLISECOND)
-#define USB_SET_ROOT_PORT_RESET_STALL (50 * USB_BUS_1_MILLISECOND)
-
-//
-// Wait for port recovery to accept SetAddress, refers to specification
-// [USB20-7.1.7.5, it says 10 ms for TRSTRCY]
-//
-#define USB_SET_PORT_RECOVERY_STALL (10 * USB_BUS_1_MILLISECOND)
-
-//
-// Wait for clear roothub port reset, set by experience
-//
-#define USB_CLR_ROOT_PORT_RESET_STALL (20 * USB_BUS_1_MILLISECOND)
-
-//
-// Wait for set roothub port enable, set by experience
-//
-#define USB_SET_ROOT_PORT_ENABLE_STALL (20 * USB_BUS_1_MILLISECOND)
-
-//
-// Send general device request timeout.
-//
-// The USB Specification 2.0, section 11.24.1 recommends a value of
-// 50 milliseconds. We use a value of 500 milliseconds to work
-// around slower hubs and devices.
-//
-#define USB_GENERAL_DEVICE_REQUEST_TIMEOUT 500
-
-//
-// Send clear feature request timeout, set by experience
-//
-#define USB_CLEAR_FEATURE_REQUEST_TIMEOUT 10
-
-//
-// Bus raises TPL to TPL_NOTIFY to serialize all its operations
-// to protect shared data structures.
-//
-#define USB_BUS_TPL TPL_NOTIFY
-
-#define USB_INTERFACE_SIGNATURE SIGNATURE_32 ('U', 'S', 'B', 'I')
-#define USB_BUS_SIGNATURE SIGNATURE_32 ('U', 'S', 'B', 'B')
-
-#define USB_BIT(a) ((UINTN)(1 << (a)))
-#define USB_BIT_IS_SET(Data, Bit) ((BOOLEAN)(((Data) & (Bit)) == (Bit)))
-
-#define USB_INTERFACE_FROM_USBIO(a) \
- CR(a, USB_INTERFACE, UsbIo, USB_INTERFACE_SIGNATURE)
-
-#define USB_BUS_FROM_THIS(a) \
- CR(a, USB_BUS, BusId, USB_BUS_SIGNATURE)
-
-//
-// Used to locate USB_BUS
-// UsbBusProtocol is the private protocol.
-// gEfiCallerIdGuid will be used as its protocol guid.
-//
-typedef struct _EFI_USB_BUS_PROTOCOL {
- UINT64 Reserved;
-} EFI_USB_BUS_PROTOCOL;
-
-
-//
-// Stands for the real USB device. Each device may
-// has several seperately working interfaces.
-//
-struct _USB_DEVICE {
- USB_BUS *Bus;
-
- //
- // Configuration information
- //
- UINT8 Speed;
- UINT8 Address;
- UINT32 MaxPacket0;
-
- //
- // The device's descriptors and its configuration
- //
- USB_DEVICE_DESC *DevDesc;
- USB_CONFIG_DESC *ActiveConfig;
-
- UINT16 LangId [USB_MAX_LANG_ID];
- UINT16 TotalLangId;
-
- UINT8 NumOfInterface;
- USB_INTERFACE *Interfaces [USB_MAX_INTERFACE];
-
- //
- // Parent child relationship
- //
- EFI_USB2_HC_TRANSACTION_TRANSLATOR Translator;
-
- UINT8 ParentAddr;
- USB_INTERFACE *ParentIf;
- UINT8 ParentPort; // Start at 0
- UINT8 Tier;
- BOOLEAN DisconnectFail;
-};
-
-//
-// Stands for different functions of USB device
-//
-struct _USB_INTERFACE {
- UINTN Signature;
- USB_DEVICE *Device;
- USB_INTERFACE_DESC *IfDesc;
- USB_INTERFACE_SETTING *IfSetting;
-
- //
- // Handles and protocols
- //
- EFI_HANDLE Handle;
- EFI_USB_IO_PROTOCOL UsbIo;
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;
- BOOLEAN IsManaged;
-
- //
- // Hub device special data
- //
- BOOLEAN IsHub;
- USB_HUB_API *HubApi;
- UINT8 NumOfPort;
- EFI_EVENT HubNotify;
-
- //
- // Data used only by normal hub devices
- //
- USB_ENDPOINT_DESC *HubEp;
- UINT8 *ChangeMap;
-
- //
- // Data used only by root hub to hand over device to
- // companion UHCI driver if low/full speed devices are
- // connected to EHCI.
- //
- UINT8 MaxSpeed;
-};
-
-//
-// Stands for the current USB Bus
-//
-struct _USB_BUS {
- UINTN Signature;
- EFI_USB_BUS_PROTOCOL BusId;
-
- //
- // Managed USB host controller
- //
- EFI_HANDLE HostHandle;
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;
- EFI_USB2_HC_PROTOCOL *Usb2Hc;
- EFI_USB_HC_PROTOCOL *UsbHc;
-
- //
- // Recorded the max supported usb devices.
- // XHCI can support up to 255 devices.
- // EHCI/UHCI/OHCI supports up to 127 devices.
- //
- UINT32 MaxDevices;
- //
- // An array of device that is on the bus. Devices[0] is
- // for root hub. Device with address i is at Devices[i].
- //
- USB_DEVICE *Devices[256];
-
- //
- // USB Bus driver need to control the recursive connect policy of the bus, only those wanted
- // usb child device will be recursively connected.
- //
- // WantedUsbIoDPList tracks the Usb child devices which user want to recursivly fully connecte,
- // every wanted child device is stored in a item of the WantedUsbIoDPList, whose structrure is
- // DEVICE_PATH_LIST_ITEM
- //
- LIST_ENTRY WantedUsbIoDPList;
-
-};
-
-//
-// USB Hub Api
-//
-struct _USB_HUB_API{
- USB_HUB_INIT Init;
- USB_HUB_GET_PORT_STATUS GetPortStatus;
- USB_HUB_CLEAR_PORT_CHANGE ClearPortChange;
- USB_HUB_SET_PORT_FEATURE SetPortFeature;
- USB_HUB_CLEAR_PORT_FEATURE ClearPortFeature;
- USB_HUB_RESET_PORT ResetPort;
- USB_HUB_RELEASE Release;
-};
-
-#define USB_US_LAND_ID 0x0409
-
-#define DEVICE_PATH_LIST_ITEM_SIGNATURE SIGNATURE_32('d','p','l','i')
-typedef struct _DEVICE_PATH_LIST_ITEM{
- UINTN Signature;
- LIST_ENTRY Link;
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;
-} DEVICE_PATH_LIST_ITEM;
-
-typedef struct {
- USB_CLASS_DEVICE_PATH UsbClass;
- EFI_DEVICE_PATH_PROTOCOL End;
-} USB_CLASS_FORMAT_DEVICE_PATH;
-
-/**
- Free a DEVICE_PATH_LIST_ITEM list.
-
- @param UsbIoDPList a DEVICE_PATH_LIST_ITEM list pointer.
-
- @retval EFI_INVALID_PARAMETER If parameters are invalid, return this value.
- @retval EFI_SUCCESS If free operation is successful, return this value.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbBusFreeUsbDPList (
- IN LIST_ENTRY *UsbIoDPList
- );
-
-/**
- Store a wanted usb child device info (its Usb part of device path) which is indicated by
- RemainingDevicePath in a Usb bus which is indicated by UsbBusId.
-
- @param UsbBusId Point to EFI_USB_BUS_PROTOCOL interface.
- @param RemainingDevicePath The remaining device patch.
-
- @retval EFI_SUCCESS Add operation is successful.
- @retval EFI_INVALID_PARAMETER The parameters are invalid.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbBusAddWantedUsbIoDP (
- IN EFI_USB_BUS_PROTOCOL *UsbBusId,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
- );
-
-/**
- Check whether a usb child device is the wanted device in a bus.
-
- @param Bus The Usb bus's private data pointer.
- @param UsbIf The usb child device inferface.
-
- @retval True If a usb child device is the wanted device in a bus.
- @retval False If a usb child device is *NOT* the wanted device in a bus.
-
-**/
-BOOLEAN
-EFIAPI
-UsbBusIsWantedUsbIO (
- IN USB_BUS *Bus,
- IN USB_INTERFACE *UsbIf
- );
-
-/**
- Recursively connnect every wanted usb child device to ensure they all fully connected.
- Check all the child Usb IO handles in this bus, recursively connecte if it is wanted usb child device.
-
- @param UsbBusId Point to EFI_USB_BUS_PROTOCOL interface.
-
- @retval EFI_SUCCESS Connect is done successfully.
- @retval EFI_INVALID_PARAMETER The parameter is invalid.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbBusRecursivelyConnectWantedUsbIo (
- IN EFI_USB_BUS_PROTOCOL *UsbBusId
- );
-
-/**
- USB_IO function to execute a control transfer. This
- function will execute the USB transfer. If transfer
- successes, it will sync the internal state of USB bus
- with device state.
-
- @param This The USB_IO instance
- @param Request The control transfer request
- @param Direction Direction for data stage
- @param Timeout The time to wait before timeout
- @param Data The buffer holding the data
- @param DataLength Then length of the data
- @param UsbStatus USB result
-
- @retval EFI_INVALID_PARAMETER The parameters are invalid
- @retval EFI_SUCCESS The control transfer succeded.
- @retval Others Failed to execute the transfer
-
-**/
-EFI_STATUS
-EFIAPI
-UsbIoControlTransfer (
- IN EFI_USB_IO_PROTOCOL *This,
- IN EFI_USB_DEVICE_REQUEST *Request,
- IN EFI_USB_DATA_DIRECTION Direction,
- IN UINT32 Timeout,
- IN OUT VOID *Data, OPTIONAL
- IN UINTN DataLength, OPTIONAL
- OUT UINT32 *UsbStatus
- );
-
-/**
- Execute a bulk transfer to the device endpoint.
-
- @param This The USB IO instance.
- @param Endpoint The device endpoint.
- @param Data The data to transfer.
- @param DataLength The length of the data to transfer.
- @param Timeout Time to wait before timeout.
- @param UsbStatus The result of USB transfer.
-
- @retval EFI_SUCCESS The bulk transfer is OK.
- @retval EFI_INVALID_PARAMETER Some parameters are invalid.
- @retval Others Failed to execute transfer, reason returned in
- UsbStatus.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbIoBulkTransfer (
- IN EFI_USB_IO_PROTOCOL *This,
- IN UINT8 Endpoint,
- IN OUT VOID *Data,
- IN OUT UINTN *DataLength,
- IN UINTN Timeout,
- OUT UINT32 *UsbStatus
- );
-
-/**
- Execute a synchronous interrupt transfer.
-
- @param This The USB IO instance.
- @param Endpoint The device endpoint.
- @param Data The data to transfer.
- @param DataLength The length of the data to transfer.
- @param Timeout Time to wait before timeout.
- @param UsbStatus The result of USB transfer.
-
- @retval EFI_SUCCESS The synchronous interrupt transfer is OK.
- @retval EFI_INVALID_PARAMETER Some parameters are invalid.
- @retval Others Failed to execute transfer, reason returned in
- UsbStatus.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbIoSyncInterruptTransfer (
- IN EFI_USB_IO_PROTOCOL *This,
- IN UINT8 Endpoint,
- IN OUT VOID *Data,
- IN OUT UINTN *DataLength,
- IN UINTN Timeout,
- OUT UINT32 *UsbStatus
- );
-
-/**
- Queue a new asynchronous interrupt transfer, or remove the old
- request if (IsNewTransfer == FALSE).
-
- @param This The USB_IO instance.
- @param Endpoint The device endpoint.
- @param IsNewTransfer Whether this is a new request, if it's old, remove
- the request.
- @param PollInterval The interval to poll the transfer result, (in ms).
- @param DataLength The length of perodic data transfer.
- @param Callback The function to call periodicaly when transfer is
- ready.
- @param Context The context to the callback.
-
- @retval EFI_SUCCESS New transfer is queued or old request is removed.
- @retval EFI_INVALID_PARAMETER Some parameters are invalid.
- @retval Others Failed to queue the new request or remove the old
- request.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbIoAsyncInterruptTransfer (
- IN EFI_USB_IO_PROTOCOL *This,
- IN UINT8 Endpoint,
- IN BOOLEAN IsNewTransfer,
- IN UINTN PollInterval, OPTIONAL
- IN UINTN DataLength, OPTIONAL
- IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback, OPTIONAL
- IN VOID *Context OPTIONAL
- );
-
-/**
- Execute a synchronous isochronous transfer.
-
- @param This The USB IO instance.
- @param DeviceEndpoint The device endpoint.
- @param Data The data to transfer.
- @param DataLength The length of the data to transfer.
- @param UsbStatus The result of USB transfer.
-
- @retval EFI_UNSUPPORTED Currently isochronous transfer isn't supported.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbIoIsochronousTransfer (
- IN EFI_USB_IO_PROTOCOL *This,
- IN UINT8 DeviceEndpoint,
- IN OUT VOID *Data,
- IN UINTN DataLength,
- OUT UINT32 *Status
- );
-
-/**
- Queue an asynchronous isochronous transfer.
-
- @param This The USB_IO instance.
- @param DeviceEndpoint The device endpoint.
- @param Data The data to transfer.
- @param DataLength The length of perodic data transfer.
- @param IsochronousCallBack The function to call periodicaly when transfer is
- ready.
- @param Context The context to the callback.
-
- @retval EFI_UNSUPPORTED Currently isochronous transfer isn't supported.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbIoAsyncIsochronousTransfer (
- IN EFI_USB_IO_PROTOCOL *This,
- IN UINT8 DeviceEndpoint,
- IN OUT VOID *Data,
- IN UINTN DataLength,
- IN EFI_ASYNC_USB_TRANSFER_CALLBACK IsochronousCallBack,
- IN VOID *Context OPTIONAL
- );
-
-/**
- Retrieve the device descriptor of the device.
-
- @param This The USB IO instance.
- @param Descriptor The variable to receive the device descriptor.
-
- @retval EFI_SUCCESS The device descriptor is returned.
- @retval EFI_INVALID_PARAMETER The parameter is invalid.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbIoGetDeviceDescriptor (
- IN EFI_USB_IO_PROTOCOL *This,
- OUT EFI_USB_DEVICE_DESCRIPTOR *Descriptor
- );
-
-/**
- Return the configuration descriptor of the current active configuration.
-
- @param This The USB IO instance.
- @param Descriptor The USB configuration descriptor.
-
- @retval EFI_SUCCESS The active configuration descriptor is returned.
- @retval EFI_INVALID_PARAMETER Some parameter is invalid.
- @retval EFI_NOT_FOUND Currently no active configuration is selected.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbIoGetActiveConfigDescriptor (
- IN EFI_USB_IO_PROTOCOL *This,
- OUT EFI_USB_CONFIG_DESCRIPTOR *Descriptor
- );
-
-/**
- Retrieve the active interface setting descriptor for this USB IO instance.
-
- @param This The USB IO instance.
- @param Descriptor The variable to receive active interface setting.
-
- @retval EFI_SUCCESS The active interface setting is returned.
- @retval EFI_INVALID_PARAMETER Some parameter is invalid.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbIoGetInterfaceDescriptor (
- IN EFI_USB_IO_PROTOCOL *This,
- OUT EFI_USB_INTERFACE_DESCRIPTOR *Descriptor
- );
-
-/**
- Retrieve the endpoint descriptor from this interface setting.
-
- @param This The USB IO instance.
- @param Index The index (start from zero) of the endpoint to
- retrieve.
- @param Descriptor The variable to receive the descriptor.
-
- @retval EFI_SUCCESS The endpoint descriptor is returned.
- @retval EFI_INVALID_PARAMETER Some parameter is invalid.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbIoGetEndpointDescriptor (
- IN EFI_USB_IO_PROTOCOL *This,
- IN UINT8 Index,
- OUT EFI_USB_ENDPOINT_DESCRIPTOR *Descriptor
- );
-
-/**
- Retrieve the supported language ID table from the device.
-
- @param This The USB IO instance.
- @param LangIDTable The table to return the language IDs.
- @param TableSize The size, in bytes, of the table LangIDTable.
-
- @retval EFI_SUCCESS The language ID is return.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbIoGetSupportedLanguages (
- IN EFI_USB_IO_PROTOCOL *This,
- OUT UINT16 **LangIDTable,
- OUT UINT16 *TableSize
- );
-
-/**
- Retrieve an indexed string in the language of LangID.
-
- @param This The USB IO instance.
- @param LangID The language ID of the string to retrieve.
- @param StringIndex The index of the string.
- @param String The variable to receive the string.
-
- @retval EFI_SUCCESS The string is returned.
- @retval EFI_NOT_FOUND No such string existed.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbIoGetStringDescriptor (
- IN EFI_USB_IO_PROTOCOL *This,
- IN UINT16 LangID,
- IN UINT8 StringIndex,
- OUT CHAR16 **String
- );
-
-/**
- Reset the device, then if that succeeds, reconfigure the
- device with its address and current active configuration.
-
- @param This The USB IO instance.
-
- @retval EFI_SUCCESS The device is reset and configured.
- @retval Others Failed to reset the device.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbIoPortReset (
- IN EFI_USB_IO_PROTOCOL *This
- );
-
-/**
- Install Usb Bus Protocol on host controller, and start the Usb bus.
-
- @param This The USB bus driver binding instance.
- @param Controller The controller to check.
- @param RemainingDevicePath The remaining device patch.
-
- @retval EFI_SUCCESS The controller is controlled by the usb bus.
- @retval EFI_ALREADY_STARTED The controller is already controlled by the usb bus.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate resources.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbBusBuildProtocol (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
- );
-
-/**
- The USB bus driver entry pointer.
-
- @param ImageHandle The driver image handle.
- @param SystemTable The system table.
-
- @return EFI_SUCCESS The component name protocol is installed.
- @return Others Failed to init the usb driver.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbBusDriverEntryPoint (
- IN EFI_HANDLE ImageHandle,
- IN EFI_SYSTEM_TABLE *SystemTable
- );
-
-/**
- Check whether USB bus driver support this device.
-
- @param This The USB bus driver binding protocol.
- @param Controller The controller handle to check.
- @param RemainingDevicePath The remaining device path.
-
- @retval EFI_SUCCESS The bus supports this controller.
- @retval EFI_UNSUPPORTED This device isn't supported.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbBusControllerDriverSupported (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
- );
-
-/**
- Start to process the controller.
-
- @param This The USB bus driver binding instance.
- @param Controller The controller to check.
- @param RemainingDevicePath The remaining device patch.
-
- @retval EFI_SUCCESS The controller is controlled by the usb bus.
- @retval EFI_ALREADY_STARTED The controller is already controlled by the usb
- bus.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate resources.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbBusControllerDriverStart (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
- );
-
-/**
- Stop handle the controller by this USB bus driver.
-
- @param This The USB bus driver binding protocol.
- @param Controller The controller to release.
- @param NumberOfChildren The child of USB bus that opened controller
- BY_CHILD.
- @param ChildHandleBuffer The array of child handle.
-
- @retval EFI_SUCCESS The controller or children are stopped.
- @retval EFI_DEVICE_ERROR Failed to stop the driver.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbBusControllerDriverStop (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN UINTN NumberOfChildren,
- IN EFI_HANDLE *ChildHandleBuffer
- );
-
-extern EFI_USB_IO_PROTOCOL mUsbIoProtocol;
-extern EFI_DRIVER_BINDING_PROTOCOL mUsbBusDriverBinding;
-extern EFI_COMPONENT_NAME_PROTOCOL mUsbBusComponentName;
-extern EFI_COMPONENT_NAME2_PROTOCOL mUsbBusComponentName2;
-
-#endif
diff --git a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf b/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf
deleted file mode 100644
index b7b30cc937..0000000000
--- a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf
+++ /dev/null
@@ -1,79 +0,0 @@
-## @file
-# The Usb Bus Dxe driver is used to enumerate and manage all attached usb devices.
-#
-# 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 = UsbBusDxe
- MODULE_UNI_FILE = UsbBusDxe.uni
- FILE_GUID = 240612B7-A063-11d4-9A3A-0090273FC14D
- MODULE_TYPE = UEFI_DRIVER
- VERSION_STRING = 1.0
-
- ENTRY_POINT = UsbBusDriverEntryPoint
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-# VALID_ARCHITECTURES = IA32 X64 IPF EBC ARM AARCH64
-#
-# DRIVER_BINDING = mUsbBusDriverBinding
-# COMPONENT_NAME = mUsbBusComponentName
-# COMPONENT_NAME2 = mUsbBusComponentName2
-#
-
-[Sources]
- UsbDesc.c
- UsbEnumer.c
- UsbEnumer.h
- UsbBus.c
- UsbHub.c
- ComponentName.c
- UsbUtility.h
- UsbHub.h
- UsbUtility.c
- UsbDesc.h
- UsbBus.h
-
-[Packages]
- MdePkg/MdePkg.dec
-
-
-[LibraryClasses]
- MemoryAllocationLib
- DevicePathLib
- UefiLib
- UefiBootServicesTableLib
- UefiDriverEntryPoint
- BaseMemoryLib
- DebugLib
- ReportStatusCodeLib
-
-
-[Protocols]
- gEfiUsbIoProtocolGuid ## BY_START
- ## TO_START
- ## BY_START
- gEfiDevicePathProtocolGuid
- gEfiUsb2HcProtocolGuid ## TO_START
- gEfiUsbHcProtocolGuid ## TO_START
-
-# [Event]
-#
-# EVENT_TYPE_PERIODIC_TIMER ## CONSUMES
-#
-
-[UserExtensions.TianoCore."ExtraFiles"]
- UsbBusDxeExtra.uni
diff --git a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.uni b/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.uni
deleted file mode 100644
index 70f9e62436..0000000000
--- a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.uni
+++ /dev/null
Binary files differ
diff --git a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxeExtra.uni b/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxeExtra.uni
deleted file mode 100644
index 305ab09c3e..0000000000
--- a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxeExtra.uni
+++ /dev/null
Binary files differ
diff --git a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbDesc.c b/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbDesc.c
deleted file mode 100644
index 9687eb0bca..0000000000
--- a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbDesc.c
+++ /dev/null
@@ -1,978 +0,0 @@
-/** @file
-
- Manage Usb Descriptor List
-
-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 "UsbBus.h"
-
-
-/**
- Free the interface setting descriptor.
-
- @param Setting The descriptor to free.
-
-**/
-VOID
-UsbFreeInterfaceDesc (
- IN USB_INTERFACE_SETTING *Setting
- )
-{
- USB_ENDPOINT_DESC *Ep;
- UINTN Index;
-
- if (Setting->Endpoints != NULL) {
- //
- // Each interface setting may have several endpoints, free them first.
- //
- for (Index = 0; Index < Setting->Desc.NumEndpoints; Index++) {
- Ep = Setting->Endpoints[Index];
-
- if (Ep != NULL) {
- FreePool (Ep);
- }
- }
-
- //
- // Only call FreePool() if NumEndpoints > 0.
- //
- if (Setting->Desc.NumEndpoints > 0) {
- FreePool (Setting->Endpoints);
- }
- }
-
- FreePool (Setting);
-}
-
-
-/**
- Free a configuration descriptor with its interface
- descriptors. It may be initialized partially.
-
- @param Config The configuration descriptor to free.
-
-**/
-VOID
-UsbFreeConfigDesc (
- IN USB_CONFIG_DESC *Config
- )
-{
- USB_INTERFACE_DESC *Interface;
- UINTN Index;
- UINTN SetIndex;
-
- if (Config->Interfaces != NULL) {
- //
- // A configuration may have several interfaces, free the interface
- //
- for (Index = 0; Index < Config->Desc.NumInterfaces; Index++) {
- Interface = Config->Interfaces[Index];
-
- if (Interface == NULL) {
- continue;
- }
-
- //
- // Each interface may have several settings, free the settings
- //
- for (SetIndex = 0; SetIndex < Interface->NumOfSetting; SetIndex++) {
- if (Interface->Settings[SetIndex] != NULL) {
- UsbFreeInterfaceDesc (Interface->Settings[SetIndex]);
- }
- }
-
- FreePool (Interface);
- }
-
- FreePool (Config->Interfaces);
- }
-
- FreePool (Config);
-
-}
-
-
-/**
- Free a device descriptor with its configurations.
-
- @param DevDesc The device descriptor.
-
-**/
-VOID
-UsbFreeDevDesc (
- IN USB_DEVICE_DESC *DevDesc
- )
-{
- UINTN Index;
-
- if (DevDesc->Configs != NULL) {
- for (Index = 0; Index < DevDesc->Desc.NumConfigurations; Index++) {
- if (DevDesc->Configs[Index] != NULL) {
- UsbFreeConfigDesc (DevDesc->Configs[Index]);
- }
- }
-
- FreePool (DevDesc->Configs);
- }
-
- FreePool (DevDesc);
-}
-
-
-/**
- Create a descriptor.
-
- @param DescBuf The buffer of raw descriptor.
- @param Len The length of the raw descriptor buffer.
- @param Type The type of descriptor to create.
- @param Consumed Number of bytes consumed.
-
- @return Created descriptor or NULL.
-
-**/
-VOID *
-UsbCreateDesc (
- IN UINT8 *DescBuf,
- IN UINTN Len,
- IN UINT8 Type,
- OUT UINTN *Consumed
- )
-{
- USB_DESC_HEAD *Head;
- UINTN DescLen;
- UINTN CtrlLen;
- UINTN Offset;
- VOID *Desc;
-
- DescLen = 0;
- CtrlLen = 0;
- *Consumed = 0;
-
- switch (Type) {
- case USB_DESC_TYPE_DEVICE:
- DescLen = sizeof (EFI_USB_DEVICE_DESCRIPTOR);
- CtrlLen = sizeof (USB_DEVICE_DESC);
- break;
-
- case USB_DESC_TYPE_CONFIG:
- DescLen = sizeof (EFI_USB_CONFIG_DESCRIPTOR);
- CtrlLen = sizeof (USB_CONFIG_DESC);
- break;
-
- case USB_DESC_TYPE_INTERFACE:
- DescLen = sizeof (EFI_USB_INTERFACE_DESCRIPTOR);
- CtrlLen = sizeof (USB_INTERFACE_SETTING);
- break;
-
- case USB_DESC_TYPE_ENDPOINT:
- DescLen = sizeof (EFI_USB_ENDPOINT_DESCRIPTOR);
- CtrlLen = sizeof (USB_ENDPOINT_DESC);
- break;
- }
-
- //
- // All the descriptor has a common LTV (Length, Type, Value)
- // format. Skip the descriptor that isn't of this Type
- //
- Offset = 0;
- Head = (USB_DESC_HEAD*)DescBuf;
-
- while ((Offset < Len) && (Head->Type != Type)) {
- Offset += Head->Len;
- if (Len <= Offset) {
- DEBUG (( EFI_D_ERROR, "UsbCreateDesc: met mal-format descriptor, Beyond boundary!\n"));
- return NULL;
- }
- Head = (USB_DESC_HEAD*)(DescBuf + Offset);
- if (Head->Len == 0) {
- DEBUG (( EFI_D_ERROR, "UsbCreateDesc: met mal-format descriptor, Head->Len = 0!\n"));
- return NULL;
- }
- }
-
- if ((Len <= Offset) || (Len < Offset + DescLen) ||
- (Head->Type != Type) || (Head->Len != DescLen)) {
- DEBUG (( EFI_D_ERROR, "UsbCreateDesc: met mal-format descriptor\n"));
- return NULL;
- }
-
- Desc = AllocateZeroPool ((UINTN) CtrlLen);
- if (Desc == NULL) {
- return NULL;
- }
-
- CopyMem (Desc, Head, (UINTN) DescLen);
-
- *Consumed = Offset + Head->Len;
-
- return Desc;
-}
-
-
-/**
- Parse an interface descriptor and its endpoints.
-
- @param DescBuf The buffer of raw descriptor.
- @param Len The length of the raw descriptor buffer.
- @param Consumed The number of raw descriptor consumed.
-
- @return The create interface setting or NULL if failed.
-
-**/
-USB_INTERFACE_SETTING *
-UsbParseInterfaceDesc (
- IN UINT8 *DescBuf,
- IN UINTN Len,
- OUT UINTN *Consumed
- )
-{
- USB_INTERFACE_SETTING *Setting;
- USB_ENDPOINT_DESC *Ep;
- UINTN Index;
- UINTN NumEp;
- UINTN Used;
- UINTN Offset;
-
- *Consumed = 0;
- Setting = UsbCreateDesc (DescBuf, Len, USB_DESC_TYPE_INTERFACE, &Used);
-
- if (Setting == NULL) {
- DEBUG (( EFI_D_ERROR, "UsbParseInterfaceDesc: failed to create interface descriptor\n"));
- return NULL;
- }
-
- Offset = Used;
-
- //
- // Create an array to hold the interface's endpoints
- //
- NumEp = Setting->Desc.NumEndpoints;
-
- DEBUG (( EFI_D_INFO, "UsbParseInterfaceDesc: interface %d(setting %d) has %d endpoints\n",
- Setting->Desc.InterfaceNumber, Setting->Desc.AlternateSetting, (UINT32)NumEp));
-
- if (NumEp == 0) {
- goto ON_EXIT;
- }
-
- Setting->Endpoints = AllocateZeroPool (sizeof (USB_ENDPOINT_DESC *) * NumEp);
-
- if (Setting->Endpoints == NULL) {
- goto ON_ERROR;
- }
-
- //
- // Create the endpoints for this interface
- //
- for (Index = 0; (Index < NumEp) && (Offset < Len); Index++) {
- Ep = UsbCreateDesc (DescBuf + Offset, Len - Offset, USB_DESC_TYPE_ENDPOINT, &Used);
-
- if (Ep == NULL) {
- DEBUG (( EFI_D_ERROR, "UsbParseInterfaceDesc: failed to create endpoint(index %d)\n", (UINT32)Index));
- goto ON_ERROR;
- }
-
- Setting->Endpoints[Index] = Ep;
- Offset += Used;
- }
-
-
-ON_EXIT:
- *Consumed = Offset;
- return Setting;
-
-ON_ERROR:
- UsbFreeInterfaceDesc (Setting);
- return NULL;
-}
-
-
-/**
- Parse the configuration descriptor and its interfaces.
-
- @param DescBuf The buffer of raw descriptor.
- @param Len The length of the raw descriptor buffer.
-
- @return The created configuration descriptor.
-
-**/
-USB_CONFIG_DESC *
-UsbParseConfigDesc (
- IN UINT8 *DescBuf,
- IN UINTN Len
- )
-{
- USB_CONFIG_DESC *Config;
- USB_INTERFACE_SETTING *Setting;
- USB_INTERFACE_DESC *Interface;
- UINTN Index;
- UINTN NumIf;
- UINTN Consumed;
-
- ASSERT (DescBuf != NULL);
-
- Config = UsbCreateDesc (DescBuf, Len, USB_DESC_TYPE_CONFIG, &Consumed);
-
- if (Config == NULL) {
- return NULL;
- }
-
- //
- // Initialize an array of setting for the configuration's interfaces.
- //
- NumIf = Config->Desc.NumInterfaces;
- Config->Interfaces = AllocateZeroPool (sizeof (USB_INTERFACE_DESC *) * NumIf);
-
- if (Config->Interfaces == NULL) {
- goto ON_ERROR;
- }
-
- DEBUG (( EFI_D_INFO, "UsbParseConfigDesc: config %d has %d interfaces\n",
- Config->Desc.ConfigurationValue, (UINT32)NumIf));
-
- for (Index = 0; Index < NumIf; Index++) {
- Interface = AllocateZeroPool (sizeof (USB_INTERFACE_DESC));
-
- if (Interface == NULL) {
- goto ON_ERROR;
- }
-
- Config->Interfaces[Index] = Interface;
- }
-
- //
- // If a configuration has several interfaces, these interfaces are
- // numbered from zero to n. If a interface has several settings,
- // these settings are also number from zero to m. The interface
- // setting must be organized as |interface 0, setting 0|interface 0
- // setting 1|interface 1, setting 0|interface 2, setting 0|. Check
- // USB2.0 spec, page 267.
- //
- DescBuf += Consumed;
- Len -= Consumed;
-
- //
- // Make allowances for devices that return extra data at the
- // end of their config descriptors
- //
- while (Len >= sizeof (EFI_USB_INTERFACE_DESCRIPTOR)) {
- Setting = UsbParseInterfaceDesc (DescBuf, Len, &Consumed);
-
- if (Setting == NULL) {
- DEBUG (( EFI_D_ERROR, "UsbParseConfigDesc: warning: failed to get interface setting, stop parsing now.\n"));
- break;
-
- } else if (Setting->Desc.InterfaceNumber >= NumIf) {
- DEBUG (( EFI_D_ERROR, "UsbParseConfigDesc: mal-formated interface descriptor\n"));
-
- UsbFreeInterfaceDesc (Setting);
- goto ON_ERROR;
- }
-
- //
- // Insert the descriptor to the corresponding set.
- //
- Interface = Config->Interfaces[Setting->Desc.InterfaceNumber];
-
- if (Interface->NumOfSetting >= USB_MAX_INTERFACE_SETTING) {
- goto ON_ERROR;
- }
-
- Interface->Settings[Interface->NumOfSetting] = Setting;
- Interface->NumOfSetting++;
-
- DescBuf += Consumed;
- Len -= Consumed;
- }
-
- return Config;
-
-ON_ERROR:
- UsbFreeConfigDesc (Config);
- return NULL;
-}
-
-
-/**
- USB standard control transfer support routine. This
- function is used by USB device. It is possible that
- the device's interfaces are still waiting to be
- enumerated.
-
- @param UsbDev The usb device.
- @param Direction The direction of data transfer.
- @param Type Standard / class specific / vendor specific.
- @param Target The receiving target.
- @param Request Which request.
- @param Value The wValue parameter of the request.
- @param Index The wIndex parameter of the request.
- @param Buf The buffer to receive data into / transmit from.
- @param Length The length of the buffer.
-
- @retval EFI_SUCCESS The control request is executed.
- @retval EFI_DEVICE_ERROR Failed to execute the control transfer.
-
-**/
-EFI_STATUS
-UsbCtrlRequest (
- IN USB_DEVICE *UsbDev,
- IN EFI_USB_DATA_DIRECTION Direction,
- IN UINTN Type,
- IN UINTN Target,
- IN UINTN Request,
- IN UINT16 Value,
- IN UINT16 Index,
- IN OUT VOID *Buf,
- IN UINTN Length
- )
-{
- EFI_USB_DEVICE_REQUEST DevReq;
- EFI_STATUS Status;
- UINT32 Result;
- UINTN Len;
-
- ASSERT ((UsbDev != NULL) && (UsbDev->Bus != NULL));
-
- DevReq.RequestType = USB_REQUEST_TYPE (Direction, Type, Target);
- DevReq.Request = (UINT8) Request;
- DevReq.Value = Value;
- DevReq.Index = Index;
- DevReq.Length = (UINT16) Length;
-
- Len = Length;
- Status = UsbHcControlTransfer (
- UsbDev->Bus,
- UsbDev->Address,
- UsbDev->Speed,
- UsbDev->MaxPacket0,
- &DevReq,
- Direction,
- Buf,
- &Len,
- USB_GENERAL_DEVICE_REQUEST_TIMEOUT,
- &UsbDev->Translator,
- &Result
- );
-
- return Status;
-}
-
-
-/**
- Get the standard descriptors.
-
- @param UsbDev The USB device to read descriptor from.
- @param DescType The type of descriptor to read.
- @param DescIndex The index of descriptor to read.
- @param LangId Language ID, only used to get string, otherwise set
- it to 0.
- @param Buf The buffer to hold the descriptor read.
- @param Length The length of the buffer.
-
- @retval EFI_SUCCESS The descriptor is read OK.
- @retval Others Failed to retrieve the descriptor.
-
-**/
-EFI_STATUS
-UsbCtrlGetDesc (
- IN USB_DEVICE *UsbDev,
- IN UINTN DescType,
- IN UINTN DescIndex,
- IN UINT16 LangId,
- OUT VOID *Buf,
- IN UINTN Length
- )
-{
- EFI_STATUS Status;
-
- Status = UsbCtrlRequest (
- UsbDev,
- EfiUsbDataIn,
- USB_REQ_TYPE_STANDARD,
- USB_TARGET_DEVICE,
- USB_REQ_GET_DESCRIPTOR,
- (UINT16) ((DescType << 8) | DescIndex),
- LangId,
- Buf,
- Length
- );
-
- return Status;
-}
-
-
-/**
- Return the max packet size for endpoint zero. This function
- is the first function called to get descriptors during bus
- enumeration.
-
- @param UsbDev The usb device.
-
- @retval EFI_SUCCESS The max packet size of endpoint zero is retrieved.
- @retval EFI_DEVICE_ERROR Failed to retrieve it.
-
-**/
-EFI_STATUS
-UsbGetMaxPacketSize0 (
- IN USB_DEVICE *UsbDev
- )
-{
- EFI_USB_DEVICE_DESCRIPTOR DevDesc;
- EFI_STATUS Status;
- UINTN Index;
-
-
- //
- // Get the first 8 bytes of the device descriptor which contains
- // max packet size for endpoint 0, which is at least 8.
- //
- for (Index = 0; Index < 3; Index++) {
- Status = UsbCtrlGetDesc (UsbDev, USB_DESC_TYPE_DEVICE, 0, 0, &DevDesc, 8);
-
- if (!EFI_ERROR (Status)) {
- if ((DevDesc.BcdUSB == 0x0300) && (DevDesc.MaxPacketSize0 == 9)) {
- UsbDev->MaxPacket0 = 1 << 9;
- return EFI_SUCCESS;
- }
- UsbDev->MaxPacket0 = DevDesc.MaxPacketSize0;
- return EFI_SUCCESS;
- }
-
- gBS->Stall (USB_RETRY_MAX_PACK_SIZE_STALL);
- }
-
- return EFI_DEVICE_ERROR;
-}
-
-
-/**
- Get the device descriptor for the device.
-
- @param UsbDev The Usb device to retrieve descriptor from.
-
- @retval EFI_SUCCESS The device descriptor is returned.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
-
-**/
-EFI_STATUS
-UsbGetDevDesc (
- IN USB_DEVICE *UsbDev
- )
-{
- USB_DEVICE_DESC *DevDesc;
- EFI_STATUS Status;
-
- DevDesc = AllocateZeroPool (sizeof (USB_DEVICE_DESC));
-
- if (DevDesc == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- Status = UsbCtrlGetDesc (
- UsbDev,
- USB_DESC_TYPE_DEVICE,
- 0,
- 0,
- DevDesc,
- sizeof (EFI_USB_DEVICE_DESCRIPTOR)
- );
-
- if (EFI_ERROR (Status)) {
- gBS->FreePool (DevDesc);
- } else {
- UsbDev->DevDesc = DevDesc;
- }
-
- return Status;
-}
-
-
-/**
- Retrieve the indexed string for the language. It requires two
- steps to get a string, first to get the string's length. Then
- the string itself.
-
- @param UsbDev The usb device.
- @param Index The index the string to retrieve.
- @param LangId Language ID.
-
- @return The created string descriptor or NULL.
-
-**/
-EFI_USB_STRING_DESCRIPTOR *
-UsbGetOneString (
- IN USB_DEVICE *UsbDev,
- IN UINT8 Index,
- IN UINT16 LangId
- )
-{
- EFI_USB_STRING_DESCRIPTOR Desc;
- EFI_STATUS Status;
- UINT8 *Buf;
-
- //
- // First get two bytes which contains the string length.
- //
- Status = UsbCtrlGetDesc (UsbDev, USB_DESC_TYPE_STRING, Index, LangId, &Desc, 2);
-
- if (EFI_ERROR (Status)) {
- return NULL;
- }
-
- Buf = AllocateZeroPool (Desc.Length);
-
- if (Buf == NULL) {
- return NULL;
- }
-
- Status = UsbCtrlGetDesc (
- UsbDev,
- USB_DESC_TYPE_STRING,
- Index,
- LangId,
- Buf,
- Desc.Length
- );
-
- if (EFI_ERROR (Status)) {
- FreePool (Buf);
- return NULL;
- }
-
- return (EFI_USB_STRING_DESCRIPTOR *) Buf;
-}
-
-
-/**
- Build the language ID table for string descriptors.
-
- @param UsbDev The Usb device.
-
- @retval EFI_UNSUPPORTED This device doesn't support string table.
-
-**/
-EFI_STATUS
-UsbBuildLangTable (
- IN USB_DEVICE *UsbDev
- )
-{
- EFI_USB_STRING_DESCRIPTOR *Desc;
- EFI_STATUS Status;
- UINTN Index;
- UINTN Max;
- UINT16 *Point;
-
- //
- // The string of language ID zero returns the supported languages
- //
- Desc = UsbGetOneString (UsbDev, 0, 0);
-
- if (Desc == NULL) {
- return EFI_UNSUPPORTED;
- }
-
- if (Desc->Length < 4) {
- Status = EFI_UNSUPPORTED;
- goto ON_EXIT;
- }
-
- Status = EFI_SUCCESS;
-
- Max = (Desc->Length - 2) / 2;
- Max = MIN(Max, USB_MAX_LANG_ID);
-
- Point = Desc->String;
- for (Index = 0; Index < Max; Index++) {
- UsbDev->LangId[Index] = *Point;
- Point++;
- }
-
- UsbDev->TotalLangId = (UINT16)Max;
-
-ON_EXIT:
- gBS->FreePool (Desc);
- return Status;
-}
-
-
-/**
- Retrieve the indexed configure for the device. USB device
- returns the configuration together with the interfaces for
- this configuration. Configuration descriptor is also of
- variable length.
-
- @param UsbDev The Usb interface.
- @param Index The index of the configuration.
-
- @return The created configuration descriptor.
-
-**/
-EFI_USB_CONFIG_DESCRIPTOR *
-UsbGetOneConfig (
- IN USB_DEVICE *UsbDev,
- IN UINT8 Index
- )
-{
- EFI_USB_CONFIG_DESCRIPTOR Desc;
- EFI_STATUS Status;
- VOID *Buf;
-
- //
- // First get four bytes which contains the total length
- // for this configuration.
- //
- Status = UsbCtrlGetDesc (UsbDev, USB_DESC_TYPE_CONFIG, Index, 0, &Desc, 8);
-
- if (EFI_ERROR (Status)) {
- DEBUG (( EFI_D_ERROR, "UsbGetOneConfig: failed to get descript length(%d) %r\n",
- Desc.TotalLength, Status));
-
- return NULL;
- }
-
- DEBUG (( EFI_D_INFO, "UsbGetOneConfig: total length is %d\n", Desc.TotalLength));
-
- Buf = AllocateZeroPool (Desc.TotalLength);
-
- if (Buf == NULL) {
- return NULL;
- }
-
- Status = UsbCtrlGetDesc (UsbDev, USB_DESC_TYPE_CONFIG, Index, 0, Buf, Desc.TotalLength);
-
- if (EFI_ERROR (Status)) {
- DEBUG (( EFI_D_ERROR, "UsbGetOneConfig: failed to get full descript %r\n", Status));
-
- FreePool (Buf);
- return NULL;
- }
-
- return Buf;
-}
-
-
-/**
- Build the whole array of descriptors. This function must
- be called after UsbGetMaxPacketSize0 returns the max packet
- size correctly for endpoint 0.
-
- @param UsbDev The Usb device.
-
- @retval EFI_SUCCESS The descriptor table is build.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate resource for the descriptor.
-
-**/
-EFI_STATUS
-UsbBuildDescTable (
- IN USB_DEVICE *UsbDev
- )
-{
- EFI_USB_CONFIG_DESCRIPTOR *Config;
- USB_DEVICE_DESC *DevDesc;
- USB_CONFIG_DESC *ConfigDesc;
- UINT8 NumConfig;
- EFI_STATUS Status;
- UINT8 Index;
-
- //
- // Get the device descriptor, then allocate the configure
- // descriptor pointer array to hold configurations.
- //
- Status = UsbGetDevDesc (UsbDev);
-
- if (EFI_ERROR (Status)) {
- DEBUG (( EFI_D_ERROR, "UsbBuildDescTable: failed to get device descriptor - %r\n", Status));
- return Status;
- }
-
- DevDesc = UsbDev->DevDesc;
- NumConfig = DevDesc->Desc.NumConfigurations;
- if (NumConfig == 0) {
- return EFI_DEVICE_ERROR;
- }
-
- DevDesc->Configs = AllocateZeroPool (NumConfig * sizeof (USB_CONFIG_DESC *));
- if (DevDesc->Configs == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- DEBUG (( EFI_D_INFO, "UsbBuildDescTable: device has %d configures\n", NumConfig));
-
- //
- // Read each configurations, then parse them
- //
- for (Index = 0; Index < NumConfig; Index++) {
- Config = UsbGetOneConfig (UsbDev, Index);
-
- if (Config == NULL) {
- DEBUG (( EFI_D_ERROR, "UsbBuildDescTable: failed to get configure (index %d)\n", Index));
-
- //
- // If we can get the default descriptor, it is likely that the
- // device is still operational.
- //
- if (Index == 0) {
- return EFI_DEVICE_ERROR;
- }
-
- break;
- }
-
- ConfigDesc = UsbParseConfigDesc ((UINT8 *) Config, Config->TotalLength);
-
- FreePool (Config);
-
- if (ConfigDesc == NULL) {
- DEBUG (( EFI_D_ERROR, "UsbBuildDescTable: failed to parse configure (index %d)\n", Index));
-
- //
- // If we can get the default descriptor, it is likely that the
- // device is still operational.
- //
- if (Index == 0) {
- return EFI_DEVICE_ERROR;
- }
-
- break;
- }
-
- DevDesc->Configs[Index] = ConfigDesc;
- }
-
- //
- // Don't return error even this function failed because
- // it is possible for the device to not support strings.
- //
- Status = UsbBuildLangTable (UsbDev);
-
- if (EFI_ERROR (Status)) {
- DEBUG (( EFI_D_INFO, "UsbBuildDescTable: get language ID table %r\n", Status));
- }
-
- return EFI_SUCCESS;
-}
-
-
-/**
- Set the device's address.
-
- @param UsbDev The device to set address to.
- @param Address The address to set.
-
- @retval EFI_SUCCESS The device is set to the address.
- @retval Others Failed to set the device address.
-
-**/
-EFI_STATUS
-UsbSetAddress (
- IN USB_DEVICE *UsbDev,
- IN UINT8 Address
- )
-{
- EFI_STATUS Status;
-
- Status = UsbCtrlRequest (
- UsbDev,
- EfiUsbNoData,
- USB_REQ_TYPE_STANDARD,
- USB_TARGET_DEVICE,
- USB_REQ_SET_ADDRESS,
- Address,
- 0,
- NULL,
- 0
- );
-
- return Status;
-}
-
-
-/**
- Set the device's configuration. This function changes
- the device's internal state. UsbSelectConfig changes
- the Usb bus's internal state.
-
- @param UsbDev The USB device to set configure to.
- @param ConfigIndex The configure index to set.
-
- @retval EFI_SUCCESS The device is configured now.
- @retval Others Failed to set the device configure.
-
-**/
-EFI_STATUS
-UsbSetConfig (
- IN USB_DEVICE *UsbDev,
- IN UINT8 ConfigIndex
- )
-{
- EFI_STATUS Status;
-
- Status = UsbCtrlRequest (
- UsbDev,
- EfiUsbNoData,
- USB_REQ_TYPE_STANDARD,
- USB_TARGET_DEVICE,
- USB_REQ_SET_CONFIG,
- ConfigIndex,
- 0,
- NULL,
- 0
- );
-
- return Status;
-}
-
-
-/**
- Usb UsbIo interface to clear the feature. This is should
- only be used by HUB which is considered a device driver
- on top of the UsbIo interface.
-
- @param UsbIo The UsbIo interface.
- @param Target The target of the transfer: endpoint/device.
- @param Feature The feature to clear.
- @param Index The wIndex parameter.
-
- @retval EFI_SUCCESS The device feature is cleared.
- @retval Others Failed to clear the feature.
-
-**/
-EFI_STATUS
-UsbIoClearFeature (
- IN EFI_USB_IO_PROTOCOL *UsbIo,
- IN UINTN Target,
- IN UINT16 Feature,
- IN UINT16 Index
- )
-{
- EFI_USB_DEVICE_REQUEST DevReq;
- UINT32 UsbResult;
- EFI_STATUS Status;
-
- DevReq.RequestType = USB_REQUEST_TYPE (EfiUsbNoData, USB_REQ_TYPE_STANDARD, Target);
- DevReq.Request = USB_REQ_CLEAR_FEATURE;
- DevReq.Value = Feature;
- DevReq.Index = Index;
- DevReq.Length = 0;
-
- Status = UsbIo->UsbControlTransfer (
- UsbIo,
- &DevReq,
- EfiUsbNoData,
- USB_CLEAR_FEATURE_REQUEST_TIMEOUT,
- NULL,
- 0,
- &UsbResult
- );
-
- return Status;
-}
diff --git a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbDesc.h b/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbDesc.h
deleted file mode 100644
index 482a71f338..0000000000
--- a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbDesc.h
+++ /dev/null
@@ -1,233 +0,0 @@
-/** @file
-
- Manage Usb Descriptor List
-
-Copyright (c) 2007 - 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.
-
-**/
-
-#ifndef _USB_DESCRIPTOR_H_
-#define _USB_DESCRIPTOR_H_
-
-#define USB_MAX_INTERFACE_SETTING 256
-
-//
-// The RequestType in EFI_USB_DEVICE_REQUEST is composed of
-// three fields: One bit direction, 2 bit type, and 5 bit
-// target.
-//
-#define USB_REQUEST_TYPE(Dir, Type, Target) \
- ((UINT8)((((Dir) == EfiUsbDataIn ? 0x01 : 0) << 7) | (Type) | (Target)))
-
-//
-// A common header for usb standard descriptor.
-// Each stand descriptor has a length and type.
-//
-#pragma pack(1)
-typedef struct {
- UINT8 Len;
- UINT8 Type;
-} USB_DESC_HEAD;
-#pragma pack()
-
-
-//
-// Each USB device has a device descriptor. Each device may
-// have several configures. Each configure contains several
-// interfaces. Each interface may have several settings. Each
-// setting has several endpoints.
-//
-// EFI_USB_..._DESCRIPTOR must be the first member of the
-// structure.
-//
-typedef struct {
- EFI_USB_ENDPOINT_DESCRIPTOR Desc;
- UINT8 Toggle;
-} USB_ENDPOINT_DESC;
-
-typedef struct {
- EFI_USB_INTERFACE_DESCRIPTOR Desc;
- USB_ENDPOINT_DESC **Endpoints;
-} USB_INTERFACE_SETTING;
-
-//
-// An interface may have several settings. Use a
-// fixed max number of settings to simplify code.
-// It should sufice in most environments.
-//
-typedef struct {
- USB_INTERFACE_SETTING* Settings[USB_MAX_INTERFACE_SETTING];
- UINTN NumOfSetting;
- UINTN ActiveIndex; // Index of active setting
-} USB_INTERFACE_DESC;
-
-typedef struct {
- EFI_USB_CONFIG_DESCRIPTOR Desc;
- USB_INTERFACE_DESC **Interfaces;
-} USB_CONFIG_DESC;
-
-typedef struct {
- EFI_USB_DEVICE_DESCRIPTOR Desc;
- USB_CONFIG_DESC **Configs;
-} USB_DEVICE_DESC;
-
-/**
- USB standard control transfer support routine. This
- function is used by USB device. It is possible that
- the device's interfaces are still waiting to be
- enumerated.
-
- @param UsbDev The usb device.
- @param Direction The direction of data transfer.
- @param Type Standard / class specific / vendor specific.
- @param Target The receiving target.
- @param Request Which request.
- @param Value The wValue parameter of the request.
- @param Index The wIndex parameter of the request.
- @param Buf The buffer to receive data into / transmit from.
- @param Length The length of the buffer.
-
- @retval EFI_SUCCESS The control request is executed.
- @retval EFI_DEVICE_ERROR Failed to execute the control transfer.
-
-**/
-EFI_STATUS
-UsbCtrlRequest (
- IN USB_DEVICE *UsbDev,
- IN EFI_USB_DATA_DIRECTION Direction,
- IN UINTN Type,
- IN UINTN Target,
- IN UINTN Request,
- IN UINT16 Value,
- IN UINT16 Index,
- IN OUT VOID *Buf,
- IN UINTN Length
- );
-
-/**
- Return the max packet size for endpoint zero. This function
- is the first function called to get descriptors during bus
- enumeration.
-
- @param UsbDev The usb device.
-
- @retval EFI_SUCCESS The max packet size of endpoint zero is retrieved.
- @retval EFI_DEVICE_ERROR Failed to retrieve it.
-
-**/
-EFI_STATUS
-UsbGetMaxPacketSize0 (
- IN USB_DEVICE *UsbDev
- );
-
-/**
- Free a device descriptor with its configurations.
-
- @param DevDesc The device descriptor.
-
- @return None.
-
-**/
-VOID
-UsbFreeDevDesc (
- IN USB_DEVICE_DESC *DevDesc
- );
-
-/**
- Retrieve the indexed string for the language. It requires two
- steps to get a string, first to get the string's length. Then
- the string itself.
-
- @param UsbDev The usb device.
- @param StringIndex The index of the string to retrieve.
- @param LangId Language ID.
-
- @return The created string descriptor or NULL.
-
-**/
-EFI_USB_STRING_DESCRIPTOR*
-UsbGetOneString (
- IN USB_DEVICE *UsbDev,
- IN UINT8 StringIndex,
- IN UINT16 LangId
- );
-
-/**
- Build the whole array of descriptors. This function must
- be called after UsbGetMaxPacketSize0 returns the max packet
- size correctly for endpoint 0.
-
- @param UsbDev The Usb device.
-
- @retval EFI_SUCCESS The descriptor table is build.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate resource for the descriptor.
-
-**/
-EFI_STATUS
-UsbBuildDescTable (
- IN USB_DEVICE *UsbDev
- );
-
-/**
- Set the device's address.
-
- @param UsbDev The device to set address to.
- @param Address The address to set.
-
- @retval EFI_SUCCESS The device is set to the address.
- @retval Others Failed to set the device address.
-
-**/
-EFI_STATUS
-UsbSetAddress (
- IN USB_DEVICE *UsbDev,
- IN UINT8 Address
- );
-
-/**
- Set the device's configuration. This function changes
- the device's internal state. UsbSelectConfig changes
- the Usb bus's internal state.
-
- @param UsbDev The USB device to set configure to.
- @param ConfigIndex The configure index to set.
-
- @retval EFI_SUCCESS The device is configured now.
- @retval Others Failed to set the device configure.
-
-**/
-EFI_STATUS
-UsbSetConfig (
- IN USB_DEVICE *UsbDev,
- IN UINT8 ConfigIndex
- );
-
-/**
- Usb UsbIo interface to clear the feature. This is should
- only be used by HUB which is considered a device driver
- on top of the UsbIo interface.
-
- @param UsbIo The UsbIo interface.
- @param Target The target of the transfer: endpoint/device.
- @param Feature The feature to clear.
- @param Index The wIndex parameter.
-
- @retval EFI_SUCCESS The device feature is cleared.
- @retval Others Failed to clear the feature.
-
-**/
-EFI_STATUS
-UsbIoClearFeature (
- IN EFI_USB_IO_PROTOCOL *UsbIo,
- IN UINTN Target,
- IN UINT16 Feature,
- IN UINT16 Index
- );
-#endif
diff --git a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbEnumer.c b/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbEnumer.c
deleted file mode 100644
index 79453fed26..0000000000
--- a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbEnumer.c
+++ /dev/null
@@ -1,1065 +0,0 @@
-/** @file
-
- Usb bus enumeration support.
-
-Copyright (c) 2007 - 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.
-
-**/
-
-#include "UsbBus.h"
-
-/**
- Return the endpoint descriptor in this interface.
-
- @param UsbIf The interface to search in.
- @param EpAddr The address of the endpoint to return.
-
- @return The endpoint descriptor or NULL.
-
-**/
-USB_ENDPOINT_DESC *
-UsbGetEndpointDesc (
- IN USB_INTERFACE *UsbIf,
- IN UINT8 EpAddr
- )
-{
- USB_ENDPOINT_DESC *EpDesc;
- UINT8 Index;
- UINT8 NumEndpoints;
-
- NumEndpoints = UsbIf->IfSetting->Desc.NumEndpoints;
-
- for (Index = 0; Index < NumEndpoints; Index++) {
- EpDesc = UsbIf->IfSetting->Endpoints[Index];
-
- if (EpDesc->Desc.EndpointAddress == EpAddr) {
- return EpDesc;
- }
- }
-
- return NULL;
-}
-
-
-/**
- Free the resource used by USB interface.
-
- @param UsbIf The USB interface to free.
-
-**/
-VOID
-UsbFreeInterface (
- IN USB_INTERFACE *UsbIf
- )
-{
- UsbCloseHostProtoByChild (UsbIf->Device->Bus, UsbIf->Handle);
-
- gBS->UninstallMultipleProtocolInterfaces (
- UsbIf->Handle,
- &gEfiDevicePathProtocolGuid,
- UsbIf->DevicePath,
- &gEfiUsbIoProtocolGuid,
- &UsbIf->UsbIo,
- NULL
- );
-
- if (UsbIf->DevicePath != NULL) {
- FreePool (UsbIf->DevicePath);
- }
-
- FreePool (UsbIf);
-}
-
-
-/**
- Create an interface for the descriptor IfDesc. Each
- device's configuration can have several interfaces.
-
- @param Device The device has the interface descriptor.
- @param IfDesc The interface descriptor.
-
- @return The created USB interface for the descriptor, or NULL.
-
-**/
-USB_INTERFACE *
-UsbCreateInterface (
- IN USB_DEVICE *Device,
- IN USB_INTERFACE_DESC *IfDesc
- )
-{
- USB_DEVICE_PATH UsbNode;
- USB_INTERFACE *UsbIf;
- USB_INTERFACE *HubIf;
- EFI_STATUS Status;
-
- UsbIf = AllocateZeroPool (sizeof (USB_INTERFACE));
-
- if (UsbIf == NULL) {
- return NULL;
- }
-
- UsbIf->Signature = USB_INTERFACE_SIGNATURE;
- UsbIf->Device = Device;
- UsbIf->IfDesc = IfDesc;
- ASSERT (IfDesc->ActiveIndex < USB_MAX_INTERFACE_SETTING);
- UsbIf->IfSetting = IfDesc->Settings[IfDesc->ActiveIndex];
-
- CopyMem (
- &(UsbIf->UsbIo),
- &mUsbIoProtocol,
- sizeof (EFI_USB_IO_PROTOCOL)
- );
-
- //
- // Install protocols for USBIO and device path
- //
- UsbNode.Header.Type = MESSAGING_DEVICE_PATH;
- UsbNode.Header.SubType = MSG_USB_DP;
- UsbNode.ParentPortNumber = Device->ParentPort;
- UsbNode.InterfaceNumber = UsbIf->IfSetting->Desc.InterfaceNumber;
-
- SetDevicePathNodeLength (&UsbNode.Header, sizeof (UsbNode));
-
- HubIf = Device->ParentIf;
- ASSERT (HubIf != NULL);
-
- UsbIf->DevicePath = AppendDevicePathNode (HubIf->DevicePath, &UsbNode.Header);
-
- if (UsbIf->DevicePath == NULL) {
- DEBUG ((EFI_D_ERROR, "UsbCreateInterface: failed to create device path\n"));
-
- Status = EFI_OUT_OF_RESOURCES;
- goto ON_ERROR;
- }
-
- Status = gBS->InstallMultipleProtocolInterfaces (
- &UsbIf->Handle,
- &gEfiDevicePathProtocolGuid,
- UsbIf->DevicePath,
- &gEfiUsbIoProtocolGuid,
- &UsbIf->UsbIo,
- NULL
- );
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "UsbCreateInterface: failed to install UsbIo - %r\n", Status));
- goto ON_ERROR;
- }
-
- //
- // Open USB Host Controller Protocol by Child
- //
- Status = UsbOpenHostProtoByChild (Device->Bus, UsbIf->Handle);
-
- if (EFI_ERROR (Status)) {
- gBS->UninstallMultipleProtocolInterfaces (
- &UsbIf->Handle,
- &gEfiDevicePathProtocolGuid,
- UsbIf->DevicePath,
- &gEfiUsbIoProtocolGuid,
- &UsbIf->UsbIo,
- NULL
- );
-
- DEBUG ((EFI_D_ERROR, "UsbCreateInterface: failed to open host for child - %r\n", Status));
- goto ON_ERROR;
- }
-
- return UsbIf;
-
-ON_ERROR:
- if (UsbIf->DevicePath != NULL) {
- FreePool (UsbIf->DevicePath);
- }
-
- FreePool (UsbIf);
- return NULL;
-}
-
-
-/**
- Free the resource used by this USB device.
-
- @param Device The USB device to free.
-
-**/
-VOID
-UsbFreeDevice (
- IN USB_DEVICE *Device
- )
-{
- if (Device->DevDesc != NULL) {
- UsbFreeDevDesc (Device->DevDesc);
- }
-
- gBS->FreePool (Device);
-}
-
-
-/**
- Create a device which is on the parent's ParentPort port.
-
- @param ParentIf The parent HUB interface.
- @param ParentPort The port on the HUB this device is connected to.
-
- @return Created USB device, Or NULL.
-
-**/
-USB_DEVICE *
-UsbCreateDevice (
- IN USB_INTERFACE *ParentIf,
- IN UINT8 ParentPort
- )
-{
- USB_DEVICE *Device;
-
- ASSERT (ParentIf != NULL);
-
- Device = AllocateZeroPool (sizeof (USB_DEVICE));
-
- if (Device == NULL) {
- return NULL;
- }
-
- Device->Bus = ParentIf->Device->Bus;
- Device->MaxPacket0 = 8;
- Device->ParentAddr = ParentIf->Device->Address;
- Device->ParentIf = ParentIf;
- Device->ParentPort = ParentPort;
- Device->Tier = (UINT8)(ParentIf->Device->Tier + 1);
- return Device;
-}
-
-
-/**
- Connect the USB interface with its driver. EFI USB bus will
- create a USB interface for each separate interface descriptor.
-
- @param UsbIf The interface to connect driver to.
-
- @return EFI_SUCCESS Interface is managed by some driver.
- @return Others Failed to locate a driver for this interface.
-
-**/
-EFI_STATUS
-UsbConnectDriver (
- IN USB_INTERFACE *UsbIf
- )
-{
- EFI_STATUS Status;
- EFI_TPL OldTpl;
-
- Status = EFI_SUCCESS;
-
- //
- // Hub is maintained by the USB bus driver. Otherwise try to
- // connect drivers with this interface
- //
- if (UsbIsHubInterface (UsbIf)) {
- DEBUG ((EFI_D_INFO, "UsbConnectDriver: found a hub device\n"));
- Status = mUsbHubApi.Init (UsbIf);
-
- } else {
- //
- // This function is called in both UsbIoControlTransfer and
- // the timer callback in hub enumeration. So, at least it is
- // called at TPL_CALLBACK. Some driver sitting on USB has
- // twisted TPL used. It should be no problem for us to connect
- // or disconnect at CALLBACK.
- //
-
- //
- // Only recursively wanted usb child device
- //
- if (UsbBusIsWantedUsbIO (UsbIf->Device->Bus, UsbIf)) {
- OldTpl = UsbGetCurrentTpl ();
- DEBUG ((EFI_D_INFO, "UsbConnectDriver: TPL before connect is %d, %p\n", (UINT32)OldTpl, UsbIf->Handle));
-
- gBS->RestoreTPL (TPL_CALLBACK);
-
- Status = gBS->ConnectController (UsbIf->Handle, NULL, NULL, TRUE);
- UsbIf->IsManaged = (BOOLEAN)!EFI_ERROR (Status);
-
- DEBUG ((EFI_D_INFO, "UsbConnectDriver: TPL after connect is %d\n", (UINT32)UsbGetCurrentTpl()));
- ASSERT (UsbGetCurrentTpl () == TPL_CALLBACK);
-
- gBS->RaiseTPL (OldTpl);
- }
- }
-
- return Status;
-}
-
-
-/**
- Select an alternate setting for the interface.
- Each interface can have several mutually exclusive
- settings. Only one setting is active. It will
- also reset its endpoints' toggle to zero.
-
- @param IfDesc The interface descriptor to set.
- @param Alternate The alternate setting number to locate.
-
- @retval EFI_NOT_FOUND There is no setting with this alternate index.
- @retval EFI_SUCCESS The interface is set to Alternate setting.
-
-**/
-EFI_STATUS
-UsbSelectSetting (
- IN USB_INTERFACE_DESC *IfDesc,
- IN UINT8 Alternate
- )
-{
- USB_INTERFACE_SETTING *Setting;
- UINTN Index;
-
- //
- // Locate the active alternate setting
- //
- Setting = NULL;
-
- for (Index = 0; Index < IfDesc->NumOfSetting; Index++) {
- ASSERT (Index < USB_MAX_INTERFACE_SETTING);
- Setting = IfDesc->Settings[Index];
-
- if (Setting->Desc.AlternateSetting == Alternate) {
- break;
- }
- }
-
- if (Index == IfDesc->NumOfSetting) {
- return EFI_NOT_FOUND;
- }
-
- IfDesc->ActiveIndex = Index;
-
- ASSERT (Setting != NULL);
- DEBUG ((EFI_D_INFO, "UsbSelectSetting: setting %d selected for interface %d\n",
- Alternate, Setting->Desc.InterfaceNumber));
-
- //
- // Reset the endpoint toggle to zero
- //
- for (Index = 0; Index < Setting->Desc.NumEndpoints; Index++) {
- Setting->Endpoints[Index]->Toggle = 0;
- }
-
- return EFI_SUCCESS;
-}
-
-
-/**
- Select a new configuration for the device. Each
- device may support several configurations.
-
- @param Device The device to select configuration.
- @param ConfigValue The index of the configuration ( != 0).
-
- @retval EFI_NOT_FOUND There is no configuration with the index.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate resource.
- @retval EFI_SUCCESS The configuration is selected.
-
-**/
-EFI_STATUS
-UsbSelectConfig (
- IN USB_DEVICE *Device,
- IN UINT8 ConfigValue
- )
-{
- USB_DEVICE_DESC *DevDesc;
- USB_CONFIG_DESC *ConfigDesc;
- USB_INTERFACE_DESC *IfDesc;
- USB_INTERFACE *UsbIf;
- EFI_STATUS Status;
- UINT8 Index;
-
- //
- // Locate the active config, then set the device's pointer
- //
- DevDesc = Device->DevDesc;
- ConfigDesc = NULL;
-
- for (Index = 0; Index < DevDesc->Desc.NumConfigurations; Index++) {
- ConfigDesc = DevDesc->Configs[Index];
-
- if (ConfigDesc->Desc.ConfigurationValue == ConfigValue) {
- break;
- }
- }
-
- if (Index == DevDesc->Desc.NumConfigurations) {
- return EFI_NOT_FOUND;
- }
-
- Device->ActiveConfig = ConfigDesc;
-
- DEBUG ((EFI_D_INFO, "UsbSelectConfig: config %d selected for device %d\n",
- ConfigValue, Device->Address));
-
- //
- // Create interfaces for each USB interface descriptor.
- //
- for (Index = 0; Index < ConfigDesc->Desc.NumInterfaces; Index++) {
- //
- // First select the default interface setting, and reset
- // the endpoint toggles to zero for its endpoints.
- //
- IfDesc = ConfigDesc->Interfaces[Index];
- UsbSelectSetting (IfDesc, IfDesc->Settings[0]->Desc.AlternateSetting);
-
- //
- // Create a USB_INTERFACE and install USB_IO and other protocols
- //
- UsbIf = UsbCreateInterface (Device, ConfigDesc->Interfaces[Index]);
-
- if (UsbIf == NULL) {
- Device->NumOfInterface = Index;
- return EFI_OUT_OF_RESOURCES;
- }
-
- ASSERT (Index < USB_MAX_INTERFACE);
- Device->Interfaces[Index] = UsbIf;
-
- //
- // Connect the device to drivers, if it failed, ignore
- // the error. Don't let the unsupported interfaces to block
- // the supported interfaces.
- //
- Status = UsbConnectDriver (UsbIf);
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "UsbSelectConfig: failed to connect driver %r, ignored\n", Status));
- }
- }
-
- Device->NumOfInterface = Index;
-
- return EFI_SUCCESS;
-}
-
-
-/**
- Disconnect the USB interface with its driver.
-
- @param UsbIf The interface to disconnect driver from.
-
-**/
-EFI_STATUS
-UsbDisconnectDriver (
- IN USB_INTERFACE *UsbIf
- )
-{
- EFI_TPL OldTpl;
- EFI_STATUS Status;
-
- //
- // Release the hub if it's a hub controller, otherwise
- // disconnect the driver if it is managed by other drivers.
- //
- Status = EFI_SUCCESS;
- if (UsbIf->IsHub) {
- Status = UsbIf->HubApi->Release (UsbIf);
-
- } else if (UsbIf->IsManaged) {
- //
- // This function is called in both UsbIoControlTransfer and
- // the timer callback in hub enumeration. So, at least it is
- // called at TPL_CALLBACK. Some driver sitting on USB has
- // twisted TPL used. It should be no problem for us to connect
- // or disconnect at CALLBACK.
- //
- OldTpl = UsbGetCurrentTpl ();
- DEBUG ((EFI_D_INFO, "UsbDisconnectDriver: old TPL is %d, %p\n", (UINT32)OldTpl, UsbIf->Handle));
-
- gBS->RestoreTPL (TPL_CALLBACK);
-
- Status = gBS->DisconnectController (UsbIf->Handle, NULL, NULL);
- if (!EFI_ERROR (Status)) {
- UsbIf->IsManaged = FALSE;
- }
-
- DEBUG (( EFI_D_INFO, "UsbDisconnectDriver: TPL after disconnect is %d, %d\n", (UINT32)UsbGetCurrentTpl(), Status));
- ASSERT (UsbGetCurrentTpl () == TPL_CALLBACK);
-
- gBS->RaiseTPL (OldTpl);
- }
-
- return Status;
-}
-
-
-/**
- Remove the current device configuration.
-
- @param Device The USB device to remove configuration from.
-
-**/
-EFI_STATUS
-UsbRemoveConfig (
- IN USB_DEVICE *Device
- )
-{
- USB_INTERFACE *UsbIf;
- UINTN Index;
- EFI_STATUS Status;
- EFI_STATUS ReturnStatus;
-
- //
- // Remove each interface of the device
- //
- ReturnStatus = EFI_SUCCESS;
- for (Index = 0; Index < Device->NumOfInterface; Index++) {
- ASSERT (Index < USB_MAX_INTERFACE);
- UsbIf = Device->Interfaces[Index];
-
- if (UsbIf == NULL) {
- continue;
- }
-
- Status = UsbDisconnectDriver (UsbIf);
- if (!EFI_ERROR (Status)) {
- UsbFreeInterface (UsbIf);
- Device->Interfaces[Index] = NULL;
- } else {
- ReturnStatus = Status;
- }
- }
-
- Device->ActiveConfig = NULL;
- return ReturnStatus;
-}
-
-
-/**
- Remove the device and all its children from the bus.
-
- @param Device The device to remove.
-
- @retval EFI_SUCCESS The device is removed.
-
-**/
-EFI_STATUS
-UsbRemoveDevice (
- IN USB_DEVICE *Device
- )
-{
- USB_BUS *Bus;
- USB_DEVICE *Child;
- EFI_STATUS Status;
- EFI_STATUS ReturnStatus;
- UINTN Index;
-
- Bus = Device->Bus;
-
- //
- // Remove all the devices on its downstream ports. Search from devices[1].
- // Devices[0] is the root hub.
- //
- ReturnStatus = EFI_SUCCESS;
- for (Index = 1; Index < Bus->MaxDevices; Index++) {
- Child = Bus->Devices[Index];
-
- if ((Child == NULL) || (Child->ParentAddr != Device->Address)) {
- continue;
- }
-
- Status = UsbRemoveDevice (Child);
-
- if (!EFI_ERROR (Status)) {
- Bus->Devices[Index] = NULL;
- } else {
- Bus->Devices[Index]->DisconnectFail = TRUE;
- ReturnStatus = Status;
- DEBUG ((EFI_D_INFO, "UsbRemoveDevice: failed to remove child %p at parent %p\n", Child, Device));
- }
- }
-
- if (EFI_ERROR (ReturnStatus)) {
- return ReturnStatus;
- }
-
- Status = UsbRemoveConfig (Device);
-
- if (!EFI_ERROR (Status)) {
- DEBUG (( EFI_D_INFO, "UsbRemoveDevice: device %d removed\n", Device->Address));
-
- ASSERT (Device->Address < Bus->MaxDevices);
- Bus->Devices[Device->Address] = NULL;
- UsbFreeDevice (Device);
- } else {
- Bus->Devices[Device->Address]->DisconnectFail = TRUE;
- }
- return Status;
-}
-
-
-/**
- Find the child device on the hub's port.
-
- @param HubIf The hub interface.
- @param Port The port of the hub this child is connected to.
-
- @return The device on the hub's port, or NULL if there is none.
-
-**/
-USB_DEVICE *
-UsbFindChild (
- IN USB_INTERFACE *HubIf,
- IN UINT8 Port
- )
-{
- USB_DEVICE *Device;
- USB_BUS *Bus;
- UINTN Index;
-
- Bus = HubIf->Device->Bus;
-
- //
- // Start checking from device 1, device 0 is the root hub
- //
- for (Index = 1; Index < Bus->MaxDevices; Index++) {
- Device = Bus->Devices[Index];
-
- if ((Device != NULL) && (Device->ParentAddr == HubIf->Device->Address) &&
- (Device->ParentPort == Port)) {
-
- return Device;
- }
- }
-
- return NULL;
-}
-
-
-/**
- Enumerate and configure the new device on the port of this HUB interface.
-
- @param HubIf The HUB that has the device connected.
- @param Port The port index of the hub (started with zero).
-
- @retval EFI_SUCCESS The device is enumerated (added or removed).
- @retval EFI_OUT_OF_RESOURCES Failed to allocate resource for the device.
- @retval Others Failed to enumerate the device.
-
-**/
-EFI_STATUS
-UsbEnumerateNewDev (
- IN USB_INTERFACE *HubIf,
- IN UINT8 Port
- )
-{
- USB_BUS *Bus;
- USB_HUB_API *HubApi;
- USB_DEVICE *Child;
- USB_DEVICE *Parent;
- EFI_USB_PORT_STATUS PortState;
- UINTN Address;
- UINT8 Config;
- EFI_STATUS Status;
-
- Parent = HubIf->Device;
- Bus = Parent->Bus;
- HubApi = HubIf->HubApi;
- Address = Bus->MaxDevices;
-
- gBS->Stall (USB_WAIT_PORT_STABLE_STALL);
-
- //
- // Hub resets the device for at least 10 milliseconds.
- // Host learns device speed. If device is of low/full speed
- // and the hub is a EHCI root hub, ResetPort will release
- // the device to its companion UHCI and return an error.
- //
- Status = HubApi->ResetPort (HubIf, Port);
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "UsbEnumerateNewDev: failed to reset port %d - %r\n", Port, Status));
-
- return Status;
- }
-
- DEBUG (( EFI_D_INFO, "UsbEnumerateNewDev: hub port %d is reset\n", Port));
-
- Child = UsbCreateDevice (HubIf, Port);
-
- if (Child == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- //
- // OK, now identify the device speed. After reset, hub
- // fully knows the actual device speed.
- //
- Status = HubApi->GetPortStatus (HubIf, Port, &PortState);
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "UsbEnumerateNewDev: failed to get speed of port %d\n", Port));
- goto ON_ERROR;
- }
-
- if (!USB_BIT_IS_SET (PortState.PortStatus, USB_PORT_STAT_CONNECTION)) {
- DEBUG ((EFI_D_ERROR, "UsbEnumerateNewDev: No device present at port %d\n", Port));
- goto ON_ERROR;
- } else if (USB_BIT_IS_SET (PortState.PortStatus, USB_PORT_STAT_SUPER_SPEED)){
- Child->Speed = EFI_USB_SPEED_SUPER;
- Child->MaxPacket0 = 512;
- } else if (USB_BIT_IS_SET (PortState.PortStatus, USB_PORT_STAT_HIGH_SPEED)) {
- Child->Speed = EFI_USB_SPEED_HIGH;
- Child->MaxPacket0 = 64;
- } else if (USB_BIT_IS_SET (PortState.PortStatus, USB_PORT_STAT_LOW_SPEED)) {
- Child->Speed = EFI_USB_SPEED_LOW;
- Child->MaxPacket0 = 8;
- } else {
- Child->Speed = EFI_USB_SPEED_FULL;
- Child->MaxPacket0 = 8;
- }
-
- DEBUG (( EFI_D_INFO, "UsbEnumerateNewDev: device is of %d speed\n", Child->Speed));
-
- if (((Child->Speed == EFI_USB_SPEED_LOW) || (Child->Speed == EFI_USB_SPEED_FULL)) &&
- (Parent->Speed == EFI_USB_SPEED_HIGH)) {
- //
- // If the child is a low or full speed device, it is necessary to
- // set the transaction translator. Port TT is 1-based.
- // This is quite simple:
- // 1. if parent is of high speed, then parent is our translator
- // 2. otherwise use parent's translator.
- //
- Child->Translator.TranslatorHubAddress = Parent->Address;
- Child->Translator.TranslatorPortNumber = (UINT8) (Port + 1);
- } else {
- Child->Translator = Parent->Translator;
- }
- DEBUG (( EFI_D_INFO, "UsbEnumerateNewDev: device uses translator (%d, %d)\n",
- Child->Translator.TranslatorHubAddress,
- Child->Translator.TranslatorPortNumber));
-
- //
- // After port is reset, hub establishes a signal path between
- // the device and host (DEFALUT state). Device's registers are
- // reset, use default address 0 (host enumerates one device at
- // a time) , and ready to respond to control transfer at EP 0.
- //
-
- //
- // Host assigns an address to the device. Device completes the
- // status stage with default address, then switches to new address.
- // ADDRESS state. Address zero is reserved for root hub.
- //
- ASSERT (Bus->MaxDevices <= 256);
- for (Address = 1; Address < Bus->MaxDevices; Address++) {
- if (Bus->Devices[Address] == NULL) {
- break;
- }
- }
-
- if (Address >= Bus->MaxDevices) {
- DEBUG ((EFI_D_ERROR, "UsbEnumerateNewDev: address pool is full for port %d\n", Port));
-
- Status = EFI_ACCESS_DENIED;
- goto ON_ERROR;
- }
-
- Status = UsbSetAddress (Child, (UINT8)Address);
- Child->Address = (UINT8)Address;
- Bus->Devices[Address] = Child;
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "UsbEnumerateNewDev: failed to set device address - %r\n", Status));
- goto ON_ERROR;
- }
-
- gBS->Stall (USB_SET_DEVICE_ADDRESS_STALL);
-
- DEBUG ((EFI_D_INFO, "UsbEnumerateNewDev: device is now ADDRESSED at %d\n", Address));
-
- //
- // Host sends a Get_Descriptor request to learn the max packet
- // size of default pipe (only part of the device's descriptor).
- //
- Status = UsbGetMaxPacketSize0 (Child);
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "UsbEnumerateNewDev: failed to get max packet for EP 0 - %r\n", Status));
- goto ON_ERROR;
- }
-
- DEBUG (( EFI_D_INFO, "UsbEnumerateNewDev: max packet size for EP 0 is %d\n", Child->MaxPacket0));
-
- //
- // Host learns about the device's abilities by requesting device's
- // entire descriptions.
- //
- Status = UsbBuildDescTable (Child);
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "UsbEnumerateNewDev: failed to build descriptor table - %r\n", Status));
- goto ON_ERROR;
- }
-
- //
- // Select a default configuration: UEFI must set the configuration
- // before the driver can connect to the device.
- //
- Config = Child->DevDesc->Configs[0]->Desc.ConfigurationValue;
- Status = UsbSetConfig (Child, Config);
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "UsbEnumerateNewDev: failed to set configure %d - %r\n", Config, Status));
- goto ON_ERROR;
- }
-
- DEBUG (( EFI_D_INFO, "UsbEnumerateNewDev: device %d is now in CONFIGED state\n", Address));
-
- //
- // Host assigns and loads a device driver.
- //
- Status = UsbSelectConfig (Child, Config);
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "UsbEnumerateNewDev: failed to create interfaces - %r\n", Status));
- goto ON_ERROR;
- }
-
- //
- // Report Status Code to indicate USB device has been detected by hotplug
- //
- REPORT_STATUS_CODE_WITH_DEVICE_PATH (
- EFI_PROGRESS_CODE,
- (EFI_IO_BUS_USB | EFI_IOB_PC_HOTPLUG),
- Bus->DevicePath
- );
- return EFI_SUCCESS;
-
-ON_ERROR:
- //
- // If reach here, it means the enumeration process on a given port is interrupted due to error.
- // The s/w resources, including the assigned address(Address) and the allocated usb device data
- // structure(Bus->Devices[Address]), will NOT be freed here. These resources will be freed when
- // the device is unplugged from the port or DriverBindingStop() is invoked.
- //
- // This way is used to co-work with the lower layer EDKII UHCI/EHCI/XHCI host controller driver.
- // It's mainly because to keep UEFI spec unchanged EDKII XHCI driver have to maintain a state machine
- // to keep track of the mapping between actual address and request address. If the request address
- // (Address) is freed here, the Address value will be used by next enumerated device. Then EDKII XHCI
- // host controller driver will have wrong information, which will cause further transaction error.
- //
- // EDKII UHCI/EHCI doesn't get impacted as it's make sense to reserve s/w resource till it gets unplugged.
- //
- return Status;
-}
-
-
-/**
- Process the events on the port.
-
- @param HubIf The HUB that has the device connected.
- @param Port The port index of the hub (started with zero).
-
- @retval EFI_SUCCESS The device is enumerated (added or removed).
- @retval EFI_OUT_OF_RESOURCES Failed to allocate resource for the device.
- @retval Others Failed to enumerate the device.
-
-**/
-EFI_STATUS
-UsbEnumeratePort (
- IN USB_INTERFACE *HubIf,
- IN UINT8 Port
- )
-{
- USB_HUB_API *HubApi;
- USB_DEVICE *Child;
- EFI_USB_PORT_STATUS PortState;
- EFI_STATUS Status;
-
- Child = NULL;
- HubApi = HubIf->HubApi;
-
- //
- // Host learns of the new device by polling the hub for port changes.
- //
- Status = HubApi->GetPortStatus (HubIf, Port, &PortState);
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "UsbEnumeratePort: failed to get state of port %d\n", Port));
- return Status;
- }
-
- //
- // Only handle connection/enable/overcurrent/reset change.
- // Usb super speed hub may report other changes, such as warm reset change. Ignore them.
- //
- if ((PortState.PortChangeStatus & (USB_PORT_STAT_C_CONNECTION | USB_PORT_STAT_C_ENABLE | USB_PORT_STAT_C_OVERCURRENT | USB_PORT_STAT_C_RESET)) == 0) {
- return EFI_SUCCESS;
- }
-
- DEBUG (( EFI_D_INFO, "UsbEnumeratePort: port %d state - %02x, change - %02x on %p\n",
- Port, PortState.PortStatus, PortState.PortChangeStatus, HubIf));
-
- //
- // This driver only process two kinds of events now: over current and
- // connect/disconnect. Other three events are: ENABLE, SUSPEND, RESET.
- // ENABLE/RESET is used to reset port. SUSPEND isn't supported.
- //
-
- if (USB_BIT_IS_SET (PortState.PortChangeStatus, USB_PORT_STAT_C_OVERCURRENT)) {
-
- if (USB_BIT_IS_SET (PortState.PortStatus, USB_PORT_STAT_OVERCURRENT)) {
- //
- // Case1:
- // Both OverCurrent and OverCurrentChange set, means over current occurs,
- // which probably is caused by short circuit. It has to wait system hardware
- // to perform recovery.
- //
- DEBUG (( EFI_D_ERROR, "UsbEnumeratePort: Critical Over Current\n", Port));
- return EFI_DEVICE_ERROR;
-
- }
- //
- // Case2:
- // Only OverCurrentChange set, means system has been recoveried from
- // over current. As a result, all ports are nearly power-off, so
- // it's necessary to detach and enumerate all ports again.
- //
- DEBUG (( EFI_D_ERROR, "UsbEnumeratePort: 2.0 device Recovery Over Current\n", Port));
- }
-
- if (USB_BIT_IS_SET (PortState.PortChangeStatus, USB_PORT_STAT_C_ENABLE)) {
- //
- // Case3:
- // 1.1 roothub port reg doesn't reflect over-current state, while its counterpart
- // on 2.0 roothub does. When over-current has influence on 1.1 device, the port
- // would be disabled, so it's also necessary to detach and enumerate again.
- //
- DEBUG (( EFI_D_ERROR, "UsbEnumeratePort: 1.1 device Recovery Over Current\n", Port));
- }
-
- if (USB_BIT_IS_SET (PortState.PortChangeStatus, USB_PORT_STAT_C_CONNECTION)) {
- //
- // Case4:
- // Device connected or disconnected normally.
- //
- DEBUG ((EFI_D_INFO, "UsbEnumeratePort: Device Connect/Disconnect Normally\n", Port));
- }
-
- //
- // Following as the above cases, it's safety to remove and create again.
- //
- Child = UsbFindChild (HubIf, Port);
-
- if (Child != NULL) {
- DEBUG (( EFI_D_INFO, "UsbEnumeratePort: device at port %d removed from root hub %p\n", Port, HubIf));
- UsbRemoveDevice (Child);
- }
-
- if (USB_BIT_IS_SET (PortState.PortStatus, USB_PORT_STAT_CONNECTION)) {
- //
- // Now, new device connected, enumerate and configure the device
- //
- DEBUG (( EFI_D_INFO, "UsbEnumeratePort: new device connected at port %d\n", Port));
- Status = UsbEnumerateNewDev (HubIf, Port);
-
- } else {
- DEBUG (( EFI_D_INFO, "UsbEnumeratePort: device disconnected event on port %d\n", Port));
- }
-
- HubApi->ClearPortChange (HubIf, Port);
- return Status;
-}
-
-
-/**
- Enumerate all the changed hub ports.
-
- @param Event The event that is triggered.
- @param Context The context to the event.
-
-**/
-VOID
-EFIAPI
-UsbHubEnumeration (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- USB_INTERFACE *HubIf;
- UINT8 Byte;
- UINT8 Bit;
- UINT8 Index;
- USB_DEVICE *Child;
-
- ASSERT (Context != NULL);
-
- HubIf = (USB_INTERFACE *) Context;
-
- for (Index = 0; Index < HubIf->NumOfPort; Index++) {
- Child = UsbFindChild (HubIf, Index);
- if ((Child != NULL) && (Child->DisconnectFail == TRUE)) {
- DEBUG (( EFI_D_INFO, "UsbEnumeratePort: The device disconnect fails at port %d from hub %p, try again\n", Index, HubIf));
- UsbRemoveDevice (Child);
- }
- }
-
- if (HubIf->ChangeMap == NULL) {
- return ;
- }
-
- //
- // HUB starts its port index with 1.
- //
- Byte = 0;
- Bit = 1;
-
- for (Index = 0; Index < HubIf->NumOfPort; Index++) {
- if (USB_BIT_IS_SET (HubIf->ChangeMap[Byte], USB_BIT (Bit))) {
- UsbEnumeratePort (HubIf, Index);
- }
-
- USB_NEXT_BIT (Byte, Bit);
- }
-
- UsbHubAckHubStatus (HubIf->Device);
-
- gBS->FreePool (HubIf->ChangeMap);
- HubIf->ChangeMap = NULL;
- return ;
-}
-
-
-/**
- Enumerate all the changed hub ports.
-
- @param Event The event that is triggered.
- @param Context The context to the event.
-
-**/
-VOID
-EFIAPI
-UsbRootHubEnumeration (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- USB_INTERFACE *RootHub;
- UINT8 Index;
- USB_DEVICE *Child;
-
- RootHub = (USB_INTERFACE *) Context;
-
- for (Index = 0; Index < RootHub->NumOfPort; Index++) {
- Child = UsbFindChild (RootHub, Index);
- if ((Child != NULL) && (Child->DisconnectFail == TRUE)) {
- DEBUG (( EFI_D_INFO, "UsbEnumeratePort: The device disconnect fails at port %d from root hub %p, try again\n", Index, RootHub));
- UsbRemoveDevice (Child);
- }
-
- UsbEnumeratePort (RootHub, Index);
- }
-}
diff --git a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbEnumer.h b/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbEnumer.h
deleted file mode 100644
index ef7d440917..0000000000
--- a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbEnumer.h
+++ /dev/null
@@ -1,203 +0,0 @@
-/** @file
-
- USB bus enumeration interface.
-
-Copyright (c) 2007, 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 _USB_ENUMERATION_H_
-#define _USB_ENUMERATION_H_
-
-//
-// Advance the byte and bit to the next bit, adjust byte accordingly.
-//
-#define USB_NEXT_BIT(Byte, Bit) \
- do { \
- (Bit)++; \
- if ((Bit) > 7) { \
- (Byte)++; \
- (Bit) = 0; \
- } \
- } while (0)
-
-
-//
-// Common interface used by usb bus enumeration process.
-// This interface is defined to mask the difference between
-// the root hub and normal hub. So, bus enumeration code
-// can be shared by both root hub and normal hub
-//
-typedef
-EFI_STATUS
-(*USB_HUB_INIT) (
- IN USB_INTERFACE *UsbIf
- );
-
-//
-// Get the port status. This function is required to
-// ACK the port change bits although it will return
-// the port changes in PortState. Bus enumeration code
-// doesn't need to ACK the port change bits.
-//
-typedef
-EFI_STATUS
-(*USB_HUB_GET_PORT_STATUS) (
- IN USB_INTERFACE *UsbIf,
- IN UINT8 Port,
- OUT EFI_USB_PORT_STATUS *PortState
- );
-
-typedef
-VOID
-(*USB_HUB_CLEAR_PORT_CHANGE) (
- IN USB_INTERFACE *HubIf,
- IN UINT8 Port
- );
-
-typedef
-EFI_STATUS
-(*USB_HUB_SET_PORT_FEATURE) (
- IN USB_INTERFACE *UsbIf,
- IN UINT8 Port,
- IN EFI_USB_PORT_FEATURE Feature
- );
-
-typedef
-EFI_STATUS
-(*USB_HUB_CLEAR_PORT_FEATURE) (
- IN USB_INTERFACE *UsbIf,
- IN UINT8 Port,
- IN EFI_USB_PORT_FEATURE Feature
- );
-
-typedef
-EFI_STATUS
-(*USB_HUB_RESET_PORT) (
- IN USB_INTERFACE *UsbIf,
- IN UINT8 Port
- );
-
-typedef
-EFI_STATUS
-(*USB_HUB_RELEASE) (
- IN USB_INTERFACE *UsbIf
- );
-
-/**
- Return the endpoint descriptor in this interface.
-
- @param UsbIf The interface to search in.
- @param EpAddr The address of the endpoint to return.
-
- @return The endpoint descriptor or NULL.
-
-**/
-USB_ENDPOINT_DESC*
-UsbGetEndpointDesc (
- IN USB_INTERFACE *UsbIf,
- IN UINT8 EpAddr
- );
-
-/**
- Select an alternate setting for the interface.
- Each interface can have several mutually exclusive
- settings. Only one setting is active. It will
- also reset its endpoints' toggle to zero.
-
- @param IfDesc The interface descriptor to set.
- @param Alternate The alternate setting number to locate.
-
- @retval EFI_NOT_FOUND There is no setting with this alternate index.
- @retval EFI_SUCCESS The interface is set to Alternate setting.
-
-**/
-EFI_STATUS
-UsbSelectSetting (
- IN USB_INTERFACE_DESC *IfDesc,
- IN UINT8 Alternate
- );
-
-/**
- Select a new configuration for the device. Each
- device may support several configurations.
-
- @param Device The device to select configuration.
- @param ConfigIndex The index of the configuration ( != 0).
-
- @retval EFI_NOT_FOUND There is no configuration with the index.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate resource.
- @retval EFI_SUCCESS The configuration is selected.
-
-**/
-EFI_STATUS
-UsbSelectConfig (
- IN USB_DEVICE *Device,
- IN UINT8 ConfigIndex
- );
-
-/**
- Remove the current device configuration.
-
- @param Device The USB device to remove configuration from.
-
- @return None.
-
-**/
-EFI_STATUS
-UsbRemoveConfig (
- IN USB_DEVICE *Device
- );
-
-/**
- Remove the device and all its children from the bus.
-
- @param Device The device to remove.
-
- @retval EFI_SUCCESS The device is removed.
-
-**/
-EFI_STATUS
-UsbRemoveDevice (
- IN USB_DEVICE *Device
- );
-
-/**
- Enumerate all the changed hub ports.
-
- @param Event The event that is triggered.
- @param Context The context to the event.
-
- @return None.
-
-**/
-VOID
-EFIAPI
-UsbHubEnumeration (
- IN EFI_EVENT Event,
- IN VOID *Context
- );
-
-/**
- Enumerate all the changed hub ports.
-
- @param Event The event that is triggered.
- @param Context The context to the event.
-
- @return None.
-
-**/
-VOID
-EFIAPI
-UsbRootHubEnumeration (
- IN EFI_EVENT Event,
- IN VOID *Context
- );
-#endif
diff --git a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbHub.c b/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbHub.c
deleted file mode 100644
index e3752d1f83..0000000000
--- a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbHub.c
+++ /dev/null
@@ -1,1411 +0,0 @@
-/** @file
-
- Unified interface for RootHub and Hub.
-
-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.
-
-**/
-
-#include "UsbBus.h"
-
-//
-// Array that maps the change bit to feature value which is
-// used to clear these change bit. USB HUB API will clear
-// these change bit automatically. For non-root hub, these
-// bits determine whether hub will report the port in changed
-// bit maps.
-//
-USB_CHANGE_FEATURE_MAP mHubFeatureMap[] = {
- {USB_PORT_STAT_C_CONNECTION, EfiUsbPortConnectChange},
- {USB_PORT_STAT_C_ENABLE, EfiUsbPortEnableChange},
- {USB_PORT_STAT_C_SUSPEND, EfiUsbPortSuspendChange},
- {USB_PORT_STAT_C_OVERCURRENT, EfiUsbPortOverCurrentChange},
- {USB_PORT_STAT_C_RESET, EfiUsbPortResetChange}
-};
-
-USB_CHANGE_FEATURE_MAP mRootHubFeatureMap[] = {
- {USB_PORT_STAT_C_CONNECTION, EfiUsbPortConnectChange},
- {USB_PORT_STAT_C_ENABLE, EfiUsbPortEnableChange},
- {USB_PORT_STAT_C_SUSPEND, EfiUsbPortSuspendChange},
- {USB_PORT_STAT_C_OVERCURRENT, EfiUsbPortOverCurrentChange},
- {USB_PORT_STAT_C_RESET, EfiUsbPortResetChange},
-};
-
-//
-// USB hub class specific requests. Although USB hub
-// is related to an interface, these requests are sent
-// to the control endpoint of the device.
-//
-/**
- USB hub control transfer to set the hub depth.
-
- @param HubDev The device of the hub.
- @param Depth The depth to set.
-
- @retval EFI_SUCCESS Depth of the hub is set.
- @retval Others Failed to set the depth.
-
-**/
-EFI_STATUS
-UsbHubCtrlSetHubDepth (
- IN USB_DEVICE *HubDev,
- IN UINT16 Depth
- )
-{
- EFI_STATUS Status;
-
- Status = UsbCtrlRequest (
- HubDev,
- EfiUsbNoData,
- USB_REQ_TYPE_CLASS,
- USB_HUB_TARGET_HUB,
- USB_HUB_REQ_SET_DEPTH,
- Depth,
- 0,
- NULL,
- 0
- );
-
- return Status;
-}
-
-/**
- USB hub control transfer to clear the hub feature.
-
- @param HubDev The device of the hub.
- @param Feature The feature to clear.
-
- @retval EFI_SUCCESS Feature of the hub is cleared.
- @retval Others Failed to clear the feature.
-
-**/
-EFI_STATUS
-UsbHubCtrlClearHubFeature (
- IN USB_DEVICE *HubDev,
- IN UINT16 Feature
- )
-{
- EFI_STATUS Status;
-
- Status = UsbCtrlRequest (
- HubDev,
- EfiUsbNoData,
- USB_REQ_TYPE_CLASS,
- USB_HUB_TARGET_HUB,
- USB_HUB_REQ_CLEAR_FEATURE,
- Feature,
- 0,
- NULL,
- 0
- );
-
- return Status;
-}
-
-
-/**
- Clear the feature of the device's port.
-
- @param HubDev The hub device.
- @param Port The port to clear feature.
- @param Feature The feature to clear.
-
- @retval EFI_SUCCESS The feature of the port is cleared.
- @retval Others Failed to clear the feature.
-
-**/
-EFI_STATUS
-UsbHubCtrlClearPortFeature (
- IN USB_DEVICE *HubDev,
- IN UINT8 Port,
- IN UINT16 Feature
- )
-{
- EFI_STATUS Status;
-
- //
- // In USB bus, all the port index starts from 0. But HUB
- // indexes its port from 1. So, port number is added one.
- //
- Status = UsbCtrlRequest (
- HubDev,
- EfiUsbNoData,
- USB_REQ_TYPE_CLASS,
- USB_HUB_TARGET_PORT,
- USB_HUB_REQ_CLEAR_FEATURE,
- Feature,
- (UINT16) (Port + 1),
- NULL,
- 0
- );
-
- return Status;
-}
-
-
-/**
- Clear the transaction translate buffer if full/low
- speed control/bulk transfer failed and the transfer
- uses this hub as translator.Remember to clear the TT
- buffer of transaction translator, not that of the
- parent.
-
- @param HubDev The hub device.
- @param Port The port of the hub.
- @param DevAddr Address of the failed transaction.
- @param EpNum The endpoint number of the failed transaction.
- @param EpType The type of failed transaction.
-
- @retval EFI_SUCCESS The TT buffer is cleared.
- @retval Others Failed to clear the TT buffer.
-
-**/
-EFI_STATUS
-UsbHubCtrlClearTTBuffer (
- IN USB_DEVICE *HubDev,
- IN UINT8 Port,
- IN UINT16 DevAddr,
- IN UINT16 EpNum,
- IN UINT16 EpType
- )
-{
- EFI_STATUS Status;
- UINT16 Value;
-
- //
- // Check USB2.0 spec page 424 for wValue's encoding
- //
- Value = (UINT16) ((EpNum & 0x0F) | (DevAddr << 4) |
- ((EpType & 0x03) << 11) | ((EpNum & 0x80) << 15));
-
- Status = UsbCtrlRequest (
- HubDev,
- EfiUsbNoData,
- USB_REQ_TYPE_CLASS,
- USB_HUB_TARGET_PORT,
- USB_HUB_REQ_CLEAR_TT,
- Value,
- (UINT16) (Port + 1),
- NULL,
- 0
- );
-
- return Status;
-}
-
-/**
- Usb hub control transfer to get the super speed hub descriptor.
-
- @param HubDev The hub device.
- @param Buf The buffer to hold the descriptor.
-
- @retval EFI_SUCCESS The hub descriptor is retrieved.
- @retval Others Failed to retrieve the hub descriptor.
-
-**/
-EFI_STATUS
-UsbHubCtrlGetSuperSpeedHubDesc (
- IN USB_DEVICE *HubDev,
- OUT VOID *Buf
- )
-{
- EFI_STATUS Status;
-
- Status = EFI_INVALID_PARAMETER;
-
- Status = UsbCtrlRequest (
- HubDev,
- EfiUsbDataIn,
- USB_REQ_TYPE_CLASS,
- USB_HUB_TARGET_HUB,
- USB_HUB_REQ_GET_DESC,
- (UINT16) (USB_DESC_TYPE_HUB_SUPER_SPEED << 8),
- 0,
- Buf,
- 32
- );
-
- return Status;
-}
-
-/**
- Usb hub control transfer to get the hub descriptor.
-
- @param HubDev The hub device.
- @param Buf The buffer to hold the descriptor.
- @param Len The length to retrieve.
-
- @retval EFI_SUCCESS The hub descriptor is retrieved.
- @retval Others Failed to retrieve the hub descriptor.
-
-**/
-EFI_STATUS
-UsbHubCtrlGetHubDesc (
- IN USB_DEVICE *HubDev,
- OUT VOID *Buf,
- IN UINTN Len
- )
-{
- EFI_STATUS Status;
-
- Status = UsbCtrlRequest (
- HubDev,
- EfiUsbDataIn,
- USB_REQ_TYPE_CLASS,
- USB_HUB_TARGET_HUB,
- USB_HUB_REQ_GET_DESC,
- (UINT16) (USB_DESC_TYPE_HUB << 8),
- 0,
- Buf,
- Len
- );
-
- return Status;
-}
-
-
-/**
- Usb hub control transfer to get the hub status.
-
- @param HubDev The hub device.
- @param State The variable to return the status.
-
- @retval EFI_SUCCESS The hub status is returned in State.
- @retval Others Failed to get the hub status.
-
-**/
-EFI_STATUS
-UsbHubCtrlGetHubStatus (
- IN USB_DEVICE *HubDev,
- OUT UINT32 *State
- )
-{
- EFI_STATUS Status;
-
- Status = UsbCtrlRequest (
- HubDev,
- EfiUsbDataIn,
- USB_REQ_TYPE_CLASS,
- USB_HUB_TARGET_HUB,
- USB_HUB_REQ_GET_STATUS,
- 0,
- 0,
- State,
- 4
- );
-
- return Status;
-}
-
-
-/**
- Usb hub control transfer to get the port status.
-
- @param HubDev The hub device.
- @param Port The port of the hub.
- @param State Variable to return the hub port state.
-
- @retval EFI_SUCCESS The port state is returned in State.
- @retval Others Failed to retrieve the port state.
-
-**/
-EFI_STATUS
-UsbHubCtrlGetPortStatus (
- IN USB_DEVICE *HubDev,
- IN UINT8 Port,
- OUT VOID *State
- )
-{
- EFI_STATUS Status;
-
- //
- // In USB bus, all the port index starts from 0. But HUB
- // indexes its port from 1. So, port number is added one.
- // No need to convert the hub bit to UEFI definition, they
- // are the same
- //
- Status = UsbCtrlRequest (
- HubDev,
- EfiUsbDataIn,
- USB_REQ_TYPE_CLASS,
- USB_HUB_TARGET_PORT,
- USB_HUB_REQ_GET_STATUS,
- 0,
- (UINT16) (Port + 1),
- State,
- 4
- );
-
- return Status;
-}
-
-
-/**
- Usb hub control transfer to reset the TT (Transaction Transaltor).
-
- @param HubDev The hub device.
- @param Port The port of the hub.
-
- @retval EFI_SUCCESS The TT of the hub is reset.
- @retval Others Failed to reset the port.
-
-**/
-EFI_STATUS
-UsbHubCtrlResetTT (
- IN USB_DEVICE *HubDev,
- IN UINT8 Port
- )
-{
- EFI_STATUS Status;
-
- Status = UsbCtrlRequest (
- HubDev,
- EfiUsbNoData,
- USB_REQ_TYPE_CLASS,
- USB_HUB_TARGET_HUB,
- USB_HUB_REQ_RESET_TT,
- 0,
- (UINT16) (Port + 1),
- NULL,
- 0
- );
-
- return Status;
-}
-
-
-/**
- Usb hub control transfer to set the hub feature.
-
- @param HubDev The hub device.
- @param Feature The feature to set.
-
- @retval EFI_SUCESS The feature is set for the hub.
- @retval Others Failed to set the feature.
-
-**/
-EFI_STATUS
-UsbHubCtrlSetHubFeature (
- IN USB_DEVICE *HubDev,
- IN UINT8 Feature
- )
-{
- EFI_STATUS Status;
-
- Status = UsbCtrlRequest (
- HubDev,
- EfiUsbNoData,
- USB_REQ_TYPE_CLASS,
- USB_HUB_TARGET_HUB,
- USB_HUB_REQ_SET_FEATURE,
- Feature,
- 0,
- NULL,
- 0
- );
-
- return Status;
-}
-
-
-/**
- Usb hub control transfer to set the port feature.
-
- @param HubDev The Usb hub device.
- @param Port The Usb port to set feature for.
- @param Feature The feature to set.
-
- @retval EFI_SUCCESS The feature is set for the port.
- @retval Others Failed to set the feature.
-
-**/
-EFI_STATUS
-UsbHubCtrlSetPortFeature (
- IN USB_DEVICE *HubDev,
- IN UINT8 Port,
- IN UINT8 Feature
- )
-{
- EFI_STATUS Status;
-
- //
- // In USB bus, all the port index starts from 0. But HUB
- // indexes its port from 1. So, port number is added one.
- //
- Status = UsbCtrlRequest (
- HubDev,
- EfiUsbNoData,
- USB_REQ_TYPE_CLASS,
- USB_HUB_TARGET_PORT,
- USB_HUB_REQ_SET_FEATURE,
- Feature,
- (UINT16) (Port + 1),
- NULL,
- 0
- );
-
- return Status;
-}
-
-
-/**
- Read the whole usb hub descriptor. It is necessary
- to do it in two steps because hub descriptor is of
- variable length.
-
- @param HubDev The hub device.
- @param HubDesc The variable to return the descriptor.
-
- @retval EFI_SUCCESS The hub descriptor is read.
- @retval Others Failed to read the hub descriptor.
-
-**/
-EFI_STATUS
-UsbHubReadDesc (
- IN USB_DEVICE *HubDev,
- OUT EFI_USB_HUB_DESCRIPTOR *HubDesc
- )
-{
- EFI_STATUS Status;
-
- if (HubDev->Speed == EFI_USB_SPEED_SUPER) {
- //
- // Get the super speed hub descriptor
- //
- Status = UsbHubCtrlGetSuperSpeedHubDesc (HubDev, HubDesc);
- } else {
-
- //
- // First get the hub descriptor length
- //
- Status = UsbHubCtrlGetHubDesc (HubDev, HubDesc, 2);
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- //
- // Get the whole hub descriptor
- //
- Status = UsbHubCtrlGetHubDesc (HubDev, HubDesc, HubDesc->Length);
- }
-
- return Status;
-}
-
-
-
-/**
- Ack the hub change bits. If these bits are not ACKed, Hub will
- always return changed bit map from its interrupt endpoint.
-
- @param HubDev The hub device.
-
- @retval EFI_SUCCESS The hub change status is ACKed.
- @retval Others Failed to ACK the hub status.
-
-**/
-EFI_STATUS
-UsbHubAckHubStatus (
- IN USB_DEVICE *HubDev
- )
-{
- EFI_USB_PORT_STATUS HubState;
- EFI_STATUS Status;
-
- Status = UsbHubCtrlGetHubStatus (HubDev, (UINT32 *) &HubState);
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- if (USB_BIT_IS_SET (HubState.PortChangeStatus, USB_HUB_STAT_C_LOCAL_POWER)) {
- UsbHubCtrlClearHubFeature (HubDev, USB_HUB_C_HUB_LOCAL_POWER);
- }
-
- if (USB_BIT_IS_SET (HubState.PortChangeStatus, USB_HUB_STAT_C_OVER_CURRENT)) {
- UsbHubCtrlClearHubFeature (HubDev, USB_HUB_C_HUB_OVER_CURRENT);
- }
-
- return EFI_SUCCESS;
-}
-
-
-/**
- Test whether the interface is a hub interface.
-
- @param UsbIf The interface to test.
-
- @retval TRUE The interface is a hub interface.
- @retval FALSE The interface isn't a hub interface.
-
-**/
-BOOLEAN
-UsbIsHubInterface (
- IN USB_INTERFACE *UsbIf
- )
-{
- EFI_USB_INTERFACE_DESCRIPTOR *Setting;
-
- //
- // If the hub is a high-speed hub with multiple TT,
- // the hub will has a default setting of single TT.
- //
- Setting = &UsbIf->IfSetting->Desc;
-
- if ((Setting->InterfaceClass == USB_HUB_CLASS_CODE) &&
- (Setting->InterfaceSubClass == USB_HUB_SUBCLASS_CODE)) {
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-
-/**
- The callback function to the USB hub status change
- interrupt endpoint. It is called periodically by
- the underlying host controller.
-
- @param Data The data read.
- @param DataLength The length of the data read.
- @param Context The context.
- @param Result The result of the last interrupt transfer.
-
- @retval EFI_SUCCESS The process is OK.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate resource.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbOnHubInterrupt (
- IN VOID *Data,
- IN UINTN DataLength,
- IN VOID *Context,
- IN UINT32 Result
- )
-{
- USB_INTERFACE *HubIf;
- EFI_USB_IO_PROTOCOL *UsbIo;
- EFI_USB_ENDPOINT_DESCRIPTOR *EpDesc;
- EFI_STATUS Status;
-
- HubIf = (USB_INTERFACE *) Context;
- UsbIo = &(HubIf->UsbIo);
- EpDesc = &(HubIf->HubEp->Desc);
-
- if (Result != EFI_USB_NOERROR) {
- //
- // If endpoint is stalled, clear the stall. Use UsbIo to access
- // the control transfer so internal status are maintained.
- //
- if (USB_BIT_IS_SET (Result, EFI_USB_ERR_STALL)) {
- UsbIoClearFeature (
- UsbIo,
- USB_TARGET_ENDPOINT,
- USB_FEATURE_ENDPOINT_HALT,
- EpDesc->EndpointAddress
- );
- }
-
- //
- // Delete and submit a new async interrupt
- //
- Status = UsbIo->UsbAsyncInterruptTransfer (
- UsbIo,
- EpDesc->EndpointAddress,
- FALSE,
- 0,
- 0,
- NULL,
- NULL
- );
-
- if (EFI_ERROR (Status)) {
- DEBUG (( EFI_D_ERROR, "UsbOnHubInterrupt: failed to remove async transfer - %r\n", Status));
- return Status;
- }
-
- Status = UsbIo->UsbAsyncInterruptTransfer (
- UsbIo,
- EpDesc->EndpointAddress,
- TRUE,
- USB_HUB_POLL_INTERVAL,
- HubIf->NumOfPort / 8 + 1,
- UsbOnHubInterrupt,
- HubIf
- );
-
- if (EFI_ERROR (Status)) {
- DEBUG (( EFI_D_ERROR, "UsbOnHubInterrupt: failed to submit new async transfer - %r\n", Status));
- }
-
- return Status;
- }
-
- if ((DataLength == 0) || (Data == NULL)) {
- return EFI_SUCCESS;
- }
-
- //
- // OK, actually something is changed, save the change map
- // then signal the HUB to do enumeration. This is a good
- // practise since UsbOnHubInterrupt is called in the context
- // of host contrller's AsyncInterrupt monitor.
- //
- HubIf->ChangeMap = AllocateZeroPool (DataLength);
-
- if (HubIf->ChangeMap == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- CopyMem (HubIf->ChangeMap, Data, DataLength);
- gBS->SignalEvent (HubIf->HubNotify);
-
- return EFI_SUCCESS;
-}
-
-
-
-
-/**
- Initialize the device for a non-root hub.
-
- @param HubIf The USB hub interface.
-
- @retval EFI_SUCCESS The hub is initialized.
- @retval EFI_DEVICE_ERROR Failed to initialize the hub.
-
-**/
-EFI_STATUS
-UsbHubInit (
- IN USB_INTERFACE *HubIf
- )
-{
- EFI_USB_HUB_DESCRIPTOR HubDesc;
- USB_ENDPOINT_DESC *EpDesc;
- USB_INTERFACE_SETTING *Setting;
- EFI_USB_IO_PROTOCOL *UsbIo;
- USB_DEVICE *HubDev;
- EFI_STATUS Status;
- UINT8 Index;
- UINT8 NumEndpoints;
- UINT16 Depth;
-
- //
- // Locate the interrupt endpoint for port change map
- //
- HubIf->IsHub = FALSE;
- Setting = HubIf->IfSetting;
- HubDev = HubIf->Device;
- EpDesc = NULL;
- NumEndpoints = Setting->Desc.NumEndpoints;
-
- for (Index = 0; Index < NumEndpoints; Index++) {
- ASSERT ((Setting->Endpoints != NULL) && (Setting->Endpoints[Index] != NULL));
-
- EpDesc = Setting->Endpoints[Index];
-
- if (USB_BIT_IS_SET (EpDesc->Desc.EndpointAddress, USB_ENDPOINT_DIR_IN) &&
- (USB_ENDPOINT_TYPE (&EpDesc->Desc) == USB_ENDPOINT_INTERRUPT)) {
- break;
- }
- }
-
- if (Index == NumEndpoints) {
- DEBUG (( EFI_D_ERROR, "UsbHubInit: no interrupt endpoint found for hub %d\n", HubDev->Address));
- return EFI_DEVICE_ERROR;
- }
-
- Status = UsbHubReadDesc (HubDev, &HubDesc);
-
- if (EFI_ERROR (Status)) {
- DEBUG (( EFI_D_ERROR, "UsbHubInit: failed to read HUB descriptor %r\n", Status));
- return Status;
- }
-
- HubIf->NumOfPort = HubDesc.NumPorts;
-
- DEBUG (( EFI_D_INFO, "UsbHubInit: hub %d has %d ports\n", HubDev->Address,HubIf->NumOfPort));
-
- //
- // OK, set IsHub to TRUE. Now usb bus can handle this device
- // as a working HUB. If failed eariler, bus driver will not
- // recognize it as a hub. Other parts of the bus should be able
- // to work.
- //
- HubIf->IsHub = TRUE;
- HubIf->HubApi = &mUsbHubApi;
- HubIf->HubEp = EpDesc;
-
- if (HubIf->Device->Speed == EFI_USB_SPEED_SUPER) {
- Depth = (UINT16)(HubIf->Device->Tier - 1);
- DEBUG ((EFI_D_INFO, "UsbHubInit: Set Hub Depth as 0x%x\n", Depth));
- UsbHubCtrlSetHubDepth (HubIf->Device, Depth);
-
- for (Index = 0; Index < HubDesc.NumPorts; Index++) {
- UsbHubCtrlSetPortFeature (HubIf->Device, Index, USB_HUB_PORT_REMOTE_WAKE_MASK);
- }
- } else {
- //
- // Feed power to all the hub ports. It should be ok
- // for both gang/individual powered hubs.
- //
- for (Index = 0; Index < HubDesc.NumPorts; Index++) {
- UsbHubCtrlSetPortFeature (HubIf->Device, Index, (EFI_USB_PORT_FEATURE) USB_HUB_PORT_POWER);
- }
-
- //
- // Update for the usb hub has no power on delay requirement
- //
- if (HubDesc.PwrOn2PwrGood > 0) {
- gBS->Stall (HubDesc.PwrOn2PwrGood * USB_SET_PORT_POWER_STALL);
- }
- UsbHubAckHubStatus (HubIf->Device);
- }
-
- //
- // Create an event to enumerate the hub's port. On
- //
- Status = gBS->CreateEvent (
- EVT_NOTIFY_SIGNAL,
- TPL_CALLBACK,
- UsbHubEnumeration,
- HubIf,
- &HubIf->HubNotify
- );
-
- if (EFI_ERROR (Status)) {
- DEBUG (( EFI_D_ERROR, "UsbHubInit: failed to create signal for hub %d - %r\n",
- HubDev->Address, Status));
-
- return Status;
- }
-
- //
- // Create AsyncInterrupt to query hub port change endpoint
- // periodically. If the hub ports are changed, hub will return
- // changed port map from the interrupt endpoint. The port map
- // must be able to hold (HubIf->NumOfPort + 1) bits (one bit for
- // host change status).
- //
- UsbIo = &HubIf->UsbIo;
- Status = UsbIo->UsbAsyncInterruptTransfer (
- UsbIo,
- EpDesc->Desc.EndpointAddress,
- TRUE,
- USB_HUB_POLL_INTERVAL,
- HubIf->NumOfPort / 8 + 1,
- UsbOnHubInterrupt,
- HubIf
- );
-
- if (EFI_ERROR (Status)) {
- DEBUG (( EFI_D_ERROR, "UsbHubInit: failed to queue interrupt transfer for hub %d - %r\n",
- HubDev->Address, Status));
-
- gBS->CloseEvent (HubIf->HubNotify);
- HubIf->HubNotify = NULL;
-
- return Status;
- }
-
- DEBUG (( EFI_D_INFO, "UsbHubInit: hub %d initialized\n", HubDev->Address));
- return Status;
-}
-
-
-
-/**
- Get the port status. This function is required to
- ACK the port change bits although it will return
- the port changes in PortState. Bus enumeration code
- doesn't need to ACK the port change bits.
-
- @param HubIf The hub interface.
- @param Port The port of the hub to get state.
- @param PortState Variable to return the port state.
-
- @retval EFI_SUCCESS The port status is successfully returned.
- @retval Others Failed to return the status.
-
-**/
-EFI_STATUS
-UsbHubGetPortStatus (
- IN USB_INTERFACE *HubIf,
- IN UINT8 Port,
- OUT EFI_USB_PORT_STATUS *PortState
- )
-{
- EFI_STATUS Status;
-
- Status = UsbHubCtrlGetPortStatus (HubIf->Device, Port, PortState);
-
- return Status;
-}
-
-
-
-/**
- Clear the port change status.
-
- @param HubIf The hub interface.
- @param Port The hub port.
-
-**/
-VOID
-UsbHubClearPortChange (
- IN USB_INTERFACE *HubIf,
- IN UINT8 Port
- )
-{
- EFI_USB_PORT_STATUS PortState;
- USB_CHANGE_FEATURE_MAP *Map;
- UINTN Index;
- EFI_STATUS Status;
-
- Status = UsbHubGetPortStatus (HubIf, Port, &PortState);
-
- if (EFI_ERROR (Status)) {
- return;
- }
-
- //
- // OK, get the usb port status, now ACK the change bits.
- // Don't return error when failed to clear the change bits.
- // It may lead to extra port state report. USB bus should
- // be able to handle this.
- //
- for (Index = 0; Index < sizeof (mHubFeatureMap) / sizeof (mHubFeatureMap[0]); Index++) {
- Map = &mHubFeatureMap[Index];
-
- if (USB_BIT_IS_SET (PortState.PortChangeStatus, Map->ChangedBit)) {
- UsbHubCtrlClearPortFeature (HubIf->Device, Port, (UINT16) Map->Feature);
- }
- }
-}
-
-
-
-/**
- Function to set the port feature for non-root hub.
-
- @param HubIf The hub interface.
- @param Port The port of the hub.
- @param Feature The feature of the port to set.
-
- @retval EFI_SUCCESS The hub port feature is set.
- @retval Others Failed to set the port feature.
-
-**/
-EFI_STATUS
-UsbHubSetPortFeature (
- IN USB_INTERFACE *HubIf,
- IN UINT8 Port,
- IN EFI_USB_PORT_FEATURE Feature
- )
-{
- EFI_STATUS Status;
-
- Status = UsbHubCtrlSetPortFeature (HubIf->Device, Port, (UINT8) Feature);
-
- return Status;
-}
-
-
-/**
- Interface function to clear the port feature for non-root hub.
-
- @param HubIf The hub interface.
- @param Port The port of the hub to clear feature for.
- @param Feature The feature to clear.
-
- @retval EFI_SUCCESS The port feature is cleared.
- @retval Others Failed to clear the port feature.
-
-**/
-EFI_STATUS
-UsbHubClearPortFeature (
- IN USB_INTERFACE *HubIf,
- IN UINT8 Port,
- IN EFI_USB_PORT_FEATURE Feature
- )
-{
- EFI_STATUS Status;
-
- Status = UsbHubCtrlClearPortFeature (HubIf->Device, Port, (UINT8) Feature);
-
- return Status;
-}
-
-
-/**
- Interface function to reset the port.
-
- @param HubIf The hub interface.
- @param Port The port to reset.
-
- @retval EFI_SUCCESS The hub port is reset.
- @retval EFI_TIMEOUT Failed to reset the port in time.
- @retval Others Failed to reset the port.
-
-**/
-EFI_STATUS
-UsbHubResetPort (
- IN USB_INTERFACE *HubIf,
- IN UINT8 Port
- )
-{
- EFI_USB_PORT_STATUS PortState;
- UINTN Index;
- EFI_STATUS Status;
-
- Status = UsbHubGetPortStatus (HubIf, Port, &PortState);
-
- if (EFI_ERROR (Status)) {
- return Status;
- } else if (USB_BIT_IS_SET (PortState.PortChangeStatus, USB_PORT_STAT_C_RESET)) {
- DEBUG (( EFI_D_INFO, "UsbHubResetPort: skip reset on hub %p port %d\n", HubIf, Port));
- return EFI_SUCCESS;
- }
-
- Status = UsbHubSetPortFeature (HubIf, Port, (EFI_USB_PORT_FEATURE) USB_HUB_PORT_RESET);
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- //
- // Drive the reset signal for worst 20ms. Check USB 2.0 Spec
- // section 7.1.7.5 for timing requirements.
- //
- gBS->Stall (USB_SET_PORT_RESET_STALL);
-
- //
- // Check USB_PORT_STAT_C_RESET bit to see if the resetting state is done.
- //
- ZeroMem (&PortState, sizeof (EFI_USB_PORT_STATUS));
-
- for (Index = 0; Index < USB_WAIT_PORT_STS_CHANGE_LOOP; Index++) {
- Status = UsbHubGetPortStatus (HubIf, Port, &PortState);
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- if (!EFI_ERROR (Status) &&
- USB_BIT_IS_SET (PortState.PortChangeStatus, USB_PORT_STAT_C_RESET)) {
- gBS->Stall (USB_SET_PORT_RECOVERY_STALL);
- return EFI_SUCCESS;
- }
-
- gBS->Stall (USB_WAIT_PORT_STS_CHANGE_STALL);
- }
-
- return EFI_TIMEOUT;
-}
-
-
-/**
- Release the hub's control of the interface.
-
- @param HubIf The hub interface.
-
- @retval EFI_SUCCESS The interface is release of hub control.
-
-**/
-EFI_STATUS
-UsbHubRelease (
- IN USB_INTERFACE *HubIf
- )
-{
- EFI_USB_IO_PROTOCOL *UsbIo;
- EFI_STATUS Status;
-
- UsbIo = &HubIf->UsbIo;
- Status = UsbIo->UsbAsyncInterruptTransfer (
- UsbIo,
- HubIf->HubEp->Desc.EndpointAddress,
- FALSE,
- USB_HUB_POLL_INTERVAL,
- 0,
- NULL,
- 0
- );
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- gBS->CloseEvent (HubIf->HubNotify);
-
- HubIf->IsHub = FALSE;
- HubIf->HubApi = NULL;
- HubIf->HubEp = NULL;
- HubIf->HubNotify = NULL;
-
- DEBUG (( EFI_D_INFO, "UsbHubRelease: hub device %d released\n", HubIf->Device->Address));
- return EFI_SUCCESS;
-}
-
-
-
-/**
- Initialize the interface for root hub.
-
- @param HubIf The root hub interface.
-
- @retval EFI_SUCCESS The interface is initialized for root hub.
- @retval Others Failed to initialize the hub.
-
-**/
-EFI_STATUS
-UsbRootHubInit (
- IN USB_INTERFACE *HubIf
- )
-{
- EFI_STATUS Status;
- UINT8 MaxSpeed;
- UINT8 NumOfPort;
- UINT8 Support64;
-
- Status = UsbHcGetCapability (HubIf->Device->Bus, &MaxSpeed, &NumOfPort, &Support64);
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- DEBUG (( EFI_D_INFO, "UsbRootHubInit: root hub %p - max speed %d, %d ports\n",
- HubIf, MaxSpeed, NumOfPort));
-
- HubIf->IsHub = TRUE;
- HubIf->HubApi = &mUsbRootHubApi;
- HubIf->HubEp = NULL;
- HubIf->MaxSpeed = MaxSpeed;
- HubIf->NumOfPort = NumOfPort;
- HubIf->HubNotify = NULL;
-
- //
- // Create a timer to poll root hub ports periodically
- //
- Status = gBS->CreateEvent (
- EVT_TIMER | EVT_NOTIFY_SIGNAL,
- TPL_CALLBACK,
- UsbRootHubEnumeration,
- HubIf,
- &HubIf->HubNotify
- );
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- //
- // It should signal the event immediately here, or device detection
- // by bus enumeration might be delayed by the timer interval.
- //
- gBS->SignalEvent (HubIf->HubNotify);
-
- Status = gBS->SetTimer (
- HubIf->HubNotify,
- TimerPeriodic,
- USB_ROOTHUB_POLL_INTERVAL
- );
-
- if (EFI_ERROR (Status)) {
- gBS->CloseEvent (HubIf->HubNotify);
- }
-
- return Status;
-}
-
-
-/**
- Get the port status. This function is required to
- ACK the port change bits although it will return
- the port changes in PortState. Bus enumeration code
- doesn't need to ACK the port change bits.
-
- @param HubIf The root hub interface.
- @param Port The root hub port to get the state.
- @param PortState Variable to return the port state.
-
- @retval EFI_SUCCESS The port state is returned.
- @retval Others Failed to retrieve the port state.
-
-**/
-EFI_STATUS
-UsbRootHubGetPortStatus (
- IN USB_INTERFACE *HubIf,
- IN UINT8 Port,
- OUT EFI_USB_PORT_STATUS *PortState
- )
-{
- USB_BUS *Bus;
- EFI_STATUS Status;
-
- Bus = HubIf->Device->Bus;
- Status = UsbHcGetRootHubPortStatus (Bus, Port, PortState);
-
- return Status;
-}
-
-
-/**
- Clear the port change status.
-
- @param HubIf The root hub interface.
- @param Port The root hub port.
-
-**/
-VOID
-UsbRootHubClearPortChange (
- IN USB_INTERFACE *HubIf,
- IN UINT8 Port
- )
-{
- EFI_USB_PORT_STATUS PortState;
- USB_CHANGE_FEATURE_MAP *Map;
- UINTN Index;
- EFI_STATUS Status;
-
- Status = UsbRootHubGetPortStatus (HubIf, Port, &PortState);
-
- if (EFI_ERROR (Status)) {
- return;
- }
-
- //
- // OK, get the usb port status, now ACK the change bits.
- // Don't return error when failed to clear the change bits.
- // It may lead to extra port state report. USB bus should
- // be able to handle this.
- //
- for (Index = 0; Index < sizeof (mRootHubFeatureMap) / sizeof (mRootHubFeatureMap[0]); Index++) {
- Map = &mRootHubFeatureMap[Index];
-
- if (USB_BIT_IS_SET (PortState.PortChangeStatus, Map->ChangedBit)) {
- UsbHcClearRootHubPortFeature (HubIf->Device->Bus, Port, (EFI_USB_PORT_FEATURE) Map->Feature);
- }
- }
-}
-
-
-/**
- Set the root hub port feature.
-
- @param HubIf The Usb hub interface.
- @param Port The hub port.
- @param Feature The feature to set.
-
- @retval EFI_SUCCESS The root hub port is set with the feature.
- @retval Others Failed to set the feature.
-
-**/
-EFI_STATUS
-UsbRootHubSetPortFeature (
- IN USB_INTERFACE *HubIf,
- IN UINT8 Port,
- IN EFI_USB_PORT_FEATURE Feature
- )
-{
- EFI_STATUS Status;
-
- Status = UsbHcSetRootHubPortFeature (HubIf->Device->Bus, Port, Feature);
-
- return Status;
-}
-
-
-/**
- Clear the root hub port feature.
-
- @param HubIf The root hub interface.
- @param Port The root hub port.
- @param Feature The feature to clear.
-
- @retval EFI_SUCCESS The root hub port is cleared of the feature.
- @retval Others Failed to clear the feature.
-
-**/
-EFI_STATUS
-UsbRootHubClearPortFeature (
- IN USB_INTERFACE *HubIf,
- IN UINT8 Port,
- IN EFI_USB_PORT_FEATURE Feature
- )
-{
- EFI_STATUS Status;
-
- Status = UsbHcClearRootHubPortFeature (HubIf->Device->Bus, Port, Feature);
-
- return Status;
-}
-
-
-/**
- Interface function to reset the root hub port.
-
- @param RootIf The root hub interface.
- @param Port The port to reset.
-
- @retval EFI_SUCCESS The hub port is reset.
- @retval EFI_TIMEOUT Failed to reset the port in time.
- @retval EFI_NOT_FOUND The low/full speed device connected to high speed.
- root hub is released to the companion UHCI.
- @retval Others Failed to reset the port.
-
-**/
-EFI_STATUS
-UsbRootHubResetPort (
- IN USB_INTERFACE *RootIf,
- IN UINT8 Port
- )
-{
- USB_BUS *Bus;
- EFI_STATUS Status;
- EFI_USB_PORT_STATUS PortState;
- UINTN Index;
-
- //
- // Notice: although EHCI requires that ENABLED bit be cleared
- // when reset the port, we don't need to care that here. It
- // should be handled in the EHCI driver.
- //
- Bus = RootIf->Device->Bus;
-
- Status = UsbHcGetRootHubPortStatus (Bus, Port, &PortState);
-
- if (EFI_ERROR (Status)) {
- return Status;
- } else if (USB_BIT_IS_SET (PortState.PortChangeStatus, USB_PORT_STAT_C_RESET)) {
- DEBUG (( EFI_D_INFO, "UsbRootHubResetPort: skip reset on root port %d\n", Port));
- return EFI_SUCCESS;
- }
-
- Status = UsbHcSetRootHubPortFeature (Bus, Port, EfiUsbPortReset);
-
- if (EFI_ERROR (Status)) {
- DEBUG (( EFI_D_ERROR, "UsbRootHubResetPort: failed to start reset on port %d\n", Port));
- return Status;
- }
-
- //
- // Drive the reset signal for at least 50ms. Check USB 2.0 Spec
- // section 7.1.7.5 for timing requirements.
- //
- gBS->Stall (USB_SET_ROOT_PORT_RESET_STALL);
-
- Status = UsbHcClearRootHubPortFeature (Bus, Port, EfiUsbPortReset);
-
- if (EFI_ERROR (Status)) {
- DEBUG (( EFI_D_ERROR, "UsbRootHubResetPort: failed to clear reset on port %d\n", Port));
- return Status;
- }
-
- gBS->Stall (USB_CLR_ROOT_PORT_RESET_STALL);
-
- //
- // USB host controller won't clear the RESET bit until
- // reset is actually finished.
- //
- ZeroMem (&PortState, sizeof (EFI_USB_PORT_STATUS));
-
- for (Index = 0; Index < USB_WAIT_PORT_STS_CHANGE_LOOP; Index++) {
- Status = UsbHcGetRootHubPortStatus (Bus, Port, &PortState);
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- if (!USB_BIT_IS_SET (PortState.PortStatus, USB_PORT_STAT_RESET)) {
- break;
- }
-
- gBS->Stall (USB_WAIT_PORT_STS_CHANGE_STALL);
- }
-
- if (Index == USB_WAIT_PORT_STS_CHANGE_LOOP) {
- DEBUG ((EFI_D_ERROR, "UsbRootHubResetPort: reset not finished in time on port %d\n", Port));
- return EFI_TIMEOUT;
- }
-
- if (!USB_BIT_IS_SET (PortState.PortStatus, USB_PORT_STAT_ENABLE)) {
- //
- // OK, the port is reset. If root hub is of high speed and
- // the device is of low/full speed, release the ownership to
- // companion UHCI. If root hub is of full speed, it won't
- // automatically enable the port, we need to enable it manually.
- //
- if (RootIf->MaxSpeed == EFI_USB_SPEED_HIGH) {
- DEBUG (( EFI_D_ERROR, "UsbRootHubResetPort: release low/full speed device (%d) to UHCI\n", Port));
-
- UsbRootHubSetPortFeature (RootIf, Port, EfiUsbPortOwner);
- return EFI_NOT_FOUND;
-
- } else {
-
- Status = UsbRootHubSetPortFeature (RootIf, Port, EfiUsbPortEnable);
-
- if (EFI_ERROR (Status)) {
- DEBUG (( EFI_D_ERROR, "UsbRootHubResetPort: failed to enable port %d for UHCI\n", Port));
- return Status;
- }
-
- gBS->Stall (USB_SET_ROOT_PORT_ENABLE_STALL);
- }
- }
-
- return EFI_SUCCESS;
-}
-
-
-/**
- Release the root hub's control of the interface.
-
- @param HubIf The root hub interface.
-
- @retval EFI_SUCCESS The root hub's control of the interface is
- released.
-
-**/
-EFI_STATUS
-UsbRootHubRelease (
- IN USB_INTERFACE *HubIf
- )
-{
- DEBUG (( EFI_D_INFO, "UsbRootHubRelease: root hub released for hub %p\n", HubIf));
-
- gBS->SetTimer (HubIf->HubNotify, TimerCancel, USB_ROOTHUB_POLL_INTERVAL);
- gBS->CloseEvent (HubIf->HubNotify);
-
- return EFI_SUCCESS;
-}
-
-USB_HUB_API mUsbHubApi = {
- UsbHubInit,
- UsbHubGetPortStatus,
- UsbHubClearPortChange,
- UsbHubSetPortFeature,
- UsbHubClearPortFeature,
- UsbHubResetPort,
- UsbHubRelease
-};
-
-USB_HUB_API mUsbRootHubApi = {
- UsbRootHubInit,
- UsbRootHubGetPortStatus,
- UsbRootHubClearPortChange,
- UsbRootHubSetPortFeature,
- UsbRootHubClearPortFeature,
- UsbRootHubResetPort,
- UsbRootHubRelease
-};
diff --git a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbHub.h b/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbHub.h
deleted file mode 100644
index 4e5fcd85e0..0000000000
--- a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbHub.h
+++ /dev/null
@@ -1,199 +0,0 @@
-/** @file
-
- The definition for USB hub.
-
-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 _USB_HUB_H_
-#define _USB_HUB_H_
-
-#include <IndustryStandard/Usb.h>
-
-#define USB_ENDPOINT_ADDR(EpAddr) ((EpAddr) & 0x7F)
-#define USB_ENDPOINT_TYPE(Desc) ((Desc)->Attributes & USB_ENDPOINT_TYPE_MASK)
-
-
-#define USB_DESC_TYPE_HUB 0x29
-
-#define USB_DESC_TYPE_HUB_SUPER_SPEED 0x2a
-
-//
-// Hub class control transfer target
-//
-#define USB_HUB_TARGET_HUB 0
-#define USB_HUB_TARGET_PORT 3
-//
-// HUB class specific contrl transfer request type
-//
-#define USB_HUB_REQ_GET_STATUS 0
-#define USB_HUB_REQ_CLEAR_FEATURE 1
-#define USB_HUB_REQ_SET_FEATURE 3
-#define USB_HUB_REQ_GET_DESC 6
-#define USB_HUB_REQ_SET_DESC 7
-#define USB_HUB_REQ_CLEAR_TT 8
-#define USB_HUB_REQ_RESET_TT 9
-#define USB_HUB_REQ_GET_TT_STATE 10
-#define USB_HUB_REQ_STOP_TT 11
-
-#define USB_HUB_REQ_SET_DEPTH 12
-
-//
-// USB hub class feature selector
-//
-#define USB_HUB_C_HUB_LOCAL_POWER 0
-#define USB_HUB_C_HUB_OVER_CURRENT 1
-#define USB_HUB_PORT_CONNECTION 0
-#define USB_HUB_PORT_ENABLE 1
-#define USB_HUB_PORT_SUSPEND 2
-#define USB_HUB_PORT_OVER_CURRENT 3
-#define USB_HUB_PORT_RESET 4
-
-#define USB_HUB_PORT_LINK_STATE 5
-
-#define USB_HUB_PORT_POWER 8
-#define USB_HUB_PORT_LOW_SPEED 9
-#define USB_HUB_C_PORT_CONNECT 16
-#define USB_HUB_C_PORT_ENABLE 17
-#define USB_HUB_C_PORT_SUSPEND 18
-#define USB_HUB_C_PORT_OVER_CURRENT 19
-#define USB_HUB_C_PORT_RESET 20
-#define USB_HUB_PORT_TEST 21
-#define USB_HUB_PORT_INDICATOR 22
-
-#define USB_HUB_C_PORT_LINK_STATE 25
-#define USB_HUB_PORT_REMOTE_WAKE_MASK 27
-#define USB_HUB_BH_PORT_RESET 28
-#define USB_HUB_C_BH_PORT_RESET 29
-
-//
-// Constant value for Port Status & Port Change Status of SuperSpeed port
-//
-#define USB_SS_PORT_STAT_C_BH_RESET 0x0020
-#define USB_SS_PORT_STAT_C_PORT_LINK_STATE 0x0040
-//
-// USB hub power control method. In gang power control
-//
-#define USB_HUB_GANG_POWER_CTRL 0
-#define USB_HUB_PORT_POWER_CTRL 0x01
-//
-// USB hub status bits
-//
-#define USB_HUB_STAT_LOCAL_POWER 0x01
-#define USB_HUB_STAT_OVER_CURRENT 0x02
-#define USB_HUB_STAT_C_LOCAL_POWER 0x01
-#define USB_HUB_STAT_C_OVER_CURRENT 0x02
-
-#define USB_HUB_CLASS_CODE 0x09
-#define USB_HUB_SUBCLASS_CODE 0x00
-
-//
-// Host software return timeout if port status doesn't change
-// after 500ms(LOOP * STALL = 5000 * 0.1ms), set by experience
-//
-#define USB_WAIT_PORT_STS_CHANGE_LOOP 5000
-
-#pragma pack(1)
-//
-// Hub descriptor, the last two fields are of variable lenght.
-//
-typedef struct {
- UINT8 Length;
- UINT8 DescType;
- UINT8 NumPorts;
- UINT16 HubCharacter;
- UINT8 PwrOn2PwrGood;
- UINT8 HubContrCurrent;
- UINT8 Filler[16];
-} EFI_USB_HUB_DESCRIPTOR;
-
-typedef struct {
- UINT8 Length;
- UINT8 DescType;
- UINT8 NumPorts;
- UINT16 HubCharacter;
- UINT8 PwrOn2PwrGood;
- UINT8 HubContrCurrent;
- UINT8 HubHdrDecLat;
- UINT8 HubDelay;
- UINT8 DeviceRemovable;
-} EFI_USB_SUPER_SPEED_HUB_DESCRIPTOR;
-
-#pragma pack()
-
-
-typedef struct {
- UINT16 ChangedBit;
- EFI_USB_PORT_FEATURE Feature;
-} USB_CHANGE_FEATURE_MAP;
-
-
-/**
- Clear the transaction translate buffer if full/low
- speed control/bulk transfer failed and the transfer
- uses this hub as translator.Remember to clear the TT
- buffer of transaction translator, not that of the
- parent.
-
- @param UsbDev The Usb device.
- @param Port The port of the hub.
- @param DevAddr Address of the failed transaction.
- @param EpNum The endpoint number of the failed transaction.
- @param EpType The type of failed transaction.
-
- @retval EFI_SUCCESS The TT buffer is cleared.
- @retval Others Failed to clear the TT buffer.
-
-**/
-EFI_STATUS
-UsbHubCtrlClearTTBuffer (
- IN USB_DEVICE *UsbDev,
- IN UINT8 Port,
- IN UINT16 DevAddr,
- IN UINT16 EpNum,
- IN UINT16 EpType
- );
-
-
-/**
- Test whether the interface is a hub interface.
-
- @param UsbIf The interface to test.
-
- @retval TRUE The interface is a hub interface.
- @retval FALSE The interface isn't a hub interface.
-
-**/
-BOOLEAN
-UsbIsHubInterface (
- IN USB_INTERFACE *UsbIf
- );
-
-
-/**
- Ack the hub change bits. If these bits are not ACKed, Hub will
- always return changed bit map from its interrupt endpoint.
-
- @param UsbDev The Usb device.
-
- @retval EFI_SUCCESS The hub change status is ACKed.
- @retval Others Failed to ACK the hub status.
-
-**/
-EFI_STATUS
-UsbHubAckHubStatus (
- IN USB_DEVICE *UsbDev
- );
-
-extern USB_HUB_API mUsbHubApi;
-extern USB_HUB_API mUsbRootHubApi;
-#endif
-
diff --git a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbUtility.c b/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbUtility.c
deleted file mode 100644
index e67a88541b..0000000000
--- a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbUtility.c
+++ /dev/null
@@ -1,1377 +0,0 @@
-/** @file
-
- Wrapper function for usb host controller interface.
-
-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 "UsbBus.h"
-
-//
-// if RemainingDevicePath== NULL, then all Usb child devices in this bus are wanted.
-// Use a shor form Usb class Device Path, which could match any usb device, in WantedUsbIoDPList to indicate all Usb devices
-// are wanted Usb devices
-//
-USB_CLASS_FORMAT_DEVICE_PATH mAllUsbClassDevicePath = {
- {
- {
- MESSAGING_DEVICE_PATH,
- MSG_USB_CLASS_DP,
- {
- (UINT8) (sizeof (USB_CLASS_DEVICE_PATH)),
- (UINT8) ((sizeof (USB_CLASS_DEVICE_PATH)) >> 8)
- }
- },
- 0xffff, // VendorId
- 0xffff, // ProductId
- 0xff, // DeviceClass
- 0xff, // DeviceSubClass
- 0xff // DeviceProtocol
- },
-
- {
- END_DEVICE_PATH_TYPE,
- END_ENTIRE_DEVICE_PATH_SUBTYPE,
- {
- END_DEVICE_PATH_LENGTH,
- 0
- }
- }
-};
-
-
-/**
- Get the capability of the host controller.
-
- @param UsbBus The usb driver.
- @param MaxSpeed The maximum speed this host controller supports.
- @param NumOfPort The number of the root hub port.
- @param Is64BitCapable Whether this controller support 64 bit addressing.
-
- @retval EFI_SUCCESS The host controller capability is returned.
- @retval Others Failed to retrieve the host controller capability.
-
-**/
-EFI_STATUS
-UsbHcGetCapability (
- IN USB_BUS *UsbBus,
- OUT UINT8 *MaxSpeed,
- OUT UINT8 *NumOfPort,
- OUT UINT8 *Is64BitCapable
- )
-{
- EFI_STATUS Status;
-
- if (UsbBus->Usb2Hc != NULL) {
- Status = UsbBus->Usb2Hc->GetCapability (
- UsbBus->Usb2Hc,
- MaxSpeed,
- NumOfPort,
- Is64BitCapable
- );
-
- } else {
- Status = UsbBus->UsbHc->GetRootHubPortNumber (UsbBus->UsbHc, NumOfPort);
-
- *MaxSpeed = EFI_USB_SPEED_FULL;
- *Is64BitCapable = (UINT8) FALSE;
- }
-
- return Status;
-}
-
-
-/**
- Reset the host controller.
-
- @param UsbBus The usb bus driver.
- @param Attributes The reset type, only global reset is used by this driver.
-
- @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
-UsbHcReset (
- IN USB_BUS *UsbBus,
- IN UINT16 Attributes
- )
-{
- EFI_STATUS Status;
-
- if (UsbBus->Usb2Hc != NULL) {
- Status = UsbBus->Usb2Hc->Reset (UsbBus->Usb2Hc, Attributes);
- } else {
- Status = UsbBus->UsbHc->Reset (UsbBus->UsbHc, Attributes);
- }
-
- return Status;
-}
-
-
-/**
- Get the current operation state of the host controller.
-
- @param UsbBus The USB bus driver.
- @param State The host controller operation state.
-
- @retval EFI_SUCCESS The operation state is returned in State.
- @retval Others Failed to get the host controller state.
-
-**/
-EFI_STATUS
-UsbHcGetState (
- IN USB_BUS *UsbBus,
- OUT EFI_USB_HC_STATE *State
- )
-{
- EFI_STATUS Status;
-
- if (UsbBus->Usb2Hc != NULL) {
- Status = UsbBus->Usb2Hc->GetState (UsbBus->Usb2Hc, State);
- } else {
- Status = UsbBus->UsbHc->GetState (UsbBus->UsbHc, State);
- }
-
- return Status;
-}
-
-
-/**
- Set the host controller operation state.
-
- @param UsbBus The USB bus driver.
- @param State The state to set.
-
- @retval EFI_SUCCESS The host controller is now working at State.
- @retval Others Failed to set operation state.
-
-**/
-EFI_STATUS
-UsbHcSetState (
- IN USB_BUS *UsbBus,
- IN EFI_USB_HC_STATE State
- )
-{
- EFI_STATUS Status;
-
- if (UsbBus->Usb2Hc != NULL) {
- Status = UsbBus->Usb2Hc->SetState (UsbBus->Usb2Hc, State);
- } else {
- Status = UsbBus->UsbHc->SetState (UsbBus->UsbHc, State);
- }
-
- return Status;
-}
-
-
-/**
- Get the root hub port state.
-
- @param UsbBus The USB bus driver.
- @param PortIndex The index of port.
- @param PortStatus The variable to save port state.
-
- @retval EFI_SUCCESS The root port state is returned in.
- @retval Others Failed to get the root hub port state.
-
-**/
-EFI_STATUS
-UsbHcGetRootHubPortStatus (
- IN USB_BUS *UsbBus,
- IN UINT8 PortIndex,
- OUT EFI_USB_PORT_STATUS *PortStatus
- )
-{
- EFI_STATUS Status;
-
- if (UsbBus->Usb2Hc != NULL) {
- Status = UsbBus->Usb2Hc->GetRootHubPortStatus (UsbBus->Usb2Hc, PortIndex, PortStatus);
- } else {
- Status = UsbBus->UsbHc->GetRootHubPortStatus (UsbBus->UsbHc, PortIndex, PortStatus);
- }
-
- return Status;
-}
-
-
-/**
- Set the root hub port feature.
-
- @param UsbBus The USB bus driver.
- @param PortIndex The port index.
- @param Feature The port feature to set.
-
- @retval EFI_SUCCESS The port feature is set.
- @retval Others Failed to set port feature.
-
-**/
-EFI_STATUS
-UsbHcSetRootHubPortFeature (
- IN USB_BUS *UsbBus,
- IN UINT8 PortIndex,
- IN EFI_USB_PORT_FEATURE Feature
- )
-{
- EFI_STATUS Status;
-
-
- if (UsbBus->Usb2Hc != NULL) {
- Status = UsbBus->Usb2Hc->SetRootHubPortFeature (UsbBus->Usb2Hc, PortIndex, Feature);
- } else {
- Status = UsbBus->UsbHc->SetRootHubPortFeature (UsbBus->UsbHc, PortIndex, Feature);
- }
-
- return Status;
-}
-
-
-/**
- Clear the root hub port feature.
-
- @param UsbBus The USB bus driver.
- @param PortIndex The port index.
- @param Feature The port feature to clear.
-
- @retval EFI_SUCCESS The port feature is clear.
- @retval Others Failed to clear port feature.
-
-**/
-EFI_STATUS
-UsbHcClearRootHubPortFeature (
- IN USB_BUS *UsbBus,
- IN UINT8 PortIndex,
- IN EFI_USB_PORT_FEATURE Feature
- )
-{
- EFI_STATUS Status;
-
- if (UsbBus->Usb2Hc != NULL) {
- Status = UsbBus->Usb2Hc->ClearRootHubPortFeature (UsbBus->Usb2Hc, PortIndex, Feature);
- } else {
- Status = UsbBus->UsbHc->ClearRootHubPortFeature (UsbBus->UsbHc, PortIndex, Feature);
- }
-
- return Status;
-}
-
-
-/**
- Execute a control transfer to the device.
-
- @param UsbBus The USB bus driver.
- @param DevAddr The device address.
- @param DevSpeed The device speed.
- @param MaxPacket Maximum packet size of endpoint 0.
- @param Request The control transfer request.
- @param Direction The direction of data stage.
- @param Data The buffer holding data.
- @param DataLength The length of the data.
- @param TimeOut Timeout (in ms) to wait until timeout.
- @param Translator The transaction translator for low/full speed device.
- @param UsbResult The result of transfer.
-
- @retval EFI_SUCCESS The control transfer finished without error.
- @retval Others The control transfer failed, reason returned in UsbReslt.
-
-**/
-EFI_STATUS
-UsbHcControlTransfer (
- IN USB_BUS *UsbBus,
- IN UINT8 DevAddr,
- IN UINT8 DevSpeed,
- IN UINTN MaxPacket,
- IN EFI_USB_DEVICE_REQUEST *Request,
- IN EFI_USB_DATA_DIRECTION Direction,
- IN OUT VOID *Data,
- IN OUT UINTN *DataLength,
- IN UINTN TimeOut,
- IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Translator,
- OUT UINT32 *UsbResult
- )
-{
- EFI_STATUS Status;
- BOOLEAN IsSlowDevice;
-
- if (UsbBus->Usb2Hc != NULL) {
- Status = UsbBus->Usb2Hc->ControlTransfer (
- UsbBus->Usb2Hc,
- DevAddr,
- DevSpeed,
- MaxPacket,
- Request,
- Direction,
- Data,
- DataLength,
- TimeOut,
- Translator,
- UsbResult
- );
-
- } else {
- IsSlowDevice = (BOOLEAN)(EFI_USB_SPEED_LOW == DevSpeed);
- Status = UsbBus->UsbHc->ControlTransfer (
- UsbBus->UsbHc,
- DevAddr,
- IsSlowDevice,
- (UINT8) MaxPacket,
- Request,
- Direction,
- Data,
- DataLength,
- TimeOut,
- UsbResult
- );
- }
-
- return Status;
-}
-
-
-/**
- Execute a bulk transfer to the device's endpoint.
-
- @param UsbBus The USB bus driver.
- @param DevAddr The target device address.
- @param EpAddr The target endpoint address, with direction encoded in
- bit 7.
- @param DevSpeed The device's speed.
- @param MaxPacket The endpoint's max packet size.
- @param BufferNum The number of data buffer.
- @param Data Array of pointers to data buffer.
- @param DataLength The length of data buffer.
- @param DataToggle On input, the initial data toggle to use, also return
- the next toggle on output.
- @param TimeOut The time to wait until timeout.
- @param Translator The transaction translator for low/full speed device.
- @param UsbResult The result of USB execution.
-
- @retval EFI_SUCCESS The bulk transfer is finished without error.
- @retval Others Failed to execute bulk transfer, result in UsbResult.
-
-**/
-EFI_STATUS
-UsbHcBulkTransfer (
- IN USB_BUS *UsbBus,
- IN UINT8 DevAddr,
- IN UINT8 EpAddr,
- IN UINT8 DevSpeed,
- IN UINTN MaxPacket,
- IN UINT8 BufferNum,
- 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 *UsbResult
- )
-{
- EFI_STATUS Status;
-
- if (UsbBus->Usb2Hc != NULL) {
- Status = UsbBus->Usb2Hc->BulkTransfer (
- UsbBus->Usb2Hc,
- DevAddr,
- EpAddr,
- DevSpeed,
- MaxPacket,
- BufferNum,
- Data,
- DataLength,
- DataToggle,
- TimeOut,
- Translator,
- UsbResult
- );
- } else {
- Status = UsbBus->UsbHc->BulkTransfer (
- UsbBus->UsbHc,
- DevAddr,
- EpAddr,
- (UINT8) MaxPacket,
- *Data,
- DataLength,
- DataToggle,
- TimeOut,
- UsbResult
- );
- }
-
- return Status;
-}
-
-
-/**
- Queue or cancel an asynchronous interrupt transfer.
-
- @param UsbBus The USB bus driver.
- @param DevAddr The target device address.
- @param EpAddr The target endpoint address, with direction encoded in
- bit 7.
- @param DevSpeed The device's speed.
- @param MaxPacket The endpoint's max packet size.
- @param IsNewTransfer Whether this is a new request. If not, cancel the old
- request.
- @param DataToggle Data toggle to use on input, next toggle on output.
- @param PollingInterval The interval to poll the interrupt transfer (in ms).
- @param DataLength The length of periodical data receive.
- @param Translator The transaction translator for low/full speed device.
- @param Callback Function to call when data is received.
- @param Context The context to the callback.
-
- @retval EFI_SUCCESS The asynchronous transfer is queued.
- @retval Others Failed to queue the transfer.
-
-**/
-EFI_STATUS
-UsbHcAsyncInterruptTransfer (
- IN USB_BUS *UsbBus,
- IN UINT8 DevAddr,
- IN UINT8 EpAddr,
- IN UINT8 DevSpeed,
- IN UINTN MaxPacket,
- 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 Callback,
- IN VOID *Context OPTIONAL
- )
-{
- EFI_STATUS Status;
- BOOLEAN IsSlowDevice;
-
- if (UsbBus->Usb2Hc != NULL) {
- Status = UsbBus->Usb2Hc->AsyncInterruptTransfer (
- UsbBus->Usb2Hc,
- DevAddr,
- EpAddr,
- DevSpeed,
- MaxPacket,
- IsNewTransfer,
- DataToggle,
- PollingInterval,
- DataLength,
- Translator,
- Callback,
- Context
- );
- } else {
- IsSlowDevice = (BOOLEAN)(EFI_USB_SPEED_LOW == DevSpeed);
-
- Status = UsbBus->UsbHc->AsyncInterruptTransfer (
- UsbBus->UsbHc,
- DevAddr,
- EpAddr,
- IsSlowDevice,
- (UINT8) MaxPacket,
- IsNewTransfer,
- DataToggle,
- PollingInterval,
- DataLength,
- Callback,
- Context
- );
- }
-
- return Status;
-}
-
-
-/**
- Execute a synchronous interrupt transfer to the target endpoint.
-
- @param UsbBus The USB bus driver.
- @param DevAddr The target device address.
- @param EpAddr The target endpoint address, with direction encoded in
- bit 7.
- @param DevSpeed The device's speed.
- @param MaxPacket The endpoint's max packet size.
- @param Data Pointer to data buffer.
- @param DataLength The length of data buffer.
- @param DataToggle On input, the initial data toggle to use, also return
- the next toggle on output.
- @param TimeOut The time to wait until timeout.
- @param Translator The transaction translator for low/full speed device.
- @param UsbResult The result of USB execution.
-
- @retval EFI_SUCCESS The synchronous interrupt transfer is OK.
- @retval Others Failed to execute the synchronous interrupt transfer.
-
-**/
-EFI_STATUS
-UsbHcSyncInterruptTransfer (
- IN USB_BUS *UsbBus,
- IN UINT8 DevAddr,
- IN UINT8 EpAddr,
- IN UINT8 DevSpeed,
- IN UINTN MaxPacket,
- IN OUT VOID *Data,
- IN OUT UINTN *DataLength,
- IN OUT UINT8 *DataToggle,
- IN UINTN TimeOut,
- IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Translator,
- OUT UINT32 *UsbResult
- )
-{
- EFI_STATUS Status;
- BOOLEAN IsSlowDevice;
-
- if (UsbBus->Usb2Hc != NULL) {
- Status = UsbBus->Usb2Hc->SyncInterruptTransfer (
- UsbBus->Usb2Hc,
- DevAddr,
- EpAddr,
- DevSpeed,
- MaxPacket,
- Data,
- DataLength,
- DataToggle,
- TimeOut,
- Translator,
- UsbResult
- );
- } else {
- IsSlowDevice = (BOOLEAN) ((EFI_USB_SPEED_LOW == DevSpeed) ? TRUE : FALSE);
- Status = UsbBus->UsbHc->SyncInterruptTransfer (
- UsbBus->UsbHc,
- DevAddr,
- EpAddr,
- IsSlowDevice,
- (UINT8) MaxPacket,
- Data,
- DataLength,
- DataToggle,
- TimeOut,
- UsbResult
- );
- }
-
- return Status;
-}
-
-
-/**
- Execute a synchronous Isochronous USB transfer.
-
- @param UsbBus The USB bus driver.
- @param DevAddr The target device address.
- @param EpAddr The target endpoint address, with direction encoded in
- bit 7.
- @param DevSpeed The device's speed.
- @param MaxPacket The endpoint's max packet size.
- @param BufferNum The number of data buffer.
- @param Data Array of pointers to data buffer.
- @param DataLength The length of data buffer.
- @param Translator The transaction translator for low/full speed device.
- @param UsbResult The result of USB execution.
-
- @retval EFI_UNSUPPORTED The isochronous transfer isn't supported now.
-
-**/
-EFI_STATUS
-UsbHcIsochronousTransfer (
- IN USB_BUS *UsbBus,
- IN UINT8 DevAddr,
- IN UINT8 EpAddr,
- IN UINT8 DevSpeed,
- IN UINTN MaxPacket,
- IN UINT8 BufferNum,
- IN OUT VOID *Data[EFI_USB_MAX_ISO_BUFFER_NUM],
- IN UINTN DataLength,
- IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Translator,
- OUT UINT32 *UsbResult
- )
-{
- return EFI_UNSUPPORTED;
-}
-
-
-/**
- Queue an asynchronous isochronous transfer.
-
- @param UsbBus The USB bus driver.
- @param DevAddr The target device address.
- @param EpAddr The target endpoint address, with direction encoded in
- bit 7.
- @param DevSpeed The device's speed.
- @param MaxPacket The endpoint's max packet size.
- @param BufferNum The number of data buffer.
- @param Data Array of pointers to data buffer.
- @param DataLength The length of data buffer.
- @param Translator The transaction translator for low/full speed device.
- @param Callback The function to call when data is transferred.
- @param Context The context to the callback function.
-
- @retval EFI_UNSUPPORTED The asynchronous isochronous transfer isn't supported.
-
-**/
-EFI_STATUS
-UsbHcAsyncIsochronousTransfer (
- IN USB_BUS *UsbBus,
- IN UINT8 DevAddr,
- IN UINT8 EpAddr,
- IN UINT8 DevSpeed,
- IN UINTN MaxPacket,
- IN UINT8 BufferNum,
- 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 Callback,
- IN VOID *Context
- )
-{
- return EFI_UNSUPPORTED;
-}
-
-
-/**
- Open the USB host controller protocol BY_CHILD.
-
- @param Bus The USB bus driver.
- @param Child The child handle.
-
- @return The open protocol return.
-
-**/
-EFI_STATUS
-UsbOpenHostProtoByChild (
- IN USB_BUS *Bus,
- IN EFI_HANDLE Child
- )
-{
- EFI_USB_HC_PROTOCOL *UsbHc;
- EFI_USB2_HC_PROTOCOL *Usb2Hc;
- EFI_STATUS Status;
-
- if (Bus->Usb2Hc != NULL) {
- Status = gBS->OpenProtocol (
- Bus->HostHandle,
- &gEfiUsb2HcProtocolGuid,
- (VOID **) &Usb2Hc,
- mUsbBusDriverBinding.DriverBindingHandle,
- Child,
- EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
- );
-
- } else {
- Status = gBS->OpenProtocol (
- Bus->HostHandle,
- &gEfiUsbHcProtocolGuid,
- (VOID **) &UsbHc,
- mUsbBusDriverBinding.DriverBindingHandle,
- Child,
- EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
- );
- }
-
- return Status;
-}
-
-
-/**
- Close the USB host controller protocol BY_CHILD.
-
- @param Bus The USB bus driver.
- @param Child The child handle.
-
-**/
-VOID
-UsbCloseHostProtoByChild (
- IN USB_BUS *Bus,
- IN EFI_HANDLE Child
- )
-{
- if (Bus->Usb2Hc != NULL) {
- gBS->CloseProtocol (
- Bus->HostHandle,
- &gEfiUsb2HcProtocolGuid,
- mUsbBusDriverBinding.DriverBindingHandle,
- Child
- );
-
- } else {
- gBS->CloseProtocol (
- Bus->HostHandle,
- &gEfiUsbHcProtocolGuid,
- mUsbBusDriverBinding.DriverBindingHandle,
- Child
- );
- }
-}
-
-
-/**
- return the current TPL, copied from the EDKII glue lib.
-
- @param VOID.
-
- @return Current TPL.
-
-**/
-EFI_TPL
-UsbGetCurrentTpl (
- VOID
- )
-{
- EFI_TPL Tpl;
-
- Tpl = gBS->RaiseTPL (TPL_HIGH_LEVEL);
- gBS->RestoreTPL (Tpl);
-
- return Tpl;
-}
-
-/**
- Create a new device path which only contain the first Usb part of the DevicePath.
-
- @param DevicePath A full device path which contain the usb nodes.
-
- @return A new device path which only contain the Usb part of the DevicePath.
-
-**/
-EFI_DEVICE_PATH_PROTOCOL *
-EFIAPI
-GetUsbDPFromFullDP (
- IN EFI_DEVICE_PATH_PROTOCOL *DevicePath
- )
-{
- EFI_DEVICE_PATH_PROTOCOL *UsbDevicePathPtr;
- EFI_DEVICE_PATH_PROTOCOL *UsbDevicePathBeginPtr;
- EFI_DEVICE_PATH_PROTOCOL *UsbDevicePathEndPtr;
- UINTN Size;
-
- //
- // Get the Usb part first Begin node in full device path
- //
- UsbDevicePathBeginPtr = DevicePath;
- while ( (!IsDevicePathEnd (UsbDevicePathBeginPtr))&&
- ((UsbDevicePathBeginPtr->Type != MESSAGING_DEVICE_PATH) ||
- (UsbDevicePathBeginPtr->SubType != MSG_USB_DP &&
- UsbDevicePathBeginPtr->SubType != MSG_USB_CLASS_DP
- && UsbDevicePathBeginPtr->SubType != MSG_USB_WWID_DP
- ))) {
-
- UsbDevicePathBeginPtr = NextDevicePathNode(UsbDevicePathBeginPtr);
- }
-
- //
- // Get the Usb part first End node in full device path
- //
- UsbDevicePathEndPtr = UsbDevicePathBeginPtr;
- while ((!IsDevicePathEnd (UsbDevicePathEndPtr))&&
- (UsbDevicePathEndPtr->Type == MESSAGING_DEVICE_PATH) &&
- (UsbDevicePathEndPtr->SubType == MSG_USB_DP ||
- UsbDevicePathEndPtr->SubType == MSG_USB_CLASS_DP
- || UsbDevicePathEndPtr->SubType == MSG_USB_WWID_DP
- )) {
-
- UsbDevicePathEndPtr = NextDevicePathNode(UsbDevicePathEndPtr);
- }
-
- Size = GetDevicePathSize (UsbDevicePathBeginPtr);
- Size -= GetDevicePathSize (UsbDevicePathEndPtr);
- if (Size ==0){
- //
- // The passed in DevicePath does not contain the usb nodes
- //
- return NULL;
- }
-
- //
- // Create a new device path which only contain the above Usb part
- //
- UsbDevicePathPtr = AllocateZeroPool (Size + sizeof (EFI_DEVICE_PATH_PROTOCOL));
- ASSERT (UsbDevicePathPtr != NULL);
- CopyMem (UsbDevicePathPtr, UsbDevicePathBeginPtr, Size);
- //
- // Append end device path node
- //
- UsbDevicePathEndPtr = (EFI_DEVICE_PATH_PROTOCOL *) ((UINTN) UsbDevicePathPtr + Size);
- SetDevicePathEndNode (UsbDevicePathEndPtr);
- return UsbDevicePathPtr;
-}
-
-/**
- Check whether a usb device path is in a DEVICE_PATH_LIST_ITEM list.
-
- @param UsbDP a usb device path of DEVICE_PATH_LIST_ITEM.
- @param UsbIoDPList a DEVICE_PATH_LIST_ITEM list.
-
- @retval TRUE there is a DEVICE_PATH_LIST_ITEM in UsbIoDPList which contains the passed in UsbDP.
- @retval FALSE there is no DEVICE_PATH_LIST_ITEM in UsbIoDPList which contains the passed in UsbDP.
-
-**/
-BOOLEAN
-EFIAPI
-SearchUsbDPInList (
- IN EFI_DEVICE_PATH_PROTOCOL *UsbDP,
- IN LIST_ENTRY *UsbIoDPList
- )
-{
- LIST_ENTRY *ListIndex;
- DEVICE_PATH_LIST_ITEM *ListItem;
- BOOLEAN Found;
- UINTN UsbDpDevicePathSize;
-
- //
- // Check that UsbDP and UsbIoDPList are valid
- //
- if ((UsbIoDPList == NULL) || (UsbDP == NULL)) {
- return FALSE;
- }
-
- Found = FALSE;
- ListIndex = UsbIoDPList->ForwardLink;
- while (ListIndex != UsbIoDPList){
- ListItem = CR(ListIndex, DEVICE_PATH_LIST_ITEM, Link, DEVICE_PATH_LIST_ITEM_SIGNATURE);
- //
- // Compare DEVICE_PATH_LIST_ITEM.DevicePath[]
- //
- ASSERT (ListItem->DevicePath != NULL);
-
- UsbDpDevicePathSize = GetDevicePathSize (UsbDP);
- if (UsbDpDevicePathSize == GetDevicePathSize (ListItem->DevicePath)) {
- if ((CompareMem (UsbDP, ListItem->DevicePath, UsbDpDevicePathSize)) == 0) {
- Found = TRUE;
- break;
- }
- }
- ListIndex = ListIndex->ForwardLink;
- }
-
- return Found;
-}
-
-/**
- Add a usb device path into the DEVICE_PATH_LIST_ITEM list.
-
- @param UsbDP a usb device path of DEVICE_PATH_LIST_ITEM.
- @param UsbIoDPList a DEVICE_PATH_LIST_ITEM list.
-
- @retval EFI_INVALID_PARAMETER If parameters are invalid, return this value.
- @retval EFI_SUCCESS If Add operation is successful, return this value.
-
-**/
-EFI_STATUS
-EFIAPI
-AddUsbDPToList (
- IN EFI_DEVICE_PATH_PROTOCOL *UsbDP,
- IN LIST_ENTRY *UsbIoDPList
- )
-{
- DEVICE_PATH_LIST_ITEM *ListItem;
-
- //
- // Check that UsbDP and UsbIoDPList are valid
- //
- if ((UsbIoDPList == NULL) || (UsbDP == NULL)) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (SearchUsbDPInList (UsbDP, UsbIoDPList)){
- return EFI_SUCCESS;
- }
-
- //
- // Prepare the usbio device path DEVICE_PATH_LIST_ITEM structure.
- //
- ListItem = AllocateZeroPool (sizeof (DEVICE_PATH_LIST_ITEM));
- ASSERT (ListItem != NULL);
- ListItem->Signature = DEVICE_PATH_LIST_ITEM_SIGNATURE;
- ListItem->DevicePath = DuplicateDevicePath (UsbDP);
-
- InsertTailList (UsbIoDPList, &ListItem->Link);
-
- return EFI_SUCCESS;
-}
-
-/**
- Check whether usb device, whose interface is UsbIf, matches the usb class which indicated by
- UsbClassDevicePathPtr whose is a short form usb class device path.
-
- @param UsbClassDevicePathPtr a short form usb class device path.
- @param UsbIf a usb device interface.
-
- @retval TRUE the usb device match the usb class.
- @retval FALSE the usb device does not match the usb class.
-
-**/
-BOOLEAN
-EFIAPI
-MatchUsbClass (
- IN USB_CLASS_DEVICE_PATH *UsbClassDevicePathPtr,
- IN USB_INTERFACE *UsbIf
- )
-{
- USB_INTERFACE_DESC *IfDesc;
- EFI_USB_INTERFACE_DESCRIPTOR *ActIfDesc;
- EFI_USB_DEVICE_DESCRIPTOR *DevDesc;
-
-
- if ((UsbClassDevicePathPtr->Header.Type != MESSAGING_DEVICE_PATH) ||
- (UsbClassDevicePathPtr->Header.SubType != MSG_USB_CLASS_DP)){
- ASSERT (0);
- return FALSE;
- }
-
- IfDesc = UsbIf->IfDesc;
- ASSERT (IfDesc->ActiveIndex < USB_MAX_INTERFACE_SETTING);
- ActIfDesc = &(IfDesc->Settings[IfDesc->ActiveIndex]->Desc);
- DevDesc = &(UsbIf->Device->DevDesc->Desc);
-
- //
- // If connect class policy, determine whether to create device handle by the five fields
- // in class device path node.
- //
- // In addtion, hub interface is always matched for this policy.
- //
- if ((ActIfDesc->InterfaceClass == USB_HUB_CLASS_CODE) &&
- (ActIfDesc->InterfaceSubClass == USB_HUB_SUBCLASS_CODE)) {
- return TRUE;
- }
-
- //
- // If vendor id or product id is 0xffff, they will be ignored.
- //
- if ((UsbClassDevicePathPtr->VendorId == 0xffff || UsbClassDevicePathPtr->VendorId == DevDesc->IdVendor) &&
- (UsbClassDevicePathPtr->ProductId == 0xffff || UsbClassDevicePathPtr->ProductId == DevDesc->IdProduct)) {
-
- //
- // If Class in Device Descriptor is set to 0, the counterparts in interface should be checked.
- //
- if (DevDesc->DeviceClass == 0) {
- if ((UsbClassDevicePathPtr->DeviceClass == ActIfDesc->InterfaceClass ||
- UsbClassDevicePathPtr->DeviceClass == 0xff) &&
- (UsbClassDevicePathPtr->DeviceSubClass == ActIfDesc->InterfaceSubClass ||
- UsbClassDevicePathPtr->DeviceSubClass == 0xff) &&
- (UsbClassDevicePathPtr->DeviceProtocol == ActIfDesc->InterfaceProtocol ||
- UsbClassDevicePathPtr->DeviceProtocol == 0xff)) {
- return TRUE;
- }
-
- } else if ((UsbClassDevicePathPtr->DeviceClass == DevDesc->DeviceClass ||
- UsbClassDevicePathPtr->DeviceClass == 0xff) &&
- (UsbClassDevicePathPtr->DeviceSubClass == DevDesc->DeviceSubClass ||
- UsbClassDevicePathPtr->DeviceSubClass == 0xff) &&
- (UsbClassDevicePathPtr->DeviceProtocol == DevDesc->DeviceProtocol ||
- UsbClassDevicePathPtr->DeviceProtocol == 0xff)) {
-
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-/**
- Check whether usb device, whose interface is UsbIf, matches the usb WWID requirement which indicated by
- UsbWWIDDevicePathPtr whose is a short form usb WWID device path.
-
- @param UsbWWIDDevicePathPtr a short form usb WWID device path.
- @param UsbIf a usb device interface.
-
- @retval TRUE the usb device match the usb WWID requirement.
- @retval FALSE the usb device does not match the usb WWID requirement.
-
-**/
-BOOLEAN
-MatchUsbWwid (
- IN USB_WWID_DEVICE_PATH *UsbWWIDDevicePathPtr,
- IN USB_INTERFACE *UsbIf
- )
-{
- USB_INTERFACE_DESC *IfDesc;
- EFI_USB_INTERFACE_DESCRIPTOR *ActIfDesc;
- EFI_USB_DEVICE_DESCRIPTOR *DevDesc;
- EFI_USB_STRING_DESCRIPTOR *StrDesc;
- UINT16 Index;
- CHAR16 *CompareStr;
- UINTN CompareLen;
- UINTN Length;
-
- if ((UsbWWIDDevicePathPtr->Header.Type != MESSAGING_DEVICE_PATH) ||
- (UsbWWIDDevicePathPtr->Header.SubType != MSG_USB_WWID_DP )){
- ASSERT (0);
- return FALSE;
- }
-
- IfDesc = UsbIf->IfDesc;
- ASSERT (IfDesc->ActiveIndex < USB_MAX_INTERFACE_SETTING);
- ActIfDesc = &(IfDesc->Settings[IfDesc->ActiveIndex]->Desc);
- DevDesc = &(UsbIf->Device->DevDesc->Desc);
-
- //
- // In addition, Hub interface is always matched for this policy.
- //
- if ((ActIfDesc->InterfaceClass == USB_HUB_CLASS_CODE) &&
- (ActIfDesc->InterfaceSubClass == USB_HUB_SUBCLASS_CODE)) {
- return TRUE;
- }
-
- //
- // Check Vendor Id, Product Id and Interface Number.
- //
- if ((DevDesc->IdVendor != UsbWWIDDevicePathPtr->VendorId) ||
- (DevDesc->IdProduct != UsbWWIDDevicePathPtr->ProductId) ||
- (ActIfDesc->InterfaceNumber != UsbWWIDDevicePathPtr->InterfaceNumber)) {
- return FALSE;
- }
-
- //
- // Check SerialNumber.
- //
- if (DevDesc->StrSerialNumber == 0) {
- return FALSE;
- }
-
- //
- // Serial number in USB WWID device path is the last 64-or-less UTF-16 characters.
- //
- CompareStr = (CHAR16 *) (UINTN) (UsbWWIDDevicePathPtr + 1);
- CompareLen = (DevicePathNodeLength (UsbWWIDDevicePathPtr) - sizeof (USB_WWID_DEVICE_PATH)) / sizeof (CHAR16);
- if (CompareStr[CompareLen - 1] == L'\0') {
- CompareLen--;
- }
-
- //
- // Compare serial number in each supported language.
- //
- for (Index = 0; Index < UsbIf->Device->TotalLangId; Index++) {
- StrDesc = UsbGetOneString (UsbIf->Device, DevDesc->StrSerialNumber, UsbIf->Device->LangId[Index]);
- if (StrDesc == NULL) {
- continue;
- }
-
- Length = (StrDesc->Length - 2) / sizeof (CHAR16);
- if ((Length >= CompareLen) &&
- (CompareMem (StrDesc->String + Length - CompareLen, CompareStr, CompareLen * sizeof (CHAR16)) == 0)) {
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-/**
- Free a DEVICE_PATH_LIST_ITEM list.
-
- @param UsbIoDPList a DEVICE_PATH_LIST_ITEM list pointer.
-
- @retval EFI_INVALID_PARAMETER If parameters are invalid, return this value.
- @retval EFI_SUCCESS If free operation is successful, return this value.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbBusFreeUsbDPList (
- IN LIST_ENTRY *UsbIoDPList
- )
-{
- LIST_ENTRY *ListIndex;
- DEVICE_PATH_LIST_ITEM *ListItem;
-
- //
- // Check that ControllerHandle is a valid handle
- //
- if (UsbIoDPList == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- ListIndex = UsbIoDPList->ForwardLink;
- while (ListIndex != UsbIoDPList){
- ListItem = CR(ListIndex, DEVICE_PATH_LIST_ITEM, Link, DEVICE_PATH_LIST_ITEM_SIGNATURE);
- //
- // Free DEVICE_PATH_LIST_ITEM.DevicePath[]
- //
- if (ListItem->DevicePath != NULL){
- FreePool(ListItem->DevicePath);
- }
- //
- // Free DEVICE_PATH_LIST_ITEM itself
- //
- ListIndex = ListIndex->ForwardLink;
- RemoveEntryList (&ListItem->Link);
- FreePool (ListItem);
- }
-
- InitializeListHead (UsbIoDPList);
- return EFI_SUCCESS;
-}
-
-/**
- Store a wanted usb child device info (its Usb part of device path) which is indicated by
- RemainingDevicePath in a Usb bus which is indicated by UsbBusId.
-
- @param UsbBusId Point to EFI_USB_BUS_PROTOCOL interface.
- @param RemainingDevicePath The remaining device patch.
-
- @retval EFI_SUCCESS Add operation is successful.
- @retval EFI_INVALID_PARAMETER The parameters are invalid.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbBusAddWantedUsbIoDP (
- IN EFI_USB_BUS_PROTOCOL *UsbBusId,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
- )
-{
- USB_BUS *Bus;
- EFI_STATUS Status;
- EFI_DEVICE_PATH_PROTOCOL *DevicePathPtr;
-
- //
- // Check whether remaining device path is valid
- //
- if (RemainingDevicePath != NULL && !IsDevicePathEnd (RemainingDevicePath)) {
- if ((RemainingDevicePath->Type != MESSAGING_DEVICE_PATH) ||
- (RemainingDevicePath->SubType != MSG_USB_DP &&
- RemainingDevicePath->SubType != MSG_USB_CLASS_DP
- && RemainingDevicePath->SubType != MSG_USB_WWID_DP
- )) {
- return EFI_INVALID_PARAMETER;
- }
- }
-
- if (UsbBusId == NULL){
- return EFI_INVALID_PARAMETER;
- }
-
- Bus = USB_BUS_FROM_THIS (UsbBusId);
-
- if (RemainingDevicePath == NULL) {
- //
- // RemainingDevicePath == NULL means all Usb devices in this bus are wanted.
- // Here use a Usb class Device Path in WantedUsbIoDPList to indicate all Usb devices
- // are wanted Usb devices
- //
- Status = UsbBusFreeUsbDPList (&Bus->WantedUsbIoDPList);
- ASSERT (!EFI_ERROR (Status));
- DevicePathPtr = DuplicateDevicePath ((EFI_DEVICE_PATH_PROTOCOL *) &mAllUsbClassDevicePath);
- } else if (!IsDevicePathEnd (RemainingDevicePath)) {
- //
- // If RemainingDevicePath isn't the End of Device Path Node,
- // Create new Usb device path according to the usb part in remaining device path
- //
- DevicePathPtr = GetUsbDPFromFullDP (RemainingDevicePath);
- } else {
- //
- // If RemainingDevicePath is the End of Device Path Node,
- // skip enumerate any device and return EFI_SUCESSS
- //
- return EFI_SUCCESS;
- }
-
- ASSERT (DevicePathPtr != NULL);
- Status = AddUsbDPToList (DevicePathPtr, &Bus->WantedUsbIoDPList);
- ASSERT (!EFI_ERROR (Status));
- FreePool (DevicePathPtr);
- return EFI_SUCCESS;
-}
-
-/**
- Check whether a usb child device is the wanted device in a bus.
-
- @param Bus The Usb bus's private data pointer.
- @param UsbIf The usb child device inferface.
-
- @retval True If a usb child device is the wanted device in a bus.
- @retval False If a usb child device is *NOT* the wanted device in a bus.
-
-**/
-BOOLEAN
-EFIAPI
-UsbBusIsWantedUsbIO (
- IN USB_BUS *Bus,
- IN USB_INTERFACE *UsbIf
- )
-{
- EFI_DEVICE_PATH_PROTOCOL *DevicePathPtr;
- LIST_ENTRY *WantedUsbIoDPListPtr;
- LIST_ENTRY *WantedListIndex;
- DEVICE_PATH_LIST_ITEM *WantedListItem;
- BOOLEAN DoConvert;
- UINTN FirstDevicePathSize;
-
- //
- // Check whether passed in parameters are valid
- //
- if ((UsbIf == NULL) || (Bus == NULL)) {
- return FALSE;
- }
- //
- // Check whether UsbIf is Hub
- //
- if (UsbIf->IsHub) {
- return TRUE;
- }
-
- //
- // Check whether all Usb devices in this bus are wanted
- //
- if (SearchUsbDPInList ((EFI_DEVICE_PATH_PROTOCOL *)&mAllUsbClassDevicePath, &Bus->WantedUsbIoDPList)){
- return TRUE;
- }
-
- //
- // Check whether the Usb device match any item in WantedUsbIoDPList
- //
- WantedUsbIoDPListPtr = &Bus->WantedUsbIoDPList;
- //
- // Create new Usb device path according to the usb part in UsbIo full device path
- //
- DevicePathPtr = GetUsbDPFromFullDP (UsbIf->DevicePath);
- ASSERT (DevicePathPtr != NULL);
-
- DoConvert = FALSE;
- WantedListIndex = WantedUsbIoDPListPtr->ForwardLink;
- while (WantedListIndex != WantedUsbIoDPListPtr){
- WantedListItem = CR(WantedListIndex, DEVICE_PATH_LIST_ITEM, Link, DEVICE_PATH_LIST_ITEM_SIGNATURE);
- ASSERT (WantedListItem->DevicePath->Type == MESSAGING_DEVICE_PATH);
- switch (WantedListItem->DevicePath->SubType) {
- case MSG_USB_DP:
- FirstDevicePathSize = GetDevicePathSize (WantedListItem->DevicePath);
- if (FirstDevicePathSize == GetDevicePathSize (DevicePathPtr)) {
- if (CompareMem (
- WantedListItem->DevicePath,
- DevicePathPtr,
- GetDevicePathSize (DevicePathPtr)) == 0
- ) {
- DoConvert = TRUE;
- }
- }
- break;
- case MSG_USB_CLASS_DP:
- if (MatchUsbClass((USB_CLASS_DEVICE_PATH *)WantedListItem->DevicePath, UsbIf)) {
- DoConvert = TRUE;
- }
- break;
- case MSG_USB_WWID_DP:
- if (MatchUsbWwid((USB_WWID_DEVICE_PATH *)WantedListItem->DevicePath, UsbIf)) {
- DoConvert = TRUE;
- }
- break;
- default:
- ASSERT (0);
- break;
- }
-
- if (DoConvert) {
- break;
- }
-
- WantedListIndex = WantedListIndex->ForwardLink;
- }
- gBS->FreePool (DevicePathPtr);
-
- //
- // Check whether the new Usb device path is wanted
- //
- if (DoConvert){
- return TRUE;
- } else {
- return FALSE;
- }
-}
-
-/**
- Recursively connnect every wanted usb child device to ensure they all fully connected.
- Check all the child Usb IO handles in this bus, recursively connecte if it is wanted usb child device.
-
- @param UsbBusId Point to EFI_USB_BUS_PROTOCOL interface.
-
- @retval EFI_SUCCESS Connect is done successfully.
- @retval EFI_INVALID_PARAMETER The parameter is invalid.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbBusRecursivelyConnectWantedUsbIo (
- IN EFI_USB_BUS_PROTOCOL *UsbBusId
- )
-{
- USB_BUS *Bus;
- EFI_STATUS Status;
- UINTN Index;
- EFI_USB_IO_PROTOCOL *UsbIo;
- USB_INTERFACE *UsbIf;
- UINTN UsbIoHandleCount;
- EFI_HANDLE *UsbIoBuffer;
- EFI_DEVICE_PATH_PROTOCOL *UsbIoDevicePath;
-
- if (UsbBusId == NULL){
- return EFI_INVALID_PARAMETER;
- }
-
- Bus = USB_BUS_FROM_THIS (UsbBusId);
-
- //
- // Get all Usb IO handles in system
- //
- UsbIoHandleCount = 0;
- Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiUsbIoProtocolGuid, NULL, &UsbIoHandleCount, &UsbIoBuffer);
- if (Status == EFI_NOT_FOUND || UsbIoHandleCount == 0) {
- return EFI_SUCCESS;
- }
- ASSERT (!EFI_ERROR (Status));
-
- for (Index = 0; Index < UsbIoHandleCount; Index++) {
- //
- // Check whether the USB IO handle is a child of this bus
- // Note: The usb child handle maybe invalid because of hot plugged out during the loop
- //
- UsbIoDevicePath = NULL;
- Status = gBS->HandleProtocol (UsbIoBuffer[Index], &gEfiDevicePathProtocolGuid, (VOID *) &UsbIoDevicePath);
- if (EFI_ERROR (Status) || UsbIoDevicePath == NULL) {
- continue;
- }
- if (CompareMem (
- UsbIoDevicePath,
- Bus->DevicePath,
- (GetDevicePathSize (Bus->DevicePath) - sizeof (EFI_DEVICE_PATH_PROTOCOL))
- ) != 0) {
- continue;
- }
-
- //
- // Get the child Usb IO interface
- //
- Status = gBS->HandleProtocol(
- UsbIoBuffer[Index],
- &gEfiUsbIoProtocolGuid,
- (VOID **) &UsbIo
- );
- if (EFI_ERROR (Status)) {
- continue;
- }
- UsbIf = USB_INTERFACE_FROM_USBIO (UsbIo);
-
- if (UsbBusIsWantedUsbIO (Bus, UsbIf)) {
- if (!UsbIf->IsManaged) {
- //
- // Recursively connect the wanted Usb Io handle
- //
- DEBUG ((EFI_D_INFO, "UsbConnectDriver: TPL before connect is %d\n", (UINT32)UsbGetCurrentTpl ()));
- Status = gBS->ConnectController (UsbIf->Handle, NULL, NULL, TRUE);
- UsbIf->IsManaged = (BOOLEAN)!EFI_ERROR (Status);
- DEBUG ((EFI_D_INFO, "UsbConnectDriver: TPL after connect is %d\n", (UINT32)UsbGetCurrentTpl()));
- }
- }
- }
-
- return EFI_SUCCESS;
-}
-
diff --git a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbUtility.h b/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbUtility.h
deleted file mode 100644
index 26709caa36..0000000000
--- a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbUtility.h
+++ /dev/null
@@ -1,398 +0,0 @@
-/** @file
-
- Manage Usb Port/Hc/Etc.
-
-Copyright (c) 2007, 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_USB_UTILITY_H_
-#define _EFI_USB_UTILITY_H_
-
-/**
- Get the capability of the host controller.
-
- @param UsbBus The usb driver.
- @param MaxSpeed The maximum speed this host controller supports.
- @param NumOfPort The number of the root hub port.
- @param Is64BitCapable Whether this controller support 64 bit addressing.
-
- @retval EFI_SUCCESS The host controller capability is returned.
- @retval Others Failed to retrieve the host controller capability.
-
-**/
-EFI_STATUS
-UsbHcGetCapability (
- IN USB_BUS *UsbBus,
- OUT UINT8 *MaxSpeed,
- OUT UINT8 *NumOfPort,
- OUT UINT8 *Is64BitCapable
- );
-
-/**
- Reset the host controller.
-
- @param UsbBus The usb bus driver.
- @param Attributes The reset type, only global reset is used by this driver.
-
- @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
-UsbHcReset (
- IN USB_BUS *UsbBus,
- IN UINT16 Attributes
- );
-
-/**
- Get the current operation state of the host controller.
-
- @param UsbBus The USB bus driver.
- @param State The host controller operation state.
-
- @retval EFI_SUCCESS The operation state is returned in State.
- @retval Others Failed to get the host controller state.
-
-**/
-EFI_STATUS
-UsbHcGetState (
- IN USB_BUS *UsbBus,
- OUT EFI_USB_HC_STATE *State
- );
-
-/**
- Set the host controller operation state.
-
- @param UsbBus The USB bus driver.
- @param State The state to set.
-
- @retval EFI_SUCCESS The host controller is now working at State.
- @retval Others Failed to set operation state.
-
-**/
-EFI_STATUS
-UsbHcSetState (
- IN USB_BUS *UsbBus,
- IN EFI_USB_HC_STATE State
- );
-
-/**
- Get the root hub port state.
-
- @param UsbBus The USB bus driver.
- @param PortIndex The index of port.
- @param PortStatus The variable to save port state.
-
- @retval EFI_SUCCESS The root port state is returned in.
- @retval Others Failed to get the root hub port state.
-
-**/
-EFI_STATUS
-UsbHcGetRootHubPortStatus (
- IN USB_BUS *UsbBus,
- IN UINT8 PortIndex,
- OUT EFI_USB_PORT_STATUS *PortStatus
- );
-
-/**
- Set the root hub port feature.
-
- @param UsbBus The USB bus driver.
- @param PortIndex The port index.
- @param Feature The port feature to set.
-
- @retval EFI_SUCCESS The port feature is set.
- @retval Others Failed to set port feature.
-
-**/
-EFI_STATUS
-UsbHcSetRootHubPortFeature (
- IN USB_BUS *UsbBus,
- IN UINT8 PortIndex,
- IN EFI_USB_PORT_FEATURE Feature
- );
-
-/**
- Clear the root hub port feature.
-
- @param UsbBus The USB bus driver.
- @param PortIndex The port index.
- @param Feature The port feature to clear.
-
- @retval EFI_SUCCESS The port feature is clear.
- @retval Others Failed to clear port feature.
-
-**/
-EFI_STATUS
-UsbHcClearRootHubPortFeature (
- IN USB_BUS *UsbBus,
- IN UINT8 PortIndex,
- IN EFI_USB_PORT_FEATURE Feature
- );
-
-/**
- Execute a control transfer to the device.
-
- @param UsbBus The USB bus driver.
- @param DevAddr The device address.
- @param DevSpeed The device speed.
- @param MaxPacket Maximum packet size of endpoint 0.
- @param Request The control transfer request.
- @param Direction The direction of data stage.
- @param Data The buffer holding data.
- @param DataLength The length of the data.
- @param TimeOut Timeout (in ms) to wait until timeout.
- @param Translator The transaction translator for low/full speed device.
- @param UsbResult The result of transfer.
-
- @retval EFI_SUCCESS The control transfer finished without error.
- @retval Others The control transfer failed, reason returned in UsbReslt.
-
-**/
-EFI_STATUS
-UsbHcControlTransfer (
- IN USB_BUS *UsbBus,
- IN UINT8 DevAddr,
- IN UINT8 DevSpeed,
- IN UINTN MaxPacket,
- IN EFI_USB_DEVICE_REQUEST *Request,
- IN EFI_USB_DATA_DIRECTION Direction,
- IN OUT VOID *Data,
- IN OUT UINTN *DataLength,
- IN UINTN TimeOut,
- IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Translator,
- OUT UINT32 *UsbResult
- );
-
-/**
- Execute a bulk transfer to the device's endpoint.
-
- @param UsbBus The USB bus driver.
- @param DevAddr The target device address.
- @param EpAddr The target endpoint address, with direction encoded in
- bit 7.
- @param DevSpeed The device's speed.
- @param MaxPacket The endpoint's max packet size.
- @param BufferNum The number of data buffer.
- @param Data Array of pointers to data buffer.
- @param DataLength The length of data buffer.
- @param DataToggle On input, the initial data toggle to use, also return
- the next toggle on output.
- @param TimeOut The time to wait until timeout.
- @param Translator The transaction translator for low/full speed device.
- @param UsbResult The result of USB execution.
-
- @retval EFI_SUCCESS The bulk transfer is finished without error.
- @retval Others Failed to execute bulk transfer, result in UsbResult.
-
-**/
-EFI_STATUS
-UsbHcBulkTransfer (
- IN USB_BUS *UsbBus,
- IN UINT8 DevAddr,
- IN UINT8 EpAddr,
- IN UINT8 DevSpeed,
- IN UINTN MaxPacket,
- IN UINT8 BufferNum,
- 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 *UsbResult
- );
-
-/**
- Queue or cancel an asynchronous interrupt transfer.
-
- @param UsbBus The USB bus driver.
- @param DevAddr The target device address.
- @param EpAddr The target endpoint address, with direction encoded in
- bit 7.
- @param DevSpeed The device's speed.
- @param MaxPacket The endpoint's max packet size.
- @param IsNewTransfer Whether this is a new request. If not, cancel the old
- request.
- @param DataToggle Data toggle to use on input, next toggle on output.
- @param PollingInterval The interval to poll the interrupt transfer (in ms).
- @param DataLength The length of periodical data receive.
- @param Translator The transaction translator for low/full speed device.
- @param Callback Function to call when data is received.
- @param Context The context to the callback.
-
- @retval EFI_SUCCESS The asynchronous transfer is queued.
- @retval Others Failed to queue the transfer.
-
-**/
-EFI_STATUS
-UsbHcAsyncInterruptTransfer (
- IN USB_BUS *UsbBus,
- IN UINT8 DevAddr,
- IN UINT8 EpAddr,
- IN UINT8 DevSpeed,
- IN UINTN MaxPacket,
- 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 Callback,
- IN VOID *Context OPTIONAL
- );
-
-/**
- Execute a synchronous interrupt transfer to the target endpoint.
-
- @param UsbBus The USB bus driver.
- @param DevAddr The target device address.
- @param EpAddr The target endpoint address, with direction encoded in
- bit 7.
- @param DevSpeed The device's speed.
- @param MaxPacket The endpoint's max packet size.
- @param Data Pointer to data buffer.
- @param DataLength The length of data buffer.
- @param DataToggle On input, the initial data toggle to use, also return
- the next toggle on output.
- @param TimeOut The time to wait until timeout.
- @param Translator The transaction translator for low/full speed device.
- @param UsbResult The result of USB execution.
-
- @retval EFI_SUCCESS The synchronous interrupt transfer is OK.
- @retval Others Failed to execute the synchronous interrupt transfer.
-
-**/
-EFI_STATUS
-UsbHcSyncInterruptTransfer (
- IN USB_BUS *UsbBus,
- IN UINT8 DevAddr,
- IN UINT8 EpAddr,
- IN UINT8 DevSpeed,
- IN UINTN MaxPacket,
- IN OUT VOID *Data,
- IN OUT UINTN *DataLength,
- IN OUT UINT8 *DataToggle,
- IN UINTN TimeOut,
- IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Translator,
- OUT UINT32 *UsbResult
- );
-
-/**
- Execute a synchronous Isochronous USB transfer.
-
- @param UsbBus The USB bus driver.
- @param DevAddr The target device address.
- @param EpAddr The target endpoint address, with direction encoded in
- bit 7.
- @param DevSpeed The device's speed.
- @param MaxPacket The endpoint's max packet size.
- @param BufferNum The number of data buffer.
- @param Data Array of pointers to data buffer.
- @param DataLength The length of data buffer.
- @param Translator The transaction translator for low/full speed device.
- @param UsbResult The result of USB execution.
-
- @retval EFI_UNSUPPORTED The isochronous transfer isn't supported now.
-
-**/
-EFI_STATUS
-UsbHcIsochronousTransfer (
- IN USB_BUS *UsbBus,
- IN UINT8 DevAddr,
- IN UINT8 EpAddr,
- IN UINT8 DevSpeed,
- IN UINTN MaxPacket,
- IN UINT8 BufferNum,
- IN OUT VOID *Data[EFI_USB_MAX_ISO_BUFFER_NUM],
- IN UINTN DataLength,
- IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Translator,
- OUT UINT32 *UsbResult
- );
-
-/**
- Queue an asynchronous isochronous transfer.
-
- @param UsbBus The USB bus driver.
- @param DevAddr The target device address.
- @param EpAddr The target endpoint address, with direction encoded in
- bit 7.
- @param DevSpeed The device's speed.
- @param MaxPacket The endpoint's max packet size.
- @param BufferNum The number of data buffer.
- @param Data Array of pointers to data buffer.
- @param DataLength The length of data buffer.
- @param Translator The transaction translator for low/full speed device.
- @param Callback The function to call when data is transferred.
- @param Context The context to the callback function.
-
- @retval EFI_UNSUPPORTED The asynchronous isochronous transfer isn't supported.
-
-**/
-EFI_STATUS
-UsbHcAsyncIsochronousTransfer (
- IN USB_BUS *UsbBus,
- IN UINT8 DevAddr,
- IN UINT8 EpAddr,
- IN UINT8 DevSpeed,
- IN UINTN MaxPacket,
- IN UINT8 BufferNum,
- 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 Callback,
- IN VOID *Context
- );
-
-/**
- Open the USB host controller protocol BY_CHILD.
-
- @param Bus The USB bus driver.
- @param Child The child handle.
-
- @return The open protocol return.
-
-**/
-EFI_STATUS
-UsbOpenHostProtoByChild (
- IN USB_BUS *Bus,
- IN EFI_HANDLE Child
- );
-
-/**
- Close the USB host controller protocol BY_CHILD.
-
- @param Bus The USB bus driver.
- @param Child The child handle.
-
- @return None.
-
-**/
-VOID
-UsbCloseHostProtoByChild (
- IN USB_BUS *Bus,
- IN EFI_HANDLE Child
- );
-
-/**
- return the current TPL, copied from the EDKII glue lib.
-
- @param VOID.
-
- @return Current TPL.
-
-**/
-EFI_TPL
-UsbGetCurrentTpl (
- VOID
- );
-
-#endif