1 /****************************************************************************** |
1 /****************************************************************************** |
2 * |
2 * |
3 * $Id$ |
3 * $Id$ |
4 * |
4 * |
5 * Copyright (C) 2006-2008 Florian Pose, Ingenieurgemeinschaft IgH |
5 * Copyright (C) 2006-2012 Florian Pose, Ingenieurgemeinschaft IgH |
6 * |
6 * |
7 * This file is part of the IgH EtherCAT Master. |
7 * This file is part of the IgH EtherCAT Master. |
8 * |
8 * |
9 * The IgH EtherCAT Master is free software; you can redistribute it and/or |
9 * The IgH EtherCAT Master is free software; you can redistribute it and/or |
10 * modify it under the terms of the GNU General Public License version 2, as |
10 * modify it under the terms of the GNU General Public License version 2, as |
153 slave->jiffies_preop = 0; |
153 slave->jiffies_preop = 0; |
154 |
154 |
155 INIT_LIST_HEAD(&slave->slave_sdo_requests); |
155 INIT_LIST_HEAD(&slave->slave_sdo_requests); |
156 init_waitqueue_head(&slave->sdo_queue); |
156 init_waitqueue_head(&slave->sdo_queue); |
157 |
157 |
|
158 INIT_LIST_HEAD(&slave->reg_requests); |
|
159 init_waitqueue_head(&slave->reg_queue); |
|
160 |
158 INIT_LIST_HEAD(&slave->foe_requests); |
161 INIT_LIST_HEAD(&slave->foe_requests); |
159 init_waitqueue_head(&slave->foe_queue); |
162 init_waitqueue_head(&slave->foe_queue); |
160 |
163 |
161 INIT_LIST_HEAD(&slave->soe_requests); |
164 INIT_LIST_HEAD(&slave->soe_requests); |
162 init_waitqueue_head(&slave->soe_queue); |
165 init_waitqueue_head(&slave->soe_queue); |
200 " slave about to be deleted.\n"); |
203 " slave about to be deleted.\n"); |
201 request->req.state = EC_INT_REQUEST_FAILURE; |
204 request->req.state = EC_INT_REQUEST_FAILURE; |
202 wake_up(&slave->sdo_queue); |
205 wake_up(&slave->sdo_queue); |
203 } |
206 } |
204 |
207 |
|
208 while (!list_empty(&slave->reg_requests)) { |
|
209 ec_reg_request_t *reg = |
|
210 list_entry(slave->reg_requests.next, ec_reg_request_t, list); |
|
211 list_del_init(®->list); // dequeue |
|
212 EC_SLAVE_WARN(slave, "Discarding register request," |
|
213 " slave about to be deleted.\n"); |
|
214 reg->state = EC_INT_REQUEST_FAILURE; |
|
215 wake_up(&slave->reg_queue); |
|
216 } |
|
217 |
205 while (!list_empty(&slave->foe_requests)) { |
218 while (!list_empty(&slave->foe_requests)) { |
206 ec_master_foe_request_t *request = |
219 ec_master_foe_request_t *request = |
207 list_entry(slave->foe_requests.next, |
220 list_entry(slave->foe_requests.next, |
208 ec_master_foe_request_t, list); |
221 ec_master_foe_request_t, list); |
209 list_del_init(&request->list); // dequeue |
222 list_del_init(&request->list); // dequeue |
222 " slave about to be deleted.\n"); |
235 " slave about to be deleted.\n"); |
223 request->req.state = EC_INT_REQUEST_FAILURE; |
236 request->req.state = EC_INT_REQUEST_FAILURE; |
224 wake_up(&slave->soe_queue); |
237 wake_up(&slave->soe_queue); |
225 } |
238 } |
226 |
239 |
227 if (slave->config) |
240 if (slave->config) { |
228 ec_slave_config_detach(slave->config); |
241 ec_slave_config_detach(slave->config); |
|
242 } |
229 |
243 |
230 // free all SDOs |
244 // free all SDOs |
231 list_for_each_entry_safe(sdo, next_sdo, &slave->sdo_dictionary, list) { |
245 list_for_each_entry_safe(sdo, next_sdo, &slave->sdo_dictionary, list) { |
232 list_del(&sdo->list); |
246 list_del(&sdo->list); |
233 ec_sdo_clear(sdo); |
247 ec_sdo_clear(sdo); |
249 list_del(&pdo->list); |
263 list_del(&pdo->list); |
250 ec_pdo_clear(pdo); |
264 ec_pdo_clear(pdo); |
251 kfree(pdo); |
265 kfree(pdo); |
252 } |
266 } |
253 |
267 |
254 if (slave->sii_words) |
268 if (slave->sii_words) { |
255 kfree(slave->sii_words); |
269 kfree(slave->sii_words); |
|
270 } |
|
271 |
256 ec_fsm_slave_clear(&slave->fsm); |
272 ec_fsm_slave_clear(&slave->fsm); |
257 ec_datagram_clear(&slave->fsm_datagram); |
273 ec_datagram_clear(&slave->fsm_datagram); |
258 } |
274 } |
259 |
275 |
260 /*****************************************************************************/ |
276 /*****************************************************************************/ |