Revision: 14428
          http://sourceforge.net/p/edk2/code/14428
Author:   erictian
Date:     2013-06-18 03:36:11 +0000 (Tue, 18 Jun 2013)
Log Message:
-----------
MdeModulePkg/AtaBus: wait up to 30s for ATA cmd response in Standby/Idle mode 
to follow ATA spec

Signed-off-by: Feng Tian <[email protected]>
Reviewed-by: Star Zeng <[email protected]>

Modified Paths:
--------------
    trunk/edk2/MdeModulePkg/Bus/Ata/AtaBusDxe/AtaPassThruExecute.c

Modified: trunk/edk2/MdeModulePkg/Bus/Ata/AtaBusDxe/AtaPassThruExecute.c
===================================================================
--- trunk/edk2/MdeModulePkg/Bus/Ata/AtaBusDxe/AtaPassThruExecute.c      
2013-06-17 09:58:18 UTC (rev 14427)
+++ trunk/edk2/MdeModulePkg/Bus/Ata/AtaBusDxe/AtaPassThruExecute.c      
2013-06-18 03:36:11 UTC (rev 14428)
@@ -10,7 +10,7 @@
   for Security Protocol Specific layout. This implementation uses big endian 
for
   Cylinder register.
 
-  Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR>
+  Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved.<BR>
   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
@@ -541,19 +541,21 @@
   //
   // As AtaBus is used to manage ATA devices, we have to use the lowest 
transfer rate to
   // calculate the possible maximum timeout value for each read/write 
operation.
+  // 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.
   //
   if (AtaDevice->UdmaValid) {
     //
     // Calculate the maximum timeout value for DMA read/write operation.
     //
-    Packet->Timeout  = EFI_TIMER_PERIOD_SECONDS ((TransferLength * 
AtaDevice->BlockMedia.BlockSize) / 2100000 + 1);
+    Packet->Timeout  = EFI_TIMER_PERIOD_SECONDS (DivU64x32 (MultU64x32 
(TransferLength, AtaDevice->BlockMedia.BlockSize), 2100000) + 31);
   } else {
     //
     // Calculate the maximum timeout value for PIO read/write operation
     //
-    Packet->Timeout  = EFI_TIMER_PERIOD_SECONDS ((TransferLength * 
AtaDevice->BlockMedia.BlockSize) / 3300000 + 1);
+    Packet->Timeout  = EFI_TIMER_PERIOD_SECONDS (DivU64x32 (MultU64x32 
(TransferLength, AtaDevice->BlockMedia.BlockSize), 3300000) + 31);
   }
-  
 
   return AtaDevicePassThru (AtaDevice, TaskPacket, Event);
 }

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:

Build for Windows Store.

http://p.sf.net/sfu/windows-dev2dev
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to