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
@@ -44,7 +44,7 @@ public:
virtual void EnableIOInterrupt(int irq) = 0; virtual void EnableIOInterrupt(int irq) = 0;
virtual void DisableIOInterrupt(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 void SetHardwareRTC(uint32 seconds) = 0;
virtual uint32 GetHardwareRTC() = 0; virtual uint32 GetHardwareRTC() = 0;
+4 -3
View File
@@ -272,9 +272,10 @@ dprintf("handling I/O interrupts done\n");
default: default:
// vectors >= 64 are user defined vectors, used for IRQ // vectors >= 64 are user defined vectors, used for IRQ
if (vector >= 64) { if (vector >= 64) {
M68KPlatform::Default()->AcknowledgeIOInterrupt(vector); if (M68KPlatform::Default()->AcknowledgeIOInterrupt(vector)) {
ret = int_io_interrupt_handler(vector, true); ret = int_io_interrupt_handler(vector, true);
break; break;
}
} }
dprintf("unhandled exception type 0x%x\n", vector); dprintf("unhandled exception type 0x%x\n", vector);
print_iframe(iframe); print_iframe(iframe);
@@ -47,7 +47,7 @@ public:
void EnableIOInterrupt(int irq); void EnableIOInterrupt(int irq);
void DisableIOInterrupt(int irq); void DisableIOInterrupt(int irq);
void AcknowledgeIOInterrupt(int irq); bool AcknowledgeIOInterrupt(int irq);
private: private:
uint32 fBase; uint32 fBase;
@@ -70,7 +70,7 @@ public:
virtual void EnableIOInterrupt(int irq); virtual void EnableIOInterrupt(int irq);
virtual void DisableIOInterrupt(int irq); virtual void DisableIOInterrupt(int irq);
virtual void AcknowledgeIOInterrupt(int irq); virtual bool AcknowledgeIOInterrupt(int irq);
virtual void SetHardwareRTC(uint32 seconds); virtual void SetHardwareRTC(uint32 seconds);
virtual uint32 GetHardwareRTC(); virtual uint32 GetHardwareRTC();
@@ -148,7 +148,7 @@ M68KAtari::MFP::DisableIOInterrupt(int irq)
} }
void bool
M68KAtari::MFP::AcknowledgeIOInterrupt(int irq) M68KAtari::MFP::AcknowledgeIOInterrupt(int irq)
{ {
uint8 bit = 1 << (irq % 8); uint8 bit = 1 << (irq % 8);
@@ -158,7 +158,9 @@ M68KAtari::MFP::AcknowledgeIOInterrupt(int irq)
if (val & bit) { if (val & bit) {
val &= ~bit; val &= ~bit;
outb(reg, val); outb(reg, val);
return true;
} }
return false;
} }
@@ -303,13 +305,14 @@ M68KAtari::DisableIOInterrupt(int irq)
} }
void bool
M68KAtari::AcknowledgeIOInterrupt(int irq) M68KAtari::AcknowledgeIOInterrupt(int irq)
{ {
MFP *mfp = MFPForIrq(irq); MFP *mfp = MFPForIrq(irq);
if (mfp) if (mfp)
mfp->AcknowledgeIOInterrupt(irq - mfp->Vector()); return mfp->AcknowledgeIOInterrupt(irq - mfp->Vector());
return false;
} }
void void