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