]> rtime.felk.cvut.cz Git - lincan.git/blobdiff - lincan/src/virtual.c
Structured comments updated.
[lincan.git] / lincan / src / virtual.c
index e4b9c17cccc9487b44806210ef1608e80d4eaf68..05a12f9d5026e69ca65f12702fcb4c9484a1f719 100644 (file)
@@ -280,43 +280,38 @@ 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 */
-       can_spinlock_t dummy_lock;
 
-       /*  preempt_disable() */
-       can_spin_lock_init(&dummy_lock);
-       can_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) {
                        mod_timer(&obj->tx_timeout,
                                jiffies+virtual_bus_latency(obj));
-                       CANMSG("virtual: scheduled delivery\n");
+                       DEBUGMSG("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(); */
-       can_spin_unlock(&dummy_lock);
+       can_preempt_enable();
 }
 
 
@@ -330,9 +325,9 @@ void virtual_do_tx_timeout(unsigned long data)
                /* Free transmitted slot */
                canque_free_outslot(obj->qends, obj->tx_qedge, obj->tx_slot);
                obj->tx_slot=NULL;
-               CANMSG("virtual: delayed delivery\n");
+               DEBUGMSG("virtual: delayed delivery\n");
        }
-       clear_bit(OBJ_TX_LOCK,&obj->flags);
+       can_msgobj_clear_fl(obj,TX_LOCK);
 
        virtual_schedule_next(obj);
 }
@@ -342,29 +337,38 @@ void virtual_do_tx_timeout(unsigned long data)
  * @chip: pointer to chip state structure
  * @obj: pointer to message object structure
  *
+ * Function is responsible for initiating message transmition.
+ * It is responsible for clearing of object TX_REQUEST flag
+ *
  * Return Value: negative value reports error.
  * File: src/virtual.c
  */
 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;
-       
+
+       can_msgobj_clear_fl(obj,TX_REQUEST);
+
+    #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) {
                                canque_filter_msg2edges(obj->qends, &slot->msg);
-                               CANMSG("virtual: direct delivery\n");
+                               DEBUGMSG("virtual: direct delivery\n");
                        }
                        canque_free_outslot(obj->qends, qedge, slot);
                }
+    #ifndef CAN_WITH_RTL
        } else {
                virtual_schedule_next(obj);
        }
+    #endif /*CAN_WITH_RTL*/
 
        return 0;
 }
@@ -483,7 +487,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;