]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellCommandLib/ConsistMapping.c
ShellPkg: Add extended USB decoding for consistent device names
[mirror_edk2.git] / ShellPkg / Library / UefiShellCommandLib / ConsistMapping.c
index a42a045d52d48341f1ed43c27a100d15f5fe6d26..48739e20fd3059ab9ade003cbf4acfbea1557edd 100644 (file)
@@ -15,6 +15,7 @@
 #include <Library/DevicePathLib.h>\r
 #include <Library/SortLib.h>\r
 #include <Library/UefiLib.h>\r
+#include <Protocol/UsbIo.h>\r
 \r
 typedef enum {\r
   MTDTypeUnknown,\r
@@ -41,10 +42,12 @@ typedef struct {
   CHAR16    *Name;\r
 } MTD_NAME;\r
 \r
+typedef VOID (EFIAPI *SerialDecodeFucntion) (EFI_DEVICE_PATH_PROTOCOL *DevPath, DEVICE_CONSIST_MAPPING_INFO *MapInfo,EFI_DEVICE_PATH_PROTOCOL *);\r
+\r
 typedef struct {\r
   UINT8 Type;\r
   UINT8 SubType;\r
-  VOID (EFIAPI *SerialFun) (EFI_DEVICE_PATH_PROTOCOL *DevPath, DEVICE_CONSIST_MAPPING_INFO *MapInfo);\r
+  SerialDecodeFucntion SerialFun;\r
   INTN (EFIAPI *CompareFun) (EFI_DEVICE_PATH_PROTOCOL *DevPath, EFI_DEVICE_PATH_PROTOCOL *DevPath2);\r
 } DEV_PATH_CONSIST_MAPPING_TABLE;\r
 \r
@@ -428,7 +431,8 @@ VOID
 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
@@ -454,7 +458,8 @@ VOID
 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
@@ -476,7 +481,8 @@ VOID
 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
@@ -499,7 +505,8 @@ VOID
 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
@@ -522,7 +529,8 @@ VOID
 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
@@ -547,10 +555,16 @@ VOID
 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
@@ -558,6 +572,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
@@ -571,7 +614,8 @@ VOID
 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
@@ -603,14 +647,14 @@ DevPathSerialVendor (
       ASSERT(Buffer != NULL);\r
       if (Buffer == NULL) {\r
         return;\r
-      }\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
       //\r
       // Append the new data block\r
@@ -632,7 +676,8 @@ VOID
 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
@@ -654,7 +699,8 @@ VOID
 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
@@ -678,7 +724,8 @@ VOID
 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
   ISCSI_DEVICE_PATH  *IScsi;\r
@@ -721,7 +768,8 @@ VOID
 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 *DevicePath_I20;\r
@@ -743,7 +791,8 @@ VOID
 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
@@ -779,7 +828,8 @@ VOID
 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
@@ -811,7 +861,8 @@ VOID
 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
@@ -855,7 +906,8 @@ VOID
 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
@@ -891,7 +943,8 @@ VOID
 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
@@ -914,7 +967,8 @@ VOID
 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 *DevicePath_F1394;\r
@@ -938,7 +992,8 @@ VOID
 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
@@ -967,7 +1022,8 @@ VOID
 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
@@ -1209,21 +1265,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
+  SerialDecodeFucntion      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
+  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
@@ -1232,14 +1289,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