The only different logic between the NFDk xmit function of PF representor and PF is if the logic about metadata exists. Refactor the NFDk xmit function and use a parameter to distinguish them.
Signed-off-by: Chaoyong He <chaoyong...@corigine.com> Reviewed-by: Niklas Söderlund <niklas.soderl...@corigine.com> --- drivers/net/nfp/flower/nfp_flower.c | 15 ++++++++++++++- drivers/net/nfp/nfdk/nfp_nfdk.h | 4 ++++ drivers/net/nfp/nfdk/nfp_nfdk_dp.c | 17 +++++++++++++++-- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/drivers/net/nfp/flower/nfp_flower.c b/drivers/net/nfp/flower/nfp_flower.c index 3bc863b9f1..5b452da6eb 100644 --- a/drivers/net/nfp/flower/nfp_flower.c +++ b/drivers/net/nfp/flower/nfp_flower.c @@ -493,14 +493,27 @@ nfp_flower_pf_nfd3_xmit_pkts(void *tx_queue, return nfp_net_nfd3_xmit_pkts_common(tx_queue, tx_pkts, nb_pkts, true); } +static uint16_t +nfp_flower_pf_nfdk_xmit_pkts(void *tx_queue, + struct rte_mbuf **tx_pkts, + uint16_t nb_pkts) +{ + return nfp_net_nfdk_xmit_pkts_common(tx_queue, tx_pkts, nb_pkts, true); +} + static void nfp_flower_pf_xmit_pkts_register(struct nfp_app_fw_flower *app_fw_flower) { + struct nfp_net_hw *hw; struct nfp_flower_nfd_func *nfd_func; + hw = app_fw_flower->pf_hw; nfd_func = &app_fw_flower->nfd_func; - nfd_func->pf_xmit_t = nfp_flower_pf_nfd3_xmit_pkts; + if (hw->ver.extend == NFP_NET_CFG_VERSION_DP_NFD3) + nfd_func->pf_xmit_t = nfp_flower_pf_nfd3_xmit_pkts; + else + nfd_func->pf_xmit_t = nfp_flower_pf_nfdk_xmit_pkts; } uint16_t diff --git a/drivers/net/nfp/nfdk/nfp_nfdk.h b/drivers/net/nfp/nfdk/nfp_nfdk.h index 898454102d..66f020efb0 100644 --- a/drivers/net/nfp/nfdk/nfp_nfdk.h +++ b/drivers/net/nfp/nfdk/nfp_nfdk.h @@ -229,6 +229,10 @@ nfp_net_nfdk_tx_tso(struct nfp_net_txq *txq, uint32_t nfp_flower_nfdk_pkt_add_metadata(struct rte_mbuf *mbuf, uint32_t port_id); +uint16_t nfp_net_nfdk_xmit_pkts_common(void *tx_queue, + struct rte_mbuf **tx_pkts, + uint16_t nb_pkts, + bool repr_flag); uint16_t nfp_net_nfdk_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts); diff --git a/drivers/net/nfp/nfdk/nfp_nfdk_dp.c b/drivers/net/nfp/nfdk/nfp_nfdk_dp.c index dbb15581c4..f66802211f 100644 --- a/drivers/net/nfp/nfdk/nfp_nfdk_dp.c +++ b/drivers/net/nfp/nfdk/nfp_nfdk_dp.c @@ -165,12 +165,20 @@ uint16_t nfp_net_nfdk_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) +{ + return nfp_net_nfdk_xmit_pkts_common(tx_queue, tx_pkts, nb_pkts, false); +} + +uint16_t +nfp_net_nfdk_xmit_pkts_common(void *tx_queue, + struct rte_mbuf **tx_pkts, + uint16_t nb_pkts, + bool repr_flag) { uint32_t buf_idx; uint64_t dma_addr; uint32_t free_descs; uint32_t npkts = 0; - uint64_t metadata = 0; struct rte_mbuf *pkt; struct nfp_net_hw *hw; struct rte_mbuf **lmbuf; @@ -203,6 +211,7 @@ nfp_net_nfdk_xmit_pkts(void *tx_queue, uint32_t tmp_dlen; uint32_t dlen_type; uint32_t used_descs; + uint64_t metadata = 0; pkt = *(tx_pkts + npkts); nop_descs = nfp_net_nfdk_tx_maybe_close_block(txq, pkt); @@ -219,7 +228,11 @@ nfp_net_nfdk_xmit_pkts(void *tx_queue, RTE_MBUF_PREFETCH_TO_FREE(*lmbuf); temp_pkt = pkt; - nfp_net_nfdk_set_meta_data(pkt, txq, &metadata); + + if (repr_flag) + metadata = NFDK_DESC_TX_CHAIN_META; + else + nfp_net_nfdk_set_meta_data(pkt, txq, &metadata); if (unlikely(pkt->nb_segs > 1 && (hw->cap & NFP_NET_CFG_CTRL_GATHER) == 0)) { -- 2.39.1