Use a bool to check if an irq was acknowledged by the MFP, else we don't call the handler.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26725 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
François Revol 2008-08-02 00:36:33 +00:00
parent 150b5ae01f
commit 2fc21d4fad
3 changed files with 13 additions and 9 deletions

View File

@ -44,7 +44,7 @@ public:
virtual void EnableIOInterrupt(int irq) = 0;
virtual void DisableIOInterrupt(int irq) = 0;
virtual void AcknowledgeIOInterrupt(int irq) = 0;
virtual bool AcknowledgeIOInterrupt(int irq) = 0;
virtual void SetHardwareRTC(uint32 seconds) = 0;
virtual uint32 GetHardwareRTC() = 0;

View File

@ -272,9 +272,10 @@ dprintf("handling I/O interrupts done\n");
default:
// vectors >= 64 are user defined vectors, used for IRQ
if (vector >= 64) {
M68KPlatform::Default()->AcknowledgeIOInterrupt(vector);
ret = int_io_interrupt_handler(vector, true);
break;
if (M68KPlatform::Default()->AcknowledgeIOInterrupt(vector)) {
ret = int_io_interrupt_handler(vector, true);
break;
}
}
dprintf("unhandled exception type 0x%x\n", vector);
print_iframe(iframe);

View File

@ -47,7 +47,7 @@ public:
void EnableIOInterrupt(int irq);
void DisableIOInterrupt(int irq);
void AcknowledgeIOInterrupt(int irq);
bool AcknowledgeIOInterrupt(int irq);
private:
uint32 fBase;
@ -70,7 +70,7 @@ public:
virtual void EnableIOInterrupt(int irq);
virtual void DisableIOInterrupt(int irq);
virtual void AcknowledgeIOInterrupt(int irq);
virtual bool AcknowledgeIOInterrupt(int irq);
virtual void SetHardwareRTC(uint32 seconds);
virtual uint32 GetHardwareRTC();
@ -148,7 +148,7 @@ M68KAtari::MFP::DisableIOInterrupt(int irq)
}
void
bool
M68KAtari::MFP::AcknowledgeIOInterrupt(int irq)
{
uint8 bit = 1 << (irq % 8);
@ -158,7 +158,9 @@ M68KAtari::MFP::AcknowledgeIOInterrupt(int irq)
if (val & bit) {
val &= ~bit;
outb(reg, val);
return true;
}
return false;
}
@ -303,13 +305,14 @@ M68KAtari::DisableIOInterrupt(int irq)
}
void
bool
M68KAtari::AcknowledgeIOInterrupt(int irq)
{
MFP *mfp = MFPForIrq(irq);
if (mfp)
mfp->AcknowledgeIOInterrupt(irq - mfp->Vector());
return mfp->AcknowledgeIOInterrupt(irq - mfp->Vector());
return false;
}
void