From 3cc033c51f62983cb13901bfd24a74f7aa241a24 Mon Sep 17 00:00:00 2001 From: Feng Tian Date: Mon, 5 Aug 2013 01:50:11 +0000 Subject: [PATCH] MdeMdeModulePkg/Scsi: Enlarge SCSI cmd timeout to a more reasonable experience value to cover more devices Signed-off-by: Feng Tian Reviewed-by: Elvin Li git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14521 6f19259b-4bc3-4df7-8a09-765794883524 --- MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.c | 4 +-- MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.h | 7 ++++- MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.c | 28 ++++++++++++-------- MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.h | 6 ++++- 4 files changed, 30 insertions(+), 15 deletions(-) diff --git a/MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.c b/MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.c index a0833cfaf4..3e49ffba68 100644 --- a/MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.c +++ b/MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.c @@ -2,7 +2,7 @@ SCSI Bus driver that layers on every SCSI Pass Thru and Extended SCSI Pass Thru protocol in the system. -Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.
+Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -1293,7 +1293,7 @@ DiscoverScsiDevice ( for (Index = 0; Index < MaxRetry; Index++) { Status = ScsiInquiryCommand ( &ScsiIoDevice->ScsiIo, - EFI_TIMER_PERIOD_SECONDS (1), + SCSI_BUS_TIMEOUT, NULL, &SenseDataLength, &HostAdapterStatus, diff --git a/MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.h b/MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.h index ed90a6d458..babf86f2c3 100644 --- a/MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.h +++ b/MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.h @@ -1,7 +1,7 @@ /** @file Header file for SCSI Bus Driver. -Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.
+Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -60,6 +60,11 @@ typedef struct { // #define SCSI_BUS_DEVICE_SIGNATURE SIGNATURE_32 ('s', 'c', 's', 'i') +// +// SCSI Bus Timeout Experience Value +// +#define SCSI_BUS_TIMEOUT EFI_TIMER_PERIOD_SECONDS (3) + // // The ScsiBusProtocol is just used to locate ScsiBusDev // structure in the SCSIBusDriverBindingStop(). Then we can diff --git a/MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.c b/MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.c index c6d96caeb8..223dd4c475 100644 --- a/MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.c +++ b/MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.c @@ -1,7 +1,7 @@ /** @file SCSI disk driver that layers on every SCSI IO protocol in the system. -Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.
+Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -957,7 +957,7 @@ ScsiDiskInquiryDevice ( Status = ScsiInquiryCommand ( ScsiDiskDevice->ScsiIo, - EFI_TIMER_PERIOD_SECONDS (1), + SCSI_DISK_TIMEOUT, NULL, &SenseDataLength, &HostAdapterStatus, @@ -986,7 +986,7 @@ ScsiDiskInquiryDevice ( SenseDataLength = 0; Status = ScsiInquiryCommandEx ( ScsiDiskDevice->ScsiIo, - EFI_TIMER_PERIOD_SECONDS (1), + SCSI_DISK_TIMEOUT, NULL, &SenseDataLength, &HostAdapterStatus, @@ -1020,7 +1020,7 @@ ScsiDiskInquiryDevice ( SenseDataLength = 0; Status = ScsiInquiryCommandEx ( ScsiDiskDevice->ScsiIo, - EFI_TIMER_PERIOD_SECONDS (1), + SCSI_DISK_TIMEOUT, NULL, &SenseDataLength, &HostAdapterStatus, @@ -1157,7 +1157,7 @@ ScsiDiskTestUnitReady ( // Status = ScsiTestUnitReadyCommand ( ScsiDiskDevice->ScsiIo, - EFI_TIMER_PERIOD_SECONDS (1), + SCSI_DISK_TIMEOUT, NULL, &SenseDataLength, &HostAdapterStatus, @@ -1376,7 +1376,7 @@ ScsiDiskReadCapacity ( // CommandStatus = ScsiReadCapacityCommand ( ScsiDiskDevice->ScsiIo, - EFI_TIMER_PERIOD_SECONDS(1), + SCSI_DISK_TIMEOUT, NULL, &SenseDataLength, &HostAdapterStatus, @@ -1399,7 +1399,7 @@ ScsiDiskReadCapacity ( // CommandStatus = ScsiReadCapacity16Command ( ScsiDiskDevice->ScsiIo, - EFI_TIMER_PERIOD_SECONDS (1), + SCSI_DISK_TIMEOUT, NULL, &SenseDataLength, &HostAdapterStatus, @@ -1623,7 +1623,7 @@ ScsiDiskRequestSenseKeys ( for (SenseReq = TRUE; SenseReq;) { Status = ScsiRequestSenseCommand ( ScsiDiskDevice->ScsiIo, - EFI_TIMER_PERIOD_SECONDS (2), + SCSI_DISK_TIMEOUT, PtrSenseData, &SenseDataLength, &HostAdapterStatus, @@ -1843,8 +1843,11 @@ ScsiDiskReadSectors ( // As ScsiDisk and ScsiBus driver are used to manage SCSI or ATAPI devices, we have to use // the lowest transfer rate to calculate the possible maximum timeout value for each operation. // From the above table, we could know 2.1Mbytes per second is lowest one. + // The timout value is rounded up to nearest integar and here an additional 30s is added + // to follow ATA spec in which it mentioned that the device may take up to 30s to respond + // commands in the Standby/Idle mode. // - Timeout = EFI_TIMER_PERIOD_SECONDS (ByteCount / 2100000 + 1); + Timeout = EFI_TIMER_PERIOD_SECONDS (ByteCount / 2100000 + 31); MaxRetry = 2; for (Index = 0; Index < MaxRetry; Index++) { @@ -1994,8 +1997,11 @@ ScsiDiskWriteSectors ( // As ScsiDisk and ScsiBus driver are used to manage SCSI or ATAPI devices, we have to use // the lowest transfer rate to calculate the possible maximum timeout value for each operation. // From the above table, we could know 2.1Mbytes per second is lowest one. + // The timout value is rounded up to nearest integar and here an additional 30s is added + // to follow ATA spec in which it mentioned that the device may take up to 30s to respond + // commands in the Standby/Idle mode. // - Timeout = EFI_TIMER_PERIOD_SECONDS (ByteCount / 2100000 + 1); + Timeout = EFI_TIMER_PERIOD_SECONDS (ByteCount / 2100000 + 31); MaxRetry = 2; for (Index = 0; Index < MaxRetry; Index++) { if (!ScsiDiskDevice->Cdb16Byte) { @@ -2925,7 +2931,7 @@ AtapiIdentifyDevice ( ZeroMem (Cdb, sizeof (Cdb)); Cdb[0] = ATA_CMD_IDENTIFY_DEVICE; - CommandPacket.Timeout = EFI_TIMER_PERIOD_SECONDS (1); + CommandPacket.Timeout = SCSI_DISK_TIMEOUT; CommandPacket.Cdb = Cdb; CommandPacket.CdbLength = (UINT8) sizeof (Cdb); CommandPacket.InDataBuffer = &ScsiDiskDevice->IdentifyData; diff --git a/MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.h b/MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.h index fc966b36a4..21dcbd32d4 100644 --- a/MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.h +++ b/MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.h @@ -1,7 +1,7 @@ /** @file Header file for SCSI Disk Driver. -Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.
+Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -98,6 +98,10 @@ extern EFI_COMPONENT_NAME2_PROTOCOL gScsiDiskComponentName2; #define SCSI_COMMAND_VERSION_2 0x02 #define SCSI_COMMAND_VERSION_3 0x03 +// +// SCSI Disk Timeout Experience Value +// +#define SCSI_DISK_TIMEOUT EFI_TIMER_PERIOD_SECONDS (3) /** Test to see if this driver supports ControllerHandle.