From: Peng Zhang <peng.zh...@corigine.com>

The firmware support VLAN insert with the descriptor or the metadata.
So adding a NFP_NET_CFG_CTRL_RXVLAN_V2 bit to distinguish them. When
VLAN insert is set, sending the vlan information with the descriptor.
When VLAN insert V2 is set, sending it with the metadata.

Now NFP_NET_CFG_CTRL_L2SWITCH_LOCAL isn't used, so 0x1 << 23 is used
by NFP_NET_CFG_CTRL_RXVLAN_V2.

Signed-off-by: Peng Zhang <peng.zh...@corigine.com>
Reviewed-by: Chaoyong He <chaoyong...@corigine.com>
Reviewed-by: Niklas Söderlund <niklas.soderl...@corigine.com>
---
 drivers/net/nfp/nfp_common.c |  9 ++++++---
 drivers/net/nfp/nfp_ctrl.h   |  2 +-
 drivers/net/nfp/nfp_rxtx.c   | 30 +++++++++++++++++++++++++++++-
 3 files changed, 36 insertions(+), 5 deletions(-)

diff --git a/drivers/net/nfp/nfp_common.c b/drivers/net/nfp/nfp_common.c
index 9c740ee9b5..853eb4a3f7 100644
--- a/drivers/net/nfp/nfp_common.c
+++ b/drivers/net/nfp/nfp_common.c
@@ -195,7 +195,7 @@ nfp_net_log_device_information(const struct nfp_net_hw *hw)
                        NFD_CFG_MAJOR_VERSION_of(hw->ver),
                        NFD_CFG_MINOR_VERSION_of(hw->ver), hw->max_mtu);
 
