diff options
author | gj <gj@FreeBSD.org> | 2002-04-23 10:25:35 +0000 |
---|---|---|
committer | gj <gj@FreeBSD.org> | 2002-04-23 10:25:35 +0000 |
commit | bf522e772b6e822e9be89eba6b9c5f6c22a37b84 (patch) | |
tree | edfbbb3d58d388ba62ee5144329dba61fbe88be9 /sys/i4b | |
parent | ced0e287eb94a9fce5240c963f3c71897280c99f (diff) | |
download | FreeBSD-src-bf522e772b6e822e9be89eba6b9c5f6c22a37b84.zip FreeBSD-src-bf522e772b6e822e9be89eba6b9c5f6c22a37b84.tar.gz |
On slow machines interrupts could be lost, so check for pending
interrupts in a loop.
Tested by: Andrew Gordon <arg-bsd@arg1.demon.co.uk>
Diffstat (limited to 'sys/i4b')
-rw-r--r-- | sys/i4b/layer1/ifpi2/i4b_ifpi2_pci.c | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/sys/i4b/layer1/ifpi2/i4b_ifpi2_pci.c b/sys/i4b/layer1/ifpi2/i4b_ifpi2_pci.c index 981473b..fc70231 100644 --- a/sys/i4b/layer1/ifpi2/i4b_ifpi2_pci.c +++ b/sys/i4b/layer1/ifpi2/i4b_ifpi2_pci.c @@ -974,18 +974,25 @@ avma1pp2_intr(void *xsc) /* was there an interrupt from this card ? */ if ((stat & ASL_IRQ_Pending) == 0) return; /* no */ - /* interrupts are high active */ - if (stat & ASL_IRQ_TIMER) - NDBGL1(L1_H_IRQ, "timer interrupt ???"); - if (stat & ASL_IRQ_HSCX) + /* For slow machines loop as long as an interrupt is active */ + for (; ((stat & ASL_IRQ_Pending) != 0) ;) { - NDBGL1(L1_H_IRQ, "HSCX"); - avma1pp2_hscx_int_handler(sc); - } - if (stat & ASL_IRQ_ISAC) - { - NDBGL1(L1_H_IRQ, "ISAC"); - ifpi2_isacsx_intr(sc); + /* interrupts are high active */ + if (stat & ASL_IRQ_TIMER) + NDBGL1(L1_H_IRQ, "timer interrupt ???"); + if (stat & ASL_IRQ_HSCX) + { + NDBGL1(L1_H_IRQ, "HSCX"); + avma1pp2_hscx_int_handler(sc); + } + if (stat & ASL_IRQ_ISAC) + { + NDBGL1(L1_H_IRQ, "ISAC"); + ifpi2_isacsx_intr(sc); + } + stat = bus_space_read_1(btag, bhandle, STAT0_OFFSET); + NDBGL1(L1_H_IRQ, "stat %x", stat); + } } |