50 */ |
50 */ |
51 #define EC_FSM_FOE_TIMEOUT 3000 |
51 #define EC_FSM_FOE_TIMEOUT 3000 |
52 |
52 |
53 #define EC_MBOX_TYPE_FILEACCESS 0x04 |
53 #define EC_MBOX_TYPE_FILEACCESS 0x04 |
54 |
54 |
55 #define myDEBUG |
55 #define EC_FOE_HEADER_SIZE 6 |
56 |
56 // uint8_t OpCode |
57 /*****************************************************************************/ |
57 // uint8_t reserved |
58 |
58 // uint32_t PacketNo, Password, ErrorCode |
59 int ec_foe_prepare_data_send( ec_fsm_foe_t * ); |
59 |
60 int ec_foe_prepare_wrq_send( ec_fsm_foe_t * ); |
60 //#define DEBUG_FOE |
61 int ec_foe_prepare_rrq_send( ec_fsm_foe_t * ); |
61 |
62 int ec_foe_prepare_send_ack( ec_fsm_foe_t * ); |
62 /*****************************************************************************/ |
63 |
63 |
64 void ec_foe_set_tx_error( ec_fsm_foe_t *, uint32_t ); |
64 enum { |
65 void ec_foe_set_rx_error( ec_fsm_foe_t *, uint32_t ); |
65 EC_FOE_OPCODE_RRQ = 1, |
66 |
66 EC_FOE_OPCODE_WRQ = 2, |
67 void ec_fsm_foe_write(ec_fsm_foe_t * ); |
67 EC_FOE_OPCODE_DATA = 3, |
68 void ec_fsm_foe_read(ec_fsm_foe_t * ); |
68 EC_FOE_OPCODE_ACK = 4, |
69 void ec_fsm_foe_end( ec_fsm_foe_t * ); |
69 EC_FOE_OPCODE_ERR = 5, |
70 void ec_fsm_foe_error( ec_fsm_foe_t * ); |
70 EC_FOE_OPCODE_BUSY = 6 |
71 |
71 } ec_foe_opcode_t; |
72 void ec_fsm_foe_state_wrq_sent( ec_fsm_foe_t * ); |
72 |
73 void ec_fsm_foe_state_rrq_sent( ec_fsm_foe_t * ); |
73 /*****************************************************************************/ |
74 |
74 |
75 void ec_fsm_foe_state_ack_check( ec_fsm_foe_t * ); |
75 int ec_foe_prepare_data_send(ec_fsm_foe_t *); |
76 void ec_fsm_foe_state_ack_read( ec_fsm_foe_t * ); |
76 int ec_foe_prepare_wrq_send(ec_fsm_foe_t *); |
77 |
77 int ec_foe_prepare_rrq_send(ec_fsm_foe_t *); |
78 void ec_fsm_foe_state_data_sent( ec_fsm_foe_t * ); |
78 int ec_foe_prepare_send_ack(ec_fsm_foe_t *); |
79 |
79 |
80 void ec_fsm_foe_state_data_check( ec_fsm_foe_t * ); |
80 void ec_foe_set_tx_error(ec_fsm_foe_t *, uint32_t); |
81 void ec_fsm_foe_state_data_read ( ec_fsm_foe_t * ); |
81 void ec_foe_set_rx_error(ec_fsm_foe_t *, uint32_t); |
82 void ec_fsm_foe_state_sent_ack( ec_fsm_foe_t * ); |
82 |
83 |
83 void ec_fsm_foe_write(ec_fsm_foe_t *); |
84 void ec_fsm_foe_write_start( ec_fsm_foe_t * ); |
84 void ec_fsm_foe_read(ec_fsm_foe_t *); |
85 void ec_fsm_foe_read_start(ec_fsm_foe_t * ); |
85 void ec_fsm_foe_end(ec_fsm_foe_t *); |
|
86 void ec_fsm_foe_error(ec_fsm_foe_t *); |
|
87 |
|
88 void ec_fsm_foe_state_wrq_sent(ec_fsm_foe_t *); |
|
89 void ec_fsm_foe_state_rrq_sent(ec_fsm_foe_t *); |
|
90 |
|
91 void ec_fsm_foe_state_ack_check(ec_fsm_foe_t *); |
|
92 void ec_fsm_foe_state_ack_read(ec_fsm_foe_t *); |
|
93 |
|
94 void ec_fsm_foe_state_data_sent(ec_fsm_foe_t *); |
|
95 |
|
96 void ec_fsm_foe_state_data_check(ec_fsm_foe_t *); |
|
97 void ec_fsm_foe_state_data_read(ec_fsm_foe_t *); |
|
98 void ec_fsm_foe_state_sent_ack(ec_fsm_foe_t *); |
|
99 |
|
100 void ec_fsm_foe_write_start(ec_fsm_foe_t *); |
|
101 void ec_fsm_foe_read_start(ec_fsm_foe_t *); |
86 |
102 |
87 /*****************************************************************************/ |
103 /*****************************************************************************/ |
88 |
104 |
89 /** |
105 /** |
90 Constructor. |
106 Constructor. |
222 current_size = fsm->slave->configured_tx_mailbox_size |
215 current_size = fsm->slave->configured_tx_mailbox_size |
223 - EC_MBOX_HEADER_SIZE - EC_FOE_HEADER_SIZE; |
216 - EC_MBOX_HEADER_SIZE - EC_FOE_HEADER_SIZE; |
224 } |
217 } |
225 |
218 |
226 if (!(data = ec_slave_mbox_prepare_send(fsm->slave, fsm->datagram, |
219 if (!(data = ec_slave_mbox_prepare_send(fsm->slave, fsm->datagram, |
227 EC_MBOX_TYPE_FILEACCESS, current_size + EC_FOE_HEADER_SIZE))) |
220 EC_MBOX_TYPE_FILEACCESS, |
|
221 current_size + EC_FOE_HEADER_SIZE))) |
228 return -1; |
222 return -1; |
229 |
223 |
230 EC_WRITE_U8 ( data, EC_FOE_OPCODE_DATA ); // OpCode = DataBlock req. |
224 EC_WRITE_U8 ( data, EC_FOE_OPCODE_DATA ); // OpCode = DataBlock req. |
231 EC_WRITE_U32( data + 2, fsm->tx_packet_no ); // PacketNo, Password |
225 EC_WRITE_U32( data + 2, fsm->tx_packet_no ); // PacketNo, Password |
232 |
226 |
233 memcpy(data + EC_FOE_HEADER_SIZE, fsm->tx_buffer + fsm->tx_buffer_offset, current_size); |
227 memcpy(data + EC_FOE_HEADER_SIZE, |
234 |
228 fsm->tx_buffer + fsm->tx_buffer_offset, current_size); |
235 fsm->tx_current_size = current_size; |
229 fsm->tx_current_size = current_size; |
236 |
230 |
237 return 0; |
231 return 0; |
238 } |
232 } |
239 |
233 |
265 return 0; |
259 return 0; |
266 } |
260 } |
267 |
261 |
268 /*****************************************************************************/ |
262 /*****************************************************************************/ |
269 |
263 |
270 char tx_buffer[0x1000]; |
|
271 void ec_fsm_foe_write(ec_fsm_foe_t *fsm /**< finite state machine */) |
264 void ec_fsm_foe_write(ec_fsm_foe_t *fsm /**< finite state machine */) |
272 { |
265 { |
273 fsm->tx_buffer = fsm->request->buffer; |
266 fsm->tx_buffer = fsm->request->buffer; |
274 fsm->tx_buffer_size = fsm->request->data_size; |
267 fsm->tx_buffer_size = fsm->request->data_size; |
275 fsm->tx_buffer_offset = 0; |
268 fsm->tx_buffer_offset = 0; |
276 |
269 |
277 fsm->tx_filename = fsm->request->file_name; |
270 fsm->tx_filename = fsm->request->file_name; |
278 fsm->tx_filename_len = strlen(fsm->tx_filename); |
271 fsm->tx_filename_len = strlen(fsm->tx_filename); |
279 |
272 |
280 fsm->state = ec_fsm_foe_write_start; |
273 fsm->state = ec_fsm_foe_write_start; |
281 |
|
282 #ifdef use_ext_buffer |
|
283 { |
|
284 int i; |
|
285 fsm->tx_data = tx_buffer; |
|
286 for (i=0 ; i<sizeof(tx_buffer) ; i++) { |
|
287 tx_buffer[i] = (uint8_t)(i); |
|
288 } |
|
289 fsm->tx_data_len = sizeof(tx_buffer); |
|
290 } |
|
291 #endif |
|
292 } |
274 } |
293 |
275 |
294 /*****************************************************************************/ |
276 /*****************************************************************************/ |
295 /** |
277 /** |
296 Initializes the SII write state machine. |
278 Initializes the SII write state machine. |
327 |
309 |
328 void ec_fsm_foe_state_ack_check( ec_fsm_foe_t *fsm ) { |
310 void ec_fsm_foe_state_ack_check( ec_fsm_foe_t *fsm ) { |
329 ec_datagram_t *datagram = fsm->datagram; |
311 ec_datagram_t *datagram = fsm->datagram; |
330 ec_slave_t *slave = fsm->slave; |
312 ec_slave_t *slave = fsm->slave; |
331 |
313 |
332 #ifdef myDEBUG |
314 #ifdef DEBUG_FOE |
333 // printk("ec_fsm_foe_ack_check()\n"); |
315 printk("ec_fsm_foe_ack_check()\n"); |
334 #endif |
316 #endif |
|
317 |
335 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
318 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
336 ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR); |
319 ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR); |
337 EC_ERR("Failed to receive FoE mailbox check datagram for slave %u" |
320 EC_ERR("Failed to receive FoE mailbox check datagram for slave %u" |
338 " (datagram state %u).\n", |
321 " (datagram state %u).\n", |
339 slave->ring_position, datagram->state); |
322 slave->ring_position, datagram->state); |
340 return; |
323 return; |
341 } |
324 } |
342 |
325 |
343 if (datagram->working_counter != 1) { |
326 if (datagram->working_counter != 1) { |
344 // slave hat noch nichts in die Mailbox getan |
327 // slave did not put anything in the mailbox yet |
345 ec_foe_set_rx_error(fsm, FOE_WC_ERROR); |
328 ec_foe_set_rx_error(fsm, FOE_WC_ERROR); |
346 EC_ERR("Reception of FoE mailbox check datagram failed on slave %u: ", |
329 EC_ERR("Reception of FoE mailbox check datagram failed on slave %u: ", |
347 slave->ring_position); |
330 slave->ring_position); |
348 ec_datagram_print_wc_error(datagram); |
331 ec_datagram_print_wc_error(datagram); |
349 return; |
332 return; |
350 } |
333 } |
351 |
334 |
352 if (!ec_slave_mbox_check(datagram)) { |
335 if (!ec_slave_mbox_check(datagram)) { |
353 unsigned long diff_ms = |
336 unsigned long diff_ms = |
354 (datagram->jiffies_received - fsm->jiffies_start) * 1000 / HZ; |
337 (datagram->jiffies_received - fsm->jiffies_start) * 1000 / HZ; |
355 if (diff_ms >= EC_FSM_FOE_TIMEOUT) { |
338 if (diff_ms >= EC_FSM_FOE_TIMEOUT) { |
356 ec_foe_set_tx_error(fsm, FOE_TIMEOUT_ERROR); |
339 ec_foe_set_tx_error(fsm, FOE_TIMEOUT_ERROR); |
357 EC_ERR("Timeout while waiting for ack response " |
340 EC_ERR("Timeout while waiting for ack response " |
358 "on slave %u.\n", slave->ring_position); |
341 "on slave %u.\n", slave->ring_position); |
359 return; |
342 return; |
360 } |
343 } |
361 // EC_ERR("WAIT!!!!!!!!!!!!!\n"); |
344 |
362 ec_slave_mbox_prepare_check(slave, datagram); // can not fail. |
345 ec_slave_mbox_prepare_check(slave, datagram); // can not fail. |
363 fsm->retries = EC_FSM_RETRIES; |
346 fsm->retries = EC_FSM_RETRIES; |
364 return; |
347 return; |
365 } |
348 } |
366 |
349 |
398 slave->ring_position); |
382 slave->ring_position); |
399 ec_datagram_print_wc_error(datagram); |
383 ec_datagram_print_wc_error(datagram); |
400 return; |
384 return; |
401 } |
385 } |
402 |
386 |
403 if (!(data = ec_slave_mbox_fetch(fsm->slave, datagram, &mbox_prot, &rec_size))) { |
387 if (!(data = ec_slave_mbox_fetch(fsm->slave, datagram, |
404 ec_foe_set_tx_error(fsm, FOE_PROT_ERROR); |
388 &mbox_prot, &rec_size))) { |
|
389 ec_foe_set_tx_error(fsm, FOE_PROT_ERROR); |
405 return; |
390 return; |
406 } |
391 } |
407 |
392 |
408 if (mbox_prot != EC_MBOX_TYPE_FILEACCESS) { // FoE |
393 if (mbox_prot != EC_MBOX_TYPE_FILEACCESS) { // FoE |
409 ec_foe_set_tx_error(fsm, FOE_MBOX_PROT_ERROR); |
394 ec_foe_set_tx_error(fsm, FOE_MBOX_PROT_ERROR); |
410 EC_ERR("Received mailbox protocol 0x%02X as response.\n", mbox_prot); |
395 EC_ERR("Received mailbox protocol 0x%02X as response.\n", mbox_prot); |
411 return; |
396 return; |
412 } |
397 } |
413 |
398 |
414 opCode = EC_READ_U8(data); |
399 opCode = EC_READ_U8(data); |
415 |
400 |
416 if (opCode == EC_FOE_OPCODE_BUSY) { |
401 if (opCode == EC_FOE_OPCODE_BUSY) { |
417 // slave ist noch nicht bereit |
402 // slave not ready |
418 if (ec_foe_prepare_data_send(fsm)) { |
403 if (ec_foe_prepare_data_send(fsm)) { |
419 ec_foe_set_tx_error(fsm, FOE_PROT_ERROR); |
404 ec_foe_set_tx_error(fsm, FOE_PROT_ERROR); |
420 EC_ERR("Slave is busy.\n"); |
405 EC_ERR("Slave is busy.\n"); |
421 return; |
406 return; |
422 } |
407 } |
423 fsm->state = ec_fsm_foe_state_data_sent; |
408 fsm->state = ec_fsm_foe_state_data_sent; |
424 return; |
409 return; |
425 } |
410 } |
426 |
411 |
427 if (opCode == EC_FOE_OPCODE_ACK) { |
412 if (opCode == EC_FOE_OPCODE_ACK) { |
428 fsm->tx_packet_no++; |
413 fsm->tx_packet_no++; |
429 fsm->tx_buffer_offset += fsm->tx_current_size; |
414 fsm->tx_buffer_offset += fsm->tx_current_size; |
430 |
415 |
431 if (fsm->tx_last_packet) { |
416 if (fsm->tx_last_packet) { |
432 fsm->state = ec_fsm_foe_end; |
417 fsm->state = ec_fsm_foe_end; |
433 return; |
418 return; |
434 } |
419 } |
435 |
420 |
436 if (ec_foe_prepare_data_send(fsm)) { |
421 if (ec_foe_prepare_data_send(fsm)) { |
437 ec_foe_set_tx_error(fsm, FOE_PROT_ERROR); |
422 ec_foe_set_tx_error(fsm, FOE_PROT_ERROR); |
438 return; |
423 return; |
439 } |
424 } |
440 fsm->state = ec_fsm_foe_state_data_sent; |
425 fsm->state = ec_fsm_foe_state_data_sent; |
441 return; |
426 return; |
442 } |
427 } |
443 ec_foe_set_tx_error(fsm, FOE_ACK_ERROR); |
428 ec_foe_set_tx_error(fsm, FOE_ACK_ERROR); |
444 } |
429 } |
445 |
430 |
446 /*****************************************************************************/ |
431 /*****************************************************************************/ |
447 /** |
432 /** |
448 State: WRQ SENT. |
433 State: WRQ SENT. |
452 |
437 |
453 void ec_fsm_foe_state_wrq_sent( ec_fsm_foe_t *fsm ) { |
438 void ec_fsm_foe_state_wrq_sent( ec_fsm_foe_t *fsm ) { |
454 ec_datagram_t *datagram = fsm->datagram; |
439 ec_datagram_t *datagram = fsm->datagram; |
455 ec_slave_t *slave = fsm->slave; |
440 ec_slave_t *slave = fsm->slave; |
456 |
441 |
457 #ifdef myDEBUG |
442 #ifdef DEBUG_FOE |
458 printk("ec_foe_state_sent_wrq()\n"); |
443 printk("ec_foe_state_sent_wrq()\n"); |
459 #endif |
444 #endif |
|
445 |
460 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
446 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
461 ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR); |
447 ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR); |
462 EC_ERR("Failed to send FoE WRQ for slave %u" |
448 EC_ERR("Failed to send FoE WRQ for slave %u" |
463 " (datagram state %u).\n", |
449 " (datagram state %u).\n", |
464 slave->ring_position, datagram->state); |
450 slave->ring_position, datagram->state); |
465 return; |
451 return; |
466 } |
452 } |
467 |
453 |
468 if (datagram->working_counter != 1) { |
454 if (datagram->working_counter != 1) { |
469 // slave hat noch nichts in die Mailbox getan |
455 // slave did not put anything in the mailbox yet |
470 ec_foe_set_rx_error(fsm, FOE_WC_ERROR); |
456 ec_foe_set_rx_error(fsm, FOE_WC_ERROR); |
471 EC_ERR("Reception of FoE WRQ failed on slave %u: ", |
457 EC_ERR("Reception of FoE WRQ failed on slave %u: ", |
472 slave->ring_position); |
458 slave->ring_position); |
473 ec_datagram_print_wc_error(datagram); |
459 ec_datagram_print_wc_error(datagram); |
474 return; |
460 return; |
475 } |
461 } |
476 |
462 |
477 fsm->jiffies_start = datagram->jiffies_sent; |
463 fsm->jiffies_start = datagram->jiffies_sent; |
478 |
464 |
479 ec_slave_mbox_prepare_check(fsm->slave, datagram); // can not fail. |
465 ec_slave_mbox_prepare_check(fsm->slave, datagram); // can not fail. |
491 |
477 |
492 void ec_fsm_foe_state_data_sent( ec_fsm_foe_t *fsm ) { |
478 void ec_fsm_foe_state_data_sent( ec_fsm_foe_t *fsm ) { |
493 ec_datagram_t *datagram = fsm->datagram; |
479 ec_datagram_t *datagram = fsm->datagram; |
494 ec_slave_t *slave = fsm->slave; |
480 ec_slave_t *slave = fsm->slave; |
495 |
481 |
496 #ifdef myDEBUG |
482 #ifdef DEBUG_FOE |
497 printk("ec_fsm_foe_state_data_sent()\n"); |
483 printk("ec_fsm_foe_state_data_sent()\n"); |
498 #endif |
484 #endif |
|
485 |
499 if (fsm->datagram->state != EC_DATAGRAM_RECEIVED) { |
486 if (fsm->datagram->state != EC_DATAGRAM_RECEIVED) { |
500 ec_foe_set_tx_error(fsm, FOE_RECEIVE_ERROR); |
487 ec_foe_set_tx_error(fsm, FOE_RECEIVE_ERROR); |
501 EC_ERR("Failed to receive FoE ack response datagram for" |
488 EC_ERR("Failed to receive FoE ack response datagram for" |
502 " slave %u (datagram state %u).\n", |
489 " slave %u (datagram state %u).\n", |
503 slave->ring_position, datagram->state); |
490 slave->ring_position, datagram->state); |
504 return; |
491 return; |
505 } |
492 } |
506 |
493 |
507 if (fsm->datagram->working_counter != 1) { |
494 if (fsm->datagram->working_counter != 1) { |
508 ec_foe_set_tx_error(fsm, FOE_WC_ERROR); |
495 ec_foe_set_tx_error(fsm, FOE_WC_ERROR); |
509 EC_ERR("Reception of FoE data send failed on slave %u: ", |
496 EC_ERR("Reception of FoE data send failed on slave %u: ", |
510 slave->ring_position); |
497 slave->ring_position); |
511 ec_datagram_print_wc_error(datagram); |
498 ec_datagram_print_wc_error(datagram); |
512 return; |
499 return; |
513 } |
500 } |
570 |
557 |
571 void ec_fsm_foe_state_rrq_sent( ec_fsm_foe_t *fsm ) { |
558 void ec_fsm_foe_state_rrq_sent( ec_fsm_foe_t *fsm ) { |
572 ec_datagram_t *datagram = fsm->datagram; |
559 ec_datagram_t *datagram = fsm->datagram; |
573 ec_slave_t *slave = fsm->slave; |
560 ec_slave_t *slave = fsm->slave; |
574 |
561 |
575 #ifdef myDEBUG |
562 #ifdef DEBUG_FOE |
576 printk("ec_foe_state_rrq_sent()\n"); |
563 printk("ec_foe_state_rrq_sent()\n"); |
577 #endif |
564 #endif |
|
565 |
578 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
566 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
579 ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR); |
567 ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR); |
580 EC_ERR("Failed to send FoE RRQ for slave %u" |
568 EC_ERR("Failed to send FoE RRQ for slave %u" |
581 " (datagram state %u).\n", |
569 " (datagram state %u).\n", |
582 slave->ring_position, datagram->state); |
570 slave->ring_position, datagram->state); |
583 return; |
571 return; |
584 } |
572 } |
585 |
573 |
586 if (datagram->working_counter != 1) { |
574 if (datagram->working_counter != 1) { |
587 // slave hat noch nichts in die Mailbox getan |
575 // slave did not put anything in the mailbox yet |
588 ec_foe_set_rx_error(fsm, FOE_WC_ERROR); |
576 ec_foe_set_rx_error(fsm, FOE_WC_ERROR); |
589 EC_ERR("Reception of FoE RRQ failed on slave %u: ", |
577 EC_ERR("Reception of FoE RRQ failed on slave %u: ", |
590 slave->ring_position); |
578 slave->ring_position); |
591 ec_datagram_print_wc_error(datagram); |
579 ec_datagram_print_wc_error(datagram); |
592 return; |
580 return; |
593 } |
581 } |
594 |
582 |
595 fsm->jiffies_start = datagram->jiffies_sent; |
583 fsm->jiffies_start = datagram->jiffies_sent; |
596 |
584 |
597 ec_slave_mbox_prepare_check(fsm->slave, datagram); // can not fail. |
585 ec_slave_mbox_prepare_check(fsm->slave, datagram); // can not fail. |
600 fsm->state = ec_fsm_foe_state_data_check; |
588 fsm->state = ec_fsm_foe_state_data_check; |
601 } |
589 } |
602 |
590 |
603 /*****************************************************************************/ |
591 /*****************************************************************************/ |
604 |
592 |
605 #ifdef myDEBUG |
|
606 char rx_buffer[0x8000]; |
|
607 #endif |
|
608 |
|
609 void ec_fsm_foe_read(ec_fsm_foe_t *fsm /**< finite state machine */) |
593 void ec_fsm_foe_read(ec_fsm_foe_t *fsm /**< finite state machine */) |
610 { |
594 { |
611 fsm->state = ec_fsm_foe_read_start; |
595 fsm->state = ec_fsm_foe_read_start; |
612 fsm->rx_filename = fsm->request->file_name; |
596 fsm->rx_filename = fsm->request->file_name; |
613 fsm->rx_filename_len = strlen(fsm->rx_filename); |
597 fsm->rx_filename_len = strlen(fsm->rx_filename); |
614 |
598 |
615 fsm->rx_buffer = fsm->request->buffer; |
599 fsm->rx_buffer = fsm->request->buffer; |
616 fsm->rx_buffer_size = fsm->request->buffer_size; |
600 fsm->rx_buffer_size = fsm->request->buffer_size; |
617 |
|
618 #ifdef use_ext_buffer |
|
619 fsm->rx_buffer = rx_buffer; |
|
620 fsm->rx_buffer_size = sizeof(rx_buffer); |
|
621 #endif |
|
622 } |
601 } |
623 |
602 |
624 /*****************************************************************************/ |
603 /*****************************************************************************/ |
625 |
604 |
626 void ec_fsm_foe_read_start(ec_fsm_foe_t *fsm /**< finite state machine */) |
605 void ec_fsm_foe_read_start(ec_fsm_foe_t *fsm /**< finite state machine */) |
627 { |
606 { |
628 size_t current_size; |
607 size_t current_size; |
629 ec_slave_t *slave = fsm->slave; |
608 ec_slave_t *slave = fsm->slave; |
630 |
609 |
631 fsm->rx_buffer_offset = 0; |
610 fsm->rx_buffer_offset = 0; |
632 fsm->rx_current_size = 0; |
611 fsm->rx_current_size = 0; |
633 fsm->rx_packet_no = 0; |
612 fsm->rx_packet_no = 0; |
634 fsm->rx_expected_packet_no = 1; |
613 fsm->rx_expected_packet_no = 1; |
635 fsm->rx_last_packet = 0; |
614 fsm->rx_last_packet = 0; |
636 |
615 |
637 current_size = fsm->rx_filename_len; |
616 current_size = fsm->rx_filename_len; |
638 |
617 |
639 #ifdef myDEBUG |
618 #ifdef DEBUG_FOE |
640 printk("ec_fsm_foe_read_start()\n"); |
619 printk("ec_fsm_foe_read_start()\n"); |
641 #endif |
620 #endif |
|
621 |
642 if (!(slave->sii.mailbox_protocols & EC_MBOX_FOE)) { |
622 if (!(slave->sii.mailbox_protocols & EC_MBOX_FOE)) { |
643 ec_foe_set_tx_error(fsm, FOE_MBOX_PROT_ERROR); |
623 ec_foe_set_tx_error(fsm, FOE_MBOX_PROT_ERROR); |
644 EC_ERR("Slave %u does not support FoE!\n", slave->ring_position); |
624 EC_ERR("Slave %u does not support FoE!\n", slave->ring_position); |
645 return; |
625 return; |
646 } |
626 } |
647 |
627 |
648 if (ec_foe_prepare_rrq_send(fsm)) { |
628 if (ec_foe_prepare_rrq_send(fsm)) { |
701 |
682 |
702 } |
683 } |
703 |
684 |
704 /*****************************************************************************/ |
685 /*****************************************************************************/ |
705 |
686 |
706 void ec_fsm_foe_state_data_read ( ec_fsm_foe_t *fsm ) { |
687 void ec_fsm_foe_state_data_read(ec_fsm_foe_t *fsm) |
707 size_t rec_size; |
688 { |
|
689 size_t rec_size; |
708 uint8_t *data, opCode, packet_no, mbox_prot; |
690 uint8_t *data, opCode, packet_no, mbox_prot; |
709 |
691 |
710 ec_datagram_t *datagram = fsm->datagram; |
692 ec_datagram_t *datagram = fsm->datagram; |
711 ec_slave_t *slave = fsm->slave; |
693 ec_slave_t *slave = fsm->slave; |
712 |
694 |
713 #ifdef myDEBUG |
695 #ifdef DEBUG_FOE |
714 printk("ec_fsm_foe_state_data_read()\n"); |
696 printk("ec_fsm_foe_state_data_read()\n"); |
715 #endif |
697 #endif |
716 |
698 |
717 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
699 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
718 ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR); |
700 ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR); |
719 EC_ERR("Failed to receive FoE DATA READ datagram for" |
701 EC_ERR("Failed to receive FoE DATA READ datagram for" |
720 " slave %u (datagram state %u).\n", |
702 " slave %u (datagram state %u).\n", |
721 slave->ring_position, datagram->state); |
703 slave->ring_position, datagram->state); |
722 return; |
704 return; |
723 } |
705 } |
791 (rec_size + EC_MBOX_HEADER_SIZE + EC_FOE_HEADER_SIZE |
773 (rec_size + EC_MBOX_HEADER_SIZE + EC_FOE_HEADER_SIZE |
792 != fsm->slave->configured_rx_mailbox_size); |
774 != fsm->slave->configured_rx_mailbox_size); |
793 |
775 |
794 if (fsm->rx_last_packet || |
776 if (fsm->rx_last_packet || |
795 (slave->configured_rx_mailbox_size - EC_MBOX_HEADER_SIZE |
777 (slave->configured_rx_mailbox_size - EC_MBOX_HEADER_SIZE |
796 - EC_FOE_HEADER_SIZE + fsm->rx_buffer_offset) <= fsm->rx_buffer_size) { |
778 - EC_FOE_HEADER_SIZE + fsm->rx_buffer_offset) |
797 // either it was the last packet or a new packet will fit into the delivered buffer |
779 <= fsm->rx_buffer_size) { |
798 #ifdef myDEBUG |
780 // either it was the last packet or a new packet will fit into the |
799 printk ("last_packet=true\n"); |
781 // delivered buffer |
800 #endif |
782 #ifdef DEBUG_FOE |
801 if (ec_foe_prepare_send_ack(fsm)) { |
783 printk ("last_packet=true\n"); |
802 ec_foe_set_rx_error(fsm, FOE_RX_DATA_ACK_ERROR); |
784 #endif |
803 return; |
785 if (ec_foe_prepare_send_ack(fsm)) { |
804 } |
786 ec_foe_set_rx_error(fsm, FOE_RX_DATA_ACK_ERROR); |
805 |
787 return; |
806 fsm->state = ec_fsm_foe_state_sent_ack; |
788 } |
|
789 |
|
790 fsm->state = ec_fsm_foe_state_sent_ack; |
807 } |
791 } |
808 else { |
792 else { |
809 // no more data fits into the delivered buffer |
793 // no more data fits into the delivered buffer |
810 // ... wait for new read request |
794 // ... wait for new read request |
811 printk ("ERROR: data doesn't fit in receive buffer\n"); |
795 printk ("ERROR: data doesn't fit in receive buffer\n"); |
812 printk (" rx_buffer_size = %d\n", fsm->rx_buffer_size); |
796 printk (" rx_buffer_size = %d\n", fsm->rx_buffer_size); |
813 printk (" rx_buffer_offset= %d\n", fsm->rx_buffer_offset); |
797 printk (" rx_buffer_offset= %d\n", fsm->rx_buffer_offset); |
814 printk (" rec_size = %d\n", rec_size); |
798 printk (" rec_size = %d\n", rec_size); |
815 printk (" rx_mailbox_size = %d\n", slave->configured_rx_mailbox_size); |
799 printk (" rx_mailbox_size = %d\n", |
816 printk (" rx_last_packet = %d\n", fsm->rx_last_packet); |
800 slave->configured_rx_mailbox_size); |
817 // fsm->state = ec_fsm_state_wait_next_read; |
801 printk (" rx_last_packet = %d\n", fsm->rx_last_packet); |
818 fsm->request->result = FOE_READY; |
802 fsm->request->result = FOE_READY; |
819 } |
803 } |
820 } |
804 } |
821 |
805 |
822 /*****************************************************************************/ |
806 /*****************************************************************************/ |
823 |
807 |
824 void ec_fsm_foe_state_sent_ack( ec_fsm_foe_t *fsm ) { |
808 void ec_fsm_foe_state_sent_ack( ec_fsm_foe_t *fsm ) { |
825 |
809 |
826 ec_datagram_t *datagram = fsm->datagram; |
810 ec_datagram_t *datagram = fsm->datagram; |
827 ec_slave_t *slave = fsm->slave; |
811 ec_slave_t *slave = fsm->slave; |
828 |
812 |
829 #ifdef myDEBUG |
813 #ifdef DEBUG_FOE |
830 printk("ec_foe_state_sent_ack()\n"); |
814 printk("ec_foe_state_sent_ack()\n"); |
831 #endif |
815 #endif |
|
816 |
832 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
817 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
833 ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR); |
818 ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR); |
834 EC_ERR("Failed to send FoE ACK for slave %u" |
819 EC_ERR("Failed to send FoE ACK for slave %u" |
835 " (datagram state %u).\n", |
820 " (datagram state %u).\n", |
836 slave->ring_position, datagram->state); |
821 slave->ring_position, datagram->state); |
837 return; |
822 return; |
838 } |
823 } |
839 |
824 |
840 if (datagram->working_counter != 1) { |
825 if (datagram->working_counter != 1) { |
841 // slave hat noch nichts in die Mailbox getan |
826 // slave did not put anything into the mailbox yet |
842 ec_foe_set_rx_error(fsm, FOE_WC_ERROR); |
827 ec_foe_set_rx_error(fsm, FOE_WC_ERROR); |
843 EC_ERR("Reception of FoE ACK failed on slave %u: ", |
828 EC_ERR("Reception of FoE ACK failed on slave %u: ", |
844 slave->ring_position); |
829 slave->ring_position); |
845 ec_datagram_print_wc_error(datagram); |
830 ec_datagram_print_wc_error(datagram); |
846 return; |
831 return; |
847 } |
832 } |
848 |
833 |
849 fsm->jiffies_start = datagram->jiffies_sent; |
834 fsm->jiffies_start = datagram->jiffies_sent; |
850 |
835 |
851 ec_slave_mbox_prepare_check(fsm->slave, datagram); // can not fail. |
836 ec_slave_mbox_prepare_check(fsm->slave, datagram); // can not fail. |
852 |
837 |
853 if (fsm->rx_last_packet) { |
838 if (fsm->rx_last_packet) { |
854 fsm->rx_expected_packet_no = 0; |
839 fsm->rx_expected_packet_no = 0; |
855 fsm->request->data_size = fsm->rx_buffer_offset; |
840 fsm->request->data_size = fsm->rx_buffer_offset; |
856 fsm->state = ec_fsm_foe_end; |
841 fsm->state = ec_fsm_foe_end; |
857 } |
842 } |
858 else { |
843 else { |
859 fsm->rx_expected_packet_no++; |
844 fsm->rx_expected_packet_no++; |
860 fsm->retries = EC_FSM_RETRIES; |
845 fsm->retries = EC_FSM_RETRIES; |
861 fsm->state = ec_fsm_foe_state_data_check; |
846 fsm->state = ec_fsm_foe_state_data_check; |
862 } |
847 } |
863 } |
848 } |
864 |
849 |
865 /*****************************************************************************/ |
850 /*****************************************************************************/ |
866 |
851 |
867 void ec_foe_set_tx_error(ec_fsm_foe_t *fsm, uint32_t errorcode) |
852 void ec_foe_set_tx_error(ec_fsm_foe_t *fsm, uint32_t errorcode) |
868 { |
853 { |
869 fsm->tx_errors++; |
854 fsm->tx_errors++; |
870 fsm->request->result = errorcode; |
855 fsm->request->result = errorcode; |
871 fsm->state = ec_fsm_foe_error; |
856 fsm->state = ec_fsm_foe_error; |
872 } |
857 } |
873 |
858 |
874 /*****************************************************************************/ |
859 /*****************************************************************************/ |
875 |
860 |
876 void ec_foe_set_rx_error(ec_fsm_foe_t *fsm, uint32_t errorcode) |
861 void ec_foe_set_rx_error(ec_fsm_foe_t *fsm, uint32_t errorcode) |
877 { |
862 { |
878 fsm->rx_errors++; |
863 fsm->rx_errors++; |
879 fsm->request->result = errorcode; |
864 fsm->request->result = errorcode; |
880 fsm->state = ec_fsm_foe_error; |
865 fsm->state = ec_fsm_foe_error; |
881 } |
866 } |
882 |
867 |
883 /*****************************************************************************/ |
868 /*****************************************************************************/ |