46 #define EC_EOE_RESPONSE_TIMEOUT 3000 // [ms] 114 fsm->
state(fsm, datagram);
171 return PTR_ERR(data);
175 memset(data, 0, size);
183 ((req->mac_address_included != 0) << 0) |
184 ((req->ip_address_included != 0) << 1) |
185 ((req->subnet_mask_included != 0) << 2) |
186 ((req->gateway_included != 0) << 3) |
187 ((req->dns_included != 0) << 4) |
188 ((req->name_included != 0) << 5)
193 if (req->mac_address_included) {
194 memcpy(cur, req->mac_address, ETH_ALEN);
198 if (req->ip_address_included) {
199 uint32_t swapped = htonl(req->ip_address);
200 memcpy(cur, &swapped, 4);
204 if (req->subnet_mask_included) {
205 uint32_t swapped = htonl(req->subnet_mask);
206 memcpy(cur, &swapped, 4);
210 if (req->gateway_included) {
211 uint32_t swapped = htonl(req->gateway);
212 memcpy(cur, &swapped, 4);
216 if (req->dns_included) {
217 uint32_t swapped = htonl(req->dns);
218 memcpy(cur, &swapped, 4);
222 if (req->name_included) {
223 memcpy(cur, req->name, EC_MAX_HOSTNAME_SIZE);
251 EC_SLAVE_ERR(slave,
"Slave not ready to execute EoE FSM\n");
291 EC_SLAVE_ERR(slave,
"Failed to receive EoE set IP parameter" 298 unsigned long diff_ms =
311 EC_SLAVE_ERR(slave,
"Reception of EoE set IP parameter request" 312 " failed after %lu ms: ", diff_ms);
350 EC_SLAVE_ERR(slave,
"Failed to receive EoE mailbox check datagram: ");
359 " datagram failed: ");
365 unsigned long diff_ms;
371 fsm->
state(fsm, datagram);
380 EC_SLAVE_ERR(slave,
"Timeout after %lu ms while waiting for" 381 " set IP parameter response.\n", diff_ms);
415 EC_SLAVE_ERR(slave,
"Failed to receive EoE read response datagram: ");
425 EC_SLAVE_ERR(slave,
"Reception of EoE read response failed: ");
432 fsm->
state(fsm, datagram);
446 uint8_t *data, mbox_prot, eoe_type;
476 if (mbox_prot != EC_MBOX_TYPE_EOE) {
478 EC_SLAVE_ERR(slave,
"Received mailbox protocol 0x%02X as response.\n",
485 EC_SLAVE_ERR(slave,
"Received currupted EoE set IP parameter response" 486 " (%zu bytes)!\n", rec_size);
494 EC_SLAVE_ERR(slave,
"EoE Init handler received other EoE type response" 495 " (type %x). Dropping.\n", eoe_type);
505 EC_SLAVE_DBG(slave, 1,
"EoE set IP parameters failed with result code" 506 " 0x%04X.\n", req->result);
#define EC_FSM_RETRIES
Number of state machine retries on datagram timeout.
int ec_fsm_eoe_exec(ec_fsm_eoe_t *fsm, ec_datagram_t *datagram)
Executes the current state of the state machine.
uint8_t * ec_slave_mbox_prepare_send(const ec_slave_t *slave, ec_datagram_t *datagram, uint8_t type, size_t size)
Prepares a mailbox-send datagram.
unsigned long jiffies_sent
Jiffies, when the datagram was sent.
#define EC_SLAVE_DBG(slave, level, fmt, args...)
Convenience macro for printing slave-specific debug messages to syslog.
ec_mbox_data_t mbox_eoe_init_data
Received mailbox data for EoE, type eoe init reponse.
ec_slave_t * slave
slave the FSM runs on
int ec_slave_mbox_prepare_fetch(const ec_slave_t *slave, ec_datagram_t *datagram)
Prepares a datagram to fetch mailbox data.
#define EC_WRITE_U8(DATA, VAL)
Write an 8-bit unsigned value to EtherCAT data.
uint8_t * ec_slave_mbox_fetch(const ec_slave_t *slave, ec_mbox_data_t *response_data, uint8_t *type, size_t *size)
Processes received mailbox data.
uint16_t working_counter
Working counter.
ec_eoe_request_t * request
EoE request.
void ec_fsm_eoe_init(ec_fsm_eoe_t *fsm)
Constructor.
unsigned long jiffies_sent
Jiffies, when the request was sent.
#define EC_MAX_HOSTNAME_SIZE
Maximum hostname size.
EtherCAT EoE set IP parameter state machines.
void ec_fsm_eoe_set_ip_param(ec_fsm_eoe_t *fsm, ec_slave_t *slave, ec_eoe_request_t *request)
Starts to set the EoE IP partameters of a slave.
Global definitions and macros.
EtherCAT master structure.
unsigned long jiffies_start
Timestamp.
void ec_fsm_eoe_set_ip_check(ec_fsm_eoe_t *, ec_datagram_t *)
EoE state: SET IP CHECK.
ec_sii_image_t * sii_image
Current complete SII image.
ec_datagram_state_t state
State.
#define EC_WRITE_U32(DATA, VAL)
Write a 32-bit unsigned value to EtherCAT data.
uint16_t mailbox_protocols
Supported mailbox protocols.
unsigned int debug_level
Master debug level.
#define EC_SLAVE_ERR(slave, fmt, args...)
Convenience macro for printing slave-specific errors to syslog.
void ec_datagram_print_wc_error(const ec_datagram_t *datagram)
Evaluates the working counter of a single-cast datagram.
void ec_fsm_eoe_set_ip_start(ec_fsm_eoe_t *, ec_datagram_t *)
EoE state: SET IP START.
#define EC_WRITE_U16(DATA, VAL)
Write a 16-bit unsigned value to EtherCAT data.
int ec_fsm_eoe_success(const ec_fsm_eoe_t *fsm)
Returns, if the state machine terminated with success.
EoE Init, Set IP Parameter Request.
ec_master_t * master
Master owning the slave.
void(* state)(ec_fsm_eoe_t *, ec_datagram_t *)
EoE state function.
int ec_read_mbox_locked(ec_slave_t *slave)
Return the current mailbox lock status and lock it if not locked.
void ec_fsm_eoe_error(ec_fsm_eoe_t *, ec_datagram_t *)
State: ERROR.
Ethernet-over-EtherCAT set IP parameter request.
void ec_print_data(const uint8_t *, size_t)
Outputs frame contents for debugging purposes.
void ec_fsm_eoe_clear(ec_fsm_eoe_t *fsm)
Destructor.
void ec_read_mbox_lock_clear(ec_slave_t *slave)
Clears the mailbox lock.
int ec_slave_mbox_prepare_check(const ec_slave_t *slave, ec_datagram_t *datagram)
Prepares a datagram for checking the mailbox state.
#define EC_READ_U16(DATA)
Read a 16-bit unsigned value from EtherCAT data.
void ec_fsm_eoe_end(ec_fsm_eoe_t *, ec_datagram_t *)
State: END.
void ec_datagram_print_state(const ec_datagram_t *datagram)
Prints the state of a datagram.
#define EC_EOE_RESPONSE_TIMEOUT
Maximum time to wait for a set IP parameter response.
void ec_fsm_eoe_set_ip_response(ec_fsm_eoe_t *, ec_datagram_t *)
EoE state: SET IP RESPONSE.
void ec_fsm_eoe_set_ip_response_data(ec_fsm_eoe_t *, ec_datagram_t *)
EoE state: SET IP RESPONSE DATA.
#define EC_READ_U8(DATA)
Read an 8-bit unsigned value from EtherCAT data.
ec_sii_t sii
Extracted SII data.
Unused and should not be queued (dequeued).
unsigned int retries
retries upon datagram timeout
int ec_fsm_eoe_prepare_set(ec_fsm_eoe_t *fsm, ec_datagram_t *datagram)
Prepare a set IP parameters operation.
unsigned long jiffies_received
Jiffies, when the datagram was received.
size_t payload_size
Size of the mailbox response payload data.
int ec_slave_mbox_check(const ec_datagram_t *datagram)
Processes a mailbox state checking datagram.
void ec_fsm_eoe_set_ip_request(ec_fsm_eoe_t *, ec_datagram_t *)
EoE state: SET IP REQUEST.
Finite state machines for the Ethernet over EtherCAT protocol.
ec_datagram_t * datagram
Datagram used in the previous step.