diff -r 11ec009e145d -r fae3a1759126 master/fsm_foe.c --- a/master/fsm_foe.c Mon Jan 19 10:18:41 2009 +0000 +++ b/master/fsm_foe.c Mon Jan 19 12:36:18 2009 +0000 @@ -1,6 +1,6 @@ /****************************************************************************** * - * $Id:$ + * $Id$ * * Copyright (C) 2008 Olav Zarges, imc Meßsysteme GmbH * @@ -52,6 +52,8 @@ #define EC_MBOX_TYPE_FILEACCESS 0x04 +#define myDEBUG + /*****************************************************************************/ int ec_foe_prepare_data_send( ec_fsm_foe_t * ); @@ -188,18 +190,18 @@ // uint8_t Counter:4 #define EC_FOE_HEADER_SIZE 6 -// uint8_t OpMode +// uint8_t OpCode // uint8_t reserved // uint32_t PacketNo, Password, ErrorCode enum { - EC_FOE_OPMODE_RRQ = 1, - EC_FOE_OPMODE_WRQ = 2, - EC_FOE_OPMODE_DATA = 3, - EC_FOE_OPMODE_ACK = 4, - EC_FOE_OPMODE_ERR = 5, - EC_FOE_OPMODE_BUSY = 6 -} ec_foe_opmode_t; + EC_FOE_OPCODE_RRQ = 1, + EC_FOE_OPCODE_WRQ = 2, + EC_FOE_OPCODE_DATA = 3, + EC_FOE_OPCODE_ACK = 4, + EC_FOE_OPCODE_ERR = 5, + EC_FOE_OPCODE_BUSY = 6 +} ec_foe_opcode_t; /*****************************************************************************/ /** @@ -224,7 +226,7 @@ EC_MBOX_TYPE_FILEACCESS, current_size + EC_FOE_HEADER_SIZE))) return -1; - EC_WRITE_U8 ( data, EC_FOE_OPMODE_DATA ); // OpMode = DataBlock req. + EC_WRITE_U8 ( data, EC_FOE_OPCODE_DATA ); // OpCode = DataBlock req. EC_WRITE_U32( data + 2, fsm->tx_packet_no ); // PacketNo, Password memcpy(data + EC_FOE_HEADER_SIZE, fsm->tx_buffer + fsm->tx_buffer_offset, current_size); @@ -254,7 +256,7 @@ EC_MBOX_TYPE_FILEACCESS, current_size + EC_FOE_HEADER_SIZE))) return -1; - EC_WRITE_U16( data, EC_FOE_OPMODE_WRQ); // fsm write request + EC_WRITE_U16( data, EC_FOE_OPCODE_WRQ); // fsm write request EC_WRITE_U32( data + 2, fsm->tx_packet_no ); memcpy(data + EC_FOE_HEADER_SIZE, fsm->tx_filename, current_size); @@ -375,7 +377,7 @@ ec_datagram_t *datagram = fsm->datagram; ec_slave_t *slave = fsm->slave; uint8_t *data, mbox_prot; - uint16_t opMode; + uint8_t opCode; size_t rec_size; #ifdef myDEBUG @@ -408,9 +410,9 @@ return; } - opMode = EC_READ_U16(data); - - if ( opMode == EC_FOE_OPMODE_BUSY ) { + opCode = EC_READ_U8(data); + + if (opCode == EC_FOE_OPCODE_BUSY) { // slave ist noch nicht bereit if (ec_foe_prepare_data_send(fsm)) { ec_foe_set_tx_error(fsm, FOE_PROT_ERROR); @@ -421,7 +423,7 @@ return; } - if ( opMode == EC_FOE_OPMODE_ACK ) { + if (opCode == EC_FOE_OPCODE_ACK) { fsm->tx_packet_no++; fsm->tx_buffer_offset += fsm->tx_current_size; @@ -530,11 +532,15 @@ EC_MBOX_TYPE_FILEACCESS, current_size + EC_FOE_HEADER_SIZE))) return -1; - EC_WRITE_U16( data, EC_FOE_OPMODE_RRQ); // fsm read request - EC_WRITE_U32( data + 2, 0 ); - + 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); + if (fsm->slave->master->debug_level) { + EC_DBG("FoE Read Request:\n"); + ec_print_data(data, current_size + EC_FOE_HEADER_SIZE); + } + return 0; } @@ -548,7 +554,7 @@ EC_MBOX_TYPE_FILEACCESS, EC_FOE_HEADER_SIZE))) return -1; - EC_WRITE_U16( data, EC_FOE_OPMODE_ACK); + EC_WRITE_U16( data, EC_FOE_OPCODE_ACK); EC_WRITE_U32( data + 2, foe->rx_expected_packet_no ); return 0; @@ -698,7 +704,7 @@ void ec_fsm_foe_state_data_read ( ec_fsm_foe_t *fsm ) { size_t rec_size; - uint8_t *data, opMode, packet_no, mbox_prot; + uint8_t *data, opCode, packet_no, mbox_prot; ec_datagram_t *datagram = fsm->datagram; ec_slave_t *slave = fsm->slave; @@ -706,6 +712,7 @@ #ifdef myDEBUG printk("ec_fsm_foe_state_data_read()\n"); #endif + if (datagram->state != EC_DATAGRAM_RECEIVED) { ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR); EC_ERR("Failed to receive FoE DATA READ datagram for" @@ -733,37 +740,59 @@ return; } - opMode = EC_READ_U16(data); - - if (opMode == EC_FOE_OPMODE_BUSY) { + opCode = EC_READ_U8(data); + + if (opCode == EC_FOE_OPCODE_BUSY) { if (ec_foe_prepare_send_ack(fsm)) { ec_foe_set_rx_error(fsm, FOE_PROT_ERROR); } return; } - if (opMode != EC_FOE_OPMODE_DATA) { - ec_foe_set_rx_error(fsm, FOE_OPMODE_ERROR); + if (opCode == EC_FOE_OPCODE_ERR) { + fsm->request->error_code = EC_READ_U32(data + 2); + EC_ERR("Received FoE Error Request (code %08x) on slave %u.\n", + fsm->request->error_code, slave->ring_position); + if (rec_size > 6) { + uint8_t text[1024]; + strncpy(text, data + 6, min(rec_size - 6, sizeof(text))); + EC_ERR("FoE Error Text: %s\n", text); + } + ec_foe_set_rx_error(fsm, FOE_OPCODE_ERROR); + return; + } + + if (opCode != EC_FOE_OPCODE_DATA) { + EC_ERR("Received OPCODE %x, expected %x on slave %u.\n", + opCode, EC_FOE_OPCODE_DATA, slave->ring_position); + fsm->request->error_code = 0x00000000; + ec_foe_set_rx_error(fsm, FOE_OPCODE_ERROR); return; } packet_no = EC_READ_U16(data + 2); if (packet_no != fsm->rx_expected_packet_no) { + EC_ERR("Received unexpected packet number on slave %u.\n", + slave->ring_position); ec_foe_set_rx_error(fsm, FOE_PACKETNO_ERROR); return; } rec_size -= EC_FOE_HEADER_SIZE; - if ( fsm->rx_buffer_size >= fsm->rx_buffer_offset + rec_size ) { - memcpy ( fsm->rx_buffer + fsm->rx_buffer_offset, data + EC_FOE_HEADER_SIZE, rec_size ); + if (fsm->rx_buffer_size >= fsm->rx_buffer_offset + rec_size) { + memcpy(fsm->rx_buffer + fsm->rx_buffer_offset, + data + EC_FOE_HEADER_SIZE, rec_size); fsm->rx_buffer_offset += rec_size; } - fsm->rx_last_packet = (rec_size + EC_MBOX_HEADER_SIZE + EC_FOE_HEADER_SIZE != fsm->slave->sii.rx_mailbox_size); + fsm->rx_last_packet = + (rec_size + EC_MBOX_HEADER_SIZE + EC_FOE_HEADER_SIZE + != fsm->slave->sii.rx_mailbox_size); if (fsm->rx_last_packet || - slave->sii.rx_mailbox_size - EC_MBOX_HEADER_SIZE - EC_FOE_HEADER_SIZE + fsm->rx_buffer_offset <= fsm->rx_buffer_size) { + (slave->sii.rx_mailbox_size - EC_MBOX_HEADER_SIZE + - EC_FOE_HEADER_SIZE + fsm->rx_buffer_offset) <= fsm->rx_buffer_size) { // either it was the last packet or a new packet will fit into the delivered buffer #ifdef myDEBUG printk ("last_packet=true\n"); @@ -776,8 +805,8 @@ fsm->state = ec_fsm_foe_state_sent_ack; } else { - // no more data fits into the deliverd buffer - // ... wait for new read request (an den Treiber) + // no more data fits into the delivered buffer + // ... wait for new read request printk ("ERROR: data doesn't fit in receive buffer\n"); printk (" rx_buffer_size = %d\n", fsm->rx_buffer_size); printk (" rx_buffer_offset= %d\n", fsm->rx_buffer_offset); @@ -785,7 +814,7 @@ printk (" rx_mailbox_size = %d\n", slave->sii.rx_mailbox_size); printk (" rx_last_packet = %d\n", fsm->rx_last_packet); // fsm->state = ec_fsm_state_wait_next_read; - fsm->request->abort_code = FOE_READY; + fsm->request->result = FOE_READY; } } @@ -834,17 +863,19 @@ /*****************************************************************************/ -void ec_foe_set_tx_error( ec_fsm_foe_t *fsm, uint32_t errorcode ) { +void ec_foe_set_tx_error(ec_fsm_foe_t *fsm, uint32_t errorcode) +{ fsm->tx_errors++; - fsm->request->abort_code = errorcode; + fsm->request->result = errorcode; fsm->state = ec_fsm_foe_error; } /*****************************************************************************/ -void ec_foe_set_rx_error( ec_fsm_foe_t *fsm, uint32_t errorcode ) { +void ec_foe_set_rx_error(ec_fsm_foe_t *fsm, uint32_t errorcode) +{ fsm->rx_errors++; - fsm->request->abort_code = errorcode; + fsm->request->result = errorcode; fsm->state = ec_fsm_foe_error; }