New upstream version 16.11.4
[deb_dpdk.git] / drivers / net / i40e / i40e_rxtx_vec_neon.c
index d235daa..557593a 100644 (file)
@@ -192,8 +192,7 @@ desc_to_olflags_v(uint64x2_t descs[4], struct rte_mbuf **rx_pkts)
 #endif
 
 #define PKTLEN_SHIFT     10
-
-#define I40E_VPMD_DESC_DD_MASK 0x0001000100010001ULL
+#define I40E_UINT16_BIT (CHAR_BIT * sizeof(uint16_t))
 
 static inline void
 desc_to_ptype_v(uint64x2_t descs[4], struct rte_mbuf **rx_pkts)
@@ -224,7 +223,6 @@ _recv_raw_pkts_vec(struct i40e_rx_queue *rxq, struct rte_mbuf **rx_pkts,
        struct i40e_rx_entry *sw_ring;
        uint16_t nb_pkts_recd;
        int pos;
-       uint64_t var;
 
        /* mask to shuffle from desc. to mbuf */
        uint8x16_t shuf_msk = {
@@ -357,7 +355,6 @@ _recv_raw_pkts_vec(struct i40e_rx_queue *rxq, struct rte_mbuf **rx_pkts,
                /* C.2 get 4 pkts staterr value  */
                staterr = vzipq_u16(sterr_tmp1.val[1],
                                    sterr_tmp2.val[1]).val[0];
-               stat = vgetq_lane_u64(vreinterpretq_u64_u16(staterr), 0);
 
                desc_to_olflags_v(descs, &rx_pkts[pos]);
 
@@ -422,6 +419,12 @@ _recv_raw_pkts_vec(struct i40e_rx_queue *rxq, struct rte_mbuf **rx_pkts,
                        rx_pkts[pos + 3]->next = NULL;
                }
 
+               staterr = vshlq_n_u16(staterr, I40E_UINT16_BIT - 1);
+               staterr = vreinterpretq_u16_s16(
+                               vshrq_n_s16(vreinterpretq_s16_u16(staterr),
+                                           I40E_UINT16_BIT - 1));
+               stat = ~vgetq_lane_u64(vreinterpretq_u64_u16(staterr), 0);
+
                rte_prefetch_non_temporal(rxdp + RTE_I40E_DESCS_PER_LOOP);
 
                /* D.3 copy final 1,2 data to rx_pkts */
@@ -431,10 +434,12 @@ _recv_raw_pkts_vec(struct i40e_rx_queue *rxq, struct rte_mbuf **rx_pkts,
                         pkt_mb1);
                desc_to_ptype_v(descs, &rx_pkts[pos]);
                /* C.4 calc avaialbe number of desc */
-               var = __builtin_popcountll(stat & I40E_VPMD_DESC_DD_MASK);
-               nb_pkts_recd += var;
-               if (likely(var != RTE_I40E_DESCS_PER_LOOP))
+               if (unlikely(stat == 0)) {
+                       nb_pkts_recd += RTE_I40E_DESCS_PER_LOOP;
+               } else {
+                       nb_pkts_recd += __builtin_ctzl(stat) / I40E_UINT16_BIT;
                        break;
+               }
        }
 
        /* Update our internal tail pointer */