master/ethernet.c
changeset 721 ebc2fd3e09e5
parent 719 03d5b96632fb
child 770 efa5af306318
equal deleted inserted replaced
720:9664a19978dd 721:ebc2fd3e09e5
    97     char name[EC_DATAGRAM_NAME_SIZE];
    97     char name[EC_DATAGRAM_NAME_SIZE];
    98 
    98 
    99     eoe->slave = slave;
    99     eoe->slave = slave;
   100 
   100 
   101     ec_datagram_init(&eoe->datagram);
   101     ec_datagram_init(&eoe->datagram);
       
   102     eoe->queue_datagram = 0;
   102     eoe->state = ec_eoe_state_rx_start;
   103     eoe->state = ec_eoe_state_rx_start;
   103     eoe->opened = 0;
   104     eoe->opened = 0;
   104     eoe->rx_skb = NULL;
   105     eoe->rx_skb = NULL;
   105     eoe->rx_expected_fragment = 0;
   106     eoe->rx_expected_fragment = 0;
   106     INIT_LIST_HEAD(&eoe->tx_queue);
   107     INIT_LIST_HEAD(&eoe->tx_queue);
   281     EC_WRITE_U16(data + 2, ((eoe->tx_fragment_number & 0x3F) |
   282     EC_WRITE_U16(data + 2, ((eoe->tx_fragment_number & 0x3F) |
   282                             (complete_offset & 0x3F) << 6 |
   283                             (complete_offset & 0x3F) << 6 |
   283                             (eoe->tx_frame_number & 0x0F) << 12));
   284                             (eoe->tx_frame_number & 0x0F) << 12));
   284 
   285 
   285     memcpy(data + 4, eoe->tx_frame->skb->data + eoe->tx_offset, current_size);
   286     memcpy(data + 4, eoe->tx_frame->skb->data + eoe->tx_offset, current_size);
   286     ec_master_queue_datagram(eoe->slave->master, &eoe->datagram);
   287     eoe->queue_datagram = 1;
   287 
   288 
   288     eoe->tx_offset += current_size;
   289     eoe->tx_offset += current_size;
   289     eoe->tx_fragment_number++;
   290     eoe->tx_fragment_number++;
   290     return 0;
   291     return 0;
   291 }
   292 }
   297 */
   298 */
   298 
   299 
   299 void ec_eoe_run(ec_eoe_t *eoe /**< EoE handler */)
   300 void ec_eoe_run(ec_eoe_t *eoe /**< EoE handler */)
   300 {
   301 {
   301     if (!eoe->opened) return;
   302     if (!eoe->opened) return;
       
   303 
       
   304     // if the datagram was not sent, or is not yet received, skip this cycle
       
   305     if (eoe->queue_datagram || eoe->datagram.state == EC_DATAGRAM_SENT)
       
   306         return;
   302 
   307 
   303     // call state function
   308     // call state function
   304     eoe->state(eoe);
   309     eoe->state(eoe);
   305 
   310 
   306     // update statistics
   311     // update statistics
   309         eoe->tx_rate = eoe->tx_counter * 8;
   314         eoe->tx_rate = eoe->tx_counter * 8;
   310         eoe->rx_counter = 0;
   315         eoe->rx_counter = 0;
   311         eoe->tx_counter = 0;
   316         eoe->tx_counter = 0;
   312         eoe->rate_jiffies = jiffies;
   317         eoe->rate_jiffies = jiffies;
   313     }
   318     }
       
   319 
   314     ec_datagram_output_stats(&eoe->datagram);
   320     ec_datagram_output_stats(&eoe->datagram);
       
   321 }
       
   322 
       
   323 /*****************************************************************************/
       
   324 
       
   325 /**
       
   326  * Queues the datagram, if necessary.
       
   327  */
       
   328 
       
   329 void ec_eoe_queue(ec_eoe_t *eoe /**< EoE handler */)
       
   330 {
       
   331    if (eoe->queue_datagram) {
       
   332        ec_master_queue_datagram(eoe->slave->master, &eoe->datagram);
       
   333        eoe->queue_datagram = 0;
       
   334    }
   315 }
   335 }
   316 
   336 
   317 /*****************************************************************************/
   337 /*****************************************************************************/
   318 
   338 
   319 /**
   339 /**
   341     if (eoe->slave->online_state == EC_SLAVE_OFFLINE ||
   361     if (eoe->slave->online_state == EC_SLAVE_OFFLINE ||
   342             !eoe->slave->master->main_device.link_state)
   362             !eoe->slave->master->main_device.link_state)
   343         return;
   363         return;
   344 
   364 
   345     ec_slave_mbox_prepare_check(eoe->slave, &eoe->datagram);
   365     ec_slave_mbox_prepare_check(eoe->slave, &eoe->datagram);
   346     ec_master_queue_datagram(eoe->slave->master, &eoe->datagram);
   366     eoe->queue_datagram = 1;
   347     eoe->state = ec_eoe_state_rx_check;
   367     eoe->state = ec_eoe_state_rx_check;
   348 }
   368 }
   349 
   369 
   350 /*****************************************************************************/
   370 /*****************************************************************************/
   351 
   371 
   367         eoe->state = ec_eoe_state_tx_start;
   387         eoe->state = ec_eoe_state_tx_start;
   368         return;
   388         return;
   369     }
   389     }
   370 
   390 
   371     ec_slave_mbox_prepare_fetch(eoe->slave, &eoe->datagram);
   391     ec_slave_mbox_prepare_fetch(eoe->slave, &eoe->datagram);
   372     ec_master_queue_datagram(eoe->slave->master, &eoe->datagram);
   392     eoe->queue_datagram = 1;
   373     eoe->state = ec_eoe_state_rx_fetch;
   393     eoe->state = ec_eoe_state_rx_fetch;
   374 }
   394 }
   375 
   395 
   376 /*****************************************************************************/
   396 /*****************************************************************************/
   377 
   397