## Automatically generated incremental diff ## From: linux-2.5.68-bk1 ## To: linux-2.5.68-bk2 ## Robot: $Id: make-incremental-diff,v 1.11 2002/02/20 02:59:33 hpa Exp $ diff -urN linux-2.5.68-bk1/Makefile linux-2.5.68-bk2/Makefile --- linux-2.5.68-bk1/Makefile 2003-04-21 15:53:35.000000000 -0700 +++ linux-2.5.68-bk2/Makefile 2003-04-21 15:53:39.000000000 -0700 @@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 5 SUBLEVEL = 68 -EXTRAVERSION = -bk1 +EXTRAVERSION = -bk2 # *DOCUMENTATION* # To see a list of typical targets execute "make help" diff -urN linux-2.5.68-bk1/arch/alpha/kernel/irq.c linux-2.5.68-bk2/arch/alpha/kernel/irq.c --- linux-2.5.68-bk1/arch/alpha/kernel/irq.c 2003-04-19 19:50:35.000000000 -0700 +++ linux-2.5.68-bk2/arch/alpha/kernel/irq.c 2003-04-21 15:53:39.000000000 -0700 @@ -45,7 +45,10 @@ * Special irq handlers. */ -void no_action(int cpl, void *dev_id, struct pt_regs *regs) { } +irqreturn_t no_action(int cpl, void *dev_id, struct pt_regs *regs) +{ + return IRQ_NONE; +} /* * Generic no controller code @@ -414,7 +417,7 @@ } int -request_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *), +request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long irqflags, const char * devname, void *dev_id) { int retval; diff -urN linux-2.5.68-bk1/arch/alpha/kernel/proto.h linux-2.5.68-bk2/arch/alpha/kernel/proto.h --- linux-2.5.68-bk1/arch/alpha/kernel/proto.h 2003-04-19 19:48:55.000000000 -0700 +++ linux-2.5.68-bk2/arch/alpha/kernel/proto.h 2003-04-21 15:53:39.000000000 -0700 @@ -1,4 +1,5 @@ #include +#include /* Prototypes of functions used across modules here in this directory. */ @@ -128,7 +129,7 @@ /* extern void reset_for_srm(void); */ /* time.c */ -extern void timer_interrupt(int irq, void *dev, struct pt_regs * regs); +extern irqreturn_t timer_interrupt(int irq, void *dev, struct pt_regs * regs); extern void common_init_rtc(void); extern unsigned long est_cycle_freq; diff -urN linux-2.5.68-bk1/arch/alpha/kernel/time.c linux-2.5.68-bk2/arch/alpha/kernel/time.c --- linux-2.5.68-bk1/arch/alpha/kernel/time.c 2003-04-19 19:49:33.000000000 -0700 +++ linux-2.5.68-bk2/arch/alpha/kernel/time.c 2003-04-21 15:53:39.000000000 -0700 @@ -94,7 +94,7 @@ * timer_interrupt() needs to keep up the real-time clock, * as well as call the "do_timer()" routine every clocktick */ -void timer_interrupt(int irq, void *dev, struct pt_regs * regs) +irqreturn_t timer_interrupt(int irq, void *dev, struct pt_regs * regs) { unsigned long delta; __u32 now; @@ -139,6 +139,7 @@ } write_sequnlock(&xtime_lock); + return IRQ_HANDLED; } void diff -urN linux-2.5.68-bk1/arch/i386/kernel/irq.c linux-2.5.68-bk2/arch/i386/kernel/irq.c --- linux-2.5.68-bk1/arch/i386/kernel/irq.c 2003-04-21 15:53:35.000000000 -0700 +++ linux-2.5.68-bk2/arch/i386/kernel/irq.c 2003-04-21 15:53:39.000000000 -0700 @@ -213,7 +213,7 @@ do { status |= action->flags; - retval |= action->handler(irq, action->dev_id, regs).val; + retval |= action->handler(irq, action->dev_id, regs); action = action->next; } while (action); if (status & SA_SAMPLE_RANDOM) @@ -225,7 +225,7 @@ count--; printk(retval ? "irq event %d: bogus retval mask %x\n" - : "irq %d: nobody cared!n", + : "irq %d: nobody cared!\n", irq, retval); } diff -urN linux-2.5.68-bk1/arch/sparc/kernel/irq.c linux-2.5.68-bk2/arch/sparc/kernel/irq.c --- linux-2.5.68-bk1/arch/sparc/kernel/irq.c 2003-04-19 19:48:49.000000000 -0700 +++ linux-2.5.68-bk2/arch/sparc/kernel/irq.c 2003-04-21 15:53:39.000000000 -0700 @@ -74,8 +74,8 @@ prom_halt(); } -void (*sparc_init_timers)(void (*)(int, void *,struct pt_regs *)) = - (void (*)(void (*)(int, void *,struct pt_regs *))) irq_panic; +void (*sparc_init_timers)(irqreturn_t (*)(int, void *,struct pt_regs *)) = + (void (*)(irqreturn_t (*)(int, void *,struct pt_regs *))) irq_panic; /* * Dave Redman (djhr@tadpole.co.uk) @@ -461,7 +461,7 @@ * thus no sharing possible. */ int request_fast_irq(unsigned int irq, - void (*handler)(int, void *, struct pt_regs *), + irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long irqflags, const char *devname) { struct irqaction *action; @@ -549,7 +549,7 @@ } int request_irq(unsigned int irq, - void (*handler)(int, void *, struct pt_regs *), + irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long irqflags, const char * devname, void *dev_id) { struct irqaction * action, *tmp = NULL; @@ -558,7 +558,7 @@ if (sparc_cpu_model == sun4d) { extern int sun4d_request_irq(unsigned int, - void (*)(int, void *, struct pt_regs *), + irqreturn_t (*)(int, void *, struct pt_regs *), unsigned long, const char *, void *); return sun4d_request_irq(irq, handler, irqflags, devname, dev_id); } diff -urN linux-2.5.68-bk1/arch/sparc/kernel/pcic.c linux-2.5.68-bk2/arch/sparc/kernel/pcic.c --- linux-2.5.68-bk1/arch/sparc/kernel/pcic.c 2003-04-19 19:49:52.000000000 -0700 +++ linux-2.5.68-bk2/arch/sparc/kernel/pcic.c 2003-04-21 15:53:39.000000000 -0700 @@ -736,12 +736,13 @@ pcic_timer_dummy = readl(pcic0.pcic_regs+PCI_SYS_LIMIT); } -static void pcic_timer_handler (int irq, void *h, struct pt_regs *regs) +static irqreturn_t pcic_timer_handler (int irq, void *h, struct pt_regs *regs) { write_seqlock(&xtime_lock); /* Dummy, to show that we remember */ pcic_clear_clock_irq(); do_timer(regs); write_sequnlock(&xtime_lock); + return IRQ_HANDLED; } #define USECS_PER_JIFFY 10000 /* We have 100HZ "standard" timer for sparc */ diff -urN linux-2.5.68-bk1/arch/sparc/kernel/setup.c linux-2.5.68-bk2/arch/sparc/kernel/setup.c --- linux-2.5.68-bk1/arch/sparc/kernel/setup.c 2003-04-19 19:48:49.000000000 -0700 +++ linux-2.5.68-bk2/arch/sparc/kernel/setup.c 2003-04-21 15:53:39.000000000 -0700 @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include diff -urN linux-2.5.68-bk1/arch/sparc/kernel/sun4c_irq.c linux-2.5.68-bk2/arch/sparc/kernel/sun4c_irq.c --- linux-2.5.68-bk1/arch/sparc/kernel/sun4c_irq.c 2003-04-19 19:48:50.000000000 -0700 +++ linux-2.5.68-bk2/arch/sparc/kernel/sun4c_irq.c 2003-04-21 15:53:39.000000000 -0700 @@ -155,7 +155,7 @@ /* Errm.. not sure how to do this.. */ } -static void __init sun4c_init_timers(void (*counter_fn)(int, void *, struct pt_regs *)) +static void __init sun4c_init_timers(irqreturn_t (*counter_fn)(int, void *, struct pt_regs *)) { int irq; diff -urN linux-2.5.68-bk1/arch/sparc/kernel/sun4d_irq.c linux-2.5.68-bk2/arch/sparc/kernel/sun4d_irq.c --- linux-2.5.68-bk1/arch/sparc/kernel/sun4d_irq.c 2003-04-19 19:48:46.000000000 -0700 +++ linux-2.5.68-bk2/arch/sparc/kernel/sun4d_irq.c 2003-04-21 15:53:39.000000000 -0700 @@ -262,7 +262,7 @@ } int sun4d_request_irq(unsigned int irq, - void (*handler)(int, void *, struct pt_regs *), + irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long irqflags, const char * devname, void *dev_id) { struct irqaction *action, *tmp = NULL, **actionp; @@ -445,7 +445,7 @@ bw_set_prof_limit(cpu, limit); } -static void __init sun4d_init_timers(void (*counter_fn)(int, void *, struct pt_regs *)) +static void __init sun4d_init_timers(irqreturn_t (*counter_fn)(int, void *, struct pt_regs *)) { int irq; extern struct prom_cpuinfo linux_cpus[NR_CPUS]; diff -urN linux-2.5.68-bk1/arch/sparc/kernel/sun4m_irq.c linux-2.5.68-bk2/arch/sparc/kernel/sun4m_irq.c --- linux-2.5.68-bk1/arch/sparc/kernel/sun4m_irq.c 2003-04-19 19:49:34.000000000 -0700 +++ linux-2.5.68-bk2/arch/sparc/kernel/sun4m_irq.c 2003-04-21 15:53:39.000000000 -0700 @@ -235,7 +235,7 @@ return buff; } -static void __init sun4m_init_timers(void (*counter_fn)(int, void *, struct pt_regs *)) +static void __init sun4m_init_timers(irqreturn_t (*counter_fn)(int, void *, struct pt_regs *)) { int reg_count, irq, cpu; struct linux_prom_registers cnt_regs[PROMREG_MAX]; diff -urN linux-2.5.68-bk1/arch/sparc/kernel/tick14.c linux-2.5.68-bk2/arch/sparc/kernel/tick14.c --- linux-2.5.68-bk1/arch/sparc/kernel/tick14.c 2003-04-19 19:51:12.000000000 -0700 +++ linux-2.5.68-bk2/arch/sparc/kernel/tick14.c 2003-04-21 15:53:39.000000000 -0700 @@ -56,7 +56,7 @@ linux_lvl14[3] = obp_lvl14[3]; } -void claim_ticker14(void (*handler)(int, void *, struct pt_regs *), +void claim_ticker14(irqreturn_t (*handler)(int, void *, struct pt_regs *), int irq_nr, unsigned int timeout ) { int cpu = smp_processor_id(); diff -urN linux-2.5.68-bk1/arch/sparc/kernel/time.c linux-2.5.68-bk2/arch/sparc/kernel/time.c --- linux-2.5.68-bk1/arch/sparc/kernel/time.c 2003-04-19 19:49:57.000000000 -0700 +++ linux-2.5.68-bk2/arch/sparc/kernel/time.c 2003-04-21 15:53:39.000000000 -0700 @@ -120,7 +120,7 @@ #define TICK_SIZE (tick_nsec / 1000) -void timer_interrupt(int irq, void *dev_id, struct pt_regs * regs) +irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs * regs) { /* last time the cmos clock got updated */ static long last_rtc_update; @@ -156,6 +156,8 @@ last_rtc_update = xtime.tv_sec - 600; /* do it again in 60 s */ } write_sequnlock(&xtime_lock); + + return IRQ_HANDLED; } /* Kick start a stopped clock (procedure from the Sun NVRAM/hostid FAQ). */ diff -urN linux-2.5.68-bk1/arch/sparc/mm/sun4c.c linux-2.5.68-bk2/arch/sparc/mm/sun4c.c --- linux-2.5.68-bk1/arch/sparc/mm/sun4c.c 2003-04-21 15:53:35.000000000 -0700 +++ linux-2.5.68-bk2/arch/sparc/mm/sun4c.c 2003-04-21 15:53:39.000000000 -0700 @@ -2194,7 +2194,7 @@ BTFIXUPSET_CALL(pte_alloc_one_kernel, sun4c_pte_alloc_one_kernel, BTFIXUPCALL_NORM); BTFIXUPSET_CALL(pte_alloc_one, sun4c_pte_alloc_one, BTFIXUPCALL_NORM); BTFIXUPSET_CALL(free_pmd_fast, sun4c_free_pmd_fast, BTFIXUPCALL_NOP); - BTFIXUPSET_CALL(pmd_alloc_one, sun4c_lpmd_alloc_one, BTFIXUPCALL_RETO0); + BTFIXUPSET_CALL(pmd_alloc_one, sun4c_pmd_alloc_one, BTFIXUPCALL_RETO0); BTFIXUPSET_CALL(free_pgd_fast, sun4c_free_pgd_fast, BTFIXUPCALL_NORM); BTFIXUPSET_CALL(get_pgd_fast, sun4c_get_pgd_fast, BTFIXUPCALL_NORM); diff -urN linux-2.5.68-bk1/arch/sparc64/kernel/ebus.c linux-2.5.68-bk2/arch/sparc64/kernel/ebus.c --- linux-2.5.68-bk1/arch/sparc64/kernel/ebus.c 2003-04-19 19:48:57.000000000 -0700 +++ linux-2.5.68-bk2/arch/sparc64/kernel/ebus.c 2003-04-21 15:53:39.000000000 -0700 @@ -73,7 +73,7 @@ } } -static void ebus_dma_irq(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t ebus_dma_irq(int irq, void *dev_id, struct pt_regs *regs) { struct ebus_dma_info *p = dev_id; unsigned long flags; @@ -87,12 +87,16 @@ if (csr & EBDMA_CSR_ERR_PEND) { printk(KERN_CRIT "ebus_dma(%s): DMA error!\n", p->name); p->callback(p, EBUS_DMA_EVENT_ERROR, p->client_cookie); + return IRQ_HANDLED; } else if (csr & EBDMA_CSR_INT_PEND) { p->callback(p, (csr & EBDMA_CSR_TC) ? EBUS_DMA_EVENT_DMA : EBUS_DMA_EVENT_DEVICE, p->client_cookie); + return IRQ_HANDLED; } + + return IRQ_NONE; } int ebus_dma_register(struct ebus_dma_info *p) diff -urN linux-2.5.68-bk1/arch/sparc64/kernel/irq.c linux-2.5.68-bk2/arch/sparc64/kernel/irq.c --- linux-2.5.68-bk1/arch/sparc64/kernel/irq.c 2003-04-19 19:51:08.000000000 -0700 +++ linux-2.5.68-bk2/arch/sparc64/kernel/irq.c 2003-04-21 15:53:39.000000000 -0700 @@ -294,7 +294,7 @@ __asm__ __volatile__("wrpr %0, 0x0, %%pstate" : : "r" (pstate)); } -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 *name, void *dev_id) { struct irqaction *action, *tmp = NULL; @@ -831,7 +831,7 @@ #define SPARC_NOP (0x01000000) static void install_fast_irq(unsigned int cpu_irq, - void (*handler)(int, void *, struct pt_regs *)) + irqreturn_t (*handler)(int, void *, struct pt_regs *)) { extern unsigned long sparc64_ttable_tl0; unsigned long ttent = (unsigned long) &sparc64_ttable_tl0; @@ -847,7 +847,7 @@ } int request_fast_irq(unsigned int irq, - void (*handler)(int, void *, struct pt_regs *), + irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long irqflags, const char *name, void *dev_id) { struct irqaction *action; diff -urN linux-2.5.68-bk1/arch/sparc64/kernel/pci_psycho.c linux-2.5.68-bk2/arch/sparc64/kernel/pci_psycho.c --- linux-2.5.68-bk1/arch/sparc64/kernel/pci_psycho.c 2003-04-19 19:49:58.000000000 -0700 +++ linux-2.5.68-bk2/arch/sparc64/kernel/pci_psycho.c 2003-04-21 15:53:39.000000000 -0700 @@ -713,7 +713,7 @@ #define PSYCHO_UEAFSR_RESV2 0x00000000007fffff /* Reserved */ #define PSYCHO_UE_AFAR 0x0038UL -static void psycho_ue_intr(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t psycho_ue_intr(int irq, void *dev_id, struct pt_regs *regs) { struct pci_controller_info *p = dev_id; unsigned long afsr_reg = p->controller_regs + PSYCHO_UE_AFSR; @@ -730,7 +730,7 @@ (PSYCHO_UEAFSR_PPIO | PSYCHO_UEAFSR_PDRD | PSYCHO_UEAFSR_PDWR | PSYCHO_UEAFSR_SPIO | PSYCHO_UEAFSR_SDRD | PSYCHO_UEAFSR_SDWR); if (!error_bits) - return; + return IRQ_NONE; psycho_write(afsr_reg, error_bits); /* Log the error. */ @@ -769,6 +769,8 @@ /* Interrogate IOMMU for error status. */ psycho_check_iommu_error(p, afsr, afar, UE_ERR); + + return IRQ_HANDLED; } /* Correctable Errors. */ @@ -788,7 +790,7 @@ #define PSYCHO_CEAFSR_RESV2 0x00000000007fffff /* Reserved */ #define PSYCHO_CE_AFAR 0x0040UL -static void psycho_ce_intr(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t psycho_ce_intr(int irq, void *dev_id, struct pt_regs *regs) { struct pci_controller_info *p = dev_id; unsigned long afsr_reg = p->controller_regs + PSYCHO_CE_AFSR; @@ -805,7 +807,7 @@ (PSYCHO_CEAFSR_PPIO | PSYCHO_CEAFSR_PDRD | PSYCHO_CEAFSR_PDWR | PSYCHO_CEAFSR_SPIO | PSYCHO_CEAFSR_SDRD | PSYCHO_CEAFSR_SDWR); if (!error_bits) - return; + return IRQ_NONE; psycho_write(afsr_reg, error_bits); /* Log the error. */ @@ -847,6 +849,8 @@ if (!reported) printk("(none)"); printk("]\n"); + + return IRQ_HANDLED; } /* PCI Errors. They are signalled by the PCI bus module since they @@ -871,7 +875,7 @@ #define PSYCHO_PCI_AFAR_A 0x2018UL #define PSYCHO_PCI_AFAR_B 0x4018UL -static void psycho_pcierr_intr(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t psycho_pcierr_intr(int irq, void *dev_id, struct pt_regs *regs) { struct pci_pbm_info *pbm = dev_id; struct pci_controller_info *p = pbm->parent; @@ -899,7 +903,7 @@ PSYCHO_PCIAFSR_SMA | PSYCHO_PCIAFSR_STA | PSYCHO_PCIAFSR_SRTRY | PSYCHO_PCIAFSR_SPERR); if (!error_bits) - return; + return IRQ_NONE; psycho_write(afsr_reg, error_bits); /* Log the error. */ @@ -968,6 +972,8 @@ if (error_bits & (PSYCHO_PCIAFSR_PPERR | PSYCHO_PCIAFSR_SPERR)) pci_scan_for_parity_error(p, pbm, pbm->pci_bus); + + return IRQ_HANDLED; } /* XXX What about PowerFail/PowerManagement??? -DaveM */ diff -urN linux-2.5.68-bk1/arch/sparc64/kernel/pci_sabre.c linux-2.5.68-bk2/arch/sparc64/kernel/pci_sabre.c --- linux-2.5.68-bk1/arch/sparc64/kernel/pci_sabre.c 2003-04-19 19:51:13.000000000 -0700 +++ linux-2.5.68-bk2/arch/sparc64/kernel/pci_sabre.c 2003-04-21 15:53:39.000000000 -0700 @@ -744,7 +744,7 @@ spin_unlock_irqrestore(&iommu->lock, flags); } -static void sabre_ue_intr(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t sabre_ue_intr(int irq, void *dev_id, struct pt_regs *regs) { struct pci_controller_info *p = dev_id; unsigned long afsr_reg = p->controller_regs + SABRE_UE_AFSR; @@ -762,7 +762,7 @@ SABRE_UEAFSR_SDRD | SABRE_UEAFSR_SDWR | SABRE_UEAFSR_SDTE | SABRE_UEAFSR_PDTE); if (!error_bits) - return; + return IRQ_NONE; sabre_write(afsr_reg, error_bits); /* Log the error. */ @@ -800,9 +800,11 @@ /* Interrogate IOMMU for error status. */ sabre_check_iommu_error(p, afsr, afar); + + return IRQ_HANDLED; } -static void sabre_ce_intr(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t sabre_ce_intr(int irq, void *dev_id, struct pt_regs *regs) { struct pci_controller_info *p = dev_id; unsigned long afsr_reg = p->controller_regs + SABRE_CE_AFSR; @@ -819,7 +821,7 @@ (SABRE_CEAFSR_PDRD | SABRE_CEAFSR_PDWR | SABRE_CEAFSR_SDRD | SABRE_CEAFSR_SDWR); if (!error_bits) - return; + return IRQ_NONE; sabre_write(afsr_reg, error_bits); /* Log the error. */ @@ -854,9 +856,11 @@ if (!reported) printk("(none)"); printk("]\n"); + + return IRQ_HANDLED; } -static void sabre_pcierr_intr(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t sabre_pcierr_intr(int irq, void *dev_id, struct pt_regs *regs) { struct pci_controller_info *p = dev_id; unsigned long afsr_reg, afar_reg; @@ -877,7 +881,7 @@ SABRE_PIOAFSR_SMA | SABRE_PIOAFSR_STA | SABRE_PIOAFSR_SRTRY | SABRE_PIOAFSR_SPERR); if (!error_bits) - return; + return IRQ_NONE; sabre_write(afsr_reg, error_bits); /* Log the error. */ @@ -947,6 +951,8 @@ pci_scan_for_parity_error(p, &p->pbm_A, p->pbm_A.pci_bus); pci_scan_for_parity_error(p, &p->pbm_B, p->pbm_B.pci_bus); } + + return IRQ_HANDLED; } /* XXX What about PowerFail/PowerManagement??? -DaveM */ diff -urN linux-2.5.68-bk1/arch/sparc64/kernel/pci_schizo.c linux-2.5.68-bk2/arch/sparc64/kernel/pci_schizo.c --- linux-2.5.68-bk1/arch/sparc64/kernel/pci_schizo.c 2003-04-19 19:50:07.000000000 -0700 +++ linux-2.5.68-bk2/arch/sparc64/kernel/pci_schizo.c 2003-04-21 15:53:39.000000000 -0700 @@ -672,7 +672,7 @@ #define SCHIZO_UEAFSR_MTAG 0x000000000000e000UL #define SCHIZO_UEAFSR_ECCSYND 0x00000000000001ffUL -static void schizo_ue_intr(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t schizo_ue_intr(int irq, void *dev_id, struct pt_regs *regs) { struct pci_controller_info *p = dev_id; unsigned long afsr_reg = p->controller_regs + SCHIZO_UE_AFSR; @@ -697,7 +697,7 @@ (SCHIZO_UEAFSR_PPIO | SCHIZO_UEAFSR_PDRD | SCHIZO_UEAFSR_PDWR | SCHIZO_UEAFSR_SPIO | SCHIZO_UEAFSR_SDMA); if (!error_bits) - return; + return IRQ_NONE; schizo_write(afsr_reg, error_bits); /* Log the error. */ @@ -740,6 +740,8 @@ schizo_check_iommu_error(p, UE_ERR); schizo_clear_other_err_intr(irq); + + return IRQ_HANDLED; } #define SCHIZO_CE_AFSR 0x10040UL @@ -760,7 +762,7 @@ #define SCHIZO_CEAFSR_MTAG 0x000000000000e000UL #define SCHIZO_CEAFSR_ECCSYND 0x00000000000001ffUL -static void schizo_ce_intr(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t schizo_ce_intr(int irq, void *dev_id, struct pt_regs *regs) { struct pci_controller_info *p = dev_id; unsigned long afsr_reg = p->controller_regs + SCHIZO_CE_AFSR; @@ -785,7 +787,7 @@ (SCHIZO_CEAFSR_PPIO | SCHIZO_CEAFSR_PDRD | SCHIZO_CEAFSR_PDWR | SCHIZO_CEAFSR_SPIO | SCHIZO_CEAFSR_SDMA); if (!error_bits) - return; + return IRQ_NONE; schizo_write(afsr_reg, error_bits); /* Log the error. */ @@ -829,6 +831,8 @@ printk("]\n"); schizo_clear_other_err_intr(irq); + + return IRQ_HANDLED; } #define SCHIZO_PCI_AFSR 0x2010UL @@ -852,7 +856,7 @@ #define SCHIZO_PCIAFSR_MEM 0x0000000020000000UL #define SCHIZO_PCIAFSR_IO 0x0000000010000000UL -static void schizo_pcierr_intr(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t schizo_pcierr_intr(int irq, void *dev_id, struct pt_regs *regs) { struct pci_pbm_info *pbm = dev_id; struct pci_controller_info *p = pbm->parent; @@ -886,7 +890,7 @@ SCHIZO_PCIAFSR_SRTRY | SCHIZO_PCIAFSR_SPERR | SCHIZO_PCIAFSR_STTO | SCHIZO_PCIAFSR_SUNUS); if (!error_bits) - return; + return IRQ_NONE; schizo_write(afsr_reg, error_bits); /* Log the error. */ @@ -974,6 +978,8 @@ pci_scan_for_parity_error(p, pbm, pbm->pci_bus); schizo_clear_other_err_intr(irq); + + return IRQ_HANDLED; } #define SCHIZO_SAFARI_ERRLOG 0x10018UL @@ -1002,7 +1008,7 @@ /* We only expect UNMAP errors here. The rest of the Safari errors * are marked fatal and thus cause a system reset. */ -static void schizo_safarierr_intr(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t schizo_safarierr_intr(int irq, void *dev_id, struct pt_regs *regs) { struct pci_controller_info *p = dev_id; u64 errlog; @@ -1016,7 +1022,7 @@ p->index, errlog); schizo_clear_other_err_intr(irq); - return; + return IRQ_HANDLED; } printk("SCHIZO%d: Safari interrupt, UNMAPPED error, interrogating IOMMUs.\n", @@ -1024,6 +1030,7 @@ schizo_check_iommu_error(p, SAFARI_ERR); schizo_clear_other_err_intr(irq); + return IRQ_HANDLED; } /* Nearly identical to PSYCHO equivalents... */ diff -urN linux-2.5.68-bk1/arch/sparc64/kernel/power.c linux-2.5.68-bk2/arch/sparc64/kernel/power.c --- linux-2.5.68-bk1/arch/sparc64/kernel/power.c 2003-04-19 19:50:45.000000000 -0700 +++ linux-2.5.68-bk2/arch/sparc64/kernel/power.c 2003-04-21 15:53:39.000000000 -0700 @@ -26,12 +26,15 @@ static DECLARE_WAIT_QUEUE_HEAD(powerd_wait); static int button_pressed; -static void power_handler(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t power_handler(int irq, void *dev_id, struct pt_regs *regs) { if (button_pressed == 0) { wake_up(&powerd_wait); button_pressed = 1; } + + /* FIXME: Check registers for status... */ + return IRQ_HANDLED; } #endif /* CONFIG_PCI */ diff -urN linux-2.5.68-bk1/arch/sparc64/kernel/sbus.c linux-2.5.68-bk2/arch/sparc64/kernel/sbus.c --- linux-2.5.68-bk1/arch/sparc64/kernel/sbus.c 2003-04-19 19:51:18.000000000 -0700 +++ linux-2.5.68-bk2/arch/sparc64/kernel/sbus.c 2003-04-21 15:53:39.000000000 -0700 @@ -813,7 +813,7 @@ #define SYSIO_UEAFSR_SIZE 0x00001c0000000000 /* Bad transfer size is 2**SIZE */ #define SYSIO_UEAFSR_MID 0x000003e000000000 /* UPA MID causing the fault */ #define SYSIO_UEAFSR_RESV2 0x0000001fffffffff /* Reserved */ -static void sysio_ue_handler(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t sysio_ue_handler(int irq, void *dev_id, struct pt_regs *regs) { struct sbus_bus *sbus = dev_id; struct sbus_iommu *iommu = sbus->iommu; @@ -867,6 +867,8 @@ if (!reported) printk("(none)"); printk("]\n"); + + return IRQ_HANDLED; } #define SYSIO_CE_AFSR 0x0040UL @@ -883,7 +885,7 @@ #define SYSIO_CEAFSR_SIZE 0x00001c0000000000 /* Bad transfer size is 2**SIZE */ #define SYSIO_CEAFSR_MID 0x000003e000000000 /* UPA MID causing the fault */ #define SYSIO_CEAFSR_RESV2 0x0000001fffffffff /* Reserved */ -static void sysio_ce_handler(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t sysio_ce_handler(int irq, void *dev_id, struct pt_regs *regs) { struct sbus_bus *sbus = dev_id; struct sbus_iommu *iommu = sbus->iommu; @@ -942,6 +944,8 @@ if (!reported) printk("(none)"); printk("]\n"); + + return IRQ_HANDLED; } #define SYSIO_SBUS_AFSR 0x2010UL @@ -958,7 +962,7 @@ #define SYSIO_SBAFSR_SIZE 0x00001c0000000000 /* Size of transfer */ #define SYSIO_SBAFSR_MID 0x000003e000000000 /* MID causing the error */ #define SYSIO_SBAFSR_RESV3 0x0000001fffffffff /* Reserved */ -static void sysio_sbus_error_handler(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t sysio_sbus_error_handler(int irq, void *dev_id, struct pt_regs *regs) { struct sbus_bus *sbus = dev_id; struct sbus_iommu *iommu = sbus->iommu; @@ -1013,6 +1017,8 @@ printk("]\n"); /* XXX check iommu/strbuf for further error status XXX */ + + return IRQ_HANDLED; } #define ECC_CONTROL 0x0020UL diff -urN linux-2.5.68-bk1/arch/sparc64/kernel/setup.c linux-2.5.68-bk2/arch/sparc64/kernel/setup.c --- linux-2.5.68-bk1/arch/sparc64/kernel/setup.c 2003-04-19 19:49:09.000000000 -0700 +++ linux-2.5.68-bk2/arch/sparc64/kernel/setup.c 2003-04-21 15:53:39.000000000 -0700 @@ -31,6 +31,7 @@ #include #include #include +#include #include #include diff -urN linux-2.5.68-bk1/arch/sparc64/kernel/time.c linux-2.5.68-bk2/arch/sparc64/kernel/time.c --- linux-2.5.68-bk1/arch/sparc64/kernel/time.c 2003-04-19 19:49:31.000000000 -0700 +++ linux-2.5.68-bk2/arch/sparc64/kernel/time.c 2003-04-21 15:53:39.000000000 -0700 @@ -477,7 +477,7 @@ } } -static void timer_interrupt(int irq, void *dev_id, struct pt_regs * regs) +static irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs * regs) { unsigned long ticks, pstate; @@ -509,6 +509,8 @@ timer_check_rtc(); write_sequnlock(&xtime_lock); + + return IRQ_HANDLED; } #ifdef CONFIG_SMP @@ -925,7 +927,7 @@ } /* This is gets the master TICK_INT timer going. */ -static unsigned long sparc64_init_timers(void (*cfunc)(int, void *, struct pt_regs *)) +static unsigned long sparc64_init_timers(irqreturn_t (*cfunc)(int, void *, struct pt_regs *)) { unsigned long pstate, clock; int node, err; diff -urN linux-2.5.68-bk1/arch/sparc64/mm/init.c linux-2.5.68-bk2/arch/sparc64/mm/init.c --- linux-2.5.68-bk1/arch/sparc64/mm/init.c 2003-04-21 15:53:35.000000000 -0700 +++ linux-2.5.68-bk2/arch/sparc64/mm/init.c 2003-04-21 15:53:39.000000000 -0700 @@ -1173,7 +1173,7 @@ } color = VPTE_COLOR(address); - page = alloc_pages(GFP_KERNEL, DC_ALIAS_SHIFT); + page = alloc_pages(GFP_KERNEL|__GFP_REPEAT, DC_ALIAS_SHIFT); if (page) { unsigned long *to_free; unsigned long paddr; diff -urN linux-2.5.68-bk1/drivers/block/DAC960.c linux-2.5.68-bk2/drivers/block/DAC960.c --- linux-2.5.68-bk1/drivers/block/DAC960.c 2003-04-21 15:53:35.000000000 -0700 +++ linux-2.5.68-bk2/drivers/block/DAC960.c 2003-04-21 15:53:39.000000000 -0700 @@ -2586,7 +2586,7 @@ const struct pci_device_id *entry) { struct DAC960_privdata *privdata = (struct DAC960_privdata *)entry->driver_data; - void (*InterruptHandler)(int, void *, Registers_T *) = privdata->InterruptHandler; + irqreturn_t (*InterruptHandler)(int, void *, Registers_T *) = privdata->InterruptHandler; unsigned int MemoryWindowSize = privdata->MemoryWindowSize; DAC960_Controller_T *Controller = NULL; unsigned char DeviceFunction = PCI_Device->devfn; @@ -5112,7 +5112,7 @@ Controllers. */ -static void DAC960_BA_InterruptHandler(int IRQ_Channel, +static irqreturn_t DAC960_BA_InterruptHandler(int IRQ_Channel, void *DeviceIdentifier, Registers_T *InterruptRegisters) { @@ -5120,6 +5120,7 @@ void *ControllerBaseAddress = Controller->BaseAddress; DAC960_V2_StatusMailbox_T *NextStatusMailbox; ProcessorFlags_T ProcessorFlags; + /* Acquire exclusive access to Controller. */ @@ -5154,6 +5155,7 @@ Release exclusive access to Controller. */ DAC960_ReleaseControllerLockIH(Controller, &ProcessorFlags); + return IRQ_HANDLED; } @@ -5162,7 +5164,7 @@ Controllers. */ -static void DAC960_LP_InterruptHandler(int IRQ_Channel, +static irqreturn_t DAC960_LP_InterruptHandler(int IRQ_Channel, void *DeviceIdentifier, Registers_T *InterruptRegisters) { @@ -5204,6 +5206,7 @@ Release exclusive access to Controller. */ DAC960_ReleaseControllerLockIH(Controller, &ProcessorFlags); + return IRQ_HANDLED; } @@ -5212,7 +5215,7 @@ Controllers. */ -static void DAC960_LA_InterruptHandler(int IRQ_Channel, +static irqreturn_t DAC960_LA_InterruptHandler(int IRQ_Channel, void *DeviceIdentifier, Registers_T *InterruptRegisters) { @@ -5250,6 +5253,7 @@ Release exclusive access to Controller. */ DAC960_ReleaseControllerLockIH(Controller, &ProcessorFlags); + return IRQ_HANDLED; } @@ -5258,7 +5262,7 @@ Controllers. */ -static void DAC960_PG_InterruptHandler(int IRQ_Channel, +static irqreturn_t DAC960_PG_InterruptHandler(int IRQ_Channel, void *DeviceIdentifier, Registers_T *InterruptRegisters) { @@ -5296,6 +5300,7 @@ Release exclusive access to Controller. */ DAC960_ReleaseControllerLockIH(Controller, &ProcessorFlags); + return IRQ_HANDLED; } @@ -5304,7 +5309,7 @@ Controllers. */ -static void DAC960_PD_InterruptHandler(int IRQ_Channel, +static irqreturn_t DAC960_PD_InterruptHandler(int IRQ_Channel, void *DeviceIdentifier, Registers_T *InterruptRegisters) { @@ -5338,6 +5343,7 @@ Release exclusive access to Controller. */ DAC960_ReleaseControllerLockIH(Controller, &ProcessorFlags); + return IRQ_HANDLED; } @@ -5350,7 +5356,7 @@ an arbitrary buffer. */ -static void DAC960_P_InterruptHandler(int IRQ_Channel, +static irqreturn_t DAC960_P_InterruptHandler(int IRQ_Channel, void *DeviceIdentifier, Registers_T *InterruptRegisters) { @@ -5419,6 +5425,7 @@ Release exclusive access to Controller. */ DAC960_ReleaseControllerLockIH(Controller, &ProcessorFlags); + return IRQ_HANDLED; } diff -urN linux-2.5.68-bk1/drivers/block/DAC960.h linux-2.5.68-bk2/drivers/block/DAC960.h --- linux-2.5.68-bk1/drivers/block/DAC960.h 2003-04-21 15:53:35.000000000 -0700 +++ linux-2.5.68-bk2/drivers/block/DAC960.h 2003-04-21 15:53:39.000000000 -0700 @@ -2229,7 +2229,7 @@ struct DAC960_privdata { DAC960_HardwareType_T HardwareType; DAC960_FirmwareType_T FirmwareType; - void (*InterruptHandler)(int, void *, Registers_T *); + irqreturn_t (*InterruptHandler)(int, void *, Registers_T *); unsigned int MemoryWindowSize; }; @@ -4233,12 +4233,12 @@ static void DAC960_V1_QueueReadWriteCommand(DAC960_Command_T *); static void DAC960_V2_QueueReadWriteCommand(DAC960_Command_T *); static void DAC960_RequestFunction(RequestQueue_T *); -static void DAC960_BA_InterruptHandler(int, void *, Registers_T *); -static void DAC960_LP_InterruptHandler(int, void *, Registers_T *); -static void DAC960_LA_InterruptHandler(int, void *, Registers_T *); -static void DAC960_PG_InterruptHandler(int, void *, Registers_T *); -static void DAC960_PD_InterruptHandler(int, void *, Registers_T *); -static void DAC960_P_InterruptHandler(int, void *, Registers_T *); +static irqreturn_t DAC960_BA_InterruptHandler(int, void *, Registers_T *); +static irqreturn_t DAC960_LP_InterruptHandler(int, void *, Registers_T *); +static irqreturn_t DAC960_LA_InterruptHandler(int, void *, Registers_T *); +static irqreturn_t DAC960_PG_InterruptHandler(int, void *, Registers_T *); +static irqreturn_t DAC960_PD_InterruptHandler(int, void *, Registers_T *); +static irqreturn_t DAC960_P_InterruptHandler(int, void *, Registers_T *); static void DAC960_V1_QueueMonitoringCommand(DAC960_Command_T *); static void DAC960_V2_QueueMonitoringCommand(DAC960_Command_T *); static void DAC960_MonitoringTimerFunction(unsigned long); diff -urN linux-2.5.68-bk1/drivers/block/cciss.c linux-2.5.68-bk2/drivers/block/cciss.c --- linux-2.5.68-bk1/drivers/block/cciss.c 2003-04-21 15:53:35.000000000 -0700 +++ linux-2.5.68-bk2/drivers/block/cciss.c 2003-04-21 15:53:39.000000000 -0700 @@ -1965,7 +1965,7 @@ start_io(h); } -static void do_cciss_intr(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t do_cciss_intr(int irq, void *dev_id, struct pt_regs *regs) { ctlr_info_t *h = dev_id; CommandList_struct *c; @@ -1975,7 +1975,7 @@ /* Is this interrupt for us? */ if ( h->access.intr_pending(h) == 0) - return; + return IRQ_NONE; /* * If there are completed commands in the completion queue, @@ -2023,6 +2023,7 @@ */ spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags); blk_start_queue(&h->queue); + return IRQ_HANDLED; } /* * We cannot read the structure directly, for portablity we must use diff -urN linux-2.5.68-bk1/drivers/block/cpqarray.c linux-2.5.68-bk2/drivers/block/cpqarray.c --- linux-2.5.68-bk1/drivers/block/cpqarray.c 2003-04-19 19:48:51.000000000 -0700 +++ linux-2.5.68-bk2/drivers/block/cpqarray.c 2003-04-21 15:53:39.000000000 -0700 @@ -144,7 +144,7 @@ static inline void complete_buffers(struct bio *bio, int ok); static inline void complete_command(cmdlist_t *cmd, int timeout); -static void do_ida_intr(int irq, void *dev_id, struct pt_regs * regs); +static irqreturn_t do_ida_intr(int irq, void *dev_id, struct pt_regs * regs); static void ida_timer(unsigned long tdata); static int ida_revalidate(struct gendisk *disk); static int revalidate_allvol(kdev_t dev); @@ -929,7 +929,7 @@ * Find the command on the completion queue, remove it, tell the OS and * try to queue up more IO */ -static void do_ida_intr(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t do_ida_intr(int irq, void *dev_id, struct pt_regs *regs) { ctlr_info_t *h = dev_id; cmdlist_t *c; @@ -940,7 +940,7 @@ istat = h->access.intr_pending(h); /* Is this interrupt for us? */ if (istat == 0) - return; + return IRQ_NONE; /* * If there are completed commands in the completion queue, @@ -991,6 +991,7 @@ */ do_ida_request(&h->queue); spin_unlock_irqrestore(IDA_LOCK(h->ctlr), flags); + return IRQ_HANDLED; } /* diff -urN linux-2.5.68-bk1/drivers/char/applicom.c linux-2.5.68-bk2/drivers/char/applicom.c --- linux-2.5.68-bk1/drivers/char/applicom.c 2003-04-19 19:51:08.000000000 -0700 +++ linux-2.5.68-bk2/drivers/char/applicom.c 2003-04-21 15:53:39.000000000 -0700 @@ -108,7 +108,7 @@ static ssize_t ac_write (struct file *, const char *, size_t, loff_t *); static int ac_ioctl(struct inode *, struct file *, unsigned int, unsigned long); -static void ac_interrupt(int, void *, struct pt_regs *); +static irqreturn_t ac_interrupt(int, void *, struct pt_regs *); static struct file_operations ac_fops = { .owner = THIS_MODULE, @@ -606,11 +606,12 @@ } } -static void ac_interrupt(int vec, void *dev_instance, struct pt_regs *regs) +static irqreturn_t ac_interrupt(int vec, void *dev_instance, struct pt_regs *regs) { unsigned int i; unsigned int FlagInt; unsigned int LoopCount; + int handled = 0; // printk("Applicom interrupt on IRQ %d occurred\n", vec); @@ -632,6 +633,7 @@ continue; } + handled = 1; FlagInt = 1; writeb(0, apbs[i].RamIO + RAM_IT_TO_PC); @@ -675,6 +677,7 @@ else LoopCount++; } while(LoopCount < 2); + return IRQ_RETVAL(handled); } diff -urN linux-2.5.68-bk1/drivers/char/drm/mga_irq.c linux-2.5.68-bk2/drivers/char/drm/mga_irq.c --- linux-2.5.68-bk1/drivers/char/drm/mga_irq.c 2003-04-19 19:48:46.000000000 -0700 +++ linux-2.5.68-bk2/drivers/char/drm/mga_irq.c 2003-04-21 15:53:39.000000000 -0700 @@ -36,7 +36,7 @@ #include "mga_drm.h" #include "mga_drv.h" -void mga_dma_service( DRM_IRQ_ARGS ) +irqreturn_t mga_dma_service( DRM_IRQ_ARGS ) { drm_device_t *dev = (drm_device_t *) arg; drm_mga_private_t *dev_priv = @@ -51,7 +51,9 @@ atomic_inc(&dev->vbl_received); DRM_WAKEUP(&dev->vbl_queue); DRM(vbl_send_signals)( dev ); + return IRQ_HANDLED; } + return IRQ_NONE; } int mga_vblank_wait(drm_device_t *dev, unsigned int *sequence) diff -urN linux-2.5.68-bk1/drivers/char/drm/r128_irq.c linux-2.5.68-bk2/drivers/char/drm/r128_irq.c --- linux-2.5.68-bk1/drivers/char/drm/r128_irq.c 2003-04-19 19:51:23.000000000 -0700 +++ linux-2.5.68-bk2/drivers/char/drm/r128_irq.c 2003-04-21 15:53:39.000000000 -0700 @@ -36,7 +36,7 @@ #include "r128_drm.h" #include "r128_drv.h" -void r128_dma_service( DRM_IRQ_ARGS ) +irqreturn_t r128_dma_service( DRM_IRQ_ARGS ) { drm_device_t *dev = (drm_device_t *) arg; drm_r128_private_t *dev_priv = @@ -51,7 +51,9 @@ atomic_inc(&dev->vbl_received); DRM_WAKEUP(&dev->vbl_queue); DRM(vbl_send_signals)( dev ); + return IRQ_HANDLED; } + return IRQ_NONE; } int DRM(vblank_wait)(drm_device_t *dev, unsigned int *sequence) diff -urN linux-2.5.68-bk1/drivers/char/ftape/lowlevel/fdc-io.c linux-2.5.68-bk2/drivers/char/ftape/lowlevel/fdc-io.c --- linux-2.5.68-bk1/drivers/char/ftape/lowlevel/fdc-io.c 2003-04-19 19:48:56.000000000 -0700 +++ linux-2.5.68-bk2/drivers/char/ftape/lowlevel/fdc-io.c 2003-04-21 15:53:39.000000000 -0700 @@ -1298,18 +1298,21 @@ TRACE_EXIT 0; } -static void ftape_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t ftape_interrupt(int irq, void *dev_id, struct pt_regs *regs) { void (*handler) (void) = *fdc.hook; + int handled = 0; TRACE_FUN(ft_t_any); *fdc.hook = NULL; if (handler) { + handled = 1; handler(); } else { TRACE(ft_t_bug, "Unexpected ftape interrupt"); } TRACE_EXIT; + return IRQ_RETVAL(handled); } int fdc_grab_irq_and_dma(void) diff -urN linux-2.5.68-bk1/drivers/char/ipmi/ipmi_kcs_intf.c linux-2.5.68-bk2/drivers/char/ipmi/ipmi_kcs_intf.c --- linux-2.5.68-bk1/drivers/char/ipmi/ipmi_kcs_intf.c 2003-04-19 19:48:46.000000000 -0700 +++ linux-2.5.68-bk2/drivers/char/ipmi/ipmi_kcs_intf.c 2003-04-21 15:53:39.000000000 -0700 @@ -629,6 +629,7 @@ atomic_set(&kcs_info->req_events, 1); } +#if 0 static int new_user(void *send_info) { if (!try_module_get(THIS_MODULE)) @@ -640,6 +641,7 @@ { module_put(THIS_MODULE); } +#endif static int initialized = 0; @@ -740,7 +742,7 @@ spin_unlock_irqrestore(&(kcs_info->kcs_lock), flags); } -static void kcs_irq_handler(int irq, void *data, struct pt_regs *regs) +static irqreturn_t kcs_irq_handler(int irq, void *data, struct pt_regs *regs) { struct kcs_info *kcs_info = (struct kcs_info *) data; unsigned long flags; @@ -759,6 +761,7 @@ kcs_event_handler(kcs_info, 0); out: spin_unlock_irqrestore(&(kcs_info->kcs_lock), flags); + return IRQ_HANDLED; } static struct ipmi_smi_handlers handlers = diff -urN linux-2.5.68-bk1/drivers/char/mwave/tp3780i.c linux-2.5.68-bk2/drivers/char/mwave/tp3780i.c --- linux-2.5.68-bk1/drivers/char/mwave/tp3780i.c 2003-04-19 19:48:51.000000000 -0700 +++ linux-2.5.68-bk2/drivers/char/mwave/tp3780i.c 2003-04-21 15:53:39.000000000 -0700 @@ -96,13 +96,14 @@ } -static void UartInterrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t UartInterrupt(int irq, void *dev_id, struct pt_regs *regs) { PRINTK_3(TRACE_TP3780I, "tp3780i::UartInterrupt entry irq %x dev_id %x\n", irq, (int) dev_id); + return IRQ_HANDLED; } -static void DspInterrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t DspInterrupt(int irq, void *dev_id, struct pt_regs *regs) { pMWAVE_DEVICE_DATA pDrvData = &mwave_s_mdd; DSP_3780I_CONFIG_SETTINGS *pSettings = &pDrvData->rBDData.rDspSettings; @@ -150,6 +151,7 @@ "tp3780i::DspInterrupt, return false from dsp3780i_GetIPCSource\n"); } PRINTK_1(TRACE_TP3780I, "tp3780i::DspInterrupt exit\n"); + return IRQ_HANDLED; } diff -urN linux-2.5.68-bk1/drivers/char/n_hdlc.c linux-2.5.68-bk2/drivers/char/n_hdlc.c --- linux-2.5.68-bk1/drivers/char/n_hdlc.c 2003-04-19 19:48:56.000000000 -0700 +++ linux-2.5.68-bk2/drivers/char/n_hdlc.c 2003-04-21 15:53:39.000000000 -0700 @@ -9,7 +9,7 @@ * Al Longyear , Paul Mackerras * * Original release 01/11/99 - * $Id: n_hdlc.c,v 4.2 2002/10/10 14:52:41 paulkf Exp $ + * $Id: n_hdlc.c,v 4.6 2003/04/21 19:14:07 paulkf Exp $ * * This code is released under the GNU General Public License (GPL) * @@ -78,7 +78,7 @@ */ #define HDLC_MAGIC 0x239e -#define HDLC_VERSION "$Revision: 4.2 $" +#define HDLC_VERSION "$Revision: 4.6 $" #include #include @@ -171,9 +171,9 @@ /* * HDLC buffer list manipulation functions */ -void n_hdlc_buf_list_init(N_HDLC_BUF_LIST *list); -void n_hdlc_buf_put(N_HDLC_BUF_LIST *list,N_HDLC_BUF *buf); -N_HDLC_BUF* n_hdlc_buf_get(N_HDLC_BUF_LIST *list); +static void n_hdlc_buf_list_init(N_HDLC_BUF_LIST *list); +static void n_hdlc_buf_put(N_HDLC_BUF_LIST *list,N_HDLC_BUF *buf); +static N_HDLC_BUF* n_hdlc_buf_get(N_HDLC_BUF_LIST *list); /* Local functions */ @@ -299,7 +299,6 @@ n_hdlc->tty = n_hdlc->backup_tty; } else { n_hdlc_release (n_hdlc); - MOD_DEC_USE_COUNT; } } @@ -339,8 +338,6 @@ tty->disc_data = n_hdlc; n_hdlc->tty = tty; - MOD_INC_USE_COUNT; - #if defined(TTY_NO_WRITE_SPLIT) /* change tty_io write() to not split large writes into 8K chunks */ set_bit(TTY_NO_WRITE_SPLIT,&tty->flags); @@ -903,7 +900,7 @@ * Arguments: list pointer to buffer list * Return Value: None */ -void n_hdlc_buf_list_init(N_HDLC_BUF_LIST *list) +static void n_hdlc_buf_list_init(N_HDLC_BUF_LIST *list) { memset(list,0,sizeof(N_HDLC_BUF_LIST)); spin_lock_init(&list->spinlock); @@ -920,7 +917,7 @@ * * Return Value: None */ -void n_hdlc_buf_put(N_HDLC_BUF_LIST *list,N_HDLC_BUF *buf) +static void n_hdlc_buf_put(N_HDLC_BUF_LIST *list,N_HDLC_BUF *buf) { unsigned long flags; spin_lock_irqsave(&list->spinlock,flags); @@ -950,7 +947,7 @@ * * pointer to HDLC buffer if available, otherwise NULL */ -N_HDLC_BUF* n_hdlc_buf_get(N_HDLC_BUF_LIST *list) +static N_HDLC_BUF* n_hdlc_buf_get(N_HDLC_BUF_LIST *list) { unsigned long flags; N_HDLC_BUF *buf; @@ -971,7 +968,25 @@ static int __init n_hdlc_init(void) { - static struct tty_ldisc n_hdlc_ldisc; + static struct tty_ldisc n_hdlc_ldisc = { + TTY_LDISC_MAGIC, /* magic */ + "hdlc", /* name */ + 0, /* num */ + 0, /* flags */ + n_hdlc_tty_open, /* open */ + n_hdlc_tty_close, /* close */ + 0, /* flush_buffer */ + 0, /* chars_in_buffer */ + n_hdlc_tty_read, /* read */ + n_hdlc_tty_write, /* write */ + n_hdlc_tty_ioctl, /* ioctl */ + 0, /* set_termios */ + n_hdlc_tty_poll, /* poll */ + n_hdlc_tty_receive, /* receive_buf */ + n_hdlc_tty_room, /* receive_room */ + n_hdlc_tty_wakeup, /* write_wakeup */ + THIS_MODULE /* owner */ + }; int status; /* range check maxframe arg */ @@ -983,21 +998,6 @@ printk("HDLC line discipline: version %s, maxframe=%u\n", szVersion, maxframe); - /* Register the tty discipline */ - - memset(&n_hdlc_ldisc, 0, sizeof (n_hdlc_ldisc)); - n_hdlc_ldisc.magic = TTY_LDISC_MAGIC; - n_hdlc_ldisc.name = "hdlc"; - n_hdlc_ldisc.open = n_hdlc_tty_open; - n_hdlc_ldisc.close = n_hdlc_tty_close; - n_hdlc_ldisc.read = n_hdlc_tty_read; - n_hdlc_ldisc.write = n_hdlc_tty_write; - n_hdlc_ldisc.ioctl = n_hdlc_tty_ioctl; - n_hdlc_ldisc.poll = n_hdlc_tty_poll; - n_hdlc_ldisc.receive_room = n_hdlc_tty_room; - n_hdlc_ldisc.receive_buf = n_hdlc_tty_receive; - n_hdlc_ldisc.write_wakeup = n_hdlc_tty_wakeup; - status = tty_register_ldisc(N_HDLC, &n_hdlc_ldisc); if (!status) printk (KERN_INFO"N_HDLC line discipline registered.\n"); diff -urN linux-2.5.68-bk1/drivers/char/pcmcia/synclink_cs.c linux-2.5.68-bk2/drivers/char/pcmcia/synclink_cs.c --- linux-2.5.68-bk1/drivers/char/pcmcia/synclink_cs.c 2003-04-19 19:49:10.000000000 -0700 +++ linux-2.5.68-bk2/drivers/char/pcmcia/synclink_cs.c 2003-04-21 15:53:39.000000000 -0700 @@ -1,7 +1,7 @@ /* * linux/drivers/char/pcmcia/synclink_cs.c * - * $Id: synclink_cs.c,v 4.4 2002/10/10 14:53:37 paulkf Exp $ + * $Id: synclink_cs.c,v 4.6 2003/04/21 17:46:55 paulkf Exp $ * * Device driver for Microgate SyncLink PC Card * multiprotocol serial adapter. @@ -442,9 +442,9 @@ /* * ioctl handlers */ -static int set_modem_info(MGSLPC_INFO *info, unsigned int cmd, - unsigned int *value); -static int get_modem_info(MGSLPC_INFO *info, unsigned int *value); +static int tiocmget(struct tty_struct *tty, struct file *file); +static int tiocmset(struct tty_struct *tty, struct file *file, + unsigned int set, unsigned int clear); static int get_stats(MGSLPC_INFO *info, struct mgsl_icount *user_icount); static int get_params(MGSLPC_INFO *info, MGSL_PARAMS *user_params); static int set_params(MGSLPC_INFO *info, MGSL_PARAMS *new_params); @@ -496,7 +496,7 @@ MODULE_LICENSE("GPL"); static char *driver_name = "SyncLink PC Card driver"; -static char *driver_version = "$Revision: 4.4 $"; +static char *driver_version = "$Revision: 4.6 $"; static struct tty_driver serial_driver, callout_driver; static int serial_refcount; @@ -2326,94 +2326,56 @@ return rc; } -/* Return state of the serial control/status signals - * - * Arguments: info pointer to device instance data - * value pointer to int to hold returned info - * - * Return Value: 0 if success, otherwise error code +/* return the state of the serial control and status signals */ -static int get_modem_info(MGSLPC_INFO * info, unsigned int *value) +static int tiocmget(struct tty_struct *tty, struct file *file) { + MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data; unsigned int result; unsigned long flags; - int err; - + spin_lock_irqsave(&info->lock,flags); get_signals(info); spin_unlock_irqrestore(&info->lock,flags); - result = ((info->serial_signals & SerialSignal_RTS) ? TIOCM_RTS:0) | - ((info->serial_signals & SerialSignal_DTR) ? TIOCM_DTR:0) | - ((info->serial_signals & SerialSignal_DCD) ? TIOCM_CAR:0) | - ((info->serial_signals & SerialSignal_RI) ? TIOCM_RNG:0) | - ((info->serial_signals & SerialSignal_DSR) ? TIOCM_DSR:0) | - ((info->serial_signals & SerialSignal_CTS) ? TIOCM_CTS:0); + result = ((info->serial_signals & SerialSignal_RTS) ? TIOCM_RTS:0) + + ((info->serial_signals & SerialSignal_DTR) ? TIOCM_DTR:0) + + ((info->serial_signals & SerialSignal_DCD) ? TIOCM_CAR:0) + + ((info->serial_signals & SerialSignal_RI) ? TIOCM_RNG:0) + + ((info->serial_signals & SerialSignal_DSR) ? TIOCM_DSR:0) + + ((info->serial_signals & SerialSignal_CTS) ? TIOCM_CTS:0); if (debug_level >= DEBUG_LEVEL_INFO) - printk("mgslpc_get_modem_info %s value=%08X\n", info->device_name, result); - - PUT_USER(err,result,value); - return err ? -EFAULT : 0; + printk("%s(%d):%s tiocmget() value=%08X\n", + __FILE__,__LINE__, info->device_name, result ); + return result; } -/* Set the state of the modem control signals (DTR/RTS) - * - * Arguments: - * - * info pointer to device instance data - * cmd signal command: TIOCMBIS = set bit TIOCMBIC = clear bit - * TIOCMSET = set/clear signal values - * value bit mask for command - * - * Return Value: 0 if success, otherwise error code +/* set modem control signals (DTR/RTS) */ -static int set_modem_info(MGSLPC_INFO * info, unsigned int cmd, - unsigned int *value) +static int tiocmset(struct tty_struct *tty, struct file *file, + unsigned int set, unsigned int clear) { - int error; - unsigned int arg; + MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data; unsigned long flags; - + if (debug_level >= DEBUG_LEVEL_INFO) - printk("mgslpc_set_modem_info %s\n", info->device_name); - - GET_USER(error,arg,value); - if (error) - return error; - - switch (cmd) { - case TIOCMBIS: - if (arg & TIOCM_RTS) - info->serial_signals |= SerialSignal_RTS; - if (arg & TIOCM_DTR) - info->serial_signals |= SerialSignal_DTR; - break; - case TIOCMBIC: - if (arg & TIOCM_RTS) - info->serial_signals &= ~SerialSignal_RTS; - if (arg & TIOCM_DTR) - info->serial_signals &= ~SerialSignal_DTR; - break; - case TIOCMSET: - if (arg & TIOCM_RTS) - info->serial_signals |= SerialSignal_RTS; - else - info->serial_signals &= ~SerialSignal_RTS; - - if (arg & TIOCM_DTR) - info->serial_signals |= SerialSignal_DTR; - else - info->serial_signals &= ~SerialSignal_DTR; - break; - default: - return -EINVAL; - } - + printk("%s(%d):%s tiocmset(%x,%x)\n", + __FILE__,__LINE__,info->device_name, set, clear); + + if (set & TIOCM_RTS) + info->serial_signals |= SerialSignal_RTS; + if (set & TIOCM_DTR) + info->serial_signals |= SerialSignal_DTR; + if (clear & TIOCM_RTS) + info->serial_signals &= ~SerialSignal_RTS; + if (clear & TIOCM_DTR) + info->serial_signals &= ~SerialSignal_DTR; + spin_lock_irqsave(&info->lock,flags); set_signals(info); spin_unlock_irqrestore(&info->lock,flags); - + return 0; } @@ -2482,12 +2444,6 @@ unsigned long flags; switch (cmd) { - case TIOCMGET: - return get_modem_info(info, (unsigned int *) arg); - case TIOCMBIS: - case TIOCMBIC: - case TIOCMSET: - return set_modem_info(info, cmd, (unsigned int *) arg); case MGSL_IOCGPARAMS: return get_params(info,(MGSL_PARAMS *)arg); case MGSL_IOCSPARAMS: @@ -2687,7 +2643,6 @@ if (debug_level >= DEBUG_LEVEL_INFO) printk("%s(%d):mgslpc_close(%s) exit, count=%d\n", __FILE__,__LINE__, tty->driver.name, info->count); - MOD_DEC_USE_COUNT; } /* Wait until the transmitter is empty. @@ -2939,8 +2894,6 @@ printk("%s(%d):mgslpc_open(%s), old ref count = %d\n", __FILE__,__LINE__,tty->driver.name, info->count); - MOD_INC_USE_COUNT; - /* If port is closing, signal caller to try again */ if (tty_hung_up_p(filp) || info->flags & ASYNC_CLOSING){ if (info->flags & ASYNC_CLOSING) @@ -2995,7 +2948,6 @@ cleanup: if (retval) { - MOD_DEC_USE_COUNT; if(info->count) info->count--; } @@ -3247,6 +3199,7 @@ memset(&serial_driver, 0, sizeof(struct tty_driver)); serial_driver.magic = TTY_DRIVER_MAGIC; + serial_driver.owner = THIS_MODULE; serial_driver.driver_name = "synclink_cs"; serial_driver.name = "ttySLP"; serial_driver.major = ttymajor; @@ -3282,6 +3235,8 @@ serial_driver.stop = tx_pause; serial_driver.start = tx_release; serial_driver.hangup = mgslpc_hangup; + serial_driver.tiocmget = tiocmget; + serial_driver.tiocmset = tiocmset; /* * The callout device is just like normal device except for @@ -4386,7 +4341,7 @@ { MGSLPC_INFO *info = d->priv; int err; - long flags; + unsigned long flags; if (debug_level >= DEBUG_LEVEL_INFO) printk("mgslpc_sppp_open(%s)\n",info->netname); @@ -4398,7 +4353,6 @@ return -EBUSY; } info->netcount=1; - MOD_INC_USE_COUNT; spin_unlock_irqrestore(&info->netlock, flags); /* claim resources and init adapter */ @@ -4421,7 +4375,6 @@ open_fail: spin_lock_irqsave(&info->netlock, flags); info->netcount=0; - MOD_DEC_USE_COUNT; spin_unlock_irqrestore(&info->netlock, flags); return err; } @@ -4429,7 +4382,7 @@ void mgslpc_sppp_tx_timeout(struct net_device *dev) { MGSLPC_INFO *info = dev->priv; - long flags; + unsigned long flags; if (debug_level >= DEBUG_LEVEL_INFO) printk("mgslpc_sppp_tx_timeout(%s)\n",info->netname); @@ -4491,7 +4444,6 @@ spin_lock_irqsave(&info->netlock, flags); info->netcount=0; - MOD_DEC_USE_COUNT; spin_unlock_irqrestore(&info->netlock, flags); return 0; } diff -urN linux-2.5.68-bk1/drivers/char/rtc.c linux-2.5.68-bk2/drivers/char/rtc.c --- linux-2.5.68-bk1/drivers/char/rtc.c 2003-04-19 19:49:11.000000000 -0700 +++ linux-2.5.68-bk2/drivers/char/rtc.c 2003-04-21 15:53:39.000000000 -0700 @@ -180,7 +180,7 @@ * (See ./arch/XXXX/kernel/time.c for the set_rtc_mmss() function.) */ -static void rtc_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t rtc_interrupt(int irq, void *dev_id, struct pt_regs *regs) { /* * Can be an alarm interrupt, update complete interrupt, @@ -207,6 +207,8 @@ wake_up_interruptible(&rtc_wait); kill_fasync (&rtc_async_queue, SIGIO, POLL_IN); + + return IRQ_HANDLED; } #endif diff -urN linux-2.5.68-bk1/drivers/char/sonypi.c linux-2.5.68-bk2/drivers/char/sonypi.c --- linux-2.5.68-bk1/drivers/char/sonypi.c 2003-04-19 19:50:30.000000000 -0700 +++ linux-2.5.68-bk2/drivers/char/sonypi.c 2003-04-21 15:53:39.000000000 -0700 @@ -305,7 +305,7 @@ } /* Interrupt handler: some event is available */ -void sonypi_irq(int irq, void *dev_id, struct pt_regs *regs) { +static irqreturn_t sonypi_irq(int irq, void *dev_id, struct pt_regs *regs) { u8 v1, v2, event = 0; int i, j; @@ -334,7 +334,7 @@ if (verbose) printk(KERN_WARNING "sonypi: unknown event port1=0x%02x,port2=0x%02x\n",v1,v2); - return; + return IRQ_NONE; found: #if defined(CONFIG_INPUT) || defined(CONFIG_INPUT_MODULE) @@ -354,6 +354,7 @@ } #endif /* CONFIG_INPUT || CONFIG_INPUT_MODULE */ sonypi_pushq(event); + return IRQ_HANDLED; } /* External camera command (exported to the motion eye v4l driver) */ diff -urN linux-2.5.68-bk1/drivers/char/synclink.c linux-2.5.68-bk2/drivers/char/synclink.c --- linux-2.5.68-bk1/drivers/char/synclink.c 2003-04-19 19:49:10.000000000 -0700 +++ linux-2.5.68-bk2/drivers/char/synclink.c 2003-04-21 15:53:39.000000000 -0700 @@ -1,7 +1,7 @@ /* * linux/drivers/char/synclink.c * - * $Id: synclink.c,v 4.4 2002/10/10 14:53:36 paulkf Exp $ + * $Id: synclink.c,v 4.6 2003/04/21 17:46:54 paulkf Exp $ * * Device driver for Microgate SyncLink ISA and PCI * high speed multiprotocol serial adapters. @@ -854,9 +854,9 @@ /* * ioctl call handlers */ -static int set_modem_info(struct mgsl_struct * info, unsigned int cmd, - unsigned int *value); -static int get_modem_info(struct mgsl_struct * info, unsigned int *value); +static int tiocmget(struct tty_struct *tty, struct file *file); +static int tiocmset(struct tty_struct *tty, struct file *file, + unsigned int set, unsigned int clear); static int mgsl_get_stats(struct mgsl_struct * info, struct mgsl_icount *user_icount); static int mgsl_get_params(struct mgsl_struct * info, MGSL_PARAMS *user_params); @@ -917,7 +917,7 @@ MODULE_PARM(txholdbufs,"1-" __MODULE_STRING(MAX_TOTAL_DEVICES) "i"); static char *driver_name = "SyncLink serial driver"; -static char *driver_version = "$Revision: 4.4 $"; +static char *driver_version = "$Revision: 4.6 $"; static int synclink_init_one (struct pci_dev *dev, const struct pci_device_id *ent); @@ -2921,110 +2921,58 @@ return rc; } -/* get_modem_info() - * - * Read the state of the serial control and - * status signals and return to caller. - * - * Arguments: info pointer to device instance data - * value pointer to int to hold returned info - * - * Return Value: 0 if success, otherwise error code +/* return the state of the serial control and status signals */ -static int get_modem_info(struct mgsl_struct * info, unsigned int *value) +static int tiocmget(struct tty_struct *tty, struct file *file) { - unsigned int result = 0; + struct mgsl_struct *info = (struct mgsl_struct *)tty->driver_data; + unsigned int result; unsigned long flags; - int err; - + spin_lock_irqsave(&info->irq_spinlock,flags); usc_get_serial_signals(info); spin_unlock_irqrestore(&info->irq_spinlock,flags); - if (info->serial_signals & SerialSignal_RTS) - result |= TIOCM_RTS; - if (info->serial_signals & SerialSignal_DTR) - result |= TIOCM_DTR; - if (info->serial_signals & SerialSignal_DCD) - result |= TIOCM_CAR; - if (info->serial_signals & SerialSignal_RI) - result |= TIOCM_RNG; - if (info->serial_signals & SerialSignal_DSR) - result |= TIOCM_DSR; - if (info->serial_signals & SerialSignal_CTS) - result |= TIOCM_CTS; + result = ((info->serial_signals & SerialSignal_RTS) ? TIOCM_RTS:0) + + ((info->serial_signals & SerialSignal_DTR) ? TIOCM_DTR:0) + + ((info->serial_signals & SerialSignal_DCD) ? TIOCM_CAR:0) + + ((info->serial_signals & SerialSignal_RI) ? TIOCM_RNG:0) + + ((info->serial_signals & SerialSignal_DSR) ? TIOCM_DSR:0) + + ((info->serial_signals & SerialSignal_CTS) ? TIOCM_CTS:0); if (debug_level >= DEBUG_LEVEL_INFO) - printk("%s(%d):mgsl_get_modem_info %s value=%08X\n", + printk("%s(%d):%s tiocmget() value=%08X\n", __FILE__,__LINE__, info->device_name, result ); - - PUT_USER(err,result,value); - return err; -} /* end of get_modem_info() */ + return result; +} -/* set_modem_info() - * - * Set the state of the modem control signals (DTR/RTS) - * - * Arguments: - * - * info pointer to device instance data - * cmd signal command: TIOCMBIS = set bit TIOCMBIC = clear bit - * TIOCMSET = set/clear signal values - * value bit mask for command - * - * Return Value: 0 if success, otherwise error code +/* set modem control signals (DTR/RTS) */ -static int set_modem_info(struct mgsl_struct * info, unsigned int cmd, - unsigned int *value) +static int tiocmset(struct tty_struct *tty, struct file *file, + unsigned int set, unsigned int clear) { - int error; - unsigned int arg; + struct mgsl_struct *info = (struct mgsl_struct *)tty->driver_data; unsigned long flags; - + if (debug_level >= DEBUG_LEVEL_INFO) - printk("%s(%d):mgsl_set_modem_info %s\n", __FILE__,__LINE__, - info->device_name ); - - GET_USER(error,arg,value); - if (error) - return error; - - switch (cmd) { - case TIOCMBIS: - if (arg & TIOCM_RTS) - info->serial_signals |= SerialSignal_RTS; - if (arg & TIOCM_DTR) - info->serial_signals |= SerialSignal_DTR; - break; - case TIOCMBIC: - if (arg & TIOCM_RTS) - info->serial_signals &= ~SerialSignal_RTS; - if (arg & TIOCM_DTR) - info->serial_signals &= ~SerialSignal_DTR; - break; - case TIOCMSET: - if (arg & TIOCM_RTS) - info->serial_signals |= SerialSignal_RTS; - else - info->serial_signals &= ~SerialSignal_RTS; - - if (arg & TIOCM_DTR) - info->serial_signals |= SerialSignal_DTR; - else - info->serial_signals &= ~SerialSignal_DTR; - break; - default: - return -EINVAL; - } - + printk("%s(%d):%s tiocmset(%x,%x)\n", + __FILE__,__LINE__,info->device_name, set, clear); + + if (set & TIOCM_RTS) + info->serial_signals |= SerialSignal_RTS; + if (set & TIOCM_DTR) + info->serial_signals |= SerialSignal_DTR; + if (clear & TIOCM_RTS) + info->serial_signals &= ~SerialSignal_RTS; + if (clear & TIOCM_DTR) + info->serial_signals &= ~SerialSignal_DTR; + spin_lock_irqsave(&info->irq_spinlock,flags); usc_set_serial_signals(info); spin_unlock_irqrestore(&info->irq_spinlock,flags); - + return 0; - -} /* end of set_modem_info() */ +} /* mgsl_break() Set or clear transmit break condition * @@ -3093,12 +3041,6 @@ unsigned long flags; switch (cmd) { - case TIOCMGET: - return get_modem_info(info, (unsigned int *) arg); - case TIOCMBIS: - case TIOCMBIC: - case TIOCMSET: - return set_modem_info(info, cmd, (unsigned int *) arg); case MGSL_IOCGPARAMS: return mgsl_get_params(info,(MGSL_PARAMS *)arg); case MGSL_IOCSPARAMS: @@ -3323,7 +3265,6 @@ if (debug_level >= DEBUG_LEVEL_INFO) printk("%s(%d):mgsl_close(%s) exit, count=%d\n", __FILE__,__LINE__, tty->driver.name, info->count); - MOD_DEC_USE_COUNT; } /* end of mgsl_close() */ @@ -3615,8 +3556,6 @@ printk("%s(%d):mgsl_open(%s), old ref count = %d\n", __FILE__,__LINE__,tty->driver.name, info->count); - MOD_INC_USE_COUNT; - /* If port is closing, signal caller to try again */ if (tty_hung_up_p(filp) || info->flags & ASYNC_CLOSING){ if (info->flags & ASYNC_CLOSING) @@ -3683,7 +3622,6 @@ cleanup: if (retval) { - MOD_DEC_USE_COUNT; if(info->count) info->count--; } @@ -4571,6 +4509,7 @@ memset(&serial_driver, 0, sizeof(struct tty_driver)); serial_driver.magic = TTY_DRIVER_MAGIC; + serial_driver.owner = THIS_MODULE; serial_driver.driver_name = "synclink"; serial_driver.name = "ttySL"; serial_driver.major = ttymajor; @@ -4606,6 +4545,8 @@ serial_driver.stop = mgsl_stop; serial_driver.start = mgsl_start; serial_driver.hangup = mgsl_hangup; + serial_driver.tiocmget = tiocmget; + serial_driver.tiocmset = tiocmset; /* * The callout device is just like normal device except for @@ -8003,7 +7944,6 @@ return -EBUSY; } info->netcount=1; - MOD_INC_USE_COUNT; spin_unlock_irqrestore(&info->netlock, flags); /* claim resources and init adapter */ @@ -8026,7 +7966,6 @@ open_fail: spin_lock_irqsave(&info->netlock, flags); info->netcount=0; - MOD_DEC_USE_COUNT; spin_unlock_irqrestore(&info->netlock, flags); return err; } @@ -8092,7 +8031,6 @@ spin_lock_irqsave(&info->netlock, flags); info->netcount=0; - MOD_DEC_USE_COUNT; spin_unlock_irqrestore(&info->netlock, flags); return 0; } diff -urN linux-2.5.68-bk1/drivers/char/synclinkmp.c linux-2.5.68-bk2/drivers/char/synclinkmp.c --- linux-2.5.68-bk1/drivers/char/synclinkmp.c 2003-04-19 19:48:55.000000000 -0700 +++ linux-2.5.68-bk2/drivers/char/synclinkmp.c 2003-04-21 15:53:39.000000000 -0700 @@ -1,5 +1,5 @@ /* - * $Id: synclinkmp.c,v 4.6 2002/10/10 14:50:47 paulkf Exp $ + * $Id: synclinkmp.c,v 4.8 2003/04/21 17:46:55 paulkf Exp $ * * Device driver for Microgate SyncLink Multiport * high speed multiprotocol serial adapter. @@ -503,7 +503,7 @@ MODULE_PARM(dosyncppp,"1-" __MODULE_STRING(MAX_DEVICES) "i"); static char *driver_name = "SyncLink MultiPort driver"; -static char *driver_version = "$Revision: 4.6 $"; +static char *driver_version = "$Revision: 4.8 $"; static int synclinkmp_init_one(struct pci_dev *dev,const struct pci_device_id *ent); static void synclinkmp_remove_one(struct pci_dev *dev); @@ -592,8 +592,9 @@ static int map_status(int signals); static int modem_input_wait(SLMP_INFO *info,int arg); static int wait_mgsl_event(SLMP_INFO *info, int *mask_ptr); -static int get_modem_info(SLMP_INFO *info, unsigned int *value); -static int set_modem_info(SLMP_INFO *info, unsigned int cmd,unsigned int *value); +static int tiocmget(struct tty_struct *tty, struct file *file); +static int tiocmset(struct tty_struct *tty, struct file *file, + unsigned int set, unsigned int clear); static void set_break(struct tty_struct *tty, int break_state); static void add_device(SLMP_INFO *info); @@ -770,8 +771,6 @@ printk("%s(%d):%s open(), old ref count = %d\n", __FILE__,__LINE__,tty->driver.name, info->count); - MOD_INC_USE_COUNT; - /* If port is closing, signal caller to try again */ if (tty_hung_up_p(filp) || info->flags & ASYNC_CLOSING){ if (info->flags & ASYNC_CLOSING) @@ -826,7 +825,6 @@ cleanup: if (retval) { - MOD_DEC_USE_COUNT; if(info->count) info->count--; } @@ -925,7 +923,6 @@ if (debug_level >= DEBUG_LEVEL_INFO) printk("%s(%d):%s close() exit, count=%d\n", __FILE__,__LINE__, tty->driver.name, info->count); - MOD_DEC_USE_COUNT; } /* Called by tty_hangup() when a hangup is signaled. @@ -1387,12 +1384,6 @@ } switch (cmd) { - case TIOCMGET: - return get_modem_info(info, (unsigned int *) arg); - case TIOCMBIS: - case TIOCMBIC: - case TIOCMSET: - return set_modem_info(info, cmd, (unsigned int *) arg); case MGSL_IOCGPARAMS: return get_params(info,(MGSL_PARAMS *)arg); case MGSL_IOCSPARAMS: @@ -1717,7 +1708,7 @@ { SLMP_INFO *info = d->priv; int err; - long flags; + unsigned long flags; if (debug_level >= DEBUG_LEVEL_INFO) printk("sppp_cb_open(%s)\n",info->netname); @@ -1729,7 +1720,6 @@ return -EBUSY; } info->netcount=1; - MOD_INC_USE_COUNT; spin_unlock_irqrestore(&info->netlock, flags); /* claim resources and init adapter */ @@ -1752,7 +1742,6 @@ open_fail: spin_lock_irqsave(&info->netlock, flags); info->netcount=0; - MOD_DEC_USE_COUNT; spin_unlock_irqrestore(&info->netlock, flags); return err; } @@ -1760,7 +1749,7 @@ static void sppp_cb_tx_timeout(struct net_device *dev) { SLMP_INFO *info = dev->priv; - long flags; + unsigned long flags; if (debug_level >= DEBUG_LEVEL_INFO) printk("sppp_tx_timeout(%s)\n",info->netname); @@ -1818,7 +1807,6 @@ spin_lock_irqsave(&info->netlock, flags); info->netcount=0; - MOD_DEC_USE_COUNT; spin_unlock_irqrestore(&info->netlock, flags); return 0; } @@ -3146,11 +3134,11 @@ /* return the state of the serial control and status signals */ -static int get_modem_info(SLMP_INFO * info, unsigned int *value) +static int tiocmget(struct tty_struct *tty, struct file *file) { + SLMP_INFO *info = (SLMP_INFO *)tty->driver_data; unsigned int result; unsigned long flags; - int err; spin_lock_irqsave(&info->lock,flags); get_signals(info); @@ -3164,61 +3152,31 @@ ((info->serial_signals & SerialSignal_CTS) ? TIOCM_CTS:0); if (debug_level >= DEBUG_LEVEL_INFO) - printk("%s(%d):%s synclinkmp_get_modem_info() value=%08X\n", + printk("%s(%d):%s tiocmget() value=%08X\n", __FILE__,__LINE__, info->device_name, result ); - - PUT_USER(err,result,value); - return err; + return result; } /* set modem control signals (DTR/RTS) - * - * cmd signal command: TIOCMBIS = set bit TIOCMBIC = clear bit - * TIOCMSET = set/clear signal values - * value bit mask for command */ -static int set_modem_info(SLMP_INFO * info, unsigned int cmd, - unsigned int *value) +static int tiocmset(struct tty_struct *tty, struct file *file, + unsigned int set, unsigned int clear) { - int error; - unsigned int arg; + SLMP_INFO *info = (SLMP_INFO *)tty->driver_data; unsigned long flags; if (debug_level >= DEBUG_LEVEL_INFO) - printk("%s(%d):%s synclinkmp_set_modem_info()\n", - __FILE__,__LINE__,info->device_name ); - - GET_USER(error,arg,value); - if (error) - return error; - - switch (cmd) { - case TIOCMBIS: - if (arg & TIOCM_RTS) - info->serial_signals |= SerialSignal_RTS; - if (arg & TIOCM_DTR) - info->serial_signals |= SerialSignal_DTR; - break; - case TIOCMBIC: - if (arg & TIOCM_RTS) - info->serial_signals &= ~SerialSignal_RTS; - if (arg & TIOCM_DTR) - info->serial_signals &= ~SerialSignal_DTR; - break; - case TIOCMSET: - if (arg & TIOCM_RTS) - info->serial_signals |= SerialSignal_RTS; - else - info->serial_signals &= ~SerialSignal_RTS; + printk("%s(%d):%s tiocmset(%x,%x)\n", + __FILE__,__LINE__,info->device_name, set, clear); - if (arg & TIOCM_DTR) - info->serial_signals |= SerialSignal_DTR; - else - info->serial_signals &= ~SerialSignal_DTR; - break; - default: - return -EINVAL; - } + if (set & TIOCM_RTS) + info->serial_signals |= SerialSignal_RTS; + if (set & TIOCM_DTR) + info->serial_signals |= SerialSignal_DTR; + if (clear & TIOCM_RTS) + info->serial_signals &= ~SerialSignal_RTS; + if (clear & TIOCM_DTR) + info->serial_signals &= ~SerialSignal_DTR; spin_lock_irqsave(&info->lock,flags); set_signals(info); @@ -3875,6 +3833,7 @@ memset(&serial_driver, 0, sizeof(struct tty_driver)); serial_driver.magic = TTY_DRIVER_MAGIC; + serial_driver.owner = THIS_MODULE; serial_driver.driver_name = "synclinkmp"; serial_driver.name = "ttySLM"; serial_driver.major = ttymajor; @@ -3910,6 +3869,8 @@ serial_driver.stop = tx_hold; serial_driver.start = tx_release; serial_driver.hangup = hangup; + serial_driver.tiocmget = tiocmget; + serial_driver.tiocmset = tiocmset; /* * The callout device is just like normal device except for diff -urN linux-2.5.68-bk1/drivers/char/watchdog/eurotechwdt.c linux-2.5.68-bk2/drivers/char/watchdog/eurotechwdt.c --- linux-2.5.68-bk1/drivers/char/watchdog/eurotechwdt.c 2003-04-19 19:48:51.000000000 -0700 +++ linux-2.5.68-bk2/drivers/char/watchdog/eurotechwdt.c 2003-04-21 15:53:39.000000000 -0700 @@ -187,7 +187,7 @@ * Kernel methods. */ -void eurwdt_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t eurwdt_interrupt(int irq, void *dev_id, struct pt_regs *regs) { printk(KERN_CRIT "timeout WDT timeout\n"); @@ -197,6 +197,7 @@ printk(KERN_CRIT "Initiating system reboot.\n"); machine_restart(NULL); #endif + return IRQ_HANDLED; } diff -urN linux-2.5.68-bk1/drivers/char/watchdog/wdt.c linux-2.5.68-bk2/drivers/char/watchdog/wdt.c --- linux-2.5.68-bk1/drivers/char/watchdog/wdt.c 2003-04-19 19:49:33.000000000 -0700 +++ linux-2.5.68-bk2/drivers/char/watchdog/wdt.c 2003-04-21 15:53:39.000000000 -0700 @@ -178,7 +178,7 @@ * a failure condition occurring. */ -void wdt_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t wdt_interrupt(int irq, void *dev_id, struct pt_regs *regs) { /* * Read the status register see what is up and @@ -210,7 +210,8 @@ #endif #else printk(KERN_CRIT "Reset in 5ms.\n"); -#endif +#endif + return IRQ_HANDLED; } diff -urN linux-2.5.68-bk1/drivers/char/watchdog/wdt_pci.c linux-2.5.68-bk2/drivers/char/watchdog/wdt_pci.c --- linux-2.5.68-bk1/drivers/char/watchdog/wdt_pci.c 2003-04-19 19:50:06.000000000 -0700 +++ linux-2.5.68-bk2/drivers/char/watchdog/wdt_pci.c 2003-04-21 15:53:39.000000000 -0700 @@ -161,7 +161,7 @@ * a failure condition occurring. */ -static void wdtpci_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t wdtpci_interrupt(int irq, void *dev_id, struct pt_regs *regs) { /* * Read the status register see what is up and @@ -193,7 +193,8 @@ #endif #else printk(KERN_CRIT "Reset in 5ms.\n"); -#endif +#endif + return IRQ_HANDLED; } diff -urN linux-2.5.68-bk1/drivers/fc4/soc.c linux-2.5.68-bk2/drivers/fc4/soc.c --- linux-2.5.68-bk1/drivers/fc4/soc.c 2003-04-19 19:48:50.000000000 -0700 +++ linux-2.5.68-bk2/drivers/fc4/soc.c 2003-04-21 15:53:39.000000000 -0700 @@ -335,7 +335,7 @@ } } -static void soc_intr(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t soc_intr(int irq, void *dev_id, struct pt_regs *regs) { u32 cmd; unsigned long flags; @@ -349,6 +349,8 @@ if (cmd & SOC_CMD_REQ_QALL) soc_request (s, cmd); } spin_unlock_irqrestore(&s->lock, flags); + + return IRQ_HANDLED; } #define TOKEN(proto, port, token) (((proto)<<12)|(token)|(port)) diff -urN linux-2.5.68-bk1/drivers/fc4/socal.c linux-2.5.68-bk2/drivers/fc4/socal.c --- linux-2.5.68-bk1/drivers/fc4/socal.c 2003-04-19 19:49:13.000000000 -0700 +++ linux-2.5.68-bk2/drivers/fc4/socal.c 2003-04-21 15:53:39.000000000 -0700 @@ -405,7 +405,7 @@ } } -static void socal_intr(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t socal_intr(int irq, void *dev_id, struct pt_regs *regs) { u32 cmd; unsigned long flags; @@ -429,6 +429,8 @@ socal_request (s, cmd); } spin_unlock_irqrestore(&s->lock, flags); + + return IRQ_HANDLED; } #define TOKEN(proto, port, token) (((proto)<<12)|(token)|(port)) diff -urN linux-2.5.68-bk1/drivers/hotplug/cpci_hotplug_core.c linux-2.5.68-bk2/drivers/hotplug/cpci_hotplug_core.c --- linux-2.5.68-bk1/drivers/hotplug/cpci_hotplug_core.c 2003-04-19 19:49:21.000000000 -0700 +++ linux-2.5.68-bk2/drivers/hotplug/cpci_hotplug_core.c 2003-04-21 15:53:39.000000000 -0700 @@ -446,7 +446,7 @@ } /* This is the interrupt mode interrupt handler */ -void +irqreturn_t cpci_hp_intr(int irq, void *data, struct pt_regs *regs) { dbg("entered cpci_hp_intr"); @@ -455,7 +455,7 @@ if((controller->irq_flags & SA_SHIRQ) && !controller->ops->check_irq(controller->dev_id)) { dbg("exited cpci_hp_intr, not our interrupt"); - return; + return IRQ_NONE; } /* Disable ENUM interrupt */ @@ -465,6 +465,7 @@ dbg("Signal event_semaphore"); up(&event_semaphore); dbg("exited cpci_hp_intr"); + return IRQ_HANDLED; } /* diff -urN linux-2.5.68-bk1/drivers/hotplug/cpqphp.h linux-2.5.68-bk2/drivers/hotplug/cpqphp.h --- linux-2.5.68-bk1/drivers/hotplug/cpqphp.h 2003-04-19 19:50:40.000000000 -0700 +++ linux-2.5.68-bk2/drivers/hotplug/cpqphp.h 2003-04-21 15:53:39.000000000 -0700 @@ -29,6 +29,7 @@ #define _CPQPHP_H #include "pci_hotplug.h" +#include #include /* for read? and write? functions */ @@ -408,7 +409,7 @@ /* controller functions */ extern void cpqhp_pushbutton_thread (unsigned long event_pointer); -extern void cpqhp_ctrl_intr (int IRQ, struct controller *ctrl_input, struct pt_regs *regs); +extern irqreturn_t cpqhp_ctrl_intr (int IRQ, void *data, struct pt_regs *regs); extern int cpqhp_find_available_resources (struct controller *ctrl, void *rom_start); extern int cpqhp_event_start_thread (void); extern void cpqhp_event_stop_thread (void); diff -urN linux-2.5.68-bk1/drivers/hotplug/cpqphp_core.c linux-2.5.68-bk2/drivers/hotplug/cpqphp_core.c --- linux-2.5.68-bk1/drivers/hotplug/cpqphp_core.c 2003-04-19 19:48:46.000000000 -0700 +++ linux-2.5.68-bk2/drivers/hotplug/cpqphp_core.c 2003-04-21 15:53:39.000000000 -0700 @@ -1148,8 +1148,7 @@ /* set up the interrupt */ dbg("HPC interrupt = %d \n", ctrl->interrupt); - if (request_irq(ctrl->interrupt, - (void (*)(int, void *, struct pt_regs *)) &cpqhp_ctrl_intr, + if (request_irq(ctrl->interrupt, cpqhp_ctrl_intr, SA_SHIRQ, MY_NAME, ctrl)) { err("Can't get irq %d for the hotplug pci controller\n", ctrl->interrupt); rc = -ENODEV; diff -urN linux-2.5.68-bk1/drivers/hotplug/cpqphp_ctrl.c linux-2.5.68-bk2/drivers/hotplug/cpqphp_ctrl.c --- linux-2.5.68-bk1/drivers/hotplug/cpqphp_ctrl.c 2003-04-19 19:49:10.000000000 -0700 +++ linux-2.5.68-bk2/drivers/hotplug/cpqphp_ctrl.c 2003-04-21 15:53:39.000000000 -0700 @@ -916,8 +916,9 @@ } -void cpqhp_ctrl_intr(int IRQ, struct controller * ctrl, struct pt_regs *regs) +irqreturn_t cpqhp_ctrl_intr(int IRQ, void *data, struct pt_regs *regs) { + struct controller *ctrl = data; u8 schedule_flag = 0; u16 misc; u32 Diff; @@ -929,7 +930,7 @@ // Check to see if it was our interrupt //********************************* if (!(misc & 0x000C)) { - return; + return IRQ_NONE; } if (misc & 0x0004) { @@ -974,7 +975,7 @@ up(&event_semaphore); dbg("Signal event_semaphore\n"); } - + return IRQ_HANDLED; } diff -urN linux-2.5.68-bk1/drivers/ieee1394/csr.c linux-2.5.68-bk2/drivers/ieee1394/csr.c --- linux-2.5.68-bk1/drivers/ieee1394/csr.c 2003-04-19 19:48:55.000000000 -0700 +++ linux-2.5.68-bk2/drivers/ieee1394/csr.c 2003-04-21 15:53:39.000000000 -0700 @@ -448,7 +448,7 @@ /* bandwidth available algorithm adapted from IEEE 1394a-2000 spec */ if (arg > 0x1fff) { *store = cpu_to_be32(old); /* change nothing */ - break; + break; } data &= 0x1fff; if (arg >= data) { diff -urN linux-2.5.68-bk1/drivers/ieee1394/dv1394-private.h linux-2.5.68-bk2/drivers/ieee1394/dv1394-private.h --- linux-2.5.68-bk1/drivers/ieee1394/dv1394-private.h 2003-04-19 19:50:03.000000000 -0700 +++ linux-2.5.68-bk2/drivers/ieee1394/dv1394-private.h 2003-04-21 15:53:39.000000000 -0700 @@ -455,6 +455,10 @@ */ spinlock_t spinlock; + /* flag to prevent spurious interrupts (which OHCI seems to + generate a lot :) from accessing the struct */ + int dma_running; + /* 3) the sleeping semaphore 'sem' - this is used from process context only, to serialize various operations on the video_card. Even though only one @@ -568,7 +572,7 @@ static int do_dv1394_init(struct video_card *video, struct dv1394_init *init); static int do_dv1394_init_default(struct video_card *video); -static int do_dv1394_shutdown(struct video_card *video, int free_user_buf); +static void do_dv1394_shutdown(struct video_card *video, int free_user_buf); /* NTSC empty packet rate accurate to within 0.01%, diff -urN linux-2.5.68-bk1/drivers/ieee1394/dv1394.c linux-2.5.68-bk2/drivers/ieee1394/dv1394.c --- linux-2.5.68-bk1/drivers/ieee1394/dv1394.c 2003-04-19 19:50:30.000000000 -0700 +++ linux-2.5.68-bk2/drivers/ieee1394/dv1394.c 2003-04-21 15:53:39.000000000 -0700 @@ -689,7 +689,7 @@ wmb(); #endif - + video->dma_running = 1; /* set the 'run' bit */ reg_write(video->ohci, video->ohci_IsoXmitContextControlSet, 0x8000); @@ -811,7 +811,9 @@ reg_write(video->ohci, video->ohci_IsoRcvCommandPtr, video->frames[0]->descriptor_pool_dma | 1); /* Z=1 */ wmb(); - + + video->dma_running = 1; + /* run */ reg_write(video->ohci, video->ohci_IsoRcvContextControlSet, 0x8000); flush_pci_write(video->ohci); @@ -912,16 +914,16 @@ u64 chan_mask; int retval = -EINVAL; - debug_printk( "dv1394: initialising %d\n", video->id ); + debug_printk("dv1394: initialising %d\n", video->id); if(init->api_version != DV1394_API_VERSION) - goto err; + return -EINVAL; /* first sanitize all the parameters */ if( (init->n_frames < 2) || (init->n_frames > DV1394_MAX_FRAMES) ) - goto err; + return -EINVAL; if( (init->format != DV1394_NTSC) && (init->format != DV1394_PAL) ) - goto err; + return -EINVAL; if( (init->syt_offset == 0) || (init->syt_offset > 50) ) /* default SYT offset is 3 cycles */ @@ -942,15 +944,15 @@ if(new_buf_size % PAGE_SIZE) new_buf_size += PAGE_SIZE - (new_buf_size % PAGE_SIZE); /* don't allow the user to allocate the DMA buffer more than once */ - if(video->dv_buf.kvirt && video->dv_buf_size != new_buf_size) - goto err; - + if(video->dv_buf.kvirt && video->dv_buf_size != new_buf_size) { + printk("dv1394: re-sizing the DMA buffer is not allowed\n"); + return -EINVAL; + } + /* shutdown the card if it's currently active */ /* (the card should not be reset if the parameters are screwy) */ - if( video_card_initialized(video) ) - do_dv1394_shutdown(video, 0); - + do_dv1394_shutdown(video, 0); /* try to claim the ISO channel */ spin_lock_irqsave(&video->ohci->IR_channel_lock, flags); @@ -967,7 +969,6 @@ /* initialize misc. fields of video */ video->n_frames = init->n_frames; video->pal_or_ntsc = init->format; - video->cip_accum = 0; video->continuity_counter = 0; @@ -983,7 +984,6 @@ video->current_packet = -1; video->first_frame = 0; - if(video->pal_or_ntsc == DV1394_NTSC) { video->cip_n = init->cip_n != 0 ? init->cip_n : CIP_N_NTSC; video->cip_d = init->cip_d != 0 ? init->cip_d : CIP_D_NTSC; @@ -996,14 +996,8 @@ video->syt_offset = init->syt_offset; - /* find and claim DMA contexts on the OHCI card */ - /* XXX this should be the last step of initialization, since the interrupt - handler uses ohci_i*_ctx to indicate whether or not it is safe to touch - frames. I'm not making this change quite yet, since it would be better - to clean up the init/shutdown process first.*/ - if(video->ohci_it_ctx == -1) { ohci1394_init_iso_tasklet(&video->it_tasklet, OHCI_ISO_TRANSMIT, it_tasklet_func, (unsigned long) video); @@ -1011,14 +1005,12 @@ if (ohci1394_register_iso_tasklet(video->ohci, &video->it_tasklet) < 0) { printk(KERN_ERR "dv1394: could not find an available IT DMA context\n"); retval = -EBUSY; - goto err_ctx; - } - else { - video->ohci_it_ctx = video->it_tasklet.context; - debug_printk("dv1394: claimed IT DMA context %d\n", video->ohci_it_ctx); + goto err; } + + video->ohci_it_ctx = video->it_tasklet.context; + debug_printk("dv1394: claimed IT DMA context %d\n", video->ohci_it_ctx); } - if(video->ohci_ir_ctx == -1) { ohci1394_init_iso_tasklet(&video->ir_tasklet, OHCI_ISO_RECEIVE, @@ -1027,14 +1019,11 @@ if (ohci1394_register_iso_tasklet(video->ohci, &video->ir_tasklet) < 0) { printk(KERN_ERR "dv1394: could not find an available IR DMA context\n"); retval = -EBUSY; - goto err_ctx; - } - else { - video->ohci_ir_ctx = video->ir_tasklet.context; - debug_printk("dv1394: claimed IR DMA context %d\n", video->ohci_ir_ctx); + goto err; } + video->ohci_ir_ctx = video->ir_tasklet.context; + debug_printk("dv1394: claimed IR DMA context %d\n", video->ohci_ir_ctx); } - /* allocate struct frames */ for(i = 0; i < init->n_frames; i++) { @@ -1043,7 +1032,7 @@ if(!video->frames[i]) { printk(KERN_ERR "dv1394: Cannot allocate frame structs\n"); retval = -ENOMEM; - goto err_frames; + goto err; } } @@ -1051,7 +1040,7 @@ /* allocate the ringbuffer */ retval = dma_region_alloc(&video->dv_buf, new_buf_size, video->ohci->dev, PCI_DMA_TODEVICE); if(retval) - goto err_frames; + goto err; video->dv_buf_size = new_buf_size; @@ -1073,7 +1062,7 @@ retval = dma_region_alloc(&video->packet_buf, video->packet_buf_size, video->ohci->dev, PCI_DMA_FROMDEVICE); if(retval) - goto err_dv_buf; + goto err; debug_printk("dv1394: Allocated %d packets in buffer, total %u pages (%u DMA pages), %lu bytes\n", video->n_frames*MAX_PACKETS, video->packet_buf.n_pages, @@ -1103,30 +1092,8 @@ return 0; - err_dv_buf: - dma_region_free(&video->dv_buf); - - err_frames: - for(i = 0; i < DV1394_MAX_FRAMES; i++) { - if(video->frames[i]) - frame_delete(video->frames[i]); - } - video->n_frames = 0; - - err_ctx: - if(video->ohci_it_ctx != -1) { - ohci1394_unregister_iso_tasklet(video->ohci, &video->it_tasklet); - video->ohci_it_ctx = -1; - } - if(video->ohci_ir_ctx != -1) { - ohci1394_unregister_iso_tasklet(video->ohci, &video->ir_tasklet); - video->ohci_ir_ctx = -1; - } - - spin_lock_irqsave(&video->ohci->IR_channel_lock, flags); - video->ohci->ISO_channel_usage &= ~chan_mask; - spin_unlock_irqrestore(&video->ohci->IR_channel_lock, flags); - err: +err: + do_dv1394_shutdown(video, 1); return retval; } @@ -1154,10 +1121,15 @@ { unsigned long flags; int i; - + /* no interrupts */ spin_lock_irqsave(&video->spinlock, flags); + video->dma_running = 0; + + if( (video->ohci_it_ctx == -1) && (video->ohci_ir_ctx == -1) ) + goto out; + /* stop DMA if in progress */ if( (video->active_frame != -1) || (reg_read(video->ohci, video->ohci_IsoXmitContextControlClear) & (1 << 10)) || @@ -1197,24 +1169,22 @@ } else debug_printk("dv1394: stop_dma: already stopped.\n"); - + +out: spin_unlock_irqrestore(&video->spinlock, flags); } -static int do_dv1394_shutdown(struct video_card *video, int free_dv_buf) +static void do_dv1394_shutdown(struct video_card *video, int free_dv_buf) { int i; - unsigned long flags; debug_printk("dv1394: shutdown...\n"); /* stop DMA if in progress */ stop_dma(video); - spin_lock_irqsave(&video->spinlock, flags); - /* release the DMA contexts */ if(video->ohci_it_ctx != -1) { video->ohci_IsoXmitContextControlSet = 0; @@ -1245,8 +1215,6 @@ video->ohci_ir_ctx = -1; } - spin_unlock_irqrestore(&video->spinlock, flags); - /* release the ISO channel */ if(video->channel != -1) { u64 chan_mask; @@ -1282,9 +1250,7 @@ dma_region_free(&video->packet_buf); video->packet_buf_size = 0; - debug_printk("dv1394: shutdown complete\n"); - - return 0; + debug_printk("dv1394: shutdown OK\n"); } /* @@ -1770,7 +1736,8 @@ } case DV1394_IOC_SHUTDOWN: - ret = do_dv1394_shutdown(video, 0); + do_dv1394_shutdown(video, 0); + ret = 0; break; @@ -2140,6 +2107,9 @@ spin_lock(&video->spinlock); + if(!video->dma_running) + goto out; + irq_printk("ContextControl = %08x, CommandPtr = %08x\n", reg_read(video->ohci, video->ohci_IsoXmitContextControlSet), reg_read(video->ohci, video->ohci_IsoXmitCommandPtr) @@ -2266,14 +2236,15 @@ } /* for(each frame) */ } - spin_unlock(&video->spinlock); - if(wake) { kill_fasync(&video->fasync, SIGIO, POLL_OUT); /* wake readers/writers/ioctl'ers */ wake_up_interruptible(&video->waitq); } + +out: + spin_unlock(&video->spinlock); } static void ir_tasklet_func(unsigned long data) @@ -2283,8 +2254,11 @@ spin_lock(&video->spinlock); - if( (video->ohci_ir_ctx != -1) - && (reg_read(video->ohci, video->ohci_IsoRcvContextControlSet) & (1 << 10)) ) + if(!video->dma_running) + goto out; + + if( (video->ohci_ir_ctx != -1) && + (reg_read(video->ohci, video->ohci_IsoRcvContextControlSet) & (1 << 10)) ) { int sof=0; /* start-of-frame flag */ @@ -2424,14 +2398,15 @@ } /* receive interrupt */ - spin_unlock(&video->spinlock); - if(wake) { kill_fasync(&video->fasync, SIGIO, POLL_IN); /* wake readers/writers/ioctl'ers */ wake_up_interruptible(&video->waitq); } + +out: + spin_unlock(&video->spinlock); } static struct file_operations dv1394_fops= @@ -2554,6 +2529,7 @@ clear_bit(0, &video->open); spin_lock_init(&video->spinlock); + video->dma_running = 0; init_MUTEX(&video->sem); init_waitqueue_head(&video->waitq); video->fasync = NULL; @@ -2565,7 +2541,7 @@ #ifdef CONFIG_DEVFS_FS if (dv1394_devfs_add_entry(video) < 0) - goto err_free; + goto err_free; #endif debug_printk("dv1394: dv1394_init() OK on ID %d\n", video->id); @@ -2718,6 +2694,9 @@ spin_lock_irqsave(&video->spinlock, flags); + if(!video->dma_running) + goto out; + /* check IT context */ if(video->ohci_it_ctx != -1) { u32 ctx; @@ -2790,7 +2769,8 @@ reg_read(video->ohci, video->ohci_IsoRcvCommandPtr)); } } - + +out: spin_unlock_irqrestore(&video->spinlock, flags); /* wake readers/writers/ioctl'ers */ diff -urN linux-2.5.68-bk1/drivers/ieee1394/eth1394.c linux-2.5.68-bk2/drivers/ieee1394/eth1394.c --- linux-2.5.68-bk1/drivers/ieee1394/eth1394.c 2003-04-19 19:50:02.000000000 -0700 +++ linux-2.5.68-bk2/drivers/ieee1394/eth1394.c 2003-04-21 15:53:39.000000000 -0700 @@ -78,7 +78,7 @@ printk(KERN_ERR fmt, ## args) static char version[] __devinitdata = - "$Rev: 886 $ Ben Collins "; + "$Rev: 895 $ Ben Collins "; /* Our ieee1394 highlevel driver */ #define ETHER1394_DRIVER_NAME "ether1394" @@ -340,6 +340,7 @@ priv = (struct eth1394_priv *)dev->priv; priv->host = host; + spin_lock_init(&priv->lock); hi = hpsb_create_hostinfo(hl, host, sizeof(*hi)); diff -urN linux-2.5.68-bk1/drivers/ieee1394/highlevel.c linux-2.5.68-bk2/drivers/ieee1394/highlevel.c --- linux-2.5.68-bk1/drivers/ieee1394/highlevel.c 2003-04-19 19:50:44.000000000 -0700 +++ linux-2.5.68-bk2/drivers/ieee1394/highlevel.c 2003-04-21 15:53:39.000000000 -0700 @@ -38,7 +38,7 @@ static LIST_HEAD(hl_drivers); -static DECLARE_MUTEX(hl_drivers_lock); +static rwlock_t hl_drivers_lock = RW_LOCK_UNLOCKED; static LIST_HEAD(addr_space); static rwlock_t addr_space_lock = RW_LOCK_UNLOCKED; @@ -48,20 +48,22 @@ static struct hpsb_address_serve dummy_zero_addr, dummy_max_addr; -/* Internal usage. Must be called with hl_drivers_lock held */ static struct hl_host_info *hl_get_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host) { - struct hl_host_info *hi; + struct hl_host_info *hi = NULL; struct list_head *lh; + read_lock(&hl->host_info_lock); list_for_each (lh, &hl->host_info_list) { hi = list_entry(lh, struct hl_host_info, list); if (hi->host == host) - return hi; + break; + hi = NULL; } + read_unlock(&hl->host_info_lock); - return NULL; + return hi; } @@ -69,16 +71,12 @@ * hpsb_create_hostinfo. */ void *hpsb_get_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host) { - struct hl_host_info *hi; - void *data = NULL; + struct hl_host_info *hi = hl_get_hostinfo(hl, host); - read_lock(&hl_drivers_lock); - hi = hl_get_hostinfo(hl, host); if (hi) - data = hi->data; - read_unlock(&hl_drivers_lock); + return hi->data; - return data; + return NULL; } @@ -88,10 +86,9 @@ { struct hl_host_info *hi; void *data; + unsigned long flags; - read_lock(&hl_drivers_lock); hi = hl_get_hostinfo(hl, host); - read_unlock(&hl_drivers_lock); if (hi) { HPSB_ERR("%s called hpsb_create_hostinfo when hostinfo already exists", hl->name); @@ -112,9 +109,9 @@ hi->host = host; - write_lock_irq(&hl_drivers_lock); + write_lock_irqsave(&hl->host_info_lock, flags); list_add_tail(&hi->list, &hl->host_info_list); - write_unlock_irq(&hl_drivers_lock); + write_unlock_irqrestore(&hl->host_info_lock, flags); return data; } @@ -124,23 +121,20 @@ void *data) { struct hl_host_info *hi; - int ret = -EINVAL; - write_lock_irq(&hl_drivers_lock); hi = hl_get_hostinfo(hl, host); if (hi) { if (!hi->size && !hi->data) { hi->data = data; - ret = 0; + return 0; } else HPSB_ERR("%s called hpsb_set_hostinfo when hostinfo already has data", hl->name); } else HPSB_ERR("%s called hpsb_set_hostinfo when no hostinfo exists", hl->name); - write_unlock_irq(&hl_drivers_lock); - return ret; + return -EINVAL; } @@ -148,13 +142,14 @@ { struct hl_host_info *hi; - write_lock_irq(&hl_drivers_lock); hi = hl_get_hostinfo(hl, host); if (hi) { + unsigned long flags; + write_lock_irqsave(&hl->host_info_lock, flags); list_del(&hi->list); + write_unlock_irqrestore(&hl->host_info_lock, flags); kfree(hi); } - write_unlock_irq(&hl_drivers_lock); return; } @@ -164,11 +159,9 @@ { struct hl_host_info *hi; - write_lock(&hl_drivers_lock); hi = hl_get_hostinfo(hl, host); if (hi) hi->key = key; - write_unlock(&hl_drivers_lock); return; } @@ -177,15 +170,12 @@ unsigned long hpsb_get_hostinfo_key(struct hpsb_highlevel *hl, struct hpsb_host *host) { struct hl_host_info *hi; - unsigned long key = 0; - read_lock(&hl_drivers_lock); hi = hl_get_hostinfo(hl, host); if (hi) - key = hi->key; - read_unlock(&hl_drivers_lock); + return hi->key; - return key; + return 0; } @@ -195,7 +185,7 @@ struct hl_host_info *hi; void *data = NULL; - read_lock(&hl_drivers_lock); + read_lock(&hl->host_info_lock); list_for_each (lh, &hl->host_info_list) { hi = list_entry(lh, struct hl_host_info, list); if (hi->key == key) { @@ -203,7 +193,7 @@ break; } } - read_unlock(&hl_drivers_lock); + read_unlock(&hl->host_info_lock); return data; } @@ -214,6 +204,7 @@ { struct hpsb_highlevel *hl; struct list_head *lh; + unsigned long flags; hl = (struct hpsb_highlevel *)kmalloc(sizeof(struct hpsb_highlevel), GFP_KERNEL); @@ -225,12 +216,14 @@ INIT_LIST_HEAD(&hl->addr_list); INIT_LIST_HEAD(&hl->host_info_list); + rwlock_init(&hl->host_info_lock); + hl->name = name; hl->op = ops; - down(&hl_drivers_lock); + write_lock_irqsave(&hl_drivers_lock, flags); list_add_tail(&hl->hl_list, &hl_drivers); - up(&hl_drivers_lock); + write_unlock_irqrestore(&hl_drivers_lock, flags); if (hl->op->add_host) { down(&hpsb_hosts_lock); @@ -248,22 +241,23 @@ { struct list_head *lh, *next; struct hpsb_address_serve *as; + unsigned long flags; if (hl == NULL) { return; } - write_lock_irq(&addr_space_lock); + write_lock_irqsave(&addr_space_lock, flags); list_for_each_safe (lh, next, &hl->addr_list) { as = list_entry(lh, struct hpsb_address_serve, addr_list); list_del(&as->as_list); kfree(as); } - write_unlock_irq(&addr_space_lock); + write_unlock_irqrestore(&addr_space_lock, flags); - down(&hl_drivers_lock); + write_lock_irqsave(&hl_drivers_lock, flags); list_del(&hl->hl_list); - up(&hl_drivers_lock); + write_unlock_irqrestore(&hl_drivers_lock, flags); if (hl->op->remove_host) { down(&hpsb_hosts_lock); @@ -307,8 +301,10 @@ write_lock_irqsave(&addr_space_lock, flags); entry = addr_space.next; - while (list_entry(entry, struct hpsb_address_serve, as_list)->end <= start) { - if (list_entry(entry->next, struct hpsb_address_serve, as_list)->start >= end) { + while (list_entry(entry, struct hpsb_address_serve, as_list)->end + <= start) { + if (list_entry(entry->next, struct hpsb_address_serve, as_list) + ->start >= end) { list_add(&as->as_list, entry); list_add_tail(&as->addr_list, &hl->addr_list); retval = 1; @@ -387,14 +383,13 @@ struct list_head *entry; struct hpsb_highlevel *hl; - down(&hl_drivers_lock); + read_lock(&hl_drivers_lock); list_for_each(entry, &hl_drivers) { hl = list_entry(entry, struct hpsb_highlevel, hl_list); - if (hl->op->add_host) hl->op->add_host(host, hl); } - up(&hl_drivers_lock); + read_unlock(&hl_drivers_lock); } void highlevel_remove_host(struct hpsb_host *host) @@ -402,7 +397,7 @@ struct list_head *entry; struct hpsb_highlevel *hl; - down(&hl_drivers_lock); + read_lock(&hl_drivers_lock); list_for_each(entry, &hl_drivers) { hl = list_entry(entry, struct hpsb_highlevel, hl_list); @@ -411,7 +406,7 @@ hpsb_destroy_hostinfo(hl, host); } } - up(&hl_drivers_lock); + read_unlock(&hl_drivers_lock); } void highlevel_host_reset(struct hpsb_host *host) @@ -419,14 +414,14 @@ struct list_head *entry; struct hpsb_highlevel *hl; - down(&hl_drivers_lock); + read_lock(&hl_drivers_lock); list_for_each(entry, &hl_drivers) { hl = list_entry(entry, struct hpsb_highlevel, hl_list); if (hl->op->host_reset) hl->op->host_reset(host); } - up(&hl_drivers_lock); + read_unlock(&hl_drivers_lock); } void highlevel_iso_receive(struct hpsb_host *host, void *data, @@ -436,14 +431,17 @@ struct hpsb_highlevel *hl; int channel = (((quadlet_t *)data)[0] >> 8) & 0x3f; - down(&hl_drivers_lock); - list_for_each(entry, &hl_drivers) { - hl = list_entry(entry, struct hpsb_highlevel, hl_list); + read_lock(&hl_drivers_lock); + entry = hl_drivers.next; - if (hl->op->iso_receive) + while (entry != &hl_drivers) { + hl = list_entry(entry, struct hpsb_highlevel, hl_list); + if (hl->op->iso_receive) { hl->op->iso_receive(host, channel, data, length); + } + entry = entry->next; } - up(&hl_drivers_lock); + read_unlock(&hl_drivers_lock); } void highlevel_fcp_request(struct hpsb_host *host, int nodeid, int direction, @@ -453,13 +451,18 @@ struct hpsb_highlevel *hl; int cts = ((quadlet_t *)data)[0] >> 4; - down(&hl_drivers_lock); - list_for_each(entry, &hl_drivers) { + read_lock(&hl_drivers_lock); + entry = hl_drivers.next; + + while (entry != &hl_drivers) { hl = list_entry(entry, struct hpsb_highlevel, hl_list); - if (hl->op->fcp_request) - hl->op->fcp_request(host, nodeid, direction, cts, data, length); + if (hl->op->fcp_request) { + hl->op->fcp_request(host, nodeid, direction, cts, data, + length); + } + entry = entry->next; } - up(&hl_drivers_lock); + read_unlock(&hl_drivers_lock); } int highlevel_read(struct hpsb_host *host, int nodeid, void *data, diff -urN linux-2.5.68-bk1/drivers/ieee1394/highlevel.h linux-2.5.68-bk2/drivers/ieee1394/highlevel.h --- linux-2.5.68-bk1/drivers/ieee1394/highlevel.h 2003-04-19 19:49:09.000000000 -0700 +++ linux-2.5.68-bk2/drivers/ieee1394/highlevel.h 2003-04-21 15:53:39.000000000 -0700 @@ -14,6 +14,7 @@ /* Used by the highlevel drivers to store data per host */ struct list_head host_info_list; + rwlock_t host_info_lock; }; @@ -154,7 +155,7 @@ * iso_receive op. */ int hpsb_listen_channel(struct hpsb_highlevel *hl, struct hpsb_host *host, - unsigned int channel); + unsigned int channel); void hpsb_unlisten_channel(struct hpsb_highlevel *hl, struct hpsb_host *host, unsigned int channel); @@ -176,5 +177,4 @@ * hpsb_create_hostinfo, where the size is 0. */ int hpsb_set_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host, void *data); - #endif /* IEEE1394_HIGHLEVEL_H */ diff -urN linux-2.5.68-bk1/drivers/ieee1394/ieee1394_core.c linux-2.5.68-bk2/drivers/ieee1394/ieee1394_core.c --- linux-2.5.68-bk1/drivers/ieee1394/ieee1394_core.c 2003-04-19 19:48:55.000000000 -0700 +++ linux-2.5.68-bk2/drivers/ieee1394/ieee1394_core.c 2003-04-21 15:53:39.000000000 -0700 @@ -1295,7 +1295,6 @@ /** nodemgr.c **/ EXPORT_SYMBOL(hpsb_guid_get_entry); EXPORT_SYMBOL(hpsb_nodeid_get_entry); -EXPORT_SYMBOL(hpsb_check_nodeid); EXPORT_SYMBOL(hpsb_node_fill_packet); EXPORT_SYMBOL(hpsb_node_read); EXPORT_SYMBOL(hpsb_node_write); diff -urN linux-2.5.68-bk1/drivers/ieee1394/ieee1394_types.h linux-2.5.68-bk2/drivers/ieee1394/ieee1394_types.h --- linux-2.5.68-bk1/drivers/ieee1394/ieee1394_types.h 2003-04-19 19:50:33.000000000 -0700 +++ linux-2.5.68-bk2/drivers/ieee1394/ieee1394_types.h 2003-04-21 15:53:39.000000000 -0700 @@ -79,13 +79,13 @@ struct semaphore count; }; -#define HPSB_TPOOL_INIT(_tp) \ -do { \ +#define HPSB_TPOOL_INIT(_tp) \ +do { \ CLEAR_BITMAP((_tp)->pool, 64); \ - spin_lock_init(&(_tp)->lock); \ - (_tp)->next = 0; \ + spin_lock_init(&(_tp)->lock); \ + (_tp)->next = 0; \ (_tp)->allocations = 0; \ - sema_init(&(_tp)->count, 63); \ + sema_init(&(_tp)->count, 63); \ } while(0) diff -urN linux-2.5.68-bk1/drivers/ieee1394/iso.c linux-2.5.68-bk2/drivers/ieee1394/iso.c --- linux-2.5.68-bk1/drivers/ieee1394/iso.c 2003-04-19 19:50:38.000000000 -0700 +++ linux-2.5.68-bk2/drivers/ieee1394/iso.c 2003-04-21 15:53:39.000000000 -0700 @@ -47,8 +47,11 @@ int dma_direction; /* make sure driver supports the ISO API */ - if(!host->driver->isoctl) + if(!host->driver->isoctl) { + printk(KERN_INFO "ieee1394: host driver '%s' does not support the rawiso API\n", + host->driver->name); return NULL; + } /* sanitize parameters */ diff -urN linux-2.5.68-bk1/drivers/ieee1394/nodemgr.c linux-2.5.68-bk2/drivers/ieee1394/nodemgr.c --- linux-2.5.68-bk1/drivers/ieee1394/nodemgr.c 2003-04-19 19:50:02.000000000 -0700 +++ linux-2.5.68-bk2/drivers/ieee1394/nodemgr.c 2003-04-21 15:53:39.000000000 -0700 @@ -1616,18 +1616,6 @@ return ne; } -struct node_entry *hpsb_check_nodeid(struct hpsb_host *host, nodeid_t nodeid) -{ - struct node_entry *ne; - - if (down_trylock(&nodemgr_serialize)) - return NULL; - ne = find_entry_by_nodeid(host, nodeid); - up(&nodemgr_serialize); - - return ne; -} - /* The following four convenience functions use a struct node_entry * for addressing a node on the bus. They are intended for use by any * process context, not just the nodemgr thread, so we need to be a diff -urN linux-2.5.68-bk1/drivers/ieee1394/nodemgr.h linux-2.5.68-bk2/drivers/ieee1394/nodemgr.h --- linux-2.5.68-bk1/drivers/ieee1394/nodemgr.h 2003-04-19 19:49:56.000000000 -0700 +++ linux-2.5.68-bk2/drivers/ieee1394/nodemgr.h 2003-04-21 15:53:39.000000000 -0700 @@ -163,10 +163,6 @@ * fool-proof by itself, since the nodeid can change. */ struct node_entry *hpsb_nodeid_get_entry(struct hpsb_host *host, nodeid_t nodeid); -/* Same as above except that it will not block waiting for the nodemgr - * serialize semaphore. */ -struct node_entry *hpsb_check_nodeid(struct hpsb_host *host, nodeid_t nodeid); - /* * If the entry refers to a local host, this function will return the pointer * to the hpsb_host structure. It will return NULL otherwise. Once you have diff -urN linux-2.5.68-bk1/drivers/ieee1394/ohci1394.c linux-2.5.68-bk2/drivers/ieee1394/ohci1394.c --- linux-2.5.68-bk1/drivers/ieee1394/ohci1394.c 2003-04-19 19:50:44.000000000 -0700 +++ linux-2.5.68-bk2/drivers/ieee1394/ohci1394.c 2003-04-21 15:53:39.000000000 -0700 @@ -165,7 +165,7 @@ printk(level "%s_%d: " fmt "\n" , OHCI1394_DRIVER_NAME, card , ## args) static char version[] __devinitdata = - "$Rev: 866 $ Ben Collins "; + "$Rev: 897 $ Ben Collins "; /* Module Parameters */ static int phys_dma = 1; @@ -2214,7 +2214,7 @@ } -static void ohci_irq_handler(int irq, void *dev_id, +static irqreturn_t ohci_irq_handler(int irq, void *dev_id, struct pt_regs *regs_are_unused) { quadlet_t event, node_id; @@ -2231,7 +2231,8 @@ reg_write(ohci, OHCI1394_IntEventClear, event & ~OHCI1394_busReset); spin_unlock_irqrestore(&ohci->event_lock, flags); - if (!event) return; + if (!event) + return IRQ_NONE; DBGMSG(ohci->id, "IntEvent: %08x", event); @@ -2462,7 +2463,7 @@ PRINT(KERN_ERR, ohci->id, "Unhandled interrupt(s) 0x%08x", event); - return; + return IRQ_HANDLED; } /* Put the buffer back into the dma context */ diff -urN linux-2.5.68-bk1/drivers/ieee1394/pcilynx.c linux-2.5.68-bk2/drivers/ieee1394/pcilynx.c --- linux-2.5.68-bk1/drivers/ieee1394/pcilynx.c 2003-04-19 19:49:10.000000000 -0700 +++ linux-2.5.68-bk2/drivers/ieee1394/pcilynx.c 2003-04-21 15:53:39.000000000 -0700 @@ -1163,7 +1163,7 @@ ********************************************************/ -static void lynx_irq_handler(int irq, void *dev_id, +static irqreturn_t lynx_irq_handler(int irq, void *dev_id, struct pt_regs *regs_are_unused) { struct ti_lynx *lynx = (struct ti_lynx *)dev_id; @@ -1174,7 +1174,8 @@ linkint = reg_read(lynx, LINK_INT_STATUS); intmask = reg_read(lynx, PCI_INT_STATUS); - if (!(intmask & PCI_INT_INT_PEND)) return; + if (!(intmask & PCI_INT_INT_PEND)) + return IRQ_HANDLED; PRINTD(KERN_DEBUG, lynx->id, "interrupt: 0x%08x / 0x%08x", intmask, linkint); @@ -1390,6 +1391,8 @@ run_pcl(lynx, lynx->rcv_pcl_start, CHANNEL_ASYNC_RCV); } + + return IRQ_HANDLED; } @@ -1893,7 +1896,7 @@ .name = PCILYNX_DRIVER_NAME, .id_table = pci_table, .probe = add_card, - .remove = __devexit_p(remove_card), + .remove = remove_card, }; static struct hpsb_host_driver lynx_driver = { diff -urN linux-2.5.68-bk1/drivers/ieee1394/sbp2.c linux-2.5.68-bk2/drivers/ieee1394/sbp2.c --- linux-2.5.68-bk1/drivers/ieee1394/sbp2.c 2003-04-19 19:48:51.000000000 -0700 +++ linux-2.5.68-bk2/drivers/ieee1394/sbp2.c 2003-04-21 15:53:39.000000000 -0700 @@ -298,7 +298,7 @@ #include "sbp2.h" static char version[] __devinitdata = - "$Rev: 884 $ James Goodwin "; + "$Rev: 896 $ James Goodwin "; /* * Module load parameter definitions @@ -3040,10 +3040,10 @@ SPRINTF("Driver version : %s\n", version); SPRINTF("\nModule options :\n"); - SPRINTF(" max_speed : %s\n", hpsb_speedto_str[max_speed]); - SPRINTF(" max_sectors : %d\n", max_sectors); - SPRINTF(" serialize_io : %s\n", serialize_io ? "yes" : "no"); - SPRINTF(" exclusive_login : %s\n", exclusive_login ? "yes" : "no"); + SPRINTF(" max_speed : %s\n", hpsb_speedto_str[max_speed]); + SPRINTF(" max_sectors : %d\n", max_sectors); + SPRINTF(" serialize_io : %s\n", serialize_io ? "yes" : "no"); + SPRINTF(" exclusive_login : %s\n", exclusive_login ? "yes" : "no"); SPRINTF("\nAttached devices : %s\n", !list_empty(&host->my_devices) ? "" : "none"); diff -urN linux-2.5.68-bk1/drivers/ieee1394/video1394.c linux-2.5.68-bk2/drivers/ieee1394/video1394.c --- linux-2.5.68-bk1/drivers/ieee1394/video1394.c 2003-04-19 19:48:52.000000000 -0700 +++ linux-2.5.68-bk2/drivers/ieee1394/video1394.c 2003-04-21 15:53:39.000000000 -0700 @@ -67,14 +67,6 @@ #define vmalloc_32(x) vmalloc(x) #endif -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,3)) -#define remap_page_range_1394(vma, start, addr, size, prot) \ - remap_page_range(start, addr, size, prot) -#else -#define remap_page_range_1394(vma, start, addr, size, prot) \ - remap_page_range(vma, start, addr, size, prot) -#endif - struct it_dma_prg { struct dma_cmd begin; quadlet_t data[4]; @@ -496,11 +488,7 @@ if (d->ir_prg[i][d->nb_cmd-1].status & cpu_to_le32(0xFFFF0000)) { reset_ir_status(d, i); d->buffer_status[i] = VIDEO1394_BUFFER_READY; -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,18) - get_fast_time(&d->buffer_time[i]); -#else do_gettimeofday(&d->buffer_time[i]); -#endif } } diff -urN linux-2.5.68-bk1/drivers/input/joystick/iforce/iforce-serio.c linux-2.5.68-bk2/drivers/input/joystick/iforce/iforce-serio.c --- linux-2.5.68-bk1/drivers/input/joystick/iforce/iforce-serio.c 2003-04-19 19:48:49.000000000 -0700 +++ linux-2.5.68-bk2/drivers/input/joystick/iforce/iforce-serio.c 2003-04-21 15:53:39.000000000 -0700 @@ -78,40 +78,38 @@ iforce_serial_xmit((struct iforce *)serio->private); } -static void iforce_serio_irq(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs) +static irqreturn_t iforce_serio_irq(struct serio *serio, + unsigned char data, unsigned int flags, struct pt_regs *regs) { struct iforce* iforce = serio->private; if (!iforce->pkt) { - if (data != 0x2b) { - return; - } - iforce->pkt = 1; - return; + if (data == 0x2b) + iforce->pkt = 1; + goto out; } if (!iforce->id) { - if (data > 3 && data != 0xff) { + if (data > 3 && data != 0xff) iforce->pkt = 0; - return; - } - iforce->id = data; - return; + else + iforce->id = data; + goto out; } if (!iforce->len) { if (data > IFORCE_MAX_LENGTH) { iforce->pkt = 0; iforce->id = 0; - return; + } else { + iforce->len = data; } - iforce->len = data; - return; + goto out; } if (iforce->idx < iforce->len) { iforce->csum += iforce->data[iforce->idx++] = data; - return; + goto out; } if (iforce->idx == iforce->len) { @@ -122,6 +120,8 @@ iforce->idx = 0; iforce->csum = 0; } +out: + return IRQ_HANDLED; } static void iforce_serio_connect(struct serio *serio, struct serio_dev *dev) diff -urN linux-2.5.68-bk1/drivers/input/joystick/magellan.c linux-2.5.68-bk2/drivers/input/joystick/magellan.c --- linux-2.5.68-bk1/drivers/input/joystick/magellan.c 2003-04-19 19:48:49.000000000 -0700 +++ linux-2.5.68-bk2/drivers/input/joystick/magellan.c 2003-04-21 15:53:39.000000000 -0700 @@ -113,7 +113,8 @@ input_sync(dev); } -static void magellan_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs) +static irqreturn_t magellan_interrupt(struct serio *serio, + unsigned char data, unsigned int flags, struct pt_regs *regs) { struct magellan* magellan = serio->private; @@ -123,7 +124,8 @@ } else { if (magellan->idx < MAGELLAN_MAX_LENGTH) magellan->data[magellan->idx++] = data; - } + } + return IRQ_HANDLED; } /* diff -urN linux-2.5.68-bk1/drivers/input/joystick/spaceball.c linux-2.5.68-bk2/drivers/input/joystick/spaceball.c --- linux-2.5.68-bk1/drivers/input/joystick/spaceball.c 2003-04-19 19:48:50.000000000 -0700 +++ linux-2.5.68-bk2/drivers/input/joystick/spaceball.c 2003-04-21 15:53:39.000000000 -0700 @@ -149,7 +149,8 @@ * can occur in the axis values. */ -static void spaceball_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs) +static irqreturn_t spaceball_interrupt(struct serio *serio, + unsigned char data, unsigned int flags, struct pt_regs *regs) { struct spaceball *spaceball = serio->private; @@ -158,11 +159,11 @@ spaceball_process_packet(spaceball, regs); spaceball->idx = 0; spaceball->escape = 0; - return; + break; case '^': if (!spaceball->escape) { spaceball->escape = 1; - return; + break; } spaceball->escape = 0; case 'M': @@ -177,8 +178,9 @@ spaceball->escape = 0; if (spaceball->idx < SPACEBALL_MAX_LENGTH) spaceball->data[spaceball->idx++] = data; - return; + break; } + return IRQ_HANDLED; } /* diff -urN linux-2.5.68-bk1/drivers/input/joystick/spaceorb.c linux-2.5.68-bk2/drivers/input/joystick/spaceorb.c --- linux-2.5.68-bk1/drivers/input/joystick/spaceorb.c 2003-04-19 19:49:21.000000000 -0700 +++ linux-2.5.68-bk2/drivers/input/joystick/spaceorb.c 2003-04-21 15:53:39.000000000 -0700 @@ -130,7 +130,8 @@ input_sync(dev); } -static void spaceorb_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs) +static irqreturn_t spaceorb_interrupt(struct serio *serio, + unsigned char data, unsigned int flags, struct pt_regs *regs) { struct spaceorb* spaceorb = serio->private; @@ -140,6 +141,7 @@ } if (spaceorb->idx < SPACEORB_MAX_LENGTH) spaceorb->data[spaceorb->idx++] = data & 0x7f; + return IRQ_HANDLED; } /* diff -urN linux-2.5.68-bk1/drivers/input/joystick/stinger.c linux-2.5.68-bk2/drivers/input/joystick/stinger.c --- linux-2.5.68-bk1/drivers/input/joystick/stinger.c 2003-04-19 19:48:47.000000000 -0700 +++ linux-2.5.68-bk2/drivers/input/joystick/stinger.c 2003-04-21 15:53:39.000000000 -0700 @@ -98,7 +98,8 @@ * packet processing routine. */ -static void stinger_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs) +static irqreturn_t stinger_interrupt(struct serio *serio, + unsigned char data, unsigned int flags, struct pt_regs *regs) { struct stinger* stinger = serio->private; @@ -112,7 +113,7 @@ stinger->idx = 0; } - return; + return IRQ_HANDLED; } /* diff -urN linux-2.5.68-bk1/drivers/input/joystick/warrior.c linux-2.5.68-bk2/drivers/input/joystick/warrior.c --- linux-2.5.68-bk1/drivers/input/joystick/warrior.c 2003-04-19 19:50:08.000000000 -0700 +++ linux-2.5.68-bk2/drivers/input/joystick/warrior.c 2003-04-21 15:53:39.000000000 -0700 @@ -99,7 +99,8 @@ * packet processing routine. */ -static void warrior_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs) +static irqreturn_t warrior_interrupt(struct serio *serio, + unsigned char data, unsigned int flags, struct pt_regs *regs) { struct warrior* warrior = serio->private; @@ -117,6 +118,7 @@ warrior->idx = 0; warrior->len = 0; } + return IRQ_HANDLED; } /* diff -urN linux-2.5.68-bk1/drivers/input/keyboard/atkbd.c linux-2.5.68-bk2/drivers/input/keyboard/atkbd.c --- linux-2.5.68-bk1/drivers/input/keyboard/atkbd.c 2003-04-19 19:50:37.000000000 -0700 +++ linux-2.5.68-bk2/drivers/input/keyboard/atkbd.c 2003-04-21 15:53:39.000000000 -0700 @@ -132,7 +132,8 @@ * the keyboard into events. */ -static void atkbd_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs) +static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data, + unsigned int flags, struct pt_regs *regs) { struct atkbd *atkbd = serio->private; int code = data; @@ -145,7 +146,7 @@ printk("atkbd.c: frame/parity error: %02x\n", flags); serio_write(serio, ATKBD_CMD_RESEND); atkbd->resend = 1; - return; + goto out; } if (!flags) @@ -154,34 +155,35 @@ switch (code) { case ATKBD_RET_ACK: atkbd->ack = 1; - return; + goto out; case ATKBD_RET_NAK: atkbd->ack = -1; - return; + goto out; } if (atkbd->cmdcnt) { atkbd->cmdbuf[--atkbd->cmdcnt] = code; - return; + goto out; } switch (atkbd->keycode[code]) { case ATKBD_KEY_BAT: serio_rescan(atkbd->serio); - return; + goto out; case ATKBD_KEY_EMUL0: atkbd->emul = 1; - return; + goto out; case ATKBD_KEY_EMUL1: atkbd->emul = 2; - return; + goto out; case ATKBD_KEY_RELEASE: atkbd->release = 1; - return; + goto out; } if (atkbd->emul) { - if (--atkbd->emul) return; + if (--atkbd->emul) + goto out; code |= 0x100; } @@ -197,8 +199,10 @@ input_report_key(&atkbd->dev, atkbd->keycode[code], !atkbd->release); input_sync(&atkbd->dev); } - + atkbd->release = 0; +out: + return IRQ_HANDLED; } /* diff -urN linux-2.5.68-bk1/drivers/input/keyboard/newtonkbd.c linux-2.5.68-bk2/drivers/input/keyboard/newtonkbd.c --- linux-2.5.68-bk1/drivers/input/keyboard/newtonkbd.c 2003-04-19 19:48:46.000000000 -0700 +++ linux-2.5.68-bk2/drivers/input/keyboard/newtonkbd.c 2003-04-21 15:53:39.000000000 -0700 @@ -62,7 +62,8 @@ char phys[32]; }; -void nkbd_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs) +irqreturn_t nkbd_interrupt(struct serio *serio, + unsigned char data, unsigned int flags, struct pt_regs *regs) { struct nkbd *nkbd = serio->private; @@ -75,6 +76,7 @@ else if (data == 0xe7) /* end of init sequence */ printk(KERN_INFO "input: %s on %s\n", nkbd_name, serio->phys); + return IRQ_HANDLED; } diff -urN linux-2.5.68-bk1/drivers/input/keyboard/sunkbd.c linux-2.5.68-bk2/drivers/input/keyboard/sunkbd.c --- linux-2.5.68-bk1/drivers/input/keyboard/sunkbd.c 2003-04-19 19:48:46.000000000 -0700 +++ linux-2.5.68-bk2/drivers/input/keyboard/sunkbd.c 2003-04-21 15:53:39.000000000 -0700 @@ -89,18 +89,19 @@ * is received. */ -static void sunkbd_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs) +static irqreturn_t sunkbd_interrupt(struct serio *serio, + unsigned char data, unsigned int flags, struct pt_regs *regs) { struct sunkbd* sunkbd = serio->private; if (sunkbd->reset <= -1) { /* If cp[i] is 0xff, sunkbd->reset will stay -1. */ sunkbd->reset = data; /* The keyboard sends 0xff 0xff 0xID on powerup */ - return; + goto out; } if (sunkbd->layout == -1) { sunkbd->layout = data; - return; + goto out; } switch (data) { @@ -108,14 +109,14 @@ case SUNKBD_RET_RESET: schedule_work(&sunkbd->tq); sunkbd->reset = -1; - return; + break; case SUNKBD_RET_LAYOUT: sunkbd->layout = -1; - return; + break; case SUNKBD_RET_ALLUP: /* All keys released */ - return; + break; default: if (sunkbd->keycode[data & SUNKBD_KEY]) { @@ -127,6 +128,8 @@ data & SUNKBD_KEY, data & SUNKBD_RELEASE ? "released" : "pressed"); } } +out: + return IRQ_HANDLED; } /* diff -urN linux-2.5.68-bk1/drivers/input/keyboard/xtkbd.c linux-2.5.68-bk2/drivers/input/keyboard/xtkbd.c --- linux-2.5.68-bk1/drivers/input/keyboard/xtkbd.c 2003-04-19 19:49:52.000000000 -0700 +++ linux-2.5.68-bk2/drivers/input/keyboard/xtkbd.c 2003-04-21 15:53:39.000000000 -0700 @@ -63,14 +63,15 @@ char phys[32]; }; -void xtkbd_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs) +irqreturn_t xtkbd_interrupt(struct serio *serio, + unsigned char data, unsigned int flags, struct pt_regs *regs) { struct xtkbd *xtkbd = serio->private; switch (data) { case XTKBD_EMUL0: case XTKBD_EMUL1: - return; + break; default: if (xtkbd->keycode[data & XTKBD_KEY]) { @@ -81,7 +82,8 @@ printk(KERN_WARNING "xtkbd.c: Unknown key (scancode %#x) %s.\n", data & XTKBD_KEY, data & XTKBD_RELEASE ? "released" : "pressed"); } - } + } + return IRQ_HANDLED; } void xtkbd_connect(struct serio *serio, struct serio_dev *dev) diff -urN linux-2.5.68-bk1/drivers/input/mouse/inport.c linux-2.5.68-bk2/drivers/input/mouse/inport.c --- linux-2.5.68-bk1/drivers/input/mouse/inport.c 2003-04-19 19:49:32.000000000 -0700 +++ linux-2.5.68-bk2/drivers/input/mouse/inport.c 2003-04-21 15:53:39.000000000 -0700 @@ -85,7 +85,7 @@ static int inport_irq = INPORT_IRQ; static int inport_used = 0; -static void inport_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t inport_interrupt(int irq, void *dev_id, struct pt_regs *regs); static int inport_open(struct input_dev *dev) { @@ -124,7 +124,7 @@ }, }; -static void inport_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t inport_interrupt(int irq, void *dev_id, struct pt_regs *regs) { unsigned char buttons; @@ -150,6 +150,7 @@ outb(INPORT_MODE_IRQ | INPORT_MODE_BASE, INPORT_DATA_PORT); input_sync(&inport_dev); + return IRQ_HANDLED; } #ifndef MODULE diff -urN linux-2.5.68-bk1/drivers/input/mouse/logibm.c linux-2.5.68-bk2/drivers/input/mouse/logibm.c --- linux-2.5.68-bk1/drivers/input/mouse/logibm.c 2003-04-19 19:49:31.000000000 -0700 +++ linux-2.5.68-bk2/drivers/input/mouse/logibm.c 2003-04-21 15:53:39.000000000 -0700 @@ -75,7 +75,7 @@ static int logibm_irq = LOGIBM_IRQ; static int logibm_used = 0; -static void logibm_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t logibm_interrupt(int irq, void *dev_id, struct pt_regs *regs); static int logibm_open(struct input_dev *dev) { @@ -114,7 +114,7 @@ }, }; -static void logibm_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t logibm_interrupt(int irq, void *dev_id, struct pt_regs *regs) { char dx, dy; unsigned char buttons; @@ -139,6 +139,7 @@ input_sync(&logibm_dev); outb(LOGIBM_ENABLE_IRQ, LOGIBM_CONTROL_PORT); + return IRQ_HANDLED; } #ifndef MODULE diff -urN linux-2.5.68-bk1/drivers/input/mouse/pc110pad.c linux-2.5.68-bk2/drivers/input/mouse/pc110pad.c --- linux-2.5.68-bk1/drivers/input/mouse/pc110pad.c 2003-04-19 19:49:09.000000000 -0700 +++ linux-2.5.68-bk2/drivers/input/mouse/pc110pad.c 2003-04-21 15:53:39.000000000 -0700 @@ -60,7 +60,7 @@ static char *pc110pad_name = "IBM PC110 TouchPad"; static char *pc110pad_phys = "isa15e0/input0"; -static void pc110pad_interrupt(int irq, void *ptr, struct pt_regs *regs) +static irqreturn_t pc110pad_interrupt(int irq, void *ptr, struct pt_regs *regs) { int value = inb_p(pc110pad_io); int handshake = inb_p(pc110pad_io + 2); @@ -83,6 +83,7 @@ input_sync(&pc110pad_dev); pc110pad_count = 0; + return IRQ_HANDLED; } static void pc110pad_close(struct input_dev *dev) diff -urN linux-2.5.68-bk1/drivers/input/mouse/psmouse.c linux-2.5.68-bk2/drivers/input/mouse/psmouse.c --- linux-2.5.68-bk1/drivers/input/mouse/psmouse.c 2003-04-19 19:48:55.000000000 -0700 +++ linux-2.5.68-bk2/drivers/input/mouse/psmouse.c 2003-04-21 15:53:39.000000000 -0700 @@ -167,7 +167,8 @@ * packets or passing them to the command routine as command output. */ -static void psmouse_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs) +static irqreturn_t psmouse_interrupt(struct serio *serio, + unsigned char data, unsigned int flags, struct pt_regs *regs) { struct psmouse *psmouse = serio->private; @@ -186,12 +187,12 @@ break; } psmouse->acking = 0; - return; + goto out; } if (psmouse->cmdcnt) { psmouse->cmdbuf[--psmouse->cmdcnt] = data; - return; + goto out; } if (psmouse->pktcnt && time_after(jiffies, psmouse->last + HZ/2)) { @@ -205,13 +206,15 @@ if (psmouse->pktcnt == 3 + (psmouse->type >= PSMOUSE_GENPS)) { psmouse_process_packet(psmouse, regs); psmouse->pktcnt = 0; - return; + goto out; } if (psmouse->pktcnt == 1 && psmouse->packet[0] == PSMOUSE_RET_BAT) { serio_rescan(serio); - return; - } + goto out; + } +out: + return IRQ_HANDLED; } /* diff -urN linux-2.5.68-bk1/drivers/input/mouse/sermouse.c linux-2.5.68-bk2/drivers/input/mouse/sermouse.c --- linux-2.5.68-bk1/drivers/input/mouse/sermouse.c 2003-04-19 19:50:12.000000000 -0700 +++ linux-2.5.68-bk2/drivers/input/mouse/sermouse.c 2003-04-21 15:53:39.000000000 -0700 @@ -204,7 +204,8 @@ * packets or passing them to the command routine as command output. */ -static void sermouse_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs) +static irqreturn_t sermouse_interrupt(struct serio *serio, + unsigned char data, unsigned int flags, struct pt_regs *regs) { struct sermouse *sermouse = serio->private; @@ -215,6 +216,7 @@ sermouse_process_ms(sermouse, data, regs); else sermouse_process_msc(sermouse, data, regs); + return IRQ_HANDLED; } /* diff -urN linux-2.5.68-bk1/drivers/input/serio/ct82c710.c linux-2.5.68-bk2/drivers/input/serio/ct82c710.c --- linux-2.5.68-bk1/drivers/input/serio/ct82c710.c 2003-04-19 19:48:49.000000000 -0700 +++ linux-2.5.68-bk2/drivers/input/serio/ct82c710.c 2003-04-21 15:53:39.000000000 -0700 @@ -64,7 +64,7 @@ static int ct82c710_data; static int ct82c710_status; -static void ct82c710_interrupt(int cpl, void *dev_id, struct pt_regs * regs); +static irqreturn_t ct82c710_interrupt(int cpl, void *dev_id, struct pt_regs * regs); /* * Wait for device to send output char and flush any input char. @@ -154,9 +154,9 @@ * is waiting in the 82C710. */ -static void ct82c710_interrupt(int cpl, void *dev_id, struct pt_regs * regs) +static irqreturn_t ct82c710_interrupt(int cpl, void *dev_id, struct pt_regs * regs) { - serio_interrupt(&ct82c710_port, inb(ct82c710_data), 0, regs); + return serio_interrupt(&ct82c710_port, inb(ct82c710_data), 0, regs); } /* diff -urN linux-2.5.68-bk1/drivers/input/serio/serio.c linux-2.5.68-bk2/drivers/input/serio/serio.c --- linux-2.5.68-bk1/drivers/input/serio/serio.c 2003-04-19 19:48:49.000000000 -0700 +++ linux-2.5.68-bk2/drivers/input/serio/serio.c 2003-04-21 15:53:39.000000000 -0700 @@ -135,13 +135,20 @@ wake_up(&serio_wait); } -void serio_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs) -{ - if (serio->dev && serio->dev->interrupt) - serio->dev->interrupt(serio, data, flags, regs); - else - if (!flags) +irqreturn_t serio_interrupt(struct serio *serio, + unsigned char data, unsigned int flags, struct pt_regs *regs) +{ + irqreturn_t ret = IRQ_NONE; + + if (serio->dev && serio->dev->interrupt) { + ret = serio->dev->interrupt(serio, data, flags, regs); + } else { + if (!flags) { serio_rescan(serio); + ret = IRQ_HANDLED; + } + } + return ret; } void serio_register_port(struct serio *serio) diff -urN linux-2.5.68-bk1/drivers/input/touchscreen/gunze.c linux-2.5.68-bk2/drivers/input/touchscreen/gunze.c --- linux-2.5.68-bk1/drivers/input/touchscreen/gunze.c 2003-04-19 19:49:09.000000000 -0700 +++ linux-2.5.68-bk2/drivers/input/touchscreen/gunze.c 2003-04-21 15:53:39.000000000 -0700 @@ -78,7 +78,8 @@ input_sync(dev); } -static void gunze_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs) +static irqreturn_t gunze_interrupt(struct serio *serio, + unsigned char data, unsigned int flags, struct pt_regs *regs) { struct gunze* gunze = serio->private; @@ -88,7 +89,8 @@ } else { if (gunze->idx < GUNZE_MAX_LENGTH) gunze->data[gunze->idx++] = data; - } + } + return IRQ_HANDLED; } /* diff -urN linux-2.5.68-bk1/drivers/isdn/act2000/act2000_isa.c linux-2.5.68-bk2/drivers/isdn/act2000/act2000_isa.c --- linux-2.5.68-bk1/drivers/isdn/act2000/act2000_isa.c 2003-04-19 19:49:13.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/act2000/act2000_isa.c 2003-04-21 15:53:39.000000000 -0700 @@ -69,7 +69,7 @@ return ret; } -static void +static irqreturn_t act2000_isa_interrupt(int irq, void *dev_id, struct pt_regs *regs) { act2000_card *card = irq2card_map[irq]; @@ -78,7 +78,7 @@ if (!card) { printk(KERN_WARNING "act2000: Spurious interrupt!\n"); - return; + return IRQ_NONE; } istatus = (inb(ISA_PORT_ISR) & 0x07); if (istatus & ISA_ISR_OUT) { @@ -95,6 +95,7 @@ } if (istatus) printk(KERN_DEBUG "act2000: ?IRQ %d %02x\n", irq, istatus); + return IRQ_HANDLED; } static void diff -urN linux-2.5.68-bk1/drivers/isdn/eicon/eicon.h linux-2.5.68-bk2/drivers/isdn/eicon/eicon.h --- linux-2.5.68-bk1/drivers/isdn/eicon/eicon.h 2003-04-19 19:48:56.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/eicon/eicon.h 2003-04-21 15:53:39.000000000 -0700 @@ -14,6 +14,8 @@ #ifndef eicon_h #define eicon_h +#include + #define EICON_IOCTL_SETMMIO 0 #define EICON_IOCTL_GETMMIO 1 #define EICON_IOCTL_SETIRQ 2 @@ -364,7 +366,7 @@ extern int eicon_addcard(int, int, int, char *, int); extern void eicon_io_transmit(eicon_card *card); -extern void eicon_irq(int irq, void *dev_id, struct pt_regs *regs); +extern irqreturn_t eicon_irq(int irq, void *dev_id, struct pt_regs *regs); extern void eicon_io_rcv_dispatch(eicon_card *ccard); extern void eicon_io_ack_dispatch(eicon_card *ccard); #ifdef CONFIG_MCA diff -urN linux-2.5.68-bk1/drivers/isdn/eicon/eicon_idi.c linux-2.5.68-bk2/drivers/isdn/eicon/eicon_idi.c --- linux-2.5.68-bk1/drivers/isdn/eicon/eicon_idi.c 2003-04-19 19:48:46.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/eicon/eicon_idi.c 2003-04-21 15:53:39.000000000 -0700 @@ -3097,7 +3097,7 @@ { int l = 0; int ret = 0; - int timeout; + unsigned long timeout; int i; struct sk_buff *skb; struct sk_buff *skb2; diff -urN linux-2.5.68-bk1/drivers/isdn/eicon/eicon_io.c linux-2.5.68-bk2/drivers/isdn/eicon/eicon_io.c --- linux-2.5.68-bk1/drivers/isdn/eicon/eicon_io.c 2003-04-19 19:48:56.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/eicon/eicon_io.c 2003-04-21 15:53:39.000000000 -0700 @@ -501,7 +501,7 @@ /* * IRQ handler */ -void +irqreturn_t eicon_irq(int irq, void *dev_id, struct pt_regs *regs) { eicon_card *ccard = (eicon_card *)dev_id; eicon_isa_card *isa_card; @@ -521,7 +521,7 @@ if (!ccard) { eicon_log(ccard, 1, "eicon_irq: spurious interrupt %d\n", irq); - return; + return IRQ_NONE; } if (ccard->type == EICON_CTYPE_QUADRO) { @@ -554,7 +554,7 @@ break; default: eicon_log(ccard, 1, "eicon_irq: unsupported card-type!\n"); - return; + return IRQ_NONE; } if (*irqprobe) { @@ -577,7 +577,7 @@ (*irqprobe)++; break; } - return; + return IRQ_HANDLED; } switch(ccard->type) { @@ -588,7 +588,7 @@ case EICON_CTYPE_S2M: if (!(readb(isa_card->intack))) { /* card did not interrupt */ eicon_log(ccard, 1, "eicon: IRQ: card reports no interrupt!\n"); - return; + return IRQ_NONE; } break; } @@ -744,6 +744,6 @@ break; } - return; + return IRQ_HANDLED; } #endif diff -urN linux-2.5.68-bk1/drivers/isdn/eicon/linio.c linux-2.5.68-bk2/drivers/isdn/eicon/linio.c --- linux-2.5.68-bk1/drivers/isdn/eicon/linio.c 2003-04-19 19:48:56.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/eicon/linio.c 2003-04-21 15:53:39.000000000 -0700 @@ -36,7 +36,7 @@ void UxPause(long int ms) { - int timeout = jiffies + ((ms * HZ) / 1000); + unsigned long timeout = jiffies + ((ms * HZ) / 1000); while (time_before(jiffies, timeout)); } @@ -577,7 +577,7 @@ return; } -void Divasintr(int arg, void *unused, struct pt_regs *unused_regs) +irqreturn_t Divasintr(int arg, void *unused, struct pt_regs *unused_regs) { int i; card_t *card = NULL; @@ -602,7 +602,7 @@ } } - return; + return IRQ_HANDLED; } @@ -680,7 +680,7 @@ return flags; } -void UxCardUnlock(ux_diva_card_t *card, long ipl) +void UxCardUnlock(ux_diva_card_t *card, unsigned long ipl) { spin_unlock_irqrestore(&diva_lock, ipl); } diff -urN linux-2.5.68-bk1/drivers/isdn/eicon/uxio.h linux-2.5.68-bk2/drivers/isdn/eicon/uxio.h --- linux-2.5.68-bk1/drivers/isdn/eicon/uxio.h 2003-04-19 19:48:51.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/eicon/uxio.h 2003-04-21 15:53:39.000000000 -0700 @@ -59,7 +59,7 @@ */ long UxCardLock(ux_diva_card_t *card); -void UxCardUnlock(ux_diva_card_t *card, long ipl); +void UxCardUnlock(ux_diva_card_t *card, unsigned long ipl); /* * Set the mapping address for PCI cards diff -urN linux-2.5.68-bk1/drivers/isdn/hardware/avm/avmcard.h linux-2.5.68-bk2/drivers/isdn/hardware/avm/avmcard.h --- linux-2.5.68-bk1/drivers/isdn/hardware/avm/avmcard.h 2003-04-19 19:50:49.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/hardware/avm/avmcard.h 2003-04-21 15:53:39.000000000 -0700 @@ -12,6 +12,7 @@ #include #include +#include #define AVMB1_PORTLEN 0x1f #define AVM_MAXVERSION 8 @@ -555,7 +556,7 @@ void b1_release_appl(struct capi_ctr *ctrl, u16 appl); u16 b1_send_message(struct capi_ctr *ctrl, struct sk_buff *skb); void b1_parse_version(avmctrl_info *card); -void b1_interrupt(int interrupt, void *devptr, struct pt_regs *regs); +irqreturn_t b1_interrupt(int interrupt, void *devptr, struct pt_regs *regs); int b1ctl_read_proc(char *page, char **start, off_t off, int count, int *eof, struct capi_ctr *ctrl); @@ -568,7 +569,7 @@ int b1pciv4_detect(avmcard *card); int t1pci_detect(avmcard *card); void b1dma_reset(avmcard *card); -void b1dma_interrupt(int interrupt, void *devptr, struct pt_regs *regs); +irqreturn_t b1dma_interrupt(int interrupt, void *devptr, struct pt_regs *regs); int b1dma_load_firmware(struct capi_ctr *ctrl, capiloaddata *data); void b1dma_reset_ctr(struct capi_ctr *ctrl); diff -urN linux-2.5.68-bk1/drivers/isdn/hardware/avm/b1.c linux-2.5.68-bk2/drivers/isdn/hardware/avm/b1.c --- linux-2.5.68-bk1/drivers/isdn/hardware/avm/b1.c 2003-04-19 19:50:45.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/hardware/avm/b1.c 2003-04-21 15:53:39.000000000 -0700 @@ -491,7 +491,7 @@ /* ------------------------------------------------------------- */ -void b1_interrupt(int interrupt, void *devptr, struct pt_regs *regs) +irqreturn_t b1_interrupt(int interrupt, void *devptr, struct pt_regs *regs) { avmcard *card = devptr; avmctrl_info *cinfo = &card->ctrlinfo[0]; @@ -506,7 +506,7 @@ unsigned WindowSize; if (!b1_rx_full(card->port)) - return; + return IRQ_NONE; b1cmd = b1_get_byte(card->port); @@ -619,12 +619,13 @@ case 0xff: printk(KERN_ERR "%s: card removed ?\n", card->name); - return; + return IRQ_NONE; default: printk(KERN_ERR "%s: b1_interrupt: 0x%x ???\n", card->name, b1cmd); - return; + return IRQ_HANDLED; } + return IRQ_HANDLED; } /* ------------------------------------------------------------- */ diff -urN linux-2.5.68-bk1/drivers/isdn/hardware/avm/b1dma.c linux-2.5.68-bk2/drivers/isdn/hardware/avm/b1dma.c --- linux-2.5.68-bk1/drivers/isdn/hardware/avm/b1dma.c 2003-04-19 19:50:09.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/hardware/avm/b1dma.c 2003-04-21 15:53:39.000000000 -0700 @@ -618,11 +618,12 @@ spin_unlock(&card->lock); } -void b1dma_interrupt(int interrupt, void *devptr, struct pt_regs *regs) +irqreturn_t b1dma_interrupt(int interrupt, void *devptr, struct pt_regs *regs) { avmcard *card = devptr; b1dma_handle_interrupt(card); + return IRQ_HANDLED; } /* ------------------------------------------------------------- */ diff -urN linux-2.5.68-bk1/drivers/isdn/hardware/avm/c4.c linux-2.5.68-bk2/drivers/isdn/hardware/avm/c4.c --- linux-2.5.68-bk1/drivers/isdn/hardware/avm/c4.c 2003-04-19 19:49:56.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/hardware/avm/c4.c 2003-04-21 15:53:39.000000000 -0700 @@ -659,7 +659,7 @@ /* ------------------------------------------------------------- */ -static void c4_handle_interrupt(avmcard *card) +static irqreturn_t c4_handle_interrupt(avmcard *card) { u32 status = c4inmeml(card->mbase+DOORBELL); @@ -667,7 +667,7 @@ int i; c4outmeml(card->mbase+PCI_OUT_INT_MASK, 0x0c); if (card->nlogcontr == 0) - return; + return IRQ_HANDLED; printk(KERN_ERR "%s: unexpected reset\n", card->name); for (i=0; i < card->nr_controllers; i++) { avmctrl_info *cinfo = &card->ctrlinfo[i]; @@ -676,12 +676,12 @@ capi_ctr_reseted(&cinfo->capi_ctrl); } card->nlogcontr = 0; - return; + return IRQ_HANDLED; } status &= (DBELL_UP_HOST | DBELL_DOWN_HOST); if (!status) - return; + return IRQ_HANDLED; c4outmeml(card->mbase+DOORBELL, status); if ((status & DBELL_UP_HOST) != 0) { @@ -702,13 +702,14 @@ c4_dispatch_tx(card); } } + return IRQ_HANDLED; } -static void c4_interrupt(int interrupt, void *devptr, struct pt_regs *regs) +static irqreturn_t c4_interrupt(int interrupt, void *devptr, struct pt_regs *regs) { avmcard *card = devptr; - c4_handle_interrupt(card); + return c4_handle_interrupt(card); } /* ------------------------------------------------------------- */ diff -urN linux-2.5.68-bk1/drivers/isdn/hardware/avm/t1isa.c linux-2.5.68-bk2/drivers/isdn/hardware/avm/t1isa.c --- linux-2.5.68-bk1/drivers/isdn/hardware/avm/t1isa.c 2003-04-19 19:50:01.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/hardware/avm/t1isa.c 2003-04-21 15:53:39.000000000 -0700 @@ -124,7 +124,7 @@ return 0; } -static void t1isa_interrupt(int interrupt, void *devptr, struct pt_regs *regs) +static irqreturn_t t1isa_interrupt(int interrupt, void *devptr, struct pt_regs *regs) { avmcard *card = devptr; avmctrl_info *cinfo = &card->ctrlinfo[0]; @@ -252,13 +252,14 @@ case 0xff: printk(KERN_ERR "%s: card reseted ?\n", card->name); - return; + return IRQ_HANDLED; default: printk(KERN_ERR "%s: b1_interrupt: 0x%x ???\n", card->name, b1cmd); - return; + return IRQ_NONE; } } + return IRQ_HANDLED; } /* ------------------------------------------------------------- */ diff -urN linux-2.5.68-bk1/drivers/isdn/hisax/avm_a1.c linux-2.5.68-bk2/drivers/isdn/hisax/avm_a1.c --- linux-2.5.68-bk1/drivers/isdn/hisax/avm_a1.c 2003-04-19 19:48:51.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/hisax/avm_a1.c 2003-04-21 15:53:39.000000000 -0700 @@ -113,14 +113,16 @@ .write_fifo = hscx_write_fifo, }; -static void +static irqreturn_t avm_a1_interrupt(int intno, void *dev_id, struct pt_regs *regs) { struct IsdnCardState *cs = dev_id; u8 val, sval; + int handled = 0; spin_lock(&cs->lock); while (((sval = bytein(cs->hw.avm.cfg_reg)) & 0xf) != 0x7) { + handled = 1; if (!(sval & AVM_A1_STAT_TIMER)) { byteout(cs->hw.avm.cfg_reg, 0x1E); sval = bytein(cs->hw.avm.cfg_reg); @@ -144,6 +146,7 @@ hscx_write(cs, 0, HSCX_MASK, 0x0); hscx_write(cs, 1, HSCX_MASK, 0x0); spin_unlock(&cs->lock); + return IRQ_RETVAL(handled); } static void diff -urN linux-2.5.68-bk1/drivers/isdn/hisax/avm_a1p.c linux-2.5.68-bk2/drivers/isdn/hisax/avm_a1p.c --- linux-2.5.68-bk1/drivers/isdn/hisax/avm_a1p.c 2003-04-19 19:51:21.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/hisax/avm_a1p.c 2003-04-21 15:53:39.000000000 -0700 @@ -159,7 +159,7 @@ .write_fifo = hscx_write_fifo, }; -static void +static irqreturn_t avm_a1p_interrupt(int intno, void *dev_id, struct pt_regs *regs) { struct IsdnCardState *cs = dev_id; @@ -187,6 +187,7 @@ hscx_write(cs, 0, HSCX_MASK, 0x0); hscx_write(cs, 1, HSCX_MASK, 0x0); spin_unlock(&cs->lock); + return IRQ_HANDLED; } static void diff -urN linux-2.5.68-bk1/drivers/isdn/hisax/bkm_a4t.c linux-2.5.68-bk2/drivers/isdn/hisax/bkm_a4t.c --- linux-2.5.68-bk1/drivers/isdn/hisax/bkm_a4t.c 2003-04-19 19:49:10.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/hisax/bkm_a4t.c 2003-04-21 15:53:39.000000000 -0700 @@ -137,18 +137,20 @@ .write_fifo = jade_write_fifo, }; -static void +static irqreturn_t bkm_interrupt(int intno, void *dev_id, struct pt_regs *regs) { struct IsdnCardState *cs = dev_id; u8 val = 0; I20_REGISTER_FILE *pI20_Regs; + int handled = 0; spin_lock(&cs->lock); pI20_Regs = (I20_REGISTER_FILE *) (cs->hw.ax.base); /* ISDN interrupt pending? */ if (pI20_Regs->i20IntStatus & intISDN) { + handled = 1; /* Reset the ISDN interrupt */ pI20_Regs->i20IntStatus = intISDN; /* Disable ISDN interrupt */ @@ -172,6 +174,7 @@ pI20_Regs->i20IntCtrl |= intISDN; } spin_unlock(&cs->lock); + return IRQ_RETVAL(handled); } static void diff -urN linux-2.5.68-bk1/drivers/isdn/hisax/diva.c linux-2.5.68-bk2/drivers/isdn/hisax/diva.c --- linux-2.5.68-bk1/drivers/isdn/hisax/diva.c 2003-04-19 19:51:08.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/hisax/diva.c 2003-04-21 15:53:39.000000000 -0700 @@ -319,7 +319,7 @@ .read_fifo = ipacx_bc_read_fifo, }; -static void +static irqreturn_t diva_interrupt(int intno, void *dev_id, struct pt_regs *regs) { struct IsdnCardState *cs = dev_id; @@ -331,9 +331,10 @@ } if (!cnt) printk(KERN_WARNING "Diva: IRQ LOOP\n"); + return IRQ_HANDLED; } -static void +static irqreturn_t diva_ipac_pci_irq(int intno, void *dev_id, struct pt_regs *regs) { struct IsdnCardState *cs = dev_id; @@ -341,22 +342,24 @@ val = readb(cs->hw.diva.pci_cfg); if (!(val & PITA_INT0_STATUS)) - return; /* other shared IRQ */ + return IRQ_NONE; /* other shared IRQ */ writeb(PITA_INT0_STATUS, cs->hw.diva.pci_cfg); /* Reset pending INT0 */ - ipac_irq(intno, dev_id, regs); + return ipac_irq(intno, dev_id, regs); } -static void +static irqreturn_t diva_ipacx_pci_irq(int intno, void *dev_id, struct pt_regs *regs) { struct IsdnCardState *cs = dev_id; u8 val; val = readb(cs->hw.diva.pci_cfg); - if (!(val &PITA_INT0_STATUS)) return; // other shared IRQ + if (!(val &PITA_INT0_STATUS)) + return IRQ_NONE; // other shared IRQ interrupt_ipacx(cs); // handler for chip writeb(PITA_INT0_STATUS, cs->hw.diva.pci_cfg); // Reset PLX interrupt + return IRQ_HANDLED; } static void diff -urN linux-2.5.68-bk1/drivers/isdn/hisax/elsa.c linux-2.5.68-bk2/drivers/isdn/hisax/elsa.c --- linux-2.5.68-bk1/drivers/isdn/hisax/elsa.c 2003-04-19 19:48:52.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/hisax/elsa.c 2003-04-21 15:53:39.000000000 -0700 @@ -307,7 +307,7 @@ return (v & ELSA_TIMER_RUN); } -static void +static irqreturn_t elsa_interrupt(int intno, void *dev_id, struct pt_regs *regs) { struct IsdnCardState *cs = dev_id; @@ -317,7 +317,7 @@ /* The card tends to generate interrupts while being removed causing us to just crash the kernel. bad. */ printk(KERN_WARNING "Elsa: card not available!\n"); - return; + return IRQ_NONE; } #if ARCOFI_USE if (cs->hw.elsa.MFlag) { @@ -351,9 +351,10 @@ #endif if (cs->hw.elsa.trig) byteout(cs->hw.elsa.trig, 0x00); + return IRQ_HANDLED; } -static void +static irqreturn_t elsa_interrupt_ipac(int intno, void *dev_id, struct pt_regs *regs) { struct IsdnCardState *cs = dev_id; @@ -361,13 +362,13 @@ if (!cs) { printk(KERN_WARNING "Elsa: Spurious interrupt!\n"); - return; + return IRQ_NONE; } if (cs->subtyp == ELSA_QS1000PCI || cs->subtyp == ELSA_QS3000PCI) { val = bytein(cs->hw.elsa.cfg + 0x4c); /* PCI IRQ */ if (!test_bit(FLG_BUGGY_PLX9050, &cs->HW_Flags) && !(val & ELSA_PCI_IRQ_MASK)) - return; + return IRQ_NONE; } #if ARCOFI_USE if (cs->hw.elsa.MFlag) { @@ -380,7 +381,7 @@ } } #endif - ipac_irq(intno, dev_id, regs); + return ipac_irq(intno, dev_id, regs); } static void diff -urN linux-2.5.68-bk1/drivers/isdn/hisax/enternow_pci.c linux-2.5.68-bk2/drivers/isdn/hisax/enternow_pci.c --- linux-2.5.68-bk1/drivers/isdn/hisax/enternow_pci.c 2003-04-19 19:50:34.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/hisax/enternow_pci.c 2003-04-21 15:53:39.000000000 -0700 @@ -208,7 +208,7 @@ return 0; } -static void +static irqreturn_t enpci_interrupt(int intno, void *dev_id, struct pt_regs *regs) { struct IsdnCardState *cs = dev_id; @@ -253,6 +253,7 @@ write_tiger(cs); } spin_unlock(&cs->lock); + return IRQ_HANDLED; } static struct card_ops enpci_ops = { diff -urN linux-2.5.68-bk1/drivers/isdn/hisax/hfc_pci.c linux-2.5.68-bk2/drivers/isdn/hisax/hfc_pci.c --- linux-2.5.68-bk1/drivers/isdn/hisax/hfc_pci.c 2003-04-19 19:49:19.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/hisax/hfc_pci.c 2003-04-21 15:53:39.000000000 -0700 @@ -869,7 +869,7 @@ /*********************/ /* Interrupt handler */ /*********************/ -static void +static irqreturn_t hfcpci_interrupt(int intno, void *dev_id, struct pt_regs *regs) { struct IsdnCardState *cs = dev_id; @@ -880,17 +880,17 @@ if (!cs) { printk(KERN_WARNING "HFC-PCI: Spurious interrupt!\n"); - return; + return IRQ_NONE; } if (!(cs->hw.hfcpci.int_m2 & 0x08)) - return; /* not initialised */ + return IRQ_NONE; /* not initialised */ if (HFCPCI_ANYINT & (stat = Read_hfc(cs, HFCPCI_STATUS))) { val = Read_hfc(cs, HFCPCI_INT_S1); if (cs->debug & L1_DEB_ISAC) debugl1(cs, "HFC-PCI: stat(%02x) s1(%02x)", stat, val); } else - return; + return IRQ_NONE; if (cs->debug & L1_DEB_ISAC) debugl1(cs, "HFC-PCI irq %x", val); @@ -964,6 +964,7 @@ } else val = 0; } + return IRQ_HANDLED; } /********************************************************************/ diff -urN linux-2.5.68-bk1/drivers/isdn/hisax/hfc_sx.c linux-2.5.68-bk2/drivers/isdn/hisax/hfc_sx.c --- linux-2.5.68-bk1/drivers/isdn/hisax/hfc_sx.c 2003-04-19 19:48:50.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/hisax/hfc_sx.c 2003-04-21 15:53:39.000000000 -0700 @@ -661,7 +661,7 @@ /*********************/ /* Interrupt handler */ /*********************/ -static void +static irqreturn_t hfcsx_interrupt(int intno, void *dev_id, struct pt_regs *regs) { struct IsdnCardState *cs = dev_id; @@ -672,17 +672,17 @@ if (!cs) { printk(KERN_WARNING "HFC-SX: Spurious interrupt!\n"); - return; + return IRQ_NONE; } if (!(cs->hw.hfcsx.int_m2 & 0x08)) - return; /* not initialised */ + return IRQ_NONE; /* not initialised */ if (HFCSX_ANYINT & (stat = Read_hfc(cs, HFCSX_STATUS))) { val = Read_hfc(cs, HFCSX_INT_S1); if (cs->debug & L1_DEB_ISAC) debugl1(cs, "HFC-SX: stat(%02x) s1(%02x)", stat, val); } else - return; + return IRQ_NONE; if (cs->debug & L1_DEB_ISAC) debugl1(cs, "HFC-SX irq %x", val); @@ -756,6 +756,7 @@ } else val = 0; } + return IRQ_HANDLED; } /********************************************************************/ diff -urN linux-2.5.68-bk1/drivers/isdn/hisax/hfcscard.c linux-2.5.68-bk2/drivers/isdn/hisax/hfcscard.c --- linux-2.5.68-bk1/drivers/isdn/hisax/hfcscard.c 2003-04-19 19:51:10.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/hisax/hfcscard.c 2003-04-21 15:53:39.000000000 -0700 @@ -32,7 +32,7 @@ cs->bc_hw_ops->write_reg(cs, data, reg, val); } -static void +static irqreturn_t hfcs_interrupt(int intno, void *dev_id, struct pt_regs *regs) { struct IsdnCardState *cs = dev_id; @@ -40,7 +40,7 @@ if (!cs) { printk(KERN_WARNING "HFCS: Spurious interrupt!\n"); - return; + return IRQ_NONE; } if ((HFCD_ANYINT | HFCD_BUSY_NBUSY) & (stat = hfcs_read_reg(cs, HFCD_DATA, HFCD_STAT))) { @@ -52,6 +52,7 @@ if (cs->debug & L1_DEB_ISAC) debugl1(cs, "HFCS: irq_no_irq stat(%02x)", stat); } + return IRQ_HANDLED; } static void diff -urN linux-2.5.68-bk1/drivers/isdn/hisax/hisax.h linux-2.5.68-bk2/drivers/isdn/hisax/hisax.h --- linux-2.5.68-bk1/drivers/isdn/hisax/hisax.h 2003-04-19 19:50:07.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/hisax/hisax.h 2003-04-21 15:53:39.000000000 -0700 @@ -28,6 +28,7 @@ #include #include #include +#include #define ERROR_STATISTIC @@ -886,7 +887,7 @@ void (*release) (struct IsdnCardState *); void (*aux_ind) (struct IsdnCardState *, void *); void (*led_handler)(struct IsdnCardState *); - void (*irq_func) (int, void *, struct pt_regs *); + irqreturn_t (*irq_func) (int, void *, struct pt_regs *); }; /* Card specific drivers provide methods to access the diff -urN linux-2.5.68-bk1/drivers/isdn/hisax/hisax_fcclassic.c linux-2.5.68-bk2/drivers/isdn/hisax/hisax_fcclassic.c --- linux-2.5.68-bk1/drivers/isdn/hisax/hisax_fcclassic.c 2003-04-19 19:48:51.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/hisax/hisax_fcclassic.c 2003-04-21 15:53:39.000000000 -0700 @@ -120,7 +120,7 @@ // ---------------------------------------------------------------------- -static void +static irqreturn_t fcclassic_irq(int intno, void *dev, struct pt_regs *regs) { struct fritz_adapter *adapter = dev; @@ -139,6 +139,7 @@ isac_irq(&adapter->isac); } } + return IRQ_HANDLED; } // ---------------------------------------------------------------------- diff -urN linux-2.5.68-bk1/drivers/isdn/hisax/hisax_fcpcipnp.c linux-2.5.68-bk2/drivers/isdn/hisax/hisax_fcpcipnp.c --- linux-2.5.68-bk1/drivers/isdn/hisax/hisax_fcpcipnp.c 2003-04-19 19:50:34.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/hisax/hisax_fcpcipnp.c 2003-04-21 15:53:39.000000000 -0700 @@ -629,7 +629,7 @@ // ---------------------------------------------------------------------- -static void fcpci2_irq(int intno, void *dev, struct pt_regs *regs) +static irqreturn_t fcpci2_irq(int intno, void *dev, struct pt_regs *regs) { struct fritz_adapter *adapter = dev; unsigned char val; @@ -637,16 +637,17 @@ val = inb(adapter->io + AVM_STATUS0); if (!(val & AVM_STATUS0_IRQ_MASK)) /* hopefully a shared IRQ reqest */ - return; + return IRQ_NONE; DBG(2, "STATUS0 %#x", val); if (val & AVM_STATUS0_IRQ_ISAC) isacsx_irq(&adapter->isac); if (val & AVM_STATUS0_IRQ_HDLC) hdlc_irq(adapter); + return IRQ_HANDLED; } -static void fcpci_irq(int intno, void *dev, struct pt_regs *regs) +static irqreturn_t fcpci_irq(int intno, void *dev, struct pt_regs *regs) { struct fritz_adapter *adapter = dev; unsigned char sval; @@ -654,13 +655,14 @@ sval = inb(adapter->io + 2); if ((sval & AVM_STATUS0_IRQ_MASK) == AVM_STATUS0_IRQ_MASK) /* possibly a shared IRQ reqest */ - return; + return IRQ_NONE; DBG(2, "sval %#x", sval); if (!(sval & AVM_STATUS0_IRQ_ISAC)) isac_irq(&adapter->isac); if (!(sval & AVM_STATUS0_IRQ_HDLC)) hdlc_irq(adapter); + return IRQ_HANDLED; } // ---------------------------------------------------------------------- diff -urN linux-2.5.68-bk1/drivers/isdn/hisax/hisax_hfcpci.c linux-2.5.68-bk2/drivers/isdn/hisax/hisax_hfcpci.c --- linux-2.5.68-bk1/drivers/isdn/hisax/hisax_hfcpci.c 2003-04-19 19:49:09.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/hisax/hisax_hfcpci.c 2003-04-21 15:53:39.000000000 -0700 @@ -1321,7 +1321,7 @@ // ---------------------------------------------------------------------- // IRQ handler -static void +static irqreturn_t hfcpci_irq(int intno, void *dev, struct pt_regs *regs) { struct hfcpci_adapter *adapter = dev; @@ -1329,11 +1329,11 @@ u8 val, stat; if (!(adapter->int_m2 & 0x08)) - return; /* not initialised */ // XX + return IRQ_NONE; /* not initialised */ // XX stat = hfcpci_readb(adapter, HFCPCI_STATUS); if (!(stat & HFCPCI_ANYINT)) - return; + return IRQ_NONE; spin_lock(&adapter->hw_lock); while (loop-- > 0) { @@ -1369,6 +1369,7 @@ hfcpci_timer_irq(adapter); } spin_unlock(&adapter->hw_lock); + return IRQ_HANDLED; } // ---------------------------------------------------------------------- diff -urN linux-2.5.68-bk1/drivers/isdn/hisax/hscx.h linux-2.5.68-bk2/drivers/isdn/hisax/hscx.h --- linux-2.5.68-bk1/drivers/isdn/hisax/hscx.h 2003-04-19 19:50:06.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/hisax/hscx.h 2003-04-21 15:53:39.000000000 -0700 @@ -10,6 +10,8 @@ * */ +#include + /* All Registers original Siemens Spec */ #define HSCX_ISTA 0x20 @@ -37,7 +39,7 @@ extern void modehscx(struct BCState *bcs, int mode, int bc); extern void inithscxisac(struct IsdnCardState *cs); extern void hscx_int_main(struct IsdnCardState *cs, u8 val); -extern void hscxisac_irq(int intno, void *dev_id, struct pt_regs *regs); +extern irqreturn_t hscxisac_irq(int intno, void *dev_id, struct pt_regs *regs); extern int hscxisac_setup(struct IsdnCardState *cs, struct dc_hw_ops *isac_ops, struct bc_hw_ops *hscx_ops); diff -urN linux-2.5.68-bk1/drivers/isdn/hisax/hscx_irq.c linux-2.5.68-bk2/drivers/isdn/hisax/hscx_irq.c --- linux-2.5.68-bk1/drivers/isdn/hisax/hscx_irq.c 2003-04-19 19:51:12.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/hisax/hscx_irq.c 2003-04-21 15:53:39.000000000 -0700 @@ -185,7 +185,7 @@ cs->dc_hw_ops->write_reg(cs, addr, val); } -void +irqreturn_t hscxisac_irq(int intno, void *dev_id, struct pt_regs *regs) { struct IsdnCardState *cs = dev_id; @@ -221,5 +221,6 @@ hscx_write(&cs->bcs[0], HSCX_MASK, 0x0); hscx_write(&cs->bcs[1], HSCX_MASK, 0x0); spin_unlock(&cs->lock); + return IRQ_HANDLED; } diff -urN linux-2.5.68-bk1/drivers/isdn/hisax/ipac.c linux-2.5.68-bk2/drivers/isdn/hisax/ipac.c --- linux-2.5.68-bk1/drivers/isdn/hisax/ipac.c 2003-04-19 19:48:50.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/hisax/ipac.c 2003-04-21 15:53:39.000000000 -0700 @@ -47,7 +47,7 @@ inithscxisac(cs); } -void +irqreturn_t ipac_irq(int intno, void *dev_id, struct pt_regs *regs) { struct IsdnCardState *cs = dev_id; @@ -90,6 +90,7 @@ ipac_write(cs, IPAC_MASK, 0xFF); ipac_write(cs, IPAC_MASK, 0xC0); spin_unlock(&cs->lock); + return IRQ_HANDLED; } int @@ -102,4 +103,5 @@ cs->bc_hw_ops = ipac_bc_ops; val = ipac_read(cs, IPAC_ID); printk(KERN_INFO "HiSax: IPAC version %#x\n", val); + return 0; } diff -urN linux-2.5.68-bk1/drivers/isdn/hisax/ipac.h linux-2.5.68-bk2/drivers/isdn/hisax/ipac.h --- linux-2.5.68-bk1/drivers/isdn/hisax/ipac.h 2003-04-19 19:51:11.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/hisax/ipac.h 2003-04-21 15:53:39.000000000 -0700 @@ -10,6 +10,8 @@ * */ +#include + /* All Registers original Siemens Spec */ #define IPAC_CONF 0xC0 @@ -29,7 +31,7 @@ #define IPAC_TIMR2 0xCC void ipac_init(struct IsdnCardState *cs); -void ipac_irq(int intno, void *dev_id, struct pt_regs *regs); +irqreturn_t ipac_irq(int intno, void *dev_id, struct pt_regs *regs); int ipac_setup(struct IsdnCardState *cs, struct dc_hw_ops *ipac_dc_ops, struct bc_hw_ops *ipac_bc_ops); diff -urN linux-2.5.68-bk1/drivers/isdn/hisax/niccy.c linux-2.5.68-bk2/drivers/isdn/hisax/niccy.c --- linux-2.5.68-bk1/drivers/isdn/hisax/niccy.c 2003-04-19 19:49:10.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/hisax/niccy.c 2003-04-21 15:53:39.000000000 -0700 @@ -151,7 +151,7 @@ .write_fifo = hscx_write_fifo, }; -static void +static irqreturn_t niccy_interrupt(int intno, void *dev_id, struct pt_regs *regs) { struct IsdnCardState *cs = dev_id; @@ -160,10 +160,10 @@ int ival; ival = inl(cs->hw.niccy.cfg_reg + PCI_IRQ_CTRL_REG); if (!(ival & PCI_IRQ_ASSERT)) /* IRQ not for us (shared) */ - return; + return IRQ_NONE; outl(ival, cs->hw.niccy.cfg_reg + PCI_IRQ_CTRL_REG); } - hscxisac_irq(intno, dev_id, regs); + return hscxisac_irq(intno, dev_id, regs); } void diff -urN linux-2.5.68-bk1/drivers/isdn/hisax/nj_s.c linux-2.5.68-bk2/drivers/isdn/hisax/nj_s.c --- linux-2.5.68-bk1/drivers/isdn/hisax/nj_s.c 2003-04-19 19:48:56.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/hisax/nj_s.c 2003-04-21 15:53:39.000000000 -0700 @@ -17,7 +17,7 @@ const char *NETjet_S_revision = "$Revision: 2.7.6.6 $"; -static void +static irqreturn_t nj_s_interrupt(int intno, void *dev_id, struct pt_regs *regs) { struct IsdnCardState *cs = dev_id; @@ -70,6 +70,7 @@ } */ spin_unlock(&cs->lock); + return IRQ_HANDLED; } static int diff -urN linux-2.5.68-bk1/drivers/isdn/hisax/nj_u.c linux-2.5.68-bk2/drivers/isdn/hisax/nj_u.c --- linux-2.5.68-bk1/drivers/isdn/hisax/nj_u.c 2003-04-19 19:48:56.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/hisax/nj_u.c 2003-04-21 15:53:39.000000000 -0700 @@ -17,7 +17,7 @@ const char *NETjet_U_revision = "$Revision: 2.8.6.6 $"; -static void +static irqreturn_t nj_u_interrupt(int intno, void *dev_id, struct pt_regs *regs) { struct IsdnCardState *cs = dev_id; @@ -70,6 +70,7 @@ } */ spin_unlock(&cs->lock); + return IRQ_HANDLED; } static int diff -urN linux-2.5.68-bk1/drivers/isdn/hisax/saphir.c linux-2.5.68-bk2/drivers/isdn/hisax/saphir.c --- linux-2.5.68-bk1/drivers/isdn/hisax/saphir.c 2003-04-19 19:48:48.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/hisax/saphir.c 2003-04-21 15:53:39.000000000 -0700 @@ -132,13 +132,15 @@ .write_fifo = hscx_write_fifo, }; -static void +static irqreturn_t saphir_interrupt(int intno, void *dev_id, struct pt_regs *regs) { struct IsdnCardState *cs = dev_id; + irqreturn_t ret; - hscxisac_irq(intno, dev_id, regs); + ret = hscxisac_irq(intno, dev_id, regs); mod_timer(&cs->hw.saphir.timer, jiffies+1*HZ); + return ret; } static void diff -urN linux-2.5.68-bk1/drivers/isdn/hisax/sedlbauer.c linux-2.5.68-bk2/drivers/isdn/hisax/sedlbauer.c --- linux-2.5.68-bk1/drivers/isdn/hisax/sedlbauer.c 2003-04-19 19:51:13.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/hisax/sedlbauer.c 2003-04-21 15:53:39.000000000 -0700 @@ -283,7 +283,7 @@ .write_reg = isar_write, }; -static void +static irqreturn_t sedlbauer_interrupt(int intno, void *dev_id, struct pt_regs *regs) { struct IsdnCardState *cs = dev_id; @@ -292,12 +292,12 @@ /* The card tends to generate interrupts while being removed causing us to just crash the kernel. bad. */ printk(KERN_WARNING "Sedlbauer: card not available!\n"); - return; + return IRQ_NONE; } - hscxisac_irq(intno, dev_id, regs); + return hscxisac_irq(intno, dev_id, regs); } -static void +static irqreturn_t sedlbauer_isar_interrupt(int intno, void *dev_id, struct pt_regs *regs) { struct IsdnCardState *cs = dev_id; @@ -334,6 +334,7 @@ isac_write(cs, ISAC_MASK, 0x0); isar_write(cs, 0, ISAR_IRQBIT, ISAR_IRQMSK); spin_unlock(&cs->lock); + return IRQ_HANDLED; } static int diff -urN linux-2.5.68-bk1/drivers/isdn/hisax/sportster.c linux-2.5.68-bk2/drivers/isdn/hisax/sportster.c --- linux-2.5.68-bk1/drivers/isdn/hisax/sportster.c 2003-04-19 19:48:53.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/hisax/sportster.c 2003-04-21 15:53:39.000000000 -0700 @@ -111,13 +111,14 @@ .write_fifo = hscx_write_fifo, }; -static void +static irqreturn_t sportster_interrupt(int intno, void *dev_id, struct pt_regs *regs) { struct IsdnCardState *cs = dev_id; hscxisac_irq(intno, dev_id, regs); bytein(cs->hw.spt.cfg_reg + SPORTSTER_RES_IRQ +1); + return IRQ_HANDLED; } static void diff -urN linux-2.5.68-bk1/drivers/isdn/hisax/teleint.c linux-2.5.68-bk2/drivers/isdn/hisax/teleint.c --- linux-2.5.68-bk1/drivers/isdn/hisax/teleint.c 2003-04-19 19:51:19.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/hisax/teleint.c 2003-04-21 15:53:39.000000000 -0700 @@ -178,7 +178,7 @@ .write_reg = WriteHFC, }; -static void +static irqreturn_t teleint_interrupt(int intno, void *dev_id, struct pt_regs *regs) { struct IsdnCardState *cs = dev_id; @@ -198,6 +198,7 @@ writereg(cs->hw.hfc.addr | 1, cs->hw.hfc.addr, ISAC_MASK, 0xFF); writereg(cs->hw.hfc.addr | 1, cs->hw.hfc.addr, ISAC_MASK, 0x0); spin_unlock(&cs->lock); + return IRQ_HANDLED; } static void diff -urN linux-2.5.68-bk1/drivers/isdn/hisax/telespci.c linux-2.5.68-bk2/drivers/isdn/hisax/telespci.c --- linux-2.5.68-bk1/drivers/isdn/hisax/telespci.c 2003-04-19 19:50:07.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/hisax/telespci.c 2003-04-21 15:53:39.000000000 -0700 @@ -199,7 +199,7 @@ .write_fifo = hscx_write_fifo, }; -static void +static irqreturn_t telespci_interrupt(int intno, void *dev_id, struct pt_regs *regs) { #define MAXCOUNT 20 @@ -223,6 +223,7 @@ hscx_write(cs, 0, HSCX_MASK, 0x0); hscx_write(cs, 1, HSCX_MASK, 0x0); spin_unlock(&cs->lock); + return IRQ_HANDLED; } static struct card_ops telespci_ops = { diff -urN linux-2.5.68-bk1/drivers/isdn/hisax/w6692.c linux-2.5.68-bk2/drivers/isdn/hisax/w6692.c --- linux-2.5.68-bk1/drivers/isdn/hisax/w6692.c 2003-04-19 19:50:45.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/hisax/w6692.c 2003-04-21 15:53:39.000000000 -0700 @@ -287,7 +287,7 @@ } } -static void +static irqreturn_t w6692_interrupt(int intno, void *dev_id, struct pt_regs *regs) { struct IsdnCardState *cs = dev_id; @@ -395,6 +395,7 @@ w6692_write_reg(cs, W_IMASK, 0xff); } spin_unlock(&cs->lock); + return IRQ_HANDLED; } static void diff -urN linux-2.5.68-bk1/drivers/isdn/hysdn/boardergo.c linux-2.5.68-bk2/drivers/isdn/hysdn/boardergo.c --- linux-2.5.68-bk1/drivers/isdn/hysdn/boardergo.c 2003-04-19 19:49:52.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/hysdn/boardergo.c 2003-04-21 15:53:39.000000000 -0700 @@ -32,7 +32,7 @@ /***************************************************/ /* The cards interrupt handler. Called from system */ /***************************************************/ -static void +static irqreturn_t ergo_interrupt(int intno, void *dev_id, struct pt_regs *regs) { hysdn_card *card = dev_id; /* parameter from irq */ @@ -41,16 +41,16 @@ uchar volatile b; if (!card) - return; /* error -> spurious interrupt */ + return IRQ_NONE; /* error -> spurious interrupt */ if (!card->irq_enabled) - return; /* other device interrupting or irq switched off */ + return IRQ_NONE; /* other device interrupting or irq switched off */ save_flags(flags); cli(); /* no further irqs allowed */ if (!(bytein(card->iobase + PCI9050_INTR_REG) & PCI9050_INTR_REG_STAT1)) { restore_flags(flags); /* restore old state */ - return; /* no interrupt requested by E1 */ + return IRQ_NONE; /* no interrupt requested by E1 */ } /* clear any pending ints on the board */ dpr = card->dpram; @@ -62,6 +62,7 @@ if (!card->hw_lock) schedule_work(&card->irq_queue); restore_flags(flags); + return IRQ_HANDLED; } /* ergo_interrupt */ /******************************************************************************/ diff -urN linux-2.5.68-bk1/drivers/isdn/pcbit/layer2.c linux-2.5.68-bk2/drivers/isdn/pcbit/layer2.c --- linux-2.5.68-bk1/drivers/isdn/pcbit/layer2.c 2003-04-19 19:50:33.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/pcbit/layer2.c 2003-04-21 15:53:39.000000000 -0700 @@ -524,7 +524,7 @@ } } -void +irqreturn_t pcbit_irq_handler(int interrupt, void *devptr, struct pt_regs *regs) { struct pcbit_dev *dev; @@ -536,11 +536,11 @@ if (!dev) { printk(KERN_WARNING "pcbit_irq_handler: wrong device\n"); - return; + return IRQ_NONE; } if (dev->interrupt) { printk(KERN_DEBUG "pcbit: reentering interrupt hander\n"); - return; + return IRQ_HANDLED; } dev->interrupt = 1; @@ -549,7 +549,7 @@ if (dev->l2_state == L2_STARTING || dev->l2_state == L2_ERROR) { pcbit_l2_active_conf(dev, info); dev->interrupt = 0; - return; + return IRQ_HANDLED; } if (info & 0x40U) { /* E bit set */ #ifdef DEBUG @@ -557,11 +557,11 @@ #endif pcbit_l2_error(dev); dev->interrupt = 0; - return; + return IRQ_HANDLED; } if (dev->l2_state != L2_RUNNING && dev->l2_state != L2_LOADING) { dev->interrupt = 0; - return; + return IRQ_HANDLED; } ack_seq = (info >> 3) & 0x07U; read_seq = (info & 0x07U); @@ -582,6 +582,7 @@ info |= dev->send_seq; writeb(info, dev->sh_mem + BANK4); + return IRQ_HANDLED; } diff -urN linux-2.5.68-bk1/drivers/isdn/pcbit/layer2.h linux-2.5.68-bk2/drivers/isdn/pcbit/layer2.h --- linux-2.5.68-bk1/drivers/isdn/pcbit/layer2.h 2003-04-19 19:48:51.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/pcbit/layer2.h 2003-04-21 15:53:39.000000000 -0700 @@ -17,6 +17,8 @@ #ifndef LAYER2_H #define LAYER2_H +#include + #include #define BANK1 0x0000U /* PC -> Board */ @@ -122,7 +124,7 @@ extern int pcbit_l2_write(struct pcbit_dev * dev, ulong msg, ushort refnum, struct sk_buff *skb, unsigned short hdr_len); -extern void pcbit_irq_handler(int interrupt, void *, struct pt_regs *regs); +extern irqreturn_t pcbit_irq_handler(int interrupt, void *, struct pt_regs *regs); extern struct pcbit_dev * dev_pcbit[MAX_PCBIT_CARDS]; diff -urN linux-2.5.68-bk1/drivers/isdn/sc/init.c linux-2.5.68-bk2/drivers/isdn/sc/init.c --- linux-2.5.68-bk1/drivers/isdn/sc/init.c 2003-04-19 19:50:30.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/sc/init.c 2003-04-21 15:53:39.000000000 -0700 @@ -36,7 +36,7 @@ static int sup_irq[] = { 11, 10, 9, 5, 12, 14, 7, 3, 4, 6 }; #define MAX_IRQS 10 -extern void interrupt_handler(int, void *, struct pt_regs *); +extern irqreturn_t interrupt_handler(int, void *, struct pt_regs *); extern int sndpkt(int, int, int, struct sk_buff *); extern int command(isdn_ctrl *); extern int indicate_status(int, int, ulong, char*); diff -urN linux-2.5.68-bk1/drivers/isdn/sc/interrupt.c linux-2.5.68-bk2/drivers/isdn/sc/interrupt.c --- linux-2.5.68-bk1/drivers/isdn/sc/interrupt.c 2003-04-19 19:50:06.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/sc/interrupt.c 2003-04-21 15:53:39.000000000 -0700 @@ -19,6 +19,7 @@ #include "hardware.h" #include "message.h" #include "card.h" +#include extern int indicate_status(int, int, ulong, char *); extern void check_phystat(unsigned long); @@ -44,7 +45,8 @@ /* * */ -void interrupt_handler(int interrupt, void * cardptr, struct pt_regs *regs ) { +irqreturn_t interrupt_handler(int interrupt, void *cardptr, struct pt_regs *regs) +{ RspMessage rcvmsg; int channel; @@ -54,7 +56,7 @@ if(!IS_VALID_CARD(card)) { pr_debug("Invalid param: %d is not a valid card id\n", card); - return; + return IRQ_NONE; } pr_debug("%s: Entered Interrupt handler\n", adapter[card]->devicename); @@ -242,4 +244,5 @@ } /* while */ pr_debug("%s: Exiting Interrupt Handler\n", adapter[card]->devicename); + return IRQ_HANDLED; } diff -urN linux-2.5.68-bk1/drivers/isdn/tpam/tpam.h linux-2.5.68-bk2/drivers/isdn/tpam/tpam.h --- linux-2.5.68-bk1/drivers/isdn/tpam/tpam.h 2003-04-19 19:48:53.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/tpam/tpam.h 2003-04-21 15:53:39.000000000 -0700 @@ -17,6 +17,7 @@ #include #include #include +#include /* Maximum number of channels for this board */ #define TPAM_NBCHANNEL 30 @@ -197,7 +198,7 @@ /* Function prototypes from tpam_queues.c */ extern void tpam_enqueue(tpam_card *, struct sk_buff *); extern void tpam_enqueue_data(tpam_channel *, struct sk_buff *); -extern void tpam_irq(int, void *, struct pt_regs *); +extern irqreturn_t tpam_irq(int, void *, struct pt_regs *); extern void tpam_recv_tq(tpam_card *); extern void tpam_send_tq(tpam_card *); diff -urN linux-2.5.68-bk1/drivers/isdn/tpam/tpam_commands.c linux-2.5.68-bk2/drivers/isdn/tpam/tpam_commands.c --- linux-2.5.68-bk1/drivers/isdn/tpam/tpam_commands.c 2003-04-19 19:48:51.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/tpam/tpam_commands.c 2003-04-21 15:53:39.000000000 -0700 @@ -173,7 +173,8 @@ * Return: 0 if OK, <0 on errors. */ static int tpam_command_ioctl_dsprun(tpam_card *card) { - u32 signature = 0, timeout, i; + u32 signature = 0, i; + unsigned long timeout; isdn_ctrl ctrl; struct sk_buff *skb; diff -urN linux-2.5.68-bk1/drivers/isdn/tpam/tpam_queues.c linux-2.5.68-bk2/drivers/isdn/tpam/tpam_queues.c --- linux-2.5.68-bk1/drivers/isdn/tpam/tpam_queues.c 2003-04-19 19:48:49.000000000 -0700 +++ linux-2.5.68-bk2/drivers/isdn/tpam/tpam_queues.c 2003-04-21 15:53:39.000000000 -0700 @@ -74,7 +74,8 @@ * dev_id: the registered board to the irq * regs: not used. */ -void tpam_irq(int irq, void *dev_id, struct pt_regs *regs) { +irqreturn_t tpam_irq(int irq, void *dev_id, struct pt_regs *regs) +{ tpam_card *card = (tpam_card *)dev_id; u32 ackupload, uploadptr; u32 waiting_too_long; @@ -115,7 +116,7 @@ printk(KERN_ERR "TurboPAM(tpam_irq): " "alloc_skb failed\n"); spin_unlock(&card->lock); - return; + return IRQ_HANDLED; } /* build the skb_header */ @@ -147,7 +148,7 @@ spin_unlock(&card->lock); printk(KERN_ERR "TurboPAM(tpam_irq): " "waiting too long...\n"); - return; + return IRQ_HANDLED; } } while (hpic & 0x00000002); @@ -169,7 +170,7 @@ skb_queue_tail(&card->recvq, skb); schedule_work(&card->recv_tq); } - return; + return IRQ_HANDLED; } else { /* it is a ack from the board */ @@ -185,10 +186,8 @@ /* schedule the send queue for execution */ schedule_work(&card->send_tq); - return; } - - /* not reached */ + return IRQ_HANDLED; } /* diff -urN linux-2.5.68-bk1/drivers/media/common/saa7146_core.c linux-2.5.68-bk2/drivers/media/common/saa7146_core.c --- linux-2.5.68-bk1/drivers/media/common/saa7146_core.c 2003-04-19 19:50:30.000000000 -0700 +++ linux-2.5.68-bk2/drivers/media/common/saa7146_core.c 2003-04-21 15:53:39.000000000 -0700 @@ -192,7 +192,7 @@ /********************************************************************************/ /* interrupt handler */ -static void interrupt_hw(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t interrupt_hw(int irq, void *dev_id, struct pt_regs *regs) { struct saa7146_dev *dev = (struct saa7146_dev*)dev_id; u32 isr = 0; @@ -203,7 +203,7 @@ /* is this our interrupt? */ if ( 0 == isr ) { /* nope, some other device */ - return; + return IRQ_NONE; } saa7146_write(dev, ISR, isr); @@ -254,6 +254,7 @@ ERR(("disabling interrupt source(s)!\n")); IER_DISABLE(dev,isr); } + return IRQ_HANDLED; } /*********************************************************************************/ diff -urN linux-2.5.68-bk1/drivers/media/video/stradis.c linux-2.5.68-bk2/drivers/media/video/stradis.c --- linux-2.5.68-bk1/drivers/media/video/stradis.c 2003-04-19 19:50:48.000000000 -0700 +++ linux-2.5.68-bk2/drivers/media/video/stradis.c 2003-04-21 15:53:39.000000000 -0700 @@ -442,11 +442,12 @@ } } -static void saa7146_irq(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t saa7146_irq(int irq, void *dev_id, struct pt_regs *regs) { struct saa7146 *saa = (struct saa7146 *) dev_id; u32 stat, astat; int count; + int handled = 0; count = 0; while (1) { @@ -454,7 +455,8 @@ stat = saaread(SAA7146_ISR); astat = stat & saaread(SAA7146_IER); if (!astat) - return; + break; + handled = 1; saawrite(astat, SAA7146_ISR); if (astat & SAA7146_PSR_DEBI_S) { do_irq_send_data(saa); @@ -611,6 +613,7 @@ "stradis%d: IRQ loop cleared\n", saa->nr); } } + return IRQ_RETVAL(handled); } static int ibm_send_command(struct saa7146 *saa, diff -urN linux-2.5.68-bk1/drivers/message/fusion/mptbase.c linux-2.5.68-bk2/drivers/message/fusion/mptbase.c --- linux-2.5.68-bk1/drivers/message/fusion/mptbase.c 2003-04-19 19:48:55.000000000 -0700 +++ linux-2.5.68-bk2/drivers/message/fusion/mptbase.c 2003-04-21 15:53:39.000000000 -0700 @@ -179,7 +179,7 @@ /* * Forward protos... */ -static void mpt_interrupt(int irq, void *bus_id, struct pt_regs *r); +static irqreturn_t mpt_interrupt(int irq, void *bus_id, struct pt_regs *r); static int mpt_base_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req, MPT_FRAME_HDR *reply); static int mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag); @@ -312,7 +312,7 @@ * dispatches (calls) a protocol-specific callback routine to handle * the protocol-specific details of the MPT request completion. */ -static void +static irqreturn_t mpt_interrupt(int irq, void *bus_id, struct pt_regs *r) { MPT_ADAPTER *ioc; @@ -338,7 +338,7 @@ if (!iocCmp) { printk(KERN_WARNING "mpt_interrupt: Invalid ioc!\n"); - return; + return IRQ_NONE; } } @@ -353,7 +353,7 @@ while (1) { if ((pa = CHIPREG_READ32(&ioc->chip->ReplyFifo)) == 0xFFFFFFFF) - return; + return IRQ_HANDLED; cb_idx = 0; freeme = 0; @@ -501,10 +501,12 @@ dirqprintk((MYIOC_s_INFO_FMT "ISR processed %d replies.", ioc->name, count)); dirqprintk((" Giving this ISR a break!\n")); - return; + return IRQ_HANDLED; } } /* drain reply FIFO */ + + return IRQ_HANDLED; } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ diff -urN linux-2.5.68-bk1/drivers/net/3c501.c linux-2.5.68-bk2/drivers/net/3c501.c --- linux-2.5.68-bk1/drivers/net/3c501.c 2003-04-19 19:48:48.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/3c501.c 2003-04-21 15:53:39.000000000 -0700 @@ -510,7 +510,7 @@ * TCP window. */ -static void el_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t el_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = dev_id; struct net_local *lp; @@ -558,7 +558,7 @@ } lp->loading=2; /* Force a reload */ spin_unlock(&lp->lock); - return; + goto out; } if (el_debug > 6) @@ -606,7 +606,7 @@ outb(AX_XMIT, AX_CMD); lp->stats.collisions++; spin_unlock(&lp->lock); - return; + goto out; } else { @@ -675,7 +675,8 @@ inb(RX_STATUS); /* Be certain that interrupts are cleared. */ inb(TX_STATUS); spin_unlock(&lp->lock); - return; +out: + return IRQ_HANDLED; } diff -urN linux-2.5.68-bk1/drivers/net/3c501.h linux-2.5.68-bk2/drivers/net/3c501.h --- linux-2.5.68-bk1/drivers/net/3c501.h 2003-04-19 19:49:10.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/3c501.h 2003-04-21 15:53:39.000000000 -0700 @@ -8,7 +8,7 @@ static int el_open(struct net_device *dev); static void el_timeout(struct net_device *dev); static int el_start_xmit(struct sk_buff *skb, struct net_device *dev); -static void el_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t el_interrupt(int irq, void *dev_id, struct pt_regs *regs); static void el_receive(struct net_device *dev); static void el_reset(struct net_device *dev); static int el1_close(struct net_device *dev); diff -urN linux-2.5.68-bk1/drivers/net/3c505.c linux-2.5.68-bk2/drivers/net/3c505.c --- linux-2.5.68-bk1/drivers/net/3c505.c 2003-04-19 19:51:19.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/3c505.c 2003-04-21 15:53:39.000000000 -0700 @@ -259,7 +259,7 @@ static inline int get_status(unsigned int base_addr) { - int timeout = jiffies + 10*HZ/100; + unsigned long timeout = jiffies + 10*HZ/100; register int stat1; do { stat1 = inb_status(base_addr); @@ -283,7 +283,7 @@ inline static void adapter_reset(struct net_device *dev) { - int timeout; + unsigned long timeout; elp_device *adapter = dev->priv; unsigned char orig_hcr = adapter->hcr_val; @@ -343,7 +343,7 @@ /* Primitive functions used by send_pcb() */ static inline unsigned int send_pcb_slow(unsigned int base_addr, unsigned char byte) { - unsigned int timeout; + unsigned long timeout; outb_command(byte, base_addr); for (timeout = jiffies + 5*HZ/100; time_before(jiffies, timeout);) { if (inb_status(base_addr) & HCRE) @@ -402,7 +402,7 @@ static int send_pcb(struct net_device *dev, pcb_struct * pcb) { int i; - int timeout; + unsigned long timeout; elp_device *adapter = dev->priv; unsigned long flags; @@ -488,7 +488,7 @@ int i, j; int total_length; int stat; - int timeout; + unsigned long timeout; unsigned long flags; elp_device *adapter = dev->priv; @@ -662,14 +662,14 @@ * ******************************************************/ -static void elp_interrupt(int irq, void *dev_id, struct pt_regs *reg_ptr) +static irqreturn_t elp_interrupt(int irq, void *dev_id, struct pt_regs *reg_ptr) { int len; int dlen; int icount = 0; struct net_device *dev; elp_device *adapter; - int timeout; + unsigned long timeout; dev = dev_id; adapter = (elp_device *) dev->priv; @@ -855,6 +855,7 @@ * indicate no longer in interrupt routine */ spin_unlock(&adapter->lock); + return IRQ_HANDLED; } @@ -947,7 +948,7 @@ if (!send_pcb(dev, &adapter->tx_pcb)) printk("%s: couldn't send memory configuration command\n", dev->name); else { - int timeout = jiffies + TIMEOUT; + unsigned long timeout = jiffies + TIMEOUT; while (adapter->got[CMD_CONFIGURE_ADAPTER_MEMORY] == 0 && time_before(jiffies, timeout)); if (time_after_eq(jiffies, timeout)) TIMEOUT_MSG(__LINE__); @@ -966,7 +967,7 @@ if (!send_pcb(dev, &adapter->tx_pcb)) printk("%s: couldn't send 82586 configure command\n", dev->name); else { - int timeout = jiffies + TIMEOUT; + unsigned long timeout = jiffies + TIMEOUT; while (adapter->got[CMD_CONFIGURE_82586] == 0 && time_before(jiffies, timeout)); if (time_after_eq(jiffies, timeout)) TIMEOUT_MSG(__LINE__); @@ -1150,7 +1151,7 @@ if (!send_pcb(dev, &adapter->tx_pcb)) printk("%s: couldn't send get statistics command\n", dev->name); else { - int timeout = jiffies + TIMEOUT; + unsigned long timeout = jiffies + TIMEOUT; while (adapter->got[CMD_NETWORK_STATISTICS] == 0 && time_before(jiffies, timeout)); if (time_after_eq(jiffies, timeout)) { TIMEOUT_MSG(__LINE__); @@ -1317,7 +1318,7 @@ if (!send_pcb(dev, &adapter->tx_pcb)) printk("%s: couldn't send set_multicast command\n", dev->name); else { - int timeout = jiffies + TIMEOUT; + unsigned long timeout = jiffies + TIMEOUT; while (adapter->got[CMD_LOAD_MULTICAST_LIST] == 0 && time_before(jiffies, timeout)); if (time_after_eq(jiffies, timeout)) { TIMEOUT_MSG(__LINE__); @@ -1344,7 +1345,7 @@ printk("%s: couldn't send 82586 configure command\n", dev->name); } else { - int timeout = jiffies + TIMEOUT; + unsigned long timeout = jiffies + TIMEOUT; spin_unlock_irqrestore(&adapter->lock, flags); while (adapter->got[CMD_CONFIGURE_82586] == 0 && time_before(jiffies, timeout)); if (time_after_eq(jiffies, timeout)) @@ -1396,10 +1397,8 @@ static int __init elp_sense(struct net_device *dev) { - int timeout; int addr = dev->base_addr; const char *name = dev->name; - unsigned long flags; byte orig_HSR; if (!request_region(addr, ELP_IO_EXTENT, "3c505")) @@ -1506,7 +1505,8 @@ int __init elplus_probe(struct net_device *dev) { elp_device *adapter; - int i, tries, tries1, timeout, okay; + int i, tries, tries1, okay; + unsigned long timeout; unsigned long cookie = 0; SET_MODULE_OWNER(dev); diff -urN linux-2.5.68-bk1/drivers/net/3c505.h linux-2.5.68-bk2/drivers/net/3c505.h --- linux-2.5.68-bk1/drivers/net/3c505.h 2003-04-19 19:50:30.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/3c505.h 2003-04-21 15:53:39.000000000 -0700 @@ -279,7 +279,7 @@ unsigned int length; struct sk_buff *skb; void *target; - long int start_time; + unsigned long start_time; } current_dma; /* flags */ diff -urN linux-2.5.68-bk1/drivers/net/3c507.c linux-2.5.68-bk2/drivers/net/3c507.c --- linux-2.5.68-bk1/drivers/net/3c507.c 2003-04-19 19:50:35.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/3c507.c 2003-04-21 15:53:39.000000000 -0700 @@ -291,7 +291,7 @@ static int el16_probe1(struct net_device *dev, int ioaddr); static int el16_open(struct net_device *dev); static int el16_send_packet(struct sk_buff *skb, struct net_device *dev); -static void el16_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t el16_interrupt(int irq, void *dev_id, struct pt_regs *regs); static void el16_rx(struct net_device *dev); static int el16_close(struct net_device *dev); static struct net_device_stats *el16_get_stats(struct net_device *dev); @@ -516,7 +516,7 @@ /* The typical workload of the driver: Handle the network interface interrupts. */ -static void el16_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t el16_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = dev_id; struct net_local *lp; @@ -526,7 +526,7 @@ if (dev == NULL) { printk ("net_interrupt(): irq %d for unknown device.\n", irq); - return; + return IRQ_NONE; } ioaddr = dev->base_addr; @@ -616,6 +616,7 @@ /* Enable the 82586's interrupt input. */ outb(0x84, ioaddr + MISC_CTRL); spin_unlock(&lp->lock); + return IRQ_HANDLED; } static int el16_close(struct net_device *dev) diff -urN linux-2.5.68-bk1/drivers/net/3c509.c linux-2.5.68-bk2/drivers/net/3c509.c --- linux-2.5.68-bk1/drivers/net/3c509.c 2003-04-19 19:48:49.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/3c509.c 2003-04-21 15:53:39.000000000 -0700 @@ -192,7 +192,7 @@ static ushort read_eeprom(int ioaddr, int index); static int el3_open(struct net_device *dev); static int el3_start_xmit(struct sk_buff *skb, struct net_device *dev); -static void el3_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t el3_interrupt(int irq, void *dev_id, struct pt_regs *regs); static void update_stats(struct net_device *dev); static struct net_device_stats *el3_get_stats(struct net_device *dev); static int el3_rx(struct net_device *dev); @@ -882,7 +882,7 @@ } /* The EL3 interrupt handler. */ -static void +static irqreturn_t el3_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = (struct net_device *)dev_id; @@ -892,7 +892,7 @@ if (dev == NULL) { printk ("el3_interrupt(): irq %d for unknown device.\n", irq); - return; + return IRQ_NONE; } lp = (struct el3_private *)dev->priv; @@ -967,7 +967,7 @@ inw(ioaddr + EL3_STATUS)); } spin_unlock(&lp->lock); - return; + return IRQ_HANDLED; } diff -urN linux-2.5.68-bk1/drivers/net/3c515.c linux-2.5.68-bk2/drivers/net/3c515.c --- linux-2.5.68-bk1/drivers/net/3c515.c 2003-04-19 19:48:52.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/3c515.c 2003-04-21 15:53:39.000000000 -0700 @@ -1,4 +1,3 @@ - /* Written 1997-1998 by Donald Becker. @@ -387,7 +386,7 @@ static int corkscrew_rx(struct net_device *dev); static void corkscrew_timeout(struct net_device *dev); static int boomerang_rx(struct net_device *dev); -static void corkscrew_interrupt(int irq, void *dev_id, +static irqreturn_t corkscrew_interrupt(int irq, void *dev_id, struct pt_regs *regs); static int corkscrew_close(struct net_device *dev); static void update_stats(int addr, struct net_device *dev); @@ -1150,7 +1149,7 @@ /* The interrupt handler does all of the Rx thread work and cleans up after the Tx thread. */ -static void corkscrew_interrupt(int irq, void *dev_id, +static irqreturn_t corkscrew_interrupt(int irq, void *dev_id, struct pt_regs *regs) { /* Use the now-standard shared IRQ implementation. */ @@ -1289,6 +1288,7 @@ if (corkscrew_debug > 4) printk("%s: exiting interrupt, status %4.4x.\n", dev->name, status); + return IRQ_HANDLED; } static int corkscrew_rx(struct net_device *dev) diff -urN linux-2.5.68-bk1/drivers/net/3c59x.c linux-2.5.68-bk2/drivers/net/3c59x.c --- linux-2.5.68-bk1/drivers/net/3c59x.c 2003-04-19 19:48:46.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/3c59x.c 2003-04-21 15:53:39.000000000 -0700 @@ -885,8 +885,8 @@ static int boomerang_start_xmit(struct sk_buff *skb, struct net_device *dev); static int vortex_rx(struct net_device *dev); static int boomerang_rx(struct net_device *dev); -static void vortex_interrupt(int irq, void *dev_id, struct pt_regs *regs); -static void boomerang_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t vortex_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t boomerang_interrupt(int irq, void *dev_id, struct pt_regs *regs); static int vortex_close(struct net_device *dev); static void dump_tx_ring(struct net_device *dev); static void update_stats(long ioaddr, struct net_device *dev); @@ -2208,14 +2208,16 @@ * full_bus_master_tx == 0 && full_bus_master_rx == 0 */ -static void vortex_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t +vortex_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = dev_id; struct vortex_private *vp = (struct vortex_private *)dev->priv; long ioaddr; int status; int work_done = max_interrupt_work; - + int handled = 0; + ioaddr = dev->base_addr; spin_lock(&vp->lock); @@ -2226,6 +2228,7 @@ if ((status & IntLatch) == 0) goto handler_exit; /* No interrupt: shared IRQs cause this */ + handled = 1; if (status & IntReq) { status |= vp->deferred; @@ -2302,6 +2305,7 @@ dev->name, status); handler_exit: spin_unlock(&vp->lock); + return IRQ_RETVAL(handled); } /* @@ -2309,13 +2313,15 @@ * full_bus_master_tx == 1 && full_bus_master_rx == 1 */ -static void boomerang_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t +boomerang_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = dev_id; struct vortex_private *vp = (struct vortex_private *)dev->priv; long ioaddr; int status; int work_done = max_interrupt_work; + int handled; ioaddr = dev->base_addr; @@ -2330,14 +2336,18 @@ if (vortex_debug > 6) printk(KERN_DEBUG "boomerang_interrupt. status=0x%4x\n", status); - if ((status & IntLatch) == 0) + if ((status & IntLatch) == 0) { + handled = 0; goto handler_exit; /* No interrupt: shared IRQs can cause this */ + } if (status == 0xffff) { /* h/w no longer present (hotplug)? */ if (vortex_debug > 1) printk(KERN_DEBUG "boomerang_interrupt(1): status = 0xffff\n"); + handled = 0; goto handler_exit; } + handled = 1; if (status & IntReq) { status |= vp->deferred; @@ -2432,6 +2442,7 @@ dev->name, status); handler_exit: spin_unlock(&vp->lock); + return IRQ_RETVAL(handled); } static int vortex_rx(struct net_device *dev) diff -urN linux-2.5.68-bk1/drivers/net/8139cp.c linux-2.5.68-bk2/drivers/net/8139cp.c --- linux-2.5.68-bk1/drivers/net/8139cp.c 2003-04-19 19:49:26.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/8139cp.c 2003-04-21 15:53:39.000000000 -0700 @@ -658,7 +658,8 @@ cp->rx_tail = rx_tail; } -static void cp_interrupt (int irq, void *dev_instance, struct pt_regs *regs) +static irqreturn_t +cp_interrupt (int irq, void *dev_instance, struct pt_regs *regs) { struct net_device *dev = dev_instance; struct cp_private *cp = dev->priv; @@ -666,7 +667,7 @@ status = cpr16(IntrStatus); if (!status || (status == 0xFFFF)) - return; + return IRQ_NONE; if (netif_msg_intr(cp)) printk(KERN_DEBUG "%s: intr, status %04x cmd %02x cpcmd %04x\n", @@ -693,6 +694,7 @@ } spin_unlock(&cp->lock); + return IRQ_HANDLED; } static void cp_tx (struct cp_private *cp) diff -urN linux-2.5.68-bk1/drivers/net/8139too.c linux-2.5.68-bk2/drivers/net/8139too.c --- linux-2.5.68-bk1/drivers/net/8139too.c 2003-04-19 19:48:46.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/8139too.c 2003-04-21 15:53:39.000000000 -0700 @@ -615,7 +615,7 @@ static void rtl8139_init_ring (struct net_device *dev); static int rtl8139_start_xmit (struct sk_buff *skb, struct net_device *dev); -static void rtl8139_interrupt (int irq, void *dev_instance, +static irqreturn_t rtl8139_interrupt (int irq, void *dev_instance, struct pt_regs *regs); static int rtl8139_close (struct net_device *dev); static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd); @@ -2029,7 +2029,7 @@ /* The interrupt handler does all of the Rx thread work and cleans up after the Tx thread. */ -static void rtl8139_interrupt (int irq, void *dev_instance, +static irqreturn_t rtl8139_interrupt (int irq, void *dev_instance, struct pt_regs *regs) { struct net_device *dev = (struct net_device *) dev_instance; @@ -2038,6 +2038,7 @@ void *ioaddr = tp->mmio_addr; int ackstat, status; int link_changed = 0; /* avoid bogus "uninit" warning */ + int handled = 0; spin_lock (&tp->lock); @@ -2053,6 +2054,8 @@ RxFIFOOver | TxErr | TxOK | RxErr | RxOK)) == 0) break; + handled = 1; + /* Acknowledge all of the current interrupt sources ASAP, but an first get an additional status bit from CSCR. */ if (status & RxUnderrun) @@ -2097,6 +2100,7 @@ DPRINTK ("%s: exiting interrupt, intr_status=%#4.4x.\n", dev->name, RTL_R16 (IntrStatus)); + return IRQ_RETVAL(handled); } diff -urN linux-2.5.68-bk1/drivers/net/82596.c linux-2.5.68-bk2/drivers/net/82596.c --- linux-2.5.68-bk1/drivers/net/82596.c 2003-04-19 19:50:29.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/82596.c 2003-04-21 15:53:39.000000000 -0700 @@ -357,7 +357,7 @@ static int i596_open(struct net_device *dev); static int i596_start_xmit(struct sk_buff *skb, struct net_device *dev); -static void i596_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t i596_interrupt(int irq, void *dev_id, struct pt_regs *regs); static int i596_close(struct net_device *dev); static struct net_device_stats *i596_get_stats(struct net_device *dev); static void i596_add_cmd(struct net_device *dev, struct i596_cmd *cmd); @@ -1018,8 +1018,6 @@ netif_start_queue(dev); - MOD_INC_USE_COUNT; - /* Initialize the 82596 memory */ if (init_i596_mem(dev)) { res = -EAGAIN; @@ -1218,6 +1216,7 @@ DEB(DEB_PROBE,printk(KERN_INFO "%s", version)); /* The 82596-specific entries in the device structure. */ + SET_MODULE_OWNER(dev); dev->open = i596_open; dev->stop = i596_close; dev->hard_start_xmit = i596_start_xmit; @@ -1247,24 +1246,25 @@ return 0; } -static void i596_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t i596_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = dev_id; struct i596_private *lp; short ioaddr; unsigned short status, ack_cmd = 0; + int handled = 0; #ifdef ENABLE_BVME6000_NET if (MACH_IS_BVME6000) { if (*(char *) BVME_LOCAL_IRQ_STAT & BVME_ETHERR) { i596_error(irq, dev_id, regs); - return; + return IRQ_HANDLED; } } #endif if (dev == NULL) { printk(KERN_ERR "i596_interrupt(): irq %d for unknown device.\n", irq); - return; + return IRQ_NONE; } ioaddr = dev->base_addr; @@ -1283,6 +1283,7 @@ if ((status & 0x8000) || (status & 0x2000)) { struct i596_cmd *ptr; + handled = 1; if ((status & 0x8000)) DEB(DEB_INTS,printk(KERN_DEBUG "%s: i596 interrupt completed command.\n", dev->name)); if ((status & 0x2000)) @@ -1405,7 +1406,7 @@ DEB(DEB_INTS,printk(KERN_DEBUG "%s: exiting interrupt.\n", dev->name)); spin_unlock (&lp->lock); - return; + return IRQ_RETVAL(handled); } static int i596_close(struct net_device *dev) @@ -1450,7 +1451,6 @@ free_irq(dev->irq, dev); remove_rx_bufs(dev); - MOD_DEC_USE_COUNT; return 0; } diff -urN linux-2.5.68-bk1/drivers/net/8390.c linux-2.5.68-bk2/drivers/net/8390.c --- linux-2.5.68-bk1/drivers/net/8390.c 2003-04-19 19:48:51.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/8390.c 2003-04-21 15:53:39.000000000 -0700 @@ -421,7 +421,7 @@ * needed. */ -void ei_interrupt(int irq, void *dev_id, struct pt_regs * regs) +irqreturn_t ei_interrupt(int irq, void *dev_id, struct pt_regs * regs) { struct net_device *dev = dev_id; long e8390_base; @@ -431,7 +431,7 @@ if (dev == NULL) { printk ("net_interrupt(): irq %d for unknown device.\n", irq); - return; + return IRQ_NONE; } e8390_base = dev->base_addr; @@ -454,7 +454,7 @@ inb_p(e8390_base + EN0_IMR)); #endif spin_unlock(&ei_local->page_lock); - return; + return IRQ_NONE; } /* Change to page 0 and read the intr status reg. */ @@ -520,7 +520,7 @@ } } spin_unlock(&ei_local->page_lock); - return; + return IRQ_HANDLED; } /** diff -urN linux-2.5.68-bk1/drivers/net/8390.h linux-2.5.68-bk2/drivers/net/8390.h --- linux-2.5.68-bk1/drivers/net/8390.h 2003-04-19 19:50:29.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/8390.h 2003-04-21 15:53:39.000000000 -0700 @@ -43,7 +43,7 @@ extern void NS8390_init(struct net_device *dev, int startp); extern int ei_open(struct net_device *dev); extern int ei_close(struct net_device *dev); -extern void ei_interrupt(int irq, void *dev_id, struct pt_regs *regs); +extern irqreturn_t ei_interrupt(int irq, void *dev_id, struct pt_regs *regs); /* You have one of these per-board */ struct ei_device { diff -urN linux-2.5.68-bk1/drivers/net/amd8111e.c linux-2.5.68-bk2/drivers/net/amd8111e.c --- linux-2.5.68-bk1/drivers/net/amd8111e.c 2003-04-19 19:49:57.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/amd8111e.c 2003-04-21 15:53:39.000000000 -0700 @@ -780,16 +780,18 @@ /* This is device interrupt function. It handles transmit, receive and link change interrupts. */ -static void amd8111e_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t +amd8111e_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device * dev = (struct net_device *) dev_id; struct amd8111e_priv *lp = dev->priv; void * mmio = lp->mmio; unsigned int intr0; + int handled = 0; if(dev == NULL) - return; + return IRQ_NONE; spin_lock (&lp->lock); /* disabling interrupt */ @@ -802,7 +804,8 @@ if (!(intr0 & INTR)) goto err_no_interrupt; - + + handled = 1; /* Current driver processes 3 interrupts : RINT,TINT,LCINT */ writel(intr0, mmio + INT0); @@ -823,7 +826,7 @@ err_no_interrupt: writel( VAL0 | INTREN,mmio + CMD0); spin_unlock(&lp->lock); - return; + return IRQ_RETVAL(handled); } /* diff -urN linux-2.5.68-bk1/drivers/net/at1700.c linux-2.5.68-bk2/drivers/net/at1700.c --- linux-2.5.68-bk1/drivers/net/at1700.c 2003-04-19 19:49:10.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/at1700.c 2003-04-21 15:53:39.000000000 -0700 @@ -202,7 +202,7 @@ static int read_eeprom(long ioaddr, int location); static int net_open(struct net_device *dev); static int net_send_packet(struct sk_buff *skb, struct net_device *dev); -static void net_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t net_interrupt(int irq, void *dev_id, struct pt_regs *regs); static void net_rx(struct net_device *dev); static int net_close(struct net_device *dev); static struct net_device_stats *net_get_stats(struct net_device *dev); @@ -696,16 +696,17 @@ /* The typical workload of the driver: Handle the network interface interrupts. */ -static void +static irqreturn_t net_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = dev_id; struct net_local *lp; int ioaddr, status; + int handled = 0; if (dev == NULL) { printk ("at1700_interrupt(): irq %d for unknown device.\n", irq); - return; + return IRQ_NONE; } ioaddr = dev->base_addr; @@ -726,6 +727,7 @@ Tx interrupt. Thus we flag on rx_started, so that we prevent the interrupt routine (net_interrupt) to dive into net_rx again. */ + handled = 1; lp->rx_started = 1; outb(0x00, ioaddr + RX_INTR); /* Disable RX intr. */ net_rx(dev); @@ -733,6 +735,7 @@ lp->rx_started = 0; } if (status & 0x00ff) { + handled = 1; if (status & 0x02) { /* More than 16 collisions occurred */ if (net_debug > 4) @@ -760,7 +763,7 @@ } spin_unlock (&lp->lock); - return; + return IRQ_RETVAL(handled); } /* We have a good packet(s), get it/them out of the buffers. */ @@ -914,9 +917,11 @@ memset(mc_filter, 0, sizeof(mc_filter)); for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count; - i++, mclist = mclist->next) - set_bit(ether_crc_le(ETH_ALEN, mclist->dmi_addr) >> 26, - mc_filter); + i++, mclist = mclist->next) { + unsigned int bit = + ether_crc_le(ETH_ALEN, mclist->dmi_addr) >> 26; + mc_filter[bit >> 3] |= (1 << bit); + } outb(0x02, ioaddr + RX_MODE); /* Use normal mode. */ } diff -urN linux-2.5.68-bk1/drivers/net/atp.c linux-2.5.68-bk2/drivers/net/atp.c --- linux-2.5.68-bk1/drivers/net/atp.c 2003-04-19 19:51:16.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/atp.c 2003-04-21 15:53:39.000000000 -0700 @@ -203,7 +203,7 @@ static void write_packet(long ioaddr, int length, unsigned char *packet, int pad, int mode); static void trigger_send(long ioaddr, int length); static int atp_send_packet(struct sk_buff *skb, struct net_device *dev); -static void atp_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t atp_interrupt(int irq, void *dev_id, struct pt_regs *regs); static void net_rx(struct net_device *dev); static void read_block(long ioaddr, int length, unsigned char *buffer, int data_mode); static int net_close(struct net_device *dev); @@ -560,7 +560,7 @@ struct net_local *lp = (struct net_local *)dev->priv; long ioaddr = dev->base_addr; int length; - long flags; + unsigned long flags; length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN; @@ -596,17 +596,19 @@ /* The typical workload of the driver: Handle the network interface interrupts. */ -static void atp_interrupt(int irq, void *dev_instance, struct pt_regs * regs) +static irqreturn_t +atp_interrupt(int irq, void *dev_instance, struct pt_regs * regs) { struct net_device *dev = (struct net_device *)dev_instance; struct net_local *lp; long ioaddr; static int num_tx_since_rx; int boguscount = max_interrupt_work; + int handled = 0; if (dev == NULL) { printk(KERN_ERR "ATP_interrupt(): irq %d for unknown device.\n", irq); - return; + return IRQ_NONE; } ioaddr = dev->base_addr; lp = (struct net_local *)dev->priv; @@ -626,6 +628,7 @@ if (net_debug > 5) printk("loop status %02x..", status); if (status & (ISR_RxOK<<3)) { + handled = 1; write_reg(ioaddr, ISR, ISR_RxOK); /* Clear the Rx interrupt. */ do { int read_status = read_nibble(ioaddr, CMR1); @@ -648,6 +651,7 @@ break; } while (--boguscount > 0); } else if (status & ((ISR_TxErr + ISR_TxOK)<<3)) { + handled = 1; if (net_debug > 6) printk("handling Tx done.."); /* Clear the Tx interrupt. We should check for too many failures and reinitialize the adapter. */ @@ -712,7 +716,7 @@ spin_unlock(&lp->lock); if (net_debug > 5) printk("exiting interrupt.\n"); - return; + return IRQ_RETVAL(handled); } #ifdef TIMED_CHECKER diff -urN linux-2.5.68-bk1/drivers/net/b44.c linux-2.5.68-bk2/drivers/net/b44.c --- linux-2.5.68-bk1/drivers/net/b44.c 2003-04-19 19:49:20.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/b44.c 2003-04-21 15:53:39.000000000 -0700 @@ -799,12 +799,13 @@ return (done ? 0 : 1); } -static void b44_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t b44_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = dev_id; struct b44 *bp = dev->priv; unsigned long flags; u32 istat, imask; + int handled = 0; spin_lock_irqsave(&bp->lock, flags); @@ -816,6 +817,7 @@ */ istat &= imask; if (istat) { + handled = 1; if (netif_rx_schedule_prep(dev)) { /* NOTE: These writes are posted by the readback of * the ISTAT register below. @@ -832,6 +834,7 @@ br32(B44_ISTAT); } spin_unlock_irqrestore(&bp->lock, flags); + return IRQ_RETVAL(handled); } static void b44_tx_timeout(struct net_device *dev) diff -urN linux-2.5.68-bk1/drivers/net/cs89x0.c linux-2.5.68-bk2/drivers/net/cs89x0.c --- linux-2.5.68-bk1/drivers/net/cs89x0.c 2003-04-19 19:50:38.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/cs89x0.c 2003-04-21 15:53:39.000000000 -0700 @@ -218,7 +218,7 @@ static int cs89x0_probe1(struct net_device *dev, int ioaddr); static int net_open(struct net_device *dev); static int net_send_packet(struct sk_buff *skb, struct net_device *dev); -static void net_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t net_interrupt(int irq, void *dev_id, struct pt_regs *regs); static void set_multicast_list(struct net_device *dev); static void net_timeout(struct net_device *dev); static void net_rx(struct net_device *dev); @@ -1401,12 +1401,13 @@ /* The typical workload of the driver: Handle the network interface interrupts. */ -static void net_interrupt(int irq, void *dev_id, struct pt_regs * regs) +static irqreturn_t net_interrupt(int irq, void *dev_id, struct pt_regs * regs) { struct net_device *dev = dev_id; struct net_local *lp; int ioaddr, status; - + int handled = 0; + ioaddr = dev->base_addr; lp = (struct net_local *)dev->priv; @@ -1419,6 +1420,7 @@ vista, baby! */ while ((status = readword(dev, ISQ_PORT))) { if (net_debug > 4)printk("%s: event=%04x\n", dev->name, status); + handled = 1; switch(status & ISQ_EVENT_MASK) { case ISQ_RECEIVER_EVENT: /* Got a packet(s). */ @@ -1485,6 +1487,7 @@ break; } } + return IRQ_RETVAL(handled); } static void diff -urN linux-2.5.68-bk1/drivers/net/de600.c linux-2.5.68-bk2/drivers/net/de600.c --- linux-2.5.68-bk1/drivers/net/de600.c 2003-04-19 19:51:12.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/de600.c 2003-04-21 15:53:39.000000000 -0700 @@ -258,7 +258,7 @@ * Handle the network interface interrupts. */ -static void de600_interrupt(int irq, void *dev_id, struct pt_regs * regs) +static irqreturn_t de600_interrupt(int irq, void *dev_id, struct pt_regs * regs) { struct net_device *dev = dev_id; u8 irq_status; @@ -268,7 +268,7 @@ /* This might just as well be deleted now, no crummy drivers present :-) */ if ((dev == NULL) || (DE600_IRQ != irq)) { printk(KERN_ERR "%s: bogus interrupt %d\n", dev?dev->name:"DE-600", irq); - return; + return IRQ_NONE; } spin_lock(&de600_lock); @@ -303,7 +303,7 @@ if (retrig) trigger_interrupt(dev); spin_unlock(&de600_lock); - return; + return IRQ_HANDLED; } static int de600_tx_intr(struct net_device *dev, int irq_status) diff -urN linux-2.5.68-bk1/drivers/net/de600.h linux-2.5.68-bk2/drivers/net/de600.h --- linux-2.5.68-bk1/drivers/net/de600.h 2003-04-19 19:50:01.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/de600.h 2003-04-21 15:53:39.000000000 -0700 @@ -125,7 +125,7 @@ static int de600_start_xmit(struct sk_buff *skb, struct net_device *dev); /* Dispatch from interrupts. */ -static void de600_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t de600_interrupt(int irq, void *dev_id, struct pt_regs *regs); static int de600_tx_intr(struct net_device *dev, int irq_status); static void de600_rx_intr(struct net_device *dev); diff -urN linux-2.5.68-bk1/drivers/net/de620.c linux-2.5.68-bk2/drivers/net/de620.c --- linux-2.5.68-bk1/drivers/net/de620.c 2003-04-19 19:49:51.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/de620.c 2003-04-21 15:53:39.000000000 -0700 @@ -221,7 +221,7 @@ static int de620_start_xmit(struct sk_buff *, struct net_device *); /* Dispatch from interrupts. */ -static void de620_interrupt(int, void *, struct pt_regs *); +static irqreturn_t de620_interrupt(int, void *, struct pt_regs *); static int de620_rx_intr(struct net_device *); /* Initialization */ @@ -591,7 +591,8 @@ * Handle the network interface interrupts. * */ -static void de620_interrupt(int irq_in, void *dev_id, struct pt_regs *regs) +static irqreturn_t +de620_interrupt(int irq_in, void *dev_id, struct pt_regs *regs) { struct net_device *dev = dev_id; byte irq_status; @@ -617,6 +618,7 @@ netif_wake_queue(dev); spin_unlock(&de620_lock); + return IRQ_HANDLED; } /************************************** diff -urN linux-2.5.68-bk1/drivers/net/depca.c linux-2.5.68-bk2/drivers/net/depca.c --- linux-2.5.68-bk1/drivers/net/depca.c 2003-04-19 19:49:34.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/depca.c 2003-04-21 15:53:39.000000000 -0700 @@ -430,7 +430,7 @@ */ static int depca_open(struct net_device *dev); static int depca_start_xmit(struct sk_buff *skb, struct net_device *dev); -static void depca_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t depca_interrupt(int irq, void *dev_id, struct pt_regs *regs); static int depca_close(struct net_device *dev); static int depca_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); static void depca_tx_timeout(struct net_device *dev); @@ -894,7 +894,7 @@ /* ** The DEPCA interrupt handler. */ -static void depca_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t depca_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = dev_id; struct depca_private *lp; @@ -903,7 +903,7 @@ if (dev == NULL) { printk("depca_interrupt(): irq %d for unknown device.\n", irq); - return; + return IRQ_NONE; } lp = (struct depca_private *) dev->priv; @@ -938,6 +938,7 @@ outb(nicsr, DEPCA_NICSR); spin_unlock(&lp->lock); + return IRQ_HANDLED; } /* Called with lp->lock held */ diff -urN linux-2.5.68-bk1/drivers/net/dgrs.c linux-2.5.68-bk2/drivers/net/dgrs.c --- linux-2.5.68-bk1/drivers/net/dgrs.c 2003-04-19 19:48:50.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/dgrs.c 2003-04-21 15:53:39.000000000 -0700 @@ -888,7 +888,7 @@ * dev, priv will always refer to the 0th device in Multi-NIC mode. */ -static void dgrs_intr(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t dgrs_intr(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev0 = (struct net_device *) dev_id; DGRS_PRIV *priv0 = (DGRS_PRIV *) dev0->priv; @@ -971,6 +971,8 @@ ack_intr: if (priv0->plxreg) OUTL(dev0->base_addr + PLX_LCL2PCI_DOORBELL, 1); + + return IRQ_HANDLED; } /* diff -urN linux-2.5.68-bk1/drivers/net/dl2k.c linux-2.5.68-bk2/drivers/net/dl2k.c --- linux-2.5.68-bk1/drivers/net/dl2k.c 2003-04-19 19:49:16.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/dl2k.c 2003-04-21 15:53:39.000000000 -0700 @@ -98,7 +98,7 @@ static void rio_tx_timeout (struct net_device *dev); static void alloc_list (struct net_device *dev); static int start_xmit (struct sk_buff *skb, struct net_device *dev); -static void rio_interrupt (int irq, void *dev_instance, struct pt_regs *regs); +static irqreturn_t rio_interrupt (int irq, void *dev_instance, struct pt_regs *regs); static void rio_free_tx (struct net_device *dev, int irq); static void tx_error (struct net_device *dev, int tx_status); static int receive_packet (struct net_device *dev); @@ -699,7 +699,7 @@ return 0; } -static void +static irqreturn_t rio_interrupt (int irq, void *dev_instance, struct pt_regs *rgs) { struct net_device *dev = dev_instance; @@ -707,6 +707,7 @@ unsigned int_status; long ioaddr; int cnt = max_intrloop; + int handled = 0; ioaddr = dev->base_addr; np = dev->priv; @@ -716,6 +717,7 @@ int_status &= DEFAULT_INTR; if (int_status == 0 || --cnt < 0) break; + handled = 1; /* Processing received packets */ if (int_status & RxDMAComplete) receive_packet (dev); @@ -736,6 +738,7 @@ } if (np->cur_tx != np->old_tx) writel (100, ioaddr + CountDown); + return IRQ_RETVAL(handled); } static void @@ -744,7 +747,7 @@ struct netdev_private *np = (struct netdev_private *) dev->priv; int entry = np->old_tx % TX_RING_SIZE; int tx_use = 0; - long flag = 0; + unsigned long flag = 0; if (irq) spin_lock(&np->tx_lock); diff -urN linux-2.5.68-bk1/drivers/net/e1000/e1000_main.c linux-2.5.68-bk2/drivers/net/e1000/e1000_main.c --- linux-2.5.68-bk1/drivers/net/e1000/e1000_main.c 2003-04-19 19:49:10.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/e1000/e1000_main.c 2003-04-21 15:53:39.000000000 -0700 @@ -154,7 +154,7 @@ static void e1000_update_stats(struct e1000_adapter *adapter); static inline void e1000_irq_disable(struct e1000_adapter *adapter); static inline void e1000_irq_enable(struct e1000_adapter *adapter); -static void e1000_intr(int irq, void *data, struct pt_regs *regs); +static irqreturn_t e1000_intr(int irq, void *data, struct pt_regs *regs); #ifdef CONFIG_E1000_NAPI static int e1000_clean(struct net_device *netdev, int *budget); static boolean_t e1000_clean_rx_irq(struct e1000_adapter *adapter, @@ -1981,7 +1981,7 @@ * @pt_regs: CPU registers structure **/ -static void +static irqreturn_t e1000_intr(int irq, void *data, struct pt_regs *regs) { struct net_device *netdev = data; @@ -1992,7 +1992,7 @@ #endif if(!icr) - return; /* Not our interrupt */ + return IRQ_NONE; /* Not our interrupt */ if(icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) { adapter->hw.get_link_status = 1; @@ -2016,6 +2016,7 @@ !e1000_clean_tx_irq(adapter)) break; #endif + return IRQ_HANDLED; } #ifdef CONFIG_E1000_NAPI diff -urN linux-2.5.68-bk1/drivers/net/eepro.c linux-2.5.68-bk2/drivers/net/eepro.c --- linux-2.5.68-bk1/drivers/net/eepro.c 2003-04-19 19:50:33.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/eepro.c 2003-04-21 15:53:39.000000000 -0700 @@ -307,7 +307,7 @@ static int eepro_probe1(struct net_device *dev, short ioaddr); static int eepro_open(struct net_device *dev); static int eepro_send_packet(struct sk_buff *skb, struct net_device *dev); -static void eepro_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t eepro_interrupt(int irq, void *dev_id, struct pt_regs *regs); static void eepro_rx(struct net_device *dev); static void eepro_transmit_interrupt(struct net_device *dev); static int eepro_close(struct net_device *dev); @@ -1104,8 +1104,6 @@ /* enabling rx */ eepro_en_rx(ioaddr); - MOD_INC_USE_COUNT; - return 0; } @@ -1178,17 +1176,18 @@ /* The typical workload of the driver: Handle the network interface interrupts. */ -static void +static irqreturn_t eepro_interrupt(int irq, void *dev_id, struct pt_regs * regs) { struct net_device *dev = (struct net_device *)dev_id; /* (struct net_device *)(irq2dev_map[irq]);*/ struct eepro_local *lp; int ioaddr, status, boguscount = 20; + int handled = 0; if (dev == NULL) { printk (KERN_ERR "eepro_interrupt(): irq %d for unknown device.\\n", irq); - return; + return IRQ_NONE; } lp = (struct eepro_local *)dev->priv; @@ -1202,6 +1201,7 @@ while (((status = inb(ioaddr + STATUS_REG)) & (RX_INT|TX_INT)) && (boguscount--)) { + handled = 1; if (status & RX_INT) { if (net_debug > 4) printk(KERN_DEBUG "%s: packet received interrupt.\n", dev->name); @@ -1233,7 +1233,7 @@ printk(KERN_DEBUG "%s: exiting eepro_interrupt routine.\n", dev->name); spin_unlock(&lp->lock); - return; + return IRQ_RETVAL(handled); } static int eepro_close(struct net_device *dev) @@ -1275,8 +1275,6 @@ /* Update the statistics here. What statistics? */ - MOD_DEC_USE_COUNT; - return 0; } diff -urN linux-2.5.68-bk1/drivers/net/eepro100.c linux-2.5.68-bk2/drivers/net/eepro100.c --- linux-2.5.68-bk1/drivers/net/eepro100.c 2003-04-19 19:50:06.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/eepro100.c 2003-04-21 15:53:39.000000000 -0700 @@ -541,7 +541,7 @@ static void speedo_refill_rx_buffers(struct net_device *dev, int force); static int speedo_rx(struct net_device *dev); static void speedo_tx_buffer_gc(struct net_device *dev); -static void speedo_interrupt(int irq, void *dev_instance, struct pt_regs *regs); +static irqreturn_t speedo_interrupt(int irq, void *dev_instance, struct pt_regs *regs); static int speedo_close(struct net_device *dev); static struct net_device_stats *speedo_get_stats(struct net_device *dev); static int speedo_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); @@ -1560,12 +1560,13 @@ /* The interrupt handler does all of the Rx thread work and cleans up after the Tx thread. */ -static void speedo_interrupt(int irq, void *dev_instance, struct pt_regs *regs) +static irqreturn_t speedo_interrupt(int irq, void *dev_instance, struct pt_regs *regs) { struct net_device *dev = (struct net_device *)dev_instance; struct speedo_private *sp; long ioaddr, boguscnt = max_interrupt_work; unsigned short status; + unsigned int handled = 0; ioaddr = dev->base_addr; sp = (struct speedo_private *)dev->priv; @@ -1576,7 +1577,7 @@ printk(KERN_ERR"%s: SMP simultaneous entry of an interrupt handler.\n", dev->name); sp->in_interrupt = 0; /* Avoid halting machine. */ - return; + return IRQ_NONE; } #endif @@ -1593,6 +1594,7 @@ if ((status & 0xfc00) == 0) break; + handled = 1; if ((status & 0x5000) || /* Packet received, or Rx error. */ @@ -1654,7 +1656,7 @@ dev->name, inw(ioaddr + SCBStatus)); clear_bit(0, (void*)&sp->in_interrupt); - return; + return IRQ_RETVAL(handled); } static inline struct RxFD *speedo_rx_alloc(struct net_device *dev, int entry) diff -urN linux-2.5.68-bk1/drivers/net/eexpress.c linux-2.5.68-bk2/drivers/net/eexpress.c --- linux-2.5.68-bk1/drivers/net/eexpress.c 2003-04-19 19:48:46.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/eexpress.c 2003-04-21 15:53:39.000000000 -0700 @@ -252,7 +252,7 @@ static struct net_device_stats *eexp_stats(struct net_device *dev); static int eexp_xmit(struct sk_buff *buf, struct net_device *dev); -static void eexp_irq(int irq, void *dev_addr, struct pt_regs *regs); +static irqreturn_t eexp_irq(int irq, void *dev_addr, struct pt_regs *regs); static void eexp_set_multicast(struct net_device *dev); /* @@ -761,7 +761,7 @@ } } -static void eexp_irq(int irq, void *dev_info, struct pt_regs *regs) +static irqreturn_t eexp_irq(int irq, void *dev_info, struct pt_regs *regs) { struct net_device *dev = dev_info; struct net_local *lp; @@ -772,7 +772,7 @@ { printk(KERN_WARNING "eexpress: irq %d for unknown device\n", irq); - return; + return IRQ_NONE; } lp = (struct net_local *)dev->priv; @@ -860,7 +860,7 @@ outw(old_write_ptr, ioaddr+WRITE_PTR); spin_unlock(&lp->lock); - return; + return IRQ_HANDLED; } /* diff -urN linux-2.5.68-bk1/drivers/net/epic100.c linux-2.5.68-bk2/drivers/net/epic100.c --- linux-2.5.68-bk1/drivers/net/epic100.c 2003-04-19 19:49:25.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/epic100.c 2003-04-21 15:53:39.000000000 -0700 @@ -360,7 +360,7 @@ static void epic_init_ring(struct net_device *dev); static int epic_start_xmit(struct sk_buff *skb, struct net_device *dev); static int epic_rx(struct net_device *dev); -static void epic_interrupt(int irq, void *dev_instance, struct pt_regs *regs); +static irqreturn_t epic_interrupt(int irq, void *dev_instance, struct pt_regs *regs); static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); static int epic_close(struct net_device *dev); static struct net_device_stats *epic_get_stats(struct net_device *dev); @@ -973,7 +973,7 @@ struct epic_private *ep = dev->priv; int entry, free_count; u32 ctrl_word; - long flags; + unsigned long flags; if (skb->len < ETH_ZLEN) { skb = skb_padto(skb, ETH_ZLEN); @@ -1028,12 +1028,13 @@ /* The interrupt handler does all of the Rx thread work and cleans up after the Tx thread. */ -static void epic_interrupt(int irq, void *dev_instance, struct pt_regs *regs) +static irqreturn_t epic_interrupt(int irq, void *dev_instance, struct pt_regs *regs) { struct net_device *dev = dev_instance; struct epic_private *ep = dev->priv; long ioaddr = dev->base_addr; int status, boguscnt = max_interrupt_work; + unsigned int handled = 0; do { status = inl(ioaddr + INTSTAT); @@ -1047,6 +1048,7 @@ if ((status & IntrSummary) == 0) break; + handled = 1; if (status & (RxDone | RxStarted | RxEarlyWarn | RxOverflow)) epic_rx(dev); @@ -1156,7 +1158,7 @@ printk(KERN_DEBUG "%s: exiting interrupt, intr_status=%#4.4x.\n", dev->name, status); - return; + return IRQ_RETVAL(handled); } static int epic_rx(struct net_device *dev) @@ -1343,9 +1345,11 @@ memset(mc_filter, 0, sizeof(mc_filter)); for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count; - i++, mclist = mclist->next) - set_bit(ether_crc_le(ETH_ALEN, mclist->dmi_addr) & 0x3f, - mc_filter); + i++, mclist = mclist->next) { + unsigned int bit_nr = + ether_crc_le(ETH_ALEN, mclist->dmi_addr) & 0x3f; + mc_filter[bit_nr >> 3] |= (1 << bit_nr); + } } /* ToDo: perhaps we need to stop the Tx and Rx process here? */ if (memcmp(mc_filter, ep->mc_filter, sizeof(mc_filter))) { diff -urN linux-2.5.68-bk1/drivers/net/fealnx.c linux-2.5.68-bk2/drivers/net/fealnx.c --- linux-2.5.68-bk1/drivers/net/fealnx.c 2003-04-19 19:50:29.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/fealnx.c 2003-04-21 15:53:39.000000000 -0700 @@ -438,7 +438,7 @@ static void tx_timeout(struct net_device *dev); static void init_ring(struct net_device *dev); static int start_tx(struct sk_buff *skb, struct net_device *dev); -static void intr_handler(int irq, void *dev_instance, struct pt_regs *regs); +static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *regs); static int netdev_rx(struct net_device *dev); static void set_rx_mode(struct net_device *dev); static struct net_device_stats *get_stats(struct net_device *dev); @@ -1412,12 +1412,13 @@ /* The interrupt handler does all of the Rx thread work and cleans up after the Tx thread. */ -static void intr_handler(int irq, void *dev_instance, struct pt_regs *rgs) +static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *rgs) { struct net_device *dev = (struct net_device *) dev_instance; struct netdev_private *np = dev->priv; long ioaddr, boguscnt = max_interrupt_work; unsigned int num_tx = 0; + int handled = 0; writel(0, dev->base_addr + IMR); @@ -1437,6 +1438,8 @@ if (!(intr_status & np->imrvalue)) break; + handled = 1; + // 90/1/16 delete, // // if (intr_status & FBE) @@ -1559,7 +1562,7 @@ writel(np->imrvalue, ioaddr + IMR); - return; + return IRQ_RETVAL(handled); } @@ -1739,8 +1742,9 @@ memset(mc_filter, 0, sizeof(mc_filter)); for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count; i++, mclist = mclist->next) { - set_bit((ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26) ^ 0x3F, - mc_filter); + unsigned int bit; + bit = (ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26) ^ 0x3F; + mc_filter[bit >> 5] |= (1 << bit); } rx_mode = AB | AM; } diff -urN linux-2.5.68-bk1/drivers/net/hamachi.c linux-2.5.68-bk2/drivers/net/hamachi.c --- linux-2.5.68-bk1/drivers/net/hamachi.c 2003-04-19 19:51:17.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/hamachi.c 2003-04-21 15:53:39.000000000 -0700 @@ -558,7 +558,7 @@ static void hamachi_tx_timeout(struct net_device *dev); static void hamachi_init_ring(struct net_device *dev); static int hamachi_start_xmit(struct sk_buff *skb, struct net_device *dev); -static void hamachi_interrupt(int irq, void *dev_instance, struct pt_regs *regs); +static irqreturn_t hamachi_interrupt(int irq, void *dev_instance, struct pt_regs *regs); static inline int hamachi_rx(struct net_device *dev); static inline int hamachi_tx(struct net_device *dev); static void hamachi_error(struct net_device *dev, int intr_status); @@ -1367,16 +1367,17 @@ /* The interrupt handler does all of the Rx thread work and cleans up after the Tx thread. */ -static void hamachi_interrupt(int irq, void *dev_instance, struct pt_regs *rgs) +static irqreturn_t hamachi_interrupt(int irq, void *dev_instance, struct pt_regs *rgs) { struct net_device *dev = dev_instance; struct hamachi_private *hmp; long ioaddr, boguscnt = max_interrupt_work; + int handled = 0; #ifndef final_version /* Can never occur. */ if (dev == NULL) { printk (KERN_ERR "hamachi_interrupt(): irq %d for unknown device.\n", irq); - return; + return IRQ_NONE; } #endif @@ -1394,6 +1395,8 @@ if (intr_status == 0) break; + handled = 1; + if (intr_status & IntrRxDone) hamachi_rx(dev); @@ -1466,6 +1469,7 @@ #endif spin_unlock(&hmp->lock); + return IRQ_RETVAL(handled); } /* This routine is logically part of the interrupt handler, but separated diff -urN linux-2.5.68-bk1/drivers/net/hamradio/dmascc.c linux-2.5.68-bk2/drivers/net/hamradio/dmascc.c --- linux-2.5.68-bk1/drivers/net/hamradio/dmascc.c 2003-04-19 19:49:21.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/hamradio/dmascc.c 2003-04-21 15:53:39.000000000 -0700 @@ -674,7 +674,7 @@ if (reg) outb_p(reg, priv->scc_cmd); return inb_p(priv->scc_cmd); default: - spin_lock_irqsave(&priv->register_lock, flags); + spin_lock_irqsave(priv->register_lock, flags); outb_p(0, priv->card_base + PI_DREQ_MASK); if (reg) outb_p(reg, priv->scc_cmd); rc = inb_p(priv->scc_cmd); diff -urN linux-2.5.68-bk1/drivers/net/hp100.c linux-2.5.68-bk2/drivers/net/hp100.c --- linux-2.5.68-bk1/drivers/net/hp100.c 2003-04-19 19:49:10.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/hp100.c 2003-04-21 15:53:39.000000000 -0700 @@ -320,7 +320,7 @@ static void hp100_update_stats(struct net_device *dev); static void hp100_clear_stats(struct hp100_private *lp, int ioaddr); static void hp100_set_multicast_list(struct net_device *dev); -static void hp100_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t hp100_interrupt(int irq, void *dev_id, struct pt_regs *regs); static void hp100_start_interface(struct net_device *dev); static void hp100_stop_interface(struct net_device *dev); static void hp100_load_eeprom(struct net_device *dev, u_short ioaddr); @@ -2271,7 +2271,7 @@ * hardware interrupt handling */ -static void hp100_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t hp100_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = (struct net_device *) dev_id; struct hp100_private *lp = (struct hp100_private *) dev->priv; @@ -2280,7 +2280,7 @@ u_int val; if (dev == NULL) - return; + return IRQ_NONE; ioaddr = dev->base_addr; spin_lock(&lp->lock); @@ -2302,7 +2302,7 @@ if (val == 0) { /* might be a shared interrupt */ spin_unlock(&lp->lock); hp100_ints_on(); - return; + return IRQ_NONE; } /* We're only interested in those interrupts we really enabled. */ /* val &= hp100_inw( IRQ_MASK ); */ @@ -2394,6 +2394,7 @@ spin_unlock(&lp->lock); hp100_ints_on(); + return IRQ_HANDLED; } /* diff -urN linux-2.5.68-bk1/drivers/net/irda/donauboe.c linux-2.5.68-bk2/drivers/net/irda/donauboe.c --- linux-2.5.68-bk1/drivers/net/irda/donauboe.c 2003-04-19 19:49:21.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/irda/donauboe.c 2003-04-21 15:53:39.000000000 -0700 @@ -1193,7 +1193,7 @@ } /*interrupt handler */ -STATIC void +STATIC irqreturn_t toshoboe_interrupt (int irq, void *dev_id, struct pt_regs *regs) { struct toshoboe_cb *self = (struct toshoboe_cb *) dev_id; @@ -1201,13 +1201,13 @@ struct sk_buff *skb = NULL; if (self == NULL && toshoboe_invalid_dev(irq)) - return; + return IRQ_NONE; irqstat = INB (OBOE_ISR); /* was it us */ if (!(irqstat & OBOE_INT_MASK)) - return; + return IRQ_NONE; /* Ack all the interrupts */ OUTB (irqstat, OBOE_ISR); @@ -1381,6 +1381,7 @@ IRDA_DEBUG (1, "%s.sip:%x(%x)%x\n", __FUNCTION__ ,self->int_sip,irqstat,self->txpending); } + return IRQ_HANDLED; } STATIC int diff -urN linux-2.5.68-bk1/drivers/net/irda/irport.c linux-2.5.68-bk2/drivers/net/irda/irport.c --- linux-2.5.68-bk1/drivers/net/irda/irport.c 2003-04-19 19:50:07.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/irda/irport.c 2003-04-21 15:53:39.000000000 -0700 @@ -720,17 +720,18 @@ * * Interrupt handler */ -void irport_interrupt(int irq, void *dev_id, struct pt_regs *regs) +irqreturn_t irport_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = (struct net_device *) dev_id; struct irport_cb *self; int boguscount = 0; int iobase; int iir, lsr; + int handled = 0; if (!dev) { WARNING("%s() irq %d for unknown device.\n", __FUNCTION__, irq); - return; + return IRQ_NONE; } self = (struct irport_cb *) dev->priv; @@ -740,6 +741,8 @@ iir = inb(iobase+UART_IIR) & UART_IIR_ID; while (iir) { + handled = 1; + /* Clear interrupt */ lsr = inb(iobase+UART_LSR); @@ -771,6 +774,7 @@ iir = inb(iobase + UART_IIR) & UART_IIR_ID; } spin_unlock(&self->lock); + return IRQ_RETVAL(handled); } static int irport_net_init(struct net_device *dev) diff -urN linux-2.5.68-bk1/drivers/net/irda/smc-ircc.c linux-2.5.68-bk2/drivers/net/irda/smc-ircc.c --- linux-2.5.68-bk1/drivers/net/irda/smc-ircc.c 2003-04-19 19:48:47.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/irda/smc-ircc.c 2003-04-21 15:53:39.000000000 -0700 @@ -86,7 +86,7 @@ static int ircc_hard_xmit(struct sk_buff *skb, struct net_device *dev); static void ircc_dma_xmit(struct ircc_cb *self, int iobase, int bofs); static void ircc_change_speed(void *priv, u32 speed); -static void ircc_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t ircc_interrupt(int irq, void *dev_id, struct pt_regs *regs); static int ircc_net_open(struct net_device *dev); static int ircc_net_close(struct net_device *dev); static int ircc_pmproc(struct pm_dev *dev, pm_request_t rqst, void *data); @@ -979,7 +979,7 @@ * An interrupt from the chip has arrived. Time to do some work * */ -static void ircc_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t ircc_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = (struct net_device *) dev_id; struct irport_cb *irport; @@ -989,7 +989,7 @@ if (dev == NULL) { printk(KERN_WARNING "%s: irq %d for unknown device.\n", driver_name, irq); - return; + return IRQ_NONE; } irport = (struct irport_cb *) dev->priv; ASSERT(irport != NULL, return;); @@ -1000,7 +1000,7 @@ if (self->io->speed < 576000) { /* Will spinlock itself - Jean II */ irport_interrupt(irq, dev_id, regs); - return; + return IRQ_HANDLED; } iobase = self->io->fir_base; @@ -1028,6 +1028,7 @@ outb(IRCC_IER_ACTIVE_FRAME|IRCC_IER_EOM, iobase+IRCC_IER); spin_unlock(&self->irport->lock); + return IRQ_HANDLED; } #if 0 /* unused */ diff -urN linux-2.5.68-bk1/drivers/net/lance.c linux-2.5.68-bk2/drivers/net/lance.c --- linux-2.5.68-bk1/drivers/net/lance.c 2003-04-19 19:48:51.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/lance.c 2003-04-21 15:53:39.000000000 -0700 @@ -278,7 +278,7 @@ static void lance_init_ring(struct net_device *dev, int mode); static int lance_start_xmit(struct sk_buff *skb, struct net_device *dev); static int lance_rx(struct net_device *dev); -static void lance_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t lance_interrupt(int irq, void *dev_id, struct pt_regs *regs); static int lance_close(struct net_device *dev); static struct net_device_stats *lance_get_stats(struct net_device *dev); static void set_multicast_list(struct net_device *dev); @@ -945,7 +945,7 @@ } /* The LANCE interrupt handler. */ -static void +static irqreturn_t lance_interrupt(int irq, void *dev_id, struct pt_regs * regs) { struct net_device *dev = dev_id; @@ -955,7 +955,7 @@ if (dev == NULL) { printk ("lance_interrupt(): irq %d for unknown device.\n", irq); - return; + return IRQ_NONE; } ioaddr = dev->base_addr; @@ -1066,6 +1066,7 @@ inw(dev->base_addr + LANCE_DATA)); spin_unlock (&lp->devlock); + return IRQ_HANDLED; } static int diff -urN linux-2.5.68-bk1/drivers/net/lp486e.c linux-2.5.68-bk2/drivers/net/lp486e.c --- linux-2.5.68-bk1/drivers/net/lp486e.c 2003-04-19 19:48:56.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/lp486e.c 2003-04-21 15:53:39.000000000 -0700 @@ -377,7 +377,7 @@ static int i596_open(struct net_device *dev); static int i596_start_xmit(struct sk_buff *skb, struct net_device *dev); -static void i596_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t i596_interrupt(int irq, void *dev_id, struct pt_regs *regs); static int i596_close(struct net_device *dev); static struct net_device_stats *i596_get_stats(struct net_device *dev); static void i596_add_cmd(struct net_device *dev, struct i596_cmd *cmd); @@ -1160,7 +1160,7 @@ spin_unlock_irqrestore(&lp->cmd_lock, flags); } -static void +static irqreturn_t i596_interrupt (int irq, void *dev_instance, struct pt_regs *regs) { struct net_device *dev = (struct net_device *) dev_instance; struct i596_private *lp; @@ -1229,7 +1229,7 @@ CA(); out: - return; + return IRQ_HANDLED; } static int i596_close(struct net_device *dev) { diff -urN linux-2.5.68-bk1/drivers/net/myri_sbus.c linux-2.5.68-bk2/drivers/net/myri_sbus.c --- linux-2.5.68-bk1/drivers/net/myri_sbus.c 2003-04-19 19:48:50.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/myri_sbus.c 2003-04-21 15:53:39.000000000 -0700 @@ -533,7 +533,7 @@ } } -static void myri_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t myri_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = (struct net_device *) dev_id; struct myri_eth *mp = (struct myri_eth *) dev->priv; @@ -567,6 +567,8 @@ DIRQ(("\n")); spin_unlock_irqrestore(&mp->irq_lock, flags); + + return IRQ_HANDLED; } static int myri_open(struct net_device *dev) diff -urN linux-2.5.68-bk1/drivers/net/natsemi.c linux-2.5.68-bk2/drivers/net/natsemi.c --- linux-2.5.68-bk1/drivers/net/natsemi.c 2003-04-19 19:48:50.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/natsemi.c 2003-04-21 15:53:39.000000000 -0700 @@ -696,7 +696,7 @@ static void reinit_ring(struct net_device *dev); static void init_registers(struct net_device *dev); static int start_tx(struct sk_buff *skb, struct net_device *dev); -static void intr_handler(int irq, void *dev_instance, struct pt_regs *regs); +static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *regs); static void netdev_error(struct net_device *dev, int intr_status); static void netdev_rx(struct net_device *dev); static void netdev_tx_done(struct net_device *dev); @@ -1680,15 +1680,16 @@ /* The interrupt handler does all of the Rx thread work and cleans up after the Tx thread. */ -static void intr_handler(int irq, void *dev_instance, struct pt_regs *rgs) +static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *rgs) { struct net_device *dev = dev_instance; struct netdev_private *np = dev->priv; long ioaddr = dev->base_addr; int boguscnt = max_interrupt_work; + unsigned int handled = 0; if (np->hands_off) - return; + return IRQ_NONE; do { /* Reading automatically acknowledges all int sources. */ u32 intr_status = readl(ioaddr + IntrStatus); @@ -1701,6 +1702,7 @@ if (intr_status == 0) break; + handled = 1; if (intr_status & (IntrRxDone | IntrRxIntr | RxStatusFIFOOver | @@ -1731,6 +1733,8 @@ if (netif_msg_intr(np)) printk(KERN_DEBUG "%s: exiting interrupt.\n", dev->name); + + return IRQ_RETVAL(handled); } /* This routine is logically part of the interrupt handler, but separated diff -urN linux-2.5.68-bk1/drivers/net/ni5010.c linux-2.5.68-bk2/drivers/net/ni5010.c --- linux-2.5.68-bk1/drivers/net/ni5010.c 2003-04-19 19:49:25.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/ni5010.c 2003-04-21 15:53:39.000000000 -0700 @@ -104,7 +104,7 @@ static int ni5010_probe1(struct net_device *dev, int ioaddr); static int ni5010_open(struct net_device *dev); static int ni5010_send_packet(struct sk_buff *skb, struct net_device *dev); -static void ni5010_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t ni5010_interrupt(int irq, void *dev_id, struct pt_regs *regs); static void ni5010_rx(struct net_device *dev); static void ni5010_timeout(struct net_device *dev); static int ni5010_close(struct net_device *dev); @@ -451,7 +451,7 @@ * The typical workload of the driver: * Handle the network interface interrupts. */ -static void ni5010_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t ni5010_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = dev_id; struct ni5010_local *lp; @@ -479,7 +479,7 @@ if (!xmit_was_error) reset_receiver(dev); - return; + return IRQ_HANDLED; } diff -urN linux-2.5.68-bk1/drivers/net/ni52.c linux-2.5.68-bk2/drivers/net/ni52.c --- linux-2.5.68-bk1/drivers/net/ni52.c 2003-04-19 19:50:01.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/ni52.c 2003-04-21 15:53:39.000000000 -0700 @@ -193,7 +193,7 @@ #define NI52_ADDR2 0x01 static int ni52_probe1(struct net_device *dev,int ioaddr); -static void ni52_interrupt(int irq,void *dev_id,struct pt_regs *reg_ptr); +static irqreturn_t ni52_interrupt(int irq,void *dev_id,struct pt_regs *reg_ptr); static int ni52_open(struct net_device *dev); static int ni52_close(struct net_device *dev); static int ni52_send_packet(struct sk_buff *,struct net_device *); @@ -821,7 +821,7 @@ * Interrupt Handler ... */ -static void ni52_interrupt(int irq,void *dev_id,struct pt_regs *reg_ptr) +static irqreturn_t ni52_interrupt(int irq,void *dev_id,struct pt_regs *reg_ptr) { struct net_device *dev = dev_id; unsigned short stat; @@ -830,7 +830,7 @@ if (!dev) { printk ("ni5210-interrupt: irq %d for unknown device.\n",irq); - return; + return IRQ_NONE; } p = (struct priv *) dev->priv; @@ -889,6 +889,7 @@ if(debuglevel > 1) printk("i"); + return IRQ_HANDLED; } /******************************************************* diff -urN linux-2.5.68-bk1/drivers/net/ni65.c linux-2.5.68-bk2/drivers/net/ni65.c --- linux-2.5.68-bk1/drivers/net/ni65.c 2003-04-19 19:48:56.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/ni65.c 2003-04-21 15:53:39.000000000 -0700 @@ -248,7 +248,7 @@ }; static int ni65_probe1(struct net_device *dev,int); -static void ni65_interrupt(int irq, void * dev_id, struct pt_regs *regs); +static irqreturn_t ni65_interrupt(int irq, void * dev_id, struct pt_regs *regs); static void ni65_recv_intr(struct net_device *dev,int); static void ni65_xmit_intr(struct net_device *dev,int); static int ni65_open(struct net_device *dev); @@ -307,7 +307,6 @@ if(ni65_lance_reinit(dev)) { netif_start_queue(dev); - MOD_INC_USE_COUNT; return 0; } else @@ -341,7 +340,6 @@ } #endif free_irq(dev->irq,dev); - MOD_DEC_USE_COUNT; return 0; } @@ -512,7 +510,7 @@ } dev->base_addr = ioaddr; - + SET_MODULE_OWNER(dev); dev->open = ni65_open; dev->stop = ni65_close; dev->hard_start_xmit = ni65_send_packet; @@ -839,7 +837,7 @@ /* * interrupt handler */ -static void ni65_interrupt(int irq, void * dev_id, struct pt_regs * regs) +static irqreturn_t ni65_interrupt(int irq, void * dev_id, struct pt_regs * regs) { int csr0 = 0; struct net_device *dev = dev_id; @@ -940,7 +938,7 @@ else writedatareg(CSR0_INEA); - return; + return IRQ_HANDLED; } /* diff -urN linux-2.5.68-bk1/drivers/net/ns83820.c linux-2.5.68-bk2/drivers/net/ns83820.c --- linux-2.5.68-bk1/drivers/net/ns83820.c 2003-04-19 19:51:12.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/ns83820.c 2003-04-21 15:53:39.000000000 -0700 @@ -549,7 +549,7 @@ static inline int rx_refill(struct ns83820 *dev, int gfp) { unsigned i; - long flags = 0; + unsigned long flags = 0; if (unlikely(nr_rx_empty(dev) <= 2)) return 0; @@ -763,7 +763,7 @@ static void ns83820_cleanup_rx(struct ns83820 *dev) { unsigned i; - long flags; + unsigned long flags; dprintk("ns83820_cleanup_rx(%p)\n", dev); @@ -820,7 +820,7 @@ struct rx_info *info = &dev->rx_info; unsigned next_rx; u32 cmdsts, *desc; - long flags; + unsigned long flags; int nr = 0; dprintk("rx_irq(%p)\n", dev); @@ -1234,7 +1234,7 @@ } static void ns83820_do_isr(struct ns83820 *dev, u32 isr); -static void ns83820_irq(int foo, void *data, struct pt_regs *regs) +static irqreturn_t ns83820_irq(int foo, void *data, struct pt_regs *regs) { struct ns83820 *dev = data; u32 isr; @@ -1245,6 +1245,7 @@ isr = readl(dev->base + ISR); dprintk("irq: %08x\n", isr); ns83820_do_isr(dev, isr); + return IRQ_HANDLED; } static void ns83820_do_isr(struct ns83820 *dev, u32 isr) @@ -1396,7 +1397,7 @@ { struct ns83820 *dev = (struct ns83820 *)_dev; u32 tx_done_idx, *desc; - long flags; + unsigned long flags; local_irq_save(flags); diff -urN linux-2.5.68-bk1/drivers/net/pcmcia/3c589_cs.c linux-2.5.68-bk2/drivers/net/pcmcia/3c589_cs.c --- linux-2.5.68-bk1/drivers/net/pcmcia/3c589_cs.c 2003-04-19 19:51:10.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/pcmcia/3c589_cs.c 2003-04-21 15:53:39.000000000 -0700 @@ -249,6 +249,7 @@ link->conf.Present = PRESENT_OPTION; /* The EL3-specific entries in the device structure. */ + SET_MODULE_OWNER(dev); dev->hard_start_xmit = &el3_start_xmit; dev->set_config = &el3_config; dev->get_stats = &el3_get_stats; @@ -740,7 +741,6 @@ return -ENODEV; link->open++; - MOD_INC_USE_COUNT; netif_start_queue(dev); tc589_reset(dev); @@ -1148,8 +1148,6 @@ if (link->state & DEV_STALE_CONFIG) mod_timer(&link->release, jiffies + HZ/20); - MOD_DEC_USE_COUNT; - return 0; } diff -urN linux-2.5.68-bk1/drivers/net/pcmcia/axnet_cs.c linux-2.5.68-bk2/drivers/net/pcmcia/axnet_cs.c --- linux-2.5.68-bk1/drivers/net/pcmcia/axnet_cs.c 2003-04-19 19:49:56.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/pcmcia/axnet_cs.c 2003-04-21 15:53:39.000000000 -0700 @@ -98,7 +98,7 @@ static int axnet_open(struct net_device *dev); static int axnet_close(struct net_device *dev); static int axnet_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); -static void ei_irq_wrapper(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t ei_irq_wrapper(int irq, void *dev_id, struct pt_regs *regs); static void ei_watchdog(u_long arg); static void axnet_reset_8390(struct net_device *dev); @@ -122,7 +122,7 @@ static void AX88190_init(struct net_device *dev, int startp); static int ax_open(struct net_device *dev); static int ax_close(struct net_device *dev); -static void ax_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t ax_interrupt(int irq, void *dev_id, struct pt_regs *regs); /*====================================================================*/ @@ -687,7 +687,6 @@ return -ENODEV; link->open++; - MOD_INC_USE_COUNT; request_irq(dev->irq, ei_irq_wrapper, SA_SHIRQ, dev_info, dev); @@ -719,8 +718,6 @@ if (link->state & DEV_STALE_CONFIG) mod_timer(&link->release, jiffies + HZ/20); - MOD_DEC_USE_COUNT; - return 0; } /* axnet_close */ @@ -757,11 +754,11 @@ /*====================================================================*/ -static void ei_irq_wrapper(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t ei_irq_wrapper(int irq, void *dev_id, struct pt_regs *regs) { axnet_dev_t *info = dev_id; info->stale = 0; - ax_interrupt(irq, dev_id, regs); + return ax_interrupt(irq, dev_id, regs); } static void ei_watchdog(u_long arg) @@ -1345,17 +1342,18 @@ * needed. */ -static void ax_interrupt(int irq, void *dev_id, struct pt_regs * regs) +static irqreturn_t ax_interrupt(int irq, void *dev_id, struct pt_regs * regs) { struct net_device *dev = dev_id; long e8390_base; int interrupts, nr_serviced = 0, i; struct ei_device *ei_local; - + int handled = 0; + if (dev == NULL) { printk ("net_interrupt(): irq %d for unknown device.\n", irq); - return; + return IRQ_NONE; } e8390_base = dev->base_addr; @@ -1378,7 +1376,7 @@ inb_p(e8390_base + EN0_IMR)); #endif spin_unlock(&ei_local->page_lock); - return; + return IRQ_NONE; } if (ei_debug > 3) @@ -1399,6 +1397,8 @@ interrupts = 0; break; } + handled = 1; + /* AX88190 bug fix. */ outb_p(interrupts, e8390_base + EN0_ISR); for (i = 0; i < 10; i++) { @@ -1430,6 +1430,7 @@ if (interrupts && ei_debug) { + handled = 1; if (nr_serviced >= MAX_SERVICE) { /* 0xFF is valid for a card removal */ @@ -1448,7 +1449,7 @@ outb_p(ENISR_ALL, e8390_base + EN0_IMR); spin_unlock(&ei_local->page_lock); - return; + return IRQ_RETVAL(handled); } /** @@ -1842,6 +1843,8 @@ if (ei_debug > 1) printk(version_8390); + SET_MODULE_OWNER(dev); + if (dev->priv == NULL) { struct ei_device *ei_local; diff -urN linux-2.5.68-bk1/drivers/net/pcmcia/fmvj18x_cs.c linux-2.5.68-bk2/drivers/net/pcmcia/fmvj18x_cs.c --- linux-2.5.68-bk1/drivers/net/pcmcia/fmvj18x_cs.c 2003-04-19 19:50:07.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/pcmcia/fmvj18x_cs.c 2003-04-21 15:53:39.000000000 -0700 @@ -314,6 +314,7 @@ link->conf.IntType = INT_MEMORY_AND_IO; /* The FMVJ18x specific entries in the device structure. */ + SET_MODULE_OWNER(dev); dev->hard_start_xmit = &fjn_start_xmit; dev->set_config = &fjn_config; dev->get_stats = &fjn_get_stats; @@ -1287,8 +1288,6 @@ lp->open_time = jiffies; netif_start_queue(dev); - MOD_INC_USE_COUNT; - return 0; } /* fjn_open */ @@ -1323,7 +1322,6 @@ link->open--; if (link->state & DEV_STALE_CONFIG) mod_timer(&link->release, jiffies + HZ/20); - MOD_DEC_USE_COUNT; return 0; } /* fjn_close */ @@ -1369,9 +1367,11 @@ memset(mc_filter, 0, sizeof(mc_filter)); for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count; - i++, mclist = mclist->next) - set_bit(ether_crc_le(ETH_ALEN, mclist->dmi_addr) & 0x3f, - mc_filter); + i++, mclist = mclist->next) { + unsigned int bit = + ether_crc_le(ETH_ALEN, mclist->dmi_addr) & 0x3f; + mc_filter[bit >> 3] |= (1 << bit); + } } save_flags(flags); diff -urN linux-2.5.68-bk1/drivers/net/pcmcia/nmclan_cs.c linux-2.5.68-bk2/drivers/net/pcmcia/nmclan_cs.c --- linux-2.5.68-bk1/drivers/net/pcmcia/nmclan_cs.c 2003-04-19 19:48:51.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/pcmcia/nmclan_cs.c 2003-04-21 15:53:39.000000000 -0700 @@ -515,6 +515,7 @@ lp->tx_free_frames=AM2150_MAX_TX_FRAMES; + SET_MODULE_OWNER(dev); dev->hard_start_xmit = &mace_start_xmit; dev->set_config = &mace_config; dev->get_stats = &mace_get_stats; @@ -974,7 +975,6 @@ return -ENODEV; link->open++; - MOD_INC_USE_COUNT; MACEBANK(0); @@ -1004,8 +1004,6 @@ if (link->state & DEV_STALE_CONFIG) mod_timer(&link->release, jiffies + HZ/20); - MOD_DEC_USE_COUNT; - return 0; } /* mace_close */ diff -urN linux-2.5.68-bk1/drivers/net/pcmcia/pcnet_cs.c linux-2.5.68-bk2/drivers/net/pcmcia/pcnet_cs.c --- linux-2.5.68-bk1/drivers/net/pcmcia/pcnet_cs.c 2003-04-21 15:53:35.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/pcmcia/pcnet_cs.c 2003-04-21 15:53:39.000000000 -0700 @@ -315,6 +315,7 @@ link->conf.IntType = INT_MEMORY_AND_IO; ethdev_init(dev); + SET_MODULE_OWNER(dev); dev->init = &pcnet_init; dev->open = &pcnet_open; dev->stop = &pcnet_close; @@ -1030,7 +1031,6 @@ return -ENODEV; link->open++; - MOD_INC_USE_COUNT; set_misc_reg(dev); request_irq(dev->irq, ei_irq_wrapper, SA_SHIRQ, dev_info, dev); @@ -1064,8 +1064,6 @@ if (link->state & DEV_STALE_CONFIG) mod_timer(&link->release, jiffies + HZ/20); - MOD_DEC_USE_COUNT; - return 0; } /* pcnet_close */ diff -urN linux-2.5.68-bk1/drivers/net/pcmcia/smc91c92_cs.c linux-2.5.68-bk2/drivers/net/pcmcia/smc91c92_cs.c --- linux-2.5.68-bk1/drivers/net/pcmcia/smc91c92_cs.c 2003-04-19 19:50:08.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/pcmcia/smc91c92_cs.c 2003-04-21 15:53:39.000000000 -0700 @@ -376,6 +376,7 @@ link->conf.IntType = INT_MEMORY_AND_IO; /* The SMC91c92-specific entries in the device structure. */ + SET_MODULE_OWNER(dev); dev->hard_start_xmit = &smc_start_xmit; dev->get_stats = &smc_get_stats; dev->set_config = &s9k_config; @@ -1301,7 +1302,6 @@ return -ENODEV; } link->open++; - MOD_INC_USE_COUNT; netif_start_queue(dev); smc->saved_skb = 0; @@ -1347,8 +1347,6 @@ if (link->state & DEV_STALE_CONFIG) mod_timer(&link->release, jiffies + HZ/20); - MOD_DEC_USE_COUNT; - return 0; } /* smc_close */ diff -urN linux-2.5.68-bk1/drivers/net/pcmcia/xirc2ps_cs.c linux-2.5.68-bk2/drivers/net/pcmcia/xirc2ps_cs.c --- linux-2.5.68-bk1/drivers/net/pcmcia/xirc2ps_cs.c 2003-04-19 19:49:10.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/pcmcia/xirc2ps_cs.c 2003-04-21 15:53:39.000000000 -0700 @@ -646,6 +646,7 @@ link->irq.Instance = dev; /* Fill in card specific entries */ + SET_MODULE_OWNER(dev); dev->hard_start_xmit = &do_start_xmit; dev->set_config = &do_config; dev->get_stats = &do_get_stats; @@ -1714,7 +1715,6 @@ /* okay */ link->open++; - MOD_INC_USE_COUNT; netif_start_queue(dev); do_reset(dev,1); @@ -2066,8 +2066,6 @@ if (link->state & DEV_STALE_CONFIG) mod_timer(&link->release, jiffies + HZ/20); - MOD_DEC_USE_COUNT; - return 0; } diff -urN linux-2.5.68-bk1/drivers/net/pcnet32.c linux-2.5.68-bk2/drivers/net/pcnet32.c --- linux-2.5.68-bk1/drivers/net/pcnet32.c 2003-04-19 19:48:56.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/pcnet32.c 2003-04-21 15:53:39.000000000 -0700 @@ -331,7 +331,7 @@ static int pcnet32_start_xmit(struct sk_buff *, struct net_device *); static int pcnet32_rx(struct net_device *); static void pcnet32_tx_timeout (struct net_device *dev); -static void pcnet32_interrupt(int, void *, struct pt_regs *); +static irqreturn_t pcnet32_interrupt(int, void *, struct pt_regs *); static int pcnet32_close(struct net_device *); static struct net_device_stats *pcnet32_get_stats(struct net_device *); static void pcnet32_set_multicast_list(struct net_device *); @@ -717,6 +717,7 @@ spin_lock_init(&lp->lock); + SET_MODULE_OWNER(dev); dev->priv = lp; lp->name = chipname; lp->shared_irq = shared; @@ -945,8 +946,6 @@ lp->a.read_csr(ioaddr, 0)); - MOD_INC_USE_COUNT; - return 0; /* Always succeed */ } @@ -1148,7 +1147,7 @@ } /* The PCNET32 interrupt handler. */ -static void +static irqreturn_t pcnet32_interrupt(int irq, void *dev_id, struct pt_regs * regs) { struct net_device *dev = dev_id; @@ -1161,7 +1160,7 @@ if (!dev) { printk (KERN_DEBUG "%s(): irq %d for unknown device\n", __FUNCTION__, irq); - return; + return IRQ_NONE; } ioaddr = dev->base_addr; @@ -1293,6 +1292,8 @@ dev->name, lp->a.read_csr (ioaddr, 0)); spin_unlock(&lp->lock); + + return IRQ_HANDLED; } static int @@ -1440,8 +1441,6 @@ lp->tx_dma_addr[i] = 0; } - MOD_DEC_USE_COUNT; - return 0; } diff -urN linux-2.5.68-bk1/drivers/net/r8169.c linux-2.5.68-bk2/drivers/net/r8169.c --- linux-2.5.68-bk1/drivers/net/r8169.c 2003-04-19 19:49:33.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/r8169.c 2003-04-21 15:53:39.000000000 -0700 @@ -295,7 +295,7 @@ static int rtl8169_open(struct net_device *dev); static int rtl8169_start_xmit(struct sk_buff *skb, struct net_device *dev); -static void rtl8169_interrupt(int irq, void *dev_instance, +static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance, struct pt_regs *regs); static void rtl8169_init_ring(struct net_device *dev); static void rtl8169_hw_start(struct net_device *dev); @@ -958,7 +958,7 @@ } /* The interrupt handler does all of the Rx thread work and cleans up after the Tx thread. */ -static void +static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance, struct pt_regs *regs) { struct net_device *dev = (struct net_device *) dev_instance; @@ -966,6 +966,7 @@ int boguscnt = max_interrupt_work; void *ioaddr = tp->mmio_addr; int status = 0; + int handled = 0; do { status = RTL_R16(IntrStatus); @@ -974,6 +975,7 @@ if (status == 0xFFFF) break; + handled = 1; /* if (status & RxUnderrun) link_changed = RTL_R16 (CSCR) & CSCR_LinkChangeBit; @@ -1006,6 +1008,7 @@ /* Clear all interrupt sources. */ RTL_W16(IntrStatus, 0xffff); } + return IRQ_RETVAL(handled); } static int diff -urN linux-2.5.68-bk1/drivers/net/rclanmtl.c linux-2.5.68-bk2/drivers/net/rclanmtl.c --- linux-2.5.68-bk1/drivers/net/rclanmtl.c 2003-04-19 19:50:06.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/rclanmtl.c 2003-04-21 15:53:39.000000000 -0700 @@ -301,13 +301,13 @@ PPAB pPab; U32 pciBaseAddr = dev->base_addr; PDPA pDpa = dev->priv; - PU8 p_msgbuf = pDpa->PLanApiPA; - PU8 p_phymsgbuf = (PU8) virt_to_bus ((void *) p_msgbuf); + PU8 p_msgbuf = pDpa->msgbuf; + PU8 p_phymsgbuf = (PU8) pDpa->msgbuf_dma; dprintk - ("InitI2O: Adapter:0x%04ux ATU:0x%08ulx msgbuf:0x%08ulx phymsgbuf:0x%08ulx\n" + ("InitI2O: Adapter:0x%04ux ATU:0x%08ulx msgbuf:%p phymsgbuf:0x%08ulx\n" "TransmitCallbackFunction:0x%08ulx ReceiveCallbackFunction:0x%08ulx\n", - pDpa->id, pciBaseAddr, (u32) p_msgbuf, (u32) p_phymsgbuf, + pDpa->id, pciBaseAddr, p_msgbuf, (u32) p_phymsgbuf, (u32) TransmitCallbackFunction, (u32) ReceiveCallbackFunction); /* Check if this interface already initialized - if so, shut it down */ @@ -445,7 +445,7 @@ return RC_RTN_FREE_Q_EMPTY; } - /* calc virual address of msg - virual already mapped to physical */ + /* calc virtual address of msg - virtual already mapped to physical */ pMsg = (PU32) (pPab->pPci45LinBaseAddr + msgOffset); size = FillI2OMsgSGLFromTCB (pMsg + 4, pTransCtrlBlock); @@ -502,7 +502,7 @@ dprintk ("RCPostRecvBuffers(): Inbound Free Q empty!\n"); return RC_RTN_FREE_Q_EMPTY; } - /* calc virual address of msg - virual already mapped to physical */ + /* calc virtual address of msg - virtual already mapped to physical */ pMsg = (PU32) (pPab->pPci45LinBaseAddr + msgOffset); size = FillI2OMsgSGLFromTCB (pMsg + 4, pTransCtrlBlock); @@ -538,7 +538,7 @@ ** Process I2O outbound message queue until empty. ** ========================================================================= */ -void +irqreturn_t RCProcI2OMsgQ (struct net_device *dev) { U32 phyAddrMsg; @@ -549,7 +549,7 @@ unsigned char debug_msg[20]; if (pPab == NULL) - return; + return IRQ_NONE; phyAddrMsg = pPab->p_atu->OutQueue; @@ -642,6 +642,8 @@ /* any more msgs? */ phyAddrMsg = pPab->p_atu->OutQueue; } + + return IRQ_HANDLED; } /* @@ -677,7 +679,7 @@ return RC_RTN_FREE_Q_EMPTY; } - /* calc virual address of msg - virual already mapped to physical */ + /* calc virtual address of msg - virtual already mapped to physical */ pMsg = (PU32) (pPab->pPci45LinBaseAddr + msgOffset); /*dprintk("Get82558Stats - pMsg = 0x%08ulx, InQ msgOffset = 0x%08ulx\n", pMsg, msgOffset);*/ @@ -751,7 +753,7 @@ return RC_RTN_FREE_Q_EMPTY; } - /* calc virual address of msg - virual already mapped to physical */ + /* calc virtual address of msg - virtual already mapped to physical */ pMsg = (PU32) (pPab->pPci45LinBaseAddr + msgOffset); /*dprintk("Get82558LinkStatus - pMsg = 0x%08ulx, InQ msgOffset = 0x%08ulx\n", pMsg, msgOffset);*/ /*dprintk("Get82558LinkStatus - pMsg = 0x%08X, InQ msgOffset = 0x%08X\n", pMsg, msgOffset);*/ @@ -1452,7 +1454,7 @@ pMsg[7] = 0; pMsg[8] = 1; /* return 1 byte */ - /* virual pointer to return buffer - clear first two dwords */ + /* virtual pointer to return buffer - clear first two dwords */ p32 = (volatile PU32) pPab->pLinOutMsgBlock; p32[0] = 0; p32[1] = 0; @@ -1693,7 +1695,7 @@ return RC_RTN_FREE_Q_EMPTY; } - /* calc virual address of msg - virual already mapped to physical */ + /* calc virtual address of msg - virtual already mapped to physical */ pMsg = (PU32) (pPab->pPci45LinBaseAddr + msgOffset); dprintk @@ -1711,7 +1713,7 @@ /* phys address to return status - area right after PAB */ pMsg[7] = pPab->outMsgBlockPhyAddr; - /* virual pointer to return buffer - clear first two dwords */ + /* virtual pointer to return buffer - clear first two dwords */ p32 = (PU32) pPab->pLinOutMsgBlock; p32[0] = 0; @@ -1779,7 +1781,7 @@ return RC_RTN_FREE_Q_EMPTY; } - /* calc virual address of msg - virual already mapped to physical */ + /* calc virtual address of msg - virtual already mapped to physical */ pMsg = (PU32) (pPab->pPci45LinBaseAddr + msgOffset); pMsg[0] = NINE_WORD_MSG_SIZE | SGL_OFFSET_0; @@ -1793,7 +1795,7 @@ pMsg[7] = 0; pMsg[8] = 88; /* return 88 bytes */ - /* virual pointer to return buffer - clear first two dwords */ + /* virtual pointer to return buffer - clear first two dwords */ p32 = (volatile PU32) pPab->pLinOutMsgBlock; p32[0] = 0; p32[1] = 0; @@ -1862,7 +1864,7 @@ return RC_RTN_FREE_Q_EMPTY; } - /* calc virual address of msg - virual already mapped to physical */ + /* calc virtual address of msg - virtual already mapped to physical */ pMsg = (PU32) (pPab->pPci45LinBaseAddr + msgOffset); dprintk @@ -1885,7 +1887,7 @@ ** ========================================================================= ** FillI2OMsgFromTCB() ** -** inputs pMsgU32 - virual pointer (mapped to physical) of message frame +** inputs pMsgU32 - virtual pointer (mapped to physical) of message frame ** pXmitCntrlBlock - pointer to caller buffer control block. ** ** fills in LAN SGL after Transaction Control Word or Bucket Count. diff -urN linux-2.5.68-bk1/drivers/net/rclanmtl.h linux-2.5.68-bk2/drivers/net/rclanmtl.h --- linux-2.5.68-bk1/drivers/net/rclanmtl.h 2003-04-19 19:49:31.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/rclanmtl.h 2003-04-21 15:53:39.000000000 -0700 @@ -182,6 +182,7 @@ U32 pci_addr; /* the pci address of the adapter */ U32 pci_addr_len; + struct pci_dev *pci_dev; struct timer_list timer; /* timer */ struct net_device_stats stats; /* the statistics structure */ unsigned long numOutRcvBuffers; /* number of outstanding receive buffers */ @@ -189,7 +190,7 @@ unsigned char reboot; unsigned char nexus; PU8 msgbuf; /* Pointer to Lan Api Private Area */ - PU8 PLanApiPA; /* Pointer to Lan Api Private Area (aligned) */ + dma_addr_t msgbuf_dma; PPAB pPab; /* Pointer to the PCI Adapter Block */ } *PDPA; @@ -421,7 +422,7 @@ ** callback functions, TransmitCallbackFunction or ReceiveCallbackFunction, ** if a TX or RX transaction has completed. */ -void RCProcI2OMsgQ (struct net_device *dev); +irqreturn_t RCProcI2OMsgQ (struct net_device *dev); /* ** Disable and Enable I2O interrupts. I2O interrupts are enabled at Init time diff -urN linux-2.5.68-bk1/drivers/net/rcpci45.c linux-2.5.68-bk2/drivers/net/rcpci45.c --- linux-2.5.68-bk1/drivers/net/rcpci45.c 2003-04-19 19:50:36.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/rcpci45.c 2003-04-21 15:53:39.000000000 -0700 @@ -29,6 +29,8 @@ ** along with this program; if not, write to the Free Software ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ** +** Francois Romieu, Apr 2003: Converted to pci DMA mapping API. +** ** Pete Popov, Oct 2001: Fixed a few bugs to make the driver functional ** again. Note that this card is not supported or manufactured by ** RedCreek anymore. @@ -47,8 +49,6 @@ ** ***************************************************************************/ -#error Please convert me to Documentation/DMA-mapping.txt - #include #include #include @@ -66,7 +66,7 @@ #include static char version[] __initdata = - "RedCreek Communications PCI linux driver version 2.20\n"; + "RedCreek Communications PCI linux driver version 2.21\n"; #define RC_LINUX_MODULE #include "rclanmtl.h" @@ -95,13 +95,19 @@ */ #define MSG_BUF_SIZE 16384 +/* 2003/04/20: I don't know about the hardware ability but the driver won't + * play safe with 64 bit addressing and DAC without NETIF_F_HIGHDMA doesn't + * really make sense anyway. Let's play safe - romieu. + */ +#define RCPCI45_DMA_MASK ((u64) 0xffffffff) + static U32 DriverControlWord; static void rc_timer (unsigned long); static int RCopen (struct net_device *); static int RC_xmit_packet (struct sk_buff *, struct net_device *); -static void RCinterrupt (int, void *, struct pt_regs *); +static irqreturn_t RCinterrupt (int, void *, struct pt_regs *); static int RCclose (struct net_device *dev); static struct net_device_stats *RCget_stats (struct net_device *); static int RCioctl (struct net_device *, struct ifreq *, int); @@ -136,8 +142,8 @@ free_irq (dev->irq, dev); iounmap ((void *) dev->base_addr); pci_release_regions (pdev); - if (pDpa->msgbuf) - kfree (pDpa->msgbuf); + pci_free_consistent (pdev, MSG_BUF_SIZE, pDpa->msgbuf, + pDpa->msgbuf_dma); if (pDpa->pPab) kfree (pDpa->pPab); kfree (dev); @@ -172,6 +178,7 @@ error = -ENOMEM; goto err_out; } + SET_MODULE_OWNER(dev); error = pci_enable_device (pdev); if (error) { @@ -180,7 +187,6 @@ card_idx); goto err_out; } - error = -ENOMEM; pci_start = pci_resource_start (pdev, 0); pci_len = pci_resource_len (pdev, 0); printk("pci_start %lx pci_len %lx\n", pci_start, pci_len); @@ -189,6 +195,7 @@ pDpa = dev->priv; pDpa->id = card_idx; + pDpa->pci_dev = pdev; pDpa->pci_addr = pci_start; if (!pci_start || !(pci_resource_flags (pdev, 0) & IORESOURCE_MEM)) { @@ -200,24 +207,21 @@ /* * pDpa->msgbuf is where the card will dma the I2O - * messages. Thus, we need contiguous physical pages of - * memory. - */ - pDpa->msgbuf = kmalloc (MSG_BUF_SIZE, GFP_DMA | GFP_KERNEL); + * messages. Thus, we need contiguous physical pages of memory. + * 2003/04/20: pci_alloc_consistent() provides well over the needed + * alignment on a 256 bytes boundary for the LAN API private area. + * Thus it isn't needed anymore to align it by hand. + */ + pDpa->msgbuf = pci_alloc_consistent (pdev, MSG_BUF_SIZE, + &pDpa->msgbuf_dma); if (!pDpa->msgbuf) { printk (KERN_ERR "(rcpci45 driver:) \ Could not allocate %d byte memory for the \ private msgbuf!\n", MSG_BUF_SIZE); + error = -ENOMEM; goto err_out_free_dev; } - /* - * Save the starting address of the LAN API private area. We'll - * pass that to RCInitI2OMsgLayer(). - * - */ - pDpa->PLanApiPA = (void *) (((long) pDpa->msgbuf + 0xff) & ~0xff); - /* The adapter is accessible through memory-access read/write, not * I/O read/write. Thus, we need to map it to some virtual address * area in order to access the registers as normal memory. @@ -226,12 +230,20 @@ if (error) goto err_out_free_msgbuf; + error = pci_set_dma_mask (pdev, RCPCI45_DMA_MASK); + if (error) { + printk (KERN_ERR + "(rcpci45 driver:) pci_set_dma_mask failed!\n"); + goto err_out_free_region; + } + vaddr = (ulong *) ioremap (pci_start, pci_len); if (!vaddr) { printk (KERN_ERR "(rcpci45 driver:) \ Unable to remap address range from %lu to %lu\n", pci_start, pci_start + pci_len); + error = -EIO; goto err_out_free_region; } @@ -249,13 +261,14 @@ err_out_free_region: pci_release_regions (pdev); err_out_free_msgbuf: - kfree (pDpa->msgbuf); + pci_free_consistent (pdev, MSG_BUF_SIZE, pDpa->msgbuf, + pDpa->msgbuf_dma); err_out_free_dev: unregister_netdev (dev); kfree (dev); err_out: card_idx--; - return -ENODEV; + return error; } static struct pci_driver rcpci45_driver = { @@ -283,7 +296,6 @@ int requested = 0; int error; - MOD_INC_USE_COUNT; if (pDpa->nexus) { /* This is not the first time RCopen is called. Thus, * the interface was previously opened and later closed @@ -365,7 +377,6 @@ err_out_free_irq: free_irq (dev->irq, dev); err_out: - MOD_DEC_USE_COUNT; return error; } @@ -402,7 +413,8 @@ ptcb->b.context = (U32) skb; ptcb->b.scount = 1; ptcb->b.size = skb->len; - ptcb->b.addr = virt_to_bus ((void *) skb->data); + ptcb->b.addr = pci_map_single(pDpa->pci_dev, skb->data, skb->len, + PCI_DMA_TODEVICE); if ((status = RCI2OSendPacket (dev, (U32) NULL, (PRCTCB) ptcb)) != RC_RTN_NO_ERROR) { @@ -451,6 +463,8 @@ while (PcktCount--) { skb = (struct sk_buff *) (BufferContext[0]); BufferContext++; + pci_unmap_single(pDpa->pci_dev, BufferContext[1], skb->len, + PCI_DMA_TODEVICE); dev_kfree_skb_irq (skb); } netif_wake_queue (dev); @@ -621,7 +635,7 @@ * RCProcI2OMsgQ(), which in turn process the message and * calls one of our callback functions. */ -static void +static irqreturn_t RCinterrupt (int irq, void *dev_id, struct pt_regs *regs) { @@ -634,7 +648,7 @@ printk (KERN_DEBUG "%s: shutdown, service irq\n", dev->name); - RCProcI2OMsgQ (dev); + return RCProcI2OMsgQ (dev); } #define REBOOT_REINIT_RETRY_LIMIT 4 @@ -706,6 +720,7 @@ RCDisableI2OInterrupts (dev); dev->flags &= ~IFF_UP; MOD_DEC_USE_COUNT; + /* FIXME: kill MOD_DEC_USE_COUNT, use dev_put */ } else { printk (KERN_INFO "%s: rescheduling timer...\n", dev->name); @@ -731,7 +746,6 @@ printk (KERN_INFO "%s skipping reset -- adapter already in reboot mode\n", dev->name); dev->flags &= ~IFF_UP; pDpa->shutdown = 1; - MOD_DEC_USE_COUNT; return 0; } @@ -749,7 +763,6 @@ (PFNCALLBACK) RCreset_callback); dev->flags &= ~IFF_UP; - MOD_DEC_USE_COUNT; return 0; } @@ -984,8 +997,9 @@ PU32 p; psingleB pB; struct sk_buff *skb; + PDPA pDpa = dev->priv; RC_RETURN status; - U32 res; + U32 res = 0; if (!numBuffers) return 0; @@ -1001,7 +1015,7 @@ if (!p) { printk (KERN_WARNING "%s unable to allocate TCB\n", dev->name); - return 0; + goto out; } p[0] = 0; /* Buffer Count */ @@ -1013,18 +1027,14 @@ printk (KERN_WARNING "%s: unable to allocate enough skbs!\n", dev->name); - if (*p != 0) { /* did we allocate any buffers */ - break; - } else { - kfree (p); /* Free the TCB */ - return 0; - } + goto err_out_unmap; } skb_reserve (skb, 2); /* Align IP on 16 byte boundaries */ pB->context = (U32) skb; pB->scount = 1; /* segment count */ pB->size = MAX_ETHER_SIZE; - pB->addr = virt_to_bus ((void *) skb->data); + pB->addr = pci_map_single(pDpa->pci_dev, skb->data, + MAX_ETHER_SIZE, PCI_DMA_FROMDEVICE); p[0]++; pB++; } @@ -1032,16 +1042,21 @@ if ((status = RCPostRecvBuffers (dev, (PRCTCB) p)) != RC_RTN_NO_ERROR) { printk (KERN_WARNING "%s: Post buffer failed, error 0x%x\n", dev->name, status); - /* point to the first buffer */ - pB = (psingleB) ((U32) p + sizeof (U32)); - while (p[0]) { - skb = (struct sk_buff *) pB->context; - dev_kfree_skb (skb); - p[0]--; - pB++; - } + goto err_out_unmap; } +out_free: res = p[0]; kfree (p); +out: return (res); /* return the number of posted buffers */ + +err_out_unmap: + for (; p[0] > 0; p[0]--) { + --pB; + skb = (struct sk_buff *) pB->context; + pci_unmap_single(pDpa->pci_dev, pB->addr, MAX_ETHER_SIZE, + PCI_DMA_FROMDEVICE); + dev_kfree_skb (skb); + } + goto out_free; } diff -urN linux-2.5.68-bk1/drivers/net/sis900.c linux-2.5.68-bk2/drivers/net/sis900.c --- linux-2.5.68-bk1/drivers/net/sis900.c 2003-04-19 19:49:21.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/sis900.c 2003-04-21 15:53:39.000000000 -0700 @@ -195,11 +195,11 @@ static int sis900_start_xmit(struct sk_buff *skb, struct net_device *net_dev); static int sis900_rx(struct net_device *net_dev); static void sis900_finish_xmit (struct net_device *net_dev); -static void sis900_interrupt(int irq, void *dev_instance, struct pt_regs *regs); +static irqreturn_t sis900_interrupt(int irq, void *dev_instance, struct pt_regs *regs); static int sis900_close(struct net_device *net_dev); static int mii_ioctl(struct net_device *net_dev, struct ifreq *rq, int cmd); static struct net_device_stats *sis900_get_stats(struct net_device *net_dev); -static u16 sis900_compute_hashtable_index(u8 *addr, u8 revision); +static u16 sis900_mcast_bitnr(u8 *addr, u8 revision); static void set_rx_mode(struct net_device *net_dev); static void sis900_reset(struct net_device *net_dev); static void sis630_set_eq(struct net_device *net_dev, u8 revision); @@ -1534,13 +1534,14 @@ * and cleans up after the Tx thread */ -static void sis900_interrupt(int irq, void *dev_instance, struct pt_regs *regs) +static irqreturn_t sis900_interrupt(int irq, void *dev_instance, struct pt_regs *regs) { struct net_device *net_dev = dev_instance; struct sis900_private *sis_priv = net_dev->priv; int boguscnt = max_interrupt_work; long ioaddr = net_dev->base_addr; u32 status; + unsigned int handled = 0; spin_lock (&sis_priv->lock); @@ -1550,6 +1551,7 @@ if ((status & (HIBERR|TxURN|TxERR|TxIDLE|RxORN|RxERR|RxOK)) == 0) /* nothing intresting happened */ break; + handled = 1; /* why dow't we break after Tx/Rx case ?? keyword: full-duplex */ if (status & (RxORN | RxERR | RxOK)) @@ -1580,7 +1582,7 @@ net_dev->name, inl(ioaddr + isr)); spin_unlock (&sis_priv->lock); - return; + return IRQ_RETVAL(handled); } /** @@ -2031,7 +2033,7 @@ } /** - * sis900_compute_hashtable_index: - compute hashtable index + * sis900_mcast_bitnr: - compute hashtable index * @addr: multicast address * @revision: revision id of chip * @@ -2041,7 +2043,7 @@ * multicast hash table. */ -static u16 sis900_compute_hashtable_index(u8 *addr, u8 revision) +static inline u16 sis900_mcast_bitnr(u8 *addr, u8 revision) { u32 crc = ether_crc(6, addr); @@ -2095,9 +2097,11 @@ struct dev_mc_list *mclist; rx_mode = RFAAB; for (i = 0, mclist = net_dev->mc_list; mclist && i < net_dev->mc_count; - i++, mclist = mclist->next) - set_bit(sis900_compute_hashtable_index(mclist->dmi_addr, revision), - mc_filter); + i++, mclist = mclist->next) { + unsigned int bit_nr = + sis900_mcast_bitnr(mclist->dmi_addr, revision); + mc_filter[bit_nr >> 4] |= (1 << bit_nr); + } } /* update Multicast Hash Table in Receive Filter */ diff -urN linux-2.5.68-bk1/drivers/net/sk98lin/skge.c linux-2.5.68-bk2/drivers/net/sk98lin/skge.c --- linux-2.5.68-bk1/drivers/net/sk98lin/skge.c 2003-04-19 19:48:52.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/sk98lin/skge.c 2003-04-21 15:53:39.000000000 -0700 @@ -322,8 +322,8 @@ static void SetupRing(SK_AC*, void*, uintptr_t, RXD**, RXD**, RXD**, int*, SK_BOOL); -static void SkGeIsr(int irq, void *dev_id, struct pt_regs *ptregs); -static void SkGeIsrOnePort(int irq, void *dev_id, struct pt_regs *ptregs); +static irqreturn_t SkGeIsr(int irq, void *dev_id, struct pt_regs *ptregs); +static irqreturn_t SkGeIsrOnePort(int irq, void *dev_id, struct pt_regs *ptregs); static int SkGeOpen(struct net_device *dev); static int SkGeClose(struct net_device *dev); static int SkGeXmit(struct sk_buff *skb, struct net_device *dev); @@ -470,6 +470,7 @@ pNet->Up = 0; dev->irq = pdev->irq; + SET_MODULE_OWNER(dev); dev->open = &SkGeOpen; dev->stop = &SkGeClose; dev->hard_start_xmit = &SkGeXmit; @@ -1236,7 +1237,7 @@ * Returns: N/A * */ -static void SkGeIsr(int irq, void *dev_id, struct pt_regs *ptregs) +static irqreturn_t SkGeIsr(int irq, void *dev_id, struct pt_regs *ptregs) { struct net_device *dev = (struct net_device *)dev_id; @@ -1252,7 +1253,7 @@ */ SK_IN32(pAC->IoBase, B0_SP_ISRC, &IntSrc); if (IntSrc == 0) { - return; + return IRQ_NONE; } while (((IntSrc & IRQ_MASK) & ~SPECIAL_IRQS) != 0) { @@ -1380,7 +1381,7 @@ /* IRQ is processed - Enable IRQs again*/ SK_OUT32(pAC->IoBase, B0_IMSK, IRQ_MASK); - return; + return IRQ_HANDLED; } /* SkGeIsr */ @@ -1397,7 +1398,7 @@ * Returns: N/A * */ -static void SkGeIsrOnePort(int irq, void *dev_id, struct pt_regs *ptregs) +static irqreturn_t SkGeIsrOnePort(int irq, void *dev_id, struct pt_regs *ptregs) { struct net_device *dev = (struct net_device *)dev_id; DEV_NET *pNet; @@ -1412,7 +1413,7 @@ */ SK_IN32(pAC->IoBase, B0_SP_ISRC, &IntSrc); if (IntSrc == 0) { - return; + return IRQ_NONE; } while (((IntSrc & IRQ_MASK) & ~SPECIAL_IRQS) != 0) { @@ -1498,7 +1499,7 @@ /* IRQ is processed - Enable IRQs again*/ SK_OUT32(pAC->IoBase, B0_IMSK, IRQ_MASK); - return; + return IRQ_HANDLED; } /* SkGeIsrOnePort */ @@ -1604,8 +1605,6 @@ pAC->MaxPorts++; pNet->Up = 1; - MOD_INC_USE_COUNT; - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, ("SkGeOpen suceeded\n")); @@ -1705,7 +1704,6 @@ pAC->MaxPorts--; pNet->Up = 0; - MOD_DEC_USE_COUNT; return (0); } /* SkGeClose */ diff -urN linux-2.5.68-bk1/drivers/net/smc9194.c linux-2.5.68-bk2/drivers/net/smc9194.c --- linux-2.5.68-bk1/drivers/net/smc9194.c 2003-04-19 19:50:34.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/smc9194.c 2003-04-21 15:53:39.000000000 -0700 @@ -234,7 +234,7 @@ /* . Handles the actual interrupt */ -static void smc_interrupt(int irq, void *, struct pt_regs *regs); +static irqreturn_t smc_interrupt(int irq, void *, struct pt_regs *regs); /* . This is a separate procedure to handle the receipt of a packet, to . leave the interrupt code looking slightly cleaner @@ -1133,7 +1133,7 @@ . ---------------------------------------------------------------------*/ -static void smc_interrupt(int irq, void * dev_id, struct pt_regs * regs) +static irqreturn_t smc_interrupt(int irq, void * dev_id, struct pt_regs * regs) { struct net_device *dev = dev_id; int ioaddr = dev->base_addr; @@ -1146,7 +1146,7 @@ /* state registers */ word saved_bank; word saved_pointer; - + int handled = 0; PRINTK3((CARDNAME": SMC interrupt started \n")); @@ -1171,6 +1171,8 @@ if (!status ) break; + handled = 1; + PRINTK3((KERN_WARNING CARDNAME ": Handling interrupt status %x \n", status )); @@ -1242,7 +1244,7 @@ SMC_SELECT_BANK( saved_bank ); PRINTK3((CARDNAME ": Interrupt done\n")); - return; + return IRQ_RETVAL(handled); } /*------------------------------------------------------------- diff -urN linux-2.5.68-bk1/drivers/net/starfire.c linux-2.5.68-bk2/drivers/net/starfire.c --- linux-2.5.68-bk1/drivers/net/starfire.c 2003-04-19 19:48:56.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/starfire.c 2003-04-21 15:53:39.000000000 -0700 @@ -789,7 +789,7 @@ static void tx_timeout(struct net_device *dev); static void init_ring(struct net_device *dev); static int start_tx(struct sk_buff *skb, struct net_device *dev); -static void intr_handler(int irq, void *dev_instance, struct pt_regs *regs); +static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *regs); static void netdev_error(struct net_device *dev, int intr_status); static int __netdev_rx(struct net_device *dev, int *quota); static void refill_rx_ring(struct net_device *dev); @@ -1491,7 +1491,7 @@ /* The interrupt handler does all of the Rx thread work and cleans up after the Tx thread. */ -static void intr_handler(int irq, void *dev_instance, struct pt_regs *rgs) +static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *rgs) { struct net_device *dev = dev_instance; struct netdev_private *np; @@ -1499,6 +1499,7 @@ int boguscnt = max_interrupt_work; int consumer; int tx_status; + int handled = 0; ioaddr = dev->base_addr; np = dev->priv; @@ -1513,6 +1514,8 @@ if (intr_status == 0 || intr_status == (u32) -1) break; + handled = 1; + if (intr_status & (IntrRxDone | IntrRxEmpty)) netdev_rx(dev, ioaddr); @@ -1591,6 +1594,7 @@ if (debug > 4) printk(KERN_DEBUG "%s: exiting interrupt, status=%#8.8x.\n", dev->name, (int) readl(ioaddr + IntrStatus)); + return IRQ_RETVAL(handled); } diff -urN linux-2.5.68-bk1/drivers/net/sunbmac.c linux-2.5.68-bk2/drivers/net/sunbmac.c --- linux-2.5.68-bk1/drivers/net/sunbmac.c 2003-04-19 19:49:52.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/sunbmac.c 2003-04-21 15:53:39.000000000 -0700 @@ -874,7 +874,7 @@ printk(KERN_NOTICE "%s: Memory squeeze, deferring packet.\n", bp->dev->name); } -static void bigmac_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t bigmac_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct bigmac *bp = (struct bigmac *) dev_id; u32 qec_status, bmac_status; @@ -895,6 +895,8 @@ if (bmac_status & CREG_STAT_RXIRQ) bigmac_rx(bp); + + return IRQ_HANDLED; } static int bigmac_open(struct net_device *dev) diff -urN linux-2.5.68-bk1/drivers/net/sundance.c linux-2.5.68-bk2/drivers/net/sundance.c --- linux-2.5.68-bk1/drivers/net/sundance.c 2003-04-19 19:50:02.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/sundance.c 2003-04-21 15:53:39.000000000 -0700 @@ -495,7 +495,7 @@ static void init_ring(struct net_device *dev); static int start_tx(struct sk_buff *skb, struct net_device *dev); static int reset_tx (struct net_device *dev); -static void intr_handler(int irq, void *dev_instance, struct pt_regs *regs); +static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *regs); static void rx_poll(unsigned long data); static void tx_poll(unsigned long data); static void refill_rx (struct net_device *dev); @@ -951,7 +951,7 @@ { struct netdev_private *np = dev->priv; long ioaddr = dev->base_addr; - long flag; + unsigned long flag; netif_stop_queue(dev); tasklet_disable(&np->tx_tasklet); @@ -1152,7 +1152,7 @@ /* The interrupt handler cleans up after the Tx thread, and schedule a Rx thread work */ -static void intr_handler(int irq, void *dev_instance, struct pt_regs *rgs) +static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *rgs) { struct net_device *dev = (struct net_device *)dev_instance; struct netdev_private *np; @@ -1161,6 +1161,7 @@ int hw_frame_id; int tx_cnt; int tx_status; + int handled = 0; ioaddr = dev->base_addr; np = dev->priv; @@ -1176,6 +1177,8 @@ if (!(intr_status & DEFAULT_INTR)) break; + handled = 1; + if (intr_status & (IntrRxDMADone)) { writew(DEFAULT_INTR & ~(IntrRxDone|IntrRxDMADone), ioaddr + IntrEnable); @@ -1284,7 +1287,7 @@ printk(KERN_DEBUG "%s: exiting interrupt, status=%#4.4x.\n", dev->name, readw(ioaddr + IntrStatus)); writel(5000, ioaddr + DownCounter); - + return IRQ_RETVAL(handled); } static void rx_poll(unsigned long data) diff -urN linux-2.5.68-bk1/drivers/net/sungem.c linux-2.5.68-bk2/drivers/net/sungem.c --- linux-2.5.68-bk1/drivers/net/sungem.c 2003-04-19 19:51:12.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/sungem.c 2003-04-21 15:53:39.000000000 -0700 @@ -773,7 +773,7 @@ gp->dev->name); } -static void gem_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t gem_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = dev_id; struct gem *gp = dev->priv; @@ -792,6 +792,8 @@ out: spin_unlock(&gp->lock); + + return IRQ_HANDLED; } static void gem_tx_timeout(struct net_device *dev) diff -urN linux-2.5.68-bk1/drivers/net/sunhme.c linux-2.5.68-bk2/drivers/net/sunhme.c --- linux-2.5.68-bk1/drivers/net/sunhme.c 2003-04-19 19:49:09.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/sunhme.c 2003-04-21 15:53:39.000000000 -0700 @@ -2101,7 +2101,7 @@ RXD((">")); } -static void happy_meal_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t happy_meal_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = (struct net_device *) dev_id; struct happy_meal *hp = dev->priv; @@ -2135,10 +2135,12 @@ HMD(("done\n")); out: spin_unlock(&hp->happy_lock); + + return IRQ_HANDLED; } #ifdef CONFIG_SBUS -static void quattro_sbus_interrupt(int irq, void *cookie, struct pt_regs *ptregs) +static irqreturn_t quattro_sbus_interrupt(int irq, void *cookie, struct pt_regs *ptregs) { struct quattro *qp = (struct quattro *) cookie; int i; @@ -2183,6 +2185,8 @@ spin_unlock(&hp->happy_lock); } HMD(("done\n")); + + return IRQ_HANDLED; } #endif diff -urN linux-2.5.68-bk1/drivers/net/sunlance.c linux-2.5.68-bk2/drivers/net/sunlance.c --- linux-2.5.68-bk1/drivers/net/sunlance.c 2003-04-19 19:48:57.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/sunlance.c 2003-04-21 15:53:39.000000000 -0700 @@ -812,7 +812,7 @@ spin_unlock(&lp->lock); } -static void lance_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t lance_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = (struct net_device *)dev_id; struct lance_private *lp = (struct lance_private *)dev->priv; @@ -871,6 +871,8 @@ } sbus_writew(LE_C0_INEA, lp->lregs + RDP); + + return IRQ_HANDLED; } /* Build a fake network packet and send it to ourselves. */ diff -urN linux-2.5.68-bk1/drivers/net/sunqe.c linux-2.5.68-bk2/drivers/net/sunqe.c --- linux-2.5.68-bk1/drivers/net/sunqe.c 2003-04-19 19:49:10.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/sunqe.c 2003-04-21 15:53:39.000000000 -0700 @@ -456,7 +456,7 @@ * so we just run through each qe and check to see who is signaling * and thus needs to be serviced. */ -static void qec_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t qec_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct sunqec *qecp = (struct sunqec *) dev_id; u32 qec_status; @@ -495,6 +495,8 @@ qec_status >>= 4; channel++; } + + return IRQ_HANDLED; } static int qe_open(struct net_device *dev) diff -urN linux-2.5.68-bk1/drivers/net/tg3.c linux-2.5.68-bk2/drivers/net/tg3.c --- linux-2.5.68-bk1/drivers/net/tg3.c 2003-04-19 19:49:56.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/tg3.c 2003-04-21 15:53:39.000000000 -0700 @@ -2148,7 +2148,7 @@ return work_exists; } -static void tg3_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t tg3_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = dev_id; struct tg3 *tp = dev->priv; @@ -2187,6 +2187,8 @@ } spin_unlock_irqrestore(&tp->lock, flags); + + return IRQ_HANDLED; } static void tg3_init_rings(struct tg3 *); diff -urN linux-2.5.68-bk1/drivers/net/tlan.c linux-2.5.68-bk2/drivers/net/tlan.c --- linux-2.5.68-bk1/drivers/net/tlan.c 2003-04-19 19:48:51.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/tlan.c 2003-04-21 15:53:39.000000000 -0700 @@ -288,7 +288,7 @@ static int TLan_Init( struct net_device * ); static int TLan_Open( struct net_device *dev ); static int TLan_StartTx( struct sk_buff *, struct net_device *); -static void TLan_HandleInterrupt( int, void *, struct pt_regs *); +static irqreturn_t TLan_HandleInterrupt( int, void *, struct pt_regs *); static int TLan_Close( struct net_device *); static struct net_device_stats *TLan_GetStats( struct net_device *); static void TLan_SetMulticastList( struct net_device *); @@ -1106,7 +1106,7 @@ * **************************************************************/ -static void TLan_HandleInterrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t TLan_HandleInterrupt(int irq, void *dev_id, struct pt_regs *regs) { u32 ack; struct net_device *dev; @@ -1134,6 +1134,7 @@ spin_unlock(&priv->lock); + return IRQ_HANDLED; } /* TLan_HandleInterrupts */ diff -urN linux-2.5.68-bk1/drivers/net/tulip/de2104x.c linux-2.5.68-bk2/drivers/net/tulip/de2104x.c --- linux-2.5.68-bk1/drivers/net/tulip/de2104x.c 2003-04-19 19:50:37.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/tulip/de2104x.c 2003-04-21 15:53:39.000000000 -0700 @@ -492,7 +492,7 @@ de->rx_tail = rx_tail; } -static void de_interrupt (int irq, void *dev_instance, struct pt_regs *regs) +static irqreturn_t de_interrupt (int irq, void *dev_instance, struct pt_regs *regs) { struct net_device *dev = dev_instance; struct de_private *de = dev->priv; @@ -500,7 +500,7 @@ status = dr32(MacStatus); if ((!(status & (IntrOK|IntrErr))) || (status == 0xFFFF)) - return; + return IRQ_NONE; if (netif_msg_intr(de)) printk(KERN_DEBUG "%s: intr, status %08x mode %08x desc %u/%u/%u\n", @@ -532,6 +532,8 @@ printk(KERN_ERR "%s: PCI bus error, status=%08x, PCI status=%04x\n", dev->name, status, pci_status); } + + return IRQ_HANDLED; } static void de_tx (struct de_private *de) diff -urN linux-2.5.68-bk1/drivers/net/tulip/de4x5.c linux-2.5.68-bk2/drivers/net/tulip/de4x5.c --- linux-2.5.68-bk1/drivers/net/tulip/de4x5.c 2003-04-19 19:48:49.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/tulip/de4x5.c 2003-04-21 15:53:39.000000000 -0700 @@ -909,7 +909,7 @@ */ static int de4x5_open(struct net_device *dev); static int de4x5_queue_pkt(struct sk_buff *skb, struct net_device *dev); -static void de4x5_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t de4x5_interrupt(int irq, void *dev_id, struct pt_regs *regs); static int de4x5_close(struct net_device *dev); static struct net_device_stats *de4x5_get_stats(struct net_device *dev); static void de4x5_local_stats(struct net_device *dev, char *buf, int pkt_len); @@ -1349,6 +1349,7 @@ } /* The DE4X5-specific entries in the device structure. */ + SET_MODULE_OWNER(dev); dev->open = &de4x5_open; dev->hard_start_xmit = &de4x5_queue_pkt; dev->stop = &de4x5_close; @@ -1433,8 +1434,6 @@ printk("\tsigr: 0x%08x\n", inl(DE4X5_SIGR)); } - MOD_INC_USE_COUNT; - return status; } @@ -1617,17 +1616,18 @@ ** is high and descriptor status bits cannot be set before the associated ** interrupt is asserted and this routine entered. */ -static void +static irqreturn_t de4x5_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = (struct net_device *)dev_id; struct de4x5_private *lp; s32 imr, omr, sts, limit; u_long iobase; + unsigned int handled = 0; if (dev == NULL) { printk ("de4x5_interrupt(): irq %d for unknown device.\n", irq); - return; + return IRQ_NONE; } lp = (struct de4x5_private *)dev->priv; spin_lock(&lp->lock); @@ -1645,6 +1645,7 @@ outl(sts, DE4X5_STS); /* Reset the board interrupts */ if (!(sts & lp->irq_mask)) break;/* All done */ + handled = 1; if (sts & (STS_RI | STS_RU)) /* Rx interrupt (packet[s] arrived) */ de4x5_rx(dev); @@ -1665,7 +1666,7 @@ printk("%s: Fatal bus error occurred, sts=%#8x, device stopped.\n", dev->name, sts); spin_unlock(&lp->lock); - return; + return IRQ_HANDLED; } } @@ -1681,7 +1682,7 @@ ENABLE_IRQs; spin_unlock(&lp->lock); - return; + return IRQ_RETVAL(handled); } static int @@ -1924,8 +1925,6 @@ de4x5_free_rx_buffs(dev); de4x5_free_tx_buffs(dev); - MOD_DEC_USE_COUNT; - /* Put the adapter to sleep to save power */ yawn(dev, SLEEP); diff -urN linux-2.5.68-bk1/drivers/net/tulip/dmfe.c linux-2.5.68-bk2/drivers/net/tulip/dmfe.c --- linux-2.5.68-bk1/drivers/net/tulip/dmfe.c 2003-04-21 15:53:35.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/tulip/dmfe.c 2003-04-21 15:53:39.000000000 -0700 @@ -298,7 +298,7 @@ static void dmfe_set_filter_mode(struct DEVICE *); static int dmfe_do_ioctl(struct DEVICE *, struct ifreq *, int); static u16 read_srom_word(long ,int); -static void dmfe_interrupt(int , void *, struct pt_regs *); +static irqreturn_t dmfe_interrupt(int , void *, struct pt_regs *); static void dmfe_descriptor_init(struct dmfe_board_info *, unsigned long); static void allocate_rx_buffer(struct dmfe_board_info *); static void update_cr6(u32, unsigned long); @@ -726,7 +726,7 @@ * receive the packet to upper layer, free the transmitted packet */ -static void dmfe_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t dmfe_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct DEVICE *dev = dev_id; struct dmfe_board_info *db = (struct dmfe_board_info *) dev->priv; @@ -737,7 +737,7 @@ if (!dev) { DMFE_DBUG(1, "dmfe_interrupt() without DEVICE arg", 0); - return; + return IRQ_NONE; } spin_lock_irqsave(&db->lock, flags); @@ -747,7 +747,7 @@ outl(db->cr5_data, ioaddr + DCR5); if ( !(db->cr5_data & 0xc1) ) { spin_unlock_irqrestore(&db->lock, flags); - return; + return IRQ_HANDLED; } /* Disable all interrupt in CR7 to solve the interrupt edge problem */ @@ -760,7 +760,7 @@ db->reset_fatal++; db->wait_reset = 1; /* Need to RESET */ spin_unlock_irqrestore(&db->lock, flags); - return; + return IRQ_HANDLED; } /* Received the coming packet */ @@ -786,6 +786,7 @@ outl(db->cr7_data, ioaddr + DCR7); spin_unlock_irqrestore(&db->lock, flags); + return IRQ_HANDLED; } diff -urN linux-2.5.68-bk1/drivers/net/tulip/interrupt.c linux-2.5.68-bk2/drivers/net/tulip/interrupt.c --- linux-2.5.68-bk1/drivers/net/tulip/interrupt.c 2003-04-19 19:48:56.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/tulip/interrupt.c 2003-04-21 15:53:39.000000000 -0700 @@ -291,7 +291,7 @@ #endif } -static inline void phy_interrupt (struct net_device *dev) +static inline unsigned int phy_interrupt (struct net_device *dev) { #ifdef __hppa__ int csr12 = inl(dev->base_addr + CSR12) & 0xff; @@ -307,13 +307,17 @@ spin_unlock(&tp->lock); /* clear irq ack bit */ outl(csr12 & ~0x02, dev->base_addr + CSR12); + + return 1; } #endif + + return 0; } /* The interrupt handler does all of the Rx thread work and cleans up after the Tx thread. */ -void tulip_interrupt(int irq, void *dev_instance, struct pt_regs *regs) +irqreturn_t tulip_interrupt(int irq, void *dev_instance, struct pt_regs *regs) { struct net_device *dev = (struct net_device *)dev_instance; struct tulip_private *tp = (struct tulip_private *)dev->priv; @@ -328,15 +332,16 @@ int maxtx = TX_RING_SIZE; int maxoi = TX_RING_SIZE; unsigned int work_count = tulip_max_interrupt_work; + unsigned int handled = 0; /* Let's see whether the interrupt really is for us */ csr5 = inl(ioaddr + CSR5); - if (tp->flags & HAS_PHY_IRQ) - phy_interrupt (dev); + if (tp->flags & HAS_PHY_IRQ) + handled = phy_interrupt (dev); if ((csr5 & (NormalIntr|AbnormalIntr)) == 0) - return; + return IRQ_RETVAL(handled); tp->nir++; @@ -578,4 +583,5 @@ printk(KERN_DEBUG "%s: exiting interrupt, csr5=%#4.4x.\n", dev->name, inl(ioaddr + CSR5)); + return IRQ_HANDLED; } diff -urN linux-2.5.68-bk1/drivers/net/tulip/tulip.h linux-2.5.68-bk2/drivers/net/tulip/tulip.h --- linux-2.5.68-bk1/drivers/net/tulip/tulip.h 2003-04-19 19:51:08.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/tulip/tulip.h 2003-04-21 15:53:39.000000000 -0700 @@ -423,7 +423,7 @@ /* interrupt.c */ extern unsigned int tulip_max_interrupt_work; extern int tulip_rx_copybreak; -void tulip_interrupt(int irq, void *dev_instance, struct pt_regs *regs); +irqreturn_t tulip_interrupt(int irq, void *dev_instance, struct pt_regs *regs); int tulip_refill_rx(struct net_device *dev); /* media.c */ diff -urN linux-2.5.68-bk1/drivers/net/tulip/winbond-840.c linux-2.5.68-bk2/drivers/net/tulip/winbond-840.c --- linux-2.5.68-bk1/drivers/net/tulip/winbond-840.c 2003-04-19 19:48:54.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/tulip/winbond-840.c 2003-04-21 15:53:39.000000000 -0700 @@ -385,7 +385,7 @@ static int alloc_ringdesc(struct net_device *dev); static void free_ringdesc(struct netdev_private *np); static int start_tx(struct sk_buff *skb, struct net_device *dev); -static void intr_handler(int irq, void *dev_instance, struct pt_regs *regs); +static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *regs); static void netdev_error(struct net_device *dev, int intr_status); static int netdev_rx(struct net_device *dev); static u32 __set_rx_mode(struct net_device *dev); @@ -1165,15 +1165,16 @@ /* The interrupt handler does all of the Rx thread work and cleans up after the Tx thread. */ -static void intr_handler(int irq, void *dev_instance, struct pt_regs *rgs) +static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *rgs) { struct net_device *dev = (struct net_device *)dev_instance; struct netdev_private *np = dev->priv; long ioaddr = dev->base_addr; int work_limit = max_interrupt_work; + int handled = 0; if (!netif_device_present(dev)) - return; + return IRQ_NONE; do { u32 intr_status = readl(ioaddr + IntrStatus); @@ -1187,6 +1188,8 @@ if ((intr_status & (NormalIntr|AbnormalIntr)) == 0) break; + handled = 1; + if (intr_status & (IntrRxDone | RxNoBuf)) netdev_rx(dev); if (intr_status & RxNoBuf) @@ -1222,6 +1225,7 @@ if (debug > 3) printk(KERN_DEBUG "%s: exiting interrupt, status=%#4.4x.\n", dev->name, (int)readl(ioaddr + IntrStatus)); + return IRQ_RETVAL(handled); } /* This routine is logically part of the interrupt handler, but separated diff -urN linux-2.5.68-bk1/drivers/net/tulip/xircom_cb.c linux-2.5.68-bk2/drivers/net/tulip/xircom_cb.c --- linux-2.5.68-bk1/drivers/net/tulip/xircom_cb.c 2003-04-19 19:50:35.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/tulip/xircom_cb.c 2003-04-21 15:53:39.000000000 -0700 @@ -111,7 +111,7 @@ /* Function prototypes */ static int xircom_probe(struct pci_dev *pdev, const struct pci_device_id *id); static void xircom_remove(struct pci_dev *pdev); -static void xircom_interrupt(int irq, void *dev_instance, struct pt_regs *regs); +static irqreturn_t xircom_interrupt(int irq, void *dev_instance, struct pt_regs *regs); static int xircom_start_xmit(struct sk_buff *skb, struct net_device *dev); static int xircom_open(struct net_device *dev); static int xircom_close(struct net_device *dev); @@ -344,7 +344,7 @@ leave("xircom_remove"); } -static void xircom_interrupt(int irq, void *dev_instance, struct pt_regs *regs) +static irqreturn_t xircom_interrupt(int irq, void *dev_instance, struct pt_regs *regs) { struct net_device *dev = (struct net_device *) dev_instance; struct xircom_private *card = (struct xircom_private *) dev->priv; @@ -388,6 +388,7 @@ spin_unlock(&card->lock); leave("xircom_interrupt"); + return IRQ_HANDLED; } static int xircom_start_xmit(struct sk_buff *skb, struct net_device *dev) diff -urN linux-2.5.68-bk1/drivers/net/tulip/xircom_tulip_cb.c linux-2.5.68-bk2/drivers/net/tulip/xircom_tulip_cb.c --- linux-2.5.68-bk1/drivers/net/tulip/xircom_tulip_cb.c 2003-04-19 19:48:52.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/tulip/xircom_tulip_cb.c 2003-04-21 15:53:39.000000000 -0700 @@ -340,7 +340,7 @@ static void xircom_init_ring(struct net_device *dev); static int xircom_start_xmit(struct sk_buff *skb, struct net_device *dev); static int xircom_rx(struct net_device *dev); -static void xircom_interrupt(int irq, void *dev_instance, struct pt_regs *regs); +static irqreturn_t xircom_interrupt(int irq, void *dev_instance, struct pt_regs *regs); static int xircom_close(struct net_device *dev); static struct net_device_stats *xircom_get_stats(struct net_device *dev); static int xircom_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); @@ -355,7 +355,7 @@ const int strict_bits = TxThresh10 | TxStoreForw | TxThreshMask | EnableTxRx | FullDuplexBit; int csr5, csr5_22_20, csr5_19_17, currcsr6, attempts = 200; - long flags; + unsigned long flags; save_flags(flags); cli(); /* mask out the reserved bits that always read 0 on the Xircom cards */ @@ -1054,12 +1054,13 @@ /* The interrupt handler does all of the Rx thread work and cleans up after the Tx thread. */ -static void xircom_interrupt(int irq, void *dev_instance, struct pt_regs *regs) +static irqreturn_t xircom_interrupt(int irq, void *dev_instance, struct pt_regs *regs) { struct net_device *dev = dev_instance; struct xircom_private *tp = dev->priv; long ioaddr = dev->base_addr; int csr5, work_budget = max_interrupt_work; + int handled = 0; spin_lock (&tp->lock); @@ -1078,6 +1079,8 @@ if ((csr5 & (NormalIntr|AbnormalIntr)) == 0) break; + handled = 1; + if (csr5 & (RxIntr | RxNoBuf)) work_budget -= xircom_rx(dev); @@ -1185,6 +1188,7 @@ dev->name, inl(ioaddr + CSR5)); spin_unlock (&tp->lock); + return IRQ_RETVAL(handled); } @@ -1461,7 +1465,7 @@ struct xircom_private *tp = dev->priv; u16 *data = (u16 *)&rq->ifr_data; int phy = tp->phys[0] & 0x1f; - long flags; + unsigned long flags; switch(cmd) { case SIOCETHTOOL: diff -urN linux-2.5.68-bk1/drivers/net/typhoon.c linux-2.5.68-bk2/drivers/net/typhoon.c --- linux-2.5.68-bk1/drivers/net/typhoon.c 2003-04-19 19:50:06.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/typhoon.c 2003-04-21 15:53:39.000000000 -0700 @@ -1790,7 +1790,7 @@ return (done ? 0 : 1); } -static void +static irqreturn_t typhoon_interrupt(int irq, void *dev_instance, struct pt_regs *rgs) { struct net_device *dev = (struct net_device *) dev_instance; @@ -1799,7 +1799,7 @@ intr_status = readl(ioaddr + TYPHOON_REG_INTR_STATUS); if(!intr_status) - return; + return IRQ_NONE; writel(intr_status, ioaddr + TYPHOON_REG_INTR_STATUS); @@ -1811,6 +1811,7 @@ printk(KERN_ERR "%s: Error, poll already scheduled\n", dev->name); } + return IRQ_HANDLED; } static void diff -urN linux-2.5.68-bk1/drivers/net/via-rhine.c linux-2.5.68-bk2/drivers/net/via-rhine.c --- linux-2.5.68-bk1/drivers/net/via-rhine.c 2003-04-19 19:51:13.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/via-rhine.c 2003-04-21 15:53:39.000000000 -0700 @@ -530,7 +530,7 @@ static void via_rhine_timer(unsigned long data); static void via_rhine_tx_timeout(struct net_device *dev); static int via_rhine_start_tx(struct sk_buff *skb, struct net_device *dev); -static void via_rhine_interrupt(int irq, void *dev_instance, struct pt_regs *regs); +static irqreturn_t via_rhine_interrupt(int irq, void *dev_instance, struct pt_regs *regs); static void via_rhine_tx(struct net_device *dev); static void via_rhine_rx(struct net_device *dev); static void via_rhine_error(struct net_device *dev, int intr_status); @@ -1330,16 +1330,19 @@ /* The interrupt handler does all of the Rx thread work and cleans up after the Tx thread. */ -static void via_rhine_interrupt(int irq, void *dev_instance, struct pt_regs *rgs) +static irqreturn_t via_rhine_interrupt(int irq, void *dev_instance, struct pt_regs *rgs) { struct net_device *dev = dev_instance; long ioaddr; u32 intr_status; int boguscnt = max_interrupt_work; + int handled = 0; ioaddr = dev->base_addr; while ((intr_status = get_intr_status(dev))) { + handled = 1; + /* Acknowledge all of the current interrupt sources ASAP. */ if (intr_status & IntrTxDescRace) writeb(0x08, ioaddr + IntrStatus2); @@ -1385,6 +1388,7 @@ if (debug > 3) printk(KERN_DEBUG "%s: exiting interrupt, status=%8.8x.\n", dev->name, readw(ioaddr + IntrStatus)); + return IRQ_RETVAL(handled); } /* This routine is logically part of the interrupt handler, but isolated diff -urN linux-2.5.68-bk1/drivers/net/wireless/airo.c linux-2.5.68-bk2/drivers/net/wireless/airo.c --- linux-2.5.68-bk1/drivers/net/wireless/airo.c 2003-04-19 19:48:51.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/wireless/airo.c 2003-04-21 15:53:39.000000000 -0700 @@ -947,7 +947,7 @@ static int transmit_802_3_packet(struct airo_info*, int len, char *pPacket); static int transmit_802_11_packet(struct airo_info*, int len, char *pPacket); -static void airo_interrupt( int irq, void* dev_id, struct pt_regs +static irqreturn_t airo_interrupt( int irq, void* dev_id, struct pt_regs *regs); static int airo_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); #ifdef WIRELESS_EXT @@ -1837,20 +1837,23 @@ } } -static void airo_interrupt ( int irq, void* dev_id, struct pt_regs *regs) { +static irqreturn_t airo_interrupt ( int irq, void* dev_id, struct pt_regs *regs) { struct net_device *dev = (struct net_device *)dev_id; u16 status; u16 fid; struct airo_info *apriv = dev->priv; u16 savedInterrupts = 0; + int handled = 0; if (!netif_device_present(dev)) - return; + return IRQ_NONE; for (;;) { status = IN4500( apriv, EVSTAT ); if ( !(status & STATUS_INTS) || status == 0xffff ) break; + handled = 1; + if ( status & EV_AWAKE ) { OUT4500( apriv, EVACK, EV_AWAKE ); OUT4500( apriv, EVACK, EV_AWAKE ); @@ -2133,7 +2136,7 @@ OUT4500( apriv, EVINTEN, savedInterrupts ); /* done.. */ - return; + return IRQ_RETVAL(handled); } /* @@ -2494,7 +2497,7 @@ u16 next; int words; int i; - long flags; + unsigned long flags; spin_lock_irqsave(&ai->aux_lock, flags); page = IN4500(ai, SWS0+whichbap); diff -urN linux-2.5.68-bk1/drivers/net/wireless/arlan.c linux-2.5.68-bk2/drivers/net/wireless/arlan.c --- linux-2.5.68-bk1/drivers/net/wireless/arlan.c 2003-04-19 19:50:06.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/wireless/arlan.c 2003-04-21 15:53:39.000000000 -0700 @@ -113,7 +113,7 @@ static int arlan_probe_here(struct net_device *dev, int ioaddr); static int arlan_open(struct net_device *dev); static int arlan_tx(struct sk_buff *skb, struct net_device *dev); -static void arlan_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t arlan_interrupt(int irq, void *dev_id, struct pt_regs *regs); static int arlan_close(struct net_device *dev); static struct net_device_stats * arlan_statistics (struct net_device *dev); @@ -1840,7 +1840,7 @@ return; } -static void arlan_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t arlan_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = dev_id; struct arlan_private *priv = (struct arlan_private *) dev->priv; @@ -1859,7 +1859,7 @@ priv->irq_test_done = 1; ARLAN_DEBUG_EXIT("arlan_interrupt"); - return; + return IRQ_HANDLED; } diff -urN linux-2.5.68-bk1/drivers/net/wireless/arlan.h linux-2.5.68-bk2/drivers/net/wireless/arlan.h --- linux-2.5.68-bk1/drivers/net/wireless/arlan.h 2003-04-19 19:49:57.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/wireless/arlan.h 2003-04-21 15:53:39.000000000 -0700 @@ -376,7 +376,7 @@ volatile int txNew; volatile int txOffset; volatile char ReTransmitRequested; - volatile long long tx_done_delayed; + volatile unsigned long tx_done_delayed; volatile long long registrationLastSeen; volatile char under_command; volatile char under_toggle; diff -urN linux-2.5.68-bk1/drivers/net/wireless/netwave_cs.c linux-2.5.68-bk2/drivers/net/wireless/netwave_cs.c --- linux-2.5.68-bk1/drivers/net/wireless/netwave_cs.c 2003-04-19 19:51:12.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/wireless/netwave_cs.c 2003-04-21 15:53:39.000000000 -0700 @@ -495,6 +495,7 @@ spin_lock_init(&priv->spinlock); /* Netwave specific entries in the device structure */ + SET_MODULE_OWNER(dev); dev->hard_start_xmit = &netwave_start_xmit; dev->set_config = &netwave_config; dev->get_stats = &netwave_get_stats; @@ -1727,7 +1728,6 @@ return -ENODEV; link->open++; - MOD_INC_USE_COUNT; netif_start_queue(dev); netwave_reset(dev); @@ -1746,7 +1746,6 @@ if (link->state & DEV_STALE_CONFIG) mod_timer(&link->release, jiffies + HZ/20); - MOD_DEC_USE_COUNT; return 0; } diff -urN linux-2.5.68-bk1/drivers/net/wireless/orinoco.c linux-2.5.68-bk2/drivers/net/wireless/orinoco.c --- linux-2.5.68-bk1/drivers/net/wireless/orinoco.c 2003-04-19 19:51:21.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/wireless/orinoco.c 2003-04-21 15:53:39.000000000 -0700 @@ -1337,7 +1337,7 @@ /* * Interrupt handler */ -void orinoco_interrupt(int irq, void *dev_id, struct pt_regs *regs) +irqreturn_t orinoco_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct orinoco_private *priv = (struct orinoco_private *) dev_id; hermes_t *hw = &priv->hw; @@ -1353,7 +1353,7 @@ if (orinoco_lock(priv, &flags) != 0) { /* If hw is unavailable */ - return; + return IRQ_NONE; } evstat = hermes_read_regn(hw, EVSTAT); @@ -1403,6 +1403,8 @@ }; orinoco_unlock(priv, &flags); + + return IRQ_HANDLED; } static void __orinoco_ev_tick(struct orinoco_private *priv, hermes_t *hw) diff -urN linux-2.5.68-bk1/drivers/net/wireless/orinoco.h linux-2.5.68-bk2/drivers/net/wireless/orinoco.h --- linux-2.5.68-bk1/drivers/net/wireless/orinoco.h 2003-04-19 19:48:57.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/wireless/orinoco.h 2003-04-21 15:53:39.000000000 -0700 @@ -114,7 +114,7 @@ extern int orinoco_proc_dev_init(struct net_device *dev); extern void orinoco_proc_dev_cleanup(struct net_device *dev); -extern void orinoco_interrupt(int irq, void * dev_id, struct pt_regs *regs); +extern irqreturn_t orinoco_interrupt(int irq, void * dev_id, struct pt_regs *regs); /********************************************************************/ /* Locking and synchronization functions */ diff -urN linux-2.5.68-bk1/drivers/net/wireless/ray_cs.c linux-2.5.68-bk2/drivers/net/wireless/ray_cs.c --- linux-2.5.68-bk1/drivers/net/wireless/ray_cs.c 2003-04-19 19:49:10.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/wireless/ray_cs.c 2003-04-21 15:53:39.000000000 -0700 @@ -423,6 +423,7 @@ dev->set_multicast_list = &set_multicast_list; DEBUG(2,"ray_cs ray_attach calling ether_setup.)\n"); + SET_MODULE_OWNER(dev); ether_setup(dev); dev->init = &ray_dev_init; dev->open = &ray_open; @@ -1724,14 +1725,11 @@ dev_link_t *link; ray_dev_t *local = (ray_dev_t *)dev->priv; - MOD_INC_USE_COUNT; - DEBUG(1, "ray_open('%s')\n", dev->name); for (link = dev_list; link; link = link->next) if (link->priv == dev) break; if (!DEV_OK(link)) { - MOD_DEC_USE_COUNT; return -ENODEV; } @@ -1781,8 +1779,6 @@ * card is closed we can chage its configuration. * Probably also need a COR reset to get sane state - Jean II */ - MOD_DEC_USE_COUNT; - return 0; } /* end ray_dev_close */ /*===========================================================================*/ diff -urN linux-2.5.68-bk1/drivers/net/wireless/wavelan.c linux-2.5.68-bk2/drivers/net/wireless/wavelan.c --- linux-2.5.68-bk1/drivers/net/wireless/wavelan.c 2003-04-19 19:50:48.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/wireless/wavelan.c 2003-04-21 15:53:39.000000000 -0700 @@ -3858,7 +3858,7 @@ * This function is the interrupt handler for the WaveLAN card. This * routine will be called whenever: */ -static void wavelan_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t wavelan_interrupt(int irq, void *dev_id, struct pt_regs *regs) { device *dev; unsigned long ioaddr; @@ -3934,7 +3934,7 @@ dev->name, hasr); #endif spin_unlock (&lp->spinlock); - return; + return IRQ_NONE; } /* Read interrupt data. */ @@ -4004,6 +4004,7 @@ #ifdef DEBUG_INTERRUPT_TRACE printk(KERN_DEBUG "%s: <-wavelan_interrupt()\n", dev->name); #endif + return IRQ_HANDLED; } /*------------------------------------------------------------------*/ diff -urN linux-2.5.68-bk1/drivers/net/wireless/wavelan.p.h linux-2.5.68-bk2/drivers/net/wireless/wavelan.p.h --- linux-2.5.68-bk1/drivers/net/wireless/wavelan.p.h 2003-04-19 19:50:30.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/wireless/wavelan.p.h 2003-04-21 15:53:39.000000000 -0700 @@ -650,7 +650,7 @@ wv_check_ioaddr(u_long, /* ioaddr */ u_char *); /* mac address (read) */ /* ---------------------- INTERRUPT HANDLING ---------------------- */ -static void +static irqreturn_t wavelan_interrupt(int, /* interrupt handler */ void *, struct pt_regs *); diff -urN linux-2.5.68-bk1/drivers/net/wireless/wavelan_cs.c linux-2.5.68-bk2/drivers/net/wireless/wavelan_cs.c --- linux-2.5.68-bk1/drivers/net/wireless/wavelan_cs.c 2003-04-19 19:49:57.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/wireless/wavelan_cs.c 2003-04-21 15:53:39.000000000 -0700 @@ -5020,7 +5020,6 @@ /* Mark the device as used */ link->open++; - MOD_INC_USE_COUNT; #ifdef WAVELAN_ROAMING if(do_roaming) @@ -5065,7 +5064,6 @@ #endif /* WAVELAN_ROAMING */ link->open--; - MOD_DEC_USE_COUNT; /* If the card is still present */ if(netif_running(dev)) @@ -5186,6 +5184,7 @@ ether_setup(dev); /* wavelan NET3 callbacks */ + SET_MODULE_OWNER(dev); dev->open = &wavelan_open; dev->stop = &wavelan_close; dev->hard_start_xmit = &wavelan_packet_xmit; diff -urN linux-2.5.68-bk1/drivers/net/yellowfin.c linux-2.5.68-bk2/drivers/net/yellowfin.c --- linux-2.5.68-bk1/drivers/net/yellowfin.c 2003-04-19 19:49:10.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/yellowfin.c 2003-04-21 15:53:39.000000000 -0700 @@ -406,7 +406,7 @@ static void yellowfin_tx_timeout(struct net_device *dev); static void yellowfin_init_ring(struct net_device *dev); static int yellowfin_start_xmit(struct sk_buff *skb, struct net_device *dev); -static void yellowfin_interrupt(int irq, void *dev_instance, struct pt_regs *regs); +static irqreturn_t yellowfin_interrupt(int irq, void *dev_instance, struct pt_regs *regs); static int yellowfin_rx(struct net_device *dev); static void yellowfin_error(struct net_device *dev, int intr_status); static int yellowfin_close(struct net_device *dev); @@ -942,17 +942,18 @@ /* The interrupt handler does all of the Rx thread work and cleans up after the Tx thread. */ -static void yellowfin_interrupt(int irq, void *dev_instance, struct pt_regs *regs) +static irqreturn_t yellowfin_interrupt(int irq, void *dev_instance, struct pt_regs *regs) { struct net_device *dev = dev_instance; struct yellowfin_private *yp; long ioaddr; int boguscnt = max_interrupt_work; + unsigned int handled = 0; #ifndef final_version /* Can never occur. */ if (dev == NULL) { printk (KERN_ERR "yellowfin_interrupt(): irq %d for unknown device.\n", irq); - return; + return IRQ_NONE; } #endif @@ -970,6 +971,7 @@ if (intr_status == 0) break; + handled = 1; if (intr_status & (IntrRxDone | IntrEarlyRx)) { yellowfin_rx(dev); @@ -1091,7 +1093,7 @@ dev->name, inw(ioaddr + IntrStatus)); spin_unlock (&yp->lock); - return; + return IRQ_RETVAL(handled); } /* This routine is logically part of the interrupt handler, but separated @@ -1371,18 +1373,20 @@ memset(hash_table, 0, sizeof(hash_table)); for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count; i++, mclist = mclist->next) { + unsigned int bit; + /* Due to a bug in the early chip versions, multiple filter slots must be set for each address. */ if (yp->drv_flags & HasMulticastBug) { - set_bit((ether_crc_le(3, mclist->dmi_addr) >> 3) & 0x3f, - hash_table); - set_bit((ether_crc_le(4, mclist->dmi_addr) >> 3) & 0x3f, - hash_table); - set_bit((ether_crc_le(5, mclist->dmi_addr) >> 3) & 0x3f, - hash_table); + bit = (ether_crc_le(3, mclist->dmi_addr) >> 3) & 0x3f; + hash_table[bit >> 4] |= (1 << bit); + bit = (ether_crc_le(4, mclist->dmi_addr) >> 3) & 0x3f; + hash_table[bit >> 4] |= (1 << bit); + bit = (ether_crc_le(5, mclist->dmi_addr) >> 3) & 0x3f; + hash_table[bit >> 4] |= (1 << bit); } - set_bit((ether_crc_le(6, mclist->dmi_addr) >> 3) & 0x3f, - hash_table); + bit = (ether_crc_le(6, mclist->dmi_addr) >> 3) & 0x3f; + hash_table[bit >> 4] |= (1 << bit); } /* Copy the hash table to the chip. */ for (i = 0; i < 4; i++) diff -urN linux-2.5.68-bk1/drivers/net/znet.c linux-2.5.68-bk2/drivers/net/znet.c --- linux-2.5.68-bk1/drivers/net/znet.c 2003-04-19 19:48:46.000000000 -0700 +++ linux-2.5.68-bk2/drivers/net/znet.c 2003-04-21 15:53:39.000000000 -0700 @@ -159,7 +159,7 @@ static int znet_open(struct net_device *dev); static int znet_send_packet(struct sk_buff *skb, struct net_device *dev); -static void znet_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t znet_interrupt(int irq, void *dev_id, struct pt_regs *regs); static void znet_rx(struct net_device *dev); static int znet_close(struct net_device *dev); static struct net_device_stats *net_get_stats(struct net_device *dev); @@ -604,16 +604,17 @@ } /* The ZNET interrupt handler. */ -static void znet_interrupt(int irq, void *dev_id, struct pt_regs * regs) +static irqreturn_t znet_interrupt(int irq, void *dev_id, struct pt_regs * regs) { struct net_device *dev = dev_id; struct znet_private *znet = dev->priv; int ioaddr; int boguscnt = 20; + int handled = 0; if (dev == NULL) { printk(KERN_WARNING "znet_interrupt(): IRQ %d for unknown device.\n", irq); - return; + return IRQ_NONE; } spin_lock (&znet->lock); @@ -637,6 +638,8 @@ if ((status & SR0_INTERRUPT) == 0) break; + handled = 1; + if ((status & SR0_EVENT_MASK) == SR0_TRANSMIT_DONE || (status & SR0_EVENT_MASK) == SR0_RETRANSMIT_DONE || (status & SR0_EVENT_MASK) == SR0_TRANSMIT_NO_CRC_DONE) { @@ -682,7 +685,7 @@ spin_unlock (&znet->lock); - return; + return IRQ_RETVAL(handled); } static void znet_rx(struct net_device *dev) diff -urN linux-2.5.68-bk1/drivers/parport/parport_serial.c linux-2.5.68-bk2/drivers/parport/parport_serial.c --- linux-2.5.68-bk1/drivers/parport/parport_serial.c 2003-04-19 19:50:48.000000000 -0700 +++ linux-2.5.68-bk2/drivers/parport/parport_serial.c 2003-04-21 15:53:39.000000000 -0700 @@ -26,6 +26,7 @@ #include #include #include +#include #include @@ -150,12 +151,12 @@ static int __devinit siig10x_init_fn(struct pci_dev *dev, struct pci_board_no_ids *board, int enable) { - return pci_siig10x_fn(dev, NULL, enable); + return pci_siig10x_fn(dev, enable); } static int __devinit siig20x_init_fn(struct pci_dev *dev, struct pci_board_no_ids *board, int enable) { - return pci_siig20x_fn(dev, NULL, enable); + return pci_siig20x_fn(dev, enable); } static struct pci_board_no_ids pci_boards[] __devinitdata = { diff -urN linux-2.5.68-bk1/drivers/pcmcia/i82092.c linux-2.5.68-bk2/drivers/pcmcia/i82092.c --- linux-2.5.68-bk1/drivers/pcmcia/i82092.c 2003-04-19 19:51:21.000000000 -0700 +++ linux-2.5.68-bk2/drivers/pcmcia/i82092.c 2003-04-21 15:53:39.000000000 -0700 @@ -219,6 +219,7 @@ return val; } +#if 0 static unsigned short indirect_read16(int socket, unsigned short reg) { unsigned short int port; @@ -235,6 +236,7 @@ spin_unlock_irqrestore(&port_lock,flags); return tmp; } +#endif static void indirect_write(int socket, unsigned short reg, unsigned char value) { @@ -334,11 +336,12 @@ static DECLARE_WORK(i82092aa_task, i82092aa_bh, NULL); -static void i82092aa_interrupt(int irq, void *dev, struct pt_regs *regs) +static irqreturn_t i82092aa_interrupt(int irq, void *dev, struct pt_regs *regs) { int i; int loopcount = 0; - + int handled = 0; + unsigned int events, active=0; /* enter("i82092aa_interrupt");*/ @@ -362,6 +365,7 @@ if ((csc==0) || /* no events on this socket */ (sockets[i].handler==NULL)) /* no way to handle events */ continue; + handled = 1; events = 0; if (csc & I365_CSC_DETECT) { @@ -390,7 +394,7 @@ break; } - + return IRQ_RETVAL(handled); /* leave("i82092aa_interrupt");*/ } diff -urN linux-2.5.68-bk1/drivers/pcmcia/i82092aa.h linux-2.5.68-bk2/drivers/pcmcia/i82092aa.h --- linux-2.5.68-bk1/drivers/pcmcia/i82092aa.h 2003-04-19 19:48:51.000000000 -0700 +++ linux-2.5.68-bk2/drivers/pcmcia/i82092aa.h 2003-04-21 15:53:39.000000000 -0700 @@ -1,6 +1,8 @@ #ifndef _INCLUDE_GUARD_i82092aa_H_ #define _INCLUDE_GUARD_i82092aa_H_ +#include + /* $Id: i82092aa.h,v 1.1.1.1 2001/09/19 14:53:15 dwmw2 Exp $ */ /* Debuging defines */ @@ -21,7 +23,7 @@ static int i82092aa_pci_probe(struct pci_dev *dev, const struct pci_device_id *id); static void i82092aa_pci_remove(struct pci_dev *dev); static int card_present(int socketno); -static void i82092aa_interrupt(int irq, void *dev, struct pt_regs *regs); +static irqreturn_t i82092aa_interrupt(int irq, void *dev, struct pt_regs *regs); diff -urN linux-2.5.68-bk1/drivers/pcmcia/i82365.c linux-2.5.68-bk2/drivers/pcmcia/i82365.c --- linux-2.5.68-bk1/drivers/pcmcia/i82365.c 2003-04-19 19:50:45.000000000 -0700 +++ linux-2.5.68-bk2/drivers/pcmcia/i82365.c 2003-04-21 15:53:39.000000000 -0700 @@ -78,7 +78,7 @@ #define DEBUG(n, args...) do { } while (0) #endif -static void i365_count_irq(int, void *, struct pt_regs *); +static irqreturn_t i365_count_irq(int, void *, struct pt_regs *); static inline int _check_irq(int irq, int flags) { if (request_irq(irq, i365_count_irq, flags, "x", i365_count_irq) != 0) @@ -535,11 +535,12 @@ static volatile u_int irq_hits; static u_short irq_sock; -static void i365_count_irq(int irq, void *dev, struct pt_regs *regs) +static irqreturn_t i365_count_irq(int irq, void *dev, struct pt_regs *regs) { i365_get(irq_sock, I365_CSC); irq_hits++; DEBUG(2, "-> hit on irq %d\n", irq); + return IRQ_HANDLED; } static u_int __init test_irq(u_short sock, int irq) @@ -627,11 +628,6 @@ return ns/cycle_time; } -static int to_ns(int cycles) -{ - return cycle_time*cycles; -} - /*====================================================================*/ #ifdef CONFIG_ISA @@ -939,7 +935,7 @@ static unsigned long last_detect_jiffies; -static void pcic_interrupt(int irq, void *dev, +static irqreturn_t pcic_interrupt(int irq, void *dev, struct pt_regs *regs) { int i, j, csc; @@ -947,7 +943,8 @@ #ifdef CONFIG_ISA u_long flags = 0; #endif - + int handled = 0; + DEBUG(4, "i82365: pcic_interrupt(%d)\n", irq); for (j = 0; j < 20; j++) { @@ -956,6 +953,7 @@ if ((socket[i].cs_irq != irq) && (socket[i].cap.pci_irq != irq)) continue; + handled = 1; ISA_LOCK(i, flags); csc = i365_get(i, I365_CSC); if ((csc == 0) || (!socket[i].handler) || @@ -1002,6 +1000,7 @@ printk(KERN_NOTICE "i82365: infinite loop in interrupt handler\n"); DEBUG(4, "i82365: interrupt done\n"); + return IRQ_RETVAL(handled); } /* pcic_interrupt */ static void pcic_interrupt_wrapper(u_long data) diff -urN linux-2.5.68-bk1/drivers/pcmcia/tcic.c linux-2.5.68-bk2/drivers/pcmcia/tcic.c --- linux-2.5.68-bk1/drivers/pcmcia/tcic.c 2003-04-19 19:49:56.000000000 -0700 +++ linux-2.5.68-bk2/drivers/pcmcia/tcic.c 2003-04-21 15:53:39.000000000 -0700 @@ -111,7 +111,7 @@ /*====================================================================*/ -static void tcic_interrupt(int irq, void *dev, struct pt_regs *regs); +static irqreturn_t tcic_interrupt(int irq, void *dev, struct pt_regs *regs); static void tcic_timer(u_long data); static struct pccard_operations tcic_operations; @@ -229,9 +229,10 @@ static volatile u_int irq_hits; -static void __init tcic_irq_count(int irq, void *dev, struct pt_regs *regs) +static irqreturn_t __init tcic_irq_count(int irq, void *dev, struct pt_regs *regs) { irq_hits++; + return IRQ_HANDLED; } static u_int __init try_irq(int irq) @@ -565,7 +566,7 @@ static DECLARE_WORK(tcic_task, tcic_bh, NULL); -static void tcic_interrupt(int irq, void *dev, struct pt_regs *regs) +static irqreturn_t tcic_interrupt(int irq, void *dev, struct pt_regs *regs) { int i, quick = 0; u_char latch, sstat; @@ -575,7 +576,7 @@ if (active) { printk(KERN_NOTICE "tcic: reentered interrupt handler!\n"); - return; + return IRQ_NONE; } else active = 1; @@ -620,7 +621,7 @@ active = 0; DEBUG(2, "tcic: interrupt done\n"); - + return IRQ_HANDLED; } /* tcic_interrupt */ static void tcic_timer(u_long data) diff -urN linux-2.5.68-bk1/drivers/sbus/char/aurora.c linux-2.5.68-bk2/drivers/sbus/char/aurora.c --- linux-2.5.68-bk1/drivers/sbus/char/aurora.c 2003-04-19 19:48:52.000000000 -0700 +++ linux-2.5.68-bk2/drivers/sbus/char/aurora.c 2003-04-21 15:53:39.000000000 -0700 @@ -265,7 +265,7 @@ return 0; } -static void aurora_interrupt(int irq, void * dev_id, struct pt_regs * regs); +static irqreturn_t aurora_interrupt(int irq, void * dev_id, struct pt_regs * regs); /* Main probing routine, also sets irq. */ static int aurora_probe(void) @@ -701,7 +701,7 @@ } /* The main interrupt processing routine */ -static void aurora_interrupt(int irq, void * dev_id, struct pt_regs * regs) +static irqreturn_t aurora_interrupt(int irq, void * dev_id, struct pt_regs * regs) { unsigned char status; unsigned char ack,chip/*,chip_id*/; @@ -719,7 +719,7 @@ /* old bp = IRQ_to_board[irq&0x0f];*/ if (!bp || !(bp->flags & AURORA_BOARD_ACTIVE)) - return; + return IRQ_NONE; /* The while() below takes care of this. status = sbus_readb(&bp->r[0]->r[CD180_SRSR]); @@ -727,7 +727,7 @@ printk("mumu: %02x\n", status); #endif if (!(status&SRSR_ANYINT)) - return; * Nobody has anything to say, so exit * + return IRQ_NONE; * Nobody has anything to say, so exit * */ while ((loop++ < 48) && (status = sbus_readb(&bp->r[0]->r[CD180_SRSR]) & SRSR_ANYINT)){ @@ -875,6 +875,8 @@ } } #endif + + return IRQ_HANDLED; } #ifdef AURORA_INT_DEBUG diff -urN linux-2.5.68-bk1/drivers/sbus/char/bbc_i2c.c linux-2.5.68-bk2/drivers/sbus/char/bbc_i2c.c --- linux-2.5.68-bk1/drivers/sbus/char/bbc_i2c.c 2003-04-19 19:50:35.000000000 -0700 +++ linux-2.5.68-bk2/drivers/sbus/char/bbc_i2c.c 2003-04-21 15:53:39.000000000 -0700 @@ -331,7 +331,7 @@ EXPORT_SYMBOL(bbc_i2c_write_buf); EXPORT_SYMBOL(bbc_i2c_read_buf); -static void bbc_i2c_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t bbc_i2c_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct bbc_i2c_bus *bp = dev_id; @@ -341,6 +341,8 @@ if (bp->waiting && !(readb(bp->i2c_control_regs + 0x0) & I2C_PCF_PIN)) wake_up(&bp->wq); + + return IRQ_HANDLED; } static void __init reset_one_i2c(struct bbc_i2c_bus *bp) diff -urN linux-2.5.68-bk1/drivers/sbus/char/cpwatchdog.c linux-2.5.68-bk2/drivers/sbus/char/cpwatchdog.c --- linux-2.5.68-bk1/drivers/sbus/char/cpwatchdog.c 2003-04-19 19:51:08.000000000 -0700 +++ linux-2.5.68-bk2/drivers/sbus/char/cpwatchdog.c 2003-04-21 15:53:39.000000000 -0700 @@ -201,7 +201,7 @@ #ifdef WD_DEBUG static void wd_dumpregs(void); #endif -static void wd_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t wd_interrupt(int irq, void *dev_id, struct pt_regs *regs); static void wd_toggleintr(struct wd_timer* pTimer, int enable); static void wd_pingtimer(struct wd_timer* pTimer); static void wd_starttimer(struct wd_timer* pTimer); @@ -444,7 +444,7 @@ #endif /* ifdef WD_DEBUG */ } -static void wd_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t wd_interrupt(int irq, void *dev_id, struct pt_regs *regs) { /* Only WD0 will interrupt-- others are NMI and we won't * see them here.... @@ -456,7 +456,7 @@ wd_dev.watchdog[WD0_ID].runstatus |= WD_STAT_SVCD; } spin_unlock_irq(&wd_dev.lock); - return; + return IRQ_HANDLED; } static struct file_operations wd_fops = { diff -urN linux-2.5.68-bk1/drivers/sbus/char/uctrl.c linux-2.5.68-bk2/drivers/sbus/char/uctrl.c --- linux-2.5.68-bk1/drivers/sbus/char/uctrl.c 2003-04-19 19:51:14.000000000 -0700 +++ linux-2.5.68-bk2/drivers/sbus/char/uctrl.c 2003-04-21 15:53:39.000000000 -0700 @@ -217,10 +217,11 @@ return 0; } -void uctrl_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t uctrl_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct uctrl_driver *driver = (struct uctrl_driver *)dev_id; printk("in uctrl_interrupt\n"); + return IRQ_HANDLED; } static struct file_operations uctrl_fops = { diff -urN linux-2.5.68-bk1/drivers/scsi/aic7xxx_old.c linux-2.5.68-bk2/drivers/scsi/aic7xxx_old.c --- linux-2.5.68-bk1/drivers/scsi/aic7xxx_old.c 2003-04-19 19:49:14.000000000 -0700 +++ linux-2.5.68-bk2/drivers/scsi/aic7xxx_old.c 2003-04-21 15:53:39.000000000 -0700 @@ -6484,7 +6484,7 @@ * above. Please, children, do not try this at home, and if you ever see * anything like it, please inform the Gross Hack Police immediately *-F*************************************************************************/ -static void +static irqreturn_t do_aic7xxx_isr(int irq, void *dev_id, struct pt_regs *regs) { unsigned long cpu_flags; @@ -6492,7 +6492,7 @@ p = (struct aic7xxx_host *)dev_id; if(!p) - return; + return IRQ_NONE; spin_lock_irqsave(p->host->host_lock, cpu_flags); p->flags |= AHC_IN_ISR; do @@ -6503,6 +6503,8 @@ aic7xxx_run_waiting_queues(p); p->flags &= ~AHC_IN_ISR; spin_unlock_irqrestore(p->host->host_lock, cpu_flags); + + return IRQ_HANDLED; } /*+F************************************************************************* diff -urN linux-2.5.68-bk1/drivers/scsi/esp.c linux-2.5.68-bk2/drivers/scsi/esp.c --- linux-2.5.68-bk1/drivers/scsi/esp.c 2003-04-19 19:51:13.000000000 -0700 +++ linux-2.5.68-bk2/drivers/scsi/esp.c 2003-04-21 15:53:39.000000000 -0700 @@ -186,7 +186,7 @@ static int esps_running = 0; /* Forward declarations. */ -static void esp_intr(int irq, void *dev_id, struct pt_regs *pregs); +static irqreturn_t esp_intr(int irq, void *dev_id, struct pt_regs *pregs); /* Debugging routines */ struct esp_cmdstrings { @@ -4321,7 +4321,7 @@ } /* Service only the ESP described by dev_id. */ -static void esp_intr(int irq, void *dev_id, struct pt_regs *pregs) +static irqreturn_t esp_intr(int irq, void *dev_id, struct pt_regs *pregs) { struct esp *esp = dev_id; unsigned long flags; @@ -4337,6 +4337,8 @@ ESP_INTSON(esp->dregs); } spin_unlock_irqrestore(esp->ehost->host_lock, flags); + + return IRQ_HANDLED; } static int esp_slave_alloc(Scsi_Device *SDptr) diff -urN linux-2.5.68-bk1/drivers/scsi/qlogicfc.c linux-2.5.68-bk2/drivers/scsi/qlogicfc.c --- linux-2.5.68-bk1/drivers/scsi/qlogicfc.c 2003-04-19 19:50:30.000000000 -0700 +++ linux-2.5.68-bk2/drivers/scsi/qlogicfc.c 2003-04-21 15:53:39.000000000 -0700 @@ -660,7 +660,7 @@ static int isp2x00_mbox_command(struct Scsi_Host *, u_short[]); static int isp2x00_return_status(Scsi_Cmnd *, struct Status_Entry *); static void isp2x00_intr_handler(int, void *, struct pt_regs *); -static void do_isp2x00_intr_handler(int, void *, struct pt_regs *); +static irqreturn_t do_isp2x00_intr_handler(int, void *, struct pt_regs *); static int isp2x00_make_portdb(struct Scsi_Host *); #if ISP2x00_FABRIC @@ -1421,7 +1421,7 @@ #define ASYNC_EVENT_INTERRUPT 0x01 -void do_isp2x00_intr_handler(int irq, void *dev_id, struct pt_regs *regs) +irqreturn_t do_isp2x00_intr_handler(int irq, void *dev_id, struct pt_regs *regs) { struct Scsi_Host *host = dev_id; unsigned long flags; @@ -1429,6 +1429,8 @@ spin_lock_irqsave(host->host_lock, flags); isp2x00_intr_handler(irq, dev_id, regs); spin_unlock_irqrestore(host->host_lock, flags); + + return IRQ_HANDLED; } void isp2x00_intr_handler(int irq, void *dev_id, struct pt_regs *regs) diff -urN linux-2.5.68-bk1/drivers/scsi/qlogicisp.c linux-2.5.68-bk2/drivers/scsi/qlogicisp.c --- linux-2.5.68-bk1/drivers/scsi/qlogicisp.c 2003-04-19 19:51:13.000000000 -0700 +++ linux-2.5.68-bk2/drivers/scsi/qlogicisp.c 2003-04-21 15:53:39.000000000 -0700 @@ -606,7 +606,7 @@ static int isp1020_mbox_command(struct Scsi_Host *, u_short []); static int isp1020_return_status(struct Status_Entry *); static void isp1020_intr_handler(int, void *, struct pt_regs *); -static void do_isp1020_intr_handler(int, void *, struct pt_regs *); +static irqreturn_t do_isp1020_intr_handler(int, void *, struct pt_regs *); #if USE_NVRAM_DEFAULTS static int isp1020_get_defaults(struct Scsi_Host *); @@ -965,7 +965,7 @@ #define ASYNC_EVENT_INTERRUPT 0x01 -void do_isp1020_intr_handler(int irq, void *dev_id, struct pt_regs *regs) +irqreturn_t do_isp1020_intr_handler(int irq, void *dev_id, struct pt_regs *regs) { struct Scsi_Host *host = dev_id; unsigned long flags; @@ -973,6 +973,8 @@ spin_lock_irqsave(host->host_lock, flags); isp1020_intr_handler(irq, dev_id, regs); spin_unlock_irqrestore(host->host_lock, flags); + + return IRQ_HANDLED; } void isp1020_intr_handler(int irq, void *dev_id, struct pt_regs *regs) diff -urN linux-2.5.68-bk1/drivers/scsi/qlogicpti.c linux-2.5.68-bk2/drivers/scsi/qlogicpti.c --- linux-2.5.68-bk1/drivers/scsi/qlogicpti.c 2003-04-19 19:50:07.000000000 -0700 +++ linux-2.5.68-bk2/drivers/scsi/qlogicpti.c 2003-04-21 15:53:39.000000000 -0700 @@ -644,7 +644,7 @@ return 0; } -static void qpti_intr(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t qpti_intr(int irq, void *dev_id, struct pt_regs *regs); static void __init qpti_chain_add(struct qlogicpti *qpti) { @@ -1441,7 +1441,7 @@ return done_queue; } -static void qpti_intr(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t qpti_intr(int irq, void *dev_id, struct pt_regs *regs) { struct qlogicpti *qpti = dev_id; unsigned long flags; @@ -1463,6 +1463,8 @@ spin_unlock(qpti->qhost->host_lock); } local_irq_restore(flags); + + return IRQ_HANDLED; } static int qlogicpti_abort(Scsi_Cmnd *Cmnd) diff -urN linux-2.5.68-bk1/drivers/scsi/sym53c8xx_2/sym_glue.c linux-2.5.68-bk2/drivers/scsi/sym53c8xx_2/sym_glue.c --- linux-2.5.68-bk1/drivers/scsi/sym53c8xx_2/sym_glue.c 2003-04-19 19:51:23.000000000 -0700 +++ linux-2.5.68-bk2/drivers/scsi/sym53c8xx_2/sym_glue.c 2003-04-21 15:53:39.000000000 -0700 @@ -1009,7 +1009,7 @@ /* * Linux entry point of the interrupt handler. */ -static void sym53c8xx_intr(int irq, void *dev_id, struct pt_regs * regs) +static irqreturn_t sym53c8xx_intr(int irq, void *dev_id, struct pt_regs * regs) { unsigned long flags; hcb_p np = (hcb_p) dev_id; @@ -1029,6 +1029,8 @@ SYM_UNLOCK_HCB(np, flags); if (DEBUG_FLAGS & DEBUG_TINY) printf_debug ("]\n"); + + return IRQ_HANDLED; } /* diff -urN linux-2.5.68-bk1/drivers/serial/8250_pci.c linux-2.5.68-bk2/drivers/serial/8250_pci.c --- linux-2.5.68-bk1/drivers/serial/8250_pci.c 2003-04-19 19:50:34.000000000 -0700 +++ linux-2.5.68-bk2/drivers/serial/8250_pci.c 2003-04-21 15:53:39.000000000 -0700 @@ -23,6 +23,7 @@ #include #include #include +#include #include #include diff -urN linux-2.5.68-bk1/drivers/serial/sunsab.c linux-2.5.68-bk2/drivers/serial/sunsab.c --- linux-2.5.68-bk1/drivers/serial/sunsab.c 2003-04-19 19:49:10.000000000 -0700 +++ linux-2.5.68-bk2/drivers/serial/sunsab.c 2003-04-21 15:53:39.000000000 -0700 @@ -290,7 +290,7 @@ wake_up_interruptible(&up->port.info->delta_msr_wait); } -static void sunsab_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t sunsab_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct uart_sunsab_port *up = dev_id; union sab82532_irq_status status; @@ -339,6 +339,8 @@ } spin_unlock_irqrestore(&up->port.lock, flags); + + return IRQ_HANDLED; } /* port->lock is not held. */ diff -urN linux-2.5.68-bk1/drivers/serial/sunsu.c linux-2.5.68-bk2/drivers/serial/sunsu.c --- linux-2.5.68-bk1/drivers/serial/sunsu.c 2003-04-19 19:48:54.000000000 -0700 +++ linux-2.5.68-bk2/drivers/serial/sunsu.c 2003-04-21 15:53:39.000000000 -0700 @@ -458,7 +458,7 @@ wake_up_interruptible(&up->port.info->delta_msr_wait); } -static void sunsu_serial_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t sunsu_serial_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct uart_sunsu_port *up = dev_id; unsigned long flags; @@ -476,6 +476,8 @@ } while (!(serial_in(up, UART_IIR) & UART_IIR_NO_INT)); spin_unlock_irqrestore(&up->port.lock, flags); + + return IRQ_HANDLED; } /* Separate interrupt handling path for keyboard/mouse ports. */ @@ -548,7 +550,7 @@ } while (serial_in(up, UART_LSR) & UART_LSR_DR); } -static void sunsu_kbd_ms_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t sunsu_kbd_ms_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct uart_sunsu_port *up = dev_id; @@ -559,6 +561,8 @@ receive_kbd_ms_chars(up, regs, (status & UART_LSR_BI) != 0); } + + return IRQ_HANDLED; } static unsigned int sunsu_tx_empty(struct uart_port *port) diff -urN linux-2.5.68-bk1/drivers/serial/sunzilog.c linux-2.5.68-bk2/drivers/serial/sunzilog.c --- linux-2.5.68-bk1/drivers/serial/sunzilog.c 2003-04-19 19:51:13.000000000 -0700 +++ linux-2.5.68-bk2/drivers/serial/sunzilog.c 2003-04-21 15:53:39.000000000 -0700 @@ -539,7 +539,7 @@ ZS_WSYNC(channel); } -static void sunzilog_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t sunzilog_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct uart_sunzilog_port *up = dev_id; @@ -587,6 +587,8 @@ up = up->next; } + + return IRQ_HANDLED; } /* A convenient way to quickly get R0 status. The caller must _not_ hold the diff -urN linux-2.5.68-bk1/drivers/video/amifb.c linux-2.5.68-bk2/drivers/video/amifb.c --- linux-2.5.68-bk1/drivers/video/amifb.c 2003-04-19 19:50:44.000000000 -0700 +++ linux-2.5.68-bk2/drivers/video/amifb.c 2003-04-21 15:53:39.000000000 -0700 @@ -1143,7 +1143,7 @@ */ static int flash_cursor(void); -static void amifb_interrupt(int irq, void *dev_id, struct pt_regs *fp); +static irqreturn_t amifb_interrupt(int irq, void *dev_id, struct pt_regs *fp); static u_long chipalloc(u_long size); static void chipfree(void); @@ -2504,7 +2504,7 @@ * VBlank Display Interrupt */ -static void amifb_interrupt(int irq, void *dev_id, struct pt_regs *fp) +static irqreturn_t amifb_interrupt(int irq, void *dev_id, struct pt_regs *fp) { if (do_vmode_pan || do_vmode_full) ami_update_display(); @@ -2534,6 +2534,7 @@ ami_reinit_copper(); do_vmode_full = 0; } + return IRQ_HANDLED; } /* --------------------------- Hardware routines --------------------------- */ diff -urN linux-2.5.68-bk1/drivers/video/atafb.c linux-2.5.68-bk2/drivers/video/atafb.c --- linux-2.5.68-bk1/drivers/video/atafb.c 2003-04-19 19:48:51.000000000 -0700 +++ linux-2.5.68-bk2/drivers/video/atafb.c 2003-04-21 15:53:39.000000000 -0700 @@ -1522,7 +1522,7 @@ } -static void falcon_vbl_switcher( int irq, void *dummy, struct pt_regs *fp ) +static irqreturn_t falcon_vbl_switcher( int irq, void *dummy, struct pt_regs *fp ) { struct falcon_hw *hw = &f_new_mode; @@ -1579,6 +1579,7 @@ videl.xoffset = current_par.hw.falcon.xoffset; shifter_f030.off_next = current_par.hw.falcon.line_offset; } + return IRQ_HANDLED; } diff -urN linux-2.5.68-bk1/drivers/video/console/fbcon.c linux-2.5.68-bk2/drivers/video/console/fbcon.c --- linux-2.5.68-bk1/drivers/video/console/fbcon.c 2003-04-19 19:50:10.000000000 -0700 +++ linux-2.5.68-bk2/drivers/video/console/fbcon.c 2003-04-21 15:53:39.000000000 -0700 @@ -138,7 +138,6 @@ #define DEFAULT_CURSOR_BLINK_RATE (20) static int vbl_cursor_cnt; -static int cursor_blink_rate; #define divides(a, b) ((!(a) || (b)%(a)) ? 0 : 1) @@ -185,7 +184,7 @@ */ static int vbl_detected; -static void fb_vbl_detect(int irq, void *dummy, struct pt_regs *fp) +static irqreturn_t fb_vbl_detect(int irq, void *dummy, struct pt_regs *fp) { vbl_detected++; } @@ -202,7 +201,9 @@ info->fbops->fb_cursor(info, &info->cursor); } -static void fb_vbl_handler(int irq, void *dev_id, struct pt_regs *fp) +#if (defined(__arm__) && defined(IRQ_VSYNCPULSE)) || defined(CONFIG_ATARI) || defined(CONFIG_MAC) +static int cursor_blink_rate; +static irqreturn_t fb_vbl_handler(int irq, void *dev_id, struct pt_regs *fp) { struct fb_info *info = dev_id; @@ -210,7 +211,9 @@ schedule_work(&info->queue); vbl_cursor_cnt = cursor_blink_rate; } + return IRQ_HANDLED; } +#endif static void cursor_timer_handler(unsigned long dev_addr); @@ -527,8 +530,9 @@ struct fb_info *info; struct vc_data *vc; static int done = 0; - int irqres = 1; + int irqres; + irqres = 1; /* * If num_registered_fb is zero, this is a call for the dummy part. * The frame buffer devices weren't initialized yet. diff -urN linux-2.5.68-bk1/drivers/video/pvr2fb.c linux-2.5.68-bk2/drivers/video/pvr2fb.c --- linux-2.5.68-bk1/drivers/video/pvr2fb.c 2003-04-19 19:48:51.000000000 -0700 +++ linux-2.5.68-bk2/drivers/video/pvr2fb.c 2003-04-21 15:53:39.000000000 -0700 @@ -246,7 +246,7 @@ static void pvr2_update_display(void); static void pvr2_init_display(void); static void pvr2_do_blank(void); -static void pvr2fb_interrupt(int irq, void *dev_id, struct pt_regs *fp); +static irqreturn_t pvr2fb_interrupt(int irq, void *dev_id, struct pt_regs *fp); static int pvr2_init_cable(void); static int pvr2_get_param(const struct pvr2_params *p, const char *s, int val, int size); @@ -939,7 +939,7 @@ is_blanked = do_blank > 0 ? do_blank : 0; } -static void pvr2fb_interrupt(int irq, void *dev_id, struct pt_regs *fp) +static irqreturn_t pvr2fb_interrupt(int irq, void *dev_id, struct pt_regs *fp) { if (do_vmode_pan || do_vmode_full) pvr2_update_display(); @@ -958,6 +958,7 @@ if (do_vmode_full) { do_vmode_full = 0; } + return IRQ_HANDLED; } /* diff -urN linux-2.5.68-bk1/drivers/video/sa1100fb.c linux-2.5.68-bk2/drivers/video/sa1100fb.c --- linux-2.5.68-bk1/drivers/video/sa1100fb.c 2003-04-19 19:48:56.000000000 -0700 +++ linux-2.5.68-bk2/drivers/video/sa1100fb.c 2003-04-21 15:53:39.000000000 -0700 @@ -1395,7 +1395,7 @@ /* * sa1100fb_handle_irq: Handle 'LCD DONE' interrupts. */ -static void sa1100fb_handle_irq(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t sa1100fb_handle_irq(int irq, void *dev_id, struct pt_regs *regs) { struct sa1100fb_info *fbi = dev_id; unsigned int lcsr = LCSR; @@ -1406,6 +1406,7 @@ } LCSR = lcsr; + return IRQ_HANDLED; } /* diff -urN linux-2.5.68-bk1/include/asm-sparc/irq.h linux-2.5.68-bk2/include/asm-sparc/irq.h --- linux-2.5.68-bk1/include/asm-sparc/irq.h 2003-04-19 19:49:54.000000000 -0700 +++ linux-2.5.68-bk2/include/asm-sparc/irq.h 2003-04-21 15:53:39.000000000 -0700 @@ -10,6 +10,7 @@ #include #include #include /* For NR_CPUS */ +#include #include /* For SUN4M_NCPUS */ #include @@ -47,8 +48,8 @@ #define clear_profile_irq(cpu) BTFIXUP_CALL(clear_profile_irq)(cpu) #define load_profile_irq(cpu,limit) BTFIXUP_CALL(load_profile_irq)(cpu,limit) -extern void (*sparc_init_timers)(void (*lvl10_irq)(int, void *, struct pt_regs *)); -extern void claim_ticker14(void (*irq_handler)(int, void *, struct pt_regs *), +extern void (*sparc_init_timers)(irqreturn_t (*lvl10_irq)(int, void *, struct pt_regs *)); +extern void claim_ticker14(irqreturn_t (*irq_handler)(int, void *, struct pt_regs *), int irq, unsigned int timeout); @@ -62,7 +63,7 @@ #define set_irq_udt(cpu) BTFIXUP_CALL(set_irq_udt)(cpu) #endif -extern int request_fast_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *), unsigned long flags, __const__ char *devname); +extern int request_fast_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long flags, __const__ char *devname); /* On the sun4m, just like the timers, we have both per-cpu and master * interrupt registers. diff -urN linux-2.5.68-bk1/include/asm-sparc/signal.h linux-2.5.68-bk2/include/asm-sparc/signal.h --- linux-2.5.68-bk1/include/asm-sparc/signal.h 2003-04-19 19:50:00.000000000 -0700 +++ linux-2.5.68-bk2/include/asm-sparc/signal.h 2003-04-21 15:53:39.000000000 -0700 @@ -118,10 +118,10 @@ }; /* Sigvec flags */ -#define SV_SSTACK 1u /* This signal handler should use sig-stack */ -#define SV_INTR 2u /* Sig return should not restart system call */ -#define SV_RESET 4u /* Set handler to SIG_DFL upon taken signal */ -#define SV_IGNCHILD 8u /* Do not send SIGCHLD */ +#define _SV_SSTACK 1u /* This signal handler should use sig-stack */ +#define _SV_INTR 2u /* Sig return should not restart system call */ +#define _SV_RESET 4u /* Set handler to SIG_DFL upon taken signal */ +#define _SV_IGNCHILD 8u /* Do not send SIGCHLD */ /* * sa_flags values: SA_STACK is not currently supported, but will allow the @@ -132,11 +132,11 @@ * SA_RESTART flag to get restarting signals (which were the default long ago) * SA_SHIRQ flag is for shared interrupt support on PCI and EISA. */ -#define SA_NOCLDSTOP SV_IGNCHILD -#define SA_STACK SV_SSTACK -#define SA_ONSTACK SV_SSTACK -#define SA_RESTART SV_INTR -#define SA_ONESHOT SV_RESET +#define SA_NOCLDSTOP _SV_IGNCHILD +#define SA_STACK _SV_SSTACK +#define SA_ONSTACK _SV_SSTACK +#define SA_RESTART _SV_INTR +#define SA_ONESHOT _SV_RESET #define SA_INTERRUPT 0x10u #define SA_NOMASK 0x20u #define SA_SHIRQ 0x40u diff -urN linux-2.5.68-bk1/include/asm-sparc64/irq.h linux-2.5.68-bk2/include/asm-sparc64/irq.h --- linux-2.5.68-bk1/include/asm-sparc64/irq.h 2003-04-19 19:49:52.000000000 -0700 +++ linux-2.5.68-bk2/include/asm-sparc64/irq.h 2003-04-21 15:53:39.000000000 -0700 @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -128,7 +129,7 @@ #endif extern int request_fast_irq(unsigned int irq, - void (*handler)(int, void *, struct pt_regs *), + irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long flags, __const__ char *devname, void *dev_id); diff -urN linux-2.5.68-bk1/include/asm-sparc64/pgalloc.h linux-2.5.68-bk2/include/asm-sparc64/pgalloc.h --- linux-2.5.68-bk1/include/asm-sparc64/pgalloc.h 2003-04-21 15:53:35.000000000 -0700 +++ linux-2.5.68-bk2/include/asm-sparc64/pgalloc.h 2003-04-21 15:53:39.000000000 -0700 @@ -71,7 +71,7 @@ struct page *page; preempt_enable(); - page = alloc_page(GFP_KERNEL); + page = alloc_page(GFP_KERNEL|__GFP_REPEAT); if (page) { ret = (struct page *)page_address(page); clear_page(ret); @@ -110,7 +110,7 @@ preempt_enable(); } else { preempt_enable(); - ret = (unsigned long *) __get_free_page(GFP_KERNEL); + ret = (unsigned long *) __get_free_page(GFP_KERNEL|__GFP_REPEAT); if(ret) memset(ret, 0, PAGE_SIZE); } diff -urN linux-2.5.68-bk1/include/asm-sparc64/signal.h linux-2.5.68-bk2/include/asm-sparc64/signal.h --- linux-2.5.68-bk1/include/asm-sparc64/signal.h 2003-04-19 19:48:56.000000000 -0700 +++ linux-2.5.68-bk2/include/asm-sparc64/signal.h 2003-04-21 15:53:39.000000000 -0700 @@ -123,10 +123,10 @@ }; /* Sigvec flags */ -#define SV_SSTACK 1u /* This signal handler should use sig-stack */ -#define SV_INTR 2u /* Sig return should not restart system call */ -#define SV_RESET 4u /* Set handler to SIG_DFL upon taken signal */ -#define SV_IGNCHILD 8u /* Do not send SIGCHLD */ +#define _SV_SSTACK 1u /* This signal handler should use sig-stack */ +#define _SV_INTR 2u /* Sig return should not restart system call */ +#define _SV_RESET 4u /* Set handler to SIG_DFL upon taken signal */ +#define _SV_IGNCHILD 8u /* Do not send SIGCHLD */ /* * sa_flags values: SA_STACK is not currently supported, but will allow the @@ -137,11 +137,11 @@ * SA_RESTART flag to get restarting signals (which were the default long ago) * SA_SHIRQ flag is for shared interrupt support on PCI and EISA. */ -#define SA_NOCLDSTOP SV_IGNCHILD -#define SA_STACK SV_SSTACK -#define SA_ONSTACK SV_SSTACK -#define SA_RESTART SV_INTR -#define SA_ONESHOT SV_RESET +#define SA_NOCLDSTOP _SV_IGNCHILD +#define SA_STACK _SV_SSTACK +#define SA_ONSTACK _SV_SSTACK +#define SA_RESTART _SV_INTR +#define SA_ONESHOT _SV_RESET #define SA_INTERRUPT 0x10u #define SA_NOMASK 0x20u #define SA_SHIRQ 0x40u diff -urN linux-2.5.68-bk1/include/asm-sparc64/timer.h linux-2.5.68-bk2/include/asm-sparc64/timer.h --- linux-2.5.68-bk1/include/asm-sparc64/timer.h 2003-04-19 19:48:51.000000000 -0700 +++ linux-2.5.68-bk2/include/asm-sparc64/timer.h 2003-04-21 15:53:39.000000000 -0700 @@ -7,6 +7,8 @@ #ifndef _SPARC64_TIMER_H #define _SPARC64_TIMER_H +#include + /* How timers work: * * On uniprocessors we just use counter zero for the system wide @@ -63,6 +65,7 @@ #ifdef CONFIG_SMP extern unsigned long timer_tick_offset; +struct pt_regs; extern void timer_tick_interrupt(struct pt_regs *); #endif diff -urN linux-2.5.68-bk1/include/linux/8250_pci.h linux-2.5.68-bk2/include/linux/8250_pci.h --- linux-2.5.68-bk1/include/linux/8250_pci.h 1969-12-31 16:00:00.000000000 -0800 +++ linux-2.5.68-bk2/include/linux/8250_pci.h 2003-04-21 15:53:39.000000000 -0700 @@ -0,0 +1,2 @@ +int pci_siig10x_fn(struct pci_dev *dev, int enable); +int pci_siig20x_fn(struct pci_dev *dev, int enable); diff -urN linux-2.5.68-bk1/include/linux/eeprom.h linux-2.5.68-bk2/include/linux/eeprom.h --- linux-2.5.68-bk1/include/linux/eeprom.h 2003-04-19 19:48:49.000000000 -0700 +++ linux-2.5.68-bk2/include/linux/eeprom.h 2003-04-21 15:53:39.000000000 -0700 @@ -59,7 +59,7 @@ /* foo. put this in a .c file */ static inline void eeprom_update(struct eeprom *ee, u32 mask, int pol) { - long flags; + unsigned long flags; u32 data; spin_lock_irqsave(ee->lock, flags); diff -urN linux-2.5.68-bk1/include/linux/interrupt.h linux-2.5.68-bk2/include/linux/interrupt.h --- linux-2.5.68-bk1/include/linux/interrupt.h 2003-04-21 15:53:35.000000000 -0700 +++ linux-2.5.68-bk2/include/linux/interrupt.h 2003-04-21 15:53:39.000000000 -0700 @@ -25,13 +25,11 @@ * IRQ_HANDLED means that we did have a valid interrupt and handled it. * IRQ_RETVAL(x) selects on the two depending on x being non-zero (for handled) */ -typedef struct irqreturn { - unsigned int val; -} irqreturn_t; - -#define IRQ_NONE ((struct irqreturn) { 0 }) -#define IRQ_HANDLED ((struct irqreturn) { 1 }) -#define IRQ_RETVAL(x) ((struct irqreturn) { (x) != 0 }) +typedef int irqreturn_t; + +#define IRQ_NONE (0) +#define IRQ_HANDLED (1) +#define IRQ_RETVAL(x) ((x) != 0) struct irqaction { irqreturn_t (*handler)(int, void *, struct pt_regs *); diff -urN linux-2.5.68-bk1/include/linux/serio.h linux-2.5.68-bk2/include/linux/serio.h --- linux-2.5.68-bk1/include/linux/serio.h 2003-04-19 19:49:58.000000000 -0700 +++ linux-2.5.68-bk2/include/linux/serio.h 2003-04-21 15:53:39.000000000 -0700 @@ -10,6 +10,7 @@ */ #include +#include #define SPIOCSTYPE _IOW('q', 0x01, unsigned long) @@ -50,7 +51,8 @@ char *name; void (*write_wakeup)(struct serio *); - void (*interrupt)(struct serio *, unsigned char, unsigned int, struct pt_regs *); + irqreturn_t (*interrupt)(struct serio *, unsigned char, + unsigned int, struct pt_regs *); void (*connect)(struct serio *, struct serio_dev *dev); void (*disconnect)(struct serio *); void (*cleanup)(struct serio *); @@ -61,7 +63,7 @@ int serio_open(struct serio *serio, struct serio_dev *dev); void serio_close(struct serio *serio); void serio_rescan(struct serio *serio); -void serio_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs); +irqreturn_t serio_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs); void serio_register_port(struct serio *serio); void serio_unregister_port(struct serio *serio); diff -urN linux-2.5.68-bk1/include/sound/ad1848.h linux-2.5.68-bk2/include/sound/ad1848.h --- linux-2.5.68-bk1/include/sound/ad1848.h 2003-04-19 19:48:57.000000000 -0700 +++ linux-2.5.68-bk2/include/sound/ad1848.h 2003-04-21 15:53:39.000000000 -0700 @@ -23,6 +23,7 @@ */ #include "pcm.h" +#include /* IO ports */ @@ -163,7 +164,7 @@ int snd_ad1848_pcm(ad1848_t * chip, int device, snd_pcm_t **rpcm); const snd_pcm_ops_t *snd_ad1848_get_pcm_ops(int direction); int snd_ad1848_mixer(ad1848_t * chip); -void snd_ad1848_interrupt(int irq, void *dev_id, struct pt_regs *regs); +irqreturn_t snd_ad1848_interrupt(int irq, void *dev_id, struct pt_regs *regs); /* exported mixer stuffs */ enum { AD1848_MIX_SINGLE, AD1848_MIX_DOUBLE, AD1848_MIX_CAPTURE }; diff -urN linux-2.5.68-bk1/include/sound/cs4231.h linux-2.5.68-bk2/include/sound/cs4231.h --- linux-2.5.68-bk1/include/sound/cs4231.h 2003-04-19 19:49:26.000000000 -0700 +++ linux-2.5.68-bk2/include/sound/cs4231.h 2003-04-21 15:53:39.000000000 -0700 @@ -316,7 +316,7 @@ void snd_cs4231_mce_up(cs4231_t *chip); void snd_cs4231_mce_down(cs4231_t *chip); -void snd_cs4231_interrupt(int irq, void *dev_id, struct pt_regs *regs); +irqreturn_t snd_cs4231_interrupt(int irq, void *dev_id, struct pt_regs *regs); const char *snd_cs4231_chip_id(cs4231_t *chip); diff -urN linux-2.5.68-bk1/include/sound/emu10k1.h linux-2.5.68-bk2/include/sound/emu10k1.h --- linux-2.5.68-bk1/include/sound/emu10k1.h 2003-04-19 19:48:56.000000000 -0700 +++ linux-2.5.68-bk2/include/sound/emu10k1.h 2003-04-21 15:53:39.000000000 -0700 @@ -30,6 +30,7 @@ #include #include #include +#include #include #ifndef PCI_VENDOR_ID_CREATIVE @@ -1014,7 +1015,7 @@ int snd_emu10k1_mixer(emu10k1_t * emu); int snd_emu10k1_fx8010_new(emu10k1_t *emu, int device, snd_hwdep_t ** rhwdep); -void snd_emu10k1_interrupt(int irq, void *dev_id, struct pt_regs *regs); +irqreturn_t snd_emu10k1_interrupt(int irq, void *dev_id, struct pt_regs *regs); /* initialization */ void snd_emu10k1_voice_init(emu10k1_t * emu, int voice); diff -urN linux-2.5.68-bk1/include/sound/es1688.h linux-2.5.68-bk2/include/sound/es1688.h --- linux-2.5.68-bk1/include/sound/es1688.h 2003-04-19 19:50:06.000000000 -0700 +++ linux-2.5.68-bk2/include/sound/es1688.h 2003-04-21 15:53:39.000000000 -0700 @@ -24,6 +24,7 @@ #include "control.h" #include "pcm.h" +#include #define ES1688_HW_AUTO 0x0000 #define ES1688_HW_688 0x0001 @@ -109,7 +110,7 @@ void snd_es1688_mixer_write(es1688_t *chip, unsigned char reg, unsigned char data); unsigned char snd_es1688_mixer_read(es1688_t *chip, unsigned char reg); -void snd_es1688_interrupt(int irq, void *dev_id, struct pt_regs *regs); +irqreturn_t snd_es1688_interrupt(int irq, void *dev_id, struct pt_regs *regs); int snd_es1688_create(snd_card_t * card, unsigned long port, diff -urN linux-2.5.68-bk1/include/sound/gus.h linux-2.5.68-bk2/include/sound/gus.h --- linux-2.5.68-bk1/include/sound/gus.h 2003-04-19 19:48:50.000000000 -0700 +++ linux-2.5.68-bk2/include/sound/gus.h 2003-04-21 15:53:39.000000000 -0700 @@ -561,7 +561,7 @@ }; #if 0 -extern void snd_gf1_lfo_effect_interrupt(snd_gus_card_t * gus, snd_gf1_voice_t * voice); +extern irqreturn_t snd_gf1_lfo_effect_interrupt(snd_gus_card_t * gus, snd_gf1_voice_t * voice); #endif extern void snd_gf1_lfo_init(snd_gus_card_t * gus); extern void snd_gf1_lfo_done(snd_gus_card_t * gus); @@ -666,7 +666,7 @@ /* gus_irq.c */ -void snd_gus_interrupt(int irq, void *dev_id, struct pt_regs *regs); +irqreturn_t snd_gus_interrupt(int irq, void *dev_id, struct pt_regs *regs); #ifdef CONFIG_SND_DEBUG void snd_gus_irq_profile_init(snd_gus_card_t *gus); #endif diff -urN linux-2.5.68-bk1/include/sound/initval.h linux-2.5.68-bk2/include/sound/initval.h --- linux-2.5.68-bk1/include/sound/initval.h 2003-04-19 19:48:48.000000000 -0700 +++ linux-2.5.68-bk2/include/sound/initval.h 2003-04-21 15:53:39.000000000 -0700 @@ -100,8 +100,9 @@ #ifdef SNDRV_LEGACY_FIND_FREE_IRQ #include -static void snd_legacy_empty_irq_handler(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_legacy_empty_irq_handler(int irq, void *dev_id, struct pt_regs *regs) { + return IRQ_HANDLED; } static int snd_legacy_find_free_irq(int *irq_table) diff -urN linux-2.5.68-bk1/include/sound/mpu401.h linux-2.5.68-bk2/include/sound/mpu401.h --- linux-2.5.68-bk1/include/sound/mpu401.h 2003-04-21 15:53:35.000000000 -0700 +++ linux-2.5.68-bk2/include/sound/mpu401.h 2003-04-21 15:53:39.000000000 -0700 @@ -22,7 +22,9 @@ * */ +#include #include "rawmidi.h" +#include #define MPU401_HW_MPU401 1 /* native MPU401 */ #define MPU401_HW_SB 2 /* SoundBlaster MPU-401 UART */ diff -urN linux-2.5.68-bk1/include/sound/sb.h linux-2.5.68-bk2/include/sound/sb.h --- linux-2.5.68-bk1/include/sound/sb.h 2003-04-19 19:49:25.000000000 -0700 +++ linux-2.5.68-bk2/include/sound/sb.h 2003-04-21 15:53:39.000000000 -0700 @@ -24,6 +24,7 @@ #include "pcm.h" #include "rawmidi.h" +#include #include enum sb_hw_type { @@ -99,7 +100,7 @@ snd_rawmidi_t *rmidi; snd_rawmidi_substream_t *midi_substream_input; snd_rawmidi_substream_t *midi_substream_output; - void (*rmidi_callback)(int irq, void *dev_id, struct pt_regs *regs); + irqreturn_t (*rmidi_callback)(int irq, void *dev_id, struct pt_regs *regs); spinlock_t reg_lock; spinlock_t open_lock; @@ -282,7 +283,7 @@ int snd_sbdsp_create(snd_card_t *card, unsigned long port, int irq, - void (*irq_handler)(int, void *, struct pt_regs *), + irqreturn_t (*irq_handler)(int, void *, struct pt_regs *), int dma8, int dma16, unsigned short hardware, sb_t **r_chip); @@ -308,7 +309,7 @@ const snd_pcm_ops_t *snd_sb16dsp_get_pcm_ops(int direction); int snd_sb16dsp_configure(sb_t *chip); /* sb16.c */ -void snd_sb16dsp_interrupt(int irq, void *dev_id, struct pt_regs *regs); +irqreturn_t snd_sb16dsp_interrupt(int irq, void *dev_id, struct pt_regs *regs); int snd_sb16_playback_open(snd_pcm_substream_t *substream); int snd_sb16_capture_open(snd_pcm_substream_t *substream); int snd_sb16_playback_close(snd_pcm_substream_t *substream); diff -urN linux-2.5.68-bk1/kernel/sched.c linux-2.5.68-bk2/kernel/sched.c --- linux-2.5.68-bk1/kernel/sched.c 2003-04-21 15:53:35.000000000 -0700 +++ linux-2.5.68-bk2/kernel/sched.c 2003-04-21 15:53:39.000000000 -0700 @@ -1666,7 +1666,7 @@ */ int task_prio(task_t *p) { - return p->prio - MAX_USER_RT_PRIO; + return p->prio - MAX_RT_PRIO; } /** diff -urN linux-2.5.68-bk1/sound/drivers/mtpav.c linux-2.5.68-bk2/sound/drivers/mtpav.c --- linux-2.5.68-bk1/sound/drivers/mtpav.c 2003-04-19 19:50:36.000000000 -0700 +++ linux-2.5.68-bk2/sound/drivers/mtpav.c 2003-04-21 15:53:39.000000000 -0700 @@ -585,7 +585,7 @@ } while (sbyt & SIGS_BYTE); } -static void snd_mtpav_irqh(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_mtpav_irqh(int irq, void *dev_id, struct pt_regs *regs) { mtpav_t *mcard = snd_magic_cast(mtpav_t, dev_id, return); @@ -593,6 +593,7 @@ spin_lock(&mcard->spinlock); snd_mtpav_read_bytes(mcard); spin_unlock(&mcard->spinlock); + return IRQ_HANDLED; } /* diff -urN linux-2.5.68-bk1/sound/drivers/serial-u16550.c linux-2.5.68-bk2/sound/drivers/serial-u16550.c --- linux-2.5.68-bk1/sound/drivers/serial-u16550.c 2003-04-19 19:48:51.000000000 -0700 +++ linux-2.5.68-bk2/sound/drivers/serial-u16550.c 2003-04-21 15:53:39.000000000 -0700 @@ -290,7 +290,7 @@ * Note that some devices need OUT2 to be set before they will generate * interrupts at all. (Possibly tied to an internal pull-up on CTS?) */ -static void snd_uart16550_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_uart16550_interrupt(int irq, void *dev_id, struct pt_regs *regs) { snd_uart16550_t *uart; @@ -298,11 +298,12 @@ spin_lock(&uart->open_lock); if (uart->filemode == SERIAL_MODE_NOT_OPENED) { spin_unlock(&uart->open_lock); - return; + return IRQ_NONE; } inb(uart->base + UART_IIR); /* indicate to the UART that the interrupt has been serviced */ snd_uart16550_io_loop(uart); spin_unlock(&uart->open_lock); + return IRQ_HANDLED; } /* When the polling mode, this function calls snd_uart16550_io_loop. */ diff -urN linux-2.5.68-bk1/sound/isa/ad1816a/ad1816a_lib.c linux-2.5.68-bk2/sound/isa/ad1816a/ad1816a_lib.c --- linux-2.5.68-bk1/sound/isa/ad1816a/ad1816a_lib.c 2003-04-19 19:50:06.000000000 -0700 +++ linux-2.5.68-bk2/sound/isa/ad1816a/ad1816a_lib.c 2003-04-21 15:53:39.000000000 -0700 @@ -311,7 +311,7 @@ } -static void snd_ad1816a_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_ad1816a_interrupt(int irq, void *dev_id, struct pt_regs *regs) { ad1816a_t *chip = snd_magic_cast(ad1816a_t, dev_id, return); unsigned char status; @@ -332,6 +332,7 @@ spin_lock(&chip->lock); snd_ad1816a_out(chip, AD1816A_INTERRUPT_STATUS, 0x00); spin_unlock(&chip->lock); + return IRQ_HANDLED; } diff -urN linux-2.5.68-bk1/sound/isa/ad1848/ad1848_lib.c linux-2.5.68-bk2/sound/isa/ad1848/ad1848_lib.c --- linux-2.5.68-bk1/sound/isa/ad1848/ad1848_lib.c 2003-04-19 19:51:12.000000000 -0700 +++ linux-2.5.68-bk2/sound/isa/ad1848/ad1848_lib.c 2003-04-21 15:53:39.000000000 -0700 @@ -585,7 +585,7 @@ return 0; } -void snd_ad1848_interrupt(int irq, void *dev_id, struct pt_regs *regs) +irqreturn_t snd_ad1848_interrupt(int irq, void *dev_id, struct pt_regs *regs) { ad1848_t *chip = snd_magic_cast(ad1848_t, dev_id, return); @@ -596,6 +596,7 @@ (chip->mode & AD1848_MODE_RUNNING)) snd_pcm_period_elapsed(chip->capture_substream); outb(0, AD1848P(chip, STATUS)); /* clear global interrupt bit */ + return IRQ_HANDLED; } static snd_pcm_uframes_t snd_ad1848_playback_pointer(snd_pcm_substream_t * substream) diff -urN linux-2.5.68-bk1/sound/isa/cs423x/cs4231_lib.c linux-2.5.68-bk2/sound/isa/cs423x/cs4231_lib.c --- linux-2.5.68-bk1/sound/isa/cs423x/cs4231_lib.c 2003-04-19 19:48:55.000000000 -0700 +++ linux-2.5.68-bk2/sound/isa/cs423x/cs4231_lib.c 2003-04-21 15:53:39.000000000 -0700 @@ -967,7 +967,7 @@ chip->capture_substream->runtime->overrange++; } -void snd_cs4231_interrupt(int irq, void *dev_id, struct pt_regs *regs) +irqreturn_t snd_cs4231_interrupt(int irq, void *dev_id, struct pt_regs *regs) { cs4231_t *chip = snd_magic_cast(cs4231_t, dev_id, return); unsigned char status; @@ -998,6 +998,7 @@ spin_lock(&chip->reg_lock); snd_cs4231_outm(chip, CS4231_IRQ_STATUS, ~CS4231_ALL_IRQS | ~status, 0); spin_unlock(&chip->reg_lock); + return IRQ_HANDLED; } #ifdef LEGACY_SUPPORT diff -urN linux-2.5.68-bk1/sound/isa/es1688/es1688_lib.c linux-2.5.68-bk2/sound/isa/es1688/es1688_lib.c --- linux-2.5.68-bk1/sound/isa/es1688/es1688_lib.c 2003-04-19 19:50:02.000000000 -0700 +++ linux-2.5.68-bk2/sound/isa/es1688/es1688_lib.c 2003-04-21 15:53:39.000000000 -0700 @@ -482,7 +482,7 @@ return snd_es1688_trigger(chip, cmd, 0x0f); } -void snd_es1688_interrupt(int irq, void *dev_id, struct pt_regs *regs) +irqreturn_t snd_es1688_interrupt(int irq, void *dev_id, struct pt_regs *regs) { es1688_t *chip = snd_magic_cast(es1688_t, dev_id, return); @@ -492,6 +492,7 @@ snd_pcm_period_elapsed(chip->capture_substream); inb(ES1688P(chip, DATA_AVAIL)); /* ack interrupt */ + return IRQ_HANDLED; } static snd_pcm_uframes_t snd_es1688_playback_pointer(snd_pcm_substream_t * substream) diff -urN linux-2.5.68-bk1/sound/isa/es18xx.c linux-2.5.68-bk2/sound/isa/es18xx.c --- linux-2.5.68-bk1/sound/isa/es18xx.c 2003-04-19 19:49:19.000000000 -0700 +++ linux-2.5.68-bk2/sound/isa/es18xx.c 2003-04-21 15:53:39.000000000 -0700 @@ -727,12 +727,11 @@ return snd_es18xx_playback2_trigger(chip, substream, cmd); } -static void snd_es18xx_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_es18xx_interrupt(int irq, void *dev_id, struct pt_regs *regs) { es18xx_t *chip = snd_magic_cast(es18xx_t, dev_id, return); unsigned char status; - if (chip->caps & ES18XX_CONTROL) { /* Read Interrupt status */ status = inb(chip->ctrl_port + 6); @@ -787,7 +786,7 @@ /* ack interrupt */ snd_es18xx_mixer_write(chip, 0x66, 0x00); } - + return IRQ_HANDLED; } static snd_pcm_uframes_t snd_es18xx_playback_pointer(snd_pcm_substream_t * substream) diff -urN linux-2.5.68-bk1/sound/isa/gus/gus_irq.c linux-2.5.68-bk2/sound/isa/gus/gus_irq.c --- linux-2.5.68-bk1/sound/isa/gus/gus_irq.c 2003-04-19 19:51:07.000000000 -0700 +++ linux-2.5.68-bk2/sound/isa/gus/gus_irq.c 2003-04-21 15:53:39.000000000 -0700 @@ -30,16 +30,18 @@ #define STAT_ADD(x) while (0) { ; } #endif -void snd_gus_interrupt(int irq, void *dev_id, struct pt_regs *regs) +irqreturn_t snd_gus_interrupt(int irq, void *dev_id, struct pt_regs *regs) { snd_gus_card_t * gus = snd_magic_cast(snd_gus_card_t, dev_id, return); unsigned char status; int loop = 100; - - __again: + int handled = 0; + +__again: status = inb(gus->gf1.reg_irqstat); if (status == 0) - return; + return IRQ_RETVAL(handled); + handled = 1; // snd_printk("IRQ: status = 0x%x\n", status); if (status & 0x02) { STAT_ADD(gus->gf1.interrupt_stat_midi_in); @@ -101,6 +103,7 @@ } if (--loop > 0) goto __again; + return IRQ_NONE; } #ifdef CONFIG_SND_DEBUG diff -urN linux-2.5.68-bk1/sound/isa/gus/gusmax.c linux-2.5.68-bk2/sound/isa/gus/gusmax.c --- linux-2.5.68-bk1/sound/isa/gus/gusmax.c 2003-04-19 19:50:01.000000000 -0700 +++ linux-2.5.68-bk2/sound/isa/gus/gusmax.c 2003-04-21 15:53:39.000000000 -0700 @@ -129,22 +129,26 @@ return 0; } -static void snd_gusmax_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_gusmax_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct snd_gusmax *maxcard = (struct snd_gusmax *) dev_id; int loop, max = 5; + int handled = 0; do { loop = 0; if (inb(maxcard->gus_status_reg)) { + handled = 1; snd_gus_interrupt(irq, maxcard->gus, regs); loop++; } if (inb(maxcard->pcm_status_reg) & 0x01) { /* IRQ bit is set? */ + handled = 1; snd_cs4231_interrupt(irq, maxcard->cs4231, regs); loop++; } } while (loop && --max > 0); + return IRQ_RETVAL(handled); } static void __init snd_gusmax_init(int dev, snd_card_t * card, snd_gus_card_t * gus) diff -urN linux-2.5.68-bk1/sound/isa/gus/interwave.c linux-2.5.68-bk2/sound/isa/gus/interwave.c --- linux-2.5.68-bk1/sound/isa/gus/interwave.c 2003-04-19 19:49:52.000000000 -0700 +++ linux-2.5.68-bk2/sound/isa/gus/interwave.c 2003-04-21 15:53:39.000000000 -0700 @@ -312,22 +312,26 @@ return -ENODEV; } -static void snd_interwave_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_interwave_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct snd_interwave *iwcard = (struct snd_interwave *) dev_id; int loop, max = 5; + int handled = 0; do { loop = 0; if (inb(iwcard->gus_status_reg)) { + handled = 1; snd_gus_interrupt(irq, iwcard->gus, regs); loop++; } if (inb(iwcard->pcm_status_reg) & 0x01) { /* IRQ bit is set? */ + handled = 1; snd_cs4231_interrupt(irq, iwcard->cs4231, regs); loop++; } } while (loop && --max > 0); + return IRQ_RETVAL(handled); } static void __devinit snd_interwave_reset(snd_gus_card_t * gus) diff -urN linux-2.5.68-bk1/sound/isa/opl3sa2.c linux-2.5.68-bk2/sound/isa/opl3sa2.c --- linux-2.5.68-bk1/sound/isa/opl3sa2.c 2003-04-19 19:51:13.000000000 -0700 +++ linux-2.5.68-bk2/sound/isa/opl3sa2.c 2003-04-21 15:53:39.000000000 -0700 @@ -297,26 +297,34 @@ return 0; } -static void snd_opl3sa2_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_opl3sa2_interrupt(int irq, void *dev_id, struct pt_regs *regs) { unsigned short status; opl3sa2_t *chip = snd_magic_cast(opl3sa2_t, dev_id, return); + int handled = 0; if (chip == NULL || chip->card == NULL) - return; + return IRQ_NONE; status = snd_opl3sa2_read(chip, OPL3SA2_IRQ_STATUS); - if (status & 0x20) + if (status & 0x20) { + handled = 1; snd_opl3_interrupt(chip->synth); + } - if ((status & 0x10) && chip->rmidi != NULL) + if ((status & 0x10) && chip->rmidi != NULL) { + handled = 1; snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data, regs); + } - if (status & 0x07) /* TI,CI,PI */ + if (status & 0x07) { /* TI,CI,PI */ + handled = 1; snd_cs4231_interrupt(irq, chip->cs4231, regs); + } if (status & 0x40) { /* hardware volume change */ + handled = 1; /* reading from Master Lch register at 0x07 clears this bit */ snd_opl3sa2_read(chip, OPL3SA2_MASTER_RIGHT); snd_opl3sa2_read(chip, OPL3SA2_MASTER_LEFT); @@ -325,6 +333,7 @@ snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->master_volume->id); } } + return IRQ_RETVAL(handled); } #define OPL3SA2_SINGLE(xname, xindex, reg, shift, mask, invert) \ diff -urN linux-2.5.68-bk1/sound/isa/opti9xx/opti92x-ad1848.c linux-2.5.68-bk2/sound/isa/opti9xx/opti92x-ad1848.c --- linux-2.5.68-bk1/sound/isa/opti9xx/opti92x-ad1848.c 2003-04-19 19:48:53.000000000 -0700 +++ linux-2.5.68-bk2/sound/isa/opti9xx/opti92x-ad1848.c 2003-04-21 15:53:39.000000000 -0700 @@ -1125,7 +1125,7 @@ spin_unlock_irqrestore(&chip->lock, flags); } -void snd_opti93x_interrupt(int irq, void *dev_id, struct pt_regs *regs) +irqreturn_t snd_opti93x_interrupt(int irq, void *dev_id, struct pt_regs *regs) { opti93x_t *codec = snd_magic_cast(opti93x_t, dev_id, return); unsigned char status; @@ -1138,6 +1138,7 @@ snd_pcm_period_elapsed(codec->capture_substream); } outb(0x00, OPTi93X_PORT(codec, STATUS)); + return IRQ_HANDLED; } diff -urN linux-2.5.68-bk1/sound/isa/sb/sb16_main.c linux-2.5.68-bk2/sound/isa/sb/sb16_main.c --- linux-2.5.68-bk1/sound/isa/sb/sb16_main.c 2003-04-19 19:49:26.000000000 -0700 +++ linux-2.5.68-bk2/sound/isa/sb/sb16_main.c 2003-04-21 15:53:39.000000000 -0700 @@ -393,7 +393,7 @@ return result; } -void snd_sb16dsp_interrupt(int irq, void *dev_id, struct pt_regs *regs) +irqreturn_t snd_sb16dsp_interrupt(int irq, void *dev_id, struct pt_regs *regs) { sb_t *chip = snd_magic_cast(sb_t, dev_id, return); unsigned char status; @@ -438,6 +438,7 @@ snd_sb_ack_16bit(chip); spin_unlock(&chip->reg_lock); } + return IRQ_HANDLED; } /* diff -urN linux-2.5.68-bk1/sound/isa/sb/sb8.c linux-2.5.68-bk2/sound/isa/sb/sb8.c --- linux-2.5.68-bk1/sound/isa/sb/sb8.c 2003-04-19 19:50:06.000000000 -0700 +++ linux-2.5.68-bk2/sound/isa/sb/sb8.c 2003-04-21 15:53:39.000000000 -0700 @@ -70,7 +70,7 @@ static snd_card_t *snd_sb8_cards[SNDRV_CARDS] = SNDRV_DEFAULT_PTR; -static void snd_sb8_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_sb8_interrupt(int irq, void *dev_id, struct pt_regs *regs) { sb_t *chip = snd_magic_cast(sb_t, dev_id, return); @@ -79,6 +79,7 @@ } else { snd_sb8dsp_midi_interrupt(chip); } + return IRQ_HANDLED; } static void snd_sb8_free(snd_card_t *card) diff -urN linux-2.5.68-bk1/sound/isa/sb/sb_common.c linux-2.5.68-bk2/sound/isa/sb/sb_common.c --- linux-2.5.68-bk1/sound/isa/sb/sb_common.c 2003-04-19 19:51:13.000000000 -0700 +++ linux-2.5.68-bk2/sound/isa/sb/sb_common.c 2003-04-21 15:53:39.000000000 -0700 @@ -214,7 +214,7 @@ int snd_sbdsp_create(snd_card_t *card, unsigned long port, int irq, - void (*irq_handler)(int, void *, struct pt_regs *), + irqreturn_t (*irq_handler)(int, void *, struct pt_regs *), int dma8, int dma16, unsigned short hardware, diff -urN linux-2.5.68-bk1/sound/isa/sgalaxy.c linux-2.5.68-bk2/sound/isa/sgalaxy.c --- linux-2.5.68-bk1/sound/isa/sgalaxy.c 2003-04-19 19:51:23.000000000 -0700 +++ linux-2.5.68-bk2/sound/isa/sgalaxy.c 2003-04-21 15:53:39.000000000 -0700 @@ -112,8 +112,9 @@ return 0; } -static void snd_sgalaxy_dummy_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_sgalaxy_dummy_interrupt(int irq, void *dev_id, struct pt_regs *regs) { + return IRQ_NONE; } static int __init snd_sgalaxy_setup_wss(unsigned long port, int irq, int dma) diff -urN linux-2.5.68-bk1/sound/isa/wavefront/wavefront.c linux-2.5.68-bk2/sound/isa/wavefront/wavefront.c --- linux-2.5.68-bk1/sound/isa/wavefront/wavefront.c 2003-04-19 19:50:34.000000000 -0700 +++ linux-2.5.68-bk2/sound/isa/wavefront/wavefront.c 2003-04-21 15:53:39.000000000 -0700 @@ -276,7 +276,7 @@ #endif /* CONFIG_PNP */ -static void snd_wavefront_ics2115_interrupt(int irq, +static irqreturn_t snd_wavefront_ics2115_interrupt(int irq, void *dev_id, struct pt_regs *regs) { @@ -285,13 +285,14 @@ acard = (snd_wavefront_card_t *) dev_id; if (acard == NULL) - return; + return IRQ_NONE; if (acard->wavefront.interrupts_are_midi) { snd_wavefront_midi_interrupt (acard); } else { snd_wavefront_internal_interrupt (acard); } + return IRQ_HANDLED; } snd_hwdep_t * __devinit diff -urN linux-2.5.68-bk1/sound/oss/ad1816.c linux-2.5.68-bk2/sound/oss/ad1816.c --- linux-2.5.68-bk1/sound/oss/ad1816.c 2003-04-19 19:50:47.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/ad1816.c 2003-04-21 15:53:39.000000000 -0700 @@ -540,7 +540,7 @@ /* Interrupt handler */ -static void ad1816_interrupt (int irq, void *dev_id, struct pt_regs *dummy) +static irqreturn_t ad1816_interrupt (int irq, void *dev_id, struct pt_regs *dummy) { unsigned char status; ad1816_info *devc; @@ -549,7 +549,7 @@ if (irq < 0 || irq > 15) { printk(KERN_WARNING "ad1816: Got bogus interrupt %d\n", irq); - return; + return IRQ_NONE; } dev = irq2dev[irq]; @@ -557,7 +557,7 @@ if (dev < 0 || dev >= num_audiodevs) { printk(KERN_WARNING "ad1816: IRQ2AD1816-mapping failed for " "irq %d device %d\n", irq,dev); - return; + return IRQ_NONE; } devc = (ad1816_info *) audio_devs[dev]->devc; @@ -583,6 +583,7 @@ DMAbuf_outputintr (dev, 1); spin_unlock(&devc->lock); + return IRQ_HANDLED; } /* ------------------------------------------------------------------- */ diff -urN linux-2.5.68-bk1/sound/oss/ad1848.c linux-2.5.68-bk2/sound/oss/ad1848.c --- linux-2.5.68-bk1/sound/oss/ad1848.c 2003-04-19 19:50:02.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/ad1848.c 2003-04-21 15:53:39.000000000 -0700 @@ -2212,7 +2212,7 @@ printk(KERN_ERR "ad1848: Can't find device to be unloaded. Base=%x\n", io_base); } -void adintr(int irq, void *dev_id, struct pt_regs *dummy) +irqreturn_t adintr(int irq, void *dev_id, struct pt_regs *dummy) { unsigned char status; ad1848_info *devc; @@ -2287,6 +2287,7 @@ { goto interrupt_again; } + return IRQ_HANDLED; } /* diff -urN linux-2.5.68-bk1/sound/oss/ad1848.h linux-2.5.68-bk2/sound/oss/ad1848.h --- linux-2.5.68-bk1/sound/oss/ad1848.h 2003-04-19 19:48:46.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/ad1848.h 2003-04-21 15:53:39.000000000 -0700 @@ -1,4 +1,6 @@ +#include + #define AD_F_CS4231 0x0001 /* Returned if a CS4232 (or compatible) detected */ #define AD_F_CS4248 0x0001 /* Returned if a CS4248 (or compatible) detected */ @@ -16,7 +18,7 @@ int ad1848_detect (int io_base, int *flags, int *osp); int ad1848_control(int cmd, int arg); -void adintr(int irq, void *dev_id, struct pt_regs * dummy); +irqreturn_t adintr(int irq, void *dev_id, struct pt_regs * dummy); void attach_ms_sound(struct address_info * hw_config, struct module * owner); int probe_ms_sound(struct address_info *hw_config); diff -urN linux-2.5.68-bk1/sound/oss/btaudio.c linux-2.5.68-bk2/sound/oss/btaudio.c --- linux-2.5.68-bk1/sound/oss/btaudio.c 2003-04-19 19:48:55.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/btaudio.c 2003-04-21 15:53:39.000000000 -0700 @@ -817,18 +817,20 @@ "RISCI", "FBUS", "FTRGT", "FDSR", "PPERR", "RIPERR", "PABORT", "OCERR", "SCERR" }; -static void btaudio_irq(int irq, void *dev_id, struct pt_regs * regs) +static irqreturn_t btaudio_irq(int irq, void *dev_id, struct pt_regs * regs) { int count = 0; u32 stat,astat; struct btaudio *bta = dev_id; + int handled = 0; for (;;) { count++; stat = btread(REG_INT_STAT); astat = stat & btread(REG_INT_MASK); if (!astat) - return; + return IRQ_RETVAL(handled); + handled = 1; btwrite(astat,REG_INT_STAT); if (irq_debug) { @@ -864,7 +866,7 @@ btwrite(0, REG_INT_MASK); } } - return; + return IRQ_NONE; } /* -------------------------------------------------------------- */ diff -urN linux-2.5.68-bk1/sound/oss/cmpci.c linux-2.5.68-bk2/sound/oss/cmpci.c --- linux-2.5.68-bk1/sound/oss/cmpci.c 2003-04-19 19:49:52.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/cmpci.c 2003-04-21 15:53:39.000000000 -0700 @@ -1156,7 +1156,7 @@ } #endif -static void cm_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t cm_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct cm_state *s = (struct cm_state *)dev_id; unsigned int intsrc, intstat; @@ -1165,7 +1165,7 @@ /* fastpath out, to ease interrupt sharing */ intsrc = inl(s->iobase + CODEC_CMI_INT_STATUS); if (!(intsrc & 0x80000000)) - return; + return IRQ_NONE; spin_lock(&s->lock); intstat = inb(s->iobase + CODEC_CMI_INT_HLDCLR + 2); /* acknowledge interrupt */ @@ -1180,6 +1180,7 @@ cm_handle_midi(s); #endif spin_unlock(&s->lock); + return IRQ_HANDLED; } #ifdef CONFIG_SOUND_CMPCI_MIDI diff -urN linux-2.5.68-bk1/sound/oss/cs4281/cs4281m.c linux-2.5.68-bk2/sound/oss/cs4281/cs4281m.c --- linux-2.5.68-bk1/sound/oss/cs4281/cs4281m.c 2003-04-19 19:51:14.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/cs4281/cs4281m.c 2003-04-21 15:53:39.000000000 -0700 @@ -3792,7 +3792,7 @@ -static void cs4281_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t cs4281_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct cs4281_state *s = (struct cs4281_state *) dev_id; unsigned int temp1; @@ -3809,7 +3809,7 @@ writel(HICR_IEV | HICR_CHGM, s->pBA0 + BA0_HICR); CS_DBGOUT(CS_INTERRUPT, 9, printk(KERN_INFO "cs4281: cs4281_interrupt(): returning not cs4281 interrupt.\n")); - return; + return IRQ_NONE; } if (temp1 & HISR_DMA0) // If play interrupt, @@ -3823,6 +3823,7 @@ cs4281_update_ptr(s,CS_TRUE); cs4281_handle_midi(s); spin_unlock(&s->lock); + return IRQ_HANDLED; } // ************************************************************************** diff -urN linux-2.5.68-bk1/sound/oss/cs46xx.c linux-2.5.68-bk2/sound/oss/cs46xx.c --- linux-2.5.68-bk1/sound/oss/cs46xx.c 2003-04-19 19:48:48.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/cs46xx.c 2003-04-21 15:53:39.000000000 -0700 @@ -1670,7 +1670,7 @@ wake_up(&card->midi.owait); } -static void cs_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t cs_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct cs_card *card = (struct cs_card *)dev_id; /* Single channel card */ @@ -1688,7 +1688,7 @@ { cs461x_pokeBA0(card, BA0_HICR, HICR_CHGM|HICR_IEV); spin_unlock(&card->lock); - return; + return IRQ_HANDLED; /* Might be IRQ_NONE.. */ } /* @@ -1709,6 +1709,7 @@ cs461x_pokeBA0(card, BA0_HICR, HICR_CHGM|HICR_IEV); spin_unlock(&card->lock); CS_DBGOUT(CS_INTERRUPT, 9, printk("cs46xx: cs_interrupt()- \n")); + return IRQ_HANDLED; } diff -urN linux-2.5.68-bk1/sound/oss/dmasound/dmasound_atari.c linux-2.5.68-bk2/sound/oss/dmasound/dmasound_atari.c --- linux-2.5.68-bk1/sound/oss/dmasound/dmasound_atari.c 2003-04-19 19:48:56.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/dmasound/dmasound_atari.c 2003-04-21 15:53:39.000000000 -0700 @@ -134,7 +134,7 @@ static int FalconSetVolume(int volume); static void AtaPlayNextFrame(int index); static void AtaPlay(void); -static void AtaInterrupt(int irq, void *dummy, struct pt_regs *fp); +static irqreturn_t AtaInterrupt(int irq, void *dummy, struct pt_regs *fp); /*** Mid level stuff *********************************************************/ @@ -1250,7 +1250,7 @@ } -static void AtaInterrupt(int irq, void *dummy, struct pt_regs *fp) +static irqreturn_t AtaInterrupt(int irq, void *dummy, struct pt_regs *fp) { #if 0 /* ++TeSche: if you should want to test this... */ @@ -1259,7 +1259,7 @@ if (++cnt == 10) { /* simulate losing an interrupt */ cnt = 0; - return; + return IRQ_HANDLED; } #endif spin_lock(&dmasound.lock); @@ -1269,7 +1269,7 @@ * (almost) like on the TT. */ write_sq_ignore_int = 0; - return; + return IRQ_HANDLED; } if (!write_sq.active) { @@ -1277,7 +1277,7 @@ * the sq variables, so better don't do anything here. */ WAKE_UP(write_sq.sync_queue); - return; + return IRQ_HANDLED; } /* Probably ;) one frame is finished. Well, in fact it may be that a @@ -1315,6 +1315,7 @@ is nothing to play any more. Wake up a process waiting for audio output to drain. */ spin_unlock(&dmasound.lock); + return IRQ_HANDLED; } diff -urN linux-2.5.68-bk1/sound/oss/dmasound/dmasound_awacs.c linux-2.5.68-bk2/sound/oss/dmasound/dmasound_awacs.c --- linux-2.5.68-bk1/sound/oss/dmasound/dmasound_awacs.c 2003-04-19 19:49:09.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/dmasound/dmasound_awacs.c 2003-04-21 15:53:39.000000000 -0700 @@ -266,9 +266,9 @@ static int PMacSetVolume(int volume); static void PMacPlay(void); static void PMacRecord(void); -static void pmac_awacs_tx_intr(int irq, void *devid, struct pt_regs *regs); -static void pmac_awacs_rx_intr(int irq, void *devid, struct pt_regs *regs); -static void pmac_awacs_intr(int irq, void *devid, struct pt_regs *regs); +static irqreturn_t pmac_awacs_tx_intr(int irq, void *devid, struct pt_regs *regs); +static irqreturn_t pmac_awacs_rx_intr(int irq, void *devid, struct pt_regs *regs); +static irqreturn_t pmac_awacs_intr(int irq, void *devid, struct pt_regs *regs); static void awacs_write(int val); static int awacs_get_volume(int reg, int lshift); static int awacs_volume_setter(int volume, int n, int mute, int lshift); @@ -395,20 +395,24 @@ return ((pmac_call_feature(PMAC_FTR_READ_GPIO, NULL, gpio_addr, 0) & 0x02) !=0); } -static void +static irqreturn_t headphone_intr(int irq, void *devid, struct pt_regs *regs) { + int handled = 0; spin_lock(&dmasound.lock); if (read_audio_gpio(gpio_headphone_detect) == gpio_headphone_detect_pol) { + handled = 1; printk(KERN_INFO "Audio jack plugged, muting speakers.\n"); write_audio_gpio(gpio_amp_mute, gpio_amp_mute_pol); write_audio_gpio(gpio_headphone_mute, !gpio_headphone_mute_pol); } else { + handled = 1; printk(KERN_INFO "Audio jack unplugged, enabling speakers.\n"); write_audio_gpio(gpio_amp_mute, !gpio_amp_mute_pol); write_audio_gpio(gpio_headphone_mute, gpio_headphone_mute_pol); } spin_unlock(&dmasound.lock); + return IRQ_RETVAL(handled); } @@ -923,7 +927,7 @@ 'next_cmd' field will already point back to the original loop of blocks. */ -static void +static irqreturn_t pmac_awacs_tx_intr(int irq, void *devid, struct pt_regs *regs) { int i = write_sq.front; @@ -1009,10 +1013,11 @@ if (!write_sq.active && (write_sq.syncing & 1)) WAKE_UP(write_sq.sync_queue); /* any time we're empty */ spin_unlock(&dmasound.lock); + return IRQ_HANDLED; } -static void +static irqreturn_t pmac_awacs_rx_intr(int irq, void *devid, struct pt_regs *regs) { int stat ; @@ -1023,12 +1028,12 @@ * just blow it off. */ if (in_le32(&awacs_rxdma->cmdptr) == 0) - return; + return IRQ_HANDLED; /* We also want to blow 'em off when shutting down. */ if (read_sq.active == 0) - return; + return IRQ_HANDLED; spin_lock(&dmasound.lock); /* Check multiple buffers in case we were held off from @@ -1063,7 +1068,7 @@ out_le32(&awacs_rxdma->control, ((RUN|WAKE) << 16) + (RUN|WAKE)); spin_unlock(&dmasound.lock); - return; /* try this block again */ + return IRQ_HANDLED; /* try this block again */ } /* Clear status and move on to next buffer. */ @@ -1091,10 +1096,11 @@ WAKE_UP(read_sq.action_queue); spin_unlock(&dmasound.lock); + return IRQ_HANDLED; } -static void +static irqreturn_t pmac_awacs_intr(int irq, void *devid, struct pt_regs *regs) { int ctrl; @@ -1113,6 +1119,7 @@ /* Writing 1s to the CNTLERR and PORTCHG bits clears them... */ out_le32(&awacs->control, ctrl); spin_unlock(&dmasound.lock); + return IRQ_HANDLED; } static void diff -urN linux-2.5.68-bk1/sound/oss/dmasound/dmasound_paula.c linux-2.5.68-bk2/sound/oss/dmasound/dmasound_paula.c --- linux-2.5.68-bk1/sound/oss/dmasound/dmasound_paula.c 2003-04-19 19:48:48.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/dmasound/dmasound_paula.c 2003-04-21 15:53:39.000000000 -0700 @@ -83,7 +83,7 @@ static int AmiSetTreble(int treble); static void AmiPlayNextFrame(int index); static void AmiPlay(void); -static void AmiInterrupt(int irq, void *dummy, struct pt_regs *fp); +static irqreturn_t AmiInterrupt(int irq, void *dummy, struct pt_regs *fp); #ifdef CONFIG_HEARTBEAT @@ -567,7 +567,7 @@ } -static void AmiInterrupt(int irq, void *dummy, struct pt_regs *fp) +static irqreturn_t AmiInterrupt(int irq, void *dummy, struct pt_regs *fp) { int minframes = 1; @@ -578,7 +578,7 @@ * the sq variables, so better don't do anything here. */ WAKE_UP(write_sq.sync_queue); - return; + return IRQ_HANDLED; } if (write_sq.active & AMI_PLAY_PLAYING) { @@ -608,6 +608,7 @@ /* Nothing to play anymore. Wake up a process waiting for audio output to drain. */ WAKE_UP(write_sq.sync_queue); + return IRQ_HANDLED; } /*** Mid level stuff *********************************************************/ diff -urN linux-2.5.68-bk1/sound/oss/dmasound/dmasound_q40.c linux-2.5.68-bk2/sound/oss/dmasound/dmasound_q40.c --- linux-2.5.68-bk1/sound/oss/dmasound/dmasound_q40.c 2003-04-19 19:48:48.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/dmasound/dmasound_q40.c 2003-04-21 15:53:39.000000000 -0700 @@ -49,8 +49,8 @@ static int Q40SetVolume(int volume); static void Q40PlayNextFrame(int index); static void Q40Play(void); -static void Q40StereoInterrupt(int irq, void *dummy, struct pt_regs *fp); -static void Q40MonoInterrupt(int irq, void *dummy, struct pt_regs *fp); +static irqreturn_t Q40StereoInterrupt(int irq, void *dummy, struct pt_regs *fp); +static irqreturn_t Q40MonoInterrupt(int irq, void *dummy, struct pt_regs *fp); static void Q40Interrupt(void); @@ -464,7 +464,7 @@ spin_unlock_irqrestore_flags(&dmasound.lock, flags); } -static void Q40StereoInterrupt(int irq, void *dummy, struct pt_regs *fp) +static irqreturn_t Q40StereoInterrupt(int irq, void *dummy, struct pt_regs *fp) { spin_lock(&dmasound.lock); if (q40_sc>1){ @@ -474,8 +474,9 @@ master_outb(1,SAMPLE_CLEAR_REG); }else Q40Interrupt(); spin_unlock(&dmasound.lock); + return IRQ_HANDLED; } -static void Q40MonoInterrupt(int irq, void *dummy, struct pt_regs *fp) +static irqreturn_t Q40MonoInterrupt(int irq, void *dummy, struct pt_regs *fp) { spin_lock(&dmasound.lock); if (q40_sc>0){ @@ -485,6 +486,7 @@ master_outb(1,SAMPLE_CLEAR_REG); }else Q40Interrupt(); spin_unlock(&dmasound.lock); + return IRQ_HANDLED; } static void Q40Interrupt(void) { diff -urN linux-2.5.68-bk1/sound/oss/emu10k1/cardwo.c linux-2.5.68-bk2/sound/oss/emu10k1/cardwo.c --- linux-2.5.68-bk1/sound/oss/emu10k1/cardwo.c 2003-04-19 19:50:37.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/emu10k1/cardwo.c 2003-04-21 15:53:39.000000000 -0700 @@ -444,7 +444,7 @@ while (len) { for (voice_num = 0; voice_num < woinst->num_voices; voice_num++) { if (__copy_from_user((u8 *)(voice[voice_num].mem.addr[pg]) + pgoff, src, woinst->format.bytespervoicesample)) - return -EFAULT; + return; src += woinst->format.bytespervoicesample; } diff -urN linux-2.5.68-bk1/sound/oss/emu10k1/irqmgr.c linux-2.5.68-bk2/sound/oss/emu10k1/irqmgr.c --- linux-2.5.68-bk1/sound/oss/emu10k1/irqmgr.c 2003-04-19 19:49:52.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/emu10k1/irqmgr.c 2003-04-21 15:53:39.000000000 -0700 @@ -37,10 +37,11 @@ /* Interrupt handler */ -void emu10k1_interrupt(int irq, void *dev_id, struct pt_regs *regs) +irqreturn_t emu10k1_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct emu10k1_card *card = (struct emu10k1_card *) dev_id; u32 irqstatus, irqstatus_tmp; + int handled = 0; DPD(4, "emu10k1_interrupt called, irq = %u\n", irq); @@ -105,6 +106,8 @@ } /* acknowledge interrupt */ - outl(irqstatus_tmp, card->iobase + IPR); + outl(irqstatus_tmp, card->iobase + IPR); + handled = 1; } + return IRQ_RETVAL(handled); } diff -urN linux-2.5.68-bk1/sound/oss/emu10k1/main.c linux-2.5.68-bk2/sound/oss/emu10k1/main.c --- linux-2.5.68-bk1/sound/oss/emu10k1/main.c 2003-04-19 19:51:12.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/emu10k1/main.c 2003-04-21 15:53:39.000000000 -0700 @@ -157,7 +157,7 @@ static struct midi_operations emu10k1_midi_operations; #endif -extern void emu10k1_interrupt(int, void *, struct pt_regs *s); +extern irqreturn_t emu10k1_interrupt(int, void *, struct pt_regs *s); static int __devinit emu10k1_audio_init(struct emu10k1_card *card) { diff -urN linux-2.5.68-bk1/sound/oss/es1370.c linux-2.5.68-bk2/sound/oss/es1370.c --- linux-2.5.68-bk1/sound/oss/es1370.c 2003-04-19 19:51:16.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/es1370.c 2003-04-21 15:53:39.000000000 -0700 @@ -755,7 +755,7 @@ outb((s->midi.ocnt > 0) ? UCTRL_RXINTEN | UCTRL_ENA_TXINT : UCTRL_RXINTEN, s->io+ES1370_REG_UART_CONTROL); } -static void es1370_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t es1370_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct es1370_state *s = (struct es1370_state *)dev_id; unsigned int intsrc, sctl; @@ -763,7 +763,7 @@ /* fastpath out, to ease interrupt sharing */ intsrc = inl(s->io+ES1370_REG_STATUS); if (!(intsrc & 0x80000000)) - return; + return IRQ_NONE; spin_lock(&s->lock); /* clear audio interrupts first */ sctl = s->sctrl; @@ -778,6 +778,7 @@ es1370_update_ptr(s); es1370_handle_midi(s); spin_unlock(&s->lock); + return IRQ_HANDLED; } /* --------------------------------------------------------------------- */ diff -urN linux-2.5.68-bk1/sound/oss/es1371.c linux-2.5.68-bk2/sound/oss/es1371.c --- linux-2.5.68-bk1/sound/oss/es1371.c 2003-04-19 19:50:34.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/es1371.c 2003-04-21 15:53:39.000000000 -0700 @@ -1091,7 +1091,7 @@ outb((s->midi.ocnt > 0) ? UCTRL_RXINTEN | UCTRL_ENA_TXINT : UCTRL_RXINTEN, s->io+ES1371_REG_UART_CONTROL); } -static void es1371_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t es1371_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct es1371_state *s = (struct es1371_state *)dev_id; unsigned int intsrc, sctl; @@ -1099,7 +1099,7 @@ /* fastpath out, to ease interrupt sharing */ intsrc = inl(s->io+ES1371_REG_STATUS); if (!(intsrc & 0x80000000)) - return; + return IRQ_NONE; spin_lock(&s->lock); /* clear audio interrupts first */ sctl = s->sctrl; @@ -1114,6 +1114,7 @@ es1371_update_ptr(s); es1371_handle_midi(s); spin_unlock(&s->lock); + return IRQ_HANDLED; } /* --------------------------------------------------------------------- */ diff -urN linux-2.5.68-bk1/sound/oss/esssolo1.c linux-2.5.68-bk2/sound/oss/esssolo1.c --- linux-2.5.68-bk1/sound/oss/esssolo1.c 2003-04-19 19:48:51.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/esssolo1.c 2003-04-21 15:53:39.000000000 -0700 @@ -1694,7 +1694,7 @@ wake_up(&s->midi.owait); } -static void solo1_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t solo1_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct solo1_state *s = (struct solo1_state *)dev_id; unsigned int intsrc; @@ -1702,7 +1702,7 @@ /* fastpath out, to ease interrupt sharing */ intsrc = inb(s->iobase+7); /* get interrupt source(s) */ if (!intsrc) - return; + return IRQ_NONE; (void)inb(s->sbbase+0xe); /* clear interrupt */ spin_lock(&s->lock); /* clear audio interrupts first */ @@ -1711,6 +1711,7 @@ solo1_update_ptr(s); solo1_handle_midi(s); spin_unlock(&s->lock); + return IRQ_HANDLED; } static void solo1_midi_timer(unsigned long data) diff -urN linux-2.5.68-bk1/sound/oss/gus.h linux-2.5.68-bk2/sound/oss/gus.h --- linux-2.5.68-bk1/sound/oss/gus.h 2003-04-19 19:50:44.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/gus.h 2003-04-21 15:53:39.000000000 -0700 @@ -3,7 +3,7 @@ /* From gus_card.c */ int gus_set_midi_irq(int num); -void gusintr(int irq, void *dev_id, struct pt_regs * dummy); +irqreturn_t gusintr(int irq, void *dev_id, struct pt_regs * dummy); /* From gus_wave.c */ int gus_wave_detect(int baseaddr); diff -urN linux-2.5.68-bk1/sound/oss/gus_card.c linux-2.5.68-bk2/sound/oss/gus_card.c --- linux-2.5.68-bk1/sound/oss/gus_card.c 2003-04-19 19:48:46.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/gus_card.c 2003-04-21 15:53:39.000000000 -0700 @@ -25,7 +25,7 @@ #include "gus.h" #include "gus_hw.h" -void gusintr(int irq, void *dev_id, struct pt_regs *dummy); +irqreturn_t gusintr(int irq, void *dev_id, struct pt_regs *dummy); int gus_base = 0, gus_irq = 0, gus_dma = 0; int gus_no_wave_dma = 0; @@ -119,10 +119,11 @@ sound_free_dma(hw_config->dma2); } -void gusintr(int irq, void *dev_id, struct pt_regs *dummy) +irqreturn_t gusintr(int irq, void *dev_id, struct pt_regs *dummy) { unsigned char src; extern int gus_timer_enabled; + int handled = 0; #ifdef CONFIG_SOUND_GUSMAX if (have_gus_max) { @@ -140,8 +141,8 @@ while (1) { if (!(src = inb(u_IrqStatus))) - return; - + break; + handled = 1; if (src & DMA_TC_IRQ) { guswave_dma_irq(); @@ -160,6 +161,7 @@ if (src & (WAVETABLE_IRQ | ENVELOPE_IRQ)) gus_voice_irq(); } + return IRQ_RETVAL(handled); } /* diff -urN linux-2.5.68-bk1/sound/oss/gus_wave.c linux-2.5.68-bk2/sound/oss/gus_wave.c --- linux-2.5.68-bk1/sound/oss/gus_wave.c 2003-04-19 19:48:56.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/gus_wave.c 2003-04-21 15:53:39.000000000 -0700 @@ -508,7 +508,7 @@ { unsigned vol, prev_vol, phase; unsigned char rate; - long int flags; + unsigned long flags; if (voices[voice].mode & WAVE_SUSTAIN_ON && voices[voice].env_phase == 2) { @@ -593,7 +593,7 @@ static void gus_voice_fade(int voice) { int instr_no = sample_map[voice], is16bits; - long int flags; + unsigned long flags; spin_lock_irqsave(&gus_lock,flags); gus_select_voice(voice); @@ -1511,7 +1511,7 @@ static int guswave_start_note(int dev, int voice, int note_num, int volume) { - long int flags; + unsigned long flags; int mode; int ret_val = 0; diff -urN linux-2.5.68-bk1/sound/oss/i810_audio.c linux-2.5.68-bk2/sound/oss/i810_audio.c --- linux-2.5.68-bk1/sound/oss/i810_audio.c 2003-04-19 19:50:34.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/i810_audio.c 2003-04-21 15:53:39.000000000 -0700 @@ -1389,7 +1389,7 @@ #endif } -static void i810_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t i810_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct i810_card *card = (struct i810_card *)dev_id; u32 status; @@ -1401,7 +1401,7 @@ if(!(status & INT_MASK)) { spin_unlock(&card->lock); - return; /* not for us */ + return IRQ_NONE; /* not for us */ } if(status & (INT_PO|INT_PI|INT_MC)) @@ -1410,6 +1410,7 @@ /* clear 'em */ outl(status & INT_MASK, card->iobase + GLOB_STA); spin_unlock(&card->lock); + return IRQ_HANDLED; } /* in this loop, dmabuf.count signifies the amount of data that is diff -urN linux-2.5.68-bk1/sound/oss/ite8172.c linux-2.5.68-bk2/sound/oss/ite8172.c --- linux-2.5.68-bk1/sound/oss/ite8172.c 2003-04-19 19:48:54.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/ite8172.c 2003-04-21 15:53:39.000000000 -0700 @@ -727,7 +727,7 @@ /* hold spinlock for the following! */ -static void it8172_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t it8172_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct it8172_state *s = (struct it8172_state *)dev_id; struct dmabuf* dac = &s->dma_dac; @@ -741,8 +741,10 @@ isc = inb(s->io+IT_AC_ISC); /* fastpath out, to ease interrupt sharing */ - if (!(isc & (ISC_VCI | ISC_CCI | ISC_PCI))) - return; + if (!(isc & (ISC_VCI | ISC_CCI | ISC_PCI))) { + spin_unlock(&s->lock); + return IRQ_NONE; + } /* clear audio interrupts first */ outb(isc | ISC_VCI | ISC_CCI | ISC_PCI, s->io+IT_AC_ISC); @@ -819,6 +821,7 @@ } spin_unlock(&s->lock); + return IRQ_HANDLED; } /* --------------------------------------------------------------------- */ diff -urN linux-2.5.68-bk1/sound/oss/maestro.c linux-2.5.68-bk2/sound/oss/maestro.c --- linux-2.5.68-bk1/sound/oss/maestro.c 2003-04-19 19:50:45.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/maestro.c 2003-04-21 15:53:39.000000000 -0700 @@ -1631,7 +1631,7 @@ * Meet Bob, the timer... */ -static void ess_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t ess_interrupt(int irq, void *dev_id, struct pt_regs *regs); static void stop_bob(struct ess_state *s) { @@ -1900,7 +1900,7 @@ } } -static void +static irqreturn_t ess_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct ess_state *s; @@ -1908,7 +1908,8 @@ int i; u32 event; - if ( ! (event = inb(c->iobase+0x1A)) ) return; + if ( ! (event = inb(c->iobase+0x1A)) ) + return IRQ_NONE; outw(inw(c->iobase+4)&1, c->iobase+4); @@ -1972,6 +1973,7 @@ ess_update_ptr(s); spin_unlock(&s->lock); } + return IRQ_HANDLED; } diff -urN linux-2.5.68-bk1/sound/oss/maestro3.c linux-2.5.68-bk2/sound/oss/maestro3.c --- linux-2.5.68-bk1/sound/oss/maestro3.c 2003-04-19 19:50:45.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/maestro3.c 2003-04-21 15:53:39.000000000 -0700 @@ -1232,7 +1232,7 @@ } } -static void m3_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t m3_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct m3_card *c = (struct m3_card *)dev_id; struct m3_state *s = &c->channels[0]; @@ -1240,13 +1240,14 @@ status = inb(c->iobase+0x1A); - if(status == 0xff) return; + if(status == 0xff) + return IRQ_NONE; /* presumably acking the ints? */ outw(status, c->iobase+0x1A); if(c->in_suspend) - return; + return IRQ_HANDLED; /* * ack an assp int if its running @@ -1269,6 +1270,7 @@ /* XXX is this needed? */ if(status & 0x40) outb(0x40, c->iobase+0x1A); + return IRQ_HANDLED; } diff -urN linux-2.5.68-bk1/sound/oss/maui.c linux-2.5.68-bk2/sound/oss/maui.c --- linux-2.5.68-bk1/sound/oss/maui.c 2003-04-19 19:50:32.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/maui.c 2003-04-21 15:53:39.000000000 -0700 @@ -102,9 +102,10 @@ return 0; } -static void mauiintr(int irq, void *dev_id, struct pt_regs *dummy) +static irqreturn_t mauiintr(int irq, void *dev_id, struct pt_regs *dummy) { irq_ok = 1; + return IRQ_HANDLED; } static int __init download_code(void) diff -urN linux-2.5.68-bk1/sound/oss/mpu401.c linux-2.5.68-bk2/sound/oss/mpu401.c --- linux-2.5.68-bk1/sound/oss/mpu401.c 2003-04-19 19:51:08.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/mpu401.c 2003-04-21 15:53:39.000000000 -0700 @@ -444,15 +444,17 @@ return input_avail(devc); } -void mpuintr(int irq, void *dev_id, struct pt_regs *dummy) +irqreturn_t mpuintr(int irq, void *dev_id, struct pt_regs *dummy) { struct mpu_config *devc; int dev = (int) dev_id; + int handled = 0; devc = &dev_conf[dev]; if (input_avail(devc)) { + handled = 1; if (devc->base != 0 && (devc->opened & OPEN_READ || devc->mode == MODE_SYNTH)) mpu401_input_loop(devc); else @@ -461,6 +463,7 @@ read_data(devc); } } + return IRQ_RETVAL(handled); } static int mpu401_open(int dev, int mode, @@ -500,7 +503,7 @@ { if (!try_module_get(coprocessor->owner)) { mpu401_close(dev); - return err; + return -ENODEV; } if ((err = coprocessor->open(coprocessor->devc, COPR_MIDI)) < 0) @@ -839,7 +842,7 @@ coprocessor = midi_devs[midi_dev]->coproc; if (coprocessor) { if (!try_module_get(coprocessor->owner)) - return err; + return -ENODEV; if ((err = coprocessor->open(coprocessor->devc, COPR_MIDI)) < 0) { diff -urN linux-2.5.68-bk1/sound/oss/mpu401.h linux-2.5.68-bk2/sound/oss/mpu401.h --- linux-2.5.68-bk1/sound/oss/mpu401.h 2003-04-19 19:49:18.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/mpu401.h 2003-04-21 15:53:39.000000000 -0700 @@ -3,7 +3,7 @@ int probe_uart401 (struct address_info *hw_config, struct module *owner); void unload_uart401 (struct address_info *hw_config); -void uart401intr (int irq, void *dev_id, struct pt_regs * dummy); +irqreturn_t uart401intr (int irq, void *dev_id, struct pt_regs * dummy); /* From mpu401.c */ int probe_mpu401(struct address_info *hw_config); @@ -11,4 +11,4 @@ void unload_mpu401(struct address_info *hw_info); int intchk_mpu401(void *dev_id); -void mpuintr(int irq, void *dev_id, struct pt_regs * dummy); +irqreturn_t mpuintr(int irq, void *dev_id, struct pt_regs * dummy); diff -urN linux-2.5.68-bk1/sound/oss/msnd_pinnacle.c linux-2.5.68-bk2/sound/oss/msnd_pinnacle.c --- linux-2.5.68-bk1/sound/oss/msnd_pinnacle.c 2003-04-19 19:50:02.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/msnd_pinnacle.c 2003-04-21 15:53:39.000000000 -0700 @@ -45,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -1061,7 +1062,7 @@ } } -static void intr(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t intr(int irq, void *dev_id, struct pt_regs *regs) { /* Send ack to DSP */ inb(dev.io + HP_RXL); @@ -1077,6 +1078,7 @@ else isa_writew(wTmp, dev.DSPQ + JQS_wHead); } + return IRQ_HANDLED; } static struct file_operations dev_fileops = { diff -urN linux-2.5.68-bk1/sound/oss/nec_vrc5477.c linux-2.5.68-bk2/sound/oss/nec_vrc5477.c --- linux-2.5.68-bk1/sound/oss/nec_vrc5477.c 2003-04-19 19:50:34.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/nec_vrc5477.c 2003-04-21 15:53:39.000000000 -0700 @@ -813,7 +813,7 @@ wake_up_interruptible(&dac->wait); } -static void vrc5477_ac97_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t vrc5477_ac97_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct vrc5477_ac97_state *s = (struct vrc5477_ac97_state *)dev_id; u32 irqStatus; @@ -851,6 +851,7 @@ } spin_unlock(&s->lock); + return IRQ_HANDLED; } /* --------------------------------------------------------------------- */ diff -urN linux-2.5.68-bk1/sound/oss/nm256.h linux-2.5.68-bk2/sound/oss/nm256.h --- linux-2.5.68-bk1/sound/oss/nm256.h 2003-04-19 19:50:04.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/nm256.h 2003-04-21 15:53:39.000000000 -0700 @@ -2,6 +2,8 @@ #define _NM256_H_ #include +#include + #include "ac97.h" /* The revisions that we currently handle. */ @@ -113,7 +115,7 @@ int has_irq; /* The card interrupt service routine. */ - void (*introutine) (int, void *, struct pt_regs *); + irqreturn_t (*introutine) (int, void *, struct pt_regs *); /* Current audio config, cached. */ struct sinfo { diff -urN linux-2.5.68-bk1/sound/oss/nm256_audio.c linux-2.5.68-bk2/sound/oss/nm256_audio.c --- linux-2.5.68-bk1/sound/oss/nm256_audio.c 2003-04-19 19:49:21.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/nm256_audio.c 2003-04-21 15:53:39.000000000 -0700 @@ -44,8 +44,8 @@ static int nm256_grabInterrupt (struct nm256_info *card); static int nm256_releaseInterrupt (struct nm256_info *card); -static void nm256_interrupt (int irq, void *dev_id, struct pt_regs *dummy); -static void nm256_interrupt_zx (int irq, void *dev_id, struct pt_regs *dummy); +static irqreturn_t nm256_interrupt (int irq, void *dev_id, struct pt_regs *dummy); +static irqreturn_t nm256_interrupt_zx (int irq, void *dev_id, struct pt_regs *dummy); static int handle_pm_event (struct pm_dev *dev, pm_request_t rqst, void *data); /* These belong in linux/pci.h. */ @@ -528,16 +528,17 @@ * I suppose...yucky bleah.) */ -static void +static irqreturn_t nm256_interrupt (int irq, void *dev_id, struct pt_regs *dummy) { struct nm256_info *card = (struct nm256_info *)dev_id; u16 status; static int badintrcount = 0; + int handled = 0; if ((card == NULL) || (card->magsig != NM_MAGIC_SIG)) { printk (KERN_ERR "NM256: Bad card pointer\n"); - return; + return IRQ_NONE; } status = nm256_readPort16 (card, 2, NM_INT_REG); @@ -558,13 +559,14 @@ * inserted a PCMCIA card and someone's spamming us with IRQ 9s. */ + handled = 1; if (card->playing) stopPlay (card); if (card->recording) stopRecord (card); badintrcount = 0; } - return; + return IRQ_RETVAL(handled); } badintrcount = 0; @@ -572,6 +574,7 @@ /* Rather boring; check for individual interrupts and process them. */ if (status & NM_PLAYBACK_INT) { + handled = 1; status &= ~NM_PLAYBACK_INT; NM_ACK_INT (card, NM_PLAYBACK_INT); @@ -580,6 +583,7 @@ } if (status & NM_RECORD_INT) { + handled = 1; status &= ~NM_RECORD_INT; NM_ACK_INT (card, NM_RECORD_INT); @@ -590,6 +594,7 @@ if (status & NM_MISC_INT_1) { u8 cbyte; + handled = 1; status &= ~NM_MISC_INT_1; printk (KERN_ERR "NM256: Got misc interrupt #1\n"); NM_ACK_INT (card, NM_MISC_INT_1); @@ -601,6 +606,7 @@ if (status & NM_MISC_INT_2) { u8 cbyte; + handled = 1; status &= ~NM_MISC_INT_2; printk (KERN_ERR "NM256: Got misc interrupt #2\n"); NM_ACK_INT (card, NM_MISC_INT_2); @@ -610,11 +616,13 @@ /* Unknown interrupt. */ if (status) { + handled = 1; printk (KERN_ERR "NM256: Fire in the hole! Unknown status 0x%x\n", status); /* Pray. */ NM_ACK_INT (card, status); } + return IRQ_RETVAL(handled); } /* @@ -623,16 +631,17 @@ * routine. */ -static void +static irqreturn_t nm256_interrupt_zx (int irq, void *dev_id, struct pt_regs *dummy) { struct nm256_info *card = (struct nm256_info *)dev_id; u32 status; static int badintrcount = 0; + int handled = 0; if ((card == NULL) || (card->magsig != NM_MAGIC_SIG)) { printk (KERN_ERR "NM256: Bad card pointer\n"); - return; + return IRQ_NONE; } status = nm256_readPort32 (card, 2, NM_INT_REG); @@ -655,13 +664,14 @@ * IRQ 9s. */ + handled = 1; if (card->playing) stopPlay (card); if (card->recording) stopRecord (card); badintrcount = 0; } - return; + return IRQ_RETVAL(handled); } badintrcount = 0; @@ -669,6 +679,7 @@ /* Rather boring; check for individual interrupts and process them. */ if (status & NM2_PLAYBACK_INT) { + handled = 1; status &= ~NM2_PLAYBACK_INT; NM2_ACK_INT (card, NM2_PLAYBACK_INT); @@ -677,6 +688,7 @@ } if (status & NM2_RECORD_INT) { + handled = 1; status &= ~NM2_RECORD_INT; NM2_ACK_INT (card, NM2_RECORD_INT); @@ -687,6 +699,7 @@ if (status & NM2_MISC_INT_1) { u8 cbyte; + handled = 1; status &= ~NM2_MISC_INT_1; printk (KERN_ERR "NM256: Got misc interrupt #1\n"); NM2_ACK_INT (card, NM2_MISC_INT_1); @@ -697,6 +710,7 @@ if (status & NM2_MISC_INT_2) { u8 cbyte; + handled = 1; status &= ~NM2_MISC_INT_2; printk (KERN_ERR "NM256: Got misc interrupt #2\n"); NM2_ACK_INT (card, NM2_MISC_INT_2); @@ -706,11 +720,13 @@ /* Unknown interrupt. */ if (status) { + handled = 1; printk (KERN_ERR "NM256: Fire in the hole! Unknown status 0x%x\n", status); /* Pray. */ NM2_ACK_INT (card, status); } + return IRQ_RETVAL(handled); } /* diff -urN linux-2.5.68-bk1/sound/oss/pas2_card.c linux-2.5.68-bk2/sound/oss/pas2_card.c --- linux-2.5.68-bk1/sound/oss/pas2_card.c 2003-04-19 19:50:29.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/pas2_card.c 2003-04-21 15:53:39.000000000 -0700 @@ -89,7 +89,7 @@ /******************* Begin of the Interrupt Handler ********************/ -void pasintr(int irq, void *dev_id, struct pt_regs *dummy) +static irqreturn_t pasintr(int irq, void *dev_id, struct pt_regs *dummy) { int status; @@ -106,6 +106,7 @@ pas_midi_interrupt(); status &= ~0x10; } + return IRQ_HANDLED; } int pas_set_intr(int mask) diff -urN linux-2.5.68-bk1/sound/oss/pss.c linux-2.5.68-bk2/sound/oss/pss.c --- linux-2.5.68-bk1/sound/oss/pss.c 2003-04-19 19:51:22.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/pss.c 2003-04-21 15:53:39.000000000 -0700 @@ -152,7 +152,7 @@ static void pss_write(pss_confdata *devc, int data) { - int i, limit; + unsigned long i, limit; limit = jiffies + HZ/10; /* The timeout is 0.1 seconds */ /* @@ -305,7 +305,8 @@ static int pss_download_boot(pss_confdata * devc, unsigned char *block, int size, int flags) { - int i, limit, val, count; + int i, val, count; + unsigned long limit; if (flags & CPF_FIRST) { diff -urN linux-2.5.68-bk1/sound/oss/rme96xx.c linux-2.5.68-bk2/sound/oss/rme96xx.c --- linux-2.5.68-bk1/sound/oss/rme96xx.c 2003-04-19 19:49:10.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/rme96xx.c 2003-04-21 15:53:39.000000000 -0700 @@ -542,7 +542,7 @@ inline int rme96xx_gethwptr(rme96xx_info* s,int exact) { - long flags; + unsigned long flags; if (exact) { unsigned int hwp; /* the hwptr seems to be rather unreliable :(, so we don't use it */ @@ -587,7 +587,7 @@ static int rme96xx_startcard(rme96xx_info *s,int stop) { int i; - long flags; + unsigned long flags; COMM ("startcard"); if(s->control_register & RME96xx_IE){ @@ -760,7 +760,7 @@ } -static void rme96xx_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t rme96xx_interrupt(int irq, void *dev_id, struct pt_regs *regs) { int i; rme96xx_info *s = (rme96xx_info *)dev_id; @@ -770,7 +770,7 @@ status = readl(s->iobase + RME96xx_status_register); if (!(status & RME96xx_IRQ)) { - return; + return IRQ_NONE; } spin_lock_irqsave(&s->lock,flags); @@ -785,6 +785,7 @@ wake_up(&(db->wait)); } spin_unlock_irqrestore(&s->lock,flags); + return IRQ_HANDLED; } diff -urN linux-2.5.68-bk1/sound/oss/sb_common.c linux-2.5.68-bk2/sound/oss/sb_common.c --- linux-2.5.68-bk1/sound/oss/sb_common.c 2003-04-19 19:48:50.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/sb_common.c 2003-04-21 15:53:39.000000000 -0700 @@ -201,7 +201,7 @@ sb_intr(devc); } -static void sbintr(int irq, void *dev_id, struct pt_regs *dummy) +static irqreturn_t sbintr(int irq, void *dev_id, struct pt_regs *dummy) { sb_devc *devc = dev_id; @@ -219,6 +219,7 @@ sb_intr (devc); break; } + return IRQ_HANDLED; } int sb_dsp_reset(sb_devc * devc) diff -urN linux-2.5.68-bk1/sound/oss/sonicvibes.c linux-2.5.68-bk2/sound/oss/sonicvibes.c --- linux-2.5.68-bk1/sound/oss/sonicvibes.c 2003-04-19 19:49:22.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/sonicvibes.c 2003-04-21 15:53:39.000000000 -0700 @@ -899,7 +899,7 @@ wake_up(&s->midi.owait); } -static void sv_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t sv_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct sv_state *s = (struct sv_state *)dev_id; unsigned int intsrc; @@ -907,11 +907,12 @@ /* fastpath out, to ease interrupt sharing */ intsrc = inb(s->ioenh + SV_CODEC_STATUS); if (!(intsrc & (SV_CSTAT_DMAA | SV_CSTAT_DMAC | SV_CSTAT_MIDI))) - return; + return IRQ_NONE; spin_lock(&s->lock); sv_update_ptr(s); sv_handle_midi(s); spin_unlock(&s->lock); + return IRQ_HANDLED; } static void sv_midi_timer(unsigned long data) diff -urN linux-2.5.68-bk1/sound/oss/trident.c linux-2.5.68-bk2/sound/oss/trident.c --- linux-2.5.68-bk1/sound/oss/trident.c 2003-04-19 19:50:34.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/trident.c 2003-04-21 15:53:39.000000000 -0700 @@ -1728,7 +1728,7 @@ } } -static void trident_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t trident_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct trident_card *card = (struct trident_card *)dev_id; u32 event; @@ -1755,13 +1755,14 @@ event = inl(TRID_REG(card, T4D_MISCINT)); outl(event | (ST_TARGET_REACHED | MIXER_OVERFLOW | MIXER_UNDERFLOW), TRID_REG(card, T4D_MISCINT)); spin_unlock(&card->lock); - return; + return IRQ_HANDLED; } /* manually clear interrupt status, bad hardware design, blame T^2 */ outl((ST_TARGET_REACHED | MIXER_OVERFLOW | MIXER_UNDERFLOW), TRID_REG(card, T4D_MISCINT)); spin_unlock(&card->lock); + return IRQ_HANDLED; } /* in this loop, dmabuf.count signifies the amount of data that is waiting to be copied to diff -urN linux-2.5.68-bk1/sound/oss/uart401.c linux-2.5.68-bk2/sound/oss/uart401.c --- linux-2.5.68-bk1/sound/oss/uart401.c 2003-04-19 19:50:44.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/uart401.c 2003-04-21 15:53:39.000000000 -0700 @@ -96,18 +96,19 @@ printk(KERN_WARNING "Too much work in interrupt on uart401 (0x%X). UART jabbering ??\n", devc->base); } -void uart401intr(int irq, void *dev_id, struct pt_regs *dummy) +irqreturn_t uart401intr(int irq, void *dev_id, struct pt_regs *dummy) { uart401_devc *devc = dev_id; if (devc == NULL) { printk(KERN_ERR "uart401: bad devc\n"); - return; + return IRQ_NONE; } if (input_avail(devc)) uart401_input_loop(devc); + return IRQ_HANDLED; } static int diff -urN linux-2.5.68-bk1/sound/oss/uart6850.c linux-2.5.68-bk2/sound/oss/uart6850.c --- linux-2.5.68-bk1/sound/oss/uart6850.c 2003-04-19 19:50:03.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/uart6850.c 2003-04-21 15:53:39.000000000 -0700 @@ -105,10 +105,11 @@ } } -void m6850intr(int irq, void *dev_id, struct pt_regs *dummy) +static irqreturn_t m6850intr(int irq, void *dev_id, struct pt_regs *dummy) { if (input_avail()) uart6850_input_loop(); + return IRQ_HANDLED; } /* diff -urN linux-2.5.68-bk1/sound/oss/via82cxxx_audio.c linux-2.5.68-bk2/sound/oss/via82cxxx_audio.c --- linux-2.5.68-bk1/sound/oss/via82cxxx_audio.c 2003-04-19 19:48:56.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/via82cxxx_audio.c 2003-04-21 15:53:39.000000000 -0700 @@ -1694,10 +1694,11 @@ } -static void via_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t via_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct via_info *card = dev_id; u32 status32; + int handled = 0; /* to minimize interrupt sharing costs, we use the SGD status * shadow register to check the status of all inputs and @@ -1708,10 +1709,12 @@ if (!(status32 & VIA_INTR_MASK)) { #ifdef CONFIG_MIDI_VIA82CXXX - if (card->midi_devc) + if (card->midi_devc) { uart401intr(irq, card->midi_devc, regs); + handled = 1; + } #endif - return; + goto out; } DPRINTK ("intr, status32 == 0x%08X\n", status32); @@ -1720,14 +1723,21 @@ */ spin_lock (&card->lock); - if (status32 & VIA_INTR_OUT) + if (status32 & VIA_INTR_OUT) { + handled = 1; via_intr_channel (&card->ch_out); - if (status32 & VIA_INTR_IN) + } + if (status32 & VIA_INTR_IN) { + handled = 1; via_intr_channel (&card->ch_in); - if (status32 & VIA_INTR_FM) + } + if (status32 & VIA_INTR_FM) { + handled = 1; via_intr_channel (&card->ch_fm); - + } spin_unlock (&card->lock); +out: + return IRQ_RETVAL(handled); } diff -urN linux-2.5.68-bk1/sound/oss/vidc.h linux-2.5.68-bk2/sound/oss/vidc.h --- linux-2.5.68-bk1/sound/oss/vidc.h 2003-04-19 19:48:49.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/vidc.h 2003-04-21 15:53:39.000000000 -0700 @@ -37,7 +37,7 @@ * DMA Interrupt handler */ -extern void vidc_sound_dma_irq(int irqnr, void *ref, struct pt_regs *regs); +extern irqreturn_t vidc_sound_dma_irq(int irqnr, void *ref, struct pt_regs *regs); /* * Filler routine pointer diff -urN linux-2.5.68-bk1/sound/oss/vidc_fill.S linux-2.5.68-bk2/sound/oss/vidc_fill.S --- linux-2.5.68-bk1/sound/oss/vidc_fill.S 2003-04-19 19:50:07.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/vidc_fill.S 2003-04-21 15:53:39.000000000 -0700 @@ -133,6 +133,10 @@ * ip = corrupted */ +%%%%%%%%%%%%%%%%%%% +fixme! This funtion needs to return IRQ_HANDLED +%%%%%%%%%%%%%%%%%%% + ENTRY(vidc_sound_dma_irq) stmfd sp!, {r4 - r8, lr} ldr r8, =dma_start diff -urN linux-2.5.68-bk1/sound/oss/vwsnd.c linux-2.5.68-bk2/sound/oss/vwsnd.c --- linux-2.5.68-bk1/sound/oss/vwsnd.c 2003-04-19 19:49:56.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/vwsnd.c 2003-04-21 15:53:39.000000000 -0700 @@ -2236,7 +2236,7 @@ pcm_output(devc, underflown, 0); } -static void vwsnd_audio_intr(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t vwsnd_audio_intr(int irq, void *dev_id, struct pt_regs *regs) { vwsnd_dev_t *devc = (vwsnd_dev_t *) dev_id; unsigned int status; @@ -2246,6 +2246,7 @@ status = li_get_clear_intr_status(&devc->lith); vwsnd_audio_read_intr(devc, status); vwsnd_audio_write_intr(devc, status); + return IRQ_HANDLED; } static ssize_t vwsnd_audio_do_read(struct file *file, diff -urN linux-2.5.68-bk1/sound/oss/waveartist.c linux-2.5.68-bk2/sound/oss/waveartist.c --- linux-2.5.68-bk1/sound/oss/waveartist.c 2003-04-19 19:49:09.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/waveartist.c 2003-04-21 15:53:39.000000000 -0700 @@ -833,7 +833,7 @@ }; -static void +static irqreturn_t waveartist_intr(int irq, void *dev_id, struct pt_regs *regs) { wavnc_info *devc = (wavnc_info *)dev_id; @@ -872,6 +872,7 @@ // We do not use SB mode natively... printk(KERN_WARNING "waveartist: Unexpected SB interrupt...\n"); spin_unlock(&waveartist_lock); + return IRQ_HANDLED; } /* ------------------------------------------------------------------------- diff -urN linux-2.5.68-bk1/sound/oss/wavfront.c linux-2.5.68-bk2/sound/oss/wavfront.c --- linux-2.5.68-bk1/sound/oss/wavfront.c 2003-04-19 19:49:56.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/wavfront.c 2003-04-21 15:53:39.000000000 -0700 @@ -2123,8 +2123,8 @@ /* WaveFront: Linux modular sound kernel installation interface */ /***********************************************************************/ -void -wavefrontintr (int irq, void *dev_id, struct pt_regs *dummy) +static irqreturn_t +wavefrontintr(int irq, void *dev_id, struct pt_regs *dummy) { struct wf_config *hw = dev_id; @@ -2149,12 +2149,13 @@ */ if ((wavefront_status() & (STAT_INTR_READ|STAT_INTR_WRITE)) == 0) { - return; + return IRQ_NONE; } hw->irq_ok = 1; hw->irq_cnt++; wake_up_interruptible (&hw->interrupt_sleeper); + return IRQ_HANDLED; } /* STATUS REGISTER diff -urN linux-2.5.68-bk1/sound/oss/wf_midi.c linux-2.5.68-bk2/sound/oss/wf_midi.c --- linux-2.5.68-bk1/sound/oss/wf_midi.c 2003-04-19 19:48:51.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/wf_midi.c 2003-04-21 15:53:39.000000000 -0700 @@ -354,8 +354,8 @@ return 1; } -void -wf_mpuintr (int irq, void *dev_id, struct pt_regs *dummy) +static irqreturn_t +wf_mpuintr(int irq, void *dev_id, struct pt_regs *dummy) { struct wf_mpu_config *physical_dev = dev_id; @@ -364,10 +364,11 @@ int n; if (!input_avail()) { /* not for us */ - return; + return IRQ_NONE; } - if (mi->m_busy) return; + if (mi->m_busy) + return IRQ_HANDLED; spin_lock(&lock); mi->m_busy = 1; @@ -410,6 +411,7 @@ mi->m_busy = 0; spin_unlock(&lock); + return IRQ_HANDLED; } static int diff -urN linux-2.5.68-bk1/sound/oss/ymfpci.c linux-2.5.68-bk2/sound/oss/ymfpci.c --- linux-2.5.68-bk1/sound/oss/ymfpci.c 2003-04-19 19:50:02.000000000 -0700 +++ linux-2.5.68-bk2/sound/oss/ymfpci.c 2003-04-21 15:53:39.000000000 -0700 @@ -1016,7 +1016,7 @@ return 0; } -void ymf_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t ymf_interrupt(int irq, void *dev_id, struct pt_regs *regs) { ymfpci_t *codec = dev_id; u32 status, nvoice, mode; @@ -1050,6 +1050,7 @@ /* timer handler */ ymfpci_writel(codec, YDSXGR_INTFLAG, ~0); } + return IRQ_HANDLED; } static void ymf_pcm_free_substream(struct ymf_pcm *ypcm) diff -urN linux-2.5.68-bk1/sound/pci/ali5451/ali5451.c linux-2.5.68-bk2/sound/pci/ali5451/ali5451.c --- linux-2.5.68-bk1/sound/pci/ali5451/ali5451.c 2003-04-19 19:51:08.000000000 -0700 +++ linux-2.5.68-bk2/sound/pci/ali5451/ali5451.c 2003-04-21 15:53:39.000000000 -0700 @@ -1032,15 +1032,16 @@ } -static void snd_ali_card_interrupt(int irq, - void *dev_id, - struct pt_regs *regs) +static irqreturn_t snd_ali_card_interrupt(int irq, + void *dev_id, + struct pt_regs *regs) { ali_t *codec = snd_magic_cast(ali_t, dev_id, return); if (codec == NULL) - return; + return IRQ_NONE; snd_ali_interrupt(codec); + return IRQ_HANDLED; } diff -urN linux-2.5.68-bk1/sound/pci/als4000.c linux-2.5.68-bk2/sound/pci/als4000.c --- linux-2.5.68-bk1/sound/pci/als4000.c 2003-04-19 19:51:08.000000000 -0700 +++ linux-2.5.68-bk2/sound/pci/als4000.c 2003-04-21 15:53:39.000000000 -0700 @@ -356,7 +356,7 @@ return bytes_to_frames( substream->runtime, result ); } -static void snd_als4000_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_als4000_interrupt(int irq, void *dev_id, struct pt_regs *regs) { sb_t *chip = snd_magic_cast(sb_t, dev_id, return); unsigned long flags; @@ -387,6 +387,7 @@ inb(chip->mpu_port); if (sb_status & 0x20) inb(SBP(chip, RESET)); + return IRQ_HANDLED; } /*****************************************************************/ diff -urN linux-2.5.68-bk1/sound/pci/cmipci.c linux-2.5.68-bk2/sound/pci/cmipci.c --- linux-2.5.68-bk1/sound/pci/cmipci.c 2003-04-19 19:50:07.000000000 -0700 +++ linux-2.5.68-bk2/sound/pci/cmipci.c 2003-04-21 15:53:39.000000000 -0700 @@ -1640,7 +1640,7 @@ /* * interrupt handler */ -static void snd_cmipci_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_cmipci_interrupt(int irq, void *dev_id, struct pt_regs *regs) { cmipci_t *cm = snd_magic_cast(cmipci_t, dev_id, return); unsigned int status, mask = 0; @@ -1648,7 +1648,7 @@ /* fastpath out, to ease interrupt sharing */ status = snd_cmipci_read(cm, CM_REG_INT_STATUS); if (!(status & CM_INTR)) - return; + return IRQ_NONE; /* acknowledge interrupt */ spin_lock(&cm->reg_lock); @@ -1669,6 +1669,8 @@ if ((status & CM_CHINT1) && cm->channel[1].running) snd_pcm_period_elapsed(cm->channel[1].substream); } + + return IRQ_HANDLED; } /* diff -urN linux-2.5.68-bk1/sound/pci/cs4281.c linux-2.5.68-bk2/sound/pci/cs4281.c --- linux-2.5.68-bk1/sound/pci/cs4281.c 2003-04-19 19:51:11.000000000 -0700 +++ linux-2.5.68-bk2/sound/pci/cs4281.c 2003-04-21 15:53:39.000000000 -0700 @@ -511,7 +511,7 @@ }; -static void snd_cs4281_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t snd_cs4281_interrupt(int irq, void *dev_id, struct pt_regs *regs); static struct pci_device_id snd_cs4281_ids[] __devinitdata = { { 0x1013, 0x6005, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* CS4281 */ @@ -1883,18 +1883,18 @@ * Interrupt handler */ -static void snd_cs4281_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_cs4281_interrupt(int irq, void *dev_id, struct pt_regs *regs) { cs4281_t *chip = snd_magic_cast(cs4281_t, dev_id, return); unsigned int status, dma, val; cs4281_dma_t *cdma; if (chip == NULL) - return; + return IRQ_NONE; status = snd_cs4281_peekBA0(chip, BA0_HISR); if ((status & 0x7fffffff) == 0) { snd_cs4281_pokeBA0(chip, BA0_HICR, BA0_HICR_EOI); - return; + return IRQ_NONE; } if (status & (BA0_HISR_DMA(0)|BA0_HISR_DMA(1)|BA0_HISR_DMA(2)|BA0_HISR_DMA(3))) { @@ -1949,6 +1949,8 @@ /* EOI to the PCI part... reenables interrupts */ snd_cs4281_pokeBA0(chip, BA0_HICR, BA0_HICR_EOI); + + return IRQ_HANDLED; } diff -urN linux-2.5.68-bk1/sound/pci/cs46xx/cs46xx_lib.c linux-2.5.68-bk2/sound/pci/cs46xx/cs46xx_lib.c --- linux-2.5.68-bk1/sound/pci/cs46xx/cs46xx_lib.c 2003-04-19 19:48:50.000000000 -0700 +++ linux-2.5.68-bk2/sound/pci/cs46xx/cs46xx_lib.c 2003-04-21 15:53:39.000000000 -0700 @@ -1217,7 +1217,7 @@ return 0; } -static void snd_cs46xx_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_cs46xx_interrupt(int irq, void *dev_id, struct pt_regs *regs) { cs46xx_t *chip = snd_magic_cast(cs46xx_t, dev_id, return); u32 status1; @@ -1234,7 +1234,7 @@ status1 = snd_cs46xx_peekBA0(chip, BA0_HISR); if ((status1 & 0x7fffffff) == 0) { snd_cs46xx_pokeBA0(chip, BA0_HICR, HICR_CHGM | HICR_IEV); - return; + return IRQ_NONE; } #ifdef CONFIG_SND_CS46XX_NEW_DSP @@ -1305,6 +1305,8 @@ * EOI to the PCI part....reenables interrupts */ snd_cs46xx_pokeBA0(chip, BA0_HICR, HICR_CHGM | HICR_IEV); + + return IRQ_HANDLED; } static snd_pcm_hardware_t snd_cs46xx_playback = diff -urN linux-2.5.68-bk1/sound/pci/emu10k1/irq.c linux-2.5.68-bk2/sound/pci/emu10k1/irq.c --- linux-2.5.68-bk1/sound/pci/emu10k1/irq.c 2003-04-19 19:50:30.000000000 -0700 +++ linux-2.5.68-bk2/sound/pci/emu10k1/irq.c 2003-04-21 15:53:39.000000000 -0700 @@ -30,13 +30,15 @@ #include #include -void snd_emu10k1_interrupt(int irq, void *dev_id, struct pt_regs *regs) +irqreturn_t snd_emu10k1_interrupt(int irq, void *dev_id, struct pt_regs *regs) { emu10k1_t *emu = snd_magic_cast(emu10k1_t, dev_id, return); unsigned int status; + int handled = 0; while ((status = inl(emu->port + IPR)) != 0) { // printk("irq - status = 0x%x\n", status); + handled = 1; if (status & IPR_PCIERROR) { snd_printk("interrupt: PCI error\n"); snd_emu10k1_intr_disable(emu, INTE_PCIERRORENABLE); @@ -145,4 +147,5 @@ outl(IPR_FXDSP, emu->port + IPR); } } + return IRQ_RETVAL(handled); } diff -urN linux-2.5.68-bk1/sound/pci/es1938.c linux-2.5.68-bk2/sound/pci/es1938.c --- linux-2.5.68-bk1/sound/pci/es1938.c 2003-04-19 19:50:09.000000000 -0700 +++ linux-2.5.68-bk2/sound/pci/es1938.c 2003-04-21 15:53:39.000000000 -0700 @@ -249,7 +249,7 @@ #endif }; -static void snd_es1938_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t snd_es1938_interrupt(int irq, void *dev_id, struct pt_regs *regs); static struct pci_device_id snd_es1938_ids[] __devinitdata = { { 0x125d, 0x1969, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* Solo-1 */ @@ -1490,10 +1490,11 @@ /* -------------------------------------------------------------------- * Interrupt handler * -------------------------------------------------------------------- */ -static void snd_es1938_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_es1938_interrupt(int irq, void *dev_id, struct pt_regs *regs) { es1938_t *chip = snd_magic_cast(es1938_t, dev_id, return); unsigned char status, audiostatus; + int handled = 0; status = inb(SLIO_REG(chip, IRQCONTROL)); #if 0 @@ -1509,6 +1510,7 @@ printk("Es1938debug - AUDIO channel 1 DMAC DMA status: 0x%x\n", inl(SLDM_REG(chip, DMASTATUS))); #endif /* clear irq */ + handled = 1; audiostatus = inb(SLSB_REG(chip, STATUS)); if (chip->active & ADC1) snd_pcm_period_elapsed(chip->capture_substream); @@ -1525,6 +1527,7 @@ #endif /* clear irq */ + handled = 1; snd_es1938_mixer_bits(chip, ESSSB_IREG_AUDIO2CONTROL2, 0x80, 0); if (chip->active & DAC2) snd_pcm_period_elapsed(chip->playback1_substream); @@ -1533,6 +1536,7 @@ /* Hardware volume */ if (status & 0x40) { int split = snd_es1938_mixer_read(chip, 0x64) & 0x80; + handled = 1; snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->hw_switch->id); snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->hw_volume->id); if (!split) { @@ -1546,9 +1550,12 @@ /* MPU401 */ if (status & 0x80) { // snd_es1938_mixer_bits(chip, ESSSB_IREG_MPU401CONTROL, 0x40, 0); /* ack? */ - if (chip->rmidi) + if (chip->rmidi) { + handled = 1; snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data, regs); + } } + return IRQ_RETVAL(handled); } #define ES1938_DMA_SIZE 64 diff -urN linux-2.5.68-bk1/sound/pci/es1968.c linux-2.5.68-bk2/sound/pci/es1968.c --- linux-2.5.68-bk1/sound/pci/es1968.c 2003-04-19 19:50:29.000000000 -0700 +++ linux-2.5.68-bk2/sound/pci/es1968.c 2003-04-21 15:53:39.000000000 -0700 @@ -600,7 +600,7 @@ #endif }; -static void snd_es1968_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t snd_es1968_interrupt(int irq, void *dev_id, struct pt_regs *regs); static struct pci_device_id snd_es1968_ids[] __devinitdata = { /* Maestro 1 */ @@ -2009,13 +2009,13 @@ /* * interrupt handler */ -static void snd_es1968_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_es1968_interrupt(int irq, void *dev_id, struct pt_regs *regs) { es1968_t *chip = snd_magic_cast(es1968_t, dev_id, return); u32 event; if (!(event = inb(chip->io_port + 0x1A))) - return; + return IRQ_NONE; outw(inw(chip->io_port + 4) & 1, chip->io_port + 4); @@ -2041,6 +2041,8 @@ } spin_unlock(&chip->substream_lock); } + + return IRQ_HANDLED; } /* diff -urN linux-2.5.68-bk1/sound/pci/fm801.c linux-2.5.68-bk2/sound/pci/fm801.c --- linux-2.5.68-bk1/sound/pci/fm801.c 2003-04-19 19:50:35.000000000 -0700 +++ linux-2.5.68-bk2/sound/pci/fm801.c 2003-04-21 15:53:39.000000000 -0700 @@ -481,7 +481,7 @@ return bytes_to_frames(substream->runtime, ptr); } -static void snd_fm801_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_fm801_interrupt(int irq, void *dev_id, struct pt_regs *regs) { fm801_t *chip = snd_magic_cast(fm801_t, dev_id, return); unsigned short status; @@ -490,7 +490,7 @@ status = inw(FM801_REG(chip, IRQ_STATUS)); status &= FM801_IRQ_PLAYBACK|FM801_IRQ_CAPTURE|FM801_IRQ_MPU|FM801_IRQ_VOLUME; if (! status) - return; + return IRQ_NONE; /* ack first */ outw(status, FM801_REG(chip, IRQ_STATUS)); if (chip->pcm && (status & FM801_IRQ_PLAYBACK) && chip->playback_substream) { @@ -525,6 +525,8 @@ snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data, regs); if (status & FM801_IRQ_VOLUME) ;/* TODO */ + + return IRQ_HANDLED; } static snd_pcm_hardware_t snd_fm801_playback = diff -urN linux-2.5.68-bk1/sound/pci/ice1712/ice1712.c linux-2.5.68-bk2/sound/pci/ice1712/ice1712.c --- linux-2.5.68-bk1/sound/pci/ice1712/ice1712.c 2003-04-19 19:49:09.000000000 -0700 +++ linux-2.5.68-bk2/sound/pci/ice1712/ice1712.c 2003-04-21 15:53:39.000000000 -0700 @@ -398,15 +398,17 @@ * Interrupt handler */ -static void snd_ice1712_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_ice1712_interrupt(int irq, void *dev_id, struct pt_regs *regs) { ice1712_t *ice = snd_magic_cast(ice1712_t, dev_id, return); unsigned char status; + int handled = 0; while (1) { status = inb(ICEREG(ice, IRQSTAT)); if (status == 0) break; + handled = 1; if (status & ICE1712_IRQ_MPU1) { if (ice->rmidi[0]) snd_mpu401_uart_interrupt(irq, ice->rmidi[0]->private_data, regs); @@ -462,6 +464,7 @@ outb(ICE1712_IRQ_CONPBK, ICEREG(ice, IRQSTAT)); } } + return IRQ_RETVAL(handled); } diff -urN linux-2.5.68-bk1/sound/pci/ice1712/ice1724.c linux-2.5.68-bk2/sound/pci/ice1712/ice1724.c --- linux-2.5.68-bk1/sound/pci/ice1712/ice1724.c 2003-04-19 19:49:25.000000000 -0700 +++ linux-2.5.68-bk2/sound/pci/ice1712/ice1724.c 2003-04-21 15:53:39.000000000 -0700 @@ -194,16 +194,18 @@ * Interrupt handler */ -static void snd_vt1724_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_vt1724_interrupt(int irq, void *dev_id, struct pt_regs *regs) { ice1712_t *ice = snd_magic_cast(ice1712_t, dev_id, return); unsigned char status; + int handled = 0; while (1) { status = inb(ICEREG1724(ice, IRQSTAT)); if (status == 0) break; - + + handled = 1; /* these should probably be separated at some point, but as we don't currently have MPU support on the board I will leave it */ if ((status & VT1724_IRQ_MPU_RX)||(status & VT1724_IRQ_MPU_TX)) { @@ -242,6 +244,7 @@ } } + return IRQ_RETVAL(handled); } /* diff -urN linux-2.5.68-bk1/sound/pci/korg1212/korg1212.c linux-2.5.68-bk2/sound/pci/korg1212/korg1212.c --- linux-2.5.68-bk1/sound/pci/korg1212/korg1212.c 2003-04-19 19:48:49.000000000 -0700 +++ linux-2.5.68-bk2/sound/pci/korg1212/korg1212.c 2003-04-21 15:53:39.000000000 -0700 @@ -1133,18 +1133,18 @@ snd_korg1212_setCardState(korg1212, K1212_STATE_DSP_COMPLETE); } -static void snd_korg1212_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_korg1212_interrupt(int irq, void *dev_id, struct pt_regs *regs) { u32 doorbellValue; korg1212_t *korg1212 = snd_magic_cast(korg1212_t, dev_id, return); if(irq != korg1212->irq) - return; + return IRQ_NONE; doorbellValue = readl(korg1212->inDoorbellPtr); if (!doorbellValue) - return; + return IRQ_NONE; spin_lock(&korg1212->lock); @@ -1218,6 +1218,8 @@ korg1212->inIRQ--; spin_unlock(&korg1212->lock); + + return IRQ_HANDLED; } static int snd_korg1212_downloadDSPCode(korg1212_t *korg1212) diff -urN linux-2.5.68-bk1/sound/pci/maestro3.c linux-2.5.68-bk2/sound/pci/maestro3.c --- linux-2.5.68-bk1/sound/pci/maestro3.c 2003-04-19 19:50:01.000000000 -0700 +++ linux-2.5.68-bk2/sound/pci/maestro3.c 2003-04-21 15:53:39.000000000 -0700 @@ -1549,7 +1549,7 @@ } } -static void +static irqreturn_t snd_m3_interrupt(int irq, void *dev_id, struct pt_regs *regs) { m3_t *chip = snd_magic_cast(m3_t, dev_id, ); @@ -1559,13 +1559,13 @@ status = inb(chip->iobase + 0x1A); if (status == 0xff) - return; + return IRQ_NONE; /* presumably acking the ints? */ outw(status, chip->iobase + 0x1A); /*if (in_suspend) - return;*/ + return IRQ_NONE;*/ /* * ack an assp int if its running @@ -1592,6 +1592,8 @@ /* XXX is this needed? */ if (status & 0x40) outb(0x40, chip->iobase+0x1A); + + return IRQ_HANDLED; } diff -urN linux-2.5.68-bk1/sound/pci/nm256/nm256.c linux-2.5.68-bk2/sound/pci/nm256/nm256.c --- linux-2.5.68-bk1/sound/pci/nm256/nm256.c 2003-04-19 19:50:44.000000000 -0700 +++ linux-2.5.68-bk2/sound/pci/nm256/nm256.c 2003-04-21 15:53:39.000000000 -0700 @@ -238,7 +238,7 @@ int mixer_status_mask; /* bit mask to test the mixer status */ int irq; - void (*interrupt)(int, void *, struct pt_regs *); + irqreturn_t (*interrupt)(int, void *, struct pt_regs *); int badintrcount; /* counter to check bogus interrupts */ nm256_stream_t streams[2]; @@ -972,7 +972,7 @@ * I suppose...yucky bleah.) */ -static void +static irqreturn_t snd_nm256_interrupt(int irq, void *dev_id, struct pt_regs *dummy) { nm256_t *chip = snd_magic_cast(nm256_t, dev_id, return); @@ -984,7 +984,7 @@ /* Not ours. */ if (status == 0) { snd_nm256_intr_check(chip); - return; + return IRQ_NONE; } chip->badintrcount = 0; @@ -1030,6 +1030,7 @@ } spin_unlock(&chip->reg_lock); + return IRQ_HANDLED; } /* @@ -1038,7 +1039,7 @@ * routine. */ -static void +static irqreturn_t snd_nm256_interrupt_zx(int irq, void *dev_id, struct pt_regs *dummy) { nm256_t *chip = snd_magic_cast(nm256_t, dev_id, return); @@ -1050,7 +1051,7 @@ /* Not ours. */ if (status == 0) { snd_nm256_intr_check(chip); - return; + return IRQ_NONE; } chip->badintrcount = 0; @@ -1095,6 +1096,7 @@ } spin_unlock(&chip->reg_lock); + return IRQ_HANDLED; } /* diff -urN linux-2.5.68-bk1/sound/pci/rme32.c linux-2.5.68-bk2/sound/pci/rme32.c --- linux-2.5.68-bk1/sound/pci/rme32.c 2003-04-19 19:51:14.000000000 -0700 +++ linux-2.5.68-bk2/sound/pci/rme32.c 2003-04-21 15:53:39.000000000 -0700 @@ -833,14 +833,14 @@ writel(rme32->wcreg, rme32->iobase + RME32_IO_CONTROL_REGISTER); } -static void +static irqreturn_t snd_rme32_interrupt(int irq, void *dev_id, struct pt_regs *regs) { rme32_t *rme32 = (rme32_t *) dev_id; rme32->rcreg = readl(rme32->iobase + RME32_IO_CONTROL_REGISTER); if (!(rme32->rcreg & RME32_RCR_IRQ)) { - return; + return IRQ_NONE; } else { if (rme32->capture_substream) { snd_pcm_period_elapsed(rme32->capture_substream); @@ -850,6 +850,7 @@ } writel(0, rme32->iobase + RME32_IO_CONFIRM_ACTION_IRQ); } + return IRQ_HANDLED; } static unsigned int period_bytes[] = { RME32_BLOCK_SIZE }; diff -urN linux-2.5.68-bk1/sound/pci/rme96.c linux-2.5.68-bk2/sound/pci/rme96.c --- linux-2.5.68-bk1/sound/pci/rme96.c 2003-04-19 19:49:10.000000000 -0700 +++ linux-2.5.68-bk2/sound/pci/rme96.c 2003-04-21 15:53:39.000000000 -0700 @@ -1153,7 +1153,7 @@ writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER); } -static void +static irqreturn_t snd_rme96_interrupt(int irq, void *dev_id, struct pt_regs *regs) @@ -1165,7 +1165,7 @@ if (!((rme96->rcreg & RME96_RCR_IRQ) || (rme96->rcreg & RME96_RCR_IRQ_2))) { - return; + return IRQ_NONE; } if (rme96->rcreg & RME96_RCR_IRQ) { @@ -1178,6 +1178,7 @@ snd_pcm_period_elapsed(rme96->capture_substream); writel(0, rme96->iobase + RME96_IO_CONFIRM_REC_IRQ); } + return IRQ_HANDLED; } static unsigned int period_bytes[] = { RME96_SMALL_BLOCK_SIZE, RME96_LARGE_BLOCK_SIZE }; diff -urN linux-2.5.68-bk1/sound/pci/rme9652/hdsp.c linux-2.5.68-bk2/sound/pci/rme9652/hdsp.c --- linux-2.5.68-bk1/sound/pci/rme9652/hdsp.c 2003-04-19 19:49:09.000000000 -0700 +++ linux-2.5.68-bk2/sound/pci/rme9652/hdsp.c 2003-04-21 15:53:39.000000000 -0700 @@ -3076,7 +3076,7 @@ } } -void snd_hdsp_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_hdsp_interrupt(int irq, void *dev_id, struct pt_regs *regs) { hdsp_t *hdsp = (hdsp_t *) dev_id; unsigned int status; @@ -3094,7 +3094,7 @@ midi1 = status & HDSP_midi1IRQPending; if (!audio && !midi0 && !midi1) { - return; + return IRQ_NONE; } hdsp_write(hdsp, HDSP_interruptConfirmation, 0); @@ -3128,6 +3128,7 @@ } if (schedule) tasklet_hi_schedule(&hdsp->midi_tasklet); + return IRQ_HANDLED; } static snd_pcm_uframes_t snd_hdsp_hw_pointer(snd_pcm_substream_t *substream) diff -urN linux-2.5.68-bk1/sound/pci/rme9652/rme9652.c linux-2.5.68-bk2/sound/pci/rme9652/rme9652.c --- linux-2.5.68-bk1/sound/pci/rme9652/rme9652.c 2003-04-19 19:49:23.000000000 -0700 +++ linux-2.5.68-bk2/sound/pci/rme9652/rme9652.c 2003-04-21 15:53:39.000000000 -0700 @@ -1947,12 +1947,12 @@ rme9652_set_rate(rme9652, 48000); } -void snd_rme9652_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_rme9652_interrupt(int irq, void *dev_id, struct pt_regs *regs) { rme9652_t *rme9652 = (rme9652_t *) dev_id; if (!(rme9652_read(rme9652, RME9652_status_register) & RME9652_IRQ)) { - return; + return IRQ_NONE; } rme9652_write(rme9652, RME9652_irq_clear, 0); @@ -1964,6 +1964,7 @@ if (rme9652->playback_substream) { snd_pcm_period_elapsed(rme9652->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream); } + return IRQ_HANDLED; } static snd_pcm_uframes_t snd_rme9652_hw_pointer(snd_pcm_substream_t *substream) diff -urN linux-2.5.68-bk1/sound/pci/sonicvibes.c linux-2.5.68-bk2/sound/pci/sonicvibes.c --- linux-2.5.68-bk1/sound/pci/sonicvibes.c 2003-04-19 19:50:29.000000000 -0700 +++ linux-2.5.68-bk2/sound/pci/sonicvibes.c 2003-04-21 15:53:39.000000000 -0700 @@ -596,18 +596,18 @@ return result; } -static void snd_sonicvibes_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_sonicvibes_interrupt(int irq, void *dev_id, struct pt_regs *regs) { sonicvibes_t *sonic = snd_magic_cast(sonicvibes_t, dev_id, return); unsigned char status; status = inb(SV_REG(sonic, STATUS)); if (!(status & (SV_DMAA_IRQ | SV_DMAC_IRQ | SV_MIDI_IRQ))) - return; + return IRQ_NONE; if (status == 0xff) { /* failure */ outb(sonic->irqmask = ~0, SV_REG(sonic, IRQMASK)); snd_printk("IRQ failure - interrupts disabled!!\n"); - return; + return IRQ_HANDLED; } if (sonic->pcm) { if (status & SV_DMAA_IRQ) @@ -654,6 +654,8 @@ snd_ctl_notify(sonic->card, SNDRV_CTL_EVENT_MASK_VALUE, &sonic->master_mute->id); snd_ctl_notify(sonic->card, SNDRV_CTL_EVENT_MASK_VALUE, &sonic->master_volume->id); } + + return IRQ_HANDLED; } /* diff -urN linux-2.5.68-bk1/sound/pci/trident/trident_main.c linux-2.5.68-bk2/sound/pci/trident/trident_main.c --- linux-2.5.68-bk1/sound/pci/trident/trident_main.c 2003-04-19 19:50:06.000000000 -0700 +++ linux-2.5.68-bk2/sound/pci/trident/trident_main.c 2003-04-21 15:53:39.000000000 -0700 @@ -48,7 +48,7 @@ static int snd_trident_pcm_mixer_build(trident_t *trident, snd_trident_voice_t * voice, snd_pcm_substream_t *substream); static int snd_trident_pcm_mixer_free(trident_t *trident, snd_trident_voice_t * voice, snd_pcm_substream_t *substream); -static void snd_trident_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t snd_trident_interrupt(int irq, void *dev_id, struct pt_regs *regs); #ifdef CONFIG_PM static int snd_trident_set_power_state(snd_card_t *card, unsigned int power_state); #endif @@ -3683,11 +3683,11 @@ the method try & fail so it is possible that it won't work on all computers. [jaroslav] - Returns: None. + Returns: Whether IRQ was handled or not. ---------------------------------------------------------------------------*/ -static void snd_trident_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_trident_interrupt(int irq, void *dev_id, struct pt_regs *regs) { trident_t *trident = snd_magic_cast(trident_t, dev_id, return); unsigned int audio_int, chn_int, stimer, channel, mask, tmp; @@ -3696,7 +3696,7 @@ audio_int = inl(TRID_REG(trident, T4D_MISCINT)); if ((audio_int & (ADDRESS_IRQ|MPU401_IRQ)) == 0) - return; + return IRQ_NONE; if (audio_int & ADDRESS_IRQ) { // get interrupt status for all channels spin_lock(&trident->reg_lock); @@ -3781,6 +3781,8 @@ } } // outl((ST_TARGET_REACHED | MIXER_OVERFLOW | MIXER_UNDERFLOW), TRID_REG(trident, T4D_MISCINT)); + + return IRQ_HANDLED; } /*--------------------------------------------------------------------------- diff -urN linux-2.5.68-bk1/sound/pci/via82xx.c linux-2.5.68-bk2/sound/pci/via82xx.c --- linux-2.5.68-bk1/sound/pci/via82xx.c 2003-04-19 19:50:41.000000000 -0700 +++ linux-2.5.68-bk2/sound/pci/via82xx.c 2003-04-21 15:53:39.000000000 -0700 @@ -574,7 +574,7 @@ * Interrupt handler */ -static void snd_via82xx_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_via82xx_interrupt(int irq, void *dev_id, struct pt_regs *regs) { via82xx_t *chip = snd_magic_cast(via82xx_t, dev_id, return); unsigned int status; @@ -591,8 +591,8 @@ spin_unlock(&chip->reg_lock); if (chip->rmidi) /* check mpu401 interrupt */ - snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data, regs); - return; + return snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data, regs); + return IRQ_NONE; } // _skip_sgd: @@ -611,6 +611,7 @@ outb(c_status, VIADEV_REG(viadev, OFFSET_STATUS)); /* ack */ } spin_unlock(&chip->reg_lock); + return IRQ_HANDLED; } /* diff -urN linux-2.5.68-bk1/sound/pci/ymfpci/ymfpci_main.c linux-2.5.68-bk2/sound/pci/ymfpci/ymfpci_main.c --- linux-2.5.68-bk1/sound/pci/ymfpci/ymfpci_main.c 2003-04-19 19:50:44.000000000 -0700 +++ linux-2.5.68-bk2/sound/pci/ymfpci/ymfpci_main.c 2003-04-21 15:53:39.000000000 -0700 @@ -741,7 +741,7 @@ } } -static void snd_ymfpci_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_ymfpci_interrupt(int irq, void *dev_id, struct pt_regs *regs) { ymfpci_t *chip = snd_magic_cast(ymfpci_t, dev_id, return); u32 status, nvoice, mode; @@ -787,6 +787,8 @@ if (chip->rawmidi) snd_mpu401_uart_interrupt(irq, chip->rawmidi->private_data, regs); + + return IRQ_HANDLED; } static snd_pcm_hardware_t snd_ymfpci_playback = diff -urN linux-2.5.68-bk1/sound/ppc/pmac.c linux-2.5.68-bk2/sound/ppc/pmac.c --- linux-2.5.68-bk1/sound/ppc/pmac.c 2003-04-19 19:51:21.000000000 -0700 +++ linux-2.5.68-bk2/sound/ppc/pmac.c 2003-04-21 15:53:39.000000000 -0700 @@ -693,23 +693,25 @@ /* * interrupt handlers */ -static void +static irqreturn_t snd_pmac_tx_intr(int irq, void *devid, struct pt_regs *regs) { pmac_t *chip = snd_magic_cast(pmac_t, devid, return); snd_pmac_pcm_update(chip, &chip->playback); + return IRQ_HANDLED; } -static void +static irqreturn_t snd_pmac_rx_intr(int irq, void *devid, struct pt_regs *regs) { pmac_t *chip = snd_magic_cast(pmac_t, devid, return); snd_pmac_pcm_update(chip, &chip->capture); + return IRQ_HANDLED; } -static void +static irqreturn_t snd_pmac_ctrl_intr(int irq, void *devid, struct pt_regs *regs) { pmac_t *chip = snd_magic_cast(pmac_t, devid, return); @@ -728,6 +730,7 @@ } /* Writing 1s to the CNTLERR and PORTCHG bits clears them... */ out_le32(&chip->awacs->control, ctrl); + return IRQ_HANDLED; } diff -urN linux-2.5.68-bk1/sound/ppc/tumbler.c linux-2.5.68-bk2/sound/ppc/tumbler.c --- linux-2.5.68-bk1/sound/ppc/tumbler.c 2003-04-19 19:48:49.000000000 -0700 +++ linux-2.5.68-bk2/sound/ppc/tumbler.c 2003-04-21 15:53:39.000000000 -0700 @@ -785,11 +785,14 @@ /* interrupt - headphone plug changed */ -static void headphone_intr(int irq, void *devid, struct pt_regs *regs) +static irqreturn_t headphone_intr(int irq, void *devid, struct pt_regs *regs) { pmac_t *chip = snd_magic_cast(pmac_t, devid, return); - if (chip->update_automute && chip->initialized) + if (chip->update_automute && chip->initialized) { chip->update_automute(chip, 1); + return IRQ_HANDLED; + } + return IRQ_NONE; } /* look for audio-gpio device */ diff -urN linux-2.5.68-bk1/sound/sparc/amd7930.c linux-2.5.68-bk2/sound/sparc/amd7930.c --- linux-2.5.68-bk1/sound/sparc/amd7930.c 2003-04-19 19:48:53.000000000 -0700 +++ linux-2.5.68-bk2/sound/sparc/amd7930.c 2003-04-21 15:53:39.000000000 -0700 @@ -497,7 +497,7 @@ __amd7930_write_map(amd); } -static void snd_amd7930_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_amd7930_interrupt(int irq, void *dev_id, struct pt_regs *regs) { amd7930_t *amd = dev_id; unsigned int elapsed; @@ -536,6 +536,8 @@ snd_pcm_period_elapsed(amd->playback_substream); else snd_pcm_period_elapsed(amd->capture_substream); + + return IRQ_HANDLED; } static int snd_amd7930_trigger(amd7930_t *amd, unsigned int flag, int cmd) diff -urN linux-2.5.68-bk1/sound/sparc/cs4231.c linux-2.5.68-bk2/sound/sparc/cs4231.c --- linux-2.5.68-bk1/sound/sparc/cs4231.c 2003-04-19 19:48:49.000000000 -0700 +++ linux-2.5.68-bk2/sound/sparc/cs4231.c 2003-04-21 15:53:39.000000000 -0700 @@ -1228,7 +1228,7 @@ } #ifdef SBUS_SUPPORT -static void snd_cs4231_sbus_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_cs4231_sbus_interrupt(int irq, void *dev_id, struct pt_regs *regs) { cs4231_t *chip = snd_magic_cast(cs4231_t, dev_id, return); u32 csr; @@ -1240,12 +1240,14 @@ APC_GENL_INT | APC_XINT_PEMP | APC_XINT_CEMP))) - return; + return IRQ_NONE; /* ACK the APC interrupt. */ sbus_writel(csr, chip->port + APCCSR); snd_cs4231_generic_interrupt(chip); + + return IRQ_HANDLED; } #endif