197 /*****************************************************************************/ |
197 /*****************************************************************************/ |
198 /** |
198 /** |
199 Sends a file or the next fragment. |
199 Sends a file or the next fragment. |
200 */ |
200 */ |
201 |
201 |
202 int ec_foe_prepare_data_send( ec_fsm_foe_t *fsm ) { |
202 int ec_foe_prepare_data_send(ec_fsm_foe_t *fsm) |
203 size_t remaining_size, current_size; |
203 { |
204 uint8_t* data; |
204 size_t remaining_size, current_size; |
|
205 uint8_t *data; |
205 |
206 |
206 remaining_size = fsm->tx_buffer_size - fsm->tx_buffer_offset; |
207 remaining_size = fsm->tx_buffer_size - fsm->tx_buffer_offset; |
207 |
208 |
208 if (remaining_size < fsm->slave->configured_tx_mailbox_size |
209 if (remaining_size < fsm->slave->configured_tx_mailbox_size |
209 - EC_MBOX_HEADER_SIZE - EC_FOE_HEADER_SIZE) { |
210 - EC_MBOX_HEADER_SIZE - EC_FOE_HEADER_SIZE) { |
212 } else { |
213 } else { |
213 current_size = fsm->slave->configured_tx_mailbox_size |
214 current_size = fsm->slave->configured_tx_mailbox_size |
214 - EC_MBOX_HEADER_SIZE - EC_FOE_HEADER_SIZE; |
215 - EC_MBOX_HEADER_SIZE - EC_FOE_HEADER_SIZE; |
215 } |
216 } |
216 |
217 |
217 if (!(data = ec_slave_mbox_prepare_send(fsm->slave, fsm->datagram, |
218 data = ec_slave_mbox_prepare_send(fsm->slave, |
218 EC_MBOX_TYPE_FILEACCESS, |
219 fsm->datagram, EC_MBOX_TYPE_FILEACCESS, |
219 current_size + EC_FOE_HEADER_SIZE))) |
220 current_size + EC_FOE_HEADER_SIZE); |
|
221 if (IS_ERR(data)) |
220 return -1; |
222 return -1; |
221 |
223 |
222 EC_WRITE_U8 ( data, EC_FOE_OPCODE_DATA ); // OpCode = DataBlock req. |
224 EC_WRITE_U8 ( data, EC_FOE_OPCODE_DATA ); // OpCode = DataBlock req. |
223 EC_WRITE_U32( data + 2, fsm->tx_packet_no ); // PacketNo, Password |
225 EC_WRITE_U32( data + 2, fsm->tx_packet_no ); // PacketNo, Password |
224 |
226 |
232 /*****************************************************************************/ |
234 /*****************************************************************************/ |
233 /** |
235 /** |
234 Prepare a write request (WRQ) with filename |
236 Prepare a write request (WRQ) with filename |
235 */ |
237 */ |
236 |
238 |
237 int ec_foe_prepare_wrq_send( ec_fsm_foe_t *fsm ) { |
239 int ec_foe_prepare_wrq_send(ec_fsm_foe_t *fsm) |
|
240 { |
238 size_t current_size; |
241 size_t current_size; |
239 uint8_t *data; |
242 uint8_t *data; |
240 |
243 |
241 fsm->tx_buffer_offset = 0; |
244 fsm->tx_buffer_offset = 0; |
242 fsm->tx_current_size = 0; |
245 fsm->tx_current_size = 0; |
243 fsm->tx_packet_no = 0; |
246 fsm->tx_packet_no = 0; |
244 fsm->tx_last_packet = 0; |
247 fsm->tx_last_packet = 0; |
245 |
248 |
246 current_size = fsm->tx_filename_len; |
249 current_size = fsm->tx_filename_len; |
247 |
250 |
248 if (!(data = ec_slave_mbox_prepare_send(fsm->slave, fsm->datagram, |
251 data = ec_slave_mbox_prepare_send(fsm->slave, fsm->datagram, |
249 EC_MBOX_TYPE_FILEACCESS, current_size + EC_FOE_HEADER_SIZE))) |
252 EC_MBOX_TYPE_FILEACCESS, current_size + EC_FOE_HEADER_SIZE); |
|
253 if (IS_ERR(data)) |
250 return -1; |
254 return -1; |
251 |
255 |
252 EC_WRITE_U16( data, EC_FOE_OPCODE_WRQ); // fsm write request |
256 EC_WRITE_U16( data, EC_FOE_OPCODE_WRQ); // fsm write request |
253 EC_WRITE_U32( data + 2, fsm->tx_packet_no ); |
257 EC_WRITE_U32( data + 2, fsm->tx_packet_no ); |
254 |
258 |
303 fsm->state = ec_fsm_foe_state_wrq_sent; |
307 fsm->state = ec_fsm_foe_state_wrq_sent; |
304 } |
308 } |
305 |
309 |
306 /*****************************************************************************/ |
310 /*****************************************************************************/ |
307 |
311 |
308 void ec_fsm_foe_state_ack_check( ec_fsm_foe_t *fsm ) { |
312 void ec_fsm_foe_state_ack_check(ec_fsm_foe_t *fsm) |
|
313 { |
309 ec_datagram_t *datagram = fsm->datagram; |
314 ec_datagram_t *datagram = fsm->datagram; |
310 ec_slave_t *slave = fsm->slave; |
315 ec_slave_t *slave = fsm->slave; |
311 |
316 |
312 #ifdef DEBUG_FOE |
317 #ifdef DEBUG_FOE |
313 printk("ec_fsm_foe_ack_check()\n"); |
318 printk("ec_fsm_foe_ack_check()\n"); |
352 fsm->state = ec_fsm_foe_state_ack_read; |
357 fsm->state = ec_fsm_foe_state_ack_read; |
353 } |
358 } |
354 |
359 |
355 /*****************************************************************************/ |
360 /*****************************************************************************/ |
356 |
361 |
357 void ec_fsm_foe_state_ack_read( ec_fsm_foe_t *fsm ) { |
362 void ec_fsm_foe_state_ack_read(ec_fsm_foe_t *fsm) |
|
363 { |
358 |
364 |
359 ec_datagram_t *datagram = fsm->datagram; |
365 ec_datagram_t *datagram = fsm->datagram; |
360 ec_slave_t *slave = fsm->slave; |
366 ec_slave_t *slave = fsm->slave; |
361 uint8_t *data, mbox_prot; |
367 uint8_t *data, mbox_prot; |
362 uint8_t opCode; |
368 uint8_t opCode; |
431 State: WRQ SENT. |
437 State: WRQ SENT. |
432 Checks is the previous transmit datagram succeded and sends the next |
438 Checks is the previous transmit datagram succeded and sends the next |
433 fragment, if necessary. |
439 fragment, if necessary. |
434 */ |
440 */ |
435 |
441 |
436 void ec_fsm_foe_state_wrq_sent( ec_fsm_foe_t *fsm ) { |
442 void ec_fsm_foe_state_wrq_sent(ec_fsm_foe_t *fsm) |
|
443 { |
437 ec_datagram_t *datagram = fsm->datagram; |
444 ec_datagram_t *datagram = fsm->datagram; |
438 ec_slave_t *slave = fsm->slave; |
445 ec_slave_t *slave = fsm->slave; |
439 |
446 |
440 #ifdef DEBUG_FOE |
447 #ifdef DEBUG_FOE |
441 printk("ec_foe_state_sent_wrq()\n"); |
448 printk("ec_foe_state_sent_wrq()\n"); |
471 State: WRQ SENT. |
478 State: WRQ SENT. |
472 Checks is the previous transmit datagram succeded and sends the next |
479 Checks is the previous transmit datagram succeded and sends the next |
473 fragment, if necessary. |
480 fragment, if necessary. |
474 */ |
481 */ |
475 |
482 |
476 void ec_fsm_foe_state_data_sent( ec_fsm_foe_t *fsm ) { |
483 void ec_fsm_foe_state_data_sent(ec_fsm_foe_t *fsm) |
|
484 { |
477 ec_datagram_t *datagram = fsm->datagram; |
485 ec_datagram_t *datagram = fsm->datagram; |
478 ec_slave_t *slave = fsm->slave; |
486 ec_slave_t *slave = fsm->slave; |
479 |
487 |
480 #ifdef DEBUG_FOE |
488 #ifdef DEBUG_FOE |
481 printk("ec_fsm_foe_state_data_sent()\n"); |
489 printk("ec_fsm_foe_state_data_sent()\n"); |
506 /*****************************************************************************/ |
514 /*****************************************************************************/ |
507 /** |
515 /** |
508 Prepare a read request (RRQ) with filename |
516 Prepare a read request (RRQ) with filename |
509 */ |
517 */ |
510 |
518 |
511 int ec_foe_prepare_rrq_send( ec_fsm_foe_t *fsm ) { |
519 int ec_foe_prepare_rrq_send(ec_fsm_foe_t *fsm) |
|
520 { |
512 size_t current_size; |
521 size_t current_size; |
513 uint8_t *data; |
522 uint8_t *data; |
514 |
523 |
515 current_size = fsm->rx_filename_len; |
524 current_size = fsm->rx_filename_len; |
516 |
525 |
517 if (!(data = ec_slave_mbox_prepare_send(fsm->slave, fsm->datagram, |
526 data = ec_slave_mbox_prepare_send(fsm->slave, fsm->datagram, |
518 EC_MBOX_TYPE_FILEACCESS, current_size + EC_FOE_HEADER_SIZE))) |
527 EC_MBOX_TYPE_FILEACCESS, current_size + EC_FOE_HEADER_SIZE); |
|
528 if (IS_ERR(data)) |
519 return -1; |
529 return -1; |
520 |
530 |
521 EC_WRITE_U16(data, EC_FOE_OPCODE_RRQ); // fsm read request |
531 EC_WRITE_U16(data, EC_FOE_OPCODE_RRQ); // fsm read request |
522 EC_WRITE_U32(data + 2, 0x00000000); // no passwd |
532 EC_WRITE_U32(data + 2, 0x00000000); // no passwd |
523 memcpy(data + EC_FOE_HEADER_SIZE, fsm->rx_filename, current_size); |
533 memcpy(data + EC_FOE_HEADER_SIZE, fsm->rx_filename, current_size); |
531 } |
541 } |
532 |
542 |
533 |
543 |
534 /*****************************************************************************/ |
544 /*****************************************************************************/ |
535 |
545 |
536 int ec_foe_prepare_send_ack( ec_fsm_foe_t *foe ) { |
546 int ec_foe_prepare_send_ack(ec_fsm_foe_t *foe) |
|
547 { |
537 uint8_t *data; |
548 uint8_t *data; |
538 |
549 |
539 if (!(data = ec_slave_mbox_prepare_send(foe->slave, foe->datagram, |
550 data = ec_slave_mbox_prepare_send(foe->slave, foe->datagram, |
540 EC_MBOX_TYPE_FILEACCESS, EC_FOE_HEADER_SIZE))) |
551 EC_MBOX_TYPE_FILEACCESS, EC_FOE_HEADER_SIZE); |
|
552 if (IS_ERR(data)) |
541 return -1; |
553 return -1; |
542 |
554 |
543 EC_WRITE_U16( data, EC_FOE_OPCODE_ACK); |
555 EC_WRITE_U16(data, EC_FOE_OPCODE_ACK); |
544 EC_WRITE_U32( data + 2, foe->rx_expected_packet_no ); |
556 EC_WRITE_U32(data + 2, foe->rx_expected_packet_no); |
545 |
557 |
546 return 0; |
558 return 0; |
547 } |
559 } |
548 |
560 |
549 /*****************************************************************************/ |
561 /*****************************************************************************/ |