839 void ec_master_queue_datagram( |
839 void ec_master_queue_datagram( |
840 ec_master_t *master, /**< EtherCAT master */ |
840 ec_master_t *master, /**< EtherCAT master */ |
841 ec_datagram_t *datagram /**< datagram */ |
841 ec_datagram_t *datagram /**< datagram */ |
842 ) |
842 ) |
843 { |
843 { |
|
844 ec_datagram_t *queued_datagram; |
|
845 |
844 switch (datagram->state) { |
846 switch (datagram->state) { |
845 case EC_DATAGRAM_QUEUED: |
847 case EC_DATAGRAM_QUEUED: |
846 datagram->skip_count++; |
848 datagram->skip_count++; |
847 EC_MASTER_DBG(master, 1, "Skipping already queued datagram %p.\n", |
849 EC_MASTER_DBG(master, 1, "Skipping already queued datagram %p.\n", |
848 datagram); |
850 datagram); |
853 EC_MASTER_DBG(master, 1, "Skipping already sent datagram %p.\n", |
855 EC_MASTER_DBG(master, 1, "Skipping already sent datagram %p.\n", |
854 datagram); |
856 datagram); |
855 break; |
857 break; |
856 |
858 |
857 default: |
859 default: |
858 list_add_tail(&datagram->queue, &master->datagram_queue); |
860 break; |
|
861 } |
|
862 |
|
863 /* It is possible, that a datagram in the queue is re-initialized with the |
|
864 * ec_datagram_<type>() methods and then shall be queued with this method. |
|
865 * In that case, the state is already reset to EC_DATAGRAM_INIT. Check if |
|
866 * the datagram is queued to avoid duplicate queuing (which results in an |
|
867 * infinite loop!). Set the state to EC_DATAGRAM_QUEUED again, probably |
|
868 * causing an unmatched datagram. */ |
|
869 list_for_each_entry(queued_datagram, &master->datagram_queue, queue) { |
|
870 if (queued_datagram == datagram) { |
|
871 datagram->skip_count++; |
|
872 EC_MASTER_DBG(master, 1, "Skipping re-initialized datagram %p.\n", |
|
873 datagram); |
859 datagram->state = EC_DATAGRAM_QUEUED; |
874 datagram->state = EC_DATAGRAM_QUEUED; |
860 break; |
875 return; |
861 } |
876 } |
862 } |
877 } |
863 |
878 |
|
879 list_add_tail(&datagram->queue, &master->datagram_queue); |
|
880 datagram->state = EC_DATAGRAM_QUEUED; |
|
881 } |
864 |
882 |
865 /*****************************************************************************/ |
883 /*****************************************************************************/ |
866 |
884 |
867 /** Sends the datagrams in the queue. |
885 /** Sends the datagrams in the queue. |
868 * |
886 * |