179 { |
179 { |
180 ec_master_t *master; |
180 ec_master_t *master; |
181 |
181 |
182 if (!net_dev) { |
182 if (!net_dev) { |
183 EC_WARN("Device is NULL!\n"); |
183 EC_WARN("Device is NULL!\n"); |
184 return NULL; |
184 goto out_return; |
185 } |
185 } |
186 |
186 |
187 if (!(master = ec_find_master(master_index))) return NULL; |
187 if (!(master = ec_find_master(master_index))) return NULL; |
188 |
188 |
189 // critical section start |
189 // critical section start |
190 if (master->device) { |
190 if (master->device) { |
191 EC_ERR("Master %i already has a device!\n", master_index); |
191 EC_ERR("Master %i already has a device!\n", master_index); |
192 return NULL; |
192 // critical section leave |
|
193 goto out_return; |
193 } |
194 } |
194 |
195 |
195 if (!(master->device = |
196 if (!(master->device = |
196 (ec_device_t *) kmalloc(sizeof(ec_device_t), GFP_KERNEL))) { |
197 (ec_device_t *) kmalloc(sizeof(ec_device_t), GFP_KERNEL))) { |
197 EC_ERR("Failed to allocate device!\n"); |
198 EC_ERR("Failed to allocate device!\n"); |
198 return NULL; |
199 // critical section leave |
|
200 goto out_return; |
199 } |
201 } |
200 // critical section end |
202 // critical section end |
201 |
203 |
202 if (ec_device_init(master->device, master, net_dev, isr, module)) { |
204 if (ec_device_init(master->device, master, net_dev, isr, module)) { |
203 kfree(master->device); |
205 EC_ERR("Failed to init device!\n"); |
204 master->device = NULL; |
206 goto out_free; |
205 return NULL; |
|
206 } |
207 } |
207 |
208 |
208 return master->device; |
209 return master->device; |
|
210 |
|
211 out_free: |
|
212 kfree(master->device); |
|
213 master->device = NULL; |
|
214 out_return: |
|
215 return NULL; |
209 } |
216 } |
210 |
217 |
211 /*****************************************************************************/ |
218 /*****************************************************************************/ |
212 |
219 |
213 /** |
220 /** |
220 /**< EtherCAT-Geraet */ |
227 /**< EtherCAT-Geraet */ |
221 ) |
228 ) |
222 { |
229 { |
223 ec_master_t *master; |
230 ec_master_t *master; |
224 |
231 |
225 if (master_index >= ec_master_count) { |
|
226 EC_WARN("Master %i does not exist!\n", master_index); |
|
227 return; |
|
228 } |
|
229 |
|
230 if (!(master = ec_find_master(master_index))) return; |
232 if (!(master = ec_find_master(master_index))) return; |
231 |
233 |
232 if (!master->device || master->device != device) { |
234 if (!master->device || master->device != device) { |
233 EC_WARN("Unable to unregister device!\n"); |
235 EC_WARN("Unable to unregister device!\n"); |
234 return; |
236 return; |
237 ec_device_clear(master->device); |
239 ec_device_clear(master->device); |
238 kfree(master->device); |
240 kfree(master->device); |
239 master->device = NULL; |
241 master->device = NULL; |
240 } |
242 } |
241 |
243 |
|
244 /*****************************************************************************/ |
|
245 |
|
246 /** |
|
247 Starts the master. |
|
248 */ |
|
249 |
|
250 int ecdev_start(unsigned int master_index |
|
251 /**< Index des EtherCAT-Masters */ |
|
252 ) |
|
253 { |
|
254 ec_master_t *master; |
|
255 if (!(master = ec_find_master(master_index))) return -1; |
|
256 |
|
257 if (ec_device_open(master->device)) { |
|
258 EC_ERR("Failed to open device!\n"); |
|
259 return -1; |
|
260 } |
|
261 |
|
262 ec_master_freerun_start(master); |
|
263 return 0; |
|
264 } |
|
265 |
|
266 /*****************************************************************************/ |
|
267 |
|
268 /** |
|
269 Stops the master. |
|
270 */ |
|
271 |
|
272 void ecdev_stop(unsigned int master_index |
|
273 /**< Index des EtherCAT-Masters */ |
|
274 ) |
|
275 { |
|
276 ec_master_t *master; |
|
277 if (!(master = ec_find_master(master_index))) return; |
|
278 |
|
279 ec_master_freerun_stop(master); |
|
280 |
|
281 if (ec_device_close(master->device)) |
|
282 EC_WARN("Failed to close device!\n"); |
|
283 } |
|
284 |
242 /****************************************************************************** |
285 /****************************************************************************** |
243 * |
286 * |
244 * Echtzeitschnittstelle |
287 * Echtzeitschnittstelle |
245 * |
288 * |
246 *****************************************************************************/ |
289 *****************************************************************************/ |
259 { |
302 { |
260 ec_master_t *master; |
303 ec_master_t *master; |
261 |
304 |
262 EC_INFO("Requesting master %i...\n", master_index); |
305 EC_INFO("Requesting master %i...\n", master_index); |
263 |
306 |
264 if (!(master = ec_find_master(master_index))) goto req_return; |
307 if (!(master = ec_find_master(master_index))) goto out_return; |
265 |
308 |
266 // begin critical section |
309 // begin critical section |
267 if (master->reserved) { |
310 if (master->reserved) { |
268 EC_ERR("Master %i is already in use!\n", master_index); |
311 EC_ERR("Master %i is already in use!\n", master_index); |
269 goto req_return; |
312 goto out_return; |
270 } |
313 } |
271 master->reserved = 1; |
314 master->reserved = 1; |
272 // end critical section |
315 // end critical section |
273 |
316 |
274 if (!master->device) { |
317 if (!master->device) { |
275 EC_ERR("Master %i has no assigned device!\n", master_index); |
318 EC_ERR("Master %i has no assigned device!\n", master_index); |
276 goto req_release; |
319 goto out_release; |
277 } |
320 } |
278 |
321 |
279 if (!try_module_get(master->device->module)) { |
322 if (!try_module_get(master->device->module)) { |
280 EC_ERR("Failed to reserve device module!\n"); |
323 EC_ERR("Failed to reserve device module!\n"); |
281 goto req_release; |
324 goto out_release; |
282 } |
325 } |
283 |
326 |
284 if (ec_device_open(master->device)) { |
327 ec_master_freerun_stop(master); |
285 EC_ERR("Failed to open device!\n"); |
328 ec_master_reset(master); |
286 goto req_module_put; |
329 master->mode = EC_MASTER_MODE_RUNNING; |
287 } |
|
288 |
330 |
289 if (!master->device->link_state) EC_WARN("Link is DOWN.\n"); |
331 if (!master->device->link_state) EC_WARN("Link is DOWN.\n"); |
290 |
332 |
291 if (ec_master_bus_scan(master)) { |
333 if (ec_master_bus_scan(master)) { |
292 EC_ERR("Bus scan failed!\n"); |
334 EC_ERR("Bus scan failed!\n"); |
293 goto req_close; |
335 goto out_module_put; |
294 } |
336 } |
295 |
337 |
296 EC_INFO("Master %i is ready.\n", master_index); |
338 EC_INFO("Master %i is ready.\n", master_index); |
297 return master; |
339 return master; |
298 |
340 |
299 req_close: |
341 out_module_put: |
300 if (ec_device_close(master->device)) |
|
301 EC_WARN("Warning - Failed to close device!\n"); |
|
302 req_module_put: |
|
303 module_put(master->device->module); |
342 module_put(master->device->module); |
304 ec_master_reset(master); |
343 ec_master_reset(master); |
305 req_release: |
344 out_release: |
306 master->reserved = 0; |
345 master->reserved = 0; |
307 req_return: |
346 out_return: |
308 EC_ERR("Failed requesting master %i.\n", master_index); |
347 EC_ERR("Failed requesting master %i.\n", master_index); |
309 return NULL; |
348 return NULL; |
310 } |
349 } |
311 |
350 |
312 /*****************************************************************************/ |
351 /*****************************************************************************/ |
324 return; |
363 return; |
325 } |
364 } |
326 |
365 |
327 ec_master_reset(master); |
366 ec_master_reset(master); |
328 |
367 |
329 if (ec_device_close(master->device)) |
368 master->mode = EC_MASTER_MODE_IDLE; |
330 EC_WARN("Warning - Failed to close device!\n"); |
369 ec_master_freerun_start(master); |
331 |
370 |
332 module_put(master->device->module); |
371 module_put(master->device->module); |
333 master->reserved = 0; |
372 master->reserved = 0; |
334 |
373 |
335 EC_INFO("Released master %i.\n", master->index); |
374 EC_INFO("Released master %i.\n", master->index); |
387 module_init(ec_init_module); |
426 module_init(ec_init_module); |
388 module_exit(ec_cleanup_module); |
427 module_exit(ec_cleanup_module); |
389 |
428 |
390 EXPORT_SYMBOL(ecdev_register); |
429 EXPORT_SYMBOL(ecdev_register); |
391 EXPORT_SYMBOL(ecdev_unregister); |
430 EXPORT_SYMBOL(ecdev_unregister); |
|
431 EXPORT_SYMBOL(ecdev_start); |
|
432 EXPORT_SYMBOL(ecdev_stop); |
392 EXPORT_SYMBOL(ecrt_request_master); |
433 EXPORT_SYMBOL(ecrt_request_master); |
393 EXPORT_SYMBOL(ecrt_release_master); |
434 EXPORT_SYMBOL(ecrt_release_master); |
394 |
435 |
395 /*****************************************************************************/ |
436 /*****************************************************************************/ |
396 |
437 |