diff options
author | Jacob Keller <jacob.e.keller@intel.com> | 2016-09-09 12:10:51 -0400 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2016-09-27 22:00:52 -0400 |
commit | ac28b41aac35e1000712aaa3aee19bf30fd9a312 (patch) | |
tree | b2cbfb10e945b8f88a7276aca18b66cde15476f8 | |
parent | 0742337c1984c7cdbac9465cdda004cbdc69d41c (diff) |
igb: restore PPS signal on igb_ptp_reset
When a reset occurs, the PPS SYS_WRAP interrupt was not re-enabled which
resulted in disabling of the PPS signaling. Fix this by recording when
the interrupt is on and ensuring that we re-enable it every time we
reset.
Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
-rw-r--r-- | drivers/net/ethernet/intel/igb/igb.h | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/igb/igb_ptp.c | 5 |
2 files changed, 5 insertions, 1 deletions
diff --git a/drivers/net/ethernet/intel/igb/igb.h b/drivers/net/ethernet/intel/igb/igb.h index 03fbe4b7663b..d11093dce1b9 100644 --- a/drivers/net/ethernet/intel/igb/igb.h +++ b/drivers/net/ethernet/intel/igb/igb.h | |||
@@ -489,6 +489,7 @@ struct igb_adapter { | |||
489 | struct timecounter tc; | 489 | struct timecounter tc; |
490 | u32 tx_hwtstamp_timeouts; | 490 | u32 tx_hwtstamp_timeouts; |
491 | u32 rx_hwtstamp_cleared; | 491 | u32 rx_hwtstamp_cleared; |
492 | bool pps_sys_wrap_on; | ||
492 | 493 | ||
493 | struct ptp_pin_desc sdp_config[IGB_N_SDP]; | 494 | struct ptp_pin_desc sdp_config[IGB_N_SDP]; |
494 | struct { | 495 | struct { |
diff --git a/drivers/net/ethernet/intel/igb/igb_ptp.c b/drivers/net/ethernet/intel/igb/igb_ptp.c index 1dd14e166dc8..a7895c4cbcc3 100644 --- a/drivers/net/ethernet/intel/igb/igb_ptp.c +++ b/drivers/net/ethernet/intel/igb/igb_ptp.c | |||
@@ -591,6 +591,7 @@ static int igb_ptp_feature_enable_i210(struct ptp_clock_info *ptp, | |||
591 | tsim |= TSINTR_SYS_WRAP; | 591 | tsim |= TSINTR_SYS_WRAP; |
592 | else | 592 | else |
593 | tsim &= ~TSINTR_SYS_WRAP; | 593 | tsim &= ~TSINTR_SYS_WRAP; |
594 | igb->pps_sys_wrap_on = !!on; | ||
594 | wr32(E1000_TSIM, tsim); | 595 | wr32(E1000_TSIM, tsim); |
595 | spin_unlock_irqrestore(&igb->tmreg_lock, flags); | 596 | spin_unlock_irqrestore(&igb->tmreg_lock, flags); |
596 | return 0; | 597 | return 0; |
@@ -1235,7 +1236,9 @@ void igb_ptp_reset(struct igb_adapter *adapter) | |||
1235 | case e1000_i211: | 1236 | case e1000_i211: |
1236 | wr32(E1000_TSAUXC, 0x0); | 1237 | wr32(E1000_TSAUXC, 0x0); |
1237 | wr32(E1000_TSSDP, 0x0); | 1238 | wr32(E1000_TSSDP, 0x0); |
1238 | wr32(E1000_TSIM, TSYNC_INTERRUPTS); | 1239 | wr32(E1000_TSIM, |
1240 | TSYNC_INTERRUPTS | | ||
1241 | (adapter->pps_sys_wrap_on ? TSINTR_SYS_WRAP : 0)); | ||
1239 | wr32(E1000_IMS, E1000_IMS_TS); | 1242 | wr32(E1000_IMS, E1000_IMS_TS); |
1240 | break; | 1243 | break; |
1241 | default: | 1244 | default: |