]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellCommandLib/ConsistMapping.c
ShellPkg: Refine the code to reduce time cost of 'map -r'
[mirror_edk2.git] / ShellPkg / Library / UefiShellCommandLib / ConsistMapping.c
index c29e7e93fe18f9b8ad6f0ab34e524aec9160f4e7..86e8dc59a8951bab39356886c7ec2428e32d6110 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Main file for support of shell consist mapping.\r
 \r
-  Copyright (c) 2005 - 2010, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2005 - 2015, 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
 #include "UefiShellCommandLib.h"\r
 #include <Library/DevicePathLib.h>\r
 #include <Library/SortLib.h>\r
+#include <Library/UefiLib.h>\r
+#include <Protocol/UsbIo.h>\r
+#include <Protocol/BlockIo.h>\r
+#include <Protocol/SimpleFileSystem.h>\r
+\r
+\r
 \r
 typedef enum {\r
   MTDTypeUnknown,\r
@@ -29,9 +35,9 @@ typedef struct {
 } POOL_PRINT;\r
 \r
 typedef struct {\r
-  UINTN       HI;\r
-  MTD_TYPE    MTD;\r
-  POOL_PRINT  CSD;\r
+  UINTN       Hi;\r
+  MTD_TYPE    Mtd;\r
+  POOL_PRINT  Csd;\r
   BOOLEAN     Digital;\r
 } DEVICE_CONSIST_MAPPING_INFO;\r
 \r
@@ -40,11 +46,27 @@ typedef struct {
   CHAR16    *Name;\r
 } MTD_NAME;\r
 \r
+/**\r
+  Serial Decode function.\r
+\r
+  @param  DevPath          The Device path info.\r
+  @param  MapInfo          The map info.\r
+  @param  OrigDevPath      The original device path protocol.\r
+\r
+**/\r
+typedef \r
+VOID \r
+(EFIAPI *SERIAL_DECODE_FUNCTION) (\r
+  EFI_DEVICE_PATH_PROTOCOL    *DevPath, \r
+  DEVICE_CONSIST_MAPPING_INFO *MapInfo,\r
+  EFI_DEVICE_PATH_PROTOCOL    *OrigDevPath\r
+  );\r
+\r
 typedef struct {\r
   UINT8 Type;\r
   UINT8 SubType;\r
-  VOID (EFIAPI *SerialFun) (EFI_DEVICE_PATH_PROTOCOL *, DEVICE_CONSIST_MAPPING_INFO *);\r
-  INTN (EFIAPI *CompareFun) (EFI_DEVICE_PATH_PROTOCOL *, EFI_DEVICE_PATH_PROTOCOL *);\r
+  SERIAL_DECODE_FUNCTION SerialFun;\r
+  INTN (EFIAPI *CompareFun) (EFI_DEVICE_PATH_PROTOCOL *DevPath, EFI_DEVICE_PATH_PROTOCOL *DevPath2);\r
 } DEV_PATH_CONSIST_MAPPING_TABLE;\r
 \r
 \r
@@ -98,7 +120,7 @@ CatPrint (
     ASSERT (Str->Str != NULL);\r
   }\r
 \r
-  StrCat (Str->Str, AppendStr);\r
+  StrCatS (Str->Str, StringSize/sizeof(CHAR16), AppendStr);\r
   Str->Len = StringSize;\r
 \r
   FreePool (AppendStr);\r
@@ -128,7 +150,17 @@ MTD_NAME  mMTDName[] = {
   }\r
 };\r
 \r
