\r
Unified interface for RootHub and Hub.\r
\r
-Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR> \r
+Copyright (c) 2007 - 2018, 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
}\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
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
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
+ for (Index = 0; Index < HubDesc->NumPorts; Index++) {\r
UsbHubCtrlSetPortFeature (HubIf->Device, Index, USB_HUB_PORT_REMOTE_WAKE_MASK);\r
} \r
} else {\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