Lines Matching +full:pin +full:- +full:ctrl +full:- +full:enable

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()
96 struct e1000_hw *hw = &igb->hw; 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()
270 spin_lock_irqsave(&igb->tmreg_lock, flags); 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()
297 spin_lock_irqsave(&igb->tmreg_lock, flags); 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()
371 static void igb_pin_direction(int pin, int input, u32 *ctrl, u32 *ctrl_ext) in igb_pin_direction() argument
373 u32 *ptr = pin < 2 ? ctrl : ctrl_ext; in igb_pin_direction()
382 *ptr &= ~mask[pin]; in igb_pin_direction()
384 *ptr |= mask[pin]; in igb_pin_direction()
387 static void igb_pin_extts(struct igb_adapter *igb, int chan, int pin) in igb_pin_extts() argument
398 struct e1000_hw *hw = &igb->hw; in igb_pin_extts()
399 u32 ctrl, ctrl_ext, tssdp = 0; in igb_pin_extts() local
401 ctrl = rd32(E1000_CTRL); in igb_pin_extts()
405 igb_pin_direction(pin, 1, &ctrl, &ctrl_ext); in igb_pin_extts()
407 /* Make sure this pin is not enabled as an output. */ in igb_pin_extts()
408 tssdp &= ~ts_sdp_en[pin]; in igb_pin_extts()
412 tssdp |= aux1_sel_sdp[pin] | AUX1_TS_SDP_EN; in igb_pin_extts()
415 tssdp |= aux0_sel_sdp[pin] | AUX0_TS_SDP_EN; in igb_pin_extts()
419 wr32(E1000_CTRL, ctrl); in igb_pin_extts()
423 static void igb_pin_perout(struct igb_adapter *igb, int chan, int pin, int freq) in igb_pin_perout() argument
454 struct e1000_hw *hw = &igb->hw; in igb_pin_perout()
455 u32 ctrl, ctrl_ext, tssdp = 0; in igb_pin_perout() local
457 ctrl = rd32(E1000_CTRL); in igb_pin_perout()
461 igb_pin_direction(pin, 0, &ctrl, &ctrl_ext); in igb_pin_perout()
463 /* Make sure this pin is not enabled as an input. */ in igb_pin_perout()
464 if ((tssdp & AUX0_SEL_SDP3) == aux0_sel_sdp[pin]) in igb_pin_perout()
467 if ((tssdp & AUX1_SEL_SDP3) == aux1_sel_sdp[pin]) in igb_pin_perout()
470 tssdp &= ~ts_sdp_sel_clr[pin]; in igb_pin_perout()
473 tssdp |= ts_sdp_sel_fc1[pin]; in igb_pin_perout()
475 tssdp |= ts_sdp_sel_fc0[pin]; in igb_pin_perout()
478 tssdp |= ts_sdp_sel_tt1[pin]; in igb_pin_perout()
480 tssdp |= ts_sdp_sel_tt0[pin]; in igb_pin_perout()
482 tssdp |= ts_sdp_en[pin]; in igb_pin_perout()
485 wr32(E1000_CTRL, ctrl); 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() local
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 if (rq->extts.flags & PTP_STRICT_FLAGS && in igb_ptp_feature_enable_82580()
514 (rq->extts.flags & PTP_ENABLE_FEATURE) && in igb_ptp_feature_enable_82580()
515 (rq->extts.flags & PTP_EXTTS_EDGES) != PTP_EXTTS_EDGES) in igb_ptp_feature_enable_82580()
516 return -EOPNOTSUPP; in igb_ptp_feature_enable_82580()
519 pin = ptp_find_pin(igb->ptp_clock, PTP_PF_EXTTS, in igb_ptp_feature_enable_82580()
520 rq->extts.index); in igb_ptp_feature_enable_82580()
521 if (pin < 0) in igb_ptp_feature_enable_82580()
522 return -EBUSY; in igb_ptp_feature_enable_82580()
524 if (rq->extts.index == 1) { in igb_ptp_feature_enable_82580()
531 spin_lock_irqsave(&igb->tmreg_lock, flags); in igb_ptp_feature_enable_82580()
535 igb_pin_extts(igb, rq->extts.index, pin); in igb_ptp_feature_enable_82580()
544 spin_unlock_irqrestore(&igb->tmreg_lock, flags); in igb_ptp_feature_enable_82580()
549 if (rq->perout.flags) in igb_ptp_feature_enable_82580()
550 return -EOPNOTSUPP; in igb_ptp_feature_enable_82580()
553 pin = ptp_find_pin(igb->ptp_clock, PTP_PF_PEROUT, in igb_ptp_feature_enable_82580()
554 rq->perout.index); in igb_ptp_feature_enable_82580()
555 if (pin < 0) in igb_ptp_feature_enable_82580()
556 return -EBUSY; in igb_ptp_feature_enable_82580()
558 ts.tv_sec = rq->perout.period.sec; in igb_ptp_feature_enable_82580()
559 ts.tv_nsec = rq->perout.period.nsec; in igb_ptp_feature_enable_82580()
563 return -EINVAL; in igb_ptp_feature_enable_82580()
565 if (rq->perout.index == 1) { in igb_ptp_feature_enable_82580()
576 spin_lock_irqsave(&igb->tmreg_lock, flags); in igb_ptp_feature_enable_82580()
579 if (rq->perout.index == 1) { in igb_ptp_feature_enable_82580()
587 int i = rq->perout.index; in igb_ptp_feature_enable_82580()
594 now = timecounter_cyc2time(&igb->tc, systim); in igb_ptp_feature_enable_82580()
596 if (pin < 2) { in igb_ptp_feature_enable_82580()
605 systim = systim + (ns - rem); in igb_ptp_feature_enable_82580()
607 /* synchronize pin level with rising/falling edges */ in igb_ptp_feature_enable_82580()
623 start = ns_to_timespec64(systim + (ns - rem)); in igb_ptp_feature_enable_82580()
624 igb_pin_perout(igb, i, pin, 0); in igb_ptp_feature_enable_82580()
625 igb->perout[i].start.tv_sec = start.tv_sec; in igb_ptp_feature_enable_82580()
626 igb->perout[i].start.tv_nsec = start.tv_nsec; in igb_ptp_feature_enable_82580()
627 igb->perout[i].period.tv_sec = ts.tv_sec; in igb_ptp_feature_enable_82580()
628 igb->perout[i].period.tv_nsec = ts.tv_nsec; in igb_ptp_feature_enable_82580()
637 spin_unlock_irqrestore(&igb->tmreg_lock, flags); in igb_ptp_feature_enable_82580()
641 return -EOPNOTSUPP; in igb_ptp_feature_enable_82580()
644 return -EOPNOTSUPP; in igb_ptp_feature_enable_82580()
652 struct e1000_hw *hw = &igb->hw; in igb_ptp_feature_enable_i210()
656 int use_freq = 0, pin = -1; in igb_ptp_feature_enable_i210() local
659 switch (rq->type) { in igb_ptp_feature_enable_i210()
662 if (rq->extts.flags & ~(PTP_ENABLE_FEATURE | in igb_ptp_feature_enable_i210()
666 return -EOPNOTSUPP; in igb_ptp_feature_enable_i210()
668 /* Reject requests failing to enable both edges. */ in igb_ptp_feature_enable_i210()
669 if ((rq->extts.flags & PTP_STRICT_FLAGS) && in igb_ptp_feature_enable_i210()
670 (rq->extts.flags & PTP_ENABLE_FEATURE) && in igb_ptp_feature_enable_i210()
671 (rq->extts.flags & PTP_EXTTS_EDGES) != PTP_EXTTS_EDGES) in igb_ptp_feature_enable_i210()
672 return -EOPNOTSUPP; in igb_ptp_feature_enable_i210()
675 pin = ptp_find_pin(igb->ptp_clock, PTP_PF_EXTTS, in igb_ptp_feature_enable_i210()
676 rq->extts.index); in igb_ptp_feature_enable_i210()
677 if (pin < 0) in igb_ptp_feature_enable_i210()
678 return -EBUSY; in igb_ptp_feature_enable_i210()
680 if (rq->extts.index == 1) { in igb_ptp_feature_enable_i210()
687 spin_lock_irqsave(&igb->tmreg_lock, flags); in igb_ptp_feature_enable_i210()
691 igb_pin_extts(igb, rq->extts.index, pin); in igb_ptp_feature_enable_i210()
700 spin_unlock_irqrestore(&igb->tmreg_lock, flags); in igb_ptp_feature_enable_i210()
705 if (rq->perout.flags) in igb_ptp_feature_enable_i210()
706 return -EOPNOTSUPP; in igb_ptp_feature_enable_i210()
709 pin = ptp_find_pin(igb->ptp_clock, PTP_PF_PEROUT, in igb_ptp_feature_enable_i210()
710 rq->perout.index); in igb_ptp_feature_enable_i210()
711 if (pin < 0) in igb_ptp_feature_enable_i210()
712 return -EBUSY; in igb_ptp_feature_enable_i210()
714 ts.tv_sec = rq->perout.period.sec; in igb_ptp_feature_enable_i210()
715 ts.tv_nsec = rq->perout.period.nsec; in igb_ptp_feature_enable_i210()
721 return -EINVAL; in igb_ptp_feature_enable_i210()
725 if (rq->perout.index == 1) { in igb_ptp_feature_enable_i210()
748 spin_lock_irqsave(&igb->tmreg_lock, flags); in igb_ptp_feature_enable_i210()
751 if (rq->perout.index == 1) { in igb_ptp_feature_enable_i210()
759 int i = rq->perout.index; in igb_ptp_feature_enable_i210()
760 igb_pin_perout(igb, i, pin, use_freq); in igb_ptp_feature_enable_i210()
761 igb->perout[i].start.tv_sec = rq->perout.start.sec; in igb_ptp_feature_enable_i210()
762 igb->perout[i].start.tv_nsec = rq->perout.start.nsec; in igb_ptp_feature_enable_i210()
763 igb->perout[i].period.tv_sec = ts.tv_sec; in igb_ptp_feature_enable_i210()
764 igb->perout[i].period.tv_nsec = ts.tv_nsec; in igb_ptp_feature_enable_i210()
765 wr32(trgttimh, rq->perout.start.sec); in igb_ptp_feature_enable_i210()
766 wr32(trgttiml, rq->perout.start.nsec); in igb_ptp_feature_enable_i210()
774 spin_unlock_irqrestore(&igb->tmreg_lock, flags); in igb_ptp_feature_enable_i210()
778 spin_lock_irqsave(&igb->tmreg_lock, flags); in igb_ptp_feature_enable_i210()
784 igb->pps_sys_wrap_on = !!on; in igb_ptp_feature_enable_i210()
786 spin_unlock_irqrestore(&igb->tmreg_lock, flags); in igb_ptp_feature_enable_i210()
790 return -EOPNOTSUPP; in igb_ptp_feature_enable_i210()
796 return -EOPNOTSUPP; in igb_ptp_feature_enable()
799 static int igb_ptp_verify_pin(struct ptp_clock_info *ptp, unsigned int pin, in igb_ptp_verify_pin() argument
808 return -1; in igb_ptp_verify_pin()
824 struct e1000_hw *hw = &adapter->hw; in igb_ptp_tx_work()
827 if (!adapter->ptp_tx_skb) in igb_ptp_tx_work()
830 if (time_is_before_jiffies(adapter->ptp_tx_start + in igb_ptp_tx_work()
832 dev_kfree_skb_any(adapter->ptp_tx_skb); in igb_ptp_tx_work()
833 adapter->ptp_tx_skb = NULL; in igb_ptp_tx_work()
834 clear_bit_unlock(__IGB_PTP_TX_IN_PROGRESS, &adapter->state); in igb_ptp_tx_work()
835 adapter->tx_hwtstamp_timeouts++; in igb_ptp_tx_work()
836 /* Clear the tx valid bit in TSYNCTXCTL register to enable in igb_ptp_tx_work()
840 dev_warn(&adapter->pdev->dev, "clearing Tx timestamp hang\n"); in igb_ptp_tx_work()
849 schedule_work(&adapter->ptp_tx_work); in igb_ptp_tx_work()
860 ns = timecounter_read(&igb->tc); in igb_ptp_overflow_check()
866 schedule_delayed_work(&igb->ptp_overflow_work, in igb_ptp_overflow_check()
871 * igb_ptp_rx_hang - detect error case when Rx timestamp registers latched
881 struct e1000_hw *hw = &adapter->hw; in igb_ptp_rx_hang()
885 /* Other hardware uses per-packet timestamps */ in igb_ptp_rx_hang()
886 if (hw->mac.type != e1000_82576) in igb_ptp_rx_hang()
893 adapter->last_rx_ptp_check = jiffies; in igb_ptp_rx_hang()
898 rx_event = adapter->last_rx_ptp_check; in igb_ptp_rx_hang()
899 if (time_after(adapter->last_rx_timestamp, rx_event)) in igb_ptp_rx_hang()
900 rx_event = adapter->last_rx_timestamp; in igb_ptp_rx_hang()
905 adapter->last_rx_ptp_check = jiffies; in igb_ptp_rx_hang()
906 adapter->rx_hwtstamp_cleared++; in igb_ptp_rx_hang()
907 dev_warn(&adapter->pdev->dev, "clearing Rx timestamp hang\n"); in igb_ptp_rx_hang()
912 * igb_ptp_tx_hang - detect error case where Tx timestamp never finishes
917 struct e1000_hw *hw = &adapter->hw; in igb_ptp_tx_hang()
918 bool timeout = time_is_before_jiffies(adapter->ptp_tx_start + in igb_ptp_tx_hang()
921 if (!adapter->ptp_tx_skb) in igb_ptp_tx_hang()
924 if (!test_bit(__IGB_PTP_TX_IN_PROGRESS, &adapter->state)) in igb_ptp_tx_hang()
932 cancel_work_sync(&adapter->ptp_tx_work); in igb_ptp_tx_hang()
933 dev_kfree_skb_any(adapter->ptp_tx_skb); in igb_ptp_tx_hang()
934 adapter->ptp_tx_skb = NULL; in igb_ptp_tx_hang()
935 clear_bit_unlock(__IGB_PTP_TX_IN_PROGRESS, &adapter->state); in igb_ptp_tx_hang()
936 adapter->tx_hwtstamp_timeouts++; in igb_ptp_tx_hang()
937 /* Clear the tx valid bit in TSYNCTXCTL register to enable in igb_ptp_tx_hang()
941 dev_warn(&adapter->pdev->dev, "clearing Tx timestamp hang\n"); in igb_ptp_tx_hang()
946 * igb_ptp_tx_hwtstamp - utility function which checks for TX time stamp
955 struct sk_buff *skb = adapter->ptp_tx_skb; in igb_ptp_tx_hwtstamp()
956 struct e1000_hw *hw = &adapter->hw; in igb_ptp_tx_hwtstamp()
966 if (hw->mac.type == e1000_i210 || hw->mac.type == e1000_i211) { in igb_ptp_tx_hwtstamp()
967 switch (adapter->link_speed) { in igb_ptp_tx_hwtstamp()
988 adapter->ptp_tx_skb = NULL; in igb_ptp_tx_hwtstamp()
989 clear_bit_unlock(__IGB_PTP_TX_IN_PROGRESS, &adapter->state); in igb_ptp_tx_hwtstamp()
997 * igb_ptp_rx_pktstamp - retrieve Rx per packet timestamp
1011 struct igb_adapter *adapter = q_vector->adapter; in igb_ptp_rx_pktstamp()
1012 struct e1000_hw *hw = &adapter->hw; in igb_ptp_rx_pktstamp()
1017 if (!(adapter->ptp_flags & IGB_PTP_ENABLED)) in igb_ptp_rx_pktstamp()
1032 if (hw->mac.type == e1000_i210 || hw->mac.type == e1000_i211) { in igb_ptp_rx_pktstamp()
1033 switch (adapter->link_speed) { in igb_ptp_rx_pktstamp()
1052 * igb_ptp_rx_rgtstamp - retrieve Rx timestamp stored in register
1061 struct igb_adapter *adapter = q_vector->adapter; in igb_ptp_rx_rgtstamp()
1062 struct e1000_hw *hw = &adapter->hw; in igb_ptp_rx_rgtstamp()
1066 if (!(adapter->ptp_flags & IGB_PTP_ENABLED)) in igb_ptp_rx_rgtstamp()
1088 if (adapter->hw.mac.type == e1000_i210) { in igb_ptp_rx_rgtstamp()
1089 switch (adapter->link_speed) { in igb_ptp_rx_rgtstamp()
1101 skb_hwtstamps(skb)->hwtstamp = in igb_ptp_rx_rgtstamp()
1102 ktime_sub_ns(skb_hwtstamps(skb)->hwtstamp, adjust); in igb_ptp_rx_rgtstamp()
1104 /* Update the last_rx_timestamp timer in order to enable watchdog check in igb_ptp_rx_rgtstamp()
1107 adapter->last_rx_timestamp = jiffies; in igb_ptp_rx_rgtstamp()
1111 * igb_ptp_get_ts_config - get hardware time stamping config
1122 struct hwtstamp_config *config = &adapter->tstamp_config; in igb_ptp_get_ts_config()
1124 return copy_to_user(ifr->ifr_data, config, sizeof(*config)) ? in igb_ptp_get_ts_config()
1125 -EFAULT : 0; in igb_ptp_get_ts_config()
1129 * igb_ptp_set_timestamp_mode - setup hardware for timestamping
1148 struct e1000_hw *hw = &adapter->hw; in igb_ptp_set_timestamp_mode()
1156 switch (config->tx_type) { in igb_ptp_set_timestamp_mode()
1163 return -ERANGE; in igb_ptp_set_timestamp_mode()
1166 switch (config->rx_filter) { in igb_ptp_set_timestamp_mode()
1190 config->rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT; in igb_ptp_set_timestamp_mode()
1200 if (hw->mac.type != e1000_82576) { in igb_ptp_set_timestamp_mode()
1202 config->rx_filter = HWTSTAMP_FILTER_ALL; in igb_ptp_set_timestamp_mode()
1207 config->rx_filter = HWTSTAMP_FILTER_NONE; in igb_ptp_set_timestamp_mode()
1208 return -ERANGE; in igb_ptp_set_timestamp_mode()
1211 if (hw->mac.type == e1000_82575) { in igb_ptp_set_timestamp_mode()
1213 return -EINVAL; in igb_ptp_set_timestamp_mode()
1217 /* Per-packet timestamping only works if all packets are in igb_ptp_set_timestamp_mode()
1218 * timestamped, so enable timestamping in all packets as in igb_ptp_set_timestamp_mode()
1221 if ((hw->mac.type >= e1000_82580) && tsync_rx_ctl) { in igb_ptp_set_timestamp_mode()
1224 config->rx_filter = HWTSTAMP_FILTER_ALL; in igb_ptp_set_timestamp_mode()
1228 if ((hw->mac.type == e1000_i210) || in igb_ptp_set_timestamp_mode()
1229 (hw->mac.type == e1000_i211)) { in igb_ptp_set_timestamp_mode()
1236 /* enable/disable TX */ in igb_ptp_set_timestamp_mode()
1242 /* enable/disable RX */ in igb_ptp_set_timestamp_mode()
1254 (E1000_ETQF_FILTER_ENABLE | /* enable filter */ in igb_ptp_set_timestamp_mode()
1255 E1000_ETQF_1588 | /* enable timestamping */ in igb_ptp_set_timestamp_mode()
1264 | E1000_FTQF_1588_TIME_STAMP /* Enable Timestamping */ in igb_ptp_set_timestamp_mode()
1266 ftqf &= ~E1000_FTQF_MASK_PROTO_BP; /* enable protocol check */ in igb_ptp_set_timestamp_mode()
1271 if (hw->mac.type == e1000_82576) { in igb_ptp_set_timestamp_mode()
1272 /* enable source port check */ in igb_ptp_set_timestamp_mode()
1292 * igb_ptp_set_ts_config - set hardware time stamping config
1303 if (copy_from_user(&config, ifr->ifr_data, sizeof(config))) in igb_ptp_set_ts_config()
1304 return -EFAULT; in igb_ptp_set_ts_config()
1311 memcpy(&adapter->tstamp_config, &config, in igb_ptp_set_ts_config()
1312 sizeof(adapter->tstamp_config)); in igb_ptp_set_ts_config()
1314 return copy_to_user(ifr->ifr_data, &config, sizeof(config)) ? in igb_ptp_set_ts_config()
1315 -EFAULT : 0; in igb_ptp_set_ts_config()
1319 * igb_ptp_init - Initialize PTP functionality
1327 struct e1000_hw *hw = &adapter->hw; in igb_ptp_init()
1328 struct net_device *netdev = adapter->netdev; in igb_ptp_init()
1330 switch (hw->mac.type) { in igb_ptp_init()
1332 snprintf(adapter->ptp_caps.name, 16, "%pm", netdev->dev_addr); in igb_ptp_init()
1333 adapter->ptp_caps.owner = THIS_MODULE; in igb_ptp_init()
1334 adapter->ptp_caps.max_adj = 999999881; in igb_ptp_init()
1335 adapter->ptp_caps.n_ext_ts = 0; in igb_ptp_init()
1336 adapter->ptp_caps.pps = 0; in igb_ptp_init()
1337 adapter->ptp_caps.adjfine = igb_ptp_adjfine_82576; in igb_ptp_init()
1338 adapter->ptp_caps.adjtime = igb_ptp_adjtime_82576; in igb_ptp_init()
1339 adapter->ptp_caps.gettimex64 = igb_ptp_gettimex_82576; in igb_ptp_init()
1340 adapter->ptp_caps.settime64 = igb_ptp_settime_82576; in igb_ptp_init()
1341 adapter->ptp_caps.enable = igb_ptp_feature_enable; in igb_ptp_init()
1342 adapter->cc.read = igb_ptp_read_82576; in igb_ptp_init()
1343 adapter->cc.mask = CYCLECOUNTER_MASK(64); in igb_ptp_init()
1344 adapter->cc.mult = 1; in igb_ptp_init()
1345 adapter->cc.shift = IGB_82576_TSYNC_SHIFT; in igb_ptp_init()
1346 adapter->ptp_flags |= IGB_PTP_OVERFLOW_CHECK; in igb_ptp_init()
1352 snprintf(adapter->ptp_caps.name, 16, "%pm", netdev->dev_addr); in igb_ptp_init()
1353 adapter->ptp_caps.owner = THIS_MODULE; in igb_ptp_init()
1354 adapter->ptp_caps.max_adj = 62499999; in igb_ptp_init()
1355 adapter->ptp_caps.n_ext_ts = IGB_N_EXTTS; in igb_ptp_init()
1356 adapter->ptp_caps.n_per_out = IGB_N_PEROUT; in igb_ptp_init()
1357 adapter->ptp_caps.n_pins = IGB_N_SDP; in igb_ptp_init()
1358 adapter->ptp_caps.pps = 0; in igb_ptp_init()
1359 adapter->ptp_caps.pin_config = adapter->sdp_config; in igb_ptp_init()
1360 adapter->ptp_caps.adjfine = igb_ptp_adjfine_82580; in igb_ptp_init()
1361 adapter->ptp_caps.adjtime = igb_ptp_adjtime_82576; in igb_ptp_init()
1362 adapter->ptp_caps.gettimex64 = igb_ptp_gettimex_82580; in igb_ptp_init()
1363 adapter->ptp_caps.settime64 = igb_ptp_settime_82576; in igb_ptp_init()
1364 adapter->ptp_caps.enable = igb_ptp_feature_enable_82580; in igb_ptp_init()
1365 adapter->ptp_caps.verify = igb_ptp_verify_pin; in igb_ptp_init()
1366 adapter->cc.read = igb_ptp_read_82580; in igb_ptp_init()
1367 adapter->cc.mask = CYCLECOUNTER_MASK(IGB_NBITS_82580); in igb_ptp_init()
1368 adapter->cc.mult = 1; in igb_ptp_init()
1369 adapter->cc.shift = 0; in igb_ptp_init()
1370 adapter->ptp_flags |= IGB_PTP_OVERFLOW_CHECK; in igb_ptp_init()
1375 snprintf(adapter->ptp_caps.name, 16, "%pm", netdev->dev_addr); in igb_ptp_init()
1376 adapter->ptp_caps.owner = THIS_MODULE; in igb_ptp_init()
1377 adapter->ptp_caps.max_adj = 62499999; in igb_ptp_init()
1378 adapter->ptp_caps.n_ext_ts = IGB_N_EXTTS; in igb_ptp_init()
1379 adapter->ptp_caps.n_per_out = IGB_N_PEROUT; in igb_ptp_init()
1380 adapter->ptp_caps.n_pins = IGB_N_SDP; in igb_ptp_init()
1381 adapter->ptp_caps.pps = 1; in igb_ptp_init()
1382 adapter->ptp_caps.pin_config = adapter->sdp_config; in igb_ptp_init()
1383 adapter->ptp_caps.adjfine = igb_ptp_adjfine_82580; in igb_ptp_init()
1384 adapter->ptp_caps.adjtime = igb_ptp_adjtime_i210; in igb_ptp_init()
1385 adapter->ptp_caps.gettimex64 = igb_ptp_gettimex_i210; in igb_ptp_init()
1386 adapter->ptp_caps.settime64 = igb_ptp_settime_i210; in igb_ptp_init()
1387 adapter->ptp_caps.enable = igb_ptp_feature_enable_i210; in igb_ptp_init()
1388 adapter->ptp_caps.verify = igb_ptp_verify_pin; in igb_ptp_init()
1391 adapter->ptp_clock = NULL; in igb_ptp_init()
1395 adapter->ptp_clock = ptp_clock_register(&adapter->ptp_caps, in igb_ptp_init()
1396 &adapter->pdev->dev); in igb_ptp_init()
1397 if (IS_ERR(adapter->ptp_clock)) { in igb_ptp_init()
1398 adapter->ptp_clock = NULL; in igb_ptp_init()
1399 dev_err(&adapter->pdev->dev, "ptp_clock_register failed\n"); in igb_ptp_init()
1400 } else if (adapter->ptp_clock) { in igb_ptp_init()
1401 dev_info(&adapter->pdev->dev, "added PHC on %s\n", in igb_ptp_init()
1402 adapter->netdev->name); in igb_ptp_init()
1403 adapter->ptp_flags |= IGB_PTP_ENABLED; in igb_ptp_init()
1405 spin_lock_init(&adapter->tmreg_lock); in igb_ptp_init()
1406 INIT_WORK(&adapter->ptp_tx_work, igb_ptp_tx_work); in igb_ptp_init()
1408 if (adapter->ptp_flags & IGB_PTP_OVERFLOW_CHECK) in igb_ptp_init()
1409 INIT_DELAYED_WORK(&adapter->ptp_overflow_work, in igb_ptp_init()
1412 adapter->tstamp_config.rx_filter = HWTSTAMP_FILTER_NONE; in igb_ptp_init()
1413 adapter->tstamp_config.tx_type = HWTSTAMP_TX_OFF; in igb_ptp_init()
1420 * igb_ptp_sdp_init - utility function which inits the SDP config structs
1428 struct ptp_pin_desc *ppd = &adapter->sdp_config[i]; in igb_ptp_sdp_init()
1430 snprintf(ppd->name, sizeof(ppd->name), "SDP%d", i); in igb_ptp_sdp_init()
1431 ppd->index = i; in igb_ptp_sdp_init()
1432 ppd->func = PTP_PF_NONE; in igb_ptp_sdp_init()
1437 * igb_ptp_suspend - Disable PTP work items and prepare for suspend
1445 if (!(adapter->ptp_flags & IGB_PTP_ENABLED)) in igb_ptp_suspend()
1448 if (adapter->ptp_flags & IGB_PTP_OVERFLOW_CHECK) in igb_ptp_suspend()
1449 cancel_delayed_work_sync(&adapter->ptp_overflow_work); in igb_ptp_suspend()
1451 cancel_work_sync(&adapter->ptp_tx_work); in igb_ptp_suspend()
1452 if (adapter->ptp_tx_skb) { in igb_ptp_suspend()
1453 dev_kfree_skb_any(adapter->ptp_tx_skb); in igb_ptp_suspend()
1454 adapter->ptp_tx_skb = NULL; in igb_ptp_suspend()
1455 clear_bit_unlock(__IGB_PTP_TX_IN_PROGRESS, &adapter->state); in igb_ptp_suspend()
1460 * igb_ptp_stop - Disable PTP device and stop the overflow check.
1469 if (adapter->ptp_clock) { in igb_ptp_stop()
1470 ptp_clock_unregister(adapter->ptp_clock); in igb_ptp_stop()
1471 dev_info(&adapter->pdev->dev, "removed PHC on %s\n", in igb_ptp_stop()
1472 adapter->netdev->name); in igb_ptp_stop()
1473 adapter->ptp_flags &= ~IGB_PTP_ENABLED; in igb_ptp_stop()
1478 * igb_ptp_reset - Re-enable the adapter for PTP following a reset.
1481 * This function handles the reset work required to re-enable the PTP device.
1485 struct e1000_hw *hw = &adapter->hw; in igb_ptp_reset()
1489 igb_ptp_set_timestamp_mode(adapter, &adapter->tstamp_config); in igb_ptp_reset()
1491 spin_lock_irqsave(&adapter->tmreg_lock, flags); in igb_ptp_reset()
1493 switch (adapter->hw.mac.type) { in igb_ptp_reset()
1507 (adapter->pps_sys_wrap_on ? TSINTR_SYS_WRAP : 0)); in igb_ptp_reset()
1515 /* Re-initialize the timer. */ in igb_ptp_reset()
1516 if ((hw->mac.type == e1000_i210) || (hw->mac.type == e1000_i211)) { in igb_ptp_reset()
1521 timecounter_init(&adapter->tc, &adapter->cc, in igb_ptp_reset()
1525 spin_unlock_irqrestore(&adapter->tmreg_lock, flags); in igb_ptp_reset()
1529 if (adapter->ptp_flags & IGB_PTP_OVERFLOW_CHECK) in igb_ptp_reset()
1530 schedule_delayed_work(&adapter->ptp_overflow_work, in igb_ptp_reset()