diff options
author | David S. Miller <davem@davemloft.net> | 2012-10-04 15:49:16 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-10-04 15:49:16 -0400 |
commit | e7b565e73d94e42619bbab7ea1ab5626d1952701 (patch) | |
tree | 41da721dc5203eab4b4bdb8297c9aef602ee77c4 /drivers/net | |
parent | f4ef85bbda96324785097356336bc79cdd37db0a (diff) | |
parent | df376f0de167754da9b3ece4afdb5bb8bf3fbf3e (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net
Jeff Kirsher says:
====================
This series contains fixes/updates to ixgbe only. There are three
PTP fixes, polling loop fix and the addition of a device id (X540-AT1).
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_common.c | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c | 5 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 15 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c | 202 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_type.h | 1 |
6 files changed, 112 insertions, 114 deletions
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c index 18bf08c9d7a4..1077cb2b38db 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c | |||
@@ -1099,7 +1099,7 @@ s32 ixgbe_reinit_fdir_tables_82599(struct ixgbe_hw *hw) | |||
1099 | if (IXGBE_READ_REG(hw, IXGBE_FDIRCTRL) & | 1099 | if (IXGBE_READ_REG(hw, IXGBE_FDIRCTRL) & |
1100 | IXGBE_FDIRCTRL_INIT_DONE) | 1100 | IXGBE_FDIRCTRL_INIT_DONE) |
1101 | break; | 1101 | break; |
1102 | udelay(10); | 1102 | usleep_range(1000, 2000); |
1103 | } | 1103 | } |
1104 | if (i >= IXGBE_FDIR_INIT_DONE_POLL) { | 1104 | if (i >= IXGBE_FDIR_INIT_DONE_POLL) { |
1105 | hw_dbg(hw, "Flow Director Signature poll time exceeded!\n"); | 1105 | hw_dbg(hw, "Flow Director Signature poll time exceeded!\n"); |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c index 90e41db3cb69..dbf37e4a45fd 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c | |||
@@ -70,6 +70,7 @@ static s32 ixgbe_device_supports_autoneg_fc(struct ixgbe_hw *hw) | |||
70 | 70 | ||
71 | switch (hw->device_id) { | 71 | switch (hw->device_id) { |
72 | case IXGBE_DEV_ID_X540T: | 72 | case IXGBE_DEV_ID_X540T: |
73 | case IXGBE_DEV_ID_X540T1: | ||
73 | return 0; | 74 | return 0; |
74 | case IXGBE_DEV_ID_82599_T3_LOM: | 75 | case IXGBE_DEV_ID_82599_T3_LOM: |
75 | return 0; | 76 | return 0; |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c index 4104ea25d818..56b20d17d0e4 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c | |||
@@ -2690,10 +2690,7 @@ static int ixgbe_get_ts_info(struct net_device *dev, | |||
2690 | (1 << HWTSTAMP_FILTER_NONE) | | 2690 | (1 << HWTSTAMP_FILTER_NONE) | |
2691 | (1 << HWTSTAMP_FILTER_PTP_V1_L4_SYNC) | | 2691 | (1 << HWTSTAMP_FILTER_PTP_V1_L4_SYNC) | |
2692 | (1 << HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ) | | 2692 | (1 << HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ) | |
2693 | (1 << HWTSTAMP_FILTER_PTP_V2_SYNC) | | 2693 | (1 << HWTSTAMP_FILTER_PTP_V2_EVENT); |
2694 | (1 << HWTSTAMP_FILTER_PTP_V2_DELAY_REQ) | | ||
2695 | (1 << HWTSTAMP_FILTER_PTP_V2_EVENT) | | ||
2696 | (1 << HWTSTAMP_FILTER_SOME); | ||
2697 | break; | 2694 | break; |
2698 | #endif /* CONFIG_IXGBE_PTP */ | 2695 | #endif /* CONFIG_IXGBE_PTP */ |
2699 | default: | 2696 | default: |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index 868af6938219..fa3d552e1f4a 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | |||
@@ -114,6 +114,7 @@ static DEFINE_PCI_DEVICE_TABLE(ixgbe_pci_tbl) = { | |||
114 | {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_LS), board_82599 }, | 114 | {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_LS), board_82599 }, |
115 | {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599EN_SFP), board_82599 }, | 115 | {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599EN_SFP), board_82599 }, |
116 | {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_SFP_SF_QP), board_82599 }, | 116 | {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_SFP_SF_QP), board_82599 }, |
117 | {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_X540T1), board_X540 }, | ||
117 | /* required last entry */ | 118 | /* required last entry */ |
118 | {0, } | 119 | {0, } |
119 | }; | 120 | }; |
@@ -2322,6 +2323,12 @@ static inline void ixgbe_irq_enable(struct ixgbe_adapter *adapter, bool queues, | |||
2322 | default: | 2323 | default: |
2323 | break; | 2324 | break; |
2324 | } | 2325 | } |
2326 | |||
2327 | #ifdef CONFIG_IXGBE_PTP | ||
2328 | if (adapter->hw.mac.type == ixgbe_mac_X540) | ||
2329 | mask |= IXGBE_EIMS_TIMESYNC; | ||
2330 | #endif | ||
2331 | |||
2325 | if ((adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE) && | 2332 | if ((adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE) && |
2326 | !(adapter->flags2 & IXGBE_FLAG2_FDIR_REQUIRES_REINIT)) | 2333 | !(adapter->flags2 & IXGBE_FLAG2_FDIR_REQUIRES_REINIT)) |
2327 | mask |= IXGBE_EIMS_FLOW_DIR; | 2334 | mask |= IXGBE_EIMS_FLOW_DIR; |
@@ -2385,8 +2392,10 @@ static irqreturn_t ixgbe_msix_other(int irq, void *data) | |||
2385 | } | 2392 | } |
2386 | 2393 | ||
2387 | ixgbe_check_fan_failure(adapter, eicr); | 2394 | ixgbe_check_fan_failure(adapter, eicr); |
2395 | |||
2388 | #ifdef CONFIG_IXGBE_PTP | 2396 | #ifdef CONFIG_IXGBE_PTP |
2389 | ixgbe_ptp_check_pps_event(adapter, eicr); | 2397 | if (unlikely(eicr & IXGBE_EICR_TIMESYNC)) |
2398 | ixgbe_ptp_check_pps_event(adapter, eicr); | ||
2390 | #endif | 2399 | #endif |
2391 | 2400 | ||
2392 | /* re-enable the original interrupt state, no lsc, no queues */ | 2401 | /* re-enable the original interrupt state, no lsc, no queues */ |
@@ -2580,7 +2589,8 @@ static irqreturn_t ixgbe_intr(int irq, void *data) | |||
2580 | 2589 | ||
2581 | ixgbe_check_fan_failure(adapter, eicr); | 2590 | ixgbe_check_fan_failure(adapter, eicr); |
2582 | #ifdef CONFIG_IXGBE_PTP | 2591 | #ifdef CONFIG_IXGBE_PTP |
2583 | ixgbe_ptp_check_pps_event(adapter, eicr); | 2592 | if (unlikely(eicr & IXGBE_EICR_TIMESYNC)) |
2593 | ixgbe_ptp_check_pps_event(adapter, eicr); | ||
2584 | #endif | 2594 | #endif |
2585 | 2595 | ||
2586 | /* would disable interrupts here but EIAM disabled it */ | 2596 | /* would disable interrupts here but EIAM disabled it */ |
@@ -7045,6 +7055,7 @@ int ixgbe_wol_supported(struct ixgbe_adapter *adapter, u16 device_id, | |||
7045 | is_wol_supported = 1; | 7055 | is_wol_supported = 1; |
7046 | break; | 7056 | break; |
7047 | case IXGBE_DEV_ID_X540T: | 7057 | case IXGBE_DEV_ID_X540T: |
7058 | case IXGBE_DEV_ID_X540T1: | ||
7048 | /* check eeprom to see if enabled wol */ | 7059 | /* check eeprom to see if enabled wol */ |
7049 | if ((wol_cap == IXGBE_DEVICE_CAPS_WOL_PORT0_1) || | 7060 | if ((wol_cap == IXGBE_DEVICE_CAPS_WOL_PORT0_1) || |
7050 | ((wol_cap == IXGBE_DEVICE_CAPS_WOL_PORT0) && | 7061 | ((wol_cap == IXGBE_DEVICE_CAPS_WOL_PORT0) && |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c index 39881cb17a4b..d9291316ee9f 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c | |||
@@ -106,6 +106,83 @@ static struct sock_filter ptp_filter[] = { | |||
106 | }; | 106 | }; |
107 | 107 | ||
108 | /** | 108 | /** |
109 | * ixgbe_ptp_setup_sdp | ||
110 | * @hw: the hardware private structure | ||
111 | * | ||
112 | * this function enables or disables the clock out feature on SDP0 for | ||
113 | * the X540 device. It will create a 1second periodic output that can | ||
114 | * be used as the PPS (via an interrupt). | ||
115 | * | ||
116 | * It calculates when the systime will be on an exact second, and then | ||
117 | * aligns the start of the PPS signal to that value. The shift is | ||
118 | * necessary because it can change based on the link speed. | ||
119 | */ | ||
120 | static void ixgbe_ptp_setup_sdp(struct ixgbe_adapter *adapter) | ||
121 | { | ||
122 | struct ixgbe_hw *hw = &adapter->hw; | ||
123 | int shift = adapter->cc.shift; | ||
124 | u32 esdp, tsauxc, clktiml, clktimh, trgttiml, trgttimh, rem; | ||
125 | u64 ns = 0, clock_edge = 0; | ||
126 | |||
127 | if ((adapter->flags2 & IXGBE_FLAG2_PTP_PPS_ENABLED) && | ||
128 | (hw->mac.type == ixgbe_mac_X540)) { | ||
129 | |||
130 | /* disable the pin first */ | ||
131 | IXGBE_WRITE_REG(hw, IXGBE_TSAUXC, 0x0); | ||
132 | IXGBE_WRITE_FLUSH(hw); | ||
133 | |||
134 | esdp = IXGBE_READ_REG(hw, IXGBE_ESDP); | ||
135 | |||
136 | /* | ||
137 | * enable the SDP0 pin as output, and connected to the | ||
138 | * native function for Timesync (ClockOut) | ||
139 | */ | ||
140 | esdp |= (IXGBE_ESDP_SDP0_DIR | | ||
141 | IXGBE_ESDP_SDP0_NATIVE); | ||
142 | |||
143 | /* | ||
144 | * enable the Clock Out feature on SDP0, and allow | ||
145 | * interrupts to occur when the pin changes | ||
146 | */ | ||
147 | tsauxc = (IXGBE_TSAUXC_EN_CLK | | ||
148 | IXGBE_TSAUXC_SYNCLK | | ||
149 | IXGBE_TSAUXC_SDP0_INT); | ||
150 | |||
151 | /* clock period (or pulse length) */ | ||
152 | clktiml = (u32)(NSECS_PER_SEC << shift); | ||
153 | clktimh = (u32)((NSECS_PER_SEC << shift) >> 32); | ||
154 | |||
155 | /* | ||
156 | * Account for the cyclecounter wrap-around value by | ||
157 | * using the converted ns value of the current time to | ||
158 | * check for when the next aligned second would occur. | ||
159 | */ | ||
160 | clock_edge |= (u64)IXGBE_READ_REG(hw, IXGBE_SYSTIML); | ||
161 | clock_edge |= (u64)IXGBE_READ_REG(hw, IXGBE_SYSTIMH) << 32; | ||
162 | ns = timecounter_cyc2time(&adapter->tc, clock_edge); | ||
163 | |||
164 | div_u64_rem(ns, NSECS_PER_SEC, &rem); | ||
165 | clock_edge += ((NSECS_PER_SEC - (u64)rem) << shift); | ||
166 | |||
167 | /* specify the initial clock start time */ | ||
168 | trgttiml = (u32)clock_edge; | ||
169 | trgttimh = (u32)(clock_edge >> 32); | ||
170 | |||
171 | IXGBE_WRITE_REG(hw, IXGBE_CLKTIML, clktiml); | ||
172 | IXGBE_WRITE_REG(hw, IXGBE_CLKTIMH, clktimh); | ||
173 | IXGBE_WRITE_REG(hw, IXGBE_TRGTTIML0, trgttiml); | ||
174 | IXGBE_WRITE_REG(hw, IXGBE_TRGTTIMH0, trgttimh); | ||
175 | |||
176 | IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp); | ||
177 | IXGBE_WRITE_REG(hw, IXGBE_TSAUXC, tsauxc); | ||
178 | } else { | ||
179 | IXGBE_WRITE_REG(hw, IXGBE_TSAUXC, 0x0); | ||
180 | } | ||
181 | |||
182 | IXGBE_WRITE_FLUSH(hw); | ||
183 | } | ||
184 | |||
185 | /** | ||
109 | * ixgbe_ptp_read - read raw cycle counter (to be used by time counter) | 186 | * ixgbe_ptp_read - read raw cycle counter (to be used by time counter) |
110 | * @cc: the cyclecounter structure | 187 | * @cc: the cyclecounter structure |
111 | * | 188 | * |
@@ -198,6 +275,9 @@ static int ixgbe_ptp_adjtime(struct ptp_clock_info *ptp, s64 delta) | |||
198 | now); | 275 | now); |
199 | 276 | ||
200 | spin_unlock_irqrestore(&adapter->tmreg_lock, flags); | 277 | spin_unlock_irqrestore(&adapter->tmreg_lock, flags); |
278 | |||
279 | ixgbe_ptp_setup_sdp(adapter); | ||
280 | |||
201 | return 0; | 281 | return 0; |
202 | } | 282 | } |
203 | 283 | ||
@@ -251,6 +331,7 @@ static int ixgbe_ptp_settime(struct ptp_clock_info *ptp, | |||
251 | timecounter_init(&adapter->tc, &adapter->cc, ns); | 331 | timecounter_init(&adapter->tc, &adapter->cc, ns); |
252 | spin_unlock_irqrestore(&adapter->tmreg_lock, flags); | 332 | spin_unlock_irqrestore(&adapter->tmreg_lock, flags); |
253 | 333 | ||
334 | ixgbe_ptp_setup_sdp(adapter); | ||
254 | return 0; | 335 | return 0; |
255 | } | 336 | } |
256 | 337 | ||
@@ -281,8 +362,9 @@ static int ixgbe_ptp_enable(struct ptp_clock_info *ptp, | |||
281 | if (on) | 362 | if (on) |
282 | adapter->flags2 |= IXGBE_FLAG2_PTP_PPS_ENABLED; | 363 | adapter->flags2 |= IXGBE_FLAG2_PTP_PPS_ENABLED; |
283 | else | 364 | else |
284 | adapter->flags2 &= | 365 | adapter->flags2 &= ~IXGBE_FLAG2_PTP_PPS_ENABLED; |
285 | ~IXGBE_FLAG2_PTP_PPS_ENABLED; | 366 | |
367 | ixgbe_ptp_setup_sdp(adapter); | ||
286 | return 0; | 368 | return 0; |
287 | default: | 369 | default: |
288 | break; | 370 | break; |
@@ -305,109 +387,15 @@ void ixgbe_ptp_check_pps_event(struct ixgbe_adapter *adapter, u32 eicr) | |||
305 | struct ixgbe_hw *hw = &adapter->hw; | 387 | struct ixgbe_hw *hw = &adapter->hw; |
306 | struct ptp_clock_event event; | 388 | struct ptp_clock_event event; |
307 | 389 | ||
308 | event.type = PTP_CLOCK_PPS; | ||
309 | |||
310 | /* Make sure ptp clock is valid, and PPS event enabled */ | ||
311 | if (!adapter->ptp_clock || | ||
312 | !(adapter->flags2 & IXGBE_FLAG2_PTP_PPS_ENABLED)) | ||
313 | return; | ||
314 | |||
315 | if (unlikely(eicr & IXGBE_EICR_TIMESYNC)) { | ||
316 | switch (hw->mac.type) { | ||
317 | case ixgbe_mac_X540: | ||
318 | ptp_clock_event(adapter->ptp_clock, &event); | ||
319 | break; | ||
320 | default: | ||
321 | break; | ||
322 | } | ||
323 | } | ||
324 | } | ||
325 | |||
326 | /** | ||
327 | * ixgbe_ptp_enable_sdp | ||
328 | * @hw: the hardware private structure | ||
329 | * @shift: the clock shift for calculating nanoseconds | ||
330 | * | ||
331 | * this function enables the clock out feature on the sdp0 for the | ||
332 | * X540 device. It will create a 1second periodic output that can be | ||
333 | * used as the PPS (via an interrupt). | ||
334 | * | ||
335 | * It calculates when the systime will be on an exact second, and then | ||
336 | * aligns the start of the PPS signal to that value. The shift is | ||
337 | * necessary because it can change based on the link speed. | ||
338 | */ | ||
339 | static void ixgbe_ptp_enable_sdp(struct ixgbe_hw *hw, int shift) | ||
340 | { | ||
341 | u32 esdp, tsauxc, clktiml, clktimh, trgttiml, trgttimh; | ||
342 | u64 clock_edge = 0; | ||
343 | u32 rem; | ||
344 | |||
345 | switch (hw->mac.type) { | 390 | switch (hw->mac.type) { |
346 | case ixgbe_mac_X540: | 391 | case ixgbe_mac_X540: |
347 | esdp = IXGBE_READ_REG(hw, IXGBE_ESDP); | 392 | ptp_clock_event(adapter->ptp_clock, &event); |
348 | |||
349 | /* | ||
350 | * enable the SDP0 pin as output, and connected to the native | ||
351 | * function for Timesync (ClockOut) | ||
352 | */ | ||
353 | esdp |= (IXGBE_ESDP_SDP0_DIR | | ||
354 | IXGBE_ESDP_SDP0_NATIVE); | ||
355 | |||
356 | /* | ||
357 | * enable the Clock Out feature on SDP0, and allow interrupts | ||
358 | * to occur when the pin changes | ||
359 | */ | ||
360 | tsauxc = (IXGBE_TSAUXC_EN_CLK | | ||
361 | IXGBE_TSAUXC_SYNCLK | | ||
362 | IXGBE_TSAUXC_SDP0_INT); | ||
363 | |||
364 | /* clock period (or pulse length) */ | ||
365 | clktiml = (u32)(NSECS_PER_SEC << shift); | ||
366 | clktimh = (u32)((NSECS_PER_SEC << shift) >> 32); | ||
367 | |||
368 | clock_edge |= (u64)IXGBE_READ_REG(hw, IXGBE_SYSTIML); | ||
369 | clock_edge |= (u64)IXGBE_READ_REG(hw, IXGBE_SYSTIMH) << 32; | ||
370 | |||
371 | /* | ||
372 | * account for the fact that we can't do u64 division | ||
373 | * with remainder, by converting the clock values into | ||
374 | * nanoseconds first | ||
375 | */ | ||
376 | clock_edge >>= shift; | ||
377 | div_u64_rem(clock_edge, NSECS_PER_SEC, &rem); | ||
378 | clock_edge += (NSECS_PER_SEC - rem); | ||
379 | clock_edge <<= shift; | ||
380 | |||
381 | /* specify the initial clock start time */ | ||
382 | trgttiml = (u32)clock_edge; | ||
383 | trgttimh = (u32)(clock_edge >> 32); | ||
384 | |||
385 | IXGBE_WRITE_REG(hw, IXGBE_CLKTIML, clktiml); | ||
386 | IXGBE_WRITE_REG(hw, IXGBE_CLKTIMH, clktimh); | ||
387 | IXGBE_WRITE_REG(hw, IXGBE_TRGTTIML0, trgttiml); | ||
388 | IXGBE_WRITE_REG(hw, IXGBE_TRGTTIMH0, trgttimh); | ||
389 | |||
390 | IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp); | ||
391 | IXGBE_WRITE_REG(hw, IXGBE_TSAUXC, tsauxc); | ||
392 | |||
393 | IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EICR_TIMESYNC); | ||
394 | break; | 393 | break; |
395 | default: | 394 | default: |
396 | break; | 395 | break; |
397 | } | 396 | } |
398 | } | 397 | } |
399 | 398 | ||
400 | /** | ||
401 | * ixgbe_ptp_disable_sdp | ||
402 | * @hw: the private hardware structure | ||
403 | * | ||
404 | * this function disables the auxiliary SDP clock out feature | ||
405 | */ | ||
406 | static void ixgbe_ptp_disable_sdp(struct ixgbe_hw *hw) | ||
407 | { | ||
408 | IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EICR_TIMESYNC); | ||
409 | IXGBE_WRITE_REG(hw, IXGBE_TSAUXC, 0); | ||
410 | } | ||
411 | 399 | ||
412 | /** | 400 | /** |
413 | * ixgbe_ptp_overflow_check - delayed work to detect SYSTIME overflow | 401 | * ixgbe_ptp_overflow_check - delayed work to detect SYSTIME overflow |
@@ -822,9 +810,6 @@ void ixgbe_ptp_start_cyclecounter(struct ixgbe_adapter *adapter) | |||
822 | if (adapter->cycle_speed == cycle_speed && timinca) | 810 | if (adapter->cycle_speed == cycle_speed && timinca) |
823 | return; | 811 | return; |
824 | 812 | ||
825 | /* disable the SDP clock out */ | ||
826 | ixgbe_ptp_disable_sdp(hw); | ||
827 | |||
828 | /** | 813 | /** |
829 | * Scale the NIC cycle counter by a large factor so that | 814 | * Scale the NIC cycle counter by a large factor so that |
830 | * relatively small corrections to the frequency can be added | 815 | * relatively small corrections to the frequency can be added |
@@ -877,10 +862,6 @@ void ixgbe_ptp_start_cyclecounter(struct ixgbe_adapter *adapter) | |||
877 | IXGBE_WRITE_REG(hw, IXGBE_SYSTIMH, 0x00000000); | 862 | IXGBE_WRITE_REG(hw, IXGBE_SYSTIMH, 0x00000000); |
878 | IXGBE_WRITE_FLUSH(hw); | 863 | IXGBE_WRITE_FLUSH(hw); |
879 | 864 | ||
880 | /* now that the shift has been calculated and the systime | ||
881 | * registers reset, (re-)enable the Clock out feature*/ | ||
882 | ixgbe_ptp_enable_sdp(hw, shift); | ||
883 | |||
884 | /* store the new cycle speed */ | 865 | /* store the new cycle speed */ |
885 | adapter->cycle_speed = cycle_speed; | 866 | adapter->cycle_speed = cycle_speed; |
886 | 867 | ||
@@ -901,6 +882,12 @@ void ixgbe_ptp_start_cyclecounter(struct ixgbe_adapter *adapter) | |||
901 | ktime_to_ns(ktime_get_real())); | 882 | ktime_to_ns(ktime_get_real())); |
902 | 883 | ||
903 | spin_unlock_irqrestore(&adapter->tmreg_lock, flags); | 884 | spin_unlock_irqrestore(&adapter->tmreg_lock, flags); |
885 | |||
886 | /* | ||
887 | * Now that the shift has been calculated and the systime | ||
888 | * registers reset, (re-)enable the Clock out feature | ||
889 | */ | ||
890 | ixgbe_ptp_setup_sdp(adapter); | ||
904 | } | 891 | } |
905 | 892 | ||
906 | /** | 893 | /** |
@@ -979,10 +966,11 @@ void ixgbe_ptp_init(struct ixgbe_adapter *adapter) | |||
979 | */ | 966 | */ |
980 | void ixgbe_ptp_stop(struct ixgbe_adapter *adapter) | 967 | void ixgbe_ptp_stop(struct ixgbe_adapter *adapter) |
981 | { | 968 | { |
982 | ixgbe_ptp_disable_sdp(&adapter->hw); | ||
983 | |||
984 | /* stop the overflow check task */ | 969 | /* stop the overflow check task */ |
985 | adapter->flags2 &= ~IXGBE_FLAG2_OVERFLOW_CHECK_ENABLED; | 970 | adapter->flags2 &= ~(IXGBE_FLAG2_OVERFLOW_CHECK_ENABLED | |
971 | IXGBE_FLAG2_PTP_PPS_ENABLED); | ||
972 | |||
973 | ixgbe_ptp_setup_sdp(adapter); | ||
986 | 974 | ||
987 | if (adapter->ptp_clock) { | 975 | if (adapter->ptp_clock) { |
988 | ptp_clock_unregister(adapter->ptp_clock); | 976 | ptp_clock_unregister(adapter->ptp_clock); |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h b/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h index 400f86a31174..0722f3368092 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h | |||
@@ -65,6 +65,7 @@ | |||
65 | #define IXGBE_DEV_ID_82599_LS 0x154F | 65 | #define IXGBE_DEV_ID_82599_LS 0x154F |
66 | #define IXGBE_DEV_ID_X540T 0x1528 | 66 | #define IXGBE_DEV_ID_X540T 0x1528 |
67 | #define IXGBE_DEV_ID_82599_SFP_SF_QP 0x154A | 67 | #define IXGBE_DEV_ID_82599_SFP_SF_QP 0x154A |
68 | #define IXGBE_DEV_ID_X540T1 0x1560 | ||
68 | 69 | ||
69 | /* VF Device IDs */ | 70 | /* VF Device IDs */ |
70 | #define IXGBE_DEV_ID_82599_VF 0x10ED | 71 | #define IXGBE_DEV_ID_82599_VF 0x10ED |