 arch/ppc64/kernel/irq.c           |    6 ++++--
 arch/ppc64/kernel/open_pic.c      |    4 +++-
 arch/ppc64/kernel/open_pic_defs.h |    3 ++-
 arch/ppc64/kernel/ras.c           |   20 +++++++++++---------
 arch/ppc64/kernel/xics.c          |    5 ++++-
 5 files changed, 24 insertions(+), 14 deletions(-)

diff -puN arch/ppc64/kernel/irq.c~ppc64-irqfixes arch/ppc64/kernel/irq.c
--- 25-power4/arch/ppc64/kernel/irq.c~ppc64-irqfixes	2003-04-22 21:57:00.000000000 -0700
+++ 25-power4-akpm/arch/ppc64/kernel/irq.c	2003-04-22 22:29:14.000000000 -0700
@@ -212,7 +212,8 @@ do_free_irq(int irq, void* dev_id)
 	return -ENOENT;
 }
 
-int request_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *),
+int request_irq(unsigned int irq,
+	irqreturn_t (*handler)(int, void *, struct pt_regs *),
 	unsigned long irqflags, const char * devname, void *dev_id)
 {
 	struct irqaction *action;
@@ -743,6 +744,7 @@ void init_irq_proc (void)
 	}
 }
 
-void no_action(int irq, void *dev, struct pt_regs *regs)
+irqreturn_t no_action(int irq, void *dev, struct pt_regs *regs)
 {
+	return IRQ_NONE;
 }
diff -puN arch/ppc64/kernel/open_pic.c~ppc64-irqfixes arch/ppc64/kernel/open_pic.c
--- 25-power4/arch/ppc64/kernel/open_pic.c~ppc64-irqfixes	2003-04-22 22:06:24.000000000 -0700
+++ 25-power4-akpm/arch/ppc64/kernel/open_pic.c	2003-04-22 22:10:38.000000000 -0700
@@ -764,9 +764,11 @@ static void openpic_end_ipi(unsigned int
 	openpic_eoi();
 }
 
-static void openpic_ipi_action(int cpl, void *dev_id, struct pt_regs *regs)
+static irqreturn_t openpic_ipi_action(int cpl, void *dev_id,
+					struct pt_regs *regs)
 {
 	smp_message_recv(cpl-openpic_vec_ipi, regs);
+	return IRQ_HANDLED;
 }
 
 #endif /* CONFIG_SMP */