-VOID\r
+/**\r
+  Function to append a 64 bit number / 25 onto the string.\r
+\r
+  @param[in, out] Str          The string so append onto.\r
+  @param[in]      Num          The number to divide and append.\r
+\r
+  @retval EFI_INVALID_PARAMETER   A parameter was NULL.\r
+  @retval EFI_SUCCESS             The appending was successful.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
 AppendCSDNum2 (\r
   IN OUT POOL_PRINT       *Str,\r
   IN UINT64               Num\r
@@ -137,7 +169,9 @@ AppendCSDNum2 (
   UINT64  Result;\r
   UINT32   Rem;\r
 \r
-  ASSERT(Str != NULL);\r
+  if (Str == NULL) {\r
+    return (EFI_INVALID_PARAMETER);\r
+  }\r
 \r
   Result = DivU64x32Remainder (Num, 25, &Rem);\r
   if (Result > 0) {\r
@@ -145,35 +179,61 @@ AppendCSDNum2 (
   }\r
 \r
   CatPrint (Str, L"%c", Rem + 'a');\r
+  return (EFI_SUCCESS);\r
 }\r
 \r
-VOID\r
+/**\r
+  Function to append a 64 bit number onto the mapping info.\r
+\r
+  @param[in, out] MappingItem  The mapping info object to append onto.\r
+  @param[in]      Num          The info to append.\r
+\r
+  @retval EFI_INVALID_PARAMETER   A parameter was NULL.\r
+  @retval EFI_SUCCESS             The appending was successful.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
 AppendCSDNum (\r
-  DEVICE_CONSIST_MAPPING_INFO            *MappingItem,\r
-  UINT64                                 Num\r
+  IN OUT DEVICE_CONSIST_MAPPING_INFO            *MappingItem,\r
+  IN     UINT64                                 Num\r
   )\r
 {\r
-  ASSERT(MappingItem != NULL);\r
+  if (MappingItem == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
 \r
   if (MappingItem->Digital) {\r
-    CatPrint (&MappingItem->CSD, L"%ld", Num);\r
+    CatPrint (&MappingItem->Csd, L"%ld", Num);\r
   } else {\r
-    AppendCSDNum2 (&MappingItem->CSD, Num);\r
+    AppendCSDNum2 (&MappingItem->Csd, Num);\r
   }\r
 \r
   MappingItem->Digital = (BOOLEAN)!(MappingItem->Digital);\r
+\r
+  return (EFI_SUCCESS);\r
 }\r
 \r
-VOID\r
+/**\r
+  Function to append string into the mapping info.\r
+\r
+  @param[in, out] MappingItem  The mapping info object to append onto.\r
+  @param[in]      Str          The info to append.\r
+\r
+  @retval EFI_INVALID_PARAMETER   A parameter was NULL.\r
+  @retval EFI_SUCCESS             The appending was successful.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
 AppendCSDStr (\r
-  DEVICE_CONSIST_MAPPING_INFO            *MappingItem,\r
-  CHAR16                                 *Str\r
+  IN OUT DEVICE_CONSIST_MAPPING_INFO            *MappingItem,\r
+  IN     CHAR16                                 *Str\r
   )\r
 {\r
   CHAR16  *Index;\r
 \r
-  ASSERT(Str != NULL);\r
-  ASSERT(MappingItem != NULL);\r
+  if (Str == NULL || MappingItem == NULL) {\r
+    return (EFI_INVALID_PARAMETER);\r
+  }\r
 \r
   if (MappingItem->Digital) {\r
     //\r
@@ -192,11 +252,11 @@ AppendCSDStr (
       case '7':\r
       case '8':\r
       case '9':\r
-        CatPrint (&MappingItem->CSD, L"%c", *Index);\r
+        CatPrint (&MappingItem->Csd, L"%c", *Index);\r
         break;\r
 \r
       case '1':\r
-        CatPrint (&MappingItem->CSD, L"16");\r
+        CatPrint (&MappingItem->Csd, L"16");\r
         break;\r
 \r
       case 'a':\r
@@ -205,7 +265,7 @@ AppendCSDStr (
       case 'd':\r
       case 'e':\r
       case 'f':\r
-        CatPrint (&MappingItem->CSD, L"1%c", *Index - 'a' + '0');\r
+        CatPrint (&MappingItem->Csd, L"1%c", *Index - 'a' + '0');\r
         break;\r
 \r
       case 'A':\r
@@ -214,7 +274,7 @@ AppendCSDStr (
       case 'D':\r
       case 'E':\r
       case 'F':\r
-        CatPrint (&MappingItem->CSD, L"1%c", *Index - 'A' + '0');\r
+        CatPrint (&MappingItem->Csd, L"1%c", *Index - 'A' + '0');\r
         break;\r
       }\r
     }\r
@@ -226,27 +286,41 @@ AppendCSDStr (
       //  a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p\r
       //\r
       if (*Index >= '0' && *Index <= '9') {\r
-        CatPrint (&MappingItem->CSD, L"%c", *Index - '0' + 'a');\r
+        CatPrint (&MappingItem->Csd, L"%c", *Index - '0' + 'a');\r
       } else if (*Index >= 'a' && *Index <= 'f') {\r
-        CatPrint (&MappingItem->CSD, L"%c", *Index - 'a' + 'k');\r
+        CatPrint (&MappingItem->Csd, L"%c", *Index - 'a' + 'k');\r
       } else if (*Index >= 'A' && *Index <= 'F') {\r
-        CatPrint (&MappingItem->CSD, L"%c", *Index - 'A' + 'k');\r
+        CatPrint (&MappingItem->Csd, L"%c", *Index - 'A' + 'k');\r
       }\r
     }\r
   }\r
 \r
   MappingItem->Digital = (BOOLEAN)!(MappingItem->Digital);\r
+\r
+  return (EFI_SUCCESS);\r
 }\r
 \r
-VOID\r
+/**\r
+  Function to append a Guid to the mapping item.\r
+\r
+  @param[in, out] MappingItem  The item to append onto.\r
+  @param[in]      Guid         The guid to append.\r
+\r
+  @retval EFI_SUCCESS           The appending operation was successful.\r
+  @retval EFI_INVALID_PARAMETER A parameter was NULL.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
 AppendCSDGuid (\r
   DEVICE_CONSIST_MAPPING_INFO            *MappingItem,\r
   EFI_GUID                               *Guid\r
   )\r
 {\r
   CHAR16  Buffer[64];\r
-  ASSERT(Guid != NULL);\r
-  ASSERT(MappingItem != NULL);\r
+\r
+  if (Guid == NULL || MappingItem == NULL) {\r
+    return (EFI_INVALID_PARAMETER);\r
+  }\r
 \r
   UnicodeSPrint (\r
     Buffer,\r
@@ -254,13 +328,24 @@ AppendCSDGuid (
     L"%g",\r
     Guid\r
    );\r
-//  StrLwr (Buffer);\r
+\r
   AppendCSDStr (MappingItem, Buffer);\r
+\r
+  return (EFI_SUCCESS);\r
 }\r
 \r
+/**\r
+  Function to compare 2 APCI device paths.\r
+\r
+  @param[in] DevicePath1        The first device path to compare.\r
+  @param[in] DevicePath2        The second device path to compare.\r
+\r
+  @retval 0 The device paths represent the same device.\r
+  @return   Non zero if the devices are different, zero otherwise.\r
+**/\r
 INTN\r
 EFIAPI\r
