net/cnxk: fix RSS RETA table update
[dpdk.git] / drivers / net / cnxk / cn9k_rx.h
index 1178f95..25a4927 100644 (file)
@@ -388,14 +388,19 @@ skip_parse:
                ol_flags =
                        nix_update_match_id(rx->cn9k.match_id, ol_flags, mbuf);
 
+       mbuf->ol_flags = ol_flags;
+       *(uint64_t *)(&mbuf->rearm_data) = val;
        mbuf->pkt_len = len;
        mbuf->data_len = len;
-       *(uint64_t *)(&mbuf->rearm_data) = val;
-
-       mbuf->ol_flags = ol_flags;
 
        if (flag & NIX_RX_MULTI_SEG_F)
-               nix_cqe_xtract_mseg(rx, mbuf, val, flag);
+               /*
+                * For multi segment packets, mbuf length correction according
+                * to Rx timestamp length will be handled later during
+                * timestamp data process.
+                * Hence, flag argument is not required.
+                */
+               nix_cqe_xtract_mseg(rx, mbuf, val, 0);
        else
                mbuf->next = NULL;
 }
@@ -430,6 +435,34 @@ nix_rx_nb_pkts(struct cn9k_eth_rxq *rxq, const uint64_t wdata,
        return RTE_MIN(pkts, available);
 }
 
+static __rte_always_inline void
+cn9k_nix_mbuf_to_tstamp(struct rte_mbuf *mbuf,
+                       struct cnxk_timesync_info *tstamp,
+                       const uint8_t ts_enable, uint64_t *tstamp_ptr)
+{
+       if (ts_enable) {
+               mbuf->pkt_len -= CNXK_NIX_TIMESYNC_RX_OFFSET;
+               mbuf->data_len -= CNXK_NIX_TIMESYNC_RX_OFFSET;
+
+               /* Reading the rx timestamp inserted by CGX, viz at
+                * starting of the packet data.
+                */
+               *cnxk_nix_timestamp_dynfield(mbuf, tstamp) =
+                       rte_be_to_cpu_64(*tstamp_ptr);
+               /* RTE_MBUF_F_RX_IEEE1588_TMST flag needs to be set only in case
+                * PTP packets are received.
+                */
+               if (mbuf->packet_type == RTE_PTYPE_L2_ETHER_TIMESYNC) {
+                       tstamp->rx_tstamp =
+                               *cnxk_nix_timestamp_dynfield(mbuf, tstamp);
+                       tstamp->rx_ready = 1;
+                       mbuf->ol_flags |= RTE_MBUF_F_RX_IEEE1588_PTP |
+                                         RTE_MBUF_F_RX_IEEE1588_TMST |
+                                         tstamp->rx_tstamp_dynflag;
+               }
+       }
+}
+
 static __rte_always_inline uint16_t
 cn9k_nix_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t pkts,
                   const uint16_t flags)
@@ -458,9 +491,8 @@ cn9k_nix_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t pkts,
 
                cn9k_nix_cqe_to_mbuf(cq, cq->tag, mbuf, lookup_mem, mbuf_init,
                                     flags);
-               cnxk_nix_mbuf_to_tstamp(mbuf, rxq->tstamp,
+               cn9k_nix_mbuf_to_tstamp(mbuf, rxq->tstamp,
                                        (flags & NIX_RX_OFFLOAD_TSTAMP_F),
-                                       (flags & NIX_RX_MULTI_SEG_F),
                                        (uint64_t *)((uint8_t *)mbuf
                                                                + data_off));
                rx_pkts[packets++] = mbuf;
@@ -769,10 +801,6 @@ cn9k_nix_recv_pkts_vector(void *rx_queue, struct rte_mbuf **rx_pkts,
                vst1q_u64((uint64_t *)mbuf2->rearm_data, rearm2);
                vst1q_u64((uint64_t *)mbuf3->rearm_data, rearm3);
 
-               /* Store the mbufs to rx_pkts */
-               vst1q_u64((uint64_t *)&rx_pkts[packets], mbuf01);
-               vst1q_u64((uint64_t *)&rx_pkts[packets + 2], mbuf23);
-
                if (flags & NIX_RX_MULTI_SEG_F) {
                        /* Multi segment is enable build mseg list for
                         * individual mbufs in scalar mode.
@@ -797,6 +825,10 @@ cn9k_nix_recv_pkts_vector(void *rx_queue, struct rte_mbuf **rx_pkts,
                        mbuf3->next = NULL;
                }
 
+               /* Store the mbufs to rx_pkts */
+               vst1q_u64((uint64_t *)&rx_pkts[packets], mbuf01);
+               vst1q_u64((uint64_t *)&rx_pkts[packets + 2], mbuf23);
+
                /* Prefetch mbufs */
                roc_prefetch_store_keep(mbuf0);
                roc_prefetch_store_keep(mbuf1);