aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcel Moolenaar <marcel@FreeBSD.org>2009-06-09 18:18:41 +0000
committerMarcel Moolenaar <marcel@FreeBSD.org>2009-06-09 18:18:41 +0000
commit272489fe599f84b293d149b9f38e7f001867037f (patch)
treee846e3361c689dff739f93bdcff26f51b315917d
parent7d34f41a7af86c2b7b2f544edd1b330623c6c48c (diff)
downloadsrc-272489fe599f84b293d149b9f38e7f001867037f.tar.gz
src-272489fe599f84b293d149b9f38e7f001867037f.zip
Pass the previously returned IRQ back to arm_get_next_irq() so that
the implementation can guarantee forward progress in the event of a stuck interrupt or interrupt storm. This is especially critical for fast interrupt handlers, as they can cause a hard hang in that case. When first called, arm_get_next_irq() is passed -1. Obtained from: Juniper Networks, Inc.
Notes
Notes: svn path=/head/; revision=193847
-rw-r--r--sys/arm/arm/intr.c3
-rw-r--r--sys/arm/at91/at91.c3
-rw-r--r--sys/arm/include/intr.h2
-rw-r--r--sys/arm/mv/ic.c2
-rw-r--r--sys/arm/sa11x0/sa11x0_irqhandler.c2
-rw-r--r--sys/arm/xscale/i80321/i80321.c2
-rw-r--r--sys/arm/xscale/i8134x/i81342.c2
-rw-r--r--sys/arm/xscale/ixp425/ixp425.c2
-rw-r--r--sys/arm/xscale/pxa/pxa_icu.c2
9 files changed, 10 insertions, 10 deletions
diff --git a/sys/arm/arm/intr.c b/sys/arm/arm/intr.c
index 85c2fd8fa3af..181606489679 100644
--- a/sys/arm/arm/intr.c
+++ b/sys/arm/arm/intr.c
@@ -120,7 +120,8 @@ arm_handler_execute(struct trapframe *frame, int irqnb)
int i;
PCPU_INC(cnt.v_intr);
- while ((i = arm_get_next_irq()) != -1) {
+ i = -1;
+ while ((i = arm_get_next_irq(i)) != -1) {
intrcnt[intrcnt_tab[i]]++;
event = intr_events[i];
if (intr_event_handle(event, frame) != 0) {
diff --git a/sys/arm/at91/at91.c b/sys/arm/at91/at91.c
index 222fce062d0d..efc731bd47a4 100644
--- a/sys/arm/at91/at91.c
+++ b/sys/arm/at91/at91.c
@@ -702,9 +702,8 @@ arm_mask_irq(uintptr_t nb)
}
int
-arm_get_next_irq()
+arm_get_next_irq(int last __unused)
{
-
int status;
int irq;
diff --git a/sys/arm/include/intr.h b/sys/arm/include/intr.h
index 619c5e1c87a4..6dc0247d9a5e 100644
--- a/sys/arm/include/intr.h
+++ b/sys/arm/include/intr.h
@@ -56,7 +56,7 @@
#include <machine/psl.h>
-int arm_get_next_irq(void);
+int arm_get_next_irq(int);
void arm_mask_irq(uintptr_t);
void arm_unmask_irq(uintptr_t);
void arm_setup_irqhandler(const char *, int (*)(void*), void (*)(void*),
diff --git a/sys/arm/mv/ic.c b/sys/arm/mv/ic.c
index d449e16f06d0..8861dc1f49e5 100644
--- a/sys/arm/mv/ic.c
+++ b/sys/arm/mv/ic.c
@@ -137,7 +137,7 @@ static devclass_t mv_ic_devclass;
DRIVER_MODULE(ic, mbus, mv_ic_driver, mv_ic_devclass, 0, 0);
int
-arm_get_next_irq(void)
+arm_get_next_irq(int last __unused)
{
int irq;
diff --git a/sys/arm/sa11x0/sa11x0_irqhandler.c b/sys/arm/sa11x0/sa11x0_irqhandler.c
index 1935418867bb..e423055728ba 100644
--- a/sys/arm/sa11x0/sa11x0_irqhandler.c
+++ b/sys/arm/sa11x0/sa11x0_irqhandler.c
@@ -108,7 +108,7 @@ static uint32_t sa11x0_irq_mask = 0xfffffff;
extern vm_offset_t saipic_base;
int
-arm_get_next_irq()
+arm_get_next_irq(int last __unused)
{
int irq;
diff --git a/sys/arm/xscale/i80321/i80321.c b/sys/arm/xscale/i80321/i80321.c
index c7b6ee6ea6bb..053fe7811ce3 100644
--- a/sys/arm/xscale/i80321/i80321.c
+++ b/sys/arm/xscale/i80321/i80321.c
@@ -240,7 +240,7 @@ i80321_iintsrc_read(void)
}
int
-arm_get_next_irq()
+arm_get_next_irq(int last __unused)
{
int irq;
diff --git a/sys/arm/xscale/i8134x/i81342.c b/sys/arm/xscale/i8134x/i81342.c
index 072685bec3dd..2d8783ef0892 100644
--- a/sys/arm/xscale/i8134x/i81342.c
+++ b/sys/arm/xscale/i8134x/i81342.c
@@ -295,7 +295,7 @@ arm_unmask_irq(uintptr_t nb)
}
int
-arm_get_next_irq(void)
+arm_get_next_irq(int last __unused)
{
uint32_t val;
val = intpnd0_read() & intr_enabled0;
diff --git a/sys/arm/xscale/ixp425/ixp425.c b/sys/arm/xscale/ixp425/ixp425.c
index 9ae3b75e965e..0267d9fac836 100644
--- a/sys/arm/xscale/ixp425/ixp425.c
+++ b/sys/arm/xscale/ixp425/ixp425.c
@@ -202,7 +202,7 @@ ixp435_irq_read(void)
}
int
-arm_get_next_irq(void)
+arm_get_next_irq(int last __unused)
{
uint32_t irq;
diff --git a/sys/arm/xscale/pxa/pxa_icu.c b/sys/arm/xscale/pxa/pxa_icu.c
index 2cb2cbb6fb7c..0d7a51945d14 100644
--- a/sys/arm/xscale/pxa/pxa_icu.c
+++ b/sys/arm/xscale/pxa/pxa_icu.c
@@ -128,7 +128,7 @@ static devclass_t pxa_icu_devclass;
DRIVER_MODULE(pxaicu, pxa, pxa_icu_driver, pxa_icu_devclass, 0, 0);
int
-arm_get_next_irq()
+arm_get_next_irq(int last __unused)
{
int irq;