diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_main.c | 29 | 
1 files changed, 21 insertions, 8 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c index 62e91512aeab..314a42808e39 100644 --- a/drivers/net/ethernet/intel/ice/ice_main.c +++ b/drivers/net/ethernet/intel/ice/ice_main.c @@ -3139,20 +3139,28 @@ static irqreturn_t ice_misc_intr(int __always_unused irq, void *data)  	if (oicr & PFINT_OICR_TSYN_TX_M) {  		ena_mask &= ~PFINT_OICR_TSYN_TX_M; -		if (!hw->reset_ongoing) +		if (!hw->reset_ongoing) { +			set_bit(ICE_MISC_THREAD_TX_TSTAMP, pf->misc_thread);  			ret = IRQ_WAKE_THREAD; +		}  	}  	if (oicr & PFINT_OICR_TSYN_EVNT_M) {  		u8 tmr_idx = hw->func_caps.ts_func_info.tmr_index_owned;  		u32 gltsyn_stat = rd32(hw, GLTSYN_STAT(tmr_idx)); -		/* Save EVENTs from GTSYN register */ -		pf->ptp.ext_ts_irq |= gltsyn_stat & (GLTSYN_STAT_EVENT0_M | -						     GLTSYN_STAT_EVENT1_M | -						     GLTSYN_STAT_EVENT2_M);  		ena_mask &= ~PFINT_OICR_TSYN_EVNT_M; -		kthread_queue_work(pf->ptp.kworker, &pf->ptp.extts_work); + +		if (hw->func_caps.ts_func_info.src_tmr_owned) { +			/* Save EVENTs from GLTSYN register */ +			pf->ptp.ext_ts_irq |= gltsyn_stat & +					      (GLTSYN_STAT_EVENT0_M | +					       GLTSYN_STAT_EVENT1_M | +					       GLTSYN_STAT_EVENT2_M); + +			set_bit(ICE_MISC_THREAD_EXTTS_EVENT, pf->misc_thread); +			ret = IRQ_WAKE_THREAD; +		}  	}  #define ICE_AUX_CRIT_ERR (PFINT_OICR_PE_CRITERR_M | PFINT_OICR_HMC_ERR_M | PFINT_OICR_PE_PUSH_M) @@ -3196,8 +3204,13 @@ static irqreturn_t ice_misc_intr_thread_fn(int __always_unused irq, void *data)  	if (ice_is_reset_in_progress(pf->state))  		return IRQ_HANDLED; -	while (!ice_ptp_process_ts(pf)) -		usleep_range(50, 100); +	if (test_and_clear_bit(ICE_MISC_THREAD_EXTTS_EVENT, pf->misc_thread)) +		ice_ptp_extts_event(pf); + +	if (test_and_clear_bit(ICE_MISC_THREAD_TX_TSTAMP, pf->misc_thread)) { +		while (!ice_ptp_process_ts(pf)) +			usleep_range(50, 100); +	}  	return IRQ_HANDLED;  }  | 
