X-Git-Url: http://rtime.felk.cvut.cz/gitweb/lincan.git/blobdiff_plain/c6d6f58c34e1b6a4c03d1e86d1abf48eeb6f5624..bfac169862856611eeb16af24c8943f005f88e12:/lincan/src/virtual.c diff --git a/lincan/src/virtual.c b/lincan/src/virtual.c index d51a5cb..05a12f9 100644 --- a/lincan/src/virtual.c +++ b/lincan/src/virtual.c @@ -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 */ - 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) { 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(); */ - 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;