equal
deleted
inserted
replaced
167 init_waitqueue_head(&master->config_queue); |
167 init_waitqueue_head(&master->config_queue); |
168 |
168 |
169 INIT_LIST_HEAD(&master->datagram_queue); |
169 INIT_LIST_HEAD(&master->datagram_queue); |
170 master->datagram_index = 0; |
170 master->datagram_index = 0; |
171 |
171 |
172 INIT_LIST_HEAD(&master->ext_datagram_queue); |
172 sema_init(&master->fsm_queue_sem, 1); |
173 sema_init(&master->ext_queue_sem, 1); |
|
174 |
|
175 INIT_LIST_HEAD(&master->fsm_datagram_queue); |
173 INIT_LIST_HEAD(&master->fsm_datagram_queue); |
176 |
174 |
177 // send interval in IDLE phase |
175 // send interval in IDLE phase |
178 ec_master_set_send_interval(master, 1000000 / HZ); |
176 ec_master_set_send_interval(master, 1000000 / HZ); |
179 |
177 |
688 ) |
686 ) |
689 { |
687 { |
690 ec_datagram_t *datagram, *n; |
688 ec_datagram_t *datagram, *n; |
691 size_t queue_size = 0; |
689 size_t queue_size = 0; |
692 |
690 |
693 down(&master->ext_queue_sem); |
691 down(&master->fsm_queue_sem); |
694 if (list_empty(&master->fsm_datagram_queue)) { |
692 if (list_empty(&master->fsm_datagram_queue)) { |
695 up(&master->ext_queue_sem); |
693 up(&master->fsm_queue_sem); |
696 return; |
694 return; |
697 } |
695 } |
698 list_for_each_entry(datagram, &master->datagram_queue, queue) { |
696 list_for_each_entry(datagram, &master->datagram_queue, queue) { |
699 queue_size += datagram->data_size; |
697 queue_size += datagram->data_size; |
700 } |
698 } |
760 } |
758 } |
761 #endif |
759 #endif |
762 } |
760 } |
763 } |
761 } |
764 } |
762 } |
765 up(&master->ext_queue_sem); |
763 up(&master->fsm_queue_sem); |
766 } |
764 } |
767 |
765 |
768 /*****************************************************************************/ |
766 /*****************************************************************************/ |
769 |
767 |
770 /** Sets the expected interval between calls to ecrt_master_send |
768 /** Sets the expected interval between calls to ecrt_master_send |
803 ec_datagram_t *datagram /**< datagram */ |
801 ec_datagram_t *datagram /**< datagram */ |
804 ) |
802 ) |
805 { |
803 { |
806 ec_datagram_t *queued_datagram; |
804 ec_datagram_t *queued_datagram; |
807 |
805 |
808 down(&master->ext_queue_sem); |
806 down(&master->fsm_queue_sem); |
809 |
807 |
810 // check, if the datagram is already queued |
808 // check, if the datagram is already queued |
811 list_for_each_entry(queued_datagram, &master->fsm_datagram_queue, |
809 list_for_each_entry(queued_datagram, &master->fsm_datagram_queue, |
812 queue) { |
810 queue) { |
813 if (queued_datagram == datagram) { |
811 if (queued_datagram == datagram) { |
814 datagram->state = EC_DATAGRAM_QUEUED; |
812 datagram->state = EC_DATAGRAM_QUEUED; |
815 up(&master->ext_queue_sem); |
813 up(&master->fsm_queue_sem); |
816 return; |
814 return; |
817 } |
815 } |
818 } |
816 } |
819 |
817 |
820 #if DEBUG_INJECT |
818 #if DEBUG_INJECT |
827 #ifdef EC_HAVE_CYCLES |
825 #ifdef EC_HAVE_CYCLES |
828 datagram->cycles_sent = get_cycles(); |
826 datagram->cycles_sent = get_cycles(); |
829 #endif |
827 #endif |
830 datagram->jiffies_sent = jiffies; |
828 datagram->jiffies_sent = jiffies; |
831 |
829 |
832 up(&master->ext_queue_sem); |
830 up(&master->fsm_queue_sem); |
833 } |
831 } |
834 |
832 |
835 /*****************************************************************************/ |
833 /*****************************************************************************/ |
836 |
834 |
837 /** Places a datagram in the datagram queue. |
835 /** Places a datagram in the datagram queue. |
857 |
855 |
858 list_add_tail(&datagram->queue, &master->datagram_queue); |
856 list_add_tail(&datagram->queue, &master->datagram_queue); |
859 datagram->state = EC_DATAGRAM_QUEUED; |
857 datagram->state = EC_DATAGRAM_QUEUED; |
860 } |
858 } |
861 |
859 |
862 /*****************************************************************************/ |
|
863 |
|
864 /** Places a datagram in the non-application datagram queue. |
|
865 */ |
|
866 void ec_master_queue_datagram_ext( |
|
867 ec_master_t *master, /**< EtherCAT master */ |
|
868 ec_datagram_t *datagram /**< datagram */ |
|
869 ) |
|
870 { |
|
871 down(&master->ext_queue_sem); |
|
872 list_add_tail(&datagram->queue, &master->ext_datagram_queue); |
|
873 up(&master->ext_queue_sem); |
|
874 } |
|
875 |
860 |
876 /*****************************************************************************/ |
861 /*****************************************************************************/ |
877 |
862 |
878 /** Sends the datagrams in the queue. |
863 /** Sends the datagrams in the queue. |
879 * |
864 * |
2113 |
2098 |
2114 /*****************************************************************************/ |
2099 /*****************************************************************************/ |
2115 |
2100 |
2116 void ecrt_master_send_ext(ec_master_t *master) |
2101 void ecrt_master_send_ext(ec_master_t *master) |
2117 { |
2102 { |
2118 ec_datagram_t *datagram, *next; |
|
2119 |
|
2120 list_for_each_entry_safe(datagram, next, &master->ext_datagram_queue, |
|
2121 queue) { |
|
2122 list_del(&datagram->queue); |
|
2123 ec_master_queue_datagram(master, datagram); |
|
2124 } |
|
2125 |
|
2126 ecrt_master_send(master); |
2103 ecrt_master_send(master); |
2127 } |
2104 } |
2128 |
2105 |
2129 /*****************************************************************************/ |
2106 /*****************************************************************************/ |
2130 |
2107 |