{
ULONG i;
UCHAR Status;
- for (i=0; i<20000; i++) {
+ for (i=0; i<200; i++) {
GetStatus(chan, Status);
if (Status & IDE_STATUS_BUSY) {
- AtapiStallExecution(150);
+ AtapiStallExecution(10);
continue;
} else {
break;
{
ULONG i;
UCHAR Status;
- for (i=0; i<20000; i++) {
+ for (i=0; i<200; i++) {
GetBaseStatus(chan, Status);
if (Status & IDE_STATUS_BUSY) {
- AtapiStallExecution(150);
+ AtapiStallExecution(10);
continue;
} else {
break;
for (i=0; i<1000; i++) {
GetStatus(chan, Status);
if (Status & IDE_STATUS_BUSY) {
- AtapiStallExecution(100);
+ AtapiStallExecution(10);
} else if (Status & IDE_STATUS_DRQ) {
break;
} else {
- AtapiStallExecution(200);
+ AtapiStallExecution(10);
}
}
return Status;
for (i=0; i<2; i++) {
GetStatus(chan, Status);
if (Status & IDE_STATUS_BUSY) {
- AtapiStallExecution(100);
+ AtapiStallExecution(10);
} else if (Status & IDE_STATUS_DRQ) {
break;
} else {
- AtapiStallExecution(100);
+ AtapiStallExecution(10);
}
}
return Status;
)
{
//ULONG c = chan->lChannel;
- ULONG i;
+ ULONG i = 30 * 1000;
UCHAR dma_status = 0;
KdPrint2((PRINT_PREFIX "AtapiSoftReset:\n"));
UCHAR statusByte2;
SelectDrive(chan, DeviceNumber);
AtapiStallExecution(10000);
AtapiWritePort1(chan, IDX_IO1_o_Command, IDE_COMMAND_ATAPI_RESET);
- for (i = 0; i < 1000; i++) {
- AtapiStallExecution(999);
+
+ // ReactOS modification: Already stop looping when we know that the drive has finished resetting.
+ // Not all controllers clear the IDE_STATUS_BUSY flag (e.g. not the VMware one), so ensure that
+ // the maximum waiting time (30 * i = 0.9 seconds) does not exceed the one of the original
+ // implementation. (which is around 1 second)
+ while ((AtapiReadPort1(chan, IDX_IO1_i_Status) & IDE_STATUS_BUSY) &&
+ i--)
+ {
+ AtapiStallExecution(30);
}
+
SelectDrive(chan, DeviceNumber);
WaitOnBusy(chan);
GetBaseStatus(chan, statusByte2);