\r
#include <IndustryStandard/FusionMptScsi.h>\r
#include <IndustryStandard/Pci.h>\r
+#include <Library/BaseMemoryLib.h>\r
#include <Library/DebugLib.h>\r
#include <Library/MemoryAllocationLib.h>\r
+#include <Library/PcdLib.h>\r
#include <Library/UefiBootServicesTableLib.h>\r
#include <Library/UefiLib.h>\r
#include <Protocol/PciIo.h>\r
UINT32 Signature;\r
EFI_EXT_SCSI_PASS_THRU_PROTOCOL PassThru;\r
EFI_EXT_SCSI_PASS_THRU_MODE PassThruMode;\r
+ UINT8 MaxTarget;\r
} MPT_SCSI_DEV;\r
\r
#define MPT_SCSI_FROM_PASS_THRU(PassThruPtr) \\r
return EFI_UNSUPPORTED;\r
}\r
\r
+STATIC\r
+BOOLEAN\r
+IsTargetInitialized (\r
+ IN UINT8 *Target\r
+ )\r
+{\r
+ UINTN Idx;\r
+\r
+ for (Idx = 0; Idx < TARGET_MAX_BYTES; ++Idx) {\r
+ if (Target[Idx] != 0xFF) {\r
+ return TRUE;\r
+ }\r
+ }\r
+ return FALSE;\r
+}\r
+\r
STATIC\r
EFI_STATUS\r
EFIAPI\r
IN OUT UINT64 *Lun\r
)\r
{\r
- return EFI_UNSUPPORTED;\r
+ MPT_SCSI_DEV *Dev;\r
+\r
+ Dev = MPT_SCSI_FROM_PASS_THRU (This);\r
+ //\r
+ // Currently support only LUN 0, so hardcode it\r
+ //\r
+ if (!IsTargetInitialized (*Target)) {\r
+ ZeroMem (*Target, TARGET_MAX_BYTES);\r
+ *Lun = 0;\r
+ } else if (**Target > Dev->MaxTarget || *Lun > 0) {\r
+ return EFI_INVALID_PARAMETER;\r
+ } else if (**Target < Dev->MaxTarget) {\r
+ //\r
+ // This device interface support 256 targets only, so it's enough to\r
+ // increment the LSB of Target, as it will never overflow.\r
+ //\r
+ **Target += 1;\r
+ } else {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
}\r
\r
STATIC\r
IN OUT UINT8 **Target\r
)\r
{\r
- return EFI_UNSUPPORTED;\r
+ MPT_SCSI_DEV *Dev;\r
+\r
+ Dev = MPT_SCSI_FROM_PASS_THRU (This);\r
+ if (!IsTargetInitialized (*Target)) {\r
+ ZeroMem (*Target, TARGET_MAX_BYTES);\r
+ } else if (**Target > Dev->MaxTarget) {\r
+ return EFI_INVALID_PARAMETER;\r
+ } else if (**Target < Dev->MaxTarget) {\r
+ //\r
+ // This device interface support 256 targets only, so it's enough to\r
+ // increment the LSB of Target, as it will never overflow.\r
+ //\r
+ **Target += 1;\r
+ } else {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
}\r
\r
STATIC\r
\r
Dev->Signature = MPT_SCSI_DEV_SIGNATURE;\r
\r
+ Dev->MaxTarget = PcdGet8 (PcdMptScsiMaxTargetLimit);\r
+\r
//\r
// Host adapter channel, doesn't exist\r
//\r