master/ethernet.c
branchstable-1.3
changeset 1745 07fd94c5119d
parent 1744 7bc131b92039
equal deleted inserted replaced
1744:7bc131b92039 1745:07fd94c5119d
    92         ec_slave_t *slave /**< EtherCAT slave */
    92         ec_slave_t *slave /**< EtherCAT slave */
    93         )
    93         )
    94 {
    94 {
    95     ec_eoe_t **priv;
    95     ec_eoe_t **priv;
    96     int result, i;
    96     int result, i;
    97     char name[20];
    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);
   115     eoe->tx_counter = 0;
   116     eoe->tx_counter = 0;
   116     eoe->rx_rate = 0;
   117     eoe->rx_rate = 0;
   117     eoe->tx_rate = 0;
   118     eoe->tx_rate = 0;
   118     eoe->rate_jiffies = 0;
   119     eoe->rate_jiffies = 0;
   119 
   120 
   120     /* device name eoe<MASTER>s<SLAVE>, because system tools don't like
   121     /* device name eoe<MASTER>[as]<SLAVE>, because networking scripts don't
   121      * hyphens etc. in interface names. */
   122      * like hyphens etc. in interface names. */
   122     sprintf(name, "eoe%us%u", slave->master->index, slave->ring_position);
   123     if (slave->sii_alias) {
       
   124         snprintf(name, EC_DATAGRAM_NAME_SIZE,
       
   125                 "eoe%ua%u", slave->master->index, slave->sii_alias);
       
   126     } else {
       
   127         snprintf(name, EC_DATAGRAM_NAME_SIZE,
       
   128                 "eoe%us%u", slave->master->index, slave->ring_position);
       
   129     }
       
   130 
       
   131     snprintf(eoe->datagram.name, EC_DATAGRAM_NAME_SIZE, name);
   123 
   132 
   124     if (!(eoe->dev = alloc_netdev(sizeof(ec_eoe_t *), name, ether_setup))) {
   133     if (!(eoe->dev = alloc_netdev(sizeof(ec_eoe_t *), name, ether_setup))) {
   125         EC_ERR("Unable to allocate net_device for EoE handler!\n");
   134         EC_ERR("Unable to allocate net_device %s for EoE handler!\n", name);
   126         goto out_return;
   135         goto out_return;
   127     }
   136     }
   128 
   137 
   129     // initialize net_device
   138     // initialize net_device
   130     eoe->dev->open = ec_eoedev_open;
   139     eoe->dev->open = ec_eoedev_open;
   273     EC_WRITE_U16(data + 2, ((eoe->tx_fragment_number & 0x3F) |
   282     EC_WRITE_U16(data + 2, ((eoe->tx_fragment_number & 0x3F) |
   274                             (complete_offset & 0x3F) << 6 |
   283                             (complete_offset & 0x3F) << 6 |
   275                             (eoe->tx_frame_number & 0x0F) << 12));
   284                             (eoe->tx_frame_number & 0x0F) << 12));
   276 
   285 
   277     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);
   278     ec_master_queue_datagram(eoe->slave->master, &eoe->datagram);
   287     eoe->queue_datagram = 1;
   279 
   288 
   280     eoe->tx_offset += current_size;
   289     eoe->tx_offset += current_size;
   281     eoe->tx_fragment_number++;
   290     eoe->tx_fragment_number++;
   282     return 0;
   291     return 0;
   283 }
   292 }
   289 */
   298 */
   290 
   299 
   291 void ec_eoe_run(ec_eoe_t *eoe /**< EoE handler */)
   300 void ec_eoe_run(ec_eoe_t *eoe /**< EoE handler */)
   292 {
   301 {
   293     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;
   294 
   307 
   295     // call state function
   308     // call state function
   296     eoe->state(eoe);
   309     eoe->state(eoe);
   297 
   310 
   298     // update statistics
   311     // update statistics
   301         eoe->tx_rate = eoe->tx_counter * 8;
   314         eoe->tx_rate = eoe->tx_counter * 8;
   302         eoe->rx_counter = 0;
   315         eoe->rx_counter = 0;
   303         eoe->tx_counter = 0;
   316         eoe->tx_counter = 0;
   304         eoe->rate_jiffies = jiffies;
   317         eoe->rate_jiffies = jiffies;
   305     }
   318     }
       
   319 
       
   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    }
   306 }
   335 }
   307 
   336 
   308 /*****************************************************************************/
   337 /*****************************************************************************/
   309 
   338 
   310 /**
   339 /**
   332     if (eoe->slave->online_state == EC_SLAVE_OFFLINE ||
   361     if (eoe->slave->online_state == EC_SLAVE_OFFLINE ||
   333             !eoe->slave->master->main_device.link_state)
   362             !eoe->slave->master->main_device.link_state)
   334         return;
   363         return;
   335 
   364 
   336     ec_slave_mbox_prepare_check(eoe->slave, &eoe->datagram);
   365     ec_slave_mbox_prepare_check(eoe->slave, &eoe->datagram);
   337     ec_master_queue_datagram(eoe->slave->master, &eoe->datagram);
   366     eoe->queue_datagram = 1;
   338     eoe->state = ec_eoe_state_rx_check;
   367     eoe->state = ec_eoe_state_rx_check;
   339 }
   368 }
   340 
   369 
   341 /*****************************************************************************/
   370 /*****************************************************************************/
   342 
   371 
   358         eoe->state = ec_eoe_state_tx_start;
   387         eoe->state = ec_eoe_state_tx_start;
   359         return;
   388         return;
   360     }
   389     }
   361 
   390 
   362     ec_slave_mbox_prepare_fetch(eoe->slave, &eoe->datagram);
   391     ec_slave_mbox_prepare_fetch(eoe->slave, &eoe->datagram);
   363     ec_master_queue_datagram(eoe->slave->master, &eoe->datagram);
   392     eoe->queue_datagram = 1;
   364     eoe->state = ec_eoe_state_rx_fetch;
   393     eoe->state = ec_eoe_state_rx_fetch;
   365 }
   394 }
   366 
   395 
   367 /*****************************************************************************/
   396 /*****************************************************************************/
   368 
   397