4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUsb Hub Request Support In PEI Phase
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCopyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
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
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 Get a given hub port status.
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 @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 ZeroMem (&DeviceRequest, sizeof (EFI_USB_DEVICE_REQUEST));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Fill Device request packet
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceRequest.RequestType = USB_HUB_GET_PORT_STATUS_REQ_TYPE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Set specified feature to a given hub port.
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 @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 ZeroMem (&DeviceRequest, sizeof (EFI_USB_DEVICE_REQUEST));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Fill Device request packet
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceRequest.RequestType = USB_HUB_SET_PORT_FEATURE_REQ_TYPE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Clear specified feature on a given hub port.
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 @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 ZeroMem (&DeviceRequest, sizeof (EFI_USB_DEVICE_REQUEST));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Fill Device request packet
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceRequest.RequestType = USB_HUB_CLEAR_FEATURE_PORT_REQ_TYPE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceRequest.Request = USB_HUB_CLEAR_FEATURE_PORT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get a given hub status.
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 @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 ZeroMem (&DeviceRequest, sizeof (EFI_USB_DEVICE_REQUEST));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Fill Device request packet
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceRequest.RequestType = USB_HUB_GET_HUB_STATUS_REQ_TYPE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Set specified feature to a given hub.
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 @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 ZeroMem (&DeviceRequest, sizeof (EFI_USB_DEVICE_REQUEST));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Fill Device request packet
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceRequest.RequestType = USB_HUB_SET_HUB_FEATURE_REQ_TYPE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Clear specified feature on a given hub.
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 @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 ZeroMem (&DeviceRequest, sizeof (EFI_USB_DEVICE_REQUEST));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Fill Device request packet
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceRequest.RequestType = USB_HUB_CLEAR_FEATURE_REQ_TYPE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get a given hub descriptor.
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 @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 ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Fill Device request packet
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Configure a given hub.
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 @retval EFI_SUCCESS Hub configuration is done successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR Cannot configure the hub due to a hardware error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // First get the hub descriptor length
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // First get the whole descriptor, then
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // get the number of hub ports
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PeiUsbDevice->DownStreamPortNo = HubDescriptor.NbrPorts;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get all hub ports status
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < PeiUsbDevice->DownStreamPortNo; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Power all the hub ports
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < PeiUsbDevice->DownStreamPortNo; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Clear Hub Status Change
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Hub power supply change happens
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((HubStatus.HubChangeStatus & HUB_CHANGE_LOCAL_POWER) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Hub change overcurrent happens
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((HubStatus.HubChangeStatus & HUB_CHANGE_OVERCURRENT) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Send reset signal over the given root hub port.
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 // reset root port
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while ((HubPortStatus.PortChangeStatus & USB_PORT_STAT_C_RESET) == 0 && Try > 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // clear reset root port
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set port enable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Clear any change status