1e31f123dSWei Hu (Xavier) /* SPDX-License-Identifier: BSD-3-Clause 253e6f86cSMin Hu (Connor) * Copyright(c) 2020-2021 HiSilicon Limited. 3e31f123dSWei Hu (Xavier) */ 4e31f123dSWei Hu (Xavier) 52ad146efSChengwen Feng #ifndef HNS3_RXTX_VEC_NEON_H 62ad146efSChengwen Feng #define HNS3_RXTX_VEC_NEON_H 7e31f123dSWei Hu (Xavier) 8191128d7SDavid Marchand #include <rte_bitops.h> 9191128d7SDavid Marchand 10e31f123dSWei Hu (Xavier) #include <arm_neon.h> 11e31f123dSWei Hu (Xavier) 12e31f123dSWei Hu (Xavier) static inline void 13e31f123dSWei Hu (Xavier) hns3_vec_tx(volatile struct hns3_desc *desc, struct rte_mbuf *pkt) 14e31f123dSWei Hu (Xavier) { 15e31f123dSWei Hu (Xavier) uint64x2_t val1 = { 1621b33542SChengwen Feng rte_pktmbuf_iova(pkt), 17e31f123dSWei Hu (Xavier) ((uint64_t)pkt->data_len) << HNS3_TXD_SEND_SIZE_SHIFT 18e31f123dSWei Hu (Xavier) }; 19e31f123dSWei Hu (Xavier) uint64x2_t val2 = { 20e31f123dSWei Hu (Xavier) 0, 21e31f123dSWei Hu (Xavier) ((uint64_t)HNS3_TXD_DEFAULT_VLD_FE_BDTYPE) << HNS3_UINT32_BIT 22e31f123dSWei Hu (Xavier) }; 23*43fd3624SAndre Muezerie vst1q_u64(RTE_CAST_PTR(uint64_t *, &desc->addr), val1); 24*43fd3624SAndre Muezerie vst1q_u64(RTE_CAST_PTR(uint64_t *, &desc->tx.outer_vlan_tag), val2); 25e31f123dSWei Hu (Xavier) } 26e31f123dSWei Hu (Xavier) 27e31f123dSWei Hu (Xavier) static uint16_t 28e31f123dSWei Hu (Xavier) hns3_xmit_fixed_burst_vec(void *__restrict tx_queue, 29e31f123dSWei Hu (Xavier) struct rte_mbuf **__restrict tx_pkts, 30e31f123dSWei Hu (Xavier) uint16_t nb_pkts) 31e31f123dSWei Hu (Xavier) { 32e31f123dSWei Hu (Xavier) struct hns3_tx_queue *txq = (struct hns3_tx_queue *)tx_queue; 33e31f123dSWei Hu (Xavier) volatile struct hns3_desc *tx_desc; 34e31f123dSWei Hu (Xavier) struct hns3_entry *tx_entry; 35e31f123dSWei Hu (Xavier) uint16_t next_to_use; 36e31f123dSWei Hu (Xavier) uint16_t nb_commit; 37e31f123dSWei Hu (Xavier) uint16_t nb_tx; 38e31f123dSWei Hu (Xavier) uint16_t n, i; 39e31f123dSWei Hu (Xavier) 40e31f123dSWei Hu (Xavier) if (txq->tx_bd_ready < txq->tx_free_thresh) 41e31f123dSWei Hu (Xavier) hns3_tx_free_buffers(txq); 42e31f123dSWei Hu (Xavier) 43e31f123dSWei Hu (Xavier) nb_commit = RTE_MIN(txq->tx_bd_ready, nb_pkts); 44e31f123dSWei Hu (Xavier) if (unlikely(nb_commit == 0)) { 459b77f1feSHuisong Li txq->dfx_stats.queue_full_cnt++; 46e31f123dSWei Hu (Xavier) return 0; 47e31f123dSWei Hu (Xavier) } 48e31f123dSWei Hu (Xavier) nb_tx = nb_commit; 49e31f123dSWei Hu (Xavier) 50e31f123dSWei Hu (Xavier) next_to_use = txq->next_to_use; 51e31f123dSWei Hu (Xavier) tx_desc = &txq->tx_ring[next_to_use]; 52e31f123dSWei Hu (Xavier) tx_entry = &txq->sw_ring[next_to_use]; 53e31f123dSWei Hu (Xavier) 54e31f123dSWei Hu (Xavier) /* 55e31f123dSWei Hu (Xavier) * We need to deal with n descriptors first for better performance, 56e31f123dSWei Hu (Xavier) * if nb_commit is greater than the difference between txq->nb_tx_desc 57e31f123dSWei Hu (Xavier) * and next_to_use in sw_ring and tx_ring. 58e31f123dSWei Hu (Xavier) */ 59e31f123dSWei Hu (Xavier) n = txq->nb_tx_desc - next_to_use; 60e31f123dSWei Hu (Xavier) if (nb_commit >= n) { 61e31f123dSWei Hu (Xavier) for (i = 0; i < n; i++, tx_pkts++, tx_desc++) { 62e31f123dSWei Hu (Xavier) hns3_vec_tx(tx_desc, *tx_pkts); 63e31f123dSWei Hu (Xavier) tx_entry[i].mbuf = *tx_pkts; 64fdcd6a3eSMin Hu (Connor) 65fdcd6a3eSMin Hu (Connor) /* Increment bytes counter */ 66fdcd6a3eSMin Hu (Connor) txq->basic_stats.bytes += (*tx_pkts)->pkt_len; 67e31f123dSWei Hu (Xavier) } 68e31f123dSWei Hu (Xavier) 69e31f123dSWei Hu (Xavier) nb_commit -= n; 70e31f123dSWei Hu (Xavier) next_to_use = 0; 71e31f123dSWei Hu (Xavier) tx_desc = &txq->tx_ring[next_to_use]; 72e31f123dSWei Hu (Xavier) tx_entry = &txq->sw_ring[next_to_use]; 73e31f123dSWei Hu (Xavier) } 74e31f123dSWei Hu (Xavier) 75e31f123dSWei Hu (Xavier) for (i = 0; i < nb_commit; i++, tx_pkts++, tx_desc++) { 76e31f123dSWei Hu (Xavier) hns3_vec_tx(tx_desc, *tx_pkts); 77e31f123dSWei Hu (Xavier) tx_entry[i].mbuf = *tx_pkts; 78fdcd6a3eSMin Hu (Connor) 79fdcd6a3eSMin Hu (Connor) /* Increment bytes counter */ 80fdcd6a3eSMin Hu (Connor) txq->basic_stats.bytes += (*tx_pkts)->pkt_len; 81e31f123dSWei Hu (Xavier) } 82e31f123dSWei Hu (Xavier) 83e31f123dSWei Hu (Xavier) next_to_use += nb_commit; 84e31f123dSWei Hu (Xavier) txq->next_to_use = next_to_use; 85e31f123dSWei Hu (Xavier) txq->tx_bd_ready -= nb_tx; 86e31f123dSWei Hu (Xavier) 8723e317ddSChengwen Feng hns3_write_txq_tail_reg(txq, nb_tx); 88e31f123dSWei Hu (Xavier) 89e31f123dSWei Hu (Xavier) return nb_tx; 90e31f123dSWei Hu (Xavier) } 91a3d4f4d2SWei Hu (Xavier) 92a3d4f4d2SWei Hu (Xavier) static inline uint32_t 93a3d4f4d2SWei Hu (Xavier) hns3_desc_parse_field(struct hns3_rx_queue *rxq, 94a3d4f4d2SWei Hu (Xavier) struct hns3_entry *sw_ring, 95a3d4f4d2SWei Hu (Xavier) struct hns3_desc *rxdp, 96a3d4f4d2SWei Hu (Xavier) uint32_t bd_vld_num) 97a3d4f4d2SWei Hu (Xavier) { 98a3d4f4d2SWei Hu (Xavier) uint32_t l234_info, ol_info, bd_base_info; 99a3d4f4d2SWei Hu (Xavier) struct rte_mbuf *pkt; 100a3d4f4d2SWei Hu (Xavier) uint32_t retcode = 0; 10137f54f3cSHongbo Zheng uint32_t i; 10237f54f3cSHongbo Zheng int ret; 103a3d4f4d2SWei Hu (Xavier) 10437f54f3cSHongbo Zheng for (i = 0; i < bd_vld_num; i++) { 105a3d4f4d2SWei Hu (Xavier) pkt = sw_ring[i].mbuf; 106a3d4f4d2SWei Hu (Xavier) 107a3d4f4d2SWei Hu (Xavier) /* init rte_mbuf.rearm_data last 64-bit */ 108daa02b5cSOlivier Matz pkt->ol_flags = RTE_MBUF_F_RX_RSS_HASH; 109a3d4f4d2SWei Hu (Xavier) 110a3d4f4d2SWei Hu (Xavier) l234_info = rxdp[i].rx.l234_info; 111a3d4f4d2SWei Hu (Xavier) ol_info = rxdp[i].rx.ol_info; 112a3d4f4d2SWei Hu (Xavier) bd_base_info = rxdp[i].rx.bd_base_info; 113bd739929SChengwen Feng ret = hns3_handle_bdinfo(rxq, pkt, bd_base_info, l234_info); 114a3d4f4d2SWei Hu (Xavier) if (unlikely(ret)) { 115a3d4f4d2SWei Hu (Xavier) retcode |= 1u << i; 116a3d4f4d2SWei Hu (Xavier) continue; 117a3d4f4d2SWei Hu (Xavier) } 118a3d4f4d2SWei Hu (Xavier) 119a3d4f4d2SWei Hu (Xavier) pkt->packet_type = hns3_rx_calc_ptype(rxq, l234_info, ol_info); 120fdcd6a3eSMin Hu (Connor) 121fdcd6a3eSMin Hu (Connor) /* Increment bytes counter */ 122fdcd6a3eSMin Hu (Connor) rxq->basic_stats.bytes += pkt->pkt_len; 123a3d4f4d2SWei Hu (Xavier) } 124a3d4f4d2SWei Hu (Xavier) 125a3d4f4d2SWei Hu (Xavier) return retcode; 126a3d4f4d2SWei Hu (Xavier) } 127a3d4f4d2SWei Hu (Xavier) 128a3d4f4d2SWei Hu (Xavier) static inline uint16_t 129a3d4f4d2SWei Hu (Xavier) hns3_recv_burst_vec(struct hns3_rx_queue *__restrict rxq, 130a3d4f4d2SWei Hu (Xavier) struct rte_mbuf **__restrict rx_pkts, 131a3d4f4d2SWei Hu (Xavier) uint16_t nb_pkts, 132a3d4f4d2SWei Hu (Xavier) uint64_t *bd_err_mask) 133a3d4f4d2SWei Hu (Xavier) { 134a3d4f4d2SWei Hu (Xavier) uint16_t rx_id = rxq->next_to_use; 135a3d4f4d2SWei Hu (Xavier) struct hns3_entry *sw_ring = &rxq->sw_ring[rx_id]; 136a3d4f4d2SWei Hu (Xavier) struct hns3_desc *rxdp = &rxq->rx_ring[rx_id]; 137a3d4f4d2SWei Hu (Xavier) uint32_t bd_valid_num, parse_retcode; 138a3d4f4d2SWei Hu (Xavier) uint16_t nb_rx = 0; 13937f54f3cSHongbo Zheng uint32_t pos; 14037f54f3cSHongbo Zheng int offset; 141a3d4f4d2SWei Hu (Xavier) 142a3d4f4d2SWei Hu (Xavier) /* mask to shuffle from desc to mbuf's rx_descriptor_fields1 */ 143a3d4f4d2SWei Hu (Xavier) uint8x16_t shuf_desc_fields_msk = { 144a3d4f4d2SWei Hu (Xavier) 0xff, 0xff, 0xff, 0xff, /* packet type init zero */ 1456bec7c50SHuisong Li 20, 21, 0xff, 0xff, /* rx.pkt_len to rte_mbuf.pkt_len */ 1466bec7c50SHuisong Li 22, 23, /* size to rte_mbuf.data_len */ 147a3d4f4d2SWei Hu (Xavier) 0xff, 0xff, /* rte_mbuf.vlan_tci init zero */ 148a3d4f4d2SWei Hu (Xavier) 8, 9, 10, 11, /* rx.rss_hash to rte_mbuf.hash.rss */ 149a3d4f4d2SWei Hu (Xavier) }; 150a3d4f4d2SWei Hu (Xavier) 151a3d4f4d2SWei Hu (Xavier) uint16x8_t crc_adjust = { 152a3d4f4d2SWei Hu (Xavier) 0, 0, /* ignore pkt_type field */ 153a3d4f4d2SWei Hu (Xavier) rxq->crc_len, /* sub crc on pkt_len */ 154a3d4f4d2SWei Hu (Xavier) 0, /* ignore high-16bits of pkt_len */ 155a3d4f4d2SWei Hu (Xavier) rxq->crc_len, /* sub crc on data_len */ 156a3d4f4d2SWei Hu (Xavier) 0, 0, 0, /* ignore non-length fields */ 157a3d4f4d2SWei Hu (Xavier) }; 158a3d4f4d2SWei Hu (Xavier) 159cb12e988SChengwen Feng /* compile-time verifies the shuffle mask */ 160cb12e988SChengwen Feng RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, pkt_len) != 161cb12e988SChengwen Feng offsetof(struct rte_mbuf, rx_descriptor_fields1) + 4); 162cb12e988SChengwen Feng RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, data_len) != 163cb12e988SChengwen Feng offsetof(struct rte_mbuf, rx_descriptor_fields1) + 8); 164cb12e988SChengwen Feng RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, hash.rss) != 165cb12e988SChengwen Feng offsetof(struct rte_mbuf, rx_descriptor_fields1) + 12); 166cb12e988SChengwen Feng 167a3d4f4d2SWei Hu (Xavier) for (pos = 0; pos < nb_pkts; pos += HNS3_DEFAULT_DESCS_PER_LOOP, 168a3d4f4d2SWei Hu (Xavier) rxdp += HNS3_DEFAULT_DESCS_PER_LOOP) { 169a3d4f4d2SWei Hu (Xavier) uint64x2x2_t descs[HNS3_DEFAULT_DESCS_PER_LOOP]; 170a3d4f4d2SWei Hu (Xavier) uint8x16x2_t pkt_mbuf1, pkt_mbuf2, pkt_mbuf3, pkt_mbuf4; 171a3d4f4d2SWei Hu (Xavier) uint8x16_t pkt_mb1, pkt_mb2, pkt_mb3, pkt_mb4; 172a3d4f4d2SWei Hu (Xavier) uint64x2_t mbp1, mbp2; 173a3d4f4d2SWei Hu (Xavier) uint16x4_t bd_vld = {0}; 174a3d4f4d2SWei Hu (Xavier) uint16x8_t tmp; 175a3d4f4d2SWei Hu (Xavier) uint64_t stat; 176a3d4f4d2SWei Hu (Xavier) 177a3d4f4d2SWei Hu (Xavier) /* calc how many bd valid */ 178a3d4f4d2SWei Hu (Xavier) bd_vld = vset_lane_u16(rxdp[0].rx.bdtype_vld_udp0, bd_vld, 0); 179a3d4f4d2SWei Hu (Xavier) bd_vld = vset_lane_u16(rxdp[1].rx.bdtype_vld_udp0, bd_vld, 1); 180a3d4f4d2SWei Hu (Xavier) bd_vld = vset_lane_u16(rxdp[2].rx.bdtype_vld_udp0, bd_vld, 2); 181a3d4f4d2SWei Hu (Xavier) bd_vld = vset_lane_u16(rxdp[3].rx.bdtype_vld_udp0, bd_vld, 3); 182a3d4f4d2SWei Hu (Xavier) 183a3d4f4d2SWei Hu (Xavier) bd_vld = vshl_n_u16(bd_vld, 184a3d4f4d2SWei Hu (Xavier) HNS3_UINT16_BIT - 1 - HNS3_RXD_VLD_B); 185a3d4f4d2SWei Hu (Xavier) bd_vld = vreinterpret_u16_s16( 186a3d4f4d2SWei Hu (Xavier) vshr_n_s16(vreinterpret_s16_u16(bd_vld), 187a3d4f4d2SWei Hu (Xavier) HNS3_UINT16_BIT - 1)); 188a3d4f4d2SWei Hu (Xavier) stat = ~vget_lane_u64(vreinterpret_u64_u16(bd_vld), 0); 189a3d4f4d2SWei Hu (Xavier) if (likely(stat == 0)) 190a3d4f4d2SWei Hu (Xavier) bd_valid_num = HNS3_DEFAULT_DESCS_PER_LOOP; 191a3d4f4d2SWei Hu (Xavier) else 192191128d7SDavid Marchand bd_valid_num = rte_ctz64(stat) / HNS3_UINT16_BIT; 193a3d4f4d2SWei Hu (Xavier) if (bd_valid_num == 0) 194a3d4f4d2SWei Hu (Xavier) break; 195a3d4f4d2SWei Hu (Xavier) 1967dd439edSHuisong Li /* load 4 mbuf pointer */ 1977dd439edSHuisong Li mbp1 = vld1q_u64((uint64_t *)&sw_ring[pos]); 1987dd439edSHuisong Li mbp2 = vld1q_u64((uint64_t *)&sw_ring[pos + 2]); 1997dd439edSHuisong Li 2007dd439edSHuisong Li /* store 4 mbuf pointer into rx_pkts */ 2017dd439edSHuisong Li vst1q_u64((uint64_t *)&rx_pkts[pos], mbp1); 2027dd439edSHuisong Li vst1q_u64((uint64_t *)&rx_pkts[pos + 2], mbp2); 2037dd439edSHuisong Li 204a3d4f4d2SWei Hu (Xavier) /* use offset to control below data load oper ordering */ 205a3d4f4d2SWei Hu (Xavier) offset = rxq->offset_table[bd_valid_num]; 206a3d4f4d2SWei Hu (Xavier) 2077dd439edSHuisong Li /* read 4 descs */ 208a3d4f4d2SWei Hu (Xavier) descs[0] = vld2q_u64((uint64_t *)(rxdp + offset)); 209a3d4f4d2SWei Hu (Xavier) descs[1] = vld2q_u64((uint64_t *)(rxdp + offset + 1)); 210a3d4f4d2SWei Hu (Xavier) descs[2] = vld2q_u64((uint64_t *)(rxdp + offset + 2)); 211a3d4f4d2SWei Hu (Xavier) descs[3] = vld2q_u64((uint64_t *)(rxdp + offset + 3)); 212a3d4f4d2SWei Hu (Xavier) 213a3d4f4d2SWei Hu (Xavier) pkt_mbuf1.val[0] = vreinterpretq_u8_u64(descs[0].val[0]); 214a3d4f4d2SWei Hu (Xavier) pkt_mbuf1.val[1] = vreinterpretq_u8_u64(descs[0].val[1]); 215a3d4f4d2SWei Hu (Xavier) pkt_mbuf2.val[0] = vreinterpretq_u8_u64(descs[1].val[0]); 216a3d4f4d2SWei Hu (Xavier) pkt_mbuf2.val[1] = vreinterpretq_u8_u64(descs[1].val[1]); 217a3d4f4d2SWei Hu (Xavier) pkt_mbuf3.val[0] = vreinterpretq_u8_u64(descs[2].val[0]); 218a3d4f4d2SWei Hu (Xavier) pkt_mbuf3.val[1] = vreinterpretq_u8_u64(descs[2].val[1]); 219a3d4f4d2SWei Hu (Xavier) pkt_mbuf4.val[0] = vreinterpretq_u8_u64(descs[3].val[0]); 220a3d4f4d2SWei Hu (Xavier) pkt_mbuf4.val[1] = vreinterpretq_u8_u64(descs[3].val[1]); 221a3d4f4d2SWei Hu (Xavier) 2227dd439edSHuisong Li /* 4 packets convert format from desc to pktmbuf */ 2237dd439edSHuisong Li pkt_mb1 = vqtbl2q_u8(pkt_mbuf1, shuf_desc_fields_msk); 2247dd439edSHuisong Li pkt_mb2 = vqtbl2q_u8(pkt_mbuf2, shuf_desc_fields_msk); 225a3d4f4d2SWei Hu (Xavier) pkt_mb3 = vqtbl2q_u8(pkt_mbuf3, shuf_desc_fields_msk); 226a3d4f4d2SWei Hu (Xavier) pkt_mb4 = vqtbl2q_u8(pkt_mbuf4, shuf_desc_fields_msk); 227a3d4f4d2SWei Hu (Xavier) 2287dd439edSHuisong Li /* 4 packets remove crc */ 2297dd439edSHuisong Li tmp = vsubq_u16(vreinterpretq_u16_u8(pkt_mb1), crc_adjust); 2307dd439edSHuisong Li pkt_mb1 = vreinterpretq_u8_u16(tmp); 2317dd439edSHuisong Li tmp = vsubq_u16(vreinterpretq_u16_u8(pkt_mb2), crc_adjust); 2327dd439edSHuisong Li pkt_mb2 = vreinterpretq_u8_u16(tmp); 233a3d4f4d2SWei Hu (Xavier) tmp = vsubq_u16(vreinterpretq_u16_u8(pkt_mb3), crc_adjust); 234a3d4f4d2SWei Hu (Xavier) pkt_mb3 = vreinterpretq_u8_u16(tmp); 235a3d4f4d2SWei Hu (Xavier) tmp = vsubq_u16(vreinterpretq_u16_u8(pkt_mb4), crc_adjust); 236a3d4f4d2SWei Hu (Xavier) pkt_mb4 = vreinterpretq_u8_u16(tmp); 237a3d4f4d2SWei Hu (Xavier) 2387dd439edSHuisong Li /* save packet info to rx_pkts mbuf */ 2397dd439edSHuisong Li vst1q_u8((void *)&sw_ring[pos + 0].mbuf->rx_descriptor_fields1, 2407dd439edSHuisong Li pkt_mb1); 2417dd439edSHuisong Li vst1q_u8((void *)&sw_ring[pos + 1].mbuf->rx_descriptor_fields1, 2427dd439edSHuisong Li pkt_mb2); 243a3d4f4d2SWei Hu (Xavier) vst1q_u8((void *)&sw_ring[pos + 2].mbuf->rx_descriptor_fields1, 244a3d4f4d2SWei Hu (Xavier) pkt_mb3); 245a3d4f4d2SWei Hu (Xavier) vst1q_u8((void *)&sw_ring[pos + 3].mbuf->rx_descriptor_fields1, 246a3d4f4d2SWei Hu (Xavier) pkt_mb4); 247a3d4f4d2SWei Hu (Xavier) 2487dd439edSHuisong Li /* store the first 8 bytes of packets mbuf's rearm_data */ 2497dd439edSHuisong Li *(uint64_t *)&sw_ring[pos + 0].mbuf->rearm_data = 2507dd439edSHuisong Li rxq->mbuf_initializer; 2517dd439edSHuisong Li *(uint64_t *)&sw_ring[pos + 1].mbuf->rearm_data = 2527dd439edSHuisong Li rxq->mbuf_initializer; 2537dd439edSHuisong Li *(uint64_t *)&sw_ring[pos + 2].mbuf->rearm_data = 2547dd439edSHuisong Li rxq->mbuf_initializer; 2557dd439edSHuisong Li *(uint64_t *)&sw_ring[pos + 3].mbuf->rearm_data = 2567dd439edSHuisong Li rxq->mbuf_initializer; 2577dd439edSHuisong Li 258a3d4f4d2SWei Hu (Xavier) rte_prefetch_non_temporal(rxdp + HNS3_DEFAULT_DESCS_PER_LOOP); 259a3d4f4d2SWei Hu (Xavier) 260a3d4f4d2SWei Hu (Xavier) parse_retcode = hns3_desc_parse_field(rxq, &sw_ring[pos], 261a3d4f4d2SWei Hu (Xavier) &rxdp[offset], bd_valid_num); 262a3d4f4d2SWei Hu (Xavier) if (unlikely(parse_retcode)) 263a3d4f4d2SWei Hu (Xavier) (*bd_err_mask) |= ((uint64_t)parse_retcode) << pos; 264a3d4f4d2SWei Hu (Xavier) 265a3d4f4d2SWei Hu (Xavier) rte_prefetch0(sw_ring[pos + 266a3d4f4d2SWei Hu (Xavier) HNS3_DEFAULT_DESCS_PER_LOOP + 0].mbuf); 267a3d4f4d2SWei Hu (Xavier) rte_prefetch0(sw_ring[pos + 268a3d4f4d2SWei Hu (Xavier) HNS3_DEFAULT_DESCS_PER_LOOP + 1].mbuf); 269a3d4f4d2SWei Hu (Xavier) rte_prefetch0(sw_ring[pos + 270a3d4f4d2SWei Hu (Xavier) HNS3_DEFAULT_DESCS_PER_LOOP + 2].mbuf); 271a3d4f4d2SWei Hu (Xavier) rte_prefetch0(sw_ring[pos + 272a3d4f4d2SWei Hu (Xavier) HNS3_DEFAULT_DESCS_PER_LOOP + 3].mbuf); 273a3d4f4d2SWei Hu (Xavier) 274a3d4f4d2SWei Hu (Xavier) nb_rx += bd_valid_num; 275a3d4f4d2SWei Hu (Xavier) if (bd_valid_num < HNS3_DEFAULT_DESCS_PER_LOOP) 276a3d4f4d2SWei Hu (Xavier) break; 277a3d4f4d2SWei Hu (Xavier) } 278a3d4f4d2SWei Hu (Xavier) 279a3d4f4d2SWei Hu (Xavier) rxq->rx_rearm_nb += nb_rx; 280a3d4f4d2SWei Hu (Xavier) rxq->next_to_use += nb_rx; 281a3d4f4d2SWei Hu (Xavier) if (rxq->next_to_use >= rxq->nb_rx_desc) 282a3d4f4d2SWei Hu (Xavier) rxq->next_to_use = 0; 283a3d4f4d2SWei Hu (Xavier) 284a3d4f4d2SWei Hu (Xavier) return nb_rx; 285a3d4f4d2SWei Hu (Xavier) } 2862ad146efSChengwen Feng #endif /* HNS3_RXTX_VEC_NEON_H */ 287