]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Bus/Usb/UsbBotPei/PeiUsbLib.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Bus / Usb / UsbBotPei / PeiUsbLib.c
CommitLineData
4b1bf81c 1/** @file\r
2Common Libarary for PEI USB.\r
3\r
d1102dba
LG
4Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
5\r
9d510e61 6SPDX-License-Identifier: BSD-2-Clause-Patent\r
4b1bf81c 7\r
8**/\r
9\r
10#include "UsbPeim.h"\r
11#include "PeiUsbLib.h"\r
12\r
4b1bf81c 13\r
14/**\r
15 Clear a given usb feature.\r
16\r
17 @param PeiServices General-purpose services that are available to every PEIM.\r
18 @param UsbIoPpi Indicates the PEI_USB_IO_PPI instance.\r
19 @param Recipient The recipient of ClearFeature Request, should be one of Device/Interface/Endpoint.\r
20 @param Value Request Value.\r
21 @param Target Request Index.\r
22\r
23 @retval EFI_SUCCESS Usb feature is cleared successfully.\r
24 @retval EFI_DEVICE_ERROR Cannot clear the usb feature due to a hardware error.\r
25 @retval Others Other failure occurs.\r
26\r
27**/\r
28EFI_STATUS\r
29PeiUsbClearDeviceFeature (\r
30 IN EFI_PEI_SERVICES **PeiServices,\r
31 IN PEI_USB_IO_PPI *UsbIoPpi,\r
32 IN EFI_USB_RECIPIENT Recipient,\r
33 IN UINT16 Value,\r
34 IN UINT16 Target\r
35 )\r
36{\r
37 EFI_USB_DEVICE_REQUEST DevReq;\r
38\r
39 ASSERT (UsbIoPpi != NULL);\r
40\r
41 switch (Recipient) {\r
42 case EfiUsbDevice:\r
43 DevReq.RequestType = USB_DEV_CLEAR_FEATURE_REQ_TYPE_D;\r
44 break;\r
45\r
46 case EfiUsbInterface:\r
47 DevReq.RequestType = USB_DEV_CLEAR_FEATURE_REQ_TYPE_I;\r
48 break;\r
49\r
50 case EfiUsbEndpoint:\r
51 DevReq.RequestType = USB_DEV_CLEAR_FEATURE_REQ_TYPE_E;\r
52 break;\r
53 }\r
54\r
55 DevReq.Request = USB_DEV_CLEAR_FEATURE;\r
56 DevReq.Value = Value;\r
57 DevReq.Index = Target;\r
58 DevReq.Length = 0;\r
59\r
60 return UsbIoPpi->UsbControlTransfer (\r
61 PeiServices,\r
62 UsbIoPpi,\r
63 &DevReq,\r
64 EfiUsbNoData,\r
65 PcdGet32 (PcdUsbTransferTimeoutValue),\r
66 NULL,\r
67 0\r
68 );\r
69}\r
70\r
4b1bf81c 71\r
72/**\r
73 Clear Endpoint Halt.\r
74\r
75 @param PeiServices General-purpose services that are available to every PEIM.\r
76 @param UsbIoPpi Indicates the PEI_USB_IO_PPI instance.\r
77 @param EndpointAddress The endpoint address.\r
78\r
79 @retval EFI_SUCCESS Endpoint halt is cleared successfully.\r
80 @retval EFI_DEVICE_ERROR Cannot clear the endpoint halt status due to a hardware error.\r
81 @retval Others Other failure occurs.\r
82\r
83**/\r
84EFI_STATUS\r
85PeiUsbClearEndpointHalt (\r
86 IN EFI_PEI_SERVICES **PeiServices,\r
87 IN PEI_USB_IO_PPI *UsbIoPpi,\r
88 IN UINT8 EndpointAddress\r
89 )\r
90{\r
506560e7
SZ
91 EFI_STATUS Status;\r
92 EFI_USB_INTERFACE_DESCRIPTOR *InterfaceDesc;\r
93 EFI_USB_ENDPOINT_DESCRIPTOR *EndpointDescriptor;\r
94 UINT8 EndpointIndex;\r
4b1bf81c 95\r
4b1bf81c 96\r
506560e7
SZ
97 //\r
98 // Check its interface\r
99 //\r
100 Status = UsbIoPpi->UsbGetInterfaceDescriptor (\r
101 PeiServices,\r
102 UsbIoPpi,\r
103 &InterfaceDesc\r
104 );\r
105 if (EFI_ERROR (Status)) {\r
106 return Status;\r
107 }\r
108 for (EndpointIndex = 0; EndpointIndex < InterfaceDesc->NumEndpoints; EndpointIndex++) {\r
4b1bf81c 109 Status = UsbIoPpi->UsbGetEndpointDescriptor (PeiServices, UsbIoPpi, EndpointIndex, &EndpointDescriptor);\r
110 if (EFI_ERROR (Status)) {\r
111 return EFI_INVALID_PARAMETER;\r
112 }\r
113\r
114 if (EndpointDescriptor->EndpointAddress == EndpointAddress) {\r
115 break;\r
116 }\r
4b1bf81c 117 }\r
118\r
506560e7 119 if (EndpointIndex == InterfaceDesc->NumEndpoints) {\r
4b1bf81c 120 return EFI_INVALID_PARAMETER;\r
121 }\r
122\r
123 Status = PeiUsbClearDeviceFeature (\r
124 PeiServices,\r
125 UsbIoPpi,\r
126 EfiUsbEndpoint,\r
127 EfiUsbEndpointHalt,\r
128 EndpointAddress\r
129 );\r
130\r
4b1bf81c 131 return Status;\r
132}\r
133\r
4b1bf81c 134\r