-       PMD_INIT_LOG(INFO, "CAP: %#x, %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", 
hw->cap,
+       PMD_INIT_LOG(INFO, "CAP: %#x, %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", 
hw->cap,
                        hw->cap & NFP_NET_CFG_CTRL_PROMISC   ? "PROMISC "   : 
"",
                        hw->cap & NFP_NET_CFG_CTRL_L2BC      ? "L2BCFILT "  : 
"",
                        hw->cap & NFP_NET_CFG_CTRL_L2MC      ? "L2MCFILT "  : 
"",
@@ -204,6 +204,7 @@ nfp_net_log_device_information(const struct nfp_net_hw *hw)
                        hw->cap & NFP_NET_CFG_CTRL_RXVLAN    ? "RXVLAN "    : 
"",
                        hw->cap & NFP_NET_CFG_CTRL_TXVLAN    ? "TXVLAN "    : 
"",
                        hw->cap & NFP_NET_CFG_CTRL_RXVLAN_V2 ? "RXVLANv2 "  : 
"",
+                       hw->cap & NFP_NET_CFG_CTRL_TXVLAN_V2 ? "TXVLANv2 "  : 
"",
                        hw->cap & NFP_NET_CFG_CTRL_RXQINQ    ? "RXQINQ "    : 
"",
                        hw->cap & NFP_NET_CFG_CTRL_SCATTER   ? "SCATTER "   : 
"",
                        hw->cap & NFP_NET_CFG_CTRL_GATHER    ? "GATHER "    : 
"",
@@ -418,7 +419,9 @@ nfp_check_offloads(struct rte_eth_dev *dev)
        hw->mtu = dev->data->mtu;
 
        if (txmode->offloads & RTE_ETH_TX_OFFLOAD_VLAN_INSERT) {
-               if (hw->cap & NFP_NET_CFG_CTRL_TXVLAN)
+               if (hw->cap & NFP_NET_CFG_CTRL_TXVLAN_V2)
+                       ctrl |= NFP_NET_CFG_CTRL_TXVLAN_V2;
+               else if (hw->cap & NFP_NET_CFG_CTRL_TXVLAN)
                        ctrl |= NFP_NET_CFG_CTRL_TXVLAN;
        }
 
@@ -775,7 +778,7 @@ nfp_net_infos_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
                                             RTE_ETH_RX_OFFLOAD_UDP_CKSUM |
                                             RTE_ETH_RX_OFFLOAD_TCP_CKSUM;
 
-       if (hw->cap & NFP_NET_CFG_CTRL_TXVLAN)
+       if (hw->cap & (NFP_NET_CFG_CTRL_TXVLAN | NFP_NET_CFG_CTRL_TXVLAN_V2))
                dev_info->tx_offload_capa = RTE_ETH_TX_OFFLOAD_VLAN_INSERT;
 
        if (hw->cap & NFP_NET_CFG_CTRL_TXCSUM)
diff --git a/drivers/net/nfp/nfp_ctrl.h b/drivers/net/nfp/nfp_ctrl.h
index bffdd8345e..6e2601d174 100644
--- a/drivers/net/nfp/nfp_ctrl.h
+++ b/drivers/net/nfp/nfp_ctrl.h
@@ -103,7 +103,7 @@
 #define   NFP_NET_CFG_CTRL_MSIXAUTO       (0x1 << 20) /* MSI-X auto-masking */
 #define   NFP_NET_CFG_CTRL_TXRWB          (0x1 << 21) /* Write-back of TX 
ring*/
 #define   NFP_NET_CFG_CTRL_L2SWITCH       (0x1 << 22) /* L2 Switch */
-#define   NFP_NET_CFG_CTRL_L2SWITCH_LOCAL (0x1 << 23) /* Switch to local */
+#define   NFP_NET_CFG_CTRL_TXVLAN_V2      (0x1 << 23) /* Enable VLAN insert 
with metadata */
 #define   NFP_NET_CFG_CTRL_VXLAN          (0x1 << 24) /* Enable VXLAN */
 #define   NFP_NET_CFG_CTRL_NVGRE          (0x1 << 25) /* Enable NVGRE */
 #define   NFP_NET_CFG_CTRL_MSIX_TX_OFF    (0x1 << 26) /* Disable MSIX for TX */
diff --git a/drivers/net/nfp/nfp_rxtx.c b/drivers/net/nfp/nfp_rxtx.c
index 200886111e..293769f240 100644
--- a/drivers/net/nfp/nfp_rxtx.c
+++ b/drivers/net/nfp/nfp_rxtx.c
@@ -833,6 +833,33 @@ nfp_net_nfd3_tx_queue_setup(struct rte_eth_dev *dev, 
uint16_t queue_idx,
        return 0;
 }
 
+/*
+ * nfp_net_nfd3_tx_vlan() - Set vlan info in the nfd3 tx desc
+ *
+ * If enable NFP_NET_CFG_CTRL_TXVLAN_V2
+ *     Vlan_info is stored in the meta and
+ *     is handled in the nfp_net_nfd3_set_meta_vlan
+ * else if enable NFP_NET_CFG_CTRL_TXVLAN
+ *     Vlan_info is stored in the tx_desc and
+ *     is handled in the nfp_net_nfd3_tx_vlan
+ */
+static void
+nfp_net_nfd3_tx_vlan(struct nfp_net_txq *txq,
+               struct nfp_net_nfd3_tx_desc *txd,
+               struct rte_mbuf *mb)
+{
+       struct nfp_net_hw *hw = txq->hw;
+
+       if ((hw->cap & NFP_NET_CFG_CTRL_TXVLAN_V2) != 0 ||
+               (hw->cap & NFP_NET_CFG_CTRL_TXVLAN) == 0)
+               return;
+
+       if ((mb->ol_flags & RTE_MBUF_F_TX_VLAN) != 0) {
+               txd->flags |= PCIE_DESC_TX_VLAN;
+               txd->vlan = mb->vlan_tci;
+       }
+}
+
 static void
 nfp_net_set_meta_vlan(struct nfp_net_meta_raw *meta_data,
                struct rte_mbuf *pkt,
@@ -861,7 +888,7 @@ nfp_net_nfd3_set_meta_data(struct nfp_net_meta_raw 
*meta_data,
        hw = txq->hw;
 
        if ((pkt->ol_flags & RTE_MBUF_F_TX_VLAN) != 0 &&
-                       (hw->ctrl & NFP_NET_CFG_CTRL_TXVLAN) != 0) {
+                       (hw->ctrl & NFP_NET_CFG_CTRL_TXVLAN_V2) != 0) {
                if (meta_data->length == 0)
                        meta_data->length = NFP_NET_META_HEADER_SIZE;
                meta_data->length += NFP_NET_META_FIELD_SIZE;
@@ -960,6 +987,7 @@ nfp_net_nfd3_xmit_pkts(void *tx_queue, struct rte_mbuf 
**tx_pkts, uint16_t nb_pk
                txd.data_len = pkt->pkt_len;
                nfp_net_nfd3_tx_tso(txq, &txd, pkt);
                nfp_net_nfd3_tx_cksum(txq, &txd, pkt);
+               nfp_net_nfd3_tx_vlan(txq, &txd, pkt);
 
                /*
                 * mbuf data_len is the data in one segment and pkt_len data
-- 
2.29.3

Reply via email to