Applied 0013-Do-not-reuse-the-index-of-a-pending-datagram.patch
This commit is contained in:
parent
8db3e5abf4
commit
d09daadfbb
|
|
@ -989,6 +989,15 @@ void ec_master_queue_datagram_ext(
|
|||
|
||||
/*****************************************************************************/
|
||||
|
||||
static int index_in_use(ec_master_t *master, uint8_t index)
|
||||
{
|
||||
ec_datagram_t *datagram;
|
||||
list_for_each_entry(datagram, &master->datagram_queue, queue)
|
||||
if (datagram->state == EC_DATAGRAM_SENT && datagram->index == index)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** Sends the datagrams in the queue for a certain device.
|
||||
*
|
||||
*/
|
||||
|
|
@ -1008,6 +1017,7 @@ size_t ec_master_send_datagrams(
|
|||
unsigned int frame_count, more_datagrams_waiting;
|
||||
struct list_head sent_datagrams;
|
||||
size_t sent_bytes = 0;
|
||||
uint8_t last_index;
|
||||
|
||||
#ifdef EC_HAVE_CYCLES
|
||||
cycles_start = get_cycles();
|
||||
|
|
@ -1045,9 +1055,19 @@ size_t ec_master_send_datagrams(
|
|||
break;
|
||||
}
|
||||
|
||||
list_add_tail(&datagram->sent, &sent_datagrams);
|
||||
// do not reuse the index of a pending datagram to avoid confusion
|
||||
// in ec_master_receive_datagrams()
|
||||
last_index = master->datagram_index;
|
||||
while (index_in_use(master, master->datagram_index)) {
|
||||
if (++master->datagram_index == last_index) {
|
||||
EC_MASTER_ERR(master, "No free datagram index, sending delayed\n");
|
||||
goto break_send;
|
||||
}
|
||||
}
|
||||
datagram->index = master->datagram_index++;
|
||||
|
||||
list_add_tail(&datagram->sent, &sent_datagrams);
|
||||
|
||||
EC_MASTER_DBG(master, 2, "Adding datagram 0x%02X\n",
|
||||
datagram->index);
|
||||
|
||||
|
|
@ -1075,6 +1095,7 @@ size_t ec_master_send_datagrams(
|
|||
cur_data += EC_DATAGRAM_FOOTER_SIZE;
|
||||
}
|
||||
|
||||
break_send:
|
||||
if (list_empty(&sent_datagrams)) {
|
||||
EC_MASTER_DBG(master, 2, "nothing to send.\n");
|
||||
break;
|
||||
|
|
|
|||
Loading…
Reference in New Issue