Author: marcusoverhagen Date: 2009-10-17 22:19:02 +0200 (Sat, 17 Oct 2009) New Revision: 33626 Changeset: http://dev.haiku-os.org/changeset/33626/haiku Modified: haiku/trunk/src/add-ons/kernel/bus_managers/ata/ATAChannel.cpp Log: Fix for ticket #4543. This fixes the ATA timeout waiting for interrupt / device busy / status 0x58 Modified: haiku/trunk/src/add-ons/kernel/bus_managers/ata/ATAChannel.cpp =================================================================== --- haiku/trunk/src/add-ons/kernel/bus_managers/ata/ATAChannel.cpp 2009-10-17 19:28:00 UTC (rev 33625) +++ haiku/trunk/src/add-ons/kernel/bus_managers/ata/ATAChannel.cpp 2009-10-17 20:19:02 UTC (rev 33626) @@ -531,9 +531,6 @@ InterruptsSpinLocker locker(fInterruptLock); fExpectsInterrupt = true; fInterruptCondition.Add(&fInterruptConditionEntry); - - // enable interrupts - _WriteControl(0); } @@ -590,15 +587,20 @@ TRACE("SendRequest status 0x%02x\n", AltStatus()); + if (request->UseDMA()) + _WriteControl(0); // enable interrupts + if (device->Select() != B_OK) { TRACE_ERROR("device selection failed\n"); request->SetStatus(SCSI_SEL_TIMEOUT); + _WriteControl(ATA_DEVICE_CONTROL_DISABLE_INTS); return B_TIMED_OUT; } if (WaitForIdle() != B_OK) { TRACE_ERROR("device selection timeout\n"); request->SetStatus(SCSI_SEL_TIMEOUT); + _WriteControl(ATA_DEVICE_CONTROL_DISABLE_INTS); return B_TIMED_OUT; } @@ -606,6 +608,7 @@ && (AltStatus() & ATA_STATUS_DEVICE_READY) == 0) { TRACE_ERROR("device ready not set\n"); request->SetStatus(SCSI_SEQUENCE_FAIL); + _WriteControl(ATA_DEVICE_CONTROL_DISABLE_INTS); return B_ERROR; } @@ -613,6 +616,7 @@ | ATA_MASK_COMMAND) != B_OK) { TRACE_ERROR("can't write command\n"); request->SetStatus(SCSI_HBA_ERR); + _WriteControl(ATA_DEVICE_CONTROL_DISABLE_INTS); return B_ERROR; }