diff -r 16fddae16c94 -r ffa13db95e10 master/master.c --- a/master/master.c Tue Oct 24 12:06:59 2006 +0000 +++ b/master/master.c Tue Oct 24 15:14:25 2006 +0000 @@ -58,6 +58,7 @@ void ec_master_sync_io(ec_master_t *); void ec_master_idle_run(void *); void ec_master_eoe_run(unsigned long); +void ec_master_check_sdo(unsigned long); ssize_t ec_show_master_attribute(struct kobject *, struct attribute *, char *); ssize_t ec_store_master_attribute(struct kobject *, struct attribute *, const char *, size_t); @@ -130,8 +131,11 @@ master->idle_cycle_time_pos = 0; master->eoe_cycle_time_pos = 0; master->debug_level = 0; - INIT_LIST_HEAD(&master->sdo_requests); - init_waitqueue_head(&master->sdo_wait_queue); + init_MUTEX(&master->sdo_sem); + init_timer(&master->sdo_timer); + master->sdo_timer.function = ec_master_check_sdo; + master->sdo_timer.data = (unsigned long) master; + init_completion(&master->sdo_complete); // create workqueue if (!(master->workqueue = create_singlethread_workqueue("EtherCAT"))) { @@ -301,14 +305,11 @@ void ec_master_flush_sdo_requests(ec_master_t *master) { - ec_sdo_request_t *req, *next_req; - - list_for_each_entry_safe(req, next_req, &master->sdo_requests, queue) { - list_del_init(&req->queue); - req->return_code = -1; - } - - wake_up_interruptible(&master->sdo_wait_queue); + del_timer_sync(&master->sdo_timer); + complete(&master->sdo_complete); + master->sdo_request = NULL; + master->sdo_seq_user = 0; + master->sdo_seq_master = 0; } /*****************************************************************************/ @@ -1004,6 +1005,7 @@ } /*****************************************************************************/ + /** Does the Ethernet-over-EtherCAT processing. */ @@ -1067,6 +1069,25 @@ /*****************************************************************************/ /** +*/ + +void ec_master_check_sdo(unsigned long data /**< master pointer */) +{ + ec_master_t *master = (ec_master_t *) data; + + if (master->sdo_seq_master != master->sdo_seq_user) { + master->sdo_timer.expires = jiffies + 10; + add_timer(&master->sdo_timer); + return; + } + + // master has processed the request + complete(&master->sdo_complete); +} + +/*****************************************************************************/ + +/** Calculates Advanced Position Adresses. */