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 |
314 up(&master->device_sem); |
319 up(&master->device_sem); |
|
320 |
|
321 ec_master_enter_idle_mode(master); |
|
322 |
315 return master->device; |
323 return master->device; |
316 |
324 |
|
325 out_clear: |
|
326 ec_device_clear(master->device); |
317 out_free: |
327 out_free: |
318 kfree(master->device); |
328 kfree(master->device); |
319 master->device = NULL; |
329 master->device = NULL; |
320 out_up: |
330 out_up: |
321 up(&master->device_sem); |
331 up(&master->device_sem); |
340 { |
350 { |
341 ec_master_t *master; |
351 ec_master_t *master; |
342 |
352 |
343 if (!(master = ec_find_master(master_index))) return; |
353 if (!(master = ec_find_master(master_index))) return; |
344 |
354 |
|
355 ec_master_leave_idle_mode(master); |
|
356 |
|
357 if (ec_device_close(master->device)) |
|
358 EC_WARN("Failed to close device!\n"); |
|
359 |
345 down(&master->device_sem); |
360 down(&master->device_sem); |
346 |
361 |
347 if (!master->device || master->device != device) { |
362 if (!master->device || master->device != device) { |
348 up(&master->device_sem); |
363 up(&master->device_sem); |
349 EC_WARN("Unable to unregister device!\n"); |
364 EC_WARN("Unable to unregister device!\n"); |
353 ec_device_clear(master->device); |
368 ec_device_clear(master->device); |
354 kfree(master->device); |
369 kfree(master->device); |
355 master->device = NULL; |
370 master->device = NULL; |
356 |
371 |
357 up(&master->device_sem); |
372 up(&master->device_sem); |
358 } |
|
359 |
|
360 /*****************************************************************************/ |
|
361 |
|
362 /** |
|
363 Starts the master associated with the device. |
|
364 This function has to be called by the network device driver to tell the |
|
365 master that the device is ready to send and receive data. The master |
|
366 will enter the idle mode then. |
|
367 \ingroup DeviceInterface |
|
368 */ |
|
369 |
|
370 int ecdev_start(unsigned int master_index /**< master index */) |
|
371 { |
|
372 ec_master_t *master; |
|
373 if (!(master = ec_find_master(master_index))) return -1; |
|
374 |
|
375 if (ec_device_open(master->device)) { |
|
376 EC_ERR("Failed to open device!\n"); |
|
377 return -1; |
|
378 } |
|
379 |
|
380 ec_master_enter_idle_mode(master); |
|
381 |
|
382 return 0; |
|
383 } |
|
384 |
|
385 /*****************************************************************************/ |
|
386 |
|
387 /** |
|
388 Stops the master associated with the device. |
|
389 Tells the master to stop using the device for frame IO. Has to be called |
|
390 before unregistering the device. |
|
391 \ingroup DeviceInterface |
|
392 */ |
|
393 |
|
394 void ecdev_stop(unsigned int master_index /**< master index */) |
|
395 { |
|
396 ec_master_t *master; |
|
397 if (!(master = ec_find_master(master_index))) return; |
|
398 |
|
399 ec_master_leave_idle_mode(master); |
|
400 |
|
401 if (ec_device_close(master->device)) |
|
402 EC_WARN("Failed to close device!\n"); |
|
403 } |
373 } |
404 |
374 |
405 /****************************************************************************** |
375 /****************************************************************************** |
406 * Realtime interface |
376 * Realtime interface |
407 *****************************************************************************/ |
377 *****************************************************************************/ |
493 module_init(ec_init_module); |
463 module_init(ec_init_module); |
494 module_exit(ec_cleanup_module); |
464 module_exit(ec_cleanup_module); |
495 |
465 |
496 EXPORT_SYMBOL(ecdev_register); |
466 EXPORT_SYMBOL(ecdev_register); |
497 EXPORT_SYMBOL(ecdev_unregister); |
467 EXPORT_SYMBOL(ecdev_unregister); |
498 EXPORT_SYMBOL(ecdev_start); |
|
499 EXPORT_SYMBOL(ecdev_stop); |
|
500 EXPORT_SYMBOL(ecrt_request_master); |
468 EXPORT_SYMBOL(ecrt_request_master); |
501 EXPORT_SYMBOL(ecrt_release_master); |
469 EXPORT_SYMBOL(ecrt_release_master); |
502 |
470 |
503 /** \endcond */ |
471 /** \endcond */ |
504 |
472 |