29 #include <linux/slab.h> 30 #include <linux/delay.h> 44 mbox_data->
data = NULL;
57 if (mbox_data->
data) {
58 kfree(mbox_data->
data);
59 mbox_data->
data = NULL;
75 if (mbox_data->
data) {
80 if (!(mbox_data->
data = kmalloc(size, GFP_KERNEL))) {
81 EC_ERR(
"Failed to allocate %zu bytes of mailbox data memory!\n",
154 " communication!\n");
155 return ERR_PTR(-EPROTONOSUPPORT);
161 EC_SLAVE_ERR(slave,
"Data size (%zu) does not fit in mailbox (%u)!\n",
163 return ERR_PTR(-ENOBUFS);
271 {0x00000001,
"MBXERR_SYNTAX"},
272 {0x00000002,
"MBXERR_UNSUPPORTEDPROTOCOL"},
273 {0x00000003,
"MBXERR_INVAILDCHANNEL"},
274 {0x00000004,
"MBXERR_SERVICENOTSUPPORTED"},
275 {0x00000005,
"MBXERR_INVALIDHEADER"},
276 {0x00000006,
"MBXERR_SIZETOOSHORT"},
277 {0x00000007,
"MBXERR_NOMOREMEMORY"},
278 {0x00000008,
"MBXERR_INVALIDSIZE"},
298 if (!response_data->
data) {
299 EC_SLAVE_ERR(slave,
"No mailbox response data received!\n");
300 return ERR_PTR(-EPROTO);
307 EC_SLAVE_ERR(slave,
"Corrupt mailbox response received!\n");
309 return ERR_PTR(-EPROTO);
319 EC_SLAVE_ERR(slave,
"Mailbox error response received - ");
322 if (mbox_msg->
code != code)
324 printk(KERN_CONT
"Code 0x%04X: \"%s\".\n",
329 if (!mbox_msg->
code) {
330 printk(KERN_CONT
"Unknown error reply code 0x%04X.\n", code);
337 return ERR_PTR(-EPROTO);
uint8_t * data
Mailbox response data.
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.
ec_sii_t sii
Extracted SII data.
size_t data_size
Size of the data in data.
uint16_t configured_tx_mailbox_size
Configured send mailbox size.
void ec_mbox_data_clear(ec_mbox_data_t *mbox_data)
Free internal memory for mailbox response data.
uint16_t configured_tx_mailbox_offset
Configured send mailbox offset.
ec_mbox_data_t mbox_foe_data
Received mailbox data for FoE.
int ec_slave_mbox_prepare_fetch(const ec_slave_t *slave, ec_datagram_t *datagram)
Prepares a datagram to fetch mailbox data.
Servo-Profile over EtherCAT.
EtherCAT mailbox response data.
void ec_slave_mbox_prealloc(ec_slave_t *slave)
Allocates the mailbox response buffers of a slave.
#define EC_WRITE_U8(DATA, VAL)
Write an 8-bit unsigned value to EtherCAT data.
ec_mbox_data_t mbox_eoe_data
Received mailbox data for EoE.
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.
uint16_t boot_tx_mailbox_size
Bootstrap transmit mailbox size.
uint16_t station_address
Configured station address.
const char * message
Message belonging to code.
unsigned int sync_count
Number of sync managers.
EtherCAT master structure.
void ec_slave_mbox_take_error(ec_mbox_data_t *mbox_data, const ec_datagram_t *datagram)
Takes over a mailbox error response from a mailbox fetch datagram.
void ec_datagram_zero(ec_datagram_t *datagram)
Fills the datagram payload memory with zeros.
static int ec_mbox_data_prealloc(ec_mbox_data_t *mbox_data, size_t size)
Allocates internal memory for mailbox response data.
uint16_t mailbox_protocols
Supported mailbox protocols.
size_t data_size
Size of the mailbox response data buffer.
unsigned int debug_level
Master debug level.
#define EC_SLAVE_ERR(slave, fmt, args...)
Convenience macro for printing slave-specific errors to syslog.
#define EC_WRITE_U16(DATA, VAL)
Write a 16-bit unsigned value to EtherCAT data.
uint16_t configured_rx_mailbox_offset
Configured receive mailbox offset.
File-Access over EtherCAT.
ec_master_t * master
Master owning the slave.
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.
int ec_datagram_fprd(ec_datagram_t *datagram, uint16_t configured_address, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT FPRD datagram.
EtherCAT datagram structure.
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.
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.
#define EC_ERR(fmt, args...)
Convenience macro for printing EtherCAT-specific errors to syslog.
ec_mbox_data_t mbox_voe_data
Received mailbox data for VoE.
uint16_t configured_rx_mailbox_size
Configured receive mailbox size.
uint8_t * data
Datagram payload.
#define EC_READ_U8(DATA)
Read an 8-bit unsigned value from EtherCAT data.
void ec_mbox_data_init(ec_mbox_data_t *mbox_data)
Initialize mailbox response data.
uint16_t default_length
Data length in bytes.
ec_sync_t * syncs
SYNC MANAGER categories.
uint16_t std_tx_mailbox_size
Standard transmit mailbox size.
ec_mbox_data_t mbox_coe_data
Received mailbox data for CoE.
ec_mbox_data_t mbox_soe_data
Received mailbox data for SoE.
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.
#define EC_MAX_DATA_SIZE
Resulting maximum data size of a single datagram in a frame.