From 258e4a224adc90317b3d11622a3076ba6d61b0d2 Mon Sep 17 00:00:00 2001 From: ppisa Date: Mon, 30 Aug 2004 03:06:43 +0000 Subject: [PATCH] First part of IRQ handling changes --- lincan/include/c_can.h | 2 +- lincan/include/constants.h | 4 ++++ lincan/include/i82527.h | 2 +- lincan/include/irq.h | 7 ++++--- lincan/include/main.h | 2 +- lincan/include/sja1000.h | 2 +- lincan/include/sja1000p.h | 2 ++ lincan/src/c_can_irq.c | 7 +++---- lincan/src/ems_cpcpci.c | 12 +++++------- lincan/src/i82527.c | 11 +++++------ lincan/src/irq.c | 4 ++-- lincan/src/setup.c | 11 ++++++++++- lincan/src/sja1000.c | 7 +++---- lincan/src/sja1000p.c | 9 ++++----- lincan/src/unican.c | 9 ++++----- lincan/src/virtual.c | 4 ++-- 16 files changed, 52 insertions(+), 43 deletions(-) diff --git a/lincan/include/c_can.h b/lincan/include/c_can.h index 772213a..99a4c29 100644 --- a/lincan/include/c_can.h +++ b/lincan/include/c_can.h @@ -70,7 +70,7 @@ void c_can_registerdump(struct chip_t *pchip); void c_can_irq_sync_activities(struct chip_t *chip, struct msgobj_t *obj); -can_irqreturn_t c_can_irq_handler(int irq, void *dev_id, struct pt_regs *regs); +int c_can_irq_handler(int irq, struct chip_t *chip); int c_can_fill_chipspecops(struct chip_t *chip); diff --git a/lincan/include/constants.h b/lincan/include/constants.h index d5c66d9..aef197d 100644 --- a/lincan/include/constants.h +++ b/lincan/include/constants.h @@ -79,6 +79,10 @@ #define CHIP_IRQ_PCI (1<<3) #define CHIP_IRQ_VME (1<<4) +/* System independent defines of IRQ handled state */ +#define CANCHIP_IRQ_NONE 0 +#define CANCHIP_IRQ_HANDLED 1 + /* These flags can be used for the candevices_t structure flags data entry */ #define CANDEV_PROGRAMMABLE_IRQ (1<<0) #define CANDEV_IO_RESERVED (1<<1) diff --git a/lincan/include/i82527.h b/lincan/include/i82527.h index 2b98162..cc1f314 100644 --- a/lincan/include/i82527.h +++ b/lincan/include/i82527.h @@ -31,7 +31,7 @@ int i82527_set_btregs(struct chip_t *chip, unsigned short btr0, int i82527_start_chip(struct chip_t *chip); int i82527_stop_chip(struct chip_t *chip); int i82527_check_tx_stat(struct chip_t *chip); -can_irqreturn_t i82527_irq_handler(int irq, void *dev_id, struct pt_regs *regs); +int i82527_irq_handler(int irq, struct chip_t *chip); int i82527_fill_chipspecops(struct chip_t *chip); diff --git a/lincan/include/irq.h b/lincan/include/irq.h index 14a21cd..315336a 100644 --- a/lincan/include/irq.h +++ b/lincan/include/irq.h @@ -7,6 +7,7 @@ * Version lincan-0.3 17 Jun 2004 */ -can_irqreturn_t i82527_irq_handler(int irq, void *dev_id, struct pt_regs *regs); -can_irqreturn_t sja1000_irq_handler(int irq, void *dev_id, struct pt_regs *regs); -can_irqreturn_t dummy_irq_handler(int irq, void *dev_id, struct pt_regs *regs); +int i82527_irq_handler(int irq, struct chip_t *chip); +int sja1000_irq_handler(int irq, struct chip_t *chip); +int sja1000p_irq_handler(int irq, struct chip_t *chip); +int dummy_irq_handler(int irq, struct chip_t *chip); diff --git a/lincan/include/main.h b/lincan/include/main.h index 4860694..3af24c6 100644 --- a/lincan/include/main.h +++ b/lincan/include/main.h @@ -351,7 +351,7 @@ struct chipspecops_t { unsigned short btr1); int (*start_chip)(struct chip_t *chip); int (*stop_chip)(struct chip_t *chip); - can_irqreturn_t (*irq_handler)(int irq, void *dev_id, struct pt_regs *regs); + int (*irq_handler)(int irq, struct chip_t *chip); }; struct mem_addr { diff --git a/lincan/include/sja1000.h b/lincan/include/sja1000.h index 16dc20c..abc5169 100644 --- a/lincan/include/sja1000.h +++ b/lincan/include/sja1000.h @@ -23,7 +23,7 @@ int sja1000_set_btregs(struct chip_t *chip, unsigned short btr0, unsigned short btr1); int sja1000_start_chip(struct chip_t *chip); int sja1000_stop_chip(struct chip_t *chip); -can_irqreturn_t sja1000_irq_handler(int irq, void *dev_id, struct pt_regs *regs); +int sja1000_irq_handler(int irq, struct chip_t *chip); int sja1000_fill_chipspecops(struct chip_t *chip); /* BasicCAN mode address map */ diff --git a/lincan/include/sja1000p.h b/lincan/include/sja1000p.h index 9ec11e3..cd21c22 100644 --- a/lincan/include/sja1000p.h +++ b/lincan/include/sja1000p.h @@ -19,6 +19,8 @@ int sja1000p_pre_write_config(struct chip_t *chip, struct msgobj_t *obj, int sja1000p_send_msg(struct chip_t *chip, struct msgobj_t *obj, struct canmsg_t *msg); int sja1000p_fill_chipspecops(struct chip_t *chip); +int sja1000p_irq_handler(int irq, struct chip_t *chip); + /* PeliCAN mode */ enum SJA1000_PeliCAN_regs { diff --git a/lincan/src/c_can_irq.c b/lincan/src/c_can_irq.c index d114336..71e84fc 100644 --- a/lincan/src/c_can_irq.c +++ b/lincan/src/c_can_irq.c @@ -214,10 +214,9 @@ void c_can_irq_sync_activities(struct chip_t *chip, struct msgobj_t *obj) // c_can_irq_handler // -can_irqreturn_t c_can_irq_handler(int irq, void *dev_id, struct pt_regs *regs) +int c_can_irq_handler(int irq, struct chip_t *chip) { struct rtr_id *rtr_search = hardware_p->rtr_queue; - struct chip_t *pchip = (struct chip_t *)dev_id; u16 chip_status; int id0=0, id1=0; u16 errcount = 0; @@ -240,7 +239,7 @@ can_irqreturn_t c_can_irq_handler(int irq, void *dev_id, struct pt_regs *regs) DEBUGMSG( "\n(c%d)IRQ handler: addr=%.8lx spurious interrupt\n", pchip->chip_idx, (long)( pchip->/*v*/chip_base_addr/* + CCSR*/)); - return CAN_IRQ_NONE; + return CANCHIP_IRQ_NONE; } DEBUGMSG( "\n(c%d)IRQ handler: addr=%.8lx irqreg=0x%.4x\n", @@ -476,7 +475,7 @@ can_irqreturn_t c_can_irq_handler(int irq, void *dev_id, struct pt_regs *regs) // Get irq status again irqreg = c_can_read_reg_w( pchip, CCINTR ); } - return CAN_IRQ_HANDLED; + return CANCHIP_IRQ_HANDLED; } /////////////////////////////////////////////////////////////////////////////// diff --git a/lincan/src/ems_cpcpci.c b/lincan/src/ems_cpcpci.c index da82fd3..8938909 100644 --- a/lincan/src/ems_cpcpci.c +++ b/lincan/src/ems_cpcpci.c @@ -183,18 +183,16 @@ unsigned ems_cpcpci_read_register(unsigned long address) return readb(address); } -extern can_irqreturn_t sja1000p_irq_handler(int irq, void *dev_id, struct pt_regs *regs); - -can_irqreturn_t ems_cpcpci_irq_handler(int irq, void *dev_id, struct pt_regs *regs) +int ems_cpcpci_irq_handler(int irq, struct chip_t *chip) { - struct chip_t *chip=(struct chip_t *)dev_id; + //struct chip_t *chip=(struct chip_t *)dev_id; struct candevice_t *candev=chip->hostdevice; int i; unsigned long icr; int test_irq_again; icr=readl(candev->dev_base_addr + PITA2_ICR); - if(!(icr & PITA2_ICR_INT0)) return CAN_IRQ_NONE; + if(!(icr & PITA2_ICR_INT0)) return CANCHIP_IRQ_NONE; /* correct way to handle interrupts from all chips connected to the one PITA-2 */ do { @@ -204,12 +202,12 @@ can_irqreturn_t ems_cpcpci_irq_handler(int irq, void *dev_id, struct pt_regs *re chip=candev->chip[i]; if(!chip || !(chip->flags&CHIP_CONFIGURED)) continue; - if(sja1000p_irq_handler(irq, chip, regs)) + if(sja1000p_irq_handler(irq, chip)) test_irq_again=1; } icr=readl(candev->dev_base_addr + PITA2_ICR); } while((icr & PITA2_ICR_INT0)||test_irq_again); - return CAN_IRQ_HANDLED; + return CANCHIP_IRQ_HANDLED; } int ems_cpcpci_reset(struct candevice_t *candev) diff --git a/lincan/src/i82527.c b/lincan/src/i82527.c index 682374a..3aed30b 100644 --- a/lincan/src/i82527.c +++ b/lincan/src/i82527.c @@ -611,13 +611,12 @@ void i82527_irq_sync_activities(struct chip_t *chip, struct msgobj_t *obj) } } -can_irqreturn_t i82527_irq_handler(int irq, void *dev_id, struct pt_regs *regs) +int i82527_irq_handler(int irq, struct chip_t *chip) { unsigned char msgcfg; unsigned irq_register; unsigned object; - struct chip_t *chip=(struct chip_t *)dev_id; struct msgobj_t *obj; /*put_reg=device->hwspecops->write_register;*/ @@ -627,7 +626,7 @@ can_irqreturn_t i82527_irq_handler(int irq, void *dev_id, struct pt_regs *regs) if(!irq_register) { DEBUGMSG("i82527: spurious IRQ\n"); - return CAN_IRQ_NONE; + return CANCHIP_IRQ_NONE; } @@ -638,7 +637,7 @@ can_irqreturn_t i82527_irq_handler(int irq, void *dev_id, struct pt_regs *regs) if (irq_register == 0x01) { DEBUGMSG("Status register: 0x%x\n",can_read_reg(chip, iSTAT)); continue; - /*return CAN_IRQ_NONE;*/ + /*return CANCHIP_IRQ_NONE;*/ } if (irq_register == 0x02) @@ -646,7 +645,7 @@ can_irqreturn_t i82527_irq_handler(int irq, void *dev_id, struct pt_regs *regs) else if(irq_register < 14) object = irq_register-3; else - return CAN_IRQ_NONE; + return CANCHIP_IRQ_NONE; obj=chip->msgobj[object]; @@ -664,7 +663,7 @@ can_irqreturn_t i82527_irq_handler(int irq, void *dev_id, struct pt_regs *regs) } while((irq_register=i82527_seg_read_reg(chip, iIRQ)) != 0); - return CAN_IRQ_HANDLED; + return CANCHIP_IRQ_HANDLED; } void i82527_irq_rtr_handler(struct chip_t *chip, struct msgobj_t *obj, diff --git a/lincan/src/irq.c b/lincan/src/irq.c index 78f0574..7793f01 100644 --- a/lincan/src/irq.c +++ b/lincan/src/irq.c @@ -13,7 +13,7 @@ #include "../include/irq.h" -can_irqreturn_t dummy_irq_handler(int irq, void *dev_id, struct pt_regs *regs) { +int dummy_irq_handler(int irq, struct chip_t *chip) { CANMSG("dummy_irq_handler called irq %d \n", irq); - return CAN_IRQ_NONE; + return CANCHIP_IRQ_NONE; } diff --git a/lincan/src/setup.c b/lincan/src/setup.c index 394704c..5dba951 100644 --- a/lincan/src/setup.c +++ b/lincan/src/setup.c @@ -568,6 +568,15 @@ int init_hwspecops(struct candevice_t *candev, int *irqnum_p) #ifndef CAN_WITH_RTL +can_irqreturn_t can_default_irq_dispatch(int irq, void *dev_id, struct pt_regs *regs) +{ + int retval; + struct chip_t *chip=(struct chip_t *)dev_id; + + retval=chip->chipspecops->irq_handler(irq, chip); + return CAN_IRQ_RETVAL(retval); +} + /** * can_chip_setup_irq - attaches chip to the system interrupt processing * @chip: pointer to CAN chip structure @@ -582,7 +591,7 @@ int can_chip_setup_irq(struct chip_t *chip) return 0; if ((chip->flags & CHIP_IRQ_VME) == 0) { - if (request_irq(chip->chip_irq,chip->chipspecops->irq_handler,SA_SHIRQ,DEVICE_NAME,chip)) + if (request_irq(chip->chip_irq,can_default_irq_dispatch,SA_SHIRQ,DEVICE_NAME,chip)) return -1; else { DEBUGMSG("Registered interrupt %d\n",chip->chip_irq); diff --git a/lincan/src/sja1000.c b/lincan/src/sja1000.c index d5f7b15..dfc47a2 100644 --- a/lincan/src/sja1000.c +++ b/lincan/src/sja1000.c @@ -331,10 +331,9 @@ int sja1000_config_irqs(struct chip_t *chip, short irqs) } -can_irqreturn_t sja1000_irq_handler(int irq, void *dev_id, struct pt_regs *regs) +int sja1000_irq_handler(int irq, struct chip_t *chip) { unsigned irq_register; - struct chip_t *chip=(struct chip_t *)dev_id; struct msgobj_t *obj=chip->msgobj[0]; irq_register=can_read_reg(chip, SJAIR); @@ -343,7 +342,7 @@ can_irqreturn_t sja1000_irq_handler(int irq, void *dev_id, struct pt_regs *regs) // can_read_reg(chip, SJASR)); if ((irq_register & (sjaIR_WUI|sjaIR_DOI|sjaIR_EI|sjaIR_TI|sjaIR_RI)) == 0) - return CAN_IRQ_NONE; + return CANCHIP_IRQ_NONE; if ((irq_register & sjaIR_RI) != 0) sja1000_irq_read_handler(chip, obj); @@ -376,7 +375,7 @@ can_irqreturn_t sja1000_irq_handler(int irq, void *dev_id, struct pt_regs *regs) } } - return CAN_IRQ_HANDLED; + return CANCHIP_IRQ_HANDLED; } void sja1000_irq_read_handler(struct chip_t *chip, struct msgobj_t *obj) diff --git a/lincan/src/sja1000p.c b/lincan/src/sja1000p.c index 3087db5..39dff69 100644 --- a/lincan/src/sja1000p.c +++ b/lincan/src/sja1000p.c @@ -611,10 +611,9 @@ void sja1000p_irq_write_handler(struct chip_t *chip, struct msgobj_t *obj) * message queues. * File: src/sja1000p.c */ -can_irqreturn_t sja1000p_irq_handler(int irq, void *dev_id, struct pt_regs *regs) +int sja1000p_irq_handler(int irq, struct chip_t *chip) { int irq_register, status, error_code; - struct chip_t *chip=(struct chip_t *)dev_id; struct msgobj_t *obj=chip->msgobj[0]; irq_register=can_read_reg(chip,SJAIR); @@ -623,11 +622,11 @@ can_irqreturn_t sja1000p_irq_handler(int irq, void *dev_id, struct pt_regs *regs // can_read_reg(chip,SJASR)); if ((irq_register & (sjaIR_BEI|sjaIR_EPI|sjaIR_DOI|sjaIR_EI|sjaIR_TI|sjaIR_RI)) == 0) - return CAN_IRQ_NONE; + return CANCHIP_IRQ_NONE; if(!(chip->flags&CHIP_CONFIGURED)) { CANMSG("sja1000p_irq_handler: called for non-configured device, irq_register 0x%02x\n", irq_register); - return CAN_IRQ_NONE; + return CANCHIP_IRQ_NONE; } if ((irq_register & sjaIR_RI) != 0) { @@ -683,7 +682,7 @@ can_irqreturn_t sja1000p_irq_handler(int irq, void *dev_id, struct pt_regs *regs obj->tx_retry_cnt=0; } - return CAN_IRQ_HANDLED; + return CANCHIP_IRQ_HANDLED; } /** diff --git a/lincan/src/unican.c b/lincan/src/unican.c index f2c7ec6..957d5af 100644 --- a/lincan/src/unican.c +++ b/lincan/src/unican.c @@ -570,9 +570,8 @@ void unican_irq_sync_activities(struct chip_t *chip, struct msgobj_t *obj) * message queues. * File: src/unican.c */ -can_irqreturn_t unican_irq_handler(int irq, void *dev_id, struct pt_regs *regs) +int unican_irq_handler(int irq, struct chip_t *chip) { - struct chip_t *chip=(struct chip_t *)dev_id; sCAN_CARD *chipext = (sCAN_CARD *)chip->chip_data; struct msgobj_t *obj=chip->msgobj[0]; __u16 status; @@ -580,11 +579,11 @@ can_irqreturn_t unican_irq_handler(int irq, void *dev_id, struct pt_regs *regs) if(!(chip->flags&CHIP_CONFIGURED)) { CANMSG("unican_irq_handler: called for non-configured device\n"); - return CAN_IRQ_NONE; + return CANCHIP_IRQ_NONE; } if (cl2_get_status(chipext, &status) == CL2_NO_REQUEST) - return CAN_IRQ_NONE; + return CANCHIP_IRQ_NONE; cl2_clear_interrupt(chipext); @@ -609,7 +608,7 @@ can_irqreturn_t unican_irq_handler(int irq, void *dev_id, struct pt_regs *regs) cl2_gen_interrupt(chipext); - return CAN_IRQ_HANDLED; + return CANCHIP_IRQ_HANDLED; } diff --git a/lincan/src/virtual.c b/lincan/src/virtual.c index b7e5f37..67fc276 100644 --- a/lincan/src/virtual.c +++ b/lincan/src/virtual.c @@ -280,9 +280,9 @@ void virtual_irq_write_handler(struct chip_t *chip, struct msgobj_t *obj) * message queues. * File: src/virtual.c */ -can_irqreturn_t virtual_irq_handler(int irq, void *dev_id, struct pt_regs *regs) +int virtual_irq_handler(int irq, struct chip_t *chip) { - return CAN_IRQ_HANDLED; + return CANCHIP_IRQ_HANDLED; } -- 2.39.2