Fixed spacing and comments.
This commit is contained in:
parent
fa17bbb5a8
commit
c94059e5fb
335
master/fsm_foe.c
335
master/fsm_foe.c
|
|
@ -52,37 +52,53 @@
|
|||
|
||||
#define EC_MBOX_TYPE_FILEACCESS 0x04
|
||||
|
||||
#define myDEBUG
|
||||
#define EC_FOE_HEADER_SIZE 6
|
||||
// uint8_t OpCode
|
||||
// uint8_t reserved
|
||||
// uint32_t PacketNo, Password, ErrorCode
|
||||
|
||||
//#define DEBUG_FOE
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
int ec_foe_prepare_data_send( ec_fsm_foe_t * );
|
||||
int ec_foe_prepare_wrq_send( ec_fsm_foe_t * );
|
||||
int ec_foe_prepare_rrq_send( ec_fsm_foe_t * );
|
||||
int ec_foe_prepare_send_ack( ec_fsm_foe_t * );
|
||||
enum {
|
||||
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;
|
||||
|
||||
void ec_foe_set_tx_error( ec_fsm_foe_t *, uint32_t );
|
||||
void ec_foe_set_rx_error( ec_fsm_foe_t *, uint32_t );
|
||||
/*****************************************************************************/
|
||||
|
||||
void ec_fsm_foe_write(ec_fsm_foe_t * );
|
||||
void ec_fsm_foe_read(ec_fsm_foe_t * );
|
||||
void ec_fsm_foe_end( ec_fsm_foe_t * );
|
||||
void ec_fsm_foe_error( ec_fsm_foe_t * );
|
||||
int ec_foe_prepare_data_send(ec_fsm_foe_t *);
|
||||
int ec_foe_prepare_wrq_send(ec_fsm_foe_t *);
|
||||
int ec_foe_prepare_rrq_send(ec_fsm_foe_t *);
|
||||
int ec_foe_prepare_send_ack(ec_fsm_foe_t *);
|
||||
|
||||
void ec_fsm_foe_state_wrq_sent( ec_fsm_foe_t * );
|
||||
void ec_fsm_foe_state_rrq_sent( ec_fsm_foe_t * );
|
||||
void ec_foe_set_tx_error(ec_fsm_foe_t *, uint32_t);
|
||||
void ec_foe_set_rx_error(ec_fsm_foe_t *, uint32_t);
|
||||
|
||||
void ec_fsm_foe_state_ack_check( ec_fsm_foe_t * );
|
||||
void ec_fsm_foe_state_ack_read( ec_fsm_foe_t * );
|
||||
void ec_fsm_foe_write(ec_fsm_foe_t *);
|
||||
void ec_fsm_foe_read(ec_fsm_foe_t *);
|
||||
void ec_fsm_foe_end(ec_fsm_foe_t *);
|
||||
void ec_fsm_foe_error(ec_fsm_foe_t *);
|
||||
|
||||
void ec_fsm_foe_state_data_sent( ec_fsm_foe_t * );
|
||||
void ec_fsm_foe_state_wrq_sent(ec_fsm_foe_t *);
|
||||
void ec_fsm_foe_state_rrq_sent(ec_fsm_foe_t *);
|
||||
|
||||
void ec_fsm_foe_state_data_check( ec_fsm_foe_t * );
|
||||
void ec_fsm_foe_state_data_read ( ec_fsm_foe_t * );
|
||||
void ec_fsm_foe_state_sent_ack( ec_fsm_foe_t * );
|
||||
void ec_fsm_foe_state_ack_check(ec_fsm_foe_t *);
|
||||
void ec_fsm_foe_state_ack_read(ec_fsm_foe_t *);
|
||||
|
||||
void ec_fsm_foe_write_start( ec_fsm_foe_t * );
|
||||
void ec_fsm_foe_read_start(ec_fsm_foe_t * );
|
||||
void ec_fsm_foe_state_data_sent(ec_fsm_foe_t *);
|
||||
|
||||
void ec_fsm_foe_state_data_check(ec_fsm_foe_t *);
|
||||
void ec_fsm_foe_state_data_read(ec_fsm_foe_t *);
|
||||
void ec_fsm_foe_state_sent_ack(ec_fsm_foe_t *);
|
||||
|
||||
void ec_fsm_foe_write_start(ec_fsm_foe_t *);
|
||||
void ec_fsm_foe_read_start(ec_fsm_foe_t *);
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
|
|
@ -162,8 +178,8 @@ void ec_fsm_foe_transfer(
|
|||
|
||||
void ec_fsm_foe_error(ec_fsm_foe_t *fsm /**< finite state machine */)
|
||||
{
|
||||
#ifdef myDEBUG
|
||||
printk("ec_fsm_foe_error()\n");
|
||||
#ifdef DEBUG_FOE
|
||||
printk("ec_fsm_foe_error()\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
@ -175,34 +191,11 @@ void ec_fsm_foe_error(ec_fsm_foe_t *fsm /**< finite state machine */)
|
|||
|
||||
void ec_fsm_foe_end(ec_fsm_foe_t *fsm /**< finite state machine */)
|
||||
{
|
||||
#ifdef myDEBUG
|
||||
#ifdef DEBUG_FOE
|
||||
printk("ec_fsm_foe_end\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
#define EC_MBOX_HEADER_SIZE 6
|
||||
// uint16_t Length
|
||||
// uint16_t Address
|
||||
// uint8_t reserved
|
||||
// uint8_t Type:4
|
||||
// uint8_t Counter:4
|
||||
|
||||
#define EC_FOE_HEADER_SIZE 6
|
||||
// uint8_t OpCode
|
||||
// uint8_t reserved
|
||||
// uint32_t PacketNo, Password, ErrorCode
|
||||
|
||||
enum {
|
||||
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;
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
Sends a file or the next fragment.
|
||||
|
|
@ -224,14 +217,15 @@ int ec_foe_prepare_data_send( ec_fsm_foe_t *fsm ) {
|
|||
}
|
||||
|
||||
if (!(data = ec_slave_mbox_prepare_send(fsm->slave, fsm->datagram,
|
||||
EC_MBOX_TYPE_FILEACCESS, current_size + EC_FOE_HEADER_SIZE)))
|
||||
EC_MBOX_TYPE_FILEACCESS,
|
||||
current_size + EC_FOE_HEADER_SIZE)))
|
||||
return -1;
|
||||
|
||||
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);
|
||||
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);
|
||||
fsm->tx_current_size = current_size;
|
||||
|
||||
return 0;
|
||||
|
|
@ -249,12 +243,12 @@ int ec_foe_prepare_wrq_send( ec_fsm_foe_t *fsm ) {
|
|||
fsm->tx_buffer_offset = 0;
|
||||
fsm->tx_current_size = 0;
|
||||
fsm->tx_packet_no = 0;
|
||||
fsm->tx_last_packet = 0;
|
||||
fsm->tx_last_packet = 0;
|
||||
|
||||
current_size = fsm->tx_filename_len;
|
||||
|
||||
if (!(data = ec_slave_mbox_prepare_send(fsm->slave, fsm->datagram,
|
||||
EC_MBOX_TYPE_FILEACCESS, current_size + EC_FOE_HEADER_SIZE)))
|
||||
EC_MBOX_TYPE_FILEACCESS, current_size + EC_FOE_HEADER_SIZE)))
|
||||
return -1;
|
||||
|
||||
EC_WRITE_U16( data, EC_FOE_OPCODE_WRQ); // fsm write request
|
||||
|
|
@ -267,28 +261,16 @@ int ec_foe_prepare_wrq_send( ec_fsm_foe_t *fsm ) {
|
|||
|
||||
/*****************************************************************************/
|
||||
|
||||
char tx_buffer[0x1000];
|
||||
void ec_fsm_foe_write(ec_fsm_foe_t *fsm /**< finite state machine */)
|
||||
{
|
||||
fsm->tx_buffer = fsm->request->buffer;
|
||||
fsm->tx_buffer_size = fsm->request->data_size;
|
||||
fsm->tx_buffer_offset = 0;
|
||||
|
||||
fsm->tx_filename = fsm->request->file_name;
|
||||
fsm->tx_filename_len = strlen(fsm->tx_filename);
|
||||
fsm->tx_filename = fsm->request->file_name;
|
||||
fsm->tx_filename_len = strlen(fsm->tx_filename);
|
||||
|
||||
fsm->state = ec_fsm_foe_write_start;
|
||||
|
||||
#ifdef use_ext_buffer
|
||||
{
|
||||
int i;
|
||||
fsm->tx_data = tx_buffer;
|
||||
for (i=0 ; i<sizeof(tx_buffer) ; i++) {
|
||||
tx_buffer[i] = (uint8_t)(i);
|
||||
}
|
||||
fsm->tx_data_len = sizeof(tx_buffer);
|
||||
}
|
||||
#endif
|
||||
fsm->state = ec_fsm_foe_write_start;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
@ -303,9 +285,9 @@ void ec_fsm_foe_write_start(ec_fsm_foe_t *fsm /**< finite state machine */)
|
|||
fsm->tx_buffer_offset = 0;
|
||||
fsm->tx_current_size = 0;
|
||||
fsm->tx_packet_no = 0;
|
||||
fsm->tx_last_packet = 0;
|
||||
fsm->tx_last_packet = 0;
|
||||
|
||||
#ifdef myDEBUG
|
||||
#ifdef DEBUG_FOE
|
||||
printk("ec_fsm_foe_write_start()\n");
|
||||
#endif
|
||||
|
||||
|
|
@ -329,11 +311,12 @@ void ec_fsm_foe_state_ack_check( ec_fsm_foe_t *fsm ) {
|
|||
ec_datagram_t *datagram = fsm->datagram;
|
||||
ec_slave_t *slave = fsm->slave;
|
||||
|
||||
#ifdef myDEBUG
|
||||
// printk("ec_fsm_foe_ack_check()\n");
|
||||
#ifdef DEBUG_FOE
|
||||
printk("ec_fsm_foe_ack_check()\n");
|
||||
#endif
|
||||
|
||||
if (datagram->state != EC_DATAGRAM_RECEIVED) {
|
||||
ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR);
|
||||
ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR);
|
||||
EC_ERR("Failed to receive FoE mailbox check datagram for slave %u"
|
||||
" (datagram state %u).\n",
|
||||
slave->ring_position, datagram->state);
|
||||
|
|
@ -341,24 +324,24 @@ void ec_fsm_foe_state_ack_check( ec_fsm_foe_t *fsm ) {
|
|||
}
|
||||
|
||||
if (datagram->working_counter != 1) {
|
||||
// slave hat noch nichts in die Mailbox getan
|
||||
// slave did not put anything in the mailbox yet
|
||||
ec_foe_set_rx_error(fsm, FOE_WC_ERROR);
|
||||
EC_ERR("Reception of FoE mailbox check datagram failed on slave %u: ",
|
||||
slave->ring_position);
|
||||
ec_datagram_print_wc_error(datagram);
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (!ec_slave_mbox_check(datagram)) {
|
||||
unsigned long diff_ms =
|
||||
(datagram->jiffies_received - fsm->jiffies_start) * 1000 / HZ;
|
||||
if (diff_ms >= EC_FSM_FOE_TIMEOUT) {
|
||||
ec_foe_set_tx_error(fsm, FOE_TIMEOUT_ERROR);
|
||||
ec_foe_set_tx_error(fsm, FOE_TIMEOUT_ERROR);
|
||||
EC_ERR("Timeout while waiting for ack response "
|
||||
"on slave %u.\n", slave->ring_position);
|
||||
return;
|
||||
}
|
||||
// EC_ERR("WAIT!!!!!!!!!!!!!\n");
|
||||
|
||||
ec_slave_mbox_prepare_check(slave, datagram); // can not fail.
|
||||
fsm->retries = EC_FSM_RETRIES;
|
||||
return;
|
||||
|
|
@ -381,11 +364,12 @@ void ec_fsm_foe_state_ack_read( ec_fsm_foe_t *fsm ) {
|
|||
uint8_t opCode;
|
||||
size_t rec_size;
|
||||
|
||||
#ifdef myDEBUG
|
||||
printk("ec_fsm_foe_ack_read()\n");
|
||||
#ifdef DEBUG_FOE
|
||||
printk("ec_fsm_foe_ack_read()\n");
|
||||
#endif
|
||||
|
||||
if (datagram->state != EC_DATAGRAM_RECEIVED) {
|
||||
ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR);
|
||||
ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR);
|
||||
EC_ERR("Failed to receive FoE ack response datagram for"
|
||||
" slave %u (datagram state %u).\n",
|
||||
slave->ring_position, datagram->state);
|
||||
|
|
@ -400,13 +384,14 @@ void ec_fsm_foe_state_ack_read( ec_fsm_foe_t *fsm ) {
|
|||
return;
|
||||
}
|
||||
|
||||
if (!(data = ec_slave_mbox_fetch(fsm->slave, datagram, &mbox_prot, &rec_size))) {
|
||||
ec_foe_set_tx_error(fsm, FOE_PROT_ERROR);
|
||||
if (!(data = ec_slave_mbox_fetch(fsm->slave, datagram,
|
||||
&mbox_prot, &rec_size))) {
|
||||
ec_foe_set_tx_error(fsm, FOE_PROT_ERROR);
|
||||
return;
|
||||
}
|
||||
|
||||
if (mbox_prot != EC_MBOX_TYPE_FILEACCESS) { // FoE
|
||||
ec_foe_set_tx_error(fsm, FOE_MBOX_PROT_ERROR);
|
||||
ec_foe_set_tx_error(fsm, FOE_MBOX_PROT_ERROR);
|
||||
EC_ERR("Received mailbox protocol 0x%02X as response.\n", mbox_prot);
|
||||
return;
|
||||
}
|
||||
|
|
@ -414,11 +399,11 @@ void ec_fsm_foe_state_ack_read( ec_fsm_foe_t *fsm ) {
|
|||
opCode = EC_READ_U8(data);
|
||||
|
||||
if (opCode == EC_FOE_OPCODE_BUSY) {
|
||||
// slave ist noch nicht bereit
|
||||
// slave not ready
|
||||
if (ec_foe_prepare_data_send(fsm)) {
|
||||
ec_foe_set_tx_error(fsm, FOE_PROT_ERROR);
|
||||
ec_foe_set_tx_error(fsm, FOE_PROT_ERROR);
|
||||
EC_ERR("Slave is busy.\n");
|
||||
return;
|
||||
return;
|
||||
}
|
||||
fsm->state = ec_fsm_foe_state_data_sent;
|
||||
return;
|
||||
|
|
@ -429,18 +414,18 @@ void ec_fsm_foe_state_ack_read( ec_fsm_foe_t *fsm ) {
|
|||
fsm->tx_buffer_offset += fsm->tx_current_size;
|
||||
|
||||
if (fsm->tx_last_packet) {
|
||||
fsm->state = ec_fsm_foe_end;
|
||||
return;
|
||||
fsm->state = ec_fsm_foe_end;
|
||||
return;
|
||||
}
|
||||
|
||||
if (ec_foe_prepare_data_send(fsm)) {
|
||||
ec_foe_set_tx_error(fsm, FOE_PROT_ERROR);
|
||||
return;
|
||||
}
|
||||
ec_foe_set_tx_error(fsm, FOE_PROT_ERROR);
|
||||
return;
|
||||
}
|
||||
fsm->state = ec_fsm_foe_state_data_sent;
|
||||
return;
|
||||
return;
|
||||
}
|
||||
ec_foe_set_tx_error(fsm, FOE_ACK_ERROR);
|
||||
ec_foe_set_tx_error(fsm, FOE_ACK_ERROR);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
@ -454,11 +439,12 @@ void ec_fsm_foe_state_wrq_sent( ec_fsm_foe_t *fsm ) {
|
|||
ec_datagram_t *datagram = fsm->datagram;
|
||||
ec_slave_t *slave = fsm->slave;
|
||||
|
||||
#ifdef myDEBUG
|
||||
printk("ec_foe_state_sent_wrq()\n");
|
||||
#ifdef DEBUG_FOE
|
||||
printk("ec_foe_state_sent_wrq()\n");
|
||||
#endif
|
||||
|
||||
if (datagram->state != EC_DATAGRAM_RECEIVED) {
|
||||
ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR);
|
||||
ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR);
|
||||
EC_ERR("Failed to send FoE WRQ for slave %u"
|
||||
" (datagram state %u).\n",
|
||||
slave->ring_position, datagram->state);
|
||||
|
|
@ -466,12 +452,12 @@ void ec_fsm_foe_state_wrq_sent( ec_fsm_foe_t *fsm ) {
|
|||
}
|
||||
|
||||
if (datagram->working_counter != 1) {
|
||||
// slave hat noch nichts in die Mailbox getan
|
||||
// slave did not put anything in the mailbox yet
|
||||
ec_foe_set_rx_error(fsm, FOE_WC_ERROR);
|
||||
EC_ERR("Reception of FoE WRQ failed on slave %u: ",
|
||||
slave->ring_position);
|
||||
ec_datagram_print_wc_error(datagram);
|
||||
return;
|
||||
return;
|
||||
}
|
||||
|
||||
fsm->jiffies_start = datagram->jiffies_sent;
|
||||
|
|
@ -493,11 +479,12 @@ void ec_fsm_foe_state_data_sent( ec_fsm_foe_t *fsm ) {
|
|||
ec_datagram_t *datagram = fsm->datagram;
|
||||
ec_slave_t *slave = fsm->slave;
|
||||
|
||||
#ifdef myDEBUG
|
||||
printk("ec_fsm_foe_state_data_sent()\n");
|
||||
#ifdef DEBUG_FOE
|
||||
printk("ec_fsm_foe_state_data_sent()\n");
|
||||
#endif
|
||||
|
||||
if (fsm->datagram->state != EC_DATAGRAM_RECEIVED) {
|
||||
ec_foe_set_tx_error(fsm, FOE_RECEIVE_ERROR);
|
||||
ec_foe_set_tx_error(fsm, FOE_RECEIVE_ERROR);
|
||||
EC_ERR("Failed to receive FoE ack response datagram for"
|
||||
" slave %u (datagram state %u).\n",
|
||||
slave->ring_position, datagram->state);
|
||||
|
|
@ -505,7 +492,7 @@ void ec_fsm_foe_state_data_sent( ec_fsm_foe_t *fsm ) {
|
|||
}
|
||||
|
||||
if (fsm->datagram->working_counter != 1) {
|
||||
ec_foe_set_tx_error(fsm, FOE_WC_ERROR);
|
||||
ec_foe_set_tx_error(fsm, FOE_WC_ERROR);
|
||||
EC_ERR("Reception of FoE data send failed on slave %u: ",
|
||||
slave->ring_position);
|
||||
ec_datagram_print_wc_error(datagram);
|
||||
|
|
@ -530,7 +517,7 @@ int ec_foe_prepare_rrq_send( ec_fsm_foe_t *fsm ) {
|
|||
current_size = fsm->rx_filename_len;
|
||||
|
||||
if (!(data = ec_slave_mbox_prepare_send(fsm->slave, fsm->datagram,
|
||||
EC_MBOX_TYPE_FILEACCESS, current_size + EC_FOE_HEADER_SIZE)))
|
||||
EC_MBOX_TYPE_FILEACCESS, current_size + EC_FOE_HEADER_SIZE)))
|
||||
return -1;
|
||||
|
||||
EC_WRITE_U16(data, EC_FOE_OPCODE_RRQ); // fsm read request
|
||||
|
|
@ -552,7 +539,7 @@ int ec_foe_prepare_send_ack( ec_fsm_foe_t *foe ) {
|
|||
uint8_t *data;
|
||||
|
||||
if (!(data = ec_slave_mbox_prepare_send(foe->slave, foe->datagram,
|
||||
EC_MBOX_TYPE_FILEACCESS, EC_FOE_HEADER_SIZE)))
|
||||
EC_MBOX_TYPE_FILEACCESS, EC_FOE_HEADER_SIZE)))
|
||||
return -1;
|
||||
|
||||
EC_WRITE_U16( data, EC_FOE_OPCODE_ACK);
|
||||
|
|
@ -572,11 +559,12 @@ void ec_fsm_foe_state_rrq_sent( ec_fsm_foe_t *fsm ) {
|
|||
ec_datagram_t *datagram = fsm->datagram;
|
||||
ec_slave_t *slave = fsm->slave;
|
||||
|
||||
#ifdef myDEBUG
|
||||
printk("ec_foe_state_rrq_sent()\n");
|
||||
#ifdef DEBUG_FOE
|
||||
printk("ec_foe_state_rrq_sent()\n");
|
||||
#endif
|
||||
|
||||
if (datagram->state != EC_DATAGRAM_RECEIVED) {
|
||||
ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR);
|
||||
ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR);
|
||||
EC_ERR("Failed to send FoE RRQ for slave %u"
|
||||
" (datagram state %u).\n",
|
||||
slave->ring_position, datagram->state);
|
||||
|
|
@ -584,12 +572,12 @@ void ec_fsm_foe_state_rrq_sent( ec_fsm_foe_t *fsm ) {
|
|||
}
|
||||
|
||||
if (datagram->working_counter != 1) {
|
||||
// slave hat noch nichts in die Mailbox getan
|
||||
// slave did not put anything in the mailbox yet
|
||||
ec_foe_set_rx_error(fsm, FOE_WC_ERROR);
|
||||
EC_ERR("Reception of FoE RRQ failed on slave %u: ",
|
||||
slave->ring_position);
|
||||
ec_datagram_print_wc_error(datagram);
|
||||
return;
|
||||
return;
|
||||
}
|
||||
|
||||
fsm->jiffies_start = datagram->jiffies_sent;
|
||||
|
|
@ -602,30 +590,21 @@ void ec_fsm_foe_state_rrq_sent( ec_fsm_foe_t *fsm ) {
|
|||
|
||||
/*****************************************************************************/
|
||||
|
||||
#ifdef myDEBUG
|
||||
char rx_buffer[0x8000];
|
||||
#endif
|
||||
|
||||
void ec_fsm_foe_read(ec_fsm_foe_t *fsm /**< finite state machine */)
|
||||
{
|
||||
fsm->state = ec_fsm_foe_read_start;
|
||||
fsm->rx_filename = fsm->request->file_name;
|
||||
fsm->rx_filename_len = strlen(fsm->rx_filename);
|
||||
fsm->state = ec_fsm_foe_read_start;
|
||||
fsm->rx_filename = fsm->request->file_name;
|
||||
fsm->rx_filename_len = strlen(fsm->rx_filename);
|
||||
|
||||
fsm->rx_buffer = fsm->request->buffer;
|
||||
fsm->rx_buffer_size = fsm->request->buffer_size;
|
||||
|
||||
#ifdef use_ext_buffer
|
||||
fsm->rx_buffer = rx_buffer;
|
||||
fsm->rx_buffer_size = sizeof(rx_buffer);
|
||||
#endif
|
||||
fsm->rx_buffer = fsm->request->buffer;
|
||||
fsm->rx_buffer_size = fsm->request->buffer_size;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
void ec_fsm_foe_read_start(ec_fsm_foe_t *fsm /**< finite state machine */)
|
||||
{
|
||||
size_t current_size;
|
||||
size_t current_size;
|
||||
ec_slave_t *slave = fsm->slave;
|
||||
|
||||
fsm->rx_buffer_offset = 0;
|
||||
|
|
@ -636,11 +615,12 @@ void ec_fsm_foe_read_start(ec_fsm_foe_t *fsm /**< finite state machine */)
|
|||
|
||||
current_size = fsm->rx_filename_len;
|
||||
|
||||
#ifdef myDEBUG
|
||||
printk("ec_fsm_foe_read_start()\n");
|
||||
#ifdef DEBUG_FOE
|
||||
printk("ec_fsm_foe_read_start()\n");
|
||||
#endif
|
||||
|
||||
if (!(slave->sii.mailbox_protocols & EC_MBOX_FOE)) {
|
||||
ec_foe_set_tx_error(fsm, FOE_MBOX_PROT_ERROR);
|
||||
ec_foe_set_tx_error(fsm, FOE_MBOX_PROT_ERROR);
|
||||
EC_ERR("Slave %u does not support FoE!\n", slave->ring_position);
|
||||
return;
|
||||
}
|
||||
|
|
@ -659,10 +639,11 @@ void ec_fsm_foe_state_data_check ( ec_fsm_foe_t *fsm ) {
|
|||
ec_datagram_t *datagram = fsm->datagram;
|
||||
ec_slave_t *slave = fsm->slave;
|
||||
|
||||
#ifdef myDEBUG
|
||||
printk("ec_fsm_foe_state_data_check()\n");
|
||||
#ifdef DEBUG_FOE
|
||||
printk("ec_fsm_foe_state_data_check()\n");
|
||||
#endif
|
||||
if (datagram->state != EC_DATAGRAM_RECEIVED) {
|
||||
|
||||
if (datagram->state != EC_DATAGRAM_RECEIVED) {
|
||||
ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR);
|
||||
EC_ERR("Failed to send FoE DATA READ for slave %u"
|
||||
" (datagram state %u).\n",
|
||||
|
|
@ -682,7 +663,7 @@ void ec_fsm_foe_state_data_check ( ec_fsm_foe_t *fsm ) {
|
|||
unsigned long diff_ms =
|
||||
(datagram->jiffies_received - fsm->jiffies_start) * 1000 / HZ;
|
||||
if (diff_ms >= EC_FSM_FOE_TIMEOUT) {
|
||||
ec_foe_set_tx_error(fsm, FOE_TIMEOUT_ERROR);
|
||||
ec_foe_set_tx_error(fsm, FOE_TIMEOUT_ERROR);
|
||||
EC_ERR("Timeout while waiting for ack response "
|
||||
"on slave %u.\n", slave->ring_position);
|
||||
return;
|
||||
|
|
@ -703,19 +684,20 @@ void ec_fsm_foe_state_data_check ( ec_fsm_foe_t *fsm ) {
|
|||
|
||||
/*****************************************************************************/
|
||||
|
||||
void ec_fsm_foe_state_data_read ( ec_fsm_foe_t *fsm ) {
|
||||
size_t rec_size;
|
||||
void ec_fsm_foe_state_data_read(ec_fsm_foe_t *fsm)
|
||||
{
|
||||
size_t rec_size;
|
||||
uint8_t *data, opCode, packet_no, mbox_prot;
|
||||
|
||||
ec_datagram_t *datagram = fsm->datagram;
|
||||
ec_slave_t *slave = fsm->slave;
|
||||
|
||||
#ifdef myDEBUG
|
||||
printk("ec_fsm_foe_state_data_read()\n");
|
||||
#ifdef DEBUG_FOE
|
||||
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_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR);
|
||||
EC_ERR("Failed to receive FoE DATA READ datagram for"
|
||||
" slave %u (datagram state %u).\n",
|
||||
slave->ring_position, datagram->state);
|
||||
|
|
@ -730,12 +712,12 @@ void ec_fsm_foe_state_data_read ( ec_fsm_foe_t *fsm ) {
|
|||
return;
|
||||
}
|
||||
|
||||
if (!(data = ec_slave_mbox_fetch(slave, datagram, &mbox_prot, &rec_size))) {
|
||||
ec_foe_set_rx_error(fsm, FOE_MBOX_FETCH_ERROR);
|
||||
if (!(data = ec_slave_mbox_fetch(slave, datagram, &mbox_prot, &rec_size))) {
|
||||
ec_foe_set_rx_error(fsm, FOE_MBOX_FETCH_ERROR);
|
||||
return;
|
||||
}
|
||||
|
||||
if (mbox_prot != EC_MBOX_TYPE_FILEACCESS) { // FoE
|
||||
if (mbox_prot != EC_MBOX_TYPE_FILEACCESS) { // FoE
|
||||
EC_ERR("Received mailbox protocol 0x%02X as response.\n", mbox_prot);
|
||||
ec_foe_set_rx_error(fsm, FOE_PROT_ERROR);
|
||||
return;
|
||||
|
|
@ -752,7 +734,7 @@ void ec_fsm_foe_state_data_read ( ec_fsm_foe_t *fsm ) {
|
|||
|
||||
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",
|
||||
EC_ERR("Received FoE Error Request (code 0x%08x) on slave %u.\n",
|
||||
fsm->request->error_code, slave->ring_position);
|
||||
if (rec_size > 6) {
|
||||
uint8_t text[1024];
|
||||
|
|
@ -793,29 +775,31 @@ void ec_fsm_foe_state_data_read ( ec_fsm_foe_t *fsm ) {
|
|||
|
||||
if (fsm->rx_last_packet ||
|
||||
(slave->configured_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");
|
||||
- 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 DEBUG_FOE
|
||||
printk ("last_packet=true\n");
|
||||
#endif
|
||||
if (ec_foe_prepare_send_ack(fsm)) {
|
||||
ec_foe_set_rx_error(fsm, FOE_RX_DATA_ACK_ERROR);
|
||||
return;
|
||||
}
|
||||
if (ec_foe_prepare_send_ack(fsm)) {
|
||||
ec_foe_set_rx_error(fsm, FOE_RX_DATA_ACK_ERROR);
|
||||
return;
|
||||
}
|
||||
|
||||
fsm->state = ec_fsm_foe_state_sent_ack;
|
||||
fsm->state = ec_fsm_foe_state_sent_ack;
|
||||
}
|
||||
else {
|
||||
// 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);
|
||||
printk (" rec_size = %d\n", rec_size);
|
||||
printk (" rx_mailbox_size = %d\n", slave->configured_rx_mailbox_size);
|
||||
printk (" rx_last_packet = %d\n", fsm->rx_last_packet);
|
||||
// fsm->state = ec_fsm_state_wait_next_read;
|
||||
fsm->request->result = FOE_READY;
|
||||
// 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);
|
||||
printk (" rec_size = %d\n", rec_size);
|
||||
printk (" rx_mailbox_size = %d\n",
|
||||
slave->configured_rx_mailbox_size);
|
||||
printk (" rx_last_packet = %d\n", fsm->rx_last_packet);
|
||||
fsm->request->result = FOE_READY;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -826,9 +810,10 @@ void ec_fsm_foe_state_sent_ack( ec_fsm_foe_t *fsm ) {
|
|||
ec_datagram_t *datagram = fsm->datagram;
|
||||
ec_slave_t *slave = fsm->slave;
|
||||
|
||||
#ifdef myDEBUG
|
||||
printk("ec_foe_state_sent_ack()\n");
|
||||
#ifdef DEBUG_FOE
|
||||
printk("ec_foe_state_sent_ack()\n");
|
||||
#endif
|
||||
|
||||
if (datagram->state != EC_DATAGRAM_RECEIVED) {
|
||||
ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR);
|
||||
EC_ERR("Failed to send FoE ACK for slave %u"
|
||||
|
|
@ -838,12 +823,12 @@ void ec_fsm_foe_state_sent_ack( ec_fsm_foe_t *fsm ) {
|
|||
}
|
||||
|
||||
if (datagram->working_counter != 1) {
|
||||
// slave hat noch nichts in die Mailbox getan
|
||||
// slave did not put anything into the mailbox yet
|
||||
ec_foe_set_rx_error(fsm, FOE_WC_ERROR);
|
||||
EC_ERR("Reception of FoE ACK failed on slave %u: ",
|
||||
slave->ring_position);
|
||||
ec_datagram_print_wc_error(datagram);
|
||||
return;
|
||||
return;
|
||||
}
|
||||
|
||||
fsm->jiffies_start = datagram->jiffies_sent;
|
||||
|
|
@ -851,12 +836,12 @@ void ec_fsm_foe_state_sent_ack( ec_fsm_foe_t *fsm ) {
|
|||
ec_slave_mbox_prepare_check(fsm->slave, datagram); // can not fail.
|
||||
|
||||
if (fsm->rx_last_packet) {
|
||||
fsm->rx_expected_packet_no = 0;
|
||||
fsm->request->data_size = fsm->rx_buffer_offset;
|
||||
fsm->state = ec_fsm_foe_end;
|
||||
fsm->rx_expected_packet_no = 0;
|
||||
fsm->request->data_size = fsm->rx_buffer_offset;
|
||||
fsm->state = ec_fsm_foe_end;
|
||||
}
|
||||
else {
|
||||
fsm->rx_expected_packet_no++;
|
||||
fsm->rx_expected_packet_no++;
|
||||
fsm->retries = EC_FSM_RETRIES;
|
||||
fsm->state = ec_fsm_foe_state_data_check;
|
||||
}
|
||||
|
|
@ -866,18 +851,18 @@ void ec_fsm_foe_state_sent_ack( ec_fsm_foe_t *fsm ) {
|
|||
|
||||
void ec_foe_set_tx_error(ec_fsm_foe_t *fsm, uint32_t errorcode)
|
||||
{
|
||||
fsm->tx_errors++;
|
||||
fsm->request->result = errorcode;
|
||||
fsm->state = ec_fsm_foe_error;
|
||||
fsm->tx_errors++;
|
||||
fsm->request->result = errorcode;
|
||||
fsm->state = ec_fsm_foe_error;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
void ec_foe_set_rx_error(ec_fsm_foe_t *fsm, uint32_t errorcode)
|
||||
{
|
||||
fsm->rx_errors++;
|
||||
fsm->request->result = errorcode;
|
||||
fsm->state = ec_fsm_foe_error;
|
||||
fsm->rx_errors++;
|
||||
fsm->request->result = errorcode;
|
||||
fsm->state = ec_fsm_foe_error;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
|
|||
Loading…
Reference in New Issue