master/module.c
changeset 306 45886de3db87
parent 305 03aab3068f08
child 321 64e20e6e9d0b
equal deleted inserted replaced
305:03aab3068f08 306:45886de3db87
   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);