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 #include -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; } _