-_DevPathCompareAcpi (\r
+DevPathCompareAcpi (\r
   IN EFI_DEVICE_PATH_PROTOCOL       *DevicePath1,\r
   IN EFI_DEVICE_PATH_PROTOCOL       *DevicePath2\r
   )\r
@@ -268,8 +353,9 @@ _DevPathCompareAcpi (
   ACPI_HID_DEVICE_PATH  *Acpi1;\r
   ACPI_HID_DEVICE_PATH  *Acpi2;\r
 \r
-  ASSERT(DevicePath1 != NULL);\r
-  ASSERT(DevicePath2 != NULL);\r
+  if (DevicePath1 == NULL || DevicePath2 == NULL) {\r
+    return (-2);\r
+  }\r
 \r
   Acpi1 = (ACPI_HID_DEVICE_PATH *) DevicePath1;\r
   Acpi2 = (ACPI_HID_DEVICE_PATH *) DevicePath2;\r
@@ -284,9 +370,18 @@ _DevPathCompareAcpi (
   return -1;\r
 }\r
 \r
+/**\r
+  Function to compare 2 PCI device paths.\r
+\r
+  @param[in] DevicePath1        The first device path to compare.\r
+  @param[in] DevicePath2        The second device path to compare.\r
+\r
+  @retval 0 The device paths represent the same device.\r
+  @return   Non zero if the devices are different, zero otherwise.\r
+**/\r
 INTN\r
 EFIAPI\r
-_DevPathComparePci (\r
+DevPathComparePci (\r
   IN EFI_DEVICE_PATH_PROTOCOL       *DevicePath1,\r
   IN EFI_DEVICE_PATH_PROTOCOL       *DevicePath2\r
   )\r
@@ -349,12 +444,14 @@ DevPathCompareDefault (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
 **/\r
 VOID\r
 EFIAPI\r
 DevPathSerialHardDrive (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
   HARDDRIVE_DEVICE_PATH *Hd;\r
@@ -363,8 +460,8 @@ DevPathSerialHardDrive (
   ASSERT(MappingItem != NULL);\r
 \r
   Hd = (HARDDRIVE_DEVICE_PATH *) DevicePathNode;\r
-  if (MappingItem->MTD == MTDTypeUnknown) {\r
-    MappingItem->MTD = MTDTypeHardDisk;\r
+  if (MappingItem->Mtd == MTDTypeUnknown) {\r
+    MappingItem->Mtd = MTDTypeHardDisk;\r
   }\r
 \r
   AppendCSDNum (MappingItem, Hd->PartitionNumber);\r
@@ -375,12 +472,14 @@ DevPathSerialHardDrive (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
 **/\r
 VOID\r
 EFIAPI\r
 DevPathSerialAtapi (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
   ATAPI_DEVICE_PATH *Atapi;\r
@@ -397,12 +496,14 @@ DevPathSerialAtapi (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
 **/\r
 VOID\r
 EFIAPI\r
 DevPathSerialCdRom (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
   CDROM_DEVICE_PATH *Cd;\r
@@ -411,7 +512,7 @@ DevPathSerialCdRom (
   ASSERT(MappingItem != NULL);\r
 \r
   Cd                = (CDROM_DEVICE_PATH *) DevicePathNode;\r
-  MappingItem->MTD  = MTDTypeCDRom;\r
+  MappingItem->Mtd  = MTDTypeCDRom;\r
   AppendCSDNum (MappingItem, Cd->BootEntry);\r
 }\r
 \r
@@ -420,12 +521,14 @@ DevPathSerialCdRom (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
 **/\r
 VOID\r
 EFIAPI\r
 DevPathSerialFibre (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
   FIBRECHANNEL_DEVICE_PATH  *Fibre;\r
@@ -443,12 +546,14 @@ DevPathSerialFibre (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
 **/\r
 VOID\r
 EFIAPI\r
 DevPathSerialUart (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
   UART_DEVICE_PATH  *Uart;\r
@@ -468,15 +573,22 @@ DevPathSerialUart (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
 **/\r
 VOID\r
 EFIAPI\r
 DevPathSerialUsb (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
-  USB_DEVICE_PATH *Usb;\r
+  USB_DEVICE_PATH           *Usb;\r
+  EFI_USB_IO_PROTOCOL       *UsbIo;\r
+  EFI_HANDLE                TempHandle;\r
+  EFI_STATUS                Status;\r
+  USB_INTERFACE_DESCRIPTOR  InterfaceDesc;\r
+\r
 \r
   ASSERT(DevicePathNode != NULL);\r
   ASSERT(MappingItem != NULL);\r
@@ -484,6 +596,35 @@ DevPathSerialUsb (
   Usb = (USB_DEVICE_PATH *) DevicePathNode;\r
   AppendCSDNum (MappingItem, Usb->ParentPortNumber);\r
   AppendCSDNum (MappingItem, Usb->InterfaceNumber);\r
+\r
+  if (PcdGetBool(PcdUsbExtendedDecode)) {\r
+    Status = gBS->LocateDevicePath( &gEfiUsbIoProtocolGuid, &DevicePath, &TempHandle );\r
+    UsbIo = NULL;\r
+    if (!EFI_ERROR(Status)) {\r
+      Status = gBS->OpenProtocol(TempHandle, &gEfiUsbIoProtocolGuid, (VOID**)&UsbIo, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
+    } \r
+\r
+    if (!EFI_ERROR(Status)) {\r
+      ASSERT(UsbIo != NULL);\r
+      Status = UsbIo->UsbGetInterfaceDescriptor(UsbIo, &InterfaceDesc);\r
+      if (!EFI_ERROR(Status)) {\r
+        if (InterfaceDesc.InterfaceClass == USB_MASS_STORE_CLASS && MappingItem->Mtd == MTDTypeUnknown) {\r
+          switch (InterfaceDesc.InterfaceSubClass){\r
+            case USB_MASS_STORE_SCSI:\r
+              MappingItem->Mtd = MTDTypeHardDisk;\r
+              break;\r
+            case USB_MASS_STORE_8070I:\r
+            case USB_MASS_STORE_UFI:\r
+              MappingItem->Mtd = MTDTypeFloppy;\r
+              break;\r
+            case USB_MASS_STORE_8020I:\r
+              MappingItem->Mtd  = MTDTypeCDRom;\r
+              break;\r
+          }\r
+        }\r
+      }\r
+    } \r
+  }\r
 }\r
 \r
 /**\r
@@ -491,30 +632,62 @@ DevPathSerialUsb (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
+\r
 **/\r
 VOID\r
 EFIAPI\r
 DevPathSerialVendor (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
   VENDOR_DEVICE_PATH  *Vendor;\r
   SAS_DEVICE_PATH     *Sas;\r
-  EFI_GUID            SasVendorGuid = DEVICE_PATH_MESSAGING_SAS;\r
+  UINTN               TargetNameLength;\r
+  UINTN               Index;\r
+  CHAR16              *Buffer;\r
 \r
-  ASSERT(DevicePathNode != NULL);\r
-  ASSERT(MappingItem != NULL);\r
+  if (DevicePathNode == NULL || MappingItem == NULL) {\r
+    return;\r
+  }\r
 \r
   Vendor = (VENDOR_DEVICE_PATH *) DevicePathNode;\r
   AppendCSDGuid (MappingItem, &Vendor->Guid);\r
 \r
-  if (CompareGuid (&SasVendorGuid, &Vendor->Guid) == 0) {\r
+  if (CompareGuid (&gEfiSasDevicePathGuid, &Vendor->Guid)) {\r
     Sas = (SAS_DEVICE_PATH *) Vendor;\r
     AppendCSDNum (MappingItem, Sas->SasAddress);\r
     AppendCSDNum (MappingItem, Sas->Lun);\r
     AppendCSDNum (MappingItem, Sas->DeviceTopology);\r
     AppendCSDNum (MappingItem, Sas->RelativeTargetPort);\r
+  } else {\r
+    TargetNameLength = MIN(DevicePathNodeLength (DevicePathNode) - sizeof (VENDOR_DEVICE_PATH), PcdGet32(PcdShellVendorExtendedDecode));\r
+    if (TargetNameLength != 0) {\r
+      //\r
+      // String is 2 chars per data byte, plus NULL terminator\r
+      //\r
+      Buffer = AllocateZeroPool (((TargetNameLength * 2) + 1) * sizeof(CHAR16));\r
+      ASSERT(Buffer != NULL);\r
+      if (Buffer == NULL) {\r
+        return;\r
+  }\r
+\r
+      //\r
+      // Build the string data\r
+      //\r
+      for (Index = 0; Index < TargetNameLength; Index++) {\r
+        Buffer = CatSPrint (Buffer, L"%02x", *((UINT8*)Vendor + sizeof (VENDOR_DEVICE_PATH) + Index));\r
+}\r
+\r
+      //\r
+      // Append the new data block\r
+      //\r
+      AppendCSDStr (MappingItem, Buffer);\r
+\r
+      FreePool(Buffer);\r
+    }\r
   }\r
 }\r
 \r
@@ -523,12 +696,14 @@ DevPathSerialVendor (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
 **/\r
 VOID\r
 EFIAPI\r
 DevPathSerialLun (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
   DEVICE_LOGICAL_UNIT_DEVICE_PATH *Lun;\r
@@ -545,12 +720,14 @@ DevPathSerialLun (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
 **/\r
 VOID\r
 EFIAPI\r
 DevPathSerialSata (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
   SATA_DEVICE_PATH  *Sata;\r
@@ -569,21 +746,16 @@ DevPathSerialSata (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
 **/\r
 VOID\r
 EFIAPI\r
 DevPathSerialIScsi (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
-///@todo make this a PCD\r
-//\r
-// As CSD of ISCSI node is quite long, we comment\r
-// the code below to keep the consistent mapping\r
-// short. Uncomment if you really need it.\r
-//\r
-/*\r
   ISCSI_DEVICE_PATH  *IScsi;\r
   UINT8              *IScsiTargetName;\r
   CHAR16             *TargetName;\r
@@ -593,24 +765,25 @@ DevPathSerialIScsi (
   ASSERT(DevicePathNode != NULL);\r
   ASSERT(MappingItem != NULL);\r
 \r
-  IScsi = (ISCSI_DEVICE_PATH  *) DevicePathNode;\r
-  AppendCSDNum (MappingItem, IScsi->NetworkProtocol);\r
-  AppendCSDNum (MappingItem, IScsi->LoginOption);\r
-  AppendCSDNum (MappingItem, IScsi->Lun);\r
-  AppendCSDNum (MappingItem, IScsi->TargetPortalGroupTag);\r
-  TargetNameLength = DevicePathNodeLength (DevicePathNode) - sizeof (ISCSI_DEVICE_PATH);\r
-  if (TargetNameLength > 0) {\r
-    TargetName = AllocateZeroPool ((TargetNameLength + 1) * sizeof (CHAR16));\r
-    if (TargetName != NULL) {\r
-      IScsiTargetName = (UINT8 *) (IScsi + 1);\r
-      for (Index = 0; Index < TargetNameLength; Index++) {\r
-        TargetName[Index] = (CHAR16) IScsiTargetName[Index];\r
+  if (PcdGetBool(PcdShellDecodeIScsiMapNames)) {\r
+    IScsi = (ISCSI_DEVICE_PATH  *) DevicePathNode;\r
+    AppendCSDNum (MappingItem, IScsi->NetworkProtocol);\r
+    AppendCSDNum (MappingItem, IScsi->LoginOption);\r
+    AppendCSDNum (MappingItem, IScsi->Lun);\r
+    AppendCSDNum (MappingItem, IScsi->TargetPortalGroupTag);\r
+    TargetNameLength = DevicePathNodeLength (DevicePathNode) - sizeof (ISCSI_DEVICE_PATH);\r
+    if (TargetNameLength > 0) {\r
+      TargetName = AllocateZeroPool ((TargetNameLength + 1) * sizeof (CHAR16));\r
+      if (TargetName != NULL) {\r
+        IScsiTargetName = (UINT8 *) (IScsi + 1);\r
+        for (Index = 0; Index < TargetNameLength; Index++) {\r
+          TargetName[Index] = (CHAR16) IScsiTargetName[Index];\r
+        }\r
+        AppendCSDStr (MappingItem, TargetName);\r
+        FreePool (TargetName);\r
       }\r
-      AppendCSDStr (MappingItem, TargetName);\r
-      FreePool (TargetName);\r
     }\r
   }\r
- */\r
 }\r
 \r
 /**\r
@@ -618,21 +791,23 @@ DevPathSerialIScsi (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
 **/\r
 VOID\r
 EFIAPI\r
 DevPathSerialI2O (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
-  I2O_DEVICE_PATH *I2O;\r
+  I2O_DEVICE_PATH *DevicePath_I20;\r
 \r
   ASSERT(DevicePathNode != NULL);\r
   ASSERT(MappingItem != NULL);\r
 \r
-  I2O = (I2O_DEVICE_PATH *) DevicePathNode;\r
-  AppendCSDNum (MappingItem, I2O->Tid);\r
+  DevicePath_I20 = (I2O_DEVICE_PATH *) DevicePathNode;\r
+  AppendCSDNum (MappingItem, DevicePath_I20->Tid);\r
 }\r
 \r
 /**\r
@@ -640,12 +815,14 @@ DevPathSerialI2O (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
 **/\r
 VOID\r
 EFIAPI\r
 DevPathSerialMacAddr (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
   MAC_ADDR_DEVICE_PATH  *Mac;\r
@@ -676,12 +853,14 @@ DevPathSerialMacAddr (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
 **/\r
 VOID\r
 EFIAPI\r
 DevPathSerialInfiniBand (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
   INFINIBAND_DEVICE_PATH  *InfiniBand;\r
@@ -708,12 +887,14 @@ DevPathSerialInfiniBand (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
 **/\r
 VOID\r
 EFIAPI\r
 DevPathSerialIPv4 (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
   IPv4_DEVICE_PATH  *Ip;\r
@@ -752,12 +933,15 @@ DevPathSerialIPv4 (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
+\r
 **/\r
 VOID\r
 EFIAPI\r
 DevPathSerialIPv6 (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
   IPv6_DEVICE_PATH  *Ip;\r
@@ -788,12 +972,15 @@ DevPathSerialIPv6 (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
+\r
 **/\r
 VOID\r
 EFIAPI\r
 DevPathSerialScsi (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
   SCSI_DEVICE_PATH  *Scsi;\r
@@ -811,22 +998,24 @@ DevPathSerialScsi (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
 **/\r
 VOID\r
 EFIAPI\r
 DevPathSerial1394 (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
-  F1394_DEVICE_PATH *F1394;\r
+  F1394_DEVICE_PATH *DevicePath_F1394;\r
   CHAR16            Buffer[20];\r
 \r
   ASSERT(DevicePathNode != NULL);\r
   ASSERT(MappingItem != NULL);\r
 \r
-  F1394 = (F1394_DEVICE_PATH *) DevicePathNode;\r
-  UnicodeSPrint (Buffer, 0, L"%lx", F1394->Guid);\r
+  DevicePath_F1394 = (F1394_DEVICE_PATH *) DevicePathNode;\r
+  UnicodeSPrint (Buffer, 0, L"%lx", DevicePath_F1394->Guid);\r
   AppendCSDStr (MappingItem, Buffer);\r
 }\r
 \r
@@ -835,12 +1024,14 @@ DevPathSerial1394 (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
 **/\r
 VOID\r
 EFIAPI\r
 DevPathSerialAcpi (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
   ACPI_HID_DEVICE_PATH  *Acpi;\r
@@ -851,7 +1042,7 @@ DevPathSerialAcpi (
   Acpi = (ACPI_HID_DEVICE_PATH *) DevicePathNode;\r
   if ((Acpi->HID & PNP_EISA_ID_MASK) == PNP_EISA_ID_CONST) {\r
     if (EISA_ID_TO_NUM (Acpi->HID) == 0x0604) {\r
-      MappingItem->MTD = MTDTypeFloppy;\r
+      MappingItem->Mtd = MTDTypeFloppy;\r
       AppendCSDNum (MappingItem, Acpi->UID);\r
     }\r
   }\r
@@ -860,102 +1051,150 @@ DevPathSerialAcpi (
 /**\r
   Empty function used for unknown devices.\r
 \r
+  @param[in] DevicePathNode       Ignored.\r
+  @param[in] MappingItem          Ignored.\r
+  @param[in] DevicePath           Ignored.\r
+\r
   Does nothing.\r
 **/\r
 VOID\r
 EFIAPI\r
 DevPathSerialDefault (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
+  return;\r
 }\r
 \r
 DEV_PATH_CONSIST_MAPPING_TABLE  DevPathConsistMappingTable[] = {\r
-  HARDWARE_DEVICE_PATH,\r
-  HW_PCI_DP,\r
-  DevPathSerialDefault,\r
-  _DevPathComparePci,\r
-  ACPI_DEVICE_PATH,\r
-  ACPI_DP,\r
-  DevPathSerialAcpi,\r
-  _DevPathCompareAcpi,\r
-  MESSAGING_DEVICE_PATH,\r
-  MSG_ATAPI_DP,\r
-  DevPathSerialAtapi,\r
-  DevPathCompareDefault,\r
-  MESSAGING_DEVICE_PATH,\r
-  MSG_SCSI_DP,\r
-  DevPathSerialScsi,\r
-  DevPathCompareDefault,\r
-  MESSAGING_DEVICE_PATH,\r
-  MSG_FIBRECHANNEL_DP,\r
-  DevPathSerialFibre,\r
-  DevPathCompareDefault,\r
-  MESSAGING_DEVICE_PATH,\r
-  MSG_1394_DP,\r
-  DevPathSerial1394,\r
-  DevPathCompareDefault,\r
-  MESSAGING_DEVICE_PATH,\r
-  MSG_USB_DP,\r
-  DevPathSerialUsb,\r
-  DevPathCompareDefault,\r
-  MESSAGING_DEVICE_PATH,\r
-  MSG_I2O_DP,\r
-  DevPathSerialI2O,\r
-  DevPathCompareDefault,\r
-  MESSAGING_DEVICE_PATH,\r
-  MSG_MAC_ADDR_DP,\r
-  DevPathSerialMacAddr,\r
-  DevPathCompareDefault,\r
-  MESSAGING_DEVICE_PATH,\r
-  MSG_IPv4_DP,\r
-  DevPathSerialIPv4,\r
-  DevPathCompareDefault,\r
-  MESSAGING_DEVICE_PATH,\r
-  MSG_IPv6_DP,\r
-  DevPathSerialIPv6,\r
-  DevPathCompareDefault,\r
-  MESSAGING_DEVICE_PATH,\r
-  MSG_INFINIBAND_DP,\r
-  DevPathSerialInfiniBand,\r
-  DevPathCompareDefault,\r
-  MESSAGING_DEVICE_PATH,\r
-  MSG_UART_DP,\r
-  DevPathSerialUart,\r
-  DevPathCompareDefault,\r
-  MESSAGING_DEVICE_PATH,\r
-  MSG_VENDOR_DP,\r
-  DevPathSerialVendor,\r
-  DevPathCompareDefault,\r
-  MESSAGING_DEVICE_PATH,\r
-  MSG_DEVICE_LOGICAL_UNIT_DP,\r
-  DevPathSerialLun,\r
-  DevPathCompareDefault,\r
-  MESSAGING_DEVICE_PATH,\r
-  MSG_SATA_DP,\r
-  DevPathSerialSata,\r
-  DevPathCompareDefault,\r
-  MESSAGING_DEVICE_PATH,\r
-  MSG_ISCSI_DP,\r
-  DevPathSerialIScsi,\r
-  DevPathCompareDefault,\r
-  MEDIA_DEVICE_PATH,\r
-  MEDIA_HARDDRIVE_DP,\r
-  DevPathSerialHardDrive,\r
-  DevPathCompareDefault,\r
-  MEDIA_DEVICE_PATH,\r
-  MEDIA_CDROM_DP,\r
-  DevPathSerialCdRom,\r
-  DevPathCompareDefault,\r
-  MEDIA_DEVICE_PATH,\r
-  MEDIA_VENDOR_DP,\r
-  DevPathSerialVendor,\r
-  DevPathCompareDefault,\r
-  0,\r
-  0,\r
-  NULL,\r
-  NULL\r
+  {\r
+    HARDWARE_DEVICE_PATH,\r
+    HW_PCI_DP,\r
+    DevPathSerialDefault,\r
+    DevPathComparePci\r
+  },\r
+  {\r
+    ACPI_DEVICE_PATH,\r
+    ACPI_DP,\r
+    DevPathSerialAcpi,\r
+    DevPathCompareAcpi\r
+  },\r
+  {\r
+    MESSAGING_DEVICE_PATH,\r
+    MSG_ATAPI_DP,\r
+    DevPathSerialAtapi,\r
+    DevPathCompareDefault\r
+  },\r
+  {\r
+    MESSAGING_DEVICE_PATH,\r
+    MSG_SCSI_DP,\r
+    DevPathSerialScsi,\r
+    DevPathCompareDefault\r
+  },\r
+  {\r
+    MESSAGING_DEVICE_PATH,\r
+    MSG_FIBRECHANNEL_DP,\r
+    DevPathSerialFibre,\r
+    DevPathCompareDefault\r
+  },\r
+  {\r
+    MESSAGING_DEVICE_PATH,\r
+    MSG_1394_DP,\r
+    DevPathSerial1394,\r
+    DevPathCompareDefault\r
+  },\r
+  {\r
+    MESSAGING_DEVICE_PATH,\r
+    MSG_USB_DP,\r
+    DevPathSerialUsb,\r
+    DevPathCompareDefault\r
+  },\r
+  {\r
+    MESSAGING_DEVICE_PATH,\r
+    MSG_I2O_DP,\r
+    DevPathSerialI2O,\r
+    DevPathCompareDefault\r
+  },\r
+  {\r
+    MESSAGING_DEVICE_PATH,\r
+    MSG_MAC_ADDR_DP,\r
+    DevPathSerialMacAddr,\r
+    DevPathCompareDefault\r
+  },\r
+  {\r
+    MESSAGING_DEVICE_PATH,\r
+    MSG_IPv4_DP,\r
+    DevPathSerialIPv4,\r
+    DevPathCompareDefault\r
+  },\r
+  {\r
+    MESSAGING_DEVICE_PATH,\r
+    MSG_IPv6_DP,\r
+    DevPathSerialIPv6,\r
+    DevPathCompareDefault\r
+  },\r
+  {\r
+    MESSAGING_DEVICE_PATH,\r
+    MSG_INFINIBAND_DP,\r
+    DevPathSerialInfiniBand,\r
+    DevPathCompareDefault\r
+  },\r
+  {\r
+    MESSAGING_DEVICE_PATH,\r
+    MSG_UART_DP,\r
+    DevPathSerialUart,\r
+    DevPathCompareDefault\r
+  },\r
+  {\r
+    MESSAGING_DEVICE_PATH,\r
+    MSG_VENDOR_DP,\r
+    DevPathSerialVendor,\r
+    DevPathCompareDefault\r
+  },\r
+  {\r
+    MESSAGING_DEVICE_PATH,\r
+    MSG_DEVICE_LOGICAL_UNIT_DP,\r
+    DevPathSerialLun,\r
+    DevPathCompareDefault\r
+  },\r
+  {\r
+    MESSAGING_DEVICE_PATH,\r
+    MSG_SATA_DP,\r
+    DevPathSerialSata,\r
+    DevPathCompareDefault\r
+  },\r
+  {\r
+    MESSAGING_DEVICE_PATH,\r
+    MSG_ISCSI_DP,\r
+    DevPathSerialIScsi,\r
+    DevPathCompareDefault\r
+  },\r
+  {\r
+    MEDIA_DEVICE_PATH,\r
+    MEDIA_HARDDRIVE_DP,\r
+    DevPathSerialHardDrive,\r
+    DevPathCompareDefault\r
+  },\r
+  {\r
+    MEDIA_DEVICE_PATH,\r
+    MEDIA_CDROM_DP,\r
+    DevPathSerialCdRom,\r
+    DevPathCompareDefault\r
+  },\r
+  {\r
+    MEDIA_DEVICE_PATH,\r
+    MEDIA_VENDOR_DP,\r
+    DevPathSerialVendor,\r
+    DevPathCompareDefault\r
+  },\r
+  {\r
+    0,\r
+    0,\r
+    NULL,\r
+    NULL\r
+  }\r
 };\r
 \r
 /**\r
@@ -963,8 +1202,8 @@ DEV_PATH_CONSIST_MAPPING_TABLE  DevPathConsistMappingTable[] = {
 \r
   @param[in] DevicePathNode   The node to check.\r
 \r
-  @retval TRUE    The node is HI.\r
-  @retval FALSE   The node is not HI.\r
+  @retval TRUE    The node is Hi.\r
+  @retval FALSE   The node is not Hi.\r
 **/\r
 BOOLEAN\r
 EFIAPI\r
@@ -997,11 +1236,11 @@ IsHIDevicePathNode (
 }\r
 \r
 /**\r
-  Function to convert a standard device path structure into a HI version.\r
+  Function to convert a standard device path structure into a Hi version.\r
 \r
   @param[in] DevicePath   The device path to convert.\r
 \r
-  @return   the device path portion that is HI.\r
+  @return   the device path portion that is Hi.\r
 **/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 EFIAPI\r
@@ -1019,7 +1258,7 @@ GetHIDevicePath (
 \r
   NonHIDevicePathNodeCount  = 0;\r
 \r
-  HIDevicePath              = AllocatePool (sizeof (EFI_DEVICE_PATH_PROTOCOL));\r
+  HIDevicePath              = AllocateZeroPool (sizeof (EFI_DEVICE_PATH_PROTOCOL));\r
   SetDevicePathEndNode (HIDevicePath);\r
 \r
   Node.DevPath.Type       = END_DEVICE_PATH_TYPE;\r
@@ -1065,21 +1304,22 @@ GetDeviceConsistMappingInfo (
   IN EFI_DEVICE_PATH_PROTOCOL       *DevicePath\r
   )\r
 {\r
-  VOID (EFIAPI *SerialFun) (EFI_DEVICE_PATH_PROTOCOL *, DEVICE_CONSIST_MAPPING_INFO *);\r
-\r
-  UINTN Index;\r
+  SERIAL_DECODE_FUNCTION    SerialFun;\r
+  UINTN                     Index;\r
+  EFI_DEVICE_PATH_PROTOCOL  *OriginalDevicePath;\r
 \r
   ASSERT(DevicePath != NULL);\r
   ASSERT(MappingItem != NULL);\r
 \r
-  SetMem (&MappingItem->CSD, sizeof (POOL_PRINT), 0);\r
+  SetMem (&MappingItem->Csd, sizeof (POOL_PRINT), 0);\r
+  OriginalDevicePath = DevicePath;\r
 \r
   while (!IsDevicePathEnd (DevicePath)) {\r
     //\r
-    // Find the handler to dump this device path node\r
+    // Find the handler to dump this device path node and\r
+    // initialize with generic function in case nothing is found\r
     //\r
-    SerialFun = NULL;\r
-    for (Index = 0; DevPathConsistMappingTable[Index].SerialFun != NULL; Index += 1) {\r
+    for (SerialFun = DevPathSerialDefault, Index = 0; DevPathConsistMappingTable[Index].SerialFun != NULL; Index += 1) {\r
 \r
       if (DevicePathType (DevicePath) == DevPathConsistMappingTable[Index].Type &&\r
           DevicePathSubType (DevicePath) == DevPathConsistMappingTable[Index].SubType\r
@@ -1088,14 +1328,8 @@ GetDeviceConsistMappingInfo (
         break;\r
       }\r
     }\r
-    //\r
-    // If not found, use a generic function\r
-    //\r
-    if (!SerialFun) {\r
-      SerialFun = DevPathSerialDefault;\r
-    }\r
 \r
-    SerialFun (DevicePath, MappingItem);\r
+    SerialFun (DevicePath, MappingItem, OriginalDevicePath);\r
 \r
     //\r
     // Next device path node\r
@@ -1119,20 +1353,22 @@ ShellCommandConsistMappingInitialize (
   OUT EFI_DEVICE_PATH_PROTOCOL           ***Table\r
   )\r
 {\r
-  EFI_HANDLE                *HandleBuffer;\r
-  UINTN                     HandleNum;\r
-  UINTN                     HandleLoop;\r
-  EFI_DEVICE_PATH_PROTOCOL  **TempTable;\r
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
-  EFI_DEVICE_PATH_PROTOCOL  *HIDevicePath;\r
-  UINTN                     Index;\r
-  EFI_STATUS                Status;\r
+  EFI_HANDLE                      *HandleBuffer;\r
+  UINTN                           HandleNum;\r
+  UINTN                           HandleLoop;\r
+  EFI_DEVICE_PATH_PROTOCOL        **TempTable;\r
+  EFI_DEVICE_PATH_PROTOCOL        *DevicePath;\r
+  EFI_DEVICE_PATH_PROTOCOL        *HIDevicePath;\r
+  EFI_BLOCK_IO_PROTOCOL           *BlockIo;\r
+  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFileSystem;\r
+  UINTN                           Index;\r
+  EFI_STATUS                      Status;\r
 \r
   HandleBuffer              = NULL;\r
 \r
   Status = gBS->LocateHandleBuffer (\r
-              AllHandles,\r
-              NULL,\r
+              ByProtocol,\r
+              &gEfiDevicePathProtocolGuid,\r
               NULL,\r
               &HandleNum,\r
               &HandleBuffer\r
@@ -1155,6 +1391,20 @@ ShellCommandConsistMappingInitialize (
       continue;\r
     }\r
 \r
+    Status = gBS->HandleProtocol( HandleBuffer[HandleLoop], \r
+                                  &gEfiBlockIoProtocolGuid, \r
+                                  (VOID **)&BlockIo\r
+                                  );\r
+    if (EFI_ERROR(Status)) {\r
+      Status = gBS->HandleProtocol( HandleBuffer[HandleLoop], \r
+                                    &gEfiSimpleFileSystemProtocolGuid, \r
+                                    (VOID **)&SimpleFileSystem\r
+                                    );\r
+      if (EFI_ERROR(Status)) {\r
+        continue;\r
+      }\r
+    }\r
+\r
     for (Index = 0; TempTable[Index] != NULL; Index++) {\r
       if (DevicePathCompare (&TempTable[Index], &HIDevicePath) == 0) {\r
         FreePool (HIDevicePath);\r
@@ -1212,7 +1462,7 @@ ShellCommandConsistMappingUnInitialize (
   This must be called after ShellCommandConsistMappingInitialize() and\r
   before ShellCommandConsistMappingUnInitialize() is called.\r
 \r
-  @param[in] DeviecPath   The pointer to the dev path for the device.\r
+  @param[in] DevicePath   The pointer to the dev path for the device.\r
   @param[in] Table        The Table of mapping information.\r
 \r
   @retval NULL            A consistent mapped name could not be created.\r
@@ -1221,8 +1471,8 @@ ShellCommandConsistMappingUnInitialize (
 CHAR16 *\r
 EFIAPI\r
 ShellCommandConsistMappingGenMappingName (\r
-  EFI_DEVICE_PATH_PROTOCOL    *DevicePath,\r
-  EFI_DEVICE_PATH_PROTOCOL    **Table\r
+  IN EFI_DEVICE_PATH_PROTOCOL    *DevicePath,\r
+  IN EFI_DEVICE_PATH_PROTOCOL    **Table\r
   )\r
 {\r
   POOL_PRINT                  Str;\r
@@ -1250,15 +1500,15 @@ ShellCommandConsistMappingGenMappingName (
     return NULL;\r
   }\r
 \r
-  MappingInfo.HI      = Index;\r
-  MappingInfo.MTD     = MTDTypeUnknown;\r
+  MappingInfo.Hi      = Index;\r
+  MappingInfo.Mtd     = MTDTypeUnknown;\r
   MappingInfo.Digital = FALSE;\r
 \r
   GetDeviceConsistMappingInfo (&MappingInfo, DevicePath);\r
 \r
   SetMem (&Str, sizeof (Str), 0);\r
   for (Index = 0; mMTDName[Index].MTDType != MTDTypeEnd; Index++) {\r
-    if (MappingInfo.MTD == mMTDName[Index].MTDType) {\r
+    if (MappingInfo.Mtd == mMTDName[Index].MTDType) {\r
       break;\r
     }\r
   }\r
@@ -1267,10 +1517,10 @@ ShellCommandConsistMappingGenMappingName (
     CatPrint (&Str, L"%s", mMTDName[Index].Name);\r
   }\r
 \r
-  CatPrint (&Str, L"%d", (UINTN) MappingInfo.HI);\r
-  if (MappingInfo.CSD.Str != NULL) {\r
-    CatPrint (&Str, L"%s", MappingInfo.CSD.Str);\r
-    FreePool (MappingInfo.CSD.Str);\r
+  CatPrint (&Str, L"%d", (UINTN) MappingInfo.Hi);\r
+  if (MappingInfo.Csd.Str != NULL) {\r
+    CatPrint (&Str, L"%s", MappingInfo.Csd.Str);\r
+    FreePool (MappingInfo.Csd.Str);\r
   }\r
 \r
   if (Str.Str != NULL) {\r