2 Usb Hub Request Support In PEI Phase
4 Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions
8 of the BSD License which accompanies this distribution. The
9 full text of the license may be found at
10 http://opensource.org/licenses/bsd-license.php
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
19 #include "PeiUsbLib.h"
22 Get a given hub port status.
24 @param PeiServices General-purpose services that are available to every PEIM.
25 @param UsbIoPpi Indicates the PEI_USB_IO_PPI instance.
26 @param Port Usb hub port number (starting from 1).
27 @param PortStatus Current Hub port status and change status.
29 @retval EFI_SUCCESS Port status is obtained successfully.
30 @retval EFI_DEVICE_ERROR Cannot get the port status due to a hardware error.
31 @retval Others Other failure occurs.
36 IN EFI_PEI_SERVICES
**PeiServices
,
37 IN PEI_USB_IO_PPI
*UsbIoPpi
,
39 OUT UINT32
*PortStatus
42 EFI_USB_DEVICE_REQUEST DeviceRequest
;
44 ZeroMem (&DeviceRequest
, sizeof (EFI_USB_DEVICE_REQUEST
));
47 // Fill Device request packet
49 DeviceRequest
.RequestType
= USB_HUB_GET_PORT_STATUS_REQ_TYPE
;
50 DeviceRequest
.Request
= USB_HUB_GET_PORT_STATUS
;
51 DeviceRequest
.Index
= Port
;
52 DeviceRequest
.Length
= (UINT16
) sizeof (UINT32
);
55 return UsbIoPpi
->UsbControlTransfer (
60 PcdGet32 (PcdUsbTransferTimeoutValue
),
68 Set specified feature to a given hub port.
70 @param PeiServices General-purpose services that are available to every PEIM.
71 @param UsbIoPpi Indicates the PEI_USB_IO_PPI instance.
72 @param Port Usb hub port number (starting from 1).
73 @param Value New feature value.
75 @retval EFI_SUCCESS Port feature is set successfully.
76 @retval EFI_DEVICE_ERROR Cannot set the port feature due to a hardware error.
77 @retval Others Other failure occurs.
81 PeiHubSetPortFeature (
82 IN EFI_PEI_SERVICES
**PeiServices
,
83 IN PEI_USB_IO_PPI
*UsbIoPpi
,
88 EFI_USB_DEVICE_REQUEST DeviceRequest
;
90 ZeroMem (&DeviceRequest
, sizeof (EFI_USB_DEVICE_REQUEST
));
93 // Fill Device request packet
95 DeviceRequest
.RequestType
= USB_HUB_SET_PORT_FEATURE_REQ_TYPE
;
96 DeviceRequest
.Request
= USB_HUB_SET_PORT_FEATURE
;
97 DeviceRequest
.Value
= Value
;
98 DeviceRequest
.Index
= Port
;
100 return UsbIoPpi
->UsbControlTransfer (
105 PcdGet32 (PcdUsbTransferTimeoutValue
),
112 Clear specified feature on a given hub port.
114 @param PeiServices General-purpose services that are available to every PEIM.
115 @param UsbIoPpi Indicates the PEI_USB_IO_PPI instance.
116 @param Port Usb hub port number (starting from 1).
117 @param Value Feature value that will be cleared from the hub port.
119 @retval EFI_SUCCESS Port feature is cleared successfully.
120 @retval EFI_DEVICE_ERROR Cannot clear the port feature due to a hardware error.
121 @retval Others Other failure occurs.
125 PeiHubClearPortFeature (
126 IN EFI_PEI_SERVICES
**PeiServices
,
127 IN PEI_USB_IO_PPI
*UsbIoPpi
,
132 EFI_USB_DEVICE_REQUEST DeviceRequest
;
134 ZeroMem (&DeviceRequest
, sizeof (EFI_USB_DEVICE_REQUEST
));
137 // Fill Device request packet
139 DeviceRequest
.RequestType
= USB_HUB_CLEAR_FEATURE_PORT_REQ_TYPE
;
140 DeviceRequest
.Request
= USB_HUB_CLEAR_FEATURE_PORT
;
141 DeviceRequest
.Value
= Value
;
142 DeviceRequest
.Index
= Port
;
144 return UsbIoPpi
->UsbControlTransfer (
149 PcdGet32 (PcdUsbTransferTimeoutValue
),
156 Get a given hub status.
158 @param PeiServices General-purpose services that are available to every PEIM.
159 @param UsbIoPpi Indicates the PEI_USB_IO_PPI instance.
160 @param HubStatus Current Hub status and change status.
162 @retval EFI_SUCCESS Hub status is obtained successfully.
163 @retval EFI_DEVICE_ERROR Cannot get the hub status due to a hardware error.
164 @retval Others Other failure occurs.
169 IN EFI_PEI_SERVICES
**PeiServices
,
170 IN PEI_USB_IO_PPI
*UsbIoPpi
,
171 OUT UINT32
*HubStatus
174 EFI_USB_DEVICE_REQUEST DeviceRequest
;
176 ZeroMem (&DeviceRequest
, sizeof (EFI_USB_DEVICE_REQUEST
));
179 // Fill Device request packet
181 DeviceRequest
.RequestType
= USB_HUB_GET_HUB_STATUS_REQ_TYPE
;
182 DeviceRequest
.Request
= USB_HUB_GET_HUB_STATUS
;
183 DeviceRequest
.Length
= (UINT16
) sizeof (UINT32
);
185 return UsbIoPpi
->UsbControlTransfer (
190 PcdGet32 (PcdUsbTransferTimeoutValue
),
197 Set specified feature to a given hub.
199 @param PeiServices General-purpose services that are available to every PEIM.
200 @param UsbIoPpi Indicates the PEI_USB_IO_PPI instance.
201 @param Value New feature value.
203 @retval EFI_SUCCESS Port feature is set successfully.
204 @retval EFI_DEVICE_ERROR Cannot set the port feature due to a hardware error.
205 @retval Others Other failure occurs.
209 PeiHubSetHubFeature (
210 IN EFI_PEI_SERVICES
**PeiServices
,
211 IN PEI_USB_IO_PPI
*UsbIoPpi
,
215 EFI_USB_DEVICE_REQUEST DeviceRequest
;
217 ZeroMem (&DeviceRequest
, sizeof (EFI_USB_DEVICE_REQUEST
));
220 // Fill Device request packet
222 DeviceRequest
.RequestType
= USB_HUB_SET_HUB_FEATURE_REQ_TYPE
;
223 DeviceRequest
.Request
= USB_HUB_SET_HUB_FEATURE
;
224 DeviceRequest
.Value
= Value
;
226 return UsbIoPpi
->UsbControlTransfer (
231 PcdGet32 (PcdUsbTransferTimeoutValue
),
238 Clear specified feature on a given hub.
240 @param PeiServices General-purpose services that are available to every PEIM.
241 @param UsbIoPpi Indicates the PEI_USB_IO_PPI instance.
242 @param Value Feature value that will be cleared from the hub port.
244 @retval EFI_SUCCESS Hub feature is cleared successfully.
245 @retval EFI_DEVICE_ERROR Cannot clear the hub feature due to a hardware error.
246 @retval Others Other failure occurs.
250 PeiHubClearHubFeature (
251 IN EFI_PEI_SERVICES
**PeiServices
,
252 IN PEI_USB_IO_PPI
*UsbIoPpi
,
256 EFI_USB_DEVICE_REQUEST DeviceRequest
;
258 ZeroMem (&DeviceRequest
, sizeof (EFI_USB_DEVICE_REQUEST
));
261 // Fill Device request packet
263 DeviceRequest
.RequestType
= USB_HUB_CLEAR_FEATURE_REQ_TYPE
;
264 DeviceRequest
.Request
= USB_HUB_CLEAR_FEATURE
;
265 DeviceRequest
.Value
= Value
;
267 return UsbIoPpi
->UsbControlTransfer (
272 PcdGet32 (PcdUsbTransferTimeoutValue
),
279 Get a given hub descriptor.
281 @param PeiServices General-purpose services that are available to every PEIM.
282 @param UsbIoPpi Indicates the PEI_USB_IO_PPI instance.
283 @param DescriptorSize The length of Hub Descriptor buffer.
284 @param HubDescriptor Caller allocated buffer to store the hub descriptor if
285 successfully returned.
287 @retval EFI_SUCCESS Hub descriptor is obtained successfully.
288 @retval EFI_DEVICE_ERROR Cannot get the hub descriptor due to a hardware error.
289 @retval Others Other failure occurs.
293 PeiGetHubDescriptor (
294 IN EFI_PEI_SERVICES
**PeiServices
,
295 IN PEI_USB_IO_PPI
*UsbIoPpi
,
296 IN UINTN DescriptorSize
,
297 OUT EFI_USB_HUB_DESCRIPTOR
*HubDescriptor
300 EFI_USB_DEVICE_REQUEST DevReq
;
301 ZeroMem (&DevReq
, sizeof (EFI_USB_DEVICE_REQUEST
));
304 // Fill Device request packet
306 DevReq
.RequestType
= USB_RT_HUB
| 0x80;
307 DevReq
.Request
= USB_HUB_GET_DESCRIPTOR
;
308 DevReq
.Value
= USB_DT_HUB
<< 8;
309 DevReq
.Length
= (UINT16
)DescriptorSize
;
311 return UsbIoPpi
->UsbControlTransfer (
316 PcdGet32 (PcdUsbTransferTimeoutValue
),
318 (UINT16
)DescriptorSize
323 Configure a given hub.
325 @param PeiServices General-purpose services that are available to every PEIM.
326 @param PeiUsbDevice Indicating the hub controller device that will be configured
328 @retval EFI_SUCCESS Hub configuration is done successfully.
329 @retval EFI_DEVICE_ERROR Cannot configure the hub due to a hardware error.
334 IN EFI_PEI_SERVICES
**PeiServices
,
335 IN PEI_USB_DEVICE
*PeiUsbDevice
338 EFI_USB_HUB_DESCRIPTOR HubDescriptor
;
340 EFI_USB_HUB_STATUS HubStatus
;
343 PEI_USB_IO_PPI
*UsbIoPpi
;
345 ZeroMem (&HubDescriptor
, sizeof (HubDescriptor
));
346 UsbIoPpi
= &PeiUsbDevice
->UsbIoPpi
;
349 // First get the hub descriptor length
351 Status
= PeiGetHubDescriptor (
357 if (EFI_ERROR (Status
)) {
358 return EFI_DEVICE_ERROR
;
361 // First get the whole descriptor, then
362 // get the number of hub ports
364 Status
= PeiGetHubDescriptor (
367 HubDescriptor
.Length
,
370 if (EFI_ERROR (Status
)) {
371 return EFI_DEVICE_ERROR
;
374 PeiUsbDevice
->DownStreamPortNo
= HubDescriptor
.NbrPorts
;
376 Status
= PeiHubGetHubStatus (
379 (UINT32
*) &HubStatus
382 if (EFI_ERROR (Status
)) {
383 return EFI_DEVICE_ERROR
;
386 // Get all hub ports status
388 for (Index
= 0; Index
< PeiUsbDevice
->DownStreamPortNo
; Index
++) {
390 Status
= PeiHubGetPortStatus (
396 if (EFI_ERROR (Status
)) {
401 // Power all the hub ports
403 for (Index
= 0; Index
< PeiUsbDevice
->DownStreamPortNo
; Index
++) {
404 Status
= PeiHubSetPortFeature (
410 if (EFI_ERROR (Status
)) {
415 // Clear Hub Status Change
417 Status
= PeiHubGetHubStatus (
420 (UINT32
*) &HubStatus
422 if (EFI_ERROR (Status
)) {
423 return EFI_DEVICE_ERROR
;
426 // Hub power supply change happens
428 if ((HubStatus
.HubChangeStatus
& HUB_CHANGE_LOCAL_POWER
) != 0) {
429 PeiHubClearHubFeature (
436 // Hub change overcurrent happens
438 if ((HubStatus
.HubChangeStatus
& HUB_CHANGE_OVERCURRENT
) != 0) {
439 PeiHubClearHubFeature (
451 Send reset signal over the given root hub port.
453 @param PeiServices General-purpose services that are available to every PEIM.
454 @param UsbIoPpi Indicates the PEI_USB_IO_PPI instance.
455 @param PortNum Usb hub port number (starting from 1).
460 IN EFI_PEI_SERVICES
**PeiServices
,
461 IN PEI_USB_IO_PPI
*UsbIoPpi
,
466 EFI_USB_PORT_STATUS HubPortStatus
;
469 MicroSecondDelay (100 * 1000);
474 PeiHubSetPortFeature (
483 PeiHubGetPortStatus (
487 (UINT32
*) &HubPortStatus
490 MicroSecondDelay (2 * 1000);
492 } while ((HubPortStatus
.PortChangeStatus
& USB_PORT_STAT_C_RESET
) == 0 && Try
> 0);
495 // clear reset root port
497 PeiHubClearPortFeature (
504 MicroSecondDelay (1 * 1000);
506 PeiHubClearPortFeature (
510 EfiUsbPortConnectChange
516 PeiHubSetPortFeature (
524 // Clear any change status
527 PeiHubClearPortFeature (
531 EfiUsbPortEnableChange
534 MicroSecondDelay (10 * 1000);