]> rtime.felk.cvut.cz Git - lincan.git/blobdiff - lincan/src/sja1000.c
First part of IRQ handling changes
[lincan.git] / lincan / src / sja1000.c
index 6a4318577a1fa056fff482f2cb3ce8b499963718..dfc47a290f3df84a0e239ffe4d7c1c61debe6f4b 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)
@@ -387,12 +386,6 @@ void sja1000_irq_read_handler(struct chip_t *chip, struct msgobj_t *obj)
                id = can_read_reg(chip, SJARXID0) | (can_read_reg(chip, SJARXID1)<<8);
                obj->rx_msg.length = len = id & 0x0f;
                obj->rx_msg.flags = id&sjaID0_RTR ? MSG_RTR : 0;
-               #ifdef CAN_MSG_VERSION_2
-               obj->rx_msg.timestamp.tv_sec = 0;
-               obj->rx_msg.timestamp.tv_usec = 0;
-               #else /* CAN_MSG_VERSION_2 */
-               obj->rx_msg.timestamp = 0;
-               #endif /* CAN_MSG_VERSION_2 */
                obj->rx_msg.cob = 0;
                obj->rx_msg.id = id>>5;
 
@@ -402,6 +395,9 @@ void sja1000_irq_read_handler(struct chip_t *chip, struct msgobj_t *obj)
 
                can_write_reg(chip, sjaCMR_RRB, SJACMR);
 
+               /* fill CAN message timestamp */
+               can_filltimestamp(&obj->rx_msg.timestamp);
+
                canque_filter_msg2edges(obj->qends, &obj->rx_msg);
        } while(can_read_reg(chip, SJASR) & sjaSR_RBS);
 }
@@ -413,6 +409,9 @@ void sja1000_irq_write_handler(struct chip_t *chip, struct msgobj_t *obj)
        if(obj->tx_slot){
                /* Do local transmitted message distribution if enabled */
                if (processlocal){
+                       /* fill CAN message timestamp */
+                       can_filltimestamp(&obj->tx_slot->msg.timestamp);
+                       
                        obj->tx_slot->msg.flags |= MSG_LOCAL;
                        canque_filter_msg2edges(obj->qends, &obj->tx_slot->msg);
                }
@@ -491,3 +490,12 @@ int sja1000_register(struct chipspecops_t *chipspecops)
        chipspecops->irq_handler = sja1000_irq_handler;
        return 0;
 }
+
+int sja1000_fill_chipspecops(struct chip_t *chip)
+{
+       chip->chip_type="sja1000";
+       chip->max_objects=1;
+       sja1000_register(chip->chipspecops);
+       return 0;
+}
+