master/fsm_foe.c
changeset 1446 85ea5af50175
parent 1416 85d20ae6736e
child 1465 3099d78343ea
equal deleted inserted replaced
1445:45c5f5560274 1446:85ea5af50175
   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 /*****************************************************************************/