From: Ajit Khaparde <[email protected]>

Pass Rx timestamp value in the mbuf using dynaflag.
Add ptp_cfg NULL checks to avoid segfault when ptp_cfg is not created.

Cc: [email protected]

Signed-off-by: Ajit Khaparde <[email protected]>
Signed-off-by: Mohammad Shuab Siddique <[email protected]>
---
 drivers/net/bnxt/bnxt.h        |  4 ++++
 drivers/net/bnxt/bnxt_ethdev.c |  9 +++++++++
 drivers/net/bnxt/bnxt_rxr.c    | 21 +++++++++++++++++----
 drivers/net/bnxt/bnxt_rxr.h    |  7 +++++++
 4 files changed, 37 insertions(+), 4 deletions(-)

diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h
index 83ae151066..92ba475198 100644
--- a/drivers/net/bnxt/bnxt.h
+++ b/drivers/net/bnxt/bnxt.h
@@ -403,6 +403,10 @@ struct bnxt_ptp_cfg {
 
        /* On P5, the Rx timestamp is present in the Rx completion record */
        uint64_t                        rx_timestamp;
+       /* Dynamic mbuf field for passing Rx timestamp. */
+       int                             mb_rx_timestamp_offset;
+       /* Dynamic mbuf flag for indicating Rx timestamp. */
+       uint64_t                        mb_rx_timestamp_flag;
        uint64_t                        current_time;
        uint64_t                        old_time;
        rte_spinlock_t                  ptp_lock;
diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
index 3c618c6e82..c75cd05d99 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -1686,6 +1686,7 @@ static void bnxt_ptp_stop(struct bnxt *bp)
 
 static int bnxt_ptp_start(struct bnxt *bp)
 {
+       struct bnxt_ptp_cfg *ptp = bp->ptp_cfg;
        int rc;
 
        rc = bnxt_schedule_ptp_alarm(bp);
@@ -1694,6 +1695,14 @@ static int bnxt_ptp_start(struct bnxt *bp)
        } else {
                bp->flags2 |= BNXT_FLAGS2_PTP_TIMESYNC_ENABLED;
                bp->flags2 |= BNXT_FLAGS2_PTP_ALARM_SCHEDULED;
+
+               /* extra mbuf field to store timestamp information */
+               if 
(rte_mbuf_dyn_rx_timestamp_register(&ptp->mb_rx_timestamp_offset,
+                                                      
&ptp->mb_rx_timestamp_flag) != 0) {
+                       PMD_DRV_LOG_LINE(ERR,
+                                        "Failed to register mbuf field for Rx 
timestamp");
+                       return -rte_errno;
+               }
        }
 
        return rc;
diff --git a/drivers/net/bnxt/bnxt_rxr.c b/drivers/net/bnxt/bnxt_rxr.c
index ac4c61b850..0ccf47cf35 100644
--- a/drivers/net/bnxt/bnxt_rxr.c
+++ b/drivers/net/bnxt/bnxt_rxr.c
@@ -1190,19 +1190,32 @@ static int bnxt_rx_pkt(struct rte_mbuf **rx_pkt,
        mbuf->data_len = mbuf->pkt_len;
        mbuf->port = rxq->port_id;
 
-       if (unlikely((rte_le_to_cpu_16(rxcmp->flags_type) &
+       if (unlikely(((rte_le_to_cpu_16(rxcmp->flags_type) &
                      RX_PKT_CMPL_FLAGS_MASK) ==
                      RX_PKT_CMPL_FLAGS_ITYPE_PTP_W_TIMESTAMP) ||
-                     bp->ptp_all_rx_tstamp)
+                     bp->ptp_all_rx_tstamp) && bp->ieee_1588 &&
+                     bp->ptp_cfg) {
+               mbuf->ol_flags |= RTE_MBUF_F_RX_IEEE1588_PTP |
+                                 RTE_MBUF_F_RX_IEEE1588_TMST;
                bnxt_get_rx_ts_p5(rxq->bp, rxcmp1->reorder);
-
+#ifndef RTE_IOVA_IN_MBUF
+               bnxt_timestamp_dynfield_set(mbuf,
+                                           bp->ptp_cfg->mb_rx_timestamp_offset,
+                                           bp->ptp_cfg->rx_timestamp);
+               mbuf->ol_flags |= bp->ptp_cfg->mb_rx_timestamp_flag;
+#endif
+       }
        if (cmp_type == CMPL_BASE_TYPE_RX_L2_V3) {
                bnxt_parse_csum_v3(mbuf, rxcmp1);
                bnxt_parse_pkt_type_v3(mbuf, rxcmp, rxcmp1);
                bnxt_rx_vlan_v3(mbuf, rxcmp, rxcmp1);
                /* Packet cannot be a PTP ethertype if it is detected as L4 */
-               if (mbuf->ol_flags & RTE_MBUF_F_RX_L4_CKSUM_GOOD)
+               if (mbuf->ol_flags & RTE_MBUF_F_RX_L4_CKSUM_GOOD) {
                        mbuf->ol_flags &= ~RTE_MBUF_F_RX_IEEE1588_PTP;
+                       if (unlikely(bp->ptp_cfg))
+                               mbuf->ol_flags &=
+                                       ~bp->ptp_cfg->mb_rx_timestamp_flag;
+               }
 
                /* If its a PTP frame, ptype cannot be L2_ETHER */
                if (mbuf->ol_flags & RTE_MBUF_F_RX_IEEE1588_PTP)
diff --git a/drivers/net/bnxt/bnxt_rxr.h b/drivers/net/bnxt/bnxt_rxr.h
index 5e5496964f..0b7649193f 100644
--- a/drivers/net/bnxt/bnxt_rxr.h
+++ b/drivers/net/bnxt/bnxt_rxr.h
@@ -181,6 +181,13 @@ bnxt_cfa_code_dynfield(struct rte_mbuf *mbuf)
                bnxt_cfa_code_dynfield_offset, bnxt_cfa_code_dynfield_t *);
 }
 
+static __rte_always_inline void
+bnxt_timestamp_dynfield_set(struct rte_mbuf *mbuf, int offset,
+                           rte_mbuf_timestamp_t ts)
+{
+       *RTE_MBUF_DYNFIELD(mbuf, offset, rte_mbuf_timestamp_t *) = ts;
+}
+
 #define BNXT_RX_META_CFA_CODE_SHIFT            19
 #define BNXT_CFA_CODE_META_SHIFT               16
 #define BNXT_RX_META_CFA_CODE_INT_ACT_REC_BIT  0x8000000
-- 
2.47.3

Reply via email to