summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormattf <mattf@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2007-01-23 21:28:14 +0000
committermattf <mattf@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2007-01-23 21:28:14 +0000
commit1d8f9e7e5393d5cfd77b2f81f85c1ae88d5583c2 (patch)
tree5f17607662838bada7f7e891595a782428b1188a
parent412656572604454581bf1f6599d68f686543e57c (diff)
Make sure we don't clear the interrupt before we might have received it in
shared interrupt line scenarios. git-svn-id: http://svn.digium.com/svn/zaptel/branches/1.2@1936 5390a7c7-147a-4af0-8ec9-7488f05a26cb
-rw-r--r--wct1xxp.c4
-rw-r--r--wctdm.c3
-rw-r--r--wctdm24xxp.c4
-rw-r--r--wcte11xp.c4
4 files changed, 9 insertions, 6 deletions
diff --git a/wct1xxp.c b/wct1xxp.c
index 4aecf27..a0a1e95 100644
--- a/wct1xxp.c
+++ b/wct1xxp.c
@@ -1134,8 +1134,6 @@ ZAP_IRQ_HANDLER(t1xxp_interrupt)
int x;
ints = inb(wc->ioaddr + WC_INTSTAT);
- outb(ints, wc->ioaddr + WC_INTSTAT);
-
if (!ints)
#ifdef LINUX26
return IRQ_NONE;
@@ -1143,6 +1141,8 @@ ZAP_IRQ_HANDLER(t1xxp_interrupt)
return;
#endif
+ outb(ints, wc->ioaddr + WC_INTSTAT);
+
if (!wc->intcount) {
if (debug) printk("Got interrupt: 0x%04x\n", ints);
}
diff --git a/wctdm.c b/wctdm.c
index 1e7540a..2e87897 100644
--- a/wctdm.c
+++ b/wctdm.c
@@ -1032,7 +1032,6 @@ ZAP_IRQ_HANDLER(wctdm_interrupt)
int mode;
ints = inb(wc->ioaddr + WC_INTSTAT);
- outb(ints, wc->ioaddr + WC_INTSTAT);
if (!ints)
#ifdef LINUX26
@@ -1041,6 +1040,8 @@ ZAP_IRQ_HANDLER(wctdm_interrupt)
return;
#endif
+ outb(ints, wc->ioaddr + WC_INTSTAT);
+
if (ints & 0x10) {
/* Stop DMA, wait for watchdog */
printk("TDM PCI Master abort\n");
diff --git a/wctdm24xxp.c b/wctdm24xxp.c
index e4e97f7..72418e4 100644
--- a/wctdm24xxp.c
+++ b/wctdm24xxp.c
@@ -1428,7 +1428,6 @@ ZAP_IRQ_HANDLER(wctdm_interrupt)
/* Read and clear interrupts */
ints = wctdm_getctl(wc, 0x0028);
- wctdm_setctl(wc, 0x0028, ints);
if (!ints)
#ifdef LINUX26
@@ -1436,6 +1435,9 @@ ZAP_IRQ_HANDLER(wctdm_interrupt)
#else
return;
#endif
+
+ wctdm_setctl(wc, 0x0028, ints);
+
ints &= wc->intmask;
if (ints & 0x00000041) {
do {
diff --git a/wcte11xp.c b/wcte11xp.c
index 3ac0291..98669a4 100644
--- a/wcte11xp.c
+++ b/wcte11xp.c
@@ -1265,8 +1265,6 @@ ZAP_IRQ_HANDLER(t1xxp_interrupt)
int x;
ints = inb(wc->ioaddr + WC_INTSTAT);
- outb(ints, wc->ioaddr + WC_INTSTAT);
-
if (!ints)
#ifdef LINUX26
return IRQ_NONE;
@@ -1274,6 +1272,8 @@ ZAP_IRQ_HANDLER(t1xxp_interrupt)
return;
#endif
+ outb(ints, wc->ioaddr + WC_INTSTAT);
+
if (!wc->intcount) {
if (debug) printk("Got interrupt: 0x%04x\n", ints);
}