]> rtime.felk.cvut.cz Git - lincan.git/blobdiff - lincan/src/virtual.c
LinCAN can be compiled in mode with RT-Linux chip worker threads now.
[lincan.git] / lincan / src / virtual.c
index d51a5cbe2ee546b4b7e01431f9de9275ba366c4e..80ce0fbd5f07df20f61c442eaf63e97e545bfd48 100644 (file)
@@ -280,27 +280,23 @@ void virtual_irq_write_handler(struct chip_t *chip, struct msgobj_t *obj)
  * message queues.
  * File: src/virtual.c
  */
-irqreturn_t virtual_irq_handler(int irq, void *dev_id, struct pt_regs *regs)
+can_irqreturn_t virtual_irq_handler(int irq, void *dev_id, struct pt_regs *regs)
 {
-       return IRQ_HANDLED;
+       return CAN_IRQ_HANDLED;
 }
 
 
 void virtual_schedule_next(struct msgobj_t *obj)
 {
        int cmd;
-        /* dummy lock to prevent preemption fully portable way */
-       spinlock_t dummy_lock;
 
-       /*  preempt_disable() */
-       spin_lock_init(&dummy_lock);
-       spin_lock(&dummy_lock);
+       can_preempt_disable();
 
-       set_bit(OBJ_TX_REQUEST,&obj->flags);
+       can_msgobj_set_fl(obj,TX_REQUEST);
        
-       while(!test_and_set_bit(OBJ_TX_LOCK,&obj->flags)){
+       while(!can_msgobj_test_and_set_fl(obj,TX_LOCK)){
 
-               clear_bit(OBJ_TX_REQUEST,&obj->flags);
+               can_msgobj_clear_fl(obj,TX_REQUEST);
                
                cmd=canque_test_outslot(obj->qends, &obj->tx_qedge, &obj->tx_slot);
                if(cmd>=0) {
@@ -309,14 +305,13 @@ void virtual_schedule_next(struct msgobj_t *obj)
                        CANMSG("virtual: scheduled delivery\n");
 
                } else          
-                       clear_bit(OBJ_TX_LOCK,&obj->flags);
+                       can_msgobj_clear_fl(obj,TX_LOCK);
                
-               if(!test_bit(OBJ_TX_REQUEST,&obj->flags)) break;
+               if(!can_msgobj_test_fl(obj,TX_REQUEST)) break;
                DEBUGMSG("TX looping in virtual_schedule_next\n");
        }
 
-       /* preempt_enable(); */
-       spin_unlock(&dummy_lock);
+       can_preempt_enable();
 }
 
 
@@ -332,7 +327,7 @@ void virtual_do_tx_timeout(unsigned long data)
                obj->tx_slot=NULL;
                CANMSG("virtual: delayed delivery\n");
        }
-       clear_bit(OBJ_TX_LOCK,&obj->flags);
+       can_msgobj_clear_fl(obj,TX_LOCK);
 
        virtual_schedule_next(obj);
 }
@@ -347,13 +342,15 @@ void virtual_do_tx_timeout(unsigned long data)
  */
 int virtual_wakeup_tx(struct chip_t *chip, struct msgobj_t *obj)
 {
-       /* set_bit(OBJ_TX_REQUEST,&obj->flags); */
+       /* can_msgobj_set_fl(obj,TX_REQUEST); */
        
        struct canque_edge_t *qedge;
        struct canque_slot_t *slot;
        int cmd;
-       
+
+    #ifndef CAN_WITH_RTL
        if(!virtual_bus_latency(obj)) {
+    #endif /*CAN_WITH_RTL*/
                /* Ensure delivery of all ready slots */
                while((cmd=canque_test_outslot(obj->qends, &qedge, &slot)) >= 0){
                        if(cmd==0) {
@@ -362,9 +359,11 @@ int virtual_wakeup_tx(struct chip_t *chip, struct msgobj_t *obj)
                        }
                        canque_free_outslot(obj->qends, qedge, slot);
                }
+    #ifndef CAN_WITH_RTL
        } else {
                virtual_schedule_next(obj);
        }
+    #endif /*CAN_WITH_RTL*/
 
        return 0;
 }
@@ -483,7 +482,6 @@ int virtual_init_obj_data(struct chip_t *chip, int objnr)
 {
        struct msgobj_t *obj=chip->msgobj[objnr];
        obj->obj_base_addr=chip->chip_base_addr;
-       obj->flags=0;
        obj->tx_timeout.function=virtual_do_tx_timeout;
        obj->tx_timeout.data=(unsigned long)obj;
        return 0;