From 972337444b564b04e7a169ff37da72435d730ded Mon Sep 17 00:00:00 2001 From: Florian Pose Date: Tue, 14 May 2024 18:37:17 +0200 Subject: [PATCH] Retry receiving an EoE set IP parameter response. --- master/fsm_eoe.c | 26 +++++++++++++++++++++----- master/fsm_eoe.h | 1 + 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/master/fsm_eoe.c b/master/fsm_eoe.c index 73c2ef56..abfdb781 100644 --- a/master/fsm_eoe.c +++ b/master/fsm_eoe.c @@ -61,6 +61,7 @@ void ec_fsm_eoe_init( fsm->datagram = NULL; fsm->jiffies_start = 0; fsm->request = NULL; + fsm->frame_type_retries = 0; } /****************************************************************************/ @@ -313,6 +314,7 @@ void ec_fsm_eoe_set_ip_request( ec_slave_mbox_prepare_check(slave, datagram); // can not fail. fsm->retries = EC_FSM_RETRIES; fsm->state = ec_fsm_eoe_set_ip_check; + fsm->frame_type_retries = 10; } /****************************************************************************/ @@ -431,11 +433,25 @@ void ec_fsm_eoe_set_ip_response( frame_type = EC_READ_U8(data) & 0x0f; if (frame_type != EC_EOE_FRAMETYPE_SET_IP_RES) { - EC_SLAVE_ERR(slave, "Received no set IP parameter response" - " (frame type %x).\n", frame_type); - ec_print_data(data, rec_size); - fsm->state = ec_fsm_eoe_error; - return; + if (master->debug_level) { + EC_SLAVE_DBG(slave, 0, "Received no set IP parameter response" + " (frame type %x).\n", frame_type); + ec_print_data(data, rec_size); + } + if (fsm->frame_type_retries--) { + // there may be an EoE segment left in the mailbox. + // discard it and receive again. + fsm->jiffies_start = fsm->datagram->jiffies_sent; + ec_slave_mbox_prepare_check(slave, datagram); // can not fail. + fsm->retries = EC_FSM_RETRIES; + fsm->state = ec_fsm_eoe_set_ip_check; + return; + } + else { + EC_SLAVE_ERR(slave, "Received no set IP parameter response.\n"); + fsm->state = ec_fsm_eoe_error; + return; + } } req->result = EC_READ_U16(data + 2); diff --git a/master/fsm_eoe.h b/master/fsm_eoe.h index 3809a462..7f901bdd 100644 --- a/master/fsm_eoe.h +++ b/master/fsm_eoe.h @@ -48,6 +48,7 @@ struct ec_fsm_eoe { ec_datagram_t *datagram; /**< Datagram used in the previous step. */ unsigned long jiffies_start; /**< Timestamp. */ ec_eoe_request_t *request; /**< EoE request */ + unsigned int frame_type_retries; /**< retries upon wrong frame type. */ }; /****************************************************************************/