The sequence of reading current RTC time register doesn't meet
the hardware requirements, which causes this time obtained is
the one before modifying RTC time.

Fixes: 38b539d96eb6 ("net/hns3: support IEEE 1588 PTP")
Cc: sta...@dpdk.org

Signed-off-by: Huisong Li <lihuis...@huawei.com>
---
 drivers/net/hns3/hns3_ptp.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/drivers/net/hns3/hns3_ptp.c b/drivers/net/hns3/hns3_ptp.c
index 6bbd85ba23..db3c007b12 100644
--- a/drivers/net/hns3/hns3_ptp.c
+++ b/drivers/net/hns3/hns3_ptp.c
@@ -216,17 +216,21 @@ hns3_timesync_read_tx_timestamp(struct rte_eth_dev *dev,
 int
 hns3_timesync_read_time(struct rte_eth_dev *dev, struct timespec *ts)
 {
+#define HNS3_PTP_SEC_H_OFFSET  32
+#define HNS3_PTP_SEC_H_MASK    0xFFFF
+
        struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+       uint32_t sec_hi, sec_lo;
        uint64_t ns, sec;
 
        if (!hns3_dev_get_support(hw, PTP))
                return -ENOTSUP;
 
-       sec = hns3_read_dev(hw, HNS3_CURR_TIME_OUT_L);
-       sec |= (uint64_t)(hns3_read_dev(hw, HNS3_CURR_TIME_OUT_H) & 0xFFFF)
-               << 32;
-
        ns = hns3_read_dev(hw, HNS3_CURR_TIME_OUT_NS);
+       sec_hi = hns3_read_dev(hw, HNS3_CURR_TIME_OUT_H) & HNS3_PTP_SEC_H_MASK;
+       sec_lo = hns3_read_dev(hw, HNS3_CURR_TIME_OUT_L);
+       sec = ((uint64_t)sec_hi << HNS3_PTP_SEC_H_OFFSET) | sec_lo;
+
        ns += sec * NSEC_PER_SEC;
        *ts = rte_ns_to_timespec(ns);
 
-- 
2.22.0

Reply via email to