diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/9054-amd-xgbe-Fix-Tx_Timestamp_Timeout-error-while-runnin.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/9054-amd-xgbe-Fix-Tx_Timestamp_Timeout-error-while-runnin.patch | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/9054-amd-xgbe-Fix-Tx_Timestamp_Timeout-error-while-runnin.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/9054-amd-xgbe-Fix-Tx_Timestamp_Timeout-error-while-runnin.patch new file mode 100644 index 00000000..a2135372 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/9054-amd-xgbe-Fix-Tx_Timestamp_Timeout-error-while-runnin.patch @@ -0,0 +1,149 @@ +From 6f213873c2c360853b6d39774c3c0e3fdcf66261 Mon Sep 17 00:00:00 2001 +From: Devang Vyas <devangnayanbhai.vyas@amd.com> +Date: Mon, 20 Jun 2022 18:46:38 +0530 +Subject: [PATCH 54/57] amd-xgbe: Fix Tx_Timestamp_Timeout error while running + ptp4l application + +This patch fixes the Tx timestamp timeout error observed while running ptp4l +application because of which PTP synchronization is not achieved. This patch +schedules PTP packet queue when PTP in-progress flag is set and poll for the +XGMAC TXTSC bit to be set. This work thread reads Tx Timestamp registers +when timestamp is captured, convert the value to HW timestamp and pass it to +the network stack. + +Signed-off-by: Devang Vyas <devangnayanbhai.vyas@amd.com> +Change-Id: I8d331b1c9bd1eaef36149a323ea789b538cc2cc0 +--- + drivers/net/ethernet/amd/xgbe/xgbe-common.h | 2 + + drivers/net/ethernet/amd/xgbe/xgbe-dev.c | 7 ++- + drivers/net/ethernet/amd/xgbe/xgbe-drv.c | 48 ++++++++++----------- + 3 files changed, 27 insertions(+), 30 deletions(-) + +diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-common.h b/drivers/net/ethernet/amd/xgbe/xgbe-common.h +index 0b8b1e97d2f9..449f5be26930 100644 +--- a/drivers/net/ethernet/amd/xgbe/xgbe-common.h ++++ b/drivers/net/ethernet/amd/xgbe/xgbe-common.h +@@ -333,6 +333,8 @@ + #define MAC_TXSNR 0x0d30 + #define MAC_TXSSR 0x0d34 + ++#define MAC_TXSNR_MASK GENMASK(30, 0) ++ + #define MAC_QTFCR_INC 4 + #define MAC_MACA_INC 4 + #define MAC_HTR_INC 4 +diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-dev.c b/drivers/net/ethernet/amd/xgbe/xgbe-dev.c +index e5cc96bc70ad..0252d80f6834 100644 +--- a/drivers/net/ethernet/amd/xgbe/xgbe-dev.c ++++ b/drivers/net/ethernet/amd/xgbe/xgbe-dev.c +@@ -1576,15 +1576,14 @@ static u64 xgbe_get_tx_tstamp(struct xgbe_prv_data *pdata) + + if (pdata->vdata->tx_tstamp_workaround) { + tx_snr = XGMAC_IOREAD(pdata, MAC_TXSNR); ++ tx_snr = tx_snr & MAC_TXSNR_MASK; + tx_ssr = XGMAC_IOREAD(pdata, MAC_TXSSR); + } else { +- tx_ssr = XGMAC_IOREAD(pdata, MAC_TXSSR); + tx_snr = XGMAC_IOREAD(pdata, MAC_TXSNR); ++ tx_snr = tx_snr & MAC_TXSNR_MASK; ++ tx_ssr = XGMAC_IOREAD(pdata, MAC_TXSSR); + } + +- if (XGMAC_GET_BITS(tx_snr, MAC_TXSNR, TXTSSTSMIS)) +- return 0; +- + nsec = tx_ssr; + nsec *= NSEC_PER_SEC; + nsec += tx_snr; +diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c +index caea72cddb89..3ed9ff7fdaff 100755 +--- a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c ++++ b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c +@@ -479,7 +479,7 @@ static void xgbe_isr_task(struct tasklet_struct *t) + struct xgbe_hw_if *hw_if = &pdata->hw_if; + struct xgbe_channel *channel; + unsigned int dma_isr, dma_ch_isr; +- unsigned int mac_isr, mac_tssr, mac_mdioisr; ++ unsigned int mac_isr, mac_mdioisr; + unsigned int i; + + /* The DMA interrupt status register also reports MAC and MTL +@@ -548,21 +548,6 @@ static void xgbe_isr_task(struct tasklet_struct *t) + if (XGMAC_GET_BITS(mac_isr, MAC_ISR, MMCRXIS)) + hw_if->rx_mmc_int(pdata); + +- if (XGMAC_GET_BITS(mac_isr, MAC_ISR, TSIS)) { +- mac_tssr = XGMAC_IOREAD(pdata, MAC_TSSR); +- +- netif_dbg(pdata, intr, pdata->netdev, +- "MAC_TSSR=%#010x\n", mac_tssr); +- +- if (XGMAC_GET_BITS(mac_tssr, MAC_TSSR, TXTSC)) { +- /* Read Tx Timestamp to clear interrupt */ +- pdata->tx_tstamp = +- hw_if->get_tx_tstamp(pdata); +- queue_work(pdata->dev_workqueue, +- &pdata->tx_tstamp_work); +- } +- } +- + if (XGMAC_GET_BITS(mac_isr, MAC_ISR, SMI)) { + mac_mdioisr = XGMAC_IOREAD(pdata, MAC_MDIOISR); + +@@ -1470,25 +1455,35 @@ static void xgbe_tx_tstamp(struct work_struct *work) + struct xgbe_prv_data, + tx_tstamp_work); + struct skb_shared_hwtstamps hwtstamps; ++ struct sk_buff *skb = pdata->tx_tstamp_skb; + u64 nsec; + unsigned long flags; ++ u32 value; + +- spin_lock_irqsave(&pdata->tstamp_lock, flags); +- if (!pdata->tx_tstamp_skb) +- goto unlock; ++ if (readl_poll_timeout_atomic(pdata->xgmac_regs + MAC_TSSR, ++ value, value & (1 << MAC_TSSR_TXTSC_INDEX), 100, 10000)) { ++ dev_kfree_skb_any(pdata->tx_tstamp_skb); ++ pdata->tx_tstamp_skb = NULL; ++ return; ++ } + +- if (pdata->tx_tstamp) { +- nsec = timecounter_cyc2time(&pdata->tstamp_tc, +- pdata->tx_tstamp); ++ pdata->tx_tstamp = pdata->hw_if.get_tx_tstamp(pdata); + +- memset(&hwtstamps, 0, sizeof(hwtstamps)); +- hwtstamps.hwtstamp = ns_to_ktime(nsec); +- skb_tstamp_tx(pdata->tx_tstamp_skb, &hwtstamps); ++ spin_lock_irqsave(&pdata->tstamp_lock, flags); ++ if (!pdata->tx_tstamp_skb) { ++ dev_kfree_skb_any(pdata->tx_tstamp_skb); ++ pdata->tx_tstamp_skb = NULL; ++ goto unlock; + } + +- dev_kfree_skb_any(pdata->tx_tstamp_skb); ++ nsec = timecounter_cyc2time(&pdata->tstamp_tc, ++ pdata->tx_tstamp); + ++ memset(&hwtstamps, 0, sizeof(hwtstamps)); ++ hwtstamps.hwtstamp = ns_to_ktime(nsec); + pdata->tx_tstamp_skb = NULL; ++ skb_tstamp_tx(skb, &hwtstamps); ++ dev_kfree_skb_any(skb); + + unlock: + spin_unlock_irqrestore(&pdata->tstamp_lock, flags); +@@ -1653,6 +1648,7 @@ static void xgbe_prep_tx_tstamp(struct xgbe_prv_data *pdata, + } else { + pdata->tx_tstamp_skb = skb_get(skb); + skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; ++ queue_work(pdata->dev_workqueue, &pdata->tx_tstamp_work); + } + spin_unlock_irqrestore(&pdata->tstamp_lock, flags); + } +-- +2.37.3 + |