diff options
Diffstat (limited to 'drivers/net/ethernet/intel/igc/igc_ptp.c')
| -rw-r--r-- | drivers/net/ethernet/intel/igc/igc_ptp.c | 19 | 
1 files changed, 19 insertions, 0 deletions
| diff --git a/drivers/net/ethernet/intel/igc/igc_ptp.c b/drivers/net/ethernet/intel/igc/igc_ptp.c index 36c999250fcc..6a9b5102aa55 100644 --- a/drivers/net/ethernet/intel/igc/igc_ptp.c +++ b/drivers/net/ethernet/intel/igc/igc_ptp.c @@ -364,6 +364,7 @@ static void igc_ptp_tx_hwtstamp(struct igc_adapter *adapter)  	struct sk_buff *skb = adapter->ptp_tx_skb;  	struct skb_shared_hwtstamps shhwtstamps;  	struct igc_hw *hw = &adapter->hw; +	int adjust = 0;  	u64 regval;  	if (WARN_ON_ONCE(!skb)) @@ -373,6 +374,24 @@ static void igc_ptp_tx_hwtstamp(struct igc_adapter *adapter)  	regval |= (u64)rd32(IGC_TXSTMPH) << 32;  	igc_ptp_systim_to_hwtstamp(adapter, &shhwtstamps, regval); +	switch (adapter->link_speed) { +	case SPEED_10: +		adjust = IGC_I225_TX_LATENCY_10; +		break; +	case SPEED_100: +		adjust = IGC_I225_TX_LATENCY_100; +		break; +	case SPEED_1000: +		adjust = IGC_I225_TX_LATENCY_1000; +		break; +	case SPEED_2500: +		adjust = IGC_I225_TX_LATENCY_2500; +		break; +	} + +	shhwtstamps.hwtstamp = +		ktime_add_ns(shhwtstamps.hwtstamp, adjust); +  	/* Clear the lock early before calling skb_tstamp_tx so that  	 * applications are not woken up before the lock bit is clear. We use  	 * a copy of the skb pointer to ensure other threads can't change it |