equal
deleted
inserted
replaced
56 |
56 |
57 void ec_master_clear(struct kobject *); |
57 void ec_master_clear(struct kobject *); |
58 void ec_master_sync_io(ec_master_t *); |
58 void ec_master_sync_io(ec_master_t *); |
59 void ec_master_idle_run(void *); |
59 void ec_master_idle_run(void *); |
60 void ec_master_eoe_run(unsigned long); |
60 void ec_master_eoe_run(unsigned long); |
|
61 void ec_master_check_sdo(unsigned long); |
61 ssize_t ec_show_master_attribute(struct kobject *, struct attribute *, char *); |
62 ssize_t ec_show_master_attribute(struct kobject *, struct attribute *, char *); |
62 ssize_t ec_store_master_attribute(struct kobject *, struct attribute *, |
63 ssize_t ec_store_master_attribute(struct kobject *, struct attribute *, |
63 const char *, size_t); |
64 const char *, size_t); |
64 |
65 |
65 /*****************************************************************************/ |
66 /*****************************************************************************/ |
128 master->eoe_cycle_times[i] = 0; |
129 master->eoe_cycle_times[i] = 0; |
129 } |
130 } |
130 master->idle_cycle_time_pos = 0; |
131 master->idle_cycle_time_pos = 0; |
131 master->eoe_cycle_time_pos = 0; |
132 master->eoe_cycle_time_pos = 0; |
132 master->debug_level = 0; |
133 master->debug_level = 0; |
133 INIT_LIST_HEAD(&master->sdo_requests); |
134 init_MUTEX(&master->sdo_sem); |
134 init_waitqueue_head(&master->sdo_wait_queue); |
135 init_timer(&master->sdo_timer); |
|
136 master->sdo_timer.function = ec_master_check_sdo; |
|
137 master->sdo_timer.data = (unsigned long) master; |
|
138 init_completion(&master->sdo_complete); |
135 |
139 |
136 // create workqueue |
140 // create workqueue |
137 if (!(master->workqueue = create_singlethread_workqueue("EtherCAT"))) { |
141 if (!(master->workqueue = create_singlethread_workqueue("EtherCAT"))) { |
138 EC_ERR("Failed to create master workqueue.\n"); |
142 EC_ERR("Failed to create master workqueue.\n"); |
139 goto out_return; |
143 goto out_return; |
299 Flushes the SDO request queue. |
303 Flushes the SDO request queue. |
300 */ |
304 */ |
301 |
305 |
302 void ec_master_flush_sdo_requests(ec_master_t *master) |
306 void ec_master_flush_sdo_requests(ec_master_t *master) |
303 { |
307 { |
304 ec_sdo_request_t *req, *next_req; |
308 del_timer_sync(&master->sdo_timer); |
305 |
309 complete(&master->sdo_complete); |
306 list_for_each_entry_safe(req, next_req, &master->sdo_requests, queue) { |
310 master->sdo_request = NULL; |
307 list_del_init(&req->queue); |
311 master->sdo_seq_user = 0; |
308 req->return_code = -1; |
312 master->sdo_seq_master = 0; |
309 } |
|
310 |
|
311 wake_up_interruptible(&master->sdo_wait_queue); |
|
312 } |
313 } |
313 |
314 |
314 /*****************************************************************************/ |
315 /*****************************************************************************/ |
315 |
316 |
316 /** |
317 /** |
1002 |
1003 |
1003 master->eoe_running = 0; |
1004 master->eoe_running = 0; |
1004 } |
1005 } |
1005 |
1006 |
1006 /*****************************************************************************/ |
1007 /*****************************************************************************/ |
|
1008 |
1007 /** |
1009 /** |
1008 Does the Ethernet-over-EtherCAT processing. |
1010 Does the Ethernet-over-EtherCAT processing. |
1009 */ |
1011 */ |
1010 |
1012 |
1011 void ec_master_eoe_run(unsigned long data /**< master pointer */) |
1013 void ec_master_eoe_run(unsigned long data /**< master pointer */) |
1060 queue_timer: |
1062 queue_timer: |
1061 restart_jiffies = HZ / EC_EOE_FREQUENCY; |
1063 restart_jiffies = HZ / EC_EOE_FREQUENCY; |
1062 if (!restart_jiffies) restart_jiffies = 1; |
1064 if (!restart_jiffies) restart_jiffies = 1; |
1063 master->eoe_timer.expires += restart_jiffies; |
1065 master->eoe_timer.expires += restart_jiffies; |
1064 add_timer(&master->eoe_timer); |
1066 add_timer(&master->eoe_timer); |
|
1067 } |
|
1068 |
|
1069 /*****************************************************************************/ |
|
1070 |
|
1071 /** |
|
1072 */ |
|
1073 |
|
1074 void ec_master_check_sdo(unsigned long data /**< master pointer */) |
|
1075 { |
|
1076 ec_master_t *master = (ec_master_t *) data; |
|
1077 |
|
1078 if (master->sdo_seq_master != master->sdo_seq_user) { |
|
1079 master->sdo_timer.expires = jiffies + 10; |
|
1080 add_timer(&master->sdo_timer); |
|
1081 return; |
|
1082 } |
|
1083 |
|
1084 // master has processed the request |
|
1085 complete(&master->sdo_complete); |
1065 } |
1086 } |
1066 |
1087 |
1067 /*****************************************************************************/ |
1088 /*****************************************************************************/ |
1068 |
1089 |
1069 /** |
1090 /** |