aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/intel/igb
diff options
context:
space:
mode:
authorNathan Sullivan <nathan.sullivan@ni.com>2016-05-03 19:10:56 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2016-05-13 18:02:08 -0400
commit3f544d2a4d5c2d817cfee9e6302fc2909aaef155 (patch)
treee77484b0df8a584939a8df9f613008714b518efd /drivers/net/ethernet/intel/igb
parentab507c9a54ce3580e6a3829c9f4c24a13c32cbac (diff)
igb: adjust PTP timestamps for Tx/Rx latency
Table 7-62 on page 338 of the i210 datasheet lists TX and RX latencies for the various speeds the chip supports. To give better PTP timestamp accuracy, adjust the timestamps by the amounts Intel gives based on current link speed. Signed-off-by: Nathan Sullivan <nathan.sullivan@ni.com> Tested-by: Aaron Brown <aaron.f.brown@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net/ethernet/intel/igb')
-rw-r--r--drivers/net/ethernet/intel/igb/igb.h8
-rw-r--r--drivers/net/ethernet/intel/igb/igb_ptp.c36
2 files changed, 44 insertions, 0 deletions
diff --git a/drivers/net/ethernet/intel/igb/igb.h b/drivers/net/ethernet/intel/igb/igb.h
index 7a7bc31493a5..b9609afa5ca3 100644
--- a/drivers/net/ethernet/intel/igb/igb.h
+++ b/drivers/net/ethernet/intel/igb/igb.h
@@ -91,6 +91,14 @@ struct igb_adapter;
91#define NVM_COMB_VER_OFF 0x0083 91#define NVM_COMB_VER_OFF 0x0083
92#define NVM_COMB_VER_PTR 0x003d 92#define NVM_COMB_VER_PTR 0x003d
93 93
94/* Transmit and receive latency (for PTP timestamps) */
95#define IGB_I210_TX_LATENCY_10 9542
96#define IGB_I210_TX_LATENCY_100 1024
97#define IGB_I210_TX_LATENCY_1000 178
98#define IGB_I210_RX_LATENCY_10 20662
99#define IGB_I210_RX_LATENCY_100 2213
100#define IGB_I210_RX_LATENCY_1000 448
101
94struct vf_data_storage { 102struct vf_data_storage {
95 unsigned char vf_mac_addresses[ETH_ALEN]; 103 unsigned char vf_mac_addresses[ETH_ALEN];
96 u16 vf_mc_hashes[IGB_MAX_VF_MC_ENTRIES]; 104 u16 vf_mc_hashes[IGB_MAX_VF_MC_ENTRIES];
diff --git a/drivers/net/ethernet/intel/igb/igb_ptp.c b/drivers/net/ethernet/intel/igb/igb_ptp.c
index fdb6dfd3ab77..f097c5a8ab93 100644
--- a/drivers/net/ethernet/intel/igb/igb_ptp.c
+++ b/drivers/net/ethernet/intel/igb/igb_ptp.c
@@ -722,11 +722,29 @@ static void igb_ptp_tx_hwtstamp(struct igb_adapter *adapter)
722 struct e1000_hw *hw = &adapter->hw; 722 struct e1000_hw *hw = &adapter->hw;
723 struct skb_shared_hwtstamps shhwtstamps; 723 struct skb_shared_hwtstamps shhwtstamps;
724 u64 regval; 724 u64 regval;
725 int adjust = 0;
725 726
726 regval = rd32(E1000_TXSTMPL); 727 regval = rd32(E1000_TXSTMPL);
727 regval |= (u64)rd32(E1000_TXSTMPH) << 32; 728 regval |= (u64)rd32(E1000_TXSTMPH) << 32;
728 729
729 igb_ptp_systim_to_hwtstamp(adapter, &shhwtstamps, regval); 730 igb_ptp_systim_to_hwtstamp(adapter, &shhwtstamps, regval);
731 /* adjust timestamp for the TX latency based on link speed */
732 if (adapter->hw.mac.type == e1000_i210) {
733 switch (adapter->link_speed) {
734 case SPEED_10:
735 adjust = IGB_I210_TX_LATENCY_10;
736 break;
737 case SPEED_100:
738 adjust = IGB_I210_TX_LATENCY_100;
739 break;
740 case SPEED_1000:
741 adjust = IGB_I210_TX_LATENCY_1000;
742 break;
743 }
744 }
745
746 shhwtstamps.hwtstamp = ktime_sub_ns(shhwtstamps.hwtstamp, adjust);
747
730 skb_tstamp_tx(adapter->ptp_tx_skb, &shhwtstamps); 748 skb_tstamp_tx(adapter->ptp_tx_skb, &shhwtstamps);
731 dev_kfree_skb_any(adapter->ptp_tx_skb); 749 dev_kfree_skb_any(adapter->ptp_tx_skb);
732 adapter->ptp_tx_skb = NULL; 750 adapter->ptp_tx_skb = NULL;
@@ -771,6 +789,7 @@ void igb_ptp_rx_rgtstamp(struct igb_q_vector *q_vector,
771 struct igb_adapter *adapter = q_vector->adapter; 789 struct igb_adapter *adapter = q_vector->adapter;
772 struct e1000_hw *hw = &adapter->hw; 790 struct e1000_hw *hw = &adapter->hw;
773 u64 regval; 791 u64 regval;
792 int adjust = 0;
774 793
775 /* If this bit is set, then the RX registers contain the time stamp. No 794 /* If this bit is set, then the RX registers contain the time stamp. No
776 * other packet will be time stamped until we read these registers, so 795 * other packet will be time stamped until we read these registers, so
@@ -790,6 +809,23 @@ void igb_ptp_rx_rgtstamp(struct igb_q_vector *q_vector,
790 809
791 igb_ptp_systim_to_hwtstamp(adapter, skb_hwtstamps(skb), regval); 810 igb_ptp_systim_to_hwtstamp(adapter, skb_hwtstamps(skb), regval);
792 811
812 /* adjust timestamp for the RX latency based on link speed */
813 if (adapter->hw.mac.type == e1000_i210) {
814 switch (adapter->link_speed) {
815 case SPEED_10:
816 adjust = IGB_I210_RX_LATENCY_10;
817 break;
818 case SPEED_100:
819 adjust = IGB_I210_RX_LATENCY_100;
820 break;
821 case SPEED_1000:
822 adjust = IGB_I210_RX_LATENCY_1000;
823 break;
824 }
825 }
826 skb_hwtstamps(skb)->hwtstamp =
827 ktime_add_ns(skb_hwtstamps(skb)->hwtstamp, adjust);
828
793 /* Update the last_rx_timestamp timer in order to enable watchdog check 829 /* Update the last_rx_timestamp timer in order to enable watchdog check
794 * for error case of latched timestamp on a dropped packet. 830 * for error case of latched timestamp on a dropped packet.
795 */ 831 */