diff --git a/arch-wrs/Makefile b/arch-wrs/Makefile index 949019df625cb1f167d881d67198557ada067f45..b8082c6cde96d950e71761a638df92a18b87b7ad 100644 --- a/arch-wrs/Makefile +++ b/arch-wrs/Makefile @@ -14,6 +14,7 @@ OBJ-y += $A/wrs-startup.o \ $A/wrs-io.o \ $A/wrs-conf.o \ $A/wrs-calibration.o \ + $A/wrs-port.o \ $A/wrs-ipcserver.o \ $A/shmem.o \ $A/util.o \ diff --git a/arch-wrs/hal_minirpc.c b/arch-wrs/hal_minirpc.c index 909768726d708570bdd1b458696e7d1c406d1827..b9b108fdf9a5c4f7fd6d5cc3d9e810b9729eb0d6 100644 --- a/arch-wrs/hal_minirpc.c +++ b/arch-wrs/hal_minirpc.c @@ -60,10 +60,12 @@ struct minipc_pd __rpcdef_pps_cmd = { }, }; -struct minipc_pd __rpcdef_get_timing_state = { - .name = "get_timing_state", - .retval = MINIPC_ARG_ENCODE(MINIPC_ATYPE_STRUCT, hexp_timing_state_t), +//int halexp_info_cmd(hexp_info_params_t *params); +struct minipc_pd __rpcdef_port_update_cmd = { + .name = "info_cmd", + .retval = MINIPC_ARG_ENCODE(MINIPC_ATYPE_INT, int), .args = { + MINIPC_ARG_ENCODE(MINIPC_ATYPE_STRUCT, hexp_port_info_params_t), MINIPC_ARG_END, }, }; diff --git a/arch-wrs/include/hal_exports.h b/arch-wrs/include/hal_exports.h index d554d1f87c52c3dec57e98a612b15aff704c79f7..4f65e31e7b9623e0442bd6b6ca10530bdcb895aa 100644 --- a/arch-wrs/include/hal_exports.h +++ b/arch-wrs/include/hal_exports.h @@ -83,6 +83,22 @@ typedef struct { uint32_t timing_mode; } hexp_pps_params_t; +#define PORT_MODE_OTHER 0 +#define PORT_MODE_SLAVE 1 +#define PORT_MODE_MASTER 2 + + +typedef struct { + char name[16]; // Interface name + int synchronized; // <>0 : Master/Slave are synchronized + int mode; // PORT_MODE_XXXX +}hexp_port_info_t; + +typedef struct { + int numberPortInterfaces; + hexp_port_info_t hIFace[HAL_MAX_PORTS]; +} hexp_port_info_params_t; + /* Port modes (hal_port_state.mode) */ #define HEXP_PORT_MODE_WR_MASTER 1 #define HEXP_PORT_MODE_WR_SLAVE 2 @@ -96,11 +112,9 @@ typedef struct { #define HEXP_PORT_TSC_FALLING 2 */ -typedef struct { - int timing_mode; /* Free-running Master/GM/BC */ - int locked_port; - -} hexp_timing_state_t; +extern struct minipc_pd __rpcdef_lock_cmd; +extern struct minipc_pd __rpcdef_pps_cmd; +extern struct minipc_pd __rpcdef_port_update_cmd; /* Prototypes of functions that call on rpc */ extern int halexp_check_running(void); @@ -108,6 +122,5 @@ extern int halexp_reset_port(const char *port_name); extern int halexp_calibration_cmd(const char *port_name, int command, int on_off); extern int halexp_lock_cmd(const char *port_name, int command, int priority); extern int halexp_pps_cmd(int cmd, hexp_pps_params_t *params); -extern int halexp_get_timing_state(hexp_timing_state_t *state); #endif diff --git a/arch-wrs/include/libwr/hal_shmem.h b/arch-wrs/include/libwr/hal_shmem.h index c6094388c717f5f32c2c30455b5089f35ded448b..3f33bda1adaa764a02b17fd62f4d9788fc63eaac 100644 --- a/arch-wrs/include/libwr/hal_shmem.h +++ b/arch-wrs/include/libwr/hal_shmem.h @@ -17,6 +17,10 @@ #define READ_SFP_DIAG_ENABLE 1 #define READ_SFP_DIAG_DISABLE 0 +/* Monitor port in SNMP */ +#define HAL_PORT_MONITOR_ENABLE 1 +#define HAL_PORT_MONITOR_DISABLE 2 + #define DEFAULT_T2_PHASE_TRANS 0 #define DEFAULT_T4_PHASE_TRANS 0 @@ -113,6 +117,11 @@ struct hal_port_state { /* whether the port shall be monitored by SNMP */ int monitor; + /* PPSi instance information */ + int portMode; // Instance state + int synchronized; // <>0 if port is synchronized + int portInfoUpdated; // Set to 1 when updated + }; struct hal_temp_sensors { diff --git a/arch-wrs/include/ppsi-wrs.h b/arch-wrs/include/ppsi-wrs.h index 1d65d72622ea904476511144b121532188f11419..7ae1d54fd98ac1f58a71ab10cf3f15173c883f9e 100644 --- a/arch-wrs/include/ppsi-wrs.h +++ b/arch-wrs/include/ppsi-wrs.h @@ -66,4 +66,5 @@ timing_mode_t wrs_get_timing_mode(struct pp_globals *); timing_mode_state_t wrs_get_timing_mode_state(struct pp_globals *); int wrs_set_timing_mode(struct pp_globals *,timing_mode_t tm); timing_mode_t wrs_get_timing_mode(struct pp_globals *ppg); +int wrs_update_port_info(struct pp_globals *ppg); diff --git a/arch-wrs/main-loop.c b/arch-wrs/main-loop.c index 3cb88d7b1e0942eae0ec6335f6f5bee6ac1b88d0..887c77a122b3776d14dcecccb77f87d2dcdb0303 100644 --- a/arch-wrs/main-loop.c +++ b/arch-wrs/main-loop.c @@ -22,13 +22,22 @@ #include <hal_exports.h> #include <common-fun.h> +#define UPDATE_PORT_INFO_COUNT 2 // Update the port info every X time of the BMCA trigger + /* Call pp_state_machine for each instance. To be called periodically, * when no packets are incoming */ static unsigned int run_all_state_machines(struct pp_globals *ppg) { + static int portInfoTmoIdx=-1; + int j; int delay_ms = 0, delay_ms_j; + if ( portInfoTmoIdx==-1) { + portInfoTmoIdx=pp_gtimeout_get_timer(ppg, "SEND_PORT_INFO", TO_RAND_NONE, 0); + pp_gtimeout_set(ppg,portInfoTmoIdx,2000); // Update interface info every 2 seconds + } + for (j = 0; j < ppg->nlinks; j++) { struct pp_instance *ppi = INST(ppg, j); int old_lu = ppi->link_up; @@ -91,10 +100,9 @@ static unsigned int run_all_state_machines(struct pp_globals *ppg) } /* Do not call state machine if link is down */ - if (ppi->link_up) - delay_ms_j = pp_state_machine(ppi, NULL, 0); - else - delay_ms_j = PP_DEFAULT_NEXT_DELAY_MS; + delay_ms_j = ppi->link_up ? + pp_state_machine(ppi, NULL, 0) : + PP_DEFAULT_NEXT_DELAY_MS; /* delay_ms is the least delay_ms among all instances */ if (j == 0) @@ -115,6 +123,11 @@ static unsigned int run_all_state_machines(struct pp_globals *ppg) delay_ms=delay_bmca; } + if ( pp_gtimeout(ppg, portInfoTmoIdx) ) { + wrs_update_port_info(ppg); + pp_gtimeout_reset(ppg,portInfoTmoIdx); + } + return delay_ms; } diff --git a/arch-wrs/wrs-port.c b/arch-wrs/wrs-port.c new file mode 100644 index 0000000000000000000000000000000000000000..46a344437d220abb2ea2c240f44c32086b0869f0 --- /dev/null +++ b/arch-wrs/wrs-port.c @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2019 CERN (www.cern.ch) + * Author: Jean-Claude BAU + * + * Released according to GNU LGPL, version 2.1 or any later + */ +#include <ppsi/ppsi.h> +#define HAL_EXPORT_STRUCTURES +#include <ppsi-wrs.h> +#include <hal_exports.h> + +static hexp_port_info_t *getPortSlot (hexp_port_info_params_t * infos,struct pp_instance *ppi) { + int i; + hexp_port_info_t *pinfo; + + for (i = 0; i < infos->numberPortInterfaces; i++) { + pinfo=&infos->hIFace[i]; + if ( !strcmp(pinfo->name,ppi->iface_name) ) + return pinfo; + } + pinfo=&infos->hIFace[infos->numberPortInterfaces]; + strcpy(pinfo->name,ppi->iface_name); + pinfo->mode=PORT_MODE_OTHER; + pinfo->synchronized=0; + infos->numberPortInterfaces++; + return pinfo; +} +/* Send information about the port for a given instance +* As many instances can be on the same port, only information on the most +* interesting port will be sent. +* Priority : +* 1/ Slave instance +* 2/ Master instance +* 3/ Other +*/ + +int wrs_update_port_info(struct pp_globals *ppg) { + + int i; + int ret, rval; + hexp_port_info_params_t infos={.numberPortInterfaces = 0}; + int nbLinks=ppg->nlinks; + + for (i = 0; i < nbLinks; i++) { + struct pp_instance *ppi=INST(ppg, i); + + if (ppi->link_up) { + hexp_port_info_t *pSlot=getPortSlot(&infos,ppi); + if ( ppi->state==PPS_SLAVE ) { + pSlot->mode=PORT_MODE_SLAVE; + if (!pSlot->synchronized ) + pSlot->synchronized= + SRV(ppi)->servo_locked && + (ppi->protocol_extension==PPSI_EXT_WR || ppi->protocol_extension==PPSI_EXT_L1S) && + ppi->ext_enabled; + } else { + if ( ppi->state==PPS_MASTER && pSlot->mode!=PORT_MODE_SLAVE ) { + pSlot->mode=PORT_MODE_MASTER; + } + } + } + } + ret = minipc_call(hal_ch, DEFAULT_TO, &__rpcdef_port_update_cmd, + &rval, &infos); + + if (ret < 0) + return -1; + + return rval; +} + + diff --git a/proto-ext-l1sync/l1e-hooks.c b/proto-ext-l1sync/l1e-hooks.c index e4d03b2c8a0f7792763bc49fe85aa803995938fd..c9ba58310e18610cfaa0d302e88b74de2695d150 100644 --- a/proto-ext-l1sync/l1e-hooks.c +++ b/proto-ext-l1sync/l1e-hooks.c @@ -178,6 +178,9 @@ static int l1e_ready_for_slave(struct pp_instance *ppi) } static void l1e_state_change(struct pp_instance *ppi) { + + pp_diag(ppi, ext, 2, "hook: %s\n", __func__); + if ( !ppi->ext_enabled) return; switch (ppi->next_state) { diff --git a/time-wrs/wrs-time.c b/time-wrs/wrs-time.c index 539ec13c1f68d267883dbf8fbd8ed071280b8012..6f6f86df45f2c0320d2f4fd508826959792f0445 100644 --- a/time-wrs/wrs-time.c +++ b/time-wrs/wrs-time.c @@ -17,13 +17,6 @@ #include <hal_exports.h> #include "../include/hw-specific/wrh.h" -/* FIXME: these externs are needed here because we can not include - * hal_exports.h with HAL_EXPORT_STRUCTURES twice (the first is by - * arch-wrs/wrs-calibration.c): structs are declared and - * defined in .h file, so this would lead to a multiple definition. */ -extern struct minipc_pd __rpcdef_pps_cmd; -extern struct minipc_pd __rpcdef_lock_cmd; - int wrs_adjust_counters(int64_t adjust_sec, int32_t adjust_nsec) { hexp_pps_params_t p;