From d466dc8421ee0c6592bb5682aa93a671bc948107 Mon Sep 17 00:00:00 2001 From: Chamira Perera Date: Thu, 15 Jun 2023 14:03:05 +1000 Subject: [PATCH] stm32cube: stm32h7: use transmit timestamp status flag. Read timestamp only when status flag is set in Tx descriptor. Fire transmit timestamp callbacks only when there is a valid non-zero timestamp. Co-authored-by: Naeem Bacha Signed-off-by: Chamira Perera --- stm32cube/stm32h7xx/README | 8 ++++++ .../stm32h7xx/drivers/src/stm32h7xx_hal_eth.c | 27 ++++++++++++++----- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/stm32cube/stm32h7xx/README b/stm32cube/stm32h7xx/README index 98e55a1a6..6e90026dc 100644 --- a/stm32cube/stm32h7xx/README +++ b/stm32cube/stm32h7xx/README @@ -68,4 +68,12 @@ Patch List: drivers/include/stm32h7xx_hal_def.h ST Internal Reference: 136825 + *Fix to use transmit timestamp when it is valid + Read timestamp only when status flag is set in Tx descriptor. + Fire transmit timestamp callbacks only when there is a valid + non-zero timestamp. + Impacted files: + drivers/src/stm32h7xx_hal_eth.c + ST Internal Reference: 157129 + See release_note.html from STM32Cube diff --git a/stm32cube/stm32h7xx/drivers/src/stm32h7xx_hal_eth.c b/stm32cube/stm32h7xx/drivers/src/stm32h7xx_hal_eth.c index 4850fb569..7a7f80032 100644 --- a/stm32cube/stm32h7xx/drivers/src/stm32h7xx_hal_eth.c +++ b/stm32cube/stm32h7xx/drivers/src/stm32h7xx_hal_eth.c @@ -1432,17 +1432,29 @@ HAL_StatusTypeDef HAL_ETH_ReleaseTxPacket(ETH_HandleTypeDef *heth) /* Disable Ptp transmission */ CLEAR_BIT(heth->Init.TxDesc[idx].DESC3, (0x40000000U)); - /* Get timestamp low */ - timestamp->TimeStampLow = heth->Init.TxDesc[idx].DESC0; - /* Get timestamp high */ - timestamp->TimeStampHigh = heth->Init.TxDesc[idx].DESC1; + if ((heth->Init.TxDesc[idx].DESC3 & ETH_DMATXNDESCWBF_LD ) + && (heth->Init.TxDesc[idx].DESC3 & ETH_DMATXNDESCWBF_TTSS)) + { + /* Get timestamp low */ + timestamp->TimeStampLow = heth->Init.TxDesc[idx].DESC0; + /* Get timestamp high */ + timestamp->TimeStampHigh = heth->Init.TxDesc[idx].DESC1; + } + else + { + timestamp->TimeStampHigh = timestamp->TimeStampLow = UINT32_MAX; + } + #endif /* HAL_ETH_USE_PTP */ #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1) /*Call registered callbacks*/ #ifdef HAL_ETH_USE_PTP /* Handle Ptp */ - heth->txPtpCallback(dmatxdesclist->PacketAddress[idx], timestamp); + if (timestamp->TimeStampHigh != UINT32_MAX && timestamp->TimeStampLow != UINT32_MAX) + { + heth->txPtpCallback(dmatxdesclist->PacketAddress[idx], timestamp); + } #endif /* HAL_ETH_USE_PTP */ /* Release the packet. */ heth->txFreeCallback(dmatxdesclist->PacketAddress[idx]); @@ -1450,7 +1462,10 @@ HAL_StatusTypeDef HAL_ETH_ReleaseTxPacket(ETH_HandleTypeDef *heth) /* Call callbacks */ #ifdef HAL_ETH_USE_PTP /* Handle Ptp */ - HAL_ETH_TxPtpCallback(dmatxdesclist->PacketAddress[idx], timestamp); + if (timestamp->TimeStampHigh != UINT32_MAX && timestamp->TimeStampLow != UINT32_MAX) + { + HAL_ETH_TxPtpCallback(dmatxdesclist->PacketAddress[idx], timestamp); + } #endif /* HAL_ETH_USE_PTP */ /* Release the packet. */ HAL_ETH_TxFreeCallback(dmatxdesclist->PacketAddress[idx]);