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 |