UINT8 Index;\r
UINT8 MaxRetry;\r
BOOLEAN NeedRetry;\r
+ BOOLEAN MustReadCapacity;\r
+\r
+ MustReadCapacity = TRUE;\r
\r
ScsiDiskDevice = (SCSI_DISK_DEV *) AllocateZeroPool (sizeof (SCSI_DISK_DEV));\r
if (ScsiDiskDevice == NULL) {\r
switch (ScsiDiskDevice->DeviceType) {\r
case EFI_SCSI_TYPE_DISK:\r
ScsiDiskDevice->BlkIo.Media->BlockSize = 0x200;\r
+ MustReadCapacity = TRUE;\r
break;\r
\r
case EFI_SCSI_TYPE_CDROM:\r
ScsiDiskDevice->BlkIo.Media->BlockSize = 0x800;\r
+ MustReadCapacity = FALSE;\r
break;\r
}\r
//\r
// The second parameter "TRUE" means must\r
// retrieve media capacity\r
//\r
- Status = ScsiDiskDetectMedia (ScsiDiskDevice, TRUE, &Temp);\r
+ Status = ScsiDiskDetectMedia (ScsiDiskDevice, MustReadCapacity, &Temp);\r
if (!EFI_ERROR (Status)) {\r
//\r
// Determine if Block IO should be produced on this controller handle\r
CopyMem (&OldMedia, ScsiDiskDevice->BlkIo.Media, sizeof (OldMedia));\r
*MediaChange = FALSE;\r
MaxRetry = 3;\r
+ Action = ACTION_NO_ACTION;\r
\r
for (Index = 0; Index < MaxRetry; Index++) {\r
Status = ScsiDiskTestUnitReady (\r
&NumberOfSenseKeys\r
);\r
if (!EFI_ERROR (Status)) {\r
- break;\r
+ Status = DetectMediaParsingSenseKeys (\r
+ ScsiDiskDevice,\r
+ SenseData,\r
+ NumberOfSenseKeys,\r
+ &Action\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ } else if (Action == ACTION_RETRY_COMMAND_LATER) {\r
+ continue;\r
+ } else {\r
+ break;\r
+ }\r
}\r
\r
if (!NeedRetry) {\r
return EFI_DEVICE_ERROR;\r
}\r
\r
- Status = DetectMediaParsingSenseKeys (\r
- ScsiDiskDevice,\r
- SenseData,\r
- NumberOfSenseKeys,\r
- &Action\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
//\r
// ACTION_NO_ACTION: need not read capacity\r
// other action code: need read capacity\r
//\r
- if (Action == ACTION_NO_ACTION) {\r
- NeedReadCapacity = FALSE;\r
- } else {\r
+ if (Action == ACTION_READ_CAPACITY) {\r
NeedReadCapacity = TRUE;\r
}\r
\r
return EFI_SUCCESS;\r
}\r
\r
+ if (ScsiDiskIsResetBefore (SenseData, NumberOfSenseKeys)) {\r
+ *Action = ACTION_RETRY_COMMAND_LATER;\r
+ return EFI_SUCCESS;\r
+ }\r
+\r
if (ScsiDiskIsMediaError (SenseData, NumberOfSenseKeys)) {\r
ScsiDiskDevice->BlkIo.Media->MediaPresent = FALSE;\r
ScsiDiskDevice->BlkIo.Media->LastBlock = 0;\r