[haiku-commits] r33626 - haiku/trunk/src/add-ons/kernel/bus_managers/ata

  • From: marcusoverhagen@xxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sat, 17 Oct 2009 22:19:02 +0200 (CEST)

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;
        }
 


Other related posts:

  • » [haiku-commits] r33626 - haiku/trunk/src/add-ons/kernel/bus_managers/ata - marcusoverhagen