#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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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