X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;ds=sidebyside;f=drivers%2Fnet%2Fsfc%2Fsfc_ef100_tx.c;h=e166fda888b19d48e697479d6cc024ad0c1d1fca;hb=6ded2e01380e5f3bd48154ca8f23eaad35ffe839;hp=9eb42c34d9054db10beed52c87d5e955010cbdc6;hpb=942a63649941dd63ab2e2d2d22979834db21079a;p=dpdk.git diff --git a/drivers/net/sfc/sfc_ef100_tx.c b/drivers/net/sfc/sfc_ef100_tx.c index 9eb42c34d9..e166fda888 100644 --- a/drivers/net/sfc/sfc_ef100_tx.c +++ b/drivers/net/sfc/sfc_ef100_tx.c @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: BSD-3-Clause * - * Copyright(c) 2019-2020 Xilinx, Inc. + * Copyright(c) 2019-2021 Xilinx, Inc. * Copyright(c) 2018-2019 Solarflare Communications Inc. * * This software was jointly developed between OKTET Labs (under contract @@ -10,6 +10,7 @@ #include #include +#include #include #include @@ -309,6 +310,19 @@ sfc_ef100_tx_reap(struct sfc_ef100_txq *txq) sfc_ef100_tx_reap_num_descs(txq, sfc_ef100_tx_process_events(txq)); } +static void +sfc_ef100_tx_qdesc_prefix_create(const struct rte_mbuf *m, efx_oword_t *tx_desc) +{ + efx_mport_id_t *mport_id = + RTE_MBUF_DYNFIELD(m, sfc_dp_mport_offset, efx_mport_id_t *); + + EFX_POPULATE_OWORD_3(*tx_desc, + ESF_GZ_TX_PREFIX_EGRESS_MPORT, + mport_id->id, + ESF_GZ_TX_PREFIX_EGRESS_MPORT_EN, 1, + ESF_GZ_TX_DESC_TYPE, ESE_GZ_TX_DESC_TYPE_PREFIX); +} + static uint8_t sfc_ef100_tx_qdesc_cso_inner_l3(uint64_t tx_tunnel) { @@ -489,6 +503,7 @@ sfc_ef100_tx_qpush(struct sfc_ef100_txq *txq, unsigned int added) * operations that follow it (i.e. doorbell write). */ rte_write32(dword.ed_u32[0], txq->doorbell); + txq->dp.dpq.tx_dbells++; sfc_ef100_tx_debug(txq, "TxQ pushed doorbell at pidx %u (added=%u)", EFX_DWORD_FIELD(dword, ERF_GZ_TX_RING_PIDX), @@ -524,6 +539,11 @@ sfc_ef100_tx_pkt_descs_max(const struct rte_mbuf *m) SFC_MBUF_SEG_LEN_MAX)); } + if (m->ol_flags & sfc_dp_mport_override) { + /* Tx override prefix descriptor will be used */ + extra_descs++; + } + /* * Any segment of scattered packet cannot be bigger than maximum * segment length. Make sure that subsequent segments do not need @@ -670,6 +690,12 @@ sfc_ef100_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) break; } + if (m_seg->ol_flags & sfc_dp_mport_override) { + id = added++ & txq->ptr_mask; + sfc_ef100_tx_qdesc_prefix_create(m_seg, + &txq->txq_hw_ring[id]); + } + if (m_seg->ol_flags & PKT_TX_TCP_SEG) { m_seg = sfc_ef100_xmit_tso_pkt(txq, m_seg, &added); } else { @@ -709,6 +735,9 @@ sfc_ef100_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) } dma_desc_space -= (added - pkt_start); + + sfc_pkts_bytes_add(&txq->dp.dpq.stats, 1, + rte_pktmbuf_pkt_len(*pktp)); } if (likely(added != txq->added)) { @@ -939,7 +968,8 @@ struct sfc_dp_tx sfc_ef100_tx = { .type = SFC_DP_TX, .hw_fw_caps = SFC_DP_HW_FW_CAP_EF100, }, - .features = SFC_DP_TX_FEAT_MULTI_PROCESS, + .features = SFC_DP_TX_FEAT_MULTI_PROCESS | + SFC_DP_TX_FEAT_STATS, .dev_offload_capa = 0, .queue_offload_capa = DEV_TX_OFFLOAD_VLAN_INSERT | DEV_TX_OFFLOAD_IPV4_CKSUM |