+/**\r
+ Converts a text device path node to Serial Attached SCSI Ex device path structure.\r
+\r
+ @param TextDeviceNode The input Text device path node.\r
+\r
+ @return A pointer to the newly-created Serial Attached SCSI Ex device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextSasEx (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ CHAR16 *AddressStr;\r
+ CHAR16 *LunStr;\r
+ CHAR16 *RTPStr;\r
+ CHAR16 *SASSATAStr;\r
+ CHAR16 *LocationStr;\r
+ CHAR16 *ConnectStr;\r
+ CHAR16 *DriveBayStr;\r
+ UINT16 Info;\r
+ UINT16 Uint16;\r
+ UINT64 SasAddress;\r
+ UINT64 Lun;\r
+ SASEX_DEVICE_PATH *SasEx;\r
+\r
+ AddressStr = GetNextParamStr (&TextDeviceNode);\r
+ LunStr = GetNextParamStr (&TextDeviceNode);\r
+ RTPStr = GetNextParamStr (&TextDeviceNode);\r
+ SASSATAStr = GetNextParamStr (&TextDeviceNode);\r
+ LocationStr = GetNextParamStr (&TextDeviceNode);\r
+ ConnectStr = GetNextParamStr (&TextDeviceNode);\r
+ DriveBayStr = GetNextParamStr (&TextDeviceNode);\r
+ SasEx = (SASEX_DEVICE_PATH *) CreateDeviceNode (\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_SASEX_DP,\r
+ (UINT16) sizeof (SASEX_DEVICE_PATH)\r
+ );\r
+\r
+ Strtoi64 (AddressStr, &SasAddress);\r
+ Strtoi64 (LunStr, &Lun);\r
+ WriteUnaligned64 ((UINT64 *) &SasEx->SasAddress, SwapBytes64 (SasAddress));\r
+ WriteUnaligned64 ((UINT64 *) &SasEx->Lun, SwapBytes64 (Lun));\r
+ SasEx->RelativeTargetPort = (UINT16) Strtoi (RTPStr);\r
+\r
+ if (StrCmp (SASSATAStr, L"NoTopology") == 0) {\r
+ Info = 0x0;\r
+\r
+ } else if ((StrCmp (SASSATAStr, L"SATA") == 0) || (StrCmp (SASSATAStr, L"SAS") == 0)) {\r
+\r
+ Uint16 = (UINT16) Strtoi (DriveBayStr);\r
+ if (Uint16 == 0) {\r
+ Info = 0x1;\r
+ } else {\r
+ Info = (UINT16) (0x2 | ((Uint16 - 1) << 8));\r
+ }\r
+\r
+ if (StrCmp (SASSATAStr, L"SATA") == 0) {\r
+ Info |= BIT4;\r
+ }\r
+\r
+ //\r
+ // Location is an integer between 0 and 1 or else\r
+ // the keyword Internal (0) or External (1).\r
+ //\r
+ if (StrCmp (LocationStr, L"External") == 0) {\r
+ Uint16 = 1;\r
+ } else if (StrCmp (LocationStr, L"Internal") == 0) {\r
+ Uint16 = 0;\r
+ } else {\r
+ Uint16 = ((UINT16) Strtoi (LocationStr) & BIT0);\r
+ }\r
+ Info |= (Uint16 << 5);\r
+\r
+ //\r
+ // Connect is an integer between 0 and 3 or else\r
+ // the keyword Direct (0) or Expanded (1).\r
+ //\r
+ if (StrCmp (ConnectStr, L"Expanded") == 0) {\r
+ Uint16 = 1;\r
+ } else if (StrCmp (ConnectStr, L"Direct") == 0) {\r
+ Uint16 = 0;\r
+ } else {\r
+ Uint16 = ((UINT16) Strtoi (ConnectStr) & (BIT0 | BIT1));\r
+ }\r
+ Info |= (Uint16 << 6);\r
+\r
+ } else {\r
+ Info = (UINT16) Strtoi (SASSATAStr);\r
+ }\r
+\r
+ SasEx->DeviceTopology = Info;\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) SasEx;\r
+}\r
+\r