diff -puN arch/ppc64/kernel/open_pic_defs.h~ppc64-irqfixes arch/ppc64/kernel/open_pic_defs.h
--- 25-power4/arch/ppc64/kernel/open_pic_defs.h~ppc64-irqfixes	2003-04-22 22:10:04.000000000 -0700
+++ 25-power4-akpm/arch/ppc64/kernel/open_pic_defs.h	2003-04-22 22:10:27.000000000 -0700
@@ -298,7 +298,8 @@ static void openpic_set_spurious(u_int v
 #ifdef CONFIG_SMP
 /* Interprocessor Interrupts */
 static void openpic_initipi(u_int ipi, u_int pri, u_int vector);
-static void openpic_ipi_action(int cpl, void *dev_id, struct pt_regs *regs);
+static irqreturn_t openpic_ipi_action(int cpl, void *dev_id,
+					struct pt_regs *regs);
 #endif
 
 /* Timer Interrupts */
diff -puN arch/ppc64/kernel/xics.c~ppc64-irqfixes arch/ppc64/kernel/xics.c
--- 25-power4/arch/ppc64/kernel/xics.c~ppc64-irqfixes	2003-04-22 22:10:50.000000000 -0700
+++ 25-power4-akpm/arch/ppc64/kernel/xics.c	2003-04-22 22:12:16.000000000 -0700
@@ -319,12 +319,14 @@ int xics_get_irq(struct pt_regs *regs)
 
 extern struct xics_ipi_struct xics_ipi_message[NR_CPUS] __cacheline_aligned;
 
-void xics_ipi_action(int irq, void *dev_id, struct pt_regs *regs)
+irqreturn_t xics_ipi_action(int irq, void *dev_id, struct pt_regs *regs)
 {
 	int cpu = smp_processor_id();
+	int handled = 0;
 
 	ops->qirr_info(cpu, 0xff);
 	while (xics_ipi_message[cpu].value) {
+		handled = 1;
 		if (test_and_clear_bit(PPC_MSG_CALL_FUNCTION,
 				       &xics_ipi_message[cpu].value)) {
 			mb();
@@ -350,6 +352,7 @@ void xics_ipi_action(int irq, void *dev_
 		}
 #endif
 	}
+	return IRQ_RETVAL(handled);
 }
 
 void xics_cause_IPI(int cpu)
diff -puN arch/ppc64/kernel/ras.c~ppc64-irqfixes arch/ppc64/kernel/ras.c
--- 25-power4/arch/ppc64/kernel/ras.c~ppc64-irqfixes	2003-04-22 22:12:25.000000000 -0700
+++ 25-power4-akpm/arch/ppc64/kernel/ras.c	2003-04-22 22:19:30.000000000 -0700
@@ -54,8 +54,10 @@
 #include <asm/rtas.h>
 #include <asm/ppcdebug.h>
 
-static void ras_epow_interrupt(int irq, void *dev_id, struct pt_regs * regs);
-static void ras_error_interrupt(int irq, void *dev_id, struct pt_regs * regs);
+static irqreturn_t ras_epow_interrupt(int irq, void *dev_id,
+					struct pt_regs * regs);
+static irqreturn_t ras_error_interrupt(int irq, void *dev_id,
+					struct pt_regs * regs);
 void init_ras_IRQ(void);
 
 /* #define DEBUG */
@@ -73,7 +75,7 @@ void init_ras_IRQ(void) {
 						&len))) {
 		for(i=0; i<(len / sizeof(*ireg)); i++) {
 			request_irq(virt_irq_create_mapping(*(ireg)) + NUM_8259_INTERRUPTS, 
-				    &ras_error_interrupt, 0, 
+				    ras_error_interrupt, 0, 
 				    "RAS_ERROR", NULL);
 			ireg++;
 		}
@@ -84,7 +86,7 @@ void init_ras_IRQ(void) {
 						&len))) {
 		for(i=0; i<(len / sizeof(*ireg)); i++) {
 			request_irq(virt_irq_create_mapping(*(ireg)) + NUM_8259_INTERRUPTS, 
-				    &ras_epow_interrupt, 0, 
+				    ras_epow_interrupt, 0, 
 				    "RAS_EPOW", NULL);
 			ireg++;
 		}
@@ -98,7 +100,7 @@ void init_ras_IRQ(void) {
  * to examine the type of power failure and take appropriate action where
  * the time horizon permits something useful to be done.
  */
-static void
+static irqreturn_t
 ras_epow_interrupt(int irq, void *dev_id, struct pt_regs * regs)
 {
 	struct rtas_error_log log_entry;
@@ -114,7 +116,8 @@ ras_epow_interrupt(int irq, void *dev_id
 	udbg_printf("EPOW <0x%lx 0x%lx>\n", 
 		    *((unsigned long *)&log_entry), status); 
 	printk(KERN_WARNING 
-	       "EPOW <0x%lx 0x%lx>\n",*((unsigned long *)&log_entry), status);
+		"EPOW <0x%lx 0x%lx>\n",*((unsigned long *)&log_entry), status);
+	return IRQ_HANDLED;
 }
 
 /*
@@ -125,7 +128,7 @@ ras_epow_interrupt(int irq, void *dev_id
  * For nonrecoverable errors, an error is logged and we stop all processing
  * as quickly as possible in order to prevent propagation of the failure.
  */
-static void
+static irqreturn_t
 ras_error_interrupt(int irq, void *dev_id, struct pt_regs * regs)
 {
 	struct rtas_error_log log_entry;
@@ -158,7 +161,6 @@ ras_error_interrupt(int irq, void *dev_i
 		printk(KERN_WARNING 
 		       "Warning: Recoverable hardware error <0x%lx 0x%lx>\n",
 		       *((unsigned long *)&log_entry), status);
-
-		return;
 	}
+	return IRQ_HANDLED;
 }

_
