\r
Unified interface for RootHub and Hub.\r
\r
-Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR> \r
-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
+Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
}\r
\r
/**\r
- Usb hub control transfer to get the super speed hub descriptor.\r
-\r
- @param HubDev The hub device.\r
- @param Buf The buffer to hold the descriptor.\r
-\r
- @retval EFI_SUCCESS The hub descriptor is retrieved.\r
- @retval Others Failed to retrieve the hub descriptor.\r
-\r
-**/\r
-EFI_STATUS\r
-UsbHubCtrlGetSuperSpeedHubDesc (\r
- IN USB_DEVICE *HubDev,\r
- OUT VOID *Buf\r
- )\r
-{\r
- EFI_STATUS Status;\r
- \r
- Status = EFI_INVALID_PARAMETER;\r
- \r
- Status = UsbCtrlRequest (\r
- HubDev,\r
- EfiUsbDataIn,\r
- USB_REQ_TYPE_CLASS,\r
- USB_HUB_TARGET_HUB,\r
- USB_HUB_REQ_GET_DESC,\r
- (UINT16) (USB_DESC_TYPE_HUB_SUPER_SPEED << 8),\r
- 0,\r
- Buf,\r
- 32\r
- );\r
-\r
- return Status;\r
-}\r
-\r
-/**\r
- Usb hub control transfer to get the hub descriptor.\r
+ Usb hub control transfer to get the (super speed) hub descriptor.\r
\r
@param HubDev The hub device.\r
@param Buf The buffer to hold the descriptor.\r
)\r
{\r
EFI_STATUS Status;\r
+ UINT8 DescType;\r
+\r
+ DescType = (HubDev->Speed == EFI_USB_SPEED_SUPER) ?\r
+ USB_DESC_TYPE_HUB_SUPER_SPEED :\r
+ USB_DESC_TYPE_HUB;\r
\r
Status = UsbCtrlRequest (\r
HubDev,\r
USB_REQ_TYPE_CLASS,\r
USB_HUB_TARGET_HUB,\r
USB_HUB_REQ_GET_DESC,\r
- (UINT16) (USB_DESC_TYPE_HUB << 8),\r
+ (UINT16) (DescType << 8),\r
0,\r
Buf,\r
Len\r
}\r
\r
\r
-/**\r
- Usb hub control transfer to reset the TT (Transaction Transaltor).\r
-\r
- @param HubDev The hub device.\r
- @param Port The port of the hub.\r
-\r
- @retval EFI_SUCCESS The TT of the hub is reset.\r
- @retval Others Failed to reset the port.\r
-\r
-**/\r
-EFI_STATUS\r
-UsbHubCtrlResetTT (\r
- IN USB_DEVICE *HubDev,\r
- IN UINT8 Port\r
- )\r
-{\r
- EFI_STATUS Status;\r
-\r
- Status = UsbCtrlRequest (\r
- HubDev,\r
- EfiUsbNoData,\r
- USB_REQ_TYPE_CLASS,\r
- USB_HUB_TARGET_HUB,\r
- USB_HUB_REQ_RESET_TT,\r
- 0,\r
- (UINT16) (Port + 1),\r
- NULL,\r
- 0\r
- );\r
-\r
- return Status;\r
-}\r
-\r
-\r
-/**\r
- Usb hub control transfer to set the hub feature.\r
-\r
- @param HubDev The hub device.\r
- @param Feature The feature to set.\r
-\r
- @retval EFI_SUCESS The feature is set for the hub.\r
- @retval Others Failed to set the feature.\r
-\r
-**/\r
-EFI_STATUS\r
-UsbHubCtrlSetHubFeature (\r
- IN USB_DEVICE *HubDev,\r
- IN UINT8 Feature\r
- )\r
-{\r
- EFI_STATUS Status;\r
-\r
- Status = UsbCtrlRequest (\r
- HubDev,\r
- EfiUsbNoData,\r
- USB_REQ_TYPE_CLASS,\r
- USB_HUB_TARGET_HUB,\r
- USB_HUB_REQ_SET_FEATURE,\r
- Feature,\r
- 0,\r
- NULL,\r
- 0\r
- );\r
-\r
- return Status;\r
-}\r
-\r
-\r
/**\r
Usb hub control transfer to set the port feature.\r
\r
{\r
EFI_STATUS Status;\r
\r
- if (HubDev->Speed == EFI_USB_SPEED_SUPER) {\r
- //\r
- // Get the super speed hub descriptor\r
- //\r
- Status = UsbHubCtrlGetSuperSpeedHubDesc (HubDev, HubDesc);\r
- } else {\r
-\r
- //\r
- // First get the hub descriptor length\r
- //\r
- Status = UsbHubCtrlGetHubDesc (HubDev, HubDesc, 2);\r
-\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
+ //\r
+ // First get the hub descriptor length\r
+ //\r
+ Status = UsbHubCtrlGetHubDesc (HubDev, HubDesc, 2);\r
\r
- //\r
- // Get the whole hub descriptor\r
- //\r
- Status = UsbHubCtrlGetHubDesc (HubDev, HubDesc, HubDesc->Length);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
}\r
\r
- return Status;\r
+ //\r
+ // Get the whole hub descriptor\r
+ //\r
+ return UsbHubCtrlGetHubDesc (HubDev, HubDesc, HubDesc->Length);\r
}\r
\r
\r
IN USB_INTERFACE *HubIf\r
)\r
{\r
- EFI_USB_HUB_DESCRIPTOR HubDesc;\r
+ UINT8 HubDescBuffer[256];\r
+ EFI_USB_HUB_DESCRIPTOR *HubDesc;\r
USB_ENDPOINT_DESC *EpDesc;\r
USB_INTERFACE_SETTING *Setting;\r
EFI_USB_IO_PROTOCOL *UsbIo;\r
return EFI_DEVICE_ERROR;\r
}\r
\r
- Status = UsbHubReadDesc (HubDev, &HubDesc);\r
+ //\r
+ // The length field of descriptor is UINT8 type, so the buffer\r
+ // with 256 bytes is enough to hold the descriptor data.\r
+ //\r
+ HubDesc = (EFI_USB_HUB_DESCRIPTOR *) HubDescBuffer;\r
+ Status = UsbHubReadDesc (HubDev, HubDesc);\r
\r
if (EFI_ERROR (Status)) {\r
DEBUG (( EFI_D_ERROR, "UsbHubInit: failed to read HUB descriptor %r\n", Status));\r
return Status;\r
}\r
\r
- HubIf->NumOfPort = HubDesc.NumPorts;\r
+ HubIf->NumOfPort = HubDesc->NumPorts;\r
\r
DEBUG (( EFI_D_INFO, "UsbHubInit: hub %d has %d ports\n", HubDev->Address,HubIf->NumOfPort));\r
\r
Depth = (UINT16)(HubIf->Device->Tier - 1);\r
DEBUG ((EFI_D_INFO, "UsbHubInit: Set Hub Depth as 0x%x\n", Depth));\r
UsbHubCtrlSetHubDepth (HubIf->Device, Depth);\r
- \r
- for (Index = 0; Index < HubDesc.NumPorts; Index++) {\r
+\r
+ for (Index = 0; Index < HubDesc->NumPorts; Index++) {\r
UsbHubCtrlSetPortFeature (HubIf->Device, Index, USB_HUB_PORT_REMOTE_WAKE_MASK);\r
- } \r
+ }\r
} else {\r
//\r
// Feed power to all the hub ports. It should be ok\r
// for both gang/individual powered hubs.\r
//\r
- for (Index = 0; Index < HubDesc.NumPorts; Index++) {\r
+ for (Index = 0; Index < HubDesc->NumPorts; Index++) {\r
UsbHubCtrlSetPortFeature (HubIf->Device, Index, (EFI_USB_PORT_FEATURE) USB_HUB_PORT_POWER);\r
}\r
\r
//\r
// Update for the usb hub has no power on delay requirement\r
//\r
- if (HubDesc.PwrOn2PwrGood > 0) {\r
- gBS->Stall (HubDesc.PwrOn2PwrGood * USB_SET_PORT_POWER_STALL);\r
+ if (HubDesc->PwrOn2PwrGood > 0) {\r
+ gBS->Stall (HubDesc->PwrOn2PwrGood * USB_SET_PORT_POWER_STALL);\r
}\r
UsbHubAckHubStatus (HubIf->Device);\r
}\r