Lines Matching +full:packet +full:- +full:based
1 // SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-3-Clause)
3 * Copyright (c) 2014-2025, Advanced Micro Devices, Inc.
11 #include "xgbe-common.h"
29 while (--count && XGMAC_IOREAD_BITS(pdata, MAC_TSCR, TSUPDT)) in xgbe_update_tstamp_time()
33 netdev_err(pdata->netdev, in xgbe_update_tstamp_time()
47 while (--count && XGMAC_IOREAD_BITS(pdata, MAC_TSCR, TSADDREG)) in xgbe_update_tstamp_addend()
51 netdev_err(pdata->netdev, in xgbe_update_tstamp_addend()
66 while (--count && XGMAC_IOREAD_BITS(pdata, MAC_TSCR, TSINIT)) in xgbe_set_tstamp_time()
70 netdev_err(pdata->netdev, "timed out initializing timestamp\n"); in xgbe_set_tstamp_time()
89 if (pdata->vdata->tx_tstamp_workaround) { in xgbe_get_tx_tstamp()
107 void xgbe_get_rx_tstamp(struct xgbe_packet_data *packet, in xgbe_get_rx_tstamp() argument
112 if (XGMAC_GET_BITS_LE(rdesc->desc3, RX_CONTEXT_DESC3, TSA) && in xgbe_get_rx_tstamp()
113 !XGMAC_GET_BITS_LE(rdesc->desc3, RX_CONTEXT_DESC3, TSD)) { in xgbe_get_rx_tstamp()
114 nsec = le32_to_cpu(rdesc->desc1); in xgbe_get_rx_tstamp()
116 nsec += le32_to_cpu(rdesc->desc0); in xgbe_get_rx_tstamp()
118 packet->rx_tstamp = nsec; in xgbe_get_rx_tstamp()
119 XGMAC_SET_BITS(packet->attributes, RX_PACKET_ATTRIBUTES, in xgbe_get_rx_tstamp()
142 spin_lock_irqsave(&pdata->tstamp_lock, flags); in xgbe_tx_tstamp()
143 if (!pdata->tx_tstamp_skb) in xgbe_tx_tstamp()
146 if (pdata->tx_tstamp) { in xgbe_tx_tstamp()
148 hwtstamps.hwtstamp = ns_to_ktime(pdata->tx_tstamp); in xgbe_tx_tstamp()
149 skb_tstamp_tx(pdata->tx_tstamp_skb, &hwtstamps); in xgbe_tx_tstamp()
152 dev_kfree_skb_any(pdata->tx_tstamp_skb); in xgbe_tx_tstamp()
154 pdata->tx_tstamp_skb = NULL; in xgbe_tx_tstamp()
157 spin_unlock_irqrestore(&pdata->tstamp_lock, flags); in xgbe_tx_tstamp()
162 if (copy_to_user(ifreq->ifr_data, &pdata->tstamp_config, in xgbe_get_hwtstamp_settings()
163 sizeof(pdata->tstamp_config))) in xgbe_get_hwtstamp_settings()
164 return -EFAULT; in xgbe_get_hwtstamp_settings()
174 if (copy_from_user(&config, ifreq->ifr_data, sizeof(config))) in xgbe_set_hwtstamp_settings()
175 return -EFAULT; in xgbe_set_hwtstamp_settings()
188 return -ERANGE; in xgbe_set_hwtstamp_settings()
201 /* PTP v2, UDP, any kind of event packet */ in xgbe_set_hwtstamp_settings()
204 fallthrough; /* to PTP v1, UDP, any kind of event packet */ in xgbe_set_hwtstamp_settings()
211 /* PTP v2, UDP, Sync packet */ in xgbe_set_hwtstamp_settings()
214 fallthrough; /* to PTP v1, UDP, Sync packet */ in xgbe_set_hwtstamp_settings()
222 /* PTP v2, UDP, Delay_req packet */ in xgbe_set_hwtstamp_settings()
225 fallthrough; /* to PTP v1, UDP, Delay_req packet */ in xgbe_set_hwtstamp_settings()
234 /* 802.AS1, Ethernet, any kind of event packet */ in xgbe_set_hwtstamp_settings()
241 /* 802.AS1, Ethernet, Sync packet */ in xgbe_set_hwtstamp_settings()
248 /* 802.AS1, Ethernet, Delay_req packet */ in xgbe_set_hwtstamp_settings()
256 /* PTP v2/802.AS1, any layer, any kind of event packet */ in xgbe_set_hwtstamp_settings()
266 /* PTP v2/802.AS1, any layer, Sync packet */ in xgbe_set_hwtstamp_settings()
276 /* PTP v2/802.AS1, any layer, Delay_req packet */ in xgbe_set_hwtstamp_settings()
288 return -ERANGE; in xgbe_set_hwtstamp_settings()
293 memcpy(&pdata->tstamp_config, &config, sizeof(config)); in xgbe_set_hwtstamp_settings()
300 struct xgbe_packet_data *packet) in xgbe_prep_tx_tstamp() argument
304 if (XGMAC_GET_BITS(packet->attributes, TX_PACKET_ATTRIBUTES, PTP)) { in xgbe_prep_tx_tstamp()
305 spin_lock_irqsave(&pdata->tstamp_lock, flags); in xgbe_prep_tx_tstamp()
306 if (pdata->tx_tstamp_skb) { in xgbe_prep_tx_tstamp()
308 XGMAC_SET_BITS(packet->attributes, in xgbe_prep_tx_tstamp()
311 pdata->tx_tstamp_skb = skb_get(skb); in xgbe_prep_tx_tstamp()
312 skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; in xgbe_prep_tx_tstamp()
314 spin_unlock_irqrestore(&pdata->tstamp_lock, flags); in xgbe_prep_tx_tstamp()
326 /* Register Settings to be done based on the link speed. */ in xgbe_init_ptp()
327 switch (pdata->phy.speed) { in xgbe_init_ptp()
351 /* Set one nano-second accuracy */ in xgbe_init_ptp()
361 return -EOPNOTSUPP; in xgbe_init_ptp()
363 if (pdata->vdata->tstamp_ptp_clock_freq) { in xgbe_init_ptp()
364 /* Initialize time registers based on in xgbe_init_ptp()
372 /* Initialize time registers based on in xgbe_init_ptp()
380 * addend = 2^32 / (PTP ref clock / (PTP clock based on SSINC)) in xgbe_init_ptp()
381 * = (2^32 * (PTP clock based on SSINC)) / PTP ref clock in xgbe_init_ptp()
383 if (pdata->vdata->tstamp_ptp_clock_freq) in xgbe_init_ptp()
389 pdata->tstamp_addend = div_u64(dividend, pdata->ptpclk_rate); in xgbe_init_ptp()
391 xgbe_update_tstamp_addend(pdata, pdata->tstamp_addend); in xgbe_init_ptp()