equal
deleted
inserted
replaced
845 |
845 |
846 // check, if the datagram is already queued |
846 // check, if the datagram is already queued |
847 list_for_each_entry(queued_datagram, &master->external_datagram_queue, |
847 list_for_each_entry(queued_datagram, &master->external_datagram_queue, |
848 queue) { |
848 queue) { |
849 if (queued_datagram == datagram) { |
849 if (queued_datagram == datagram) { |
|
850 up(&master->io_sem); |
850 datagram->state = EC_DATAGRAM_QUEUED; |
851 datagram->state = EC_DATAGRAM_QUEUED; |
851 return; |
852 return; |
852 } |
853 } |
853 } |
854 } |
854 |
855 |
862 #ifdef EC_HAVE_CYCLES |
863 #ifdef EC_HAVE_CYCLES |
863 datagram->cycles_sent = get_cycles(); |
864 datagram->cycles_sent = get_cycles(); |
864 #endif |
865 #endif |
865 datagram->jiffies_sent = jiffies; |
866 datagram->jiffies_sent = jiffies; |
866 |
867 |
|
868 up(&master->io_sem); |
|
869 |
867 master->fsm.idle = 0; |
870 master->fsm.idle = 0; |
868 up(&master->io_sem); |
|
869 } |
871 } |
870 |
872 |
871 /*****************************************************************************/ |
873 /*****************************************************************************/ |
872 |
874 |
873 /** Places a datagram in the datagram queue. |
875 /** Places a datagram in the datagram queue. |
1476 ec_fsm_slave_exec(&slave->fsm); |
1478 ec_fsm_slave_exec(&slave->fsm); |
1477 } |
1479 } |
1478 |
1480 |
1479 up(&master->master_sem); |
1481 up(&master->master_sem); |
1480 |
1482 |
1481 // inject datagrams (let the rt thread queue them, see |
1483 // Inject datagrams (let the RT thread queue them, see |
1482 // ecrt_master_send) |
1484 // ecrt_master_send()) |
1483 if (fsm_exec) { |
1485 if (fsm_exec) { |
1484 master->injection_seq_fsm++; |
1486 master->injection_seq_fsm++; |
1485 } |
1487 } |
1486 } |
1488 } |
1487 |
1489 |
2278 { |
2280 { |
2279 ec_datagram_t *datagram, *n; |
2281 ec_datagram_t *datagram, *n; |
2280 ec_device_index_t dev_idx; |
2282 ec_device_index_t dev_idx; |
2281 |
2283 |
2282 if (master->injection_seq_rt != master->injection_seq_fsm) { |
2284 if (master->injection_seq_rt != master->injection_seq_fsm) { |
2283 // inject datagrams produced by master and slave FSMs |
2285 // inject datagrams produced by master FSM |
2284 ec_master_queue_datagram(master, &master->fsm_datagram); |
2286 ec_master_queue_datagram(master, &master->fsm_datagram); |
2285 master->injection_seq_rt = master->injection_seq_fsm; |
2287 master->injection_seq_rt = master->injection_seq_fsm; |
2286 } |
2288 } |
2287 |
2289 |
2288 ec_master_inject_external_datagrams(master); |
2290 ec_master_inject_external_datagrams(master); |