--- a/master/canopen.c Tue Oct 24 12:06:59 2006 +0000
+++ b/master/canopen.c Tue Oct 24 15:14:25 2006 +0000
@@ -295,18 +295,31 @@
off_t off = 0;
ec_sdo_request_t request;
+ if (down_interruptible(&master->sdo_sem)) {
+ // interrupted by signal
+ return -ERESTARTSYS;
+ }
+
ec_sdo_request_init_read(&request, sdo, entry);
- list_add_tail(&request.queue, &master->sdo_requests);
- if (wait_event_interruptible(master->sdo_wait_queue,
- request.return_code)) {
- // interrupted by signal
- list_del_init(&request.queue);
- }
+
+ // this is necessary, because the completion object
+ // is completed by the ec_master_flush_sdo_requests() function.
+ INIT_COMPLETION(master->sdo_complete);
+
+ master->sdo_request = &request;
+ master->sdo_seq_user++;
+ master->sdo_timer.expires = jiffies + 10;
+ add_timer(&master->sdo_timer);
+
+ wait_for_completion(&master->sdo_complete);
+
+ master->sdo_request = NULL;
+ up(&master->sdo_sem);
if (request.return_code == 1 && request.data) {
off += ec_sdo_entry_format_data(entry, &request, buffer);
}
- else if (request.return_code < 0) {
+ else {
off = -EINVAL;
}