Lines Matching +full:re +full:- +full:config
1 // SPDX-License-Identifier: GPL-2.0
22 struct igc_hw *hw = &adapter->hw; in igc_ptp_read()
29 ts->tv_sec = sec; in igc_ptp_read()
30 ts->tv_nsec = nsec; in igc_ptp_read()
36 struct igc_hw *hw = &adapter->hw; in igc_ptp_write_i225()
38 wr32(IGC_SYSTIML, ts->tv_nsec); in igc_ptp_write_i225()
39 wr32(IGC_SYSTIMH, ts->tv_sec); in igc_ptp_write_i225()
46 struct igc_hw *hw = &igc->hw; in igc_ptp_adjfine_i225()
53 scaled_ppm = -scaled_ppm; in igc_ptp_adjfine_i225()
75 spin_lock_irqsave(&igc->tmreg_lock, flags); in igc_ptp_adjtime_i225()
81 spin_unlock_irqrestore(&igc->tmreg_lock, flags); in igc_ptp_adjtime_i225()
92 struct igc_hw *hw = &igc->hw; in igc_ptp_gettimex64_i225()
95 spin_lock_irqsave(&igc->tmreg_lock, flags); in igc_ptp_gettimex64_i225()
98 ts->tv_nsec = rd32(IGC_SYSTIML); in igc_ptp_gettimex64_i225()
99 ts->tv_sec = rd32(IGC_SYSTIMH); in igc_ptp_gettimex64_i225()
102 spin_unlock_irqrestore(&igc->tmreg_lock, flags); in igc_ptp_gettimex64_i225()
114 spin_lock_irqsave(&igc->tmreg_lock, flags); in igc_ptp_settime_i225()
118 spin_unlock_irqrestore(&igc->tmreg_lock, flags); in igc_ptp_settime_i225()
126 return -EOPNOTSUPP; in igc_ptp_feature_enable_i225()
130 * igc_ptp_systim_to_hwtstamp - convert system time value to HW timestamp
142 switch (adapter->hw.mac.type) { in igc_ptp_systim_to_hwtstamp()
146 hwtstamps->hwtstamp = ktime_set(systim >> 32, in igc_ptp_systim_to_hwtstamp()
155 * igc_ptp_rx_pktstamp - retrieve Rx per packet timestamp
168 struct igc_adapter *adapter = q_vector->adapter; in igc_ptp_rx_pktstamp()
180 if (adapter->hw.mac.type == igc_i225) { in igc_ptp_rx_pktstamp()
181 switch (adapter->link_speed) { in igc_ptp_rx_pktstamp()
196 skb_hwtstamps(skb)->hwtstamp = in igc_ptp_rx_pktstamp()
197 ktime_sub_ns(skb_hwtstamps(skb)->hwtstamp, adjust); in igc_ptp_rx_pktstamp()
202 struct igc_hw *hw = &adapter->hw; in igc_ptp_disable_rx_timestamp()
208 for (i = 0; i < adapter->num_rx_queues; i++) { in igc_ptp_disable_rx_timestamp()
221 struct igc_hw *hw = &adapter->hw; in igc_ptp_enable_rx_timestamp()
229 for (i = 0; i < adapter->num_rx_queues; i++) { in igc_ptp_enable_rx_timestamp()
246 struct igc_hw *hw = &adapter->hw; in igc_ptp_disable_tx_timestamp()
253 struct igc_hw *hw = &adapter->hw; in igc_ptp_enable_tx_timestamp()
263 * igc_ptp_set_timestamp_mode - setup hardware for timestamping
265 * @config: hwtstamp configuration
270 struct hwtstamp_config *config) in igc_ptp_set_timestamp_mode() argument
273 if (config->flags) in igc_ptp_set_timestamp_mode()
274 return -EINVAL; in igc_ptp_set_timestamp_mode()
276 switch (config->tx_type) { in igc_ptp_set_timestamp_mode()
284 return -ERANGE; in igc_ptp_set_timestamp_mode()
287 switch (config->rx_filter) { in igc_ptp_set_timestamp_mode()
306 config->rx_filter = HWTSTAMP_FILTER_ALL; in igc_ptp_set_timestamp_mode()
309 return -ERANGE; in igc_ptp_set_timestamp_mode()
317 struct igc_hw *hw = &adapter->hw; in igc_ptp_tx_timeout()
319 dev_kfree_skb_any(adapter->ptp_tx_skb); in igc_ptp_tx_timeout()
320 adapter->ptp_tx_skb = NULL; in igc_ptp_tx_timeout()
321 adapter->tx_hwtstamp_timeouts++; in igc_ptp_tx_timeout()
322 clear_bit_unlock(__IGC_PTP_TX_IN_PROGRESS, &adapter->state); in igc_ptp_tx_timeout()
325 netdev_warn(adapter->netdev, "Tx timestamp timeout\n"); in igc_ptp_tx_timeout()
330 bool timeout = time_is_before_jiffies(adapter->ptp_tx_start + in igc_ptp_tx_hang()
333 if (!test_bit(__IGC_PTP_TX_IN_PROGRESS, &adapter->state)) in igc_ptp_tx_hang()
341 cancel_work_sync(&adapter->ptp_tx_work); in igc_ptp_tx_hang()
347 * igc_ptp_tx_hwtstamp - utility function which checks for TX time stamp
356 struct sk_buff *skb = adapter->ptp_tx_skb; in igc_ptp_tx_hwtstamp()
358 struct igc_hw *hw = &adapter->hw; in igc_ptp_tx_hwtstamp()
369 switch (adapter->link_speed) { in igc_ptp_tx_hwtstamp()
390 * while we're notifying the stack. in igc_ptp_tx_hwtstamp()
392 adapter->ptp_tx_skb = NULL; in igc_ptp_tx_hwtstamp()
393 clear_bit_unlock(__IGC_PTP_TX_IN_PROGRESS, &adapter->state); in igc_ptp_tx_hwtstamp()
411 struct igc_hw *hw = &adapter->hw; in igc_ptp_tx_work()
414 if (!test_bit(__IGC_PTP_TX_IN_PROGRESS, &adapter->state)) in igc_ptp_tx_work()
425 * igc_ptp_set_ts_config - set hardware time stamping config
433 struct hwtstamp_config config; in igc_ptp_set_ts_config() local
436 if (copy_from_user(&config, ifr->ifr_data, sizeof(config))) in igc_ptp_set_ts_config()
437 return -EFAULT; in igc_ptp_set_ts_config()
439 err = igc_ptp_set_timestamp_mode(adapter, &config); in igc_ptp_set_ts_config()
444 memcpy(&adapter->tstamp_config, &config, in igc_ptp_set_ts_config()
445 sizeof(adapter->tstamp_config)); in igc_ptp_set_ts_config()
447 return copy_to_user(ifr->ifr_data, &config, sizeof(config)) ? in igc_ptp_set_ts_config()
448 -EFAULT : 0; in igc_ptp_set_ts_config()
452 * igc_ptp_get_ts_config - get hardware time stamping config
463 struct hwtstamp_config *config = &adapter->tstamp_config; in igc_ptp_get_ts_config() local
465 return copy_to_user(ifr->ifr_data, config, sizeof(*config)) ? in igc_ptp_get_ts_config()
466 -EFAULT : 0; in igc_ptp_get_ts_config()
470 * igc_ptp_init - Initialize PTP functionality
478 struct net_device *netdev = adapter->netdev; in igc_ptp_init()
479 struct igc_hw *hw = &adapter->hw; in igc_ptp_init()
481 switch (hw->mac.type) { in igc_ptp_init()
483 snprintf(adapter->ptp_caps.name, 16, "%pm", netdev->dev_addr); in igc_ptp_init()
484 adapter->ptp_caps.owner = THIS_MODULE; in igc_ptp_init()
485 adapter->ptp_caps.max_adj = 62499999; in igc_ptp_init()
486 adapter->ptp_caps.adjfine = igc_ptp_adjfine_i225; in igc_ptp_init()
487 adapter->ptp_caps.adjtime = igc_ptp_adjtime_i225; in igc_ptp_init()
488 adapter->ptp_caps.gettimex64 = igc_ptp_gettimex64_i225; in igc_ptp_init()
489 adapter->ptp_caps.settime64 = igc_ptp_settime_i225; in igc_ptp_init()
490 adapter->ptp_caps.enable = igc_ptp_feature_enable_i225; in igc_ptp_init()
493 adapter->ptp_clock = NULL; in igc_ptp_init()
497 spin_lock_init(&adapter->tmreg_lock); in igc_ptp_init()
498 INIT_WORK(&adapter->ptp_tx_work, igc_ptp_tx_work); in igc_ptp_init()
500 adapter->tstamp_config.rx_filter = HWTSTAMP_FILTER_NONE; in igc_ptp_init()
501 adapter->tstamp_config.tx_type = HWTSTAMP_TX_OFF; in igc_ptp_init()
503 adapter->prev_ptp_time = ktime_to_timespec64(ktime_get_real()); in igc_ptp_init()
504 adapter->ptp_reset_start = ktime_get(); in igc_ptp_init()
506 adapter->ptp_clock = ptp_clock_register(&adapter->ptp_caps, in igc_ptp_init()
507 &adapter->pdev->dev); in igc_ptp_init()
508 if (IS_ERR(adapter->ptp_clock)) { in igc_ptp_init()
509 adapter->ptp_clock = NULL; in igc_ptp_init()
511 } else if (adapter->ptp_clock) { in igc_ptp_init()
513 adapter->ptp_flags |= IGC_PTP_ENABLED; in igc_ptp_init()
519 igc_ptp_read(adapter, &adapter->prev_ptp_time); in igc_ptp_time_save()
520 adapter->ptp_reset_start = ktime_get(); in igc_ptp_time_save()
525 struct timespec64 ts = adapter->prev_ptp_time; in igc_ptp_time_restore()
528 delta = ktime_sub(ktime_get(), adapter->ptp_reset_start); in igc_ptp_time_restore()
536 * igc_ptp_suspend - Disable PTP work items and prepare for suspend
544 if (!(adapter->ptp_flags & IGC_PTP_ENABLED)) in igc_ptp_suspend()
547 cancel_work_sync(&adapter->ptp_tx_work); in igc_ptp_suspend()
548 dev_kfree_skb_any(adapter->ptp_tx_skb); in igc_ptp_suspend()
549 adapter->ptp_tx_skb = NULL; in igc_ptp_suspend()
550 clear_bit_unlock(__IGC_PTP_TX_IN_PROGRESS, &adapter->state); in igc_ptp_suspend()
556 * igc_ptp_stop - Disable PTP device and stop the overflow check.
565 if (adapter->ptp_clock) { in igc_ptp_stop()
566 ptp_clock_unregister(adapter->ptp_clock); in igc_ptp_stop()
567 netdev_info(adapter->netdev, "PHC removed\n"); in igc_ptp_stop()
568 adapter->ptp_flags &= ~IGC_PTP_ENABLED; in igc_ptp_stop()
573 * igc_ptp_reset - Re-enable the adapter for PTP following a reset.
576 * This function handles the reset work required to re-enable the PTP device.
580 struct igc_hw *hw = &adapter->hw; in igc_ptp_reset()
584 igc_ptp_set_timestamp_mode(adapter, &adapter->tstamp_config); in igc_ptp_reset()
586 spin_lock_irqsave(&adapter->tmreg_lock, flags); in igc_ptp_reset()
588 switch (adapter->hw.mac.type) { in igc_ptp_reset()
600 /* Re-initialize the timer. */ in igc_ptp_reset()
601 if (hw->mac.type == igc_i225) { in igc_ptp_reset()
604 timecounter_init(&adapter->tc, &adapter->cc, in igc_ptp_reset()
608 spin_unlock_irqrestore(&adapter->tmreg_lock, flags); in igc_ptp_reset()