In ICE PMD, previously the ready bitmap checking before reading
PHY timestamp was not present. This caused incorrect Tx
timestamping.

The ready bitmap checking is enabled and PHY timestamp is read once
the ready bitmap gives positive value.

Fixes: 881169950d80 ("net/ice/base: implement initial PTP support for E830")
Cc: sta...@dpdk.org

Signed-off-by: Soumyadeep Hore <soumyadeep.h...@intel.com>
---
 drivers/net/ice/ice_ethdev.c | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ice/ice_ethdev.c b/drivers/net/ice/ice_ethdev.c
index 7b1bd163a2..e0db47cf28 100644
--- a/drivers/net/ice/ice_ethdev.c
+++ b/drivers/net/ice/ice_ethdev.c
@@ -6517,12 +6517,28 @@ ice_timesync_read_tx_timestamp(struct rte_eth_dev *dev,
        struct ice_adapter *ad =
                        ICE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
        uint8_t lport;
-       uint64_t ts_ns, ns, tstamp;
+       uint64_t ts_ns, ns, tstamp, tstamp_ready = 0;
+       uint64_t start_time, curr_time;
        const uint64_t mask = 0xFFFFFFFF;
        int ret;
 
        lport = hw->port_info->lport;
 
+       start_time = rte_get_timer_cycles() / (rte_get_timer_hz() / 1000);
+
+       while (!(tstamp_ready & BIT_ULL(0))) {
+               ret = ice_get_phy_tx_tstamp_ready(hw, lport, &tstamp_ready);
+               if (ret) {
+                       PMD_DRV_LOG(ERR, "Failed to get phy ready for 
timestamp");
+                       return -1;
+               }
+               curr_time = rte_get_timer_cycles() / (rte_get_timer_hz() / 
1000);
+               if (curr_time - start_time > 1000) {
+                       PMD_DRV_LOG(ERR, "Timeout to get phy ready for 
timestamp");
+                       return -1;
+               }
+       }
+
        ret = ice_read_phy_tstamp(hw, lport, 0, &tstamp);
        if (ret) {
                PMD_DRV_LOG(ERR, "Failed to read phy timestamp");
-- 
2.43.0

Reply via email to