diff -r 9664a19978dd -r ebc2fd3e09e5 master/ethernet.c --- a/master/ethernet.c Wed Sep 12 14:07:28 2007 +0000 +++ b/master/ethernet.c Wed Sep 12 14:48:53 2007 +0000 @@ -99,6 +99,7 @@ eoe->slave = slave; ec_datagram_init(&eoe->datagram); + eoe->queue_datagram = 0; eoe->state = ec_eoe_state_rx_start; eoe->opened = 0; eoe->rx_skb = NULL; @@ -283,7 +284,7 @@ (eoe->tx_frame_number & 0x0F) << 12)); memcpy(data + 4, eoe->tx_frame->skb->data + eoe->tx_offset, current_size); - ec_master_queue_datagram(eoe->slave->master, &eoe->datagram); + eoe->queue_datagram = 1; eoe->tx_offset += current_size; eoe->tx_fragment_number++; @@ -300,6 +301,10 @@ { if (!eoe->opened) return; + // if the datagram was not sent, or is not yet received, skip this cycle + if (eoe->queue_datagram || eoe->datagram.state == EC_DATAGRAM_SENT) + return; + // call state function eoe->state(eoe); @@ -311,12 +316,27 @@ eoe->tx_counter = 0; eoe->rate_jiffies = jiffies; } + ec_datagram_output_stats(&eoe->datagram); } /*****************************************************************************/ /** + * Queues the datagram, if necessary. + */ + +void ec_eoe_queue(ec_eoe_t *eoe /**< EoE handler */) +{ + if (eoe->queue_datagram) { + ec_master_queue_datagram(eoe->slave->master, &eoe->datagram); + eoe->queue_datagram = 0; + } +} + +/*****************************************************************************/ + +/** Returns the state of the device. \return 1 if the device is "up", 0 if it is "down" */ @@ -343,7 +363,7 @@ return; ec_slave_mbox_prepare_check(eoe->slave, &eoe->datagram); - ec_master_queue_datagram(eoe->slave->master, &eoe->datagram); + eoe->queue_datagram = 1; eoe->state = ec_eoe_state_rx_check; } @@ -369,7 +389,7 @@ } ec_slave_mbox_prepare_fetch(eoe->slave, &eoe->datagram); - ec_master_queue_datagram(eoe->slave->master, &eoe->datagram); + eoe->queue_datagram = 1; eoe->state = ec_eoe_state_rx_fetch; }