109 char name[EC_DATAGRAM_NAME_SIZE]; |
109 char name[EC_DATAGRAM_NAME_SIZE]; |
110 |
110 |
111 eoe->slave = slave; |
111 eoe->slave = slave; |
112 |
112 |
113 ec_datagram_init(&eoe->datagram); |
113 ec_datagram_init(&eoe->datagram); |
|
114 ec_mbox_init(&eoe->mbox,&eoe->datagram); |
114 eoe->queue_datagram = 0; |
115 eoe->queue_datagram = 0; |
115 eoe->state = ec_eoe_state_rx_start; |
116 eoe->state = ec_eoe_state_rx_start; |
116 eoe->opened = 0; |
117 eoe->opened = 0; |
117 eoe->rx_skb = NULL; |
118 eoe->rx_skb = NULL; |
118 eoe->rx_expected_fragment = 0; |
119 eoe->rx_expected_fragment = 0; |
292 } |
294 } |
293 } |
295 } |
294 printk("\n"); |
296 printk("\n"); |
295 #endif |
297 #endif |
296 |
298 |
297 data = ec_slave_mbox_prepare_send(eoe->slave, &eoe->datagram, |
299 data = ec_slave_mbox_prepare_send(eoe->slave, &eoe->mbox, |
298 0x02, current_size + 4); |
300 0x02, current_size + 4); |
299 if (IS_ERR(data)) |
301 if (IS_ERR(data)) |
300 return PTR_ERR(data); |
302 return PTR_ERR(data); |
301 |
303 |
302 EC_WRITE_U8 (data, 0x00); // eoe fragment req. |
304 EC_WRITE_U8 (data, 0x00); // eoe fragment req. |
322 if (!eoe->opened) |
324 if (!eoe->opened) |
323 return; |
325 return; |
324 |
326 |
325 // if the datagram was not sent, or is not yet received, skip this cycle |
327 // if the datagram was not sent, or is not yet received, skip this cycle |
326 if (eoe->queue_datagram || |
328 if (eoe->queue_datagram || |
327 eoe->datagram.state == EC_DATAGRAM_QUEUED || eoe->datagram.state == EC_DATAGRAM_SENT) |
329 ec_mbox_is_datagram_state(&eoe->mbox,EC_DATAGRAM_QUEUED) || |
|
330 ec_mbox_is_datagram_state(&eoe->mbox,EC_DATAGRAM_SENT)) |
328 return; |
331 return; |
329 |
332 |
330 // call state function |
333 // call state function |
331 eoe->state(eoe); |
334 eoe->state(eoe); |
332 |
335 |
347 /** Queues the datagram, if necessary. |
350 /** Queues the datagram, if necessary. |
348 */ |
351 */ |
349 void ec_eoe_queue(ec_eoe_t *eoe /**< EoE handler */) |
352 void ec_eoe_queue(ec_eoe_t *eoe /**< EoE handler */) |
350 { |
353 { |
351 if (eoe->queue_datagram) { |
354 if (eoe->queue_datagram) { |
352 ec_master_queue_fsm_datagram(eoe->slave->master, &eoe->datagram); |
355 ec_master_mbox_queue_datagrams(eoe->slave->master, &eoe->mbox); |
353 eoe->queue_datagram = 0; |
356 eoe->queue_datagram = 0; |
354 } |
357 } |
355 } |
358 } |
356 |
359 |
357 /*****************************************************************************/ |
360 /*****************************************************************************/ |
407 * Processes the checking datagram sent in RX_START and issues a receive |
410 * Processes the checking datagram sent in RX_START and issues a receive |
408 * datagram, if new data is available. |
411 * datagram, if new data is available. |
409 */ |
412 */ |
410 void ec_eoe_state_rx_check(ec_eoe_t *eoe /**< EoE handler */) |
413 void ec_eoe_state_rx_check(ec_eoe_t *eoe /**< EoE handler */) |
411 { |
414 { |
412 if (eoe->datagram.state != EC_DATAGRAM_RECEIVED) { |
415 if (!ec_mbox_is_datagram_state(&eoe->mbox,EC_DATAGRAM_RECEIVED)) { |
413 eoe->stats.rx_errors++; |
416 eoe->stats.rx_errors++; |
414 #if EOE_DEBUG_LEVEL >= 1 |
417 #if EOE_DEBUG_LEVEL >= 1 |
415 EC_SLAVE_WARN(eoe->slave, "Failed to receive mbox" |
418 EC_SLAVE_WARN(eoe->slave, "Failed to receive mbox" |
416 " check datagram for %s.\n", eoe->dev->name); |
419 " check datagram for %s.\n", eoe->dev->name); |
417 #endif |
420 #endif |
418 eoe->state = ec_eoe_state_tx_start; |
421 eoe->state = ec_eoe_state_tx_start; |
419 return; |
422 return; |
420 } |
423 } |
421 |
424 |
422 if (!ec_slave_mbox_check(&eoe->datagram)) { |
425 if (!ec_slave_mbox_check(&eoe->mbox)) { |
423 eoe->rx_idle = 1; |
426 eoe->rx_idle = 1; |
424 eoe->state = ec_eoe_state_tx_start; |
427 eoe->state = ec_eoe_state_tx_start; |
425 return; |
428 return; |
426 } |
429 } |
427 |
430 |
428 eoe->rx_idle = 0; |
431 eoe->rx_idle = 0; |
429 ec_slave_mbox_prepare_fetch(eoe->slave, &eoe->datagram); |
432 ec_slave_mbox_prepare_fetch(eoe->slave, &eoe->mbox); |
430 eoe->queue_datagram = 1; |
433 eoe->queue_datagram = 1; |
431 eoe->state = ec_eoe_state_rx_fetch; |
434 eoe->state = ec_eoe_state_rx_fetch; |
432 } |
435 } |
433 |
436 |
434 /*****************************************************************************/ |
437 /*****************************************************************************/ |
446 off_t offset; |
449 off_t offset; |
447 #if EOE_DEBUG_LEVEL >= 3 |
450 #if EOE_DEBUG_LEVEL >= 3 |
448 unsigned int i; |
451 unsigned int i; |
449 #endif |
452 #endif |
450 |
453 |
451 if (eoe->datagram.state != EC_DATAGRAM_RECEIVED) { |
454 if (!ec_mbox_is_datagram_state(&eoe->mbox,EC_DATAGRAM_RECEIVED)) { |
452 eoe->stats.rx_errors++; |
455 eoe->stats.rx_errors++; |
453 #if EOE_DEBUG_LEVEL >= 1 |
456 #if EOE_DEBUG_LEVEL >= 1 |
454 EC_SLAVE_WARN(eoe->slave, "Failed to receive mbox" |
457 EC_SLAVE_WARN(eoe->slave, "Failed to receive mbox" |
455 " fetch datagram for %s.\n", eoe->dev->name); |
458 " fetch datagram for %s.\n", eoe->dev->name); |
456 #endif |
459 #endif |
457 eoe->state = ec_eoe_state_tx_start; |
460 eoe->state = ec_eoe_state_tx_start; |
458 return; |
461 return; |
459 } |
462 } |
460 |
463 |
461 data = ec_slave_mbox_fetch(eoe->slave, &eoe->datagram, |
464 data = ec_slave_mbox_fetch(eoe->slave, &eoe->mbox, |
462 &mbox_prot, &rec_size); |
465 &mbox_prot, &rec_size); |
463 if (IS_ERR(data)) { |
466 if (IS_ERR(data)) { |
464 eoe->stats.rx_errors++; |
467 eoe->stats.rx_errors++; |
465 #if EOE_DEBUG_LEVEL >= 1 |
468 #if EOE_DEBUG_LEVEL >= 1 |
466 EC_SLAVE_WARN(eoe->slave, "Invalid mailbox response for %s.\n", |
469 EC_SLAVE_WARN(eoe->slave, "Invalid mailbox response for %s.\n", |
683 * Checks is the previous transmit datagram succeded and sends the next |
686 * Checks is the previous transmit datagram succeded and sends the next |
684 * fragment, if necessary. |
687 * fragment, if necessary. |
685 */ |
688 */ |
686 void ec_eoe_state_tx_sent(ec_eoe_t *eoe /**< EoE handler */) |
689 void ec_eoe_state_tx_sent(ec_eoe_t *eoe /**< EoE handler */) |
687 { |
690 { |
688 if (eoe->datagram.state != EC_DATAGRAM_RECEIVED) { |
691 if (!ec_mbox_is_datagram_state(&eoe->mbox,EC_DATAGRAM_RECEIVED)) { |
689 if (eoe->tries) { |
692 if (eoe->tries) { |
690 eoe->tries--; // try again |
693 eoe->tries--; // try again |
691 eoe->queue_datagram = 1; |
694 eoe->queue_datagram = 1; |
692 } else { |
695 } else { |
693 eoe->stats.tx_errors++; |
696 eoe->stats.tx_errors++; |
699 eoe->state = ec_eoe_state_rx_start; |
702 eoe->state = ec_eoe_state_rx_start; |
700 } |
703 } |
701 return; |
704 return; |
702 } |
705 } |
703 |
706 |
704 if (eoe->datagram.working_counter != 1) { |
707 if (!ec_mbox_is_datagram_wc(&eoe->mbox,1)) { |
705 if (eoe->tries) { |
708 if (eoe->tries) { |
706 eoe->tries--; // try again |
709 eoe->tries--; // try again |
707 eoe->queue_datagram = 1; |
710 eoe->queue_datagram = 1; |
708 } else { |
711 } else { |
709 eoe->stats.tx_errors++; |
712 eoe->stats.tx_errors++; |