Incorrect link speed for DPDK Bond in Balance RR Mode

2025-02-25 Thread Aman Thakur
Dear Sir/ma'am,

I've created a DPDK bond with two slave interfaces, each capable of 1Gbps
(mtu 1500 and both Full duplex). I'm using bonding mode 0 (balance RR -
round-robin). Theoretically, this should give me a 2Gbps link. However, the
bond interface only reports a speed of 1Gbps, and I've noticed that one of
the slave interfaces is never active. Here's a breakdown of my setup and
the issue:

Here's a breakdown of my setup and the issue:

   - *DPDK Version:* 21.11.9
   - *Bonding Mode:* 0 (balance RR)
   - *Number of Slaves:* 2
   - *Slave Speed:* 1Gbps each, same MTU and each operating at full duplex.
   - *Expected Bond Speed:* 2Gbps
   - *Observed Bond Speed:* 1Gbps
   - *Problem:* One slave interface remains inactive. Both slaves were
   active *before* calling rte_eth_dev_start(BOND_PORT).
   - *Lcore Usage:* Currently using 1 lcore. Tried with 2 and 3 lcores, but
   the problem remains.
   - Output of *rte_eth_bond_active_slaves_get *gives 1 implying only 1
   slave is active at a time.

I'm following the DPDK bonding example (specifically the port
initialization) found here:
https://doc.dpdk.org/api-17.08/examples_2bond_2main_8c-example.html, ( for
reference only I've used sample from 21.11.9 only )

*My Questions:*

   1. What could be causing one of the slaves to become inactive after
   rte_eth_dev_start(BOND_PORT)?
   2. Is there a specific configuration or step I might be missing that's
   preventing the bond from utilizing both slaves in round-robin mode?
   3. How can I troubleshoot this issue to determine why the second slave
   is not participating in the bond? Are there specific DPDK tools or logs I
   should be examining?
   4. Are there any known compatibility issues or limitations with balance
   RR mode that could explain this behavior?
   5. Could the number of lcores be related to this issue, even though I've
   tried multiple values? Is there a minimum or recommended number of lcores
   for bond mode 0 with 2 slaves?

Thanks and Regards

Aman Thakur


Bug report for dpdk-stable-22.11.2

2025-02-25 Thread Pawel Nicinski
Hello there,



I hope you’re having a great day.



Using the 
github.com/Ericsson/codechecker tool, 
we conducted a static analysis of your software. We detected some potentially 
critical vulnerabilities related to different areas.



Please check the attached csv file and make corrections.



Best regards,

Ericsson Team


file-path,line,message,
dpdk-stable-22.11.2/lib/eal/linux/eal_memalloc.c,1643,Array is indexed with a negative value. Possible integer overflow,
dpdk-stable-22.11.2/lib/eal/linux/eal_memalloc.c,1711,Array is indexed with a negative value. Possible integer overflow,
dpdk-stable-22.11.2/lib/acl/acl_bld.c,908,Array is indexed with a negative value. Possible integer overflow,
dpdk-stable-22.11.2/lib/acl/acl_bld.c,908,Out of bound access to memory preceding the field 'value',
dpdk-stable-22.11.2/lib/eal/common/eal_common_interrupts.c,341,Array is indexed with a negative value. Possible integer overflow,
dpdk-stable-22.11.2/lib/eal/common/eal_common_interrupts.c,377,Array is indexed with a negative value. Possible integer overflow,
dpdk-stable-22.11.2/lib/eal/common/eal_common_interrupts.c,341,Array is indexed with a negative value. Possible integer overflow,
dpdk-stable-22.11.2/lib/eal/common/eal_common_interrupts.c,377,Array is indexed with a negative value. Possible integer overflow,
dpdk-stable-22.11.2/lib/cfgfile/rte_cfgfile.c,195,Access out-of-bound array element (buffer overflow),
dpdk-stable-22.11.2/drivers/net/enetc/enetc_ethdev.c,174,Access out-of-bound array element (buffer overflow),
dpdk-stable-22.11.2/drivers/net/enetc/enetc_ethdev.c,180,Access out-of-bound array element (buffer overflow),
dpdk-stable-22.11.2/lib/eal/common/eal_common_string_fns.c,76,Access out-of-bound array element (buffer overflow),
dpdk-stable-22.11.2/app/test/test_security.c,1528,Address of stack memory associated with local variable 'm' is still referred to by the global variable 'mock_set_pkt_metadata_exp' upon returning to the caller.  This will be a dangling reference,
dpdk-stable-22.11.2/app/test/test_security.c,1528,Address of stack memory associated with local variable 'params' is still referred to by the global variable 'mock_set_pkt_metadata_exp' upon returning to the caller.  This will be a dangling reference,
dpdk-stable-22.11.2/lib/mempool/rte_mempool.c,750,suspicious usage of 'sizeof(sizeof(...))',
dpdk-stable-22.11.2/lib/graph/graph_populate.c,31,suspicious usage of 'sizeof(K)'; did you mean 'K'?,
dpdk-stable-22.11.2/drivers/common/sfc_efx/base/efx_mcdi.c,3553,suspicious usage of 'sizeof(K)'; did you mean 'K'?,
dpdk-stable-22.11.2/drivers/net/hinic/hinic_pmd_flow.c,2022,"argument with implicit conversion from 'bool' to 'u8' (aka 'unsigned char') followed by argument converted from 'int' to 'bool', potentially swapped arguments.",
dpdk-stable-22.11.2/drivers/net/hinic/hinic_pmd_flow.c,2133,"argument with implicit conversion from 'bool' to 'u8' (aka 'unsigned char') followed by argument converted from 'int' to 'bool', potentially swapped arguments.",
dpdk-stable-22.11.2/drivers/net/hinic/hinic_pmd_flow.c,2322,"argument with implicit conversion from 'bool' to 'u8' (aka 'unsigned char') followed by argument converted from 'int' to 'bool', potentially swapped arguments.",
dpdk-stable-22.11.2/drivers/net/hinic/hinic_pmd_flow.c,2360,"argument with implicit conversion from 'bool' to 'u8' (aka 'unsigned char') followed by argument converted from 'int' to 'bool', potentially swapped arguments.",
dpdk-stable-22.11.2/drivers/net/netvsc/hn_rndis.c,332,suspicious usage of 'sizeof(sizeof(...))',
dpdk-stable-22.11.2/app/test-fib/main.c,339,loop induction expression should not have floating-point type,
dpdk-stable-22.11.2/app/test-fib/main.c,379,loop induction expression should not have floating-point type,
dpdk-stable-22.11.2/app/test-sad/main.c,244,loop induction expression should not have floating-point type,
dpdk-stable-22.11.2/lib/cfgfile/rte_cfgfile.c,195,Access out-of-bound array element (buffer overflow),
dpdk-stable-22.11.2/drivers/event/dlb2/dlb2.c,4460,"argument with implicit conversion from 'bool' to 'uint8_t' (aka 'unsigned char') followed by argument converted from 'int' to 'bool', potentially swapped arguments.",
dpdk-stable-22.11.2/drivers/crypto/qat/qat_crypto.c,115,Out of bound access to memory after the end of the field 'qps_in_use',
dpdk-stable-22.11.2/drivers/net/bonding/rte_eth_bond_pmd.c,1099,Array is indexed with a negative value. Possible integer overflow,
dpdk-stable-22.11.2/app/test-pmd/parameters.c,1411,Null pointer passed to 1st parameter expecting 'nonnull',
dpdk-stable-22.11.2/app/test/test_cryptodev_asym.c,294,Null pointer passed to 1st parameter expecting 'nonnull',
dpdk-stable-22.11.2/app/test/test_pmd_perf.c,795,Array is indexed with a negative value. Possible integer overflow,
dpdk-stable-22.11.2/app/test/test_pmd_perf.c,795,Out of bound access to memory preceding 'mbufpool',
dpdk-stable-22.11.2/app/test/test_eal_flags.c,583,"suspi

[PATCH v14 00/28] [v14]drivers/net Add Support mucse N10 Pmd Driver

2025-02-25 Thread Wenbo Cao
For This patchset just to support the basic chip init work
and user can just found the eth_dev, but can't control more.
For Now just support 2*10g nic,the chip can support
2*10g,4*10g,4*1g,8*1g,8*10g.
The Feature rx side can support rx-cksum-offload,rss,vlan-filter
flow_clow,uncast_filter,mcast_filter,1588,Jumbo-frame
The Feature tx side can support tx-cksum-offload,tso,vxlan-tso 
flow director base on ntuple pattern of tcp/udp/ip/ eth_hdr->type
for sriov is also support.

Because of the chip design defect, for multiple-port mode
one pci-bdf will have multiple-port (max can have four ports)
so this code must be care of one bdf init multiple-port.

v14:
  * add multicast mac filter feature for basic nic feature.
  * fixed pvs studio low,media,high level warning as the below cmd
pvs-studio-analyzer analyze -f build/compile_commands.json -j 8
plog-converter -a GA:1,2,3 -t fullhtml PVS-Studio.log -o /root/report

v13:
  * Supplementary document about n10 network card characteristics.
  * update release_25_03.rst.
  * fixed the code style advisea Stephen Hemminger.
  * fixed the code issue check PVS-stdio for Static compilation error.

v12:
  * fixed __rte_packed __deprecated__ compile issue.

v11:
  * fixed array-bounds issue when used rte_memcpy src addr is
  * not enough to hold align dst.
  * improve efficient_code advised by Stephen

v10:
  * fixed mingw windows meson issue
  * rnp not support windows for now.

v9:
  * fixed commit log format check by devtools.
  * fixed code compile issue.

v8:
  * fixed codespell issue.
  * fixed MAINTAINERS file

v7:
  * add support nic basic feature such as rss vlan strip/filter,
  * mtu-change recv/send scater-recv/mutltiple-send.
  * fixed code rationality, advised by Ferruh Yigit.
v6:
  * fixed the doc(rst) format problem advise by Thomas Monjalon

v5:
  * fixed the symbol name require by the style documentation

v4:
  * one patch has been forgot to upload :(

v3:
  * fixed http://dpdk.org/patch/129830 FreeBSD 13 compile Issue
  * change iobar type to void suggest by Stephen Hemminger
  * add KMOD_DEP support for vfio-pci
  * change run-cmd argument parse check for invalid extra_args

v2:
  * fixed MAINTAIN maillist fullname format
  * fixed driver/net/meson the order issue of new driver to driver list
  * improve virtual point function usage suggest by Stephen Hemminger

Wenbo Cao (29):
  net/rnp: add skeleton
  net/rnp: add ethdev probe and remove
  net/rnp: add log
  net/rnp: support mailbox basic operate
  net/rnp: add device init and uninit
  net/rnp: add get device information operation
  net/rnp: add support MAC promisc mode
  net/rnp: add queue setup and release operations
  net/rnp: add queue stop and start operations
  net/rnp: add support device start stop operations
  net/rnp: add RSS support operations
  net/rnp: add support link update operations
  net/rnp: add support link setup operations
  net/rnp: add Rx burst simple support
  net/rnp: add Tx burst simple support
  net/rnp: add MTU set operation
  net/rnp: add Rx scatter segment version
  net/rnp: add Tx multiple segment version
  net/rnp: add support basic stats operation
  net/rnp: add support xstats operation
  net/rnp: add unicast MAC filter operation
  net/rnp: add supported packet types
  net/rnp: add support Rx checksum offload
  net/rnp: add support Tx TSO offload
  net/rnp: support VLAN offloads
  net/rnp: add support VLAN filters operations
  net/rnp: add queue info operation
  net/rnp: support Rx/Tx burst mode info
  net/rnp: add multicast MAC filter operation

 .mailmap   |1 +
 MAINTAINERS|6 +
 doc/guides/nics/features/rnp.ini   |   34 +
 doc/guides/nics/img/mucse_nic_port.svg | 4023 
 doc/guides/nics/index.rst  |1 +
 doc/guides/nics/rnp.rst|  125 +
 doc/guides/rel_notes/release_25_03.rst |5 +
 drivers/net/meson.build|1 +
 drivers/net/rnp/base/meson.build   |   18 +
 drivers/net/rnp/base/rnp_bdq_if.c  |  398 +++
 drivers/net/rnp/base/rnp_bdq_if.h  |  154 +
 drivers/net/rnp/base/rnp_bitrev.h  |   64 +
 drivers/net/rnp/base/rnp_common.c  |  103 +
 drivers/net/rnp/base/rnp_common.h  |   17 +
 drivers/net/rnp/base/rnp_crc32.c   |   53 +
 drivers/net/rnp/base/rnp_crc32.h   |   11 +
 drivers/net/rnp/base/rnp_dma_regs.h|   68 +
 drivers/net/rnp/base/rnp_eth_regs.h|   94 +
 drivers/net/rnp/base/rnp_fw_cmd.c  |  162 +
 drivers/net/rnp/base/rnp_fw_cmd.h  |  357 +++
 drivers/net/rnp/base/rnp_hw.h  |  141 +
 drivers/net/rnp/base/rnp_mac.c |  480 +++
 drivers/net/rnp/base/rnp_mac.h |   36 +
 drivers/net/rnp/base/rnp_mac_regs.h|  210 ++
 drivers/net/rnp/base/rnp_mbx.c |  507 +++
 drivers/net/rnp/base/rnp_mbx.h |   59 +
 drivers/net/rnp/base/rnp_mbx_fw.c  |  495 +++
 drivers/net/rnp/base/rnp_mbx_fw.h  |   24 +
 drivers/net/rnp/base/rnp_osdep.h   

[PATCH v15 05/29] net/rnp: add device init and uninit

2025-02-25 Thread Wenbo Cao
add firmware communic method and basic device
init, uninit and close resource function.

Signed-off-by: Wenbo Cao 
Reviewed-by: Ferruh Yigit 
Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/rnp.rst |  10 +
 drivers/net/rnp/base/meson.build|   4 +
 drivers/net/rnp/base/rnp_common.c   |  73 ++
 drivers/net/rnp/base/rnp_common.h   |  12 +
 drivers/net/rnp/base/rnp_dma_regs.h |  13 ++
 drivers/net/rnp/base/rnp_eth_regs.h |  15 ++
 drivers/net/rnp/base/rnp_fw_cmd.c   |  75 +++
 drivers/net/rnp/base/rnp_fw_cmd.h   | 216 ++
 drivers/net/rnp/base/rnp_hw.h   |  39 
 drivers/net/rnp/base/rnp_mac.c  |  28 +++
 drivers/net/rnp/base/rnp_mac.h  |  14 ++
 drivers/net/rnp/base/rnp_mbx_fw.c   | 337 
 drivers/net/rnp/base/rnp_mbx_fw.h   |  18 ++
 drivers/net/rnp/base/rnp_osdep.h|  91 
 drivers/net/rnp/meson.build |   1 +
 drivers/net/rnp/rnp.h   |  44 
 drivers/net/rnp/rnp_ethdev.c| 321 +-
 17 files changed, 1302 insertions(+), 9 deletions(-)
 create mode 100644 drivers/net/rnp/base/rnp_common.c
 create mode 100644 drivers/net/rnp/base/rnp_common.h
 create mode 100644 drivers/net/rnp/base/rnp_dma_regs.h
 create mode 100644 drivers/net/rnp/base/rnp_eth_regs.h
 create mode 100644 drivers/net/rnp/base/rnp_fw_cmd.c
 create mode 100644 drivers/net/rnp/base/rnp_fw_cmd.h
 create mode 100644 drivers/net/rnp/base/rnp_mac.c
 create mode 100644 drivers/net/rnp/base/rnp_mac.h
 create mode 100644 drivers/net/rnp/base/rnp_mbx_fw.c
 create mode 100644 drivers/net/rnp/base/rnp_mbx_fw.h

diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index cca249be78..1f860e3f18 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -54,3 +54,13 @@ Limitations or Known issues
 ---
 
 X86-32, BSD, Armv7, RISC-V, Windows, are not supported yet.
+
+Supported APIs
+--
+
+rte_eth APIs
+
+
+Listed below are the rte_eth functions supported:
+* ``rte_eth_dev_close``
+* ``rte_eth_dev_stop``
diff --git a/drivers/net/rnp/base/meson.build b/drivers/net/rnp/base/meson.build
index 22e7d0ee4b..10026e0425 100644
--- a/drivers/net/rnp/base/meson.build
+++ b/drivers/net/rnp/base/meson.build
@@ -3,6 +3,10 @@
 
 sources = [
 'rnp_mbx.c',
+'rnp_fw_cmd.c',
+'rnp_mbx_fw.c',
+'rnp_common.c',
+'rnp_mac.c',
 ]
 
 c_args = cflags
diff --git a/drivers/net/rnp/base/rnp_common.c 
b/drivers/net/rnp/base/rnp_common.c
new file mode 100644
index 00..5cd4ec133e
--- /dev/null
+++ b/drivers/net/rnp/base/rnp_common.c
@@ -0,0 +1,73 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2023 Mucse IC Design Ltd.
+ */
+
+#include "rnp_osdep.h"
+#include "rnp_hw.h"
+#include "rnp_eth_regs.h"
+#include "rnp_dma_regs.h"
+#include "rnp_common.h"
+#include "rnp_mbx_fw.h"
+#include "rnp_mac.h"
+#include "../rnp.h"
+
+static void
+rnp_hw_reset(struct rnp_hw *hw)
+{
+   PMD_INIT_FUNC_TRACE();
+
+   RNP_E_REG_WR(hw, RNP_NIC_RESET, 0);
+   /* hardware reset valid must be 0 -> 1 */
+   wmb();
+   RNP_E_REG_WR(hw, RNP_NIC_RESET, 1);
+   RNP_PMD_DRV_LOG(INFO, "PF[%d] reset nic finish", hw->mbx.pf_num);
+}
+
+int rnp_init_hw(struct rnp_hw *hw)
+{
+   struct rnp_eth_port *port = RNP_DEV_TO_PORT(hw->back->eth_dev);
+   u32 version = 0;
+   int ret = -1;
+   u32 state;
+
+   PMD_INIT_FUNC_TRACE();
+   version = RNP_E_REG_RD(hw, RNP_DMA_VERSION);
+   RNP_PMD_DRV_LOG(INFO, "nic hw version:0x%.2x", version);
+   rnp_fw_init(hw);
+   RNP_E_REG_WR(hw, RNP_DMA_HW_EN, FALSE);
+   do {
+   state = RNP_E_REG_RD(hw, RNP_DMA_HW_STATE);
+   } while (state == 0);
+   ret = rnp_mbx_fw_get_capability(port);
+   if (ret) {
+   RNP_PMD_ERR("mbx_get_capability error! errcode=%d", ret);
+   return ret;
+   }
+   rnp_hw_reset(hw);
+   rnp_mbx_fw_reset_phy(hw);
+   /* rx packet protocol engine bypass */
+   RNP_E_REG_WR(hw, RNP_E_ENG_BYPASS, FALSE);
+   /* enable host filter */
+   RNP_E_REG_WR(hw, RNP_E_FILTER_EN, TRUE);
+   /* enable vxlan parse */
+   RNP_E_REG_WR(hw, RNP_E_VXLAN_PARSE_EN, TRUE);
+   /* enable flow direct engine */
+   RNP_E_REG_WR(hw, RNP_E_REDIR_EN, TRUE);
+   /* enable dma engine */
+   RNP_E_REG_WR(hw, RNP_DMA_HW_EN, RNP_DMA_EN_ALL);
+#define RNP_TARGET_TC_PORT (2)
+#define RNP_PORT_OFF_QUEUE_NUM (2)
+   if (hw->nic_mode == RNP_DUAL_10G && hw->max_port_num == 2)
+   RNP_E_REG_WR(hw, RNP_TC_PORT_OFFSET(RNP_TARGET_TC_PORT),
+   RNP_PORT_OFF_QUEUE_NUM);
+
+   return 0;
+}
+
+int
+rnp_setup_common_ops(struct rnp_hw *hw)
+{
+   rnp_mac_ops_init(hw);
+
+   return 0;
+}
diff --git a/drivers/net/rnp/base/rnp_common.h 
b/drivers/net/rnp/base/rnp_common.h
new file mode 100644
index 00..aaf77a6dad
-

[PATCH v15 02/29] net/rnp: add ethdev probe and remove

2025-02-25 Thread Wenbo Cao
Add basic PCIe ethdev probe and remove.

Signed-off-by: Wenbo Cao 
Reviewed-by: Stephen Hemminger 
---
 doc/guides/nics/rnp.rst  | 17 ++
 drivers/net/rnp/rnp.h| 16 +
 drivers/net/rnp/rnp_ethdev.c | 66 
 3 files changed, 99 insertions(+)
 create mode 100644 drivers/net/rnp/rnp.h

diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index b76c60349c..cca249be78 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -14,6 +14,23 @@ Supported Chipsets and NICs
 
 - MUCSE Ethernet Controller N10 Series for 10GbE or 40GbE (Dual-port)
 
+Support of Ethernet Network Controllers
+~~~
+
+PCIE NICS
+^
+
+* ``N10G-X2-DC  Dual-port 10 Gigabit SFP Ethernet Adapter``
+* ``N10G-X4-QC  Quad-port 10 Gigabit SFP Ethernet Adapter``
+* ``N10G-X8-DC  Octa-port 10 Gigabit SFP Ethernet Adapter``
+
+OCP 3.0 NICs
+
+
+* ``N10G-X2-DCP  Dual-port 10 Gigabit SFP Ethernet Adapter``
+* ``N10G-X4-DCP  Dual-port 10 Gigabit SFP Ethernet Adapter``
+* ``N10G-X8-DCP  Dual-port 10 Gigabit SFP Ethernet Adapter``
+
 Chip Basic Overview
 ---
 N10 has two functions, each function support muiple ports(1 to 8),which not 
same as normal pcie network card(one pf for each port).
diff --git a/drivers/net/rnp/rnp.h b/drivers/net/rnp/rnp.h
new file mode 100644
index 00..4413a03d9d
--- /dev/null
+++ b/drivers/net/rnp/rnp.h
@@ -0,0 +1,16 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2023 Mucse IC Design Ltd.
+ */
+
+#ifndef __RNP_H__
+#define __RNP_H__
+
+#define PCI_VENDOR_ID_MUCSE(0x8848)
+#define RNP_DEV_ID_N10G_X2 (0x1000)
+#define RNP_DEV_ID_N10G_X4 (0x1020)
+#define RNP_DEV_ID_N10G_X8 (0x1060)
+
+struct rnp_eth_port {
+};
+
+#endif /* __RNP_H__ */
diff --git a/drivers/net/rnp/rnp_ethdev.c b/drivers/net/rnp/rnp_ethdev.c
index 9ce3c0b497..e2eb80ba69 100644
--- a/drivers/net/rnp/rnp_ethdev.c
+++ b/drivers/net/rnp/rnp_ethdev.c
@@ -1,3 +1,69 @@
 /* SPDX-License-Identifier: BSD-3-Clause
  * Copyright(C) 2023 Mucse IC Design Ltd.
  */
+
+#include 
+#include 
+
+#include "rnp.h"
+
+static int
+rnp_eth_dev_init(struct rte_eth_dev *eth_dev)
+{
+   RTE_SET_USED(eth_dev);
+
+   return -ENODEV;
+}
+
+static int
+rnp_eth_dev_uninit(struct rte_eth_dev *eth_dev)
+{
+   RTE_SET_USED(eth_dev);
+
+   return -ENODEV;
+}
+
+static int
+rnp_pci_remove(struct rte_pci_device *pci_dev)
+{
+   struct rte_eth_dev *eth_dev;
+
+   eth_dev = rte_eth_dev_allocated(pci_dev->device.name);
+
+   if (eth_dev)
+   /* Cleanup eth dev */
+   return rte_eth_dev_pci_generic_remove(pci_dev,
+   rnp_eth_dev_uninit);
+   return -ENODEV;
+}
+
+static int
+rnp_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
+{
+   int rc;
+
+   RTE_SET_USED(pci_drv);
+
+   rc = rte_eth_dev_pci_generic_probe(pci_dev, sizeof(struct rnp_eth_port),
+   rnp_eth_dev_init);
+
+   return rc;
+}
+
+static const struct rte_pci_id pci_id_rnp_map[] = {
+   { RTE_PCI_DEVICE(PCI_VENDOR_ID_MUCSE, RNP_DEV_ID_N10G_X2) },
+   { RTE_PCI_DEVICE(PCI_VENDOR_ID_MUCSE, RNP_DEV_ID_N10G_X4) },
+   { RTE_PCI_DEVICE(PCI_VENDOR_ID_MUCSE, RNP_DEV_ID_N10G_X8) },
+   { .vendor_id = 0, },
+};
+
+static struct rte_pci_driver rte_rnp_pmd = {
+   .id_table = pci_id_rnp_map,
+   .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC,
+   .probe = rnp_pci_probe,
+   .remove = rnp_pci_remove,
+};
+
+RTE_PMD_REGISTER_PCI(net_rnp, rte_rnp_pmd);
+RTE_PMD_REGISTER_PCI_TABLE(net_rnp, pci_id_rnp_map);
+RTE_PMD_REGISTER_KMOD_DEP(net_rnp, "igb_uio | uio_pci_generic | vfio-pci");
-- 
2.25.1



[PATCH v15 04/29] net/rnp: support mailbox basic operate

2025-02-25 Thread Wenbo Cao
This patch adds support for mailbox of rnp PMD driver,
mailbox is used for communication between pf with fw
and vf driver.

Signed-off-by: Wenbo Cao 
Reviewed-by: Stephen Hemminger 
---
 drivers/net/rnp/base/meson.build |  12 +
 drivers/net/rnp/base/rnp_hw.h|  77 +
 drivers/net/rnp/base/rnp_mbx.c   | 507 +++
 drivers/net/rnp/base/rnp_mbx.h   |  59 
 drivers/net/rnp/base/rnp_osdep.h |  55 
 drivers/net/rnp/meson.build  |   5 +
 drivers/net/rnp/rnp.h|  19 ++
 7 files changed, 734 insertions(+)
 create mode 100644 drivers/net/rnp/base/meson.build
 create mode 100644 drivers/net/rnp/base/rnp_hw.h
 create mode 100644 drivers/net/rnp/base/rnp_mbx.c
 create mode 100644 drivers/net/rnp/base/rnp_mbx.h
 create mode 100644 drivers/net/rnp/base/rnp_osdep.h

diff --git a/drivers/net/rnp/base/meson.build b/drivers/net/rnp/base/meson.build
new file mode 100644
index 00..22e7d0ee4b
--- /dev/null
+++ b/drivers/net/rnp/base/meson.build
@@ -0,0 +1,12 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(C) 2023 Mucse IC Design Ltd.
+
+sources = [
+'rnp_mbx.c',
+]
+
+c_args = cflags
+base_lib = static_library('rnp_base', sources,
+dependencies: [static_rte_eal, static_rte_net, static_rte_ethdev],
+c_args: c_args)
+base_objs = base_lib.extract_all_objects(recursive: true)
diff --git a/drivers/net/rnp/base/rnp_hw.h b/drivers/net/rnp/base/rnp_hw.h
new file mode 100644
index 00..326b850560
--- /dev/null
+++ b/drivers/net/rnp/base/rnp_hw.h
@@ -0,0 +1,77 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2023 Mucse IC Design Ltd.
+ */
+
+#ifndef _RNP_HW_H_
+#define _RNP_HW_H_
+
+#include "rnp_osdep.h"
+
+struct rnp_hw;
+/* Mailbox Operate Info */
+enum RNP_MBX_ID {
+   RNP_MBX_PF = 0,
+   RNP_MBX_VF,
+   RNP_MBX_FW = 64,
+};
+
+struct rnp_mbx_ops {
+   int (*read)(struct rnp_hw *hw,
+   u32 *msg,
+   u16 size,
+   enum RNP_MBX_ID);
+   int (*write)(struct rnp_hw *hw,
+   u32 *msg,
+   u16 size,
+   enum RNP_MBX_ID);
+   int (*read_posted)(struct rnp_hw *hw,
+   u32 *msg,
+   u16 size,
+   enum RNP_MBX_ID);
+   int (*write_posted)(struct rnp_hw *hw,
+   u32 *msg,
+   u16 size,
+   enum RNP_MBX_ID);
+   int (*check_for_msg)(struct rnp_hw *hw, enum RNP_MBX_ID);
+   int (*check_for_ack)(struct rnp_hw *hw, enum RNP_MBX_ID);
+   int (*check_for_rst)(struct rnp_hw *hw, enum RNP_MBX_ID);
+};
+
+struct rnp_mbx_sync {
+   u16 req;
+   u16 ack;
+};
+
+struct rnp_mbx_info {
+   const struct rnp_mbx_ops *ops;
+   u32 usec_delay; /* retry interval delay time */
+   u32 timeout;/* retry ops timeout limit */
+   u16 size;   /* data buffer size*/
+   u16 vf_num; /* Virtual Function num */
+   u16 pf_num; /* Physical Function num */
+   u16 sriov_st;   /* Sriov state */
+   u16 en_vfs; /* user enabled vf num */
+   bool is_pf;
+
+   struct rnp_mbx_sync syncs[RNP_MBX_FW + 1];
+};
+
+struct rnp_eth_adapter;
+
+/* hw device description */
+struct rnp_hw {
+   struct rnp_eth_adapter *back;   /* backup to the adapter handle */
+   void __iomem *e_ctrl;   /* ethernet control bar */
+   void __iomem *c_ctrl;   /* crypto control bar */
+   u32 c_blen; /* crypto bar size */
+
+   /* pci device info */
+   u16 device_id;
+   u16 vendor_id;
+   u16 max_vfs;/* device max support vf */
+
+   u16 pf_vf_num;
+   struct rnp_mbx_info mbx;
+};
+
+#endif /* _RNP_HW_H_ */
diff --git a/drivers/net/rnp/base/rnp_mbx.c b/drivers/net/rnp/base/rnp_mbx.c
new file mode 100644
index 00..09d490cc54
--- /dev/null
+++ b/drivers/net/rnp/base/rnp_mbx.c
@@ -0,0 +1,507 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2023 Mucse IC Design Ltd.
+ */
+
+#include 
+
+#include "rnp_hw.h"
+#include "rnp_mbx.h"
+#include "../rnp.h"
+
+/PF MBX OPS/
+static inline u16
+rnp_mbx_get_req(struct rnp_hw *hw, enum RNP_MBX_ID mbx_id)
+{
+   u32 reg = 0;
+
+   if (mbx_id == RNP_MBX_FW)
+   reg = RNP_FW2PF_SYNC;
+   else
+   reg = RNP_VF2PF_SYNC(mbx_id);
+   mb();
+
+   return RNP_E_REG_RD(hw, reg) & RNP_MBX_SYNC_REQ_MASK;
+}
+
+static inline u16
+rnp_mbx_get_ack(struct rnp_hw *hw, enum RNP_MBX_ID mbx_id)
+{
+   u32 reg = 0;
+   u32 v = 0;
+
+   if (mbx_id == RNP_MBX_FW)
+   reg = RNP_FW2PF_SYNC;
+   else
+   reg = RNP_VF2PF_SYNC(mbx_id);
+   mb();
+   v = RNP_E_REG_RD(hw, reg);
+
+   return (v & RNP_MBX_SYNC_ACK_MASK) >> RNP_MBX_

[PATCH v15 03/29] net/rnp: add log

2025-02-25 Thread Wenbo Cao
add log function for trace or debug

Signed-off-by: Wenbo Cao 
---
 drivers/net/rnp/rnp_ethdev.c |  2 ++
 drivers/net/rnp/rnp_logs.h   | 36 
 2 files changed, 38 insertions(+)
 create mode 100644 drivers/net/rnp/rnp_logs.h

diff --git a/drivers/net/rnp/rnp_ethdev.c b/drivers/net/rnp/rnp_ethdev.c
index e2eb80ba69..7fe93edcf6 100644
--- a/drivers/net/rnp/rnp_ethdev.c
+++ b/drivers/net/rnp/rnp_ethdev.c
@@ -64,6 +64,8 @@ static struct rte_pci_driver rte_rnp_pmd = {
.remove = rnp_pci_remove,
 };
 
+RTE_LOG_REGISTER_SUFFIX(rnp_init_logtype, init, NOTICE);
+
 RTE_PMD_REGISTER_PCI(net_rnp, rte_rnp_pmd);
 RTE_PMD_REGISTER_PCI_TABLE(net_rnp, pci_id_rnp_map);
 RTE_PMD_REGISTER_KMOD_DEP(net_rnp, "igb_uio | uio_pci_generic | vfio-pci");
diff --git a/drivers/net/rnp/rnp_logs.h b/drivers/net/rnp/rnp_logs.h
new file mode 100644
index 00..c68a5c1028
--- /dev/null
+++ b/drivers/net/rnp/rnp_logs.h
@@ -0,0 +1,36 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2023 Mucse IC Design Ltd.
+ */
+
+#ifndef __RNP_LOGS_H__
+#define __RNP_LOGS_H__
+
+#include 
+
+extern int rnp_init_logtype;
+#define RTE_LOGTYPE_RNP_INIT rnp_init_logtype
+#define RNP_PMD_INIT_LOG(level, ...) \
+   RTE_LOG_LINE_PREFIX(level, RNP_INIT, "%s(): ", __func__,  __VA_ARGS__)
+#define PMD_INIT_FUNC_TRACE() RNP_PMD_INIT_LOG(DEBUG, " >>")
+#define RNP_PMD_DRV_LOG(level, ...) \
+   RTE_LOG_LINE_PREFIX(level, RNP_INIT, \
+   "%s(): ", __func__, __VA_ARGS__)
+#define RNP_PMD_LOG(level, ...) \
+   RTE_LOG_LINE_PREFIX(level, RNP_INIT, \
+   "rnp_net: (%d) ", __LINE__, __VA_ARGS__)
+#define RNP_PMD_ERR(fmt, ...) \
+   RNP_PMD_LOG(ERR, fmt, ## __VA_ARGS__)
+#define RNP_PMD_WARN(fmt, ...) \
+   RNP_PMD_LOG(WARNING, fmt, ## __VA_ARGS__)
+#define RNP_PMD_INFO(fmt, ...) \
+   RNP_PMD_LOG(INFO, fmt, ## __VA_ARGS__)
+
+#ifdef RTE_LIBRTE_RNP_REG_DEBUG
+#define RNP_PMD_REG_LOG(level, ...) \
+   RTE_LOG_LINE_PREFIX(level, RNP_INIT, \
+   "%s(): ", __func__, __VA_ARGS__)
+#else
+#define RNP_PMD_REG_LOG(...) do { } while (0)
+#endif
+
+#endif /* __RNP_LOGS_H__ */
-- 
2.25.1



[PATCH v15 06/29] net/rnp: add get device information operation

2025-02-25 Thread Wenbo Cao
add get device hardware capability function

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/features/rnp.ini  |   1 +
 doc/guides/nics/rnp.rst   |   1 +
 drivers/net/rnp/base/rnp_fw_cmd.c |  20 ++
 drivers/net/rnp/base/rnp_fw_cmd.h |  80 +
 drivers/net/rnp/base/rnp_mbx_fw.c |  55 ++
 drivers/net/rnp/base/rnp_mbx_fw.h |   1 +
 drivers/net/rnp/rnp.h |  73 ++-
 drivers/net/rnp/rnp_ethdev.c  | 115 +-
 8 files changed, 344 insertions(+), 2 deletions(-)

diff --git a/doc/guides/nics/features/rnp.ini b/doc/guides/nics/features/rnp.ini
index 2ad04ee330..6766130a68 100644
--- a/doc/guides/nics/features/rnp.ini
+++ b/doc/guides/nics/features/rnp.ini
@@ -4,5 +4,6 @@
 ; Refer to default.ini for the full list of available PMD features.
 ;
 [Features]
+Speed capabilities   = Y
 Linux= Y
 x86-64   = Y
diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index 1f860e3f18..ace3aeaa93 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -64,3 +64,4 @@ rte_eth APIs
 Listed below are the rte_eth functions supported:
 * ``rte_eth_dev_close``
 * ``rte_eth_dev_stop``
+* ``rte_eth_dev_infos_get``
diff --git a/drivers/net/rnp/base/rnp_fw_cmd.c 
b/drivers/net/rnp/base/rnp_fw_cmd.c
index 676c5a2521..3891249499 100644
--- a/drivers/net/rnp/base/rnp_fw_cmd.c
+++ b/drivers/net/rnp/base/rnp_fw_cmd.c
@@ -51,6 +51,23 @@ rnp_build_get_macaddress_req(struct rnp_mbx_fw_cmd_req *req,
arg->pfvf_num = req_arg->param1;
 }
 
+static inline void
+rnp_build_get_lane_status_req(struct rnp_mbx_fw_cmd_req *req,
+ struct rnp_fw_req_arg *req_arg,
+ void *cookie)
+{
+   struct rnp_get_lane_st_req *arg = (struct rnp_get_lane_st_req 
*)req->data;
+
+   req->flags = 0;
+   req->opcode = RNP_GET_LANE_STATUS;
+   req->datalen = sizeof(*arg);
+   req->cookie = cookie;
+   req->reply_lo = 0;
+   req->reply_hi = 0;
+
+   arg->nr_lane = req_arg->param0;
+}
+
 int rnp_build_fwcmd_req(struct rnp_mbx_fw_cmd_req *req,
struct rnp_fw_req_arg *arg,
void *cookie)
@@ -67,6 +84,9 @@ int rnp_build_fwcmd_req(struct rnp_mbx_fw_cmd_req *req,
case RNP_GET_MAC_ADDRESS:
rnp_build_get_macaddress_req(req, arg, cookie);
break;
+   case RNP_GET_LANE_STATUS:
+   rnp_build_get_lane_status_req(req, arg, cookie);
+   break;
default:
err = -EOPNOTSUPP;
}
diff --git a/drivers/net/rnp/base/rnp_fw_cmd.h 
b/drivers/net/rnp/base/rnp_fw_cmd.h
index 87f0823dba..5f60ac6187 100644
--- a/drivers/net/rnp/base/rnp_fw_cmd.h
+++ b/drivers/net/rnp/base/rnp_fw_cmd.h
@@ -129,6 +129,80 @@ struct rnp_mac_addr_rep {
u32 pcode;
 };
 
+#define RNP_SPEED_CAP_UNKNOWN(0)
+#define RNP_SPEED_CAP_10M_FULL   RTE_BIT32(2)
+#define RNP_SPEED_CAP_100M_FULL  RTE_BIT32(3)
+#define RNP_SPEED_CAP_1GB_FULL   RTE_BIT32(4)
+#define RNP_SPEED_CAP_10GB_FULL  RTE_BIT32(5)
+#define RNP_SPEED_CAP_40GB_FULL  RTE_BIT32(6)
+#define RNP_SPEED_CAP_25GB_FULL  RTE_BIT32(7)
+#define RNP_SPEED_CAP_50GB_FULL  RTE_BIT32(8)
+#define RNP_SPEED_CAP_100GB_FULL RTE_BIT32(9)
+#define RNP_SPEED_CAP_10M_HALF   RTE_BIT32(10)
+#define RNP_SPEED_CAP_100M_HALF  RTE_BIT32(11)
+#define RNP_SPEED_CAP_1GB_HALF   RTE_BIT32(12)
+
+enum rnp_pma_phy_type {
+   RNP_PHY_TYPE_NONE = 0,
+   RNP_PHY_TYPE_1G_BASE_KX,
+   RNP_PHY_TYPE_SGMII,
+   RNP_PHY_TYPE_10G_BASE_KR,
+   RNP_PHY_TYPE_25G_BASE_KR,
+   RNP_PHY_TYPE_40G_BASE_KR4,
+   RNP_PHY_TYPE_10G_BASE_SR,
+   RNP_PHY_TYPE_40G_BASE_SR4,
+   RNP_PHY_TYPE_40G_BASE_CR4,
+   RNP_PHY_TYPE_40G_BASE_LR4,
+   RNP_PHY_TYPE_10G_BASE_LR,
+   RNP_PHY_TYPE_10G_BASE_ER,
+   RNP_PHY_TYPE_10G_TP,
+};
+
+struct rnp_lane_stat_rep {
+   u8 nr_lane; /* 0-3 cur port correspond with hw lane */
+   u8 pci_gen  : 4; /* nic cur pci speed genX: 1,2,3 */
+   u8 pci_lanes: 4; /* nic cur pci x1 x2 x4 x8 x16 */
+   u8 pma_type;
+   u8 phy_type;/* interface media type */
+
+   u16 linkup  : 1; /* cur port link state */
+   u16 duplex  : 1; /* duplex state only RJ45 valid */
+   u16 autoneg : 1; /* autoneg state */
+   u16 fec : 1; /* fec state */
+   u16 rev_an  : 1;
+   u16 link_traing : 1; /* link-traing state */
+   u16 media_available : 1;
+   u16 is_sgmii: 1; /* 1: Twisted Pair 0: FIBRE */
+   u16 link_fault  : 4;
+#define RNP_LINK_LINK_FAULTRTE_BIT32(0)
+#define RNP_LINK_TX_FAULT  RTE_BIT32(1)
+#define RNP_LINK_RX_FAULT  RTE_BIT32(2)
+#define RNP_LINK_REMOTE_FAULT  RTE_BIT32(3)
+   u16 is_backplane: 1;   /* Backplane Mode */
+   u16 is_speed_10G_1G_auto_swit

[PATCH v15 09/29] net/rnp: add queue stop and start operations

2025-02-25 Thread Wenbo Cao
support rx/tx queue stop/start,for rx queue stop
need to reset a queue,must stop all rx queue
during reset this queue.

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/features/rnp.ini  |   1 +
 doc/guides/nics/rnp.rst   |   4 +
 drivers/net/rnp/base/rnp_common.c |   3 +
 drivers/net/rnp/rnp_rxtx.c| 167 ++
 drivers/net/rnp/rnp_rxtx.h|   9 ++
 5 files changed, 184 insertions(+)

diff --git a/doc/guides/nics/features/rnp.ini b/doc/guides/nics/features/rnp.ini
index 65f1ed3da0..fd7d4b9d8d 100644
--- a/doc/guides/nics/features/rnp.ini
+++ b/doc/guides/nics/features/rnp.ini
@@ -5,6 +5,7 @@
 ;
 [Features]
 Speed capabilities   = Y
+Queue start/stop = Y
 Promiscuous mode = Y
 Allmulticast mode= Y
 Linux= Y
diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index 99b96e9b8e..c3547c38b6 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -71,6 +71,10 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_dev_close``
 * ``rte_eth_dev_stop``
 * ``rte_eth_dev_infos_get``
+* ``rte_eth_dev_rx_queue_start``
+* ``rte_eth_dev_rx_queue_stop``
+* ``rte_eth_dev_tx_queue_start``
+* ``rte_eth_dev_tx_queue_stop``
 * ``rte_eth_promiscuous_disable``
 * ``rte_eth_promiscuous_enable``
 * ``rte_eth_allmulticast_enable``
diff --git a/drivers/net/rnp/base/rnp_common.c 
b/drivers/net/rnp/base/rnp_common.c
index 5655126ae0..58de3bde03 100644
--- a/drivers/net/rnp/base/rnp_common.c
+++ b/drivers/net/rnp/base/rnp_common.c
@@ -65,6 +65,9 @@ int rnp_init_hw(struct rnp_hw *hw)
/* setup mac resiger ctrl base */
for (idx = 0; idx < hw->max_port_num; idx++)
hw->mac_base[idx] = (u8 *)hw->e_ctrl + RNP_MAC_BASE_OFFSET(idx);
+   /* tx all hw queue must be started */
+   for (idx = 0; idx < RNP_MAX_RX_QUEUE_NUM; idx++)
+   RNP_E_REG_WR(hw, RNP_TXQ_START(idx), true);
 
return 0;
 }
diff --git a/drivers/net/rnp/rnp_rxtx.c b/drivers/net/rnp/rnp_rxtx.c
index d370948d6b..e65bc06d36 100644
--- a/drivers/net/rnp/rnp_rxtx.c
+++ b/drivers/net/rnp/rnp_rxtx.c
@@ -86,6 +86,7 @@ rnp_rx_queue_reset(struct rnp_eth_port *port,
struct rte_eth_txconf def_conf;
struct rnp_hw *hw = port->hw;
struct rte_mbuf *m_mbuf[2];
+   bool tx_origin_e = false;
bool tx_new = false;
uint16_t index;
int err = 0;
@@ -121,6 +122,9 @@ rnp_rx_queue_reset(struct rnp_eth_port *port,
return -ENOMEM;
}
rnp_rxq_flow_disable(hw, index);
+   tx_origin_e = txq->txq_started;
+   rte_io_wmb();
+   txq->txq_started = false;
rte_mbuf_refcnt_set(m_mbuf[0], 1);
rte_mbuf_refcnt_set(m_mbuf[1], 1);
m_mbuf[0]->data_off = RTE_PKTMBUF_HEADROOM;
@@ -139,6 +143,7 @@ rnp_rx_queue_reset(struct rnp_eth_port *port,
rnp_tx_queue_reset(port, txq);
rnp_tx_queue_sw_reset(txq);
}
+   txq->txq_started = tx_origin_e;
}
rte_mempool_put_bulk(adapter->reset_pool, (void **)m_mbuf, 2);
rnp_rxq_flow_enable(hw, index);
@@ -367,6 +372,7 @@ rnp_tx_queue_sw_reset(struct rnp_tx_queue *txq)
txq->nb_tx_free = txq->attr.nb_desc - 1;
txq->tx_next_dd = txq->tx_rs_thresh - 1;
txq->tx_next_rs = txq->tx_rs_thresh - 1;
+   txq->tx_tail = 0;
 
size = (txq->attr.nb_desc + RNP_TX_MAX_BURST_SIZE);
for (idx = 0; idx < size * sizeof(struct rnp_tx_desc); idx++)
@@ -469,3 +475,164 @@ rnp_tx_queue_setup(struct rte_eth_dev *dev,
 
return err;
 }
+
+int rnp_tx_queue_stop(struct rte_eth_dev *eth_dev, uint16_t qidx)
+{
+   struct rnp_eth_port *port = RNP_DEV_TO_PORT(eth_dev);
+   struct rte_eth_dev_data *data = eth_dev->data;
+   struct rnp_tx_queue *txq;
+
+   PMD_INIT_FUNC_TRACE();
+   txq = eth_dev->data->tx_queues[qidx];
+   if (!txq) {
+   RNP_PMD_ERR("TX queue %u is null or not setup", qidx);
+   return -EINVAL;
+   }
+   if (data->tx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STARTED) {
+   txq->txq_started = 0;
+   /* wait for tx burst process stop traffic */
+   rte_delay_us(10);
+   rnp_tx_queue_release_mbuf(txq);
+   rnp_tx_queue_reset(port, txq);
+   rnp_tx_queue_sw_reset(txq);
+   data->tx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STOPPED;
+   }
+
+   return 0;
+}
+
+int rnp_tx_queue_start(struct rte_eth_dev *eth_dev, uint16_t qidx)
+{
+   struct rte_eth_dev_data *data = eth_dev->data;
+   struct rnp_tx_queue *txq;
+
+   PMD_INIT_FUNC_TRACE();
+
+   txq = data->tx_queues[qidx];
+   if (!txq) {
+   RNP_PMD_ERR("Can't start tx queue %d it's not setup by "
+   "tx_queue_setup API", qidx);
+   return -EINVAL;
+   }
+   if (data->tx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STOPPED) 

[PATCH v15 13/29] net/rnp: add support link setup operations

2025-02-25 Thread Wenbo Cao
add set link_down/link_up implement

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/rnp.rst |  2 +
 drivers/net/rnp/base/rnp_eth_regs.h |  3 +
 drivers/net/rnp/base/rnp_fw_cmd.c   | 22 +++
 drivers/net/rnp/base/rnp_fw_cmd.h   |  6 ++
 drivers/net/rnp/base/rnp_mbx_fw.c   | 33 ++
 drivers/net/rnp/base/rnp_mbx_fw.h   |  1 +
 drivers/net/rnp/rnp_ethdev.c| 10 ++-
 drivers/net/rnp/rnp_link.c  | 97 +
 drivers/net/rnp/rnp_link.h  |  2 +
 9 files changed, 175 insertions(+), 1 deletion(-)

diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index e6a1aadefc..f5a79492bb 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -85,6 +85,8 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_dev_rss_hash_update``
 * ``rte_eth_dev_rss_reta_query``
 * ``rte_eth_dev_rss_reta_update``
+* ``rte_eth_dev_set_link_down``
+* ``rte_eth_dev_set_link_up``
 * ``rte_eth_promiscuous_disable``
 * ``rte_eth_promiscuous_enable``
 * ``rte_eth_allmulticast_enable``
diff --git a/drivers/net/rnp/base/rnp_eth_regs.h 
b/drivers/net/rnp/base/rnp_eth_regs.h
index be7ed5b886..c74886e70c 100644
--- a/drivers/net/rnp/base/rnp_eth_regs.h
+++ b/drivers/net/rnp/base/rnp_eth_regs.h
@@ -5,6 +5,9 @@
 #ifndef _RNP_ETH_REGS_H
 #define _RNP_ETH_REGS_H
 
+#define RNP_ETH_TX_FIFO_STATE  _ETH_(0x0330)
+#define RNP_ETH_TX_FIFO_EMPT(lane) ((1 << (lane)) | (1 << ((lane) + 4)))
+
 #define RNP_E_ENG_BYPASS   _ETH_(0x8000)
 #define RNP_E_VXLAN_PARSE_EN   _ETH_(0x8004)
 #define RNP_E_FILTER_EN_ETH_(0x801c)
diff --git a/drivers/net/rnp/base/rnp_fw_cmd.c 
b/drivers/net/rnp/base/rnp_fw_cmd.c
index a4a2171868..ed0eddfd1f 100644
--- a/drivers/net/rnp/base/rnp_fw_cmd.c
+++ b/drivers/net/rnp/base/rnp_fw_cmd.c
@@ -107,6 +107,25 @@ rnp_build_lane_evet_mask(struct rnp_mbx_fw_cmd_req *req,
arg->event_en = req_arg->param2;
 }
 
+static void
+rnp_build_ifup_down(struct rnp_mbx_fw_cmd_req *req,
+   struct rnp_fw_req_arg *req_arg,
+   void *cookie)
+{
+   struct rnp_ifup_down_req *arg =
+   (struct rnp_ifup_down_req *)req->data;
+
+   req->flags = 0;
+   req->opcode = RNP_IFUP_DOWN;
+   req->datalen = sizeof(*arg);
+   req->cookie = cookie;
+   req->reply_lo = 0;
+   req->reply_hi = 0;
+
+   arg->nr_lane = req_arg->param0;
+   arg->up = req_arg->param1;
+}
+
 int rnp_build_fwcmd_req(struct rnp_mbx_fw_cmd_req *req,
struct rnp_fw_req_arg *arg,
void *cookie)
@@ -132,6 +151,9 @@ int rnp_build_fwcmd_req(struct rnp_mbx_fw_cmd_req *req,
case RNP_SET_LANE_EVENT_EN:
rnp_build_lane_evet_mask(req, arg, cookie);
break;
+   case RNP_IFUP_DOWN:
+   rnp_build_ifup_down(req, arg, cookie);
+   break;
default:
err = -EOPNOTSUPP;
}
diff --git a/drivers/net/rnp/base/rnp_fw_cmd.h 
b/drivers/net/rnp/base/rnp_fw_cmd.h
index 6c6fd1803e..26db07ad36 100644
--- a/drivers/net/rnp/base/rnp_fw_cmd.h
+++ b/drivers/net/rnp/base/rnp_fw_cmd.h
@@ -309,6 +309,12 @@ struct rnp_link_stat_req {
struct rnp_port_stat states[RNP_MAX_PORT_OF_PF];
 };
 
+struct rnp_ifup_down_req {
+   u32 nr_lane;
+   u32 up;
+   u8 rsvd[24];
+};
+
 struct rnp_mbx_fw_cmd_req {
u16 flags;
u16 opcode;
diff --git a/drivers/net/rnp/base/rnp_mbx_fw.c 
b/drivers/net/rnp/base/rnp_mbx_fw.c
index c7e3b6819d..3e7cf7f9ad 100644
--- a/drivers/net/rnp/base/rnp_mbx_fw.c
+++ b/drivers/net/rnp/base/rnp_mbx_fw.c
@@ -460,3 +460,36 @@ rnp_rcv_msg_from_fw(struct rnp_eth_adapter *adapter, u32 
*msgbuf)
 
return 0;
 }
+
+static void rnp_link_stat_reset(struct rnp_hw *hw, u16 lane)
+{
+   u32 state;
+
+   spin_lock(&hw->link_sync);
+   state = RNP_E_REG_RD(hw, RNP_FW_LINK_SYNC);
+   state &= ~RNP_LINK_MAGIC_MASK;
+   state |= RNP_LINK_MAGIC_CODE;
+   state &= ~RTE_BIT32(lane);
+
+   RNP_E_REG_WR(hw, RNP_FW_LINK_SYNC, state);
+   rte_spinlock_unlock(&hw->link_sync);
+}
+
+int rnp_mbx_fw_ifup_down(struct rnp_eth_port *port, bool up)
+{
+   u16 nr_lane = port->attr.nr_lane;
+   struct rnp_hw *hw = port->hw;
+   struct rnp_fw_req_arg arg;
+   int err;
+
+   memset(&arg, 0, sizeof(arg));
+   arg.opcode = RNP_IFUP_DOWN;
+   arg.param0 = nr_lane;
+   arg.param1 = up;
+
+   err = rnp_fw_send_norep_cmd(port, &arg);
+   /* force firmware send irq event to dpdk */
+   if (!err && up)
+   rnp_link_stat_reset(hw, nr_lane);
+   return err;
+}
diff --git a/drivers/net/rnp/base/rnp_mbx_fw.h 
b/drivers/net/rnp/base/rnp_mbx_fw.h
index 159a0237be..397d2ec8c4 100644
--- a/drivers/net/rnp/base/rnp_mbx_fw.h
+++ b/drivers/net/rnp/base/rnp_mbx_fw.h
@@ -19,5 +19,6 @@ int rnp_fw_init(struct rnp_hw *hw);
 int rnp_rcv_msg_from_fw(struct rnp_eth_adapter *adapter, u32 *msgbuf);
 int rn

[PATCH v15 07/29] net/rnp: add support MAC promisc mode

2025-02-25 Thread Wenbo Cao
add support two method of MAC unicast promisc
mulcast promisc broadcast promisc mode

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/features/rnp.ini|   2 +
 doc/guides/nics/rnp.rst |  11 +++
 drivers/net/rnp/base/rnp_common.c   |   5 ++
 drivers/net/rnp/base/rnp_eth_regs.h |  15 
 drivers/net/rnp/base/rnp_hw.h   |  11 ++-
 drivers/net/rnp/base/rnp_mac.c  | 107 +++-
 drivers/net/rnp/base/rnp_mac.h  |   2 +
 drivers/net/rnp/base/rnp_mac_regs.h |  39 ++
 drivers/net/rnp/base/rnp_osdep.h|   5 ++
 drivers/net/rnp/rnp_ethdev.c|  43 +++
 10 files changed, 238 insertions(+), 2 deletions(-)
 create mode 100644 drivers/net/rnp/base/rnp_mac_regs.h

diff --git a/doc/guides/nics/features/rnp.ini b/doc/guides/nics/features/rnp.ini
index 6766130a68..65f1ed3da0 100644
--- a/doc/guides/nics/features/rnp.ini
+++ b/doc/guides/nics/features/rnp.ini
@@ -5,5 +5,7 @@
 ;
 [Features]
 Speed capabilities   = Y
+Promiscuous mode = Y
+Allmulticast mode= Y
 Linux= Y
 x86-64   = Y
diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index ace3aeaa93..5f6e22f287 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -41,6 +41,11 @@ N10 has two functions, each function support muiple ports(1 
to 8),which not same
 
rnp mucse nic port.
 
+Features
+
+
+- Promiscuous mode
+
 Prerequisites and Pre-conditions
 
 - Prepare the system as recommended by DPDK suite.
@@ -65,3 +70,9 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_dev_close``
 * ``rte_eth_dev_stop``
 * ``rte_eth_dev_infos_get``
+* ``rte_eth_promiscuous_disable``
+* ``rte_eth_promiscuous_enable``
+* ``rte_eth_allmulticast_enable``
+* ``rte_eth_allmulticast_disable``
+* ``rte_eth_promiscuous_get``
+* ``rte_eth_allmulticast_get``
diff --git a/drivers/net/rnp/base/rnp_common.c 
b/drivers/net/rnp/base/rnp_common.c
index 5cd4ec133e..5655126ae0 100644
--- a/drivers/net/rnp/base/rnp_common.c
+++ b/drivers/net/rnp/base/rnp_common.c
@@ -4,6 +4,7 @@
 
 #include "rnp_osdep.h"
 #include "rnp_hw.h"
+#include "rnp_mac_regs.h"
 #include "rnp_eth_regs.h"
 #include "rnp_dma_regs.h"
 #include "rnp_common.h"
@@ -28,6 +29,7 @@ int rnp_init_hw(struct rnp_hw *hw)
struct rnp_eth_port *port = RNP_DEV_TO_PORT(hw->back->eth_dev);
u32 version = 0;
int ret = -1;
+   u32 idx = 0;
u32 state;
 
PMD_INIT_FUNC_TRACE();
@@ -60,6 +62,9 @@ int rnp_init_hw(struct rnp_hw *hw)
if (hw->nic_mode == RNP_DUAL_10G && hw->max_port_num == 2)
RNP_E_REG_WR(hw, RNP_TC_PORT_OFFSET(RNP_TARGET_TC_PORT),
RNP_PORT_OFF_QUEUE_NUM);
+   /* setup mac resiger ctrl base */
+   for (idx = 0; idx < hw->max_port_num; idx++)
+   hw->mac_base[idx] = (u8 *)hw->e_ctrl + RNP_MAC_BASE_OFFSET(idx);
 
return 0;
 }
diff --git a/drivers/net/rnp/base/rnp_eth_regs.h 
b/drivers/net/rnp/base/rnp_eth_regs.h
index 6957866d76..c4519ba1e5 100644
--- a/drivers/net/rnp/base/rnp_eth_regs.h
+++ b/drivers/net/rnp/base/rnp_eth_regs.h
@@ -10,6 +10,21 @@
 #define RNP_E_FILTER_EN_ETH_(0x801c)
 #define RNP_E_REDIR_EN _ETH_(0x8030)
 
+/* Mac Host Filter  */
+#define RNP_MAC_FCTRL  _ETH_(0x9110)
+#define RNP_MAC_FCTRL_MPE  RTE_BIT32(8)  /* Multicast Promiscuous En */
+#define RNP_MAC_FCTRL_UPE  RTE_BIT32(9)  /* Unicast Promiscuous En */
+#define RNP_MAC_FCTRL_BAM  RTE_BIT32(10) /* Broadcast Accept Mode */
+#define RNP_MAC_FCTRL_BYPASS   (\
+   RNP_MAC_FCTRL_MPE | \
+   RNP_MAC_FCTRL_UPE | \
+   RNP_MAC_FCTRL_BAM)
+/* Mucast unicast mac hash filter ctrl */
+#define RNP_MAC_MCSTCTRL   _ETH_(0x9114)
+#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)
+
 #define RNP_TC_PORT_OFFSET(lane)   _ETH_(0xe840 + 0x04 * (lane))
 
 #endif /* _RNP_ETH_REGS_H */
diff --git a/drivers/net/rnp/base/rnp_hw.h b/drivers/net/rnp/base/rnp_hw.h
index 3d1d5cd87b..8e4ca54d45 100644
--- a/drivers/net/rnp/base/rnp_hw.h
+++ b/drivers/net/rnp/base/rnp_hw.h
@@ -60,9 +60,17 @@ struct rnp_mbx_info {
 
 struct rnp_eth_port;
 /* mac operations */
+enum rnp_mpf_modes {
+   RNP_MPF_MODE_NONE = 0,
+   RNP_MPF_MODE_ALLMULTI, /* Multitle Promisc */
+   RNP_MPF_MODE_PROMISC,  /* Unicast Promisc */
+};
+
 struct rnp_mac_ops {
-   /* update mac packet filter mode */
+   /* get default mac address */
int (*get_macaddr)(struct rnp_eth_port *port, u8 *mac);
+   /* update mac packet filter mode */
+   int (*update_mpfm)(struct rnp_eth_port *port, u32 mode, bool en);
 };
 
 struct rnp_eth_adapter;
@@ -92,6 +100,7 @@ struct rnp_hw {
struct rnp_eth_adapter *back;   /* backup to the adapter handle */
void __iomem *e_ctrl;   /* eth

[PATCH v15 24/29] net/rnp: add support Tx TSO offload

2025-02-25 Thread Wenbo Cao
Add support tx tso and tunnel tso
for tunnel just support vxlan/nvgre.

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/features/rnp.ini  |   1 +
 doc/guides/nics/rnp.rst   |   1 +
 drivers/net/rnp/base/rnp_bdq_if.h |   1 +
 drivers/net/rnp/rnp.h |   2 +-
 drivers/net/rnp/rnp_ethdev.c  |  14 +-
 drivers/net/rnp/rnp_rxtx.c| 464 +-
 drivers/net/rnp/rnp_rxtx.h|   1 +
 7 files changed, 476 insertions(+), 8 deletions(-)

diff --git a/doc/guides/nics/features/rnp.ini b/doc/guides/nics/features/rnp.ini
index ceac0beff8..f6feb9aa70 100644
--- a/doc/guides/nics/features/rnp.ini
+++ b/doc/guides/nics/features/rnp.ini
@@ -25,5 +25,6 @@ RSS key update   = Y
 RSS reta update  = Y
 Inner RSS= Y
 Scattered Rx = Y
+TSO  = Y
 Linux= Y
 x86-64   = Y
diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index 4bf41179ba..80f851bca1 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -57,6 +57,7 @@ Features
 - Port hardware statistic
 - Packet type parsing
 - Checksum offload
+- TSO offload
 
 Prerequisites and Pre-conditions
 
diff --git a/drivers/net/rnp/base/rnp_bdq_if.h 
b/drivers/net/rnp/base/rnp_bdq_if.h
index a7d27bdebb..7a6d0b21ec 100644
--- a/drivers/net/rnp/base/rnp_bdq_if.h
+++ b/drivers/net/rnp/base/rnp_bdq_if.h
@@ -111,6 +111,7 @@ struct rnp_tx_desc {
 #define RNP_TX_VLAN_VALID  RTE_BIT32(15)
 /* tx data mac_ip len */
 #define RNP_TX_MAC_LEN_S   (9)
+#define RNP_TX_MAC_LEN_MASKRTE_GENMASK32(15, 9)
 /* tx ctrl cmd */
 #define RNP_TX_LEN_PAD_S   (8)
 #define RNP_TX_OFF_MAC_PAD (0x01UL << RNP_TX_LEN_PAD_S)
diff --git a/drivers/net/rnp/rnp.h b/drivers/net/rnp/rnp.h
index 694ce1409a..c32eb2291c 100644
--- a/drivers/net/rnp/rnp.h
+++ b/drivers/net/rnp/rnp.h
@@ -20,7 +20,7 @@
 #define RNP_ETH_OVERHEAD \
(RTE_ETHER_HDR_LEN + RTE_VLAN_HLEN * 2)
 #define RNP_MAC_MAXFRM_SIZE(9590)
-
+#define RNP_MAX_TSO_PKT(16 * 1024)
 #define RNP_RX_MAX_MTU_SEG (64)
 #define RNP_TX_MAX_MTU_SEG (32)
 #define RNP_RX_MAX_SEG (150)
diff --git a/drivers/net/rnp/rnp_ethdev.c b/drivers/net/rnp/rnp_ethdev.c
index 4f23f7f8d2..3f21de8b29 100644
--- a/drivers/net/rnp/rnp_ethdev.c
+++ b/drivers/net/rnp/rnp_ethdev.c
@@ -671,7 +671,16 @@ static int rnp_dev_infos_get(struct rte_eth_dev *eth_dev,
dev_info->rx_offload_capa = RNP_RX_CHECKSUM_SUPPORT |
RTE_ETH_RX_OFFLOAD_SCATTER;
/* tx support offload cap */
-   dev_info->tx_offload_capa = RTE_ETH_TX_OFFLOAD_MULTI_SEGS;
+   dev_info->tx_offload_capa = 0 |
+   RTE_ETH_TX_OFFLOAD_IPV4_CKSUM |
+   RTE_ETH_TX_OFFLOAD_UDP_CKSUM |
+   RTE_ETH_TX_OFFLOAD_TCP_CKSUM |
+   RTE_ETH_TX_OFFLOAD_SCTP_CKSUM |
+   RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM |
+   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;
/* default ring configure */
dev_info->default_rxportconf.burst_size = 32;
dev_info->default_txportconf.burst_size = 32;
@@ -1083,6 +1092,7 @@ rnp_dev_stats_get(struct rte_eth_dev *dev,
continue;
stats->opackets += txq->stats.opackets;
stats->obytes += txq->stats.obytes;
+   stats->oerrors += txq->stats.errors;
if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {
stats->q_opackets[i] = txq->stats.opackets;
stats->q_obytes[i] = txq->stats.obytes;
@@ -1091,7 +1101,7 @@ rnp_dev_stats_get(struct rte_eth_dev *dev,
stats->imissed = eth_stats->rx_trans_drop + eth_stats->rx_trunc_drop;
stats->ierrors = mac_stats->rx_crc_err + mac_stats->rx_len_err;
stats->ierrors += mac_stats->rx_watchdog_err;
-   stats->oerrors = mac_stats->tx_underflow_err;
+   stats->oerrors += mac_stats->tx_underflow_err;
 
return 0;
 }
diff --git a/drivers/net/rnp/rnp_rxtx.c b/drivers/net/rnp/rnp_rxtx.c
index a2c9fe99be..63d001db2b 100644
--- a/drivers/net/rnp/rnp_rxtx.c
+++ b/drivers/net/rnp/rnp_rxtx.c
@@ -1127,6 +1127,199 @@ rnp_multiseg_clean_txq(struct rnp_tx_queue *txq)
 
return txq->nb_tx_free;
 }
+static inline uint32_t
+rnp_cal_tso_seg(struct rte_mbuf *mbuf)
+{
+   uint32_t hdr_len;
+
+   hdr_len = mbuf->l2_len + mbuf->l3_len + mbuf->l4_len;
+
+   hdr_len += (mbuf->ol_flags & RTE_MBUF_F_TX_TUNNEL_MASK) ?
+   mbuf->outer_l2_len + mbuf->outer_l3_len : 0;
+
+   return (mbuf->tso_segsz) ? mbuf->tso_segsz : hdr_len;
+}
+
+static inline bool
+rnp_need_ctrl_d

[PATCH v15 26/29] net/rnp: add support VLAN filters operations

2025-02-25 Thread Wenbo Cao
add support to update vid for vlan filter.

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/features/rnp.ini|  1 +
 doc/guides/nics/rnp.rst |  3 +-
 drivers/net/rnp/base/meson.build|  1 +
 drivers/net/rnp/base/rnp_bitrev.h   | 64 
 drivers/net/rnp/base/rnp_crc32.c| 37 
 drivers/net/rnp/base/rnp_crc32.h| 10 
 drivers/net/rnp/base/rnp_eth_regs.h |  1 +
 drivers/net/rnp/base/rnp_hw.h   |  1 +
 drivers/net/rnp/base/rnp_mac.c  | 90 -
 drivers/net/rnp/base/rnp_mac.h  |  1 +
 drivers/net/rnp/base/rnp_mac_regs.h |  6 ++
 drivers/net/rnp/base/rnp_osdep.h| 13 +
 drivers/net/rnp/rnp.h   | 11 
 drivers/net/rnp/rnp_ethdev.c| 11 
 14 files changed, 247 insertions(+), 3 deletions(-)
 create mode 100644 drivers/net/rnp/base/rnp_bitrev.h
 create mode 100644 drivers/net/rnp/base/rnp_crc32.c
 create mode 100644 drivers/net/rnp/base/rnp_crc32.h

diff --git a/doc/guides/nics/features/rnp.ini b/doc/guides/nics/features/rnp.ini
index c1ab91697a..48d250c86b 100644
--- a/doc/guides/nics/features/rnp.ini
+++ b/doc/guides/nics/features/rnp.ini
@@ -20,6 +20,7 @@ Promiscuous mode = Y
 Allmulticast mode= Y
 MTU update   = Y
 Unicast MAC filter   = Y
+VLAN filter  = Y
 VLAN offload = Y
 QinQ offload = P
 RSS hash = Y
diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index 422a6d3805..becedacbdd 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -51,7 +51,7 @@ Features
 - Promiscuous mode
 - Link state information
 - MTU update
-- MAC filtering
+- MAC/VLAN filtering
 - Jumbo frames
 - Scatter-Gather IO support
 - Port hardware statistic
@@ -103,6 +103,7 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_dev_get_vlan_offload``
 * ``rte_eth_dev_set_vlan_offload``
 * ``rte_eth_dev_set_vlan_strip_on_queue``
+* ``rte_eth_dev_vlan_filter``
 * ``rte_eth_promiscuous_disable``
 * ``rte_eth_promiscuous_enable``
 * ``rte_eth_allmulticast_enable``
diff --git a/drivers/net/rnp/base/meson.build b/drivers/net/rnp/base/meson.build
index ba49accdec..2a1f2c22ea 100644
--- a/drivers/net/rnp/base/meson.build
+++ b/drivers/net/rnp/base/meson.build
@@ -8,6 +8,7 @@ sources = [
 'rnp_common.c',
 'rnp_mac.c',
 'rnp_bdq_if.c',
+'rnp_crc32.c',
 ]
 
 c_args = cflags
diff --git a/drivers/net/rnp/base/rnp_bitrev.h 
b/drivers/net/rnp/base/rnp_bitrev.h
new file mode 100644
index 00..05c36ca80d
--- /dev/null
+++ b/drivers/net/rnp/base/rnp_bitrev.h
@@ -0,0 +1,64 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2023 Mucse IC Design Ltd.
+ */
+
+#ifndef _RNP_BITREV_H_
+#define _RNP_BITREV_H_
+
+#include "rnp_osdep.h"
+
+static const u8 byte_rev_table[256] = {
+   0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
+   0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
+   0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
+   0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
+   0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
+   0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
+   0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
+   0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
+   0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
+   0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
+   0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
+   0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
+   0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
+   0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
+   0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
+   0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
+   0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
+   0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
+   0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
+   0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
+   0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
+   0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
+   0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
+   0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
+   0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
+   0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
+   0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
+   0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
+   0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
+   0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
+   0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
+   0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff,
+};
+
+static inline u8 bitrev8(u8 byte)
+{
+   return byte_rev_table[byte];
+}
+
+static u16 bitrev16(u16 x)
+{
+   return (bitrev8(x & 0xff) << 8) | bitrev8(x >> 8);
+}
+
+/**
+ * bitrev32 - reverse the order of bits in a u32 value
+ * @x: value to be bit-reversed
+ */
+static u32 bitrev32(uint32_t x)
+{
+   return (bitrev16(x & 0x) << 16) | bitrev16(x >> 16

[PATCH v15 15/29] net/rnp: add Tx burst simple support

2025-02-25 Thread Wenbo Cao
add only support simple send pkts.

Signed-off-by: Wenbo Cao 
---
 drivers/net/rnp/rnp_ethdev.c |  6 +++
 drivers/net/rnp/rnp_rxtx.c   | 85 +++-
 drivers/net/rnp/rnp_rxtx.h   |  1 +
 3 files changed, 91 insertions(+), 1 deletion(-)

diff --git a/drivers/net/rnp/rnp_ethdev.c b/drivers/net/rnp/rnp_ethdev.c
index da499cf9d1..8375cecac2 100644
--- a/drivers/net/rnp/rnp_ethdev.c
+++ b/drivers/net/rnp/rnp_ethdev.c
@@ -606,6 +606,12 @@ static int rnp_dev_infos_get(struct rte_eth_dev *eth_dev,
};
 
dev_info->default_txconf = (struct rte_eth_txconf) {
+   .tx_thresh = {
+   .pthresh = RNP_TX_DESC_FETCH_TH,
+   .hthresh = RNP_TX_DESC_FETCH_BURST,
+   },
+   .tx_free_thresh = RNP_DEFAULT_TX_FREE_THRESH,
+   .tx_rs_thresh = RNP_DEFAULT_TX_RS_THRESH,
.offloads = 0,
};
 
diff --git a/drivers/net/rnp/rnp_rxtx.c b/drivers/net/rnp/rnp_rxtx.c
index a742646c7e..260c34113a 100644
--- a/drivers/net/rnp/rnp_rxtx.c
+++ b/drivers/net/rnp/rnp_rxtx.c
@@ -752,6 +752,89 @@ rnp_recv_pkts(void *_rxq, struct rte_mbuf **rx_pkts, 
uint16_t nb_pkts)
return nb_rx;
 }
 
+static  __rte_always_inline int
+rnp_clean_tx_ring(struct rnp_tx_queue *txq)
+{
+   volatile struct rnp_tx_desc *txbd;
+   struct rnp_txsw_entry *tx_swbd;
+   struct rte_mbuf *m;
+   uint16_t next_dd;
+   uint16_t i;
+
+   txbd = &txq->tx_bdr[txq->tx_next_dd];
+   if (!(txbd->d.cmd & RNP_CMD_DD))
+   return 0;
+   *txbd = txq->zero_desc;
+   next_dd = txq->tx_next_dd - (txq->tx_free_thresh - 1);
+   tx_swbd = &txq->sw_ring[next_dd];
+
+   for (i = 0; i < txq->tx_rs_thresh; ++i, ++tx_swbd) {
+   if (tx_swbd->mbuf) {
+   m = tx_swbd->mbuf;
+   rte_pktmbuf_free_seg(m);
+   tx_swbd->mbuf = NULL;
+   }
+   }
+   txq->nb_tx_free = (txq->nb_tx_free + txq->tx_rs_thresh);
+   txq->tx_next_dd = (txq->tx_next_dd + txq->tx_rs_thresh) &
+   txq->attr.nb_desc_mask;
+
+   return 0;
+}
+
+static __rte_always_inline uint16_t
+rnp_xmit_simple(void *_txq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
+{
+   struct rnp_tx_queue *txq = (struct rnp_tx_queue *)_txq;
+   volatile struct rnp_tx_desc *txbd;
+   struct rnp_txsw_entry *tx_swbd;
+   uint64_t phy;
+   uint16_t start;
+   uint16_t i;
+
+   if (unlikely(!txq->txq_started || !txq->tx_link))
+   return 0;
+
+   if (txq->nb_tx_free < txq->tx_free_thresh)
+   rnp_clean_tx_ring(txq);
+
+   nb_pkts = RTE_MIN(txq->nb_tx_free, nb_pkts);
+   if (!nb_pkts)
+   return 0;
+   start = nb_pkts;
+   i = txq->tx_tail;
+
+   while (nb_pkts--) {
+   txbd = &txq->tx_bdr[i];
+   tx_swbd = &txq->sw_ring[i];
+   tx_swbd->mbuf = *tx_pkts++;
+   phy = rnp_get_dma_addr(&txq->attr, tx_swbd->mbuf);
+   txbd->d.addr = phy;
+   if (unlikely(tx_swbd->mbuf->data_len > RNP_MAC_MAXFRM_SIZE))
+   tx_swbd->mbuf->data_len = 0;
+   txbd->d.blen = tx_swbd->mbuf->data_len;
+   txbd->d.cmd = RNP_CMD_EOP;
+
+   i = (i + 1) & txq->attr.nb_desc_mask;
+   }
+   txq->nb_tx_free -= start;
+   if (txq->tx_tail + start > txq->tx_next_rs) {
+   txbd = &txq->tx_bdr[txq->tx_next_rs];
+   txbd->d.cmd |= RNP_CMD_RS;
+   txq->tx_next_rs = (txq->tx_next_rs + txq->tx_rs_thresh);
+
+   if (txq->tx_next_rs > txq->attr.nb_desc)
+   txq->tx_next_rs = txq->tx_rs_thresh - 1;
+   }
+
+   txq->tx_tail = i;
+
+   rte_wmb();
+   RNP_REG_WR(txq->tx_tailreg, 0, i);
+
+   return start;
+}
+
 int rnp_rx_func_select(struct rte_eth_dev *dev)
 {
dev->rx_pkt_burst = rnp_recv_pkts;
@@ -761,7 +844,7 @@ int rnp_rx_func_select(struct rte_eth_dev *dev)
 
 int rnp_tx_func_select(struct rte_eth_dev *dev)
 {
-   dev->tx_pkt_burst = rte_eth_pkt_burst_dummy;
+   dev->tx_pkt_burst = rnp_xmit_simple;
dev->tx_pkt_prepare = rte_eth_pkt_burst_dummy;
 
return 0;
diff --git a/drivers/net/rnp/rnp_rxtx.h b/drivers/net/rnp/rnp_rxtx.h
index 39e5184502..a8fd8d052f 100644
--- a/drivers/net/rnp/rnp_rxtx.h
+++ b/drivers/net/rnp/rnp_rxtx.h
@@ -89,6 +89,7 @@ struct rnp_tx_queue {
const struct rte_memzone *rz;
uint64_t ring_phys_addr; /* tx dma ring physical addr */
volatile struct rnp_tx_desc *tx_bdr; /* tx dma ring virtual addr */
+   volatile struct rnp_tx_desc zero_desc;
struct rnp_txsw_entry *sw_ring; /* tx software ring addr */
volatile void *tx_tailreg; /* hw desc tail register */
volatile void *tx_headreg; /* hw desc head register*/
-- 
2.25.1



[PATCH v15 12/29] net/rnp: add support link update operations

2025-02-25 Thread Wenbo Cao
This patch add support poll/irq link get mode.

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/features/rnp.ini  |   2 +
 doc/guides/nics/rnp.rst   |   3 +
 drivers/net/rnp/base/rnp_fw_cmd.c |  45 
 drivers/net/rnp/base/rnp_fw_cmd.h |  55 +
 drivers/net/rnp/base/rnp_hw.h |   3 +-
 drivers/net/rnp/base/rnp_mbx_fw.c |  72 ++-
 drivers/net/rnp/base/rnp_mbx_fw.h |   4 +
 drivers/net/rnp/meson.build   |   1 +
 drivers/net/rnp/rnp.h |  12 ++
 drivers/net/rnp/rnp_ethdev.c  | 118 ++-
 drivers/net/rnp/rnp_link.c| 339 ++
 drivers/net/rnp/rnp_link.h|  50 +
 12 files changed, 697 insertions(+), 7 deletions(-)
 create mode 100644 drivers/net/rnp/rnp_link.c
 create mode 100644 drivers/net/rnp/rnp_link.h

diff --git a/doc/guides/nics/features/rnp.ini b/doc/guides/nics/features/rnp.ini
index 2fc94825f5..695b9c0dba 100644
--- a/doc/guides/nics/features/rnp.ini
+++ b/doc/guides/nics/features/rnp.ini
@@ -5,6 +5,8 @@
 ;
 [Features]
 Speed capabilities   = Y
+Link status  = Y
+Link status event= Y
 Queue start/stop = Y
 Promiscuous mode = Y
 Allmulticast mode= Y
diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index 90af73d71f..e6a1aadefc 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -49,6 +49,7 @@ Features
   Receiver Side Steering (RSS) on IPv4, IPv6, IPv4-TCP/UDP/SCTP, 
IPv6-TCP/UDP/SCTP
   Inner RSS is only support for vxlan/nvgre
 - Promiscuous mode
+- Link state information
 
 Prerequisites and Pre-conditions
 
@@ -92,3 +93,5 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_allmulticast_get``
 * ``rte_eth_rx_queue_setup``
 * ``rte_eth_tx_queue_setup``
+* ``rte_eth_link_get``
+* ``rte_eth_link_get_nowait``
diff --git a/drivers/net/rnp/base/rnp_fw_cmd.c 
b/drivers/net/rnp/base/rnp_fw_cmd.c
index 3891249499..a4a2171868 100644
--- a/drivers/net/rnp/base/rnp_fw_cmd.c
+++ b/drivers/net/rnp/base/rnp_fw_cmd.c
@@ -68,6 +68,45 @@ rnp_build_get_lane_status_req(struct rnp_mbx_fw_cmd_req *req,
arg->nr_lane = req_arg->param0;
 }
 
+static void
+rnp_build_set_event_mask(struct rnp_mbx_fw_cmd_req *req,
+struct rnp_fw_req_arg *req_arg,
+void *cookie)
+{
+   struct rnp_set_pf_event_mask *arg =
+   (struct rnp_set_pf_event_mask *)req->data;
+
+   req->flags = 0;
+   req->opcode = RNP_SET_EVENT_MASK;
+   req->datalen = sizeof(*arg);
+   req->cookie = cookie;
+   req->reply_lo = 0;
+   req->reply_hi = 0;
+
+   arg->event_mask = req_arg->param0;
+   arg->event_en = req_arg->param1;
+}
+
+static void
+rnp_build_lane_evet_mask(struct rnp_mbx_fw_cmd_req *req,
+struct rnp_fw_req_arg *req_arg,
+void *cookie)
+{
+   struct rnp_set_lane_event_mask *arg =
+   (struct rnp_set_lane_event_mask *)req->data;
+
+   req->flags = 0;
+   req->opcode = RNP_SET_LANE_EVENT_EN;
+   req->datalen = sizeof(*arg);
+   req->cookie = cookie;
+   req->reply_lo = 0;
+   req->reply_hi = 0;
+
+   arg->nr_lane = req_arg->param0;
+   arg->event_mask = req_arg->param1;
+   arg->event_en = req_arg->param2;
+}
+
 int rnp_build_fwcmd_req(struct rnp_mbx_fw_cmd_req *req,
struct rnp_fw_req_arg *arg,
void *cookie)
@@ -87,6 +126,12 @@ int rnp_build_fwcmd_req(struct rnp_mbx_fw_cmd_req *req,
case RNP_GET_LANE_STATUS:
rnp_build_get_lane_status_req(req, arg, cookie);
break;
+   case RNP_SET_EVENT_MASK:
+   rnp_build_set_event_mask(req, arg, cookie);
+   break;
+   case RNP_SET_LANE_EVENT_EN:
+   rnp_build_lane_evet_mask(req, arg, cookie);
+   break;
default:
err = -EOPNOTSUPP;
}
diff --git a/drivers/net/rnp/base/rnp_fw_cmd.h 
b/drivers/net/rnp/base/rnp_fw_cmd.h
index 5f60ac6187..6c6fd1803e 100644
--- a/drivers/net/rnp/base/rnp_fw_cmd.h
+++ b/drivers/net/rnp/base/rnp_fw_cmd.h
@@ -6,6 +6,7 @@
 #define _RNP_FW_CMD_H_
 
 #include "rnp_osdep.h"
+#include "rnp_hw.h"
 
 #define RNP_FW_LINK_SYNC   (0x000c)
 #define RNP_LINK_MAGIC_CODE(0xa5a4)
@@ -73,6 +74,22 @@ enum RNP_GENERIC_CMD {
RNP_SET_DDR_CSL = 0xFF11,
 };
 
+struct rnp_port_stat {
+   u8 phy_addr; /* Phy MDIO address */
+
+   u8 duplex   : 1; /* FIBRE is always 1,Twisted Pair 1 or 0 */
+   u8 autoneg  : 1; /* autoned state */
+   u8 fec  : 1;
+   u8 an_rev   : 1;
+   u8 link_traing  : 1;
+   u8 is_sgmii : 1; /* avild fw >= 0.5.0.17 */
+   u8 rsvd0: 2;
+   u16 speed;   /* cur port linked speed */
+
+   u16 pause   : 4;
+   u16 rsvd1   : 12;
+};
+
 /* firmware -> driver reply */
 struct __rte_aligned(4) __rte_packed_begin rnp_

[PATCH v15 11/29] net/rnp: add RSS support operations

2025-02-25 Thread Wenbo Cao
add support rss reta updata/query rss hash update/get
dev_configure add rss conf check.

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/features/rnp.ini|   4 +
 doc/guides/nics/rnp.rst |   7 +
 drivers/net/rnp/base/rnp_eth_regs.h |  16 ++
 drivers/net/rnp/meson.build |   1 +
 drivers/net/rnp/rnp.h   |   7 +
 drivers/net/rnp/rnp_ethdev.c|  23 ++
 drivers/net/rnp/rnp_rss.c   | 367 
 drivers/net/rnp/rnp_rss.h   |  44 
 8 files changed, 469 insertions(+)
 create mode 100644 drivers/net/rnp/rnp_rss.c
 create mode 100644 drivers/net/rnp/rnp_rss.h

diff --git a/doc/guides/nics/features/rnp.ini b/doc/guides/nics/features/rnp.ini
index fd7d4b9d8d..2fc94825f5 100644
--- a/doc/guides/nics/features/rnp.ini
+++ b/doc/guides/nics/features/rnp.ini
@@ -8,5 +8,9 @@ Speed capabilities   = Y
 Queue start/stop = Y
 Promiscuous mode = Y
 Allmulticast mode= Y
+RSS hash = Y
+RSS key update   = Y
+RSS reta update  = Y
+Inner RSS= Y
 Linux= Y
 x86-64   = Y
diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index 66ff7f4090..90af73d71f 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -45,6 +45,9 @@ Features
 
 
 - Multiple queues for TX and RX
+- Receiver Side Steering (RSS)
+  Receiver Side Steering (RSS) on IPv4, IPv6, IPv4-TCP/UDP/SCTP, 
IPv6-TCP/UDP/SCTP
+  Inner RSS is only support for vxlan/nvgre
 - Promiscuous mode
 
 Prerequisites and Pre-conditions
@@ -77,6 +80,10 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_dev_tx_queue_stop``
 * ``rte_eth_dev_start``
 * ``rte_eth_dev_stop``
+* ``rte_eth_dev_rss_hash_conf_get``
+* ``rte_eth_dev_rss_hash_update``
+* ``rte_eth_dev_rss_reta_query``
+* ``rte_eth_dev_rss_reta_update``
 * ``rte_eth_promiscuous_disable``
 * ``rte_eth_promiscuous_enable``
 * ``rte_eth_allmulticast_enable``
diff --git a/drivers/net/rnp/base/rnp_eth_regs.h 
b/drivers/net/rnp/base/rnp_eth_regs.h
index 60766d2035..be7ed5b886 100644
--- a/drivers/net/rnp/base/rnp_eth_regs.h
+++ b/drivers/net/rnp/base/rnp_eth_regs.h
@@ -32,7 +32,23 @@
 #define RNP_MAC_MULTICASE_TBL_EN   RTE_BIT32(2)
 #define RNP_MAC_UNICASE_TBL_EN RTE_BIT32(3)
 /* rss function ctrl */
+#define RNP_RSS_INNER_CTRL _ETH_(0x805c)
+#define RNP_INNER_RSS_EN   (1)
+#define RNP_INNER_RSS_DIS  (0)
 #define RNP_RSS_REDIR_TB(n, id) _ETH_(0xe000 + ((n) * 0x200) + ((id) * 0x4))
+#define RNP_RSS_MRQC_ADDR  _ETH_(0x92a0)
+/* RSS policy */
+#define RNP_RSS_HASH_CFG_MASK  (0x3F3)
+#define RNP_RSS_HASH_IPV4_TCP  RTE_BIT32(16)
+#define RNP_RSS_HASH_IPV4  RTE_BIT32(17)
+#define RNP_RSS_HASH_IPV6  RTE_BIT32(20)
+#define RNP_RSS_HASH_IPV6_TCP  RTE_BIT32(21)
+#define RNP_RSS_HASH_IPV4_UDP  RTE_BIT32(22)
+#define RNP_RSS_HASH_IPV6_UDP   RTE_BIT32(23)
+#define RNP_RSS_HASH_IPV4_SCTP  RTE_BIT32(24)
+#define RNP_RSS_HASH_IPV6_SCTP  RTE_BIT32(25)
+/* rss hash key */
+#define RNP_RSS_KEY_TABLE(idx) _ETH_(0x92d0 + ((idx) * 0x4))
 
 #define RNP_TC_PORT_OFFSET(lane)   _ETH_(0xe840 + 0x04 * (lane))
 
diff --git a/drivers/net/rnp/meson.build b/drivers/net/rnp/meson.build
index f88fa89a53..e20cc88497 100644
--- a/drivers/net/rnp/meson.build
+++ b/drivers/net/rnp/meson.build
@@ -22,4 +22,5 @@ includes += include_directories('base')
 sources = files(
 'rnp_ethdev.c',
 'rnp_rxtx.c',
+'rnp_rss.c',
 )
diff --git a/drivers/net/rnp/rnp.h b/drivers/net/rnp/rnp.h
index 9440d9df58..755b6c7f41 100644
--- a/drivers/net/rnp/rnp.h
+++ b/drivers/net/rnp/rnp.h
@@ -111,6 +111,13 @@ struct rnp_eth_port {
struct rnp_tx_queue *tx_queues[RNP_MAX_RX_QUEUE_NUM];
struct rnp_hw *hw;
 
+   struct rte_eth_rss_conf rss_conf;
+   uint16_t last_rx_num;
+   bool rxq_num_changed;
+   bool reta_has_cfg;
+   bool hw_rss_en;
+   uint32_t indirtbl[RNP_RSS_INDIR_SIZE];
+
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 cb855ce34b..0f92e3523a 100644
--- a/drivers/net/rnp/rnp_ethdev.c
+++ b/drivers/net/rnp/rnp_ethdev.c
@@ -18,6 +18,7 @@
 #include "base/rnp_dma_regs.h"
 #include "base/rnp_mac_regs.h"
 #include "rnp_rxtx.h"
+#include "rnp_rss.h"
 
 static struct rte_eth_dev *
 rnp_alloc_eth_port(struct rte_pci_device *pci, char *name)
@@ -235,6 +236,9 @@ static int rnp_dev_start(struct rte_eth_dev *eth_dev)
}
/* disable eth rx flow */
RNP_RX_ETH_DISABLE(hw, lane);
+   ret = rnp_dev_rss_configure(eth_dev);
+   if (ret)
+   return ret;
ret = rnp_rx_scattered_setup(eth_dev);
if (ret)
return ret;
@@ -302,6 +306,19 @@ static int rnp_disable_all_tx_queue(struct rte_eth_dev 
*dev)
return ret;
 }
 
+static int rnp_dev_configure(struct rte_eth_dev *eth_dev)
+{
+   struct rnp_eth_port *port = RNP_DEV_TO_PORT(eth_dev);
+
+  

[PATCH v15 25/29] net/rnp: support VLAN offloads

2025-02-25 Thread Wenbo Cao
add support rx vlan strip,filter,tx vlan/qinq insert.

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/features/rnp.ini|   2 +
 doc/guides/nics/rnp.rst |   4 +
 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| 170 +++-
 drivers/net/rnp/rnp_rxtx.c  |  22 +++-
 11 files changed, 303 insertions(+), 6 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 80f851bca1..422a6d3805 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -58,6 +58,7 @@ Features
 - Packet type parsing
 - Checksum offload
 - TSO offload
+- VLAN stripping and VLAN/QINQ insertion
 
 Prerequisites and Pre-conditions
 
@@ -99,6 +100,9 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_dev_mac_addr_add``
 * ``rte_eth_dev_mac_addr_remove``
 * ``rte_eth_dev_get_supported_ptypes``
+* ``rte_eth_dev_get_vlan_offload``
+* ``rte_eth_dev_set_vlan_offload``
+* ``rte_eth_dev_set_vlan_strip_on_queue``
 * ``rte_eth_promiscuous_disable``
 * ``rte_eth_promiscuous_enable``
 * ``rte_eth_allmulticast_enable``
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_VALIDRTE_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 e096ec90e6..f84386d93a 100644
--- a/drivers/net/rnp/base/rnp_eth_regs.h
+++ b/drivers/net/rnp/base/rnp_eth_regs.h
@@ -57,6 +57,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 e5a19a1918..c7e5a2f506 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, const 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 6ad2ca0a4a..b6b969a020 100644
--- a/drivers/net/rnp/base/rnp_mac.c
+++ b/drivers/net/rnp/base/rnp_mac.c
@@ -166,11 +166,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 | \;
+RNP_MAC_VLAN_HASH_EN);
+   } else {
+   flt_reg &= ~R

[PATCH v15 23/29] net/rnp: add support Rx checksum offload

2025-02-25 Thread Wenbo Cao
Add support Rx l3/l4 checum and tunnel
inner l3/l4, out l3 chksum.

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/features/rnp.ini|  4 ++
 doc/guides/nics/rnp.rst |  1 +
 drivers/net/rnp/base/rnp_eth_regs.h | 13 
 drivers/net/rnp/rnp.h   |  7 +++
 drivers/net/rnp/rnp_ethdev.c| 65 ++-
 drivers/net/rnp/rnp_rxtx.c  | 97 -
 6 files changed, 185 insertions(+), 2 deletions(-)

diff --git a/doc/guides/nics/features/rnp.ini b/doc/guides/nics/features/rnp.ini
index eb1c27a3d3..ceac0beff8 100644
--- a/doc/guides/nics/features/rnp.ini
+++ b/doc/guides/nics/features/rnp.ini
@@ -8,6 +8,10 @@ Speed capabilities   = Y
 Link status  = Y
 Link status event= Y
 Packet type parsing  = Y
+L3 checksum offload  = P
+L4 checksum offload  = P
+Inner L3 checksum= P
+Inner L4 checksum= P
 Basic stats  = Y
 Stats per queue  = Y
 Extended stats   = Y
diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index 89bf97c2fb..4bf41179ba 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -56,6 +56,7 @@ Features
 - Scatter-Gather IO support
 - Port hardware statistic
 - Packet type parsing
+- Checksum offload
 
 Prerequisites and Pre-conditions
 
diff --git a/drivers/net/rnp/base/rnp_eth_regs.h 
b/drivers/net/rnp/base/rnp_eth_regs.h
index 49860135bd..e096ec90e6 100644
--- a/drivers/net/rnp/base/rnp_eth_regs.h
+++ b/drivers/net/rnp/base/rnp_eth_regs.h
@@ -16,6 +16,19 @@
 #define RNP_RX_ETH_F_CTRL(n)   _ETH_(0x8070 + ((n) * 0x8))
 #define RNP_RX_ETH_F_OFF   (0x7ff)
 #define RNP_RX_ETH_F_ON(0x270)
+/* rx checksum ctrl */
+#define RNP_HW_SCTP_CKSUM_CTRL _ETH_(0x8038)
+#define RNP_HW_CHECK_ERR_CTRL  _ETH_(0x8060)
+#define RNP_HW_ERR_HDR_LEN RTE_BIT32(0)
+#define RNP_HW_ERR_PKTLEN  RTE_BIT32(1)
+#define RNP_HW_L3_CKSUM_ERRRTE_BIT32(2)
+#define RNP_HW_L4_CKSUM_ERRRTE_BIT32(3)
+#define RNP_HW_SCTP_CKSUM_ERR  RTE_BIT32(4)
+#define RNP_HW_INNER_L3_CKSUM_ERR  RTE_BIT32(5)
+#define RNP_HW_INNER_L4_CKSUM_ERR  RTE_BIT32(6)
+#define RNP_HW_CKSUM_ERR_MASK  RTE_GENMASK32(6, 2)
+#define RNP_HW_CHECK_ERR_MASK  RTE_GENMASK32(6, 0)
+#define RNP_HW_ERR_RX_ALL_MASK RTE_GENMASK32(1, 0)
 /* max/min pkts length receive limit ctrl */
 #define RNP_MIN_FRAME_CTRL _ETH_(0x80f0)
 #define RNP_MAX_FRAME_CTRL _ETH_(0x80f4)
diff --git a/drivers/net/rnp/rnp.h b/drivers/net/rnp/rnp.h
index e4c677a179..694ce1409a 100644
--- a/drivers/net/rnp/rnp.h
+++ b/drivers/net/rnp/rnp.h
@@ -45,6 +45,13 @@
RTE_ETH_RSS_NONFRAG_IPV6_UDP | \
RTE_ETH_RSS_IPV6_UDP_EX | \
RTE_ETH_RSS_NONFRAG_IPV6_SCTP)
+/* rx checksum offload */
+#define RNP_RX_CHECKSUM_SUPPORT ( \
+   RTE_ETH_RX_OFFLOAD_IPV4_CKSUM | \
+   RTE_ETH_RX_OFFLOAD_UDP_CKSUM | \
+   RTE_ETH_RX_OFFLOAD_TCP_CKSUM | \
+   RTE_ETH_RX_OFFLOAD_SCTP_CKSUM | \
+   RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM)
 /* Ring info special */
 #define RNP_MAX_BD_COUNT   (4096)
 #define RNP_MIN_BD_COUNT   (128)
diff --git a/drivers/net/rnp/rnp_ethdev.c b/drivers/net/rnp/rnp_ethdev.c
index 9b5ad90e85..4f23f7f8d2 100644
--- a/drivers/net/rnp/rnp_ethdev.c
+++ b/drivers/net/rnp/rnp_ethdev.c
@@ -411,6 +411,67 @@ static int rnp_disable_all_tx_queue(struct rte_eth_dev 
*dev)
return ret;
 }
 
+static void rnp_set_rx_cksum_offload(struct rte_eth_dev *dev)
+{
+   struct rnp_eth_port *port = RNP_DEV_TO_PORT(dev);
+   struct rnp_hw *hw = port->hw;
+   uint32_t cksum_ctrl;
+   uint64_t offloads;
+
+   offloads = dev->data->dev_conf.rxmode.offloads;
+   cksum_ctrl = RNP_HW_CHECK_ERR_MASK;
+   /* enable rx checksum feature */
+   if (!rnp_pf_is_multiple_ports(hw->device_id)) {
+   if (offloads & RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM) {
+   /* Tunnel Option Cksum L4_Option */
+   cksum_ctrl &= ~RNP_HW_L4_CKSUM_ERR;
+   if (offloads & (RTE_ETH_RX_OFFLOAD_UDP_CKSUM |
+   RTE_ETH_RX_OFFLOAD_TCP_CKSUM))
+   cksum_ctrl &= ~RNP_HW_INNER_L4_CKSUM_ERR;
+   else
+   cksum_ctrl |= RNP_HW_INNER_L4_CKSUM_ERR;
+   } else {
+   /* no tunnel option cksum l4_option */
+   cksum_ctrl |= RNP_HW_INNER_L4_CKSUM_ERR;
+   if (offloads & (RTE_ETH_RX_OFFLOAD_UDP_CKSUM |
+   RTE_ETH_RX_OFFLOAD_TCP_CKSUM))
+   cksum_ctrl &= ~RNP_HW_L4_CKSUM_ERR;
+   else
+   cksum_ctrl |= RNP_HW_L4_CKSUM_ERR;
+   }
+   if (offloads & RTE_ETH_RX_OFFLOAD_OU

[PATCH v15 27/29] net/rnp: add queue info operation

2025-02-25 Thread Wenbo Cao
add support get queue configure info for user debug

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/rnp.rst  |  2 ++
 drivers/net/rnp/rnp_ethdev.c |  2 ++
 drivers/net/rnp/rnp_rxtx.c   | 42 
 drivers/net/rnp/rnp_rxtx.h   |  4 
 4 files changed, 50 insertions(+)

diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index becedacbdd..8854b45220 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -111,7 +111,9 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_promiscuous_get``
 * ``rte_eth_allmulticast_get``
 * ``rte_eth_rx_queue_setup``
+* ``rte_eth_rx_queue_info_get``
 * ``rte_eth_tx_queue_setup``
+* ``rte_eth_tx_queue_info_get``
 * ``rte_eth_link_get``
 * ``rte_eth_link_get_nowait``
 * ``rte_eth_stats_get``
diff --git a/drivers/net/rnp/rnp_ethdev.c b/drivers/net/rnp/rnp_ethdev.c
index 2458f6b866..92063f3c40 100644
--- a/drivers/net/rnp/rnp_ethdev.c
+++ b/drivers/net/rnp/rnp_ethdev.c
@@ -1479,6 +1479,8 @@ static const struct eth_dev_ops rnp_eth_dev_ops = {
.rx_queue_release = rnp_dev_rx_queue_release,
.tx_queue_setup   = rnp_tx_queue_setup,
.tx_queue_release = rnp_dev_tx_queue_release,
+   .rxq_info_get = rnp_rx_queue_info_get,
+   .txq_info_get = rnp_tx_queue_info_get,
/* rss impl */
.reta_update  = rnp_dev_rss_reta_update,
.reta_query   = rnp_dev_rss_reta_query,
diff --git a/drivers/net/rnp/rnp_rxtx.c b/drivers/net/rnp/rnp_rxtx.c
index e23e16948d..bcd340ec35 100644
--- a/drivers/net/rnp/rnp_rxtx.c
+++ b/drivers/net/rnp/rnp_rxtx.c
@@ -1722,3 +1722,45 @@ int rnp_tx_func_select(struct rte_eth_dev *dev)
 
return 0;
 }
+
+void
+rnp_rx_queue_info_get(struct rte_eth_dev *dev, uint16_t queue_id,
+ struct rte_eth_rxq_info *qinfo)
+{
+   struct rnp_rx_queue *rxq;
+
+   rxq = dev->data->rx_queues[queue_id];
+   if (!rxq)
+   return;
+   qinfo->mp = rxq->mb_pool;
+   qinfo->scattered_rx = dev->data->scattered_rx;
+   qinfo->queue_state = rxq->rxq_started;
+   qinfo->nb_desc = rxq->attr.nb_desc;
+   qinfo->rx_buf_size = rxq->rx_buf_len;
+
+   qinfo->conf.rx_deferred_start = rxq->rx_deferred_start;
+   qinfo->conf.rx_free_thresh = rxq->rx_free_thresh;
+   qinfo->conf.rx_thresh.pthresh = rxq->pthresh;
+   qinfo->conf.rx_thresh.hthresh = rxq->pburst;
+   qinfo->conf.offloads = rxq->rx_offloads;
+}
+
+void
+rnp_tx_queue_info_get(struct rte_eth_dev *dev, uint16_t queue_id,
+ struct rte_eth_txq_info *qinfo)
+{
+   struct rnp_tx_queue *txq;
+
+   txq = dev->data->tx_queues[queue_id];
+   if (!txq)
+   return;
+   qinfo->queue_state = txq->txq_started;
+   qinfo->nb_desc = txq->attr.nb_desc;
+
+   qinfo->conf.tx_deferred_start = txq->tx_deferred_start;
+   qinfo->conf.tx_free_thresh = txq->tx_free_thresh;
+   qinfo->conf.tx_rs_thresh = txq->tx_rs_thresh;
+   qinfo->conf.tx_thresh.pthresh = txq->pthresh;
+   qinfo->conf.tx_thresh.hthresh = txq->pburst;
+   qinfo->conf.offloads = txq->tx_offloads;
+}
diff --git a/drivers/net/rnp/rnp_rxtx.h b/drivers/net/rnp/rnp_rxtx.h
index 51e5d4b600..dc4a8ea9dd 100644
--- a/drivers/net/rnp/rnp_rxtx.h
+++ b/drivers/net/rnp/rnp_rxtx.h
@@ -148,5 +148,9 @@ int rnp_rx_queue_stop(struct rte_eth_dev *eth_dev, uint16_t 
qidx);
 int rnp_rx_queue_start(struct rte_eth_dev *eth_dev, uint16_t qidx);
 int rnp_rx_func_select(struct rte_eth_dev *dev);
 int rnp_tx_func_select(struct rte_eth_dev *dev);
+void rnp_rx_queue_info_get(struct rte_eth_dev *dev, uint16_t queue_id,
+  struct rte_eth_rxq_info *qinfo);
+void rnp_tx_queue_info_get(struct rte_eth_dev *dev, uint16_t queue_id,
+  struct rte_eth_txq_info *qinfo);
 
 #endif /* _RNP_RXTX_H_ */
-- 
2.25.1



[PATCH v15 18/29] net/rnp: add Tx multiple segment version

2025-02-25 Thread Wenbo Cao
add support multiple segs mbuf send.

Signed-off-by: Wenbo Cao 
---
 drivers/net/rnp/rnp_ethdev.c |   2 +
 drivers/net/rnp/rnp_rxtx.c   | 126 ++-
 drivers/net/rnp/rnp_rxtx.h   |   3 +-
 3 files changed, 128 insertions(+), 3 deletions(-)

diff --git a/drivers/net/rnp/rnp_ethdev.c b/drivers/net/rnp/rnp_ethdev.c
index b8e24f6d27..898e2ae338 100644
--- a/drivers/net/rnp/rnp_ethdev.c
+++ b/drivers/net/rnp/rnp_ethdev.c
@@ -608,6 +608,8 @@ static int rnp_dev_infos_get(struct rte_eth_dev *eth_dev,
dev_info->speed_capa = rnp_get_speed_caps(eth_dev);
/* rx support offload cap */
dev_info->rx_offload_capa = RTE_ETH_RX_OFFLOAD_SCATTER;
+   /* tx support offload cap */
+   dev_info->tx_offload_capa = RTE_ETH_TX_OFFLOAD_MULTI_SEGS;
/* default ring configure */
dev_info->default_rxportconf.burst_size = 32;
dev_info->default_txportconf.burst_size = 32;
diff --git a/drivers/net/rnp/rnp_rxtx.c b/drivers/net/rnp/rnp_rxtx.c
index c012782e1d..fa0890ca76 100644
--- a/drivers/net/rnp/rnp_rxtx.c
+++ b/drivers/net/rnp/rnp_rxtx.c
@@ -369,9 +369,11 @@ rnp_tx_queue_sw_reset(struct rnp_tx_queue *txq)
sw_ring[prev].next_id = idx;
prev = idx;
}
+   txq->last_desc_cleaned = txq->attr.nb_desc - 1;
txq->nb_tx_free = txq->attr.nb_desc - 1;
txq->tx_next_dd = txq->tx_rs_thresh - 1;
txq->tx_next_rs = txq->tx_rs_thresh - 1;
+   txq->nb_tx_used = 0;
txq->tx_tail = 0;
 
size = (txq->attr.nb_desc + RNP_TX_MAX_BURST_SIZE);
@@ -857,6 +859,7 @@ rnp_rxq_bulk_alloc(struct rnp_rx_queue *rxq,
rxe->mbuf = nmb;
rxbd->d.pkt_addr = rnp_get_dma_addr(&rxq->attr, nmb);
}
+   rxq->rxrearm_nb++;
if (rxq->rxrearm_nb > rxq->rx_free_thresh) {
rxq->rxrearm_nb -= rxq->rx_free_thresh;
rxq->rxrearm_start += rxq->rx_free_thresh;
@@ -924,7 +927,6 @@ rnp_scattered_rx(void *rx_queue, struct rte_mbuf **rx_pkts,
first_seg->nb_segs++;
last_seg->next = rxm;
}
-   rxq->rxrearm_nb++;
if (!(rx_status & rte_cpu_to_le_16(RNP_CMD_EOP))) {
last_seg = rxm;
continue;
@@ -947,6 +949,106 @@ rnp_scattered_rx(void *rx_queue, struct rte_mbuf 
**rx_pkts,
return nb_rx;
 }
 
+static __rte_always_inline uint16_t
+rnp_multiseg_clean_txq(struct rnp_tx_queue *txq)
+{
+   uint16_t last_desc_cleaned = txq->last_desc_cleaned;
+   struct rnp_txsw_entry *sw_ring = txq->sw_ring;
+   volatile struct rnp_tx_desc *txbd;
+   uint16_t desc_to_clean_to;
+   uint16_t nb_tx_to_clean;
+
+   desc_to_clean_to = (uint16_t)(last_desc_cleaned + txq->tx_rs_thresh);
+   desc_to_clean_to = desc_to_clean_to & (txq->attr.nb_desc - 1);
+
+   desc_to_clean_to = sw_ring[desc_to_clean_to].last_id;
+   txbd = &txq->tx_bdr[desc_to_clean_to];
+   if (!(txbd->d.cmd & RNP_CMD_DD))
+   return txq->nb_tx_free;
+
+   if (last_desc_cleaned > desc_to_clean_to)
+   nb_tx_to_clean = (uint16_t)((txq->attr.nb_desc -
+   last_desc_cleaned) + desc_to_clean_to);
+   else
+   nb_tx_to_clean = (uint16_t)(desc_to_clean_to -
+   last_desc_cleaned);
+
+   txbd->d.cmd = 0;
+
+   txq->last_desc_cleaned = desc_to_clean_to;
+   txq->nb_tx_free = (uint16_t)(txq->nb_tx_free + nb_tx_to_clean);
+
+   return txq->nb_tx_free;
+}
+
+static __rte_always_inline uint16_t
+rnp_multiseg_xmit_pkts(void *_txq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
+{
+   struct rnp_tx_queue *txq = (struct rnp_tx_queue *)_txq;
+   volatile struct rnp_tx_desc *txbd;
+   struct rnp_txsw_entry *txe, *txn;
+   struct rte_mbuf *tx_pkt, *m_seg;
+   uint16_t send_pkts = 0;
+   uint16_t nb_used_bd;
+   uint16_t tx_last;
+   uint16_t nb_tx;
+   uint16_t tx_id;
+
+   if (unlikely(!txq->txq_started || !txq->tx_link))
+   return 0;
+   if (txq->nb_tx_free < txq->tx_free_thresh)
+   rnp_multiseg_clean_txq(txq);
+   if (unlikely(txq->nb_tx_free == 0))
+   return 0;
+   tx_id = txq->tx_tail;
+   txbd = &txq->tx_bdr[tx_id];
+   txe = &txq->sw_ring[tx_id];
+   for (nb_tx = 0; nb_tx < nb_pkts; nb_tx++) {
+   tx_pkt = tx_pkts[nb_tx];
+   nb_used_bd = tx_pkt->nb_segs;
+   tx_last = (uint16_t)(tx_id + nb_used_bd - 1);
+   if (tx_last >= txq->attr.nb_desc)
+   tx_last = (uint16_t)(tx_last - txq->attr.nb_desc);
+   if (nb_used_bd > txq->nb_tx_free)
+   if (nb_used_bd > rnp_multiseg_clean_txq(txq))
+   break;
+   m_seg = tx_pkt;
+   do {
+   txbd = &txq->tx_bdr[tx_id];
+  

[PATCH v15 21/29] net/rnp: add unicast MAC filter operation

2025-02-25 Thread Wenbo Cao
add mac filter for single/multiple port.

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/features/rnp.ini|  1 +
 doc/guides/nics/rnp.rst |  6 ++
 drivers/net/rnp/base/rnp_eth_regs.h |  4 ++
 drivers/net/rnp/base/rnp_hw.h   |  3 +
 drivers/net/rnp/base/rnp_mac.c  | 91 +
 drivers/net/rnp/base/rnp_mac.h  |  2 +
 drivers/net/rnp/base/rnp_mac_regs.h |  4 ++
 drivers/net/rnp/rnp.h   |  4 ++
 drivers/net/rnp/rnp_ethdev.c| 62 ++--
 9 files changed, 171 insertions(+), 6 deletions(-)

diff --git a/doc/guides/nics/features/rnp.ini b/doc/guides/nics/features/rnp.ini
index 14ff88fec1..00b23b0fa2 100644
--- a/doc/guides/nics/features/rnp.ini
+++ b/doc/guides/nics/features/rnp.ini
@@ -14,6 +14,7 @@ Queue start/stop = Y
 Promiscuous mode = Y
 Allmulticast mode= Y
 MTU update   = Y
+Unicast MAC filter   = Y
 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 aa39329af7..24e90136e7 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -51,6 +51,7 @@ Features
 - Promiscuous mode
 - Link state information
 - MTU update
+- MAC filtering
 - Jumbo frames
 - Scatter-Gather IO support
 - Port hardware statistic
@@ -91,6 +92,9 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_dev_rss_reta_update``
 * ``rte_eth_dev_set_link_down``
 * ``rte_eth_dev_set_link_up``
+* ``rte_eth_dev_default_mac_addr_set``
+* ``rte_eth_dev_mac_addr_add``
+* ``rte_eth_dev_mac_addr_remove``
 * ``rte_eth_promiscuous_disable``
 * ``rte_eth_promiscuous_enable``
 * ``rte_eth_allmulticast_enable``
@@ -105,3 +109,5 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_stats_reset``
 * ``rte_eth_xstats_get``
 * ``rte_eth_xstats_get_names``
+* ``rte_eth_macaddr_get``
+* ``rte_eth_macaddrs_get``
diff --git a/drivers/net/rnp/base/rnp_eth_regs.h 
b/drivers/net/rnp/base/rnp_eth_regs.h
index adac817df2..49860135bd 100644
--- a/drivers/net/rnp/base/rnp_eth_regs.h
+++ b/drivers/net/rnp/base/rnp_eth_regs.h
@@ -64,5 +64,9 @@
 #define RNP_RSS_KEY_TABLE(idx) _ETH_(0x92d0 + ((idx) * 0x4))
 
 #define RNP_TC_PORT_OFFSET(lane)   _ETH_(0xe840 + 0x04 * (lane))
+/* host mac address filter */
+#define RNP_RAL_BASE_ADDR(n)   _ETH_(0xA000 + (0x04 * (n)))
+#define RNP_RAH_BASE_ADDR(n)   _ETH_(0xA400 + (0x04 * (n)))
+#define RNP_MAC_FILTER_EN  RTE_BIT32(31)
 
 #endif /* _RNP_ETH_REGS_H */
diff --git a/drivers/net/rnp/base/rnp_hw.h b/drivers/net/rnp/base/rnp_hw.h
index 72e66338a0..e5a19a1918 100644
--- a/drivers/net/rnp/base/rnp_hw.h
+++ b/drivers/net/rnp/base/rnp_hw.h
@@ -71,6 +71,9 @@ struct rnp_mac_ops {
int (*get_macaddr)(struct rnp_eth_port *port, u8 *mac);
/* update mac packet filter mode */
int (*update_mpfm)(struct rnp_eth_port *port, u32 mode, bool en);
+   /* Receive Address Filter table */
+   int (*set_rafb)(struct rnp_eth_port *port, const u8 *mac, u32 index);
+   int (*clear_rafb)(struct rnp_eth_port *port, u32 index);
 };
 
 struct rnp_eth_adapter;
diff --git a/drivers/net/rnp/base/rnp_mac.c b/drivers/net/rnp/base/rnp_mac.c
index 52d8a47437..6ad2ca0a4a 100644
--- a/drivers/net/rnp/base/rnp_mac.c
+++ b/drivers/net/rnp/base/rnp_mac.c
@@ -95,14 +95,89 @@ rnp_update_mpfm_pf(struct rnp_eth_port *port, u32 mode, 
bool en)
return 0;
 }
 
+static int
+rnp_set_mac_addr_pf(struct rnp_eth_port *port,
+   const u8 *addr, u32 index)
+{
+   struct rnp_hw *hw = port->hw;
+   u32 addr_hi = 0, addr_lo = 0;
+   u8 *mac = NULL;
+
+   mac = (u8 *)&addr_hi;
+   mac[0] = addr[1];
+   mac[1] = addr[0];
+   mac = (u8 *)&addr_lo;
+   mac[0] = addr[5];
+   mac[1] = addr[4];
+   mac[2] = addr[3];
+   mac[3] = addr[2];
+   addr_hi |= RNP_MAC_FILTER_EN;
+   RNP_E_REG_WR(hw, RNP_RAH_BASE_ADDR(index), addr_hi);
+   RNP_E_REG_WR(hw, RNP_RAL_BASE_ADDR(index), addr_lo);
+
+   return 0;
+}
+
+static int
+rnp_set_mac_addr_indep(struct rnp_eth_port *port,
+  const u8 *addr, u32 index)
+{
+   u16 lane = port->attr.nr_lane;
+   struct rnp_hw *hw = port->hw;
+   u32 addr_hi = 0, addr_lo = 0;
+   u8 *mac = NULL;
+
+   mac = (u8 *)&addr_lo;
+   mac[0] = addr[0];
+   mac[1] = addr[1];
+   mac[2] = addr[2];
+   mac[3] = addr[3];
+   mac = (u8 *)&addr_hi;
+   mac[0] = addr[4];
+   mac[1] = addr[5];
+
+   addr_hi |= RNP_MAC_AE;
+   RNP_MAC_REG_WR(hw, lane, RNP_MAC_ADDR_HI(index), addr_hi);
+   RNP_MAC_REG_WR(hw, lane, RNP_MAC_ADDR_LO(index), addr_lo);
+
+   return 0;
+}
+
+static int
+rnp_clear_mac_pf(struct rnp_eth_port *port, u32 index)
+{
+   struct rnp_hw *hw = port->hw;
+
+   RNP_E_REG_WR(hw, RNP_RAL_BASE_ADDR(index), 0);
+   RNP_E_REG_WR(hw, RNP_RAH_BASE_ADDR(index), 0);
+
+   return 0;
+}
+
+static int
+rnp_clear_mac_indep(struct rnp_eth_port

[PATCH v15 17/29] net/rnp: add Rx scatter segment version

2025-02-25 Thread Wenbo Cao
add support scatter multi segment received.

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/features/rnp.ini |   1 +
 doc/guides/nics/rnp.rst  |   2 +
 drivers/net/rnp/rnp_ethdev.c |   2 +
 drivers/net/rnp/rnp_rxtx.c   | 132 ++-
 drivers/net/rnp/rnp_rxtx.h   |   2 +
 5 files changed, 137 insertions(+), 2 deletions(-)

diff --git a/doc/guides/nics/features/rnp.ini b/doc/guides/nics/features/rnp.ini
index 6d13370e8f..6453762745 100644
--- a/doc/guides/nics/features/rnp.ini
+++ b/doc/guides/nics/features/rnp.ini
@@ -15,5 +15,6 @@ RSS hash = Y
 RSS key update   = Y
 RSS reta update  = Y
 Inner RSS= Y
+Scattered Rx = Y
 Linux= Y
 x86-64   = Y
diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index 5b58a6941c..b3d6d4d425 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -51,6 +51,8 @@ Features
 - Promiscuous mode
 - Link state information
 - MTU update
+- Jumbo frames
+- Scatter-Gather IO support
 
 Prerequisites and Pre-conditions
 
diff --git a/drivers/net/rnp/rnp_ethdev.c b/drivers/net/rnp/rnp_ethdev.c
index aa5e221bce..b8e24f6d27 100644
--- a/drivers/net/rnp/rnp_ethdev.c
+++ b/drivers/net/rnp/rnp_ethdev.c
@@ -606,6 +606,8 @@ 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);
+   /* rx support offload cap */
+   dev_info->rx_offload_capa = RTE_ETH_RX_OFFLOAD_SCATTER;
/* default ring configure */
dev_info->default_rxportconf.burst_size = 32;
dev_info->default_txportconf.burst_size = 32;
diff --git a/drivers/net/rnp/rnp_rxtx.c b/drivers/net/rnp/rnp_rxtx.c
index 260c34113a..c012782e1d 100644
--- a/drivers/net/rnp/rnp_rxtx.c
+++ b/drivers/net/rnp/rnp_rxtx.c
@@ -826,7 +826,6 @@ rnp_xmit_simple(void *_txq, struct rte_mbuf **tx_pkts, 
uint16_t nb_pkts)
if (txq->tx_next_rs > txq->attr.nb_desc)
txq->tx_next_rs = txq->tx_rs_thresh - 1;
}
-
txq->tx_tail = i;
 
rte_wmb();
@@ -835,9 +834,138 @@ rnp_xmit_simple(void *_txq, struct rte_mbuf **tx_pkts, 
uint16_t nb_pkts)
return start;
 }
 
+static int
+rnp_rxq_bulk_alloc(struct rnp_rx_queue *rxq,
+  volatile struct rnp_rx_desc *rxbd,
+  struct rnp_rxsw_entry *rxe,
+  bool bulk_alloc)
+{
+   struct rte_eth_dev_data *data;
+   struct rte_mbuf *nmb = NULL;
+   uint16_t update_tail;
+
+   if (!bulk_alloc) {
+   data = rte_eth_devices[rxq->attr.port_id].data;
+   nmb = rte_mbuf_raw_alloc(rxq->mb_pool);
+   if (unlikely(!nmb)) {
+   data->rx_mbuf_alloc_failed++;
+   return -ENOMEM;
+   }
+   rxbd->d.pkt_addr = 0;
+   rxbd->d.cmd = 0;
+   rxe->mbuf = NULL;
+   rxe->mbuf = nmb;
+   rxbd->d.pkt_addr = rnp_get_dma_addr(&rxq->attr, nmb);
+   }
+   if (rxq->rxrearm_nb > rxq->rx_free_thresh) {
+   rxq->rxrearm_nb -= rxq->rx_free_thresh;
+   rxq->rxrearm_start += rxq->rx_free_thresh;
+   if (rxq->rxrearm_start >= rxq->attr.nb_desc)
+   rxq->rxrearm_start = 0;
+   update_tail = (uint16_t)((rxq->rxrearm_start == 0) ?
+   (rxq->attr.nb_desc - 1) : (rxq->rxrearm_start - 
1));
+   rte_io_wmb();
+   RNP_REG_WR(rxq->rx_tailreg, 0, update_tail);
+   }
+
+   return 0;
+}
+
+static __rte_always_inline uint16_t
+rnp_scattered_rx(void *rx_queue, struct rte_mbuf **rx_pkts,
+uint16_t nb_pkts)
+{
+   struct rnp_rx_queue *rxq = (struct rnp_rx_queue *)rx_queue;
+   volatile struct rnp_rx_desc *bd_ring = rxq->rx_bdr;
+   struct rte_mbuf *first_seg = rxq->pkt_first_seg;
+   struct rte_mbuf *last_seg = rxq->pkt_last_seg;
+   struct rnp_rxsw_entry *sw_ring = rxq->sw_ring;
+   volatile struct rnp_rx_desc *rxbd;
+   volatile struct rnp_rx_desc rxd;
+   struct rnp_rxsw_entry *rxe;
+   struct rte_mbuf *rxm;
+   uint16_t rx_pkt_len;
+   uint16_t nb_rx = 0;
+   uint16_t rx_status;
+   uint16_t rx_id;
+
+   if (unlikely(!rxq->rxq_started || !rxq->rx_link))
+   return 0;
+   rx_id = rxq->rx_tail;
+   while (nb_rx < nb_pkts) {
+   rxbd = &bd_ring[rx_id];
+   rx_status = rxbd->wb.qword1.cmd;
+   if (!(rx_status & rte_cpu_to_le_16(RNP_CMD_DD)))
+   break;
+   rte_atomic_thread_fence(rte_memory_order_acquire);
+   rxd = *rxbd;
+   rxe = &sw_ring[rx_id];
+   rxm = rxe->mbuf;
+   if (rnp_rxq_bulk_alloc(rxq, rxbd, rxe, false))
+   break;

[PATCH v15 20/29] net/rnp: add support xstats operation

2025-02-25 Thread Wenbo Cao
add support mac eth rx tx hw xstats.

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/features/rnp.ini|   1 +
 doc/guides/nics/rnp.rst |   2 +
 drivers/net/rnp/base/rnp_eth_regs.h |   4 +
 drivers/net/rnp/base/rnp_mac_regs.h |  80 ++
 drivers/net/rnp/rnp.h   |  44 ++
 drivers/net/rnp/rnp_ethdev.c| 226 +++-
 6 files changed, 352 insertions(+), 5 deletions(-)

diff --git a/doc/guides/nics/features/rnp.ini b/doc/guides/nics/features/rnp.ini
index 07caedba7a..14ff88fec1 100644
--- a/doc/guides/nics/features/rnp.ini
+++ b/doc/guides/nics/features/rnp.ini
@@ -9,6 +9,7 @@ Link status  = Y
 Link status event= Y
 Basic stats  = Y
 Stats per queue  = Y
+Extended stats   = Y
 Queue start/stop = Y
 Promiscuous mode = Y
 Allmulticast mode= Y
diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index f23e7ca789..aa39329af7 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -103,3 +103,5 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_link_get_nowait``
 * ``rte_eth_stats_get``
 * ``rte_eth_stats_reset``
+* ``rte_eth_xstats_get``
+* ``rte_eth_xstats_get_names``
diff --git a/drivers/net/rnp/base/rnp_eth_regs.h 
b/drivers/net/rnp/base/rnp_eth_regs.h
index 391688bd80..adac817df2 100644
--- a/drivers/net/rnp/base/rnp_eth_regs.h
+++ b/drivers/net/rnp/base/rnp_eth_regs.h
@@ -25,6 +25,10 @@
 #define RNP_RING_FC_THRESH(n)  _ETH_(0x8a00 + ((0x4) * (n)))
 /* ETH Statistic */
 #define RNP_ETH_RXTRANS_DROP   _ETH_(0x8904)
+#define RNP_ETH_RXSLAN_DROP_ETH_(0x8914)
+#define RNP_ETH_RXGLAN_DROP_ETH_(0x8918)
+#define RNP_ETH_RXIPH_E_DROP   _ETH_(0x891c)
+#define RNP_ETH_RXCKSUM_E_DROP _ETH_(0x8920)
 #define RNP_ETH_RXTRUNC_DROP   _ETH_(0x8928)
 /* Mac Host Filter  */
 #define RNP_MAC_FCTRL  _ETH_(0x9110)
diff --git a/drivers/net/rnp/base/rnp_mac_regs.h 
b/drivers/net/rnp/base/rnp_mac_regs.h
index 1ae880143d..4fd907a601 100644
--- a/drivers/net/rnp/base/rnp_mac_regs.h
+++ b/drivers/net/rnp/base/rnp_mac_regs.h
@@ -78,4 +78,84 @@
 /* PHY Link Status */
 #define RNP_MAC_PLSRTE_BIT32(17)
 
+/* Mac Manage Counts */
+#define RNP_MMC_CTRL   (0x0800)
+#define RNP_MMC_RSTONRDRTE_BIT32(2)
+/* Tx Good And Bad Bytes Base */
+#define RNP_MMC_TX_GBOCTGB (0x0814)
+/* Tx Good And Bad Frame Num Base */
+#define RNP_MMC_TX_GBFRMB  (0x081c)
+/* Tx Good Broadcast Frame Num Base */
+#define RNP_MMC_TX_BCASTB  (0x0824)
+/* Tx Good Multicast Frame Num Base */
+#define RNP_MMC_TX_MCASTB  (0x082c)
+/* Tx 64Bytes Frame Num */
+#define RNP_MMC_TX_64_BYTESB   (0x0834)
+#define RNP_MMC_TX_65TO127_BYTESB  (0x083c)
+#define RNP_MMC_TX_128TO255_BYTEB  (0x0844)
+#define RNP_MMC_TX_256TO511_BYTEB  (0x084c)
+#define RNP_MMC_TX_512TO1023_BYTEB (0x0854)
+#define RNP_MMC_TX_1024TOMAX_BYTEB (0x085c)
+/* Tx Good And Bad Unicast Frame Num Base */
+#define RNP_MMC_TX_GBUCASTB(0x0864)
+/* Tx Good And Bad Multicast Frame Num Base */
+#define RNP_MMC_TX_GBMCASTB(0x086c)
+/* Tx Good And Bad Broadcast Frame NUM Base */
+#define RNP_MMC_TX_GBBCASTB(0x0874)
+/* Tx Frame Underflow Error */
+#define RNP_MMC_TX_UNDRFLWB(0x087c)
+/* Tx Good Frame Bytes Base */
+#define RNP_MMC_TX_GBYTESB (0x0884)
+/* Tx Good Frame Num Base*/
+#define RNP_MMC_TX_GBRMB   (0x088c)
+/* Tx Good Pause Frame Num Base */
+#define RNP_MMC_TX_PAUSEB  (0x0894)
+/* Tx Good Vlan Frame Num Base */
+#define RNP_MMC_TX_VLANB   (0x089c)
+
+/* Rx Good And Bad Frames Num Base */
+#define RNP_MMC_RX_GBFRMB  (0x0900)
+/* Rx Good And Bad Frames Bytes Base */
+#define RNP_MMC_RX_GBOCTGB (0x0908)
+/* Rx Good Framse Bytes Base */
+#define RNP_MMC_RX_GOCTGB  (0x0910)
+/* Rx Good Broadcast Frames Num Base */
+#define RNP_MMC_RX_BCASTGB (0x0918)
+/* Rx Good Multicast Frames Num Base */
+#define RNP_MMC_RX_MCASTGB (0x0920)
+/* Rx Crc Error Frames Num Base */
+#define RNP_MMC_RX_CRCERB  (0x0928)
+/* Rx Less Than 64Byes with Crc Err Base*/
+#define RNP_MMC_RX_RUNTERB (0x0930)
+/* Receive Jumbo Frame Error */
+#define RNP_MMC_RX_JABBER_ERR  (0x0934)
+/* Shorter Than 64Bytes without Any Errora Base */
+#define RNP_MMC_RX_USIZEGB (0x0938)
+/* Len Oversize 9k */
+#define RNP_MMC_RX_OSIZEGB (0x093c)
+/* Rx 64Byes Frame Num Base */
+#define RNP_MMC_RX_64_BYTESB   (0x0940)
+/* Rx 65Bytes To 127Bytes Frame Num Base */
+#define RNP_MMC_RX_65TO127_BYTESB  (0x0948)
+/* Rx 128Bytes To 255Bytes Frame Num Base */
+#define RNP_MMC_RX_128TO255_BYTESB (0x0950)
+/* Rx 256Bytes To 511Bytes Frame Num Base */
+#define RNP_MMC_RX_256TO511_BYTESB (0x0958)
+/* Rx 512Bytes To 1023Bytes Frame Num Base */
+#define RNP_MMC_RX_512TO1203_BYTESB(0x0960)
+/* Rx Len Bigger Than 1024Bytes Base */
+#define 

[PATCH v15 19/29] net/rnp: add support basic stats operation

2025-02-25 Thread Wenbo Cao
add support hw-missed rx/tx packets bytes.

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/features/rnp.ini|   2 +
 doc/guides/nics/rnp.rst |   3 +
 drivers/net/rnp/base/rnp_eth_regs.h |   3 +
 drivers/net/rnp/rnp.h   |   8 ++
 drivers/net/rnp/rnp_ethdev.c| 136 
 drivers/net/rnp/rnp_rxtx.c  |   9 ++
 drivers/net/rnp/rnp_rxtx.h  |  10 ++
 7 files changed, 171 insertions(+)

diff --git a/doc/guides/nics/features/rnp.ini b/doc/guides/nics/features/rnp.ini
index 6453762745..07caedba7a 100644
--- a/doc/guides/nics/features/rnp.ini
+++ b/doc/guides/nics/features/rnp.ini
@@ -7,6 +7,8 @@
 Speed capabilities   = Y
 Link status  = Y
 Link status event= Y
+Basic stats  = Y
+Stats per queue  = Y
 Queue start/stop = Y
 Promiscuous mode = Y
 Allmulticast mode= Y
diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index b3d6d4d425..f23e7ca789 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -53,6 +53,7 @@ Features
 - MTU update
 - Jumbo frames
 - Scatter-Gather IO support
+- Port hardware statistic
 
 Prerequisites and Pre-conditions
 
@@ -100,3 +101,5 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_tx_queue_setup``
 * ``rte_eth_link_get``
 * ``rte_eth_link_get_nowait``
+* ``rte_eth_stats_get``
+* ``rte_eth_stats_reset``
diff --git a/drivers/net/rnp/base/rnp_eth_regs.h 
b/drivers/net/rnp/base/rnp_eth_regs.h
index 91a18dd42d..391688bd80 100644
--- a/drivers/net/rnp/base/rnp_eth_regs.h
+++ b/drivers/net/rnp/base/rnp_eth_regs.h
@@ -23,6 +23,9 @@
 #define RNP_RX_FC_ENABLE   _ETH_(0x8520)
 #define RNP_RING_FC_EN(n)  _ETH_(0x8524 + ((0x4) * ((n) / 32)))
 #define RNP_RING_FC_THRESH(n)  _ETH_(0x8a00 + ((0x4) * (n)))
+/* ETH Statistic */
+#define RNP_ETH_RXTRANS_DROP   _ETH_(0x8904)
+#define RNP_ETH_RXTRUNC_DROP   _ETH_(0x8928)
 /* Mac Host Filter  */
 #define RNP_MAC_FCTRL  _ETH_(0x9110)
 #define RNP_MAC_FCTRL_MPE  RTE_BIT32(8)  /* Multicast Promiscuous En */
diff --git a/drivers/net/rnp/rnp.h b/drivers/net/rnp/rnp.h
index 8323858043..2cda0ffe55 100644
--- a/drivers/net/rnp/rnp.h
+++ b/drivers/net/rnp/rnp.h
@@ -108,6 +108,11 @@ struct rnp_proc_priv {
const struct rnp_mbx_ops *mbx_ops;
 };
 
+struct rnp_hw_eth_stats {
+   uint64_t rx_trans_drop; /* rx eth to dma fifo full drop */
+   uint64_t rx_trunc_drop; /* rx mac to eth to host copy fifo full 
drop */
+};
+
 struct rnp_eth_port {
struct rnp_proc_priv *proc_priv;
struct rte_ether_addr mac_addr;
@@ -116,6 +121,9 @@ struct rnp_eth_port {
struct rnp_tx_queue *tx_queues[RNP_MAX_RX_QUEUE_NUM];
struct rnp_hw *hw;
 
+   struct rnp_hw_eth_stats eth_stats_old;
+   struct rnp_hw_eth_stats eth_stats;
+
struct rte_eth_rss_conf rss_conf;
uint16_t last_rx_num;
bool rxq_num_changed;
diff --git a/drivers/net/rnp/rnp_ethdev.c b/drivers/net/rnp/rnp_ethdev.c
index 898e2ae338..1d8549161f 100644
--- a/drivers/net/rnp/rnp_ethdev.c
+++ b/drivers/net/rnp/rnp_ethdev.c
@@ -803,6 +803,139 @@ rnp_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
return 0;
 }
 
+struct rte_rnp_xstats_name_off {
+   char name[RTE_ETH_XSTATS_NAME_SIZE];
+   uint32_t offset;
+   uint32_t reg_base;
+   bool hi_addr_en;
+};
+
+static const struct rte_rnp_xstats_name_off rte_rnp_rx_eth_stats_str[] = {
+   {"eth rx full drop", offsetof(struct rnp_hw_eth_stats,
+   rx_trans_drop), RNP_ETH_RXTRANS_DROP, false},
+   {"eth_rx_fifo_drop", offsetof(struct rnp_hw_eth_stats,
+   rx_trunc_drop), RNP_ETH_RXTRUNC_DROP, false},
+};
+#define RNP_NB_RX_HW_ETH_STATS (RTE_DIM(rte_rnp_rx_eth_stats_str))
+#define RNP_GET_E_HW_COUNT(stats, offset)\
+   ((uint64_t *)(((char *)stats) + (offset)))
+#define RNP_ADD_INCL_COUNT(stats, offset, val)   \
+   ((*(RNP_GET_E_HW_COUNT(stats, (offset += val)
+
+static inline void
+rnp_update_eth_stats_32bit(struct rnp_hw_eth_stats *new,
+  struct rnp_hw_eth_stats *old,
+  uint32_t offset, uint32_t val)
+{
+   uint64_t *last_count = NULL;
+
+   last_count = RNP_GET_E_HW_COUNT(old, offset);
+   if (val >= *last_count)
+   RNP_ADD_INCL_COUNT(new, offset, val - (*last_count));
+   else
+   RNP_ADD_INCL_COUNT(new, offset, val + UINT32_MAX);
+   *last_count = val;
+}
+
+static void rnp_get_eth_count(struct rnp_hw *hw,
+ uint16_t lane,
+ struct rnp_hw_eth_stats *new,
+ struct rnp_hw_eth_stats *old,
+ const struct rte_rnp_xstats_name_off *ptr)
+{
+   uint64_t val = 0;
+
+   if (ptr->reg_base) {
+   val = RNP_E_REG_RD(hw, ptr->reg_base + 0x40 * lane);
+   rnp_update_eth_stats_32bit(new

[PATCH v15 22/29] net/rnp: add supported packet types

2025-02-25 Thread Wenbo Cao
add support parse hw packet types result.

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/features/rnp.ini  |  1 +
 doc/guides/nics/rnp.rst   |  2 ++
 drivers/net/rnp/base/rnp_bdq_if.h |  4 +++
 drivers/net/rnp/rnp_ethdev.c  | 31 +
 drivers/net/rnp/rnp_rxtx.c| 45 +++
 5 files changed, 83 insertions(+)

diff --git a/doc/guides/nics/features/rnp.ini b/doc/guides/nics/features/rnp.ini
index 00b23b0fa2..eb1c27a3d3 100644
--- a/doc/guides/nics/features/rnp.ini
+++ b/doc/guides/nics/features/rnp.ini
@@ -7,6 +7,7 @@
 Speed capabilities   = Y
 Link status  = Y
 Link status event= Y
+Packet type parsing  = Y
 Basic stats  = Y
 Stats per queue  = Y
 Extended stats   = Y
diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index 24e90136e7..89bf97c2fb 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -55,6 +55,7 @@ Features
 - Jumbo frames
 - Scatter-Gather IO support
 - Port hardware statistic
+- Packet type parsing
 
 Prerequisites and Pre-conditions
 
@@ -95,6 +96,7 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_dev_default_mac_addr_set``
 * ``rte_eth_dev_mac_addr_add``
 * ``rte_eth_dev_mac_addr_remove``
+* ``rte_eth_dev_get_supported_ptypes``
 * ``rte_eth_promiscuous_disable``
 * ``rte_eth_promiscuous_enable``
 * ``rte_eth_allmulticast_enable``
diff --git a/drivers/net/rnp/base/rnp_bdq_if.h 
b/drivers/net/rnp/base/rnp_bdq_if.h
index 61a38323e5..a7d27bdebb 100644
--- a/drivers/net/rnp/base/rnp_bdq_if.h
+++ b/drivers/net/rnp/base/rnp_bdq_if.h
@@ -73,6 +73,7 @@ struct rnp_tx_desc {
 #define RNP_RX_L3TYPE_IPV4 (0x00UL << RNP_RX_L3TYPE_S)
 #define RNP_RX_L3TYPE_IPV6 (0x01UL << RNP_RX_L3TYPE_S)
 #define RNP_RX_L4TYPE_S(6)
+#define RNP_RX_L4TYPE_MASK RTE_GENMASK32(7, 6)
 #define RNP_RX_L4TYPE_TCP  (0x01UL << RNP_RX_L4TYPE_S)
 #define RNP_RX_L4TYPE_SCTP (0x02UL << RNP_RX_L4TYPE_S)
 #define RNP_RX_L4TYPE_UDP  (0x03UL << RNP_RX_L4TYPE_S)
@@ -83,9 +84,12 @@ struct rnp_tx_desc {
 #define RNP_RX_IN_L3_ERR   RTE_BIT32(11)
 #define RNP_RX_IN_L4_ERR   RTE_BIT32(12)
 #define RNP_RX_TUNNEL_TYPE_S   (13)
+#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)
+/* mark_data */
+#define RNP_RX_L3TYPE_VALIDRTE_BIT32(31)
 /* tx data cmd */
 #define RNP_TX_TSO_EN  RTE_BIT32(4)
 #define RNP_TX_L3TYPE_S(5)
diff --git a/drivers/net/rnp/rnp_ethdev.c b/drivers/net/rnp/rnp_ethdev.c
index 1db1ab7ce4..9b5ad90e85 100644
--- a/drivers/net/rnp/rnp_ethdev.c
+++ b/drivers/net/rnp/rnp_ethdev.c
@@ -1186,6 +1186,36 @@ rnp_dev_mac_addr_remove(struct rte_eth_dev *dev,
rnp_clear_macaddr(port, index);
 }
 
+static uint32_t *rnp_support_ptypes_get(void)
+{
+   static uint32_t ptypes[] = {
+   RTE_PTYPE_L2_ETHER,
+   RTE_PTYPE_L2_ETHER_TIMESYNC,
+   RTE_PTYPE_L3_IPV4_EXT_UNKNOWN,
+   RTE_PTYPE_L3_IPV6_EXT_UNKNOWN,
+   RTE_PTYPE_L4_TCP,
+   RTE_PTYPE_L4_UDP,
+   RTE_PTYPE_L4_SCTP,
+   RTE_PTYPE_TUNNEL_VXLAN,
+   RTE_PTYPE_TUNNEL_GRE,
+   RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN,
+   RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN,
+   RTE_PTYPE_INNER_L4_TCP,
+   RTE_PTYPE_INNER_L4_UDP,
+   RTE_PTYPE_INNER_L4_SCTP,
+   RTE_PTYPE_UNKNOWN,
+   };
+
+   return ptypes;
+}
+
+static const uint32_t *
+rnp_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused,
+size_t *no_of_elements __rte_unused)
+{
+   return rnp_support_ptypes_get();
+}
+
 /* Features supported by this driver */
 static const struct eth_dev_ops rnp_eth_dev_ops = {
.dev_configure= rnp_dev_configure,
@@ -1223,6 +1253,7 @@ 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,
+   .dev_supported_ptypes_get = rnp_dev_supported_ptypes_get,
 };
 
 static void
diff --git a/drivers/net/rnp/rnp_rxtx.c b/drivers/net/rnp/rnp_rxtx.c
index 63c0723f70..d5790ca16e 100644
--- a/drivers/net/rnp/rnp_rxtx.c
+++ b/drivers/net/rnp/rnp_rxtx.c
@@ -639,6 +639,49 @@ int rnp_rx_queue_start(struct rte_eth_dev *eth_dev, 
uint16_t qidx)
return 0;
 }
 
+static __rte_always_inline void
+rnp_dev_rx_parse(struct rnp_rx_queue *rxq __rte_unused,
+struct rte_mbuf *m,
+volatile struct rnp_rx_desc rxbd)
+{
+   uint32_t mark_data = rxbd.wb.qword0.mark_data;
+   uint16_t vlan_tci = rxbd.wb.qword1.vlan_tci;
+   uint32_t cmd = rxbd.wb.q

[PATCH v15 29/29] net/rnp: add multicast MAC filter operation

2025-02-25 Thread Wenbo Cao
add mac filter for single/multiple port.

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/features/rnp.ini|   1 +
 doc/guides/nics/rnp.rst |   1 +
 drivers/net/rnp/base/rnp_crc32.c|  18 -
 drivers/net/rnp/base/rnp_crc32.h|   1 +
 drivers/net/rnp/base/rnp_eth_regs.h |   3 +
 drivers/net/rnp/base/rnp_hw.h   |   4 +
 drivers/net/rnp/base/rnp_mac.c  | 121 +++-
 drivers/net/rnp/base/rnp_mac.h  |   2 +
 drivers/net/rnp/base/rnp_mac_regs.h |   2 +
 drivers/net/rnp/rnp.h   |   4 +
 drivers/net/rnp/rnp_ethdev.c|  26 ++
 11 files changed, 181 insertions(+), 2 deletions(-)

diff --git a/doc/guides/nics/features/rnp.ini b/doc/guides/nics/features/rnp.ini
index 48d250c86b..801a8de711 100644
--- a/doc/guides/nics/features/rnp.ini
+++ b/doc/guides/nics/features/rnp.ini
@@ -20,6 +20,7 @@ Promiscuous mode = Y
 Allmulticast mode= Y
 MTU update   = Y
 Unicast MAC filter   = Y
+Multicast MAC filter = Y
 VLAN filter  = Y
 VLAN offload = Y
 QinQ offload = P
diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index 8854b45220..537c6d4af4 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -99,6 +99,7 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_dev_default_mac_addr_set``
 * ``rte_eth_dev_mac_addr_add``
 * ``rte_eth_dev_mac_addr_remove``
+* ``rte_eth_dev_set_mc_addr_list``
 * ``rte_eth_dev_get_supported_ptypes``
 * ``rte_eth_dev_get_vlan_offload``
 * ``rte_eth_dev_set_vlan_offload``
diff --git a/drivers/net/rnp/base/rnp_crc32.c b/drivers/net/rnp/base/rnp_crc32.c
index c287b35759..9d03754a4b 100644
--- a/drivers/net/rnp/base/rnp_crc32.c
+++ b/drivers/net/rnp/base/rnp_crc32.c
@@ -5,6 +5,7 @@
 #include "rnp_osdep.h"
 #include "rnp_crc32.h"
 
+#define RNP_CRC32_POLY_LE 0xedb88320
 static inline int get_bitmask_order(u32 count)
 {
int order;
@@ -30,7 +31,22 @@ u32 rnp_vid_crc32_calc(u32 crc_init, u16 vid_le)
crc >>= 1;
data_byte >>= 1;
if (temp)
-   crc ^= 0xedb88320;
+   crc ^= RNP_CRC32_POLY_LE;
+   }
+
+   return crc;
+}
+
+u32 rnp_calc_crc32(u32 seed, u8 *mac, u32 len)
+{
+   u32 crc = seed;
+   u32 i;
+
+   while (len--) {
+   crc ^= *mac++;
+   for (i = 0; i < 8; i++)
+   crc = (crc >> 1) ^ ((crc & 1) ?
+   RNP_CRC32_POLY_LE : 0);
}
 
return crc;
diff --git a/drivers/net/rnp/base/rnp_crc32.h b/drivers/net/rnp/base/rnp_crc32.h
index e117dcfc2f..dc3026ddf8 100644
--- a/drivers/net/rnp/base/rnp_crc32.h
+++ b/drivers/net/rnp/base/rnp_crc32.h
@@ -6,5 +6,6 @@
 #define _RNP_CRC32_H_
 
 u32 rnp_vid_crc32_calc(u32 crc_init, u16 vid_le);
+u32 rnp_calc_crc32(u32 seed, u8 *mac, u32 len);
 
 #endif /* _RNP_CRC32_H_ */
diff --git a/drivers/net/rnp/base/rnp_eth_regs.h 
b/drivers/net/rnp/base/rnp_eth_regs.h
index 5c3f7f906c..1378328add 100644
--- a/drivers/net/rnp/base/rnp_eth_regs.h
+++ b/drivers/net/rnp/base/rnp_eth_regs.h
@@ -57,6 +57,8 @@
 #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)
+#define RNP_HTA_BIT_SHIFT  (5)
+#define RNP_HTA_BIT_MASK   ((1 << RNP_HTA_BIT_SHIFT) - 1)
 /* vlan strip ctrl */
 #define RNP_VLAN_Q_STRIP_CTRL(n)   _ETH_(0x8040 + 0x4 * ((n) / 32))
 /* vlan filter ctrl */
@@ -87,5 +89,6 @@
 #define RNP_RAL_BASE_ADDR(n)   _ETH_(0xA000 + (0x04 * (n)))
 #define RNP_RAH_BASE_ADDR(n)   _ETH_(0xA400 + (0x04 * (n)))
 #define RNP_MAC_FILTER_EN  RTE_BIT32(31)
+#define RNP_MC_HASH_TABLE(n)   _ETH_(0xAC00 + ((0x04) * ((n
 
 #endif /* _RNP_ETH_REGS_H */
diff --git a/drivers/net/rnp/base/rnp_hw.h b/drivers/net/rnp/base/rnp_hw.h
index 8cf57db185..8dc29b6873 100644
--- a/drivers/net/rnp/base/rnp_hw.h
+++ b/drivers/net/rnp/base/rnp_hw.h
@@ -74,6 +74,10 @@ struct rnp_mac_ops {
/* Receive Address Filter table */
int (*set_rafb)(struct rnp_eth_port *port, const u8 *mac, u32 index);
int (*clear_rafb)(struct rnp_eth_port *port, u32 index);
+   /* update multicast address table */
+   int (*update_mta)(struct rnp_eth_port *port, u8 *mc_addr);
+   /* clear all multicast hash table */
+   int (*clear_mta)(struct rnp_eth_port *port, bool en);
/* receive vlan filter */
int (*vlan_f_en)(struct rnp_eth_port *port, bool en);
int (*update_vlan)(struct rnp_eth_port *port, u16 vid, bool en);
diff --git a/drivers/net/rnp/base/rnp_mac.c b/drivers/net/rnp/base/rnp_mac.c
index b723c29ac5..96750e1cde 100644
--- a/drivers/net/rnp/base/rnp_mac.c
+++ b/drivers/net/rnp/base/rnp_mac.c
@@ -46,7 +46,7 @@ rnp_update_mpfm_indep(struct rnp_eth_port *port, u32 mode, 
bool en)
reg |= disable;
}
/* disable common filter when indep mode */
- 

[PATCH v15 28/29] net/rnp: support Rx/Tx burst mode info

2025-02-25 Thread Wenbo Cao
add platform method for get rx/tx burst function select
by upload func name.

Signed-off-by: Wenbo Cao 
---
 drivers/net/rnp/rnp_ethdev.c |  2 ++
 drivers/net/rnp/rnp_rxtx.c   | 58 
 drivers/net/rnp/rnp_rxtx.h   |  6 
 3 files changed, 66 insertions(+)

diff --git a/drivers/net/rnp/rnp_ethdev.c b/drivers/net/rnp/rnp_ethdev.c
index 92063f3c40..30964efa55 100644
--- a/drivers/net/rnp/rnp_ethdev.c
+++ b/drivers/net/rnp/rnp_ethdev.c
@@ -1481,6 +1481,8 @@ static const struct eth_dev_ops rnp_eth_dev_ops = {
.tx_queue_release = rnp_dev_tx_queue_release,
.rxq_info_get = rnp_rx_queue_info_get,
.txq_info_get = rnp_tx_queue_info_get,
+   .rx_burst_mode_get= rnp_rx_burst_mode_get,
+   .tx_burst_mode_get= rnp_tx_burst_mode_get,
/* rss impl */
.reta_update  = rnp_dev_rss_reta_update,
.reta_query   = rnp_dev_rss_reta_query,
diff --git a/drivers/net/rnp/rnp_rxtx.c b/drivers/net/rnp/rnp_rxtx.c
index bcd340ec35..bd2ea0a002 100644
--- a/drivers/net/rnp/rnp_rxtx.c
+++ b/drivers/net/rnp/rnp_rxtx.c
@@ -1764,3 +1764,61 @@ rnp_tx_queue_info_get(struct rte_eth_dev *dev, uint16_t 
queue_id,
qinfo->conf.tx_thresh.hthresh = txq->pburst;
qinfo->conf.offloads = txq->tx_offloads;
 }
+
+static const struct {
+   eth_rx_burst_t pkt_burst;
+   const char *info;
+} rnp_rx_burst_infos[] = {
+   { rnp_scattered_rx, "Scalar Scattered" },
+   { rnp_recv_pkts,"Scalar" },
+};
+
+static const struct {
+   eth_tx_burst_t pkt_burst;
+   const char *info;
+} rnp_tx_burst_infos[] = {
+   { rnp_xmit_simple,  "Scalar Simple" },
+   { rnp_multiseg_xmit_pkts,   "Scalar" },
+};
+
+int
+rnp_rx_burst_mode_get(struct rte_eth_dev *dev,
+ __rte_unused uint16_t queue_id,
+ struct rte_eth_burst_mode *mode)
+{
+   eth_rx_burst_t pkt_burst = dev->rx_pkt_burst;
+   int ret = -EINVAL;
+   unsigned int i;
+
+   for (i = 0; i < RTE_DIM(rnp_rx_burst_infos); ++i) {
+   if (pkt_burst == rnp_rx_burst_infos[i].pkt_burst) {
+   snprintf(mode->info, sizeof(mode->info), "%s",
+   rnp_rx_burst_infos[i].info);
+   ret = 0;
+   break;
+   }
+   }
+
+   return ret;
+}
+
+int
+rnp_tx_burst_mode_get(struct rte_eth_dev *dev,
+ __rte_unused uint16_t queue_id,
+ struct rte_eth_burst_mode *mode)
+{
+   eth_tx_burst_t pkt_burst = dev->tx_pkt_burst;
+   int ret = -EINVAL;
+   unsigned int i;
+
+   for (i = 0; i < RTE_DIM(rnp_tx_burst_infos); ++i) {
+   if (pkt_burst == rnp_tx_burst_infos[i].pkt_burst) {
+   snprintf(mode->info, sizeof(mode->info), "%s",
+   rnp_tx_burst_infos[i].info);
+   ret = 0;
+   break;
+   }
+   }
+
+   return ret;
+}
diff --git a/drivers/net/rnp/rnp_rxtx.h b/drivers/net/rnp/rnp_rxtx.h
index dc4a8ea9dd..8639f0892d 100644
--- a/drivers/net/rnp/rnp_rxtx.h
+++ b/drivers/net/rnp/rnp_rxtx.h
@@ -152,5 +152,11 @@ void rnp_rx_queue_info_get(struct rte_eth_dev *dev, 
uint16_t queue_id,
   struct rte_eth_rxq_info *qinfo);
 void rnp_tx_queue_info_get(struct rte_eth_dev *dev, uint16_t queue_id,
   struct rte_eth_txq_info *qinfo);
+int rnp_rx_burst_mode_get(struct rte_eth_dev *dev,
+ __rte_unused uint16_t queue_id,
+ struct rte_eth_burst_mode *mode);
+int rnp_tx_burst_mode_get(struct rte_eth_dev *dev,
+ __rte_unused uint16_t queue_id,
+ struct rte_eth_burst_mode *mode);
 
 #endif /* _RNP_RXTX_H_ */
-- 
2.25.1



[PATCH v15 10/29] net/rnp: add support device start stop operations

2025-02-25 Thread Wenbo Cao
add basic support for device to start/stop function.

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/rnp.rst |   2 +
 drivers/net/rnp/base/rnp_common.c   |  22 +++
 drivers/net/rnp/base/rnp_common.h   |   1 +
 drivers/net/rnp/base/rnp_dma_regs.h |  10 +
 drivers/net/rnp/base/rnp_eth_regs.h |   5 +
 drivers/net/rnp/base/rnp_hw.h   |   1 +
 drivers/net/rnp/base/rnp_mac.h  |  14 ++
 drivers/net/rnp/base/rnp_mac_regs.h |  42 
 drivers/net/rnp/rnp.h   |   3 +
 drivers/net/rnp/rnp_ethdev.c| 284 +++-
 10 files changed, 383 insertions(+), 1 deletion(-)

diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index c3547c38b6..66ff7f4090 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -75,6 +75,8 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_dev_rx_queue_stop``
 * ``rte_eth_dev_tx_queue_start``
 * ``rte_eth_dev_tx_queue_stop``
+* ``rte_eth_dev_start``
+* ``rte_eth_dev_stop``
 * ``rte_eth_promiscuous_disable``
 * ``rte_eth_promiscuous_enable``
 * ``rte_eth_allmulticast_enable``
diff --git a/drivers/net/rnp/base/rnp_common.c 
b/drivers/net/rnp/base/rnp_common.c
index 58de3bde03..2dacb5113e 100644
--- a/drivers/net/rnp/base/rnp_common.c
+++ b/drivers/net/rnp/base/rnp_common.c
@@ -79,3 +79,25 @@ rnp_setup_common_ops(struct rnp_hw *hw)
 
return 0;
 }
+
+int rnp_clock_valid_check(struct rnp_hw *hw, u16 nr_lane)
+{
+   uint16_t timeout = 0;
+
+   do {
+   RNP_E_REG_WR(hw, RNP_RSS_REDIR_TB(nr_lane, 0), 0x7f);
+   udelay(10);
+   timeout++;
+   if (timeout >= 1000)
+   break;
+   } while (RNP_E_REG_RD(hw, RNP_RSS_REDIR_TB(nr_lane, 0)) != 0x7f);
+
+   if (timeout >= 1000) {
+   RNP_PMD_ERR("ethernet[%d] eth reg can't be write", nr_lane);
+   return -EPERM;
+   }
+   /* clear the dirty value */
+   RNP_E_REG_WR(hw, RNP_RSS_REDIR_TB(nr_lane, 0), 0);
+
+   return 0;
+}
diff --git a/drivers/net/rnp/base/rnp_common.h 
b/drivers/net/rnp/base/rnp_common.h
index cf1996a675..91e2996398 100644
--- a/drivers/net/rnp/base/rnp_common.h
+++ b/drivers/net/rnp/base/rnp_common.h
@@ -12,5 +12,6 @@
 ((macaddr[4] << 8)) | (macaddr[5]))
 int rnp_init_hw(struct rnp_hw *hw);
 int rnp_setup_common_ops(struct rnp_hw *hw);
+int rnp_clock_valid_check(struct rnp_hw *hw, u16 nr_lane);
 
 #endif /* _RNP_COMMON_H_ */
diff --git a/drivers/net/rnp/base/rnp_dma_regs.h 
b/drivers/net/rnp/base/rnp_dma_regs.h
index 7c17741c55..8bc6fe581a 100644
--- a/drivers/net/rnp/base/rnp_dma_regs.h
+++ b/drivers/net/rnp/base/rnp_dma_regs.h
@@ -6,9 +6,19 @@
 #define _RNP_DMA_REGS_H_
 
 #define RNP_DMA_VERSION(0)
+#define RNP_DMA_CTRL   (0x4)
+/* 1bit <-> 16 bytes dma addr size */
+#define RNP_DMA_SCATTER_MEM_MASK   RTE_GENMASK32(31, 16)
+#define RNP_DMA_SCATTER_MEN_S  (16)
+#define RNP_DMA_RX_MEM_PAD_EN  RTE_BIT32(8)
+#define RTE_DMA_VEB_BYPASS RTE_BIT32(4)
+#define RNP_DMA_TXRX_LOOP  RTE_BIT32(1)
+#define RNP_DMA_TXMRX_LOOP RTE_BIT32(0)
+
 #define RNP_DMA_HW_EN  (0x10)
 #define RNP_DMA_EN_ALL (0b)
 #define RNP_DMA_HW_STATE   (0x14)
+
 /* --- queue register --- */
 /* queue enable */
 #define RNP_RXQ_START(qid) _RING_(0x0010 + 0x100 * (qid))
diff --git a/drivers/net/rnp/base/rnp_eth_regs.h 
b/drivers/net/rnp/base/rnp_eth_regs.h
index 10e3d954b8..60766d2035 100644
--- a/drivers/net/rnp/base/rnp_eth_regs.h
+++ b/drivers/net/rnp/base/rnp_eth_regs.h
@@ -10,6 +10,9 @@
 #define RNP_E_FILTER_EN_ETH_(0x801c)
 #define RNP_E_REDIR_EN _ETH_(0x8030)
 
+#define RNP_RX_ETH_F_CTRL(n)   _ETH_(0x8070 + ((n) * 0x8))
+#define RNP_RX_ETH_F_OFF   (0x7ff)
+#define RNP_RX_ETH_F_ON(0x270)
 /* rx queue flow ctrl */
 #define RNP_RX_FC_ENABLE   _ETH_(0x8520)
 #define RNP_RING_FC_EN(n)  _ETH_(0x8524 + ((0x4) * ((n) / 32)))
@@ -28,6 +31,8 @@
 #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)
+/* rss function ctrl */
+#define RNP_RSS_REDIR_TB(n, id) _ETH_(0xe000 + ((n) * 0x200) + ((id) * 0x4))
 
 #define RNP_TC_PORT_OFFSET(lane)   _ETH_(0xe840 + 0x04 * (lane))
 
diff --git a/drivers/net/rnp/base/rnp_hw.h b/drivers/net/rnp/base/rnp_hw.h
index 9541b4e9be..548e3a4468 100644
--- a/drivers/net/rnp/base/rnp_hw.h
+++ b/drivers/net/rnp/base/rnp_hw.h
@@ -120,6 +120,7 @@ struct rnp_hw {
bool lane_is_sgmii[RNP_MAX_PORT_OF_PF];
struct rnp_mbx_info mbx;
struct rnp_fw_info fw_info;
+   u16 min_dma_size;
 
spinlock_t rxq_reset_lock; /* reset op isn't thread safe */
spinlock_t txq_reset_lock; /* reset op isn't thread safe */
diff --git a/drivers/net/rnp/base/rnp_mac.h b/drivers/net/rnp/base/rnp_mac.h
index 57cbd9e3d5..1dac903396 100644
--- a/drivers/

[PATCH v15 16/29] net/rnp: add MTU set operation

2025-02-25 Thread Wenbo Cao
add mtu update limit for multiple port mode.
multiple mode just used the max-mtu of ports
to limit receive.

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/features/rnp.ini|   1 +
 doc/guides/nics/rnp.rst |   1 +
 drivers/net/rnp/base/rnp_eth_regs.h |   3 +
 drivers/net/rnp/rnp.h   |   3 +
 drivers/net/rnp/rnp_ethdev.c| 146 +++-
 5 files changed, 153 insertions(+), 1 deletion(-)

diff --git a/doc/guides/nics/features/rnp.ini b/doc/guides/nics/features/rnp.ini
index 695b9c0dba..6d13370e8f 100644
--- a/doc/guides/nics/features/rnp.ini
+++ b/doc/guides/nics/features/rnp.ini
@@ -10,6 +10,7 @@ Link status event= Y
 Queue start/stop = Y
 Promiscuous mode = Y
 Allmulticast mode= Y
+MTU update   = Y
 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 f5a79492bb..5b58a6941c 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -50,6 +50,7 @@ Features
   Inner RSS is only support for vxlan/nvgre
 - Promiscuous mode
 - Link state information
+- MTU update
 
 Prerequisites and Pre-conditions
 
diff --git a/drivers/net/rnp/base/rnp_eth_regs.h 
b/drivers/net/rnp/base/rnp_eth_regs.h
index c74886e70c..91a18dd42d 100644
--- a/drivers/net/rnp/base/rnp_eth_regs.h
+++ b/drivers/net/rnp/base/rnp_eth_regs.h
@@ -16,6 +16,9 @@
 #define RNP_RX_ETH_F_CTRL(n)   _ETH_(0x8070 + ((n) * 0x8))
 #define RNP_RX_ETH_F_OFF   (0x7ff)
 #define RNP_RX_ETH_F_ON(0x270)
+/* max/min pkts length receive limit ctrl */
+#define RNP_MIN_FRAME_CTRL _ETH_(0x80f0)
+#define RNP_MAX_FRAME_CTRL _ETH_(0x80f4)
 /* rx queue flow ctrl */
 #define RNP_RX_FC_ENABLE   _ETH_(0x8520)
 #define RNP_RING_FC_EN(n)  _ETH_(0x8524 + ((0x4) * ((n) / 32)))
diff --git a/drivers/net/rnp/rnp.h b/drivers/net/rnp/rnp.h
index e5f3ac32bf..8323858043 100644
--- a/drivers/net/rnp/rnp.h
+++ b/drivers/net/rnp/rnp.h
@@ -123,6 +123,9 @@ struct rnp_eth_port {
bool hw_rss_en;
uint32_t indirtbl[RNP_RSS_INDIR_SIZE];
 
+   uint16_t cur_mtu;
+   bool jumbo_en;
+
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 8375cecac2..aa5e221bce 100644
--- a/drivers/net/rnp/rnp_ethdev.c
+++ b/drivers/net/rnp/rnp_ethdev.c
@@ -21,6 +21,7 @@
 #include "rnp_rss.h"
 #include "rnp_link.h"
 
+static int rnp_mtu_set(struct rte_eth_dev *dev, uint16_t mtu);
 static struct rte_eth_dev *
 rnp_alloc_eth_port(struct rte_pci_device *pci, char *name)
 {
@@ -142,6 +143,13 @@ static void rnp_mac_rx_enable(struct rte_eth_dev *dev)
mac_cfg = RNP_MAC_REG_RD(hw, lane, RNP_MAC_RX_CFG);
mac_cfg |= RNP_MAC_RE;
 
+   if (port->jumbo_en) {
+   mac_cfg |= RNP_MAC_JE;
+   mac_cfg |= RNP_MAC_GPSLCE | RNP_MAC_WD;
+   } else {
+   mac_cfg &= ~RNP_MAC_JE;
+   mac_cfg &= ~RNP_MAC_WD;
+   }
mac_cfg &= ~RNP_MAC_GPSL_MASK;
mac_cfg |= (RNP_MAC_MAX_GPSL << RNP_MAC_CPSL_SHIFT);
RNP_MAC_REG_WR(hw, lane, RNP_MAC_RX_CFG, mac_cfg);
@@ -211,6 +219,7 @@ rnp_rx_scattered_setup(struct rte_eth_dev *dev)
 {
uint16_t max_pkt_size =
dev->data->dev_conf.rxmode.mtu + RNP_ETH_OVERHEAD;
+   struct rte_eth_conf *dev_conf = &dev->data->dev_conf;
struct rnp_eth_port *port = RNP_DEV_TO_PORT(dev);
struct rnp_hw *hw = port->hw;
struct rnp_rx_queue *rxq;
@@ -236,6 +245,12 @@ rnp_rx_scattered_setup(struct rte_eth_dev *dev)
return -ENOTSUP;
}
dma_buf_size = hw->min_dma_size;
+   if (dev_conf->rxmode.offloads & RTE_ETH_RX_OFFLOAD_SCATTER ||
+   max_pkt_size > dma_buf_size ||
+   dev->data->mtu + RNP_ETH_OVERHEAD > dma_buf_size)
+   dev->data->scattered_rx = 1;
+   else
+   dev->data->scattered_rx = 0;
/* Setup max dma scatter engine split size */
if (max_pkt_size == dma_buf_size)
dma_buf_size += (dma_buf_size % 16);
@@ -296,6 +311,7 @@ static int rnp_dev_start(struct rte_eth_dev *eth_dev)
 {
struct rnp_eth_port *port = RNP_DEV_TO_PORT(eth_dev);
struct rte_eth_dev_data *data = eth_dev->data;
+   uint16_t max_rx_pkt_len = eth_dev->data->mtu;
bool lsc = data->dev_conf.intr_conf.lsc;
struct rnp_hw *hw = port->hw;
uint16_t lane = 0;
@@ -316,6 +332,9 @@ static int rnp_dev_start(struct rte_eth_dev *eth_dev)
if (ret)
return ret;
ret = rnp_rx_scattered_setup(eth_dev);
+   if (ret)
+   return ret;
+   ret = rnp_mtu_set(eth_dev, max_rx_pkt_len);
if (ret)
return ret;
ret = rnp_enable_all_tx_queue(eth_dev);
@@ -655,6 +674,131 @@ static int rnp_allmulticast_disable(struct rte_eth_dev 
*eth_dev)
  

[PATCH v15 08/29] net/rnp: add queue setup and release operations

2025-02-25 Thread Wenbo Cao
support tx/rx queue setup and release add hw bd
queue reset,sw queue reset.

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/rnp.rst |   3 +
 drivers/net/rnp/base/meson.build|   1 +
 drivers/net/rnp/base/rnp_bdq_if.c   | 398 +++
 drivers/net/rnp/base/rnp_bdq_if.h   | 149 +
 drivers/net/rnp/base/rnp_common.h   |   4 +
 drivers/net/rnp/base/rnp_dma_regs.h |  45 +++
 drivers/net/rnp/base/rnp_eth_regs.h |   4 +
 drivers/net/rnp/base/rnp_hw.h   |   4 +
 drivers/net/rnp/base/rnp_osdep.h|  12 +
 drivers/net/rnp/meson.build |   1 +
 drivers/net/rnp/rnp.h   |   2 +
 drivers/net/rnp/rnp_ethdev.c|  38 ++-
 drivers/net/rnp/rnp_rxtx.c  | 471 
 drivers/net/rnp/rnp_rxtx.h  | 123 
 14 files changed, 1254 insertions(+), 1 deletion(-)
 create mode 100644 drivers/net/rnp/base/rnp_bdq_if.c
 create mode 100644 drivers/net/rnp/base/rnp_bdq_if.h
 create mode 100644 drivers/net/rnp/rnp_rxtx.c
 create mode 100644 drivers/net/rnp/rnp_rxtx.h

diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index 5f6e22f287..99b96e9b8e 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -44,6 +44,7 @@ N10 has two functions, each function support muiple ports(1 
to 8),which not same
 Features
 
 
+- Multiple queues for TX and RX
 - Promiscuous mode
 
 Prerequisites and Pre-conditions
@@ -76,3 +77,5 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_allmulticast_disable``
 * ``rte_eth_promiscuous_get``
 * ``rte_eth_allmulticast_get``
+* ``rte_eth_rx_queue_setup``
+* ``rte_eth_tx_queue_setup``
diff --git a/drivers/net/rnp/base/meson.build b/drivers/net/rnp/base/meson.build
index 10026e0425..ba49accdec 100644
--- a/drivers/net/rnp/base/meson.build
+++ b/drivers/net/rnp/base/meson.build
@@ -7,6 +7,7 @@ sources = [
 'rnp_mbx_fw.c',
 'rnp_common.c',
 'rnp_mac.c',
+'rnp_bdq_if.c',
 ]
 
 c_args = cflags
diff --git a/drivers/net/rnp/base/rnp_bdq_if.c 
b/drivers/net/rnp/base/rnp_bdq_if.c
new file mode 100644
index 00..471c19efda
--- /dev/null
+++ b/drivers/net/rnp/base/rnp_bdq_if.c
@@ -0,0 +1,398 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2023 Mucse IC Design Ltd.
+ */
+
+#include "rnp_osdep.h"
+
+#include "../rnp.h"
+#include "rnp_dma_regs.h"
+#include "rnp_eth_regs.h"
+#include "rnp_bdq_if.h"
+#include "rnp_common.h"
+#include "../rnp_rxtx.h"
+
+static void
+rnp_read_mac_veb(struct rnp_hw *hw,
+ u16 nr_lane,
+ u16 vf_id,
+ struct rnp_veb_cfg *cfg)
+{
+   cfg->mac_lo = RNP_E_REG_RD(hw, RNP_VEB_MAC_LO(nr_lane, vf_id));
+   cfg->mac_hi = RNP_E_REG_RD(hw, RNP_VEB_MAC_HI(nr_lane, vf_id));
+   cfg->ring = RNP_E_REG_RD(hw, RNP_VEB_VF_RING(nr_lane, vf_id));
+}
+
+static void
+rnp_update_mac_veb(struct rnp_hw *hw,
+  u16 nr_lane,
+  u16 vf_id,
+  struct rnp_veb_cfg *cfg)
+{
+   u32 reg = cfg->ring;
+   u16 idx = 0;
+
+   idx = nr_lane;
+   wmb();
+   RNP_E_REG_WR(hw, RNP_VEB_MAC_LO(idx, vf_id), cfg->mac_lo);
+   RNP_E_REG_WR(hw, RNP_VEB_MAC_HI(idx, vf_id), cfg->mac_hi);
+   reg |= ((RNP_VEB_SWITCH_VF_EN | vf_id) << 8);
+   RNP_E_REG_WR(hw, RNP_VEB_VF_RING(idx, vf_id), reg);
+}
+
+void
+rnp_rxq_flow_disable(struct rnp_hw *hw,
+u16 hw_idx)
+{
+   u32 fc_ctrl;
+
+   spin_lock(&hw->rxq_reset_lock);
+   fc_ctrl = RNP_E_REG_RD(hw, RNP_RING_FC_EN(hw_idx));
+   wmb();
+   RNP_E_REG_WR(hw, RNP_RING_FC_THRESH(hw_idx), 0);
+   fc_ctrl |= 1 << (hw_idx % 32);
+   wmb();
+   RNP_E_REG_WR(hw, RNP_RING_FC_EN(hw_idx), fc_ctrl);
+}
+
+void
+rnp_rxq_flow_enable(struct rnp_hw *hw,
+   u16 hw_idx)
+{
+   u32 fc_ctrl;
+
+
+   fc_ctrl = RNP_E_REG_RD(hw, RNP_RING_FC_EN(hw_idx));
+   fc_ctrl &= ~(1 << (hw_idx % 32));
+   wmb();
+   RNP_E_REG_WR(hw, RNP_RING_FC_EN(hw_idx), fc_ctrl);
+
+   spin_unlock(&hw->rxq_reset_lock);
+}
+
+#define RNP_RXQ_RESET_PKT_LEN  (64)
+
+static void
+rnp_reset_xmit(struct rnp_tx_queue *txq, u64 pkt_addr)
+{
+   volatile struct rnp_tx_desc *txbd;
+   struct rnp_txsw_entry *tx_entry;
+   u16 timeout = 0;
+   u16 tx_id;
+
+   tx_id = txq->tx_tail;
+   txbd = &txq->tx_bdr[tx_id];
+   tx_entry = &txq->sw_ring[tx_id];
+   memset(tx_entry, 0, sizeof(*tx_entry));
+
+   txbd->d.addr = pkt_addr;
+   txbd->d.blen = RNP_RXQ_RESET_PKT_LEN;
+   wmb();
+   txbd->d.cmd = cpu_to_le16(RNP_CMD_EOP | RNP_CMD_RS);
+   tx_id = (tx_id + 1) & txq->attr.nb_desc_mask;
+   wmb();
+   RNP_REG_WR(txq->tx_tailreg, 0, tx_id);
+   do {
+   if (txbd->d.cmd & RNP_CMD_DD)
+   break;
+   if (timeout == 1000)
+   RNP_PMD_ERR("rx queue %u reset send pkt is hang",
+   txq->

[PATCH v15 14/29] net/rnp: add Rx burst simple support

2025-02-25 Thread Wenbo Cao
add only support simple recv pkts.

Signed-off-by: Wenbo Cao 
---
 drivers/net/rnp/rnp_ethdev.c |   7 ++
 drivers/net/rnp/rnp_rxtx.c   | 130 +++
 drivers/net/rnp/rnp_rxtx.h   |   5 ++
 3 files changed, 142 insertions(+)

diff --git a/drivers/net/rnp/rnp_ethdev.c b/drivers/net/rnp/rnp_ethdev.c
index a6d117c88c..da499cf9d1 100644
--- a/drivers/net/rnp/rnp_ethdev.c
+++ b/drivers/net/rnp/rnp_ethdev.c
@@ -335,6 +335,8 @@ static int rnp_dev_start(struct rte_eth_dev *eth_dev)
goto rxq_start_failed;
/* enable eth rx flow */
RNP_RX_ETH_ENABLE(hw, lane);
+   rnp_rx_func_select(eth_dev);
+   rnp_tx_func_select(eth_dev);
port->port_stopped = 0;
 
return 0;
@@ -595,6 +597,11 @@ static int rnp_dev_infos_get(struct rte_eth_dev *eth_dev,
/* default port configure */
dev_info->default_rxconf = (struct rte_eth_rxconf) {
.rx_drop_en = 0,
+   .rx_thresh = {
+   .pthresh = RNP_RX_DESC_FETCH_TH,
+   .hthresh = RNP_RX_DESC_FETCH_BURST,
+   },
+   .rx_free_thresh = RNP_DEFAULT_RX_FREE_THRESH,
.offloads = 0,
};
 
diff --git a/drivers/net/rnp/rnp_rxtx.c b/drivers/net/rnp/rnp_rxtx.c
index e65bc06d36..a742646c7e 100644
--- a/drivers/net/rnp/rnp_rxtx.c
+++ b/drivers/net/rnp/rnp_rxtx.c
@@ -636,3 +636,133 @@ int rnp_rx_queue_start(struct rte_eth_dev *eth_dev, 
uint16_t qidx)
 
return 0;
 }
+
+#define RNP_CACHE_FETCH_RX (4)
+static __rte_always_inline int
+rnp_refill_rx_ring(struct rnp_rx_queue *rxq)
+{
+   volatile struct rnp_rx_desc *rxbd;
+   struct rnp_rxsw_entry *rx_swbd;
+   struct rte_eth_dev_data *data;
+   struct rte_mbuf *mb;
+   uint16_t j, i;
+   uint16_t rx_id;
+   int ret;
+
+   rxbd = rxq->rx_bdr + rxq->rxrearm_start;
+   rx_swbd = &rxq->sw_ring[rxq->rxrearm_start];
+   ret = rte_mempool_get_bulk(rxq->mb_pool, (void *)rx_swbd,
+   rxq->rx_free_thresh);
+   data = rte_eth_devices[rxq->attr.port_id].data;
+   if (unlikely(ret != 0)) {
+   if (rxq->rxrearm_nb + rxq->rx_free_thresh >= rxq->attr.nb_desc) 
{
+   for (i = 0; i < RNP_CACHE_FETCH_RX; i++) {
+   rx_swbd[i].mbuf = &rxq->fake_mbuf;
+   rxbd[i].d.pkt_addr = 0;
+   rxbd[i].d.cmd = 0;
+   }
+   }
+   data->rx_mbuf_alloc_failed += rxq->rx_free_thresh;
+   return 0;
+   }
+   for (j = 0; j < rxq->rx_free_thresh; ++j) {
+   mb = rx_swbd[j].mbuf;
+   rte_mbuf_refcnt_set(mb, 1);
+   mb->data_off = RTE_PKTMBUF_HEADROOM;
+   mb->port = rxq->attr.port_id;
+
+   rxbd[j].d.pkt_addr = rnp_get_dma_addr(&rxq->attr, mb);
+   rxbd[j].d.cmd = 0;
+   }
+   rxq->rxrearm_start += rxq->rx_free_thresh;
+   if (rxq->rxrearm_start >= rxq->attr.nb_desc - 1)
+   rxq->rxrearm_start = 0;
+   rxq->rxrearm_nb -= rxq->rx_free_thresh;
+
+   rx_id = (uint16_t)((rxq->rxrearm_start == 0) ?
+   (rxq->attr.nb_desc - 1) : (rxq->rxrearm_start - 1));
+   rte_wmb();
+   RNP_REG_WR(rxq->rx_tailreg, 0, rx_id);
+
+   return j;
+}
+
+static __rte_always_inline uint16_t
+rnp_recv_pkts(void *_rxq, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
+{
+   struct rnp_rx_queue *rxq = (struct rnp_rx_queue *)_rxq;
+   struct rnp_rxsw_entry *rx_swbd;
+   uint32_t state_cmd[RNP_CACHE_FETCH_RX];
+   uint32_t pkt_len[RNP_CACHE_FETCH_RX] = {0};
+   volatile struct rnp_rx_desc *rxbd;
+   struct rte_mbuf *nmb;
+   int nb_dd, nb_rx = 0;
+   int i, j;
+
+   if (unlikely(!rxq->rxq_started || !rxq->rx_link))
+   return 0;
+   nb_pkts = RTE_ALIGN_FLOOR(nb_pkts, RNP_CACHE_FETCH_RX);
+   rxbd = &rxq->rx_bdr[rxq->rx_tail];
+   rte_prefetch0(rxbd);
+   if (rxq->rxrearm_nb > rxq->rx_free_thresh)
+   rnp_refill_rx_ring(rxq);
+
+   if (!(rxbd->wb.qword1.cmd & RNP_CMD_DD))
+   return 0;
+
+   rx_swbd = &rxq->sw_ring[rxq->rx_tail];
+   for (i = 0; i < nb_pkts;
+   i += RNP_CACHE_FETCH_RX, rxbd += RNP_CACHE_FETCH_RX,
+   rx_swbd += RNP_CACHE_FETCH_RX) {
+   for (j = 0; j < RNP_CACHE_FETCH_RX; j++)
+   state_cmd[j] = rxbd[j].wb.qword1.cmd;
+   rte_atomic_thread_fence(rte_memory_order_acquire);
+
+   for (nb_dd = 0; nb_dd < RNP_CACHE_FETCH_RX &&
+   (state_cmd[nb_dd] & 
rte_cpu_to_le_16(RNP_CMD_DD));
+   nb_dd++)
+   ;
+   for (j = 0; j < nb_dd; j++)
+   pkt_len[j] = rxbd[j].wb.qword1.lens;
+
+   for (j = 0; j < nb_dd; ++j) {
+ 

[PATCH] net/mlx5: fix queue counter error check

2025-02-25 Thread Dariusz Sosnowski
Whenever queue counter allocation fails, the FW syndrome error
should be checked to determine if maximum number of queue counters
was reached.

Fixes: f0c0731b6d40 ("net/mlx5: add counters for hairpin drop")
Cc: shper...@nvidia.com

Signed-off-by: Dariusz Sosnowski 
Acked-by: Bing Zhao 
---
 drivers/net/mlx5/mlx5.c | 28 +++-
 1 file changed, 15 insertions(+), 13 deletions(-)

diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c
index 91fd9346a9..cbedb2606e 100644
--- a/drivers/net/mlx5/mlx5.c
+++ b/drivers/net/mlx5/mlx5.c
@@ -3471,6 +3471,7 @@ mlx5_enable_port_level_hairpin_counter(struct rte_eth_dev 
*dev, uint64_t id __rt
 {
struct mlx5_priv *priv = dev->data->dev_private;
struct mlx5_rxq_priv *rxq;
+   int syndrome = 0;
unsigned int i;

int ret = mlx5_hairpin_queue_counter_supported(priv);
@@ -3487,15 +3488,15 @@ mlx5_enable_port_level_hairpin_counter(struct 
rte_eth_dev *dev, uint64_t id __rt
}

/* Alloc global hairpin queue counter. */
-   priv->q_counter_hairpin = 
mlx5_devx_cmd_queue_counter_alloc(priv->sh->cdev->ctx, NULL);
+   priv->q_counter_hairpin = 
mlx5_devx_cmd_queue_counter_alloc(priv->sh->cdev->ctx, &syndrome);
if (!priv->q_counter_hairpin) {
-   if (ret == MLX5_Q_COUNTERS_LIMIT_REACHED) {
-   DRV_LOG(WARNING, "Maximum number of queue counters 
reached. "
-   "Unable to create counter object for 
Port %d using DevX.",
-   priv->dev_data->port_id);
+   if (syndrome == MLX5_Q_COUNTERS_LIMIT_REACHED) {
+   DRV_LOG(ERR, "Maximum number of queue counters reached. 
"
+   "Unable to create counter object for Port %d 
using DevX.",
+   priv->dev_data->port_id);
return -ENOSPC;
}
-   DRV_LOG(WARNING, "Port %d global hairpin queue counter object 
cannot be created "
+   DRV_LOG(ERR, "Port %d global hairpin queue counter object 
cannot be created "
"by DevX.", priv->dev_data->port_id);
return -ENOMEM;
}
@@ -3536,6 +3537,7 @@ mlx5_enable_per_queue_hairpin_counter(struct rte_eth_dev 
*dev, uint64_t id)
struct mlx5_priv *priv = dev->data->dev_private;
struct mlx5_rxq_priv *rxq;
struct mlx5_rxq_data *rxq_data;
+   int syndrome = 0;

int ret = mlx5_hairpin_queue_counter_supported(priv);
if (ret) {
@@ -3558,16 +3560,16 @@ mlx5_enable_per_queue_hairpin_counter(struct 
rte_eth_dev *dev, uint64_t id)
return 0;

/* Alloc hairpin queue counter. */
-   rxq->q_counter = mlx5_devx_cmd_queue_counter_alloc(priv->sh->cdev->ctx, 
NULL);
+   rxq->q_counter = mlx5_devx_cmd_queue_counter_alloc(priv->sh->cdev->ctx, 
&syndrome);
if (rxq->q_counter == NULL) {
-   if (ret == MLX5_Q_COUNTERS_LIMIT_REACHED) {
-   DRV_LOG(WARNING, "Maximum number of queue counters 
reached. "
-   "Unable to create counter object for 
Port %d, Queue %d "
-   "using DevX. The counter from this 
queue will not increment.",
-   priv->dev_data->port_id, rxq->idx);
+   if (syndrome == MLX5_Q_COUNTERS_LIMIT_REACHED) {
+   DRV_LOG(ERR, "Maximum number of queue counters reached. 
"
+   "Unable to create counter object for Port %d, 
Queue %d "
+   "using DevX. The counter from this queue will 
not increment.",
+   priv->dev_data->port_id, rxq->idx);
return -ENOSPC;
}
-   DRV_LOG(WARNING, "Port %d queue %d counter object cannot be 
created "
+   DRV_LOG(ERR, "Port %d queue %d counter object cannot be created 
"
"by DevX. Counter from this queue will not increment.",
priv->dev_data->port_id, rxq->idx);
return -ENOMEM;
--
2.39.5



Re: [PATCH 5/6] acl: make compatible with instruction set updates for MSVC

2025-02-25 Thread Bruce Richardson
On Mon, Feb 24, 2025 at 01:01:18PM -0800, Andre Muezerie wrote:
> Top level 'cc_avx2_flags' was created and holds the correct flags
> depending on the compiler used.
> 
> File meson.build was updated to handle the correct AVX512 flags
> depending on compiler used.
> 
> Signed-off-by: Andre Muezerie 
> ---
>  lib/acl/meson.build | 16 +---
>  1 file changed, 9 insertions(+), 7 deletions(-)
> 
> diff --git a/lib/acl/meson.build b/lib/acl/meson.build
> index fefe131a48..24e47b6cc1 100644
> --- a/lib/acl/meson.build
> +++ b/lib/acl/meson.build
> @@ -19,7 +19,7 @@ if dpdk_conf.has('RTE_ARCH_X86')
>  avx2_tmplib = static_library('avx2_tmp',
>  'acl_run_avx2.c',
>  dependencies: static_rte_eal,
> -c_args: cflags + ['-mavx2'])
> +c_args: [cflags, cc_avx2_flags])
>  objs += avx2_tmplib.extract_objects('acl_run_avx2.c')
>  
>  # compile AVX512 version if:
> @@ -38,6 +38,12 @@ if dpdk_conf.has('RTE_ARCH_X86')
>  # compiler flags, and then have the .o file from static lib
>  # linked into main lib.
>  
> +if is_ms_compiler
> +acl_avx512_args = cc_avx512_flags
> +else
> +acl_avx512_args = ['-mavx512f', '-mavx512vl', '-mavx512cd', 
> '-mavx512bw']
> +endif
> +

in the non-msvc case are these flags not the same as cc_avx512_flags too?
If so, let's just get rid of the acl_avx512_args variable generally.

/Bruce



[PATCH 0/4] enhance testpmd DCB command

2025-02-25 Thread Chengwen Feng
This patchset enhance the testpmd DCB command features:
1) remove restrict of number of TCs (currently its 4 or 8)
2) support config prio-tc map
3) support don't adjust queue num
4) support disable DCB

Chengwen Feng (4):
  app/testpmd: remove restrict of number of TCs in DCB command
  app/testpmd: support config prio-tc map in DCB command
  app/testpmd: support don't adjust queue num in DCB command
  app/testpmd: support disable DCB command

 app/test-pmd/cmdline.c  | 184 ++--
 app/test-pmd/testpmd.c  |  96 ++
 app/test-pmd/testpmd.h  |   5 +-
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |   6 +-
 4 files changed, 236 insertions(+), 55 deletions(-)

-- 
2.17.1



[PATCH v2] net/ixgbe: fix min Rx/Tx descriptors

2025-02-25 Thread Mingjin Ye
The minimum free packet threshold (tx_free_thresh) and the minimum RS bit
threshold (tx_rs_thresh) both have a default value of 32. Therefore, the
default minimum number of ring descriptors value is 64.

For reference, see "Configuration of Transmit Queues" in
doc/guides/prog_guide/ethdev/ethdev.rst

Fixes: dee5f1fd5fc7 ("ixgbe: get queue info and descriptor limits")
Cc: sta...@dpdk.org

Signed-off-by: Mingjin Ye 
---
v2: Change doc.
---
 doc/guides/nics/ixgbe.rst| 5 +++--
 drivers/net/intel/ixgbe/ixgbe_rxtx.h | 2 +-
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/doc/guides/nics/ixgbe.rst b/doc/guides/nics/ixgbe.rst
index c5c6a6c34b..aaed324e15 100644
--- a/doc/guides/nics/ixgbe.rst
+++ b/doc/guides/nics/ixgbe.rst
@@ -68,11 +68,12 @@ Ensure that the following pre-conditions are satisfied:
 
 *   (rxq->nb_rx_desc % rxq->rx_free_thresh) == 0
 
-*   rxq->nb_rx_desc  < (IXGBE_MAX_RING_DESC - RTE_PMD_IXGBE_RX_MAX_BURST)
+*   rxq->nb_rx_desc >= IXGBE_MIN_RING_DESC
+
+*   rxq->nb_rx_desc <= IXGBE_MAX_RING_DESC
 
 These conditions are checked in the code.
 
-Scattered packets are not supported in this mode.
 If an incoming packet is greater than the maximum acceptable length of one 
"mbuf" data size (by default, the size is 2 KB),
 vPMD for RX would be disabled.
 
diff --git a/drivers/net/intel/ixgbe/ixgbe_rxtx.h 
b/drivers/net/intel/ixgbe/ixgbe_rxtx.h
index 278f665108..54569c7ade 100644
--- a/drivers/net/intel/ixgbe/ixgbe_rxtx.h
+++ b/drivers/net/intel/ixgbe/ixgbe_rxtx.h
@@ -26,7 +26,7 @@
  * descriptors should meet the following condition:
  *  (num_ring_desc * sizeof(rx/tx descriptor)) % 128 == 0
  */
-#defineIXGBE_MIN_RING_DESC 32
+#defineIXGBE_MIN_RING_DESC 64
 #defineIXGBE_MAX_RING_DESC 8192
 
 #define RTE_PMD_IXGBE_TX_MAX_BURST 32
-- 
2.25.1



Re: [PATCH 4/6] drivers/net: make compatible with instruction set updates for MSVC

2025-02-25 Thread Bruce Richardson
On Mon, Feb 24, 2025 at 01:01:17PM -0800, Andre Muezerie wrote:
> Top level 'cc_avx2_flags' was created and holds the correct flags
> depending on the compiler used.
> 
> Signed-off-by: Andre Muezerie 
> ---
>  drivers/net/bnxt/meson.build   | 2 +-
>  drivers/net/enic/meson.build   | 2 +-
>  drivers/net/intel/i40e/meson.build | 2 +-
>  drivers/net/intel/iavf/meson.build | 2 +-
>  drivers/net/intel/ice/meson.build  | 2 +-
>  drivers/net/intel/idpf/meson.build | 2 +-
>  drivers/net/nfp/meson.build| 2 +-
>  drivers/net/octeon_ep/meson.build  | 4 ++--
>  8 files changed, 9 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/net/bnxt/meson.build b/drivers/net/bnxt/meson.build
> index e26cf13a65..fd82d0c409 100644
> --- a/drivers/net/bnxt/meson.build
> +++ b/drivers/net/bnxt/meson.build
> @@ -65,7 +65,7 @@ if arch_subdir == 'x86'
>  static_rte_bus_pci,
>  static_rte_kvargs, static_rte_hash],
>  include_directories: includes,
> -c_args: [cflags, '-mavx2'])
> +c_args: [cflags, cc_avx2_flags])
>   objs += bnxt_avx2_lib.extract_objects('bnxt_rxtx_vec_avx2.c')

I like this change, and the consistency of the variable with the equivalent
avx512 one. To simplify getting this patchset in - or as much of it as
possible - can you perhaps add the cc_avx2_flags variable earlier in the
patchset and make these library changes to use it, ahead of the complicated
changes in patch 3. I think it may be simplier to have everything but patch
ready since they should be easy to review and merge, and then we can look
at patch 3 standalone. WDYT?

/Bruce


[PATCH 3/4] app/testpmd: support don't adjust queue num in DCB command

2025-02-25 Thread Chengwen Feng
In some test scenarios, users want to test DCB by specifying the number
of Rx/Tx queues. But the "port config 0 dcb ..." command will auto
adjust Rx/Tx queue number.

This patch introduces an optional parameter "keep-qnum" which make sure
the "port config 0 dcb ..." command don't adjust Rx/Tx queue number.
The new command:

  port config 0 dcb vt off 4 pfc off keep-qnum

If this parameter is not specified, the Rx/Tx queue number was adjusted
by default.

Signed-off-by: Chengwen Feng 
---
 app/test-pmd/cmdline.c  | 83 ++---
 app/test-pmd/testpmd.c  | 41 +-
 app/test-pmd/testpmd.h  |  3 +-
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  3 +-
 4 files changed, 98 insertions(+), 32 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index a8aa948c81..ef65a75dc7 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -3493,14 +3493,47 @@ parse_dcb_token_prio_tc(char *param_str[], int 
param_num,
return 0;
 }
 
+#define DCB_TOKEN_PRIO_TC  "prio-tc"
+#define DCB_TOKEN_KEEP_QNUM"keep-qnum"
+
+static int
+parse_dcb_token_find(char *split_str[], int split_num, int *param_num)
+{
+   int i;
+
+   if (strcmp(split_str[0], DCB_TOKEN_KEEP_QNUM) == 0) {
+   *param_num = 0;
+   return 0;
+   }
+
+   if (strcmp(split_str[0], DCB_TOKEN_PRIO_TC) != 0) {
+   fprintf(stderr, "Bad Argument: unknown token %s\n", 
split_str[0]);
+   return -EINVAL;
+   }
+
+   for (i = 1; i < split_num; i++) {
+   if ((strcmp(split_str[i], DCB_TOKEN_PRIO_TC) != 0) &&
+   (strcmp(split_str[i], DCB_TOKEN_KEEP_QNUM) != 0))
+   continue;
+   /* find another optional parameter, then exit. */
+   break;
+   }
+
+   *param_num = i - 1;
+
+   return 0;
+}
+
 static int
 parse_dcb_token_value(char *token_str,
  uint8_t *pfc_en,
  uint8_t prio_tc[RTE_ETH_DCB_NUM_USER_PRIORITIES],
- uint8_t *prio_tc_en)
+ uint8_t *prio_tc_en,
+ uint8_t *keep_qnum)
 {
 #define MAX_TOKEN_NUM  128
char *split_str[MAX_TOKEN_NUM];
+   int param_num, start, ret;
int split_num = 0;
char *token;
 
@@ -3531,13 +3564,40 @@ parse_dcb_token_value(char *token_str,
return 0;
 
/* start parse optional parameter. */
-   token = split_str[1];
-   if (strcmp(token, "prio-tc") != 0) {
-   fprintf(stderr, "Bad Argument: unknown token %s\n", token);
-   return -1;
-   }
+   start = 1;
+   do {
+   param_num = 0;
+   ret = parse_dcb_token_find(&split_str[start], split_num - 
start, ¶m_num);
+   if (ret != 0)
+   return ret;
 
-   return parse_dcb_token_prio_tc(&split_str[2], split_num - 2, prio_tc, 
prio_tc_en);
+   token = split_str[start];
+   if (strcmp(token, DCB_TOKEN_PRIO_TC) == 0) {
+   if (*prio_tc_en == 1) {
+   fprintf(stderr, "Bad Argument: detect multiple 
%s token\n",
+   DCB_TOKEN_PRIO_TC);
+   return -1;
+   }
+   ret = parse_dcb_token_prio_tc(&split_str[start + 1], 
param_num, prio_tc,
+ prio_tc_en);
+   if (ret != 0)
+   return ret;
+   } else {
+   /* this must be keep-qnum. */
+   if (*keep_qnum == 1) {
+   fprintf(stderr, "Bad Argument: detect multiple 
%s token\n",
+   DCB_TOKEN_KEEP_QNUM);
+   return -1;
+   }
+   *keep_qnum = 1;
+   }
+
+   start += param_num + 1;
+   if (start >= split_num)
+   break;
+   } while (1);
+
+   return 0;
 }
 
 static void
@@ -3550,6 +3610,7 @@ cmd_config_dcb_parsed(void *parsed_result,
struct rte_eth_dcb_info dcb_info;
portid_t port_id = res->port_id;
uint8_t prio_tc_en = 0;
+   uint8_t keep_qnum = 0;
struct rte_port *port;
uint8_t pfc_en = 0;
int ret;
@@ -3580,7 +3641,7 @@ cmd_config_dcb_parsed(void *parsed_result,
return;
}
 
-   ret = parse_dcb_token_value(res->token_str, &pfc_en, prio_tc, 
&prio_tc_en);
+   ret = parse_dcb_token_value(res->token_str, &pfc_en, prio_tc, 
&prio_tc_en, &keep_qnum);
if (ret != 0)
return;
 
@@ -3588,11 +3649,11 @@ cmd_config_dcb_parsed(void *parsed_result,
if (!strncmp(res->vt_en, "on", 2))
ret = init_port_dcb_config(port_id, DCB_V

[PATCH v3 02/16] net/zxdh: optimize queue res alloc/free process

2025-02-25 Thread Junlong Wang
optimize queue res alloc/free process.

Signed-off-by: Junlong Wang 
---
 drivers/net/zxdh/zxdh_common.c |  27 ++--
 drivers/net/zxdh/zxdh_ethdev.c | 200 -
 drivers/net/zxdh/zxdh_ethdev.h |  14 +-
 drivers/net/zxdh/zxdh_ethdev_ops.c |  13 +-
 drivers/net/zxdh/zxdh_pci.c|  10 --
 drivers/net/zxdh/zxdh_queue.c  | 123 +++---
 6 files changed, 251 insertions(+), 136 deletions(-)

diff --git a/drivers/net/zxdh/zxdh_common.c b/drivers/net/zxdh/zxdh_common.c
index 7f3691311c..2fb485a29b 100644
--- a/drivers/net/zxdh/zxdh_common.c
+++ b/drivers/net/zxdh/zxdh_common.c
@@ -397,27 +397,30 @@ int32_t
 zxdh_datach_set(struct rte_eth_dev *dev)
 {
struct zxdh_hw *hw = dev->data->dev_private;
-   uint16_t buff_size = (hw->queue_num + 1) * 2;
-   int32_t ret = 0;
-   uint16_t i;
+   uint16_t nr_vq = hw->rx_qnum + hw->tx_qnum;
+   uint16_t buff_size = (nr_vq % ZXDH_QUEUES_NUM_MAX + 1) * 
sizeof(uint16_t);
+   int ret = 0;
+   uint16_t *pdata, i;
 
void *buff = rte_zmalloc(NULL, buff_size, 0);
+
if (unlikely(buff == NULL)) {
PMD_DRV_LOG(ERR, "Failed to allocate buff");
return -ENOMEM;
}
-   memset(buff, 0, buff_size);
-   uint16_t *pdata = (uint16_t *)buff;
-   *pdata++ = hw->queue_num;
 
-   for (i = 0; i < hw->queue_num; i++)
-   *(pdata + i) = hw->channel_context[i].ph_chno;
+   pdata = (uint16_t *)buff;
+   *pdata++ = nr_vq;
+   for (i = 0; i < hw->rx_qnum; i++)
+   *(pdata + i) = hw->channel_context[i * 2].ph_chno;
+   for (i = 0; i < hw->tx_qnum; i++)
+   *(pdata + hw->rx_qnum + i) = hw->channel_context[i * 2 + 
1].ph_chno;
+   ret = zxdh_common_table_write(hw, ZXDH_COMMON_FIELD_DATACH, (void 
*)buff, buff_size);
 
-   ret = zxdh_common_table_write(hw, ZXDH_COMMON_FIELD_DATACH,
-   (void *)buff, buff_size);
if (ret != 0)
-   PMD_DRV_LOG(ERR, "Failed to setup data channel of common 
table");
-
+   PMD_DRV_LOG(ERR, "Failed to setup data channel of common table. 
code:%d", ret);
+   hw->queue_set_flag = 1;
rte_free(buff);
+
return ret;
 }
diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c
index c3e8b1cb2d..59b665be0a 100644
--- a/drivers/net/zxdh/zxdh_ethdev.c
+++ b/drivers/net/zxdh/zxdh_ethdev.c
@@ -25,6 +25,9 @@ static struct zxdh_shared_data *zxdh_shared_data;
 
 #define ZXDH_INVALID_DTBQUE  0x
 #define ZXDH_INVALID_SLOT_IDX0x
+#define ZXDH_PF_QUEUE_PAIRS_ADDR0x5742
+#define ZXDH_VF_QUEUE_PAIRS_ADDR0x5744
+#define ZXDH_QUEUE_POOL_ADDR0x56A0
 
 uint16_t
 zxdh_vport_to_vfid(union zxdh_virport_num v)
@@ -89,10 +92,11 @@ zxdh_queues_unbind_intr(struct rte_eth_dev *dev)
struct zxdh_hw *hw = dev->data->dev_private;
int32_t i;
 
-   for (i = 0; i < dev->data->nb_rx_queues; ++i) {
+   for (i = 0; i < dev->data->nb_rx_queues; ++i)
ZXDH_VTPCI_OPS(hw)->set_queue_irq(hw, hw->vqs[i * 2], 
ZXDH_MSI_NO_VECTOR);
+
+   for (i = 0; i < dev->data->nb_tx_queues; ++i)
ZXDH_VTPCI_OPS(hw)->set_queue_irq(hw, hw->vqs[i * 2 + 1], 
ZXDH_MSI_NO_VECTOR);
-   }
 }
 
 
@@ -466,33 +470,30 @@ static void
 zxdh_dev_free_mbufs(struct rte_eth_dev *dev)
 {
struct zxdh_hw *hw = dev->data->dev_private;
-   uint16_t nr_vq = hw->queue_num;
-   uint32_t i = 0;
-
-   const char *type = NULL;
-   struct zxdh_virtqueue *vq = NULL;
-   struct rte_mbuf *buf = NULL;
-   int32_t queue_type = 0;
+   struct zxdh_virtqueue *vq;
+   struct rte_mbuf *buf;
+   int i;
 
if (hw->vqs == NULL)
return;
 
-   for (i = 0; i < nr_vq; i++) {
-   vq = hw->vqs[i];
+   for (i = 0; i < hw->rx_qnum; i++) {
+   vq = hw->vqs[i * 2];
if (!vq)
continue;
-
-   queue_type = zxdh_get_queue_type(i);
-   if (queue_type == ZXDH_VTNET_RQ)
-   type = "rxq";
-   else if (queue_type == ZXDH_VTNET_TQ)
-   type = "txq";
-   else
+   while ((buf = zxdh_queue_detach_unused(vq)) != NULL)
+   rte_pktmbuf_free(buf);
+   PMD_DRV_LOG(DEBUG, "freeing %s[%d] used and unused buf",
+   "rxq", i * 2);
+   }
+   for (i = 0; i < hw->tx_qnum; i++) {
+   vq = hw->vqs[i * 2 + 1];
+   if (!vq)
continue;
-   PMD_DRV_LOG(DEBUG, "Before freeing %s[%d] used and unused buf", 
type, i);
-
while ((buf = zxdh_queue_detach_unused(vq)) != NULL)
rte_pktmbuf_free(buf);
+   PMD_DRV_LOG(DEBUG, "freeing %s[%d] used and unused buf",
+   "txq", i * 2 + 1);
   

[PATCH v3 05/16] net/zxdh: provided PF/VF msg intr callback

2025-02-25 Thread Junlong Wang
provided PF/VF msg intr callback.

Signed-off-by: Junlong Wang 
---
 drivers/net/zxdh/zxdh_ethdev.c |   5 +-
 drivers/net/zxdh/zxdh_msg.c| 184 +++--
 drivers/net/zxdh/zxdh_msg.h|   8 ++
 drivers/net/zxdh/zxdh_tables.c |  17 +++
 drivers/net/zxdh/zxdh_tables.h |   2 +
 5 files changed, 206 insertions(+), 10 deletions(-)

diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c
index e6a67f2785..7efd4fd81c 100644
--- a/drivers/net/zxdh/zxdh_ethdev.c
+++ b/drivers/net/zxdh/zxdh_ethdev.c
@@ -1437,7 +1437,7 @@ zxdh_np_dtb_res_init(struct rte_eth_dev *dev)
goto free_res;
}
 
-   PMD_DRV_LOG(DEBUG, "dev %s dpp host np init ok.dtb queue %d",
+   PMD_DRV_LOG(DEBUG, "dev %s dpp host np init ok.dtb queue %u",
dev->device->name, dpp_ctrl->queue_id);
dtb_data->queueid = dpp_ctrl->queue_id;
rte_free(dpp_ctrl);
@@ -1458,7 +1458,7 @@ zxdh_get_dev_shared_data_idx(uint32_t dev_serial_id)
return idx;
}
 
-   PMD_DRV_LOG(ERR, "dev serial_id[%d] can not found in global 
dev_share_data arrays",
+   PMD_DRV_LOG(ERR, "dev serial_id[%u] can not found in global 
dev_share_data arrays",
dev_serial_id);
return ZXDH_INVALID_SLOT_IDX;
 }
@@ -1714,6 +1714,7 @@ zxdh_eth_dev_init(struct rte_eth_dev *eth_dev)
goto err_zxdh_init;
 
zxdh_queue_res_get(eth_dev);
+   zxdh_msg_cb_reg(hw);
ret = zxdh_configure_intr(eth_dev);
if (ret != 0)
goto err_zxdh_init;
diff --git a/drivers/net/zxdh/zxdh_msg.c b/drivers/net/zxdh/zxdh_msg.c
index 0e9cf0a4ca..fbd2315926 100644
--- a/drivers/net/zxdh/zxdh_msg.c
+++ b/drivers/net/zxdh/zxdh_msg.c
@@ -15,6 +15,7 @@
 #include "zxdh_logs.h"
 #include "zxdh_msg.h"
 #include "zxdh_pci.h"
+#include "zxdh_tables.h"
 
 #define ZXDH_REPS_INFO_FLAG_USABLE  0x00
 #define ZXDH_BAR_SEQID_NUM_MAX  256
@@ -136,7 +137,7 @@ static struct zxdh_seqid_ring g_seqid_ring;
 static uint8_t tmp_msg_header[ZXDH_BAR_MSG_ADDR_CHAN_INTERVAL];
 static rte_spinlock_t chan_lock;
 
-zxdh_bar_chan_msg_recv_callback msg_recv_func_tbl[ZXDH_BAR_MSG_MODULE_NUM];
+zxdh_bar_chan_msg_recv_callback 
zxdh_msg_recv_func_tbl[ZXDH_BAR_MSG_MODULE_NUM];
 
 static inline const char
 *zxdh_module_id_name(int val)
@@ -914,7 +915,7 @@ zxdh_bar_msg_sync_msg_proc(uint64_t reply_addr,
if (reps_buffer == NULL)
return;
 
-   zxdh_bar_chan_msg_recv_callback recv_func = 
msg_recv_func_tbl[msg_header->module_id];
+   zxdh_bar_chan_msg_recv_callback recv_func = 
zxdh_msg_recv_func_tbl[msg_header->module_id];
 
recv_func(receiver_buff, msg_header->len, reps_buffer, &reps_len, dev);
msg_header->ack = ZXDH_BAR_CHAN_MSG_ACK;
@@ -973,7 +974,7 @@ zxdh_bar_chan_msg_header_check(struct zxdh_bar_msg_header 
*msg_header)
PMD_MSG_LOG(ERR, "recv header ERR: invalid mesg len: %u", len);
return ZXDH_BAR_MSG_ERR_LEN;
}
-   if (msg_recv_func_tbl[msg_header->module_id] == NULL) {
+   if (zxdh_msg_recv_func_tbl[msg_header->module_id] == NULL) {
PMD_MSG_LOG(ERR, "recv header ERR: module:%s(%u) doesn't 
register",
zxdh_module_id_name(module_id), module_id);
return ZXDH_BAR_MSG_ERR_MODULE_NOEXIST;
@@ -1029,7 +1030,8 @@ zxdh_bar_irq_recv(uint8_t src, uint8_t dst, uint64_t 
virt_addr, void *dev)
return ZXDH_BAR_MSG_OK;
 }
 
-int zxdh_get_bar_offset(struct zxdh_bar_offset_params *paras,
+int
+zxdh_get_bar_offset(struct zxdh_bar_offset_params *paras,
struct zxdh_bar_offset_res *res)
 {
uint16_t check_token;
@@ -1073,7 +1075,8 @@ int zxdh_get_bar_offset(struct zxdh_bar_offset_params 
*paras,
return ZXDH_BAR_MSG_OK;
 }
 
-int zxdh_vf_send_msg_to_pf(struct rte_eth_dev *dev,  void *msg_req,
+int
+zxdh_vf_send_msg_to_pf(struct rte_eth_dev *dev,  void *msg_req,
uint16_t msg_req_len, void *reply, uint16_t reply_len)
 {
struct zxdh_hw *hw  = dev->data->dev_private;
@@ -1125,7 +1128,8 @@ int zxdh_vf_send_msg_to_pf(struct rte_eth_dev *dev,  void 
*msg_req,
return 0;
 }
 
-int32_t zxdh_send_msg_to_riscv(struct rte_eth_dev *dev, void *msg_req,
+int32_t
+zxdh_send_msg_to_riscv(struct rte_eth_dev *dev, void *msg_req,
uint16_t msg_req_len, void *reply, uint16_t reply_len,
enum ZXDH_BAR_MODULE_ID module_id)
 {
@@ -1173,7 +1177,8 @@ int32_t zxdh_send_msg_to_riscv(struct rte_eth_dev *dev, 
void *msg_req,
return 0;
 }
 
-void zxdh_msg_head_build(struct zxdh_hw *hw, enum zxdh_msg_type type,
+void
+zxdh_msg_head_build(struct zxdh_hw *hw, enum zxdh_msg_type type,
struct zxdh_msg_info *msg_info)
 {
struct zxdh_msg_head *msghead = &msg_info->msg_head;
@@ -1184,7 +1189,8 @@ void zxdh_msg_head_build(struct zxdh_hw *hw, enum 
zxdh_msg_type type,
msghead->pci

[PATCH v3 00/16] net/zxdh: updated net zxdh driver

2025-02-25 Thread Junlong Wang
V3:
  - fix warning enable asserts compile.
  - fix warning enable address sanitizer for undefined checks.
  - modify extra memset and cast.
  - remove __rte_unused from function prototypes.
  - fix indentation in mtr get and use assign.
  - make callback table const and static.

V2:
  - modify CI some error results(checkpatches warnings、Wrong headline format)
  - fix warnings when enable extra warnings.
  - modify apply memcpy script for coccinelle and unnecessary init and
unneccessary cast of void when use malloc.

V1:
  - updated net zxdh driver.
optimize init and some ops.
provided csum/lro/tso 、extend stats、fw_version、module_info 、meter, etc.

Junlong Wang (16):
  net/zxdh: optimize np dtb channel initialization
  net/zxdh: optimize queue res alloc/free process
  net/zxdh: optimize link update process
  net/zxdh: update Rx/Tx to latest
  net/zxdh: provided PF/VF msg intr callback
  net/zxdh: optimize MAC ops
  net/zxdh: optimize promisc ops
  net/zxdh: optimize VLAN filter/offload ops
  net/zxdh: optimize RSS/RETA hash config/update/get
  net/zxdh: optimize MTU set ops
  net/zxdh: optimize basic stats ops
  net/zxdh: provided CSUM/TSO/LRO config
  net/zxdh: provided rxq/txq info get implementations
  net/zxdh: provide extended stats ops implementations
  net/zxdh: provide ptypes FW version EEPROM ops
  net/zxdh: provide meter ops implementations

 doc/guides/nics/features/zxdh.ini  |   11 +
 doc/guides/nics/zxdh.rst   |5 +
 drivers/net/zxdh/meson.build   |1 +
 drivers/net/zxdh/zxdh_common.c |   49 +-
 drivers/net/zxdh/zxdh_common.h |3 +
 drivers/net/zxdh/zxdh_ethdev.c |  725 ++---
 drivers/net/zxdh/zxdh_ethdev.h |   67 +-
 drivers/net/zxdh/zxdh_ethdev_ops.c |  918 ++---
 drivers/net/zxdh/zxdh_ethdev_ops.h |   52 +-
 drivers/net/zxdh/zxdh_msg.c|  982 +-
 drivers/net/zxdh/zxdh_msg.h|  174 +++-
 drivers/net/zxdh/zxdh_mtr.c| 1223 
 drivers/net/zxdh/zxdh_mtr.h|  114 +++
 drivers/net/zxdh/zxdh_np.c |  791 --
 drivers/net/zxdh/zxdh_np.h |  264 ++
 drivers/net/zxdh/zxdh_pci.c|   10 -
 drivers/net/zxdh/zxdh_queue.c  |  132 +--
 drivers/net/zxdh/zxdh_queue.h  |  122 +--
 drivers/net/zxdh/zxdh_rxtx.c   |  695 +---
 drivers/net/zxdh/zxdh_rxtx.h   |   33 +-
 drivers/net/zxdh/zxdh_tables.c |  378 +++--
 drivers/net/zxdh/zxdh_tables.h |  219 +++--
 22 files changed, 6018 insertions(+), 950 deletions(-)
 create mode 100644 drivers/net/zxdh/zxdh_mtr.c
 create mode 100644 drivers/net/zxdh/zxdh_mtr.h

-- 
2.27.0

[PATCH v3 06/16] net/zxdh: optimize MAC ops

2025-02-25 Thread Junlong Wang
optimize MAC ops

Signed-off-by: Junlong Wang 
---
 drivers/net/zxdh/zxdh_ethdev.c |  41 +-
 drivers/net/zxdh/zxdh_ethdev.h |  13 +++-
 drivers/net/zxdh/zxdh_ethdev_ops.c |  59 +--
 drivers/net/zxdh/zxdh_msg.c| 118 +
 drivers/net/zxdh/zxdh_msg.h|   7 ++
 drivers/net/zxdh/zxdh_tables.c |  70 +++--
 drivers/net/zxdh/zxdh_tables.h |  11 +--
 7 files changed, 263 insertions(+), 56 deletions(-)

diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c
index 7efd4fd81c..c430038298 100644
--- a/drivers/net/zxdh/zxdh_ethdev.c
+++ b/drivers/net/zxdh/zxdh_ethdev.c
@@ -1152,8 +1152,8 @@ zxdh_mac_config(struct rte_eth_dev *eth_dev)
int ret = 0;
 
if (hw->is_pf) {
-   ret = zxdh_set_mac_table(hw, hw->vport.vport,
-   ð_dev->data->mac_addrs[0], 
hw->hash_search_index);
+   ret = zxdh_add_mac_table(hw, hw->vport.vport,
+   ð_dev->data->mac_addrs[0], 
hw->hash_search_index, 0, 0);
if (ret) {
PMD_DRV_LOG(ERR, "Failed to add mac: port 0x%x", 
hw->vport.vport);
return ret;
@@ -1553,7 +1553,6 @@ zxdh_init_once(struct rte_eth_dev *eth_dev)
if (!sd->init_done)
sd->init_done = true;
sd->dev_refcnt++;
-
 out:
rte_spinlock_unlock(&sd->lock);
return ret;
@@ -1640,6 +1639,39 @@ zxdh_queue_res_get(struct rte_eth_dev *eth_dev)
hw->queue_pool_start = 0;
 }
 
+static int
+zxdh_priv_res_init(struct zxdh_hw *hw)
+{
+   if (hw->is_pf) {
+   hw->vfinfo = rte_zmalloc("vfinfo", ZXDH_MAX_VF * sizeof(struct 
vfinfo), 4);
+   if (hw->vfinfo == NULL) {
+   PMD_DRV_LOG(ERR, "vfinfo malloc failed");
+   return -ENOMEM;
+   }
+   } else {
+   hw->vfinfo = NULL;
+   }
+
+   hw->channel_context = rte_zmalloc("zxdh_chnlctx",
+   sizeof(struct zxdh_chnl_context) * ZXDH_QUEUES_NUM_MAX, 
0);
+   if (hw->channel_context == NULL) {
+   PMD_DRV_LOG(ERR, "Failed to allocate channel_context");
+   return -ENOMEM;
+   }
+   return 0;
+}
+
+static void
+zxdh_priv_res_free(struct zxdh_hw *priv)
+{
+   rte_free(priv->vfinfo);
+   priv->vfinfo = NULL;
+   if (priv->channel_context != NULL) {
+   rte_free(priv->channel_context);
+   priv->channel_context = NULL;
+   }
+}
+
 static int
 zxdh_eth_dev_init(struct rte_eth_dev *eth_dev)
 {
@@ -1715,6 +1747,8 @@ zxdh_eth_dev_init(struct rte_eth_dev *eth_dev)
 
zxdh_queue_res_get(eth_dev);
zxdh_msg_cb_reg(hw);
+   if (zxdh_priv_res_init(hw) != 0)
+   goto err_zxdh_init;
ret = zxdh_configure_intr(eth_dev);
if (ret != 0)
goto err_zxdh_init;
@@ -1729,6 +1763,7 @@ zxdh_eth_dev_init(struct rte_eth_dev *eth_dev)
zxdh_intr_release(eth_dev);
zxdh_np_uninit(eth_dev);
zxdh_bar_msg_chan_exit();
+   zxdh_priv_res_free(hw);
rte_free(eth_dev->data->mac_addrs);
eth_dev->data->mac_addrs = NULL;
return ret;
diff --git a/drivers/net/zxdh/zxdh_ethdev.h b/drivers/net/zxdh/zxdh_ethdev.h
index 26fcabb3ec..be026d5b72 100644
--- a/drivers/net/zxdh/zxdh_ethdev.h
+++ b/drivers/net/zxdh/zxdh_ethdev.h
@@ -41,6 +41,7 @@
 
 #define ZXDH_MAX_NAME_LEN   32
 #define ZXDH_SLOT_MAX 256
+#define ZXDH_MAX_VF   256
 
 union zxdh_virport_num {
uint16_t vport;
@@ -66,6 +67,15 @@ struct zxdh_vlan_offload_cfg {
uint8_t resv:4;
 };
 
+struct vfinfo {
+   uint16_t vf_idx;
+   uint16_t pcieid;
+   uint16_t vport;
+   uint8_t flag;
+   uint8_t state;
+   struct rte_ether_addr vf_mac[ZXDH_MAX_MAC_ADDRS];
+};
+
 struct zxdh_hw {
struct rte_eth_dev *eth_dev;
struct zxdh_pci_common_cfg *common_cfg;
@@ -73,8 +83,9 @@ struct zxdh_hw {
struct rte_intr_handle *risc_intr;
struct rte_intr_handle *dtb_intr;
struct zxdh_virtqueue **vqs;
-   struct zxdh_chnl_context channel_context[ZXDH_QUEUES_NUM_MAX];
+   struct zxdh_chnl_context *channel_context;
struct zxdh_dev_shared_data *dev_sd;
+   struct vfinfo *vfinfo;
 
uint64_t bar_addr[ZXDH_NUM_BARS];
uint64_t host_features;
diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c 
b/drivers/net/zxdh/zxdh_ethdev_ops.c
index 0c92bd7c05..6e69504c66 100644
--- a/drivers/net/zxdh/zxdh_ethdev_ops.c
+++ b/drivers/net/zxdh/zxdh_ethdev_ops.c
@@ -293,7 +293,8 @@ int zxdh_dev_set_link_down(struct rte_eth_dev *dev)
return ret;
 }
 
-int zxdh_dev_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *addr)
+int
+zxdh_dev_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *addr)
 {
struct zxdh_hw *hw = (struct zxdh_hw *)dev->data->dev_pr

[PATCH v3 09/16] net/zxdh: optimize RSS/RETA hash config/update/get

2025-02-25 Thread Junlong Wang
optimize RSS hash config/update,RETA update/get.

Signed-off-by: Junlong Wang 
---
 drivers/net/zxdh/zxdh_ethdev_ops.c |   1 -
 drivers/net/zxdh/zxdh_msg.c| 129 +
 2 files changed, 129 insertions(+), 1 deletion(-)

diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c 
b/drivers/net/zxdh/zxdh_ethdev_ops.c
index f69b71e448..8dbfd6b59c 100644
--- a/drivers/net/zxdh/zxdh_ethdev_ops.c
+++ b/drivers/net/zxdh/zxdh_ethdev_ops.c
@@ -1144,7 +1144,6 @@ zxdh_rss_hash_conf_get(struct rte_eth_dev *dev, struct 
rte_eth_rss_conf *rss_con
}
reply_msg.reply_body.rss_hf.rss_hf = port_attr.rss_hash_factor;
} else {
-   zxdh_msg_head_build(hw, ZXDH_RSS_HF_SET, &msg);
ret = zxdh_vf_send_msg_to_pf(dev, &msg, sizeof(struct 
zxdh_msg_info),
&reply_msg, sizeof(struct zxdh_msg_reply_info));
if (ret) {
diff --git a/drivers/net/zxdh/zxdh_msg.c b/drivers/net/zxdh/zxdh_msg.c
index 0dc648f206..d46bafbe77 100644
--- a/drivers/net/zxdh/zxdh_msg.c
+++ b/drivers/net/zxdh/zxdh_msg.c
@@ -1544,6 +1544,130 @@ zxdh_vf_set_vlan_offload(struct zxdh_hw *hw, uint16_t 
vport, void *cfg_data,
return ret;
 }
 
+static int
+zxdh_vf_rss_hf_get(struct zxdh_hw *hw, uint16_t vport, void *cfg_data 
__rte_unused,
+   struct zxdh_msg_reply_body *reply, uint16_t *res_len)
+{
+   char str[ZXDH_MSG_REPLY_BODY_MAX_LEN] = "rss_hf";
+   struct zxdh_port_attr_table vport_att = {0};
+   int ret = 0;
+
+   ret = zxdh_get_port_attr(hw, vport, &vport_att);
+   if (ret) {
+   sprintf(str, "get rss hash factor failed, ret:%d\n", ret);
+   PMD_DRV_LOG(ERR, "get rss hash factor failed.");
+   goto proc_end;
+   }
+
+   reply->rss_hf.rss_hf = vport_att.rss_hash_factor;
+
+proc_end:
+   *res_len = strlen(str) + sizeof(enum zxdh_reps_flag);
+   reply->flag = (ret == 0) ? ZXDH_REPS_SUCC : ZXDH_REPS_FAIL;
+   memcpy(&reply->reply_data, str, strlen(str) + 1);
+   return ret;
+}
+
+static int
+zxdh_vf_rss_hf_set(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,
+   struct zxdh_msg_reply_body *reply, uint16_t *res_len)
+{
+   char str[ZXDH_MSG_REPLY_BODY_MAX_LEN] = "rss_hf";
+   struct zxdh_rss_hf *rss_hf = cfg_data;
+   struct zxdh_port_attr_table vport_att = {0};
+   int ret = 0;
+
+   ret = zxdh_get_port_attr(hw, vport, &vport_att);
+   if (ret) {
+   sprintf(str, "set rss hash factor (set vport tbl failed, hf is 
%d). ret:%d\n",
+   rss_hf->rss_hf, ret);
+   PMD_DRV_LOG(ERR, "rss enable hash factor set failed");
+   goto proc_end;
+   }
+
+   vport_att.rss_hash_factor = rss_hf->rss_hf;
+   ret = zxdh_set_port_attr(hw, vport, &vport_att);
+   if (ret) {
+   sprintf(str, "set rss hash factor (set vport tbl failed, hf is 
%d). ret:%d\n",
+   rss_hf->rss_hf, ret);
+   PMD_DRV_LOG(ERR, "rss config hf failed");
+   }
+
+proc_end:
+   *res_len = strlen(str) + sizeof(enum zxdh_reps_flag);
+   reply->flag = (ret == 0) ? ZXDH_REPS_SUCC : ZXDH_REPS_FAIL;
+   memcpy(&reply->reply_data, str, strlen(str) + 1);
+   return ret;
+}
+
+static int
+zxdh_vf_rss_enable(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,
+   struct zxdh_msg_reply_body *reply, uint16_t *res_len)
+{
+   char str[ZXDH_MSG_REPLY_BODY_MAX_LEN] = "rss_enable";
+   struct zxdh_rss_enable *rss_enable = cfg_data;
+   struct zxdh_port_attr_table vport_att = {0};
+   int ret = 0;
+
+   ret = zxdh_get_port_attr(hw, vport, &vport_att);
+   if (ret) {
+   sprintf(str, "set rss enable (get vport tbl failed, rss_enable 
is %d). ret:%d\n",
+   rss_enable->enable, ret);
+   PMD_DRV_LOG(ERR, "rss enable set failed");
+   goto proc_end;
+   }
+
+   vport_att.rss_enable = rss_enable->enable;
+   ret = zxdh_set_port_attr(hw, vport, &vport_att);
+   if (ret) {
+   sprintf(str, "set rss enable (set vport tbl failed, rss_enable 
is %d). ret:%d\n",
+   rss_enable->enable, ret);
+   PMD_DRV_LOG(ERR, "rss enable set failed");
+   }
+
+proc_end:
+   *res_len = strlen(str) + sizeof(enum zxdh_reps_flag);
+   reply->flag = (ret == 0) ? ZXDH_REPS_SUCC : ZXDH_REPS_FAIL;
+   memcpy(&reply->reply_data, str, strlen(str) + 1);
+   return ret;
+}
+
+static int
+zxdh_vf_rss_table_set(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,
+   struct zxdh_msg_reply_body *reply, uint16_t *res_len)
+{
+   char str[ZXDH_MSG_REPLY_BODY_MAX_LEN] = "rss_table";
+   struct zxdh_rss_reta *rss_reta = cfg_data;
+   int32_t ret = 0;
+
+   ret = zxdh_rss_table_set(hw, vport, rss_reta);
+   if (ret)
+  

[PATCH v3 03/16] net/zxdh: optimize link update process

2025-02-25 Thread Junlong Wang
optimize link update process.

Signed-off-by: Junlong Wang 
---
 drivers/net/zxdh/zxdh_ethdev_ops.c | 24 +---
 1 file changed, 17 insertions(+), 7 deletions(-)

diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c 
b/drivers/net/zxdh/zxdh_ethdev_ops.c
index eefecde823..0c92bd7c05 100644
--- a/drivers/net/zxdh/zxdh_ethdev_ops.c
+++ b/drivers/net/zxdh/zxdh_ethdev_ops.c
@@ -193,6 +193,7 @@ zxdh_link_info_get(struct rte_eth_dev *dev, struct 
rte_eth_link *link)
return -1;
}
link->link_speed = reply_info.reply_body.link_msg.speed;
+   link->link_autoneg = reply_info.reply_body.link_msg.autoneg;
hw->speed_mode = reply_info.reply_body.link_msg.speed_modes;
if ((reply_info.reply_body.link_msg.duplex & 
RTE_ETH_LINK_FULL_DUPLEX) ==
RTE_ETH_LINK_FULL_DUPLEX)
@@ -263,13 +264,22 @@ int32_t zxdh_dev_link_update(struct rte_eth_dev *dev, 
int32_t wait_to_complete _
return ret;
}
link.link_status &= hw->admin_status;
-   if (link.link_status == RTE_ETH_LINK_DOWN)
-   link.link_speed  = RTE_ETH_SPEED_NUM_UNKNOWN;
-
-   ret = zxdh_config_port_status(dev, link.link_status);
-   if (ret != 0) {
-   PMD_DRV_LOG(ERR, "set port attr %d failed", link.link_status);
-   return ret;
+   if (link.link_status == RTE_ETH_LINK_DOWN) {
+   PMD_DRV_LOG(DEBUG, "dev link status is down.");
+   goto link_down;
+   }
+   goto out;
+
+link_down:
+   link.link_status = RTE_ETH_LINK_DOWN;
+   link.link_speed  = RTE_ETH_SPEED_NUM_UNKNOWN;
+out:
+   if (link.link_status != dev->data->dev_link.link_status) {
+   ret = zxdh_config_port_status(dev, link.link_status);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "set port attr %d failed", 
link.link_status);
+   return ret;
+   }
}
return rte_eth_linkstatus_set(dev, &link);
 }
-- 
2.27.0

[PATCH v3 07/16] net/zxdh: optimize promisc ops

2025-02-25 Thread Junlong Wang
optimize promisc ops.

Signed-off-by: Junlong Wang 
---
 drivers/net/zxdh/zxdh_msg.c| 62 ++
 drivers/net/zxdh/zxdh_tables.c | 49 +++
 drivers/net/zxdh/zxdh_tables.h |  3 +-
 3 files changed, 113 insertions(+), 1 deletion(-)

diff --git a/drivers/net/zxdh/zxdh_msg.c b/drivers/net/zxdh/zxdh_msg.c
index a278e080e7..aa6982e7a8 100644
--- a/drivers/net/zxdh/zxdh_msg.c
+++ b/drivers/net/zxdh/zxdh_msg.c
@@ -1223,6 +1223,24 @@ zxdh_bar_chan_msg_recv_register(uint8_t module_id, 
zxdh_bar_chan_msg_recv_callba
return ZXDH_BAR_MSG_OK;
 }
 
+static int
+zxdh_vf_promisc_init(struct zxdh_hw *hw, union zxdh_virport_num vport)
+{
+   int16_t ret;
+
+   ret = zxdh_dev_broadcast_set(hw, vport.vport, true);
+   return ret;
+}
+
+static int
+zxdh_vf_promisc_uninit(struct zxdh_hw *hw, union zxdh_virport_num vport)
+{
+   int16_t ret;
+
+   ret = zxdh_dev_broadcast_set(hw, vport.vport, false);
+   return ret;
+}
+
 static int
 zxdh_vf_port_init(struct zxdh_hw *pf_hw, uint16_t vport, void *cfg_data,
struct zxdh_msg_reply_body *res_info, uint16_t *res_len)
@@ -1250,6 +1268,12 @@ zxdh_vf_port_init(struct zxdh_hw *pf_hw, uint16_t vport, 
void *cfg_data,
goto proc_end;
}
 
+   ret = zxdh_vf_promisc_init(pf_hw, port);
+   if (ret) {
+   PMD_DRV_LOG(ERR, "vf_promisc_table_init failed, code:%d", ret);
+   goto proc_end;
+   }
+
res_info->flag = ZXDH_REPS_SUCC;
*res_len = sizeof(res_info->flag);
 
@@ -1307,6 +1331,12 @@ zxdh_vf_port_uninit(struct zxdh_hw *pf_hw,
goto proc_end;
}
 
+   ret = zxdh_vf_promisc_uninit(pf_hw, vport_num);
+   if (ret) {
+   PMD_DRV_LOG(ERR, "vf_promisc_table_uninit failed, code:%d", 
ret);
+   goto proc_end;
+   }
+
*res_len += strlen(str);
rte_memcpy(&res_info->reply_data, str, strlen(str) + 1);
res_info->flag = ZXDH_REPS_SUCC;
@@ -1406,12 +1436,44 @@ zxdh_del_vf_mac_table(struct zxdh_hw *hw, uint16_t 
vport, void *cfg_data,
return ret;
 }
 
+static int
+zxdh_vf_promisc_set(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,
+   struct zxdh_msg_reply_body *reply, uint16_t *res_len)
+{
+   struct zxdh_port_promisc_msg *promisc_msg = (struct 
zxdh_port_promisc_msg *)cfg_data;
+   int ret = 0;
+
+   RTE_ASSERT(!cfg_data || !hw || !reply || !res_len);
+
+   if (promisc_msg->mode == ZXDH_PROMISC_MODE) {
+   zxdh_dev_unicast_table_set(hw, vport, promisc_msg->value);
+   if (promisc_msg->mc_follow == 1)
+   ret = zxdh_dev_multicast_table_set(hw, vport, 
promisc_msg->value);
+   } else if (promisc_msg->mode == ZXDH_ALLMULTI_MODE) {
+   ret = zxdh_dev_multicast_table_set(hw, vport, 
promisc_msg->value);
+   } else {
+   PMD_DRV_LOG(ERR, "promisc_set_msg mode[%u] error", 
promisc_msg->mode);
+   goto proc_end;
+   }
+
+   *res_len = sizeof(struct zxdh_port_attr_set_msg) + sizeof(enum 
zxdh_reps_flag);
+   reply->flag = ZXDH_REPS_SUCC;
+
+   return ret;
+
+proc_end:
+   *res_len = sizeof(struct zxdh_port_attr_set_msg) + sizeof(enum 
zxdh_reps_flag);
+   reply->flag = ZXDH_REPS_FAIL;
+   return ret;
+}
+
 static const zxdh_msg_process_callback zxdh_proc_cb[] = {
[ZXDH_NULL] = NULL,
[ZXDH_VF_PORT_INIT] = zxdh_vf_port_init,
[ZXDH_VF_PORT_UNINIT] = zxdh_vf_port_uninit,
[ZXDH_MAC_ADD] = zxdh_add_vf_mac_table,
[ZXDH_MAC_DEL] = zxdh_del_vf_mac_table,
+   [ZXDH_PORT_PROMISC_SET] = zxdh_vf_promisc_set,
 };
 
 static inline int
diff --git a/drivers/net/zxdh/zxdh_tables.c b/drivers/net/zxdh/zxdh_tables.c
index bfc240a051..9838b8d103 100644
--- a/drivers/net/zxdh/zxdh_tables.c
+++ b/drivers/net/zxdh/zxdh_tables.c
@@ -595,6 +595,7 @@ zxdh_dev_unicast_table_set(struct zxdh_hw *hw, uint16_t 
vport, bool enable)
 {
struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd;
struct zxdh_unitcast_table uc_table = {0};
+   struct zxdh_port_attr_table port_attr = {0};
union zxdh_virport_num vport_num = (union zxdh_virport_num)vport;
int16_t ret = 0;
 
@@ -629,6 +630,20 @@ zxdh_dev_unicast_table_set(struct zxdh_hw *hw, uint16_t 
vport, bool enable)
PMD_DRV_LOG(ERR, "unicast_table_set_failed:%d", hw->vfid);
return -ret;
}
+
+   ret = zxdh_get_port_attr(hw, vport, &port_attr);
+   if (ret) {
+   PMD_DRV_LOG(ERR, "port_attr_table_get_failed:%d", hw->vfid);
+   return -ret;
+   }
+
+   port_attr.promisc_enable = enable;
+   ret = zxdh_set_port_attr(hw, vport, &port_attr);
+   if (ret) {
+   PMD_DRV_LOG(ERR, "port_attr_table_set_failed:%d", hw->vfid);
+   return -ret;
+   }
+
return 0;
 }
 
@@ -852,3 +867,37 @@ zxdh_rss_table_get(str

[PATCH v3 10/16] net/zxdh: optimize MTU set ops

2025-02-25 Thread Junlong Wang
optimize MTU set ops.

Signed-off-by: Junlong Wang 
---
 drivers/net/zxdh/zxdh_ethdev_ops.c |  8 ++---
 drivers/net/zxdh/zxdh_msg.c| 42 +
 drivers/net/zxdh/zxdh_tables.h | 49 +++---
 3 files changed, 90 insertions(+), 9 deletions(-)

diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c 
b/drivers/net/zxdh/zxdh_ethdev_ops.c
index 8dbfd6b59c..03bd369ae2 100644
--- a/drivers/net/zxdh/zxdh_ethdev_ops.c
+++ b/drivers/net/zxdh/zxdh_ethdev_ops.c
@@ -151,12 +151,12 @@ static int32_t zxdh_config_port_status(struct rte_eth_dev 
*dev, uint16_t link_st
struct zxdh_port_attr_set_msg *port_attr_msg = 
&msg_info.data.port_attr_msg;
 
zxdh_msg_head_build(hw, ZXDH_PORT_ATTRS_SET, &msg_info);
-   port_attr_msg->mode = ZXDH_PORT_ATTR_IS_UP_FLAG;
+   port_attr_msg->mode = ZXDH_PORT_VPORT_IS_UP_FLAG;
port_attr_msg->value = link_status;
ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), 
NULL, 0);
if (ret) {
PMD_DRV_LOG(ERR, "Failed to send msg: port 0x%x msg 
type %d",
-   hw->vport.vport, ZXDH_PORT_ATTR_IS_UP_FLAG);
+   hw->vport.vport, ZXDH_PORT_VPORT_IS_UP_FLAG);
return ret;
}
}
@@ -1559,12 +1559,12 @@ int zxdh_dev_mtu_set(struct rte_eth_dev *dev, uint16_t 
new_mtu)
struct zxdh_port_attr_set_msg *attr_msg = 
&msg_info.data.port_attr_msg;
 
zxdh_msg_head_build(hw, ZXDH_PORT_ATTRS_SET, &msg_info);
-   attr_msg->mode = ZXDH_PORT_MTU_EN_FLAG;
+   attr_msg->mode = ZXDH_PORT_MTU_OFFLOAD_EN_OFF_FLAG;
attr_msg->value = 1;
ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), 
NULL, 0);
if (ret) {
PMD_DRV_LOG(ERR, "Failed to send msg: port 0x%x msg 
type %d",
-   hw->vport.vport, ZXDH_PORT_MTU_EN_FLAG);
+   hw->vport.vport, 
ZXDH_PORT_MTU_OFFLOAD_EN_OFF_FLAG);
return ret;
}
attr_msg->mode = ZXDH_PORT_MTU_FLAG;
diff --git a/drivers/net/zxdh/zxdh_msg.c b/drivers/net/zxdh/zxdh_msg.c
index d46bafbe77..a50389b2e8 100644
--- a/drivers/net/zxdh/zxdh_msg.c
+++ b/drivers/net/zxdh/zxdh_msg.c
@@ -1668,6 +1668,47 @@ zxdh_vf_rss_table_get(struct zxdh_hw *hw, uint16_t 
vport, void *cfg_data __rte_u
return ret;
 }
 
+static int
+zxdh_vf_port_attr_set(struct zxdh_hw *pf_hw, uint16_t vport, void *cfg_data,
+   struct zxdh_msg_reply_body *res_info, uint16_t *res_len)
+{
+   RTE_ASSERT(!cfg_data || !pf_hw);
+   if (res_info)
+   *res_len = 0;
+   struct zxdh_port_attr_set_msg *attr_msg = (struct 
zxdh_port_attr_set_msg *)cfg_data;
+   union zxdh_virport_num port = {.vport = vport};
+   struct zxdh_port_attr_table port_attr = {0};
+
+   int ret = zxdh_get_port_attr(pf_hw, vport, &port_attr);
+   if (ret) {
+   PMD_DRV_LOG(ERR, "get vport 0x%x(%d) attr failed", vport, 
port.vfid);
+   return ret;
+   }
+   switch (attr_msg->mode) {
+   case ZXDH_PORT_BASE_QID_FLAG:
+   port_attr.port_base_qid = attr_msg->value;
+   break;
+   case ZXDH_PORT_MTU_OFFLOAD_EN_OFF_FLAG:
+   port_attr.mtu_enable = attr_msg->value;
+   break;
+   case ZXDH_PORT_MTU_FLAG:
+   port_attr.mtu = attr_msg->value;
+   break;
+   case ZXDH_PORT_VPORT_IS_UP_FLAG:
+   port_attr.is_up = attr_msg->value;
+   break;
+   default:
+   PMD_DRV_LOG(ERR, "unsupported attr 0x%x set", attr_msg->mode);
+   return -1;
+   }
+   ret = zxdh_set_port_attr(pf_hw, vport, &port_attr);
+   if (ret) {
+   PMD_DRV_LOG(ERR, "set port attr failed. code:%d", ret);
+   return ret;
+   }
+   return ret;
+}
+
 static const zxdh_msg_process_callback zxdh_proc_cb[] = {
[ZXDH_NULL] = NULL,
[ZXDH_VF_PORT_INIT] = zxdh_vf_port_init,
@@ -1684,6 +1725,7 @@ static const zxdh_msg_process_callback zxdh_proc_cb[] = {
[ZXDH_RSS_RETA_SET] = zxdh_vf_rss_table_set,
[ZXDH_RSS_HF_SET] = zxdh_vf_rss_hf_set,
[ZXDH_RSS_HF_GET] = zxdh_vf_rss_hf_get,
+   [ZXDH_PORT_ATTRS_SET] = zxdh_vf_port_attr_set,
 };
 
 static inline int
diff --git a/drivers/net/zxdh/zxdh_tables.h b/drivers/net/zxdh/zxdh_tables.h
index fe1de63f5c..cd666a9251 100644
--- a/drivers/net/zxdh/zxdh_tables.h
+++ b/drivers/net/zxdh/zxdh_tables.h
@@ -7,11 +7,6 @@
 
 #include 
 
-#define ZXDH_PORT_MTU_FLAG9
-#define ZXDH_PORT_BASE_QID_FLAG   10
-#define ZXDH_PORT_ATTR_IS_UP_FLAG 35
-#define ZXDH_PORT_MTU_EN_FLAG 42
-
 /* eram */
 #define ZXDH_SDT_VPORT_ATT_TABLE  1
 
@@ -26,6 +21,

[PATCH v3 08/16] net/zxdh: optimize VLAN filter/offload ops

2025-02-25 Thread Junlong Wang
optimize VLAN filter/offload ops.

Signed-off-by: Junlong Wang 
---
 drivers/net/zxdh/zxdh_ethdev_ops.c |  42 +++--
 drivers/net/zxdh/zxdh_msg.c|  81 +
 drivers/net/zxdh/zxdh_msg.h|   5 +-
 drivers/net/zxdh/zxdh_tables.c | 139 +
 drivers/net/zxdh/zxdh_tables.h | 112 +++
 5 files changed, 312 insertions(+), 67 deletions(-)

diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c 
b/drivers/net/zxdh/zxdh_ethdev_ops.c
index 6e69504c66..f69b71e448 100644
--- a/drivers/net/zxdh/zxdh_ethdev_ops.c
+++ b/drivers/net/zxdh/zxdh_ethdev_ops.c
@@ -678,11 +678,6 @@ zxdh_dev_vlan_filter_set(struct rte_eth_dev *dev, uint16_t 
vlan_id, int on)
return -EINVAL;
}
 
-   if (dev->data->dev_started == 0) {
-   PMD_DRV_LOG(ERR, "vlan_filter dev not start");
-   return -1;
-   }
-
idx = vlan_id / ZXDH_VLAN_FILTER_GROUPS;
bit_idx = vlan_id % ZXDH_VLAN_FILTER_GROUPS;
 
@@ -732,16 +727,13 @@ zxdh_dev_vlan_offload_set(struct rte_eth_dev *dev, int 
mask)
struct zxdh_hw *hw = dev->data->dev_private;
struct rte_eth_rxmode *rxmode;
struct zxdh_msg_info msg = {0};
-   struct zxdh_port_attr_table port_attr = {0};
int ret = 0;
 
rxmode = &dev->data->dev_conf.rxmode;
if (mask & RTE_ETH_VLAN_FILTER_MASK) {
if (rxmode->offloads & RTE_ETH_RX_OFFLOAD_VLAN_FILTER) {
if (hw->is_pf) {
-   ret = zxdh_get_port_attr(hw, hw->vport.vport, 
&port_attr);
-   port_attr.vlan_filter_enable = true;
-   ret = zxdh_set_port_attr(hw, hw->vport.vport, 
&port_attr);
+   ret = zxdh_set_vlan_filter(hw, hw->vport.vport, 
true);
if (ret) {
PMD_DRV_LOG(ERR, "port %d vlan filter 
set failed",
hw->vport.vfid);
@@ -760,9 +752,7 @@ zxdh_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask)
}
} else {
if (hw->is_pf) {
-   ret = zxdh_get_port_attr(hw, hw->vport.vport, 
&port_attr);
-   port_attr.vlan_filter_enable = false;
-   ret = zxdh_set_port_attr(hw, hw->vport.vport, 
&port_attr);
+   ret = zxdh_set_vlan_filter(hw, hw->vport.vport, 
false);
if (ret) {
PMD_DRV_LOG(ERR, "port %d vlan filter 
set failed",
hw->vport.vfid);
@@ -785,9 +775,8 @@ zxdh_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask)
if (mask & RTE_ETH_VLAN_STRIP_MASK) {
if (rxmode->offloads & RTE_ETH_RX_OFFLOAD_VLAN_STRIP) {
if (hw->is_pf) {
-   ret = zxdh_get_port_attr(hw, hw->vport.vport, 
&port_attr);
-   port_attr.vlan_strip_offload = true;
-   ret = zxdh_set_port_attr(hw, hw->vport.vport, 
&port_attr);
+   ret = zxdh_set_vlan_offload(hw, hw->vport.vport,
+   ZXDH_VLAN_STRIP_TYPE, true);
if (ret) {
PMD_DRV_LOG(ERR, "port %d vlan strip 
set failed",
hw->vport.vfid);
@@ -795,7 +784,7 @@ zxdh_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask)
}
} else {
msg.data.vlan_offload_msg.enable = true;
-   msg.data.vlan_offload_msg.type = 
ZXDH_VLAN_STRIP_MSG_TYPE;
+   msg.data.vlan_offload_msg.type = 
ZXDH_VLAN_STRIP_TYPE;
zxdh_msg_head_build(hw, ZXDH_VLAN_OFFLOAD, 
&msg);
ret = zxdh_vf_send_msg_to_pf(hw->eth_dev, &msg,
sizeof(struct zxdh_msg_info), 
NULL, 0);
@@ -807,9 +796,8 @@ zxdh_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask)
}
} else {
if (hw->is_pf) {
-   ret = zxdh_get_port_attr(hw, hw->vport.vport, 
&port_attr);
-   port_attr.vlan_strip_offload = false;
-   ret = zxdh_set_port_attr(hw, hw->vport.vport, 
&port_attr);
+   ret = zxdh_set_vlan_offload(hw, hw->vport.vport,
+   ZXDH_VLAN_STRIP_TYPE, false);
if (ret) {
PMD_DRV_LOG(ERR, "port %d vlan strip 
set failed",

[PATCH v3 14/16] net/zxdh: provide extended stats ops implementations

2025-02-25 Thread Junlong Wang
provide extended stats ops implementations.

Signed-off-by: Junlong Wang 
---
 doc/guides/nics/features/zxdh.ini  |   1 +
 doc/guides/nics/zxdh.rst   |   1 +
 drivers/net/zxdh/zxdh_ethdev.c |   3 +
 drivers/net/zxdh/zxdh_ethdev_ops.c | 265 -
 drivers/net/zxdh/zxdh_ethdev_ops.h |   3 +
 5 files changed, 270 insertions(+), 3 deletions(-)

diff --git a/doc/guides/nics/features/zxdh.ini 
b/doc/guides/nics/features/zxdh.ini
index c80b6dffbb..cad756ac6e 100644
--- a/doc/guides/nics/features/zxdh.ini
+++ b/doc/guides/nics/features/zxdh.ini
@@ -30,3 +30,4 @@ Inner L3 checksum= Y
 Inner L4 checksum= Y
 LRO  = Y
 TSO  = Y
+Extended stats   = Y
diff --git a/doc/guides/nics/zxdh.rst b/doc/guides/nics/zxdh.rst
index bb3ec2c293..3cf0615a7d 100644
--- a/doc/guides/nics/zxdh.rst
+++ b/doc/guides/nics/zxdh.rst
@@ -39,6 +39,7 @@ Features of the ZXDH PMD are:
 - Inner and Outer Checksum offload
 - Hardware LRO
 - Hardware TSO for generic IP or UDP tunnel, including VXLAN
+- Extended Statistics query
 
 
 Driver compilation and testing
diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c
index 71e8041f80..974774a2e1 100644
--- a/drivers/net/zxdh/zxdh_ethdev.c
+++ b/drivers/net/zxdh/zxdh_ethdev.c
@@ -1370,6 +1370,9 @@ static const struct eth_dev_ops zxdh_eth_dev_ops = {
.rss_hash_conf_get   = zxdh_rss_hash_conf_get,
.stats_get   = zxdh_dev_stats_get,
.stats_reset = zxdh_dev_stats_reset,
+   .xstats_get  = zxdh_dev_xstats_get,
+   .xstats_get_names= zxdh_dev_xstats_get_names,
+   .xstats_reset= zxdh_dev_stats_reset,
.mtu_set = zxdh_dev_mtu_set,
 };
 
diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c 
b/drivers/net/zxdh/zxdh_ethdev_ops.c
index ab7e4dc79a..5ef00321b0 100644
--- a/drivers/net/zxdh/zxdh_ethdev_ops.c
+++ b/drivers/net/zxdh/zxdh_ethdev_ops.c
@@ -83,18 +83,24 @@ struct zxdh_hw_mac_bytes {
uint64_t tx_good_bytes;
 };
 
-struct zxdh_xstats_name_off {
+struct rte_zxdh_xstats_name_off {
char name[RTE_ETH_XSTATS_NAME_SIZE];
unsigned int offset;
 };
 
-static const struct zxdh_xstats_name_off zxdh_rxq_stat_strings[] = {
+static const struct rte_zxdh_xstats_name_off zxdh_rxq_stat_strings[] = {
{"good_packets",   offsetof(struct zxdh_virtnet_rx, 
stats.packets)},
{"good_bytes", offsetof(struct zxdh_virtnet_rx, 
stats.bytes)},
{"errors", offsetof(struct zxdh_virtnet_rx, 
stats.errors)},
+   {"idle",   offsetof(struct zxdh_virtnet_rx, 
stats.idle)},
+   {"full",   offsetof(struct zxdh_virtnet_rx, 
stats.full)},
+   {"norefill",   offsetof(struct zxdh_virtnet_rx, 
stats.norefill)},
{"multicast_packets",  offsetof(struct zxdh_virtnet_rx, 
stats.multicast)},
{"broadcast_packets",  offsetof(struct zxdh_virtnet_rx, 
stats.broadcast)},
{"truncated_err",  offsetof(struct zxdh_virtnet_rx, 
stats.truncated_err)},
+   {"offload_cfg_err",offsetof(struct zxdh_virtnet_rx, 
stats.offload_cfg_err)},
+   {"invalid_hdr_len_err",offsetof(struct zxdh_virtnet_rx, 
stats.invalid_hdr_len_err)},
+   {"no_segs_err",offsetof(struct zxdh_virtnet_rx, 
stats.no_segs_err)},
{"undersize_packets",  offsetof(struct zxdh_virtnet_rx, 
stats.size_bins[0])},
{"size_64_packets",offsetof(struct zxdh_virtnet_rx, 
stats.size_bins[1])},
{"size_65_127_packets",offsetof(struct zxdh_virtnet_rx, 
stats.size_bins[2])},
@@ -105,13 +111,18 @@ static const struct zxdh_xstats_name_off 
zxdh_rxq_stat_strings[] = {
{"size_1519_max_packets",  offsetof(struct zxdh_virtnet_rx, 
stats.size_bins[7])},
 };
 
-static const struct zxdh_xstats_name_off zxdh_txq_stat_strings[] = {
+static const struct rte_zxdh_xstats_name_off zxdh_txq_stat_strings[] = {
{"good_packets",   offsetof(struct zxdh_virtnet_tx, 
stats.packets)},
{"good_bytes", offsetof(struct zxdh_virtnet_tx, 
stats.bytes)},
{"errors", offsetof(struct zxdh_virtnet_tx, 
stats.errors)},
+   {"idle",   offsetof(struct zxdh_virtnet_tx, 
stats.idle)},
+   {"norefill",   offsetof(struct zxdh_virtnet_tx, 
stats.norefill)},
{"multicast_packets",  offsetof(struct zxdh_virtnet_tx, 
stats.multicast)},
{"broadcast_packets",  offsetof(struct zxdh_virtnet_tx, 
stats.broadcast)},
{"truncated_err",  offsetof(struct zxdh_virtnet_tx, 
stats.truncated_err)},
+   {"offload_cfg_err",offsetof(struct zxdh_virtnet_tx, 
stats.offload_cfg_err)},
+   {"invalid_hdr_len_err",offsetof(struct zxdh_virtnet_tx, 
stats.invalid_hdr_len_err)},
+   

[PATCH v3 15/16] net/zxdh: provide ptypes FW version EEPROM ops

2025-02-25 Thread Junlong Wang
provide ptypes、FW version、EEPROM ops.

Signed-off-by: Junlong Wang 
---
 doc/guides/nics/features/zxdh.ini  |   2 +
 drivers/net/zxdh/zxdh_ethdev.c |  30 +
 drivers/net/zxdh/zxdh_ethdev_ops.c | 200 +
 drivers/net/zxdh/zxdh_ethdev_ops.h |   3 +
 drivers/net/zxdh/zxdh_msg.h|  38 +-
 5 files changed, 272 insertions(+), 1 deletion(-)

diff --git a/doc/guides/nics/features/zxdh.ini 
b/doc/guides/nics/features/zxdh.ini
index cad756ac6e..55da709e53 100644
--- a/doc/guides/nics/features/zxdh.ini
+++ b/doc/guides/nics/features/zxdh.ini
@@ -31,3 +31,5 @@ Inner L4 checksum= Y
 LRO  = Y
 TSO  = Y
 Extended stats   = Y
+FW version   = Y
+Module EEPROM dump   = Y
diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c
index 974774a2e1..44a50d7dfd 100644
--- a/drivers/net/zxdh/zxdh_ethdev.c
+++ b/drivers/net/zxdh/zxdh_ethdev.c
@@ -1339,6 +1339,32 @@ zxdh_txq_info_get(struct rte_eth_dev *dev, uint16_t 
tx_queue_id, struct rte_eth_
qinfo->queue_state = dev->data->tx_queue_state[tx_queue_id];
 }
 
+static const uint32_t *
+zxdh_dev_supported_ptypes_get(struct rte_eth_dev *dev, size_t *ptype_sz)
+{
+   static const uint32_t ptypes[] = {
+   RTE_PTYPE_L2_ETHER,
+   RTE_PTYPE_L3_IPV4_EXT_UNKNOWN,
+   RTE_PTYPE_L3_IPV6_EXT_UNKNOWN,
+   RTE_PTYPE_L4_NONFRAG,
+   RTE_PTYPE_L4_FRAG,
+   RTE_PTYPE_L4_TCP,
+   RTE_PTYPE_L4_UDP,
+   RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN,
+   RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN,
+   RTE_PTYPE_INNER_L4_NONFRAG,
+   RTE_PTYPE_INNER_L4_FRAG,
+   RTE_PTYPE_INNER_L4_TCP,
+   RTE_PTYPE_INNER_L4_UDP,
+   RTE_PTYPE_UNKNOWN
+   };
+
+   if (!dev->rx_pkt_burst)
+   return NULL;
+   *ptype_sz = sizeof(ptypes);
+   return ptypes;
+}
+
 /* dev_ops for zxdh, bare necessities for basic operation */
 static const struct eth_dev_ops zxdh_eth_dev_ops = {
.dev_configure   = zxdh_dev_configure,
@@ -1374,6 +1400,10 @@ static const struct eth_dev_ops zxdh_eth_dev_ops = {
.xstats_get_names= zxdh_dev_xstats_get_names,
.xstats_reset= zxdh_dev_stats_reset,
.mtu_set = zxdh_dev_mtu_set,
+   .fw_version_get  = zxdh_dev_fw_version_get,
+   .get_module_info = zxdh_dev_get_module_info,
+   .get_module_eeprom   = zxdh_dev_get_module_eeprom,
+   .dev_supported_ptypes_get = zxdh_dev_supported_ptypes_get,
 };
 
 static int32_t
diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c 
b/drivers/net/zxdh/zxdh_ethdev_ops.c
index 5ef00321b0..ecf4c28b0f 100644
--- a/drivers/net/zxdh/zxdh_ethdev_ops.c
+++ b/drivers/net/zxdh/zxdh_ethdev_ops.c
@@ -2023,3 +2023,203 @@ zxdh_dev_xstats_get_names(struct rte_eth_dev *dev,
}
return nstats;
 }
+
+int
+zxdh_dev_fw_version_get(struct rte_eth_dev *dev,
+char *fw_version, size_t fw_size __rte_unused)
+{
+   struct zxdh_hw *hw = dev->data->dev_private;
+   struct zxdh_msg_info msg_info = {0};
+   struct zxdh_msg_reply_info reply_info = {0};
+   char fw_ver[ZXDH_FWVERS_LEN] = {0};
+   uint32_t ret = 0;
+
+   zxdh_agent_msg_build(hw, ZXDH_FLASH_FIR_VERSION_GET, &msg_info);
+
+   struct zxdh_msg_recviver_mem rsp_data = {
+   .recv_buffer = (void *)&reply_info,
+   .buffer_len = sizeof(struct zxdh_msg_reply_info),
+   };
+
+   ret = zxdh_send_msg_to_riscv(dev, &msg_info, sizeof(struct 
zxdh_msg_info),
+   &reply_info, sizeof(struct zxdh_msg_reply_info),
+   ZXDH_MODULE_FLASH);
+   if (ret) {
+   PMD_DRV_LOG(ERR, "Failed to send msg: port 0x%x msg type %d",
+   hw->vport.vport, ZXDH_FLASH_FIR_VERSION_GET);
+   return -1;
+   }
+   struct zxdh_msg_reply_body *ack_msg =
+&(((struct zxdh_msg_reply_info 
*)rsp_data.recv_buffer)->reply_body);
+
+   memcpy(fw_ver, ack_msg->flash_msg.firmware_version, ZXDH_FWVERS_LEN);
+   snprintf(fw_version, ZXDH_FWVERS_LEN - 1, "%s", fw_ver);
+
+   return 0;
+}
+
+static uint8_t
+zxdh_en_module_eeprom_read(struct rte_eth_dev *dev,
+struct zxdh_mac_module_eeprom_msg *query, uint8_t *data)
+{
+   struct zxdh_hw *hw = dev->data->dev_private;
+   struct zxdh_msg_info msg_info = {0};
+   struct zxdh_msg_reply_info reply_info = {0};
+   uint8_t ret = 0;
+
+   zxdh_agent_msg_build(hw, ZXDH_MAC_MODULE_EEPROM_READ, &msg_info);
+
+   msg_info.data.module_eeprom_msg.i2c_addr = query->i2c_addr;
+   msg_info.data.module_eeprom_msg.bank = query->bank;
+   msg_info.data.module_eeprom_msg.page = query->page;
+ 

[PATCH v3 13/16] net/zxdh: provided rxq/txq info get implementations

2025-02-25 Thread Junlong Wang
provided rxq/txq info get implementations.

Signed-off-by: Junlong Wang 
---
 drivers/net/zxdh/zxdh_ethdev.c | 40 --
 1 file changed, 38 insertions(+), 2 deletions(-)

diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c
index e58891dc32..71e8041f80 100644
--- a/drivers/net/zxdh/zxdh_ethdev.c
+++ b/drivers/net/zxdh/zxdh_ethdev.c
@@ -49,8 +49,8 @@ zxdh_dev_infos_get(struct rte_eth_dev *dev,
struct zxdh_hw *hw = dev->data->dev_private;
 
dev_info->speed_capa   = rte_eth_speed_bitflag(hw->speed, 
RTE_ETH_LINK_FULL_DUPLEX);
-   dev_info->max_rx_queues= RTE_MIN(hw->max_queue_pairs, 
ZXDH_RX_QUEUES_MAX);
-   dev_info->max_tx_queues= RTE_MIN(hw->max_queue_pairs, 
ZXDH_TX_QUEUES_MAX);
+   dev_info->max_rx_queues= hw->max_queue_pairs;
+   dev_info->max_tx_queues= hw->max_queue_pairs;
dev_info->min_rx_bufsize   = ZXDH_MIN_RX_BUFSIZE;
dev_info->max_rx_pktlen= ZXDH_MAX_RX_PKTLEN;
dev_info->max_mac_addrs= ZXDH_MAX_MAC_ADDRS;
@@ -1305,6 +1305,40 @@ zxdh_dev_start(struct rte_eth_dev *dev)
return 0;
 }
 
+static void
+zxdh_rxq_info_get(struct rte_eth_dev *dev, uint16_t rx_queue_id, struct 
rte_eth_rxq_info *qinfo)
+{
+   struct zxdh_virtnet_rx *rxq = NULL;
+
+   if (rx_queue_id < dev->data->nb_rx_queues)
+   rxq = dev->data->rx_queues[rx_queue_id];
+   if (!rxq) {
+   PMD_RX_LOG(ERR, "rxq is null");
+   return;
+   }
+   qinfo->nb_desc = rxq->vq->vq_nentries;
+   qinfo->conf.rx_free_thresh = rxq->vq->vq_free_thresh;
+   qinfo->conf.offloads = dev->data->dev_conf.rxmode.offloads;
+   qinfo->queue_state = dev->data->rx_queue_state[rx_queue_id];
+}
+
+static void
+zxdh_txq_info_get(struct rte_eth_dev *dev, uint16_t tx_queue_id, struct 
rte_eth_txq_info *qinfo)
+{
+   struct zxdh_virtnet_tx *txq = NULL;
+
+   if (tx_queue_id < dev->data->nb_tx_queues)
+   txq = dev->data->tx_queues[tx_queue_id];
+   if (!txq) {
+   PMD_TX_LOG(ERR, "txq is null");
+   return;
+   }
+   qinfo->nb_desc = txq->vq->vq_nentries;
+   qinfo->conf.tx_free_thresh = txq->vq->vq_free_thresh;
+   qinfo->conf.offloads = dev->data->dev_conf.txmode.offloads;
+   qinfo->queue_state = dev->data->tx_queue_state[tx_queue_id];
+}
+
 /* dev_ops for zxdh, bare necessities for basic operation */
 static const struct eth_dev_ops zxdh_eth_dev_ops = {
.dev_configure   = zxdh_dev_configure,
@@ -1316,6 +1350,8 @@ static const struct eth_dev_ops zxdh_eth_dev_ops = {
.tx_queue_setup  = zxdh_dev_tx_queue_setup,
.rx_queue_intr_enable= zxdh_dev_rx_queue_intr_enable,
.rx_queue_intr_disable   = zxdh_dev_rx_queue_intr_disable,
+   .rxq_info_get= zxdh_rxq_info_get,
+   .txq_info_get= zxdh_txq_info_get,
.link_update = zxdh_dev_link_update,
.dev_set_link_up = zxdh_dev_set_link_up,
.dev_set_link_down   = zxdh_dev_set_link_down,
-- 
2.27.0

[PATCH v3 12/16] net/zxdh: provided CSUM/TSO/LRO config

2025-02-25 Thread Junlong Wang
provided CSUM/TSO/LRO config.

Signed-off-by: Junlong Wang 
---
 doc/guides/nics/features/zxdh.ini |  5 ++
 doc/guides/nics/zxdh.rst  |  3 +
 drivers/net/zxdh/zxdh_ethdev.c| 93 +++
 drivers/net/zxdh/zxdh_msg.c   | 15 +
 4 files changed, 116 insertions(+)

diff --git a/doc/guides/nics/features/zxdh.ini 
b/doc/guides/nics/features/zxdh.ini
index 3561e31666..c80b6dffbb 100644
--- a/doc/guides/nics/features/zxdh.ini
+++ b/doc/guides/nics/features/zxdh.ini
@@ -25,3 +25,8 @@ Inner RSS= Y
 Basic stats  = Y
 Stats per queue  = Y
 MTU update   = Y
+L3 checksum offload  = Y
+Inner L3 checksum= Y
+Inner L4 checksum= Y
+LRO  = Y
+TSO  = Y
diff --git a/doc/guides/nics/zxdh.rst b/doc/guides/nics/zxdh.rst
index 30179c4e6f..bb3ec2c293 100644
--- a/doc/guides/nics/zxdh.rst
+++ b/doc/guides/nics/zxdh.rst
@@ -36,6 +36,9 @@ Features of the ZXDH PMD are:
 - Port hardware statistics
 - MTU update
 - Jumbo frames
+- Inner and Outer Checksum offload
+- Hardware LRO
+- Hardware TSO for generic IP or UDP tunnel, including VXLAN
 
 
 Driver compilation and testing
diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c
index 37225fb95a..e58891dc32 100644
--- a/drivers/net/zxdh/zxdh_ethdev.c
+++ b/drivers/net/zxdh/zxdh_ethdev.c
@@ -837,6 +837,93 @@ zxdh_vlan_offload_configure(struct rte_eth_dev *dev)
return 0;
 }
 
+static int
+zxdh_rx_csum_lro_offload_configure(struct rte_eth_dev *dev)
+{
+   struct zxdh_hw *hw = dev->data->dev_private;
+   struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
+   uint32_t need_accelerator = rxmode->offloads & 
(RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM |
+   RTE_ETH_RX_OFFLOAD_IPV4_CKSUM |
+   RTE_ETH_RX_OFFLOAD_UDP_CKSUM |
+   RTE_ETH_RX_OFFLOAD_TCP_CKSUM |
+   RTE_ETH_RX_OFFLOAD_TCP_LRO);
+   int ret;
+
+   if (hw->is_pf) {
+   struct zxdh_port_attr_table port_attr = {0};
+   zxdh_get_port_attr(hw, hw->vport.vport, &port_attr);
+   port_attr.outer_ip_checksum_offload =
+   (rxmode->offloads & 
RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM) ? true : false;
+   port_attr.ip_checksum_offload =
+   (rxmode->offloads & RTE_ETH_RX_OFFLOAD_IPV4_CKSUM) ? 
true : false;
+   port_attr.tcp_udp_checksum_offload  =
+   (rxmode->offloads & (RTE_ETH_RX_OFFLOAD_UDP_CKSUM | 
RTE_ETH_RX_OFFLOAD_TCP_CKSUM))
+   ? true : false;
+   port_attr.lro_offload =
+   (rxmode->offloads & RTE_ETH_RX_OFFLOAD_TCP_LRO) 
? true : false;
+   port_attr.accelerator_offload_flag  = need_accelerator ? true : 
false;
+   ret = zxdh_set_port_attr(hw, hw->vport.vport, &port_attr);
+   if (ret) {
+   PMD_DRV_LOG(ERR, "%s set port attr failed", __func__);
+   return -1;
+   }
+   } else {
+   struct zxdh_msg_info msg_info = {0};
+   struct zxdh_port_attr_set_msg *attr_msg = 
&msg_info.data.port_attr_msg;
+
+   zxdh_msg_head_build(hw, ZXDH_PORT_ATTRS_SET, &msg_info);
+   attr_msg->mode = ZXDH_PORT_IP_CHKSUM_FLAG;
+   attr_msg->value =
+   (rxmode->offloads & 
RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM) ? true : false;
+   ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), 
NULL, 0);
+   if (ret) {
+   PMD_DRV_LOG(ERR, "%s outer ip cksum config failed", 
__func__);
+   return -1;
+   }
+
+   zxdh_msg_head_build(hw, ZXDH_PORT_ATTRS_SET, &msg_info);
+   attr_msg->mode = ZXDH_PORT_OUTER_IP_CHECKSUM_OFFLOAD_FLAG;
+   attr_msg->value = (rxmode->offloads & 
RTE_ETH_RX_OFFLOAD_IPV4_CKSUM) ? true : false;
+   ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), 
NULL, 0);
+   if (ret) {
+   PMD_DRV_LOG(ERR, "%s ip_checksum config failed to send 
msg", __func__);
+   return -1;
+   }
+
+   zxdh_msg_head_build(hw, ZXDH_PORT_ATTRS_SET, &msg_info);
+   attr_msg->mode = ZXDH_PORT_TCP_UDP_CHKSUM_FLAG;
+   attr_msg->value = (rxmode->offloads &
+   (RTE_ETH_RX_OFFLOAD_UDP_CKSUM | 
RTE_ETH_RX_OFFLOAD_TCP_CKSUM)) ?
+   true : false;
+   ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), 
NULL, 0);
+   if (ret) {
+   PMD_DRV_LOG(ERR, "%s tcp_udp_checksum config failed to 
send msg", __func__);
+   return -1;
+   }
+
+   zxdh_msg_head_build(hw, ZXDH_PORT_ATTRS_SET, &msg_info);
+   attr_msg->mode = ZXDH_PORT_LRO_O

[PATCH 2/4] app/testpmd: support config prio-tc map in DCB command

2025-02-25 Thread Chengwen Feng
Currently, the "port config 0 dcb ..." command config the prio-tc map
by remainder operation, which means the prio-tc = prio % nb_tcs.

This commit introduces an optional parameter "prio-tc" which is the same
as kernel dcb ets tool. The new command:

  port config 0 dcb vt off 4 pfc off prio-tc 0:1 1:2 2:3 ...

If this parameter is not specified, the prio-tc map is configured by
default.

Signed-off-by: Chengwen Feng 
---
 app/test-pmd/cmdline.c  | 119 ++--
 app/test-pmd/testpmd.c  |  21 ++--
 app/test-pmd/testpmd.h  |   4 +-
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |   3 +-
 4 files changed, 125 insertions(+), 22 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index c23b811764..a8aa948c81 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -3447,19 +3447,111 @@ struct cmd_config_dcb {
cmdline_fixed_string_t vt_en;
uint8_t num_tcs;
cmdline_fixed_string_t pfc;
-   cmdline_fixed_string_t pfc_en;
+   cmdline_multi_string_t token_str;
 };
 
+static int
+parse_dcb_token_prio_tc(char *param_str[], int param_num,
+   uint8_t prio_tc[RTE_ETH_DCB_NUM_USER_PRIORITIES],
+   uint8_t *prio_tc_en)
+{
+   unsigned long prio, tc;
+   int prio_tc_maps = 0;
+   char *param, *end;
+   int i;
+
+   for (i = 0; i < param_num; i++) {
+   param = param_str[i];
+   prio = strtoul(param, &end, 10);
+   if (prio >= RTE_ETH_DCB_NUM_USER_PRIORITIES) {
+   fprintf(stderr, "Bad Argument: invalid PRIO %lu\n", 
prio);
+   return -1;
+   }
+   if ((*end != ':') || (strlen(end + 1) == 0)) {
+   fprintf(stderr, "Bad Argument: invalid PRIO:TC format 
%s\n", param);
+   return -1;
+   }
+   tc = strtoul(end + 1, &end, 10);
+   if (tc >= RTE_ETH_8_TCS) {
+   fprintf(stderr, "Bad Argument: invalid TC %lu\n", tc);
+   return -1;
+   }
+   if (*end != '\0') {
+   fprintf(stderr, "Bad Argument: invalid PRIO:TC format 
%s\n", param);
+   return -1;
+   }
+   prio_tc[prio] = tc;
+   prio_tc_maps++;
+   } while (0);
+
+   if (prio_tc_maps == 0) {
+   fprintf(stderr, "Bad Argument: no PRIO:TC provided\n");
+   return -1;
+   }
+   *prio_tc_en = 1;
+
+   return 0;
+}
+
+static int
+parse_dcb_token_value(char *token_str,
+ uint8_t *pfc_en,
+ uint8_t prio_tc[RTE_ETH_DCB_NUM_USER_PRIORITIES],
+ uint8_t *prio_tc_en)
+{
+#define MAX_TOKEN_NUM  128
+   char *split_str[MAX_TOKEN_NUM];
+   int split_num = 0;
+   char *token;
+
+   /* split multiple token to split str. */
+   do {
+   token = strtok_r(token_str, " \f\n\r\t\v", &token_str);
+   if (token == NULL)
+   break;
+   if (split_num >= MAX_TOKEN_NUM) {
+   fprintf(stderr, "Bad Argument: too much argument\n");
+   return -1;
+   }
+   split_str[split_num++] = token;
+   } while (1);
+
+   /* parse fixed parameter "pfc-en" first. */
+   token = split_str[0];
+   if (strcmp(token, "on") == 0)
+   *pfc_en = 1;
+   else if (strcmp(token, "off") == 0)
+   *pfc_en = 0;
+   else {
+   fprintf(stderr, "Bad Argument: pfc-en must be on or off\n");
+   return -EINVAL;
+   }
+
+   if (split_num == 1)
+   return 0;
+
+   /* start parse optional parameter. */
+   token = split_str[1];
+   if (strcmp(token, "prio-tc") != 0) {
+   fprintf(stderr, "Bad Argument: unknown token %s\n", token);
+   return -1;
+   }
+
+   return parse_dcb_token_prio_tc(&split_str[2], split_num - 2, prio_tc, 
prio_tc_en);
+}
+
 static void
 cmd_config_dcb_parsed(void *parsed_result,
 __rte_unused struct cmdline *cl,
 __rte_unused void *data)
 {
+   uint8_t prio_tc[RTE_ETH_DCB_NUM_USER_PRIORITIES] = {0};
struct cmd_config_dcb *res = parsed_result;
struct rte_eth_dcb_info dcb_info;
portid_t port_id = res->port_id;
+   uint8_t prio_tc_en = 0;
struct rte_port *port;
-   uint8_t pfc_en;
+   uint8_t pfc_en = 0;
int ret;
 
port = &ports[port_id];
@@ -3488,20 +3580,19 @@ cmd_config_dcb_parsed(void *parsed_result,
return;
}
 
-   if (!strncmp(res->pfc_en, "on", 2))
-   pfc_en = 1;
-   else
-   pfc_en = 0;
+   ret = parse_dcb_token_value(res->token_str, &pfc_en, prio_tc, 
&prio_tc_en);
+

[PATCH 4/4] app/testpmd: support disable DCB command

2025-02-25 Thread Chengwen Feng
After the "port config 0 dcb ..." command is invoked, no command is
available to disable DCB.

This commit introduces disable DCB when num_tcs is 1, so user could
disable the DCB by command:
  port config 0 dcb vt off 1 pfc off

Signed-off-by: Chengwen Feng 
---
 app/test-pmd/cmdline.c  |  4 +--
 app/test-pmd/testpmd.c  | 40 +
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  2 +-
 3 files changed, 29 insertions(+), 17 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index ef65a75dc7..517e8d47b6 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -3622,9 +3622,9 @@ cmd_config_dcb_parsed(void *parsed_result,
return;
}
 
-   if ((res->num_tcs <= 1 || res->num_tcs > RTE_ETH_8_TCS)) {
+   if ((res->num_tcs < 1 || res->num_tcs > RTE_ETH_8_TCS)) {
fprintf(stderr,
-   "The invalid number of traffic class, only 2~8 
allowed.\n");
+   "The invalid number of traffic class, only 1~8 
allowed.\n");
return;
}
 
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index b11762f698..5e0892d99b 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -4194,6 +4194,14 @@ get_eth_dcb_conf(struct rte_eth_conf *eth_conf, enum 
dcb_mode_enable dcb_mode,
eth_conf->dcb_capability_en = RTE_ETH_DCB_PG_SUPPORT;
 }
 
+static void
+clear_eth_dcb_conf(struct rte_eth_conf *eth_conf)
+{
+   eth_conf->rxmode.mq_mode &= ~(RTE_ETH_MQ_RX_DCB | 
RTE_ETH_MQ_RX_VMDQ_DCB);
+   eth_conf->txmode.mq_mode = RTE_ETH_MQ_TX_NONE;
+   eth_conf->dcb_capability_en = 0;
+}
+
 int
 init_port_dcb_config(portid_t pid,
 enum dcb_mode_enable dcb_mode,
@@ -4217,16 +4225,19 @@ init_port_dcb_config(portid_t pid,
/* retain the original device configuration. */
memcpy(&port_conf, &rte_port->dev_conf, sizeof(struct rte_eth_conf));
 
-   /* set configuration of DCB in vt mode and DCB in non-vt mode */
-   get_eth_dcb_conf(&port_conf, dcb_mode, num_tcs, pfc_en, prio_tc, 
prio_tc_en);
-
-   port_conf.rxmode.offloads |= RTE_ETH_RX_OFFLOAD_VLAN_FILTER;
-   /* remove RSS HASH offload for DCB in vt mode */
-   if (port_conf.rxmode.mq_mode == RTE_ETH_MQ_RX_VMDQ_DCB) {
-   port_conf.rxmode.offloads &= ~RTE_ETH_RX_OFFLOAD_RSS_HASH;
-   for (i = 0; i < nb_rxq; i++)
-   rte_port->rxq[i].conf.offloads &=
-   ~RTE_ETH_RX_OFFLOAD_RSS_HASH;
+   if (num_tcs > 1) {
+   /* set configuration of DCB in vt mode and DCB in non-vt mode */
+   get_eth_dcb_conf(&port_conf, dcb_mode, num_tcs, pfc_en, 
prio_tc, prio_tc_en);
+   port_conf.rxmode.offloads |= RTE_ETH_RX_OFFLOAD_VLAN_FILTER;
+   /* remove RSS HASH offload for DCB in vt mode */
+   if (port_conf.rxmode.mq_mode == RTE_ETH_MQ_RX_VMDQ_DCB) {
+   port_conf.rxmode.offloads &= 
~RTE_ETH_RX_OFFLOAD_RSS_HASH;
+   for (i = 0; i < nb_rxq; i++)
+   rte_port->rxq[i].conf.offloads &=
+   ~RTE_ETH_RX_OFFLOAD_RSS_HASH;
+   }
+   } else {
+   clear_eth_dcb_conf(&port_conf);
}
 
/* re-configure the device . */
@@ -4241,7 +4252,8 @@ init_port_dcb_config(portid_t pid,
/* If dev_info.vmdq_pool_base is greater than 0,
 * the queue id of vmdq pools is started after pf queues.
 */
-   if (dcb_mode == DCB_VT_ENABLED &&
+   if (num_tcs > 1 &&
+   dcb_mode == DCB_VT_ENABLED &&
rte_port->dev_info.vmdq_pool_base > 0) {
fprintf(stderr,
"VMDQ_DCB multi-queue mode is nonsensical for port 
%d.\n",
@@ -4249,7 +4261,7 @@ init_port_dcb_config(portid_t pid,
return -1;
}
 
-   if (keep_qnum == 0) {
+   if (num_tcs > 1 && keep_qnum == 0) {
/* Assume the ports in testpmd have the same dcb capability
 * and has the same number of rxq and txq in dcb mode
 */
@@ -4287,10 +4299,10 @@ init_port_dcb_config(portid_t pid,
if (retval != 0)
return retval;
 
-   rte_port->dcb_flag = 1;
+   rte_port->dcb_flag = num_tcs > 1 ? 1 : 0;
 
/* Enter DCB configuration status */
-   dcb_config = 1;
+   dcb_config = num_tcs > 1 ? 1 : 0;
 
return 0;
 }
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst 
b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index 44eed3f49d..6ad83ae50d 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -2167,7 +2167,7 @@ Set the DCB mode for an individual port::
 
testpmd> port config (port_id) dcb vt (on|off) (traffic_class) pfc (on|off) 
prio-tc (prio-tc) keep-qnum
 
-The traffic class c

[PATCH 1/4] app/testpmd: remove restrict of number of TCs in DCB command

2025-02-25 Thread Chengwen Feng
Currently, the "port config 0 dcb ..." command only supports 4 or 8
TCs. Other number of TCs may be used in actual applications.

This commit removes this restriction.

Cc: sta...@dpdk.org

Signed-off-by: Chengwen Feng 
---
 app/test-pmd/cmdline.c  | 4 ++--
 doc/guides/testpmd_app_ug/testpmd_funcs.rst | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 86d763b66a..c23b811764 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -3469,9 +3469,9 @@ cmd_config_dcb_parsed(void *parsed_result,
return;
}
 
-   if ((res->num_tcs != RTE_ETH_4_TCS) && (res->num_tcs != RTE_ETH_8_TCS)) 
{
+   if ((res->num_tcs <= 1 || res->num_tcs > RTE_ETH_8_TCS)) {
fprintf(stderr,
-   "The invalid number of traffic class, only 4 or 8 
allowed.\n");
+   "The invalid number of traffic class, only 2~8 
allowed.\n");
return;
}
 
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst 
b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index eeef49500f..38bc00705f 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -2167,7 +2167,7 @@ Set the DCB mode for an individual port::
 
testpmd> port config (port_id) dcb vt (on|off) (traffic_class) pfc (on|off)
 
-The traffic class should be 4 or 8.
+The traffic class could be 2~8.
 
 port config - Burst
 ~~~
-- 
2.17.1



[PATCH] dts: add TG setup and teardown

2025-02-25 Thread Luca Vizzarro
Add traffic generator setup and teardown respectively in
TestRunSetup and TestRunTeardown.

Signed-off-by: Luca Vizzarro 
Reviewed-by: Paul Szczepanek 
---
 dts/framework/test_run.py   | 2 ++
 .../testbed_model/traffic_generator/traffic_generator.py| 2 +-
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/dts/framework/test_run.py b/dts/framework/test_run.py
index 9f37c4bb6c..2808d013f6 100644
--- a/dts/framework/test_run.py
+++ b/dts/framework/test_run.py
@@ -334,6 +334,7 @@ def next(self) -> State | None:
 test_run.remaining_tests = deque(test_run.selected_tests)
 
 test_run.ctx.dpdk.setup(test_run.ctx.topology.sut_ports)
+test_run.ctx.tg.setup(test_run.ctx.topology.tg_ports)
 
 self.result.ports = test_run.ctx.topology.sut_ports + 
test_run.ctx.topology.tg_ports
 self.result.sut_info = test_run.ctx.sut_node.node_info
@@ -416,6 +417,7 @@ def description(self) -> str:
 
 def next(self) -> State | None:
 """Next state."""
+self.test_run.ctx.tg.teardown(self.test_run.ctx.topology.tg_ports)
 self.test_run.ctx.dpdk.teardown(self.test_run.ctx.topology.sut_ports)
 self.result.update_teardown(Result.PASS)
 return None
diff --git a/dts/framework/testbed_model/traffic_generator/traffic_generator.py 
b/dts/framework/testbed_model/traffic_generator/traffic_generator.py
index 4469273e36..804662e114 100644
--- a/dts/framework/testbed_model/traffic_generator/traffic_generator.py
+++ b/dts/framework/testbed_model/traffic_generator/traffic_generator.py
@@ -53,7 +53,7 @@ def __init__(self, tg_node: Node, config: 
TrafficGeneratorConfig, **kwargs):
 def setup(self, ports: Iterable[Port]):
 """Setup the traffic generator."""
 
-def teardown(self):
+def teardown(self, ports: Iterable[Port]):
 """Teardown the traffic generator."""
 
 def send_packet(self, packet: Packet, port: Port) -> None:
-- 
2.43.0



DPDK Summit CFP reminder - last week

2025-02-25 Thread Thomas Monjalon
This is the last week to submit a talk proposal
for the DPDK Summit happening on May 8-9 in Prague, Czech Republic.

When your idea is ready, go to this page:
https://events.linuxfoundation.org/dpdk-summit/program/cfp/

The CFP period closes on this Sunday, 2 March.

The DPDK Summit is welcoming anyone having an interest in DPDK
and the technologies used in fast networking.
This is a great opportunity to meet and discuss with the community.

See you there




[PATCH] net/nfp: fix two bugs of error process logic

2025-02-25 Thread Chaoyong He
Fix two bugs of error process logic.

Fixes: 19bd7cce5705 ("net/nfp: support different configuration BAR size")
Fixes: 636e133ec891 ("net/nfp: update Tx and Rx for multiple PF")
Cc: peng.zh...@corigine.com
Cc: sta...@dpdk.org

Signed-off-by: Chaoyong He 
Reviewed-by: Peng Zhang 
---
 drivers/net/nfp/nfp_ethdev.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c
index b9cb9fc652..cbd1deffb4 100644
--- a/drivers/net/nfp/nfp_ethdev.c
+++ b/drivers/net/nfp/nfp_ethdev.c
@@ -2549,7 +2549,7 @@ nfp_pf_init(struct rte_pci_device *pci_dev)
ret = nfp_net_vf_config_init(pf_dev);
if (ret != 0) {
PMD_INIT_LOG(ERR, "Failed to init VF config.");
-   goto vf_cfg_tbl_cleanup;
+   goto mac_stats_cleanup;
}
 
hw_priv->is_pf = true;
@@ -2557,7 +2557,7 @@ nfp_pf_init(struct rte_pci_device *pci_dev)
if (!nfp_net_recv_pkt_meta_check_register(hw_priv)) {
PMD_INIT_LOG(ERR, "PF register meta check function failed.");
ret = -EIO;
-   goto hw_priv_free;
+   goto vf_cfg_tbl_cleanup;
}
 
/*
-- 
2.43.5



Re: [PATCH] Skip vfio in the scenario of non-privileged mode

2025-02-25 Thread Yang Ming



On 2025/1/22 16:15, Yang Ming wrote:

Hi Stephen


Hi Stephen,

Could you please confirm the comment above?

Brs,

Yang Ming



RE: [PATCH v15 09/29] net/rnp: add queue stop and start operations

2025-02-25 Thread 11
Hi Stephen,

I had been not added it to const struct eth_dev_ops  for
.rx/tx_queue_stop/stop :(
Thanks for your check

Regrads Wenbo
> -Original Message-
> From: Stephen Hemminger 
> Sent: 2025年2月26日 0:09
> To: Wenbo Cao 
> Cc: tho...@monjalon.net; dev@dpdk.org; yao...@mucse.com
> Subject: Re: [PATCH v15 09/29] net/rnp: add queue stop and start
operations
> 
> On Tue, 25 Feb 2025 16:41:06 +0800
> Wenbo Cao  wrote:
> 
> > diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst index
> > 99b96e9b8e..c3547c38b6 100644
> > --- a/doc/guides/nics/rnp.rst
> > +++ b/doc/guides/nics/rnp.rst
> > @@ -71,6 +71,10 @@ Listed below are the rte_eth functions supported:
> >  * ``rte_eth_dev_close``
> >  * ``rte_eth_dev_stop``
> >  * ``rte_eth_dev_infos_get``
> > +* ``rte_eth_dev_rx_queue_start``
> > +* ``rte_eth_dev_rx_queue_stop``
> > +* ``rte_eth_dev_tx_queue_start``
> > +* ``rte_eth_dev_tx_queue_stop``
> >  * ``rte_eth_promiscuous_disable``
> >  * ``rte_eth_promiscuous_enable``
> >  * ``rte_eth_allmulticast_enable``
> 
> There is no callback in this driver for rx/tx queue start/stop.
> Did you test this with test-pmd?
> 
> If application calls rte_eth_dev_rx_queue_start()
> 
> int
> rte_eth_dev_rx_queue_start(uint16_t port_id, uint16_t rx_queue_id) { ...
>   if (*dev->dev_ops->rx_queue_start == NULL)
>   return -ENOTSUP;
> 
> The eth_dev_ops in rnp_ethdev.c does not contain rx_queue_start!
> 
> /* Features supported by this driver */
> static const struct eth_dev_ops rnp_eth_dev_ops = {
>   .dev_configure= rnp_dev_configure,
>   .dev_close= rnp_dev_close,
>   .dev_start= rnp_dev_start,
>   .dev_stop = rnp_dev_stop,
>   .dev_infos_get= rnp_dev_infos_get,
> 
>   /* PROMISC */
>   .promiscuous_enable   = rnp_promiscuous_enable,
>   .promiscuous_disable  = rnp_promiscuous_disable,
>   .allmulticast_enable  = rnp_allmulticast_enable,
>   .allmulticast_disable = rnp_allmulticast_disable,
>   .mtu_set  = rnp_mtu_set,
>   .rx_queue_setup   = rnp_rx_queue_setup,
>   .rx_queue_release = rnp_dev_rx_queue_release,
>   .tx_queue_setup   = rnp_tx_queue_setup,
>   .tx_queue_release = rnp_dev_tx_queue_release,
>   .rxq_info_get = rnp_rx_queue_info_get,
>   .txq_info_get = rnp_tx_queue_info_get,
>   .rx_burst_mode_get= rnp_rx_burst_mode_get,
>   .tx_burst_mode_get= rnp_tx_burst_mode_get,
>   /* rss impl */
>   .reta_update  = rnp_dev_rss_reta_update,
>   .reta_query   = rnp_dev_rss_reta_query,
>   .rss_hash_update  = rnp_dev_rss_hash_update,
>   .rss_hash_conf_get= rnp_dev_rss_hash_conf_get,
>   /* stats */
>   .stats_get= rnp_dev_stats_get,
>   .stats_reset  = rnp_dev_stats_reset,
>   .xstats_get   = rnp_dev_xstats_get,
>   .xstats_reset = rnp_dev_xstats_reset,
>   .xstats_get_names = rnp_dev_xstats_get_names,
>   /* link impl */
>   .link_update  = rnp_dev_link_update,
>   .dev_set_link_up  = rnp_dev_set_link_up,
>   .dev_set_link_down= rnp_dev_set_link_down,
>   /* mac address filter */
>   .mac_addr_set = rnp_dev_mac_addr_set,
>   .mac_addr_add = rnp_dev_mac_addr_add,
>   .mac_addr_remove  = rnp_dev_mac_addr_remove,
>   .set_mc_addr_list = rnp_dev_set_mc_addr_list,
>   /* vlan offload */
>   .vlan_offload_set = rnp_vlan_offload_set,
>   .vlan_strip_queue_set = rnp_vlan_strip_queue_set,
>   .vlan_filter_set  = rnp_vlan_filter_set,
>   .dev_supported_ptypes_get = rnp_dev_supported_ptypes_get,
> };




Re: [PATCH 3/6] config: allow faster instruction sets to be used with MSVC

2025-02-25 Thread Andre Muezerie
On Tue, Feb 25, 2025 at 02:28:02PM +, Bruce Richardson wrote:
> On Mon, Feb 24, 2025 at 01:01:16PM -0800, Andre Muezerie wrote:
> > Up to now MSVC has being used with the default mode, which uses SSE2
> > instructions for scalar floating-point and vector calculations.
> > https://learn.microsoft.com/en-us/cpp/build/reference/arch-x64?view=msvc-170
> > 
> > This patch allows users to specify the CPU for which the generated
> > code should be optimized for in the same way it's done for GCC: by
> > passing the CPU name.
> > When no explicit CPU name is passed, 'native' is assumed (like it
> > happens with GCC) and the code will be optimized for the same CPU
> > type used to compile the code.
> > 
> > MSVC does not provide this functionality natively, so logic was
> > added to meson.build to handle these differences, detecting which
> > instruction sets are supported by the CPU(s), passing the best
> > options to MSVC and setting the correct macros (like __AVX512F__)
> > so that the DPDK code can rely on them like it is done with GCC.
> > 
> > Signed-off-by: Andre Muezerie 
> > ---
> 
> Hi Andre,
> 
> couple of initial thoughts inline below.
> 
> /Bruce
> 
> >  config/x86/meson.build | 364 -
> >  1 file changed, 325 insertions(+), 39 deletions(-)
> > 
> 
> There is quite a lot of new code to be added here. Might it be worthwhile
> creating a "config/x86/msvc/" subdirectory with its own meson.build file to
> handle all the complexities of using it. We can have the common material at
> the top of the x86/meson.build file, and then do 
> 
> if is_ms_compiler
> subdir(msvc)
> subdir_done()
> endif
> 
> leaving the rest of the file for the gcc/clang/icx code.

I think that makes sense, as there's not much common code there that is common 
to gcc and msvc.

> 
> > diff --git a/config/x86/meson.build b/config/x86/meson.build
> > index 47a5b0c04a..9260969c54 100644
> > --- a/config/x86/meson.build
> > +++ b/config/x86/meson.build
> > @@ -14,7 +14,194 @@ if is_linux or cc.get_id() == 'gcc'
> >  endif
> >  endif
> >  
> > -cc_avx512_flags = ['-mavx512f', '-mavx512vl', '-mavx512dq', '-mavx512bw']
> > +cpuid_code = '''
> > +#include 
> > +#include 
> > +#include 
> > +
> > +uint32_t f1_ECX = 0;
> > +uint32_t f1_EDX = 0;
> > +uint32_t f7_EBX = 0;
> > +uint32_t f7_ECX = 0;
> > +
> > +void get_support_flags()
> > +{
> > +int ids_max;
> > +int data[4];
> > +
> > +/*
> > + * Calling __cpuid with 0x0 as the function_id argument
> > + * gets the number of the highest valid function ID.
> > + */
> > +__cpuid(data, 0);
> > +ids_max = data[0];
> > +
> > +if (1 <= ids_max) {
> > +__cpuidex(data, 1, 0);
> > +f1_ECX = data[2];
> > +f1_EDX = data[3];
> > +
> > +if (7 <= ids_max) {
> > +__cpuidex(data, 7, 0);
> > +f7_EBX = data[1];
> > +f7_ECX = data[2];
> > +}
> > +}
> > +}
> > +
> > +int get_instruction_support()
> > +{
> > +get_support_flags();
> > +
> > +#ifdef SSE3
> > +return (f1_ECX & (1UL << 0)) ? 1 : 0;
> > +#endif
> > +#ifdef PCLMUL
> > +return (f1_ECX & (1UL << 1)) ? 1 : 0;
> > +#endif
> > +#ifdef SSSE3
> > +return (f1_ECX & (1UL << 9)) ? 1 : 0;
> > +#endif
> > +#ifdef SSE4_1
> > +return (f1_ECX & (1UL << 19)) ? 1 : 0;
> > +#endif
> > +#ifdef SSE4_2
> > +return (f1_ECX & (1UL << 20)) ? 1 : 0;
> > +#endif
> > +#ifdef AES
> > +return (f1_ECX & (1UL << 25)) ? 1 : 0;
> > +#endif
> > +#ifdef AVX
> > +return (f1_ECX & (1UL << 28)) ? 1 : 0;
> > +#endif
> > +#ifdef RDRND
> > +return (f1_ECX & (1UL << 30)) ? 1 : 0;
> > +#endif
> > +#ifdef SSE
> > +return (f1_EDX & (1UL << 25)) ? 1 : 0;
> > +#endif
> > +#ifdef SSE2
> > +return (f1_EDX & (1UL << 26)) ? 1 : 0;
> > +#endif
> > +#ifdef AVX2
> > +return (f7_EBX & (1UL << 5)) ? 1 : 0;
> > +#endif
> > +#ifdef AVX512F
> > +return (f7_EBX & (1UL << 16)) ? 1 : 0;
> > +#endif
> > +#ifdef AVX512DQ
> > +return (f7_EBX & (1UL << 17)) ? 1 : 0;
> > +#endif
> > +#ifdef RDSEED
> > +return (f7_EBX & (1UL << 18)) ? 1 : 0;
> > +#endif
> > +#ifdef AVX512IFMA
> > +return (f7_EBX & (1UL << 21)) ? 1 : 0;
> > +#endif
> > +#ifdef AVX512CD
> > +return (f7_EBX & (1UL << 28)) ? 1 : 0;
> > +#endif
> > +#ifdef AVX512BW
> > +return (f7_EBX & (1UL << 30)) ? 1 : 0;
> > +#endif
> > +#ifdef AVX512VL
> > +return (f7_EBX & (1UL << 31)) ? 1 : 0;
> > +#endif
> > +#ifdef GFNI
> > +return (f7_ECX & (1UL << 8)) ? 1 : 0;
> > +#endif
> > +#ifdef VPCLMULQDQ
> > +return (f7_ECX & (1UL << 10)) ? 1 : 0;
> > +#endif
> > +
> > +

RE: [PATCH] test/event: fix number of queues in eventdev conf

2025-02-25 Thread Jerin Jacob



> -Original Message-
> From: Pavan Nikhilesh Bhagavatula 
> Sent: Tuesday, February 25, 2025 6:37 PM
> To: Shijith Thotton ; Jerin Jacob 
> Cc: dev@dpdk.org; Shijith Thotton ; sta...@dpdk.org;
> Naga Harish K S V 
> Subject: RE: [PATCH] test/event: fix number of queues in eventdev conf
> 
> 
> 
> > -Original Message-
> > From: Shijith Thotton 
> > Sent: Thursday, February 6, 2025 8:03 PM
> > To: Jerin Jacob 
> > Cc: dev@dpdk.org; Pavan Nikhilesh Bhagavatula
> > ; Shijith Thotton ;
> > sta...@dpdk.org; Naga Harish K S V 
> > Subject: [PATCH] test/event: fix number of queues in eventdev conf
> >
> > The unit test adapter_pollq_instance_get requires three event queues,
> > but the test suite was only configuring a single queue. This patch
> > updates the test suite setup function to configure max available queues.
> >
> > Fixes: a1793ee8aba0 ("eventdev/eth_rx: add adapter instance get API")
> > Cc: sta...@dpdk.org
> >
> > Signed-off-by: Shijith Thotton 
> Acked-by: Pavan Nikhilesh 

Applied to dpdk-next-eventdev/for-main. Thanks


[PATCH v16 05/29] net/rnp: add device init and uninit

2025-02-25 Thread Wenbo Cao
add firmware communic method and basic device
init, uninit and close resource function.

Signed-off-by: Wenbo Cao 
Reviewed-by: Ferruh Yigit 
---
 doc/guides/nics/rnp.rst |  10 +
 drivers/net/rnp/base/meson.build|   4 +
 drivers/net/rnp/base/rnp_common.c   |  73 ++
 drivers/net/rnp/base/rnp_common.h   |  12 +
 drivers/net/rnp/base/rnp_dma_regs.h |  13 ++
 drivers/net/rnp/base/rnp_eth_regs.h |  15 ++
 drivers/net/rnp/base/rnp_fw_cmd.c   |  75 +++
 drivers/net/rnp/base/rnp_fw_cmd.h   | 216 ++
 drivers/net/rnp/base/rnp_hw.h   |  39 
 drivers/net/rnp/base/rnp_mac.c  |  28 +++
 drivers/net/rnp/base/rnp_mac.h  |  14 ++
 drivers/net/rnp/base/rnp_mbx_fw.c   | 337 
 drivers/net/rnp/base/rnp_mbx_fw.h   |  18 ++
 drivers/net/rnp/base/rnp_osdep.h|  91 
 drivers/net/rnp/meson.build |   1 +
 drivers/net/rnp/rnp.h   |  44 
 drivers/net/rnp/rnp_ethdev.c| 321 +-
 17 files changed, 1302 insertions(+), 9 deletions(-)
 create mode 100644 drivers/net/rnp/base/rnp_common.c
 create mode 100644 drivers/net/rnp/base/rnp_common.h
 create mode 100644 drivers/net/rnp/base/rnp_dma_regs.h
 create mode 100644 drivers/net/rnp/base/rnp_eth_regs.h
 create mode 100644 drivers/net/rnp/base/rnp_fw_cmd.c
 create mode 100644 drivers/net/rnp/base/rnp_fw_cmd.h
 create mode 100644 drivers/net/rnp/base/rnp_mac.c
 create mode 100644 drivers/net/rnp/base/rnp_mac.h
 create mode 100644 drivers/net/rnp/base/rnp_mbx_fw.c
 create mode 100644 drivers/net/rnp/base/rnp_mbx_fw.h

diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index cca249be78..1f860e3f18 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -54,3 +54,13 @@ Limitations or Known issues
 ---
 
 X86-32, BSD, Armv7, RISC-V, Windows, are not supported yet.
+
+Supported APIs
+--
+
+rte_eth APIs
+
+
+Listed below are the rte_eth functions supported:
+* ``rte_eth_dev_close``
+* ``rte_eth_dev_stop``
diff --git a/drivers/net/rnp/base/meson.build b/drivers/net/rnp/base/meson.build
index 22e7d0ee4b..10026e0425 100644
--- a/drivers/net/rnp/base/meson.build
+++ b/drivers/net/rnp/base/meson.build
@@ -3,6 +3,10 @@
 
 sources = [
 'rnp_mbx.c',
+'rnp_fw_cmd.c',
+'rnp_mbx_fw.c',
+'rnp_common.c',
+'rnp_mac.c',
 ]
 
 c_args = cflags
diff --git a/drivers/net/rnp/base/rnp_common.c 
b/drivers/net/rnp/base/rnp_common.c
new file mode 100644
index 00..5cd4ec133e
--- /dev/null
+++ b/drivers/net/rnp/base/rnp_common.c
@@ -0,0 +1,73 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2023 Mucse IC Design Ltd.
+ */
+
+#include "rnp_osdep.h"
+#include "rnp_hw.h"
+#include "rnp_eth_regs.h"
+#include "rnp_dma_regs.h"
+#include "rnp_common.h"
+#include "rnp_mbx_fw.h"
+#include "rnp_mac.h"
+#include "../rnp.h"
+
+static void
+rnp_hw_reset(struct rnp_hw *hw)
+{
+   PMD_INIT_FUNC_TRACE();
+
+   RNP_E_REG_WR(hw, RNP_NIC_RESET, 0);
+   /* hardware reset valid must be 0 -> 1 */
+   wmb();
+   RNP_E_REG_WR(hw, RNP_NIC_RESET, 1);
+   RNP_PMD_DRV_LOG(INFO, "PF[%d] reset nic finish", hw->mbx.pf_num);
+}
+
+int rnp_init_hw(struct rnp_hw *hw)
+{
+   struct rnp_eth_port *port = RNP_DEV_TO_PORT(hw->back->eth_dev);
+   u32 version = 0;
+   int ret = -1;
+   u32 state;
+
+   PMD_INIT_FUNC_TRACE();
+   version = RNP_E_REG_RD(hw, RNP_DMA_VERSION);
+   RNP_PMD_DRV_LOG(INFO, "nic hw version:0x%.2x", version);
+   rnp_fw_init(hw);
+   RNP_E_REG_WR(hw, RNP_DMA_HW_EN, FALSE);
+   do {
+   state = RNP_E_REG_RD(hw, RNP_DMA_HW_STATE);
+   } while (state == 0);
+   ret = rnp_mbx_fw_get_capability(port);
+   if (ret) {
+   RNP_PMD_ERR("mbx_get_capability error! errcode=%d", ret);
+   return ret;
+   }
+   rnp_hw_reset(hw);
+   rnp_mbx_fw_reset_phy(hw);
+   /* rx packet protocol engine bypass */
+   RNP_E_REG_WR(hw, RNP_E_ENG_BYPASS, FALSE);
+   /* enable host filter */
+   RNP_E_REG_WR(hw, RNP_E_FILTER_EN, TRUE);
+   /* enable vxlan parse */
+   RNP_E_REG_WR(hw, RNP_E_VXLAN_PARSE_EN, TRUE);
+   /* enable flow direct engine */
+   RNP_E_REG_WR(hw, RNP_E_REDIR_EN, TRUE);
+   /* enable dma engine */
+   RNP_E_REG_WR(hw, RNP_DMA_HW_EN, RNP_DMA_EN_ALL);
+#define RNP_TARGET_TC_PORT (2)
+#define RNP_PORT_OFF_QUEUE_NUM (2)
+   if (hw->nic_mode == RNP_DUAL_10G && hw->max_port_num == 2)
+   RNP_E_REG_WR(hw, RNP_TC_PORT_OFFSET(RNP_TARGET_TC_PORT),
+   RNP_PORT_OFF_QUEUE_NUM);
+
+   return 0;
+}
+
+int
+rnp_setup_common_ops(struct rnp_hw *hw)
+{
+   rnp_mac_ops_init(hw);
+
+   return 0;
+}
diff --git a/drivers/net/rnp/base/rnp_common.h 
b/drivers/net/rnp/base/rnp_common.h
new file mode 100644
index 00..aaf77a6dad
--- /dev/null
+++ b/drivers

[PATCH v16 06/29] net/rnp: add get device information operation

2025-02-25 Thread Wenbo Cao
add get device hardware capability function

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/features/rnp.ini  |   1 +
 doc/guides/nics/rnp.rst   |   1 +
 drivers/net/rnp/base/rnp_fw_cmd.c |  20 ++
 drivers/net/rnp/base/rnp_fw_cmd.h |  80 +
 drivers/net/rnp/base/rnp_mbx_fw.c |  55 ++
 drivers/net/rnp/base/rnp_mbx_fw.h |   1 +
 drivers/net/rnp/rnp.h |  73 ++-
 drivers/net/rnp/rnp_ethdev.c  | 115 +-
 8 files changed, 344 insertions(+), 2 deletions(-)

diff --git a/doc/guides/nics/features/rnp.ini b/doc/guides/nics/features/rnp.ini
index 2ad04ee330..6766130a68 100644
--- a/doc/guides/nics/features/rnp.ini
+++ b/doc/guides/nics/features/rnp.ini
@@ -4,5 +4,6 @@
 ; Refer to default.ini for the full list of available PMD features.
 ;
 [Features]
+Speed capabilities   = Y
 Linux= Y
 x86-64   = Y
diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index 1f860e3f18..ace3aeaa93 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -64,3 +64,4 @@ rte_eth APIs
 Listed below are the rte_eth functions supported:
 * ``rte_eth_dev_close``
 * ``rte_eth_dev_stop``
+* ``rte_eth_dev_infos_get``
diff --git a/drivers/net/rnp/base/rnp_fw_cmd.c 
b/drivers/net/rnp/base/rnp_fw_cmd.c
index 676c5a2521..3891249499 100644
--- a/drivers/net/rnp/base/rnp_fw_cmd.c
+++ b/drivers/net/rnp/base/rnp_fw_cmd.c
@@ -51,6 +51,23 @@ rnp_build_get_macaddress_req(struct rnp_mbx_fw_cmd_req *req,
arg->pfvf_num = req_arg->param1;
 }
 
+static inline void
+rnp_build_get_lane_status_req(struct rnp_mbx_fw_cmd_req *req,
+ struct rnp_fw_req_arg *req_arg,
+ void *cookie)
+{
+   struct rnp_get_lane_st_req *arg = (struct rnp_get_lane_st_req 
*)req->data;
+
+   req->flags = 0;
+   req->opcode = RNP_GET_LANE_STATUS;
+   req->datalen = sizeof(*arg);
+   req->cookie = cookie;
+   req->reply_lo = 0;
+   req->reply_hi = 0;
+
+   arg->nr_lane = req_arg->param0;
+}
+
 int rnp_build_fwcmd_req(struct rnp_mbx_fw_cmd_req *req,
struct rnp_fw_req_arg *arg,
void *cookie)
@@ -67,6 +84,9 @@ int rnp_build_fwcmd_req(struct rnp_mbx_fw_cmd_req *req,
case RNP_GET_MAC_ADDRESS:
rnp_build_get_macaddress_req(req, arg, cookie);
break;
+   case RNP_GET_LANE_STATUS:
+   rnp_build_get_lane_status_req(req, arg, cookie);
+   break;
default:
err = -EOPNOTSUPP;
}
diff --git a/drivers/net/rnp/base/rnp_fw_cmd.h 
b/drivers/net/rnp/base/rnp_fw_cmd.h
index 87f0823dba..5f60ac6187 100644
--- a/drivers/net/rnp/base/rnp_fw_cmd.h
+++ b/drivers/net/rnp/base/rnp_fw_cmd.h
@@ -129,6 +129,80 @@ struct rnp_mac_addr_rep {
u32 pcode;
 };
 
+#define RNP_SPEED_CAP_UNKNOWN(0)
+#define RNP_SPEED_CAP_10M_FULL   RTE_BIT32(2)
+#define RNP_SPEED_CAP_100M_FULL  RTE_BIT32(3)
+#define RNP_SPEED_CAP_1GB_FULL   RTE_BIT32(4)
+#define RNP_SPEED_CAP_10GB_FULL  RTE_BIT32(5)
+#define RNP_SPEED_CAP_40GB_FULL  RTE_BIT32(6)
+#define RNP_SPEED_CAP_25GB_FULL  RTE_BIT32(7)
+#define RNP_SPEED_CAP_50GB_FULL  RTE_BIT32(8)
+#define RNP_SPEED_CAP_100GB_FULL RTE_BIT32(9)
+#define RNP_SPEED_CAP_10M_HALF   RTE_BIT32(10)
+#define RNP_SPEED_CAP_100M_HALF  RTE_BIT32(11)
+#define RNP_SPEED_CAP_1GB_HALF   RTE_BIT32(12)
+
+enum rnp_pma_phy_type {
+   RNP_PHY_TYPE_NONE = 0,
+   RNP_PHY_TYPE_1G_BASE_KX,
+   RNP_PHY_TYPE_SGMII,
+   RNP_PHY_TYPE_10G_BASE_KR,
+   RNP_PHY_TYPE_25G_BASE_KR,
+   RNP_PHY_TYPE_40G_BASE_KR4,
+   RNP_PHY_TYPE_10G_BASE_SR,
+   RNP_PHY_TYPE_40G_BASE_SR4,
+   RNP_PHY_TYPE_40G_BASE_CR4,
+   RNP_PHY_TYPE_40G_BASE_LR4,
+   RNP_PHY_TYPE_10G_BASE_LR,
+   RNP_PHY_TYPE_10G_BASE_ER,
+   RNP_PHY_TYPE_10G_TP,
+};
+
+struct rnp_lane_stat_rep {
+   u8 nr_lane; /* 0-3 cur port correspond with hw lane */
+   u8 pci_gen  : 4; /* nic cur pci speed genX: 1,2,3 */
+   u8 pci_lanes: 4; /* nic cur pci x1 x2 x4 x8 x16 */
+   u8 pma_type;
+   u8 phy_type;/* interface media type */
+
+   u16 linkup  : 1; /* cur port link state */
+   u16 duplex  : 1; /* duplex state only RJ45 valid */
+   u16 autoneg : 1; /* autoneg state */
+   u16 fec : 1; /* fec state */
+   u16 rev_an  : 1;
+   u16 link_traing : 1; /* link-traing state */
+   u16 media_available : 1;
+   u16 is_sgmii: 1; /* 1: Twisted Pair 0: FIBRE */
+   u16 link_fault  : 4;
+#define RNP_LINK_LINK_FAULTRTE_BIT32(0)
+#define RNP_LINK_TX_FAULT  RTE_BIT32(1)
+#define RNP_LINK_RX_FAULT  RTE_BIT32(2)
+#define RNP_LINK_REMOTE_FAULT  RTE_BIT32(3)
+   u16 is_backplane: 1;   /* Backplane Mode */
+   u16 is_speed_10G_1G_auto_swit

[PATCH v16 04/29] net/rnp: support mailbox basic operate

2025-02-25 Thread Wenbo Cao
This patch adds support for mailbox of rnp PMD driver,
mailbox is used for communication between pf with fw
and vf driver.

Signed-off-by: Wenbo Cao 
Reviewed-by: Stephen Hemminger 
---
 drivers/net/rnp/base/meson.build |  12 +
 drivers/net/rnp/base/rnp_hw.h|  77 +
 drivers/net/rnp/base/rnp_mbx.c   | 507 +++
 drivers/net/rnp/base/rnp_mbx.h   |  59 
 drivers/net/rnp/base/rnp_osdep.h |  55 
 drivers/net/rnp/meson.build  |   5 +
 drivers/net/rnp/rnp.h|  19 ++
 7 files changed, 734 insertions(+)
 create mode 100644 drivers/net/rnp/base/meson.build
 create mode 100644 drivers/net/rnp/base/rnp_hw.h
 create mode 100644 drivers/net/rnp/base/rnp_mbx.c
 create mode 100644 drivers/net/rnp/base/rnp_mbx.h
 create mode 100644 drivers/net/rnp/base/rnp_osdep.h

diff --git a/drivers/net/rnp/base/meson.build b/drivers/net/rnp/base/meson.build
new file mode 100644
index 00..22e7d0ee4b
--- /dev/null
+++ b/drivers/net/rnp/base/meson.build
@@ -0,0 +1,12 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(C) 2023 Mucse IC Design Ltd.
+
+sources = [
+'rnp_mbx.c',
+]
+
+c_args = cflags
+base_lib = static_library('rnp_base', sources,
+dependencies: [static_rte_eal, static_rte_net, static_rte_ethdev],
+c_args: c_args)
+base_objs = base_lib.extract_all_objects(recursive: true)
diff --git a/drivers/net/rnp/base/rnp_hw.h b/drivers/net/rnp/base/rnp_hw.h
new file mode 100644
index 00..326b850560
--- /dev/null
+++ b/drivers/net/rnp/base/rnp_hw.h
@@ -0,0 +1,77 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2023 Mucse IC Design Ltd.
+ */
+
+#ifndef _RNP_HW_H_
+#define _RNP_HW_H_
+
+#include "rnp_osdep.h"
+
+struct rnp_hw;
+/* Mailbox Operate Info */
+enum RNP_MBX_ID {
+   RNP_MBX_PF = 0,
+   RNP_MBX_VF,
+   RNP_MBX_FW = 64,
+};
+
+struct rnp_mbx_ops {
+   int (*read)(struct rnp_hw *hw,
+   u32 *msg,
+   u16 size,
+   enum RNP_MBX_ID);
+   int (*write)(struct rnp_hw *hw,
+   u32 *msg,
+   u16 size,
+   enum RNP_MBX_ID);
+   int (*read_posted)(struct rnp_hw *hw,
+   u32 *msg,
+   u16 size,
+   enum RNP_MBX_ID);
+   int (*write_posted)(struct rnp_hw *hw,
+   u32 *msg,
+   u16 size,
+   enum RNP_MBX_ID);
+   int (*check_for_msg)(struct rnp_hw *hw, enum RNP_MBX_ID);
+   int (*check_for_ack)(struct rnp_hw *hw, enum RNP_MBX_ID);
+   int (*check_for_rst)(struct rnp_hw *hw, enum RNP_MBX_ID);
+};
+
+struct rnp_mbx_sync {
+   u16 req;
+   u16 ack;
+};
+
+struct rnp_mbx_info {
+   const struct rnp_mbx_ops *ops;
+   u32 usec_delay; /* retry interval delay time */
+   u32 timeout;/* retry ops timeout limit */
+   u16 size;   /* data buffer size*/
+   u16 vf_num; /* Virtual Function num */
+   u16 pf_num; /* Physical Function num */
+   u16 sriov_st;   /* Sriov state */
+   u16 en_vfs; /* user enabled vf num */
+   bool is_pf;
+
+   struct rnp_mbx_sync syncs[RNP_MBX_FW + 1];
+};
+
+struct rnp_eth_adapter;
+
+/* hw device description */
+struct rnp_hw {
+   struct rnp_eth_adapter *back;   /* backup to the adapter handle */
+   void __iomem *e_ctrl;   /* ethernet control bar */
+   void __iomem *c_ctrl;   /* crypto control bar */
+   u32 c_blen; /* crypto bar size */
+
+   /* pci device info */
+   u16 device_id;
+   u16 vendor_id;
+   u16 max_vfs;/* device max support vf */
+
+   u16 pf_vf_num;
+   struct rnp_mbx_info mbx;
+};
+
+#endif /* _RNP_HW_H_ */
diff --git a/drivers/net/rnp/base/rnp_mbx.c b/drivers/net/rnp/base/rnp_mbx.c
new file mode 100644
index 00..09d490cc54
--- /dev/null
+++ b/drivers/net/rnp/base/rnp_mbx.c
@@ -0,0 +1,507 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2023 Mucse IC Design Ltd.
+ */
+
+#include 
+
+#include "rnp_hw.h"
+#include "rnp_mbx.h"
+#include "../rnp.h"
+
+/PF MBX OPS/
+static inline u16
+rnp_mbx_get_req(struct rnp_hw *hw, enum RNP_MBX_ID mbx_id)
+{
+   u32 reg = 0;
+
+   if (mbx_id == RNP_MBX_FW)
+   reg = RNP_FW2PF_SYNC;
+   else
+   reg = RNP_VF2PF_SYNC(mbx_id);
+   mb();
+
+   return RNP_E_REG_RD(hw, reg) & RNP_MBX_SYNC_REQ_MASK;
+}
+
+static inline u16
+rnp_mbx_get_ack(struct rnp_hw *hw, enum RNP_MBX_ID mbx_id)
+{
+   u32 reg = 0;
+   u32 v = 0;
+
+   if (mbx_id == RNP_MBX_FW)
+   reg = RNP_FW2PF_SYNC;
+   else
+   reg = RNP_VF2PF_SYNC(mbx_id);
+   mb();
+   v = RNP_E_REG_RD(hw, reg);
+
+   return (v & RNP_MBX_SYNC_ACK_MASK) >> RNP_MBX_

[PATCH v16 00/28] [v16]drivers/net Add Support mucse N10 Pmd Driver

2025-02-25 Thread Wenbo Cao
For This patchset just to support the basic chip init work
and user can just found the eth_dev, but can't control more.
For Now just support 2*10g nic,the chip can support
2*10g,4*10g,4*1g,8*1g,8*10g.
The Feature rx side can support rx-cksum-offload,rss,vlan-filter
flow_clow,uncast_filter,mcast_filter,1588,Jumbo-frame
The Feature tx side can support tx-cksum-offload,tso,vxlan-tso 
flow director base on ntuple pattern of tcp/udp/ip/ eth_hdr->type
for sriov is also support.

Because of the chip design defect, for multiple-port mode
one pci-bdf will have multiple-port (max can have four ports)
so this code must be care of one bdf init multiple-port.

v16
  * fixed rxq/txq stop/start not add to eth_ops as rnp doc descript.

v15:
  * fixed scatter recv for jumbo frame test by dts mtu.

v14:
  * add multicast mac filter feature for basic nic feature.
  * fixed pvs studio low,media,high level warning as the below cmd
pvs-studio-analyzer analyze -f build/compile_commands.json -j 8
plog-converter -a GA:1,2,3 -t fullhtml PVS-Studio.log -o /root/report

v13:
  * Supplementary document about n10 network card characteristics.
  * update release_25_03.rst.
  * fixed the code style advisea Stephen Hemminger.
  * fixed the code issue check PVS-stdio for Static compilation error.

v12:
  * fixed __rte_packed __deprecated__ compile issue.

v11:
  * fixed array-bounds issue when used rte_memcpy src addr is
  * not enough to hold align dst.
  * improve efficient_code advised by Stephen

v10:
  * fixed mingw windows meson issue
  * rnp not support windows for now.

v9:
  * fixed commit log format check by devtools.
  * fixed code compile issue.

v8:
  * fixed codespell issue.
  * fixed MAINTAINERS file

v7:
  * add support nic basic feature such as rss vlan strip/filter,
  * mtu-change recv/send scater-recv/mutltiple-send.
  * fixed code rationality, advised by Ferruh Yigit.
v6:
  * fixed the doc(rst) format problem advise by Thomas Monjalon

v5:
  * fixed the symbol name require by the style documentation

v4:
  * one patch has been forgot to upload :(

v3:
  * fixed http://dpdk.org/patch/129830 FreeBSD 13 compile Issue
  * change iobar type to void suggest by Stephen Hemminger
  * add KMOD_DEP support for vfio-pci
  * change run-cmd argument parse check for invalid extra_args

v2:
  * fixed MAINTAIN maillist fullname format
  * fixed driver/net/meson the order issue of new driver to driver list
  * improve virtual point function usage suggest by Stephen Hemminger

Wenbo Cao (29):
  net/rnp: add skeleton
  net/rnp: add ethdev probe and remove
  net/rnp: add log
  net/rnp: support mailbox basic operate
  net/rnp: add device init and uninit
  net/rnp: add get device information operation
  net/rnp: add support MAC promisc mode
  net/rnp: add queue setup and release operations
  net/rnp: add queue stop and start operations
  net/rnp: add support device start stop operations
  net/rnp: add RSS support operations
  net/rnp: add support link update operations
  net/rnp: add support link setup operations
  net/rnp: add Rx burst simple support
  net/rnp: add Tx burst simple support
  net/rnp: add MTU set operation
  net/rnp: add Rx scatter segment version
  net/rnp: add Tx multiple segment version
  net/rnp: add support basic stats operation
  net/rnp: add support xstats operation
  net/rnp: add unicast MAC filter operation
  net/rnp: add supported packet types
  net/rnp: add support Rx checksum offload
  net/rnp: add support Tx TSO offload
  net/rnp: support VLAN offloads
  net/rnp: add support VLAN filters operations
  net/rnp: add queue info operation
  net/rnp: support Rx/Tx burst mode info
  net/rnp: add multicast MAC filter operation

 .mailmap   |1 +
 MAINTAINERS|6 +
 doc/guides/nics/features/rnp.ini   |   34 +
 doc/guides/nics/img/mucse_nic_port.svg | 4023 
 doc/guides/nics/index.rst  |1 +
 doc/guides/nics/rnp.rst|  130 +
 doc/guides/rel_notes/release_25_03.rst |5 +
 drivers/net/meson.build|1 +
 drivers/net/rnp/base/meson.build   |   18 +
 drivers/net/rnp/base/rnp_bdq_if.c  |  398 +++
 drivers/net/rnp/base/rnp_bdq_if.h  |  154 +
 drivers/net/rnp/base/rnp_bitrev.h  |   64 +
 drivers/net/rnp/base/rnp_common.c  |  103 +
 drivers/net/rnp/base/rnp_common.h  |   17 +
 drivers/net/rnp/base/rnp_crc32.c   |   53 +
 drivers/net/rnp/base/rnp_crc32.h   |   11 +
 drivers/net/rnp/base/rnp_dma_regs.h|   68 +
 drivers/net/rnp/base/rnp_eth_regs.h|   94 +
 drivers/net/rnp/base/rnp_fw_cmd.c  |  162 +
 drivers/net/rnp/base/rnp_fw_cmd.h  |  357 +++
 drivers/net/rnp/base/rnp_hw.h  |  141 +
 drivers/net/rnp/base/rnp_mac.c |  480 +++
 drivers/net/rnp/base/rnp_mac.h |   36 +
 drivers/net/rnp/base/rnp_mac_regs.h|  210 ++
 drivers/net/rnp/base/rnp_mbx.c |  507 +++
 drivers/net/rnp/base/rnp_mbx.h |   59 +
 dri

[PATCH v16 07/29] net/rnp: add support MAC promisc mode

2025-02-25 Thread Wenbo Cao
add support two method of MAC unicast promisc
mulcast promisc broadcast promisc mode

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/features/rnp.ini|   2 +
 doc/guides/nics/rnp.rst |  11 +++
 drivers/net/rnp/base/rnp_common.c   |   5 ++
 drivers/net/rnp/base/rnp_eth_regs.h |  15 
 drivers/net/rnp/base/rnp_hw.h   |  11 ++-
 drivers/net/rnp/base/rnp_mac.c  | 107 +++-
 drivers/net/rnp/base/rnp_mac.h  |   2 +
 drivers/net/rnp/base/rnp_mac_regs.h |  39 ++
 drivers/net/rnp/base/rnp_osdep.h|   5 ++
 drivers/net/rnp/rnp_ethdev.c|  43 +++
 10 files changed, 238 insertions(+), 2 deletions(-)
 create mode 100644 drivers/net/rnp/base/rnp_mac_regs.h

diff --git a/doc/guides/nics/features/rnp.ini b/doc/guides/nics/features/rnp.ini
index 6766130a68..65f1ed3da0 100644
--- a/doc/guides/nics/features/rnp.ini
+++ b/doc/guides/nics/features/rnp.ini
@@ -5,5 +5,7 @@
 ;
 [Features]
 Speed capabilities   = Y
+Promiscuous mode = Y
+Allmulticast mode= Y
 Linux= Y
 x86-64   = Y
diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index ace3aeaa93..5f6e22f287 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -41,6 +41,11 @@ N10 has two functions, each function support muiple ports(1 
to 8),which not same
 
rnp mucse nic port.
 
+Features
+
+
+- Promiscuous mode
+
 Prerequisites and Pre-conditions
 
 - Prepare the system as recommended by DPDK suite.
@@ -65,3 +70,9 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_dev_close``
 * ``rte_eth_dev_stop``
 * ``rte_eth_dev_infos_get``
+* ``rte_eth_promiscuous_disable``
+* ``rte_eth_promiscuous_enable``
+* ``rte_eth_allmulticast_enable``
+* ``rte_eth_allmulticast_disable``
+* ``rte_eth_promiscuous_get``
+* ``rte_eth_allmulticast_get``
diff --git a/drivers/net/rnp/base/rnp_common.c 
b/drivers/net/rnp/base/rnp_common.c
index 5cd4ec133e..5655126ae0 100644
--- a/drivers/net/rnp/base/rnp_common.c
+++ b/drivers/net/rnp/base/rnp_common.c
@@ -4,6 +4,7 @@
 
 #include "rnp_osdep.h"
 #include "rnp_hw.h"
+#include "rnp_mac_regs.h"
 #include "rnp_eth_regs.h"
 #include "rnp_dma_regs.h"
 #include "rnp_common.h"
@@ -28,6 +29,7 @@ int rnp_init_hw(struct rnp_hw *hw)
struct rnp_eth_port *port = RNP_DEV_TO_PORT(hw->back->eth_dev);
u32 version = 0;
int ret = -1;
+   u32 idx = 0;
u32 state;
 
PMD_INIT_FUNC_TRACE();
@@ -60,6 +62,9 @@ int rnp_init_hw(struct rnp_hw *hw)
if (hw->nic_mode == RNP_DUAL_10G && hw->max_port_num == 2)
RNP_E_REG_WR(hw, RNP_TC_PORT_OFFSET(RNP_TARGET_TC_PORT),
RNP_PORT_OFF_QUEUE_NUM);
+   /* setup mac resiger ctrl base */
+   for (idx = 0; idx < hw->max_port_num; idx++)
+   hw->mac_base[idx] = (u8 *)hw->e_ctrl + RNP_MAC_BASE_OFFSET(idx);
 
return 0;
 }
diff --git a/drivers/net/rnp/base/rnp_eth_regs.h 
b/drivers/net/rnp/base/rnp_eth_regs.h
index 6957866d76..c4519ba1e5 100644
--- a/drivers/net/rnp/base/rnp_eth_regs.h
+++ b/drivers/net/rnp/base/rnp_eth_regs.h
@@ -10,6 +10,21 @@
 #define RNP_E_FILTER_EN_ETH_(0x801c)
 #define RNP_E_REDIR_EN _ETH_(0x8030)
 
+/* Mac Host Filter  */
+#define RNP_MAC_FCTRL  _ETH_(0x9110)
+#define RNP_MAC_FCTRL_MPE  RTE_BIT32(8)  /* Multicast Promiscuous En */
+#define RNP_MAC_FCTRL_UPE  RTE_BIT32(9)  /* Unicast Promiscuous En */
+#define RNP_MAC_FCTRL_BAM  RTE_BIT32(10) /* Broadcast Accept Mode */
+#define RNP_MAC_FCTRL_BYPASS   (\
+   RNP_MAC_FCTRL_MPE | \
+   RNP_MAC_FCTRL_UPE | \
+   RNP_MAC_FCTRL_BAM)
+/* Mucast unicast mac hash filter ctrl */
+#define RNP_MAC_MCSTCTRL   _ETH_(0x9114)
+#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)
+
 #define RNP_TC_PORT_OFFSET(lane)   _ETH_(0xe840 + 0x04 * (lane))
 
 #endif /* _RNP_ETH_REGS_H */
diff --git a/drivers/net/rnp/base/rnp_hw.h b/drivers/net/rnp/base/rnp_hw.h
index 3d1d5cd87b..8e4ca54d45 100644
--- a/drivers/net/rnp/base/rnp_hw.h
+++ b/drivers/net/rnp/base/rnp_hw.h
@@ -60,9 +60,17 @@ struct rnp_mbx_info {
 
 struct rnp_eth_port;
 /* mac operations */
+enum rnp_mpf_modes {
+   RNP_MPF_MODE_NONE = 0,
+   RNP_MPF_MODE_ALLMULTI, /* Multitle Promisc */
+   RNP_MPF_MODE_PROMISC,  /* Unicast Promisc */
+};
+
 struct rnp_mac_ops {
-   /* update mac packet filter mode */
+   /* get default mac address */
int (*get_macaddr)(struct rnp_eth_port *port, u8 *mac);
+   /* update mac packet filter mode */
+   int (*update_mpfm)(struct rnp_eth_port *port, u32 mode, bool en);
 };
 
 struct rnp_eth_adapter;
@@ -92,6 +100,7 @@ struct rnp_hw {
struct rnp_eth_adapter *back;   /* backup to the adapter handle */
void __iomem *e_ctrl;   /* eth

[PATCH v16 03/29] net/rnp: add log

2025-02-25 Thread Wenbo Cao
add log function for trace or debug

Signed-off-by: Wenbo Cao 
---
 drivers/net/rnp/rnp_ethdev.c |  2 ++
 drivers/net/rnp/rnp_logs.h   | 36 
 2 files changed, 38 insertions(+)
 create mode 100644 drivers/net/rnp/rnp_logs.h

diff --git a/drivers/net/rnp/rnp_ethdev.c b/drivers/net/rnp/rnp_ethdev.c
index e2eb80ba69..7fe93edcf6 100644
--- a/drivers/net/rnp/rnp_ethdev.c
+++ b/drivers/net/rnp/rnp_ethdev.c
@@ -64,6 +64,8 @@ static struct rte_pci_driver rte_rnp_pmd = {
.remove = rnp_pci_remove,
 };
 
+RTE_LOG_REGISTER_SUFFIX(rnp_init_logtype, init, NOTICE);
+
 RTE_PMD_REGISTER_PCI(net_rnp, rte_rnp_pmd);
 RTE_PMD_REGISTER_PCI_TABLE(net_rnp, pci_id_rnp_map);
 RTE_PMD_REGISTER_KMOD_DEP(net_rnp, "igb_uio | uio_pci_generic | vfio-pci");
diff --git a/drivers/net/rnp/rnp_logs.h b/drivers/net/rnp/rnp_logs.h
new file mode 100644
index 00..c68a5c1028
--- /dev/null
+++ b/drivers/net/rnp/rnp_logs.h
@@ -0,0 +1,36 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2023 Mucse IC Design Ltd.
+ */
+
+#ifndef __RNP_LOGS_H__
+#define __RNP_LOGS_H__
+
+#include 
+
+extern int rnp_init_logtype;
+#define RTE_LOGTYPE_RNP_INIT rnp_init_logtype
+#define RNP_PMD_INIT_LOG(level, ...) \
+   RTE_LOG_LINE_PREFIX(level, RNP_INIT, "%s(): ", __func__,  __VA_ARGS__)
+#define PMD_INIT_FUNC_TRACE() RNP_PMD_INIT_LOG(DEBUG, " >>")
+#define RNP_PMD_DRV_LOG(level, ...) \
+   RTE_LOG_LINE_PREFIX(level, RNP_INIT, \
+   "%s(): ", __func__, __VA_ARGS__)
+#define RNP_PMD_LOG(level, ...) \
+   RTE_LOG_LINE_PREFIX(level, RNP_INIT, \
+   "rnp_net: (%d) ", __LINE__, __VA_ARGS__)
+#define RNP_PMD_ERR(fmt, ...) \
+   RNP_PMD_LOG(ERR, fmt, ## __VA_ARGS__)
+#define RNP_PMD_WARN(fmt, ...) \
+   RNP_PMD_LOG(WARNING, fmt, ## __VA_ARGS__)
+#define RNP_PMD_INFO(fmt, ...) \
+   RNP_PMD_LOG(INFO, fmt, ## __VA_ARGS__)
+
+#ifdef RTE_LIBRTE_RNP_REG_DEBUG
+#define RNP_PMD_REG_LOG(level, ...) \
+   RTE_LOG_LINE_PREFIX(level, RNP_INIT, \
+   "%s(): ", __func__, __VA_ARGS__)
+#else
+#define RNP_PMD_REG_LOG(...) do { } while (0)
+#endif
+
+#endif /* __RNP_LOGS_H__ */
-- 
2.25.1



[PATCH v16 02/29] net/rnp: add ethdev probe and remove

2025-02-25 Thread Wenbo Cao
Add basic PCIe ethdev probe and remove.

Signed-off-by: Wenbo Cao 
Reviewed-by: Stephen Hemminger 
---
 doc/guides/nics/rnp.rst  | 17 ++
 drivers/net/rnp/rnp.h| 16 +
 drivers/net/rnp/rnp_ethdev.c | 66 
 3 files changed, 99 insertions(+)
 create mode 100644 drivers/net/rnp/rnp.h

diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index b76c60349c..cca249be78 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -14,6 +14,23 @@ Supported Chipsets and NICs
 
 - MUCSE Ethernet Controller N10 Series for 10GbE or 40GbE (Dual-port)
 
+Support of Ethernet Network Controllers
+~~~
+
+PCIE NICS
+^
+
+* ``N10G-X2-DC  Dual-port 10 Gigabit SFP Ethernet Adapter``
+* ``N10G-X4-QC  Quad-port 10 Gigabit SFP Ethernet Adapter``
+* ``N10G-X8-DC  Octa-port 10 Gigabit SFP Ethernet Adapter``
+
+OCP 3.0 NICs
+
+
+* ``N10G-X2-DCP  Dual-port 10 Gigabit SFP Ethernet Adapter``
+* ``N10G-X4-DCP  Dual-port 10 Gigabit SFP Ethernet Adapter``
+* ``N10G-X8-DCP  Dual-port 10 Gigabit SFP Ethernet Adapter``
+
 Chip Basic Overview
 ---
 N10 has two functions, each function support muiple ports(1 to 8),which not 
same as normal pcie network card(one pf for each port).
diff --git a/drivers/net/rnp/rnp.h b/drivers/net/rnp/rnp.h
new file mode 100644
index 00..4413a03d9d
--- /dev/null
+++ b/drivers/net/rnp/rnp.h
@@ -0,0 +1,16 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2023 Mucse IC Design Ltd.
+ */
+
+#ifndef __RNP_H__
+#define __RNP_H__
+
+#define PCI_VENDOR_ID_MUCSE(0x8848)
+#define RNP_DEV_ID_N10G_X2 (0x1000)
+#define RNP_DEV_ID_N10G_X4 (0x1020)
+#define RNP_DEV_ID_N10G_X8 (0x1060)
+
+struct rnp_eth_port {
+};
+
+#endif /* __RNP_H__ */
diff --git a/drivers/net/rnp/rnp_ethdev.c b/drivers/net/rnp/rnp_ethdev.c
index 9ce3c0b497..e2eb80ba69 100644
--- a/drivers/net/rnp/rnp_ethdev.c
+++ b/drivers/net/rnp/rnp_ethdev.c
@@ -1,3 +1,69 @@
 /* SPDX-License-Identifier: BSD-3-Clause
  * Copyright(C) 2023 Mucse IC Design Ltd.
  */
+
+#include 
+#include 
+
+#include "rnp.h"
+
+static int
+rnp_eth_dev_init(struct rte_eth_dev *eth_dev)
+{
+   RTE_SET_USED(eth_dev);
+
+   return -ENODEV;
+}
+
+static int
+rnp_eth_dev_uninit(struct rte_eth_dev *eth_dev)
+{
+   RTE_SET_USED(eth_dev);
+
+   return -ENODEV;
+}
+
+static int
+rnp_pci_remove(struct rte_pci_device *pci_dev)
+{
+   struct rte_eth_dev *eth_dev;
+
+   eth_dev = rte_eth_dev_allocated(pci_dev->device.name);
+
+   if (eth_dev)
+   /* Cleanup eth dev */
+   return rte_eth_dev_pci_generic_remove(pci_dev,
+   rnp_eth_dev_uninit);
+   return -ENODEV;
+}
+
+static int
+rnp_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
+{
+   int rc;
+
+   RTE_SET_USED(pci_drv);
+
+   rc = rte_eth_dev_pci_generic_probe(pci_dev, sizeof(struct rnp_eth_port),
+   rnp_eth_dev_init);
+
+   return rc;
+}
+
+static const struct rte_pci_id pci_id_rnp_map[] = {
+   { RTE_PCI_DEVICE(PCI_VENDOR_ID_MUCSE, RNP_DEV_ID_N10G_X2) },
+   { RTE_PCI_DEVICE(PCI_VENDOR_ID_MUCSE, RNP_DEV_ID_N10G_X4) },
+   { RTE_PCI_DEVICE(PCI_VENDOR_ID_MUCSE, RNP_DEV_ID_N10G_X8) },
+   { .vendor_id = 0, },
+};
+
+static struct rte_pci_driver rte_rnp_pmd = {
+   .id_table = pci_id_rnp_map,
+   .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC,
+   .probe = rnp_pci_probe,
+   .remove = rnp_pci_remove,
+};
+
+RTE_PMD_REGISTER_PCI(net_rnp, rte_rnp_pmd);
+RTE_PMD_REGISTER_PCI_TABLE(net_rnp, pci_id_rnp_map);
+RTE_PMD_REGISTER_KMOD_DEP(net_rnp, "igb_uio | uio_pci_generic | vfio-pci");
-- 
2.25.1



[PATCH v16 10/29] net/rnp: add support device start stop operations

2025-02-25 Thread Wenbo Cao
add basic support for device to start/stop function.

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/rnp.rst |   2 +
 drivers/net/rnp/base/rnp_common.c   |  22 +++
 drivers/net/rnp/base/rnp_common.h   |   1 +
 drivers/net/rnp/base/rnp_dma_regs.h |  10 +
 drivers/net/rnp/base/rnp_eth_regs.h |   5 +
 drivers/net/rnp/base/rnp_hw.h   |   1 +
 drivers/net/rnp/base/rnp_mac.h  |  14 ++
 drivers/net/rnp/base/rnp_mac_regs.h |  42 
 drivers/net/rnp/rnp.h   |   3 +
 drivers/net/rnp/rnp_ethdev.c| 284 +++-
 10 files changed, 383 insertions(+), 1 deletion(-)

diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index c3547c38b6..66ff7f4090 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -75,6 +75,8 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_dev_rx_queue_stop``
 * ``rte_eth_dev_tx_queue_start``
 * ``rte_eth_dev_tx_queue_stop``
+* ``rte_eth_dev_start``
+* ``rte_eth_dev_stop``
 * ``rte_eth_promiscuous_disable``
 * ``rte_eth_promiscuous_enable``
 * ``rte_eth_allmulticast_enable``
diff --git a/drivers/net/rnp/base/rnp_common.c 
b/drivers/net/rnp/base/rnp_common.c
index 58de3bde03..2dacb5113e 100644
--- a/drivers/net/rnp/base/rnp_common.c
+++ b/drivers/net/rnp/base/rnp_common.c
@@ -79,3 +79,25 @@ rnp_setup_common_ops(struct rnp_hw *hw)
 
return 0;
 }
+
+int rnp_clock_valid_check(struct rnp_hw *hw, u16 nr_lane)
+{
+   uint16_t timeout = 0;
+
+   do {
+   RNP_E_REG_WR(hw, RNP_RSS_REDIR_TB(nr_lane, 0), 0x7f);
+   udelay(10);
+   timeout++;
+   if (timeout >= 1000)
+   break;
+   } while (RNP_E_REG_RD(hw, RNP_RSS_REDIR_TB(nr_lane, 0)) != 0x7f);
+
+   if (timeout >= 1000) {
+   RNP_PMD_ERR("ethernet[%d] eth reg can't be write", nr_lane);
+   return -EPERM;
+   }
+   /* clear the dirty value */
+   RNP_E_REG_WR(hw, RNP_RSS_REDIR_TB(nr_lane, 0), 0);
+
+   return 0;
+}
diff --git a/drivers/net/rnp/base/rnp_common.h 
b/drivers/net/rnp/base/rnp_common.h
index cf1996a675..91e2996398 100644
--- a/drivers/net/rnp/base/rnp_common.h
+++ b/drivers/net/rnp/base/rnp_common.h
@@ -12,5 +12,6 @@
 ((macaddr[4] << 8)) | (macaddr[5]))
 int rnp_init_hw(struct rnp_hw *hw);
 int rnp_setup_common_ops(struct rnp_hw *hw);
+int rnp_clock_valid_check(struct rnp_hw *hw, u16 nr_lane);
 
 #endif /* _RNP_COMMON_H_ */
diff --git a/drivers/net/rnp/base/rnp_dma_regs.h 
b/drivers/net/rnp/base/rnp_dma_regs.h
index 7c17741c55..8bc6fe581a 100644
--- a/drivers/net/rnp/base/rnp_dma_regs.h
+++ b/drivers/net/rnp/base/rnp_dma_regs.h
@@ -6,9 +6,19 @@
 #define _RNP_DMA_REGS_H_
 
 #define RNP_DMA_VERSION(0)
+#define RNP_DMA_CTRL   (0x4)
+/* 1bit <-> 16 bytes dma addr size */
+#define RNP_DMA_SCATTER_MEM_MASK   RTE_GENMASK32(31, 16)
+#define RNP_DMA_SCATTER_MEN_S  (16)
+#define RNP_DMA_RX_MEM_PAD_EN  RTE_BIT32(8)
+#define RTE_DMA_VEB_BYPASS RTE_BIT32(4)
+#define RNP_DMA_TXRX_LOOP  RTE_BIT32(1)
+#define RNP_DMA_TXMRX_LOOP RTE_BIT32(0)
+
 #define RNP_DMA_HW_EN  (0x10)
 #define RNP_DMA_EN_ALL (0b)
 #define RNP_DMA_HW_STATE   (0x14)
+
 /* --- queue register --- */
 /* queue enable */
 #define RNP_RXQ_START(qid) _RING_(0x0010 + 0x100 * (qid))
diff --git a/drivers/net/rnp/base/rnp_eth_regs.h 
b/drivers/net/rnp/base/rnp_eth_regs.h
index 10e3d954b8..60766d2035 100644
--- a/drivers/net/rnp/base/rnp_eth_regs.h
+++ b/drivers/net/rnp/base/rnp_eth_regs.h
@@ -10,6 +10,9 @@
 #define RNP_E_FILTER_EN_ETH_(0x801c)
 #define RNP_E_REDIR_EN _ETH_(0x8030)
 
+#define RNP_RX_ETH_F_CTRL(n)   _ETH_(0x8070 + ((n) * 0x8))
+#define RNP_RX_ETH_F_OFF   (0x7ff)
+#define RNP_RX_ETH_F_ON(0x270)
 /* rx queue flow ctrl */
 #define RNP_RX_FC_ENABLE   _ETH_(0x8520)
 #define RNP_RING_FC_EN(n)  _ETH_(0x8524 + ((0x4) * ((n) / 32)))
@@ -28,6 +31,8 @@
 #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)
+/* rss function ctrl */
+#define RNP_RSS_REDIR_TB(n, id) _ETH_(0xe000 + ((n) * 0x200) + ((id) * 0x4))
 
 #define RNP_TC_PORT_OFFSET(lane)   _ETH_(0xe840 + 0x04 * (lane))
 
diff --git a/drivers/net/rnp/base/rnp_hw.h b/drivers/net/rnp/base/rnp_hw.h
index 9541b4e9be..548e3a4468 100644
--- a/drivers/net/rnp/base/rnp_hw.h
+++ b/drivers/net/rnp/base/rnp_hw.h
@@ -120,6 +120,7 @@ struct rnp_hw {
bool lane_is_sgmii[RNP_MAX_PORT_OF_PF];
struct rnp_mbx_info mbx;
struct rnp_fw_info fw_info;
+   u16 min_dma_size;
 
spinlock_t rxq_reset_lock; /* reset op isn't thread safe */
spinlock_t txq_reset_lock; /* reset op isn't thread safe */
diff --git a/drivers/net/rnp/base/rnp_mac.h b/drivers/net/rnp/base/rnp_mac.h
index 57cbd9e3d5..1dac903396 100644
--- a/drivers/

[PATCH v16 11/29] net/rnp: add RSS support operations

2025-02-25 Thread Wenbo Cao
add support rss reta updata/query rss hash update/get
dev_configure add rss conf check.

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/features/rnp.ini|   4 +
 doc/guides/nics/rnp.rst |   7 +
 drivers/net/rnp/base/rnp_eth_regs.h |  16 ++
 drivers/net/rnp/meson.build |   1 +
 drivers/net/rnp/rnp.h   |   7 +
 drivers/net/rnp/rnp_ethdev.c|  23 ++
 drivers/net/rnp/rnp_rss.c   | 367 
 drivers/net/rnp/rnp_rss.h   |  44 
 8 files changed, 469 insertions(+)
 create mode 100644 drivers/net/rnp/rnp_rss.c
 create mode 100644 drivers/net/rnp/rnp_rss.h

diff --git a/doc/guides/nics/features/rnp.ini b/doc/guides/nics/features/rnp.ini
index fd7d4b9d8d..2fc94825f5 100644
--- a/doc/guides/nics/features/rnp.ini
+++ b/doc/guides/nics/features/rnp.ini
@@ -8,5 +8,9 @@ Speed capabilities   = Y
 Queue start/stop = Y
 Promiscuous mode = Y
 Allmulticast mode= Y
+RSS hash = Y
+RSS key update   = Y
+RSS reta update  = Y
+Inner RSS= Y
 Linux= Y
 x86-64   = Y
diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index 66ff7f4090..90af73d71f 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -45,6 +45,9 @@ Features
 
 
 - Multiple queues for TX and RX
+- Receiver Side Steering (RSS)
+  Receiver Side Steering (RSS) on IPv4, IPv6, IPv4-TCP/UDP/SCTP, 
IPv6-TCP/UDP/SCTP
+  Inner RSS is only support for vxlan/nvgre
 - Promiscuous mode
 
 Prerequisites and Pre-conditions
@@ -77,6 +80,10 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_dev_tx_queue_stop``
 * ``rte_eth_dev_start``
 * ``rte_eth_dev_stop``
+* ``rte_eth_dev_rss_hash_conf_get``
+* ``rte_eth_dev_rss_hash_update``
+* ``rte_eth_dev_rss_reta_query``
+* ``rte_eth_dev_rss_reta_update``
 * ``rte_eth_promiscuous_disable``
 * ``rte_eth_promiscuous_enable``
 * ``rte_eth_allmulticast_enable``
diff --git a/drivers/net/rnp/base/rnp_eth_regs.h 
b/drivers/net/rnp/base/rnp_eth_regs.h
index 60766d2035..be7ed5b886 100644
--- a/drivers/net/rnp/base/rnp_eth_regs.h
+++ b/drivers/net/rnp/base/rnp_eth_regs.h
@@ -32,7 +32,23 @@
 #define RNP_MAC_MULTICASE_TBL_EN   RTE_BIT32(2)
 #define RNP_MAC_UNICASE_TBL_EN RTE_BIT32(3)
 /* rss function ctrl */
+#define RNP_RSS_INNER_CTRL _ETH_(0x805c)
+#define RNP_INNER_RSS_EN   (1)
+#define RNP_INNER_RSS_DIS  (0)
 #define RNP_RSS_REDIR_TB(n, id) _ETH_(0xe000 + ((n) * 0x200) + ((id) * 0x4))
+#define RNP_RSS_MRQC_ADDR  _ETH_(0x92a0)
+/* RSS policy */
+#define RNP_RSS_HASH_CFG_MASK  (0x3F3)
+#define RNP_RSS_HASH_IPV4_TCP  RTE_BIT32(16)
+#define RNP_RSS_HASH_IPV4  RTE_BIT32(17)
+#define RNP_RSS_HASH_IPV6  RTE_BIT32(20)
+#define RNP_RSS_HASH_IPV6_TCP  RTE_BIT32(21)
+#define RNP_RSS_HASH_IPV4_UDP  RTE_BIT32(22)
+#define RNP_RSS_HASH_IPV6_UDP   RTE_BIT32(23)
+#define RNP_RSS_HASH_IPV4_SCTP  RTE_BIT32(24)
+#define RNP_RSS_HASH_IPV6_SCTP  RTE_BIT32(25)
+/* rss hash key */
+#define RNP_RSS_KEY_TABLE(idx) _ETH_(0x92d0 + ((idx) * 0x4))
 
 #define RNP_TC_PORT_OFFSET(lane)   _ETH_(0xe840 + 0x04 * (lane))
 
diff --git a/drivers/net/rnp/meson.build b/drivers/net/rnp/meson.build
index f88fa89a53..e20cc88497 100644
--- a/drivers/net/rnp/meson.build
+++ b/drivers/net/rnp/meson.build
@@ -22,4 +22,5 @@ includes += include_directories('base')
 sources = files(
 'rnp_ethdev.c',
 'rnp_rxtx.c',
+'rnp_rss.c',
 )
diff --git a/drivers/net/rnp/rnp.h b/drivers/net/rnp/rnp.h
index 9440d9df58..755b6c7f41 100644
--- a/drivers/net/rnp/rnp.h
+++ b/drivers/net/rnp/rnp.h
@@ -111,6 +111,13 @@ struct rnp_eth_port {
struct rnp_tx_queue *tx_queues[RNP_MAX_RX_QUEUE_NUM];
struct rnp_hw *hw;
 
+   struct rte_eth_rss_conf rss_conf;
+   uint16_t last_rx_num;
+   bool rxq_num_changed;
+   bool reta_has_cfg;
+   bool hw_rss_en;
+   uint32_t indirtbl[RNP_RSS_INDIR_SIZE];
+
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 3651202a86..7540d8db43 100644
--- a/drivers/net/rnp/rnp_ethdev.c
+++ b/drivers/net/rnp/rnp_ethdev.c
@@ -18,6 +18,7 @@
 #include "base/rnp_dma_regs.h"
 #include "base/rnp_mac_regs.h"
 #include "rnp_rxtx.h"
+#include "rnp_rss.h"
 
 static struct rte_eth_dev *
 rnp_alloc_eth_port(struct rte_pci_device *pci, char *name)
@@ -235,6 +236,9 @@ static int rnp_dev_start(struct rte_eth_dev *eth_dev)
}
/* disable eth rx flow */
RNP_RX_ETH_DISABLE(hw, lane);
+   ret = rnp_dev_rss_configure(eth_dev);
+   if (ret)
+   return ret;
ret = rnp_rx_scattered_setup(eth_dev);
if (ret)
return ret;
@@ -302,6 +306,19 @@ static int rnp_disable_all_tx_queue(struct rte_eth_dev 
*dev)
return ret;
 }
 
+static int rnp_dev_configure(struct rte_eth_dev *eth_dev)
+{
+   struct rnp_eth_port *port = RNP_DEV_TO_PORT(eth_dev);
+
+  

[PATCH v16 12/29] net/rnp: add support link update operations

2025-02-25 Thread Wenbo Cao
This patch add support poll/irq link get mode.

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/features/rnp.ini  |   2 +
 doc/guides/nics/rnp.rst   |   3 +
 drivers/net/rnp/base/rnp_fw_cmd.c |  45 
 drivers/net/rnp/base/rnp_fw_cmd.h |  55 +
 drivers/net/rnp/base/rnp_hw.h |   3 +-
 drivers/net/rnp/base/rnp_mbx_fw.c |  72 ++-
 drivers/net/rnp/base/rnp_mbx_fw.h |   4 +
 drivers/net/rnp/meson.build   |   1 +
 drivers/net/rnp/rnp.h |  12 ++
 drivers/net/rnp/rnp_ethdev.c  | 118 ++-
 drivers/net/rnp/rnp_link.c| 339 ++
 drivers/net/rnp/rnp_link.h|  50 +
 12 files changed, 697 insertions(+), 7 deletions(-)
 create mode 100644 drivers/net/rnp/rnp_link.c
 create mode 100644 drivers/net/rnp/rnp_link.h

diff --git a/doc/guides/nics/features/rnp.ini b/doc/guides/nics/features/rnp.ini
index 2fc94825f5..695b9c0dba 100644
--- a/doc/guides/nics/features/rnp.ini
+++ b/doc/guides/nics/features/rnp.ini
@@ -5,6 +5,8 @@
 ;
 [Features]
 Speed capabilities   = Y
+Link status  = Y
+Link status event= Y
 Queue start/stop = Y
 Promiscuous mode = Y
 Allmulticast mode= Y
diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index 90af73d71f..e6a1aadefc 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -49,6 +49,7 @@ Features
   Receiver Side Steering (RSS) on IPv4, IPv6, IPv4-TCP/UDP/SCTP, 
IPv6-TCP/UDP/SCTP
   Inner RSS is only support for vxlan/nvgre
 - Promiscuous mode
+- Link state information
 
 Prerequisites and Pre-conditions
 
@@ -92,3 +93,5 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_allmulticast_get``
 * ``rte_eth_rx_queue_setup``
 * ``rte_eth_tx_queue_setup``
+* ``rte_eth_link_get``
+* ``rte_eth_link_get_nowait``
diff --git a/drivers/net/rnp/base/rnp_fw_cmd.c 
b/drivers/net/rnp/base/rnp_fw_cmd.c
index 3891249499..a4a2171868 100644
--- a/drivers/net/rnp/base/rnp_fw_cmd.c
+++ b/drivers/net/rnp/base/rnp_fw_cmd.c
@@ -68,6 +68,45 @@ rnp_build_get_lane_status_req(struct rnp_mbx_fw_cmd_req *req,
arg->nr_lane = req_arg->param0;
 }
 
+static void
+rnp_build_set_event_mask(struct rnp_mbx_fw_cmd_req *req,
+struct rnp_fw_req_arg *req_arg,
+void *cookie)
+{
+   struct rnp_set_pf_event_mask *arg =
+   (struct rnp_set_pf_event_mask *)req->data;
+
+   req->flags = 0;
+   req->opcode = RNP_SET_EVENT_MASK;
+   req->datalen = sizeof(*arg);
+   req->cookie = cookie;
+   req->reply_lo = 0;
+   req->reply_hi = 0;
+
+   arg->event_mask = req_arg->param0;
+   arg->event_en = req_arg->param1;
+}
+
+static void
+rnp_build_lane_evet_mask(struct rnp_mbx_fw_cmd_req *req,
+struct rnp_fw_req_arg *req_arg,
+void *cookie)
+{
+   struct rnp_set_lane_event_mask *arg =
+   (struct rnp_set_lane_event_mask *)req->data;
+
+   req->flags = 0;
+   req->opcode = RNP_SET_LANE_EVENT_EN;
+   req->datalen = sizeof(*arg);
+   req->cookie = cookie;
+   req->reply_lo = 0;
+   req->reply_hi = 0;
+
+   arg->nr_lane = req_arg->param0;
+   arg->event_mask = req_arg->param1;
+   arg->event_en = req_arg->param2;
+}
+
 int rnp_build_fwcmd_req(struct rnp_mbx_fw_cmd_req *req,
struct rnp_fw_req_arg *arg,
void *cookie)
@@ -87,6 +126,12 @@ int rnp_build_fwcmd_req(struct rnp_mbx_fw_cmd_req *req,
case RNP_GET_LANE_STATUS:
rnp_build_get_lane_status_req(req, arg, cookie);
break;
+   case RNP_SET_EVENT_MASK:
+   rnp_build_set_event_mask(req, arg, cookie);
+   break;
+   case RNP_SET_LANE_EVENT_EN:
+   rnp_build_lane_evet_mask(req, arg, cookie);
+   break;
default:
err = -EOPNOTSUPP;
}
diff --git a/drivers/net/rnp/base/rnp_fw_cmd.h 
b/drivers/net/rnp/base/rnp_fw_cmd.h
index 5f60ac6187..6c6fd1803e 100644
--- a/drivers/net/rnp/base/rnp_fw_cmd.h
+++ b/drivers/net/rnp/base/rnp_fw_cmd.h
@@ -6,6 +6,7 @@
 #define _RNP_FW_CMD_H_
 
 #include "rnp_osdep.h"
+#include "rnp_hw.h"
 
 #define RNP_FW_LINK_SYNC   (0x000c)
 #define RNP_LINK_MAGIC_CODE(0xa5a4)
@@ -73,6 +74,22 @@ enum RNP_GENERIC_CMD {
RNP_SET_DDR_CSL = 0xFF11,
 };
 
+struct rnp_port_stat {
+   u8 phy_addr; /* Phy MDIO address */
+
+   u8 duplex   : 1; /* FIBRE is always 1,Twisted Pair 1 or 0 */
+   u8 autoneg  : 1; /* autoned state */
+   u8 fec  : 1;
+   u8 an_rev   : 1;
+   u8 link_traing  : 1;
+   u8 is_sgmii : 1; /* avild fw >= 0.5.0.17 */
+   u8 rsvd0: 2;
+   u16 speed;   /* cur port linked speed */
+
+   u16 pause   : 4;
+   u16 rsvd1   : 12;
+};
+
 /* firmware -> driver reply */
 struct __rte_aligned(4) __rte_packed_begin rnp_

[PATCH v16 08/29] net/rnp: add queue setup and release operations

2025-02-25 Thread Wenbo Cao
support tx/rx queue setup and release add hw bd
queue reset,sw queue reset.

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/rnp.rst |   3 +
 drivers/net/rnp/base/meson.build|   1 +
 drivers/net/rnp/base/rnp_bdq_if.c   | 398 +++
 drivers/net/rnp/base/rnp_bdq_if.h   | 149 +
 drivers/net/rnp/base/rnp_common.h   |   4 +
 drivers/net/rnp/base/rnp_dma_regs.h |  45 +++
 drivers/net/rnp/base/rnp_eth_regs.h |   4 +
 drivers/net/rnp/base/rnp_hw.h   |   4 +
 drivers/net/rnp/base/rnp_osdep.h|  12 +
 drivers/net/rnp/meson.build |   1 +
 drivers/net/rnp/rnp.h   |   2 +
 drivers/net/rnp/rnp_ethdev.c|  38 ++-
 drivers/net/rnp/rnp_rxtx.c  | 471 
 drivers/net/rnp/rnp_rxtx.h  | 123 
 14 files changed, 1254 insertions(+), 1 deletion(-)
 create mode 100644 drivers/net/rnp/base/rnp_bdq_if.c
 create mode 100644 drivers/net/rnp/base/rnp_bdq_if.h
 create mode 100644 drivers/net/rnp/rnp_rxtx.c
 create mode 100644 drivers/net/rnp/rnp_rxtx.h

diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index 5f6e22f287..99b96e9b8e 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -44,6 +44,7 @@ N10 has two functions, each function support muiple ports(1 
to 8),which not same
 Features
 
 
+- Multiple queues for TX and RX
 - Promiscuous mode
 
 Prerequisites and Pre-conditions
@@ -76,3 +77,5 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_allmulticast_disable``
 * ``rte_eth_promiscuous_get``
 * ``rte_eth_allmulticast_get``
+* ``rte_eth_rx_queue_setup``
+* ``rte_eth_tx_queue_setup``
diff --git a/drivers/net/rnp/base/meson.build b/drivers/net/rnp/base/meson.build
index 10026e0425..ba49accdec 100644
--- a/drivers/net/rnp/base/meson.build
+++ b/drivers/net/rnp/base/meson.build
@@ -7,6 +7,7 @@ sources = [
 'rnp_mbx_fw.c',
 'rnp_common.c',
 'rnp_mac.c',
+'rnp_bdq_if.c',
 ]
 
 c_args = cflags
diff --git a/drivers/net/rnp/base/rnp_bdq_if.c 
b/drivers/net/rnp/base/rnp_bdq_if.c
new file mode 100644
index 00..471c19efda
--- /dev/null
+++ b/drivers/net/rnp/base/rnp_bdq_if.c
@@ -0,0 +1,398 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2023 Mucse IC Design Ltd.
+ */
+
+#include "rnp_osdep.h"
+
+#include "../rnp.h"
+#include "rnp_dma_regs.h"
+#include "rnp_eth_regs.h"
+#include "rnp_bdq_if.h"
+#include "rnp_common.h"
+#include "../rnp_rxtx.h"
+
+static void
+rnp_read_mac_veb(struct rnp_hw *hw,
+ u16 nr_lane,
+ u16 vf_id,
+ struct rnp_veb_cfg *cfg)
+{
+   cfg->mac_lo = RNP_E_REG_RD(hw, RNP_VEB_MAC_LO(nr_lane, vf_id));
+   cfg->mac_hi = RNP_E_REG_RD(hw, RNP_VEB_MAC_HI(nr_lane, vf_id));
+   cfg->ring = RNP_E_REG_RD(hw, RNP_VEB_VF_RING(nr_lane, vf_id));
+}
+
+static void
+rnp_update_mac_veb(struct rnp_hw *hw,
+  u16 nr_lane,
+  u16 vf_id,
+  struct rnp_veb_cfg *cfg)
+{
+   u32 reg = cfg->ring;
+   u16 idx = 0;
+
+   idx = nr_lane;
+   wmb();
+   RNP_E_REG_WR(hw, RNP_VEB_MAC_LO(idx, vf_id), cfg->mac_lo);
+   RNP_E_REG_WR(hw, RNP_VEB_MAC_HI(idx, vf_id), cfg->mac_hi);
+   reg |= ((RNP_VEB_SWITCH_VF_EN | vf_id) << 8);
+   RNP_E_REG_WR(hw, RNP_VEB_VF_RING(idx, vf_id), reg);
+}
+
+void
+rnp_rxq_flow_disable(struct rnp_hw *hw,
+u16 hw_idx)
+{
+   u32 fc_ctrl;
+
+   spin_lock(&hw->rxq_reset_lock);
+   fc_ctrl = RNP_E_REG_RD(hw, RNP_RING_FC_EN(hw_idx));
+   wmb();
+   RNP_E_REG_WR(hw, RNP_RING_FC_THRESH(hw_idx), 0);
+   fc_ctrl |= 1 << (hw_idx % 32);
+   wmb();
+   RNP_E_REG_WR(hw, RNP_RING_FC_EN(hw_idx), fc_ctrl);
+}
+
+void
+rnp_rxq_flow_enable(struct rnp_hw *hw,
+   u16 hw_idx)
+{
+   u32 fc_ctrl;
+
+
+   fc_ctrl = RNP_E_REG_RD(hw, RNP_RING_FC_EN(hw_idx));
+   fc_ctrl &= ~(1 << (hw_idx % 32));
+   wmb();
+   RNP_E_REG_WR(hw, RNP_RING_FC_EN(hw_idx), fc_ctrl);
+
+   spin_unlock(&hw->rxq_reset_lock);
+}
+
+#define RNP_RXQ_RESET_PKT_LEN  (64)
+
+static void
+rnp_reset_xmit(struct rnp_tx_queue *txq, u64 pkt_addr)
+{
+   volatile struct rnp_tx_desc *txbd;
+   struct rnp_txsw_entry *tx_entry;
+   u16 timeout = 0;
+   u16 tx_id;
+
+   tx_id = txq->tx_tail;
+   txbd = &txq->tx_bdr[tx_id];
+   tx_entry = &txq->sw_ring[tx_id];
+   memset(tx_entry, 0, sizeof(*tx_entry));
+
+   txbd->d.addr = pkt_addr;
+   txbd->d.blen = RNP_RXQ_RESET_PKT_LEN;
+   wmb();
+   txbd->d.cmd = cpu_to_le16(RNP_CMD_EOP | RNP_CMD_RS);
+   tx_id = (tx_id + 1) & txq->attr.nb_desc_mask;
+   wmb();
+   RNP_REG_WR(txq->tx_tailreg, 0, tx_id);
+   do {
+   if (txbd->d.cmd & RNP_CMD_DD)
+   break;
+   if (timeout == 1000)
+   RNP_PMD_ERR("rx queue %u reset send pkt is hang",
+   txq->

[PATCH v16 16/29] net/rnp: add MTU set operation

2025-02-25 Thread Wenbo Cao
add mtu update limit for multiple port mode.
multiple mode just used the max-mtu of ports
to limit receive.

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/features/rnp.ini|   1 +
 doc/guides/nics/rnp.rst |   3 +
 drivers/net/rnp/base/rnp_eth_regs.h |   3 +
 drivers/net/rnp/rnp.h   |   3 +
 drivers/net/rnp/rnp_ethdev.c| 145 
 5 files changed, 155 insertions(+)

diff --git a/doc/guides/nics/features/rnp.ini b/doc/guides/nics/features/rnp.ini
index 695b9c0dba..6d13370e8f 100644
--- a/doc/guides/nics/features/rnp.ini
+++ b/doc/guides/nics/features/rnp.ini
@@ -10,6 +10,7 @@ Link status event= Y
 Queue start/stop = Y
 Promiscuous mode = Y
 Allmulticast mode= Y
+MTU update   = Y
 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 f5a79492bb..6aa8b00af6 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -50,6 +50,7 @@ Features
   Inner RSS is only support for vxlan/nvgre
 - Promiscuous mode
 - Link state information
+- MTU update
 
 Prerequisites and Pre-conditions
 
@@ -87,6 +88,8 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_dev_rss_reta_update``
 * ``rte_eth_dev_set_link_down``
 * ``rte_eth_dev_set_link_up``
+* ``rte_eth_dev_get_mtu``
+* ``rte_eth_dev_set_mtu``
 * ``rte_eth_promiscuous_disable``
 * ``rte_eth_promiscuous_enable``
 * ``rte_eth_allmulticast_enable``
diff --git a/drivers/net/rnp/base/rnp_eth_regs.h 
b/drivers/net/rnp/base/rnp_eth_regs.h
index c74886e70c..91a18dd42d 100644
--- a/drivers/net/rnp/base/rnp_eth_regs.h
+++ b/drivers/net/rnp/base/rnp_eth_regs.h
@@ -16,6 +16,9 @@
 #define RNP_RX_ETH_F_CTRL(n)   _ETH_(0x8070 + ((n) * 0x8))
 #define RNP_RX_ETH_F_OFF   (0x7ff)
 #define RNP_RX_ETH_F_ON(0x270)
+/* max/min pkts length receive limit ctrl */
+#define RNP_MIN_FRAME_CTRL _ETH_(0x80f0)
+#define RNP_MAX_FRAME_CTRL _ETH_(0x80f4)
 /* rx queue flow ctrl */
 #define RNP_RX_FC_ENABLE   _ETH_(0x8520)
 #define RNP_RING_FC_EN(n)  _ETH_(0x8524 + ((0x4) * ((n) / 32)))
diff --git a/drivers/net/rnp/rnp.h b/drivers/net/rnp/rnp.h
index e5f3ac32bf..8323858043 100644
--- a/drivers/net/rnp/rnp.h
+++ b/drivers/net/rnp/rnp.h
@@ -123,6 +123,9 @@ struct rnp_eth_port {
bool hw_rss_en;
uint32_t indirtbl[RNP_RSS_INDIR_SIZE];
 
+   uint16_t cur_mtu;
+   bool jumbo_en;
+
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 33c4de5789..4afdccd0ab 100644
--- a/drivers/net/rnp/rnp_ethdev.c
+++ b/drivers/net/rnp/rnp_ethdev.c
@@ -21,6 +21,7 @@
 #include "rnp_rss.h"
 #include "rnp_link.h"
 
+static int rnp_mtu_set(struct rte_eth_dev *dev, uint16_t mtu);
 static struct rte_eth_dev *
 rnp_alloc_eth_port(struct rte_pci_device *pci, char *name)
 {
@@ -142,6 +143,13 @@ static void rnp_mac_rx_enable(struct rte_eth_dev *dev)
mac_cfg = RNP_MAC_REG_RD(hw, lane, RNP_MAC_RX_CFG);
mac_cfg |= RNP_MAC_RE;
 
+   if (port->jumbo_en) {
+   mac_cfg |= RNP_MAC_JE;
+   mac_cfg |= RNP_MAC_GPSLCE | RNP_MAC_WD;
+   } else {
+   mac_cfg &= ~RNP_MAC_JE;
+   mac_cfg &= ~RNP_MAC_WD;
+   }
mac_cfg &= ~RNP_MAC_GPSL_MASK;
mac_cfg |= (RNP_MAC_MAX_GPSL << RNP_MAC_CPSL_SHIFT);
RNP_MAC_REG_WR(hw, lane, RNP_MAC_RX_CFG, mac_cfg);
@@ -211,6 +219,7 @@ rnp_rx_scattered_setup(struct rte_eth_dev *dev)
 {
uint16_t max_pkt_size =
dev->data->dev_conf.rxmode.mtu + RNP_ETH_OVERHEAD;
+   struct rte_eth_conf *dev_conf = &dev->data->dev_conf;
struct rnp_eth_port *port = RNP_DEV_TO_PORT(dev);
struct rnp_hw *hw = port->hw;
struct rnp_rx_queue *rxq;
@@ -236,6 +245,12 @@ rnp_rx_scattered_setup(struct rte_eth_dev *dev)
return -ENOTSUP;
}
dma_buf_size = hw->min_dma_size;
+   if (dev_conf->rxmode.offloads & RTE_ETH_RX_OFFLOAD_SCATTER ||
+   max_pkt_size > dma_buf_size ||
+   dev->data->mtu + RNP_ETH_OVERHEAD > dma_buf_size)
+   dev->data->scattered_rx = 1;
+   else
+   dev->data->scattered_rx = 0;
/* Setup max dma scatter engine split size */
if (max_pkt_size == dma_buf_size)
dma_buf_size += (dma_buf_size % 16);
@@ -296,6 +311,7 @@ static int rnp_dev_start(struct rte_eth_dev *eth_dev)
 {
struct rnp_eth_port *port = RNP_DEV_TO_PORT(eth_dev);
struct rte_eth_dev_data *data = eth_dev->data;
+   uint16_t max_rx_pkt_len = eth_dev->data->mtu;
bool lsc = data->dev_conf.intr_conf.lsc;
struct rnp_hw *hw = port->hw;
uint16_t lane = 0;
@@ -316,6 +332,9 @@ static int rnp_dev_start(struct rte_eth_dev *eth_dev)
if (ret)
return ret;
ret = rnp_rx_

[PATCH v16 09/29] net/rnp: add queue stop and start operations

2025-02-25 Thread Wenbo Cao
support rx/tx queue stop/start,for rx queue stop
need to reset a queue,must stop all rx queue
during reset this queue.

Signed-off-by: Wenbo Cao 
Reviewed-by: Stephen Hemminger 
---
 doc/guides/nics/features/rnp.ini  |   1 +
 doc/guides/nics/rnp.rst   |   4 +
 drivers/net/rnp/base/rnp_common.c |   3 +
 drivers/net/rnp/rnp_ethdev.c  |   4 +
 drivers/net/rnp/rnp_rxtx.c| 167 ++
 drivers/net/rnp/rnp_rxtx.h|   9 ++
 6 files changed, 188 insertions(+)

diff --git a/doc/guides/nics/features/rnp.ini b/doc/guides/nics/features/rnp.ini
index 65f1ed3da0..fd7d4b9d8d 100644
--- a/doc/guides/nics/features/rnp.ini
+++ b/doc/guides/nics/features/rnp.ini
@@ -5,6 +5,7 @@
 ;
 [Features]
 Speed capabilities   = Y
+Queue start/stop = Y
 Promiscuous mode = Y
 Allmulticast mode= Y
 Linux= Y
diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index 99b96e9b8e..c3547c38b6 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -71,6 +71,10 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_dev_close``
 * ``rte_eth_dev_stop``
 * ``rte_eth_dev_infos_get``
+* ``rte_eth_dev_rx_queue_start``
+* ``rte_eth_dev_rx_queue_stop``
+* ``rte_eth_dev_tx_queue_start``
+* ``rte_eth_dev_tx_queue_stop``
 * ``rte_eth_promiscuous_disable``
 * ``rte_eth_promiscuous_enable``
 * ``rte_eth_allmulticast_enable``
diff --git a/drivers/net/rnp/base/rnp_common.c 
b/drivers/net/rnp/base/rnp_common.c
index 5655126ae0..58de3bde03 100644
--- a/drivers/net/rnp/base/rnp_common.c
+++ b/drivers/net/rnp/base/rnp_common.c
@@ -65,6 +65,9 @@ int rnp_init_hw(struct rnp_hw *hw)
/* setup mac resiger ctrl base */
for (idx = 0; idx < hw->max_port_num; idx++)
hw->mac_base[idx] = (u8 *)hw->e_ctrl + RNP_MAC_BASE_OFFSET(idx);
+   /* tx all hw queue must be started */
+   for (idx = 0; idx < RNP_MAX_RX_QUEUE_NUM; idx++)
+   RNP_E_REG_WR(hw, RNP_TXQ_START(idx), true);
 
return 0;
 }
diff --git a/drivers/net/rnp/rnp_ethdev.c b/drivers/net/rnp/rnp_ethdev.c
index 8474fc3ebc..2ff1aaa92d 100644
--- a/drivers/net/rnp/rnp_ethdev.c
+++ b/drivers/net/rnp/rnp_ethdev.c
@@ -249,8 +249,12 @@ static const struct eth_dev_ops rnp_eth_dev_ops = {
 
.rx_queue_setup   = rnp_rx_queue_setup,
.rx_queue_release = rnp_dev_rx_queue_release,
+   .rx_queue_stop= rnp_rx_queue_stop,
+   .rx_queue_start   = rnp_rx_queue_start,
.tx_queue_setup   = rnp_tx_queue_setup,
.tx_queue_release = rnp_dev_tx_queue_release,
+   .tx_queue_stop= rnp_tx_queue_stop,
+   .tx_queue_start   = rnp_tx_queue_start,
 };
 
 static void
diff --git a/drivers/net/rnp/rnp_rxtx.c b/drivers/net/rnp/rnp_rxtx.c
index d370948d6b..e65bc06d36 100644
--- a/drivers/net/rnp/rnp_rxtx.c
+++ b/drivers/net/rnp/rnp_rxtx.c
@@ -86,6 +86,7 @@ rnp_rx_queue_reset(struct rnp_eth_port *port,
struct rte_eth_txconf def_conf;
struct rnp_hw *hw = port->hw;
struct rte_mbuf *m_mbuf[2];
+   bool tx_origin_e = false;
bool tx_new = false;
uint16_t index;
int err = 0;
@@ -121,6 +122,9 @@ rnp_rx_queue_reset(struct rnp_eth_port *port,
return -ENOMEM;
}
rnp_rxq_flow_disable(hw, index);
+   tx_origin_e = txq->txq_started;
+   rte_io_wmb();
+   txq->txq_started = false;
rte_mbuf_refcnt_set(m_mbuf[0], 1);
rte_mbuf_refcnt_set(m_mbuf[1], 1);
m_mbuf[0]->data_off = RTE_PKTMBUF_HEADROOM;
@@ -139,6 +143,7 @@ rnp_rx_queue_reset(struct rnp_eth_port *port,
rnp_tx_queue_reset(port, txq);
rnp_tx_queue_sw_reset(txq);
}
+   txq->txq_started = tx_origin_e;
}
rte_mempool_put_bulk(adapter->reset_pool, (void **)m_mbuf, 2);
rnp_rxq_flow_enable(hw, index);
@@ -367,6 +372,7 @@ rnp_tx_queue_sw_reset(struct rnp_tx_queue *txq)
txq->nb_tx_free = txq->attr.nb_desc - 1;
txq->tx_next_dd = txq->tx_rs_thresh - 1;
txq->tx_next_rs = txq->tx_rs_thresh - 1;
+   txq->tx_tail = 0;
 
size = (txq->attr.nb_desc + RNP_TX_MAX_BURST_SIZE);
for (idx = 0; idx < size * sizeof(struct rnp_tx_desc); idx++)
@@ -469,3 +475,164 @@ rnp_tx_queue_setup(struct rte_eth_dev *dev,
 
return err;
 }
+
+int rnp_tx_queue_stop(struct rte_eth_dev *eth_dev, uint16_t qidx)
+{
+   struct rnp_eth_port *port = RNP_DEV_TO_PORT(eth_dev);
+   struct rte_eth_dev_data *data = eth_dev->data;
+   struct rnp_tx_queue *txq;
+
+   PMD_INIT_FUNC_TRACE();
+   txq = eth_dev->data->tx_queues[qidx];
+   if (!txq) {
+   RNP_PMD_ERR("TX queue %u is null or not setup", qidx);
+   return -EINVAL;
+   }
+   if (data->tx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STARTED) {
+   txq->txq_started = 0;
+   

[PATCH v16 13/29] net/rnp: add support link setup operations

2025-02-25 Thread Wenbo Cao
add set link_down/link_up implement

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/rnp.rst |  2 +
 drivers/net/rnp/base/rnp_eth_regs.h |  3 +
 drivers/net/rnp/base/rnp_fw_cmd.c   | 22 +++
 drivers/net/rnp/base/rnp_fw_cmd.h   |  6 ++
 drivers/net/rnp/base/rnp_mbx_fw.c   | 33 ++
 drivers/net/rnp/base/rnp_mbx_fw.h   |  1 +
 drivers/net/rnp/rnp_ethdev.c| 10 ++-
 drivers/net/rnp/rnp_link.c  | 97 +
 drivers/net/rnp/rnp_link.h  |  2 +
 9 files changed, 175 insertions(+), 1 deletion(-)

diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index e6a1aadefc..f5a79492bb 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -85,6 +85,8 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_dev_rss_hash_update``
 * ``rte_eth_dev_rss_reta_query``
 * ``rte_eth_dev_rss_reta_update``
+* ``rte_eth_dev_set_link_down``
+* ``rte_eth_dev_set_link_up``
 * ``rte_eth_promiscuous_disable``
 * ``rte_eth_promiscuous_enable``
 * ``rte_eth_allmulticast_enable``
diff --git a/drivers/net/rnp/base/rnp_eth_regs.h 
b/drivers/net/rnp/base/rnp_eth_regs.h
index be7ed5b886..c74886e70c 100644
--- a/drivers/net/rnp/base/rnp_eth_regs.h
+++ b/drivers/net/rnp/base/rnp_eth_regs.h
@@ -5,6 +5,9 @@
 #ifndef _RNP_ETH_REGS_H
 #define _RNP_ETH_REGS_H
 
+#define RNP_ETH_TX_FIFO_STATE  _ETH_(0x0330)
+#define RNP_ETH_TX_FIFO_EMPT(lane) ((1 << (lane)) | (1 << ((lane) + 4)))
+
 #define RNP_E_ENG_BYPASS   _ETH_(0x8000)
 #define RNP_E_VXLAN_PARSE_EN   _ETH_(0x8004)
 #define RNP_E_FILTER_EN_ETH_(0x801c)
diff --git a/drivers/net/rnp/base/rnp_fw_cmd.c 
b/drivers/net/rnp/base/rnp_fw_cmd.c
index a4a2171868..ed0eddfd1f 100644
--- a/drivers/net/rnp/base/rnp_fw_cmd.c
+++ b/drivers/net/rnp/base/rnp_fw_cmd.c
@@ -107,6 +107,25 @@ rnp_build_lane_evet_mask(struct rnp_mbx_fw_cmd_req *req,
arg->event_en = req_arg->param2;
 }
 
+static void
+rnp_build_ifup_down(struct rnp_mbx_fw_cmd_req *req,
+   struct rnp_fw_req_arg *req_arg,
+   void *cookie)
+{
+   struct rnp_ifup_down_req *arg =
+   (struct rnp_ifup_down_req *)req->data;
+
+   req->flags = 0;
+   req->opcode = RNP_IFUP_DOWN;
+   req->datalen = sizeof(*arg);
+   req->cookie = cookie;
+   req->reply_lo = 0;
+   req->reply_hi = 0;
+
+   arg->nr_lane = req_arg->param0;
+   arg->up = req_arg->param1;
+}
+
 int rnp_build_fwcmd_req(struct rnp_mbx_fw_cmd_req *req,
struct rnp_fw_req_arg *arg,
void *cookie)
@@ -132,6 +151,9 @@ int rnp_build_fwcmd_req(struct rnp_mbx_fw_cmd_req *req,
case RNP_SET_LANE_EVENT_EN:
rnp_build_lane_evet_mask(req, arg, cookie);
break;
+   case RNP_IFUP_DOWN:
+   rnp_build_ifup_down(req, arg, cookie);
+   break;
default:
err = -EOPNOTSUPP;
}
diff --git a/drivers/net/rnp/base/rnp_fw_cmd.h 
b/drivers/net/rnp/base/rnp_fw_cmd.h
index 6c6fd1803e..26db07ad36 100644
--- a/drivers/net/rnp/base/rnp_fw_cmd.h
+++ b/drivers/net/rnp/base/rnp_fw_cmd.h
@@ -309,6 +309,12 @@ struct rnp_link_stat_req {
struct rnp_port_stat states[RNP_MAX_PORT_OF_PF];
 };
 
+struct rnp_ifup_down_req {
+   u32 nr_lane;
+   u32 up;
+   u8 rsvd[24];
+};
+
 struct rnp_mbx_fw_cmd_req {
u16 flags;
u16 opcode;
diff --git a/drivers/net/rnp/base/rnp_mbx_fw.c 
b/drivers/net/rnp/base/rnp_mbx_fw.c
index c7e3b6819d..3e7cf7f9ad 100644
--- a/drivers/net/rnp/base/rnp_mbx_fw.c
+++ b/drivers/net/rnp/base/rnp_mbx_fw.c
@@ -460,3 +460,36 @@ rnp_rcv_msg_from_fw(struct rnp_eth_adapter *adapter, u32 
*msgbuf)
 
return 0;
 }
+
+static void rnp_link_stat_reset(struct rnp_hw *hw, u16 lane)
+{
+   u32 state;
+
+   spin_lock(&hw->link_sync);
+   state = RNP_E_REG_RD(hw, RNP_FW_LINK_SYNC);
+   state &= ~RNP_LINK_MAGIC_MASK;
+   state |= RNP_LINK_MAGIC_CODE;
+   state &= ~RTE_BIT32(lane);
+
+   RNP_E_REG_WR(hw, RNP_FW_LINK_SYNC, state);
+   rte_spinlock_unlock(&hw->link_sync);
+}
+
+int rnp_mbx_fw_ifup_down(struct rnp_eth_port *port, bool up)
+{
+   u16 nr_lane = port->attr.nr_lane;
+   struct rnp_hw *hw = port->hw;
+   struct rnp_fw_req_arg arg;
+   int err;
+
+   memset(&arg, 0, sizeof(arg));
+   arg.opcode = RNP_IFUP_DOWN;
+   arg.param0 = nr_lane;
+   arg.param1 = up;
+
+   err = rnp_fw_send_norep_cmd(port, &arg);
+   /* force firmware send irq event to dpdk */
+   if (!err && up)
+   rnp_link_stat_reset(hw, nr_lane);
+   return err;
+}
diff --git a/drivers/net/rnp/base/rnp_mbx_fw.h 
b/drivers/net/rnp/base/rnp_mbx_fw.h
index 159a0237be..397d2ec8c4 100644
--- a/drivers/net/rnp/base/rnp_mbx_fw.h
+++ b/drivers/net/rnp/base/rnp_mbx_fw.h
@@ -19,5 +19,6 @@ int rnp_fw_init(struct rnp_hw *hw);
 int rnp_rcv_msg_from_fw(struct rnp_eth_adapter *adapter, u32 *msgbuf);
 int rn

[PATCH v16 15/29] net/rnp: add Tx burst simple support

2025-02-25 Thread Wenbo Cao
add only support simple send pkts.

Signed-off-by: Wenbo Cao 
---
 drivers/net/rnp/rnp_ethdev.c |  6 +++
 drivers/net/rnp/rnp_rxtx.c   | 85 +++-
 drivers/net/rnp/rnp_rxtx.h   |  1 +
 3 files changed, 91 insertions(+), 1 deletion(-)

diff --git a/drivers/net/rnp/rnp_ethdev.c b/drivers/net/rnp/rnp_ethdev.c
index f1ec2ad73a..33c4de5789 100644
--- a/drivers/net/rnp/rnp_ethdev.c
+++ b/drivers/net/rnp/rnp_ethdev.c
@@ -606,6 +606,12 @@ static int rnp_dev_infos_get(struct rte_eth_dev *eth_dev,
};
 
dev_info->default_txconf = (struct rte_eth_txconf) {
+   .tx_thresh = {
+   .pthresh = RNP_TX_DESC_FETCH_TH,
+   .hthresh = RNP_TX_DESC_FETCH_BURST,
+   },
+   .tx_free_thresh = RNP_DEFAULT_TX_FREE_THRESH,
+   .tx_rs_thresh = RNP_DEFAULT_TX_RS_THRESH,
.offloads = 0,
};
 
diff --git a/drivers/net/rnp/rnp_rxtx.c b/drivers/net/rnp/rnp_rxtx.c
index a742646c7e..260c34113a 100644
--- a/drivers/net/rnp/rnp_rxtx.c
+++ b/drivers/net/rnp/rnp_rxtx.c
@@ -752,6 +752,89 @@ rnp_recv_pkts(void *_rxq, struct rte_mbuf **rx_pkts, 
uint16_t nb_pkts)
return nb_rx;
 }
 
+static  __rte_always_inline int
+rnp_clean_tx_ring(struct rnp_tx_queue *txq)
+{
+   volatile struct rnp_tx_desc *txbd;
+   struct rnp_txsw_entry *tx_swbd;
+   struct rte_mbuf *m;
+   uint16_t next_dd;
+   uint16_t i;
+
+   txbd = &txq->tx_bdr[txq->tx_next_dd];
+   if (!(txbd->d.cmd & RNP_CMD_DD))
+   return 0;
+   *txbd = txq->zero_desc;
+   next_dd = txq->tx_next_dd - (txq->tx_free_thresh - 1);
+   tx_swbd = &txq->sw_ring[next_dd];
+
+   for (i = 0; i < txq->tx_rs_thresh; ++i, ++tx_swbd) {
+   if (tx_swbd->mbuf) {
+   m = tx_swbd->mbuf;
+   rte_pktmbuf_free_seg(m);
+   tx_swbd->mbuf = NULL;
+   }
+   }
+   txq->nb_tx_free = (txq->nb_tx_free + txq->tx_rs_thresh);
+   txq->tx_next_dd = (txq->tx_next_dd + txq->tx_rs_thresh) &
+   txq->attr.nb_desc_mask;
+
+   return 0;
+}
+
+static __rte_always_inline uint16_t
+rnp_xmit_simple(void *_txq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
+{
+   struct rnp_tx_queue *txq = (struct rnp_tx_queue *)_txq;
+   volatile struct rnp_tx_desc *txbd;
+   struct rnp_txsw_entry *tx_swbd;
+   uint64_t phy;
+   uint16_t start;
+   uint16_t i;
+
+   if (unlikely(!txq->txq_started || !txq->tx_link))
+   return 0;
+
+   if (txq->nb_tx_free < txq->tx_free_thresh)
+   rnp_clean_tx_ring(txq);
+
+   nb_pkts = RTE_MIN(txq->nb_tx_free, nb_pkts);
+   if (!nb_pkts)
+   return 0;
+   start = nb_pkts;
+   i = txq->tx_tail;
+
+   while (nb_pkts--) {
+   txbd = &txq->tx_bdr[i];
+   tx_swbd = &txq->sw_ring[i];
+   tx_swbd->mbuf = *tx_pkts++;
+   phy = rnp_get_dma_addr(&txq->attr, tx_swbd->mbuf);
+   txbd->d.addr = phy;
+   if (unlikely(tx_swbd->mbuf->data_len > RNP_MAC_MAXFRM_SIZE))
+   tx_swbd->mbuf->data_len = 0;
+   txbd->d.blen = tx_swbd->mbuf->data_len;
+   txbd->d.cmd = RNP_CMD_EOP;
+
+   i = (i + 1) & txq->attr.nb_desc_mask;
+   }
+   txq->nb_tx_free -= start;
+   if (txq->tx_tail + start > txq->tx_next_rs) {
+   txbd = &txq->tx_bdr[txq->tx_next_rs];
+   txbd->d.cmd |= RNP_CMD_RS;
+   txq->tx_next_rs = (txq->tx_next_rs + txq->tx_rs_thresh);
+
+   if (txq->tx_next_rs > txq->attr.nb_desc)
+   txq->tx_next_rs = txq->tx_rs_thresh - 1;
+   }
+
+   txq->tx_tail = i;
+
+   rte_wmb();
+   RNP_REG_WR(txq->tx_tailreg, 0, i);
+
+   return start;
+}
+
 int rnp_rx_func_select(struct rte_eth_dev *dev)
 {
dev->rx_pkt_burst = rnp_recv_pkts;
@@ -761,7 +844,7 @@ int rnp_rx_func_select(struct rte_eth_dev *dev)
 
 int rnp_tx_func_select(struct rte_eth_dev *dev)
 {
-   dev->tx_pkt_burst = rte_eth_pkt_burst_dummy;
+   dev->tx_pkt_burst = rnp_xmit_simple;
dev->tx_pkt_prepare = rte_eth_pkt_burst_dummy;
 
return 0;
diff --git a/drivers/net/rnp/rnp_rxtx.h b/drivers/net/rnp/rnp_rxtx.h
index 39e5184502..a8fd8d052f 100644
--- a/drivers/net/rnp/rnp_rxtx.h
+++ b/drivers/net/rnp/rnp_rxtx.h
@@ -89,6 +89,7 @@ struct rnp_tx_queue {
const struct rte_memzone *rz;
uint64_t ring_phys_addr; /* tx dma ring physical addr */
volatile struct rnp_tx_desc *tx_bdr; /* tx dma ring virtual addr */
+   volatile struct rnp_tx_desc zero_desc;
struct rnp_txsw_entry *sw_ring; /* tx software ring addr */
volatile void *tx_tailreg; /* hw desc tail register */
volatile void *tx_headreg; /* hw desc head register*/
-- 
2.25.1



[PATCH v16 18/29] net/rnp: add Tx multiple segment version

2025-02-25 Thread Wenbo Cao
add support multiple segs mbuf send.

Signed-off-by: Wenbo Cao 
---
 drivers/net/rnp/rnp_ethdev.c |   2 +
 drivers/net/rnp/rnp_rxtx.c   | 126 ++-
 drivers/net/rnp/rnp_rxtx.h   |   3 +-
 3 files changed, 128 insertions(+), 3 deletions(-)

diff --git a/drivers/net/rnp/rnp_ethdev.c b/drivers/net/rnp/rnp_ethdev.c
index 3dfc7ef97b..bcd6fecb75 100644
--- a/drivers/net/rnp/rnp_ethdev.c
+++ b/drivers/net/rnp/rnp_ethdev.c
@@ -608,6 +608,8 @@ static int rnp_dev_infos_get(struct rte_eth_dev *eth_dev,
dev_info->speed_capa = rnp_get_speed_caps(eth_dev);
/* rx support offload cap */
dev_info->rx_offload_capa = RTE_ETH_RX_OFFLOAD_SCATTER;
+   /* tx support offload cap */
+   dev_info->tx_offload_capa = RTE_ETH_TX_OFFLOAD_MULTI_SEGS;
/* default ring configure */
dev_info->default_rxportconf.burst_size = 32;
dev_info->default_txportconf.burst_size = 32;
diff --git a/drivers/net/rnp/rnp_rxtx.c b/drivers/net/rnp/rnp_rxtx.c
index b2ca9b15fc..3d8fc50012 100644
--- a/drivers/net/rnp/rnp_rxtx.c
+++ b/drivers/net/rnp/rnp_rxtx.c
@@ -369,9 +369,11 @@ rnp_tx_queue_sw_reset(struct rnp_tx_queue *txq)
sw_ring[prev].next_id = idx;
prev = idx;
}
+   txq->last_desc_cleaned = txq->attr.nb_desc - 1;
txq->nb_tx_free = txq->attr.nb_desc - 1;
txq->tx_next_dd = txq->tx_rs_thresh - 1;
txq->tx_next_rs = txq->tx_rs_thresh - 1;
+   txq->nb_tx_used = 0;
txq->tx_tail = 0;
 
size = (txq->attr.nb_desc + RNP_TX_MAX_BURST_SIZE);
@@ -857,6 +859,7 @@ rnp_rxq_bulk_alloc(struct rnp_rx_queue *rxq,
rxe->mbuf = nmb;
rxbd->d.pkt_addr = rnp_get_dma_addr(&rxq->attr, nmb);
}
+   rxq->rxrearm_nb++;
if (rxq->rxrearm_nb > rxq->rx_free_thresh) {
rxq->rxrearm_nb -= rxq->rx_free_thresh;
rxq->rxrearm_start += rxq->rx_free_thresh;
@@ -924,7 +927,6 @@ rnp_scattered_rx(void *rx_queue, struct rte_mbuf **rx_pkts,
first_seg->nb_segs++;
last_seg->next = rxm;
}
-   rxq->rxrearm_nb++;
if (!(rx_status & rte_cpu_to_le_16(RNP_CMD_EOP))) {
last_seg = rxm;
continue;
@@ -945,6 +947,106 @@ rnp_scattered_rx(void *rx_queue, struct rte_mbuf 
**rx_pkts,
return nb_rx;
 }
 
+static __rte_always_inline uint16_t
+rnp_multiseg_clean_txq(struct rnp_tx_queue *txq)
+{
+   uint16_t last_desc_cleaned = txq->last_desc_cleaned;
+   struct rnp_txsw_entry *sw_ring = txq->sw_ring;
+   volatile struct rnp_tx_desc *txbd;
+   uint16_t desc_to_clean_to;
+   uint16_t nb_tx_to_clean;
+
+   desc_to_clean_to = (uint16_t)(last_desc_cleaned + txq->tx_rs_thresh);
+   desc_to_clean_to = desc_to_clean_to & (txq->attr.nb_desc - 1);
+
+   desc_to_clean_to = sw_ring[desc_to_clean_to].last_id;
+   txbd = &txq->tx_bdr[desc_to_clean_to];
+   if (!(txbd->d.cmd & RNP_CMD_DD))
+   return txq->nb_tx_free;
+
+   if (last_desc_cleaned > desc_to_clean_to)
+   nb_tx_to_clean = (uint16_t)((txq->attr.nb_desc -
+   last_desc_cleaned) + desc_to_clean_to);
+   else
+   nb_tx_to_clean = (uint16_t)(desc_to_clean_to -
+   last_desc_cleaned);
+
+   txbd->d.cmd = 0;
+
+   txq->last_desc_cleaned = desc_to_clean_to;
+   txq->nb_tx_free = (uint16_t)(txq->nb_tx_free + nb_tx_to_clean);
+
+   return txq->nb_tx_free;
+}
+
+static __rte_always_inline uint16_t
+rnp_multiseg_xmit_pkts(void *_txq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
+{
+   struct rnp_tx_queue *txq = (struct rnp_tx_queue *)_txq;
+   volatile struct rnp_tx_desc *txbd;
+   struct rnp_txsw_entry *txe, *txn;
+   struct rte_mbuf *tx_pkt, *m_seg;
+   uint16_t send_pkts = 0;
+   uint16_t nb_used_bd;
+   uint16_t tx_last;
+   uint16_t nb_tx;
+   uint16_t tx_id;
+
+   if (unlikely(!txq->txq_started || !txq->tx_link))
+   return 0;
+   if (txq->nb_tx_free < txq->tx_free_thresh)
+   rnp_multiseg_clean_txq(txq);
+   if (unlikely(txq->nb_tx_free == 0))
+   return 0;
+   tx_id = txq->tx_tail;
+   txbd = &txq->tx_bdr[tx_id];
+   txe = &txq->sw_ring[tx_id];
+   for (nb_tx = 0; nb_tx < nb_pkts; nb_tx++) {
+   tx_pkt = tx_pkts[nb_tx];
+   nb_used_bd = tx_pkt->nb_segs;
+   tx_last = (uint16_t)(tx_id + nb_used_bd - 1);
+   if (tx_last >= txq->attr.nb_desc)
+   tx_last = (uint16_t)(tx_last - txq->attr.nb_desc);
+   if (nb_used_bd > txq->nb_tx_free)
+   if (nb_used_bd > rnp_multiseg_clean_txq(txq))
+   break;
+   m_seg = tx_pkt;
+   do {
+   txbd = &txq->tx_bdr[tx_id];
+  

[PATCH v16 20/29] net/rnp: add support xstats operation

2025-02-25 Thread Wenbo Cao
add support mac eth rx tx hw xstats.

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/features/rnp.ini|   1 +
 doc/guides/nics/rnp.rst |   3 +
 drivers/net/rnp/base/rnp_eth_regs.h |   4 +
 drivers/net/rnp/base/rnp_mac_regs.h |  80 ++
 drivers/net/rnp/rnp.h   |  44 ++
 drivers/net/rnp/rnp_ethdev.c| 226 +++-
 6 files changed, 353 insertions(+), 5 deletions(-)

diff --git a/doc/guides/nics/features/rnp.ini b/doc/guides/nics/features/rnp.ini
index 07caedba7a..14ff88fec1 100644
--- a/doc/guides/nics/features/rnp.ini
+++ b/doc/guides/nics/features/rnp.ini
@@ -9,6 +9,7 @@ Link status  = Y
 Link status event= Y
 Basic stats  = Y
 Stats per queue  = Y
+Extended stats   = Y
 Queue start/stop = Y
 Promiscuous mode = Y
 Allmulticast mode= Y
diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index e796932af0..ea732c0ce5 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -105,3 +105,6 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_link_get_nowait``
 * ``rte_eth_stats_get``
 * ``rte_eth_stats_reset``
+* ``rte_eth_xstats_get``
+* ``rte_eth_xstats_reset``
+* ``rte_eth_xstats_get_names``
diff --git a/drivers/net/rnp/base/rnp_eth_regs.h 
b/drivers/net/rnp/base/rnp_eth_regs.h
index 391688bd80..adac817df2 100644
--- a/drivers/net/rnp/base/rnp_eth_regs.h
+++ b/drivers/net/rnp/base/rnp_eth_regs.h
@@ -25,6 +25,10 @@
 #define RNP_RING_FC_THRESH(n)  _ETH_(0x8a00 + ((0x4) * (n)))
 /* ETH Statistic */
 #define RNP_ETH_RXTRANS_DROP   _ETH_(0x8904)
+#define RNP_ETH_RXSLAN_DROP_ETH_(0x8914)
+#define RNP_ETH_RXGLAN_DROP_ETH_(0x8918)
+#define RNP_ETH_RXIPH_E_DROP   _ETH_(0x891c)
+#define RNP_ETH_RXCKSUM_E_DROP _ETH_(0x8920)
 #define RNP_ETH_RXTRUNC_DROP   _ETH_(0x8928)
 /* Mac Host Filter  */
 #define RNP_MAC_FCTRL  _ETH_(0x9110)
diff --git a/drivers/net/rnp/base/rnp_mac_regs.h 
b/drivers/net/rnp/base/rnp_mac_regs.h
index 1ae880143d..4fd907a601 100644
--- a/drivers/net/rnp/base/rnp_mac_regs.h
+++ b/drivers/net/rnp/base/rnp_mac_regs.h
@@ -78,4 +78,84 @@
 /* PHY Link Status */
 #define RNP_MAC_PLSRTE_BIT32(17)
 
+/* Mac Manage Counts */
+#define RNP_MMC_CTRL   (0x0800)
+#define RNP_MMC_RSTONRDRTE_BIT32(2)
+/* Tx Good And Bad Bytes Base */
+#define RNP_MMC_TX_GBOCTGB (0x0814)
+/* Tx Good And Bad Frame Num Base */
+#define RNP_MMC_TX_GBFRMB  (0x081c)
+/* Tx Good Broadcast Frame Num Base */
+#define RNP_MMC_TX_BCASTB  (0x0824)
+/* Tx Good Multicast Frame Num Base */
+#define RNP_MMC_TX_MCASTB  (0x082c)
+/* Tx 64Bytes Frame Num */
+#define RNP_MMC_TX_64_BYTESB   (0x0834)
+#define RNP_MMC_TX_65TO127_BYTESB  (0x083c)
+#define RNP_MMC_TX_128TO255_BYTEB  (0x0844)
+#define RNP_MMC_TX_256TO511_BYTEB  (0x084c)
+#define RNP_MMC_TX_512TO1023_BYTEB (0x0854)
+#define RNP_MMC_TX_1024TOMAX_BYTEB (0x085c)
+/* Tx Good And Bad Unicast Frame Num Base */
+#define RNP_MMC_TX_GBUCASTB(0x0864)
+/* Tx Good And Bad Multicast Frame Num Base */
+#define RNP_MMC_TX_GBMCASTB(0x086c)
+/* Tx Good And Bad Broadcast Frame NUM Base */
+#define RNP_MMC_TX_GBBCASTB(0x0874)
+/* Tx Frame Underflow Error */
+#define RNP_MMC_TX_UNDRFLWB(0x087c)
+/* Tx Good Frame Bytes Base */
+#define RNP_MMC_TX_GBYTESB (0x0884)
+/* Tx Good Frame Num Base*/
+#define RNP_MMC_TX_GBRMB   (0x088c)
+/* Tx Good Pause Frame Num Base */
+#define RNP_MMC_TX_PAUSEB  (0x0894)
+/* Tx Good Vlan Frame Num Base */
+#define RNP_MMC_TX_VLANB   (0x089c)
+
+/* Rx Good And Bad Frames Num Base */
+#define RNP_MMC_RX_GBFRMB  (0x0900)
+/* Rx Good And Bad Frames Bytes Base */
+#define RNP_MMC_RX_GBOCTGB (0x0908)
+/* Rx Good Framse Bytes Base */
+#define RNP_MMC_RX_GOCTGB  (0x0910)
+/* Rx Good Broadcast Frames Num Base */
+#define RNP_MMC_RX_BCASTGB (0x0918)
+/* Rx Good Multicast Frames Num Base */
+#define RNP_MMC_RX_MCASTGB (0x0920)
+/* Rx Crc Error Frames Num Base */
+#define RNP_MMC_RX_CRCERB  (0x0928)
+/* Rx Less Than 64Byes with Crc Err Base*/
+#define RNP_MMC_RX_RUNTERB (0x0930)
+/* Receive Jumbo Frame Error */
+#define RNP_MMC_RX_JABBER_ERR  (0x0934)
+/* Shorter Than 64Bytes without Any Errora Base */
+#define RNP_MMC_RX_USIZEGB (0x0938)
+/* Len Oversize 9k */
+#define RNP_MMC_RX_OSIZEGB (0x093c)
+/* Rx 64Byes Frame Num Base */
+#define RNP_MMC_RX_64_BYTESB   (0x0940)
+/* Rx 65Bytes To 127Bytes Frame Num Base */
+#define RNP_MMC_RX_65TO127_BYTESB  (0x0948)
+/* Rx 128Bytes To 255Bytes Frame Num Base */
+#define RNP_MMC_RX_128TO255_BYTESB (0x0950)
+/* Rx 256Bytes To 511Bytes Frame Num Base */
+#define RNP_MMC_RX_256TO511_BYTESB (0x0958)
+/* Rx 512Bytes To 1023Bytes Frame Num Base */
+#define RNP_MMC_RX_512TO1203_BYTESB(0x0960)
+/* Rx Len Bigger Than

[PATCH v16 24/29] net/rnp: add support Tx TSO offload

2025-02-25 Thread Wenbo Cao
Add support tx tso and tunnel tso
for tunnel just support vxlan/nvgre.

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/features/rnp.ini  |   1 +
 doc/guides/nics/rnp.rst   |   1 +
 drivers/net/rnp/base/rnp_bdq_if.h |   1 +
 drivers/net/rnp/rnp.h |   2 +-
 drivers/net/rnp/rnp_ethdev.c  |  14 +-
 drivers/net/rnp/rnp_rxtx.c| 464 +-
 drivers/net/rnp/rnp_rxtx.h|   1 +
 7 files changed, 476 insertions(+), 8 deletions(-)

diff --git a/doc/guides/nics/features/rnp.ini b/doc/guides/nics/features/rnp.ini
index ceac0beff8..f6feb9aa70 100644
--- a/doc/guides/nics/features/rnp.ini
+++ b/doc/guides/nics/features/rnp.ini
@@ -25,5 +25,6 @@ RSS key update   = Y
 RSS reta update  = Y
 Inner RSS= Y
 Scattered Rx = Y
+TSO  = Y
 Linux= Y
 x86-64   = Y
diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index 3f4833c79d..b9c983d07e 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -57,6 +57,7 @@ Features
 - Port hardware statistic
 - Packet type parsing
 - Checksum offload
+- TSO offload
 
 Prerequisites and Pre-conditions
 
diff --git a/drivers/net/rnp/base/rnp_bdq_if.h 
b/drivers/net/rnp/base/rnp_bdq_if.h
index a7d27bdebb..7a6d0b21ec 100644
--- a/drivers/net/rnp/base/rnp_bdq_if.h
+++ b/drivers/net/rnp/base/rnp_bdq_if.h
@@ -111,6 +111,7 @@ struct rnp_tx_desc {
 #define RNP_TX_VLAN_VALID  RTE_BIT32(15)
 /* tx data mac_ip len */
 #define RNP_TX_MAC_LEN_S   (9)
+#define RNP_TX_MAC_LEN_MASKRTE_GENMASK32(15, 9)
 /* tx ctrl cmd */
 #define RNP_TX_LEN_PAD_S   (8)
 #define RNP_TX_OFF_MAC_PAD (0x01UL << RNP_TX_LEN_PAD_S)
diff --git a/drivers/net/rnp/rnp.h b/drivers/net/rnp/rnp.h
index 694ce1409a..c32eb2291c 100644
--- a/drivers/net/rnp/rnp.h
+++ b/drivers/net/rnp/rnp.h
@@ -20,7 +20,7 @@
 #define RNP_ETH_OVERHEAD \
(RTE_ETHER_HDR_LEN + RTE_VLAN_HLEN * 2)
 #define RNP_MAC_MAXFRM_SIZE(9590)
-
+#define RNP_MAX_TSO_PKT(16 * 1024)
 #define RNP_RX_MAX_MTU_SEG (64)
 #define RNP_TX_MAX_MTU_SEG (32)
 #define RNP_RX_MAX_SEG (150)
diff --git a/drivers/net/rnp/rnp_ethdev.c b/drivers/net/rnp/rnp_ethdev.c
index 615447f32a..5756625fbf 100644
--- a/drivers/net/rnp/rnp_ethdev.c
+++ b/drivers/net/rnp/rnp_ethdev.c
@@ -671,7 +671,16 @@ static int rnp_dev_infos_get(struct rte_eth_dev *eth_dev,
dev_info->rx_offload_capa = RNP_RX_CHECKSUM_SUPPORT |
RTE_ETH_RX_OFFLOAD_SCATTER;
/* tx support offload cap */
-   dev_info->tx_offload_capa = RTE_ETH_TX_OFFLOAD_MULTI_SEGS;
+   dev_info->tx_offload_capa = 0 |
+   RTE_ETH_TX_OFFLOAD_IPV4_CKSUM |
+   RTE_ETH_TX_OFFLOAD_UDP_CKSUM |
+   RTE_ETH_TX_OFFLOAD_TCP_CKSUM |
+   RTE_ETH_TX_OFFLOAD_SCTP_CKSUM |
+   RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM |
+   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;
/* default ring configure */
dev_info->default_rxportconf.burst_size = 32;
dev_info->default_txportconf.burst_size = 32;
@@ -1083,6 +1092,7 @@ rnp_dev_stats_get(struct rte_eth_dev *dev,
continue;
stats->opackets += txq->stats.opackets;
stats->obytes += txq->stats.obytes;
+   stats->oerrors += txq->stats.errors;
if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {
stats->q_opackets[i] = txq->stats.opackets;
stats->q_obytes[i] = txq->stats.obytes;
@@ -1091,7 +1101,7 @@ rnp_dev_stats_get(struct rte_eth_dev *dev,
stats->imissed = eth_stats->rx_trans_drop + eth_stats->rx_trunc_drop;
stats->ierrors = mac_stats->rx_crc_err + mac_stats->rx_len_err;
stats->ierrors += mac_stats->rx_watchdog_err;
-   stats->oerrors = mac_stats->tx_underflow_err;
+   stats->oerrors += mac_stats->tx_underflow_err;
 
return 0;
 }
diff --git a/drivers/net/rnp/rnp_rxtx.c b/drivers/net/rnp/rnp_rxtx.c
index c6c80f3a76..3e0ac47f9d 100644
--- a/drivers/net/rnp/rnp_rxtx.c
+++ b/drivers/net/rnp/rnp_rxtx.c
@@ -1125,6 +1125,199 @@ rnp_multiseg_clean_txq(struct rnp_tx_queue *txq)
 
return txq->nb_tx_free;
 }
+static inline uint32_t
+rnp_cal_tso_seg(struct rte_mbuf *mbuf)
+{
+   uint32_t hdr_len;
+
+   hdr_len = mbuf->l2_len + mbuf->l3_len + mbuf->l4_len;
+
+   hdr_len += (mbuf->ol_flags & RTE_MBUF_F_TX_TUNNEL_MASK) ?
+   mbuf->outer_l2_len + mbuf->outer_l3_len : 0;
+
+   return (mbuf->tso_segsz) ? mbuf->tso_segsz : hdr_len;
+}
+
+static inline bool
+rnp_need_ctrl_d

[PATCH v16 25/29] net/rnp: support VLAN offloads

2025-02-25 Thread Wenbo Cao
add support rx vlan strip,filter,tx vlan/qinq insert.

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/features/rnp.ini|   2 +
 doc/guides/nics/rnp.rst |   4 +
 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| 170 +++-
 drivers/net/rnp/rnp_rxtx.c  |  22 +++-
 11 files changed, 303 insertions(+), 6 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 b9c983d07e..320f19451b 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -58,6 +58,7 @@ Features
 - Packet type parsing
 - Checksum offload
 - TSO offload
+- VLAN stripping and VLAN/QINQ insertion
 
 Prerequisites and Pre-conditions
 
@@ -101,6 +102,9 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_dev_mac_addr_add``
 * ``rte_eth_dev_mac_addr_remove``
 * ``rte_eth_dev_get_supported_ptypes``
+* ``rte_eth_dev_get_vlan_offload``
+* ``rte_eth_dev_set_vlan_offload``
+* ``rte_eth_dev_set_vlan_strip_on_queue``
 * ``rte_eth_promiscuous_disable``
 * ``rte_eth_promiscuous_enable``
 * ``rte_eth_allmulticast_enable``
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_VALIDRTE_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 e096ec90e6..f84386d93a 100644
--- a/drivers/net/rnp/base/rnp_eth_regs.h
+++ b/drivers/net/rnp/base/rnp_eth_regs.h
@@ -57,6 +57,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 e5a19a1918..c7e5a2f506 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, const 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 6ad2ca0a4a..b6b969a020 100644
--- a/drivers/net/rnp/base/rnp_mac.c
+++ b/drivers/net/rnp/base/rnp_mac.c
@@ -166,11 +166,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 | \;
+RNP_MAC_VLAN_HASH_EN);
+   } else {
+   flt_reg &= ~

[PATCH v16 21/29] net/rnp: add unicast MAC filter operation

2025-02-25 Thread Wenbo Cao
add mac filter for single/multiple port.

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/features/rnp.ini|  1 +
 doc/guides/nics/rnp.rst |  6 ++
 drivers/net/rnp/base/rnp_eth_regs.h |  4 ++
 drivers/net/rnp/base/rnp_hw.h   |  3 +
 drivers/net/rnp/base/rnp_mac.c  | 91 +
 drivers/net/rnp/base/rnp_mac.h  |  2 +
 drivers/net/rnp/base/rnp_mac_regs.h |  4 ++
 drivers/net/rnp/rnp.h   |  4 ++
 drivers/net/rnp/rnp_ethdev.c| 62 ++--
 9 files changed, 171 insertions(+), 6 deletions(-)

diff --git a/doc/guides/nics/features/rnp.ini b/doc/guides/nics/features/rnp.ini
index 14ff88fec1..00b23b0fa2 100644
--- a/doc/guides/nics/features/rnp.ini
+++ b/doc/guides/nics/features/rnp.ini
@@ -14,6 +14,7 @@ Queue start/stop = Y
 Promiscuous mode = Y
 Allmulticast mode= Y
 MTU update   = Y
+Unicast MAC filter   = Y
 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 ea732c0ce5..ea3270a758 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -51,6 +51,7 @@ Features
 - Promiscuous mode
 - Link state information
 - MTU update
+- MAC filtering
 - Jumbo frames
 - Scatter-Gather IO support
 - Port hardware statistic
@@ -93,6 +94,9 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_dev_set_link_up``
 * ``rte_eth_dev_get_mtu``
 * ``rte_eth_dev_set_mtu``
+* ``rte_eth_dev_default_mac_addr_set``
+* ``rte_eth_dev_mac_addr_add``
+* ``rte_eth_dev_mac_addr_remove``
 * ``rte_eth_promiscuous_disable``
 * ``rte_eth_promiscuous_enable``
 * ``rte_eth_allmulticast_enable``
@@ -108,3 +112,5 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_xstats_get``
 * ``rte_eth_xstats_reset``
 * ``rte_eth_xstats_get_names``
+* ``rte_eth_macaddr_get``
+* ``rte_eth_macaddrs_get``
diff --git a/drivers/net/rnp/base/rnp_eth_regs.h 
b/drivers/net/rnp/base/rnp_eth_regs.h
index adac817df2..49860135bd 100644
--- a/drivers/net/rnp/base/rnp_eth_regs.h
+++ b/drivers/net/rnp/base/rnp_eth_regs.h
@@ -64,5 +64,9 @@
 #define RNP_RSS_KEY_TABLE(idx) _ETH_(0x92d0 + ((idx) * 0x4))
 
 #define RNP_TC_PORT_OFFSET(lane)   _ETH_(0xe840 + 0x04 * (lane))
+/* host mac address filter */
+#define RNP_RAL_BASE_ADDR(n)   _ETH_(0xA000 + (0x04 * (n)))
+#define RNP_RAH_BASE_ADDR(n)   _ETH_(0xA400 + (0x04 * (n)))
+#define RNP_MAC_FILTER_EN  RTE_BIT32(31)
 
 #endif /* _RNP_ETH_REGS_H */
diff --git a/drivers/net/rnp/base/rnp_hw.h b/drivers/net/rnp/base/rnp_hw.h
index 72e66338a0..e5a19a1918 100644
--- a/drivers/net/rnp/base/rnp_hw.h
+++ b/drivers/net/rnp/base/rnp_hw.h
@@ -71,6 +71,9 @@ struct rnp_mac_ops {
int (*get_macaddr)(struct rnp_eth_port *port, u8 *mac);
/* update mac packet filter mode */
int (*update_mpfm)(struct rnp_eth_port *port, u32 mode, bool en);
+   /* Receive Address Filter table */
+   int (*set_rafb)(struct rnp_eth_port *port, const u8 *mac, u32 index);
+   int (*clear_rafb)(struct rnp_eth_port *port, u32 index);
 };
 
 struct rnp_eth_adapter;
diff --git a/drivers/net/rnp/base/rnp_mac.c b/drivers/net/rnp/base/rnp_mac.c
index 52d8a47437..6ad2ca0a4a 100644
--- a/drivers/net/rnp/base/rnp_mac.c
+++ b/drivers/net/rnp/base/rnp_mac.c
@@ -95,14 +95,89 @@ rnp_update_mpfm_pf(struct rnp_eth_port *port, u32 mode, 
bool en)
return 0;
 }
 
+static int
+rnp_set_mac_addr_pf(struct rnp_eth_port *port,
+   const u8 *addr, u32 index)
+{
+   struct rnp_hw *hw = port->hw;
+   u32 addr_hi = 0, addr_lo = 0;
+   u8 *mac = NULL;
+
+   mac = (u8 *)&addr_hi;
+   mac[0] = addr[1];
+   mac[1] = addr[0];
+   mac = (u8 *)&addr_lo;
+   mac[0] = addr[5];
+   mac[1] = addr[4];
+   mac[2] = addr[3];
+   mac[3] = addr[2];
+   addr_hi |= RNP_MAC_FILTER_EN;
+   RNP_E_REG_WR(hw, RNP_RAH_BASE_ADDR(index), addr_hi);
+   RNP_E_REG_WR(hw, RNP_RAL_BASE_ADDR(index), addr_lo);
+
+   return 0;
+}
+
+static int
+rnp_set_mac_addr_indep(struct rnp_eth_port *port,
+  const u8 *addr, u32 index)
+{
+   u16 lane = port->attr.nr_lane;
+   struct rnp_hw *hw = port->hw;
+   u32 addr_hi = 0, addr_lo = 0;
+   u8 *mac = NULL;
+
+   mac = (u8 *)&addr_lo;
+   mac[0] = addr[0];
+   mac[1] = addr[1];
+   mac[2] = addr[2];
+   mac[3] = addr[3];
+   mac = (u8 *)&addr_hi;
+   mac[0] = addr[4];
+   mac[1] = addr[5];
+
+   addr_hi |= RNP_MAC_AE;
+   RNP_MAC_REG_WR(hw, lane, RNP_MAC_ADDR_HI(index), addr_hi);
+   RNP_MAC_REG_WR(hw, lane, RNP_MAC_ADDR_LO(index), addr_lo);
+
+   return 0;
+}
+
+static int
+rnp_clear_mac_pf(struct rnp_eth_port *port, u32 index)
+{
+   struct rnp_hw *hw = port->hw;
+
+   RNP_E_REG_WR(hw, RNP_RAL_BASE_ADDR(index), 0);
+   RNP_E_REG_WR(hw, RNP_RAH_BASE_ADDR(index), 0);
+
+   return 0;
+}
+
+static int
+rnp_clear_mac_indep(struct rnp_eth_port *port, u32 i

[PATCH v16 19/29] net/rnp: add support basic stats operation

2025-02-25 Thread Wenbo Cao
add support hw-missed rx/tx packets bytes.

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/features/rnp.ini|   2 +
 doc/guides/nics/rnp.rst |   3 +
 drivers/net/rnp/base/rnp_eth_regs.h |   3 +
 drivers/net/rnp/rnp.h   |   8 ++
 drivers/net/rnp/rnp_ethdev.c| 136 
 drivers/net/rnp/rnp_rxtx.c  |   9 ++
 drivers/net/rnp/rnp_rxtx.h  |  10 ++
 7 files changed, 171 insertions(+)

diff --git a/doc/guides/nics/features/rnp.ini b/doc/guides/nics/features/rnp.ini
index 6453762745..07caedba7a 100644
--- a/doc/guides/nics/features/rnp.ini
+++ b/doc/guides/nics/features/rnp.ini
@@ -7,6 +7,8 @@
 Speed capabilities   = Y
 Link status  = Y
 Link status event= Y
+Basic stats  = Y
+Stats per queue  = Y
 Queue start/stop = Y
 Promiscuous mode = Y
 Allmulticast mode= Y
diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index ebf6971140..e796932af0 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -53,6 +53,7 @@ Features
 - MTU update
 - Jumbo frames
 - Scatter-Gather IO support
+- Port hardware statistic
 
 Prerequisites and Pre-conditions
 
@@ -102,3 +103,5 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_tx_queue_setup``
 * ``rte_eth_link_get``
 * ``rte_eth_link_get_nowait``
+* ``rte_eth_stats_get``
+* ``rte_eth_stats_reset``
diff --git a/drivers/net/rnp/base/rnp_eth_regs.h 
b/drivers/net/rnp/base/rnp_eth_regs.h
index 91a18dd42d..391688bd80 100644
--- a/drivers/net/rnp/base/rnp_eth_regs.h
+++ b/drivers/net/rnp/base/rnp_eth_regs.h
@@ -23,6 +23,9 @@
 #define RNP_RX_FC_ENABLE   _ETH_(0x8520)
 #define RNP_RING_FC_EN(n)  _ETH_(0x8524 + ((0x4) * ((n) / 32)))
 #define RNP_RING_FC_THRESH(n)  _ETH_(0x8a00 + ((0x4) * (n)))
+/* ETH Statistic */
+#define RNP_ETH_RXTRANS_DROP   _ETH_(0x8904)
+#define RNP_ETH_RXTRUNC_DROP   _ETH_(0x8928)
 /* Mac Host Filter  */
 #define RNP_MAC_FCTRL  _ETH_(0x9110)
 #define RNP_MAC_FCTRL_MPE  RTE_BIT32(8)  /* Multicast Promiscuous En */
diff --git a/drivers/net/rnp/rnp.h b/drivers/net/rnp/rnp.h
index 8323858043..2cda0ffe55 100644
--- a/drivers/net/rnp/rnp.h
+++ b/drivers/net/rnp/rnp.h
@@ -108,6 +108,11 @@ struct rnp_proc_priv {
const struct rnp_mbx_ops *mbx_ops;
 };
 
+struct rnp_hw_eth_stats {
+   uint64_t rx_trans_drop; /* rx eth to dma fifo full drop */
+   uint64_t rx_trunc_drop; /* rx mac to eth to host copy fifo full 
drop */
+};
+
 struct rnp_eth_port {
struct rnp_proc_priv *proc_priv;
struct rte_ether_addr mac_addr;
@@ -116,6 +121,9 @@ struct rnp_eth_port {
struct rnp_tx_queue *tx_queues[RNP_MAX_RX_QUEUE_NUM];
struct rnp_hw *hw;
 
+   struct rnp_hw_eth_stats eth_stats_old;
+   struct rnp_hw_eth_stats eth_stats;
+
struct rte_eth_rss_conf rss_conf;
uint16_t last_rx_num;
bool rxq_num_changed;
diff --git a/drivers/net/rnp/rnp_ethdev.c b/drivers/net/rnp/rnp_ethdev.c
index bcd6fecb75..6e91601c98 100644
--- a/drivers/net/rnp/rnp_ethdev.c
+++ b/drivers/net/rnp/rnp_ethdev.c
@@ -803,6 +803,139 @@ rnp_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
return 0;
 }
 
+struct rte_rnp_xstats_name_off {
+   char name[RTE_ETH_XSTATS_NAME_SIZE];
+   uint32_t offset;
+   uint32_t reg_base;
+   bool hi_addr_en;
+};
+
+static const struct rte_rnp_xstats_name_off rte_rnp_rx_eth_stats_str[] = {
+   {"eth rx full drop", offsetof(struct rnp_hw_eth_stats,
+   rx_trans_drop), RNP_ETH_RXTRANS_DROP, false},
+   {"eth_rx_fifo_drop", offsetof(struct rnp_hw_eth_stats,
+   rx_trunc_drop), RNP_ETH_RXTRUNC_DROP, false},
+};
+#define RNP_NB_RX_HW_ETH_STATS (RTE_DIM(rte_rnp_rx_eth_stats_str))
+#define RNP_GET_E_HW_COUNT(stats, offset)\
+   ((uint64_t *)(((char *)stats) + (offset)))
+#define RNP_ADD_INCL_COUNT(stats, offset, val)   \
+   ((*(RNP_GET_E_HW_COUNT(stats, (offset += val)
+
+static inline void
+rnp_update_eth_stats_32bit(struct rnp_hw_eth_stats *new,
+  struct rnp_hw_eth_stats *old,
+  uint32_t offset, uint32_t val)
+{
+   uint64_t *last_count = NULL;
+
+   last_count = RNP_GET_E_HW_COUNT(old, offset);
+   if (val >= *last_count)
+   RNP_ADD_INCL_COUNT(new, offset, val - (*last_count));
+   else
+   RNP_ADD_INCL_COUNT(new, offset, val + UINT32_MAX);
+   *last_count = val;
+}
+
+static void rnp_get_eth_count(struct rnp_hw *hw,
+ uint16_t lane,
+ struct rnp_hw_eth_stats *new,
+ struct rnp_hw_eth_stats *old,
+ const struct rte_rnp_xstats_name_off *ptr)
+{
+   uint64_t val = 0;
+
+   if (ptr->reg_base) {
+   val = RNP_E_REG_RD(hw, ptr->reg_base + 0x40 * lane);
+   rnp_update_eth_stats_32bit(new

[PATCH v16 27/29] net/rnp: add queue info operation

2025-02-25 Thread Wenbo Cao
add support get queue configure info for user debug

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/rnp.rst  |  2 ++
 drivers/net/rnp/rnp_ethdev.c |  2 ++
 drivers/net/rnp/rnp_rxtx.c   | 42 
 drivers/net/rnp/rnp_rxtx.h   |  4 
 4 files changed, 50 insertions(+)

diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index 737b980291..c3e8d514d9 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -113,7 +113,9 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_promiscuous_get``
 * ``rte_eth_allmulticast_get``
 * ``rte_eth_rx_queue_setup``
+* ``rte_eth_rx_queue_info_get``
 * ``rte_eth_tx_queue_setup``
+* ``rte_eth_tx_queue_info_get``
 * ``rte_eth_link_get``
 * ``rte_eth_link_get_nowait``
 * ``rte_eth_stats_get``
diff --git a/drivers/net/rnp/rnp_ethdev.c b/drivers/net/rnp/rnp_ethdev.c
index b6453be079..84ff746ecd 100644
--- a/drivers/net/rnp/rnp_ethdev.c
+++ b/drivers/net/rnp/rnp_ethdev.c
@@ -1480,10 +1480,12 @@ static const struct eth_dev_ops rnp_eth_dev_ops = {
.rx_queue_release = rnp_dev_rx_queue_release,
.rx_queue_stop= rnp_rx_queue_stop,
.rx_queue_start   = rnp_rx_queue_start,
+   .rxq_info_get = rnp_rx_queue_info_get,
.tx_queue_setup   = rnp_tx_queue_setup,
.tx_queue_release = rnp_dev_tx_queue_release,
.tx_queue_stop= rnp_tx_queue_stop,
.tx_queue_start   = rnp_tx_queue_start,
+   .txq_info_get = rnp_tx_queue_info_get,
/* rss impl */
.reta_update  = rnp_dev_rss_reta_update,
.reta_query   = rnp_dev_rss_reta_query,
diff --git a/drivers/net/rnp/rnp_rxtx.c b/drivers/net/rnp/rnp_rxtx.c
index 6504d62f62..d58b0412ce 100644
--- a/drivers/net/rnp/rnp_rxtx.c
+++ b/drivers/net/rnp/rnp_rxtx.c
@@ -1720,3 +1720,45 @@ int rnp_tx_func_select(struct rte_eth_dev *dev)
 
return 0;
 }
+
+void
+rnp_rx_queue_info_get(struct rte_eth_dev *dev, uint16_t queue_id,
+ struct rte_eth_rxq_info *qinfo)
+{
+   struct rnp_rx_queue *rxq;
+
+   rxq = dev->data->rx_queues[queue_id];
+   if (!rxq)
+   return;
+   qinfo->mp = rxq->mb_pool;
+   qinfo->scattered_rx = dev->data->scattered_rx;
+   qinfo->queue_state = rxq->rxq_started;
+   qinfo->nb_desc = rxq->attr.nb_desc;
+   qinfo->rx_buf_size = rxq->rx_buf_len;
+
+   qinfo->conf.rx_deferred_start = rxq->rx_deferred_start;
+   qinfo->conf.rx_free_thresh = rxq->rx_free_thresh;
+   qinfo->conf.rx_thresh.pthresh = rxq->pthresh;
+   qinfo->conf.rx_thresh.hthresh = rxq->pburst;
+   qinfo->conf.offloads = rxq->rx_offloads;
+}
+
+void
+rnp_tx_queue_info_get(struct rte_eth_dev *dev, uint16_t queue_id,
+ struct rte_eth_txq_info *qinfo)
+{
+   struct rnp_tx_queue *txq;
+
+   txq = dev->data->tx_queues[queue_id];
+   if (!txq)
+   return;
+   qinfo->queue_state = txq->txq_started;
+   qinfo->nb_desc = txq->attr.nb_desc;
+
+   qinfo->conf.tx_deferred_start = txq->tx_deferred_start;
+   qinfo->conf.tx_free_thresh = txq->tx_free_thresh;
+   qinfo->conf.tx_rs_thresh = txq->tx_rs_thresh;
+   qinfo->conf.tx_thresh.pthresh = txq->pthresh;
+   qinfo->conf.tx_thresh.hthresh = txq->pburst;
+   qinfo->conf.offloads = txq->tx_offloads;
+}
diff --git a/drivers/net/rnp/rnp_rxtx.h b/drivers/net/rnp/rnp_rxtx.h
index 51e5d4b600..dc4a8ea9dd 100644
--- a/drivers/net/rnp/rnp_rxtx.h
+++ b/drivers/net/rnp/rnp_rxtx.h
@@ -148,5 +148,9 @@ int rnp_rx_queue_stop(struct rte_eth_dev *eth_dev, uint16_t 
qidx);
 int rnp_rx_queue_start(struct rte_eth_dev *eth_dev, uint16_t qidx);
 int rnp_rx_func_select(struct rte_eth_dev *dev);
 int rnp_tx_func_select(struct rte_eth_dev *dev);
+void rnp_rx_queue_info_get(struct rte_eth_dev *dev, uint16_t queue_id,
+  struct rte_eth_rxq_info *qinfo);
+void rnp_tx_queue_info_get(struct rte_eth_dev *dev, uint16_t queue_id,
+  struct rte_eth_txq_info *qinfo);
 
 #endif /* _RNP_RXTX_H_ */
-- 
2.25.1



[PATCH v16 26/29] net/rnp: add support VLAN filters operations

2025-02-25 Thread Wenbo Cao
add support to update vid for vlan filter.

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/features/rnp.ini|  1 +
 doc/guides/nics/rnp.rst |  3 +-
 drivers/net/rnp/base/meson.build|  1 +
 drivers/net/rnp/base/rnp_bitrev.h   | 64 
 drivers/net/rnp/base/rnp_crc32.c| 37 
 drivers/net/rnp/base/rnp_crc32.h| 10 
 drivers/net/rnp/base/rnp_eth_regs.h |  1 +
 drivers/net/rnp/base/rnp_hw.h   |  1 +
 drivers/net/rnp/base/rnp_mac.c  | 90 -
 drivers/net/rnp/base/rnp_mac.h  |  1 +
 drivers/net/rnp/base/rnp_mac_regs.h |  6 ++
 drivers/net/rnp/base/rnp_osdep.h| 13 +
 drivers/net/rnp/rnp.h   | 11 
 drivers/net/rnp/rnp_ethdev.c| 11 
 14 files changed, 247 insertions(+), 3 deletions(-)
 create mode 100644 drivers/net/rnp/base/rnp_bitrev.h
 create mode 100644 drivers/net/rnp/base/rnp_crc32.c
 create mode 100644 drivers/net/rnp/base/rnp_crc32.h

diff --git a/doc/guides/nics/features/rnp.ini b/doc/guides/nics/features/rnp.ini
index c1ab91697a..48d250c86b 100644
--- a/doc/guides/nics/features/rnp.ini
+++ b/doc/guides/nics/features/rnp.ini
@@ -20,6 +20,7 @@ Promiscuous mode = Y
 Allmulticast mode= Y
 MTU update   = Y
 Unicast MAC filter   = Y
+VLAN filter  = Y
 VLAN offload = Y
 QinQ offload = P
 RSS hash = Y
diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index 320f19451b..737b980291 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -51,7 +51,7 @@ Features
 - Promiscuous mode
 - Link state information
 - MTU update
-- MAC filtering
+- MAC/VLAN filtering
 - Jumbo frames
 - Scatter-Gather IO support
 - Port hardware statistic
@@ -105,6 +105,7 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_dev_get_vlan_offload``
 * ``rte_eth_dev_set_vlan_offload``
 * ``rte_eth_dev_set_vlan_strip_on_queue``
+* ``rte_eth_dev_vlan_filter``
 * ``rte_eth_promiscuous_disable``
 * ``rte_eth_promiscuous_enable``
 * ``rte_eth_allmulticast_enable``
diff --git a/drivers/net/rnp/base/meson.build b/drivers/net/rnp/base/meson.build
index ba49accdec..2a1f2c22ea 100644
--- a/drivers/net/rnp/base/meson.build
+++ b/drivers/net/rnp/base/meson.build
@@ -8,6 +8,7 @@ sources = [
 'rnp_common.c',
 'rnp_mac.c',
 'rnp_bdq_if.c',
+'rnp_crc32.c',
 ]
 
 c_args = cflags
diff --git a/drivers/net/rnp/base/rnp_bitrev.h 
b/drivers/net/rnp/base/rnp_bitrev.h
new file mode 100644
index 00..05c36ca80d
--- /dev/null
+++ b/drivers/net/rnp/base/rnp_bitrev.h
@@ -0,0 +1,64 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2023 Mucse IC Design Ltd.
+ */
+
+#ifndef _RNP_BITREV_H_
+#define _RNP_BITREV_H_
+
+#include "rnp_osdep.h"
+
+static const u8 byte_rev_table[256] = {
+   0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
+   0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
+   0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
+   0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
+   0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
+   0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
+   0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
+   0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
+   0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
+   0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
+   0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
+   0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
+   0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
+   0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
+   0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
+   0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
+   0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
+   0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
+   0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
+   0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
+   0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
+   0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
+   0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
+   0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
+   0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
+   0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
+   0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
+   0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
+   0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
+   0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
+   0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
+   0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff,
+};
+
+static inline u8 bitrev8(u8 byte)
+{
+   return byte_rev_table[byte];
+}
+
+static u16 bitrev16(u16 x)
+{
+   return (bitrev8(x & 0xff) << 8) | bitrev8(x >> 8);
+}
+
+/**
+ * bitrev32 - reverse the order of bits in a u32 value
+ * @x: value to be bit-reversed
+ */
+static u32 bitrev32(uint32_t x)
+{
+   return (bitrev16(x & 0x) << 16) | bitrev16(x >> 16

[PATCH v16 29/29] net/rnp: add multicast MAC filter operation

2025-02-25 Thread Wenbo Cao
add mac filter for single/multiple port.

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/features/rnp.ini|   1 +
 doc/guides/nics/rnp.rst |   1 +
 drivers/net/rnp/base/rnp_crc32.c|  18 -
 drivers/net/rnp/base/rnp_crc32.h|   1 +
 drivers/net/rnp/base/rnp_eth_regs.h |   3 +
 drivers/net/rnp/base/rnp_hw.h   |   4 +
 drivers/net/rnp/base/rnp_mac.c  | 121 +++-
 drivers/net/rnp/base/rnp_mac.h  |   2 +
 drivers/net/rnp/base/rnp_mac_regs.h |   2 +
 drivers/net/rnp/rnp.h   |   4 +
 drivers/net/rnp/rnp_ethdev.c|  26 ++
 11 files changed, 181 insertions(+), 2 deletions(-)

diff --git a/doc/guides/nics/features/rnp.ini b/doc/guides/nics/features/rnp.ini
index 48d250c86b..801a8de711 100644
--- a/doc/guides/nics/features/rnp.ini
+++ b/doc/guides/nics/features/rnp.ini
@@ -20,6 +20,7 @@ Promiscuous mode = Y
 Allmulticast mode= Y
 MTU update   = Y
 Unicast MAC filter   = Y
+Multicast MAC filter = Y
 VLAN filter  = Y
 VLAN offload = Y
 QinQ offload = P
diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index e9f96c4eb0..6926f699a6 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -101,6 +101,7 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_dev_default_mac_addr_set``
 * ``rte_eth_dev_mac_addr_add``
 * ``rte_eth_dev_mac_addr_remove``
+* ``rte_eth_dev_set_mc_addr_list``
 * ``rte_eth_dev_get_supported_ptypes``
 * ``rte_eth_dev_get_vlan_offload``
 * ``rte_eth_dev_set_vlan_offload``
diff --git a/drivers/net/rnp/base/rnp_crc32.c b/drivers/net/rnp/base/rnp_crc32.c
index c287b35759..9d03754a4b 100644
--- a/drivers/net/rnp/base/rnp_crc32.c
+++ b/drivers/net/rnp/base/rnp_crc32.c
@@ -5,6 +5,7 @@
 #include "rnp_osdep.h"
 #include "rnp_crc32.h"
 
+#define RNP_CRC32_POLY_LE 0xedb88320
 static inline int get_bitmask_order(u32 count)
 {
int order;
@@ -30,7 +31,22 @@ u32 rnp_vid_crc32_calc(u32 crc_init, u16 vid_le)
crc >>= 1;
data_byte >>= 1;
if (temp)
-   crc ^= 0xedb88320;
+   crc ^= RNP_CRC32_POLY_LE;
+   }
+
+   return crc;
+}
+
+u32 rnp_calc_crc32(u32 seed, u8 *mac, u32 len)
+{
+   u32 crc = seed;
+   u32 i;
+
+   while (len--) {
+   crc ^= *mac++;
+   for (i = 0; i < 8; i++)
+   crc = (crc >> 1) ^ ((crc & 1) ?
+   RNP_CRC32_POLY_LE : 0);
}
 
return crc;
diff --git a/drivers/net/rnp/base/rnp_crc32.h b/drivers/net/rnp/base/rnp_crc32.h
index e117dcfc2f..dc3026ddf8 100644
--- a/drivers/net/rnp/base/rnp_crc32.h
+++ b/drivers/net/rnp/base/rnp_crc32.h
@@ -6,5 +6,6 @@
 #define _RNP_CRC32_H_
 
 u32 rnp_vid_crc32_calc(u32 crc_init, u16 vid_le);
+u32 rnp_calc_crc32(u32 seed, u8 *mac, u32 len);
 
 #endif /* _RNP_CRC32_H_ */
diff --git a/drivers/net/rnp/base/rnp_eth_regs.h 
b/drivers/net/rnp/base/rnp_eth_regs.h
index 5c3f7f906c..1378328add 100644
--- a/drivers/net/rnp/base/rnp_eth_regs.h
+++ b/drivers/net/rnp/base/rnp_eth_regs.h
@@ -57,6 +57,8 @@
 #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)
+#define RNP_HTA_BIT_SHIFT  (5)
+#define RNP_HTA_BIT_MASK   ((1 << RNP_HTA_BIT_SHIFT) - 1)
 /* vlan strip ctrl */
 #define RNP_VLAN_Q_STRIP_CTRL(n)   _ETH_(0x8040 + 0x4 * ((n) / 32))
 /* vlan filter ctrl */
@@ -87,5 +89,6 @@
 #define RNP_RAL_BASE_ADDR(n)   _ETH_(0xA000 + (0x04 * (n)))
 #define RNP_RAH_BASE_ADDR(n)   _ETH_(0xA400 + (0x04 * (n)))
 #define RNP_MAC_FILTER_EN  RTE_BIT32(31)
+#define RNP_MC_HASH_TABLE(n)   _ETH_(0xAC00 + ((0x04) * ((n
 
 #endif /* _RNP_ETH_REGS_H */
diff --git a/drivers/net/rnp/base/rnp_hw.h b/drivers/net/rnp/base/rnp_hw.h
index 8cf57db185..8dc29b6873 100644
--- a/drivers/net/rnp/base/rnp_hw.h
+++ b/drivers/net/rnp/base/rnp_hw.h
@@ -74,6 +74,10 @@ struct rnp_mac_ops {
/* Receive Address Filter table */
int (*set_rafb)(struct rnp_eth_port *port, const u8 *mac, u32 index);
int (*clear_rafb)(struct rnp_eth_port *port, u32 index);
+   /* update multicast address table */
+   int (*update_mta)(struct rnp_eth_port *port, u8 *mc_addr);
+   /* clear all multicast hash table */
+   int (*clear_mta)(struct rnp_eth_port *port, bool en);
/* receive vlan filter */
int (*vlan_f_en)(struct rnp_eth_port *port, bool en);
int (*update_vlan)(struct rnp_eth_port *port, u16 vid, bool en);
diff --git a/drivers/net/rnp/base/rnp_mac.c b/drivers/net/rnp/base/rnp_mac.c
index b723c29ac5..96750e1cde 100644
--- a/drivers/net/rnp/base/rnp_mac.c
+++ b/drivers/net/rnp/base/rnp_mac.c
@@ -46,7 +46,7 @@ rnp_update_mpfm_indep(struct rnp_eth_port *port, u32 mode, 
bool en)
reg |= disable;
}
/* disable common filter when indep mode */
-   

[PATCH v16 28/29] net/rnp: support Rx/Tx burst mode info

2025-02-25 Thread Wenbo Cao
add platform method for get rx/tx burst function select
by upload func name.

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/rnp.rst  |  2 ++
 drivers/net/rnp/rnp_ethdev.c |  2 ++
 drivers/net/rnp/rnp_rxtx.c   | 58 
 drivers/net/rnp/rnp_rxtx.h   |  6 
 4 files changed, 68 insertions(+)

diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index c3e8d514d9..e9f96c4eb0 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -114,8 +114,10 @@ Listed below are the rte_eth functions supported:
 * ``rte_eth_allmulticast_get``
 * ``rte_eth_rx_queue_setup``
 * ``rte_eth_rx_queue_info_get``
+* ``rte_eth_rx_burst_mode_get``
 * ``rte_eth_tx_queue_setup``
 * ``rte_eth_tx_queue_info_get``
+* ``rte_eth_tx_burst_mode_get``
 * ``rte_eth_link_get``
 * ``rte_eth_link_get_nowait``
 * ``rte_eth_stats_get``
diff --git a/drivers/net/rnp/rnp_ethdev.c b/drivers/net/rnp/rnp_ethdev.c
index 84ff746ecd..227dc8e4ca 100644
--- a/drivers/net/rnp/rnp_ethdev.c
+++ b/drivers/net/rnp/rnp_ethdev.c
@@ -1481,11 +1481,13 @@ static const struct eth_dev_ops rnp_eth_dev_ops = {
.rx_queue_stop= rnp_rx_queue_stop,
.rx_queue_start   = rnp_rx_queue_start,
.rxq_info_get = rnp_rx_queue_info_get,
+   .rx_burst_mode_get= rnp_rx_burst_mode_get,
.tx_queue_setup   = rnp_tx_queue_setup,
.tx_queue_release = rnp_dev_tx_queue_release,
.tx_queue_stop= rnp_tx_queue_stop,
.tx_queue_start   = rnp_tx_queue_start,
.txq_info_get = rnp_tx_queue_info_get,
+   .tx_burst_mode_get= rnp_tx_burst_mode_get,
/* rss impl */
.reta_update  = rnp_dev_rss_reta_update,
.reta_query   = rnp_dev_rss_reta_query,
diff --git a/drivers/net/rnp/rnp_rxtx.c b/drivers/net/rnp/rnp_rxtx.c
index d58b0412ce..da08728198 100644
--- a/drivers/net/rnp/rnp_rxtx.c
+++ b/drivers/net/rnp/rnp_rxtx.c
@@ -1762,3 +1762,61 @@ rnp_tx_queue_info_get(struct rte_eth_dev *dev, uint16_t 
queue_id,
qinfo->conf.tx_thresh.hthresh = txq->pburst;
qinfo->conf.offloads = txq->tx_offloads;
 }
+
+static const struct {
+   eth_rx_burst_t pkt_burst;
+   const char *info;
+} rnp_rx_burst_infos[] = {
+   { rnp_scattered_rx, "Scalar Scattered" },
+   { rnp_recv_pkts,"Scalar" },
+};
+
+static const struct {
+   eth_tx_burst_t pkt_burst;
+   const char *info;
+} rnp_tx_burst_infos[] = {
+   { rnp_xmit_simple,  "Scalar Simple" },
+   { rnp_multiseg_xmit_pkts,   "Scalar" },
+};
+
+int
+rnp_rx_burst_mode_get(struct rte_eth_dev *dev,
+ __rte_unused uint16_t queue_id,
+ struct rte_eth_burst_mode *mode)
+{
+   eth_rx_burst_t pkt_burst = dev->rx_pkt_burst;
+   int ret = -EINVAL;
+   unsigned int i;
+
+   for (i = 0; i < RTE_DIM(rnp_rx_burst_infos); ++i) {
+   if (pkt_burst == rnp_rx_burst_infos[i].pkt_burst) {
+   snprintf(mode->info, sizeof(mode->info), "%s",
+   rnp_rx_burst_infos[i].info);
+   ret = 0;
+   break;
+   }
+   }
+
+   return ret;
+}
+
+int
+rnp_tx_burst_mode_get(struct rte_eth_dev *dev,
+ __rte_unused uint16_t queue_id,
+ struct rte_eth_burst_mode *mode)
+{
+   eth_tx_burst_t pkt_burst = dev->tx_pkt_burst;
+   int ret = -EINVAL;
+   unsigned int i;
+
+   for (i = 0; i < RTE_DIM(rnp_tx_burst_infos); ++i) {
+   if (pkt_burst == rnp_tx_burst_infos[i].pkt_burst) {
+   snprintf(mode->info, sizeof(mode->info), "%s",
+   rnp_tx_burst_infos[i].info);
+   ret = 0;
+   break;
+   }
+   }
+
+   return ret;
+}
diff --git a/drivers/net/rnp/rnp_rxtx.h b/drivers/net/rnp/rnp_rxtx.h
index dc4a8ea9dd..8639f0892d 100644
--- a/drivers/net/rnp/rnp_rxtx.h
+++ b/drivers/net/rnp/rnp_rxtx.h
@@ -152,5 +152,11 @@ void rnp_rx_queue_info_get(struct rte_eth_dev *dev, 
uint16_t queue_id,
   struct rte_eth_rxq_info *qinfo);
 void rnp_tx_queue_info_get(struct rte_eth_dev *dev, uint16_t queue_id,
   struct rte_eth_txq_info *qinfo);
+int rnp_rx_burst_mode_get(struct rte_eth_dev *dev,
+ __rte_unused uint16_t queue_id,
+ struct rte_eth_burst_mode *mode);
+int rnp_tx_burst_mode_get(struct rte_eth_dev *dev,
+ __rte_unused uint16_t queue_id,
+ struct rte_eth_burst_mode *mode);
 
 #endif /* _RNP_RXTX_H_ */
-- 
2.25.1



[PATCH v2] net/mlx5: add eCPRI support

2025-02-25 Thread Bing Zhao
Support eCPRI item matching over L2 (ETHER / VLAN) in HWS, both for
template API and backward compatibility API.

Signed-off-by: Bing Zhao 
Acked-by: Dariusz Sosnowski 
---
v2: fix the checkpatch warning of unneeded else
---
 drivers/net/mlx5/hws/mlx5dr_definer.c | 86 +++
 drivers/net/mlx5/mlx5_flow.h  |  3 +
 drivers/net/mlx5/mlx5_flow_hw.c   | 60 +++
 3 files changed, 149 insertions(+)

diff --git a/drivers/net/mlx5/hws/mlx5dr_definer.c 
b/drivers/net/mlx5/hws/mlx5dr_definer.c
index 837e0c47bd..25087022c1 100644
--- a/drivers/net/mlx5/hws/mlx5dr_definer.c
+++ b/drivers/net/mlx5/hws/mlx5dr_definer.c
@@ -583,6 +583,35 @@ mlx5dr_definer_ipv6_routing_ext_set(struct 
mlx5dr_definer_fc *fc,
DR_SET(tag, val, fc->byte_off, 0, fc->bit_mask);
 }
 
+static void
+mlx5dr_definer_ecpri_common_set(struct mlx5dr_definer_fc *fc,
+   const void *item,
+   uint8_t *tag)
+{
+   const struct rte_flow_item_ecpri *ec = item;
+   uint32_t val;
+
+   val = ec->hdr.common.u32;
+
+   DR_SET_BE32(tag, val, fc->byte_off, 0, fc->bit_mask);
+}
+
+static void
+mlx5dr_definer_ecpri_body_set(struct mlx5dr_definer_fc *fc,
+ const void *item,
+ uint8_t *tag)
+{
+   const struct rte_flow_item_ecpri *ec = item;
+   uint32_t val, idx;
+
+
+   idx = fc->fname - MLX5DR_DEFINER_FNAME_FLEX_PARSER_0;
+   /* The 1st DW is used for common field, indeed, there are only 2 DWs. */
+   val = ec->hdr.dummy[idx - 1];
+
+   DR_SET_BE32(tag, val, fc->byte_off, 0, fc->bit_mask);
+}
+
 static void
 mlx5dr_definer_flex_parser_set(struct mlx5dr_definer_fc *fc,
   const void *item,
@@ -2555,6 +2584,59 @@ mlx5dr_definer_conv_item_random(struct 
mlx5dr_definer_conv_data *cd,
return 0;
 }
 
+static uint32_t
+mlx5dr_definer_get_ecpri_parser_byte_off_from_ctx(void *dr_ctx, uint32_t 
*byte_off)
+{
+   uint32_t base_off = MLX5_BYTE_OFF(definer_hl, 
flex_parser.flex_parser_0);
+   struct mlx5_ecpri_parser_profile *ecp;
+   uint32_t i;
+
+   ecp = flow_hw_get_ecpri_parser_profile(dr_ctx);
+   if (!ecp)
+   return UINT32_MAX;
+   for (i = 0; i < ecp->num; i++)
+   byte_off[i] = base_off - ecp->ids[i] * sizeof(uint32_t);
+   return i;
+}
+
+static int
+mlx5dr_definer_conv_item_ecpri(struct mlx5dr_definer_conv_data *cd,
+  struct rte_flow_item *item,
+  int item_idx)
+{
+   const struct rte_flow_item_ecpri *m;
+   uint32_t i, mask, byte_off[8] = {0};
+   struct mlx5dr_definer_fc *fc;
+   uint32_t num_dws;
+
+   num_dws = mlx5dr_definer_get_ecpri_parser_byte_off_from_ctx(cd->ctx, 
byte_off);
+   if (num_dws == UINT32_MAX) {
+   DR_LOG(ERR, "failed to get eCPRI samples %d", -rte_errno);
+   return rte_errno;
+   }
+
+   m = item->mask;
+   if (!m)
+   return 0;
+
+   for (i = 0; i < num_dws; i++) {
+   mask = i == 0 ? m->hdr.common.u32 : m->hdr.dummy[i - 1];
+   if (!mask)
+   continue;
+   mask = htobe32(mask);
+   fc = mlx5dr_definer_get_flex_parser_fc(cd, byte_off[i]);
+   if (!fc)
+   return rte_errno;
+
+   fc->item_idx = item_idx;
+   fc->tag_set = i == 0 ? &mlx5dr_definer_ecpri_common_set :
+  &mlx5dr_definer_ecpri_body_set;
+   fc->tag_mask_set = &mlx5dr_definer_ones_set;
+   fc->bit_mask = mask;
+   }
+   return 0;
+}
+
 static int
 mlx5dr_definer_conv_item_geneve(struct mlx5dr_definer_conv_data *cd,
struct rte_flow_item *item,
@@ -3314,6 +3396,10 @@ mlx5dr_definer_conv_items_to_hl(struct mlx5dr_context 
*ctx,
  
MLX5_FLOW_ITEM_OUTER_FLEX;
}
break;
+   case RTE_FLOW_ITEM_TYPE_ECPRI:
+   ret = mlx5dr_definer_conv_item_ecpri(&cd, items, i);
+   item_flags |= MLX5_FLOW_LAYER_ECPRI;
+   break;
case RTE_FLOW_ITEM_TYPE_MPLS:
ret = mlx5dr_definer_conv_item_mpls(&cd, items, i);
item_flags |= MLX5_FLOW_LAYER_MPLS;
diff --git a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h
index 445c9cdb4b..e5245edd46 100644
--- a/drivers/net/mlx5/mlx5_flow.h
+++ b/drivers/net/mlx5/mlx5_flow.h
@@ -1812,6 +1812,7 @@ flow_hw_get_reg_id_from_ctx(void *dr_ctx, enum 
rte_flow_item_type type,
 
 #endif
 
+
 /*
  * Define list of valid combinations of RX Hash fields
  * (see enum ibv_rx_hash_fields).
@@ -3704,5 +3705,7 @@ mlx5_flow_nta_update_copy_table(struct rte_eth_dev *dev,
  

[PATCH v16 23/29] net/rnp: add support Rx checksum offload

2025-02-25 Thread Wenbo Cao
Add support Rx l3/l4 checum and tunnel
inner l3/l4, out l3 chksum.

Signed-off-by: Wenbo Cao 
---
 doc/guides/nics/features/rnp.ini|  4 ++
 doc/guides/nics/rnp.rst |  1 +
 drivers/net/rnp/base/rnp_eth_regs.h | 13 
 drivers/net/rnp/rnp.h   |  7 +++
 drivers/net/rnp/rnp_ethdev.c| 65 ++-
 drivers/net/rnp/rnp_rxtx.c  | 97 -
 6 files changed, 185 insertions(+), 2 deletions(-)

diff --git a/doc/guides/nics/features/rnp.ini b/doc/guides/nics/features/rnp.ini
index eb1c27a3d3..ceac0beff8 100644
--- a/doc/guides/nics/features/rnp.ini
+++ b/doc/guides/nics/features/rnp.ini
@@ -8,6 +8,10 @@ Speed capabilities   = Y
 Link status  = Y
 Link status event= Y
 Packet type parsing  = Y
+L3 checksum offload  = P
+L4 checksum offload  = P
+Inner L3 checksum= P
+Inner L4 checksum= P
 Basic stats  = Y
 Stats per queue  = Y
 Extended stats   = Y
diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index 58f4f4a3a8..3f4833c79d 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -56,6 +56,7 @@ Features
 - Scatter-Gather IO support
 - Port hardware statistic
 - Packet type parsing
+- Checksum offload
 
 Prerequisites and Pre-conditions
 
diff --git a/drivers/net/rnp/base/rnp_eth_regs.h 
b/drivers/net/rnp/base/rnp_eth_regs.h
index 49860135bd..e096ec90e6 100644
--- a/drivers/net/rnp/base/rnp_eth_regs.h
+++ b/drivers/net/rnp/base/rnp_eth_regs.h
@@ -16,6 +16,19 @@
 #define RNP_RX_ETH_F_CTRL(n)   _ETH_(0x8070 + ((n) * 0x8))
 #define RNP_RX_ETH_F_OFF   (0x7ff)
 #define RNP_RX_ETH_F_ON(0x270)
+/* rx checksum ctrl */
+#define RNP_HW_SCTP_CKSUM_CTRL _ETH_(0x8038)
+#define RNP_HW_CHECK_ERR_CTRL  _ETH_(0x8060)
+#define RNP_HW_ERR_HDR_LEN RTE_BIT32(0)
+#define RNP_HW_ERR_PKTLEN  RTE_BIT32(1)
+#define RNP_HW_L3_CKSUM_ERRRTE_BIT32(2)
+#define RNP_HW_L4_CKSUM_ERRRTE_BIT32(3)
+#define RNP_HW_SCTP_CKSUM_ERR  RTE_BIT32(4)
+#define RNP_HW_INNER_L3_CKSUM_ERR  RTE_BIT32(5)
+#define RNP_HW_INNER_L4_CKSUM_ERR  RTE_BIT32(6)
+#define RNP_HW_CKSUM_ERR_MASK  RTE_GENMASK32(6, 2)
+#define RNP_HW_CHECK_ERR_MASK  RTE_GENMASK32(6, 0)
+#define RNP_HW_ERR_RX_ALL_MASK RTE_GENMASK32(1, 0)
 /* max/min pkts length receive limit ctrl */
 #define RNP_MIN_FRAME_CTRL _ETH_(0x80f0)
 #define RNP_MAX_FRAME_CTRL _ETH_(0x80f4)
diff --git a/drivers/net/rnp/rnp.h b/drivers/net/rnp/rnp.h
index e4c677a179..694ce1409a 100644
--- a/drivers/net/rnp/rnp.h
+++ b/drivers/net/rnp/rnp.h
@@ -45,6 +45,13 @@
RTE_ETH_RSS_NONFRAG_IPV6_UDP | \
RTE_ETH_RSS_IPV6_UDP_EX | \
RTE_ETH_RSS_NONFRAG_IPV6_SCTP)
+/* rx checksum offload */
+#define RNP_RX_CHECKSUM_SUPPORT ( \
+   RTE_ETH_RX_OFFLOAD_IPV4_CKSUM | \
+   RTE_ETH_RX_OFFLOAD_UDP_CKSUM | \
+   RTE_ETH_RX_OFFLOAD_TCP_CKSUM | \
+   RTE_ETH_RX_OFFLOAD_SCTP_CKSUM | \
+   RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM)
 /* Ring info special */
 #define RNP_MAX_BD_COUNT   (4096)
 #define RNP_MIN_BD_COUNT   (128)
diff --git a/drivers/net/rnp/rnp_ethdev.c b/drivers/net/rnp/rnp_ethdev.c
index 289d9ed867..615447f32a 100644
--- a/drivers/net/rnp/rnp_ethdev.c
+++ b/drivers/net/rnp/rnp_ethdev.c
@@ -411,6 +411,67 @@ static int rnp_disable_all_tx_queue(struct rte_eth_dev 
*dev)
return ret;
 }
 
+static void rnp_set_rx_cksum_offload(struct rte_eth_dev *dev)
+{
+   struct rnp_eth_port *port = RNP_DEV_TO_PORT(dev);
+   struct rnp_hw *hw = port->hw;
+   uint32_t cksum_ctrl;
+   uint64_t offloads;
+
+   offloads = dev->data->dev_conf.rxmode.offloads;
+   cksum_ctrl = RNP_HW_CHECK_ERR_MASK;
+   /* enable rx checksum feature */
+   if (!rnp_pf_is_multiple_ports(hw->device_id)) {
+   if (offloads & RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM) {
+   /* Tunnel Option Cksum L4_Option */
+   cksum_ctrl &= ~RNP_HW_L4_CKSUM_ERR;
+   if (offloads & (RTE_ETH_RX_OFFLOAD_UDP_CKSUM |
+   RTE_ETH_RX_OFFLOAD_TCP_CKSUM))
+   cksum_ctrl &= ~RNP_HW_INNER_L4_CKSUM_ERR;
+   else
+   cksum_ctrl |= RNP_HW_INNER_L4_CKSUM_ERR;
+   } else {
+   /* no tunnel option cksum l4_option */
+   cksum_ctrl |= RNP_HW_INNER_L4_CKSUM_ERR;
+   if (offloads & (RTE_ETH_RX_OFFLOAD_UDP_CKSUM |
+   RTE_ETH_RX_OFFLOAD_TCP_CKSUM))
+   cksum_ctrl &= ~RNP_HW_L4_CKSUM_ERR;
+   else
+   cksum_ctrl |= RNP_HW_L4_CKSUM_ERR;
+   }
+   if (offloads & RTE_ETH_RX_OFFLOAD_OU

[PATCH v3] net/mlx5: add eCPRI support

2025-02-25 Thread Bing Zhao
Support eCPRI item matching over L2 (ETHER / VLAN) in HWS, both for
template API and backward compatibility API.

Signed-off-by: Bing Zhao 
Acked-by: Dariusz Sosnowski 
---
v2: fix the checkpatch warning of unneeded else
v3: fix single line if condition code style warning
---
 drivers/net/mlx5/hws/mlx5dr_definer.c | 86 +++
 drivers/net/mlx5/mlx5_flow.h  |  3 +
 drivers/net/mlx5/mlx5_flow_hw.c   | 59 ++
 3 files changed, 148 insertions(+)

diff --git a/drivers/net/mlx5/hws/mlx5dr_definer.c 
b/drivers/net/mlx5/hws/mlx5dr_definer.c
index 837e0c47bd..25087022c1 100644
--- a/drivers/net/mlx5/hws/mlx5dr_definer.c
+++ b/drivers/net/mlx5/hws/mlx5dr_definer.c
@@ -583,6 +583,35 @@ mlx5dr_definer_ipv6_routing_ext_set(struct 
mlx5dr_definer_fc *fc,
DR_SET(tag, val, fc->byte_off, 0, fc->bit_mask);
 }
 
+static void
+mlx5dr_definer_ecpri_common_set(struct mlx5dr_definer_fc *fc,
+   const void *item,
+   uint8_t *tag)
+{
+   const struct rte_flow_item_ecpri *ec = item;
+   uint32_t val;
+
+   val = ec->hdr.common.u32;
+
+   DR_SET_BE32(tag, val, fc->byte_off, 0, fc->bit_mask);
+}
+
+static void
+mlx5dr_definer_ecpri_body_set(struct mlx5dr_definer_fc *fc,
+ const void *item,
+ uint8_t *tag)
+{
+   const struct rte_flow_item_ecpri *ec = item;
+   uint32_t val, idx;
+
+
+   idx = fc->fname - MLX5DR_DEFINER_FNAME_FLEX_PARSER_0;
+   /* The 1st DW is used for common field, indeed, there are only 2 DWs. */
+   val = ec->hdr.dummy[idx - 1];
+
+   DR_SET_BE32(tag, val, fc->byte_off, 0, fc->bit_mask);
+}
+
 static void
 mlx5dr_definer_flex_parser_set(struct mlx5dr_definer_fc *fc,
   const void *item,
@@ -2555,6 +2584,59 @@ mlx5dr_definer_conv_item_random(struct 
mlx5dr_definer_conv_data *cd,
return 0;
 }
 
+static uint32_t
+mlx5dr_definer_get_ecpri_parser_byte_off_from_ctx(void *dr_ctx, uint32_t 
*byte_off)
+{
+   uint32_t base_off = MLX5_BYTE_OFF(definer_hl, 
flex_parser.flex_parser_0);
+   struct mlx5_ecpri_parser_profile *ecp;
+   uint32_t i;
+
+   ecp = flow_hw_get_ecpri_parser_profile(dr_ctx);
+   if (!ecp)
+   return UINT32_MAX;
+   for (i = 0; i < ecp->num; i++)
+   byte_off[i] = base_off - ecp->ids[i] * sizeof(uint32_t);
+   return i;
+}
+
+static int
+mlx5dr_definer_conv_item_ecpri(struct mlx5dr_definer_conv_data *cd,
+  struct rte_flow_item *item,
+  int item_idx)
+{
+   const struct rte_flow_item_ecpri *m;
+   uint32_t i, mask, byte_off[8] = {0};
+   struct mlx5dr_definer_fc *fc;
+   uint32_t num_dws;
+
+   num_dws = mlx5dr_definer_get_ecpri_parser_byte_off_from_ctx(cd->ctx, 
byte_off);
+   if (num_dws == UINT32_MAX) {
+   DR_LOG(ERR, "failed to get eCPRI samples %d", -rte_errno);
+   return rte_errno;
+   }
+
+   m = item->mask;
+   if (!m)
+   return 0;
+
+   for (i = 0; i < num_dws; i++) {
+   mask = i == 0 ? m->hdr.common.u32 : m->hdr.dummy[i - 1];
+   if (!mask)
+   continue;
+   mask = htobe32(mask);
+   fc = mlx5dr_definer_get_flex_parser_fc(cd, byte_off[i]);
+   if (!fc)
+   return rte_errno;
+
+   fc->item_idx = item_idx;
+   fc->tag_set = i == 0 ? &mlx5dr_definer_ecpri_common_set :
+  &mlx5dr_definer_ecpri_body_set;
+   fc->tag_mask_set = &mlx5dr_definer_ones_set;
+   fc->bit_mask = mask;
+   }
+   return 0;
+}
+
 static int
 mlx5dr_definer_conv_item_geneve(struct mlx5dr_definer_conv_data *cd,
struct rte_flow_item *item,
@@ -3314,6 +3396,10 @@ mlx5dr_definer_conv_items_to_hl(struct mlx5dr_context 
*ctx,
  
MLX5_FLOW_ITEM_OUTER_FLEX;
}
break;
+   case RTE_FLOW_ITEM_TYPE_ECPRI:
+   ret = mlx5dr_definer_conv_item_ecpri(&cd, items, i);
+   item_flags |= MLX5_FLOW_LAYER_ECPRI;
+   break;
case RTE_FLOW_ITEM_TYPE_MPLS:
ret = mlx5dr_definer_conv_item_mpls(&cd, items, i);
item_flags |= MLX5_FLOW_LAYER_MPLS;
diff --git a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h
index 445c9cdb4b..e5245edd46 100644
--- a/drivers/net/mlx5/mlx5_flow.h
+++ b/drivers/net/mlx5/mlx5_flow.h
@@ -1812,6 +1812,7 @@ flow_hw_get_reg_id_from_ctx(void *dr_ctx, enum 
rte_flow_item_type type,
 
 #endif
 
+
 /*
  * Define list of valid combinations of RX Hash fields
  * (see enum ibv_rx_hash_fields).
@@ -3704,5 +3705,7 @@ mlx5_flow_nta_update_copy_ta

[PATCH v2 1/5] eal: make compatible with instruction set updates for MSVC

2025-02-25 Thread Andre Muezerie
After the instruction set updates for MSVC the error below popped up:

../lib/eal/common/rte_random.c(6): fatal error C1083:
Cannot open include file: 'x86intrin.h': No such file or directory

The fix is to not include header x86intrin.h with MSVC.

Signed-off-by: Andre Muezerie 
---
 lib/eal/common/rte_random.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/lib/eal/common/rte_random.c b/lib/eal/common/rte_random.c
index 8e62578176..9354358818 100644
--- a/lib/eal/common/rte_random.c
+++ b/lib/eal/common/rte_random.c
@@ -3,8 +3,10 @@
  */
 
 #ifdef __RDSEED__
+#ifndef RTE_TOOLCHAIN_MSVC
 #include 
 #endif
+#endif
 #include 
 
 #include 
-- 
2.48.1.vfs.0.0



[PATCH v2 2/5] eal: only use numbers as align parameters for MSVC

2025-02-25 Thread Andre Muezerie
After the instruction set updates for MSVC the error below popped up:

..\lib\eal\x86\include\rte_vect.h(82): error C2059: syntax error: '('

The issue is that MSVC does not allow __rte_aligned(RTE_X86_ZMM_SIZE).
It only accepts numbers that are power of 2. So, even though
RTE_X86_ZMM_SIZE represents a number that is a power of two it cannot
be used directly.
https://learn.microsoft.com/en-us/cpp/cpp/align-cpp?view=msvc-170

Signed-off-by: Andre Muezerie 
---
 lib/eal/x86/include/rte_vect.h | 11 ++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/lib/eal/x86/include/rte_vect.h b/lib/eal/x86/include/rte_vect.h
index 70c78e9b77..0a51c539a4 100644
--- a/lib/eal/x86/include/rte_vect.h
+++ b/lib/eal/x86/include/rte_vect.h
@@ -79,7 +79,16 @@ __extension__ ({\
 #define RTE_X86_ZMM_SIZE   (sizeof(__m512i))
 #define RTE_X86_ZMM_MASK   (RTE_X86_ZMM_SIZE - 1)
 
-typedef union __rte_aligned(RTE_X86_ZMM_SIZE) __rte_x86_zmm {
+/*
+ * MSVC does not allow __rte_aligned(RTE_X86_ZMM_SIZE). It only accepts
+ * numbers that are power of 2. So, even though RTE_X86_ZMM_SIZE represents a
+ * number that is a power of two it cannot be used directly.
+ * Ref: https://learn.microsoft.com/en-us/cpp/cpp/align-cpp?view=msvc-170
+ * The static assert below ensures that RTE_X86_ZMM_SIZE is equal to what is
+ * used in the __rte_aligned() expression.
+ */
+static_assert(RTE_X86_ZMM_SIZE == 64, "Unexpected size of __m512i");
+typedef union __rte_aligned(64) __rte_x86_zmm {
__m512i  z;
ymm_ty[RTE_X86_ZMM_SIZE / sizeof(ymm_t)];
xmm_tx[RTE_X86_ZMM_SIZE / sizeof(xmm_t)];
-- 
2.48.1.vfs.0.0



[PATCH v2 4/5] drivers/net: make compatible with instruction set updates for MSVC

2025-02-25 Thread Andre Muezerie
Top level 'cc_avx2_flags' was created and holds the correct flags
depending on the compiler used.

Signed-off-by: Andre Muezerie 
---
 drivers/net/bnxt/meson.build   | 2 +-
 drivers/net/enic/meson.build   | 2 +-
 drivers/net/intel/i40e/meson.build | 2 +-
 drivers/net/intel/iavf/meson.build | 2 +-
 drivers/net/intel/ice/meson.build  | 2 +-
 drivers/net/intel/idpf/meson.build | 2 +-
 drivers/net/nfp/meson.build| 2 +-
 drivers/net/octeon_ep/meson.build  | 4 ++--
 8 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/drivers/net/bnxt/meson.build b/drivers/net/bnxt/meson.build
index e26cf13a65..fd82d0c409 100644
--- a/drivers/net/bnxt/meson.build
+++ b/drivers/net/bnxt/meson.build
@@ -65,7 +65,7 @@ if arch_subdir == 'x86'
 static_rte_bus_pci,
 static_rte_kvargs, static_rte_hash],
 include_directories: includes,
-c_args: [cflags, '-mavx2'])
+c_args: [cflags, cc_avx2_flags])
  objs += bnxt_avx2_lib.extract_objects('bnxt_rxtx_vec_avx2.c')
 elif arch_subdir == 'arm' and dpdk_conf.get('RTE_ARCH_64')
 sources += files('bnxt_rxtx_vec_neon.c')
diff --git a/drivers/net/enic/meson.build b/drivers/net/enic/meson.build
index 1e26338350..cfe5ec170a 100644
--- a/drivers/net/enic/meson.build
+++ b/drivers/net/enic/meson.build
@@ -38,7 +38,7 @@ if dpdk_conf.has('RTE_ARCH_X86_64')
 'enic_rxtx_vec_avx2.c',
 dependencies: [static_rte_ethdev, static_rte_bus_pci],
 include_directories: includes,
-c_args: [cflags, '-mavx2'])
+c_args: [cflags, cc_avx2_flags])
 objs += enic_avx2_lib.extract_objects('enic_rxtx_vec_avx2.c')
 endif
 
diff --git a/drivers/net/intel/i40e/meson.build 
b/drivers/net/intel/i40e/meson.build
index ffa40c5d64..2973ed1a01 100644
--- a/drivers/net/intel/i40e/meson.build
+++ b/drivers/net/intel/i40e/meson.build
@@ -49,7 +49,7 @@ if arch_subdir == 'x86'
 'i40e_rxtx_vec_avx2.c',
 dependencies: [static_rte_ethdev, static_rte_kvargs, 
static_rte_hash],
 include_directories: includes,
-c_args: [cflags, '-mavx2'])
+c_args: [cflags, cc_avx2_flags])
 objs += i40e_avx2_lib.extract_objects('i40e_rxtx_vec_avx2.c')
 
 if cc_has_avx512
diff --git a/drivers/net/intel/iavf/meson.build 
b/drivers/net/intel/iavf/meson.build
index 19cd1cfbc8..f7eac7c57a 100644
--- a/drivers/net/intel/iavf/meson.build
+++ b/drivers/net/intel/iavf/meson.build
@@ -37,7 +37,7 @@ if arch_subdir == 'x86'
 'iavf_rxtx_vec_avx2.c',
 dependencies: [static_rte_ethdev],
 include_directories: includes,
-c_args: [cflags, '-mavx2'])
+c_args: [cflags, cc_avx2_flags])
 objs += iavf_avx2_lib.extract_objects('iavf_rxtx_vec_avx2.c')
 
 if cc_has_avx512
diff --git a/drivers/net/intel/ice/meson.build 
b/drivers/net/intel/ice/meson.build
index a34b7c966a..cbdf38c1c4 100644
--- a/drivers/net/intel/ice/meson.build
+++ b/drivers/net/intel/ice/meson.build
@@ -43,7 +43,7 @@ if arch_subdir == 'x86'
 'ice_rxtx_vec_avx2.c',
 dependencies: [static_rte_ethdev, static_rte_hash],
 include_directories: includes,
-c_args: [cflags, '-mavx2'])
+c_args: [cflags, cc_avx2_flags])
 objs += ice_avx2_lib.extract_objects('ice_rxtx_vec_avx2.c')
 
 if cc_has_avx512
diff --git a/drivers/net/intel/idpf/meson.build 
b/drivers/net/intel/idpf/meson.build
index 802b13035b..4b272d02b1 100644
--- a/drivers/net/intel/idpf/meson.build
+++ b/drivers/net/intel/idpf/meson.build
@@ -23,7 +23,7 @@ if arch_subdir == 'x86' and dpdk_conf.get('RTE_IOVA_IN_MBUF') 
== 1
 'idpf_common_rxtx_avx2.c',
 dependencies: [static_rte_ethdev, static_rte_hash],
 include_directories: includes,
-c_args: [cflags, '-mavx2'])
+c_args: [cflags, cc_avx2_flags])
 objs += idpf_avx2_lib.extract_objects('idpf_common_rxtx_avx2.c')
 
 if cc_has_avx512
diff --git a/drivers/net/nfp/meson.build b/drivers/net/nfp/meson.build
index 39762bd45a..0a12b7dce7 100644
--- a/drivers/net/nfp/meson.build
+++ b/drivers/net/nfp/meson.build
@@ -61,7 +61,7 @@ if arch_subdir == 'x86'
 avx2_sources,
 dependencies: [static_rte_ethdev, static_rte_bus_pci],
 include_directories: includes,
-c_args: [cflags, '-mavx2']
+c_args: [cflags, cc_avx2_flags]
 )
 
 objs += nfp_avx2_lib.extract_all_objects(recursive: true)
diff --git a/drivers/net/octeon_ep/meson.build 
b/drivers/net/octeon_ep/meson.build
index d5d40b23a1..1b34db3edc 100644
--- a/drivers/net/octeon_ep/meson.build
+++ b/drivers/net/octeon_ep/meson.build
@@ -18,13 +18,13 @@ if arch_subdir == 'x86'
 if cc.get_define('__AVX2__', args: machine_args) != ''
 cflags += ['-DCC_AVX2_SUPPORT']
 sources += files('cnxk_ep_rx_avx.c')
-elif cc.has_argument('-mavx2')
+elif cc.has_multi_arguments

[PATCH v2 3/5] config: create top level variable cc_avx2_flags

2025-02-25 Thread Andre Muezerie
Top level variable cc_avx2_flags was created and set according to the
compiler used. It is used in lower level directories.

Signed-off-by: Andre Muezerie 
---
 config/x86/meson.build | 6 ++
 1 file changed, 6 insertions(+)

diff --git a/config/x86/meson.build b/config/x86/meson.build
index 47a5b0c04a..941d4d921f 100644
--- a/config/x86/meson.build
+++ b/config/x86/meson.build
@@ -1,6 +1,12 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017-2020 Intel Corporation
 
+if is_ms_compiler
+cc_avx2_flags = ['/arch:AVX2']
+else
+cc_avx2_flags = ['-mavx2']
+endif
+
 # get binutils version for the workaround of Bug 97
 binutils_ok = true
 if is_linux or cc.get_id() == 'gcc'
-- 
2.48.1.vfs.0.0



[PATCH v2 0/5] allow faster instruction sets to be used with MSVC

2025-02-25 Thread Andre Muezerie
Meson.build files were refactored to add MSVC support for the AVX2
instruction set with MSVC: Top level variable cc_avx2_flags was created
and set according to the compiler used. It is used in lower level
directories.

Andre Muezerie (5):
  eal: make compatible with instruction set updates for MSVC
  eal: only use numbers as align parameters for MSVC
  config: create top level variable cc_avx2_flags
  drivers/net: make compatible with instruction set updates for MSVC
  acl: make compatible with instruction set updates for MSVC

 config/x86/meson.build |  6 ++
 drivers/net/bnxt/meson.build   |  2 +-
 drivers/net/enic/meson.build   |  2 +-
 drivers/net/intel/i40e/meson.build |  2 +-
 drivers/net/intel/iavf/meson.build |  2 +-
 drivers/net/intel/ice/meson.build  |  2 +-
 drivers/net/intel/idpf/meson.build |  2 +-
 drivers/net/nfp/meson.build|  2 +-
 drivers/net/octeon_ep/meson.build  |  4 ++--
 lib/acl/meson.build|  2 +-
 lib/eal/common/rte_random.c|  2 ++
 lib/eal/x86/include/rte_vect.h | 11 ++-
 12 files changed, 28 insertions(+), 11 deletions(-)

--
2.48.1.vfs.0.0



[PATCH v2 5/5] acl: make compatible with instruction set updates for MSVC

2025-02-25 Thread Andre Muezerie
Top level 'cc_avx2_flags' was created and holds the correct flags
depending on the compiler used.

Signed-off-by: Andre Muezerie 
---
 lib/acl/meson.build | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/acl/meson.build b/lib/acl/meson.build
index fefe131a48..a28d70c23f 100644
--- a/lib/acl/meson.build
+++ b/lib/acl/meson.build
@@ -19,7 +19,7 @@ if dpdk_conf.has('RTE_ARCH_X86')
 avx2_tmplib = static_library('avx2_tmp',
 'acl_run_avx2.c',
 dependencies: static_rte_eal,
-c_args: cflags + ['-mavx2'])
+c_args: [cflags, cc_avx2_flags])
 objs += avx2_tmplib.extract_objects('acl_run_avx2.c')
 
 # compile AVX512 version if:
-- 
2.48.1.vfs.0.0



Re: [PATCH] net/ice: fix ACL filter uninit

2025-02-25 Thread Medvedkin, Vladimir

Acked-by: Vladimir Medvedkin 

On 21/02/2025 08:25, Mingjin Ye wrote:

The pf has enabled the ACL filter, so uninit is no longer limited
to the DCF.

Fixes: a9d612291c2d ("net/ice: support IPv4 fragments in ACL filters")

Signed-off-by: Mingjin Ye 
---
  drivers/net/intel/ice/ice_acl_filter.c | 48 +-
  1 file changed, 24 insertions(+), 24 deletions(-)

diff --git a/drivers/net/intel/ice/ice_acl_filter.c 
b/drivers/net/intel/ice/ice_acl_filter.c
index 04c17a98ed..83cb3e36f9 100644
--- a/drivers/net/intel/ice/ice_acl_filter.c
+++ b/drivers/net/intel/ice/ice_acl_filter.c
@@ -278,26 +278,28 @@ ice_acl_prof_init(struct ice_pf *pf)
if (ret)
goto err_add_prof_ipv4_sctp;
  
-	for (i = 0; i < pf->main_vsi->idx; i++) {

-   ret = ice_flow_assoc_prof(hw, ICE_BLK_ACL, prof_ipv4, i);
-   if (ret)
-   goto err_assoc_prof;
-
-   ret = ice_flow_assoc_prof(hw, ICE_BLK_ACL, prof_ipv4_frag, i);
-   if (ret)
-   goto err_assoc_prof;
-
-   ret = ice_flow_assoc_prof(hw, ICE_BLK_ACL, prof_ipv4_udp, i);
-   if (ret)
-   goto err_assoc_prof;
-
-   ret = ice_flow_assoc_prof(hw, ICE_BLK_ACL, prof_ipv4_tcp, i);
-   if (ret)
-   goto err_assoc_prof;
-
-   ret = ice_flow_assoc_prof(hw, ICE_BLK_ACL, prof_ipv4_sctp, i);
-   if (ret)
-   goto err_assoc_prof;
+   if (hw->dcf_enabled) {
+   for (i = 0; i < pf->main_vsi->idx; i++) {
+   ret = ice_flow_assoc_prof(hw, ICE_BLK_ACL, prof_ipv4, 
i);
+   if (ret)
+   goto err_assoc_prof;
+
+   ret = ice_flow_assoc_prof(hw, ICE_BLK_ACL, 
prof_ipv4_frag, i);
+   if (ret)
+   goto err_assoc_prof;
+
+   ret = ice_flow_assoc_prof(hw, ICE_BLK_ACL, 
prof_ipv4_udp, i);
+   if (ret)
+   goto err_assoc_prof;
+
+   ret = ice_flow_assoc_prof(hw, ICE_BLK_ACL, 
prof_ipv4_tcp, i);
+   if (ret)
+   goto err_assoc_prof;
+
+   ret = ice_flow_assoc_prof(hw, ICE_BLK_ACL, 
prof_ipv4_sctp, i);
+   if (ret)
+   goto err_assoc_prof;
+   }
}
return 0;
  
@@ -1082,10 +1084,8 @@ ice_acl_uninit(struct ice_adapter *ad)

struct ice_pf *pf = &ad->pf;
struct ice_hw *hw = ICE_PF_TO_HW(pf);
  
-	if (ad->hw.dcf_enabled) {

-   ice_deinit_acl(pf);
-   ice_acl_prof_free(hw);
-   }
+   ice_deinit_acl(pf);
+   ice_acl_prof_free(hw);
  }
  
  static struct


--
Regards,
Vladimir



Re: [PATCH v2 1/1] pcapng: warn if NULL is passed to rte_pcapng_close

2025-02-25 Thread Patrick Robb
Recheck-request: iol-marvell-Functional

Putting in a recheck as I believe the fail CI reported is false.

On Sun, Feb 23, 2025 at 4:41 PM Ariel Otilibili 
wrote:

> rte_pcapng_close() might dereference a null pointer; as example,
> PVS-Studio gives its usage in test_pcapng.c: indeed, that call to
> rte_pcapng_close() might receive a null pointer.
>
> In that case, rte_errno is set to EINVAL. The API is updated accordingly.
>
> Link: https://pvs-studio.com/en/docs/warnings/v522/
> Link:
> https://github.com/DPDK/dpdk/blob/e5176f23ae8b31437c3e5eb875c81f95bf3a9942/app/test/test_pcapng.c#L438
> Fixes: 8d23ce8f5ee9 ("pcapng: add new library for writing pcapng files")
> Signed-off-by: Ariel Otilibili 
> ---
>  .mailmap| 2 +-
>  lib/pcapng/rte_pcapng.c | 3 +++
>  lib/pcapng/rte_pcapng.h | 2 ++
>  3 files changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/.mailmap b/.mailmap
> index a03d3cfb591b..ea68d6180ccc 100644
> --- a/.mailmap
> +++ b/.mailmap
> @@ -135,7 +135,7 @@ Anupam Kapoor 
>  Apeksha Gupta 
>  Archana Muniganti  <
> muniganti.arch...@caviumnetworks.com>
>  Archit Pandey 
> -Ariel Otilibili  
> +Ariel Otilibili  
>  Arkadiusz Kubalewski 
>  Arkadiusz Kusztal 
>  Arnaud Fiorini 
> diff --git a/lib/pcapng/rte_pcapng.c b/lib/pcapng/rte_pcapng.c
> index 16485b27cb46..d2cbcea42885 100644
> --- a/lib/pcapng/rte_pcapng.c
> +++ b/lib/pcapng/rte_pcapng.c
> @@ -716,6 +716,9 @@ rte_pcapng_fdopen(int fd,
>  void
>  rte_pcapng_close(rte_pcapng_t *self)
>  {
> +   if (!self)
> +   rte_errno = EINVAL;
> +
> close(self->outfd);
> free(self);
>  }
> diff --git a/lib/pcapng/rte_pcapng.h b/lib/pcapng/rte_pcapng.h
> index 48f2b5756430..f7b976987320 100644
> --- a/lib/pcapng/rte_pcapng.h
> +++ b/lib/pcapng/rte_pcapng.h
> @@ -60,6 +60,8 @@ rte_pcapng_fdopen(int fd,
>   *
>   * @param self
>   *  handle to library
> +
> + * If self is NULL, rte_errno is set to EINVAL.
>   */
>  void
>  rte_pcapng_close(rte_pcapng_t *self);
> --
> 2.30.2
>
>


RE: [PATCH RFC 2/4] eventdev: refactor rte_event_dma_adapater_op calls

2025-02-25 Thread Amit Prakash Shukla



> -Original Message-
> From: Kommula Shiva Shankar 
> Sent: Wednesday, January 29, 2025 8:07 PM
> To: Jerin Jacob ; Amit Prakash Shukla
> ; Vamsi Krishna Attunuru
> ; fengcheng...@huawei.com; dev@dpdk.org
> Cc: Nithin Kumar Dabilpuram ; Pavan Nikhilesh
> Bhagavatula 
> Subject: [PATCH RFC 2/4] eventdev: refactor rte_event_dma_adapater_op
> calls
> 
> From: Pavan Nikhilesh 
> 
> Migrate all invocations of rte_event_dma_adapter_op API to rte_dma_op.
> 
> Signed-off-by: Pavan Nikhilesh 
> Change-Id: I56b6e61af72d119287b0d2ba6a9bbacc3ae808d6
> ---
>  app/test-eventdev/test_perf_common.c |  6 +--  app/test-
> eventdev/test_perf_common.h |  4 +-
>  app/test/test_event_dma_adapter.c|  6 +--
>  drivers/dma/cnxk/cnxk_dmadev.c   |  2 +-
>  drivers/dma/cnxk/cnxk_dmadev_fp.c| 12 +++---
>  lib/eventdev/rte_event_dma_adapter.c | 18 -
> lib/eventdev/rte_event_dma_adapter.h | 57 
>  7 files changed, 24 insertions(+), 81 deletions(-)
> 

Acked-by: Amit Prakash Shukla 

Thanks,
Amit Shukla

> diff --git a/app/test-eventdev/test_perf_common.c b/app/test-
> eventdev/test_perf_common.c
> index 627f07caa1..4e0109db52 100644
> --- a/app/test-eventdev/test_perf_common.c
> +++ b/app/test-eventdev/test_perf_common.c
> @@ -562,11 +562,11 @@ crypto_adapter_enq_op_fwd(struct prod_data *p)
> static inline void  dma_adapter_enq_op_fwd(struct prod_data *p)  {
> - struct rte_event_dma_adapter_op *ops[BURST_SIZE] = {NULL};
> + struct rte_dma_op *ops[BURST_SIZE] = {NULL};
>   struct test_perf *t = p->t;
>   const uint32_t nb_flows = t->nb_flows;
>   const uint64_t nb_pkts = t->nb_pkts;
> - struct rte_event_dma_adapter_op op;
> + struct rte_dma_op op;
>   struct rte_event evts[BURST_SIZE];
>   const uint8_t dev_id = p->dev_id;
>   struct evt_options *opt = t->opt;
> @@ -2114,7 +2114,7 @@ perf_mempool_setup(struct evt_test *test, struct
> evt_options *opt)
>   } else if (opt->prod_type == EVT_PROD_TYPE_EVENT_DMA_ADPTR) {
>   t->pool = rte_mempool_create(test->name,   /* mempool
> name */
>opt->pool_sz, /* number of
> elements*/
> -  sizeof(struct
> rte_event_dma_adapter_op) +
> +  sizeof(struct rte_dma_op) +
>(sizeof(struct rte_dma_sge)
> * 2),
>cache_sz, /* cache
> size*/
>0, NULL, NULL, NULL,  /* obj
> constructor */
> diff --git a/app/test-eventdev/test_perf_common.h b/app/test-
> eventdev/test_perf_common.h
> index d7333ad390..63078b0ee2 100644
> --- a/app/test-eventdev/test_perf_common.h
> +++ b/app/test-eventdev/test_perf_common.h
> @@ -139,7 +139,7 @@ perf_mark_fwd_latency(enum evt_prod_type
> prod_type, struct rte_event *const ev)
>   }
>   pe->timestamp = rte_get_timer_cycles();
>   } else if (prod_type == EVT_PROD_TYPE_EVENT_DMA_ADPTR) {
> - struct rte_event_dma_adapter_op *op = ev->event_ptr;
> + struct rte_dma_op *op = ev->event_ptr;
> 
>   op->user_meta = rte_get_timer_cycles();
>   } else {
> @@ -297,7 +297,7 @@ perf_process_last_stage_latency(struct rte_mempool
> *const pool, enum evt_prod_ty
>   tstamp = pe->timestamp;
>   rte_crypto_op_free(op);
>   } else if (prod_type == EVT_PROD_TYPE_EVENT_DMA_ADPTR) {
> - struct rte_event_dma_adapter_op *op = ev->event_ptr;
> + struct rte_dma_op *op = ev->event_ptr;
> 
>   to_free_in_bulk = op;
>   tstamp = op->user_meta;
> diff --git a/app/test/test_event_dma_adapter.c
> b/app/test/test_event_dma_adapter.c
> index 9988d4fc7b..7f72a4e81d 100644
> --- a/app/test/test_event_dma_adapter.c
> +++ b/app/test/test_event_dma_adapter.c
> @@ -234,7 +234,7 @@ test_op_forward_mode(void)  {
>   struct rte_mbuf *src_mbuf[TEST_MAX_OP];
>   struct rte_mbuf *dst_mbuf[TEST_MAX_OP];
> - struct rte_event_dma_adapter_op *op;
> + struct rte_dma_op *op;
>   struct rte_event ev[TEST_MAX_OP];
>   int ret, i;
> 
> @@ -266,7 +266,7 @@ test_op_forward_mode(void)
>   op->vchan = TEST_DMA_VCHAN_ID;
>   op->event_meta = dma_response_info.event;
> 
> - /* Fill in event info and update event_ptr with
> rte_event_dma_adapter_op */
> + /* Fill in event info and update event_ptr with rte_dma_op */
>   memset(&ev[i], 0, sizeof(struct rte_event));
>   ev[i].event = 0;
>   ev[i].op = RTE_EVENT_OP_NEW;
> @@ -396,7 +396,7 @@ configure_dmadev(void)
>  rte_socket_id());
>   RTE_TEST_ASSERT_NOT_NULL(params.dst_mbuf_pool, "Can't create
> DMA_DST_MBUFPOOL\n");
> 
> - elt_size = sizeof(struct rte_event_dma_adapter_op) + (sizeof(struct
> 

RE: [PATCH RFC 3/4] doc: update prog guide to use rte_dma_op

2025-02-25 Thread Amit Prakash Shukla



> -Original Message-
> From: Kommula Shiva Shankar 
> Sent: Wednesday, January 29, 2025 8:07 PM
> To: Jerin Jacob ; Amit Prakash Shukla
> ; Vamsi Krishna Attunuru
> ; fengcheng...@huawei.com; dev@dpdk.org
> Cc: Nithin Kumar Dabilpuram ; Pavan Nikhilesh
> Bhagavatula 
> Subject: [PATCH RFC 3/4] doc: update prog guide to use rte_dma_op
> 
> From: Pavan Nikhilesh 
> 
> Update the documentation to replace all instances of
> rte_event_dma_adapter_op with rte_dma_op
> 
> Signed-off-by: Pavan Nikhilesh 
> Change-Id: I0fe65d18f4601709826c11c6738cacec8991515d
> ---
>  doc/guides/prog_guide/eventdev/event_dma_adapter.rst | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 

Acked-by: Amit Prakash Shukla 


> diff --git a/doc/guides/prog_guide/eventdev/event_dma_adapter.rst
> b/doc/guides/prog_guide/eventdev/event_dma_adapter.rst
> index e040d89e8b..e8437a3297 100644
> --- a/doc/guides/prog_guide/eventdev/event_dma_adapter.rst
> +++ b/doc/guides/prog_guide/eventdev/event_dma_adapter.rst
> @@ -144,7 +144,7 @@ on which it enqueues events towards the DMA
> adapter using ``rte_event_enqueue_bu
> uint32_t cap;
> int ret;
> 
> -   /* Fill in event info and update event_ptr with rte_event_dma_adapter_op
> */
> +   /* Fill in event info and update event_ptr with rte_dma_op */
> memset(&ev, 0, sizeof(ev));
> .
> .
> @@ -244,11 +244,11 @@ Set event response information
> ~~
> 
>  In the ``RTE_EVENT_DMA_ADAPTER_OP_FORWARD`` /
> ``RTE_EVENT_DMA_ADAPTER_OP_NEW`` mode, -the application specifies the
> dmadev ID and vchan ID in ``struct rte_event_dma_adapter_op``
> +the application specifies the dmadev ID and vchan ID in ``struct
> +rte_dma_op``
>  and the event information (response information)  needed to enqueue an
> event after the DMA operation has completed.
>  The response information is specified in ``struct rte_event`` -and appended
> to the ``struct rte_event_dma_adapter_op``.
> +and appended to the ``struct rte_dma_op``.
> 
> 
>  Start the adapter instance
> --
> 2.43.0



RE: [PATCH V1 2/4] net/mlx5: support FDB unified domain

2025-02-25 Thread Dariusz Sosnowski
Nacked-by: Dariusz Sosnowski 

Please see below:

> diff --git a/drivers/net/mlx5/linux/mlx5_os.c 
> b/drivers/net/mlx5/linux/mlx5_os.c
> index 091f288..9410211 100644
> --- a/drivers/net/mlx5/linux/mlx5_os.c
> +++ b/drivers/net/mlx5/linux/mlx5_os.c
> @@ -1707,6 +1707,17 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
>   LIST_INIT(&priv->hw_ext_ctrl_flows);
>   if (priv->sh->config.dv_flow_en == 2) {  #ifdef
> HAVE_MLX5_HWS_SUPPORT
> + /*
> +  * Unified FDB flag is only needed for the actions created on
> the transfer
> +  * port. proxy port. It is not needed on the following ports:
> +  *   1. NIC PF / VF / SF
> +  *   2. in Verbs or DV/DR mode
> +  *   3. with unsupported FW
> +  *   4. all representors in HWS
> +  */
> + priv->unified_fdb_en = !!priv->master;

This should be also based on FW capability check introduced in previous commit.

> + DRV_LOG(DEBUG, "port %u: unified FDB %s enabled.",
> + eth_dev->data->port_id, priv->unified_fdb_en ? "is" :
> "isn't");
>   if (priv->sh->config.dv_esw_en) {
>   uint32_t usable_bits;
>   uint32_t required_bits;




RE: [PATCH v3 02/14] eventdev: remover unnecessary deref on function pointers

2025-02-25 Thread Gujjar, Abhinandan S

> -Original Message-
> From: Stephen Hemminger 
> Sent: Thursday, February 20, 2025 10:25 PM
> To: dev@dpdk.org
> Cc: Stephen Hemminger ; Morten Brørup
> ; Richardson, Bruce
> ; Gujjar, Abhinandan S
> ; Jerin Jacob ; Amit
> Prakash Shukla ; Naga Harish K, S V
> 
> Subject: [PATCH v3 02/14] eventdev: remover unnecessary deref on function
> pointers
> 
> The expression *dev_dev_ops->foo and dev->dev_ops->foo are equivalent.
> Cleanup the result by removing unneeded parenthesis and make lines compact.
> 
> Signed-off-by: Stephen Hemminger 
> Acked-by: Morten Brørup 
> Acked-by: Bruce Richardson 

Acked-by: abhinandan.guj...@intel.com

> ---
>  lib/eventdev/rte_event_crypto_adapter.c |  37 ++
>  lib/eventdev/rte_event_dma_adapter.c|  16 +--
>  lib/eventdev/rte_event_eth_rx_adapter.c |  50 
>  lib/eventdev/rte_eventdev.c | 164 +++-
>  4 files changed, 119 insertions(+), 148 deletions(-)
> 
> diff --git a/lib/eventdev/rte_event_crypto_adapter.c
> b/lib/eventdev/rte_event_crypto_adapter.c
> index 939ca1cad9..fc43e056d7 100644
> --- a/lib/eventdev/rte_event_crypto_adapter.c
> +++ b/lib/eventdev/rte_event_crypto_adapter.c
> @@ -1132,7 +1132,7 @@ rte_event_crypto_adapter_queue_pair_add(uint8_t
> id,
>adapter->mode == RTE_EVENT_CRYPTO_ADAPTER_OP_NEW) ||
>   (cap &
> RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_NEW &&
>adapter->mode == RTE_EVENT_CRYPTO_ADAPTER_OP_NEW)) {
> - if (*dev->dev_ops->crypto_adapter_queue_pair_add == NULL)
> + if (dev->dev_ops->crypto_adapter_queue_pair_add == NULL)
>   return -ENOTSUP;
>   if (dev_info->qpairs == NULL) {
>   dev_info->qpairs =
> @@ -1144,10 +1144,8 @@ rte_event_crypto_adapter_queue_pair_add(uint8_t
> id,
>   return -ENOMEM;
>   }
> 
> - ret = (*dev->dev_ops->crypto_adapter_queue_pair_add)(dev,
> - dev_info->dev,
> - queue_pair_id,
> - conf);
> + ret = dev->dev_ops->crypto_adapter_queue_pair_add(dev,
> dev_info->dev,
> +
> queue_pair_id, conf);
>   if (ret)
>   return ret;
> 
> @@ -1233,11 +1231,10 @@
> rte_event_crypto_adapter_queue_pair_del(uint8_t id, uint8_t cdev_id,
>   if ((cap &
> RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD) ||
>   (cap &
> RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_NEW &&
>adapter->mode == RTE_EVENT_CRYPTO_ADAPTER_OP_NEW)) {
> - if (*dev->dev_ops->crypto_adapter_queue_pair_del == NULL)
> + if (dev->dev_ops->crypto_adapter_queue_pair_del == NULL)
>   return -ENOTSUP;
> - ret = (*dev->dev_ops->crypto_adapter_queue_pair_del)(dev,
> - dev_info->dev,
> - queue_pair_id);
> + ret = dev->dev_ops->crypto_adapter_queue_pair_del(dev,
> +   dev_info->dev,
> queue_pair_id);
>   if (ret == 0) {
>   eca_update_qp_info(adapter,
>   &adapter->cdevs[cdev_id],
> @@ -1308,10 +1305,8 @@ eca_adapter_ctrl(uint8_t id, int start)
>   dev_info->dev_started = start;
>   if (dev_info->internal_event_port == 0)
>   continue;
> - start ? (*dev->dev_ops->crypto_adapter_start)(dev,
> - &dev_info->dev[i]) :
> - (*dev->dev_ops->crypto_adapter_stop)(dev,
> - &dev_info->dev[i]);
> + start ? dev->dev_ops->crypto_adapter_start(dev, &dev_info-
> >dev[i]) :
> + dev->dev_ops->crypto_adapter_stop(dev, &dev_info-
> >dev[i]);
>   }
> 
>   if (use_service)
> @@ -1367,11 +1362,9 @@ rte_event_crypto_adapter_stats_get(uint8_t id,
>   for (i = 0; i < rte_cryptodev_count(); i++) {
>   dev_info = &adapter->cdevs[i];
>   if (dev_info->internal_event_port == 0 ||
> - dev->dev_ops->crypto_adapter_stats_get == NULL)
> + dev->dev_ops->crypto_adapter_stats_get == NULL)
>   continue;
> - ret = (*dev->dev_ops->crypto_adapter_stats_get)(dev,
> - dev_info->dev,
> - &dev_stats);
> + ret = dev->dev_ops->crypto_adapter_stats_get(dev, dev_info-
> >dev,
> +&dev_stats);
>   if (ret)
>   continue;
> 
> @@ -1418,10 +1411,9 @@ rte_event_crypto_adapter_stats_reset(uint8_t id)
>   for (i = 0; i < rte_cryptodev_count(); i++) {
>   dev_info = &adapter->cdevs[i];
>   if (dev_info->internal_event_port == 0 ||
> -

  1   2   >