Fix a issue "BlockIOProtocolTest failed on Several Platforms during EFI and UEFI SCT". EFI_BLOCK_IO_PROTOCOL.ReadBlocks may assert when Reading block without media present in the device

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5763 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
eric_tian 2008-09-01 09:46:38 +00:00
parent be9b89f598
commit 9ebae8aefa
2 changed files with 17 additions and 39 deletions

View File

@ -805,7 +805,7 @@ PioReadWriteData (
@param[in] *IdeDev Pointer pointing to IDE_BLK_IO_DEV data structure, used @param[in] *IdeDev Pointer pointing to IDE_BLK_IO_DEV data structure, used
to record all the information of the IDE device. to record all the information of the IDE device.
@param[in] *SenseCount Sense count for this packet command @param[in] *SResult Sense result for this packet command.
@retval EFI_SUCCESS Device is accessible. @retval EFI_SUCCESS Device is accessible.
@retval EFI_DEVICE_ERROR Device is not accessible. @retval EFI_DEVICE_ERROR Device is not accessible.
@ -814,13 +814,12 @@ PioReadWriteData (
EFI_STATUS EFI_STATUS
AtapiTestUnitReady ( AtapiTestUnitReady (
IN IDE_BLK_IO_DEV *IdeDev, IN IDE_BLK_IO_DEV *IdeDev,
OUT UINTN *SenseCount OUT SENSE_RESULT *SResult
) )
{ {
ATAPI_PACKET_COMMAND Packet; ATAPI_PACKET_COMMAND Packet;
EFI_STATUS Status; EFI_STATUS Status;
UINTN SenseCount;
*SenseCount = 0;
// //
// fill command packet // fill command packet
@ -836,12 +835,12 @@ AtapiTestUnitReady (
return Status; return Status;
} }
Status = AtapiRequestSense (IdeDev, SenseCount); Status = AtapiRequestSense (IdeDev, &SenseCount);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
*SenseCount = 0;
return Status; return Status;
} }
ParseSenseData (IdeDev, SenseCount, SResult);
return EFI_SUCCESS; return EFI_SUCCESS;
} }
@ -964,7 +963,7 @@ AtapiRequestSense (
@param[in] *IdeDev Pointer pointing to IDE_BLK_IO_DEV data structure, used @param[in] *IdeDev Pointer pointing to IDE_BLK_IO_DEV data structure, used
to record all the information of the IDE device. to record all the information of the IDE device.
@param[in] SenseCount Sense count for this packet command @param[in] SResult Sense result for this packet command
@retval EFI_SUCCESS Read Capacity Command finally completes successfully. @retval EFI_SUCCESS Read Capacity Command finally completes successfully.
@retval EFI_DEVICE_ERROR Read Capacity Command failed because of device error. @retval EFI_DEVICE_ERROR Read Capacity Command failed because of device error.
@ -976,7 +975,7 @@ AtapiRequestSense (
EFI_STATUS EFI_STATUS
AtapiReadCapacity ( AtapiReadCapacity (
IN IDE_BLK_IO_DEV *IdeDev, IN IDE_BLK_IO_DEV *IdeDev,
OUT UINTN *SenseCount OUT SENSE_RESULT *SResult
) )
{ {
// //
@ -985,6 +984,7 @@ AtapiReadCapacity (
EFI_STATUS Status; EFI_STATUS Status;
EFI_STATUS SenseStatus; EFI_STATUS SenseStatus;
ATAPI_PACKET_COMMAND Packet; ATAPI_PACKET_COMMAND Packet;
UINTN SenseCount;
// //
// used for capacity data returned from ATAPI device // used for capacity data returned from ATAPI device
@ -992,8 +992,6 @@ AtapiReadCapacity (
ATAPI_READ_CAPACITY_DATA Data; ATAPI_READ_CAPACITY_DATA Data;
ATAPI_READ_FORMAT_CAPACITY_DATA FormatData; ATAPI_READ_FORMAT_CAPACITY_DATA FormatData;
*SenseCount = 0;
ZeroMem (&Data, sizeof (Data)); ZeroMem (&Data, sizeof (Data));
ZeroMem (&FormatData, sizeof (FormatData)); ZeroMem (&FormatData, sizeof (FormatData));
@ -1026,16 +1024,15 @@ AtapiReadCapacity (
} }
if (Status == EFI_TIMEOUT) { if (Status == EFI_TIMEOUT) {
*SenseCount = 0;
return Status; return Status;
} }
SenseStatus = AtapiRequestSense (IdeDev, SenseCount); SenseStatus = AtapiRequestSense (IdeDev, &SenseCount);
if (!EFI_ERROR (SenseStatus)) { if (!EFI_ERROR (SenseStatus)) {
ParseSenseData (IdeDev, SenseCount, SResult);
if (!EFI_ERROR (Status)) {
if (!EFI_ERROR (Status) && *SResult == SenseNoSenseKey) {
if (IdeDev->Type == IdeCdRom) { if (IdeDev->Type == IdeCdRom) {
IdeDev->BlkIo.Media->LastBlock = (Data.LastLba3 << 24) | IdeDev->BlkIo.Media->LastBlock = (Data.LastLba3 << 24) |
@ -1043,18 +1040,7 @@ AtapiReadCapacity (
(Data.LastLba1 << 8) | (Data.LastLba1 << 8) |
Data.LastLba0; Data.LastLba0;
if (IdeDev->BlkIo.Media->LastBlock != 0) { IdeDev->BlkIo.Media->MediaPresent = TRUE;
IdeDev->BlkIo.Media->BlockSize = (Data.BlockSize3 << 24) |
(Data.BlockSize2 << 16) |
(Data.BlockSize1 << 8) |
Data.BlockSize0;
IdeDev->BlkIo.Media->MediaPresent = TRUE;
} else {
IdeDev->BlkIo.Media->MediaPresent = FALSE;
return EFI_DEVICE_ERROR;
}
IdeDev->BlkIo.Media->ReadOnly = TRUE; IdeDev->BlkIo.Media->ReadOnly = TRUE;
@ -1101,7 +1087,6 @@ AtapiReadCapacity (
return EFI_SUCCESS; return EFI_SUCCESS;
} else { } else {
*SenseCount = 0;
return EFI_DEVICE_ERROR; return EFI_DEVICE_ERROR;
} }
} }
@ -1145,7 +1130,6 @@ AtapiDetectMedia (
EFI_BLOCK_IO_MEDIA OldMediaInfo; EFI_BLOCK_IO_MEDIA OldMediaInfo;
UINTN RetryTimes; UINTN RetryTimes;
UINTN RetryNotReady; UINTN RetryNotReady;
UINTN SenseCount;
SENSE_RESULT SResult; SENSE_RESULT SResult;
BOOLEAN WriteProtected; BOOLEAN WriteProtected;
@ -1168,7 +1152,7 @@ AtapiDetectMedia (
RetryTimes = 5; RetryTimes = 5;
while (RetryTimes != 0) { while (RetryTimes != 0) {
Status = AtapiTestUnitReady (IdeDev, &SenseCount); Status = AtapiTestUnitReady (IdeDev, &SResult);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
// //
@ -1189,9 +1173,6 @@ AtapiDetectMedia (
// //
continue; continue;
} else { } else {
ParseSenseData (IdeDev, SenseCount, &SResult);
switch (SResult) { switch (SResult) {
case SenseNoSenseKey: case SenseNoSenseKey:
if (IdeDev->BlkIo.Media->MediaPresent) { if (IdeDev->BlkIo.Media->MediaPresent) {
@ -1245,15 +1226,12 @@ AtapiDetectMedia (
while (RetryTimes != 0) { while (RetryTimes != 0) {
Status = AtapiReadCapacity (IdeDev, &SenseCount); Status = AtapiReadCapacity (IdeDev, &SResult);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
RetryTimes--; RetryTimes--;
continue; continue;
} else { } else {
ParseSenseData (IdeDev, SenseCount, &SResult);
switch (SResult) { switch (SResult) {
case SenseNoSenseKey: case SenseNoSenseKey:
goto Done; goto Done;

View File

@ -683,7 +683,7 @@ PioReadWriteData (
EFI_STATUS EFI_STATUS
AtapiTestUnitReady ( AtapiTestUnitReady (
IN IDE_BLK_IO_DEV *IdeDev, IN IDE_BLK_IO_DEV *IdeDev,
OUT UINTN *SenseCount OUT SENSE_RESULT *SResult
) )
; ;
@ -715,7 +715,7 @@ AtapiRequestSense (
EFI_STATUS EFI_STATUS
AtapiReadCapacity ( AtapiReadCapacity (
IN IDE_BLK_IO_DEV *IdeDev, IN IDE_BLK_IO_DEV *IdeDev,
OUT UINTN *SenseCount OUT SENSE_RESULT *SResult
) )
; ;