interrupt debugging instrumentation for bug hunting.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33010 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -23,6 +23,15 @@
|
|||||||
|
|
||||||
#define TRACE dprintf
|
#define TRACE dprintf
|
||||||
|
|
||||||
|
#define INTERRUPT_TRACING 0
|
||||||
|
#if INTERRUPT_TRACING
|
||||||
|
#include <tracing.h>
|
||||||
|
#define TRACE_INT(a...) ktrace_printf(a)
|
||||||
|
#else
|
||||||
|
#define TRACE_INT(a...)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static ata_for_controller_interface *sATA;
|
static ata_for_controller_interface *sATA;
|
||||||
static device_manager_info *sDeviceManager;
|
static device_manager_info *sDeviceManager;
|
||||||
|
|
||||||
@@ -184,9 +193,12 @@ ata_adapter_inthand(void *arg)
|
|||||||
pci_device *device = channel->device;
|
pci_device *device = channel->device;
|
||||||
uint8 statusATA, statusBM;
|
uint8 statusATA, statusBM;
|
||||||
|
|
||||||
|
TRACE_INT("ata_adapter_inthand\n");
|
||||||
|
|
||||||
if (!channel->dmaing) {
|
if (!channel->dmaing) {
|
||||||
// this could be a spurious interrupt, so read status
|
// this could be a spurious interrupt, so read status
|
||||||
// register unconditionally to acknowledge those
|
// register unconditionally to acknowledge those
|
||||||
|
TRACE_INT("ata_adapter_inthand: not DMA\n");
|
||||||
pci->read_io_8(device, channel->command_block_base + 7);
|
pci->read_io_8(device, channel->command_block_base + 7);
|
||||||
return B_UNHANDLED_INTERRUPT;
|
return B_UNHANDLED_INTERRUPT;
|
||||||
}
|
}
|
||||||
@@ -195,11 +207,13 @@ ata_adapter_inthand(void *arg)
|
|||||||
// will clear the interrupt status bit once ATA status is read
|
// will clear the interrupt status bit once ATA status is read
|
||||||
statusBM = pci->read_io_8(device, channel->bus_master_base
|
statusBM = pci->read_io_8(device, channel->bus_master_base
|
||||||
+ ATA_BM_STATUS_REG);
|
+ ATA_BM_STATUS_REG);
|
||||||
|
TRACE_INT("ata_adapter_inthand: BM-status 0x%02x\n", statusBM);
|
||||||
|
|
||||||
// test if the interrupt was really generated by our controller
|
// test if the interrupt was really generated by our controller
|
||||||
if (statusBM & ATA_BM_STATUS_INTERRUPT) {
|
if (statusBM & ATA_BM_STATUS_INTERRUPT) {
|
||||||
// read ATA status register to acknowledge interrupt
|
// read ATA status register to acknowledge interrupt
|
||||||
statusATA = pci->read_io_8(device, channel->command_block_base + 7);
|
statusATA = pci->read_io_8(device, channel->command_block_base + 7);
|
||||||
|
TRACE_INT("ata_adapter_inthand: ATA-status 0x%02x\n", statusATA);
|
||||||
|
|
||||||
// clear pending PCI bus master DMA interrupt, for those
|
// clear pending PCI bus master DMA interrupt, for those
|
||||||
// controllers who don't clear it themselves
|
// controllers who don't clear it themselves
|
||||||
@@ -209,6 +223,7 @@ ata_adapter_inthand(void *arg)
|
|||||||
// signal interrupt to ATA stack
|
// signal interrupt to ATA stack
|
||||||
return sATA->interrupt_handler(channel->ataChannel, statusATA);
|
return sATA->interrupt_handler(channel->ataChannel, statusATA);
|
||||||
} else {
|
} else {
|
||||||
|
TRACE_INT("ata_adapter_inthand: not BM\n");
|
||||||
return B_UNHANDLED_INTERRUPT;
|
return B_UNHANDLED_INTERRUPT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user