Commit f7c9ea65 authored by Jean-Claude BAU's avatar Jean-Claude BAU Committed by Adam Wujek

Move common servo DS in each pp_instance.

This will be needed when switchover will be implemented. Then 2 servos
will be needed (an active amd passive one).
Also the servo state has been moved in the common servo DS.
parent 6df5da42
......@@ -106,6 +106,8 @@ struct pp_avg_fltr {
#define PP_SERVO_FLAG_WAIT_HW (1<<1)
struct pp_servo {
int state;
struct pp_time delayMS;
struct pp_time delaySM;
long long obs_drift;
......@@ -194,7 +196,8 @@ struct pp_instance {
Integer16 frgn_rec_best;
struct pp_frgn_master frgn_master[PP_NR_FOREIGN_RECORDS];
portDS_t *portDS; /* page 72 */
portDS_t *portDS; /* page 72 */
struct pp_servo *servo; /* Servo moved from globals because we may have more than one servo : redundancy */
/** (IEEE1588-2018) */
asymmetryCorrectionPortDS_t asymmetryCorrectionPortDS; /*draft P1588_v_29: page 99*/
......@@ -236,8 +239,6 @@ struct pp_globals_cfg {
struct pp_globals {
struct pp_instance *pp_instances;
struct pp_servo *servo;
/* Real time options */
struct pp_runtime_opts *rt_opts;
......
......@@ -159,7 +159,7 @@ static inline struct pp_instance *NP(struct pp_instance *ppi)
static inline struct pp_servo *SRV(struct pp_instance *ppi)
{
return GLBS(ppi)->servo;
return ppi->servo;
}
extern void pp_prepare_pointers(struct pp_instance *ppi);
......
......@@ -124,8 +124,6 @@ static inline L1SyncOptParamsPortDS_t *L1E_DSPOR_OP(struct pp_instance *ppi)
struct l1e_servo_state {
int state;
/* These fields are used by servo code, after setting at init time */
int64_t fiber_fix_alpha;
int32_t clock_period_ps;
......
......@@ -80,9 +80,9 @@ int l1e_servo_init(struct pp_instance *ppi)
WRH_OPER()->adjust_phase(s->cur_setpoint_ps);
s->missed_iters = 0;
s->state = L1E_SYNC_TAI;
SRV(ppi)->state = L1E_SYNC_TAI;
strcpy(SRV(ppi)->servo_state_name, l1e_servo_state_name[s->state]);
strcpy(SRV(ppi)->servo_state_name, l1e_servo_state_name[SRV(ppi)->state]);
SRV(ppi)->flags |= PP_SERVO_FLAG_VALID;
SRV(ppi)->update_count = 0;
......@@ -344,7 +344,7 @@ int l1e_servo_update(struct pp_instance *ppi)
/* shmem lock */
wrs_shm_write(ppsi_head, WRS_SHM_WRITE_BEGIN);
if ( s->state==L1E_UNINITIALIZED )
if ( SRV(ppi)->state==L1E_UNINITIALIZED )
goto out;
prev_delayMM_ps = s->delayMM_ps;
......@@ -391,9 +391,9 @@ int l1e_servo_update(struct pp_instance *ppi)
/* So, we didn't return. Choose the right state */
if (offsetMS.secs) /* so bad... */
s->state = L1E_SYNC_TAI;
SRV(ppi)->state = L1E_SYNC_TAI;
else if (offset_ticks) /* not that bad */
s->state = L1E_SYNC_NSEC;
SRV(ppi)->state = L1E_SYNC_NSEC;
/* else, let the states below choose the sequence */
pp_diag(ppi, servo, 2, "offsetMS: %li.%09li (+%li)\n",
......@@ -401,13 +401,13 @@ int l1e_servo_update(struct pp_instance *ppi)
(long)offset_ps);
pp_diag(ppi, servo, 1, "l1e_servo state: %s%s\n",
l1e_servo_state_name[s->state],
l1e_servo_state_name[SRV(ppi)->state],
SRV(ppi)->flags & PP_SERVO_FLAG_WAIT_HW ? " (wait for hw)" : "");
/* update string state name */
strcpy(SRV(ppi)->servo_state_name, l1e_servo_state_name[s->state]);
strcpy(SRV(ppi)->servo_state_name, l1e_servo_state_name[SRV(ppi)->state]);
switch (s->state) {
switch (SRV(ppi)->state) {
case L1E_SYNC_TAI:
WRH_OPER()->adjust_counters(offsetMS.secs, 0);
SRV(ppi)->flags |= PP_SERVO_FLAG_WAIT_HW;
......@@ -416,13 +416,13 @@ int l1e_servo_update(struct pp_instance *ppi)
* Else, we must ensure we leave this status towards
* fine tuning
*/
s->state = L1E_SYNC_PHASE;
SRV(ppi)->state = L1E_SYNC_PHASE;
break;
case L1E_SYNC_NSEC:
WRH_OPER()->adjust_counters(0, offset_ticks);
SRV(ppi)->flags |= PP_SERVO_FLAG_WAIT_HW;
s->state = L1E_SYNC_PHASE;
SRV(ppi)->state = L1E_SYNC_PHASE;
break;
case L1E_SYNC_PHASE:
......@@ -434,7 +434,7 @@ int l1e_servo_update(struct pp_instance *ppi)
WRH_OPER()->adjust_phase(s->cur_setpoint_ps);
SRV(ppi)->flags |= PP_SERVO_FLAG_WAIT_HW;
s->state = L1E_WAIT_OFFSET_STABLE;
SRV(ppi)->state = L1E_WAIT_OFFSET_STABLE;
if (ARCH_IS_WRS) {
/*
......@@ -457,13 +457,13 @@ int l1e_servo_update(struct pp_instance *ppi)
if(remaining_offset < WRH_SERVO_OFFSET_STABILITY_THRESHOLD) {
WRH_OPER()->enable_timing_output(ppi, 1);
s->prev_delayMS_ps = s->delayMS_ps;
s->state = L1E_TRACK_PHASE;
SRV(ppi)->state = L1E_TRACK_PHASE;
} else {
s->missed_iters++;
}
if (s->missed_iters >= 10) {
s->missed_iters = 0;
s->state = L1E_SYNC_PHASE;
SRV(ppi)->state = L1E_SYNC_PHASE;
}
break;
......@@ -474,7 +474,7 @@ int l1e_servo_update(struct pp_instance *ppi)
if(l1e_tracking_enabled) {
if (abs(offset_ps) >
2 * WRH_SERVO_OFFSET_STABILITY_THRESHOLD) {
s->state = WR_SYNC_PHASE;
SRV(ppi)->state = WR_SYNC_PHASE;
break;
}
......@@ -492,11 +492,11 @@ int l1e_servo_update(struct pp_instance *ppi)
}
SRV(ppi)->servo_locked=s->state==L1E_TRACK_PHASE;
SRV(ppi)->servo_locked=SRV(ppi)->state==L1E_TRACK_PHASE;
/* Increase number of servo updates with state different than
* L1E_TRACK_PHASE. (Used by SNMP) */
if (s->state != L1E_TRACK_PHASE)
if (SRV(ppi)->state != L1E_TRACK_PHASE)
s->n_err_state++;
/* Increase number of servo updates with offset exceeded
......
......@@ -117,8 +117,6 @@ int wr_servo_got_delay(struct pp_instance *ppi);
int wr_servo_update(struct pp_instance *ppi);
struct wr_servo_state {
int state;
/* These fields are used by servo code, after asetting at init time */
int32_t delta_txm_ps;
int32_t delta_rxm_ps;
......
......@@ -129,7 +129,7 @@ int wr_servo_init(struct pp_instance *ppi)
s->cur_setpoint %= s->clock_period_ps;
WRH_OPER()->adjust_phase(s->cur_setpoint);
s->missed_iters = 0;
s->state = WR_UNINITIALIZED;
SRV(ppi)->state = WR_UNINITIALIZED;
s->delta_txm_ps = delta_to_ps(wrp->otherNodeDeltaTx);
s->delta_rxm_ps = delta_to_ps(wrp->otherNodeDeltaRx);
......@@ -428,24 +428,24 @@ int wr_servo_update(struct pp_instance *ppi)
/* So, we didn't return. Choose the right state */
if (offset.secs) /* so bad... */
s->state = WR_SYNC_TAI;
SRV(ppi)->state = WR_SYNC_TAI;
else if (offset_ticks) /* not that bad */
s->state = WR_SYNC_NSEC;
else if (s->state == WR_UNINITIALIZED) {
SRV(ppi)->state = WR_SYNC_NSEC;
else if (SRV(ppi)->state == WR_UNINITIALIZED) {
/* Likely a restart; already good, but force phase fsm */
s->state = WR_SYNC_PHASE;
SRV(ppi)->state = WR_SYNC_PHASE;
}
/* else, let the states below choose the sequence */
pp_diag(ppi, servo, 1, "wr_servo state: %s%s\n",
servo_name[s->state],
servo_name[SRV(ppi)->state],
SRV(ppi)->flags & PP_SERVO_FLAG_WAIT_HW ? " (wait for hw)" : "");
/* update string state name */
strcpy(SRV(ppi)->servo_state_name, servo_name[s->state]);
strcpy(SRV(ppi)->servo_state_name, servo_name[SRV(ppi)->state]);
switch (s->state) {
switch (SRV(ppi)->state) {
case WR_SYNC_TAI:
WRH_OPER()->adjust_counters(offset.secs, 0);
SRV(ppi)->flags |= PP_SERVO_FLAG_WAIT_HW;
......@@ -454,13 +454,13 @@ int wr_servo_update(struct pp_instance *ppi)
* Else, we must ensure we leave this status towards
* fine tuning
*/
s->state = WR_SYNC_PHASE;
SRV(ppi)->state = WR_SYNC_PHASE;
break;
case WR_SYNC_NSEC:
WRH_OPER()->adjust_counters(0, offset_ticks);
SRV(ppi)->flags |= PP_SERVO_FLAG_WAIT_HW;
s->state = WR_SYNC_PHASE;
SRV(ppi)->state = WR_SYNC_PHASE;
break;
case WR_SYNC_PHASE:
......@@ -471,7 +471,7 @@ int wr_servo_update(struct pp_instance *ppi)
WRH_OPER()->adjust_phase(s->cur_setpoint);
SRV(ppi)->flags |= PP_SERVO_FLAG_WAIT_HW;
s->state = WR_WAIT_OFFSET_STABLE;
SRV(ppi)->state = WR_WAIT_OFFSET_STABLE;
if (ARCH_IS_WRS) {
/*
......@@ -493,13 +493,13 @@ int wr_servo_update(struct pp_instance *ppi)
if(remaining_offset_ps < WRH_SERVO_OFFSET_STABILITY_THRESHOLD) {
WRH_OPER()->enable_timing_output(ppi, 1);
s->prev_delayMS_ps = s->delayMS_ps;
s->state = WR_TRACK_PHASE;
SRV(ppi)->state = WR_TRACK_PHASE;
} else {
s->missed_iters++;
}
if (s->missed_iters >= 10) {
s->missed_iters = 0;
s->state = WR_SYNC_PHASE;
SRV(ppi)->state = WR_SYNC_PHASE;
}
break;
......@@ -510,7 +510,7 @@ int wr_servo_update(struct pp_instance *ppi)
if(wr_tracking_enabled) {
if (abs(offset_ps) >
2 * WRH_SERVO_OFFSET_STABILITY_THRESHOLD) {
s->state = WR_SYNC_PHASE;
SRV(ppi)->state = WR_SYNC_PHASE;
break;
}
......@@ -527,11 +527,11 @@ int wr_servo_update(struct pp_instance *ppi)
}
SRV(ppi)->servo_locked=s->state==WR_TRACK_PHASE;
SRV(ppi)->servo_locked=SRV(ppi)->state==WR_TRACK_PHASE;
/* Increase number of servo updates with state different than
* WR_TRACK_PHASE. (Used by SNMP) */
if (s->state != WR_TRACK_PHASE)
if (SRV(ppi)->state != WR_TRACK_PHASE)
s->n_err_state++;
/* Increase number of servo updates with offset exceeded
......
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