[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20230926071059.1239033-1-yajun.deng@linux.dev>
Date: Tue, 26 Sep 2023 15:10:59 +0800
From: Yajun Deng <yajun.deng@...ux.dev>
To: jesse.brandeburg@...el.com,
anthony.l.nguyen@...el.com,
jacob.e.keller@...el.com,
gregkh@...uxfoundation.org
Cc: netdev@...r.kernel.org,
linux-kernel@...r.kernel.org,
stable@...r.kernel.org,
Yajun Deng <yajun.deng@...ux.dev>
Subject: [PATCH RESEND] i40e: fix the wrong PTP frequency calculation
The new adjustment should be based on the base frequency, not the
I40E_PTP_40GB_INCVAL in i40e_ptp_adjfine().
This issue was introduced in commit 3626a690b717 ("i40e: use
mul_u64_u64_div_u64 for PTP frequency calculation"), frequency is left
just as base I40E_PTP_40GB_INCVAL before the commit. After the commit,
frequency is the I40E_PTP_40GB_INCVAL times the ptp_adj_mult value.
But then the diff is applied on the wrong value, and no multiplication
is done afterwards.
It was accidentally fixed in commit 1060707e3809 ("ptp: introduce helpers
to adjust by scaled parts per million"). It uses adjust_by_scaled_ppm
correctly performs the calculation and uses the base adjustment, so
there's no error here. But it is a new feature and doesn't need to
backported to the stable releases.
This issue affects both v6.0 and v6.1, and the v6.1 version is an LTS
release. Therefore, the patch only needs to be applied to v6.1 stable.
Fixes: 3626a690b717 ("i40e: use mul_u64_u64_div_u64 for PTP frequency calculation")
Cc: <stable@...r.kernel.org> # 6.1
Cc: Tony Nguyen <anthony.l.nguyen@...el.com>
Signed-off-by: Yajun Deng <yajun.deng@...ux.dev>
Reviewed-by: Jacob Keller <jacob.e.keller@...el.com>
---
drivers/net/ethernet/intel/i40e/i40e_ptp.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/intel/i40e/i40e_ptp.c b/drivers/net/ethernet/intel/i40e/i40e_ptp.c
index ffea0c9c82f1..97a9efe7b713 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_ptp.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_ptp.c
@@ -361,9 +361,9 @@ static int i40e_ptp_adjfine(struct ptp_clock_info *ptp, long scaled_ppm)
1000000ULL << 16);
if (neg_adj)
- adj = I40E_PTP_40GB_INCVAL - diff;
+ adj = freq - diff;
else
- adj = I40E_PTP_40GB_INCVAL + diff;
+ adj = freq + diff;
wr32(hw, I40E_PRTTSYN_INC_L, adj & 0xFFFFFFFF);
wr32(hw, I40E_PRTTSYN_INC_H, adj >> 32);
--
2.25.1
Powered by blists - more mailing lists