37 #include <linux/slab.h> 46 #define EC_FUNC_HEADER \ 47 ret = ec_datagram_prealloc(datagram, data_size); \ 50 datagram->index = 0; \ 51 datagram->working_counter = 0; \ 52 datagram->state = EC_DATAGRAM_INIT; 54 #define EC_FUNC_FOOTER \ 55 datagram->data_size = data_size; \ 90 INIT_LIST_HEAD(&datagram->
queue);
94 datagram->
data = NULL;
98 datagram->
index = 0x00;
101 #ifdef EC_HAVE_CYCLES 102 datagram->cycles_sent = 0;
106 #ifdef EC_HAVE_CYCLES 107 datagram->cycles_received = 0;
124 kfree(datagram->
data);
125 datagram->
data = NULL;
135 if (!list_empty(&datagram->
queue)) {
136 list_del_init(&datagram->
queue);
157 || size <= datagram->mem_size)
160 if (datagram->
data) {
161 kfree(datagram->
data);
162 datagram->
data = NULL;
166 if (!(datagram->
data = kmalloc(size, GFP_KERNEL))) {
167 EC_ERR(
"Failed to allocate %zu bytes of datagram memory!\n", size);
197 if (datagram != source) {
200 memcpy(datagram->
data, source->
data, data_size);
213 uint16_t ring_position,
214 uint16_t mem_address,
234 uint16_t ring_position,
235 uint16_t mem_address,
255 uint16_t ring_position,
256 uint16_t mem_address,
276 uint16_t ring_position,
277 uint16_t mem_address,
297 uint16_t configured_address,
298 uint16_t mem_address,
304 if (unlikely(configured_address == 0x0000))
305 EC_WARN(
"Using configured station address 0x0000!\n");
322 uint16_t configured_address,
323 uint16_t mem_address,
329 if (unlikely(configured_address == 0x0000))
330 EC_WARN(
"Using configured station address 0x0000!\n");
347 uint16_t configured_address,
348 uint16_t mem_address,
354 if (unlikely(configured_address == 0x0000))
355 EC_WARN(
"Using configured station address 0x0000!\n");
372 uint16_t configured_address,
373 uint16_t mem_address,
379 if (unlikely(configured_address == 0x0000))
380 EC_WARN(
"Using configured station address 0x0000!\n");
397 uint16_t mem_address,
417 uint16_t mem_address,
437 uint16_t mem_address,
519 uint8_t *external_memory
523 datagram->
data = external_memory;
544 uint8_t *external_memory
548 datagram->
data = external_memory;
569 uint8_t *external_memory
573 datagram->
data = external_memory;
591 printk(KERN_CONT
"Datagram ");
592 switch (datagram->
state) {
594 printk(KERN_CONT
"initialized");
597 printk(KERN_CONT
"queued");
600 printk(KERN_CONT
"sent");
603 printk(KERN_CONT
"received");
606 printk(KERN_CONT
"timed out");
609 printk(KERN_CONT
"error");
612 printk(KERN_CONT
"invalid");
615 printk(KERN_CONT
"???");
618 printk(KERN_CONT
".\n");
632 printk(KERN_CONT
"No response.");
636 printk(KERN_CONT
"Success.");
637 printk(KERN_CONT
"\n");
652 EC_WARN(
"Datagram %p (%s) was SKIPPED %u time%s.\n",
653 datagram, datagram->
name,
683 mbox_data->
data = NULL;
698 if (mbox_data->
data) {
699 kfree(mbox_data->
data);
700 mbox_data->
data = NULL;
717 if (mbox_data->
data) {
718 kfree(mbox_data->
data);
719 mbox_data->
data = NULL;
723 if (!(mbox_data->
data = kmalloc(size, GFP_KERNEL))) {
724 EC_ERR(
"Failed to allocate %zu bytes of mailbox data memory!\n", size);
uint8_t * data
Mailbox response data.
ec_mbox_data_t mbox_eoe_frag_data
Received mailbox data for EoE, type frame fragment.
#define EC_WARN(fmt, args...)
Convenience macro for printing EtherCAT-specific warnings to syslog.
void ec_mbox_prot_data_prealloc(ec_slave_t *slave, uint16_t protocols, size_t size)
Allocates internal memory for mailbox response data for all slave supported mailbox protocols ...
unsigned long jiffies_sent
Jiffies, when the datagram was sent.
Auto Increment Physical Read Multiple Write.
#define EC_ADDR_LEN
Size of the EtherCAT address field.
static const char * type_strings[]
Array of datagram type strings used in ec_datagram_type_string().
#define EC_DATAGRAM_NAME_SIZE
Size of the datagram description string.
Auto Increment Physical ReadWrite.
size_t data_size
Size of the data in data.
void ec_mbox_data_init(ec_mbox_data_t *mbox_data)
Initialize mailbox response data.
Servo-Profile over EtherCAT.
ec_mbox_data_t mbox_eoe_init_data
Received mailbox data for EoE, type eoe init reponse.
uint64_t app_time_sent
App time, when the datagram was sent.
unsigned long stats_output_jiffies
Last statistics output.
ec_mbox_data_t mbox_mbg_data
Received mailbox data for MBox Gateway.
ec_mbox_data_t mbox_foe_data
Received mailbox data for FoE.
ec_origin_t data_origin
Origin of the data memory.
int ec_datagram_lwr_ext(ec_datagram_t *datagram, uint32_t offset, size_t data_size, uint8_t *external_memory)
Initializes an EtherCAT LWR datagram with external memory.
EtherCAT mailbox response data.
char name[EC_DATAGRAM_NAME_SIZE]
Description of the datagram.
uint16_t working_counter
Working counter.
#define EC_WRITE_S16(DATA, VAL)
Write a 16-bit signed value to EtherCAT data.
Sent (still in the queue).
Configured Address Physical Read.
void ec_datagram_output_stats(ec_datagram_t *datagram)
Outputs datagram statistics at most every second.
int ec_datagram_lwr(ec_datagram_t *datagram, uint32_t offset, size_t data_size)
Initializes an EtherCAT LWR datagram.
int ec_datagram_aprd(ec_datagram_t *datagram, uint16_t ring_position, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT APRD datagram.
ec_datagram_type_t type
Datagram type (APRD, BWR, etc.).
EtherCAT master structure.
Initial state of a new datagram.
int ec_datagram_apwr(ec_datagram_t *datagram, uint16_t ring_position, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT APWR datagram.
void ec_datagram_zero(ec_datagram_t *datagram)
Fills the datagram payload memory with zeros.
ec_datagram_state_t state
State.
#define EC_WRITE_U32(DATA, VAL)
Write a 32-bit unsigned value to EtherCAT data.
size_t data_size
Size of the mailbox response data buffer.
int ec_datagram_frmw(ec_datagram_t *datagram, uint16_t configured_address, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT FRMW datagram.
void ec_datagram_print_wc_error(const ec_datagram_t *datagram)
Evaluates the working counter of a single-cast datagram.
#define EC_WRITE_U16(DATA, VAL)
Write a 16-bit unsigned value to EtherCAT data.
unsigned int skip_count
Number of requeues when not yet received.
Auto Increment Physical Read.
int ec_datagram_brd(ec_datagram_t *datagram, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT BRD datagram.
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.
void ec_datagram_unqueue(ec_datagram_t *datagram)
Unqueue datagram.
int ec_datagram_lrd_ext(ec_datagram_t *datagram, uint32_t offset, size_t data_size, uint8_t *external_memory)
Initializes an EtherCAT LRD datagram with external memory.
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.
ec_device_index_t device_index
Device via which the datagram shall be / was sent.
int ec_datagram_aprw(ec_datagram_t *datagram, uint16_t ring_position, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT APRW datagram.
int ec_datagram_lrd(ec_datagram_t *datagram, uint32_t offset, size_t data_size)
Initializes an EtherCAT LRD datagram.
int ec_datagram_fprw(ec_datagram_t *datagram, uint16_t configured_address, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT FPRW datagram.
int ec_datagram_prealloc(ec_datagram_t *datagram, size_t size)
Allocates internal payload memory.
Configured Address Physical Read Multiple Write.
void ec_mbox_data_clear(ec_mbox_data_t *mbox_data)
Free internal memory for mailbox response data.
void ec_datagram_print_state(const ec_datagram_t *datagram)
Prints the state of a datagram.
#define EC_ERR(fmt, args...)
Convenience macro for printing EtherCAT-specific errors to syslog.
int ec_datagram_brw(ec_datagram_t *datagram, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT BRW datagram.
void ec_datagram_init(ec_datagram_t *datagram)
Constructor.
ec_mbox_data_t mbox_voe_data
Received mailbox data for VoE.
int ec_datagram_lrw_ext(ec_datagram_t *datagram, uint32_t offset, size_t data_size, uint8_t *external_memory)
Initializes an EtherCAT LRW datagram with external memory.
const char * ec_datagram_type_string(const ec_datagram_t *datagram)
Returns a string describing the datagram type.
uint8_t * data
Datagram payload.
Configured Address Physical ReadWrite.
struct list_head queue
Master datagram queue item.
size_t mem_size
Datagram data memory size.
Unused and should not be queued (dequeued).
Error while sending/receiving (dequeued).
Auto Increment Physical Write.
uint8_t address[EC_ADDR_LEN]
Recipient address.
int ec_mbox_data_prealloc(ec_mbox_data_t *mbox_data, size_t size)
Allocates internal memory for mailbox response data.
Configured Address Physical Write.
uint8_t index
Index (set by master).
File-Access over EtherCAT.
int ec_datagram_repeat(ec_datagram_t *datagram, const ec_datagram_t *source)
Copies a previously constructed datagram for repeated send.
int ec_datagram_lrw(ec_datagram_t *datagram, uint32_t offset, size_t data_size)
Initializes an EtherCAT LRW datagram.
unsigned long jiffies_received
Jiffies, when the datagram was received.
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_datagram_armw(ec_datagram_t *datagram, uint16_t ring_position, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT ARMW datagram.
int ec_datagram_bwr(ec_datagram_t *datagram, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT BWR datagram.
#define EC_MAX_DATA_SIZE
Resulting maximum data size of a single datagram in a frame.
void ec_datagram_clear(ec_datagram_t *datagram)
Destructor.