linux/drivers/net
Vladimir Oltean 109258ed62 net: phy: nxp-c45-tja11xx: fix potential RX timestamp wraparound
The reconstruction procedure for partial timestamps reads the current
PTP time and fills in the low 2 bits of the second portion, as well as
the nanoseconds portion, from the actual hardware packet timestamp.
Critically, the reconstruction procedure works because it assumes that
the current PTP time is strictly larger than the hardware timestamp was:
it detects a 2-bit wraparound of the 'seconds' portion by checking whether
the 'seconds' portion of the partial hardware timestamp is larger than
the 'seconds' portion of the current time. That can only happen if the
hardware timestamp was captured by the PHY during the last phase of a
'modulo 4 seconds' interval, and the current PTP time was read by the
driver during the initial phase of the next 'modulo 4 seconds' interval.

The partial RX timestamps are added to priv->rx_queue in
nxp_c45_rxtstamp() and they are processed potentially in parallel by the
aux worker thread in nxp_c45_do_aux_work(). This means that it is
possible for nxp_c45_do_aux_work() to process more than one RX timestamp
during the same schedule.

There is one premature optimization that will cause issues: for RX
timestamping, the driver reads the current time only once, and it uses
that to reconstruct all PTP RX timestamps in the queue. For the second
and later timestamps, this will be an issue if we are processing two RX
timestamps which are to the left and to the right, respectively, of a
4-bit wraparound of the 'seconds' portion of the PTP time, and the
current PTP time is also pre-wraparound.

 0.000000000        4.000000000        8.000000000        12.000000000
 |..................|..................|..................|............>
                 ^ ^ ^ ^                                            time
                 | | | |
                 | | | process hwts 1 and hwts 2
                 | | |
                 | | hwts 2
                 | |
                 | read current PTP time
                 |
                 hwts 1

What will happen in that case is that hwts 2 (post-wraparound) will use
a stale current PTP time that is pre-wraparound.
But nxp_c45_reconstruct_ts will not detect this condition, because it is
not coded up for it, so it will reconstruct hwts 2 with a current time
from the previous 4 second interval (i.e. 0.something instead of
4.something).

This is solvable by making sure that the full 64-bit current time is
always read after the PHY has taken the partial RX timestamp. We do this
by reading the current PTP time for every timestamp in the RX queue.

Fixes: 514def5dd3 ("phy: nxp-c45-tja11xx: add timestamping support")
Cc: Richard Cochran <richardcochran@gmail.com>
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Signed-off-by: David S. Miller <davem@davemloft.net>
2021-06-14 13:12:59 -07:00
..
appletalk Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2021-05-27 09:55:10 -07:00
arcnet
bonding bonding: remove redundant initialization of variable ret 2021-06-03 15:25:29 -07:00
caif Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2021-05-27 09:55:10 -07:00
can can: m_can: fix whitespace in a few comments 2021-05-27 09:42:24 +02:00
dsa net: phy: micrel: ksz886x/ksz8081: add cabletest support 2021-06-14 12:54:43 -07:00
ethernet Merge branch 'Ingenic-SOC-mac-support' 2021-06-14 13:12:33 -07:00
fddi net: fddi: skfp: remove leading spaces before tabs 2021-05-20 15:10:57 -07:00
fjes fjes: check return value after calling platform_get_resource() 2021-06-10 13:53:13 -07:00
hamradio hamradio: bpqether: Fix -Wunused-const-variable warning 2021-06-01 17:00:51 -07:00
hippi
hyperv hv_netvsc: Make netvsc/VF binding check both MAC and serial number 2021-04-25 18:19:23 -07:00
ieee802154 Merge tag 'ieee802154-for-davem-2021-06-03' of git://git.kernel.org/pub/scm/linux/kernel/git/sschmidt/wpan 2021-06-03 15:21:58 -07:00
ipa net: ipa: introduce sysfs code 2021-06-11 14:13:18 -07:00
ipvlan
mdio net: mdio: mscc-miim: Use devm_platform_get_and_ioremap_resource() 2021-06-11 13:10:20 -07:00
mhi net: mhi_net: Register wwan_ops for link creation 2021-06-12 13:16:45 -07:00
netdevsim drivers: net: netdevsim: add devlink trap_drop_counter_get implementation 2021-06-14 13:04:25 -07:00
pcs net: pcs: xpcs: export xpcs_do_config and xpcs_link_up 2021-06-11 13:43:56 -07:00
phy net: phy: nxp-c45-tja11xx: fix potential RX timestamp wraparound 2021-06-14 13:12:59 -07:00
plip
ppp net: ppp: remove leading spaces before tabs 2021-05-20 15:10:57 -07:00
slip net: slip: remove leading spaces before tabs 2021-05-20 15:10:57 -07:00
team
usb net: usb: asix: ax88772: manage PHY PM from MAC 2021-06-11 13:00:31 -07:00
vmxnet3
wan net: pc300too: fix the comments style issue 2021-06-11 12:58:12 -07:00
wireguard wireguard: allowedips: free empty intermediate nodes when removing single node 2021-06-04 14:25:14 -07:00
wireless mt76: mt7615: Use devm_platform_get_and_ioremap_resource() 2021-06-10 14:00:49 -07:00
wwan net: wwan: iosm: Remove DEBUG flag 2021-06-14 12:57:40 -07:00
xen-netback
bareudp.c
dummy.c
eql.c
geneve.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2021-04-26 12:00:00 -07:00
gtp.c gtp: Fix a typo 2021-06-01 17:05:04 -07:00
ifb.c ifb: remove leading spaces before tabs 2021-05-20 15:10:57 -07:00
Kconfig net: mhi_net: Register wwan_ops for link creation 2021-06-12 13:16:45 -07:00
LICENSE.SRC
loopback.c
macsec.c
macvlan.c macvlan: Fix a typo 2021-06-01 17:05:04 -07:00
macvtap.c
Makefile net: Add a WWAN subsystem 2021-04-16 15:31:02 -07:00
mdio.c
mii.c mii: remove leading spaces before tabs 2021-05-20 15:10:57 -07:00
net_failover.c
netconsole.c
nlmon.c
ntb_netdev.c
rionet.c
sb1000.c
Space.c
sungem_phy.c
tap.c
thunderbolt.c
tun.c tun: use DEVICE_ATTR_RO macro 2021-05-19 12:01:44 -07:00
veth.c veth: check for NAPI instead of xdp_prog before xmit of XDP frame 2021-04-16 15:42:07 -07:00
virtio_net.c virtio_net: Remove BUG() to avoid machine dead 2021-06-07 13:06:46 -07:00
vrf.c vrf: Fix a typo 2021-06-01 17:05:04 -07:00
vsockmon.c
vxlan.c
xen-netfront.c