Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 9 Jun 2009 18:18:41 +0000 (UTC)
From:      Marcel Moolenaar <marcel@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r193847 - in head/sys/arm: arm at91 include mv sa11x0 xscale/i80321 xscale/i8134x xscale/ixp425 xscale/pxa
Message-ID:  <200906091818.n59IIfD5079688@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: marcel
Date: Tue Jun  9 18:18:41 2009
New Revision: 193847
URL: http://svn.freebsd.org/changeset/base/193847

Log:
  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.

Modified:
  head/sys/arm/arm/intr.c
  head/sys/arm/at91/at91.c
  head/sys/arm/include/intr.h
  head/sys/arm/mv/ic.c
  head/sys/arm/sa11x0/sa11x0_irqhandler.c
  head/sys/arm/xscale/i80321/i80321.c
  head/sys/arm/xscale/i8134x/i81342.c
  head/sys/arm/xscale/ixp425/ixp425.c
  head/sys/arm/xscale/pxa/pxa_icu.c

Modified: head/sys/arm/arm/intr.c
==============================================================================
--- head/sys/arm/arm/intr.c	Tue Jun  9 17:21:47 2009	(r193846)
+++ head/sys/arm/arm/intr.c	Tue Jun  9 18:18:41 2009	(r193847)
@@ -120,7 +120,8 @@ arm_handler_execute(struct trapframe *fr
 	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) {

Modified: head/sys/arm/at91/at91.c
==============================================================================
--- head/sys/arm/at91/at91.c	Tue Jun  9 17:21:47 2009	(r193846)
+++ head/sys/arm/at91/at91.c	Tue Jun  9 18:18:41 2009	(r193847)
@@ -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;
 	

Modified: head/sys/arm/include/intr.h
==============================================================================
--- head/sys/arm/include/intr.h	Tue Jun  9 17:21:47 2009	(r193846)
+++ head/sys/arm/include/intr.h	Tue Jun  9 18:18:41 2009	(r193847)
@@ -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*), 

Modified: head/sys/arm/mv/ic.c
==============================================================================
--- head/sys/arm/mv/ic.c	Tue Jun  9 17:21:47 2009	(r193846)
+++ head/sys/arm/mv/ic.c	Tue Jun  9 18:18:41 2009	(r193847)
@@ -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;
 

Modified: head/sys/arm/sa11x0/sa11x0_irqhandler.c
==============================================================================
--- head/sys/arm/sa11x0/sa11x0_irqhandler.c	Tue Jun  9 17:21:47 2009	(r193846)
+++ head/sys/arm/sa11x0/sa11x0_irqhandler.c	Tue Jun  9 18:18:41 2009	(r193847)
@@ -108,7 +108,7 @@ static uint32_t sa11x0_irq_mask = 0xffff
 extern vm_offset_t saipic_base;
 
 int
-arm_get_next_irq()
+arm_get_next_irq(int last __unused)
 {
 	int irq;
 

Modified: head/sys/arm/xscale/i80321/i80321.c
==============================================================================
--- head/sys/arm/xscale/i80321/i80321.c	Tue Jun  9 17:21:47 2009	(r193846)
+++ head/sys/arm/xscale/i80321/i80321.c	Tue Jun  9 18:18:41 2009	(r193847)
@@ -240,7 +240,7 @@ i80321_iintsrc_read(void)
 }
 
 int
-arm_get_next_irq()
+arm_get_next_irq(int last __unused)
 {
 	int irq;
 

Modified: head/sys/arm/xscale/i8134x/i81342.c
==============================================================================
--- head/sys/arm/xscale/i8134x/i81342.c	Tue Jun  9 17:21:47 2009	(r193846)
+++ head/sys/arm/xscale/i8134x/i81342.c	Tue Jun  9 18:18:41 2009	(r193847)
@@ -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;

Modified: head/sys/arm/xscale/ixp425/ixp425.c
==============================================================================
--- head/sys/arm/xscale/ixp425/ixp425.c	Tue Jun  9 17:21:47 2009	(r193846)
+++ head/sys/arm/xscale/ixp425/ixp425.c	Tue Jun  9 18:18:41 2009	(r193847)
@@ -202,7 +202,7 @@ ixp435_irq_read(void)
 }
 
 int
-arm_get_next_irq(void)
+arm_get_next_irq(int last __unused)
 {
 	uint32_t irq;
 

Modified: head/sys/arm/xscale/pxa/pxa_icu.c
==============================================================================
--- head/sys/arm/xscale/pxa/pxa_icu.c	Tue Jun  9 17:21:47 2009	(r193846)
+++ head/sys/arm/xscale/pxa/pxa_icu.c	Tue Jun  9 18:18:41 2009	(r193847)
@@ -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;
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200906091818.n59IIfD5079688>