X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fhns3%2Fhns3_rxtx_vec.h;h=2baf085b952c72e02c9292f060d0885b4bf5ef81;hb=c9a63bb64e79ab5fa6b5bd298df5b5695067d1e5;hp=90679bf335a8be1aa304c2e112d84ac9ac1d942c;hpb=e31f123db06b4400dbaa1298882401cebd541398;p=dpdk.git diff --git a/drivers/net/hns3/hns3_rxtx_vec.h b/drivers/net/hns3/hns3_rxtx_vec.h index 90679bf335..2baf085b95 100644 --- a/drivers/net/hns3/hns3_rxtx_vec.h +++ b/drivers/net/hns3/hns3_rxtx_vec.h @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: BSD-3-Clause - * Copyright(c) 2020 Hisilicon Limited. + * Copyright(c) 2020-2021 HiSilicon Limited. */ #ifndef _HNS3_RXTX_VEC_H_ @@ -9,26 +9,14 @@ #include "hns3_ethdev.h" static inline void -hns3_tx_free_buffers(struct hns3_tx_queue *txq) +hns3_tx_bulk_free_buffers(struct hns3_tx_queue *txq) { struct rte_mbuf **free = txq->free; struct hns3_entry *tx_entry; - struct hns3_desc *tx_desc; struct rte_mbuf *m; int nb_free = 0; int i; - /* - * All mbufs can be released only when the VLD bits of all - * descriptors in a batch are cleared. - */ - tx_desc = &txq->tx_ring[txq->next_to_clean]; - for (i = 0; i < txq->tx_rs_thresh; i++, tx_desc++) { - if (tx_desc->tx.tp_fe_sc_vld_ra_ri & - rte_le_to_cpu_16(BIT(HNS3_TXD_VLD_B))) - return; - } - tx_entry = &txq->sw_ring[txq->next_to_clean]; for (i = 0; i < txq->tx_rs_thresh; i++, tx_entry++) { m = rte_pktmbuf_prefree_seg(tx_entry->mbuf); @@ -54,4 +42,44 @@ hns3_tx_free_buffers(struct hns3_tx_queue *txq) if (txq->next_to_clean >= txq->nb_tx_desc) txq->next_to_clean = 0; } + +static inline void +hns3_tx_free_buffers(struct hns3_tx_queue *txq) +{ + struct hns3_desc *tx_desc; + int i; + + /* + * All mbufs can be released only when the VLD bits of all + * descriptors in a batch are cleared. + */ + tx_desc = &txq->tx_ring[txq->next_to_clean]; + for (i = 0; i < txq->tx_rs_thresh; i++, tx_desc++) { + if (tx_desc->tx.tp_fe_sc_vld_ra_ri & + rte_le_to_cpu_16(BIT(HNS3_TXD_VLD_B))) + return; + } + + hns3_tx_bulk_free_buffers(txq); +} + +static inline uint16_t +hns3_rx_reassemble_pkts(struct rte_mbuf **rx_pkts, + uint16_t nb_pkts, + uint64_t pkt_err_mask) +{ + uint16_t count, i; + uint64_t mask; + + count = 0; + for (i = 0; i < nb_pkts; i++) { + mask = ((uint64_t)1u) << i; + if (pkt_err_mask & mask) + rte_pktmbuf_free_seg(rx_pkts[i]); + else + rx_pkts[count++] = rx_pkts[i]; + } + + return count; +} #endif /* _HNS3_RXTX_VEC_H_ */