Revision: 16423
          http://sourceforge.net/p/edk2/code/16423
Author:   jcarsey
Date:     2014-11-24 14:58:33 +0000 (Mon, 24 Nov 2014)
Log Message:
-----------
ShellPkg: Add extended USB decoding for consistent device names

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: jaben carsey <[email protected]>
Reviewed-by: Joe Peterson <[email protected]>
Reviewed-by: Tapan Shah <[email protected]>
Reviewed-by: Erik Bjorge <[email protected]>

Modified Paths:
--------------
    trunk/edk2/ShellPkg/Library/UefiShellCommandLib/ConsistMapping.c
    trunk/edk2/ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.inf
    trunk/edk2/ShellPkg/ShellPkg.dec

Modified: trunk/edk2/ShellPkg/Library/UefiShellCommandLib/ConsistMapping.c
===================================================================
--- trunk/edk2/ShellPkg/Library/UefiShellCommandLib/ConsistMapping.c    
2014-11-24 14:53:53 UTC (rev 16422)
+++ trunk/edk2/ShellPkg/Library/UefiShellCommandLib/ConsistMapping.c    
2014-11-24 14:58:33 UTC (rev 16423)
@@ -15,6 +15,7 @@
 #include <Library/DevicePathLib.h>
 #include <Library/SortLib.h>
 #include <Library/UefiLib.h>
+#include <Protocol/UsbIo.h>
 
 typedef enum {
   MTDTypeUnknown,
@@ -41,10 +42,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;
 
@@ -428,7 +431,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;
@@ -454,7 +458,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;
@@ -476,7 +481,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;
@@ -499,7 +505,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;
@@ -522,7 +529,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;
@@ -547,17 +555,52 @@
 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);
 
   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;
+          }
+        }
+      }
+    } 
+  }
 }
 
 /**
@@ -571,7 +614,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;
@@ -603,14 +647,14 @@
       ASSERT(Buffer != NULL);
       if (Buffer == NULL) {
         return;
-      }
+  }
 
       //
       // Build the string data
       //
       for (Index = 0; Index < TargetNameLength; Index++) {
         Buffer = CatSPrint (Buffer, L"%02x", *((UINT8*)Vendor + sizeof 
(VENDOR_DEVICE_PATH) + Index));
-      }
+}
 
       //
       // Append the new data block
@@ -632,7 +676,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;
@@ -654,7 +699,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;
@@ -678,7 +724,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;
@@ -721,7 +768,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;
@@ -743,7 +791,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;
@@ -779,7 +828,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;
@@ -811,7 +861,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;
@@ -855,7 +906,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;
@@ -891,7 +943,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;
@@ -914,7 +967,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;
@@ -938,7 +992,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;
@@ -967,7 +1022,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;
@@ -1209,21 +1265,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
@@ -1232,14 +1289,8 @@
         break;
       }
     }
-    //
-    // If not found, use a generic function
-    //
-    if (!SerialFun) {
-      SerialFun = DevPathSerialDefault;
-    }
 
-    SerialFun (DevicePath, MappingItem);
+    SerialFun (DevicePath, MappingItem, OriginalDevicePath);
 
     //
     // Next device path node

Modified: 
trunk/edk2/ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.inf
===================================================================
--- trunk/edk2/ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.inf     
2014-11-24 14:53:53 UTC (rev 16422)
+++ trunk/edk2/ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.inf     
2014-11-24 14:58:33 UTC (rev 16423)
@@ -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
   gEfiShellPkgTokenSpaceGuid.PcdShellVendorExtendedDecode ## SOMETIMES_CONSUMED
 

Modified: trunk/edk2/ShellPkg/ShellPkg.dec
===================================================================
--- trunk/edk2/ShellPkg/ShellPkg.dec    2014-11-24 14:53:53 UTC (rev 16422)
+++ trunk/edk2/ShellPkg/ShellPkg.dec    2014-11-24 14:58:33 UTC (rev 16423)
@@ -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


------------------------------------------------------------------------------
Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
from Actuate! Instantly Supercharge Your Business Reports and Dashboards
with Interactivity, Sharing, Native Excel Exports, App Integration & more
Get technology previously reserved for billion-dollar corporations, FREE
http://pubads.g.doubleclick.net/gampad/clk?id=157005751&iu=/4140/ostg.clktrk
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to