309 if (ec_device_init(master->device, master, net_dev, isr, module)) { |
309 if (ec_device_init(master->device, master, net_dev, isr, module)) { |
310 EC_ERR("Failed to init device!\n"); |
310 EC_ERR("Failed to init device!\n"); |
311 goto out_free; |
311 goto out_free; |
312 } |
312 } |
313 |
313 |
314 if (ec_device_open(master->device)) { |
|
315 EC_ERR("Failed to open device!\n"); |
|
316 goto out_clear; |
|
317 } |
|
318 |
|
319 up(&master->device_sem); |
314 up(&master->device_sem); |
320 |
|
321 ec_master_enter_idle_mode(master); |
|
322 |
|
323 return master->device; |
315 return master->device; |
324 |
316 |
325 out_clear: |
|
326 ec_device_clear(master->device); |
|
327 out_free: |
317 out_free: |
328 kfree(master->device); |
318 kfree(master->device); |
329 master->device = NULL; |
319 master->device = NULL; |
330 out_up: |
320 out_up: |
331 up(&master->device_sem); |
321 up(&master->device_sem); |
350 { |
340 { |
351 ec_master_t *master; |
341 ec_master_t *master; |
352 |
342 |
353 if (!(master = ec_find_master(master_index))) return; |
343 if (!(master = ec_find_master(master_index))) return; |
354 |
344 |
355 ec_master_leave_idle_mode(master); |
|
356 |
|
357 if (ec_device_close(master->device)) |
|
358 EC_WARN("Failed to close device!\n"); |
|
359 |
|
360 down(&master->device_sem); |
345 down(&master->device_sem); |
361 |
346 |
362 if (!master->device || master->device != device) { |
347 if (!master->device || master->device != device) { |
363 up(&master->device_sem); |
348 up(&master->device_sem); |
364 EC_WARN("Unable to unregister device!\n"); |
349 EC_WARN("Unable to unregister device!\n"); |
368 ec_device_clear(master->device); |
353 ec_device_clear(master->device); |
369 kfree(master->device); |
354 kfree(master->device); |
370 master->device = NULL; |
355 master->device = NULL; |
371 |
356 |
372 up(&master->device_sem); |
357 up(&master->device_sem); |
|
358 } |
|
359 |
|
360 /*****************************************************************************/ |
|
361 |
|
362 /** |
|
363 Opens the network device and makes the master enter IDLE mode. |
|
364 \return 0 on success, else < 0 |
|
365 \ingroup DeviceInterface |
|
366 */ |
|
367 |
|
368 int ecdev_open(ec_device_t *device /**< EtherCAT device */) |
|
369 { |
|
370 if (ec_device_open(device)) { |
|
371 EC_ERR("Failed to open device!\n"); |
|
372 return -1; |
|
373 } |
|
374 |
|
375 ec_master_enter_idle_mode(device->master); |
|
376 return 0; |
|
377 } |
|
378 |
|
379 /*****************************************************************************/ |
|
380 |
|
381 /** |
|
382 Makes the master leave IDLE mode and closes the network device. |
|
383 \return 0 on success, else < 0 |
|
384 \ingroup DeviceInterface |
|
385 */ |
|
386 |
|
387 void ecdev_close(ec_device_t *device /**< EtherCAT device */) |
|
388 { |
|
389 ec_master_leave_idle_mode(device->master); |
|
390 |
|
391 if (ec_device_close(device)) |
|
392 EC_WARN("Failed to close device!\n"); |
373 } |
393 } |
374 |
394 |
375 /****************************************************************************** |
395 /****************************************************************************** |
376 * Realtime interface |
396 * Realtime interface |
377 *****************************************************************************/ |
397 *****************************************************************************/ |
463 module_init(ec_init_module); |
483 module_init(ec_init_module); |
464 module_exit(ec_cleanup_module); |
484 module_exit(ec_cleanup_module); |
465 |
485 |
466 EXPORT_SYMBOL(ecdev_register); |
486 EXPORT_SYMBOL(ecdev_register); |
467 EXPORT_SYMBOL(ecdev_unregister); |
487 EXPORT_SYMBOL(ecdev_unregister); |
|
488 EXPORT_SYMBOL(ecdev_open); |
|
489 EXPORT_SYMBOL(ecdev_close); |
468 EXPORT_SYMBOL(ecrt_request_master); |
490 EXPORT_SYMBOL(ecrt_request_master); |
469 EXPORT_SYMBOL(ecrt_release_master); |
491 EXPORT_SYMBOL(ecrt_release_master); |
470 |
492 |
471 /** \endcond */ |
493 /** \endcond */ |
472 |
494 |