Lines Matching +full:disable +full:- +full:hi +full:- +full:speed

1 // SPDX-License-Identifier: GPL-2.0+
38 * +--------------+ +---+---+------+
40 * +--------------+ +---+---+------+
43 * +----------+---+ +--------------+
45 * +----------+---+ +--------------+
50 * 2^45 * 10^-9 / 3600 = 9.77 hours.
53 * 2^40 * 10^-9 / 60 = 18.3 minutes.
67 #define INCVALUE_82576_MASK GENMASK(E1000_TIMINCA_16NS_SHIFT - 1, 0)
79 struct e1000_hw *hw = &igb->hw; in igb_ptp_read_82576()
81 u32 lo, hi; in igb_ptp_read_82576() local
84 hi = rd32(E1000_SYSTIMH); in igb_ptp_read_82576()
86 val = ((u64) hi) << 32; in igb_ptp_read_82576()
96 struct e1000_hw *hw = &igb->hw; in igb_ptp_read_82580()
97 u32 lo, hi; in igb_ptp_read_82580() local
106 hi = rd32(E1000_SYSTIMH); in igb_ptp_read_82580()
108 val = ((u64) hi) << 32; in igb_ptp_read_82580()
118 struct e1000_hw *hw = &adapter->hw; in igb_ptp_read_i210()
129 ts->tv_sec = sec; in igb_ptp_read_i210()
130 ts->tv_nsec = nsec; in igb_ptp_read_i210()
136 struct e1000_hw *hw = &adapter->hw; in igb_ptp_write_i210()
139 * sub-nanosecond resolution. in igb_ptp_write_i210()
141 wr32(E1000_SYSTIML, ts->tv_nsec); in igb_ptp_write_i210()
142 wr32(E1000_SYSTIMH, (u32)ts->tv_sec); in igb_ptp_write_i210()
146 * igb_ptp_systim_to_hwtstamp - convert system time value to hw timestamp
171 switch (adapter->hw.mac.type) { in igb_ptp_systim_to_hwtstamp()
176 spin_lock_irqsave(&adapter->tmreg_lock, flags); in igb_ptp_systim_to_hwtstamp()
177 ns = timecounter_cyc2time(&adapter->tc, systim); in igb_ptp_systim_to_hwtstamp()
178 spin_unlock_irqrestore(&adapter->tmreg_lock, flags); in igb_ptp_systim_to_hwtstamp()
180 hwtstamps->hwtstamp = ns_to_ktime(ns); in igb_ptp_systim_to_hwtstamp()
185 hwtstamps->hwtstamp = ktime_set(systim >> 32, in igb_ptp_systim_to_hwtstamp()
198 struct e1000_hw *hw = &igb->hw; in igb_ptp_adjfine_82576()
212 struct e1000_hw *hw = &igb->hw; in igb_ptp_adjfine_82580()
234 spin_lock_irqsave(&igb->tmreg_lock, flags); in igb_ptp_adjtime_82576()
235 timecounter_adjtime(&igb->tc, delta); in igb_ptp_adjtime_82576()
236 spin_unlock_irqrestore(&igb->tmreg_lock, flags); in igb_ptp_adjtime_82576()
248 spin_lock_irqsave(&igb->tmreg_lock, flags); in igb_ptp_adjtime_i210()
254 spin_unlock_irqrestore(&igb->tmreg_lock, flags); in igb_ptp_adjtime_i210()
265 struct e1000_hw *hw = &igb->hw; in igb_ptp_gettimex_82576()
267 u32 lo, hi; in igb_ptp_gettimex_82576() local
270 spin_lock_irqsave(&igb->tmreg_lock, flags); in igb_ptp_gettimex_82576()
275 hi = rd32(E1000_SYSTIMH); in igb_ptp_gettimex_82576()
277 ns = timecounter_cyc2time(&igb->tc, ((u64)hi << 32) | lo); in igb_ptp_gettimex_82576()
279 spin_unlock_irqrestore(&igb->tmreg_lock, flags); in igb_ptp_gettimex_82576()
292 struct e1000_hw *hw = &igb->hw; in igb_ptp_gettimex_82580()
294 u32 lo, hi; in igb_ptp_gettimex_82580() local
297 spin_lock_irqsave(&igb->tmreg_lock, flags); in igb_ptp_gettimex_82580()
303 hi = rd32(E1000_SYSTIMH); in igb_ptp_gettimex_82580()
305 ns = timecounter_cyc2time(&igb->tc, ((u64)hi << 32) | lo); in igb_ptp_gettimex_82580()
307 spin_unlock_irqrestore(&igb->tmreg_lock, flags); in igb_ptp_gettimex_82580()
320 struct e1000_hw *hw = &igb->hw; in igb_ptp_gettimex_i210()
323 spin_lock_irqsave(&igb->tmreg_lock, flags); in igb_ptp_gettimex_i210()
328 ts->tv_nsec = rd32(E1000_SYSTIML); in igb_ptp_gettimex_i210()
329 ts->tv_sec = rd32(E1000_SYSTIMH); in igb_ptp_gettimex_i210()
331 spin_unlock_irqrestore(&igb->tmreg_lock, flags); in igb_ptp_gettimex_i210()
346 spin_lock_irqsave(&igb->tmreg_lock, flags); in igb_ptp_settime_82576()
348 timecounter_init(&igb->tc, &igb->cc, ns); in igb_ptp_settime_82576()
350 spin_unlock_irqrestore(&igb->tmreg_lock, flags); in igb_ptp_settime_82576()
362 spin_lock_irqsave(&igb->tmreg_lock, flags); in igb_ptp_settime_i210()
366 spin_unlock_irqrestore(&igb->tmreg_lock, flags); in igb_ptp_settime_i210()
398 struct e1000_hw *hw = &igb->hw; in igb_pin_extts()
454 struct e1000_hw *hw = &igb->hw; in igb_pin_perout()
496 struct e1000_hw *hw = &igb->hw; in igb_ptp_feature_enable_82580()
500 int pin = -1; in igb_ptp_feature_enable_82580()
503 switch (rq->type) { in igb_ptp_feature_enable_82580()
506 if (rq->extts.flags & ~(PTP_ENABLE_FEATURE | in igb_ptp_feature_enable_82580()
510 return -EOPNOTSUPP; in igb_ptp_feature_enable_82580()
513 pin = ptp_find_pin(igb->ptp_clock, PTP_PF_EXTTS, in igb_ptp_feature_enable_82580()
514 rq->extts.index); in igb_ptp_feature_enable_82580()
516 return -EBUSY; in igb_ptp_feature_enable_82580()
518 if (rq->extts.index == 1) { in igb_ptp_feature_enable_82580()
525 spin_lock_irqsave(&igb->tmreg_lock, flags); in igb_ptp_feature_enable_82580()
529 igb_pin_extts(igb, rq->extts.index, pin); in igb_ptp_feature_enable_82580()
538 spin_unlock_irqrestore(&igb->tmreg_lock, flags); in igb_ptp_feature_enable_82580()
543 if (rq->perout.flags) in igb_ptp_feature_enable_82580()
544 return -EOPNOTSUPP; in igb_ptp_feature_enable_82580()
547 pin = ptp_find_pin(igb->ptp_clock, PTP_PF_PEROUT, in igb_ptp_feature_enable_82580()
548 rq->perout.index); in igb_ptp_feature_enable_82580()
550 return -EBUSY; in igb_ptp_feature_enable_82580()
552 ts.tv_sec = rq->perout.period.sec; in igb_ptp_feature_enable_82580()
553 ts.tv_nsec = rq->perout.period.nsec; in igb_ptp_feature_enable_82580()
557 return -EINVAL; in igb_ptp_feature_enable_82580()
559 if (rq->perout.index == 1) { in igb_ptp_feature_enable_82580()
570 spin_lock_irqsave(&igb->tmreg_lock, flags); in igb_ptp_feature_enable_82580()
573 if (rq->perout.index == 1) { in igb_ptp_feature_enable_82580()
581 int i = rq->perout.index; in igb_ptp_feature_enable_82580()
588 now = timecounter_cyc2time(&igb->tc, systim); in igb_ptp_feature_enable_82580()
599 systim = systim + (ns - rem); in igb_ptp_feature_enable_82580()
617 start = ns_to_timespec64(systim + (ns - rem)); in igb_ptp_feature_enable_82580()
619 igb->perout[i].start.tv_sec = start.tv_sec; in igb_ptp_feature_enable_82580()
620 igb->perout[i].start.tv_nsec = start.tv_nsec; in igb_ptp_feature_enable_82580()
621 igb->perout[i].period.tv_sec = ts.tv_sec; in igb_ptp_feature_enable_82580()
622 igb->perout[i].period.tv_nsec = ts.tv_nsec; in igb_ptp_feature_enable_82580()
631 spin_unlock_irqrestore(&igb->tmreg_lock, flags); in igb_ptp_feature_enable_82580()
635 return -EOPNOTSUPP; in igb_ptp_feature_enable_82580()
638 return -EOPNOTSUPP; in igb_ptp_feature_enable_82580()
646 struct e1000_hw *hw = &igb->hw; in igb_ptp_feature_enable_i210()
650 int use_freq = 0, pin = -1; in igb_ptp_feature_enable_i210()
653 switch (rq->type) { in igb_ptp_feature_enable_i210()
656 if (rq->extts.flags & ~(PTP_ENABLE_FEATURE | in igb_ptp_feature_enable_i210()
660 return -EOPNOTSUPP; in igb_ptp_feature_enable_i210()
663 if ((rq->extts.flags & PTP_STRICT_FLAGS) && in igb_ptp_feature_enable_i210()
664 (rq->extts.flags & PTP_ENABLE_FEATURE) && in igb_ptp_feature_enable_i210()
665 (rq->extts.flags & PTP_EXTTS_EDGES) != PTP_EXTTS_EDGES) in igb_ptp_feature_enable_i210()
666 return -EOPNOTSUPP; in igb_ptp_feature_enable_i210()
669 pin = ptp_find_pin(igb->ptp_clock, PTP_PF_EXTTS, in igb_ptp_feature_enable_i210()
670 rq->extts.index); in igb_ptp_feature_enable_i210()
672 return -EBUSY; in igb_ptp_feature_enable_i210()
674 if (rq->extts.index == 1) { in igb_ptp_feature_enable_i210()
681 spin_lock_irqsave(&igb->tmreg_lock, flags); in igb_ptp_feature_enable_i210()
685 igb_pin_extts(igb, rq->extts.index, pin); in igb_ptp_feature_enable_i210()
694 spin_unlock_irqrestore(&igb->tmreg_lock, flags); in igb_ptp_feature_enable_i210()
699 if (rq->perout.flags) in igb_ptp_feature_enable_i210()
700 return -EOPNOTSUPP; in igb_ptp_feature_enable_i210()
703 pin = ptp_find_pin(igb->ptp_clock, PTP_PF_PEROUT, in igb_ptp_feature_enable_i210()
704 rq->perout.index); in igb_ptp_feature_enable_i210()
706 return -EBUSY; in igb_ptp_feature_enable_i210()
708 ts.tv_sec = rq->perout.period.sec; in igb_ptp_feature_enable_i210()
709 ts.tv_nsec = rq->perout.period.nsec; in igb_ptp_feature_enable_i210()
715 return -EINVAL; in igb_ptp_feature_enable_i210()
719 if (rq->perout.index == 1) { in igb_ptp_feature_enable_i210()
742 spin_lock_irqsave(&igb->tmreg_lock, flags); in igb_ptp_feature_enable_i210()
745 if (rq->perout.index == 1) { in igb_ptp_feature_enable_i210()
753 int i = rq->perout.index; in igb_ptp_feature_enable_i210()
755 igb->perout[i].start.tv_sec = rq->perout.start.sec; in igb_ptp_feature_enable_i210()
756 igb->perout[i].start.tv_nsec = rq->perout.start.nsec; in igb_ptp_feature_enable_i210()
757 igb->perout[i].period.tv_sec = ts.tv_sec; in igb_ptp_feature_enable_i210()
758 igb->perout[i].period.tv_nsec = ts.tv_nsec; in igb_ptp_feature_enable_i210()
759 wr32(trgttimh, rq->perout.start.sec); in igb_ptp_feature_enable_i210()
760 wr32(trgttiml, rq->perout.start.nsec); in igb_ptp_feature_enable_i210()
768 spin_unlock_irqrestore(&igb->tmreg_lock, flags); in igb_ptp_feature_enable_i210()
772 spin_lock_irqsave(&igb->tmreg_lock, flags); in igb_ptp_feature_enable_i210()
778 igb->pps_sys_wrap_on = !!on; in igb_ptp_feature_enable_i210()
780 spin_unlock_irqrestore(&igb->tmreg_lock, flags); in igb_ptp_feature_enable_i210()
784 return -EOPNOTSUPP; in igb_ptp_feature_enable_i210()
790 return -EOPNOTSUPP; in igb_ptp_feature_enable()
802 return -1; in igb_ptp_verify_pin()
818 struct e1000_hw *hw = &adapter->hw; in igb_ptp_tx_work()
821 if (!adapter->ptp_tx_skb) in igb_ptp_tx_work()
824 if (time_is_before_jiffies(adapter->ptp_tx_start + in igb_ptp_tx_work()
826 dev_kfree_skb_any(adapter->ptp_tx_skb); in igb_ptp_tx_work()
827 adapter->ptp_tx_skb = NULL; in igb_ptp_tx_work()
828 clear_bit_unlock(__IGB_PTP_TX_IN_PROGRESS, &adapter->state); in igb_ptp_tx_work()
829 adapter->tx_hwtstamp_timeouts++; in igb_ptp_tx_work()
834 dev_warn(&adapter->pdev->dev, "clearing Tx timestamp hang\n"); in igb_ptp_tx_work()
843 schedule_work(&adapter->ptp_tx_work); in igb_ptp_tx_work()
854 ns = timecounter_read(&igb->tc); in igb_ptp_overflow_check()
860 schedule_delayed_work(&igb->ptp_overflow_work, in igb_ptp_overflow_check()
865 * igb_ptp_rx_hang - detect error case when Rx timestamp registers latched
875 struct e1000_hw *hw = &adapter->hw; in igb_ptp_rx_hang()
879 /* Other hardware uses per-packet timestamps */ in igb_ptp_rx_hang()
880 if (hw->mac.type != e1000_82576) in igb_ptp_rx_hang()
887 adapter->last_rx_ptp_check = jiffies; in igb_ptp_rx_hang()
892 rx_event = adapter->last_rx_ptp_check; in igb_ptp_rx_hang()
893 if (time_after(adapter->last_rx_timestamp, rx_event)) in igb_ptp_rx_hang()
894 rx_event = adapter->last_rx_timestamp; in igb_ptp_rx_hang()
899 adapter->last_rx_ptp_check = jiffies; in igb_ptp_rx_hang()
900 adapter->rx_hwtstamp_cleared++; in igb_ptp_rx_hang()
901 dev_warn(&adapter->pdev->dev, "clearing Rx timestamp hang\n"); in igb_ptp_rx_hang()
906 * igb_ptp_tx_hang - detect error case where Tx timestamp never finishes
911 struct e1000_hw *hw = &adapter->hw; in igb_ptp_tx_hang()
912 bool timeout = time_is_before_jiffies(adapter->ptp_tx_start + in igb_ptp_tx_hang()
915 if (!adapter->ptp_tx_skb) in igb_ptp_tx_hang()
918 if (!test_bit(__IGB_PTP_TX_IN_PROGRESS, &adapter->state)) in igb_ptp_tx_hang()
926 cancel_work_sync(&adapter->ptp_tx_work); in igb_ptp_tx_hang()
927 dev_kfree_skb_any(adapter->ptp_tx_skb); in igb_ptp_tx_hang()
928 adapter->ptp_tx_skb = NULL; in igb_ptp_tx_hang()
929 clear_bit_unlock(__IGB_PTP_TX_IN_PROGRESS, &adapter->state); in igb_ptp_tx_hang()
930 adapter->tx_hwtstamp_timeouts++; in igb_ptp_tx_hang()
935 dev_warn(&adapter->pdev->dev, "clearing Tx timestamp hang\n"); in igb_ptp_tx_hang()
940 * igb_ptp_tx_hwtstamp - utility function which checks for TX time stamp
949 struct sk_buff *skb = adapter->ptp_tx_skb; in igb_ptp_tx_hwtstamp()
950 struct e1000_hw *hw = &adapter->hw; in igb_ptp_tx_hwtstamp()
959 /* adjust timestamp for the TX latency based on link speed */ in igb_ptp_tx_hwtstamp()
960 if (hw->mac.type == e1000_i210 || hw->mac.type == e1000_i211) { in igb_ptp_tx_hwtstamp()
961 switch (adapter->link_speed) { in igb_ptp_tx_hwtstamp()
982 adapter->ptp_tx_skb = NULL; in igb_ptp_tx_hwtstamp()
983 clear_bit_unlock(__IGB_PTP_TX_IN_PROGRESS, &adapter->state); in igb_ptp_tx_hwtstamp()
991 * igb_ptp_rx_pktstamp - retrieve Rx per packet timestamp
1005 struct igb_adapter *adapter = q_vector->adapter; in igb_ptp_rx_pktstamp()
1006 struct e1000_hw *hw = &adapter->hw; in igb_ptp_rx_pktstamp()
1011 if (!(adapter->ptp_flags & IGB_PTP_ENABLED)) in igb_ptp_rx_pktstamp()
1025 /* adjust timestamp for the RX latency based on link speed */ in igb_ptp_rx_pktstamp()
1026 if (hw->mac.type == e1000_i210 || hw->mac.type == e1000_i211) { in igb_ptp_rx_pktstamp()
1027 switch (adapter->link_speed) { in igb_ptp_rx_pktstamp()
1046 * igb_ptp_rx_rgtstamp - retrieve Rx timestamp stored in register
1055 struct igb_adapter *adapter = q_vector->adapter; in igb_ptp_rx_rgtstamp()
1056 struct e1000_hw *hw = &adapter->hw; in igb_ptp_rx_rgtstamp()
1060 if (!(adapter->ptp_flags & IGB_PTP_ENABLED)) in igb_ptp_rx_rgtstamp()
1081 /* adjust timestamp for the RX latency based on link speed */ in igb_ptp_rx_rgtstamp()
1082 if (adapter->hw.mac.type == e1000_i210) { in igb_ptp_rx_rgtstamp()
1083 switch (adapter->link_speed) { in igb_ptp_rx_rgtstamp()
1095 skb_hwtstamps(skb)->hwtstamp = in igb_ptp_rx_rgtstamp()
1096 ktime_sub_ns(skb_hwtstamps(skb)->hwtstamp, adjust); in igb_ptp_rx_rgtstamp()
1101 adapter->last_rx_timestamp = jiffies; in igb_ptp_rx_rgtstamp()
1105 * igb_ptp_get_ts_config - get hardware time stamping config
1116 struct hwtstamp_config *config = &adapter->tstamp_config; in igb_ptp_get_ts_config()
1118 return copy_to_user(ifr->ifr_data, config, sizeof(*config)) ? in igb_ptp_get_ts_config()
1119 -EFAULT : 0; in igb_ptp_get_ts_config()
1123 * igb_ptp_set_timestamp_mode - setup hardware for timestamping
1128 * disable it when requested, although it shouldn't case any overhead
1142 struct e1000_hw *hw = &adapter->hw; in igb_ptp_set_timestamp_mode()
1150 switch (config->tx_type) { in igb_ptp_set_timestamp_mode()
1157 return -ERANGE; in igb_ptp_set_timestamp_mode()
1160 switch (config->rx_filter) { in igb_ptp_set_timestamp_mode()
1184 config->rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT; in igb_ptp_set_timestamp_mode()
1194 if (hw->mac.type != e1000_82576) { in igb_ptp_set_timestamp_mode()
1196 config->rx_filter = HWTSTAMP_FILTER_ALL; in igb_ptp_set_timestamp_mode()
1201 config->rx_filter = HWTSTAMP_FILTER_NONE; in igb_ptp_set_timestamp_mode()
1202 return -ERANGE; in igb_ptp_set_timestamp_mode()
1205 if (hw->mac.type == e1000_82575) { in igb_ptp_set_timestamp_mode()
1207 return -EINVAL; in igb_ptp_set_timestamp_mode()
1211 /* Per-packet timestamping only works if all packets are in igb_ptp_set_timestamp_mode()
1215 if ((hw->mac.type >= e1000_82580) && tsync_rx_ctl) { in igb_ptp_set_timestamp_mode()
1218 config->rx_filter = HWTSTAMP_FILTER_ALL; in igb_ptp_set_timestamp_mode()
1222 if ((hw->mac.type == e1000_i210) || in igb_ptp_set_timestamp_mode()
1223 (hw->mac.type == e1000_i211)) { in igb_ptp_set_timestamp_mode()
1230 /* enable/disable TX */ in igb_ptp_set_timestamp_mode()
1236 /* enable/disable RX */ in igb_ptp_set_timestamp_mode()
1265 if (hw->mac.type == e1000_82576) { in igb_ptp_set_timestamp_mode()
1286 * igb_ptp_set_ts_config - set hardware time stamping config
1297 if (copy_from_user(&config, ifr->ifr_data, sizeof(config))) in igb_ptp_set_ts_config()
1298 return -EFAULT; in igb_ptp_set_ts_config()
1305 memcpy(&adapter->tstamp_config, &config, in igb_ptp_set_ts_config()
1306 sizeof(adapter->tstamp_config)); in igb_ptp_set_ts_config()
1308 return copy_to_user(ifr->ifr_data, &config, sizeof(config)) ? in igb_ptp_set_ts_config()
1309 -EFAULT : 0; in igb_ptp_set_ts_config()
1313 * igb_ptp_init - Initialize PTP functionality
1321 struct e1000_hw *hw = &adapter->hw; in igb_ptp_init()
1322 struct net_device *netdev = adapter->netdev; in igb_ptp_init()
1324 switch (hw->mac.type) { in igb_ptp_init()
1326 snprintf(adapter->ptp_caps.name, 16, "%pm", netdev->dev_addr); in igb_ptp_init()
1327 adapter->ptp_caps.owner = THIS_MODULE; in igb_ptp_init()
1328 adapter->ptp_caps.max_adj = 999999881; in igb_ptp_init()
1329 adapter->ptp_caps.n_ext_ts = 0; in igb_ptp_init()
1330 adapter->ptp_caps.pps = 0; in igb_ptp_init()
1331 adapter->ptp_caps.adjfine = igb_ptp_adjfine_82576; in igb_ptp_init()
1332 adapter->ptp_caps.adjtime = igb_ptp_adjtime_82576; in igb_ptp_init()
1333 adapter->ptp_caps.gettimex64 = igb_ptp_gettimex_82576; in igb_ptp_init()
1334 adapter->ptp_caps.settime64 = igb_ptp_settime_82576; in igb_ptp_init()
1335 adapter->ptp_caps.enable = igb_ptp_feature_enable; in igb_ptp_init()
1336 adapter->cc.read = igb_ptp_read_82576; in igb_ptp_init()
1337 adapter->cc.mask = CYCLECOUNTER_MASK(64); in igb_ptp_init()
1338 adapter->cc.mult = 1; in igb_ptp_init()
1339 adapter->cc.shift = IGB_82576_TSYNC_SHIFT; in igb_ptp_init()
1340 adapter->ptp_flags |= IGB_PTP_OVERFLOW_CHECK; in igb_ptp_init()
1346 snprintf(adapter->ptp_caps.name, 16, "%pm", netdev->dev_addr); in igb_ptp_init()
1347 adapter->ptp_caps.owner = THIS_MODULE; in igb_ptp_init()
1348 adapter->ptp_caps.max_adj = 62499999; in igb_ptp_init()
1349 adapter->ptp_caps.n_ext_ts = IGB_N_EXTTS; in igb_ptp_init()
1350 adapter->ptp_caps.n_per_out = IGB_N_PEROUT; in igb_ptp_init()
1351 adapter->ptp_caps.n_pins = IGB_N_SDP; in igb_ptp_init()
1352 adapter->ptp_caps.pps = 0; in igb_ptp_init()
1353 adapter->ptp_caps.pin_config = adapter->sdp_config; in igb_ptp_init()
1354 adapter->ptp_caps.adjfine = igb_ptp_adjfine_82580; in igb_ptp_init()
1355 adapter->ptp_caps.adjtime = igb_ptp_adjtime_82576; in igb_ptp_init()
1356 adapter->ptp_caps.gettimex64 = igb_ptp_gettimex_82580; in igb_ptp_init()
1357 adapter->ptp_caps.settime64 = igb_ptp_settime_82576; in igb_ptp_init()
1358 adapter->ptp_caps.enable = igb_ptp_feature_enable_82580; in igb_ptp_init()
1359 adapter->ptp_caps.verify = igb_ptp_verify_pin; in igb_ptp_init()
1360 adapter->cc.read = igb_ptp_read_82580; in igb_ptp_init()
1361 adapter->cc.mask = CYCLECOUNTER_MASK(IGB_NBITS_82580); in igb_ptp_init()
1362 adapter->cc.mult = 1; in igb_ptp_init()
1363 adapter->cc.shift = 0; in igb_ptp_init()
1364 adapter->ptp_flags |= IGB_PTP_OVERFLOW_CHECK; in igb_ptp_init()
1369 snprintf(adapter->ptp_caps.name, 16, "%pm", netdev->dev_addr); in igb_ptp_init()
1370 adapter->ptp_caps.owner = THIS_MODULE; in igb_ptp_init()
1371 adapter->ptp_caps.max_adj = 62499999; in igb_ptp_init()
1372 adapter->ptp_caps.n_ext_ts = IGB_N_EXTTS; in igb_ptp_init()
1373 adapter->ptp_caps.n_per_out = IGB_N_PEROUT; in igb_ptp_init()
1374 adapter->ptp_caps.n_pins = IGB_N_SDP; in igb_ptp_init()
1375 adapter->ptp_caps.pps = 1; in igb_ptp_init()
1376 adapter->ptp_caps.pin_config = adapter->sdp_config; in igb_ptp_init()
1377 adapter->ptp_caps.adjfine = igb_ptp_adjfine_82580; in igb_ptp_init()
1378 adapter->ptp_caps.adjtime = igb_ptp_adjtime_i210; in igb_ptp_init()
1379 adapter->ptp_caps.gettimex64 = igb_ptp_gettimex_i210; in igb_ptp_init()
1380 adapter->ptp_caps.settime64 = igb_ptp_settime_i210; in igb_ptp_init()
1381 adapter->ptp_caps.enable = igb_ptp_feature_enable_i210; in igb_ptp_init()
1382 adapter->ptp_caps.verify = igb_ptp_verify_pin; in igb_ptp_init()
1385 adapter->ptp_clock = NULL; in igb_ptp_init()
1389 adapter->ptp_clock = ptp_clock_register(&adapter->ptp_caps, in igb_ptp_init()
1390 &adapter->pdev->dev); in igb_ptp_init()
1391 if (IS_ERR(adapter->ptp_clock)) { in igb_ptp_init()
1392 adapter->ptp_clock = NULL; in igb_ptp_init()
1393 dev_err(&adapter->pdev->dev, "ptp_clock_register failed\n"); in igb_ptp_init()
1394 } else if (adapter->ptp_clock) { in igb_ptp_init()
1395 dev_info(&adapter->pdev->dev, "added PHC on %s\n", in igb_ptp_init()
1396 adapter->netdev->name); in igb_ptp_init()
1397 adapter->ptp_flags |= IGB_PTP_ENABLED; in igb_ptp_init()
1399 spin_lock_init(&adapter->tmreg_lock); in igb_ptp_init()
1400 INIT_WORK(&adapter->ptp_tx_work, igb_ptp_tx_work); in igb_ptp_init()
1402 if (adapter->ptp_flags & IGB_PTP_OVERFLOW_CHECK) in igb_ptp_init()
1403 INIT_DELAYED_WORK(&adapter->ptp_overflow_work, in igb_ptp_init()
1406 adapter->tstamp_config.rx_filter = HWTSTAMP_FILTER_NONE; in igb_ptp_init()
1407 adapter->tstamp_config.tx_type = HWTSTAMP_TX_OFF; in igb_ptp_init()
1414 * igb_ptp_sdp_init - utility function which inits the SDP config structs
1422 struct ptp_pin_desc *ppd = &adapter->sdp_config[i]; in igb_ptp_sdp_init()
1424 snprintf(ppd->name, sizeof(ppd->name), "SDP%d", i); in igb_ptp_sdp_init()
1425 ppd->index = i; in igb_ptp_sdp_init()
1426 ppd->func = PTP_PF_NONE; in igb_ptp_sdp_init()
1431 * igb_ptp_suspend - Disable PTP work items and prepare for suspend
1439 if (!(adapter->ptp_flags & IGB_PTP_ENABLED)) in igb_ptp_suspend()
1442 if (adapter->ptp_flags & IGB_PTP_OVERFLOW_CHECK) in igb_ptp_suspend()
1443 cancel_delayed_work_sync(&adapter->ptp_overflow_work); in igb_ptp_suspend()
1445 cancel_work_sync(&adapter->ptp_tx_work); in igb_ptp_suspend()
1446 if (adapter->ptp_tx_skb) { in igb_ptp_suspend()
1447 dev_kfree_skb_any(adapter->ptp_tx_skb); in igb_ptp_suspend()
1448 adapter->ptp_tx_skb = NULL; in igb_ptp_suspend()
1449 clear_bit_unlock(__IGB_PTP_TX_IN_PROGRESS, &adapter->state); in igb_ptp_suspend()
1454 * igb_ptp_stop - Disable PTP device and stop the overflow check.
1463 if (adapter->ptp_clock) { in igb_ptp_stop()
1464 ptp_clock_unregister(adapter->ptp_clock); in igb_ptp_stop()
1465 dev_info(&adapter->pdev->dev, "removed PHC on %s\n", in igb_ptp_stop()
1466 adapter->netdev->name); in igb_ptp_stop()
1467 adapter->ptp_flags &= ~IGB_PTP_ENABLED; in igb_ptp_stop()
1472 * igb_ptp_reset - Re-enable the adapter for PTP following a reset.
1475 * This function handles the reset work required to re-enable the PTP device.
1479 struct e1000_hw *hw = &adapter->hw; in igb_ptp_reset()
1483 igb_ptp_set_timestamp_mode(adapter, &adapter->tstamp_config); in igb_ptp_reset()
1485 spin_lock_irqsave(&adapter->tmreg_lock, flags); in igb_ptp_reset()
1487 switch (adapter->hw.mac.type) { in igb_ptp_reset()
1501 (adapter->pps_sys_wrap_on ? TSINTR_SYS_WRAP : 0)); in igb_ptp_reset()
1509 /* Re-initialize the timer. */ in igb_ptp_reset()
1510 if ((hw->mac.type == e1000_i210) || (hw->mac.type == e1000_i211)) { in igb_ptp_reset()
1515 timecounter_init(&adapter->tc, &adapter->cc, in igb_ptp_reset()
1519 spin_unlock_irqrestore(&adapter->tmreg_lock, flags); in igb_ptp_reset()
1523 if (adapter->ptp_flags & IGB_PTP_OVERFLOW_CHECK) in igb_ptp_reset()
1524 schedule_delayed_work(&adapter->ptp_overflow_work, in igb_ptp_reset()