+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
- Module Name:\r
-\r
- Hub.c\r
- \r
- Abstract:\r
-\r
- Usb Hub Request\r
-\r
- Revision History\r
-\r
---*/\r
-\r
-#include "usbbus.h"\r
-\r
-EFI_STATUS\r
-HubGetPortStatus (\r
- IN EFI_USB_IO_PROTOCOL *UsbIo,\r
- IN UINT8 Port,\r
- OUT UINT32 *PortStatus\r
- )\r
-/*++\r
- \r
- Routine Description:\r
- Get a given hub port status\r
- \r
- Arguments:\r
- UsbIo - EFI_USB_IO_PROTOCOL instance\r
- Port - Usb hub port number (starting from 1).\r
- PortStatus - Current Hub port status and change status.\r
- \r
- Returns:\r
- EFI_SUCCESS\r
- EFI_DEVICE\r
- EFI_TIME_OUT\r
- EFI_INVALID_PARAMETER\r
- \r
---*/\r
-{\r
- EFI_USB_DEVICE_REQUEST DevReq;\r
- EFI_STATUS EfiStatus;\r
- UINT32 UsbStatus;\r
- UINT32 Timeout;\r
-\r
- ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));\r
-\r
- //\r
- // Fill Device request packet\r
- //\r
- DevReq.RequestType = HUB_GET_PORT_STATUS_REQ_TYPE;\r
- DevReq.Request = HUB_GET_PORT_STATUS;\r
- DevReq.Value = 0;\r
- DevReq.Index = Port;\r
- DevReq.Length = sizeof (UINT32);\r
-\r
- Timeout = 3000;\r
-\r
- EfiStatus = UsbIo->UsbControlTransfer (\r
- UsbIo,\r
- &DevReq,\r
- EfiUsbDataIn,\r
- Timeout,\r
- PortStatus,\r
- sizeof (UINT32),\r
- &UsbStatus\r
- );\r
-\r
- return EfiStatus;\r
-}\r
-\r
-EFI_STATUS\r
-HubSetPortFeature (\r
- IN EFI_USB_IO_PROTOCOL *UsbIo,\r
- IN UINT8 Port,\r
- IN UINT8 Value\r
- )\r
-/*++\r
- \r
- Routine Description:\r
- Set specified feature to a give hub port\r
- \r
- Arguments:\r
- UsbIo - EFI_USB_IO_PROTOCOL instance\r
- Port - Usb hub port number (starting from 1).\r
- Value - New feature value.\r
- \r
- Returns:\r
- EFI_SUCCESS\r
- EFI_DEVICE\r
- EFI_TIME_OUT\r
- EFI_INVALID_PARAMETER\r
- \r
---*/\r
-{\r
- EFI_USB_DEVICE_REQUEST DevReq;\r
- EFI_STATUS EfiStatus;\r
- UINT32 UsbStatus;\r
- UINT32 Timeout;\r
-\r
- ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));\r
-\r
- //\r
- // Fill Device request packet\r
- //\r
- DevReq.RequestType = HUB_SET_PORT_FEATURE_REQ_TYPE;\r
- DevReq.Request = HUB_SET_PORT_FEATURE;\r
- DevReq.Value = Value;\r
- DevReq.Index = Port;\r
- DevReq.Length = 0;\r
-\r
- Timeout = 3000;\r
- EfiStatus = UsbIo->UsbControlTransfer (\r
- UsbIo,\r
- &DevReq,\r
- EfiUsbNoData,\r
- Timeout,\r
- NULL,\r
- 0,\r
- &UsbStatus\r
- );\r
-\r
- return EfiStatus;\r
-}\r
-\r
-EFI_STATUS\r
-HubClearPortFeature (\r
- IN EFI_USB_IO_PROTOCOL *UsbIo,\r
- IN UINT8 Port,\r
- IN UINT8 Value\r
- )\r
-/*++\r
- \r
- Routine Description:\r
- Clear a specified feature of a given hub port\r
- \r
- Arguments:\r
- UsbIo - EFI_USB_IO_PROTOCOL instance\r
- Port - Usb hub port number (starting from 1).\r
- Value - Feature value that will be cleared from\r
- that hub port.\r
- \r
- Returns:\r
- EFI_SUCCESS\r
- EFI_DEVICE\r
- EFI_TIME_OUT\r
- EFI_INVALID_PARAMETER\r
- \r
---*/\r
-{\r
- EFI_USB_DEVICE_REQUEST DevReq;\r
- EFI_STATUS EfiStatus;\r
- UINT32 UsbStatus;\r
- UINT32 Timeout;\r
-\r
- ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));\r
-\r
- //\r
- // Fill Device request packet\r
- //\r
- DevReq.RequestType = HUB_CLEAR_FEATURE_PORT_REQ_TYPE;\r
- DevReq.Request = HUB_CLEAR_FEATURE_PORT;\r
- DevReq.Value = Value;\r
- DevReq.Index = Port;\r
- DevReq.Length = 0;\r
-\r
- Timeout = 3000;\r
- EfiStatus = UsbIo->UsbControlTransfer (\r
- UsbIo,\r
- &DevReq,\r
- EfiUsbNoData,\r
- Timeout,\r
- NULL,\r
- 0,\r
- &UsbStatus\r
- );\r
-\r
- return EfiStatus;\r
-}\r
-\r
-EFI_STATUS\r
-HubGetHubStatus (\r
- IN EFI_USB_IO_PROTOCOL *UsbIo,\r
- OUT UINT32 *HubStatus\r
- )\r
-/*++\r
- \r
- Routine Description:\r
- Get Hub Status\r
- \r
- Arguments:\r
- UsbIo - EFI_USB_IO_PROTOCOL instance\r
- HubStatus - Current Hub status and change status.\r
- \r
- Returns:\r
- EFI_SUCCESS\r
- EFI_DEVICE\r
- EFI_TIME_OUT\r
- \r
---*/\r
-{\r
- EFI_USB_DEVICE_REQUEST DevReq;\r
- EFI_STATUS EfiStatus;\r
- UINT32 UsbStatus;\r
- UINT32 Timeout;\r
-\r
- ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));\r
-\r
- //\r
- // Fill Device request packet\r
- //\r
- DevReq.RequestType = HUB_GET_HUB_STATUS_REQ_TYPE;\r
- DevReq.Request = HUB_GET_HUB_STATUS;\r
- DevReq.Value = 0;\r
- DevReq.Index = 0;\r
- DevReq.Length = sizeof (UINT32);\r
-\r
- Timeout = 3000;\r
- EfiStatus = UsbIo->UsbControlTransfer (\r
- UsbIo,\r
- &DevReq,\r
- EfiUsbDataIn,\r
- Timeout,\r
- HubStatus,\r
- sizeof (UINT32),\r
- &UsbStatus\r
- );\r
-\r
- return EfiStatus;\r
-}\r
-\r
-EFI_STATUS\r
-HubSetHubFeature (\r
- IN EFI_USB_IO_PROTOCOL *UsbIo,\r
- IN UINT8 Value\r
- )\r
-/*++\r
- \r
- Routine Description:\r
- Set a specified feature to the hub\r
- \r
- Arguments:\r
- UsbIo - EFI_USB_IO_PROTOCOL instance\r
- Value - Feature value that will be set to the hub.\r
- \r
- Returns:\r
- EFI_SUCCESS\r
- EFI_DEVICE\r
- EFI_TIME_OUT\r
- \r
---*/\r
-{\r
- EFI_USB_DEVICE_REQUEST DevReq;\r
- EFI_STATUS EfiStatus;\r
- UINT32 UsbStatus;\r
- UINT32 Timeout;\r
-\r
- ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));\r
-\r
- //\r
- // Fill Device request packet\r
- //\r
- DevReq.RequestType = HUB_SET_HUB_FEATURE_REQ_TYPE;\r
- DevReq.Request = HUB_SET_HUB_FEATURE;\r
- DevReq.Value = Value;\r
- DevReq.Index = 0;\r
- DevReq.Length = 0;\r
-\r
- Timeout = 3000;\r
- EfiStatus = UsbIo->UsbControlTransfer (\r
- UsbIo,\r
- &DevReq,\r
- EfiUsbNoData,\r
- Timeout,\r
- NULL,\r
- 0,\r
- &UsbStatus\r
- );\r
-\r
- return EfiStatus;\r
-}\r
-\r
-EFI_STATUS\r
-HubClearHubFeature (\r
- IN EFI_USB_IO_PROTOCOL *UsbIo,\r
- IN UINT8 Value\r
- )\r
-/*++\r
- \r
- Routine Description:\r
- Set a specified feature to the hub\r
- \r
- Arguments:\r
- UsbIo - EFI_USB_IO_PROTOCOL instance\r
- Value - Feature value that will be cleared from the hub.\r
- \r
- Returns:\r
- EFI_SUCCESS\r
- EFI_DEVICE\r
- EFI_TIME_OUT\r
- \r
---*/\r
-{\r
- EFI_USB_DEVICE_REQUEST DevReq;\r
- EFI_STATUS EfiStatus;\r
- UINT32 UsbStatus;\r
- UINT32 Timeout;\r
-\r
- ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));\r
-\r
- //\r
- // Fill Device request packet\r
- //\r
- DevReq.RequestType = HUB_CLEAR_FEATURE_REQ_TYPE;\r
- DevReq.Request = HUB_CLEAR_FEATURE;\r
- DevReq.Value = Value;\r
- DevReq.Index = 0;\r
- DevReq.Length = 0;\r
-\r
- Timeout = 3000;\r
- EfiStatus = UsbIo->UsbControlTransfer (\r
- UsbIo,\r
- &DevReq,\r
- EfiUsbNoData,\r
- Timeout,\r
- NULL,\r
- 0,\r
- &UsbStatus\r
- );\r
-\r
- return EfiStatus;\r
-\r
-}\r
-\r
-EFI_STATUS\r
-GetHubDescriptor (\r
- IN EFI_USB_IO_PROTOCOL *UsbIo,\r
- IN UINTN DescriptorSize,\r
- OUT EFI_USB_HUB_DESCRIPTOR *HubDescriptor\r
- )\r
-/*++\r
- \r
- Routine Description:\r
- Get the hub descriptor\r
- \r
- Arguments:\r
- UsbIo - EFI_USB_IO_PROTOCOL instance\r
- DescriptorSize - The length of Hub Descriptor buffer.\r
- HubDescriptor - Caller allocated buffer to store the hub descriptor\r
- if successfully returned.\r
- \r
- Returns:\r
- EFI_SUCCESS\r
- EFI_DEVICE\r
- EFI_TIME_OUT\r
- \r
---*/\r
-{\r
- EFI_USB_DEVICE_REQUEST DevReq;\r
- EFI_STATUS EfiStatus;\r
- UINT32 UsbStatus;\r
- UINT32 Timeout;\r
-\r
- ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));\r
-\r
- //\r
- // Fill Device request packet\r
- //\r
- DevReq.RequestType = USB_RT_HUB | 0x80;\r
- DevReq.Request = HUB_GET_DESCRIPTOR;\r
- DevReq.Value = USB_DT_HUB << 8;\r
- DevReq.Index = 0;\r
- DevReq.Length = (UINT16) DescriptorSize;\r
-\r
- Timeout = 3000;\r
- EfiStatus = UsbIo->UsbControlTransfer (\r
- UsbIo,\r
- &DevReq,\r
- EfiUsbDataIn,\r
- Timeout,\r
- HubDescriptor,\r
- (UINT16) DescriptorSize,\r
- &UsbStatus\r
- );\r
-\r
- return EfiStatus;\r
-\r
-}\r
-\r
-EFI_STATUS\r
-DoHubConfig (\r
- IN USB_IO_CONTROLLER_DEVICE *HubController\r
- )\r
-/*++\r
- \r
- Routine Description:\r
- Configure the hub\r
- \r
- Arguments:\r
- HubController - Indicating the hub controller device that\r
- will be configured\r
- \r
- Returns:\r
- EFI_SUCCESS\r
- EFI_DEVICE_ERROR\r
- \r
---*/\r
-{\r
- EFI_USB_IO_PROTOCOL *UsbIo;\r
- EFI_USB_HUB_DESCRIPTOR HubDescriptor;\r
- EFI_STATUS Status;\r
- EFI_USB_HUB_STATUS HubStatus;\r
- UINTN Index;\r
- UINT32 PortStatus;\r
-\r
- UsbIo = &HubController->UsbIo;\r
-\r
- ZeroMem (&HubDescriptor, sizeof (HubDescriptor));\r
-\r
- //\r
- // First get the hub descriptor length\r
- //\r
- Status = GetHubDescriptor (UsbIo, 2, &HubDescriptor);\r
- if (EFI_ERROR (Status)) {\r
- return EFI_DEVICE_ERROR;\r
- }\r
- \r
- //\r
- // First get the whole descriptor, then\r
- // get the number of hub ports\r
- //\r
- Status = GetHubDescriptor (\r
- UsbIo,\r
- HubDescriptor.Length,\r
- &HubDescriptor\r
- );\r
- if (EFI_ERROR (Status)) {\r
- DEBUG ((gUSBErrorLevel, "Get hub descriptor fail\n"));\r
- return EFI_DEVICE_ERROR;\r
- }\r
-\r
- HubController->DownstreamPorts = HubDescriptor.NbrPorts;\r
-\r
- Status = HubGetHubStatus (UsbIo, (UINT32 *) &HubStatus);\r
- if (EFI_ERROR (Status)) {\r
- DEBUG ((gUSBErrorLevel, "Get hub status fail when configure\n"));\r
- return EFI_DEVICE_ERROR;\r
- }\r
- \r
- //\r
- // Get all hub ports status\r
- //\r
- for (Index = 0; Index < HubController->DownstreamPorts; Index++) {\r
-\r
- Status = HubGetPortStatus (UsbIo, (UINT8) (Index + 1), &PortStatus);\r
- if (EFI_ERROR (Status)) {\r
- continue;\r
- }\r
- }\r
- //\r
- // Power all the hub ports\r
- //\r
- for (Index = 0; Index < HubController->DownstreamPorts; Index++) {\r
- Status = HubSetPortFeature (\r
- UsbIo,\r
- (UINT8) (Index + 1),\r
- EfiUsbPortPower\r
- );\r
- if (EFI_ERROR (Status)) {\r
- continue;\r
- }\r
- }\r
- \r
- //\r
- // Clear Hub Status Change\r
- //\r
- Status = HubGetHubStatus (UsbIo, (UINT32 *) &HubStatus);\r
- if (EFI_ERROR (Status)) {\r
- DEBUG ((gUSBErrorLevel, "Get hub status fail\n"));\r
- return EFI_DEVICE_ERROR;\r
- } else {\r
- //\r
- // Hub power supply change happens\r
- //\r
- if (HubStatus.HubChange & HUB_CHANGE_LOCAL_POWER) {\r
- HubClearHubFeature (UsbIo, C_HUB_LOCAL_POWER);\r
- }\r
- //\r
- // Hub change overcurrent happens\r
- //\r
- if (HubStatus.HubChange & HUB_CHANGE_OVERCURRENT) {\r
- HubClearHubFeature (UsbIo, C_HUB_OVER_CURRENT);\r
- }\r
- }\r
-\r
- return EFI_SUCCESS;\r
-\r
-}\r