112 int ret; |
112 int ret; |
113 |
113 |
114 master->index = index; |
114 master->index = index; |
115 master->reserved = 0; |
115 master->reserved = 0; |
116 |
116 |
117 init_MUTEX(&master->master_sem); |
117 sema_init(&master->master_sem, 1); |
118 |
118 |
119 master->main_mac = main_mac; |
119 master->main_mac = main_mac; |
120 master->backup_mac = backup_mac; |
120 master->backup_mac = backup_mac; |
121 init_MUTEX(&master->device_sem); |
121 |
|
122 sema_init(&master->device_sem, 1); |
122 |
123 |
123 master->phase = EC_ORPHANED; |
124 master->phase = EC_ORPHANED; |
124 master->injection_seq_fsm = 0; |
125 master->injection_seq_fsm = 0; |
125 master->injection_seq_rt = 0; |
126 master->injection_seq_rt = 0; |
126 |
127 |
133 master->app_start_time = 0ULL; |
134 master->app_start_time = 0ULL; |
134 master->has_start_time = 0; |
135 master->has_start_time = 0; |
135 |
136 |
136 master->scan_busy = 0; |
137 master->scan_busy = 0; |
137 master->allow_scan = 1; |
138 master->allow_scan = 1; |
138 init_MUTEX(&master->scan_sem); |
139 sema_init(&master->scan_sem, 1); |
139 init_waitqueue_head(&master->scan_queue); |
140 init_waitqueue_head(&master->scan_queue); |
140 |
141 |
141 master->config_busy = 0; |
142 master->config_busy = 0; |
142 master->allow_config = 1; |
143 master->allow_config = 1; |
143 init_MUTEX(&master->config_sem); |
144 sema_init(&master->config_sem, 1); |
144 init_waitqueue_head(&master->config_queue); |
145 init_waitqueue_head(&master->config_queue); |
145 |
146 |
146 INIT_LIST_HEAD(&master->datagram_queue); |
147 INIT_LIST_HEAD(&master->datagram_queue); |
147 master->datagram_index = 0; |
148 master->datagram_index = 0; |
148 |
149 |
149 INIT_LIST_HEAD(&master->ext_datagram_queue); |
150 INIT_LIST_HEAD(&master->ext_datagram_queue); |
150 init_MUTEX(&master->ext_queue_sem); |
151 sema_init(&master->ext_queue_sem, 1); |
151 |
152 |
152 INIT_LIST_HEAD(&master->domains); |
153 INIT_LIST_HEAD(&master->domains); |
153 |
154 |
154 master->debug_level = debug_level; |
155 master->debug_level = debug_level; |
155 master->stats.timeouts = 0; |
156 master->stats.timeouts = 0; |
163 #ifdef EC_EOE |
164 #ifdef EC_EOE |
164 master->eoe_thread = NULL; |
165 master->eoe_thread = NULL; |
165 INIT_LIST_HEAD(&master->eoe_handlers); |
166 INIT_LIST_HEAD(&master->eoe_handlers); |
166 #endif |
167 #endif |
167 |
168 |
168 init_MUTEX(&master->io_sem); |
169 sema_init(&master->io_sem, 1); |
169 master->send_cb = NULL; |
170 master->send_cb = NULL; |
170 master->receive_cb = NULL; |
171 master->receive_cb = NULL; |
171 master->app_send_cb = NULL; |
172 master->app_send_cb = NULL; |
172 master->app_receive_cb = NULL; |
173 master->app_receive_cb = NULL; |
173 |
174 |
346 { |
347 { |
347 ec_slave_t *slave; |
348 ec_slave_t *slave; |
348 |
349 |
349 master->dc_ref_clock = NULL; |
350 master->dc_ref_clock = NULL; |
350 |
351 |
|
352 // external requests are obsolete, so we wake pending waiters and remove them from the list |
|
353 // SII |
|
354 while (1) { |
|
355 ec_sii_write_request_t *request; |
|
356 if (list_empty(&master->sii_requests)) |
|
357 break; |
|
358 // get first request |
|
359 request = list_entry(master->sii_requests.next, ec_sii_write_request_t, |
|
360 list); |
|
361 list_del_init(&request->list); // dequeue |
|
362 EC_INFO("Discarding SII request, slave %u does not exist anymore.\n", |
|
363 request->slave->ring_position); |
|
364 request->state = EC_INT_REQUEST_FAILURE; |
|
365 wake_up(&master->sii_queue); |
|
366 } |
|
367 // Reg |
|
368 while (1) { |
|
369 ec_reg_request_t *request; |
|
370 if (list_empty(&master->reg_requests)) |
|
371 break; |
|
372 // get first request |
|
373 request = list_entry(master->reg_requests.next, |
|
374 ec_reg_request_t, list); |
|
375 list_del_init(&request->list); // dequeue |
|
376 EC_INFO("Discarding Reg request, slave %u does not exist anymore.\n", |
|
377 request->slave->ring_position); |
|
378 request->state = EC_INT_REQUEST_FAILURE; |
|
379 wake_up(&master->reg_queue); |
|
380 } |
|
381 // SDO |
|
382 while (1) { |
|
383 ec_master_sdo_request_t *request; |
|
384 if (list_empty(&master->slave_sdo_requests)) |
|
385 break; |
|
386 // get first request |
|
387 request = list_entry(master->slave_sdo_requests.next, |
|
388 ec_master_sdo_request_t, list); |
|
389 list_del_init(&request->list); // dequeue |
|
390 EC_INFO("Discarding SDO request, slave %u does not exist anymore.\n", |
|
391 request->slave->ring_position); |
|
392 request->req.state = EC_INT_REQUEST_FAILURE; |
|
393 wake_up(&master->sdo_queue); |
|
394 } |
|
395 // FOE |
|
396 while (1) { |
|
397 ec_master_foe_request_t *request; |
|
398 if (list_empty(&master->foe_requests)) |
|
399 break; |
|
400 // get first request |
|
401 request = list_entry(master->foe_requests.next, |
|
402 ec_master_foe_request_t, list); |
|
403 list_del_init(&request->list); // dequeue |
|
404 EC_INFO("Discarding FOE request, slave %u does not exist anymore.\n", |
|
405 request->slave->ring_position); |
|
406 request->req.state = EC_INT_REQUEST_FAILURE; |
|
407 wake_up(&master->foe_queue); |
|
408 } |
|
409 |
351 for (slave = master->slaves; |
410 for (slave = master->slaves; |
352 slave < master->slaves + master->slave_count; |
411 slave < master->slaves + master->slave_count; |
353 slave++) { |
412 slave++) { |
354 ec_slave_clear(slave); |
413 ec_slave_clear(slave); |
355 } |
414 } |