Commit e0847ae4 authored by Federico Vaga's avatar Federico Vaga

wrtd:lib:out: fix structure endianess

Signed-off-by: Federico Vaga's avatarFederico Vaga <federico.vaga@cern.ch>


NOTE
This commit has been created by `git subtree` on the Mock Turtle repository
on tag mock-turtle-2.0

This commit will not compile
parent b41a6dbc
...@@ -108,3 +108,13 @@ void wrtd_timestamp_endianess_fix(struct wr_timestamp *ts) ...@@ -108,3 +108,13 @@ void wrtd_timestamp_endianess_fix(struct wr_timestamp *ts)
ts->seconds = ((ts->seconds & 0xFFFFFFFF) << 32) | ts->seconds = ((ts->seconds & 0xFFFFFFFF) << 32) |
((ts->seconds >> 32) & 0xFFFFFFFF); ((ts->seconds >> 32) & 0xFFFFFFFF);
} }
void wrtd_output_rule_endianess_fix(struct lrt_output_rule *rule)
{
uint16_t tmp = rule->state;
rule->state = (rule->delay_frac & 0x00FF) << 8 |
(rule->delay_frac & 0xFF00) >> 8;
rule->delay_frac = (tmp & 0x00FF) << 8 |
(tmp & 0xFF00) >> 8;
}
...@@ -42,4 +42,6 @@ extern int wrtd_send_and_receive_sync(struct wrtd_desc *wrtd, ...@@ -42,4 +42,6 @@ extern int wrtd_send_and_receive_sync(struct wrtd_desc *wrtd,
struct wrnc_msg *msg, struct wrnc_msg *msg,
enum wrtd_core core); enum wrtd_core core);
extern void wrtd_timestamp_endianess_fix(struct wr_timestamp *ts); extern void wrtd_timestamp_endianess_fix(struct wr_timestamp *ts);
extern void wrtd_output_rule_endianess_fix(struct lrt_output_rule *rule);
#endif #endif
...@@ -13,6 +13,9 @@ ...@@ -13,6 +13,9 @@
#include "wrtd-serializers.h" #include "wrtd-serializers.h"
#define WRTD_OUT_CHANNEL_PUBLIC_SIZE (sizeof(struct wrtd_out_channel) \
- sizeof(struct wrtd_out_channel_private))
/* Basic header for synchronous messages */ /* Basic header for synchronous messages */
static const struct wrnc_proto_header hdr_base_sync = { static const struct wrnc_proto_header hdr_base_sync = {
.slot_io = (WRTD_IN_FD_CONTROL << 4) |(WRTD_OUT_FD_CONTROL & 0xF), .slot_io = (WRTD_IN_FD_CONTROL << 4) |(WRTD_OUT_FD_CONTROL & 0xF),
...@@ -195,8 +198,7 @@ int wrtd_out_state_get(struct wrtd_node *dev, unsigned int output, ...@@ -195,8 +198,7 @@ int wrtd_out_state_get(struct wrtd_node *dev, unsigned int output,
struct wrtd_out_channel chan; struct wrtd_out_channel chan;
struct wrnc_structure_tlv tlv = { struct wrnc_structure_tlv tlv = {
.index = OUT_STRUCT_CHAN_0 + output, .index = OUT_STRUCT_CHAN_0 + output,
.size = sizeof(struct wrtd_out_channel) .size = WRTD_OUT_CHANNEL_PUBLIC_SIZE,
- sizeof(struct wrtd_out_channel_private),
.structure = &chan, .structure = &chan,
}; };
struct wrnc_proto_header hdr = hdr_base_sync; struct wrnc_proto_header hdr = hdr_base_sync;
...@@ -227,6 +229,9 @@ int wrtd_out_state_get(struct wrtd_node *dev, unsigned int output, ...@@ -227,6 +229,9 @@ int wrtd_out_state_get(struct wrtd_node *dev, unsigned int output,
state->last_executed = chan.stats.last_executed; state->last_executed = chan.stats.last_executed;
state->last_enqueued = chan.stats.last_enqueued; state->last_enqueued = chan.stats.last_enqueued;
state->last_lost = chan.stats.last_lost; state->last_lost = chan.stats.last_lost;
wrtd_timestamp_endianess_fix(&state->last_executed.ts);
wrtd_timestamp_endianess_fix(&state->last_enqueued.ts);
wrtd_timestamp_endianess_fix(&state->last_lost.ts);
state->mode = chan.config.mode; state->mode = chan.config.mode;
state->flags = chan.config.flags; state->flags = chan.config.flags;
...@@ -250,11 +255,11 @@ int wrtd_out_state_get(struct wrtd_node *dev, unsigned int output, ...@@ -250,11 +255,11 @@ int wrtd_out_state_get(struct wrtd_node *dev, unsigned int output,
state->received_messages = out.counter_etherbone; state->received_messages = out.counter_etherbone;
state->received_loopback = out.counter_loopback; state->received_loopback = out.counter_loopback;
state->last_received = out.last_received; state->last_received = out.last_received;
wrtd_timestamp_endianess_fix(&state->last_received.ts);
return 0; return 0;
} }
/** /**
* It enables/disables a trigger output line * It enables/disables a trigger output line
* @param[in] dev device token * @param[in] dev device token
...@@ -269,8 +274,7 @@ int wrtd_out_enable(struct wrtd_node *dev, unsigned int output, ...@@ -269,8 +274,7 @@ int wrtd_out_enable(struct wrtd_node *dev, unsigned int output,
struct wrtd_out_channel chan; struct wrtd_out_channel chan;
struct wrnc_structure_tlv tlv = { struct wrnc_structure_tlv tlv = {
.index = OUT_STRUCT_CHAN_0 + output, .index = OUT_STRUCT_CHAN_0 + output,
.size = sizeof(struct wrtd_out_channel) .size = WRTD_OUT_CHANNEL_PUBLIC_SIZE,
- sizeof(struct wrtd_out_channel_private),
.structure = &chan, .structure = &chan,
}; };
struct wrnc_proto_header hdr = hdr_base_sync; struct wrnc_proto_header hdr = hdr_base_sync;
...@@ -324,6 +328,7 @@ static int wrtd_out_trig_assign_condition_by_index(struct wrtd_node *dev, ...@@ -324,6 +328,7 @@ static int wrtd_out_trig_assign_condition_by_index(struct wrtd_node *dev,
err = wrnc_rt_structure_get(wrtd->wrnc, &hdr, &tlv, 1); err = wrnc_rt_structure_get(wrtd->wrnc, &hdr, &tlv, 1);
if (err) if (err)
return err; return err;
wrtd_output_rule_endianess_fix(&trig.ocfg[output]);
if (trig.flags & ENTRY_FLAG_VALID) { if (trig.flags & ENTRY_FLAG_VALID) {
errno = EINVAL; errno = EINVAL;
...@@ -352,6 +357,7 @@ static int wrtd_out_trig_assign_condition_by_index(struct wrtd_node *dev, ...@@ -352,6 +357,7 @@ static int wrtd_out_trig_assign_condition_by_index(struct wrtd_node *dev,
trig.ocfg[output].state |= HASH_ENT_CONDITION; trig.ocfg[output].state |= HASH_ENT_CONDITION;
trig.ocfg[output].cond_ptr = -1; trig.ocfg[output].cond_ptr = -1;
wrtd_output_rule_endianess_fix(&trig.ocfg[output]);
return wrnc_rt_structure_set(wrtd->wrnc, &hdr, &tlv, 1); return wrnc_rt_structure_set(wrtd->wrnc, &hdr, &tlv, 1);
} }
...@@ -366,8 +372,7 @@ static int wrtd_out_flag_set(struct wrtd_node *dev, unsigned int output, ...@@ -366,8 +372,7 @@ static int wrtd_out_flag_set(struct wrtd_node *dev, unsigned int output,
struct wrtd_out_channel chan; struct wrtd_out_channel chan;
struct wrnc_structure_tlv tlv = { struct wrnc_structure_tlv tlv = {
.index = OUT_STRUCT_CHAN_0 + output, .index = OUT_STRUCT_CHAN_0 + output,
.size = sizeof(struct wrtd_out_channel) .size = WRTD_OUT_CHANNEL_PUBLIC_SIZE,
- sizeof(struct wrtd_out_channel_private),
.structure = &chan, .structure = &chan,
}; };
struct wrnc_proto_header hdr = hdr_base_sync; struct wrnc_proto_header hdr = hdr_base_sync;
...@@ -398,8 +403,7 @@ static int wrtd_out_flag_clr(struct wrtd_node *dev, unsigned int output, ...@@ -398,8 +403,7 @@ static int wrtd_out_flag_clr(struct wrtd_node *dev, unsigned int output,
struct wrtd_out_channel chan; struct wrtd_out_channel chan;
struct wrnc_structure_tlv tlv = { struct wrnc_structure_tlv tlv = {
.index = OUT_STRUCT_CHAN_0 + output, .index = OUT_STRUCT_CHAN_0 + output,
.size = sizeof(struct wrtd_out_channel) .size = WRTD_OUT_CHANNEL_PUBLIC_SIZE,
- sizeof(struct wrtd_out_channel_private),
.structure = &chan, .structure = &chan,
}; };
struct wrnc_proto_header hdr = hdr_base_sync; struct wrnc_proto_header hdr = hdr_base_sync;
...@@ -455,6 +459,7 @@ static int wrtd_out_trig_assign_one(struct wrtd_node *dev, unsigned int output, ...@@ -455,6 +459,7 @@ static int wrtd_out_trig_assign_one(struct wrtd_node *dev, unsigned int output,
trig.ocfg[handle->channel].state = HASH_ENT_DISABLED; trig.ocfg[handle->channel].state = HASH_ENT_DISABLED;
trig.ocfg[handle->channel].state |= HASH_ENT_DIRECT; trig.ocfg[handle->channel].state |= HASH_ENT_DIRECT;
trig.ocfg[handle->channel].cond_ptr = -1; trig.ocfg[handle->channel].cond_ptr = -1;
wrtd_output_rule_endianess_fix(&trig.ocfg[handle->channel]);
err = wrnc_rt_structure_set(wrtd->wrnc, &hdr, &tlv, 1); err = wrnc_rt_structure_set(wrtd->wrnc, &hdr, &tlv, 1);
if (err) if (err)
...@@ -534,6 +539,7 @@ int wrtd_out_trig_unassign(struct wrtd_node *dev, ...@@ -534,6 +539,7 @@ int wrtd_out_trig_unassign(struct wrtd_node *dev,
err = wrnc_rt_structure_get(wrtd->wrnc, &hdr, &tlv, 1); err = wrnc_rt_structure_get(wrtd->wrnc, &hdr, &tlv, 1);
if (err) if (err)
return err; return err;
wrtd_output_rule_endianess_fix(&trig.ocfg[handle->channel]);
memset(&trig.ocfg[handle->channel], 0, sizeof(struct lrt_output_rule)); memset(&trig.ocfg[handle->channel], 0, sizeof(struct lrt_output_rule));
for (i = 0; i < FD_NUM_CHANNELS; i++) for (i = 0; i < FD_NUM_CHANNELS; i++)
...@@ -542,6 +548,7 @@ int wrtd_out_trig_unassign(struct wrtd_node *dev, ...@@ -542,6 +548,7 @@ int wrtd_out_trig_unassign(struct wrtd_node *dev,
if (cnt == FD_NUM_CHANNELS) if (cnt == FD_NUM_CHANNELS)
trig.flags &= ~ENTRY_FLAG_VALID; trig.flags &= ~ENTRY_FLAG_VALID;
wrtd_output_rule_endianess_fix(&trig.ocfg[handle->channel]);
err = wrnc_rt_structure_set(wrtd->wrnc, &hdr, &tlv, 1); err = wrnc_rt_structure_set(wrtd->wrnc, &hdr, &tlv, 1);
if (err) if (err)
return err; return err;
...@@ -675,6 +682,7 @@ int wrtd_out_trig_state_get_by_index(struct wrtd_node *dev, unsigned int index, ...@@ -675,6 +682,7 @@ int wrtd_out_trig_state_get_by_index(struct wrtd_node *dev, unsigned int index,
err = wrnc_rt_structure_get(wrtd->wrnc, &hdr, &tlv, 1); err = wrnc_rt_structure_get(wrtd->wrnc, &hdr, &tlv, 1);
if (err) if (err)
return err; return err;
wrtd_output_rule_endianess_fix(&trig.ocfg[output]);
if (!(trig.flags & ENTRY_FLAG_VALID) || if (!(trig.flags & ENTRY_FLAG_VALID) ||
(trig.ocfg[output].state == HASH_ENT_EMPTY)) { (trig.ocfg[output].state == HASH_ENT_EMPTY)) {
...@@ -737,6 +745,7 @@ static int wrtd_out_rule_delay_set(struct wrtd_node *dev, ...@@ -737,6 +745,7 @@ static int wrtd_out_rule_delay_set(struct wrtd_node *dev,
err = wrnc_rt_structure_get(wrtd->wrnc, &hdr, &tlv, 1); err = wrnc_rt_structure_get(wrtd->wrnc, &hdr, &tlv, 1);
if (err) if (err)
return err; return err;
wrtd_output_rule_endianess_fix(&trig.ocfg[output]);
if (!(trig.flags & ENTRY_FLAG_VALID)) { if (!(trig.flags & ENTRY_FLAG_VALID)) {
errno = EWRTD_NOFOUND_TRIGGER; errno = EWRTD_NOFOUND_TRIGGER;
...@@ -744,9 +753,10 @@ static int wrtd_out_rule_delay_set(struct wrtd_node *dev, ...@@ -744,9 +753,10 @@ static int wrtd_out_rule_delay_set(struct wrtd_node *dev,
} }
wrtd_pico_to_ts(&delay_ps, &t); wrtd_pico_to_ts(&delay_ps, &t);
trig.ocfg[trig_idx].delay_cycles = t.ticks; trig.ocfg[output].delay_cycles = t.ticks;
trig.ocfg[trig_idx].delay_frac = t.frac; trig.ocfg[output].delay_frac = t.frac;
wrtd_output_rule_endianess_fix(&trig.ocfg[output]);
return wrnc_rt_structure_set(wrtd->wrnc, &hdr, &tlv, 1); return wrnc_rt_structure_set(wrtd->wrnc, &hdr, &tlv, 1);
} }
...@@ -779,8 +789,7 @@ int wrtd_out_pulse_width_set(struct wrtd_node *dev, unsigned int output, ...@@ -779,8 +789,7 @@ int wrtd_out_pulse_width_set(struct wrtd_node *dev, unsigned int output,
struct wrtd_out_channel chan; struct wrtd_out_channel chan;
struct wrnc_structure_tlv tlv = { struct wrnc_structure_tlv tlv = {
.index = OUT_STRUCT_CHAN_0 + output, .index = OUT_STRUCT_CHAN_0 + output,
.size = sizeof(struct wrtd_out_channel) .size = WRTD_OUT_CHANNEL_PUBLIC_SIZE,
- sizeof(struct wrtd_out_channel_private),
.structure = &chan, .structure = &chan,
}; };
struct wrnc_proto_header hdr = hdr_base_sync; struct wrnc_proto_header hdr = hdr_base_sync;
...@@ -828,8 +837,7 @@ int wrtd_out_dead_time_set(struct wrtd_node *dev, unsigned int output, ...@@ -828,8 +837,7 @@ int wrtd_out_dead_time_set(struct wrtd_node *dev, unsigned int output,
struct wrtd_out_channel chan; struct wrtd_out_channel chan;
struct wrnc_structure_tlv tlv = { struct wrnc_structure_tlv tlv = {
.index = OUT_STRUCT_CHAN_0 + output, .index = OUT_STRUCT_CHAN_0 + output,
.size = sizeof(struct wrtd_out_channel) .size = WRTD_OUT_CHANNEL_PUBLIC_SIZE,
- sizeof(struct wrtd_out_channel_private),
.structure = &chan, .structure = &chan,
}; };
struct wrnc_proto_header hdr = hdr_base_sync; struct wrnc_proto_header hdr = hdr_base_sync;
...@@ -898,6 +906,7 @@ int wrtd_out_trig_enable(struct wrtd_node *dev, ...@@ -898,6 +906,7 @@ int wrtd_out_trig_enable(struct wrtd_node *dev,
err = wrnc_rt_structure_get(wrtd->wrnc, &hdr, &tlv, 1); err = wrnc_rt_structure_get(wrtd->wrnc, &hdr, &tlv, 1);
if (err) if (err)
return err; return err;
wrtd_output_rule_endianess_fix(&trig.ocfg[handle->channel]);
if (!(trig.flags & ENTRY_FLAG_VALID)) { if (!(trig.flags & ENTRY_FLAG_VALID)) {
errno = EWRTD_NOFOUND_TRIGGER; errno = EWRTD_NOFOUND_TRIGGER;
...@@ -909,6 +918,7 @@ int wrtd_out_trig_enable(struct wrtd_node *dev, ...@@ -909,6 +918,7 @@ int wrtd_out_trig_enable(struct wrtd_node *dev,
else else
trig.ocfg[handle->channel].state |= HASH_ENT_DISABLED; trig.ocfg[handle->channel].state |= HASH_ENT_DISABLED;
wrtd_output_rule_endianess_fix(&trig.ocfg[handle->channel]);
return wrnc_rt_structure_set(wrtd->wrnc, &hdr, &tlv, 1); return wrnc_rt_structure_set(wrtd->wrnc, &hdr, &tlv, 1);
} }
...@@ -928,8 +938,7 @@ int wrtd_out_trigger_mode_set(struct wrtd_node *dev, ...@@ -928,8 +938,7 @@ int wrtd_out_trigger_mode_set(struct wrtd_node *dev,
struct wrtd_out_channel chan; struct wrtd_out_channel chan;
struct wrnc_structure_tlv tlv = { struct wrnc_structure_tlv tlv = {
.index = OUT_STRUCT_CHAN_0 + output, .index = OUT_STRUCT_CHAN_0 + output,
.size = sizeof(struct wrtd_out_channel) .size = WRTD_OUT_CHANNEL_PUBLIC_SIZE,
- sizeof(struct wrtd_out_channel_private),
.structure = &chan, .structure = &chan,
}; };
struct wrnc_proto_header hdr = hdr_base_sync; struct wrnc_proto_header hdr = hdr_base_sync;
...@@ -968,8 +977,7 @@ int wrtd_out_arm(struct wrtd_node *dev, unsigned int output, int armed) ...@@ -968,8 +977,7 @@ int wrtd_out_arm(struct wrtd_node *dev, unsigned int output, int armed)
struct wrtd_out_channel chan; struct wrtd_out_channel chan;
struct wrnc_structure_tlv tlv = { struct wrnc_structure_tlv tlv = {
.index = OUT_STRUCT_CHAN_0 + output, .index = OUT_STRUCT_CHAN_0 + output,
.size = sizeof(struct wrtd_out_channel) .size = WRTD_OUT_CHANNEL_PUBLIC_SIZE,
- sizeof(struct wrtd_out_channel_private),
.structure = &chan, .structure = &chan,
}; };
struct wrnc_proto_header hdr = hdr_base_sync; struct wrnc_proto_header hdr = hdr_base_sync;
...@@ -1008,8 +1016,7 @@ int wrtd_out_counters_reset(struct wrtd_node *dev, unsigned int output) ...@@ -1008,8 +1016,7 @@ int wrtd_out_counters_reset(struct wrtd_node *dev, unsigned int output)
struct wrtd_out_channel chan; struct wrtd_out_channel chan;
struct wrnc_structure_tlv tlv = { struct wrnc_structure_tlv tlv = {
.index = OUT_STRUCT_CHAN_0 + output, .index = OUT_STRUCT_CHAN_0 + output,
.size = sizeof(struct wrtd_out_channel) .size = WRTD_OUT_CHANNEL_PUBLIC_SIZE,
- sizeof(struct wrtd_out_channel_private),
.structure = &chan, .structure = &chan,
}; };
struct wrnc_proto_header hdr = hdr_base_sync; struct wrnc_proto_header hdr = hdr_base_sync;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment