Index: Library/UefiShellCommandLib/ConsistMapping.c
===================================================================
--- Library/UefiShellCommandLib/ConsistMapping.c	(revision 16394)
+++ Library/UefiShellCommandLib/ConsistMapping.c	(working copy)
@@ -14,6 +14,7 @@
 #include "UefiShellCommandLib.h"
 #include <Library/DevicePathLib.h>
 #include <Library/SortLib.h>
+#include <Protocol/UsbIo.h>
 
 typedef enum {
   MTDTypeUnknown,
@@ -40,10 +41,12 @@
   CHAR16    *Name;
 } MTD_NAME;
 
+typedef VOID (EFIAPI *SerialDecodeFucntion) (EFI_DEVICE_PATH_PROTOCOL *DevPath, DEVICE_CONSIST_MAPPING_INFO *MapInfo,EFI_DEVICE_PATH_PROTOCOL *);
+
 typedef struct {
   UINT8 Type;
   UINT8 SubType;
-  VOID (EFIAPI *SerialFun) (EFI_DEVICE_PATH_PROTOCOL *DevPath, DEVICE_CONSIST_MAPPING_INFO *MapInfo);
+  SerialDecodeFucntion SerialFun;
   INTN (EFIAPI *CompareFun) (EFI_DEVICE_PATH_PROTOCOL *DevPath, EFI_DEVICE_PATH_PROTOCOL *DevPath2);
 } DEV_PATH_CONSIST_MAPPING_TABLE;
 
