}\r
\r
//\r
- // if goes here, meant SubmitInquiryCommand() failed.\r
+ // if goes here, meant ScsiInquiryCommand() failed.\r
// if ScsiDiskRequestSenseKeys() succeeds at last,\r
- // better retry SubmitInquiryCommand(). (by setting *NeedRetry = TRUE)\r
+ // better retry ScsiInquiryCommand(). (by setting *NeedRetry = TRUE)\r
//\r
MaxRetry = 3;\r
for (Index = 0; Index < MaxRetry; Index++) {\r
OUT UINTN *NumberOfSenseKeys\r
)\r
{\r
- EFI_SCSI_DISK_CAPACITY_DATA CapacityData;\r
- UINT32 DataLength;\r
- UINT8 HostAdapterStatus;\r
- UINT8 TargetStatus;\r
- EFI_STATUS CommandStatus;\r
- EFI_STATUS Status;\r
- UINT8 Index;\r
- UINT8 MaxRetry;\r
- UINT8 SenseDataLength;\r
-\r
- SenseDataLength = 0;\r
- ZeroMem (&CapacityData, sizeof (EFI_SCSI_DISK_CAPACITY_DATA));\r
- DataLength = sizeof (EFI_SCSI_DISK_CAPACITY_DATA);\r
+ UINT8 HostAdapterStatus;\r
+ UINT8 TargetStatus;\r
+ EFI_STATUS CommandStatus;\r
+ EFI_STATUS Status;\r
+ UINT8 Index;\r
+ UINT8 MaxRetry;\r
+ UINT8 SenseDataLength;\r
+ UINT8 ScsiVersion;\r
+ UINT32 DataLength10;\r
+ UINT32 DataLength16;\r
+ EFI_SCSI_DISK_CAPACITY_DATA CapacityData10;\r
+ EFI_SCSI_DISK_CAPACITY_DATA16 CapacityData16;\r
+\r
+\r
+ SenseDataLength = 0;\r
+ DataLength10 = sizeof (EFI_SCSI_DISK_CAPACITY_DATA);\r
+ DataLength16 = sizeof (EFI_SCSI_DISK_CAPACITY_DATA16);\r
+ ZeroMem (&CapacityData10, sizeof (EFI_SCSI_DISK_CAPACITY_DATA));\r
+ ZeroMem (&CapacityData16, sizeof (EFI_SCSI_DISK_CAPACITY_DATA16));\r
\r
*NumberOfSenseKeys = 0;\r
*NeedRetry = FALSE;\r
- //\r
- // submit Read Capacity Command. in this call,not request sense data\r
- //\r
- CommandStatus = ScsiReadCapacityCommand (\r
- ScsiDiskDevice->ScsiIo,\r
- EFI_TIMER_PERIOD_SECONDS (1),\r
- NULL,\r
- &SenseDataLength,\r
- &HostAdapterStatus,\r
- &TargetStatus,\r
- (VOID *) &CapacityData,\r
- &DataLength,\r
- FALSE\r
- );\r
- //\r
+ ScsiVersion = (UINT8)(ScsiDiskDevice->InquiryData.Version & 0x03);\r
+\r
+ if (ScsiVersion < SCSI_COMMAND_VERSION_3) {\r
+ //\r
+ // submit Read Capacity(10) Command. in this call,not request sense data\r
+ //\r
+ CommandStatus = ScsiReadCapacityCommand (\r
+ ScsiDiskDevice->ScsiIo,\r
+ EFI_TIMER_PERIOD_SECONDS(1),\r
+ NULL,\r
+ &SenseDataLength,\r
+ &HostAdapterStatus,\r
+ &TargetStatus,\r
+ (VOID *) &CapacityData10,\r
+ &DataLength10,\r
+ FALSE\r
+ );\r
+ } else {\r
+ //\r
+ // submit Read Capacity(16) Command to get parameter LogicalBlocksPerPhysicalBlock\r
+ // and LowestAlignedLba\r
+ //\r
+ CommandStatus = ScsiReadCapacity16Command (\r
+ ScsiDiskDevice->ScsiIo,\r
+ EFI_TIMER_PERIOD_SECONDS (1),\r
+ NULL,\r
+ &SenseDataLength,\r
+ &HostAdapterStatus,\r
+ &TargetStatus,\r
+ (VOID *) &CapacityData16,\r
+ &DataLength16,\r
+ FALSE\r
+ );\r
+ }\r
+ //\r
// no need to check HostAdapterStatus and TargetStatus\r
//\r
if (CommandStatus == EFI_SUCCESS) {\r
- GetMediaInfo (ScsiDiskDevice, &CapacityData);\r
+ GetMediaInfo (ScsiDiskDevice, &CapacityData10,&CapacityData16);\r
return EFI_SUCCESS;\r
\r
} else if (CommandStatus == EFI_NOT_READY) {\r
}\r
\r
//\r
- // if goes here, meant SubmitReadCapacityCommand() failed.\r
+ // if goes here, meant ScsiReadCapacityCommand() failed.\r
// if ScsiDiskRequestSenseKeys() succeeds at last,\r
- // better retry SubmitReadCapacityCommand(). (by setting *NeedRetry = TRUE)\r
+ // better retry ScsiReadCapacityCommand(). (by setting *NeedRetry = TRUE)\r
//\r
MaxRetry = 3;\r
for (Index = 0; Index < MaxRetry; Index++) {\r
VOID\r
GetMediaInfo (\r
IN OUT SCSI_DISK_DEV *ScsiDiskDevice,\r
- IN EFI_SCSI_DISK_CAPACITY_DATA *Capacity\r
+ EFI_SCSI_DISK_CAPACITY_DATA *Capacity10,\r
+ EFI_SCSI_DISK_CAPACITY_DATA16 *Capacity16\r
)\r
{\r
- ScsiDiskDevice->BlkIo.Media->LastBlock = (Capacity->LastLba3 << 24) |\r
- (Capacity->LastLba2 << 16) |\r
- (Capacity->LastLba1 << 8) |\r
- Capacity->LastLba0;\r
+ UINT8 ScsiVersion;\r
+ UINT8 *Ptr;\r
+\r
+ ScsiVersion = (UINT8)(ScsiDiskDevice->InquiryData.Version & 0x03);\r
+ ScsiDiskDevice->BlkIo.Media->LowestAlignedLba = 0;\r
+ ScsiDiskDevice->BlkIo.Media->LogicalBlocksPerPhysicalBlock = 1;\r
+ \r
+\r
+ if (ScsiVersion < SCSI_COMMAND_VERSION_3) {\r
+ ScsiDiskDevice->BlkIo.Media->LastBlock = (Capacity10->LastLba3 << 24) |\r
+ (Capacity10->LastLba2 << 16) |\r
+ (Capacity10->LastLba1 << 8) |\r
+ Capacity10->LastLba0;\r
+ \r
+ ScsiDiskDevice->BlkIo.Media->BlockSize = (Capacity10->BlockSize3 << 24) |\r
+ (Capacity10->BlockSize2 << 16) | \r
+ (Capacity10->BlockSize1 << 8) |\r
+ Capacity10->BlockSize0;\r
+ ScsiDiskDevice->BlkIo.Revision = EFI_BLOCK_IO_PROTOCOL_REVISION; \r
+ } else {\r
+\r
+ Ptr = (UINT8*)&ScsiDiskDevice->BlkIo.Media->LastBlock;\r
+ *Ptr++ = Capacity16->LastLba0;\r
+ *Ptr++ = Capacity16->LastLba1;\r
+ *Ptr++ = Capacity16->LastLba2;\r
+ *Ptr++ = Capacity16->LastLba3;\r
+ *Ptr++ = Capacity16->LastLba4;\r
+ *Ptr++ = Capacity16->LastLba5;\r
+ *Ptr++ = Capacity16->LastLba6;\r
+ *Ptr = Capacity16->LastLba7;\r
+ \r
+ ScsiDiskDevice->BlkIo.Media->BlockSize = (Capacity16->BlockSize3 << 24) |\r
+ (Capacity16->BlockSize2 << 16) | \r
+ (Capacity16->BlockSize1 << 8) |\r
+ Capacity16->BlockSize0;\r
+\r
+ ScsiDiskDevice->BlkIo.Media->LowestAlignedLba = (Capacity16->LowestAlignLogic2 << 8)|(Capacity16->LowestAlignLogic1);\r
+ ScsiDiskDevice->BlkIo.Media->LogicalBlocksPerPhysicalBlock = Capacity16->LogicPerPhysical;\r
+ ScsiDiskDevice->BlkIo.Revision = EFI_BLOCK_IO_PROTOCOL_REVISION2; \r
+ }\r
+\r
\r
ScsiDiskDevice->BlkIo.Media->MediaPresent = TRUE;\r
- ScsiDiskDevice->BlkIo.Media->BlockSize = (Capacity->BlockSize3 << 24) |\r
- (Capacity->BlockSize2 << 16) | \r
- (Capacity->BlockSize1 << 8) |\r
- Capacity->BlockSize0;\r
+ \r
if (ScsiDiskDevice->DeviceType == EFI_SCSI_TYPE_DISK) {\r
ScsiDiskDevice->BlkIo.Media->BlockSize = 0x200;\r
}\r