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 } |
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 |