diff options
Diffstat (limited to 'drivers/net/ethernet/intel/igb/igb_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/igb/igb_main.c | 8 | 
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index 58872a4c2540..bb3db387d49c 100644 --- a/drivers/net/ethernet/intel/igb/igb_main.c +++ b/drivers/net/ethernet/intel/igb/igb_main.c @@ -6947,6 +6947,7 @@ static void igb_extts(struct igb_adapter *adapter, int tsintr_tt)  	struct e1000_hw *hw = &adapter->hw;  	struct ptp_clock_event event;  	struct timespec64 ts; +	unsigned long flags;  	if (pin < 0 || pin >= IGB_N_SDP)  		return; @@ -6954,9 +6955,12 @@ static void igb_extts(struct igb_adapter *adapter, int tsintr_tt)  	if (hw->mac.type == e1000_82580 ||  	    hw->mac.type == e1000_i354 ||  	    hw->mac.type == e1000_i350) { -		s64 ns = rd32(auxstmpl); +		u64 ns = rd32(auxstmpl); -		ns += ((s64)(rd32(auxstmph) & 0xFF)) << 32; +		ns += ((u64)(rd32(auxstmph) & 0xFF)) << 32; +		spin_lock_irqsave(&adapter->tmreg_lock, flags); +		ns = timecounter_cyc2time(&adapter->tc, ns); +		spin_unlock_irqrestore(&adapter->tmreg_lock, flags);  		ts = ns_to_timespec64(ns);  	} else {  		ts.tv_nsec = rd32(auxstmpl);  | 
