46 #define DEBUG_RETRIES 0 115 fsm->
state(fsm, datagram);
175 data = datagram->
data;
193 case EC_MBOX_TYPE_AOE : { *mbox_prot =
EC_MBOX_AOE; }
break;
194 case EC_MBOX_TYPE_EOE : { *mbox_prot =
EC_MBOX_EOE; }
break;
195 case EC_MBOX_TYPE_COE : { *mbox_prot =
EC_MBOX_COE; }
break;
196 case EC_MBOX_TYPE_FOE : { *mbox_prot =
EC_MBOX_FOE; }
break;
197 case EC_MBOX_TYPE_SOE : { *mbox_prot =
EC_MBOX_SOE; }
break;
198 case EC_MBOX_TYPE_VOE : { *mbox_prot =
EC_MBOX_VOE; }
break;
227 EC_SLAVE_ERR(slave,
"Slave cannot process Mailbox Gateway request." 228 " SII data not available.\n");
238 EC_SLAVE_ERR(slave,
"Slave does not support requested mailbox type!\n");
277 unsigned long diff_ms;
290 " request datagram: ");
299 if (diff_ms < fsm->request->response_timeout) {
302 " Gateway request. Retrying after %lu ms...\n",
315 " failed with timeout after %lu ms: ", diff_ms);
322 EC_SLAVE_WARN(slave,
"MBox Gateway request took %lu ms.\n", diff_ms);
360 EC_SLAVE_ERR(slave,
"Failed to receive MBox Gateway mailbox check" 371 " datagram failed: ");
377 unsigned long diff_ms = 0;
383 fsm->
state(fsm, datagram);
394 EC_SLAVE_ERR(slave,
"Timeout after %lu ms while waiting" 395 " for MBox Gateway response.\n", diff_ms);
434 " response datagram: ");
445 EC_SLAVE_ERR(slave,
"Reception of MBox Gateway response failed: ");
452 fsm->
state(fsm, datagram);
469 uint8_t *data, mbox_type;
492 EC_SLAVE_ERR(slave,
"No mailbox response data received!\n");
502 EC_SLAVE_ERR(slave,
"Corrupt mailbox response received!\n");
509 if (mbox_type == 0x00) {
513 EC_SLAVE_ERR(slave,
"Mailbox Gateway error response received - ");
516 if (mbox_msg->
code != code)
518 printk(KERN_CONT
"Code 0x%04X: \"%s\".\n",
523 if (!mbox_msg->
code) {
524 printk(KERN_CONT
"Unknown error reply code 0x%04X.\n", code);
539 EC_SLAVE_ERR(slave,
"Received mailbox type 0x%02X as response.\n",
unsigned int retries
retries upon datagram timeout
uint8_t * data
Mailbox response data.
#define EC_FSM_RETRIES
Number of state machine retries on datagram timeout.
unsigned long jiffies_sent
Jiffies, when the datagram was sent.
uint8_t mbox_type
Cached MBox type.
uint16_t configured_tx_mailbox_size
Configured send mailbox size.
EtherCAT Mailbox Gateway request.
void ec_fsm_mbg_error(ec_fsm_mbg_t *, ec_datagram_t *)
State: ERROR.
void(* state)(ec_fsm_mbg_t *, ec_datagram_t *)
mbox state function
#define EC_SLAVE_DBG(slave, level, fmt, args...)
Convenience macro for printing slave-specific debug messages to syslog.
Servo-Profile over EtherCAT.
size_t data_size
Size of MBox request data.
void ec_fsm_mbg_response_data(ec_fsm_mbg_t *, ec_datagram_t *)
MBox Gateway state: RESPONSE DATA.
uint32_t response_timeout
Maximum time in ms, the transfer is retried, if the slave does not respond.
ec_mbox_data_t mbox_mbg_data
Received mailbox data for MBox Gateway.
int ec_slave_mbox_prepare_fetch(const ec_slave_t *slave, ec_datagram_t *datagram)
Prepares a datagram to fetch mailbox data.
#define EC_SLAVE_WARN(slave, fmt, args...)
Convenience macro for printing slave-specific warnings to syslog.
uint16_t working_counter
Working counter.
uint16_t station_address
Configured station address.
const char * message
Message belonging to code.
int ec_fsm_mbg_prepare_start(ec_fsm_mbg_t *fsm, ec_datagram_t *datagram)
Prepare a request.
void ec_fsm_mbg_response(ec_fsm_mbg_t *, ec_datagram_t *)
MBox Gateway state: RESPONSE.
Global definitions and macros.
EtherCAT master structure.
uint8_t * data
Pointer to MBox request data.
void ec_fsm_mbg_transfer(ec_fsm_mbg_t *fsm, ec_slave_t *slave, ec_mbg_request_t *request)
Starts to transfer a mailbox gateway request to/from a slave.
uint16_t error_code
MBox Gateway error code.
ec_sii_image_t * sii_image
Current complete SII image.
int ec_mbg_request_copy_data(ec_mbg_request_t *req, const uint8_t *source, size_t size)
Copies Mbox Gateway data from an external source.
ec_datagram_state_t state
State.
uint16_t mailbox_protocols
Supported mailbox protocols.
int mbox_type_to_prot(uint8_t mbox_type, uint8_t *mbox_prot)
convert mailbox type number to mailbox prototype flag
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_mbg_clear(ec_fsm_mbg_t *fsm)
Destructor.
int ec_fsm_mbg_success(const ec_fsm_mbg_t *fsm)
Returns, if the state machine terminated with success.
uint16_t configured_rx_mailbox_offset
Configured receive mailbox offset.
ec_master_t * master
Master owning the slave.
Finite state machines for the CANopen over EtherCAT protocol.
int ec_datagram_fpwr(ec_datagram_t *datagram, uint16_t configured_address, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT FPWR datagram.
ec_datagram_t * datagram
Datagram used in last step.
int ec_read_mbox_locked(ec_slave_t *slave)
Return the current mailbox lock status and lock it if not locked.
void ec_fsm_mbg_init(ec_fsm_mbg_t *fsm)
Constructor.
const ec_code_msg_t mbox_error_messages[]
Mailbox error codes.
#define EC_MBOX_HEADER_SIZE
Mailbox header size.
void ec_print_data(const uint8_t *, size_t)
Outputs frame contents for debugging purposes.
void ec_read_mbox_lock_clear(ec_slave_t *slave)
Clears the mailbox lock.
EtherCAT Mailbox Gateway state machine.
int ec_fsm_mbg_exec(ec_fsm_mbg_t *fsm, ec_datagram_t *datagram)
Executes the current state of the state machine.
unsigned long jiffies_start
MBox Gateway timestamp.
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_datagram_print_state(const ec_datagram_t *datagram)
Prints the state of a datagram.
void ec_fsm_mbg_end(ec_fsm_mbg_t *, ec_datagram_t *)
State: END.
void ec_fsm_mbg_check(ec_fsm_mbg_t *, ec_datagram_t *)
MBox Gateway state: CHECK.
unsigned long jiffies_sent
Jiffies, when the upload/download request was sent.
uint16_t configured_rx_mailbox_size
Configured receive mailbox size.
ec_mbg_request_t * request
MBox Gateway request.
void ec_fsm_mbg_request(ec_fsm_mbg_t *, ec_datagram_t *)
MBox Gateway: REQUEST.
void ec_fsm_mbg_start(ec_fsm_mbg_t *, ec_datagram_t *)
MBox Gateway state: START.
uint8_t * data
Datagram payload.
#define EC_READ_U8(DATA)
Read an 8-bit unsigned value from EtherCAT data.
EtherCAT slave configuration structure.
ec_sii_t sii
Extracted SII data.
Unused and should not be queued (dequeued).
ec_slave_t * slave
slave the FSM runs on
File-Access over EtherCAT.
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.