diff --git a/src/add-ons/kernel/bus_managers/ata/ATAChannel.cpp b/src/add-ons/kernel/bus_managers/ata/ATAChannel.cpp index 83667d63d8..463f5cc165 100644 --- a/src/add-ons/kernel/bus_managers/ata/ATAChannel.cpp +++ b/src/add-ons/kernel/bus_managers/ata/ATAChannel.cpp @@ -405,6 +405,9 @@ ATAChannel::Reset() _FlushAndWait(150 * 1000); + // read status to clear any pending interrupts + _Status(); + return B_OK; } @@ -564,7 +567,8 @@ ATAChannel::WaitForInterrupt(bigtime_t timeout) status_t ATAChannel::RecoverLostInterrupt() { - uint8 status = AltStatus(); + // read status to clear any pending interrupts + uint8 status = _Status(); if (status & (ATA_STATUS_BUSY | ATA_STATUS_DATA_REQUEST)) { TRACE_ERROR("RecoverLostInterrupt: device busy, status 0x%02x\n", status); return B_ERROR; @@ -828,6 +832,15 @@ ATAChannel::_WriteRegs(ata_task_file *taskFile, ata_reg_mask mask) return fController->write_command_block_regs(fCookie, taskFile, mask); } +uint8 +ATAChannel::_Status() +{ + ata_task_file taskFile; + if (_ReadRegs(&taskFile, ATA_MASK_STATUS) != B_OK) + return 0x01; + return taskFile.read.status; +} + status_t ATAChannel::_WriteControl(uint8 value) diff --git a/src/add-ons/kernel/bus_managers/ata/ATAPrivate.h b/src/add-ons/kernel/bus_managers/ata/ATAPrivate.h index ad27f347be..1ecc02e313 100644 --- a/src/add-ons/kernel/bus_managers/ata/ATAPrivate.h +++ b/src/add-ons/kernel/bus_managers/ata/ATAPrivate.h @@ -120,6 +120,7 @@ private: status_t _WriteRegs(ata_task_file *taskFile, ata_reg_mask mask); status_t _WriteControl(uint8 value); + uint8 _Status(); void _FlushAndWait(bigtime_t waitTime);