On Tue, Jun 12, 2018 at 12:40:06PM +0000, Geva, Erez wrote:
> Signed-off-by: Erez Geva <erez.geva....@siemens.com>

Please write a proper commit message with a succinct subject line.

> +static struct config_enum hwts_filter_enu[] = {
> +     { "default", HWTS_FILTER_DEF     },

"DEF" looks silly. Please spell out "DEFAULT".

> +     { "ignore",  HWTS_FILTER_IGNORE  },
> +     { "upgrade", HWTS_FILTER_UPGRADE },
> +     { "check",   HWTS_FILTER_CHECK   },

Why four different modes?

What we discussed was:

> My preference would be to have an option to not adjust it. Then you could
> use hwstamp_ctl or another program before running ptp4l to set it to the
> value you want. In this mode, ptp4l would simply check to see whether the
> filter was set to a sufficient value for PTP operations and fail with an
> error if it was not.

That means just two modes:

1. normal - current code

2. check - read only ioctl; quit if setting not rich enough for the HW
   time stamping mode

> +     { NULL, 0 },
> +};
> +
>  struct config_item config_tab[] = {
>       PORT_ITEM_INT("announceReceiptTimeout", 3, 2, UINT8_MAX),
>       GLOB_ITEM_INT("assume_two_step", 0, 0, 1),
> @@ -268,6 +276,7 @@ struct config_item config_tab[] = {
>       GLOB_ITEM_STR("userDescription", ""),
>       GLOB_ITEM_INT("utc_offset", CURRENT_UTC_OFFSET, 0, INT_MAX),
>       GLOB_ITEM_INT("verbose", 0, 0, 1),
> +     PORT_ITEM_ENU("hwts_filter", HWTS_FILTER_DEF, hwts_filter_enu),

Keep list in alphabetical order please.

>  };
>  
>  static enum parser_result
> diff --git a/ptp4l.8 b/ptp4l.8
> index ae6e491..4e2e87e 100644
> --- a/ptp4l.8
> +++ b/ptp4l.8
> @@ -624,6 +624,14 @@ The time source is a single byte code that gives an idea 
> of the kind
>  of local clock in use. The value is purely informational, having no
>  effect on the outcome of the Best Master Clock algorithm, and is
>  advertised when the clock becomes grand master.
> +.TP
> +.B hwts_filter
> +Select the hardware time stamp filter setting mode;
> +Possible values are ignore, upgrade, check.

That is only three values, but you added four.

> +Some AVB/TSN applications may need the receiving hardware time stamp.

This has nothing to do with AVB/TSN.  Instead, we want ptp4l to play
nicely with *any* other program that needs time stamping.

> +Upgrade mode prevent downgrading the RX filter.
> +Check mode only check but do not set.
> +The default is ignore.

You have the default as HWTS_FILTER_DEF which is distinct from
HWTS_FILTER_IGNORE.
  
>  .SH TIME SCALE USAGE
>  
> diff --git a/raw.c b/raw.c
> index 8dc50bc..ff60fea 100644
> --- a/raw.c
> +++ b/raw.c
> @@ -200,7 +200,8 @@ static void addr_to_mac(void *mac, struct address *addr)
>  }
>  
>  static int raw_open(struct transport *t, struct interface *iface,
> -                 struct fdarray *fda, enum timestamp_type ts_type)
> +                 struct fdarray *fda, enum timestamp_type ts_type,
> +                 enum hwts_filter_mode ftm)

Let's not tack on other parameter to the transports.  This is not a
per-port setting.  Instead, we want a global variable in sk.c along
with sk_tx_timeout and sk_check_fupsync.

> @@ -55,12 +56,27 @@ static int hwts_init(int fd, const char *device, int 
> rx_filter, int tx_type)
>       strncpy(ifreq.ifr_name, device, sizeof(ifreq.ifr_name) - 1);
>  
>       ifreq.ifr_data = (void *) &cfg;
> -     cfg.tx_type    = tx_type;
> -     cfg.rx_filter  = rx_filter;
> -     req = cfg;
> -     err = ioctl(fd, SIOCSHWTSTAMP, &ifreq);
> -     if (err < 0)
> -             return err;
> +
> +     if (ftm != HWTS_FILTER_IGNORE) {
> +             if (ioctl(fd, SIOCGHWTSTAMP, &ifreq) < 0) {
> +                     pr_err("ioctl SIOCGHWTSTAMP failed: %m");
> +                     return -1;
> +             }
> +     }
> +
> +     if (ftm == HWTS_FILTER_CHECK) {
> +             req.tx_type   = tx_type;
> +             req.rx_filter = rx_filter;
> +     } else {
> +             cfg.tx_type    = tx_type;
> +             if (ftm == HWTS_FILTER_IGNORE ||
> +                 cfg.rx_filter != HWTSTAMP_FILTER_ALL)
> +                     cfg.rx_filter = rx_filter;
> +             req = cfg;
> +             err = ioctl(fd, SIOCSHWTSTAMP, &ifreq);
> +             if (err < 0)
> +                     return err;
> +     }

This is too convoluted and super confusing.

...

> +enum hwts_filter_mode {
> +     HWTS_FILTER_DEF,       /* default value for real value detection */

Sorry, I really can't follow these comments.

> +     HWTS_FILTER_IGNORE,    /* ignore previous mode and set new mode */
> +     HWTS_FILTER_UPGRADE,   /* upgrade rx filter */
> +     HWTS_FILTER_CHECK,     /* check filters but do not change them */
> +};

What we really want is a Boolean that makes the ioctl read only.

Thanks,
Richard


------------------------------------------------------------------------------
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

Reply via email to