[Intel-wired-lan] [PATCH 10/27] ixgbe: Use timecounter_initialize interface

Sagar Arun Kamble sagar.a.kamble at intel.com
Fri Dec 15 07:38:25 UTC 2017


With new interface timecounter_initialize we can initialize timecounter
fields and underlying cyclecounter together. Update ixgbe ptp timecounter
init with this new function.

Signed-off-by: Sagar Arun Kamble <sagar.a.kamble at intel.com>
Cc: Richard Cochran <richardcochran at gmail.com>
Cc: Jeff Kirsher <jeffrey.t.kirsher at intel.com>
Cc: intel-wired-lan at lists.osuosl.org
Cc: netdev at vger.kernel.org
Cc: linux-kernel at vger.kernel.org
---
 drivers/net/ethernet/intel/ixgbe/ixgbe.h      |  6 +++-
 drivers/net/ethernet/intel/ixgbe/ixgbe_main.c |  4 +--
 drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c  | 45 +++++++++++++++------------
 3 files changed, 32 insertions(+), 23 deletions(-)

diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
index 5c391a0..67e8b5c 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
@@ -739,6 +739,10 @@ struct ixgbe_adapter {
 	unsigned long last_rx_timestamp;
 	spinlock_t tmreg_lock;
 	struct timecounter hw_tc;
+	u64 (*cc_read)(const struct cyclecounter *cc);
+	u64 cc_mask;
+	u32 cc_mult;
+	u32 cc_shift;
 	u32 base_incval;
 	u32 tx_hwtstamp_timeouts;
 	u32 tx_hwtstamp_skipped;
@@ -994,7 +998,7 @@ static inline void ixgbe_ptp_rx_hwtstamp(struct ixgbe_ring *rx_ring,
 
 int ixgbe_ptp_set_ts_config(struct ixgbe_adapter *adapter, struct ifreq *ifr);
 int ixgbe_ptp_get_ts_config(struct ixgbe_adapter *adapter, struct ifreq *ifr);
-void ixgbe_ptp_start_cyclecounter(struct ixgbe_adapter *adapter);
+void ixgbe_ptp_start_timecounter(struct ixgbe_adapter *adapter);
 void ixgbe_ptp_reset(struct ixgbe_adapter *adapter);
 void ixgbe_ptp_check_pps_event(struct ixgbe_adapter *adapter);
 #ifdef CONFIG_PCI_IOV
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
index 62a1891..86a337b 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
@@ -7332,7 +7332,7 @@ static void ixgbe_watchdog_link_is_up(struct ixgbe_adapter *adapter)
 	adapter->last_rx_ptp_check = jiffies;
 
 	if (test_bit(__IXGBE_PTP_RUNNING, &adapter->state))
-		ixgbe_ptp_start_cyclecounter(adapter);
+		ixgbe_ptp_start_timecounter(adapter);
 
 	switch (link_speed) {
 	case IXGBE_LINK_SPEED_10GB_FULL:
@@ -7400,7 +7400,7 @@ static void ixgbe_watchdog_link_is_down(struct ixgbe_adapter *adapter)
 		adapter->flags2 |= IXGBE_FLAG2_SEARCH_FOR_SFP;
 
 	if (test_bit(__IXGBE_PTP_RUNNING, &adapter->state))
-		ixgbe_ptp_start_cyclecounter(adapter);
+		ixgbe_ptp_start_timecounter(adapter);
 
 	e_info(drv, "NIC Link is Down\n");
 	netif_carrier_off(netdev);
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c
index 6e9f2c0..073c1ef 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c
@@ -1075,7 +1075,8 @@ static void ixgbe_ptp_link_speed_adjust(struct ixgbe_adapter *adapter,
 }
 
 /**
- * ixgbe_ptp_start_cyclecounter - create the cycle counter from hw
+ * ixgbe_ptp_start_timecounter - create the cycle counter from hw and
+ *				 initialize corresponding timecounter.
  * @adapter: pointer to the adapter structure
  *
  * This function should be called to set the proper values for the TIMINCA
@@ -1084,10 +1085,9 @@ static void ixgbe_ptp_link_speed_adjust(struct ixgbe_adapter *adapter,
  * structure. It should be called whenever a new TIMINCA value is necessary,
  * such as during initialization or when the link speed changes.
  */
-void ixgbe_ptp_start_cyclecounter(struct ixgbe_adapter *adapter)
+void ixgbe_ptp_start_timecounter(struct ixgbe_adapter *adapter)
 {
 	struct ixgbe_hw *hw = &adapter->hw;
-	struct cyclecounter cc;
 	unsigned long flags;
 	u32 incval = 0;
 	u32 tsauxc = 0;
@@ -1104,9 +1104,9 @@ void ixgbe_ptp_start_cyclecounter(struct ixgbe_adapter *adapter)
 	 * proper fix to this problem would require modification of the
 	 * timecounter delta calculations.
 	 */
-	cc.mask = CLOCKSOURCE_MASK(64);
-	cc.mult = 1;
-	cc.shift = 0;
+	adapter->cc_mask = CLOCKSOURCE_MASK(64);
+	adapter->cc_mult = 1;
+	adapter->cc_shift = 0;
 
 	switch (hw->mac.type) {
 	case ixgbe_mac_X550EM_x:
@@ -1118,13 +1118,13 @@ void ixgbe_ptp_start_cyclecounter(struct ixgbe_adapter *adapter)
 		 */
 		fuse0 = IXGBE_READ_REG(hw, IXGBE_FUSES0_GROUP(0));
 		if (!(fuse0 & IXGBE_FUSES0_300MHZ)) {
-			cc.mult = 3;
-			cc.shift = 2;
+			adapter->cc_mult = 3;
+			adapter->cc_shift = 2;
 		}
 		/* fallthrough */
 	case ixgbe_mac_x550em_a:
 	case ixgbe_mac_X550:
-		cc.read = ixgbe_ptp_read_X550;
+		adapter->cc_read = ixgbe_ptp_read_X550;
 
 		/* enable SYSTIME counter */
 		IXGBE_WRITE_REG(hw, IXGBE_SYSTIMR, 0);
@@ -1139,17 +1139,21 @@ void ixgbe_ptp_start_cyclecounter(struct ixgbe_adapter *adapter)
 		IXGBE_WRITE_FLUSH(hw);
 		break;
 	case ixgbe_mac_X540:
-		cc.read = ixgbe_ptp_read_82599;
+		adapter->cc_read = ixgbe_ptp_read_82599;
 
-		ixgbe_ptp_link_speed_adjust(adapter, &cc.shift, &incval);
+		ixgbe_ptp_link_speed_adjust(adapter,
+					    &adapter->cc_shift,
+					    &incval);
 		IXGBE_WRITE_REG(hw, IXGBE_TIMINCA, incval);
 		break;
 	case ixgbe_mac_82599EB:
-		cc.read = ixgbe_ptp_read_82599;
+		adapter->cc_read = ixgbe_ptp_read_82599;
 
-		ixgbe_ptp_link_speed_adjust(adapter, &cc.shift, &incval);
+		ixgbe_ptp_link_speed_adjust(adapter,
+					    &adapter->cc_shift,
+					    &incval);
 		incval >>= IXGBE_INCVAL_SHIFT_82599;
-		cc.shift -= IXGBE_INCVAL_SHIFT_82599;
+		adapter->cc_shift -= IXGBE_INCVAL_SHIFT_82599;
 		IXGBE_WRITE_REG(hw, IXGBE_TIMINCA,
 				BIT(IXGBE_INCPER_SHIFT_82599) | incval);
 		break;
@@ -1164,7 +1168,12 @@ void ixgbe_ptp_start_cyclecounter(struct ixgbe_adapter *adapter)
 
 	/* need lock to prevent incorrect read while modifying cyclecounter */
 	spin_lock_irqsave(&adapter->tmreg_lock, flags);
-	memcpy(&adapter->hw_tc.cc, &cc, sizeof(adapter->hw_tc.cc));
+	timecounter_initialize(&adapter->tc,
+			       adapter->cc_read,
+			       adapter->cc_mask,
+			       adapter->cc_mult,
+			       adapter->cc_shift,
+			       ktime_to_ns(ktime_get_real()));
 	spin_unlock_irqrestore(&adapter->tmreg_lock, flags);
 }
 
@@ -1192,11 +1201,7 @@ void ixgbe_ptp_reset(struct ixgbe_adapter *adapter)
 	if (hw->mac.type == ixgbe_mac_82598EB)
 		return;
 
-	ixgbe_ptp_start_cyclecounter(adapter);
-
-	spin_lock_irqsave(&adapter->tmreg_lock, flags);
-	timecounter_init(&adapter->hw_tc, ktime_to_ns(ktime_get_real()));
-	spin_unlock_irqrestore(&adapter->tmreg_lock, flags);
+	ixgbe_ptp_start_timecounter(adapter);
 
 	adapter->last_overflow_check = jiffies;
 
-- 
1.9.1



More information about the Intel-wired-lan mailing list