/** @file Common Libarary for PEI USB. Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "UsbPeim.h" #include "PeiUsbLib.h" /** Clear a given usb feature. @param PeiServices General-purpose services that are available to every PEIM. @param UsbIoPpi Indicates the PEI_USB_IO_PPI instance. @param Recipient The recipient of ClearFeature Request, should be one of Device/Interface/Endpoint. @param Value Request Value. @param Target Request Index. @retval EFI_SUCCESS Usb feature is cleared successfully. @retval EFI_DEVICE_ERROR Cannot clear the usb feature due to a hardware error. @retval Others Other failure occurs. **/ EFI_STATUS PeiUsbClearDeviceFeature ( IN EFI_PEI_SERVICES **PeiServices, IN PEI_USB_IO_PPI *UsbIoPpi, IN EFI_USB_RECIPIENT Recipient, IN UINT16 Value, IN UINT16 Target ) { EFI_USB_DEVICE_REQUEST DevReq; ASSERT (UsbIoPpi != NULL); switch (Recipient) { case EfiUsbDevice: DevReq.RequestType = USB_DEV_CLEAR_FEATURE_REQ_TYPE_D; break; case EfiUsbInterface: DevReq.RequestType = USB_DEV_CLEAR_FEATURE_REQ_TYPE_I; break; case EfiUsbEndpoint: DevReq.RequestType = USB_DEV_CLEAR_FEATURE_REQ_TYPE_E; break; } DevReq.Request = USB_DEV_CLEAR_FEATURE; DevReq.Value = Value; DevReq.Index = Target; DevReq.Length = 0; return UsbIoPpi->UsbControlTransfer ( PeiServices, UsbIoPpi, &DevReq, EfiUsbNoData, PcdGet32 (PcdUsbTransferTimeoutValue), NULL, 0 ); } /** Clear Endpoint Halt. @param PeiServices General-purpose services that are available to every PEIM. @param UsbIoPpi Indicates the PEI_USB_IO_PPI instance. @param EndpointAddress The endpoint address. @retval EFI_SUCCESS Endpoint halt is cleared successfully. @retval EFI_DEVICE_ERROR Cannot clear the endpoint halt status due to a hardware error. @retval Others Other failure occurs. **/ EFI_STATUS PeiUsbClearEndpointHalt ( IN EFI_PEI_SERVICES **PeiServices, IN PEI_USB_IO_PPI *UsbIoPpi, IN UINT8 EndpointAddress ) { EFI_STATUS Status; EFI_USB_INTERFACE_DESCRIPTOR *InterfaceDesc; EFI_USB_ENDPOINT_DESCRIPTOR *EndpointDescriptor; UINT8 EndpointIndex; // // Check its interface // Status = UsbIoPpi->UsbGetInterfaceDescriptor ( PeiServices, UsbIoPpi, &InterfaceDesc ); if (EFI_ERROR(Status)) { return Status; } for (EndpointIndex = 0; EndpointIndex < InterfaceDesc->NumEndpoints; EndpointIndex++) { Status = UsbIoPpi->UsbGetEndpointDescriptor (PeiServices, UsbIoPpi, EndpointIndex, &EndpointDescriptor); if (EFI_ERROR(Status)) { return EFI_INVALID_PARAMETER; } if (EndpointDescriptor->EndpointAddress == EndpointAddress) { break; } } if (EndpointIndex == InterfaceDesc->NumEndpoints) { return EFI_INVALID_PARAMETER; } Status = PeiUsbClearDeviceFeature ( PeiServices, UsbIoPpi, EfiUsbEndpoint, EfiUsbEndpointHalt, EndpointAddress ); return Status; }