First part of IRQ handling changes
authorppisa <ppisa>
Mon, 30 Aug 2004 03:06:43 +0000 (03:06 +0000)
committerppisa <ppisa>
Mon, 30 Aug 2004 03:06:43 +0000 (03:06 +0000)
16 files changed:
lincan/include/c_can.h
lincan/include/constants.h
lincan/include/i82527.h
lincan/include/irq.h
lincan/include/main.h
lincan/include/sja1000.h
lincan/include/sja1000p.h
lincan/src/c_can_irq.c
lincan/src/ems_cpcpci.c
lincan/src/i82527.c
lincan/src/irq.c
lincan/src/setup.c
lincan/src/sja1000.c
lincan/src/sja1000p.c
lincan/src/unican.c
lincan/src/virtual.c

index 772213a..99a4c29 100644 (file)
@@ -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);
 
index d5c66d9..aef197d 100644 (file)
 #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)
index 2b98162..cc1f314 100644 (file)
@@ -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);
 
 
index 14a21cd..315336a 100644 (file)
@@ -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);
index 4860694..3af24c6 100644 (file)
@@ -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 {
index 16dc20c..abc5169 100644 (file)
@@ -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 */
index 9ec11e3..cd21c22 100644 (file)
@@ -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 {
index d114336..71e84fc 100644 (file)
@@ -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;
 }
 
 ///////////////////////////////////////////////////////////////////////////////
index da82fd3..8938909 100644 (file)
@@ -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)
index 682374a..3aed30b 100644 (file)
@@ -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,
index 78f0574..7793f01 100644 (file)
@@ -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;
 }
index 394704c..5dba951 100644 (file)
@@ -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);
index d5f7b15..dfc47a2 100644 (file)
@@ -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)
index 3087db5..39dff69 100644 (file)
@@ -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;
 }
 
 /**
index f2c7ec6..957d5af 100644 (file)
@@ -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;
 }
 
 
index b7e5f37..67fc276 100644 (file)
@@ -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;
 }