struct rtr_id *rtr_current, *new_rtr_entry;
struct msgobj_t *obj;
struct canchip_t *chip;
+ int err;
/*struct canque_ends_t *qends;*/
-
+
DEBUGMSG("Remote transmission request\n");
/*qends = canuser->qends;*/
if (hardware_p->rtr_queue == NULL) { //No remote messages pending
new_rtr_entry=(struct rtr_id *)kmalloc(sizeof(struct rtr_id),GFP_ATOMIC);
if (new_rtr_entry == NULL) {
- can_spin_unlock_irqrestore(&hardware_p->rtr_lock,
+ can_spin_unlock_irqrestore(&hardware_p->rtr_lock,
flags);
return -ENOMEM;
}
}
init_waitqueue_head(&new_rtr_entry->rtr_wq);
new_rtr_entry->id = rtr_id;
+ new_rtr_entry->ready_fl = 0;
new_rtr_entry->rtr_message = rtr_msg;
new_rtr_entry->next=NULL;
/* Send remote transmission request */
chip->chipspecops->remote_request(chip,obj);
obj->ret = 0;
- interruptible_sleep_on(&new_rtr_entry->rtr_wq);
+
+ err = wait_event_interruptible(new_rtr_entry->rtr_wq, new_rtr_entry->ready_fl);
can_spin_lock_irqsave(&hardware_p->rtr_lock, flags);
if (hardware_p->rtr_queue == new_rtr_entry) {
- if (new_rtr_entry->next != NULL)
+ if (new_rtr_entry->next != NULL)
hardware_p->rtr_queue=new_rtr_entry->next;
else
hardware_p->rtr_queue=NULL;
can_spin_unlock_irqrestore(&hardware_p->rtr_lock, flags);
kfree(new_rtr_entry);
+ if (err)
+ return -EINTR;
+
return obj->ret;
}