When it_iface first used or changed, we need to check the requried timestamping mode.
If ts_iface changed and does not support requested timestamping mode, set link status down by force to trigger port EV_FAULT_DETECTED event. Signed-off-by: Hangbin Liu <liuhang...@gmail.com> --- clock.c | 49 +++++++++++++++++++++++++++++++------------------ clock.h | 7 +++++++ port.c | 14 ++++++++++++-- 3 files changed, 50 insertions(+), 20 deletions(-) diff --git a/clock.c b/clock.c index 26cbd69..575ed08 100644 --- a/clock.c +++ b/clock.c @@ -107,6 +107,7 @@ struct clock { int time_flags; /* grand master role */ int time_source; /* grand master role */ enum servo_state servo_state; + enum timestamp_type timestamping; tmv_t master_offset; tmv_t path_delay; tmv_t ingress_ts; @@ -806,6 +807,34 @@ static void clock_remove_port(struct clock *c, struct port *p) port_close(p); } +int clock_required_modes(struct clock *c) +{ + int required_modes = 0; + + switch (c->timestamping) { + case TS_SOFTWARE: + required_modes |= SOF_TIMESTAMPING_TX_SOFTWARE | + SOF_TIMESTAMPING_RX_SOFTWARE | + SOF_TIMESTAMPING_SOFTWARE; + break; + case TS_LEGACY_HW: + required_modes |= SOF_TIMESTAMPING_TX_HARDWARE | + SOF_TIMESTAMPING_RX_HARDWARE | + SOF_TIMESTAMPING_SYS_HARDWARE; + break; + case TS_HARDWARE: + case TS_ONESTEP: + required_modes |= SOF_TIMESTAMPING_TX_HARDWARE | + SOF_TIMESTAMPING_RX_HARDWARE | + SOF_TIMESTAMPING_RAW_HARDWARE; + break; + default: + break; + } + + return required_modes; +} + struct clock *clock_create(enum clock_type type, struct config *config, const char *phc_device) { @@ -914,24 +943,8 @@ struct clock *clock_create(enum clock_type type, struct config *config, } /* Check the time stamping mode on each interface. */ - switch (timestamping) { - case TS_SOFTWARE: - required_modes |= SOF_TIMESTAMPING_TX_SOFTWARE | - SOF_TIMESTAMPING_RX_SOFTWARE | - SOF_TIMESTAMPING_SOFTWARE; - break; - case TS_LEGACY_HW: - required_modes |= SOF_TIMESTAMPING_TX_HARDWARE | - SOF_TIMESTAMPING_RX_HARDWARE | - SOF_TIMESTAMPING_SYS_HARDWARE; - break; - case TS_HARDWARE: - case TS_ONESTEP: - required_modes |= SOF_TIMESTAMPING_TX_HARDWARE | - SOF_TIMESTAMPING_RX_HARDWARE | - SOF_TIMESTAMPING_RAW_HARDWARE; - break; - } + c->timestamping = timestamping; + required_modes = clock_required_modes(c); STAILQ_FOREACH(iface, &config->interfaces, list) { rtnl_link_info(iface); sk_get_ts_info(iface->ts_iface, &iface->ts_info); diff --git a/clock.h b/clock.h index 49ecb76..18d7250 100644 --- a/clock.h +++ b/clock.h @@ -73,6 +73,13 @@ UInteger8 clock_class(struct clock *c); struct config *clock_config(struct clock *c); /** + * Obtains the required time stamping mode. + * @param c The clock instance. + * @return The value of required time stamping mode. + */ +int clock_required_modes(struct clock *c); + +/** * Create a clock instance. There can only be one clock in any system, * so subsequent calls will destroy the previous clock instance. * diff --git a/port.c b/port.c index 98c76e7..3c4e39f 100644 --- a/port.c +++ b/port.c @@ -2224,6 +2224,7 @@ void port_dispatch(struct port *p, enum fsm_event event, int mdiff) static void port_link_status(void *ctx, int index, int linkup, char *ts_iface) { struct port *p = ctx; + int required_modes = 0; if (index != if_nametoindex(p->name) || p->link_status == linkup) return; @@ -2235,9 +2236,18 @@ static void port_link_status(void *ctx, int index, int linkup, char *ts_iface) if (ts_iface[0] != '\0' && strcmp(p->iface->ts_iface, ts_iface)) { strncpy(p->iface->ts_iface, ts_iface, MAX_IFNAME_SIZE); sk_get_ts_info(p->iface->ts_iface, &p->iface->ts_info); + if (p->iface->ts_info.valid) { - p->phc_index = p->iface->ts_info.phc_index; - clock_switch_phc(p->clock, p->phc_index); + required_modes = clock_required_modes(p->clock); + if ((p->iface->ts_info.so_timestamping & required_modes) != required_modes) { + pr_err("interface '%s' does not support requested " + "timestamping mode, set link status down by force.", + p->iface->ts_iface); + p->link_status = 0; + } else { + p->phc_index = p->iface->ts_info.phc_index; + clock_switch_phc(p->clock, p->phc_index); + } } } -- 2.5.5 ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Linuxptp-devel mailing list Linuxptp-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxptp-devel