From: Wenbo Cao <caowenbo@mucse.com>
To: thomas@monjalon.net, Wenbo Cao <caowenbo@mucse.com>
Cc: stephen@networkplumber.org, dev@dpdk.org, ferruh.yigit@amd.com,
andrew.rybchenko@oktetlabs.ru, yaojun@mucse.com
Subject: [PATCH v12 25/28] net/rnp: support VLAN offloads
Date: Wed, 12 Feb 2025 23:32:45 +0800 [thread overview]
Message-ID: <1739374368-4949-26-git-send-email-caowenbo@mucse.com> (raw)
In-Reply-To: <1739374368-4949-1-git-send-email-caowenbo@mucse.com>
add support rx vlan strip,filter,tx vlan/qinq insert.
Signed-off-by: Wenbo Cao <caowenbo@mucse.com>
---
doc/guides/nics/features/rnp.ini | 2 +
doc/guides/nics/rnp.rst | 1 +
drivers/net/rnp/base/rnp_bdq_if.h | 2 +-
drivers/net/rnp/base/rnp_eth_regs.h | 5 +
drivers/net/rnp/base/rnp_hw.h | 2 +
drivers/net/rnp/base/rnp_mac.c | 53 ++++++++-
drivers/net/rnp/base/rnp_mac.h | 1 +
drivers/net/rnp/base/rnp_mac_regs.h | 41 ++++++-
drivers/net/rnp/rnp.h | 7 ++
drivers/net/rnp/rnp_ethdev.c | 176 +++++++++++++++++++++++++++-
drivers/net/rnp/rnp_rxtx.c | 22 +++-
11 files changed, 305 insertions(+), 7 deletions(-)
diff --git a/doc/guides/nics/features/rnp.ini b/doc/guides/nics/features/rnp.ini
index f6feb9aa70..c1ab91697a 100644
--- a/doc/guides/nics/features/rnp.ini
+++ b/doc/guides/nics/features/rnp.ini
@@ -20,6 +20,8 @@ Promiscuous mode = Y
Allmulticast mode = Y
MTU update = Y
Unicast MAC filter = Y
+VLAN offload = Y
+QinQ offload = P
RSS hash = Y
RSS key update = Y
RSS reta update = Y
diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index b6c160e18b..62b3b691a1 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -24,6 +24,7 @@ Features
- Packet type parsing
- Checksum offload
- TSO offload
+- VLAN stripping and VLAN/QINQ insertion
Prerequisites
-------------
diff --git a/drivers/net/rnp/base/rnp_bdq_if.h b/drivers/net/rnp/base/rnp_bdq_if.h
index 7a6d0b21ec..182a8a715d 100644
--- a/drivers/net/rnp/base/rnp_bdq_if.h
+++ b/drivers/net/rnp/base/rnp_bdq_if.h
@@ -87,7 +87,7 @@ struct rnp_tx_desc {
#define RNP_RX_TUNNEL_MASK RTE_GENMASK32(14, 13)
#define RNP_RX_PTYPE_VXLAN (0x01UL << RNP_RX_TUNNEL_TYPE_S)
#define RNP_RX_PTYPE_NVGRE (0x02UL << RNP_RX_TUNNEL_TYPE_S)
-#define RNP_RX_PTYPE_VLAN RTE_BIT32(15)
+#define RNP_RX_STRIP_VLAN RTE_BIT32(15)
/* mark_data */
#define RNP_RX_L3TYPE_VALID RTE_BIT32(31)
/* tx data cmd */
diff --git a/drivers/net/rnp/base/rnp_eth_regs.h b/drivers/net/rnp/base/rnp_eth_regs.h
index b0961a1459..802a127b1a 100644
--- a/drivers/net/rnp/base/rnp_eth_regs.h
+++ b/drivers/net/rnp/base/rnp_eth_regs.h
@@ -56,6 +56,11 @@
#define RNP_MAC_HASH_MASK RTE_GENMASK32(11, 0)
#define RNP_MAC_MULTICASE_TBL_EN RTE_BIT32(2)
#define RNP_MAC_UNICASE_TBL_EN RTE_BIT32(3)
+/* vlan strip ctrl */
+#define RNP_VLAN_Q_STRIP_CTRL(n) _ETH_(0x8040 + 0x4 * ((n) / 32))
+/* vlan filter ctrl */
+#define RNP_VLAN_FILTER_CTRL _ETH_(0x9118)
+#define RNP_VLAN_FILTER_EN RTE_BIT32(30)
/* rss function ctrl */
#define RNP_RSS_INNER_CTRL _ETH_(0x805c)
#define RNP_INNER_RSS_EN (1)
diff --git a/drivers/net/rnp/base/rnp_hw.h b/drivers/net/rnp/base/rnp_hw.h
index 2d1d9d9e66..50655a9ffa 100644
--- a/drivers/net/rnp/base/rnp_hw.h
+++ b/drivers/net/rnp/base/rnp_hw.h
@@ -74,6 +74,8 @@ struct rnp_mac_ops {
/* Receive Address Filter table */
int (*set_rafb)(struct rnp_eth_port *port, u8 *mac, u32 index);
int (*clear_rafb)(struct rnp_eth_port *port, u32 index);
+ /* receive vlan filter */
+ int (*vlan_f_en)(struct rnp_eth_port *port, bool en);
};
struct rnp_eth_adapter;
diff --git a/drivers/net/rnp/base/rnp_mac.c b/drivers/net/rnp/base/rnp_mac.c
index 01929fd574..ddf2a360ad 100644
--- a/drivers/net/rnp/base/rnp_mac.c
+++ b/drivers/net/rnp/base/rnp_mac.c
@@ -173,11 +173,53 @@ rnp_clear_mac_indep(struct rnp_eth_port *port, u32 index)
return 0;
}
+static int
+rnp_en_vlan_filter_pf(struct rnp_eth_port *port, bool en)
+{
+ struct rnp_hw *hw = port->hw;
+ u32 ctrl;
+
+ /* enable/disable all vlan filter configuration */
+ ctrl = RNP_E_REG_RD(hw, RNP_VLAN_FILTER_CTRL);
+ if (en)
+ ctrl |= RNP_VLAN_FILTER_EN;
+ else
+ ctrl &= ~RNP_VLAN_FILTER_EN;
+ RNP_E_REG_WR(hw, RNP_VLAN_FILTER_CTRL, ctrl);
+
+ return 0;
+}
+
+static int
+rnp_en_vlan_filter_indep(struct rnp_eth_port *port, bool en)
+{
+ u16 lane = port->attr.nr_lane;
+ struct rnp_hw *hw = port->hw;
+ u32 flt_reg, vlan_reg;
+
+ flt_reg = RNP_MAC_REG_RD(hw, lane, RNP_MAC_PKT_FLT_CTRL);
+ vlan_reg = RNP_MAC_REG_RD(hw, lane, RNP_MAC_VLAN_TAG);
+ if (en) {
+ flt_reg |= RNP_MAC_VTFE;
+ vlan_reg |= (RNP_MAC_VLAN_VTHM | RNP_MAC_VLAN_ETV);
+ vlan_reg |= RNP_MAC_VLAN_HASH_EN;
+ } else {
+ flt_reg &= ~RNP_MAC_VTFE;
+ vlan_reg &= ~(RNP_MAC_VLAN_VTHM | RNP_MAC_VLAN_ETV);
+ vlan_reg &= ~RNP_MAC_VLAN_HASH_EN;
+ }
+ RNP_MAC_REG_WR(hw, lane, RNP_MAC_PKT_FLT_CTRL, flt_reg);
+ RNP_MAC_REG_WR(hw, lane, RNP_MAC_VLAN_TAG, vlan_reg);
+
+ return 0;
+}
+
const struct rnp_mac_ops rnp_mac_ops_pf = {
.get_macaddr = rnp_mbx_fw_get_macaddr,
.update_mpfm = rnp_update_mpfm_pf,
.set_rafb = rnp_set_mac_addr_pf,
- .clear_rafb = rnp_clear_mac_pf
+ .clear_rafb = rnp_clear_mac_pf,
+ .vlan_f_en = rnp_en_vlan_filter_pf,
};
const struct rnp_mac_ops rnp_mac_ops_indep = {
@@ -185,6 +227,7 @@ const struct rnp_mac_ops rnp_mac_ops_indep = {
.update_mpfm = rnp_update_mpfm_indep,
.set_rafb = rnp_set_mac_addr_indep,
.clear_rafb = rnp_clear_mac_indep,
+ .vlan_f_en = rnp_en_vlan_filter_indep,
};
int rnp_get_mac_addr(struct rnp_eth_port *port, u8 *mac)
@@ -220,6 +263,14 @@ int rnp_clear_macaddr(struct rnp_eth_port *port, u32 index)
return rnp_call_hwif_impl(port, mac_ops->clear_rafb, index);
}
+int rnp_rx_vlan_filter_en(struct rnp_eth_port *port, bool en)
+{
+ const struct rnp_mac_ops *mac_ops =
+ RNP_DEV_PP_TO_MAC_OPS(port->eth_dev);
+
+ return rnp_call_hwif_impl(port, mac_ops->vlan_f_en, en);
+}
+
void rnp_mac_ops_init(struct rnp_hw *hw)
{
struct rnp_proc_priv *proc_priv = RNP_DEV_TO_PROC_PRIV(hw->back->eth_dev);
diff --git a/drivers/net/rnp/base/rnp_mac.h b/drivers/net/rnp/base/rnp_mac.h
index 865fc348df..4a5206ded3 100644
--- a/drivers/net/rnp/base/rnp_mac.h
+++ b/drivers/net/rnp/base/rnp_mac.h
@@ -28,5 +28,6 @@ int rnp_set_macaddr(struct rnp_eth_port *port, u8 *mac, u32 index);
int rnp_clear_macaddr(struct rnp_eth_port *port, u32 index);
int rnp_update_mpfm(struct rnp_eth_port *port,
u32 mode, bool en);
+int rnp_rx_vlan_filter_en(struct rnp_eth_port *port, bool en);
#endif /* _RNP_MAC_H_ */
diff --git a/drivers/net/rnp/base/rnp_mac_regs.h b/drivers/net/rnp/base/rnp_mac_regs.h
index 85308a749e..43e0aed3ff 100644
--- a/drivers/net/rnp/base/rnp_mac_regs.h
+++ b/drivers/net/rnp/base/rnp_mac_regs.h
@@ -69,8 +69,45 @@
/* Hash or Perfect Filter */
#define RNP_MAC_HPF RTE_BIT32(10)
#define RNP_MAC_VTFE RTE_BIT32(16)
-
-#define RNP_MAC_VFE RTE_BIT32(16)
+/* mac vlan ctrl reg */
+#define RNP_MAC_VLAN_TAG (0x50)
+/* En Double Vlan Processing */
+#define RNP_MAC_VLAN_EDVLP RTE_BIT32(26)
+/* VLAN Tag Hash Table Match Enable */
+#define RNP_MAC_VLAN_VTHM RTE_BIT32(25)
+/* Enable VLAN Tag in Rx status */
+#define RNP_MAC_VLAN_EVLRXS RTE_BIT32(24)
+/* Disable VLAN Type Check */
+#define RNP_MAC_VLAN_DOVLTC RTE_BIT32(20)
+/* Enable S-VLAN */
+#define RNP_MAC_VLAN_ESVL RTE_BIT32(18)
+/* Enable 12-Bit VLAN Tag Comparison Filter */
+#define RNP_MAC_VLAN_ETV RTE_BIT32(16)
+/* enable vid valid */
+#define RNP_MAC_VLAN_HASH_EN RTE_GENMASK32(15, 0)
+/* MAC VLAN CTRL INSERT REG */
+#define RNP_MAC_VLAN_INCL (0x60)
+#define RNP_MAC_INNER_VLAN_INCL (0x64)
+/* VLAN_Tag Insert From Description */
+#define RNP_MAC_VLAN_VLTI RTE_BIT32(20)
+/* C-VLAN or S-VLAN */
+#define RNP_MAC_VLAN_CSVL RTE_BIT32(19)
+#define RNP_MAC_VLAN_INSERT_CVLAN (0 << 19)
+#define RNP_MAC_VLAN_INSERT_SVLAN (1 << 19)
+/* VLAN Tag Control in Transmit Packets */
+#define RNP_MAC_VLAN_VLC RTE_GENMASK32(17, 16)
+/* VLAN Tag Control Offset Bit */
+#define RNP_MAC_VLAN_VLC_SHIFT (16)
+/* Don't Anything ON TX VLAN*/
+#define RNP_MAC_VLAN_VLC_NONE (0x0 << RNP_MAC_VLAN_VLC_SHIFT)
+/* MAC Delete VLAN */
+#define RNP_MAC_VLAN_VLC_DEL (0x1 << RNP_MAC_VLAN_VLC_SHIFT)
+/* MAC Add VLAN */
+#define RNP_MAC_VLAN_VLC_ADD (0x2 << RNP_MAC_VLAN_VLC_SHIFT)
+/* MAC Replace VLAN */
+#define RNP_MAC_VLAN_VLC_REPLACE (0x3 << RNP_MAC_VLAN_VLC_SHIFT)
+/* VLAN Tag for Transmit Packets For Insert/Remove */
+#define RNP_MAC_VLAN_VLT RTE_GENMASK32(15, 0)
/* mac link ctrl */
#define RNP_MAC_LPI_CTRL (0xd0)
/* PHY Link Status Disable */
diff --git a/drivers/net/rnp/rnp.h b/drivers/net/rnp/rnp.h
index d209014458..8a5766a797 100644
--- a/drivers/net/rnp/rnp.h
+++ b/drivers/net/rnp/rnp.h
@@ -171,6 +171,11 @@ struct rnp_hw_mac_stats {
uint64_t tx_bad_pkts;
};
+enum rnp_vlan_type {
+ RNP_CVLAN_TYPE = 0,
+ RNP_SVLAN_TYPE = 1,
+};
+
struct rnp_eth_port {
struct rnp_proc_priv *proc_priv;
struct rte_ether_addr mac_addr;
@@ -193,6 +198,8 @@ struct rnp_eth_port {
uint16_t cur_mtu;
bool jumbo_en;
+ enum rnp_vlan_type outvlan_type;
+ enum rnp_vlan_type invlan_type;
rte_spinlock_t rx_mac_lock;
bool port_stopped;
};
diff --git a/drivers/net/rnp/rnp_ethdev.c b/drivers/net/rnp/rnp_ethdev.c
index 5ba394be82..7b0139db6e 100644
--- a/drivers/net/rnp/rnp_ethdev.c
+++ b/drivers/net/rnp/rnp_ethdev.c
@@ -305,6 +305,94 @@ static int rnp_enable_all_tx_queue(struct rte_eth_dev *dev)
return ret;
}
+static void
+rnp_vlan_strip_queue_set(struct rte_eth_dev *dev, uint16_t queue,
+ int on)
+{
+ struct rnp_eth_port *port = RNP_DEV_TO_PORT(dev);
+ struct rnp_rx_queue *rxq = NULL;
+ struct rnp_hw *hw = port->hw;
+ uint16_t index;
+ uint32_t reg;
+
+ rxq = dev->data->rx_queues[queue];
+ if (rxq) {
+ index = rxq->attr.index;
+ reg = RNP_E_REG_RD(hw, RNP_VLAN_Q_STRIP_CTRL(index));
+ if (on) {
+ reg |= 1 << (index % 32);
+ rxq->rx_offloads |= RTE_ETH_RX_OFFLOAD_VLAN_STRIP;
+ } else {
+ reg &= ~(1 << (index % 32));
+ rxq->rx_offloads &= ~RTE_ETH_RX_OFFLOAD_VLAN_STRIP;
+ }
+ RNP_E_REG_WR(hw, RNP_VLAN_Q_STRIP_CTRL(index), reg);
+ }
+}
+
+static void
+rnp_vlan_strip_enable(struct rnp_eth_port *port, bool en)
+{
+ int i = 0;
+
+ for (i = 0; i < port->eth_dev->data->nb_rx_queues; i++) {
+ if (port->eth_dev->data->rx_queues[i] == NULL) {
+ RNP_PMD_ERR("Strip queue[%d] is NULL.", i);
+ continue;
+ }
+ rnp_vlan_strip_queue_set(port->eth_dev, i, en);
+ }
+}
+
+static void
+rnp_double_vlan_enable(struct rnp_eth_port *port, bool on)
+{
+ uint16_t lane = port->attr.nr_lane;
+ struct rnp_hw *hw = port->hw;
+ uint32_t ctrl;
+
+ /* En Double Vlan Engine */
+ ctrl = RNP_MAC_REG_RD(hw, lane, RNP_MAC_VLAN_TAG);
+ if (on)
+ ctrl |= RNP_MAC_VLAN_EDVLP | RNP_MAC_VLAN_ESVL;
+ else
+ ctrl &= ~(RNP_MAC_VLAN_EDVLP | RNP_MAC_VLAN_ESVL);
+ RNP_MAC_REG_WR(hw, lane, RNP_MAC_VLAN_TAG, ctrl);
+}
+
+static int
+rnp_vlan_offload_set(struct rte_eth_dev *dev, int mask)
+{
+ struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
+ struct rnp_eth_port *port = RNP_DEV_TO_PORT(dev);
+
+ if (mask & RTE_ETH_QINQ_STRIP_MASK) {
+ RNP_PMD_ERR("QinQ Strip isn't supported.");
+ return -ENOTSUP;
+ }
+ if (mask & RTE_ETH_VLAN_FILTER_MASK) {
+ if (rxmode->offloads & RTE_ETH_RX_OFFLOAD_VLAN_FILTER)
+ rnp_rx_vlan_filter_en(port, true);
+ else
+
+ rnp_rx_vlan_filter_en(port, false);
+ }
+ if (mask & RTE_ETH_VLAN_STRIP_MASK) {
+ if (rxmode->offloads & RTE_ETH_RX_OFFLOAD_VLAN_STRIP)
+ rnp_vlan_strip_enable(port, true);
+ else
+ rnp_vlan_strip_enable(port, false);
+ }
+ if (mask & RTE_ETH_VLAN_EXTEND_MASK) {
+ if (rxmode->offloads & RTE_ETH_RX_OFFLOAD_VLAN_EXTEND)
+ rnp_double_vlan_enable(port, true);
+ else
+ rnp_double_vlan_enable(port, false);
+ }
+
+ return 0;
+}
+
static int rnp_dev_start(struct rte_eth_dev *eth_dev)
{
struct rnp_eth_port *port = RNP_DEV_TO_PORT(eth_dev);
@@ -466,10 +554,82 @@ static void rnp_set_rx_cksum_offload(struct rte_eth_dev *dev)
}
}
+static void
+rnp_qinq_insert_offload_en(struct rnp_eth_port *port, bool on)
+{
+ uint16_t lane = port->attr.nr_lane;
+ struct rnp_hw *hw = port->hw;
+ uint32_t cvlan_ctrl, svlan_ctrl;
+
+ /* en double vlan engine */
+ rnp_double_vlan_enable(port, on);
+ /* setup inner vlan mode*/
+ cvlan_ctrl = RNP_MAC_REG_RD(hw, lane, RNP_MAC_INNER_VLAN_INCL);
+ if (on) {
+ cvlan_ctrl |= RNP_MAC_VLAN_VLTI;
+ cvlan_ctrl &= ~RNP_MAC_VLAN_CSVL;
+ if (port->invlan_type)
+ cvlan_ctrl |= RNP_MAC_VLAN_INSERT_SVLAN;
+ else
+ cvlan_ctrl |= RNP_MAC_VLAN_INSERT_CVLAN;
+
+ cvlan_ctrl &= ~RNP_MAC_VLAN_VLC;
+ cvlan_ctrl |= RNP_MAC_VLAN_VLC_ADD;
+ } else {
+ cvlan_ctrl = 0;
+ }
+ /* setup outer vlan mode */
+ svlan_ctrl = RNP_MAC_REG_RD(hw, lane, RNP_MAC_VLAN_INCL);
+ if (on) {
+ svlan_ctrl |= RNP_MAC_VLAN_VLTI;
+ svlan_ctrl &= ~RNP_MAC_VLAN_CSVL;
+ if (port->outvlan_type)
+ svlan_ctrl |= RNP_MAC_VLAN_INSERT_SVLAN;
+ else
+ svlan_ctrl |= RNP_MAC_VLAN_INSERT_CVLAN;
+ svlan_ctrl &= ~RNP_MAC_VLAN_VLC;
+ svlan_ctrl |= RNP_MAC_VLAN_VLC_ADD;
+ } else {
+ svlan_ctrl = 0;
+ }
+ RNP_MAC_REG_WR(hw, lane, RNP_MAC_INNER_VLAN_INCL, cvlan_ctrl);
+ RNP_MAC_REG_WR(hw, lane, RNP_MAC_VLAN_INCL, svlan_ctrl);
+}
+
+static void
+rnp_vlan_insert_offload_en(struct rnp_eth_port *port, bool on)
+{
+ uint16_t lane = port->attr.nr_lane;
+ struct rnp_hw *hw = port->hw;
+ uint32_t ctrl;
+
+ ctrl = RNP_MAC_REG_RD(hw, lane, RNP_MAC_VLAN_INCL);
+ if (on) {
+ ctrl |= RNP_MAC_VLAN_VLTI;
+ ctrl |= RNP_MAC_VLAN_INSERT_CVLAN;
+ ctrl &= ~RNP_MAC_VLAN_VLC;
+ ctrl |= RNP_MAC_VLAN_VLC_ADD;
+ } else {
+ ctrl = 0;
+ }
+ RNP_MAC_REG_WR(hw, lane, RNP_MAC_VLAN_INCL, ctrl);
+}
+
static int rnp_dev_configure(struct rte_eth_dev *eth_dev)
{
+ struct rte_eth_txmode *txmode = ð_dev->data->dev_conf.txmode;
struct rnp_eth_port *port = RNP_DEV_TO_PORT(eth_dev);
+ if (txmode->offloads & RTE_ETH_TX_OFFLOAD_QINQ_INSERT &&
+ txmode->offloads & RTE_ETH_TX_OFFLOAD_VLAN_INSERT)
+ rnp_qinq_insert_offload_en(port, true);
+ else
+ rnp_qinq_insert_offload_en(port, false);
+ if (txmode->offloads & RTE_ETH_TX_OFFLOAD_VLAN_INSERT &&
+ !(txmode->offloads & RTE_ETH_TX_OFFLOAD_QINQ_INSERT))
+ rnp_vlan_insert_offload_en(port, true);
+ if (!(txmode->offloads & RTE_ETH_TX_OFFLOAD_VLAN_INSERT))
+ rnp_vlan_insert_offload_en(port, false);
if (port->last_rx_num != eth_dev->data->nb_rx_queues)
port->rxq_num_changed = true;
else
@@ -650,8 +810,12 @@ static int rnp_dev_infos_get(struct rte_eth_dev *eth_dev,
dev_info->reta_size = RNP_RSS_INDIR_SIZE;
/* speed cap info */
dev_info->speed_capa = rnp_get_speed_caps(eth_dev);
+ /* per queue offload */
+ dev_info->rx_queue_offload_capa = RTE_ETH_RX_OFFLOAD_VLAN_STRIP;
/* rx support offload cap */
- dev_info->rx_offload_capa = RNP_RX_CHECKSUM_SUPPORT;
+ dev_info->rx_offload_capa = RNP_RX_CHECKSUM_SUPPORT |
+ RTE_ETH_RX_OFFLOAD_VLAN_EXTEND;
+ dev_info->rx_offload_capa |= dev_info->rx_queue_offload_capa;
/* tx support offload cap */
dev_info->tx_offload_capa = 0 |
RTE_ETH_TX_OFFLOAD_IPV4_CKSUM |
@@ -662,7 +826,9 @@ static int rnp_dev_infos_get(struct rte_eth_dev *eth_dev,
RTE_ETH_TX_OFFLOAD_TCP_TSO |
RTE_ETH_TX_OFFLOAD_VXLAN_TNL_TSO |
RTE_ETH_TX_OFFLOAD_GRE_TNL_TSO |
- RTE_ETH_TX_OFFLOAD_MULTI_SEGS;
+ RTE_ETH_TX_OFFLOAD_MULTI_SEGS |
+ RTE_ETH_TX_OFFLOAD_VLAN_INSERT |
+ RTE_ETH_TX_OFFLOAD_QINQ_INSERT;
/* default ring configure */
dev_info->default_rxportconf.burst_size = 32;
dev_info->default_txportconf.burst_size = 32;
@@ -1322,6 +1488,9 @@ static const struct eth_dev_ops rnp_eth_dev_ops = {
.mac_addr_set = rnp_dev_mac_addr_set,
.mac_addr_add = rnp_dev_mac_addr_add,
.mac_addr_remove = rnp_dev_mac_addr_remove,
+ /* vlan offload */
+ .vlan_offload_set = rnp_vlan_offload_set,
+ .vlan_strip_queue_set = rnp_vlan_strip_queue_set,
};
static void
@@ -1357,6 +1526,9 @@ rnp_setup_port_attr(struct rnp_eth_port *port,
attr->uc_hash_tb_size = RNP_MAX_UC_HASH_TABLE;
attr->mc_hash_tb_size = RNP_MAC_MC_HASH_TABLE;
}
+ port->outvlan_type = RNP_SVLAN_TYPE;
+ port->invlan_type = RNP_CVLAN_TYPE;
+
rnp_mbx_fw_get_lane_stat(port);
RNP_PMD_INFO("PF[%d] SW-ETH-PORT[%d]<->PHY_LANE[%d]",
diff --git a/drivers/net/rnp/rnp_rxtx.c b/drivers/net/rnp/rnp_rxtx.c
index 6068bafe71..cfc57f2f79 100644
--- a/drivers/net/rnp/rnp_rxtx.c
+++ b/drivers/net/rnp/rnp_rxtx.c
@@ -716,6 +716,7 @@ rnp_dev_rx_offload(struct rnp_rx_queue *rxq,
volatile struct rnp_rx_desc rxbd)
{
uint32_t rss = rte_le_to_cpu_32(rxbd.wb.qword0.rss_hash);
+ uint16_t vlan_tci = rxbd.wb.qword1.vlan_tci;
uint16_t cmd = rxbd.wb.qword1.cmd;
if (rxq->rx_offloads & RNP_RX_CHECKSUM_SUPPORT) {
@@ -731,6 +732,13 @@ rnp_dev_rx_offload(struct rnp_rx_queue *rxq,
m->hash.rss = rss;
m->ol_flags |= RTE_MBUF_F_RX_RSS_HASH;
}
+ if (rxq->rx_offloads & RTE_ETH_RX_OFFLOAD_VLAN_STRIP) {
+ if (vlan_tci && cmd & RNP_RX_STRIP_VLAN) {
+ m->ol_flags |= RTE_MBUF_F_RX_VLAN |
+ RTE_MBUF_F_RX_VLAN_STRIPPED;
+ m->vlan_tci = vlan_tci;
+ }
+ }
}
static __rte_always_inline void
@@ -1144,7 +1152,8 @@ rnp_need_ctrl_desc(uint64_t flags)
static uint64_t mask = RTE_MBUF_F_TX_OUTER_IP_CKSUM |
RTE_MBUF_F_TX_TCP_SEG |
RTE_MBUF_F_TX_TUNNEL_VXLAN |
- RTE_MBUF_F_TX_TUNNEL_GRE;
+ RTE_MBUF_F_TX_TUNNEL_GRE |
+ RTE_MBUF_F_TX_QINQ;
return (flags & mask) ? 1 : 0;
}
@@ -1171,6 +1180,10 @@ rnp_build_tx_control_desc(struct rnp_tx_queue *txq,
txbd->c.qword0.mss = rnp_cal_tso_seg(mbuf);
txbd->c.qword0.l4_len = mbuf->l4_len;
}
+ if (flags & RTE_MBUF_F_TX_QINQ) {
+ txbd->c.qword0.vlan_tci = mbuf->vlan_tci;
+ txbd->c.qword1.cmd |= RNP_TX_QINQ_INSERT;
+ }
#define GRE_TUNNEL_KEY (4)
#define GRE_TUNNEL_SEQ (4)
switch (flags & RTE_MBUF_F_TX_TUNNEL_MASK) {
@@ -1316,6 +1329,13 @@ rnp_setup_tx_offload(struct rnp_tx_queue *txq,
flags & RTE_MBUF_F_TX_TCP_SEG ||
flags & RTE_MBUF_F_TX_IP_CKSUM)
rnp_setup_csum_offload(tx_pkt, txbd);
+ if (flags & (RTE_MBUF_F_TX_VLAN |
+ RTE_MBUF_F_TX_QINQ)) {
+ txbd->d.cmd |= RNP_TX_VLAN_VALID;
+ txbd->d.vlan_tci = (flags & RTE_MBUF_F_TX_QINQ) ?
+ tx_pkt->vlan_tci_outer : tx_pkt->vlan_tci;
+ txbd->d.cmd |= RNP_TX_VLAN_INSERT;
+ }
}
static __rte_always_inline uint16_t
--
2.48.1
next prev parent reply other threads:[~2025-02-12 15:36 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-12 15:32 [PATCH v12 00/28] [v12]drivers/net Add Support mucse N10 Pmd Driver Wenbo Cao
2025-02-12 15:32 ` [PATCH v12 01/28] net/rnp: add skeleton Wenbo Cao
2025-02-13 18:49 ` Stephen Hemminger
2025-02-12 15:32 ` [PATCH v12 02/28] net/rnp: add ethdev probe and remove Wenbo Cao
2025-02-12 15:32 ` [PATCH v12 03/28] net/rnp: add log Wenbo Cao
2025-02-12 15:32 ` [PATCH v12 04/28] net/rnp: support mailbox basic operate Wenbo Cao
2025-02-12 15:32 ` [PATCH v12 05/28] net/rnp: add device init and uninit Wenbo Cao
2025-02-12 15:32 ` [PATCH v12 06/28] net/rnp: add get device information operation Wenbo Cao
2025-02-12 15:32 ` [PATCH v12 07/28] net/rnp: add support MAC promisc mode Wenbo Cao
2025-02-12 15:32 ` [PATCH v12 08/28] net/rnp: add queue setup and release operations Wenbo Cao
2025-02-12 15:32 ` [PATCH v12 09/28] net/rnp: add queue stop and start operations Wenbo Cao
2025-02-12 15:32 ` [PATCH v12 10/28] net/rnp: add support device start stop operations Wenbo Cao
2025-02-12 15:32 ` [PATCH v12 11/28] net/rnp: add RSS support operations Wenbo Cao
2025-02-12 15:32 ` [PATCH v12 12/28] net/rnp: add support link update operations Wenbo Cao
2025-02-12 15:32 ` [PATCH v12 13/28] net/rnp: add support link setup operations Wenbo Cao
2025-02-12 15:32 ` [PATCH v12 14/28] net/rnp: add Rx burst simple support Wenbo Cao
2025-02-12 15:32 ` [PATCH v12 15/28] net/rnp: add Tx " Wenbo Cao
2025-02-12 15:32 ` [PATCH v12 16/28] net/rnp: add MTU set operation Wenbo Cao
2025-02-12 15:32 ` [PATCH v12 17/28] net/rnp: add Rx scatter segment version Wenbo Cao
2025-02-12 15:32 ` [PATCH v12 18/28] net/rnp: add Tx multiple " Wenbo Cao
2025-02-12 15:32 ` [PATCH v12 19/28] net/rnp: add support basic stats operation Wenbo Cao
2025-02-12 15:32 ` [PATCH v12 20/28] net/rnp: add support xstats operation Wenbo Cao
2025-02-12 15:32 ` [PATCH v12 21/28] net/rnp: add unicast MAC filter operation Wenbo Cao
2025-02-12 15:32 ` [PATCH v12 22/28] net/rnp: add supported packet types Wenbo Cao
2025-02-12 15:32 ` [PATCH v12 23/28] net/rnp: add support Rx checksum offload Wenbo Cao
2025-02-12 15:32 ` [PATCH v12 24/28] net/rnp: add support Tx TSO offload Wenbo Cao
2025-02-12 15:32 ` Wenbo Cao [this message]
2025-02-12 15:32 ` [PATCH v12 26/28] net/rnp: add support VLAN filters operations Wenbo Cao
2025-02-12 15:32 ` [PATCH v12 27/28] net/rnp: add queue info operation Wenbo Cao
2025-02-12 15:32 ` [PATCH v12 28/28] net/rnp: support Rx/Tx burst mode info Wenbo Cao
2025-02-13 18:28 ` [PATCH v12 00/28] [v12]drivers/net Add Support mucse N10 Pmd Driver Stephen Hemminger
2025-02-15 0:43 ` Stephen Hemminger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1739374368-4949-26-git-send-email-caowenbo@mucse.com \
--to=caowenbo@mucse.com \
--cc=andrew.rybchenko@oktetlabs.ru \
--cc=dev@dpdk.org \
--cc=ferruh.yigit@amd.com \
--cc=stephen@networkplumber.org \
--cc=thomas@monjalon.net \
--cc=yaojun@mucse.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.