Lines Matching full:tx
113 /* SMA1 and UFL1 cannot be set to TX at the same time */ in ice_ptp_set_sma_config_e810t()
140 /* U.FL 1 TX will always enable SMA 1 RX */ in ice_ptp_set_sma_config_e810t()
141 dev_info(ice_hw_to_dev(hw), "SMA1 RX + U.FL1 TX"); in ice_ptp_set_sma_config_e810t()
144 dev_info(ice_hw_to_dev(hw), "SMA1 RX + U.FL1 TX"); in ice_ptp_set_sma_config_e810t()
147 dev_info(ice_hw_to_dev(hw), "SMA1 TX"); in ice_ptp_set_sma_config_e810t()
167 dev_info(ice_hw_to_dev(hw), "SMA2 TX"); in ice_ptp_set_sma_config_e810t()
172 dev_info(ice_hw_to_dev(hw), "SMA2 TX + U.FL2 RX"); in ice_ptp_set_sma_config_e810t()
259 * ice_ptp_cfg_tx_interrupt - Configure Tx timestamp interrupt for the device
262 * Program the device to respond appropriately to the Tx timestamp interrupt
288 /* Configure the Tx timestamp interrupt */ in ice_ptp_cfg_tx_interrupt()
426 * This algorithm works even if the PHC time was updated after a Tx timestamp
427 * was requested, but before the Tx timestamp event was reported from
436 * a second, and (b) discarding any Tx timestamp packet if it has waited for
473 * The Tx and Rx timestamps are 40 bits wide, including 32 bits of nominal
511 * ice_ptp_is_tx_tracker_up - Check if Tx tracker is ready for new timestamps
512 * @tx: the PTP Tx timestamp tracker to check
514 * Check that a given PTP Tx timestamp tracker is up, i.e. that it is ready
517 * Assumes the tx->lock spinlock is already held.
520 ice_ptp_is_tx_tracker_up(struct ice_ptp_tx *tx) in ice_ptp_is_tx_tracker_up() argument
522 lockdep_assert_held(&tx->lock); in ice_ptp_is_tx_tracker_up()
524 return tx->init && !tx->calibrating; in ice_ptp_is_tx_tracker_up()
528 * ice_ptp_req_tx_single_tstamp - Request Tx timestamp for a port from FW
529 * @tx: the PTP Tx timestamp tracker
532 void ice_ptp_req_tx_single_tstamp(struct ice_ptp_tx *tx, u8 idx) in ice_ptp_req_tx_single_tstamp() argument
538 if (!tx->init) in ice_ptp_req_tx_single_tstamp()
541 ptp_port = container_of(tx, struct ice_ptp_port, tx); in ice_ptp_req_tx_single_tstamp()
545 if (time_is_before_jiffies(tx->tstamps[idx].start + 2 * HZ)) { in ice_ptp_req_tx_single_tstamp()
546 /* Count the number of Tx timestamps that timed out */ in ice_ptp_req_tx_single_tstamp()
549 skb = tx->tstamps[idx].skb; in ice_ptp_req_tx_single_tstamp()
550 tx->tstamps[idx].skb = NULL; in ice_ptp_req_tx_single_tstamp()
551 clear_bit(idx, tx->in_use); in ice_ptp_req_tx_single_tstamp()
557 ice_trace(tx_tstamp_fw_req, tx->tstamps[idx].skb, idx); in ice_ptp_req_tx_single_tstamp()
563 tx->last_ll_ts_idx_read = idx; in ice_ptp_req_tx_single_tstamp()
567 * ice_ptp_complete_tx_single_tstamp - Complete Tx timestamp for a port
568 * @tx: the PTP Tx timestamp tracker
570 void ice_ptp_complete_tx_single_tstamp(struct ice_ptp_tx *tx) in ice_ptp_complete_tx_single_tstamp() argument
573 u8 idx = tx->last_ll_ts_idx_read; in ice_ptp_complete_tx_single_tstamp()
581 if (!tx->init || tx->last_ll_ts_idx_read < 0) in ice_ptp_complete_tx_single_tstamp()
584 ptp_port = container_of(tx, struct ice_ptp_port, tx); in ice_ptp_complete_tx_single_tstamp()
587 ice_trace(tx_tstamp_fw_done, tx->tstamps[idx].skb, idx); in ice_ptp_complete_tx_single_tstamp()
593 dev_err(ice_pf_to_dev(pf), "Failed to get the Tx tstamp - FW not ready"); in ice_ptp_complete_tx_single_tstamp()
609 if (!drop_ts && tx->verify_cached && in ice_ptp_complete_tx_single_tstamp()
610 raw_tstamp == tx->tstamps[idx].cached_tstamp) in ice_ptp_complete_tx_single_tstamp()
613 if (tx->verify_cached && raw_tstamp) in ice_ptp_complete_tx_single_tstamp()
614 tx->tstamps[idx].cached_tstamp = raw_tstamp; in ice_ptp_complete_tx_single_tstamp()
615 clear_bit(idx, tx->in_use); in ice_ptp_complete_tx_single_tstamp()
616 skb = tx->tstamps[idx].skb; in ice_ptp_complete_tx_single_tstamp()
617 tx->tstamps[idx].skb = NULL; in ice_ptp_complete_tx_single_tstamp()
618 if (test_and_clear_bit(idx, tx->stale)) in ice_ptp_complete_tx_single_tstamp()
641 * ice_ptp_process_tx_tstamp - Process Tx timestamps for a port
642 * @tx: the PTP Tx timestamp tracker
657 * Note that we do not hold the tracking lock while reading the Tx timestamp.
664 * function, or during teardown when the Tx timestamp tracker is being
668 * If a Tx thread starts a new timestamp, we might not begin processing it
671 * If a Tx thread starts a new timestamp just after this function exits, the
677 * this case, software will set the stale bit for any outstanding Tx
681 * If a Tx packet has been waiting for more than 2 seconds, it is not possible
684 * we detect a Tx timestamp request that has waited for this long we assume
688 static void ice_ptp_process_tx_tstamp(struct ice_ptp_tx *tx) in ice_ptp_process_tx_tstamp() argument
699 ptp_port = container_of(tx, struct ice_ptp_port, tx); in ice_ptp_process_tx_tstamp()
703 /* Read the Tx ready status first */ in ice_ptp_process_tx_tstamp()
704 err = ice_get_phy_tx_tstamp_ready(hw, tx->block, &tstamp_ready); in ice_ptp_process_tx_tstamp()
711 for_each_set_bit(idx, tx->in_use, tx->len) { in ice_ptp_process_tx_tstamp()
713 u8 phy_idx = idx + tx->offset; in ice_ptp_process_tx_tstamp()
719 if (time_is_before_jiffies(tx->tstamps[idx].start + 2 * HZ)) { in ice_ptp_process_tx_tstamp()
722 /* Count the number of Tx timestamps that timed out */ in ice_ptp_process_tx_tstamp()
741 ice_trace(tx_tstamp_fw_req, tx->tstamps[idx].skb, idx); in ice_ptp_process_tx_tstamp()
743 err = ice_read_phy_tstamp(hw, tx->block, phy_idx, &raw_tstamp); in ice_ptp_process_tx_tstamp()
747 ice_trace(tx_tstamp_fw_done, tx->tstamps[idx].skb, idx); in ice_ptp_process_tx_tstamp()
754 if (!drop_ts && tx->verify_cached && in ice_ptp_process_tx_tstamp()
755 raw_tstamp == tx->tstamps[idx].cached_tstamp) in ice_ptp_process_tx_tstamp()
763 spin_lock_irqsave(&tx->lock, flags); in ice_ptp_process_tx_tstamp()
764 if (tx->verify_cached && raw_tstamp) in ice_ptp_process_tx_tstamp()
765 tx->tstamps[idx].cached_tstamp = raw_tstamp; in ice_ptp_process_tx_tstamp()
766 clear_bit(idx, tx->in_use); in ice_ptp_process_tx_tstamp()
767 skb = tx->tstamps[idx].skb; in ice_ptp_process_tx_tstamp()
768 tx->tstamps[idx].skb = NULL; in ice_ptp_process_tx_tstamp()
769 if (test_and_clear_bit(idx, tx->stale)) in ice_ptp_process_tx_tstamp()
771 spin_unlock_irqrestore(&tx->lock, flags); in ice_ptp_process_tx_tstamp()
797 * ice_ptp_tx_tstamp_owner - Process Tx timestamps for all ports on the device
807 struct ice_ptp_tx *tx = &port->tx; in ice_ptp_tx_tstamp_owner() local
809 if (!tx || !tx->init) in ice_ptp_tx_tstamp_owner()
812 ice_ptp_process_tx_tstamp(tx); in ice_ptp_tx_tstamp_owner()
820 /* Read the Tx ready status first */ in ice_ptp_tx_tstamp_owner()
832 * ice_ptp_tx_tstamp - Process Tx timestamps for this function.
833 * @tx: Tx tracking structure to initialize
836 * Tx timestamps, or ICE_TX_TSTAMP_WORK_DONE otherwise.
838 static enum ice_tx_tstamp_work ice_ptp_tx_tstamp(struct ice_ptp_tx *tx) in ice_ptp_tx_tstamp() argument
843 if (!tx->init) in ice_ptp_tx_tstamp()
846 /* Process the Tx timestamp tracker */ in ice_ptp_tx_tstamp()
847 ice_ptp_process_tx_tstamp(tx); in ice_ptp_tx_tstamp()
849 /* Check if there are outstanding Tx timestamps */ in ice_ptp_tx_tstamp()
850 spin_lock_irqsave(&tx->lock, flags); in ice_ptp_tx_tstamp()
851 more_timestamps = tx->init && !bitmap_empty(tx->in_use, tx->len); in ice_ptp_tx_tstamp()
852 spin_unlock_irqrestore(&tx->lock, flags); in ice_ptp_tx_tstamp()
861 * ice_ptp_alloc_tx_tracker - Initialize tracking for Tx timestamps
862 * @tx: Tx tracking structure to initialize
868 ice_ptp_alloc_tx_tracker(struct ice_ptp_tx *tx) in ice_ptp_alloc_tx_tracker() argument
873 tstamps = kcalloc(tx->len, sizeof(*tstamps), GFP_KERNEL); in ice_ptp_alloc_tx_tracker()
874 in_use = bitmap_zalloc(tx->len, GFP_KERNEL); in ice_ptp_alloc_tx_tracker()
875 stale = bitmap_zalloc(tx->len, GFP_KERNEL); in ice_ptp_alloc_tx_tracker()
885 tx->tstamps = tstamps; in ice_ptp_alloc_tx_tracker()
886 tx->in_use = in_use; in ice_ptp_alloc_tx_tracker()
887 tx->stale = stale; in ice_ptp_alloc_tx_tracker()
888 tx->init = 1; in ice_ptp_alloc_tx_tracker()
889 tx->last_ll_ts_idx_read = -1; in ice_ptp_alloc_tx_tracker()
891 spin_lock_init(&tx->lock); in ice_ptp_alloc_tx_tracker()
899 * @tx: the tracker to flush
901 * Called during teardown when a Tx tracker is being removed.
904 ice_ptp_flush_tx_tracker(struct ice_pf *pf, struct ice_ptp_tx *tx) in ice_ptp_flush_tx_tracker() argument
912 err = ice_get_phy_tx_tstamp_ready(hw, tx->block, &tstamp_ready); in ice_ptp_flush_tx_tracker()
914 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()
915 tx->block, err); in ice_ptp_flush_tx_tracker()
917 /* If we fail to read the Tx timestamp ready bitmap just in ice_ptp_flush_tx_tracker()
923 for_each_set_bit(idx, tx->in_use, tx->len) { in ice_ptp_flush_tx_tracker()
924 u8 phy_idx = idx + tx->offset; in ice_ptp_flush_tx_tracker()
929 ice_clear_phy_tstamp(hw, tx->block, phy_idx); in ice_ptp_flush_tx_tracker()
931 spin_lock_irqsave(&tx->lock, flags); in ice_ptp_flush_tx_tracker()
932 skb = tx->tstamps[idx].skb; in ice_ptp_flush_tx_tracker()
933 tx->tstamps[idx].skb = NULL; in ice_ptp_flush_tx_tracker()
934 clear_bit(idx, tx->in_use); in ice_ptp_flush_tx_tracker()
935 clear_bit(idx, tx->stale); in ice_ptp_flush_tx_tracker()
936 spin_unlock_irqrestore(&tx->lock, flags); in ice_ptp_flush_tx_tracker()
938 /* Count the number of Tx timestamps flushed */ in ice_ptp_flush_tx_tracker()
948 * @tx: the tracker to mark
950 * Mark currently outstanding Tx timestamps as stale. This prevents sending
958 ice_ptp_mark_tx_tracker_stale(struct ice_ptp_tx *tx) in ice_ptp_mark_tx_tracker_stale() argument
962 spin_lock_irqsave(&tx->lock, flags); in ice_ptp_mark_tx_tracker_stale()
963 bitmap_or(tx->stale, tx->stale, tx->in_use, tx->len); in ice_ptp_mark_tx_tracker_stale()
964 spin_unlock_irqrestore(&tx->lock, flags); in ice_ptp_mark_tx_tracker_stale()
968 * ice_ptp_release_tx_tracker - Release allocated memory for Tx tracker
970 * @tx: Tx tracking structure to release
972 * Free memory associated with the Tx timestamp tracker.
975 ice_ptp_release_tx_tracker(struct ice_pf *pf, struct ice_ptp_tx *tx) in ice_ptp_release_tx_tracker() argument
979 spin_lock_irqsave(&tx->lock, flags); in ice_ptp_release_tx_tracker()
980 tx->init = 0; in ice_ptp_release_tx_tracker()
981 spin_unlock_irqrestore(&tx->lock, flags); in ice_ptp_release_tx_tracker()
986 ice_ptp_flush_tx_tracker(pf, tx); in ice_ptp_release_tx_tracker()
988 kfree(tx->tstamps); in ice_ptp_release_tx_tracker()
989 tx->tstamps = NULL; in ice_ptp_release_tx_tracker()
991 bitmap_free(tx->in_use); in ice_ptp_release_tx_tracker()
992 tx->in_use = NULL; in ice_ptp_release_tx_tracker()
994 bitmap_free(tx->stale); in ice_ptp_release_tx_tracker()
995 tx->stale = NULL; in ice_ptp_release_tx_tracker()
997 tx->len = 0; in ice_ptp_release_tx_tracker()
1001 * ice_ptp_init_tx_e82x - Initialize tracking for Tx timestamps
1003 * @tx: the Tx tracking structure to initialize
1006 * Initialize the Tx timestamp tracker for this port. For generic MAC devices,
1012 ice_ptp_init_tx_e82x(struct ice_pf *pf, struct ice_ptp_tx *tx, u8 port) in ice_ptp_init_tx_e82x() argument
1014 tx->block = port / ICE_PORTS_PER_QUAD; in ice_ptp_init_tx_e82x()
1015 tx->offset = (port % ICE_PORTS_PER_QUAD) * INDEX_PER_PORT_E82X; in ice_ptp_init_tx_e82x()
1016 tx->len = INDEX_PER_PORT_E82X; in ice_ptp_init_tx_e82x()
1017 tx->verify_cached = 0; in ice_ptp_init_tx_e82x()
1019 return ice_ptp_alloc_tx_tracker(tx); in ice_ptp_init_tx_e82x()
1023 * ice_ptp_init_tx_e810 - Initialize tracking for Tx timestamps
1025 * @tx: the Tx tracking structure to initialize
1027 * Initialize the Tx timestamp tracker for this PF. For E810 devices, each
1031 ice_ptp_init_tx_e810(struct ice_pf *pf, struct ice_ptp_tx *tx) in ice_ptp_init_tx_e810() argument
1033 tx->block = pf->hw.port_info->lport; in ice_ptp_init_tx_e810()
1034 tx->offset = 0; in ice_ptp_init_tx_e810()
1035 tx->len = INDEX_PER_PORT_E810; in ice_ptp_init_tx_e810()
1040 tx->verify_cached = 1; in ice_ptp_init_tx_e810()
1042 return ice_ptp_alloc_tx_tracker(tx); in ice_ptp_init_tx_e810()
1115 * such as after a time adjustment. It marks any currently outstanding Tx
1150 ice_ptp_mark_tx_tracker_stale(&pf->ptp.port.tx); in ice_ptp_reset_cached_phctime()
1231 * ice_ptp_check_tx_fifo - Check whether Tx FIFO is in an OK state
1232 * @port: PTP port for which Tx FIFO is checked
1258 dev_err(ice_pf_to_dev(pf), "PTP failed to check port %d Tx FIFO, err %d\n", in ice_ptp_check_tx_fifo()
1280 "Port %d Tx FIFO still not empty; resetting quad %d\n", in ice_ptp_check_tx_fifo()
1291 * ice_ptp_wait_for_offsets - Check for valid Tx and Rx offsets
1294 * Check whether hardware has completed measuring the Tx and Rx offset values
1298 * registers with the calibrated offset values and enable timestamping. The Tx
1302 * This function reschedules itself until both Tx and Rx calibration have
1330 /* Tx and/or Rx offset not yet configured, try again later */ in ice_ptp_wait_for_offsets()
1394 /* temporarily disable Tx timestamps while calibrating PHY offset */ in ice_ptp_port_phy_restart()
1395 spin_lock_irqsave(&ptp_port->tx.lock, flags); in ice_ptp_port_phy_restart()
1396 ptp_port->tx.calibrating = true; in ice_ptp_port_phy_restart()
1397 spin_unlock_irqrestore(&ptp_port->tx.lock, flags); in ice_ptp_port_phy_restart()
1405 /* Enable Tx timestamps right away */ in ice_ptp_port_phy_restart()
1406 spin_lock_irqsave(&ptp_port->tx.lock, flags); in ice_ptp_port_phy_restart()
1407 ptp_port->tx.calibrating = false; in ice_ptp_port_phy_restart()
1408 spin_unlock_irqrestore(&ptp_port->tx.lock, flags); in ice_ptp_port_phy_restart()
1459 * ice_ptp_tx_ena_intr - Enable or disable the Tx timestamp interrupt
1464 * Utility function to enable or disable Tx timestamp interrupt and threshold
2492 * ice_ptp_request_ts - Request an available Tx timestamp index
2493 * @tx: the PTP Tx timestamp tracker to request from
2496 s8 ice_ptp_request_ts(struct ice_ptp_tx *tx, struct sk_buff *skb) in ice_ptp_request_ts() argument
2501 spin_lock_irqsave(&tx->lock, flags); in ice_ptp_request_ts()
2504 if (!ice_ptp_is_tx_tracker_up(tx)) { in ice_ptp_request_ts()
2505 spin_unlock_irqrestore(&tx->lock, flags); in ice_ptp_request_ts()
2510 idx = find_next_zero_bit(tx->in_use, tx->len, in ice_ptp_request_ts()
2511 tx->last_ll_ts_idx_read + 1); in ice_ptp_request_ts()
2512 if (idx == tx->len) in ice_ptp_request_ts()
2513 idx = find_first_zero_bit(tx->in_use, tx->len); in ice_ptp_request_ts()
2515 if (idx < tx->len) { in ice_ptp_request_ts()
2520 set_bit(idx, tx->in_use); in ice_ptp_request_ts()
2521 clear_bit(idx, tx->stale); in ice_ptp_request_ts()
2522 tx->tstamps[idx].start = jiffies; in ice_ptp_request_ts()
2523 tx->tstamps[idx].skb = skb_get(skb); in ice_ptp_request_ts()
2528 spin_unlock_irqrestore(&tx->lock, flags); in ice_ptp_request_ts()
2533 if (idx >= tx->len) in ice_ptp_request_ts()
2536 return idx + tx->offset; in ice_ptp_request_ts()
2540 * ice_ptp_process_ts - Process the PTP Tx timestamps
2543 * Returns: ICE_TX_TSTAMP_WORK_PENDING if there are any outstanding Tx
2554 return ice_ptp_tx_tstamp(&pf->ptp.port.tx); in ice_ptp_process_ts()
2559 WARN_ONCE(1, "Unexpected Tx timestamp interrupt mode %u\n", in ice_ptp_process_ts()
2566 * ice_ptp_maybe_trigger_tx_interrupt - Trigger Tx timstamp interrupt
2569 * The device PHY issues Tx timestamp interrupts to the driver for processing
2606 …dev_dbg(dev, "PTP periodic task detected waiting timestamps. Triggering Tx timestamp interrupt now… in ice_ptp_maybe_trigger_tx_interrupt()
2691 /* Init Tx structures */ in ice_ptp_reset()
2693 err = ice_ptp_init_tx_e810(pf, &ptp->port.tx); in ice_ptp_reset()
2697 err = ice_ptp_init_tx_e82x(pf, &ptp->port.tx, in ice_ptp_reset()
2936 /* Disable timestamping for both Tx and Rx */ in ice_ptp_prepare_for_reset()
2944 ice_ptp_release_tx_tracker(pf, &pf->ptp.port.tx); in ice_ptp_prepare_for_reset()
3071 return ice_ptp_init_tx_e810(pf, &ptp_port->tx); in ice_ptp_init_port()
3076 return ice_ptp_init_tx_e82x(pf, &ptp_port->tx, in ice_ptp_init_port()
3154 * ice_ptp_init_tx_interrupt_mode - Initialize device Tx interrupt mode
3157 * Initialize the Tx timestamp interrupt mode for this device. For most device
3175 /* other PHY types handle their own Tx interrupt */ in ice_ptp_init_tx_interrupt_mode()
3190 * items used for asynchronous work such as Tx timestamps and periodic work.
3219 /* Configure initial Tx interrupt settings */ in ice_ptp_init()
3256 /* Disable timestamping for both Tx and Rx */ in ice_ptp_release()
3261 ice_ptp_release_tx_tracker(pf, &pf->ptp.port.tx); in ice_ptp_release()