Message ID | 20220501111836.10910-3-gerhard@engleder-embedded.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | ptp: Support hardware clocks with additional free running cycle counter | expand |
On Sun, 2022-05-01 at 13:18 +0200, Gerhard Engleder wrote: > The free running cycle counter of physical clocks called cycles shall be > used for hardware timestamps to enable synchronisation. > > Introduce new flag SKBTX_HW_TSTAMP_USE_CYCLES, which signals driver to > provide a TX timestamp based on cycles if cycles are supported. > > Signed-off-by: Gerhard Engleder <gerhard@engleder-embedded.com> > --- > include/linux/skbuff.h | 5 +++++ > net/core/skbuff.c | 5 +++++ > net/socket.c | 11 ++++++++++- > 3 files changed, 20 insertions(+), 1 deletion(-) > > diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h > index 3270cb72e4d8..fa03e02b761d 100644 > --- a/include/linux/skbuff.h > +++ b/include/linux/skbuff.h > @@ -615,6 +615,11 @@ enum { > /* device driver is going to provide hardware time stamp */ > SKBTX_IN_PROGRESS = 1 << 2, > > + /* generate hardware time stamp based on cycles if supported, flag is > + * used only for TX path > + */ > + SKBTX_HW_TSTAMP_USE_CYCLES = 1 << 3, > + > /* generate wifi status information (where possible) */ > SKBTX_WIFI_STATUS = 1 << 4, Don't you need to update accordingly SKBTX_ANY_TSTAMP, so that this flags is preserved on segmentation? Thanks! Paolo
On Sun, May 01, 2022 at 01:18:32PM +0200, Gerhard Engleder wrote: > The free running cycle counter of physical clocks called cycles shall be > used for hardware timestamps to enable synchronisation. > > Introduce new flag SKBTX_HW_TSTAMP_USE_CYCLES, which signals driver to > provide a TX timestamp based on cycles if cycles are supported. > > Signed-off-by: Gerhard Engleder <gerhard@engleder-embedded.com> Acked-by: Richard Cochran <richardcochran@gmail.com>
> > The free running cycle counter of physical clocks called cycles shall be > > used for hardware timestamps to enable synchronisation. > > > > Introduce new flag SKBTX_HW_TSTAMP_USE_CYCLES, which signals driver to > > provide a TX timestamp based on cycles if cycles are supported. > > > > Signed-off-by: Gerhard Engleder <gerhard@engleder-embedded.com> > > --- > > include/linux/skbuff.h | 5 +++++ > > net/core/skbuff.c | 5 +++++ > > net/socket.c | 11 ++++++++++- > > 3 files changed, 20 insertions(+), 1 deletion(-) > > > > diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h > > index 3270cb72e4d8..fa03e02b761d 100644 > > --- a/include/linux/skbuff.h > > +++ b/include/linux/skbuff.h > > @@ -615,6 +615,11 @@ enum { > > /* device driver is going to provide hardware time stamp */ > > SKBTX_IN_PROGRESS = 1 << 2, > > > > + /* generate hardware time stamp based on cycles if supported, flag is > > + * used only for TX path > > + */ > > + SKBTX_HW_TSTAMP_USE_CYCLES = 1 << 3, > > + > > /* generate wifi status information (where possible) */ > > SKBTX_WIFI_STATUS = 1 << 4, > > Don't you need to update accordingly SKBTX_ANY_TSTAMP, so that this > flags is preserved on segmentation? You are right, SKBTX_HW_TSTAMP_USE_CYCLES should be preserved like SKBTX_HW_TSTAMP. I will fix that. Thank you! Gerhard
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 3270cb72e4d8..fa03e02b761d 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -615,6 +615,11 @@ enum { /* device driver is going to provide hardware time stamp */ SKBTX_IN_PROGRESS = 1 << 2, + /* generate hardware time stamp based on cycles if supported, flag is + * used only for TX path + */ + SKBTX_HW_TSTAMP_USE_CYCLES = 1 << 3, + /* generate wifi status information (where possible) */ SKBTX_WIFI_STATUS = 1 << 4, diff --git a/net/core/skbuff.c b/net/core/skbuff.c index b92e93dcaa91..62d6d143dd70 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -4841,6 +4841,11 @@ void __skb_tstamp_tx(struct sk_buff *orig_skb, skb_shinfo(skb)->tx_flags |= skb_shinfo(orig_skb)->tx_flags & SKBTX_ANY_TSTAMP; skb_shinfo(skb)->tskey = skb_shinfo(orig_skb)->tskey; + } else { + /* Do not clone SKBTX_HW_TSTAMP_USE_CYCLES flag to enable reuse + * of the same bit in RX path. + */ + skb_shinfo(skb)->tx_flags &= ~SKBTX_HW_TSTAMP_USE_CYCLES; } if (hwtstamps) diff --git a/net/socket.c b/net/socket.c index f0c39c874665..5c1c5e6100e1 100644 --- a/net/socket.c +++ b/net/socket.c @@ -683,9 +683,18 @@ void __sock_tx_timestamp(__u16 tsflags, __u8 *tx_flags) { u8 flags = *tx_flags; - if (tsflags & SOF_TIMESTAMPING_TX_HARDWARE) + if (tsflags & SOF_TIMESTAMPING_TX_HARDWARE) { flags |= SKBTX_HW_TSTAMP; + /* PTP hardware clocks can provide a free running cycle counter + * as a time base for virtual clocks. Tell driver to use the + * free running cycle counter for timestamp if socket is bound + * to virtual clock. + */ + if (tsflags & SOF_TIMESTAMPING_BIND_PHC) + flags |= SKBTX_HW_TSTAMP_USE_CYCLES; + } + if (tsflags & SOF_TIMESTAMPING_TX_SOFTWARE) flags |= SKBTX_SW_TSTAMP;
The free running cycle counter of physical clocks called cycles shall be used for hardware timestamps to enable synchronisation. Introduce new flag SKBTX_HW_TSTAMP_USE_CYCLES, which signals driver to provide a TX timestamp based on cycles if cycles are supported. Signed-off-by: Gerhard Engleder <gerhard@engleder-embedded.com> --- include/linux/skbuff.h | 5 +++++ net/core/skbuff.c | 5 +++++ net/socket.c | 11 ++++++++++- 3 files changed, 20 insertions(+), 1 deletion(-)