* 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) {
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();
}
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);
}
*/
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) {
}
canque_free_outslot(obj->qends, qedge, slot);
}
+ #ifndef CAN_WITH_RTL
} else {
virtual_schedule_next(obj);
}
+ #endif /*CAN_WITH_RTL*/
return 0;
}
{
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;