Commit 8298c1ec authored by Richard Cochran's avatar Richard Cochran Committed by Jeff Kirsher

igb: serialize access to the time sync interrupt registers

The time sync related interrupt registers may be manipulated from
different contexts. This patch protects the registers from being
asynchronously changed by the reset function.

Also, the patch removes a misleading comment. The reset function
is disabling a bunch of functions, not enabling them.
Signed-off-by: default avatarRichard Cochran <richardcochran@gmail.com>
Tested-by: default avatarAaron Brown <aaron.f.brown@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 61d7f75f
...@@ -900,6 +900,7 @@ void igb_ptp_stop(struct igb_adapter *adapter) ...@@ -900,6 +900,7 @@ void igb_ptp_stop(struct igb_adapter *adapter)
void igb_ptp_reset(struct igb_adapter *adapter) void igb_ptp_reset(struct igb_adapter *adapter)
{ {
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
unsigned long flags;
if (!(adapter->flags & IGB_FLAG_PTP)) if (!(adapter->flags & IGB_FLAG_PTP))
return; return;
...@@ -907,6 +908,8 @@ void igb_ptp_reset(struct igb_adapter *adapter) ...@@ -907,6 +908,8 @@ void igb_ptp_reset(struct igb_adapter *adapter)
/* reset the tstamp_config */ /* reset the tstamp_config */
igb_ptp_set_timestamp_mode(adapter, &adapter->tstamp_config); igb_ptp_set_timestamp_mode(adapter, &adapter->tstamp_config);
spin_lock_irqsave(&adapter->tmreg_lock, flags);
switch (adapter->hw.mac.type) { switch (adapter->hw.mac.type) {
case e1000_82576: case e1000_82576:
/* Dial the nominal frequency. */ /* Dial the nominal frequency. */
...@@ -917,23 +920,24 @@ void igb_ptp_reset(struct igb_adapter *adapter) ...@@ -917,23 +920,24 @@ void igb_ptp_reset(struct igb_adapter *adapter)
case e1000_i350: case e1000_i350:
case e1000_i210: case e1000_i210:
case e1000_i211: case e1000_i211:
/* Enable the timer functions and interrupts. */
wr32(E1000_TSAUXC, 0x0); wr32(E1000_TSAUXC, 0x0);
wr32(E1000_TSIM, TSYNC_INTERRUPTS); wr32(E1000_TSIM, TSYNC_INTERRUPTS);
wr32(E1000_IMS, E1000_IMS_TS); wr32(E1000_IMS, E1000_IMS_TS);
break; break;
default: default:
/* No work to do. */ /* No work to do. */
return; goto out;
} }
/* Re-initialize the timer. */ /* Re-initialize the timer. */
if ((hw->mac.type == e1000_i210) || (hw->mac.type == e1000_i211)) { if ((hw->mac.type == e1000_i210) || (hw->mac.type == e1000_i211)) {
struct timespec ts = ktime_to_timespec(ktime_get_real()); struct timespec ts = ktime_to_timespec(ktime_get_real());
igb_ptp_settime_i210(&adapter->ptp_caps, &ts); igb_ptp_write_i210(adapter, &ts);
} else { } else {
timecounter_init(&adapter->tc, &adapter->cc, timecounter_init(&adapter->tc, &adapter->cc,
ktime_to_ns(ktime_get_real())); ktime_to_ns(ktime_get_real()));
} }
out:
spin_unlock_irqrestore(&adapter->tmreg_lock, flags);
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment