master/master.c
changeset 533 acdd1f9ef7ab
parent 529 fdd5cc30441b
child 540 a729667dea1e
equal deleted inserted replaced
532:092ac0fa23fe 533:acdd1f9ef7ab
   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 /*****************************************************************************/
  1488             datagram->state = EC_DATAGRAM_ERROR;
  1488             datagram->state = EC_DATAGRAM_ERROR;
  1489             list_del_init(&datagram->queue);
  1489             list_del_init(&datagram->queue);
  1490         }
  1490         }
  1491 
  1491 
  1492         // query link state
  1492         // query link state
  1493         ec_device_call_isr(master->device);
  1493         ec_device_poll(master->device);
  1494         return;
  1494         return;
  1495     }
  1495     }
  1496 
  1496 
  1497     // send frames
  1497     // send frames
  1498     ec_master_send_datagrams(master);
  1498     ec_master_send_datagrams(master);
  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);