master/master.c
changeset 326 ddb48b173680
parent 325 7833cf70c4f2
child 330 b984763cecc2
equal deleted inserted replaced
325:7833cf70c4f2 326:ddb48b173680
   119     init_timer(&master->eoe_timer);
   119     init_timer(&master->eoe_timer);
   120     master->eoe_timer.function = ec_master_eoe_run;
   120     master->eoe_timer.function = ec_master_eoe_run;
   121     master->eoe_timer.data = (unsigned long) master;
   121     master->eoe_timer.data = (unsigned long) master;
   122     master->internal_lock = SPIN_LOCK_UNLOCKED;
   122     master->internal_lock = SPIN_LOCK_UNLOCKED;
   123     master->eoe_running = 0;
   123     master->eoe_running = 0;
       
   124     master->eoe_checked = 0;
   124 
   125 
   125     // create workqueue
   126     // create workqueue
   126     if (!(master->workqueue = create_singlethread_workqueue("EtherCAT"))) {
   127     if (!(master->workqueue = create_singlethread_workqueue("EtherCAT"))) {
   127         EC_ERR("Failed to create master workqueue.\n");
   128         EC_ERR("Failed to create master workqueue.\n");
   128         goto out_return;
   129         goto out_return;
   771 }
   772 }
   772 
   773 
   773 /*****************************************************************************/
   774 /*****************************************************************************/
   774 
   775 
   775 /**
   776 /**
   776    Starts/Stops Ethernet-over-EtherCAT processing on demand.
   777    Starts Ethernet-over-EtherCAT processing on demand.
   777 */
   778 */
   778 
   779 
   779 void ec_master_eoe_start(ec_master_t *master /**< EtherCAT master */)
   780 void ec_master_eoe_start(ec_master_t *master /**< EtherCAT master */)
   780 {
   781 {
   781     ec_eoe_t *eoe;
   782     ec_eoe_t *eoe;
   782     ec_slave_t *slave;
   783     ec_slave_t *slave;
   783     unsigned int coupled, found;
   784     unsigned int coupled, found;
   784 
   785 
   785     if (master->eoe_running) return;
   786     if (master->eoe_running || master->eoe_checked) return;
       
   787 
       
   788     master->eoe_checked = 1;
   786 
   789 
   787     // if the locking callbacks are not set in operation mode,
   790     // if the locking callbacks are not set in operation mode,
   788     // the EoE timer my not be started.
   791     // the EoE timer my not be started.
   789     if (master->mode == EC_MASTER_MODE_OPERATION
   792     if (master->mode == EC_MASTER_MODE_OPERATION
   790         && (!master->request_cb || !master->release_cb)) return;
   793         && (!master->request_cb || !master->release_cb)) {
       
   794         EC_INFO("No EoE processing because of missing locking callbacks.\n");
       
   795         return;
       
   796     }
   791 
   797 
   792     // decouple all EoE handlers
   798     // decouple all EoE handlers
   793     list_for_each_entry(eoe, &master->eoe_handlers, list)
   799     list_for_each_entry(eoe, &master->eoe_handlers, list)
   794         eoe->slave = NULL;
   800         eoe->slave = NULL;
   795 
   801 
   840 */
   846 */
   841 
   847 
   842 void ec_master_eoe_stop(ec_master_t *master /**< EtherCAT master */)
   848 void ec_master_eoe_stop(ec_master_t *master /**< EtherCAT master */)
   843 {
   849 {
   844     ec_eoe_t *eoe;
   850     ec_eoe_t *eoe;
       
   851 
       
   852     master->eoe_checked = 0;
   845 
   853 
   846     if (!master->eoe_running) return;
   854     if (!master->eoe_running) return;
   847 
   855 
   848     EC_INFO("Stopping EoE processing.\n");
   856     EC_INFO("Stopping EoE processing.\n");
   849 
   857