diff --git a/arch-wrs/include/ppsi-wrs.h b/arch-wrs/include/ppsi-wrs.h index 8ba8b01e51424f1170fa8030d2645848c9bcc5b6..35c1fb8c3a906a6f6d661173479cc63ed7abed1f 100644 --- a/arch-wrs/include/ppsi-wrs.h +++ b/arch-wrs/include/ppsi-wrs.h @@ -62,6 +62,12 @@ static inline wrs_arch_data_t *WRS_ARCH_G(struct pp_globals *ppg) extern void wrs_main_loop(struct pp_globals *ppg); void set_param_global_prio1(struct pp_globals *ppg, int prio1); void set_param_global_prio2(struct pp_globals *ppg, int prio2); +void set_param_inst_logMinDelayReqInterval(struct pp_instance *ppi, + int logMinDelayReqInterval); +void set_param_inst_logMinPdelayReqInterval(struct pp_instance *ppi, + int logMinPdelayReqInterval); +void set_param_inst_logSyncInterval(struct pp_instance *ppi, + int logSyncInterval); extern void wrs_init_ipcserver(struct pp_globals *ppg, struct minipc_ch *ppsi_ch); diff --git a/arch-wrs/include/ppsi_exports.h b/arch-wrs/include/ppsi_exports.h index 815d3e73fbd8b4954e6f01f02443244779d62e1a..f4e7648bde10a7250004319f2c8266ac48de71e1 100644 --- a/arch-wrs/include/ppsi_exports.h +++ b/arch-wrs/include/ppsi_exports.h @@ -17,6 +17,10 @@ #define PPSIEXP_PARAM_PRIORITY1_CMD 1 #define PPSIEXP_PARAM_PRIORITY2_CMD 2 +/* Commands for ppsiexp_update_param_instance_cmd */ +#define PPSIEXP_PARAM_INST_DELAY_REQ_INT_CMD 1 +#define PPSIEXP_PARAM_INST_SYNC_INT_CMD 2 + /* Export structures, shared by server and client for argument matching */ #ifdef PPSI_EXPORT_STRUCTURES diff --git a/arch-wrs/wrs-ipcserver.c b/arch-wrs/wrs-ipcserver.c index 26ab3a41bc8e599cd821e5cce9ca8b50df3c9c7d..7efbecafab75ba117eeeca47b4c5e6f8af78f206 100644 --- a/arch-wrs/wrs-ipcserver.c +++ b/arch-wrs/wrs-ipcserver.c @@ -109,6 +109,49 @@ static int update_param_instance_cmd(const struct minipc_pd *pd, struct pp_instance *ppi; switch (param_type) { + case PPSIEXP_PARAM_INST_DELAY_REQ_INT_CMD: + ppi = INST(ppg_local, param_instance); + pp_diag(ppi, config, 2, + "%s: cmd %d (PPSIEXP_PARAM_INST_DELAY_REQ_INT_CMD) " + "instance %d, port %s, value %d\n", __func__, + param_type, param_instance, ppi->iface_name, param_val); + if (!check_range_inst_logMinDelayReqInterval(ppi->cfg.profile, + param_val)) { + pp_diag(ppi, config, 1, + "Param update Error: value of " + "logMinDelayReqInterval (%d) not in range! " + "cmd %d (PPSIEXP_PARAM_INST_DELAY_REQ_INT_CMD) " + "instance %d, port %s\n", + param_val, param_type, param_instance, ppi->iface_name); + rval = PPSIEXP_RET_ERROR_VAL; + break; + } + + set_param_inst_logMinDelayReqInterval(ppi, param_val); + + break; + + case PPSIEXP_PARAM_INST_SYNC_INT_CMD: + ppi = INST(ppg_local, param_instance); + pp_diag(ppi, config, 2, + "%s: cmd %d (PPSIEXP_PARAM_INST_SYNC_INT_CMD) " + "instance %d, port %s, value %d\n", __func__, + param_type, param_instance, ppi->iface_name, param_val); + if (!check_range_inst_logSyncInterval(ppi->cfg.profile, + param_val)) { + pp_diag(ppi, config, 1, + "Param update Error: value of " + "logSyncInterval (%d) not in range! " + "cmd %d (PPSIEXP_PARAM_INST_SYNC_INT_CMD) " + "instance %d, port %s\n", + param_val, param_type, param_instance, ppi->iface_name); + rval = PPSIEXP_RET_ERROR_VAL; + break; + } + + set_param_inst_logSyncInterval(ppi, param_val); + + break; default: ppi = INST(ppg_local, param_instance); diff --git a/arch-wrs/wrs-startup.c b/arch-wrs/wrs-startup.c index 93c95ff359e76a7e6b7c117ce24608586432f03f..65cd11e66d523ca58a95e484f41f6b185d05f827 100644 --- a/arch-wrs/wrs-startup.c +++ b/arch-wrs/wrs-startup.c @@ -114,6 +114,47 @@ void set_param_global_prio2(struct pp_globals *ppg, int prio2) bmc_apply_configured_device_attributes(ppg); } +/* Functions to set parameters specific to instance */ + +void set_param_inst_logMinDelayReqInterval(struct pp_instance *ppi, + int logMinDelayReqInterval) +{ + int millisec; + + DSPOR(ppi)->logMinDelayReqInterval = logMinDelayReqInterval; + ppi->cfg.min_delay_req_interval = logMinDelayReqInterval; + millisec = pp_timeout_log_to_ms(logMinDelayReqInterval); + + if (is_delayMechanismE2E(ppi)) + pp_timeout_set_rename(ppi, PP_TO_REQUEST, millisec); +} + +void set_param_inst_logMinPdelayReqInterval(struct pp_instance *ppi, + int logMinPdelayReqInterval) +{ + int millisec; + + DSPOR(ppi)->logMinPdelayReqInterval = logMinPdelayReqInterval; + ppi->cfg.min_pdelay_req_interval = logMinPdelayReqInterval; + + millisec = pp_timeout_log_to_ms(logMinPdelayReqInterval); + + if (is_delayMechanismP2P(ppi)) + pp_timeout_set_rename(ppi, PP_TO_REQUEST, millisec); +} + +void set_param_inst_logSyncInterval(struct pp_instance *ppi, + int logSyncInterval) +{ + int millisec; + + DSPOR(ppi)->logSyncInterval = logSyncInterval; + ppi->cfg.sync_interval = logSyncInterval; + + millisec = pp_timeout_log_to_ms(logSyncInterval); + pp_timeout_set_rename(ppi, PP_TO_SYNC_SEND, millisec); +} + static char *strCodeOpt="CODEOPT=(" #if CONFIG_HAS_CODEOPT_EPC_ENABLED " EPC" diff --git a/include/ppsi/conf.h b/include/ppsi/conf.h index cec99b1cf21dba4153d930664cc7626ec1df2643..bf174337d623c8932bd35a02397dcce6dfd1528b 100644 --- a/include/ppsi/conf.h +++ b/include/ppsi/conf.h @@ -195,3 +195,8 @@ extern int f_simple_int(struct pp_argline *l, int lineno, struct pp_globals *ppg, union pp_cfg_arg *arg); int in_range(int val, int min, int max); +int check_range_inst_logMinDelayReqInterval(int profile, + int logMinDelayReqInterval); +int check_range_inst_logMinPdelayReqInterval(int profile, + int logMinPdelayReqInterval); +int check_range_inst_logSyncInterval(int profile, int logSyncInterval); diff --git a/include/ppsi/constants.h b/include/ppsi/constants.h index a03619696126c6493f06a699058759fec44aa3a5..5c14f3bf961be569f77af53c95b0fee18a728e2e 100644 --- a/include/ppsi/constants.h +++ b/include/ppsi/constants.h @@ -51,14 +51,26 @@ #define PP_MIN_MIN_DELAY_REQ_INTERVAL 0 #define PP_MAX_MIN_DELAY_REQ_INTERVAL 5 +#define PP_DEFAULT_MIN_DELAY_REQ_INTERVAL_CUSTOM PP_DEFAULT_MIN_DELAY_REQ_INTERVAL +#define PP_MIN_MIN_DELAY_REQ_INTERVAL_CUSTOM -6 +#define PP_MAX_MIN_DELAY_REQ_INTERVAL_CUSTOM PP_MAX_MIN_DELAY_REQ_INTERVAL + #define PP_DEFAULT_MIN_PDELAY_REQ_INTERVAL 0 #define PP_MIN_MIN_PDELAY_REQ_INTERVAL 0 #define PP_MAX_MIN_PDELAY_REQ_INTERVAL 5 +#define PP_DEFAULT_MIN_PDELAY_REQ_INTERVAL_CUSTOM PP_DEFAULT_MIN_PDELAY_REQ_INTERVAL +#define PP_MIN_MIN_PDELAY_REQ_INTERVAL_CUSTOM -6 +#define PP_MAX_MIN_PDELAY_REQ_INTERVAL_CUSTOM PP_MAX_MIN_PDELAY_REQ_INTERVAL + #define PP_DEFAULT_SYNC_INTERVAL 0 /* -7 in 802.1AS */ #define PP_MIN_SYNC_INTERVAL -1 #define PP_MAX_SYNC_INTERVAL 1 +#define PP_DEFAULT_SYNC_INTERVAL_CUSTOM PP_DEFAULT_SYNC_INTERVAL +#define PP_MIN_SYNC_INTERVAL_CUSTOM -6 +#define PP_MAX_SYNC_INTERVAL_CUSTOM PP_MAX_SYNC_INTERVAL + /* Min/max values for delay coefficient */ #define PP_MIN_DELAY_COEFFICIENT_AS_RELDIFF (((int64_t)-1)<<REL_DIFF_FRACBITS) #define PP_MAX_DELAY_COEFFICIENT_AS_RELDIFF (((int64_t) 1)<<REL_DIFF_FRACBITS) diff --git a/lib/conf.c b/lib/conf.c index 43980efcd015fc130409d13f12e861fcde9fc837..90505e6637b13662168019adcf95ff78cb6d22d7 100644 --- a/lib/conf.c +++ b/lib/conf.c @@ -756,3 +756,43 @@ int in_range(int val, int min, int max) return 0; return 1; } + +/* Functions to check ranges of parameters specific to instance */ + +int check_range_inst_logMinDelayReqInterval(int profile, + int logMinDelayReqInterval) +{ + if (profile == PPSI_PROFILE_CUSTOM) + return in_range(logMinDelayReqInterval, + PP_MIN_MIN_DELAY_REQ_INTERVAL_CUSTOM, + PP_MAX_MIN_DELAY_REQ_INTERVAL_CUSTOM); + + return in_range(logMinDelayReqInterval, + PP_MIN_MIN_DELAY_REQ_INTERVAL, + PP_MAX_MIN_DELAY_REQ_INTERVAL); +} + +int check_range_inst_logMinPdelayReqInterval(int profile, + int logMinPdelayReqInterval) +{ + if (profile == PPSI_PROFILE_CUSTOM) + return in_range(logMinPdelayReqInterval, + PP_MIN_MIN_PDELAY_REQ_INTERVAL_CUSTOM, + PP_MAX_MIN_PDELAY_REQ_INTERVAL_CUSTOM); + + return in_range(logMinPdelayReqInterval, + PP_MIN_MIN_PDELAY_REQ_INTERVAL, + PP_MAX_MIN_PDELAY_REQ_INTERVAL); +} + +int check_range_inst_logSyncInterval(int profile, int logSyncInterval) +{ + if (profile == PPSI_PROFILE_CUSTOM) + return in_range(logSyncInterval, + PP_MIN_SYNC_INTERVAL_CUSTOM, + PP_MAX_SYNC_INTERVAL_CUSTOM); + + return in_range(logSyncInterval, + PP_MIN_SYNC_INTERVAL, + PP_MAX_SYNC_INTERVAL); +} diff --git a/tools/ppsi_conf.c b/tools/ppsi_conf.c index 6cb8bb7b56d6f9593c9966afb2d72b2472e2bd1e..99a140f632f68685edcce0d76f5cd81cc746f1f4 100644 --- a/tools/ppsi_conf.c +++ b/tools/ppsi_conf.c @@ -26,21 +26,25 @@ static struct minipc_ch *ptp_ch; enum input_arg { arg_help = 'Z' + 1, /* avoid conflicts with short options */ + arg_delay_req_interval, arg_instance, arg_prio1, arg_prio2, + arg_sync_interval, arg_tracking, arg_verbose, }; static struct option long_opts[] = { {"help", no_argument, NULL, arg_help}, + {"delay-req-interval", required_argument, NULL, arg_delay_req_interval}, {"instance", required_argument, NULL, arg_instance}, {"ppi", required_argument, NULL, arg_instance}, {"prio1", required_argument, NULL, arg_prio1}, {"priority1", required_argument, NULL, arg_prio1}, {"prio2", required_argument, NULL, arg_prio2}, {"priority2", required_argument, NULL, arg_prio2}, + {"sync-interval", required_argument, NULL, arg_sync_interval}, {"tracking", required_argument, NULL, arg_tracking}, {"verbose", optional_argument, NULL, arg_verbose}, {NULL, 0, NULL, 0} @@ -65,6 +69,12 @@ void help(char *prgname) "Parameters specific for PPSi instance:\n" " --instance=<num>\n" " --ppi=<num> - Select PPSi instance\n" + " --delay-req-interval=<num>\n" + " - sets logarithm to the base 2 of the mean interval of delay" + " request message transmission; used when a port is in Slave state\n" + " --sync-interval=<num>\n" + " - sets logarithm to the base 2 of the mean interval of sync" + " message transmission; used when a port is in Master state\n" ); exit(1); } @@ -168,6 +178,26 @@ int main(int argc, char *argv[]) while ((opt = getopt_long(argc, argv, "vh", long_opts, NULL)) != -1) { switch (opt) { + case arg_delay_req_interval: + /* Check if an instance is set. If not exit. */ + check_instance(ppsi_instance); + tmp = atoi(optarg); + if (verbose) + printf("Setting delay request interval for " + "instance %d to %d\n", + ppsi_instance, tmp); + ret = ppsi_set_param_instance( + PPSIEXP_PARAM_INST_DELAY_REQ_INT_CMD, + ppsi_instance, + tmp); + if (ret) { + fprintf(stderr, "Error setting delay request " + "interval for instance %d to %d\n", + ppsi_instance, tmp); + exit (1); + } + break; + case arg_instance: ppsi_instance = atoi(optarg); if (verbose) @@ -197,6 +227,26 @@ int main(int argc, char *argv[]) } break; + case arg_sync_interval: + /* Check if an instance is set. If not exit. */ + check_instance(ppsi_instance); + tmp = atoi(optarg); + if (verbose) + printf("Setting sync interval for instance %d " + "to %d\n", + ppsi_instance, tmp); + ret = ppsi_set_param_instance( + PPSIEXP_PARAM_INST_SYNC_INT_CMD, + ppsi_instance, + tmp); + if (ret) { + fprintf(stderr, "Error setting sync interval " + "for instance %d to %d\n", + ppsi_instance, tmp); + exit (1); + } + break; + case arg_tracking: { int tracking;