816 |
816 |
817 while (!signal_pending(current)) { |
817 while (!signal_pending(current)) { |
818 cycles_start = get_cycles(); |
818 cycles_start = get_cycles(); |
819 ec_datagram_output_stats(&master->fsm_datagram); |
819 ec_datagram_output_stats(&master->fsm_datagram); |
820 |
820 |
821 if (ec_fsm_master_running(&master->fsm)) { // datagram on the way |
821 // receive |
822 // receive |
822 spin_lock_bh(&master->internal_lock); |
823 spin_lock_bh(&master->internal_lock); |
823 ecrt_master_receive(master); |
824 ecrt_master_receive(master); |
824 spin_unlock_bh(&master->internal_lock); |
825 spin_unlock_bh(&master->internal_lock); |
825 |
826 |
826 if (master->fsm_datagram.state == EC_DATAGRAM_SENT) |
827 if (master->fsm_datagram.state == EC_DATAGRAM_SENT) |
827 goto schedule; |
828 goto schedule; |
|
829 } |
|
830 |
828 |
831 // execute master state machine |
829 // execute master state machine |
832 if (ec_fsm_master_exec(&master->fsm)) { // datagram ready for sending |
830 ec_fsm_master_exec(&master->fsm); |
833 // queue and send |
831 |
834 spin_lock_bh(&master->internal_lock); |
832 // queue and send |
835 ec_master_queue_datagram(master, &master->fsm_datagram); |
833 spin_lock_bh(&master->internal_lock); |
836 ecrt_master_send(master); |
834 ec_master_queue_datagram(master, &master->fsm_datagram); |
837 spin_unlock_bh(&master->internal_lock); |
835 ecrt_master_send(master); |
838 } |
836 spin_unlock_bh(&master->internal_lock); |
839 |
837 |
840 cycles_end = get_cycles(); |
838 cycles_end = get_cycles(); |
841 master->idle_cycle_times[master->idle_cycle_time_pos] |
839 master->idle_cycle_times[master->idle_cycle_time_pos] |
842 = (u32) (cycles_end - cycles_start) * 1000 / cpu_khz; |
840 = (u32) (cycles_end - cycles_start) * 1000 / cpu_khz; |
843 master->idle_cycle_time_pos++; |
841 master->idle_cycle_time_pos++; |
881 |
879 |
882 // output statistics |
880 // output statistics |
883 ec_master_output_stats(master); |
881 ec_master_output_stats(master); |
884 |
882 |
885 // execute master state machine |
883 // execute master state machine |
886 if (ec_fsm_master_exec(&master->fsm)) { |
884 ec_fsm_master_exec(&master->fsm); |
887 // inject datagram |
885 |
888 master->injection_seq_fsm++; |
886 // inject datagram |
889 } |
887 master->injection_seq_fsm++; |
890 |
888 |
891 cycles_end = get_cycles(); |
889 cycles_end = get_cycles(); |
892 master->idle_cycle_times[master->idle_cycle_time_pos] |
890 master->idle_cycle_times[master->idle_cycle_time_pos] |
893 = (u32) (cycles_end - cycles_start) * 1000 / cpu_khz; |
891 = (u32) (cycles_end - cycles_start) * 1000 / cpu_khz; |
894 master->idle_cycle_time_pos++; |
892 master->idle_cycle_time_pos++; |