755 datagram->working_counter = EC_READ_U16(cur_data); |
755 datagram->working_counter = EC_READ_U16(cur_data); |
756 cur_data += EC_DATAGRAM_FOOTER_SIZE; |
756 cur_data += EC_DATAGRAM_FOOTER_SIZE; |
757 |
757 |
758 // dequeue the received datagram |
758 // dequeue the received datagram |
759 datagram->state = EC_DATAGRAM_RECEIVED; |
759 datagram->state = EC_DATAGRAM_RECEIVED; |
760 datagram->cycles_received = master->device->cycles_isr; |
760 datagram->cycles_received = master->device->cycles_poll; |
761 datagram->jiffies_received = master->device->jiffies_isr; |
761 datagram->jiffies_received = master->device->jiffies_poll; |
762 list_del_init(&datagram->queue); |
762 list_del_init(&datagram->queue); |
763 } |
763 } |
764 } |
764 } |
765 |
765 |
766 /*****************************************************************************/ |
766 /*****************************************************************************/ |
1509 { |
1509 { |
1510 ec_datagram_t *datagram, *next; |
1510 ec_datagram_t *datagram, *next; |
1511 cycles_t cycles_timeout; |
1511 cycles_t cycles_timeout; |
1512 |
1512 |
1513 // receive datagrams |
1513 // receive datagrams |
1514 ec_device_call_isr(master->device); |
1514 ec_device_poll(master->device); |
1515 |
1515 |
1516 cycles_timeout = (cycles_t) EC_IO_TIMEOUT /* us */ * (cpu_khz / 1000); |
1516 cycles_timeout = (cycles_t) EC_IO_TIMEOUT /* us */ * (cpu_khz / 1000); |
1517 |
1517 |
1518 // dequeue all datagrams that timed out |
1518 // dequeue all datagrams that timed out |
1519 list_for_each_entry_safe(datagram, next, &master->datagram_queue, queue) { |
1519 list_for_each_entry_safe(datagram, next, &master->datagram_queue, queue) { |
1520 if (datagram->state != EC_DATAGRAM_SENT) continue; |
1520 if (datagram->state != EC_DATAGRAM_SENT) continue; |
1521 |
1521 |
1522 if (master->device->cycles_isr - datagram->cycles_sent |
1522 if (master->device->cycles_poll - datagram->cycles_sent |
1523 > cycles_timeout) { |
1523 > cycles_timeout) { |
1524 list_del_init(&datagram->queue); |
1524 list_del_init(&datagram->queue); |
1525 datagram->state = EC_DATAGRAM_TIMED_OUT; |
1525 datagram->state = EC_DATAGRAM_TIMED_OUT; |
1526 master->stats.timeouts++; |
1526 master->stats.timeouts++; |
1527 ec_master_output_stats(master); |
1527 ec_master_output_stats(master); |