@@ -427,7 +430,8 @@
 EFIAPI
 DevPathSerialHardDrive (
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath
   )
 {
   HARDDRIVE_DEVICE_PATH *Hd;
@@ -453,7 +457,8 @@
 EFIAPI
 DevPathSerialAtapi (
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath
   )
 {
   ATAPI_DEVICE_PATH *Atapi;
@@ -475,7 +480,8 @@
 EFIAPI
 DevPathSerialCdRom (
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath
   )
 {
   CDROM_DEVICE_PATH *Cd;
@@ -498,7 +504,8 @@
 EFIAPI
 DevPathSerialFibre (
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath
   )
 {
   FIBRECHANNEL_DEVICE_PATH  *Fibre;
@@ -521,7 +528,8 @@
 EFIAPI
 DevPathSerialUart (
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath
   )
 {
   UART_DEVICE_PATH  *Uart;
@@ -546,11 +554,17 @@
 EFIAPI
 DevPathSerialUsb (
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath
   )
 {
-  USB_DEVICE_PATH *Usb;
+  USB_DEVICE_PATH           *Usb;
+  EFI_USB_IO_PROTOCOL       *UsbIo;
+  EFI_HANDLE                TempHandle;
+  EFI_STATUS                Status;
+  USB_INTERFACE_DESCRIPTOR  InterfaceDesc;
 
+
   ASSERT(DevicePathNode != NULL);
   ASSERT(MappingItem != NULL);
 
@@ -557,6 +571,35 @@
   Usb = (USB_DEVICE_PATH *) DevicePathNode;
   AppendCSDNum (MappingItem, Usb->ParentPortNumber);
   AppendCSDNum (MappingItem, Usb->InterfaceNumber);
+
+  if (PcdGetBool(PcdUsbExtendedDecode)) {
+    Status = gBS->LocateDevicePath( &gEfiUsbIoProtocolGuid, &DevicePath, &TempHandle );
+    UsbIo = NULL;
+    if (!EFI_ERROR(Status)) {
+      Status = gBS->OpenProtocol(TempHandle, &gEfiUsbIoProtocolGuid, (VOID**)&UsbIo, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);
+    } 
+
+    if (!EFI_ERROR(Status)) {
+      ASSERT(UsbIo != NULL);
+      Status = UsbIo->UsbGetInterfaceDescriptor(UsbIo, &InterfaceDesc);
+      if (!EFI_ERROR(Status)) {
+        if (InterfaceDesc.InterfaceClass == USB_MASS_STORE_CLASS && MappingItem->Mtd == MTDTypeUnknown) {
+          switch (InterfaceDesc.InterfaceSubClass){
+            case USB_MASS_STORE_SCSI:
+              MappingItem->Mtd = MTDTypeHardDisk;
+              break;
+            case USB_MASS_STORE_8070I:
+            case USB_MASS_STORE_UFI:
+              MappingItem->Mtd = MTDTypeFloppy;
+              break;
+            case USB_MASS_STORE_8020I:
+              MappingItem->Mtd  = MTDTypeCDRom;
+              break;
+          }
+        }
+      }
+    } 
+  }
 }
 
 /**
@@ -570,7 +613,8 @@
 EFIAPI
 DevPathSerialVendor (
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath
   )
 {
   VENDOR_DEVICE_PATH  *Vendor;
@@ -602,7 +646,8 @@
 EFIAPI
 DevPathSerialLun (
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath
   )
 {
   DEVICE_LOGICAL_UNIT_DEVICE_PATH *Lun;
@@ -624,7 +669,8 @@
 EFIAPI
 DevPathSerialSata (
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath
   )
 {
   SATA_DEVICE_PATH  *Sata;
@@ -648,7 +694,8 @@
 EFIAPI
 DevPathSerialIScsi (
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath
   )
 {
   ISCSI_DEVICE_PATH  *IScsi;
@@ -691,7 +738,8 @@
 EFIAPI
 DevPathSerialI2O (
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath
   )
 {
   I2O_DEVICE_PATH *DevicePath_I20;
@@ -713,7 +761,8 @@
 EFIAPI
 DevPathSerialMacAddr (
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath
   )
 {
   MAC_ADDR_DEVICE_PATH  *Mac;
@@ -749,7 +798,8 @@
 EFIAPI
 DevPathSerialInfiniBand (
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath
   )
 {
   INFINIBAND_DEVICE_PATH  *InfiniBand;
@@ -781,7 +831,8 @@
 EFIAPI
 DevPathSerialIPv4 (
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath
   )
 {
   IPv4_DEVICE_PATH  *Ip;
@@ -825,7 +876,8 @@
 EFIAPI
 DevPathSerialIPv6 (
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath
   )
 {
   IPv6_DEVICE_PATH  *Ip;
@@ -861,7 +913,8 @@
 EFIAPI
 DevPathSerialScsi (
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath
   )
 {
   SCSI_DEVICE_PATH  *Scsi;
@@ -884,7 +937,8 @@
 EFIAPI
 DevPathSerial1394 (
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath
   )
 {
   F1394_DEVICE_PATH *DevicePath_F1394;
@@ -908,7 +962,8 @@
 EFIAPI
 DevPathSerialAcpi (
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath
   )
 {
   ACPI_HID_DEVICE_PATH  *Acpi;
@@ -937,7 +992,8 @@
 EFIAPI
 DevPathSerialDefault (
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath
   )
 {
   return;
@@ -1179,21 +1235,22 @@
   IN EFI_DEVICE_PATH_PROTOCOL       *DevicePath
   )
 {
-  VOID (EFIAPI *SerialFun) (EFI_DEVICE_PATH_PROTOCOL *, DEVICE_CONSIST_MAPPING_INFO *);
+  SerialDecodeFucntion      SerialFun;
+  UINTN                     Index;
+  EFI_DEVICE_PATH_PROTOCOL  *OriginalDevicePath;
 
-  UINTN Index;
-
   ASSERT(DevicePath != NULL);
   ASSERT(MappingItem != NULL);
 
   SetMem (&MappingItem->Csd, sizeof (POOL_PRINT), 0);
+  OriginalDevicePath = DevicePath;
 
   while (!IsDevicePathEnd (DevicePath)) {
     //
-    // Find the handler to dump this device path node
+    // Find the handler to dump this device path node and
+    // initialize with generic function in case nothing is found
     //
-    SerialFun = NULL;
-    for (Index = 0; DevPathConsistMappingTable[Index].SerialFun != NULL; Index += 1) {
+    for (SerialFun = DevPathSerialDefault, Index = 0; DevPathConsistMappingTable[Index].SerialFun != NULL; Index += 1) {
 
       if (DevicePathType (DevicePath) == DevPathConsistMappingTable[Index].Type &&
           DevicePathSubType (DevicePath) == DevPathConsistMappingTable[Index].SubType
@@ -1202,14 +1259,8 @@
         break;
       }
     }
-    //
-    // If not found, use a generic function
-    //
-    if (!SerialFun) {
-      SerialFun = DevPathSerialDefault;
-    }
 
-    SerialFun (DevicePath, MappingItem);
+    SerialFun (DevicePath, MappingItem, OriginalDevicePath);
 
     //
     // Next device path node
Index: Library/UefiShellCommandLib/UefiShellCommandLib.inf
===================================================================
--- Library/UefiShellCommandLib/UefiShellCommandLib.inf	(revision 16394)
+++ Library/UefiShellCommandLib/UefiShellCommandLib.inf	(working copy)
@@ -53,6 +53,7 @@
   gEfiShellProtocolGuid                                   # ALWAYS_CONSUMED
   gEfiShellParametersProtocolGuid                         # ALWAYS_CONSUMED
   gEfiShellDynamicCommandProtocolGuid                     # SOMETIMES_CONSUMED
+  gEfiUsbIoProtocolGuid                                   ## SOMETIMES_CONSUMED
 
 [Guids]
   gEfiSasDevicePathGuid                                   # ALWAYS_CONSUMED
@@ -60,6 +61,7 @@
 [Pcd.common]
   gEfiShellPkgTokenSpaceGuid.PcdShellSupportLevel         ## ALWAYS_CONSUMED
   gEfiShellPkgTokenSpaceGuid.PcdShellMapNameLength        ## ALWAYS_CONSUMED
+  gEfiShellPkgTokenSpaceGuid.PcdUsbExtendedDecode         ## SOMETIMES_CONSUMED
   gEfiShellPkgTokenSpaceGuid.PcdShellDecodeIScsiMapNames  ## SOMETIMES_CONSUMED
 
 [Depex]
Index: ShellPkg.dec
===================================================================
--- ShellPkg.dec	(revision 16394)
+++ ShellPkg.dec	(working copy)
@@ -129,6 +129,9 @@
   ## Unicode string of the shell supplier
   gEfiShellPkgTokenSpaceGuid.PcdShellSupplier|L"EDK II"|VOID*|0x00000010
 
+  ## Do extended decode of USB for determining media type
+  gEfiShellPkgTokenSpaceGuid.PcdUsbExtendedDecode|TRUE|BOOLEAN|0x00000011
+
   ## Do iSCSI decode for map names.
   # This is disabled by default due to the length of generated strings
   gEfiShellPkgTokenSpaceGuid.PcdShellDecodeIScsiMapNames|FALSE|BOOLEAN|0x00000012
