diff -r f859d567f94e -r 42b62867574d master/fsm_foe.c --- a/master/fsm_foe.c Fri Jan 22 10:11:58 2016 +0100 +++ b/master/fsm_foe.c Fri Jan 22 13:09:43 2016 +0100 @@ -42,9 +42,10 @@ /*****************************************************************************/ -/** Maximum time in ms to wait for responses when reading out the dictionary. - */ -#define EC_FSM_FOE_TIMEOUT 3000 +/** Maximum time in jiffies to wait for responses when reading out the + * dictionary. + */ +#define EC_FSM_FOE_TIMEOUT_JIFFIES (3 * HZ) /** Size of the FoE header. */ @@ -256,6 +257,10 @@ EC_WRITE_U16(data, EC_FOE_OPCODE_DATA); // OpCode = DataBlock req. EC_WRITE_U32(data + 2, fsm->tx_packet_no); // PacketNo, Password +#ifdef DEBUG_FOE + EC_SLAVE_DBG(fsm->slave, 0, "sending opcode %u packet %u\n", + EC_FOE_OPCODE_DATA, fsm->tx_packet_no); +#endif memcpy(data + EC_FOE_HEADER_SIZE, fsm->tx_buffer + fsm->tx_buffer_offset, current_size); @@ -293,6 +298,10 @@ EC_WRITE_U16( data, EC_FOE_OPCODE_WRQ); // fsm write request EC_WRITE_U32( data + 2, fsm->tx_packet_no ); +#ifdef DEBUG_FOE + EC_SLAVE_DBG(fsm->slave, 0, "sending opcode %u packet %u\n", + EC_FOE_OPCODE_WRQ, fsm->tx_packet_no); +#endif memcpy(data + EC_FOE_HEADER_SIZE, fsm->tx_filename, current_size); @@ -365,9 +374,8 @@ if (!ec_slave_mbox_check(fsm->datagram)) { // slave did not put anything in the mailbox yet - unsigned long diff_ms = (fsm->datagram->jiffies_received - - fsm->jiffies_start) * 1000 / HZ; - if (diff_ms >= EC_FSM_FOE_TIMEOUT) { + if (time_after(fsm->datagram->jiffies_received, + fsm->jiffies_start + EC_FSM_FOE_TIMEOUT_JIFFIES)) { ec_foe_set_tx_error(fsm, FOE_TIMEOUT_ERROR); EC_SLAVE_ERR(slave, "Timeout while waiting for ack response.\n"); return; @@ -431,6 +439,9 @@ } opCode = EC_READ_U8(data); +#ifdef DEBUG_FOE + EC_SLAVE_DBG(fsm->slave, 0, "received opcode %u\n", opCode); +#endif if (opCode == EC_FOE_OPCODE_BUSY) { // slave not ready @@ -443,6 +454,20 @@ return; } + if (opCode == EC_FOE_OPCODE_ERR) { + fsm->request->error_code = EC_READ_U32(data + 2); + EC_SLAVE_ERR(slave, "Received FoE Error Request (code 0x%08x).\n", + fsm->request->error_code); + if (rec_size > 6 && data[6]) { + uint8_t text[256]; + strncpy(text, data + 6, min(rec_size - 6, sizeof(text))); + text[sizeof(text)-1] = 0; + EC_SLAVE_ERR(slave, "FoE Error Text: %s\n", text); + } + ec_foe_set_tx_error(fsm, FOE_OPCODE_ERROR); + return; + } + if (opCode == EC_FOE_OPCODE_ACK) { fsm->tx_packet_no++; fsm->tx_buffer_offset += fsm->tx_current_size; @@ -566,6 +591,9 @@ EC_WRITE_U16(data, EC_FOE_OPCODE_RRQ); // fsm read request EC_WRITE_U32(data + 2, 0x00000000); // no passwd memcpy(data + EC_FOE_HEADER_SIZE, fsm->rx_filename, current_size); +#ifdef DEBUG_FOE + EC_SLAVE_DBG(fsm->slave, 0, "sending opcode %u\n", EC_FOE_OPCODE_RRQ); +#endif if (fsm->slave->master->debug_level) { EC_SLAVE_DBG(fsm->slave, 1, "FoE Read Request:\n"); @@ -596,6 +624,10 @@ EC_WRITE_U16(data, EC_FOE_OPCODE_ACK); EC_WRITE_U32(data + 2, fsm->rx_expected_packet_no); +#ifdef DEBUG_FOE + EC_SLAVE_DBG(fsm->slave, 0, "sending opcode %u packet %u\n", + EC_FOE_OPCODE_ACK, fsm->rx_expected_packet_no); +#endif return 0; } @@ -704,9 +736,8 @@ } if (!ec_slave_mbox_check(fsm->datagram)) { - unsigned long diff_ms = (fsm->datagram->jiffies_received - - fsm->jiffies_start) * 1000 / HZ; - if (diff_ms >= EC_FSM_FOE_TIMEOUT) { + if (time_after(fsm->datagram->jiffies_received, + fsm->jiffies_start + EC_FSM_FOE_TIMEOUT_JIFFIES)) { ec_foe_set_tx_error(fsm, FOE_TIMEOUT_ERROR); EC_SLAVE_ERR(slave, "Timeout while waiting for ack response.\n"); return; @@ -734,7 +765,8 @@ ) { size_t rec_size; - uint8_t *data, opCode, packet_no, mbox_prot; + uint32_t packet_no; + uint8_t *data, opCode, mbox_prot; ec_slave_t *slave = fsm->slave; @@ -770,11 +802,21 @@ } opCode = EC_READ_U8(data); +#ifdef DEBUG_FOE + EC_SLAVE_DBG(fsm->slave, 0, "received opcode %u\n", opCode); +#endif if (opCode == EC_FOE_OPCODE_BUSY) { + fsm->rx_expected_packet_no--; if (ec_foe_prepare_send_ack(fsm, datagram)) { ec_foe_set_rx_error(fsm, FOE_PROT_ERROR); + } else { + fsm->state = ec_fsm_foe_state_sent_ack; } +#ifdef DEBUG_FOE + EC_SLAVE_DBG(fsm->slave, 0, "%s() busy. Next pkt %u\n", __func__, + fsm->rx_expected_packet_no); +#endif return; } @@ -782,9 +824,10 @@ fsm->request->error_code = EC_READ_U32(data + 2); EC_SLAVE_ERR(slave, "Received FoE Error Request (code 0x%08x).\n", fsm->request->error_code); - if (rec_size > 6) { + if (rec_size > 6 && data[6]) { uint8_t text[256]; strncpy(text, data + 6, min(rec_size - 6, sizeof(text))); + text[sizeof(text)-1] = 0; EC_SLAVE_ERR(slave, "FoE Error Text: %s\n", text); } ec_foe_set_rx_error(fsm, FOE_OPCODE_ERROR); @@ -799,9 +842,10 @@ return; } - packet_no = EC_READ_U16(data + 2); + packet_no = EC_READ_U32(data + 2); if (packet_no != fsm->rx_expected_packet_no) { - EC_SLAVE_ERR(slave, "Received unexpected packet number.\n"); + EC_SLAVE_ERR(slave, "Received packet number %u, expected %u.\n", + packet_no, fsm->rx_expected_packet_no); ec_foe_set_rx_error(fsm, FOE_PACKETNO_ERROR); return; }