+int virtual_irq_handler(int irq, struct canchip_t *chip)
+{
+ return CANCHIP_IRQ_HANDLED;
+}
+
+
+void virtual_schedule_next(struct msgobj_t *obj)
+{
+ int cmd;
+
+ can_preempt_disable();
+
+ can_msgobj_set_fl(obj,TX_REQUEST);
+
+ while(!can_msgobj_test_and_set_fl(obj,TX_LOCK)){
+
+ 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));
+ DEBUGMSG("virtual: scheduled delivery\n");
+
+ } else
+ can_msgobj_clear_fl(obj,TX_LOCK);
+
+ if(!can_msgobj_test_fl(obj,TX_REQUEST)) break;
+ DEBUGMSG("TX looping in virtual_schedule_next\n");
+ }
+
+ can_preempt_enable();
+}
+
+
+void virtual_do_tx_timeout(unsigned long data)