\r
Packet->Protocol = mAtaPassThruCmdProtocols[AtaDevice->UdmaValid][IsWrite];\r
Packet->Length = EFI_ATA_PASS_THRU_LENGTH_SECTOR_COUNT;\r
- Packet->Timeout = ATA_TIMEOUT;\r
+ //\r
+ // |------------------------|-----------------|------------------------|-----------------|\r
+ // | ATA PIO Transfer Mode | Transfer Rate | ATA DMA Transfer Mode | Transfer Rate |\r
+ // |------------------------|-----------------|------------------------|-----------------|\r
+ // | PIO Mode 0 | 3.3Mbytes/sec | Single-word DMA Mode 0 | 2.1Mbytes/sec |\r
+ // |------------------------|-----------------|------------------------|-----------------|\r
+ // | PIO Mode 1 | 5.2Mbytes/sec | Single-word DMA Mode 1 | 4.2Mbytes/sec |\r
+ // |------------------------|-----------------|------------------------|-----------------|\r
+ // | PIO Mode 2 | 8.3Mbytes/sec | Single-word DMA Mode 2 | 8.4Mbytes/sec |\r
+ // |------------------------|-----------------|------------------------|-----------------|\r
+ // | PIO Mode 3 | 11.1Mbytes/sec | Multi-word DMA Mode 0 | 4.2Mbytes/sec |\r
+ // |------------------------|-----------------|------------------------|-----------------|\r
+ // | PIO Mode 4 | 16.6Mbytes/sec | Multi-word DMA Mode 1 | 13.3Mbytes/sec |\r
+ // |------------------------|-----------------|------------------------|-----------------|\r
+ //\r
+ // As AtaBus is used to manage ATA devices, we have to use the lowest transfer rate to\r
+ // calculate the possible maximum timeout value for each read/write operation.\r
+ //\r
+ if (AtaDevice->UdmaValid) {\r
+ //\r
+ // Calculate the maximum timeout value for DMA read/write operation.\r
+ //\r
+ Packet->Timeout = EFI_TIMER_PERIOD_SECONDS ((TransferLength * AtaDevice->BlockMedia.BlockSize) / 2100000 + 1);\r
+ } else {\r
+ //\r
+ // Calculate the maximum timeout value for PIO read/write operation\r
+ //\r
+ Packet->Timeout = EFI_TIMER_PERIOD_SECONDS ((TransferLength * AtaDevice->BlockMedia.BlockSize) / 3300000 + 1);\r
+ }\r
+ \r
\r
return AtaDevicePassThru (AtaDevice, TaskPacket, Event);\r
}\r
}\r
\r
ByteCount = SectorCount * BlockSize;\r
- Timeout = EFI_TIMER_PERIOD_SECONDS (2);\r
+ //\r
+ // |------------------------|-----------------|------------------|-----------------|\r
+ // | ATA Transfer Mode | Transfer Rate | SCSI Interface | Transfer Rate |\r
+ // |------------------------|-----------------|------------------|-----------------|\r
+ // | PIO Mode 0 | 3.3Mbytes/sec | SCSI-1 | 5Mbytes/sec |\r
+ // |------------------------|-----------------|------------------|-----------------|\r
+ // | PIO Mode 1 | 5.2Mbytes/sec | Fast SCSI | 10Mbytes/sec |\r
+ // |------------------------|-----------------|------------------|-----------------|\r
+ // | PIO Mode 2 | 8.3Mbytes/sec | Fast-Wide SCSI | 20Mbytes/sec |\r
+ // |------------------------|-----------------|------------------|-----------------|\r
+ // | PIO Mode 3 | 11.1Mbytes/sec | Ultra SCSI | 20Mbytes/sec |\r
+ // |------------------------|-----------------|------------------|-----------------|\r
+ // | PIO Mode 4 | 16.6Mbytes/sec | Ultra Wide SCSI | 40Mbytes/sec |\r
+ // |------------------------|-----------------|------------------|-----------------|\r
+ // | Single-word DMA Mode 0 | 2.1Mbytes/sec | Ultra2 SCSI | 40Mbytes/sec |\r
+ // |------------------------|-----------------|------------------|-----------------|\r
+ // | Single-word DMA Mode 1 | 4.2Mbytes/sec | Ultra2 Wide SCSI | 80Mbytes/sec |\r
+ // |------------------------|-----------------|------------------|-----------------|\r
+ // | Single-word DMA Mode 2 | 8.4Mbytes/sec | Ultra3 SCSI | 160Mbytes/sec |\r
+ // |------------------------|-----------------|------------------|-----------------|\r
+ // | Multi-word DMA Mode 0 | 4.2Mbytes/sec | Ultra-320 SCSI | 320Mbytes/sec |\r
+ // |------------------------|-----------------|------------------|-----------------|\r
+ // | Multi-word DMA Mode 1 | 13.3Mbytes/sec | Ultra-640 SCSI | 640Mbytes/sec |\r
+ // |------------------------|-----------------|------------------|-----------------|\r
+ //\r
+ // As ScsiDisk and ScsiBus driver are used to manage SCSI or ATAPI devices, we have to use\r
+ // the lowest transfer rate to calculate the possible maximum timeout value for each operation.\r
+ // From the above table, we could know 2.1Mbytes per second is lowest one.\r
+ //\r
+ Timeout = EFI_TIMER_PERIOD_SECONDS (ByteCount / 2100000 + 1);\r
\r
MaxRetry = 2;\r
for (Index = 0; Index < MaxRetry; Index++) {\r
}\r
\r
ByteCount = SectorCount * BlockSize;\r
- Timeout = EFI_TIMER_PERIOD_SECONDS (2);\r
+ //\r
+ // |------------------------|-----------------|------------------|-----------------|\r
+ // | ATA Transfer Mode | Transfer Rate | SCSI Interface | Transfer Rate |\r
+ // |------------------------|-----------------|------------------|-----------------|\r
+ // | PIO Mode 0 | 3.3Mbytes/sec | SCSI-1 | 5Mbytes/sec |\r
+ // |------------------------|-----------------|------------------|-----------------|\r
+ // | PIO Mode 1 | 5.2Mbytes/sec | Fast SCSI | 10Mbytes/sec |\r
+ // |------------------------|-----------------|------------------|-----------------|\r
+ // | PIO Mode 2 | 8.3Mbytes/sec | Fast-Wide SCSI | 20Mbytes/sec |\r
+ // |------------------------|-----------------|------------------|-----------------|\r
+ // | PIO Mode 3 | 11.1Mbytes/sec | Ultra SCSI | 20Mbytes/sec |\r
+ // |------------------------|-----------------|------------------|-----------------|\r
+ // | PIO Mode 4 | 16.6Mbytes/sec | Ultra Wide SCSI | 40Mbytes/sec |\r
+ // |------------------------|-----------------|------------------|-----------------|\r
+ // | Single-word DMA Mode 0 | 2.1Mbytes/sec | Ultra2 SCSI | 40Mbytes/sec |\r
+ // |------------------------|-----------------|------------------|-----------------|\r
+ // | Single-word DMA Mode 1 | 4.2Mbytes/sec | Ultra2 Wide SCSI | 80Mbytes/sec |\r
+ // |------------------------|-----------------|------------------|-----------------|\r
+ // | Single-word DMA Mode 2 | 8.4Mbytes/sec | Ultra3 SCSI | 160Mbytes/sec |\r
+ // |------------------------|-----------------|------------------|-----------------|\r
+ // | Multi-word DMA Mode 0 | 4.2Mbytes/sec | Ultra-320 SCSI | 320Mbytes/sec |\r
+ // |------------------------|-----------------|------------------|-----------------|\r
+ // | Multi-word DMA Mode 1 | 13.3Mbytes/sec | Ultra-640 SCSI | 640Mbytes/sec |\r
+ // |------------------------|-----------------|------------------|-----------------|\r
+ //\r
+ // As ScsiDisk and ScsiBus driver are used to manage SCSI or ATAPI devices, we have to use\r
+ // the lowest transfer rate to calculate the possible maximum timeout value for each operation.\r
+ // From the above table, we could know 2.1Mbytes per second is lowest one.\r
+ //\r
+ Timeout = EFI_TIMER_PERIOD_SECONDS (ByteCount / 2100000 + 1);\r
MaxRetry = 2;\r
for (Index = 0; Index < MaxRetry; Index++) {\r
if (!ScsiDiskDevice->Cdb16Byte) {\r