]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Bus/Usb/UsbBusDxe/UsbUtility.c
MdeModulePkg: Clean up source files
[mirror_edk2.git] / MdeModulePkg / Bus / Usb / UsbBusDxe / UsbUtility.c
index ad84da90e79dcb63db36ca0073036d33fc6333ae..e9b5fefb9ad796291c91acad4e8d6e92a3c79a35 100644 (file)
@@ -2,8 +2,8 @@
 \r
     Wrapper function for usb host controller interface.\r
 \r
-Copyright (c) 2007, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\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
 http://opensource.org/licenses/bsd-license.php\r
@@ -687,8 +687,6 @@ UsbOpenHostProtoByChild (
   @param  Bus              The USB bus driver.\r
   @param  Child            The child handle.\r
 \r
-  @return None.\r
-\r
 **/\r
 VOID\r
 UsbCloseHostProtoByChild (\r
@@ -759,7 +757,7 @@ GetUsbDPFromFullDP (
   // Get the Usb part first Begin node in full device path\r
   //\r
   UsbDevicePathBeginPtr = DevicePath;\r
-  while ( (!EfiIsDevicePathEnd (UsbDevicePathBeginPtr))&&\r
+  while ( (!IsDevicePathEnd (UsbDevicePathBeginPtr))&&\r
          ((UsbDevicePathBeginPtr->Type != MESSAGING_DEVICE_PATH) ||\r
          (UsbDevicePathBeginPtr->SubType != MSG_USB_DP &&\r
           UsbDevicePathBeginPtr->SubType != MSG_USB_CLASS_DP\r
@@ -773,7 +771,7 @@ GetUsbDPFromFullDP (
   // Get the Usb part first End node in full device path\r
   //\r
   UsbDevicePathEndPtr = UsbDevicePathBeginPtr;\r
-  while ((!EfiIsDevicePathEnd (UsbDevicePathEndPtr))&&\r
+  while ((!IsDevicePathEnd (UsbDevicePathEndPtr))&&\r
          (UsbDevicePathEndPtr->Type == MESSAGING_DEVICE_PATH) &&\r
          (UsbDevicePathEndPtr->SubType == MSG_USB_DP ||\r
           UsbDevicePathEndPtr->SubType == MSG_USB_CLASS_DP\r
@@ -930,6 +928,7 @@ MatchUsbClass (
   }\r
 \r
   IfDesc       = UsbIf->IfDesc;\r
+  ASSERT (IfDesc->ActiveIndex < USB_MAX_INTERFACE_SETTING);\r
   ActIfDesc    = &(IfDesc->Settings[IfDesc->ActiveIndex]->Desc);\r
   DevDesc      = &(UsbIf->Device->DevDesc->Desc);\r
 \r
@@ -951,12 +950,9 @@ MatchUsbClass (
       (UsbClassDevicePathPtr->ProductId == 0xffff || UsbClassDevicePathPtr->ProductId == DevDesc->IdProduct)) {\r
 \r
     //\r
-    // If class or subclass or protocol is 0, the counterparts in interface should be checked.\r
+    // If Class in Device Descriptor is set to 0, the counterparts in interface should be checked.\r
     //\r
-    if (DevDesc->DeviceClass == 0 ||\r
-        DevDesc->DeviceSubClass == 0 ||\r
-        DevDesc->DeviceProtocol == 0) {\r
-\r
+    if (DevDesc->DeviceClass == 0) {\r
       if ((UsbClassDevicePathPtr->DeviceClass == ActIfDesc->InterfaceClass ||\r
                                           UsbClassDevicePathPtr->DeviceClass == 0xff) &&\r
           (UsbClassDevicePathPtr->DeviceSubClass == ActIfDesc->InterfaceSubClass ||\r
@@ -1001,7 +997,10 @@ MatchUsbWwid (
   EFI_USB_INTERFACE_DESCRIPTOR  *ActIfDesc;\r
   EFI_USB_DEVICE_DESCRIPTOR     *DevDesc;\r
   EFI_USB_STRING_DESCRIPTOR     *StrDesc;\r
-  UINT16                        *SnString;\r
+  UINT16                        Index;\r
+  CHAR16                        *CompareStr;\r
+  UINTN                         CompareLen;\r
+  UINTN                         Length;\r
 \r
   if ((UsbWWIDDevicePathPtr->Header.Type != MESSAGING_DEVICE_PATH) ||\r
      (UsbWWIDDevicePathPtr->Header.SubType != MSG_USB_WWID_DP )){\r
@@ -1010,29 +1009,57 @@ MatchUsbWwid (
   }\r
 \r
   IfDesc       = UsbIf->IfDesc;\r
+  ASSERT (IfDesc->ActiveIndex < USB_MAX_INTERFACE_SETTING);\r
   ActIfDesc    = &(IfDesc->Settings[IfDesc->ActiveIndex]->Desc);\r
   DevDesc      = &(UsbIf->Device->DevDesc->Desc);\r
-  StrDesc      = UsbGetOneString (UsbIf->Device, DevDesc->StrSerialNumber, USB_US_LAND_ID);\r
-  SnString     = (UINT16 *) ((UINT8 *)UsbWWIDDevicePathPtr + 10);\r
 \r
   //\r
-  //In addtion, hub interface is always matched for this policy.\r
+  // In addition, Hub interface is always matched for this policy.\r
   //\r
   if ((ActIfDesc->InterfaceClass == USB_HUB_CLASS_CODE) &&\r
       (ActIfDesc->InterfaceSubClass == USB_HUB_SUBCLASS_CODE)) {\r
     return TRUE;\r
   }\r
+\r
+  //\r
+  // Check Vendor Id, Product Id and Interface Number.\r
+  //\r
+  if ((DevDesc->IdVendor != UsbWWIDDevicePathPtr->VendorId) ||\r
+      (DevDesc->IdProduct != UsbWWIDDevicePathPtr->ProductId) ||\r
+      (ActIfDesc->InterfaceNumber != UsbWWIDDevicePathPtr->InterfaceNumber)) {\r
+    return FALSE;\r
+  }\r
+\r
   //\r
-  // If connect wwid policy, determine the objective device by the serial number of\r
-  // device descriptor.\r
-  // Get serial number index from device descriptor, then get serial number by index\r
-  // and land id, compare the serial number with wwid device path node at last\r
+  // Check SerialNumber.\r
   //\r
-  // BugBug: only check serial number here, should check Interface Number, Device Vendor Id, Device Product Id  in later version\r
+  if (DevDesc->StrSerialNumber == 0) {\r
+    return FALSE;\r
+  }\r
+\r
   //\r
-  if (StrDesc != NULL && !StrnCmp (StrDesc->String, SnString, StrDesc->Length)) {\r
+  // Serial number in USB WWID device path is the last 64-or-less UTF-16 characters.\r
+  //\r
+  CompareStr = (CHAR16 *) (UINTN) (UsbWWIDDevicePathPtr + 1);\r
+  CompareLen = (DevicePathNodeLength (UsbWWIDDevicePathPtr) - sizeof (USB_WWID_DEVICE_PATH)) / sizeof (CHAR16);\r
+  if (CompareStr[CompareLen - 1] == L'\0') {\r
+    CompareLen--;\r
+  }\r
 \r
-    return TRUE;\r
+  //\r
+  // Compare serial number in each supported language.\r
+  //\r
+  for (Index = 0; Index < UsbIf->Device->TotalLangId; Index++) {\r
+    StrDesc = UsbGetOneString (UsbIf->Device, DevDesc->StrSerialNumber, UsbIf->Device->LangId[Index]);\r
+    if (StrDesc == NULL) {\r
+      continue;\r
+    }\r
+\r
+    Length = (StrDesc->Length - 2) / sizeof (CHAR16);\r
+    if ((Length >= CompareLen) &&\r
+        (CompareMem (StrDesc->String + Length - CompareLen, CompareStr, CompareLen * sizeof (CHAR16)) == 0)) {\r
+      return TRUE;\r
+    }\r
   }\r
 \r
   return FALSE;\r
@@ -1109,7 +1136,7 @@ UsbBusAddWantedUsbIoDP (
   //\r
   // Check whether remaining device path is valid\r
   //\r
-  if (RemainingDevicePath != NULL) {\r
+  if (RemainingDevicePath != NULL && !IsDevicePathEnd (RemainingDevicePath)) {\r
     if ((RemainingDevicePath->Type    != MESSAGING_DEVICE_PATH) ||\r
         (RemainingDevicePath->SubType != MSG_USB_DP &&\r
          RemainingDevicePath->SubType != MSG_USB_CLASS_DP\r
@@ -1127,24 +1154,31 @@ UsbBusAddWantedUsbIoDP (
 \r
   if (RemainingDevicePath == NULL) {\r
     //\r
-    // RemainingDevicePath== NULL means all Usb devices in this bus are wanted.\r
+    // RemainingDevicePath == NULL means all Usb devices in this bus are wanted.\r
     // Here use a Usb class Device Path in WantedUsbIoDPList to indicate all Usb devices\r
     // are wanted Usb devices\r
     //\r
     Status = UsbBusFreeUsbDPList (&Bus->WantedUsbIoDPList);\r
     ASSERT (!EFI_ERROR (Status));\r
     DevicePathPtr = DuplicateDevicePath ((EFI_DEVICE_PATH_PROTOCOL *) &mAllUsbClassDevicePath);\r
-  } else {\r
+  } else if (!IsDevicePathEnd (RemainingDevicePath)) {\r
     //\r
+    // If RemainingDevicePath isn't the End of Device Path Node,\r
     // Create new Usb device path according to the usb part in remaining device path\r
     //\r
     DevicePathPtr = GetUsbDPFromFullDP (RemainingDevicePath);\r
+  } else {\r
+    //\r
+    // If RemainingDevicePath is the End of Device Path Node,\r
+    // skip enumerate any device and return EFI_SUCESSS\r
+    //\r
+    return EFI_SUCCESS;\r
   }\r
 \r
   ASSERT (DevicePathPtr != NULL);\r
   Status = AddUsbDPToList (DevicePathPtr, &Bus->WantedUsbIoDPList);\r
   ASSERT (!EFI_ERROR (Status));\r
-  gBS->FreePool (DevicePathPtr);\r
+  FreePool (DevicePathPtr);\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -1330,14 +1364,16 @@ UsbBusRecursivelyConnectWantedUsbIo (
         //\r
         // Recursively connect the wanted Usb Io handle\r
         //\r
-        DEBUG ((EFI_D_INFO, "UsbConnectDriver: TPL before connect is %d\n", UsbGetCurrentTpl ()));\r
+        DEBUG ((EFI_D_INFO, "UsbBusRecursivelyConnectWantedUsbIo: TPL before connect is %d\n", (UINT32)UsbGetCurrentTpl ()));\r
         Status            = gBS->ConnectController (UsbIf->Handle, NULL, NULL, TRUE);\r
         UsbIf->IsManaged  = (BOOLEAN)!EFI_ERROR (Status);\r
-        DEBUG ((EFI_D_INFO, "UsbConnectDriver: TPL after connect is %d\n", UsbGetCurrentTpl()));\r
+        DEBUG ((EFI_D_INFO, "UsbBusRecursivelyConnectWantedUsbIo: TPL after connect is %d\n", (UINT32)UsbGetCurrentTpl()));\r
       }\r
     }\r
   }\r
 \r
+  FreePool (UsbIoBuffer);\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r