4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUsb Hub Request Support In PEI Phase
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCopyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThis program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncare licensed and made available under the terms and conditions
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncof the BSD License which accompanies this distribution. The
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfull text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynchttp://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "UsbPeim.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "HubPeim.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "PeiUsbLib.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get a given hub port status.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param PeiServices General-purpose services that are available to every PEIM.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param UsbIoPpi Indicates the PEI_USB_IO_PPI instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Port Usb hub port number (starting from 1).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param PortStatus Current Hub port status and change status.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Port status is obtained successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR Cannot get the port status due to a hardware error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Others Other failure occurs.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPeiHubGetPortStatus (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_PEI_SERVICES **PeiServices,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PEI_USB_IO_PPI *UsbIoPpi,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 Port,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT32 *PortStatus
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_USB_DEVICE_REQUEST DeviceRequest;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&DeviceRequest, sizeof (EFI_USB_DEVICE_REQUEST));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Fill Device request packet
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceRequest.RequestType = USB_HUB_GET_PORT_STATUS_REQ_TYPE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceRequest.Request = USB_HUB_GET_PORT_STATUS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceRequest.Index = Port;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceRequest.Length = (UINT16) sizeof (UINT32);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return UsbIoPpi->UsbControlTransfer (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PeiServices,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UsbIoPpi,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DeviceRequest,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiUsbDataIn,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PcdGet32 (PcdUsbTransferTimeoutValue),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PortStatus,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sizeof (UINT32)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Set specified feature to a given hub port.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param PeiServices General-purpose services that are available to every PEIM.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param UsbIoPpi Indicates the PEI_USB_IO_PPI instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Port Usb hub port number (starting from 1).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Value New feature value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Port feature is set successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR Cannot set the port feature due to a hardware error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Others Other failure occurs.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPeiHubSetPortFeature (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_PEI_SERVICES **PeiServices,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PEI_USB_IO_PPI *UsbIoPpi,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 Port,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_USB_DEVICE_REQUEST DeviceRequest;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&DeviceRequest, sizeof (EFI_USB_DEVICE_REQUEST));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Fill Device request packet
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceRequest.RequestType = USB_HUB_SET_PORT_FEATURE_REQ_TYPE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceRequest.Request = USB_HUB_SET_PORT_FEATURE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceRequest.Value = Value;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceRequest.Index = Port;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return UsbIoPpi->UsbControlTransfer (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PeiServices,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UsbIoPpi,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DeviceRequest,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiUsbNoData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PcdGet32 (PcdUsbTransferTimeoutValue),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Clear specified feature on a given hub port.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param PeiServices General-purpose services that are available to every PEIM.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param UsbIoPpi Indicates the PEI_USB_IO_PPI instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Port Usb hub port number (starting from 1).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Value Feature value that will be cleared from the hub port.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Port feature is cleared successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR Cannot clear the port feature due to a hardware error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Others Other failure occurs.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPeiHubClearPortFeature (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_PEI_SERVICES **PeiServices,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PEI_USB_IO_PPI *UsbIoPpi,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 Port,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_USB_DEVICE_REQUEST DeviceRequest;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&DeviceRequest, sizeof (EFI_USB_DEVICE_REQUEST));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Fill Device request packet
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceRequest.RequestType = USB_HUB_CLEAR_FEATURE_PORT_REQ_TYPE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceRequest.Request = USB_HUB_CLEAR_FEATURE_PORT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceRequest.Value = Value;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceRequest.Index = Port;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return UsbIoPpi->UsbControlTransfer (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PeiServices,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UsbIoPpi,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DeviceRequest,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiUsbNoData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PcdGet32 (PcdUsbTransferTimeoutValue),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get a given hub status.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param PeiServices General-purpose services that are available to every PEIM.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param UsbIoPpi Indicates the PEI_USB_IO_PPI instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param HubStatus Current Hub status and change status.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Hub status is obtained successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR Cannot get the hub status due to a hardware error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Others Other failure occurs.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPeiHubGetHubStatus (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_PEI_SERVICES **PeiServices,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PEI_USB_IO_PPI *UsbIoPpi,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT32 *HubStatus
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_USB_DEVICE_REQUEST DeviceRequest;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&DeviceRequest, sizeof (EFI_USB_DEVICE_REQUEST));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Fill Device request packet
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceRequest.RequestType = USB_HUB_GET_HUB_STATUS_REQ_TYPE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceRequest.Request = USB_HUB_GET_HUB_STATUS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceRequest.Length = (UINT16) sizeof (UINT32);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return UsbIoPpi->UsbControlTransfer (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PeiServices,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UsbIoPpi,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DeviceRequest,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiUsbDataIn,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PcdGet32 (PcdUsbTransferTimeoutValue),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HubStatus,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sizeof (UINT32)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Set specified feature to a given hub.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param PeiServices General-purpose services that are available to every PEIM.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param UsbIoPpi Indicates the PEI_USB_IO_PPI instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Value New feature value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Port feature is set successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR Cannot set the port feature due to a hardware error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Others Other failure occurs.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPeiHubSetHubFeature (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_PEI_SERVICES **PeiServices,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PEI_USB_IO_PPI *UsbIoPpi,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_USB_DEVICE_REQUEST DeviceRequest;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&DeviceRequest, sizeof (EFI_USB_DEVICE_REQUEST));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Fill Device request packet
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceRequest.RequestType = USB_HUB_SET_HUB_FEATURE_REQ_TYPE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceRequest.Request = USB_HUB_SET_HUB_FEATURE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceRequest.Value = Value;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return UsbIoPpi->UsbControlTransfer (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PeiServices,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UsbIoPpi,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DeviceRequest,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiUsbNoData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PcdGet32 (PcdUsbTransferTimeoutValue),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Clear specified feature on a given hub.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param PeiServices General-purpose services that are available to every PEIM.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param UsbIoPpi Indicates the PEI_USB_IO_PPI instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Value Feature value that will be cleared from the hub port.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Hub feature is cleared successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR Cannot clear the hub feature due to a hardware error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Others Other failure occurs.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPeiHubClearHubFeature (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_PEI_SERVICES **PeiServices,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PEI_USB_IO_PPI *UsbIoPpi,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_USB_DEVICE_REQUEST DeviceRequest;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&DeviceRequest, sizeof (EFI_USB_DEVICE_REQUEST));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Fill Device request packet
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceRequest.RequestType = USB_HUB_CLEAR_FEATURE_REQ_TYPE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceRequest.Request = USB_HUB_CLEAR_FEATURE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceRequest.Value = Value;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return UsbIoPpi->UsbControlTransfer (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PeiServices,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UsbIoPpi,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DeviceRequest,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiUsbNoData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PcdGet32 (PcdUsbTransferTimeoutValue),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get a given hub descriptor.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param PeiServices General-purpose services that are available to every PEIM.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param UsbIoPpi Indicates the PEI_USB_IO_PPI instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DescriptorSize The length of Hub Descriptor buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param HubDescriptor Caller allocated buffer to store the hub descriptor if
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync successfully returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Hub descriptor is obtained successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR Cannot get the hub descriptor due to a hardware error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Others Other failure occurs.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPeiGetHubDescriptor (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_PEI_SERVICES **PeiServices,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PEI_USB_IO_PPI *UsbIoPpi,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN DescriptorSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_USB_HUB_DESCRIPTOR *HubDescriptor
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_USB_DEVICE_REQUEST DevReq;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Fill Device request packet
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevReq.RequestType = USB_RT_HUB | 0x80;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevReq.Request = USB_HUB_GET_DESCRIPTOR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevReq.Value = USB_DT_HUB << 8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevReq.Length = (UINT16)DescriptorSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return UsbIoPpi->UsbControlTransfer (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PeiServices,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UsbIoPpi,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DevReq,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiUsbDataIn,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PcdGet32 (PcdUsbTransferTimeoutValue),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HubDescriptor,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINT16)DescriptorSize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Configure a given hub.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param PeiServices General-purpose services that are available to every PEIM.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param PeiUsbDevice Indicating the hub controller device that will be configured
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Hub configuration is done successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR Cannot configure the hub due to a hardware error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPeiDoHubConfig (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_PEI_SERVICES **PeiServices,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PEI_USB_DEVICE *PeiUsbDevice
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_USB_HUB_DESCRIPTOR HubDescriptor;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_USB_HUB_STATUS HubStatus;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 PortStatus;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PEI_USB_IO_PPI *UsbIoPpi;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&HubDescriptor, sizeof (HubDescriptor));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UsbIoPpi = &PeiUsbDevice->UsbIoPpi;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // First get the hub descriptor length
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PeiGetHubDescriptor (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PeiServices,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UsbIoPpi,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 2,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &HubDescriptor
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_DEVICE_ERROR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // First get the whole descriptor, then
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // get the number of hub ports
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PeiGetHubDescriptor (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PeiServices,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UsbIoPpi,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HubDescriptor.Length,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &HubDescriptor
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_DEVICE_ERROR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PeiUsbDevice->DownStreamPortNo = HubDescriptor.NbrPorts;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PeiHubGetHubStatus (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PeiServices,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UsbIoPpi,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINT32 *) &HubStatus
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_DEVICE_ERROR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get all hub ports status
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < PeiUsbDevice->DownStreamPortNo; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PeiHubGetPortStatus (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PeiServices,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UsbIoPpi,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINT8) (Index + 1),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &PortStatus
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Power all the hub ports
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < PeiUsbDevice->DownStreamPortNo; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PeiHubSetPortFeature (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PeiServices,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UsbIoPpi,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINT8) (Index + 1),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiUsbPortPower
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Clear Hub Status Change
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PeiHubGetHubStatus (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PeiServices,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UsbIoPpi,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINT32 *) &HubStatus
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_DEVICE_ERROR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Hub power supply change happens
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((HubStatus.HubChangeStatus & HUB_CHANGE_LOCAL_POWER) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PeiHubClearHubFeature (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PeiServices,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UsbIoPpi,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync C_HUB_LOCAL_POWER
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Hub change overcurrent happens
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((HubStatus.HubChangeStatus & HUB_CHANGE_OVERCURRENT) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PeiHubClearHubFeature (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PeiServices,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UsbIoPpi,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync C_HUB_OVER_CURRENT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Send reset signal over the given root hub port.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param PeiServices General-purpose services that are available to every PEIM.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param UsbIoPpi Indicates the PEI_USB_IO_PPI instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param PortNum Usb hub port number (starting from 1).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPeiResetHubPort (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_PEI_SERVICES **PeiServices,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PEI_USB_IO_PPI *UsbIoPpi,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 PortNum
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Try;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_USB_PORT_STATUS HubPortStatus;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MicroSecondDelay (100 * 1000);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // reset root port
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PeiHubSetPortFeature (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PeiServices,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UsbIoPpi,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PortNum,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiUsbPortReset
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Try = 10;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PeiHubGetPortStatus (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PeiServices,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UsbIoPpi,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PortNum,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINT32 *) &HubPortStatus
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MicroSecondDelay (2 * 1000);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Try -= 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while ((HubPortStatus.PortChangeStatus & USB_PORT_STAT_C_RESET) == 0 && Try > 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // clear reset root port
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PeiHubClearPortFeature (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PeiServices,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UsbIoPpi,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PortNum,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiUsbPortReset
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MicroSecondDelay (1 * 1000);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PeiHubClearPortFeature (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PeiServices,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UsbIoPpi,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PortNum,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiUsbPortConnectChange
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set port enable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PeiHubSetPortFeature (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PeiServices,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UsbIoPpi,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PortNum,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiUsbPortEnable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Clear any change status
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PeiHubClearPortFeature (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PeiServices,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UsbIoPpi,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PortNum,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiUsbPortEnableChange
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MicroSecondDelay (10 * 1000);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}