]> rtime.felk.cvut.cz Git - lincan.git/blobdiff - lincan/src/i82527.c
Changed SJA1000 chip IRQ handling to loop until all requests are served
[lincan.git] / lincan / src / i82527.c
index d11a79b740c8d6d8ef86706067b38835ab2d78a6..fb232f380725269d2fc8e0b224d6df92ea3a420e 100644 (file)
@@ -618,6 +618,7 @@ int i82527_irq_handler(int irq, struct canchip_t *chip)
        unsigned irq_register;
        unsigned object;
        struct msgobj_t *obj;
+       int loop_cnt=CHIP_MAX_IRQLOOP;
 
        /*put_reg=device->hwspecops->write_register;*/
        /*get_reg=device->hwspecops->read_register;*/
@@ -632,6 +633,11 @@ int i82527_irq_handler(int irq, struct canchip_t *chip)
 
        do {
 
+               if(!loop_cnt--) {
+                       CANMSG("i82527_irq_handler IRQ %d stuck\n",irq);
+                       return CANCHIP_IRQ_STUCK;
+               }
+               
                DEBUGMSG("i82527: iIRQ 0x%02x\n",irq_register);
                
                if (irq_register == 0x01) {
@@ -660,8 +666,10 @@ int i82527_irq_handler(int irq, struct canchip_t *chip)
 
                        i82527_irq_read_handler(chip, obj, object); 
                }
+               
+               irq_register=i82527_seg_read_reg(chip, iIRQ);
 
-       } while((irq_register=i82527_seg_read_reg(chip, iIRQ)) != 0);
+       } while(irq_register != 0);
 
        return CANCHIP_IRQ_HANDLED;
 }