From a688bf88a7ccbc81ed237b4beab184719496d942 Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Thu, 24 Apr 2003 08:58:13 -0700 Subject: [PATCH] [PATCH] irqs: ATM Update ATM drivers to new IRQ API --- drivers/atm/ambassador.c | 13 +++++++------ drivers/atm/eni.c | 3 ++- drivers/atm/firestream.c | 6 ++++-- drivers/atm/fore200e.c | 5 +++-- drivers/atm/horizon.c | 12 ++++++++---- drivers/atm/idt77252.c | 7 +++---- drivers/atm/iphase.c | 7 +++++-- drivers/atm/lanai.c | 9 +++++++-- drivers/atm/nicstar.c | 5 +++-- drivers/atm/zatm.c | 5 ++++- 10 files changed, 46 insertions(+), 26 deletions(-) diff --git a/drivers/atm/ambassador.c b/drivers/atm/ambassador.c index b3754b96b3a6d..674cb70accc57 100644 --- a/drivers/atm/ambassador.c +++ b/drivers/atm/ambassador.c @@ -868,7 +868,8 @@ static inline void interrupts_off (amb_dev * dev) { /********** interrupt handling **********/ -static void interrupt_handler (int irq, void * dev_id, struct pt_regs * pt_regs) { +static irqreturn_t interrupt_handler(int irq, void *dev_id, + struct pt_regs *pt_regs) { amb_dev * dev = amb_devs; (void) pt_regs; @@ -876,7 +877,7 @@ static void interrupt_handler (int irq, void * dev_id, struct pt_regs * pt_regs) if (!dev_id) { PRINTD (DBG_IRQ|DBG_ERR, "irq with NULL dev_id: %d", irq); - return; + return IRQ_NONE; } // Did one of our cards generate the interrupt? while (dev) { @@ -889,12 +890,12 @@ static void interrupt_handler (int irq, void * dev_id, struct pt_regs * pt_regs) // the card generates an IRQ at startup - should not happen again if (!dev) { PRINTD (DBG_IRQ, "irq for unknown device: %d", irq); - return; + return IRQ_NONE; } // impossible - unless we have memory corruption of dev or kernel if (irq != dev->irq) { PRINTD (DBG_IRQ|DBG_ERR, "irq mismatch: %d", irq); - return; + return IRQ_NONE; } { @@ -903,7 +904,7 @@ static void interrupt_handler (int irq, void * dev_id, struct pt_regs * pt_regs) // for us or someone else sharing the same interrupt if (!interrupt) { PRINTD (DBG_IRQ, "irq not for me: %d", irq); - return; + return IRQ_NONE; } // definitely for us @@ -934,7 +935,7 @@ static void interrupt_handler (int irq, void * dev_id, struct pt_regs * pt_regs) } PRINTD (DBG_IRQ|DBG_FLOW, "interrupt_handler done: %p", dev_id); - return; + return IRQ_HANDLED; } /********** don't panic... yeah, right **********/ diff --git a/drivers/atm/eni.c b/drivers/atm/eni.c index 383c7f3c4ef33..1fa495093b8ac 100644 --- a/drivers/atm/eni.c +++ b/drivers/atm/eni.c @@ -1483,7 +1483,7 @@ static void bug_int(struct atm_dev *dev,unsigned long reason) } -static void eni_int(int irq,void *dev_id,struct pt_regs *regs) +static irqreturn_t eni_int(int irq,void *dev_id,struct pt_regs *regs) { struct atm_dev *dev; struct eni_dev *eni_dev; @@ -1515,6 +1515,7 @@ static void eni_int(int irq,void *dev_id,struct pt_regs *regs) eni_dev->events |= reason; spin_unlock(&eni_dev->lock); tasklet_schedule(&eni_dev->task); + return IRQ_HANDLED; } diff --git a/drivers/atm/firestream.c b/drivers/atm/firestream.c index 43c21d7214427..20eee46882f5d 100644 --- a/drivers/atm/firestream.c +++ b/drivers/atm/firestream.c @@ -1562,14 +1562,15 @@ static void __devexit free_freepool (struct fs_dev *dev, struct freepool *fp) -static void fs_irq (int irq, void *dev_id, struct pt_regs * pt_regs) +static irqreturn_t fs_irq (int irq, void *dev_id, struct pt_regs * pt_regs) { int i; u32 status; struct fs_dev *dev = dev_id; status = read_fs (dev, ISR); - if (!status) return; + if (!status) + return IRQ_NONE; func_enter (); @@ -1649,6 +1650,7 @@ static void fs_irq (int irq, void *dev_id, struct pt_regs * pt_regs) } func_exit (); + return IRQ_HANDLED; } diff --git a/drivers/atm/fore200e.c b/drivers/atm/fore200e.c index ecaed0224407a..5938b3b32286c 100644 --- a/drivers/atm/fore200e.c +++ b/drivers/atm/fore200e.c @@ -1227,7 +1227,7 @@ fore200e_irq_rx(struct fore200e* fore200e) } -static void +static irqreturn_t fore200e_interrupt(int irq, void* dev, struct pt_regs* regs) { struct fore200e* fore200e = FORE200E_DEV((struct atm_dev*)dev); @@ -1235,13 +1235,14 @@ fore200e_interrupt(int irq, void* dev, struct pt_regs* regs) if (fore200e->bus->irq_check(fore200e) == 0) { DPRINTK(3, "unexpected interrupt on device %c\n", fore200e->name[9]); - return; + return IRQ_NONE; } DPRINTK(3, "valid interrupt on device %c\n", fore200e->name[9]); tasklet_schedule(&fore200e->tasklet); fore200e->bus->irq_ack(fore200e); + return IRQ_HANDLED; } diff --git a/drivers/atm/horizon.c b/drivers/atm/horizon.c index 878c3354b01a6..71f0facd70f35 100644 --- a/drivers/atm/horizon.c +++ b/drivers/atm/horizon.c @@ -1398,7 +1398,8 @@ static inline void rx_data_av_handler (hrz_dev * dev) { /********** interrupt handler **********/ -static void interrupt_handler (int irq, void * dev_id, struct pt_regs * pt_regs) { +static irqreturn_t interrupt_handler(int irq, void *dev_id, + struct pt_regs *pt_regs) { hrz_dev * dev = hrz_devs; u32 int_source; unsigned int irq_ok; @@ -1408,7 +1409,7 @@ static void interrupt_handler (int irq, void * dev_id, struct pt_regs * pt_regs) if (!dev_id) { PRINTD (DBG_IRQ|DBG_ERR, "irq with NULL dev_id: %d", irq); - return; + return IRQ_NONE; } // Did one of our cards generate the interrupt? while (dev) { @@ -1418,11 +1419,11 @@ static void interrupt_handler (int irq, void * dev_id, struct pt_regs * pt_regs) } if (!dev) { PRINTD (DBG_IRQ, "irq not for me: %d", irq); - return; + return IRQ_NONE; } if (irq != dev->irq) { PRINTD (DBG_IRQ|DBG_ERR, "irq mismatch: %d", irq); - return; + return IRQ_NONE; } // definitely for us @@ -1468,6 +1469,9 @@ static void interrupt_handler (int irq, void * dev_id, struct pt_regs * pt_regs) } PRINTD (DBG_IRQ|DBG_FLOW, "interrupt_handler done: %p", dev_id); + if (irq_ok) + return IRQ_HANDLED; + return IRQ_NONE; } /********** housekeeping **********/ diff --git a/drivers/atm/idt77252.c b/drivers/atm/idt77252.c index 3a59d3d3833cb..98fc3aaf7c0e0 100644 --- a/drivers/atm/idt77252.c +++ b/drivers/atm/idt77252.c @@ -134,8 +134,6 @@ static int idt77252_change_qos(struct atm_vcc *vcc, struct atm_qos *qos, int flags); static int idt77252_proc_read(struct atm_dev *dev, loff_t * pos, char *page); -static void idt77252_interrupt(int irq, void *dev_id, - struct pt_regs *regs); static void idt77252_softint(void *dev_id); @@ -2812,7 +2810,7 @@ idt77252_collect_stat(struct idt77252_dev *card) #endif } -static void +static irqreturn_t idt77252_interrupt(int irq, void *dev_id, struct pt_regs *ptregs) { struct idt77252_dev *card = dev_id; @@ -2820,7 +2818,7 @@ idt77252_interrupt(int irq, void *dev_id, struct pt_regs *ptregs) stat = readl(SAR_REG_STAT) & 0xffff; if (!stat) /* no interrupt for us */ - return; + return IRQ_NONE; if (test_and_set_bit(IDT77252_BIT_INTERRUPT, &card->flags)) { printk("%s: Re-entering irq_handler()\n", card->name); @@ -2901,6 +2899,7 @@ idt77252_interrupt(int irq, void *dev_id, struct pt_regs *ptregs) out: clear_bit(IDT77252_BIT_INTERRUPT, &card->flags); + return IRQ_HANDLED; } static void diff --git a/drivers/atm/iphase.c b/drivers/atm/iphase.c index 7d47bb1288c53..522d7b6d22e14 100644 --- a/drivers/atm/iphase.c +++ b/drivers/atm/iphase.c @@ -2197,16 +2197,18 @@ err_out: return -ENOMEM; } -static void ia_int(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t ia_int(int irq, void *dev_id, struct pt_regs *regs) { struct atm_dev *dev; IADEV *iadev; unsigned int status; + int handled = 0; dev = dev_id; iadev = INPH_IA_DEV(dev); while( (status = readl(iadev->reg+IPHASE5575_BUS_STATUS_REG) & 0x7f)) { + handled = 1; IF_EVENT(printk("ia_int: status = 0x%x\n", status);) if (status & STAT_REASSINT) { @@ -2236,7 +2238,8 @@ static void ia_int(int irq, void *dev_id, struct pt_regs *regs) if (status & STAT_FEINT) IaFrontEndIntr(iadev); } - } + } + return IRQ_RETVAL(handled); } diff --git a/drivers/atm/lanai.c b/drivers/atm/lanai.c index c688f0cd8e549..730987f6add71 100644 --- a/drivers/atm/lanai.c +++ b/drivers/atm/lanai.c @@ -2047,10 +2047,12 @@ static inline void lanai_int_1(struct lanai_dev *lanai, u32 reason) reg_write(lanai, ack, IntAck_Reg); } -static void lanai_int(int irq, void *devid, struct pt_regs *regs) +static irqreturn_t lanai_int(int irq, void *devid, struct pt_regs *regs) { struct lanai_dev *lanai = (struct lanai_dev *) devid; u32 reason; + int handled = 0; + (void) irq; (void) regs; /* unused variables */ #ifdef USE_POWERDOWN if (lanai->conf1 & CONFIG1_POWERDOWN) { @@ -2062,8 +2064,11 @@ static void lanai_int(int irq, void *devid, struct pt_regs *regs) conf2_write(lanai); } #endif - while ((reason = intr_pending(lanai)) != 0) + while ((reason = intr_pending(lanai)) != 0) { + handled = 1; lanai_int_1(lanai, reason); + } + return IRQ_RETVAL(handled); } /* TODO - it would be nice if we could use the "delayed interrupt" system diff --git a/drivers/atm/nicstar.c b/drivers/atm/nicstar.c index bfc3984cd8684..6774662e87fc2 100644 --- a/drivers/atm/nicstar.c +++ b/drivers/atm/nicstar.c @@ -220,7 +220,7 @@ static scq_info *get_scq(int size, u32 scd); static void free_scq(scq_info *scq, struct atm_vcc *vcc); static void push_rxbufs(ns_dev *card, u32 type, u32 handle1, u32 addr1, u32 handle2, u32 addr2); -static void ns_irq_handler(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t ns_irq_handler(int irq, void *dev_id, struct pt_regs *regs); static int ns_open(struct atm_vcc *vcc, short vpi, int vci); static void ns_close(struct atm_vcc *vcc); static void fill_tst(ns_dev *card, int n, vc_map *vc); @@ -1186,7 +1186,7 @@ static void push_rxbufs(ns_dev *card, u32 type, u32 handle1, u32 addr1, -static void ns_irq_handler(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t ns_irq_handler(int irq, void *dev_id, struct pt_regs *regs) { u32 stat_r; ns_dev *card; @@ -1366,6 +1366,7 @@ static void ns_irq_handler(int irq, void *dev_id, struct pt_regs *regs) spin_unlock_irqrestore(&card->int_lock, flags); PRINTK("nicstar%d: end of interrupt service\n", card->index); + return IRQ_HANDLED; } diff --git a/drivers/atm/zatm.c b/drivers/atm/zatm.c index 04ed4dd347149..de941c3c3aca8 100644 --- a/drivers/atm/zatm.c +++ b/drivers/atm/zatm.c @@ -1214,15 +1214,17 @@ static int start_tx(struct atm_dev *dev) /*------------------------------- interrupts --------------------------------*/ -static void zatm_int(int irq,void *dev_id,struct pt_regs *regs) +static irqreturn_t zatm_int(int irq,void *dev_id,struct pt_regs *regs) { struct atm_dev *dev; struct zatm_dev *zatm_dev; u32 reason; + int handled = 0; dev = dev_id; zatm_dev = ZATM_DEV(dev); while ((reason = zin(GSR))) { + handled = 1; EVENT("reason 0x%x\n",reason,0); if (reason & uPD98401_INT_PI) { EVENT("PHY int\n",0,0); @@ -1285,6 +1287,7 @@ static void zatm_int(int irq,void *dev_id,struct pt_regs *regs) } /* @@@ handle RCRn */ } + return IRQ_RETVAL(handled); } -- 2.53.0