equal
deleted
inserted
replaced
348 |
348 |
349 /** |
349 /** |
350 Starts the master associated with the device. |
350 Starts the master associated with the device. |
351 This function has to be called by the network device driver to tell the |
351 This function has to be called by the network device driver to tell the |
352 master that the device is ready to send and receive data. The master |
352 master that the device is ready to send and receive data. The master |
353 will enter the free-run mode then. |
353 will enter the idle mode then. |
354 \ingroup DeviceInterface |
354 \ingroup DeviceInterface |
355 */ |
355 */ |
356 |
356 |
357 int ecdev_start(unsigned int master_index /**< master index */) |
357 int ecdev_start(unsigned int master_index /**< master index */) |
358 { |
358 { |
362 if (ec_device_open(master->device)) { |
362 if (ec_device_open(master->device)) { |
363 EC_ERR("Failed to open device!\n"); |
363 EC_ERR("Failed to open device!\n"); |
364 return -1; |
364 return -1; |
365 } |
365 } |
366 |
366 |
367 ec_master_freerun_start(master); |
367 ec_master_idle_start(master); |
368 return 0; |
368 return 0; |
369 } |
369 } |
370 |
370 |
371 /*****************************************************************************/ |
371 /*****************************************************************************/ |
372 |
372 |
380 void ecdev_stop(unsigned int master_index /**< master index */) |
380 void ecdev_stop(unsigned int master_index /**< master index */) |
381 { |
381 { |
382 ec_master_t *master; |
382 ec_master_t *master; |
383 if (!(master = ec_find_master(master_index))) return; |
383 if (!(master = ec_find_master(master_index))) return; |
384 |
384 |
385 ec_master_freerun_stop(master); |
385 ec_master_idle_stop(master); |
386 |
386 |
387 if (ec_device_close(master->device)) |
387 if (ec_device_close(master->device)) |
388 EC_WARN("Failed to close device!\n"); |
388 EC_WARN("Failed to close device!\n"); |
389 } |
389 } |
390 |
390 |
422 if (!try_module_get(master->device->module)) { |
422 if (!try_module_get(master->device->module)) { |
423 EC_ERR("Failed to reserve device module!\n"); |
423 EC_ERR("Failed to reserve device module!\n"); |
424 goto out_release; |
424 goto out_release; |
425 } |
425 } |
426 |
426 |
427 ec_master_freerun_stop(master); |
427 ec_master_idle_stop(master); |
428 ec_master_reset(master); |
428 ec_master_reset(master); |
429 master->mode = EC_MASTER_MODE_RUNNING; |
429 master->mode = EC_MASTER_MODE_RUNNING; |
430 |
430 |
431 if (!master->device->link_state) EC_WARN("Link is DOWN.\n"); |
431 if (!master->device->link_state) EC_WARN("Link is DOWN.\n"); |
432 |
432 |
439 return master; |
439 return master; |
440 |
440 |
441 out_module_put: |
441 out_module_put: |
442 module_put(master->device->module); |
442 module_put(master->device->module); |
443 ec_master_reset(master); |
443 ec_master_reset(master); |
444 ec_master_freerun_start(master); |
444 ec_master_idle_start(master); |
445 out_release: |
445 out_release: |
446 master->reserved = 0; |
446 master->reserved = 0; |
447 out_return: |
447 out_return: |
448 EC_ERR("Failed requesting master %i.\n", master_index); |
448 EC_ERR("Failed requesting master %i.\n", master_index); |
449 return NULL; |
449 return NULL; |
464 EC_ERR("Master %i was never requested!\n", master->index); |
464 EC_ERR("Master %i was never requested!\n", master->index); |
465 return; |
465 return; |
466 } |
466 } |
467 |
467 |
468 ec_master_reset(master); |
468 ec_master_reset(master); |
469 ec_master_freerun_start(master); |
469 ec_master_idle_start(master); |
470 |
470 |
471 module_put(master->device->module); |
471 module_put(master->device->module); |
472 master->reserved = 0; |
472 master->reserved = 0; |
473 |
473 |
474 EC_INFO("Released master %i.\n", master->index); |
474 EC_INFO("Released master %i.\n", master->index); |