From 2347f54879c98f8d27212cb41ef28d271627a234 Mon Sep 17 00:00:00 2001
From: Nathan Whitehorn <nwhitehorn@FreeBSD.org>
Date: Sun, 25 Jan 2009 17:50:53 +0000
Subject: [PATCH] Fix a race condition where interrupts set up after boot could
 be enabled in the PIC before the interrupt handler was set. If the interrupt
 triggered in that window, then the interrupt vector would be disabled.

Reported by:	Marco Trillo
---
 sys/powerpc/powerpc/intr_machdep.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/sys/powerpc/powerpc/intr_machdep.c b/sys/powerpc/powerpc/intr_machdep.c
index 3e073489eec5..99b3c2db9e7e 100644
--- a/sys/powerpc/powerpc/intr_machdep.c
+++ b/sys/powerpc/powerpc/intr_machdep.c
@@ -243,7 +243,7 @@ powerpc_setup_intr(const char *name, u_int irq, driver_filter_t filter,
     driver_intr_t handler, void *arg, enum intr_type flags, void **cookiep)
 {
 	struct powerpc_intr *i;
-	int error;
+	int error, enable = 0;
 
 	i = intr_lookup(irq);
 	if (i == NULL)
@@ -258,13 +258,16 @@ powerpc_setup_intr(const char *name, u_int irq, driver_filter_t filter,
 
 		i->cntp = &intrcnt[i->vector];
 
-		if (!cold)
-			PIC_ENABLE(pic, i->irq, i->vector);
+		enable = 1;
 	}
 
 	error = intr_event_add_handler(i->event, name, filter, handler, arg,
 	    intr_priority(flags), flags, cookiep);
 	intrcnt_setname(i->event->ie_fullname, i->vector);
+
+	if (!cold && enable)
+		PIC_ENABLE(pic, i->irq, i->vector);
+
 	return (error);
 }