]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Bus/Usb/UsbBusDxe/UsbHub.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Bus / Usb / UsbBusDxe / UsbHub.c
index fabb441570376ee6c625377ef2cc5fa677e67852..c7c27a54819f9609f68625f5d5c8939a0e9df7a1 100644 (file)
@@ -2,14 +2,8 @@
 \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
@@ -201,42 +195,7 @@ UsbHubCtrlClearTTBuffer (
 }\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
@@ -254,6 +213,11 @@ UsbHubCtrlGetHubDesc (
   )\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
@@ -261,7 +225,7 @@ UsbHubCtrlGetHubDesc (
              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
@@ -347,74 +311,6 @@ UsbHubCtrlGetPortStatus (
 }\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
@@ -475,29 +371,19 @@ UsbHubReadDesc (
 {\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
@@ -690,7 +576,8 @@ UsbHubInit (
   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
@@ -725,14 +612,19 @@ UsbHubInit (
     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
@@ -750,24 +642,24 @@ UsbHubInit (
     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