Lines Matching full:tx
115 state1 = "SMA1 Tx U.FL1 disabled"; in ice_ptp_update_sma_data()
122 /* U.FL1 Tx will always enable SMA1 Rx */ in ice_ptp_update_sma_data()
123 state1 = "SMA1 Rx, U.FL1 Tx"; in ice_ptp_update_sma_data()
131 state2 = "SMA2 Tx, U.FL2 disabled"; in ice_ptp_update_sma_data()
142 state2 = "SMA2 Tx, U.FL2 Rx"; in ice_ptp_update_sma_data()
191 * ice_ptp_cfg_tx_interrupt - Configure Tx timestamp interrupt for the device
194 * Program the device to respond appropriately to the Tx timestamp interrupt
220 /* Configure the Tx timestamp interrupt */ in ice_ptp_cfg_tx_interrupt()
368 * This algorithm works even if the PHC time was updated after a Tx timestamp
369 * was requested, but before the Tx timestamp event was reported from
378 * a second, and (b) discarding any Tx timestamp packet if it has waited for
415 * The Tx and Rx timestamps are 40 bits wide, including 32 bits of nominal
453 * ice_ptp_is_tx_tracker_up - Check if Tx tracker is ready for new timestamps
454 * @tx: the PTP Tx timestamp tracker to check
456 * Check that a given PTP Tx timestamp tracker is up, i.e. that it is ready
459 * Assumes the tx->lock spinlock is already held.
462 ice_ptp_is_tx_tracker_up(struct ice_ptp_tx *tx) in ice_ptp_is_tx_tracker_up() argument
464 lockdep_assert_held(&tx->lock); in ice_ptp_is_tx_tracker_up()
466 return tx->init && !tx->calibrating; in ice_ptp_is_tx_tracker_up()
470 * ice_ptp_req_tx_single_tstamp - Request Tx timestamp for a port from FW
471 * @tx: the PTP Tx timestamp tracker
474 void ice_ptp_req_tx_single_tstamp(struct ice_ptp_tx *tx, u8 idx) in ice_ptp_req_tx_single_tstamp() argument
482 if (!tx->init) in ice_ptp_req_tx_single_tstamp()
485 ptp_port = container_of(tx, struct ice_ptp_port, tx); in ice_ptp_req_tx_single_tstamp()
490 if (time_is_before_jiffies(tx->tstamps[idx].start + 2 * HZ)) { in ice_ptp_req_tx_single_tstamp()
491 /* Count the number of Tx timestamps that timed out */ in ice_ptp_req_tx_single_tstamp()
494 skb = tx->tstamps[idx].skb; in ice_ptp_req_tx_single_tstamp()
495 tx->tstamps[idx].skb = NULL; in ice_ptp_req_tx_single_tstamp()
496 clear_bit(idx, tx->in_use); in ice_ptp_req_tx_single_tstamp()
502 ice_trace(tx_tstamp_fw_req, tx->tstamps[idx].skb, idx); in ice_ptp_req_tx_single_tstamp()
512 tx->last_ll_ts_idx_read = idx; in ice_ptp_req_tx_single_tstamp()
518 * ice_ptp_complete_tx_single_tstamp - Complete Tx timestamp for a port
519 * @tx: the PTP Tx timestamp tracker
521 void ice_ptp_complete_tx_single_tstamp(struct ice_ptp_tx *tx) in ice_ptp_complete_tx_single_tstamp() argument
524 u8 idx = tx->last_ll_ts_idx_read; in ice_ptp_complete_tx_single_tstamp()
535 if (!tx->init || tx->last_ll_ts_idx_read < 0) in ice_ptp_complete_tx_single_tstamp()
538 ptp_port = container_of(tx, struct ice_ptp_port, tx); in ice_ptp_complete_tx_single_tstamp()
543 ice_trace(tx_tstamp_fw_done, tx->tstamps[idx].skb, idx); in ice_ptp_complete_tx_single_tstamp()
565 dev_err(ice_pf_to_dev(pf), "Failed to get the Tx tstamp - FW not ready"); in ice_ptp_complete_tx_single_tstamp()
575 if (raw_tstamp == tx->tstamps[idx].cached_tstamp) in ice_ptp_complete_tx_single_tstamp()
578 tx->tstamps[idx].cached_tstamp = raw_tstamp; in ice_ptp_complete_tx_single_tstamp()
579 clear_bit(idx, tx->in_use); in ice_ptp_complete_tx_single_tstamp()
580 skb = tx->tstamps[idx].skb; in ice_ptp_complete_tx_single_tstamp()
581 tx->tstamps[idx].skb = NULL; in ice_ptp_complete_tx_single_tstamp()
582 if (test_and_clear_bit(idx, tx->stale)) in ice_ptp_complete_tx_single_tstamp()
605 * ice_ptp_process_tx_tstamp - Process Tx timestamps for a port
606 * @tx: the PTP Tx timestamp tracker
621 * Note that we do not hold the tracking lock while reading the Tx timestamp.
628 * function, or during teardown when the Tx timestamp tracker is being
632 * If a Tx thread starts a new timestamp, we might not begin processing it
635 * If a Tx thread starts a new timestamp just after this function exits, the
641 * this case, software will set the stale bit for any outstanding Tx
645 * If a Tx packet has been waiting for more than 2 seconds, it is not possible
648 * we detect a Tx timestamp request that has waited for this long we assume
652 static void ice_ptp_process_tx_tstamp(struct ice_ptp_tx *tx) in ice_ptp_process_tx_tstamp() argument
663 ptp_port = container_of(tx, struct ice_ptp_port, tx); in ice_ptp_process_tx_tstamp()
667 /* Read the Tx ready status first */ in ice_ptp_process_tx_tstamp()
668 if (tx->has_ready_bitmap) { in ice_ptp_process_tx_tstamp()
669 err = ice_get_phy_tx_tstamp_ready(hw, tx->block, &tstamp_ready); in ice_ptp_process_tx_tstamp()
677 for_each_set_bit(idx, tx->in_use, tx->len) { in ice_ptp_process_tx_tstamp()
679 u8 phy_idx = idx + tx->offset; in ice_ptp_process_tx_tstamp()
685 if (time_is_before_jiffies(tx->tstamps[idx].start + 2 * HZ)) { in ice_ptp_process_tx_tstamp()
688 /* Count the number of Tx timestamps that timed out */ in ice_ptp_process_tx_tstamp()
700 if (tx->has_ready_bitmap && in ice_ptp_process_tx_tstamp()
708 ice_trace(tx_tstamp_fw_req, tx->tstamps[idx].skb, idx); in ice_ptp_process_tx_tstamp()
710 err = ice_read_phy_tstamp(hw, tx->block, phy_idx, &raw_tstamp); in ice_ptp_process_tx_tstamp()
714 ice_trace(tx_tstamp_fw_done, tx->tstamps[idx].skb, idx); in ice_ptp_process_tx_tstamp()
721 if (!drop_ts && !tx->has_ready_bitmap && in ice_ptp_process_tx_tstamp()
722 raw_tstamp == tx->tstamps[idx].cached_tstamp) in ice_ptp_process_tx_tstamp()
730 spin_lock_irqsave(&tx->lock, flags); in ice_ptp_process_tx_tstamp()
731 if (!tx->has_ready_bitmap && raw_tstamp) in ice_ptp_process_tx_tstamp()
732 tx->tstamps[idx].cached_tstamp = raw_tstamp; in ice_ptp_process_tx_tstamp()
733 clear_bit(idx, tx->in_use); in ice_ptp_process_tx_tstamp()
734 skb = tx->tstamps[idx].skb; in ice_ptp_process_tx_tstamp()
735 tx->tstamps[idx].skb = NULL; in ice_ptp_process_tx_tstamp()
736 if (test_and_clear_bit(idx, tx->stale)) in ice_ptp_process_tx_tstamp()
738 spin_unlock_irqrestore(&tx->lock, flags); in ice_ptp_process_tx_tstamp()
764 * ice_ptp_tx_tstamp_owner - Process Tx timestamps for all ports on the device
774 struct ice_ptp_tx *tx = &port->tx; in ice_ptp_tx_tstamp_owner() local
776 if (!tx || !tx->init) in ice_ptp_tx_tstamp_owner()
779 ice_ptp_process_tx_tstamp(tx); in ice_ptp_tx_tstamp_owner()
787 /* Read the Tx ready status first */ in ice_ptp_tx_tstamp_owner()
799 * ice_ptp_tx_tstamp - Process Tx timestamps for this function.
800 * @tx: Tx tracking structure to initialize
803 * Tx timestamps, or ICE_TX_TSTAMP_WORK_DONE otherwise.
805 static enum ice_tx_tstamp_work ice_ptp_tx_tstamp(struct ice_ptp_tx *tx) in ice_ptp_tx_tstamp() argument
810 if (!tx->init) in ice_ptp_tx_tstamp()
813 /* Process the Tx timestamp tracker */ in ice_ptp_tx_tstamp()
814 ice_ptp_process_tx_tstamp(tx); in ice_ptp_tx_tstamp()
816 /* Check if there are outstanding Tx timestamps */ in ice_ptp_tx_tstamp()
817 spin_lock_irqsave(&tx->lock, flags); in ice_ptp_tx_tstamp()
818 more_timestamps = tx->init && !bitmap_empty(tx->in_use, tx->len); in ice_ptp_tx_tstamp()
819 spin_unlock_irqrestore(&tx->lock, flags); in ice_ptp_tx_tstamp()
828 * ice_ptp_alloc_tx_tracker - Initialize tracking for Tx timestamps
829 * @tx: Tx tracking structure to initialize
835 ice_ptp_alloc_tx_tracker(struct ice_ptp_tx *tx) in ice_ptp_alloc_tx_tracker() argument
840 tstamps = kcalloc(tx->len, sizeof(*tstamps), GFP_KERNEL); in ice_ptp_alloc_tx_tracker()
841 in_use = bitmap_zalloc(tx->len, GFP_KERNEL); in ice_ptp_alloc_tx_tracker()
842 stale = bitmap_zalloc(tx->len, GFP_KERNEL); in ice_ptp_alloc_tx_tracker()
852 tx->tstamps = tstamps; in ice_ptp_alloc_tx_tracker()
853 tx->in_use = in_use; in ice_ptp_alloc_tx_tracker()
854 tx->stale = stale; in ice_ptp_alloc_tx_tracker()
855 tx->init = 1; in ice_ptp_alloc_tx_tracker()
856 tx->last_ll_ts_idx_read = -1; in ice_ptp_alloc_tx_tracker()
858 spin_lock_init(&tx->lock); in ice_ptp_alloc_tx_tracker()
866 * @tx: the tracker to flush
868 * Called during teardown when a Tx tracker is being removed.
871 ice_ptp_flush_tx_tracker(struct ice_pf *pf, struct ice_ptp_tx *tx) in ice_ptp_flush_tx_tracker() argument
879 err = ice_get_phy_tx_tstamp_ready(hw, tx->block, &tstamp_ready); in ice_ptp_flush_tx_tracker()
881 dev_dbg(ice_pf_to_dev(pf), "Failed to get the Tx tstamp ready bitmap for block %u, err %d\n", in ice_ptp_flush_tx_tracker()
882 tx->block, err); in ice_ptp_flush_tx_tracker()
884 /* If we fail to read the Tx timestamp ready bitmap just in ice_ptp_flush_tx_tracker()
890 for_each_set_bit(idx, tx->in_use, tx->len) { in ice_ptp_flush_tx_tracker()
891 u8 phy_idx = idx + tx->offset; in ice_ptp_flush_tx_tracker()
896 ice_clear_phy_tstamp(hw, tx->block, phy_idx); in ice_ptp_flush_tx_tracker()
898 spin_lock_irqsave(&tx->lock, flags); in ice_ptp_flush_tx_tracker()
899 skb = tx->tstamps[idx].skb; in ice_ptp_flush_tx_tracker()
900 tx->tstamps[idx].skb = NULL; in ice_ptp_flush_tx_tracker()
901 clear_bit(idx, tx->in_use); in ice_ptp_flush_tx_tracker()
902 clear_bit(idx, tx->stale); in ice_ptp_flush_tx_tracker()
903 spin_unlock_irqrestore(&tx->lock, flags); in ice_ptp_flush_tx_tracker()
905 /* Count the number of Tx timestamps flushed */ in ice_ptp_flush_tx_tracker()
915 * @tx: the tracker to mark
917 * Mark currently outstanding Tx timestamps as stale. This prevents sending
925 ice_ptp_mark_tx_tracker_stale(struct ice_ptp_tx *tx) in ice_ptp_mark_tx_tracker_stale() argument
929 spin_lock_irqsave(&tx->lock, flags); in ice_ptp_mark_tx_tracker_stale()
930 bitmap_or(tx->stale, tx->stale, tx->in_use, tx->len); in ice_ptp_mark_tx_tracker_stale()
931 spin_unlock_irqrestore(&tx->lock, flags); in ice_ptp_mark_tx_tracker_stale()
938 * Called by the clock owner to flush all the Tx timestamp trackers associated
947 ice_ptp_flush_tx_tracker(ptp_port_to_pf(port), &port->tx); in ice_ptp_flush_all_tx_tracker()
951 * ice_ptp_release_tx_tracker - Release allocated memory for Tx tracker
953 * @tx: Tx tracking structure to release
955 * Free memory associated with the Tx timestamp tracker.
958 ice_ptp_release_tx_tracker(struct ice_pf *pf, struct ice_ptp_tx *tx) in ice_ptp_release_tx_tracker() argument
962 spin_lock_irqsave(&tx->lock, flags); in ice_ptp_release_tx_tracker()
963 tx->init = 0; in ice_ptp_release_tx_tracker()
964 spin_unlock_irqrestore(&tx->lock, flags); in ice_ptp_release_tx_tracker()
969 ice_ptp_flush_tx_tracker(pf, tx); in ice_ptp_release_tx_tracker()
971 kfree(tx->tstamps); in ice_ptp_release_tx_tracker()
972 tx->tstamps = NULL; in ice_ptp_release_tx_tracker()
974 bitmap_free(tx->in_use); in ice_ptp_release_tx_tracker()
975 tx->in_use = NULL; in ice_ptp_release_tx_tracker()
977 bitmap_free(tx->stale); in ice_ptp_release_tx_tracker()
978 tx->stale = NULL; in ice_ptp_release_tx_tracker()
980 tx->len = 0; in ice_ptp_release_tx_tracker()
984 * ice_ptp_init_tx_e82x - Initialize tracking for Tx timestamps
986 * @tx: the Tx tracking structure to initialize
989 * Initialize the Tx timestamp tracker for this port. For generic MAC devices,
996 static int ice_ptp_init_tx_e82x(struct ice_pf *pf, struct ice_ptp_tx *tx, in ice_ptp_init_tx_e82x() argument
999 tx->block = ICE_GET_QUAD_NUM(port); in ice_ptp_init_tx_e82x()
1000 tx->offset = (port % ICE_PORTS_PER_QUAD) * INDEX_PER_PORT_E82X; in ice_ptp_init_tx_e82x()
1001 tx->len = INDEX_PER_PORT_E82X; in ice_ptp_init_tx_e82x()
1002 tx->has_ready_bitmap = 1; in ice_ptp_init_tx_e82x()
1004 return ice_ptp_alloc_tx_tracker(tx); in ice_ptp_init_tx_e82x()
1008 * ice_ptp_init_tx - Initialize tracking for Tx timestamps
1010 * @tx: the Tx tracking structure to initialize
1013 * Initialize the Tx timestamp tracker for this PF. For all PHYs except E82X,
1018 static int ice_ptp_init_tx(struct ice_pf *pf, struct ice_ptp_tx *tx, u8 port) in ice_ptp_init_tx() argument
1020 tx->block = port; in ice_ptp_init_tx()
1021 tx->offset = 0; in ice_ptp_init_tx()
1022 tx->len = INDEX_PER_PORT; in ice_ptp_init_tx()
1028 tx->has_ready_bitmap = pf->hw.mac_type != ICE_MAC_E810; in ice_ptp_init_tx()
1030 return ice_ptp_alloc_tx_tracker(tx); in ice_ptp_init_tx()
1103 * such as after a time adjustment. It marks any currently outstanding Tx
1138 ice_ptp_mark_tx_tracker_stale(&pf->ptp.port.tx); in ice_ptp_reset_cached_phctime()
1194 * ice_ptp_check_tx_fifo - Check whether Tx FIFO is in an OK state
1195 * @port: PTP port for which Tx FIFO is checked
1221 dev_err(ice_pf_to_dev(pf), "PTP failed to check port %d Tx FIFO, err %d\n", in ice_ptp_check_tx_fifo()
1243 "Port %d Tx FIFO still not empty; resetting quad %d\n", in ice_ptp_check_tx_fifo()
1254 * ice_ptp_wait_for_offsets - Check for valid Tx and Rx offsets
1257 * Check whether hardware has completed measuring the Tx and Rx offset values
1261 * registers with the calibrated offset values and enable timestamping. The Tx
1265 * This function reschedules itself until both Tx and Rx calibration have
1293 /* Tx and/or Rx offset not yet configured, try again later */ in ice_ptp_wait_for_offsets()
1371 /* temporarily disable Tx timestamps while calibrating in ice_ptp_port_phy_restart()
1374 spin_lock_irqsave(&ptp_port->tx.lock, flags); in ice_ptp_port_phy_restart()
1375 ptp_port->tx.calibrating = true; in ice_ptp_port_phy_restart()
1376 spin_unlock_irqrestore(&ptp_port->tx.lock, flags); in ice_ptp_port_phy_restart()
1384 /* Enable Tx timestamps right away */ in ice_ptp_port_phy_restart()
1385 spin_lock_irqsave(&ptp_port->tx.lock, flags); in ice_ptp_port_phy_restart()
1386 ptp_port->tx.calibrating = false; in ice_ptp_port_phy_restart()
1387 spin_unlock_irqrestore(&ptp_port->tx.lock, flags); in ice_ptp_port_phy_restart()
2790 * ice_ptp_request_ts - Request an available Tx timestamp index
2791 * @tx: the PTP Tx timestamp tracker to request from
2794 s8 ice_ptp_request_ts(struct ice_ptp_tx *tx, struct sk_buff *skb) in ice_ptp_request_ts() argument
2799 spin_lock_irqsave(&tx->lock, flags); in ice_ptp_request_ts()
2802 if (!ice_ptp_is_tx_tracker_up(tx)) { in ice_ptp_request_ts()
2803 spin_unlock_irqrestore(&tx->lock, flags); in ice_ptp_request_ts()
2808 idx = find_next_zero_bit(tx->in_use, tx->len, in ice_ptp_request_ts()
2809 tx->last_ll_ts_idx_read + 1); in ice_ptp_request_ts()
2810 if (idx == tx->len) in ice_ptp_request_ts()
2811 idx = find_first_zero_bit(tx->in_use, tx->len); in ice_ptp_request_ts()
2813 if (idx < tx->len) { in ice_ptp_request_ts()
2818 set_bit(idx, tx->in_use); in ice_ptp_request_ts()
2819 clear_bit(idx, tx->stale); in ice_ptp_request_ts()
2820 tx->tstamps[idx].start = jiffies; in ice_ptp_request_ts()
2821 tx->tstamps[idx].skb = skb_get(skb); in ice_ptp_request_ts()
2826 spin_unlock_irqrestore(&tx->lock, flags); in ice_ptp_request_ts()
2831 if (idx >= tx->len) in ice_ptp_request_ts()
2834 return idx + tx->offset; in ice_ptp_request_ts()
2838 * ice_ptp_process_ts - Process the PTP Tx timestamps
2841 * Returns: ICE_TX_TSTAMP_WORK_PENDING if there are any outstanding Tx
2852 return ice_ptp_tx_tstamp(&pf->ptp.port.tx); in ice_ptp_process_ts()
2857 WARN_ONCE(1, "Unexpected Tx timestamp interrupt mode %u\n", in ice_ptp_process_ts()
2864 * ice_ptp_ts_irq - Process the PTP Tx timestamps in IRQ context
2867 * Return: IRQ_WAKE_THREAD if Tx timestamp read has to be handled in the bottom
2881 struct ice_ptp_tx *tx = &pf->ptp.port.tx; in ice_ptp_ts_irq() local
2887 spin_lock(&tx->lock); in ice_ptp_ts_irq()
2888 idx = find_next_bit_wrap(tx->in_use, tx->len, in ice_ptp_ts_irq()
2889 tx->last_ll_ts_idx_read + 1); in ice_ptp_ts_irq()
2890 if (idx != tx->len) in ice_ptp_ts_irq()
2891 ice_ptp_req_tx_single_tstamp(tx, idx); in ice_ptp_ts_irq()
2892 spin_unlock(&tx->lock); in ice_ptp_ts_irq()
2910 /* Process outstanding Tx timestamps. If there in ice_ptp_ts_irq()
2923 * ice_ptp_maybe_trigger_tx_interrupt - Trigger Tx timstamp interrupt
2926 * The device PHY issues Tx timestamp interrupts to the driver for processing
2942 if (!pf->ptp.port.tx.has_ready_bitmap) in ice_ptp_maybe_trigger_tx_interrupt()
2963 …dev_dbg(dev, "PTP periodic task detected waiting timestamps. Triggering Tx timestamp interrupt now… in ice_ptp_maybe_trigger_tx_interrupt()
3003 /* Disable timestamping for both Tx and Rx */ in ice_ptp_prepare_for_reset()
3011 ice_ptp_release_tx_tracker(pf, &pf->ptp.port.tx); in ice_ptp_prepare_for_reset()
3304 return ice_ptp_init_tx(pf, &ptp_port->tx, ptp_port->port_num); in ice_ptp_init_port()
3308 return ice_ptp_init_tx_e82x(pf, &ptp_port->tx, in ice_ptp_init_port()
3316 * ice_ptp_init_tx_interrupt_mode - Initialize device Tx interrupt mode
3319 * Initialize the Tx timestamp interrupt mode for this device. For most device
3337 /* other PHY types handle their own Tx interrupt */ in ice_ptp_init_tx_interrupt_mode()
3352 * items used for asynchronous work such as Tx timestamps and periodic work.
3396 /* Configure initial Tx interrupt settings */ in ice_ptp_init()
3432 /* Disable timestamping for both Tx and Rx */ in ice_ptp_release()
3437 ice_ptp_release_tx_tracker(pf, &pf->ptp.port.tx); in ice_ptp_release()