Message ID | 20230926071059.1239033-1-yajun.deng@linux.dev (mailing list archive) |
---|---|
State | Awaiting Upstream |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [RESEND] i40e: fix the wrong PTP frequency calculation | expand |
Context | Check | Description |
---|---|---|
netdev/tree_selection | success | Guessing tree name failed - patch did not apply |
On Tue, Sep 26, 2023 at 03:10:59PM +0800, Yajun Deng wrote: > 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@vger.kernel.org> # 6.1 > Cc: Tony Nguyen <anthony.l.nguyen@intel.com> > Signed-off-by: Yajun Deng <yajun.deng@linux.dev> > Reviewed-by: Jacob Keller <jacob.e.keller@intel.com> > --- > drivers/net/ethernet/intel/i40e/i40e_ptp.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) Now queued up, thanks. greg k-h
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);