]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c
MdePkg/UefiScsiLib: Set FUA bit for synchronous SCSI Write operations
[mirror_edk2.git] / MdePkg / Library / UefiDevicePathLib / DevicePathFromText.c
index 49da8268ebc894ba841dbb3fbf5a6f17748aae5f..1515d2d5907eb76590d3a8711d5798ea6a38f125 100644 (file)
@@ -2,13 +2,7 @@
   DevicePathFromText protocol as defined in the UEFI 2.0 specification.\r
 \r
 Copyright (c) 2013 - 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
-\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
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -919,7 +913,16 @@ DevPathFromTextAcpiExp (
                                                   );\r
 \r
   AcpiEx->HID = EisaIdFromText (HIDStr);\r
-  AcpiEx->CID = EisaIdFromText (CIDStr);\r
+  //\r
+  // According to UEFI spec, the CID parametr is optional and has a default value of 0.\r
+  // So when the CID parametr is not specified or specified as 0 in the text device node.\r
+  // Set the CID to 0 in the ACPI extension device path structure.\r
+  //\r
+  if (*CIDStr == L'\0' || *CIDStr == L'0') {\r
+    AcpiEx->CID = 0;\r
+  } else {\r
+    AcpiEx->CID = EisaIdFromText (CIDStr);\r
+  }\r
   AcpiEx->UID = 0;\r
 \r
   AsciiStr = (CHAR8 *) ((UINT8 *)AcpiEx + sizeof (ACPI_EXTENDED_HID_DEVICE_PATH));\r
@@ -2061,22 +2064,42 @@ ConvertFromTextUsbClass (
   PIDStr      = GetNextParamStr (&TextDeviceNode);\r
   if (UsbClassText->ClassExist) {\r
     ClassStr = GetNextParamStr (&TextDeviceNode);\r
-    UsbClass->DeviceClass = (UINT8) Strtoi (ClassStr);\r
+    if (*ClassStr == L'\0') {\r
+      UsbClass->DeviceClass = 0xFF;\r
+    } else {\r
+      UsbClass->DeviceClass = (UINT8) Strtoi (ClassStr);\r
+    }\r
   } else {\r
     UsbClass->DeviceClass = UsbClassText->Class;\r
   }\r
   if (UsbClassText->SubClassExist) {\r
     SubClassStr = GetNextParamStr (&TextDeviceNode);\r
-    UsbClass->DeviceSubClass = (UINT8) Strtoi (SubClassStr);\r
+    if (*SubClassStr == L'\0') {\r
+      UsbClass->DeviceSubClass = 0xFF;\r
+    } else {\r
+      UsbClass->DeviceSubClass = (UINT8) Strtoi (SubClassStr);\r
+    }\r
   } else {\r
     UsbClass->DeviceSubClass = UsbClassText->SubClass;\r
   }\r
 \r
   ProtocolStr = GetNextParamStr (&TextDeviceNode);\r
 \r
-  UsbClass->VendorId        = (UINT16) Strtoi (VIDStr);\r
-  UsbClass->ProductId       = (UINT16) Strtoi (PIDStr);\r
-  UsbClass->DeviceProtocol  = (UINT8) Strtoi (ProtocolStr);\r
+  if (*VIDStr == L'\0') {\r
+    UsbClass->VendorId        = 0xFFFF;\r
+  } else {\r
+    UsbClass->VendorId        = (UINT16) Strtoi (VIDStr);\r
+  }\r
+  if (*PIDStr == L'\0') {\r
+    UsbClass->ProductId       = 0xFFFF;\r
+  } else {\r
+    UsbClass->ProductId       = (UINT16) Strtoi (PIDStr);\r
+  }\r
+  if (*ProtocolStr == L'\0') {\r
+    UsbClass->DeviceProtocol  = 0xFF;\r
+  } else {\r
+    UsbClass->DeviceProtocol  = (UINT8) Strtoi (ProtocolStr);\r
+  }\r
 \r
   return (EFI_DEVICE_PATH_PROTOCOL *) UsbClass;\r
 }\r
@@ -3416,7 +3439,15 @@ DevPathFromTextSata (
                                 (UINT16) sizeof (SATA_DEVICE_PATH)\r
                                 );\r
   Sata->HBAPortNumber            = (UINT16) Strtoi (Param1);\r
-  Sata->PortMultiplierPortNumber = (UINT16) Strtoi (Param2);\r
+\r
+  //\r
+  // According to UEFI spec, if PMPN is not provided, the default is 0xFFFF\r
+  //\r
+  if (*Param2 == L'\0' ) {\r
+    Sata->PortMultiplierPortNumber = 0xFFFF;\r
+  } else {\r
+    Sata->PortMultiplierPortNumber = (UINT16) Strtoi (Param2);\r
+  }\r
   Sata->Lun                      = (UINT16) Strtoi (Param3);\r
 \r
   return (EFI_DEVICE_PATH_PROTOCOL *) Sata;\r