[PATCH net-next 0/5] PTP support for the SJA1105 DSA driver

From: Vladimir Oltean
Date: Tue May 28 2019 - 20:01:56 EST


This patchset adds the following:

- A timecounter/cyclecounter based PHC for the free-running
timestamping clock of this switch.

- A state machine implemented in the DSA tagger for SJA1105, which
keeps track of metadata follow-up Ethernet frames (the switch's way
of transmitting RX timestamps).

- Some common-sense on whether or not frames should be timestamped was
taken out of the mv88e6xxx driver (the only other DSA driver with PTP
support) and moved to the generic framework. An option was also
added for drivers to override these common-sense decisions, and
timestamp some more frames. This was the path of least resistance
after implementing the aforementioned state machine - metadata
follow-up frames need to be tracked anyway even if only to discard
them and not pass them up the network stack. And since the switch
can't just be told to timestamp only what the kernel wants (PTP
frames), simply use all the timestamps it provides.

- A generic helper in the timecounter/cyclecounter code for
reconstructing partial PTP timestamps, such as those generated by the
SJA1105.

Not all is rosy, though.

PTP timestamping will only work when the ports are bridged. Otherwise,
the metadata follow-up frames holding RX timestamps won't be received
because they will be blocked by the master port's MAC filter. Linuxptp
tries to put the net device in ALLMULTI/PROMISC mode, but DSA doesn't
pass this on to the master port, which does the actual reception.
The master port is put in promiscous mode when the slave ports are
enslaved to a bridge.

Also, even with software-corrected timestamps, one can observe a
negative path delay reported by linuxptp:

ptp4l[55.600]: master offset 8 s2 freq +83677 path delay -2390
ptp4l[56.600]: master offset 17 s2 freq +83688 path delay -2391
ptp4l[57.601]: master offset 6 s2 freq +83682 path delay -2391
ptp4l[58.601]: master offset -1 s2 freq +83677 path delay -2391

Without investigating too deeply, this appears to be introduced by the
correction applied by linuxptp to t4 (t4c: corrected master rxtstamp)
during the path delay estimation process (removing the correction makes
the path delay positive). This does not appear to have an obvious
negative effect upon the synchronization.

Lastly, clock manipulations on the actual hardware PTP clock will have
to be implemented anyway, for the TTEthernet block and the time-based
ingress policer.

Vladimir Oltean (5):
timecounter: Add helper for reconstructing partial timestamps
net: dsa: sja1105: Add support for the PTP clock
net: dsa: mv88e6xxx: Let taggers specify a can_timestamp function
net: dsa: sja1105: Add support for PTP timestamping
net: dsa: sja1105: Increase priority of CPU-trapped frames

drivers/net/dsa/mv88e6xxx/hwtstamp.c | 25 +-
drivers/net/dsa/mv88e6xxx/hwtstamp.h | 4 +-
drivers/net/dsa/sja1105/Kconfig | 7 +
drivers/net/dsa/sja1105/Makefile | 1 +
drivers/net/dsa/sja1105/sja1105.h | 30 ++
.../net/dsa/sja1105/sja1105_dynamic_config.c | 2 +
drivers/net/dsa/sja1105/sja1105_main.c | 272 ++++++++++++-
drivers/net/dsa/sja1105/sja1105_ptp.c | 357 ++++++++++++++++++
drivers/net/dsa/sja1105/sja1105_ptp.h | 48 +++
drivers/net/dsa/sja1105/sja1105_spi.c | 28 ++
.../net/dsa/sja1105/sja1105_static_config.c | 59 +++
.../net/dsa/sja1105/sja1105_static_config.h | 10 +
include/linux/dsa/sja1105.h | 15 +
include/linux/timecounter.h | 7 +
include/net/dsa.h | 6 +-
kernel/time/timecounter.c | 33 ++
net/dsa/dsa.c | 25 +-
net/dsa/slave.c | 20 +-
net/dsa/tag_sja1105.c | 135 ++++++-
19 files changed, 1043 insertions(+), 41 deletions(-)
create mode 100644 drivers/net/dsa/sja1105/sja1105_ptp.c
create mode 100644 drivers/net/dsa/sja1105/sja1105_ptp.h

--
2.17.1