Read-Capacity16 command added for SCSI drivers

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8000 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
jji4 2009-04-01 08:25:36 +00:00
parent ccb491c862
commit b96cd3133d
2 changed files with 112 additions and 45 deletions

View File

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

View File

@ -74,6 +74,11 @@ extern EFI_COMPONENT_NAME2_PROTOCOL gScsiDiskComponentName2;
#define ACTION_READ_CAPACITY 0x01 #define ACTION_READ_CAPACITY 0x01
#define ACTION_RETRY_COMMAND_LATER 0x02 #define ACTION_RETRY_COMMAND_LATER 0x02
#define SCSI_COMMAND_VERSION_1 0x01
#define SCSI_COMMAND_VERSION_2 0x02
#define SCSI_COMMAND_VERSION_3 0x03
/** /**
Test to see if this driver supports ControllerHandle. Test to see if this driver supports ControllerHandle.
@ -649,13 +654,14 @@ ScsiDiskWrite10 (
Get information from media read capacity command. Get information from media read capacity command.
@param ScsiDiskDevice The pointer of SCSI_DISK_DEV @param ScsiDiskDevice The pointer of SCSI_DISK_DEV
@param Capacity The pointer of EFI_SCSI_DISK_CAPACITY_DATA @param Capacity10 The pointer of EFI_SCSI_DISK_CAPACITY_DATA
@param Capacity16 The pointer of EFI_SCSI_DISK_CAPACITY_DATA16
**/ **/
VOID VOID
GetMediaInfo ( GetMediaInfo (
IN OUT SCSI_DISK_DEV *ScsiDiskDevice, SCSI_DISK_DEV *ScsiDiskDevice,
IN EFI_SCSI_DISK_CAPACITY_DATA *Capacity EFI_SCSI_DISK_CAPACITY_DATA *Capacity10,
EFI_SCSI_DISK_CAPACITY_DATA16 *Capacity16
); );
/** /**