ptp: igb: Use the high resolution frequency method.
authorRichard Cochran <richardcochran@gmail.com>
Tue, 8 Nov 2016 21:49:17 +0000 (22:49 +0100)
committerDavid S. Miller <davem@davemloft.net>
Thu, 10 Nov 2016 02:19:53 +0000 (21:19 -0500)
The 82580 and related devices offer a frequency resolution of about
0.029 ppb.  This patch lets users of the device benefit from the
increased frequency resolution when tuning the clock.

Signed-off-by: Richard Cochran <richardcochran@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/intel/igb/igb_ptp.c

index a7895c4cbcc3e09023e8901a33d420427548071b..c30eea8399a7dfb4de23717d33e8169e054cd600 100644 (file)
@@ -226,7 +226,7 @@ static int igb_ptp_adjfreq_82576(struct ptp_clock_info *ptp, s32 ppb)
        return 0;
 }
 
-static int igb_ptp_adjfreq_82580(struct ptp_clock_info *ptp, s32 ppb)
+static int igb_ptp_adjfine_82580(struct ptp_clock_info *ptp, long scaled_ppm)
 {
        struct igb_adapter *igb = container_of(ptp, struct igb_adapter,
                                               ptp_caps);
@@ -235,13 +235,13 @@ static int igb_ptp_adjfreq_82580(struct ptp_clock_info *ptp, s32 ppb)
        u64 rate;
        u32 inca;
 
-       if (ppb < 0) {
+       if (scaled_ppm < 0) {
                neg_adj = 1;
-               ppb = -ppb;
+               scaled_ppm = -scaled_ppm;
        }
-       rate = ppb;
-       rate <<= 26;
-       rate = div_u64(rate, 1953125);
+       rate = scaled_ppm;
+       rate <<= 13;
+       rate = div_u64(rate, 15625);
 
        inca = rate & INCVALUE_MASK;
        if (neg_adj)
@@ -1103,7 +1103,7 @@ void igb_ptp_init(struct igb_adapter *adapter)
                adapter->ptp_caps.max_adj = 62499999;
                adapter->ptp_caps.n_ext_ts = 0;
                adapter->ptp_caps.pps = 0;
-               adapter->ptp_caps.adjfreq = igb_ptp_adjfreq_82580;
+               adapter->ptp_caps.adjfine = igb_ptp_adjfine_82580;
                adapter->ptp_caps.adjtime = igb_ptp_adjtime_82576;
                adapter->ptp_caps.gettime64 = igb_ptp_gettime_82576;
                adapter->ptp_caps.settime64 = igb_ptp_settime_82576;
@@ -1131,7 +1131,7 @@ void igb_ptp_init(struct igb_adapter *adapter)
                adapter->ptp_caps.n_pins = IGB_N_SDP;
                adapter->ptp_caps.pps = 1;
                adapter->ptp_caps.pin_config = adapter->sdp_config;
-               adapter->ptp_caps.adjfreq = igb_ptp_adjfreq_82580;
+               adapter->ptp_caps.adjfine = igb_ptp_adjfine_82580;
                adapter->ptp_caps.adjtime = igb_ptp_adjtime_i210;
                adapter->ptp_caps.gettime64 = igb_ptp_gettime_i210;
                adapter->ptp_caps.settime64 = igb_ptp_settime_i210;