X-Git-Url: http://rtime.felk.cvut.cz/gitweb/lincan.git/blobdiff_plain/91dfab84182937b62ef64cb12d8e4f89e6d5c3ec..b34a548a5dfd2f0b068fd835a4cd51680d851068:/lincan/src/virtual.c diff --git a/lincan/src/virtual.c b/lincan/src/virtual.c index e4b9c17..80ce0fb 100644 --- a/lincan/src/virtual.c +++ b/lincan/src/virtual.c @@ -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 */ - 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) { @@ -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(); */ - can_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;