FAILED: patch "[PATCH] net: stmmac: ensure PTP time register reads are consistent" failed to apply to 4.9-stable tree
Subsystems (4)
[email protected]
maintainerThe patch below does not apply to the 4.9-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 80d4609008e6d696a279e39ae7458c916fcd44c1 Mon Sep 17 00:00:00 2001
From: Yannick Vignon <[email protected]>
Date: Thu, 3 Feb 2022 17:00:25 +0100
Subject: [PATCH] net: stmmac: ensure PTP time register reads are consistent
Even if protected from preemption and interrupts, a small time window remains when the 2 register reads could return inconsistent values, each time the "seconds" register changes. This could lead to an about 1-second error in the reported time.
Add logic to ensure the "seconds" and "nanoseconds" values are consistent.
drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c +12 -7
@@ -145,15 +145,20 @@ static int adjust_systime(void __iomem *ioaddr, u32 sec, u32 nsec,static void get_systime (void __iomem *ioaddr,u64 *systime) { -u64 ns; - -/* Get the TSSS value */ - ns =readl (ioaddr +PTP_STNSR ); -/* Get the TSS and convert sec time value to nanosecond */ - ns +=readl (ioaddr +PTP_STSR ) *1000000000ULL ; +u64 ns, sec0, sec1; + +/* Get the TSS value */ + sec1 =readl_relaxed (ioaddr +PTP_STSR ); +do { + sec0 = sec1; +/* Get the TSSS value */ + ns =readl_relaxed (ioaddr +PTP_STNSR ); +/* Get the TSS value */ + sec1 =readl_relaxed (ioaddr +PTP_STSR ); + }while (sec0 != sec1);if (systime) - *systime = ns; + *systime = ns + (sec1 *1000000000ULL ); }static void get_ptptime (void __iomem *ptpaddr,u64 *ptp_time)