#define NVM_COMB_VER_OFF       0x0083
 #define NVM_COMB_VER_PTR       0x003d
 
+/* Transmit and receive latency (for PTP timestamps) */
+#define IGB_I210_TX_LATENCY_10         9542
+#define IGB_I210_TX_LATENCY_100                1024
+#define IGB_I210_TX_LATENCY_1000       178
+#define IGB_I210_RX_LATENCY_10         20662
+#define IGB_I210_RX_LATENCY_100                2213
+#define IGB_I210_RX_LATENCY_1000       448
+
 struct vf_data_storage {
        unsigned char vf_mac_addresses[ETH_ALEN];
        u16 vf_mc_hashes[IGB_MAX_VF_MC_ENTRIES];
 
        struct e1000_hw *hw = &adapter->hw;
        struct skb_shared_hwtstamps shhwtstamps;
        u64 regval;
+       int adjust = 0;
 
        regval = rd32(E1000_TXSTMPL);
        regval |= (u64)rd32(E1000_TXSTMPH) << 32;
 
        igb_ptp_systim_to_hwtstamp(adapter, &shhwtstamps, regval);
+       /* adjust timestamp for the TX latency based on link speed */
+       if (adapter->hw.mac.type == e1000_i210) {
+               switch (adapter->link_speed) {
+               case SPEED_10:
+                       adjust = IGB_I210_TX_LATENCY_10;
+                       break;
+               case SPEED_100:
+                       adjust = IGB_I210_TX_LATENCY_100;
+                       break;
+               case SPEED_1000:
+                       adjust = IGB_I210_TX_LATENCY_1000;
+                       break;
+               }
+       }
+
+       shhwtstamps.hwtstamp = ktime_sub_ns(shhwtstamps.hwtstamp, adjust);
+
        skb_tstamp_tx(adapter->ptp_tx_skb, &shhwtstamps);
        dev_kfree_skb_any(adapter->ptp_tx_skb);
        adapter->ptp_tx_skb = NULL;
        struct igb_adapter *adapter = q_vector->adapter;
        struct e1000_hw *hw = &adapter->hw;
        u64 regval;
+       int adjust = 0;
 
        /* If this bit is set, then the RX registers contain the time stamp. No
         * other packet will be time stamped until we read these registers, so
 
        igb_ptp_systim_to_hwtstamp(adapter, skb_hwtstamps(skb), regval);
 
+       /* adjust timestamp for the RX latency based on link speed */
+       if (adapter->hw.mac.type == e1000_i210) {
+               switch (adapter->link_speed) {
+               case SPEED_10:
+                       adjust = IGB_I210_RX_LATENCY_10;
+                       break;
+               case SPEED_100:
+                       adjust = IGB_I210_RX_LATENCY_100;
+                       break;
+               case SPEED_1000:
+                       adjust = IGB_I210_RX_LATENCY_1000;
+                       break;
+               }
+       }
+       skb_hwtstamps(skb)->hwtstamp =
+               ktime_add_ns(skb_hwtstamps(skb)->hwtstamp, adjust);
+
        /* Update the last_rx_timestamp timer in order to enable watchdog check
         * for error case of latched timestamp on a dropped packet.
         */