[PATCH v3 03/32] net/sssnic: support probe and remove

2023-08-31 Thread wanry
From: Renyong Wan 

Register device ID for 3SNIC ethernet adapter to support
PCI ethdev probe and remove.

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/base/sssnic_hw.h | 11 +
 drivers/net/sssnic/sssnic_ethdev.c  | 37 +
 2 files changed, 44 insertions(+), 4 deletions(-)
 create mode 100644 drivers/net/sssnic/base/sssnic_hw.h

diff --git a/drivers/net/sssnic/base/sssnic_hw.h 
b/drivers/net/sssnic/base/sssnic_hw.h
new file mode 100644
index 00..db916b1977
--- /dev/null
+++ b/drivers/net/sssnic/base/sssnic_hw.h
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#ifndef _SSSNIC_HW_H_
+#define _SSSNIC_HW_H_
+
+#define SSSNIC_PCI_VENDOR_ID 0x1F3F
+#define SSSNIC_DEVICE_ID_STD 0x9020
+
+#endif /* _SSSNIC_HW_H_ */
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index 0f1017af9d..4f8b5c2684 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -6,25 +6,54 @@
 #include 
 
 #include "sssnic_log.h"
+#include "base/sssnic_hw.h"
+
+static int
+sssnic_ethdev_init(struct rte_eth_dev *ethdev)
+{
+   RTE_SET_USED(ethdev);
+   PMD_INIT_FUNC_TRACE();
+
+   return -EINVAL;
+}
+
+static int
+sssnic_ethdev_uninit(struct rte_eth_dev *ethdev)
+{
+   RTE_SET_USED(ethdev);
+   PMD_INIT_FUNC_TRACE();
+
+   if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+   return 0;
+
+   return -EINVAL;
+}
 
 static int
 sssnic_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device 
*pci_dev)
 {
RTE_SET_USED(pci_drv);
-   RTE_SET_USED(pci_dev);
PMD_INIT_FUNC_TRACE();
-   return -EINVAL;
+
+   return rte_eth_dev_pci_generic_probe(pci_dev, 0, sssnic_ethdev_init);
 }
 
 static int
 sssnic_pci_remove(struct rte_pci_device *pci_dev)
 {
-   RTE_SET_USED(pci_dev);
PMD_INIT_FUNC_TRACE();
-   return -EINVAL;
+
+   return rte_eth_dev_pci_generic_remove(pci_dev, sssnic_ethdev_uninit);
 }
 
+static const struct rte_pci_id sssnic_pci_id_map[] = {
+   { RTE_PCI_DEVICE(SSSNIC_PCI_VENDOR_ID, SSSNIC_DEVICE_ID_STD) },
+   { .vendor_id = 0 },
+};
+
 static struct rte_pci_driver sssnic_pmd = {
+   .id_table = sssnic_pci_id_map,
+   .drv_flags = RTE_PCI_DRV_NEED_MAPPING,
.probe = sssnic_pci_probe,
.remove = sssnic_pci_remove,
 };
-- 
2.27.0



[PATCH v3 01/32] net/sssnic: add build and doc infrastructure

2023-08-31 Thread wanry
From: Renyong Wan 

Adding minimum PMD code, doc and build infrastructure for sssnic.

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Fixed 'Title underline too short' in doc/guides/nics/sssnic.rst.
* Removed error.h from including files.
---
 .mailmap|  5 +-
 MAINTAINERS |  8 
 doc/guides/nics/features/sssnic.ini |  9 
 doc/guides/nics/index.rst   |  1 +
 doc/guides/nics/sssnic.rst  | 73 +
 drivers/net/meson.build |  1 +
 drivers/net/sssnic/meson.build  | 18 +++
 drivers/net/sssnic/sssnic_ethdev.c  | 28 +++
 8 files changed, 140 insertions(+), 3 deletions(-)
 create mode 100644 doc/guides/nics/features/sssnic.ini
 create mode 100644 doc/guides/nics/sssnic.rst
 create mode 100644 drivers/net/sssnic/meson.build
 create mode 100644 drivers/net/sssnic/sssnic_ethdev.c

diff --git a/.mailmap b/.mailmap
index 864d33ee46..6fa73d3b79 100644
--- a/.mailmap
+++ b/.mailmap
@@ -151,7 +151,6 @@ Bao-Long Tran 
 Bar Neuman 
 Barak Enat 
 Barry Cao 
-Bartosz Staszewski 
 Baruch Siach 
 Bassam Zaid AlKilani 
 Beilei Xing 
@@ -496,7 +495,6 @@ Helin Zhang 
 Hemant Agrawal  
 Heng Ding 
 Hengjian Zhang 
-Heng Jiang 
 Heng Wang 
 Henning Schild 
 Henry Cai 
@@ -630,7 +628,6 @@ Jie Liu 
 Jie Pan 
 Jie Wang 
 Jie Zhou  
-Jieqiang Wang 
 Jijiang Liu 
 Jilei Chen 
 Jim Harris 
@@ -1156,6 +1153,7 @@ Rebecca Troy 
 Remi Pommarel 
 Remy Horton 
 Renata Saiakhova 
+Renyong Wan 
 Reshma Pattan  
 Ricardo Roldan 
 Ricardo Salveti 
@@ -1329,6 +1327,7 @@ Stephen Hurd  

 Steve Capper 
 Steven Lariau 
 Steven Luong 
+Steven Song 
 Steven Webster 
 Steven Zou 
 Steve Rempe 
diff --git a/MAINTAINERS b/MAINTAINERS
index a926155f26..1e57d29aa3 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -633,6 +633,13 @@ F: drivers/net/af_xdp/
 F: doc/guides/nics/af_xdp.rst
 F: doc/guides/nics/features/af_xdp.ini
 
+3SNIC sssnic
+M: Renyong Wan 
+M: Steven Song 
+F: driver/net/sssnic/
+F: doc/guides/nics/sssnic.rst
+F: doc/guides/nics/features/sssnic.ini
+
 Amazon ENA
 M: Michal Krawczyk 
 M: Shai Brandes 
@@ -1793,6 +1800,7 @@ F: doc/guides/tools/img/eventdev_*
 F: app/test/test_event_ring.c
 
 Procinfo tool
+M: Maryam Tahhan 
 M: Reshma Pattan 
 F: app/proc-info/
 F: doc/guides/tools/proc_info.rst
diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
new file mode 100644
index 00..6d9786db7e
--- /dev/null
+++ b/doc/guides/nics/features/sssnic.ini
@@ -0,0 +1,9 @@
+;
+; Supported features of the 'sssnic' network poll mode driver.
+;
+; Refer to default.ini for the full list of available PMD features.
+;
+[Features]
+Linux= Y
+ARMv8= Y
+x86-64   = Y
diff --git a/doc/guides/nics/index.rst b/doc/guides/nics/index.rst
index 7bfcac880f..9d2b29383b 100644
--- a/doc/guides/nics/index.rst
+++ b/doc/guides/nics/index.rst
@@ -61,6 +61,7 @@ Network Interface Controller Drivers
 qede
 sfc_efx
 softnic
+sssnic
 tap
 thunderx
 txgbe
diff --git a/doc/guides/nics/sssnic.rst b/doc/guides/nics/sssnic.rst
new file mode 100644
index 00..fe0180c2e6
--- /dev/null
+++ b/doc/guides/nics/sssnic.rst
@@ -0,0 +1,73 @@
+..  SPDX-License-Identifier: BSD-3-Clause
+Copyright(c) 2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+
+SSSNIC Poll Mode Driver
+===
+
+The sssnic PMD (**librte_pmd_sssnic**) provides poll mode driver support
+for 3SNIC 9x0 serials family of Ethernet adapters.
+
+
+Supported NICs
+--
+
+- 3S910 Dual Port SFP28 10/25GbE Ethernet adapter
+- 3S920 Quad Port SFP28 10/25GbE Ethernet adapter
+- 3S920 Quad Port QSFP28 100GbE Ethernet adapter
+
+
+Features
+
+
+Features of sssnic PMD are:
+
+- Link status
+- Link status event
+- Queue start/stop
+- Rx interrupt
+- Scattered Rx
+- TSO
+- LRO
+- Promiscuous mode
+- Allmulticast mode
+- Unicast MAC filter
+- Multicast MAC filte
+- RSS hash
+- RSS key update
+- RSS reta update
+- Inner RSS
+- VLAN filter
+- VLAN offload
+- L3 checksum offload
+- L4 checksum offload
+- Inner L3 checksum
+- Inner L4 checksum
+- Basic stats
+- Extended stats
+- Stats per queue
+- Flow control
+- FW version
+- Generic flow API
+
+
+Prerequisites
+-
+
+- Learning about 3SNIC Ethernet NICs using
+  ``_.
+
+- Follow the DPDK :ref:`Getting Started Guide for Linux ` to setup 
the basic DPDK environment.
+
+
+Driver compilation and testing
+--
+
+Refer to the document :ref:`compiling and testing a PMD for a NIC 
`
+for details.
+
+
+Limitations or Known issues
+---
+
+Build with ICC is not supported yet.
+Power8, ARMv7 and BSD are not supported yet.
diff --git a/drivers/net/meson.build b/drivers/net/meson.build
index bd38b533c5..224eab99a7 100644
--- a/drivers/net/meson.build
+++ b/drivers/net/meson.build
@@ -54,6 +54,7 @@ drivers = [

[PATCH v3 02/32] net/sssnic: add log type and log macros

2023-08-31 Thread wanry
From: Renyong Wan 

Adding log macros to print runtime messages and trace functions.

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/sssnic_ethdev.c | 13 
 drivers/net/sssnic/sssnic_log.h| 51 ++
 2 files changed, 64 insertions(+)
 create mode 100644 drivers/net/sssnic/sssnic_log.h

diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index dcda01eeb8..0f1017af9d 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -5,11 +5,14 @@
 #include 
 #include 
 
+#include "sssnic_log.h"
+
 static int
 sssnic_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device 
*pci_dev)
 {
RTE_SET_USED(pci_drv);
RTE_SET_USED(pci_dev);
+   PMD_INIT_FUNC_TRACE();
return -EINVAL;
 }
 
@@ -17,6 +20,7 @@ static int
 sssnic_pci_remove(struct rte_pci_device *pci_dev)
 {
RTE_SET_USED(pci_dev);
+   PMD_INIT_FUNC_TRACE();
return -EINVAL;
 }
 
@@ -26,3 +30,12 @@ static struct rte_pci_driver sssnic_pmd = {
 };
 
 RTE_PMD_REGISTER_PCI(net_sssnic, sssnic_pmd);
+
+RTE_LOG_REGISTER_SUFFIX(sssnic_logtype_driver, driver, INFO);
+RTE_LOG_REGISTER_SUFFIX(sssnic_logtype_init, init, NOTICE);
+#ifdef RTE_ETHDEV_DEBUG_RX
+RTE_LOG_REGISTER_SUFFIX(sssnic_logtype_rx, rx, DEBUG);
+#endif /*RTE_ETHDEV_DEBUG_RX*/
+#ifdef RTE_ETHDEV_DEBUG_TX
+RTE_LOG_REGISTER_SUFFIX(sssnic_logtype_tx, tx, DEBUG);
+#endif /*RTE_ETHDEV_DEBUG_TX*/
diff --git a/drivers/net/sssnic/sssnic_log.h b/drivers/net/sssnic/sssnic_log.h
new file mode 100644
index 00..629e12100c
--- /dev/null
+++ b/drivers/net/sssnic/sssnic_log.h
@@ -0,0 +1,51 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#ifndef _SSSNIC_LOG_H_
+#define _SSSNIC_LOG_H_
+
+#include 
+
+extern int sssnic_logtype_driver;
+extern int sssnic_logtype_init;
+
+#define SSSNIC_LOG_NAME "sssnic"
+#define PMD_DRV_LOG(level, fmt, args...)   
\
+   rte_log(RTE_LOG_##level, sssnic_logtype_driver,\
+   SSSNIC_LOG_NAME ": " fmt "\n", ##args)
+#define PMD_INIT_LOG(level, fmt, args...)  
\
+   rte_log(RTE_LOG_##level, sssnic_logtype_init, "%s(): " fmt "\n",   \
+   __func__, ##args)
+
+#define SSSNIC_DEBUG(fmt, args...) 
\
+   PMD_DRV_LOG(DEBUG, "[%s():%d] " fmt, __func__, __LINE__, ##args)
+
+/*
+ * Trace driver init and uninit.
+ */
+#define PMD_INIT_FUNC_TRACE() PMD_INIT_LOG(DEBUG, " >>")
+
+#ifdef RTE_ETHDEV_DEBUG_RX
+extern int sssnic_logtype_rx;
+#define SSSNIC_RX_LOG(level, fmt, args...) 
\
+   rte_log(RTE_LOG_##level, sssnic_logtype_rx,\
+   "sssnic_rx: [%s():%d] " fmt "\n", __func__, __LINE__, ##args)
+#else
+#define SSSNIC_RX_LOG(level, fmt, args...) 
\
+   do {   \
+   } while (0)
+#endif /*RTE_ETHDEV_DEBUG_RX*/
+
+#ifdef RTE_ETHDEV_DEBUG_TX
+extern int sssnic_logtype_tx;
+#define SSSNIC_TX_LOG(level, fmt, args...) 
\
+   rte_log(RTE_LOG_##level, sssnic_logtype_rx,\
+   "sssnic_tx: [%s():%d] " fmt "\n", __func__, __LINE__, ##args)
+#else
+#define SSSNIC_TX_LOG(level, fmt, args...) 
\
+   do {   \
+   } while (0)
+#endif /*RTE_ETHDEV_DEBUG_TX*/
+
+#endif /*_SSSNIC_LOG_H_*/
-- 
2.27.0



[PATCH v3 04/32] net/sssnic: initialize hardware base

2023-08-31 Thread wanry
From: Renyong Wan 

Initializing hardware base make hardware ready to be access.

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/base/meson.build  |  13 ++
 drivers/net/sssnic/base/sssnic_hw.c  | 207 +++
 drivers/net/sssnic/base/sssnic_hw.h  |  49 +++
 drivers/net/sssnic/base/sssnic_reg.h | 169 ++
 drivers/net/sssnic/meson.build   |   3 +
 drivers/net/sssnic/sssnic_ethdev.c   |  46 +-
 drivers/net/sssnic/sssnic_ethdev.h   |  18 +++
 7 files changed, 501 insertions(+), 4 deletions(-)
 create mode 100644 drivers/net/sssnic/base/meson.build
 create mode 100644 drivers/net/sssnic/base/sssnic_hw.c
 create mode 100644 drivers/net/sssnic/base/sssnic_reg.h
 create mode 100644 drivers/net/sssnic/sssnic_ethdev.h

diff --git a/drivers/net/sssnic/base/meson.build 
b/drivers/net/sssnic/base/meson.build
new file mode 100644
index 00..3e64112c72
--- /dev/null
+++ b/drivers/net/sssnic/base/meson.build
@@ -0,0 +1,13 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+
+sources = [
+'sssnic_hw.c',
+]
+
+c_args = cflags
+base_lib = static_library('sssnic_base', sources,
+   dependencies: [static_rte_eal, static_rte_ethdev, static_rte_bus_pci, 
static_rte_net],
+   c_args: c_args)
+
+base_objs = base_lib.extract_all_objects()
diff --git a/drivers/net/sssnic/base/sssnic_hw.c 
b/drivers/net/sssnic/base/sssnic_hw.c
new file mode 100644
index 00..8b7bba7644
--- /dev/null
+++ b/drivers/net/sssnic/base/sssnic_hw.c
@@ -0,0 +1,207 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#include 
+#include 
+#include 
+
+#include "../sssnic_log.h"
+#include "sssnic_hw.h"
+#include "sssnic_reg.h"
+
+static int
+wait_for_sssnic_hw_ready(struct sssnic_hw *hw)
+{
+   struct sssnic_attr1_reg reg;
+   uint32_t timeout_ms = 10;
+
+   do {
+   reg.u32 = sssnic_cfg_reg_read(hw, SSSNIC_ATTR1_REG);
+   if (reg.u32 != 0x && reg.mgmt_init_status != 0)
+   return 0;
+   rte_delay_ms(1);
+   } while (--timeout_ms);
+
+   return -EBUSY;
+}
+
+static int
+wait_for_sssnic_db_enabled(struct sssnic_hw *hw)
+{
+   struct sssnic_attr4_reg r4;
+   struct sssnic_attr5_reg r5;
+   uint32_t timeout_ms = 6;
+
+   do {
+   r4.u32 = sssnic_cfg_reg_read(hw, SSSNIC_ATTR4_REG);
+   r5.u32 = sssnic_cfg_reg_read(hw, SSSNIC_ATTR5_REG);
+   if (r4.db_ctrl == SSSNIC_DB_CTRL_ENABLE &&
+   r5.outbound_ctrl == SSSNIC_DB_CTRL_ENABLE)
+   return 0;
+   rte_delay_ms(1);
+   } while (--timeout_ms);
+
+   return -EBUSY;
+}
+
+static void
+sssnic_attr_setup(struct sssnic_hw *hw)
+{
+   struct sssnic_attr0_reg attr0;
+   struct sssnic_attr1_reg attr1;
+   struct sssnic_attr2_reg attr2;
+   struct sssnic_attr3_reg attr3;
+   struct sssnic_hw_attr *attr = &hw->attr;
+
+   attr0.u32 = sssnic_cfg_reg_read(hw, SSSNIC_ATTR0_REG);
+   attr1.u32 = sssnic_cfg_reg_read(hw, SSSNIC_ATTR1_REG);
+   attr2.u32 = sssnic_cfg_reg_read(hw, SSSNIC_ATTR2_REG);
+   attr3.u32 = sssnic_cfg_reg_read(hw, SSSNIC_ATTR3_REG);
+
+   attr->func_idx = attr0.func_idx;
+   attr->pf_idx = attr0.pf_idx;
+   attr->pci_idx = attr0.pci_idx;
+   attr->vf_off = attr0.vf_off;
+   attr->func_type = attr0.func_type;
+   attr->af_idx = attr1.af_idx;
+   attr->num_aeq = RTE_BIT32(attr1.num_aeq);
+   attr->num_ceq = attr2.num_ceq;
+   attr->num_irq = attr2.num_irq;
+   attr->global_vf_off = attr3.global_vf_off;
+
+   PMD_DRV_LOG(DEBUG, "attr0=0x%x, attr1=0x%x, attr2=0x%x, attr3=0x%x",
+   attr0.u32, attr1.u32, attr2.u32, attr3.u32);
+}
+
+/* AF and MF election */
+static void
+sssnic_af_setup(struct sssnic_hw *hw)
+{
+   struct sssnic_af_election_reg reg0;
+   struct sssnic_mf_election_reg reg1;
+
+   /* AF election */
+   reg0.u32 = sssnic_mgmt_reg_read(hw, SSSNIC_AF_ELECTION_REG);
+   reg0.func_idx = hw->attr.func_idx;
+   sssnic_mgmt_reg_write(hw, SSSNIC_AF_ELECTION_REG, reg0.u32);
+   reg0.u32 = sssnic_mgmt_reg_read(hw, SSSNIC_AF_ELECTION_REG);
+   hw->attr.af_idx = reg0.func_idx;
+   if (hw->attr.af_idx == hw->attr.func_idx) {
+   hw->attr.func_type = SSSNIC_FUNC_TYPE_AF;
+   PMD_DRV_LOG(INFO, "Elected PF %d as AF", hw->attr.func_idx);
+
+   /* MF election */
+   reg1.u32 = sssnic_mgmt_reg_read(hw, SSSNIC_MF_ELECTION_REG);
+   reg1.func_idx = hw->attr.func_idx;
+   sssnic_mgmt_reg_write(hw, SSSNIC_MF_ELECTION_REG, reg1.u32);
+   reg1.u32 = sssnic_mgmt_reg_read(hw, SSSNIC_MF_ELECTION_REG);
+   hw->attr.mf_idx = reg1.func_idx;
+   if (hw->at

[PATCH v3 07/32] net/sssnic/base: add mailbox support

2023-08-31 Thread wanry
From: Renyong Wan 

Mailbox is a message channel used to communicate between PF and
VF as well as driver and hardware functions.
Mailbox messages are received by driver through event queue, and
sent by driver through registers of mailbox.
There are two transfer modes for sending mailbox message, one is
DMA mode used to send message to PF, another is inline mode used
to send message to VF.

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v3:
* Fixed dereferencing type-punned pointer.
---
 drivers/net/sssnic/base/meson.build   |   1 +
 drivers/net/sssnic/base/sssnic_hw.c   |  10 +
 drivers/net/sssnic/base/sssnic_hw.h   |   4 +
 drivers/net/sssnic/base/sssnic_mbox.c | 615 ++
 drivers/net/sssnic/base/sssnic_mbox.h |  45 ++
 drivers/net/sssnic/base/sssnic_misc.h |  11 +
 drivers/net/sssnic/base/sssnic_reg.h  |  47 ++
 7 files changed, 733 insertions(+)
 create mode 100644 drivers/net/sssnic/base/sssnic_mbox.c
 create mode 100644 drivers/net/sssnic/base/sssnic_mbox.h
 create mode 100644 drivers/net/sssnic/base/sssnic_misc.h

diff --git a/drivers/net/sssnic/base/meson.build 
b/drivers/net/sssnic/base/meson.build
index dd4dd08fc1..4abd1a0daf 100644
--- a/drivers/net/sssnic/base/meson.build
+++ b/drivers/net/sssnic/base/meson.build
@@ -5,6 +5,7 @@ sources = [
 'sssnic_hw.c',
 'sssnic_eventq.c',
 'sssnic_msg.c',
+'sssnic_mbox.c',
 ]
 
 c_args = cflags
diff --git a/drivers/net/sssnic/base/sssnic_hw.c 
b/drivers/net/sssnic/base/sssnic_hw.c
index 387c823c7e..ff527b2c7f 100644
--- a/drivers/net/sssnic/base/sssnic_hw.c
+++ b/drivers/net/sssnic/base/sssnic_hw.c
@@ -11,6 +11,7 @@
 #include "sssnic_reg.h"
 #include "sssnic_eventq.h"
 #include "sssnic_msg.h"
+#include "sssnic_mbox.h"
 
 static int
 wait_for_sssnic_hw_ready(struct sssnic_hw *hw)
@@ -210,8 +211,16 @@ sssnic_hw_init(struct sssnic_hw *hw)
goto eventq_init_fail;
}
 
+   ret = sssnic_mbox_init(hw);
+   if (ret) {
+   PMD_DRV_LOG(ERR, "Failed to initialize mailbox");
+   goto mbox_init_fail;
+   }
+
return -EINVAL;
 
+mbox_init_fail:
+   sssnic_eventq_all_shutdown(hw);
 eventq_init_fail:
sssnic_msg_inbox_shutdown(hw);
return ret;
@@ -222,6 +231,7 @@ sssnic_hw_shutdown(struct sssnic_hw *hw)
 {
PMD_INIT_FUNC_TRACE();
 
+   sssnic_mbox_shutdown(hw);
sssnic_eventq_all_shutdown(hw);
sssnic_msg_inbox_shutdown(hw);
 }
diff --git a/drivers/net/sssnic/base/sssnic_hw.h 
b/drivers/net/sssnic/base/sssnic_hw.h
index 38fb9ac1ac..41e65f5880 100644
--- a/drivers/net/sssnic/base/sssnic_hw.h
+++ b/drivers/net/sssnic/base/sssnic_hw.h
@@ -53,12 +53,16 @@ struct sssnic_hw {
struct sssnic_hw_attr attr;
struct sssnic_eventq *eventqs;
struct sssnic_msg_inbox *msg_inbox;
+   struct sssnic_mbox *mbox;
uint8_t num_eventqs;
uint16_t eth_port_id;
 };
 
+#define SSSNIC_FUNC_IDX(hw) ((hw)->attr.func_idx)
 #define SSSNIC_ETH_PORT_ID(hw) ((hw)->eth_port_id)
 #define SSSNIC_MPU_FUNC_IDX 0x1fff
+#define SSSNIC_FUNC_TYPE(hw) ((hw)->attr.func_type)
+#define SSSNIC_AF_FUNC_IDX(hw) ((hw)->attr.af_idx)
 
 int sssnic_hw_init(struct sssnic_hw *hw);
 void sssnic_hw_shutdown(struct sssnic_hw *hw);
diff --git a/drivers/net/sssnic/base/sssnic_mbox.c 
b/drivers/net/sssnic/base/sssnic_mbox.c
new file mode 100644
index 00..02957137ea
--- /dev/null
+++ b/drivers/net/sssnic/base/sssnic_mbox.c
@@ -0,0 +1,615 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "../sssnic_log.h"
+#include "sssnic_hw.h"
+#include "sssnic_reg.h"
+#include "sssnic_misc.h"
+#include "sssnic_eventq.h"
+#include "sssnic_mbox.h"
+
+#define SSSNIC_MBOX_SEND_RESULT_SIZE 16
+#define SSSNIC_MBOX_SEND_BUF_SIZE 2048UL
+#define SSSNIC_MBOX_RESP_MSG_EVENTQ 1
+#define SSSNIC_MBOX_SEND_DONE_TIMEOUT 50 /* uint is 10us */
+#define SSSNIC_MBOX_DEF_REQ_TIMEOUT 4000 /* millisecond */
+#define SSSNIC_MBOX_REQ_ID_MASK 0xf /* request id only 4 bits*/
+
+struct sssnic_sendbox {
+   struct sssnic_mbox *mbox;
+   /* Send data memory */
+   uint8_t *data;
+   /* Send result DMA memory zone */
+   const struct rte_memzone *result_mz;
+   /* Send result DMA virtual address */
+   volatile uint64_t *result_addr;
+   /* DMA buffer mz */
+   const struct rte_memzone *buf_mz;
+   /* DMA buffer virtual address */
+   uint8_t *buf_addr;
+   pthread_mutex_t lock;
+};
+
+struct sssnic_mbox_msg_dma_desc {
+   /* 32bit xor checksum for DMA data */
+   uint32_t checksum;
+   /* dword of high DMA address */
+   uint32_t dma_addr_hi;
+   /* dword of low DMA address */
+   uint32_t dma_addr_lo;
+   /* DMA data length */
+   uint32_t len;
+   uint32_t resvd[2];
+};
+#define SSSNIC_MBOX_MSG_

[PATCH v3 06/32] net/sssnic/base: add message definition and utility

2023-08-31 Thread wanry
From: Renyong Wan 

sssnic message is used to encapsulate sssnic command for transmission
between driver and firmware. sssnic message is sent by driver via mail
box and is received by driver via event queue.

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Removed error.h from including files.
---
 drivers/net/sssnic/base/meson.build |   3 +-
 drivers/net/sssnic/base/sssnic_eventq.c |  29 +++
 drivers/net/sssnic/base/sssnic_hw.c |  15 +-
 drivers/net/sssnic/base/sssnic_hw.h |   2 +
 drivers/net/sssnic/base/sssnic_msg.c| 254 
 drivers/net/sssnic/base/sssnic_msg.h| 166 
 6 files changed, 467 insertions(+), 2 deletions(-)
 create mode 100644 drivers/net/sssnic/base/sssnic_msg.c
 create mode 100644 drivers/net/sssnic/base/sssnic_msg.h

diff --git a/drivers/net/sssnic/base/meson.build 
b/drivers/net/sssnic/base/meson.build
index 7758faa482..dd4dd08fc1 100644
--- a/drivers/net/sssnic/base/meson.build
+++ b/drivers/net/sssnic/base/meson.build
@@ -3,7 +3,8 @@
 
 sources = [
 'sssnic_hw.c',
-'sssnic_eventq.c'
+'sssnic_eventq.c',
+'sssnic_msg.c',
 ]
 
 c_args = cflags
diff --git a/drivers/net/sssnic/base/sssnic_eventq.c 
b/drivers/net/sssnic/base/sssnic_eventq.c
index a479bdff35..f6a343f0e8 100644
--- a/drivers/net/sssnic/base/sssnic_eventq.c
+++ b/drivers/net/sssnic/base/sssnic_eventq.c
@@ -14,6 +14,7 @@
 #include "../sssnic_log.h"
 #include "sssnic_hw.h"
 #include "sssnic_reg.h"
+#include "sssnic_msg.h"
 #include "sssnic_eventq.h"
 
 #define SSSNIC_EVENTQ_DEF_DEPTH 64
@@ -184,6 +185,32 @@ sssnic_eventq_ci_update(struct sssnic_eventq *eq, int 
informed)
sssnic_eventq_reg_write(eq, SSSNIC_EVENTQ_CI_CTRL_REG, reg.u32);
 }
 
+static int
+sssnic_event_default_handler_func(struct sssnic_eventq *eq,
+   struct sssnic_event *ev, __rte_unused void *data)
+{
+   struct sssnic_hw *hw;
+   int ret;
+
+   hw = eq->hw;
+   ret = sssnic_msg_rx_handle(hw, (struct sssnic_msg_hdr *)(ev->data));
+   if (ret != SSSNIC_MSG_DONE)
+   return -1;
+
+   return SSSNIC_EVENT_DONE;
+}
+
+static void
+sssnic_eventq_handlers_init(struct sssnic_eventq *eq)
+{
+   int i;
+
+   for (i = SSSNIC_EVENT_CODE_MIN; i <= SSSNIC_EVENT_CODE_MAX; i++) {
+   eq->handlers[i].func = sssnic_event_default_handler_func;
+   eq->handlers[i].data = NULL;
+   }
+}
+
 static int
 sssnic_eventq_init(struct sssnic_hw *hw, struct sssnic_eventq *eq, uint16_t 
qid)
 {
@@ -230,6 +257,8 @@ sssnic_eventq_init(struct sssnic_hw *hw, struct 
sssnic_eventq *eq, uint16_t qid)
PMD_DRV_LOG(ERR, "Failed to setup eventq pages!");
return ret;
}
+
+   sssnic_eventq_handlers_init(eq);
sssnic_eventq_ctrl_setup(eq);
sssnic_eventq_ci_update(eq, 1);
if (qid == 0)
diff --git a/drivers/net/sssnic/base/sssnic_hw.c 
b/drivers/net/sssnic/base/sssnic_hw.c
index 44e04486a5..387c823c7e 100644
--- a/drivers/net/sssnic/base/sssnic_hw.c
+++ b/drivers/net/sssnic/base/sssnic_hw.c
@@ -10,6 +10,7 @@
 #include "sssnic_hw.h"
 #include "sssnic_reg.h"
 #include "sssnic_eventq.h"
+#include "sssnic_msg.h"
 
 static int
 wait_for_sssnic_hw_ready(struct sssnic_hw *hw)
@@ -197,18 +198,30 @@ sssnic_hw_init(struct sssnic_hw *hw)
return ret;
}
 
+   ret = sssnic_msg_inbox_init(hw);
+   if (ret) {
+   PMD_DRV_LOG(ERR, "Failed to initialize message inbox.");
+   return ret;
+   }
+
ret = sssnic_eventq_all_init(hw);
if (ret != 0) {
PMD_DRV_LOG(ERR, "Failed to initialize event queues");
-   return ret;
+   goto eventq_init_fail;
}
 
return -EINVAL;
+
+eventq_init_fail:
+   sssnic_msg_inbox_shutdown(hw);
+   return ret;
 }
 
 void
 sssnic_hw_shutdown(struct sssnic_hw *hw)
 {
PMD_INIT_FUNC_TRACE();
+
sssnic_eventq_all_shutdown(hw);
+   sssnic_msg_inbox_shutdown(hw);
 }
diff --git a/drivers/net/sssnic/base/sssnic_hw.h 
b/drivers/net/sssnic/base/sssnic_hw.h
index 6caf3a6d66..38fb9ac1ac 100644
--- a/drivers/net/sssnic/base/sssnic_hw.h
+++ b/drivers/net/sssnic/base/sssnic_hw.h
@@ -52,11 +52,13 @@ struct sssnic_hw {
uint8_t *db_mem_len;
struct sssnic_hw_attr attr;
struct sssnic_eventq *eventqs;
+   struct sssnic_msg_inbox *msg_inbox;
uint8_t num_eventqs;
uint16_t eth_port_id;
 };
 
 #define SSSNIC_ETH_PORT_ID(hw) ((hw)->eth_port_id)
+#define SSSNIC_MPU_FUNC_IDX 0x1fff
 
 int sssnic_hw_init(struct sssnic_hw *hw);
 void sssnic_hw_shutdown(struct sssnic_hw *hw);
diff --git a/drivers/net/sssnic/base/sssnic_msg.c 
b/drivers/net/sssnic/base/sssnic_msg.c
new file mode 100644
index 00..4b98fee75b
--- /dev/null
+++ b/drivers/net/sssnic/base/sssnic_msg.c
@@ -0,0 +1,254 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Techn

[PATCH v3 10/32] net/sssnic: add dev configure and infos get

2023-08-31 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/base/sssnic_api.c | 33 
 drivers/net/sssnic/base/sssnic_api.h |  8 +++
 drivers/net/sssnic/base/sssnic_cmd.h | 14 +
 drivers/net/sssnic/base/sssnic_hw.c  | 33 +++-
 drivers/net/sssnic/base/sssnic_hw.h  |  6 +++
 drivers/net/sssnic/sssnic_ethdev.c   | 76 
 drivers/net/sssnic/sssnic_ethdev.h   | 53 +++
 7 files changed, 222 insertions(+), 1 deletion(-)

diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index 51a59f0f25..bf0859cd63 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -100,3 +100,36 @@ sssnic_msix_attr_set(struct sssnic_hw *hw, uint16_t 
msix_idx,
 
return 0;
 }
+
+int
+sssnic_capability_get(struct sssnic_hw *hw, struct sssnic_capability *capa)
+{
+   struct sssnic_capability_get_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+   int ret;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd_len = sizeof(cmd);
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_GET_CAPABILITY_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_CFG_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_GET_CAPABILITY_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   capa->phy_port = cmd.phy_port;
+   capa->max_num_rxq = cmd.rxq_max_id + 1;
+   capa->max_num_txq = cmd.txq_max_id + 1;
+
+   return 0;
+}
diff --git a/drivers/net/sssnic/base/sssnic_api.h 
b/drivers/net/sssnic/base/sssnic_api.h
index 3d54eb826a..8011cc8b0f 100644
--- a/drivers/net/sssnic/base/sssnic_api.h
+++ b/drivers/net/sssnic/base/sssnic_api.h
@@ -15,9 +15,17 @@ struct sssnic_msix_attr {
uint8_t resend_timer;
 };
 
+struct sssnic_capability {
+   uint16_t max_num_txq;
+   uint16_t max_num_rxq;
+   uint8_t phy_port;
+   uint8_t cos;
+};
+
 int sssnic_msix_attr_get(struct sssnic_hw *hw, uint16_t msix_idx,
struct sssnic_msix_attr *attr);
 int sssnic_msix_attr_set(struct sssnic_hw *hw, uint16_t msix_idx,
struct sssnic_msix_attr *attr);
+int sssnic_capability_get(struct sssnic_hw *hw, struct sssnic_capability 
*capa);
 
 #endif /* _SSSNIC_API_H_ */
diff --git a/drivers/net/sssnic/base/sssnic_cmd.h 
b/drivers/net/sssnic/base/sssnic_cmd.h
index ee9f536ac2..79192affbc 100644
--- a/drivers/net/sssnic/base/sssnic_cmd.h
+++ b/drivers/net/sssnic/base/sssnic_cmd.h
@@ -18,6 +18,8 @@ enum sssnic_mgmt_cmd_id {
SSSNIC_GET_FW_VERSION_CMD = 60,
 };
 
+#define SSSNIC_GET_CAPABILITY_CMD 0
+
 struct sssnic_cmd_common {
uint8_t status;
uint8_t version;
@@ -111,4 +113,16 @@ struct sssnic_msix_ctrl_cmd {
uint8_t resvd1[5];
 };
 
+struct sssnic_capability_get_cmd {
+   struct sssnic_cmd_common common;
+   uint16_t function;
+   uint16_t resvd0;
+   uint8_t resvd1[3];
+   uint8_t phy_port;
+   uint32_t resvd2[16];
+   uint16_t txq_max_id;
+   uint16_t rxq_max_id;
+   uint32_t resvd3[63];
+};
+
 #endif /* _SSSNIC_CMD_H_ */
diff --git a/drivers/net/sssnic/base/sssnic_hw.c 
b/drivers/net/sssnic/base/sssnic_hw.c
index 4ca75208af..8f5f556bde 100644
--- a/drivers/net/sssnic/base/sssnic_hw.c
+++ b/drivers/net/sssnic/base/sssnic_hw.c
@@ -253,6 +253,29 @@ sssnic_msix_attr_init(struct sssnic_hw *hw)
return 0;
 }
 
+static int
+sssnic_capability_init(struct sssnic_hw *hw)
+{
+   struct sssnic_capability cap;
+   int ret;
+
+   ret = sssnic_capability_get(hw, &cap);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to get sssnic capability");
+   return ret;
+   }
+
+   PMD_DRV_LOG(INFO,
+   "Initialized capability, physic port:%u, max %u txqs, max %u 
rxqs",
+   cap.phy_port, cap.max_num_txq, cap.max_num_rxq);
+
+   hw->phy_port = cap.phy_port;
+   hw->max_num_rxq = cap.max_num_rxq;
+   hw->max_num_txq = cap.max_num_txq;
+
+   return 0;
+}
+
 static int
 sssnic_base_init(struct sssnic_hw *hw)
 {
@@ -360,10 +383,18 @@ sssnic_hw_init(struct sssnic_hw *hw)
goto ctrlq_init_fail;
}
 
+   ret = sssnic_capability_init(hw);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to initialize capability");
+   goto capbility_init_fail;
+   }
+
sssnic_pf_status_set(hw, SSSNIC_PF_STATUS_ACTIVE);
 
-   return -EINVAL;
+   return 0;
 
+capbility_init_fail:
+   sssnic_ctrlq_s

[PATCH v3 09/32] net/sssnic/base: add control queue

2023-08-31 Thread wanry
From: Renyong Wan 

Control queue is used for communication between driver and datapath code
of firmware.

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Fixed variable 'cmd_len' is uninitialized when used.
---
 drivers/net/sssnic/base/meson.build|   2 +
 drivers/net/sssnic/base/sssnic_api.c   | 102 +
 drivers/net/sssnic/base/sssnic_api.h   |  23 ++
 drivers/net/sssnic/base/sssnic_cmd.h   | 114 ++
 drivers/net/sssnic/base/sssnic_ctrlq.c | 521 +
 drivers/net/sssnic/base/sssnic_ctrlq.h |  58 +++
 drivers/net/sssnic/base/sssnic_hw.c| 149 +++
 drivers/net/sssnic/base/sssnic_hw.h|   8 +
 8 files changed, 977 insertions(+)
 create mode 100644 drivers/net/sssnic/base/sssnic_api.c
 create mode 100644 drivers/net/sssnic/base/sssnic_api.h
 create mode 100644 drivers/net/sssnic/base/sssnic_cmd.h
 create mode 100644 drivers/net/sssnic/base/sssnic_ctrlq.c
 create mode 100644 drivers/net/sssnic/base/sssnic_ctrlq.h

diff --git a/drivers/net/sssnic/base/meson.build 
b/drivers/net/sssnic/base/meson.build
index 7c23a82ff3..e93ca7b24b 100644
--- a/drivers/net/sssnic/base/meson.build
+++ b/drivers/net/sssnic/base/meson.build
@@ -7,6 +7,8 @@ sources = [
 'sssnic_msg.c',
 'sssnic_mbox.c',
 'sssnic_workq.c',
+'sssnic_ctrlq.c',
+'sssnic_api.c',
 ]
 
 c_args = cflags
diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
new file mode 100644
index 00..51a59f0f25
--- /dev/null
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -0,0 +1,102 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include "../sssnic_log.h"
+#include "sssnic_hw.h"
+#include "sssnic_cmd.h"
+#include "sssnic_mbox.h"
+#include "sssnic_api.h"
+
+int
+sssnic_msix_attr_get(struct sssnic_hw *hw, uint16_t msix_idx,
+   struct sssnic_msix_attr *attr)
+{
+   int ret;
+   struct sssnic_msg msg;
+   struct sssnic_msix_ctrl_cmd cmd;
+   uint32_t cmd_len;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.func_id = SSSNIC_FUNC_IDX(hw);
+   cmd.opcode = SSSNIC_CMD_OPCODE_GET;
+   cmd.idx = msix_idx;
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len, SSSNIC_MSIX_CTRL_CMD,
+   SSSNIC_MPU_FUNC_IDX, SSSNIC_COMM_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to MSIX_CTRL_CMD, len=%u, status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+   attr->lli_credit = cmd.lli_credit;
+   attr->lli_timer = cmd.lli_timer;
+   attr->pending_limit = cmd.pending_count;
+   attr->coalescing_timer = cmd.coalescing_timer;
+   attr->resend_timer = cmd.resend_timer;
+
+   return 0;
+}
+
+int
+sssnic_msix_attr_set(struct sssnic_hw *hw, uint16_t msix_idx,
+   struct sssnic_msix_attr *attr)
+{
+   int ret;
+   struct sssnic_msg msg;
+   struct sssnic_msix_ctrl_cmd cmd;
+   struct sssnic_msix_attr tmp;
+   uint32_t cmd_len;
+
+   ret = sssnic_msix_attr_get(hw, msix_idx, &tmp);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to get interrupt configuration");
+   return ret;
+   }
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.func_id = SSSNIC_FUNC_IDX(hw);
+   cmd.opcode = SSSNIC_CMD_OPCODE_SET;
+   cmd.idx = msix_idx;
+   cmd.lli_credit = tmp.lli_credit;
+   cmd.lli_timer = tmp.lli_timer;
+   cmd.pending_count = tmp.pending_limit;
+   cmd.coalescing_timer = tmp.coalescing_timer;
+   cmd.resend_timer = tmp.resend_timer;
+   if (attr->lli_set != 0) {
+   cmd.lli_credit = attr->lli_credit;
+   cmd.lli_timer = attr->lli_timer;
+   }
+   if (attr->coalescing_set != 0) {
+   cmd.pending_count = attr->pending_limit;
+   cmd.coalescing_timer = attr->coalescing_timer;
+   cmd.resend_timer = attr->resend_timer;
+   }
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len, SSSNIC_MSIX_CTRL_CMD,
+   SSSNIC_MPU_FUNC_IDX, SSSNIC_COMM_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to MSIX_CTRL_CMD, len=%u, status=%u",
+   cmd_len, cmd.common.statu

[PATCH v3 11/32] net/sssnic: add dev MAC ops

2023-08-31 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 doc/guides/nics/features/sssnic.ini  |   2 +
 drivers/net/sssnic/base/sssnic_api.c | 174 +
 drivers/net/sssnic/base/sssnic_api.h |   4 +
 drivers/net/sssnic/base/sssnic_cmd.h |  25 +++
 drivers/net/sssnic/base/sssnic_hw.h  |   1 +
 drivers/net/sssnic/sssnic_ethdev.c   | 270 ++-
 drivers/net/sssnic/sssnic_ethdev.h   |   2 +
 7 files changed, 477 insertions(+), 1 deletion(-)

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index 6d9786db7e..602839d301 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -4,6 +4,8 @@
 ; Refer to default.ini for the full list of available PMD features.
 ;
 [Features]
+Unicast MAC filter   = Y
+Multicast MAC filter = Y
 Linux= Y
 ARMv8= Y
 x86-64   = Y
diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index bf0859cd63..76266dfbae 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -133,3 +133,177 @@ sssnic_capability_get(struct sssnic_hw *hw, struct 
sssnic_capability *capa)
 
return 0;
 }
+
+int
+sssnic_mac_addr_get(struct sssnic_hw *hw, uint8_t *addr)
+{
+   int ret;
+   struct sssnic_mac_addr_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+   uint16_t func;
+
+   if (hw == NULL || addr == NULL)
+   return -EINVAL;
+
+   if (SSSNIC_FUNC_TYPE(hw) == SSSNIC_FUNC_TYPE_VF)
+   func = SSSNIC_PF_FUNC_IDX(hw);
+   else
+   func = SSSNIC_MPU_FUNC_IDX;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd_len = sizeof(cmd);
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len, SSSNIC_GET_MAC_ADDR_CMD,
+   func, SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_GET_DEF_MAC_ADDR_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   rte_memcpy(addr, cmd.addr, 6);
+
+   return 0;
+}
+
+int
+sssnic_mac_addr_update(struct sssnic_hw *hw, uint8_t *new, uint8_t *old)
+{
+   int ret;
+   struct sssnic_mac_addr_update_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+   uint16_t func;
+
+   if (hw == NULL || new == NULL || old == NULL)
+   return -EINVAL;
+
+   if (SSSNIC_FUNC_TYPE(hw) == SSSNIC_FUNC_TYPE_VF)
+   func = SSSNIC_PF_FUNC_IDX(hw);
+   else
+   func = SSSNIC_MPU_FUNC_IDX;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd_len = sizeof(cmd);
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   rte_memcpy(cmd.new_addr, new, 6);
+   rte_memcpy(cmd.old_addr, old, 6);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_UPDATE_MAC_ADDR_CMD, func, SSSNIC_LAN_MODULE,
+   SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   if (cmd.common.status == SSSNIC_MAC_ADDR_CMD_STATUS_IGNORED) {
+   PMD_DRV_LOG(WARNING,
+   "MAC address operation is ignored");
+   return 0;
+   }
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_UPDATE_MAC_ADDR_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
+
+int
+sssnic_mac_addr_add(struct sssnic_hw *hw, uint8_t *addr)
+{
+   int ret;
+   struct sssnic_mac_addr_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+   uint16_t func;
+
+   if (hw == NULL || addr == NULL)
+   return -EINVAL;
+
+   if (SSSNIC_FUNC_TYPE(hw) == SSSNIC_FUNC_TYPE_VF)
+   func = SSSNIC_PF_FUNC_IDX(hw);
+   else
+   func = SSSNIC_MPU_FUNC_IDX;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd_len = sizeof(cmd);
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   rte_memcpy(cmd.addr, addr, 6);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len, SSSNIC_ADD_MAC_ADDR_CMD,
+   func, SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbo

[PATCH v3 13/32] net/sssnic: support link status event

2023-08-31 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Fixed 'EINVAL' undeclared.
---
 doc/guides/nics/features/sssnic.ini|   1 +
 drivers/net/sssnic/base/meson.build|   1 +
 drivers/net/sssnic/base/sssnic_exception.c | 116 +
 drivers/net/sssnic/base/sssnic_exception.h |  10 ++
 drivers/net/sssnic/base/sssnic_hw.c|  46 
 drivers/net/sssnic/base/sssnic_hw.h|  22 
 drivers/net/sssnic/sssnic_ethdev.c |   6 +-
 drivers/net/sssnic/sssnic_ethdev_link.c|  98 +
 drivers/net/sssnic/sssnic_ethdev_link.h|   2 +
 9 files changed, 301 insertions(+), 1 deletion(-)
 create mode 100644 drivers/net/sssnic/base/sssnic_exception.c
 create mode 100644 drivers/net/sssnic/base/sssnic_exception.h

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index a0688e70ef..82b527ba26 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -5,6 +5,7 @@
 ;
 [Features]
 Link status  = Y
+Link status event= Y
 Unicast MAC filter   = Y
 Multicast MAC filter = Y
 Linux= Y
diff --git a/drivers/net/sssnic/base/meson.build 
b/drivers/net/sssnic/base/meson.build
index e93ca7b24b..cf0c177cab 100644
--- a/drivers/net/sssnic/base/meson.build
+++ b/drivers/net/sssnic/base/meson.build
@@ -9,6 +9,7 @@ sources = [
 'sssnic_workq.c',
 'sssnic_ctrlq.c',
 'sssnic_api.c',
+   'sssnic_exception.c',
 ]
 
 c_args = cflags
diff --git a/drivers/net/sssnic/base/sssnic_exception.c 
b/drivers/net/sssnic/base/sssnic_exception.c
new file mode 100644
index 00..738ca9c6cd
--- /dev/null
+++ b/drivers/net/sssnic/base/sssnic_exception.c
@@ -0,0 +1,116 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#include 
+#include 
+#include 
+
+#include "../sssnic_log.h"
+#include "sssnic_hw.h"
+#include "sssnic_reg.h"
+#include "sssnic_cmd.h"
+#include "sssnic_msg.h"
+#include "sssnic_eventq.h"
+#include "sssnic_mbox.h"
+#include "sssnic_exception.h"
+
+static void
+sssnic_link_event_msg_handle(struct sssnic_hw *hw, struct sssnic_msg *msg,
+   __rte_unused enum sssnic_msg_chann_id chan_id)
+{
+   struct sssnic_netif_link_status_get_cmd *cmd;
+   sssnic_link_event_cb_t *cb;
+   enum sssnic_link_status status;
+   void *priv;
+
+   cb = hw->link_event_handler.cb;
+   priv = hw->link_event_handler.priv;
+
+   cmd = (struct sssnic_netif_link_status_get_cmd *)msg->data_buf;
+   if (cb != NULL) {
+   if (cmd->status)
+   status = SSSNIC_LINK_STATUS_UP;
+   else
+   status = SSSNIC_LINK_STATUS_DOWN;
+
+   PMD_DRV_LOG(DEBUG, "Received sssnic%u link %s event",
+   SSSNIC_ETH_PORT_ID(hw), status ? "up" : "down");
+
+   return cb(cmd->port, status, priv);
+   }
+
+   PMD_DRV_LOG(WARNING, "Link event was not processed, port=%u, status=%u",
+   cmd->port, cmd->status);
+}
+
+static void
+sssnic_netif_vf_link_status_msg_handle(struct sssnic_hw *hw,
+   struct sssnic_msg *msg)
+{
+   int ret;
+
+   if (msg->ack != 0) {
+   msg->ack = 0;
+   msg->type = SSSNIC_MSG_TYPE_RESP;
+   msg->data_len = 1; /* indicate no data */
+   ret = sssnic_mbox_send(hw, msg, NULL, 0, 0);
+   if (ret != 0)
+   PMD_DRV_LOG(ERR,
+   "Failed to send VF link status response, 
ret=%d",
+   ret);
+   }
+}
+
+static void
+sssnic_netif_exception_msg_handle(struct sssnic_hw *hw, struct sssnic_msg *msg,
+   enum sssnic_msg_chann_id chan_id)
+{
+   if (msg->command == SSSNIC_GET_NETIF_LINK_STATUS_CMD) {
+   if (SSSNIC_FUNC_TYPE(hw) == SSSNIC_FUNC_TYPE_VF)
+   sssnic_netif_vf_link_status_msg_handle(hw, msg);
+
+   sssnic_link_event_msg_handle(hw, msg, chan_id);
+   return;
+   }
+
+   PMD_DRV_LOG(WARNING,
+   "Netif exception message was not processed, cmd=%u",
+   msg->command);
+}
+
+static int
+sssnic_exception_msg_process(struct sssnic_msg *msg,
+   enum sssnic_msg_chann_id chan_id, void *priv)
+{
+   struct sssnic_hw *hw = (struct sssnic_hw *)priv;
+
+   SSSNIC_DEBUG("command=%u, func=%u module=%u, type=%u, ack=%u, seq=%u, "
+"status=%u, id=%u data_buf=%p, data_len=%u",
+   msg->command, msg->func, msg->module, msg->type, msg->ack,
+   msg->seg, msg->status, msg->id, msg->data_buf, msg->data_len);
+
+   if (msg->module == SSSNIC_NETIF_MODULE) {
+   sssnic_netif_exception_msg_handle(hw, msg, chan_id);
+   return SSSNIC_MSG_DONE;
+   }
+
+   PMD_DRV_LOG(WARNING, "Exception message was not proce

[PATCH v3 12/32] net/sssnic: support dev link status

2023-08-31 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Removed error.h from including files.
---
 doc/guides/nics/features/sssnic.ini |   1 +
 drivers/net/sssnic/base/sssnic_api.c| 127 
 drivers/net/sssnic/base/sssnic_api.h|  14 +++
 drivers/net/sssnic/base/sssnic_cmd.h|  37 +++
 drivers/net/sssnic/meson.build  |   1 +
 drivers/net/sssnic/sssnic_ethdev.c  |   4 +
 drivers/net/sssnic/sssnic_ethdev_link.c | 111 +
 drivers/net/sssnic/sssnic_ethdev_link.h |  12 +++
 8 files changed, 307 insertions(+)
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_link.c
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_link.h

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index 602839d301..a0688e70ef 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -4,6 +4,7 @@
 ; Refer to default.ini for the full list of available PMD features.
 ;
 [Features]
+Link status  = Y
 Unicast MAC filter   = Y
 Multicast MAC filter = Y
 Linux= Y
diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index 76266dfbae..3bb31009c5 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -307,3 +307,130 @@ sssnic_mac_addr_del(struct sssnic_hw *hw, uint8_t *addr)
 
return 0;
 }
+
+int
+sssnic_netif_link_status_get(struct sssnic_hw *hw, uint8_t *status)
+{
+   int ret;
+   struct sssnic_netif_link_status_get_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+   uint16_t func;
+
+   if (hw == NULL || status == NULL)
+   return -EINVAL;
+
+   if (SSSNIC_FUNC_TYPE(hw) == SSSNIC_FUNC_TYPE_VF)
+   func = SSSNIC_PF_FUNC_IDX(hw);
+   else
+   func = SSSNIC_MPU_FUNC_IDX;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.port = SSSNIC_PHY_PORT(hw);
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_GET_NETIF_LINK_STATUS_CMD, func, SSSNIC_NETIF_MODULE,
+   SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_GET_NETIF_LINK_STATUS_CMD, 
len=%u, status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   *status = cmd.status;
+
+   return 0;
+}
+
+int
+sssnic_netif_link_info_get(struct sssnic_hw *hw,
+   struct sssnic_netif_link_info *info)
+{
+   int ret;
+   struct sssnic_netif_link_info_get_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   if (hw == NULL || info == NULL)
+   return -EINVAL;
+
+   ret = sssnic_netif_link_status_get(hw, &info->status);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to get netif link state!");
+   return ret;
+   }
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.port = SSSNIC_PHY_PORT(hw);
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_GET_NETIF_LINK_INFO_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_NETIF_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_GET_NETIF_LINK_INFO_CMD, 
len=%u, status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   info->speed = cmd.speed;
+   info->duplex = cmd.duplex;
+   info->fec = cmd.fec;
+   info->type = cmd.type;
+   info->autoneg_capa = cmd.autoneg_capa;
+   info->autoneg = cmd.autoneg;
+
+   return 0;
+}
+
+int
+sssnic_netif_enable_set(struct sssnic_hw *hw, uint8_t state)
+{
+   int ret;
+   struct sssnic_netif_enable_set_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   if (hw == NULL)
+   return -EINVAL;
+
+   if (SSSNIC_FUNC_TYPE(hw) == SSSNIC_FUNC_TYPE_VF)
+   return 0;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   if (state != 0)
+   cmd.flag = SSSNIC_SET_NETIF_ENABLE_CMD_FLAG_RX_EN |
+  SSSNIC_SET_NETIF_ENABLE_CMD_FLAG_TX_EN;
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_SET_NETIF_ENABLE_CMD, SSSNIC_MPU_FUNC_ID

[PATCH v3 15/32] net/sssnic: support Tx queue setup and release

2023-08-31 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Removed error.h from including files.
---
 drivers/net/sssnic/meson.build|   1 +
 drivers/net/sssnic/sssnic_ethdev.c|   4 +
 drivers/net/sssnic/sssnic_ethdev.h|   1 +
 drivers/net/sssnic/sssnic_ethdev_tx.c | 354 ++
 drivers/net/sssnic/sssnic_ethdev_tx.h |  27 ++
 5 files changed, 387 insertions(+)
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_tx.c
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_tx.h

diff --git a/drivers/net/sssnic/meson.build b/drivers/net/sssnic/meson.build
index 7c3516a279..0c6e21310d 100644
--- a/drivers/net/sssnic/meson.build
+++ b/drivers/net/sssnic/meson.build
@@ -20,4 +20,5 @@ sources = files(
 'sssnic_ethdev.c',
 'sssnic_ethdev_link.c',
 'sssnic_ethdev_rx.c',
+'sssnic_ethdev_tx.c',
 )
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index f98510a55d..732fddfcf7 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -11,6 +11,7 @@
 #include "sssnic_ethdev.h"
 #include "sssnic_ethdev_link.h"
 #include "sssnic_ethdev_rx.h"
+#include "sssnic_ethdev_tx.h"
 
 static int
 sssnic_ethdev_infos_get(struct rte_eth_dev *ethdev,
@@ -336,6 +337,7 @@ sssnic_ethdev_release(struct rte_eth_dev *ethdev)
struct sssnic_hw *hw = SSSNIC_ETHDEV_TO_HW(ethdev);
 
sssnic_ethdev_link_intr_disable(ethdev);
+   sssnic_ethdev_tx_queue_all_release(ethdev);
sssnic_ethdev_rx_queue_all_release(ethdev);
sssnic_ethdev_mac_addrs_clean(ethdev);
sssnic_hw_shutdown(hw);
@@ -354,6 +356,8 @@ static const struct eth_dev_ops sssnic_ethdev_ops = {
.set_mc_addr_list = sssnic_ethdev_set_mc_addr_list,
.rx_queue_setup = sssnic_ethdev_rx_queue_setup,
.rx_queue_release = sssnic_ethdev_rx_queue_release,
+   .tx_queue_setup = sssnic_ethdev_tx_queue_setup,
+   .tx_queue_release = sssnic_ethdev_tx_queue_release,
 };
 
 static int
diff --git a/drivers/net/sssnic/sssnic_ethdev.h 
b/drivers/net/sssnic/sssnic_ethdev.h
index 51740413c6..ab832d179f 100644
--- a/drivers/net/sssnic/sssnic_ethdev.h
+++ b/drivers/net/sssnic/sssnic_ethdev.h
@@ -57,6 +57,7 @@
 #define SSSNIC_ETHDEV_MAX_NUM_MC_MAC 2048
 
 #define SSSNIC_ETHDEV_DEF_RX_FREE_THRESH 32
+#define SSSNIC_ETHDEV_DEF_TX_FREE_THRESH 32
 
 struct sssnic_netdev {
void *hw;
diff --git a/drivers/net/sssnic/sssnic_ethdev_tx.c 
b/drivers/net/sssnic/sssnic_ethdev_tx.c
new file mode 100644
index 00..d77cbc8647
--- /dev/null
+++ b/drivers/net/sssnic/sssnic_ethdev_tx.c
@@ -0,0 +1,354 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#include 
+#include 
+#include 
+
+#include "sssnic_log.h"
+#include "sssnic_ethdev.h"
+#include "sssnic_ethdev_tx.h"
+#include "base/sssnic_hw.h"
+#include "base/sssnic_workq.h"
+#include "base/sssnic_api.h"
+#include "base/sssnic_misc.h"
+
+/* Hardware format of tx desc */
+struct sssnic_ethdev_tx_desc {
+   union {
+   uint32_t dw0;
+   struct {
+   /* length of the first tx seg data */
+   uint32_t data_len : 18;
+   uint32_t dw0_resvd0 : 1;
+   /* number of tx segments in tx entry */
+   uint32_t num_segs : 8;
+   /* offload desc enable */
+   uint32_t offload_en : 1;
+   /* data format, use SGL if 0 else inline */
+   uint32_t data_fmt : 1;
+   /* DN, always set 0  */
+   uint32_t dw0_resvd1 : 1;
+   /* refer sssnic_ethdev_txq_entry_type */
+   uint32_t entry_type : 1;
+   uint32_t owner : 1;
+   };
+   };
+   union {
+   uint32_t dw1;
+   struct {
+   uint32_t pkt_type : 2;
+   uint32_t payload_off : 8;
+   /* UFO, not used, always set 0 */
+   uint32_t dw1_resvd0 : 1;
+   uint32_t tso_en : 1;
+   /* TCP/UDP checksum offload enable flag */
+   uint32_t csum_en : 1;
+   uint32_t mss : 14;
+   uint32_t sctp_crc_en : 1;
+   /* set 1 if entry type is not compact else set 0 */
+   uint32_t uc : 1;
+   /* PRI, not used, always set 0  */
+   uint32_t dw1_resvd1 : 3;
+   };
+   };
+   union {
+   uint32_t dw2;
+   /* high 32bit of  DMA address of the first tx seg data */
+   uint32_t data_addr_hi;
+   };
+   union {
+   uint32_t dw3;
+   /* low 32bit of DMA address of the first tx 

[PATCH v3 14/32] net/sssnic: support Rx queue setup and release

2023-08-31 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Removed error.h from including files.
---
 drivers/net/sssnic/meson.build|   1 +
 drivers/net/sssnic/sssnic_ethdev.c|   4 +
 drivers/net/sssnic/sssnic_ethdev.h|   2 +
 drivers/net/sssnic/sssnic_ethdev_rx.c | 420 ++
 drivers/net/sssnic/sssnic_ethdev_rx.h |  24 ++
 5 files changed, 451 insertions(+)
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_rx.c
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_rx.h

diff --git a/drivers/net/sssnic/meson.build b/drivers/net/sssnic/meson.build
index 12e967722a..7c3516a279 100644
--- a/drivers/net/sssnic/meson.build
+++ b/drivers/net/sssnic/meson.build
@@ -19,4 +19,5 @@ objs = [base_objs]
 sources = files(
 'sssnic_ethdev.c',
 'sssnic_ethdev_link.c',
+'sssnic_ethdev_rx.c',
 )
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index 1e2b5c0450..f98510a55d 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -10,6 +10,7 @@
 #include "base/sssnic_api.h"
 #include "sssnic_ethdev.h"
 #include "sssnic_ethdev_link.h"
+#include "sssnic_ethdev_rx.h"
 
 static int
 sssnic_ethdev_infos_get(struct rte_eth_dev *ethdev,
@@ -335,6 +336,7 @@ sssnic_ethdev_release(struct rte_eth_dev *ethdev)
struct sssnic_hw *hw = SSSNIC_ETHDEV_TO_HW(ethdev);
 
sssnic_ethdev_link_intr_disable(ethdev);
+   sssnic_ethdev_rx_queue_all_release(ethdev);
sssnic_ethdev_mac_addrs_clean(ethdev);
sssnic_hw_shutdown(hw);
rte_free(hw);
@@ -350,6 +352,8 @@ static const struct eth_dev_ops sssnic_ethdev_ops = {
.mac_addr_remove = sssnic_ethdev_mac_addr_remove,
.mac_addr_add = sssnic_ethdev_mac_addr_add,
.set_mc_addr_list = sssnic_ethdev_set_mc_addr_list,
+   .rx_queue_setup = sssnic_ethdev_rx_queue_setup,
+   .rx_queue_release = sssnic_ethdev_rx_queue_release,
 };
 
 static int
diff --git a/drivers/net/sssnic/sssnic_ethdev.h 
b/drivers/net/sssnic/sssnic_ethdev.h
index 636b3fd04c..51740413c6 100644
--- a/drivers/net/sssnic/sssnic_ethdev.h
+++ b/drivers/net/sssnic/sssnic_ethdev.h
@@ -56,6 +56,8 @@
 #define SSSNIC_ETHDEV_MAX_NUM_UC_MAC 128
 #define SSSNIC_ETHDEV_MAX_NUM_MC_MAC 2048
 
+#define SSSNIC_ETHDEV_DEF_RX_FREE_THRESH 32
+
 struct sssnic_netdev {
void *hw;
struct rte_ether_addr *mcast_addrs;
diff --git a/drivers/net/sssnic/sssnic_ethdev_rx.c 
b/drivers/net/sssnic/sssnic_ethdev_rx.c
new file mode 100644
index 00..0f489cf82f
--- /dev/null
+++ b/drivers/net/sssnic/sssnic_ethdev_rx.c
@@ -0,0 +1,420 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include "sssnic_log.h"
+#include "sssnic_ethdev.h"
+#include "sssnic_ethdev_rx.h"
+#include "base/sssnic_hw.h"
+#include "base/sssnic_workq.h"
+#include "base/sssnic_api.h"
+#include "base/sssnic_misc.h"
+
+/* hardware format of rx descriptor*/
+struct sssnic_ethdev_rx_desc {
+   /* status field */
+   union {
+   uint32_t dword0;
+   struct {
+   uint32_t ip_csum_err : 1;
+   uint32_t tcp_csum_err : 1;
+   uint32_t udp_csum_err : 1;
+   uint32_t igmp_csum_err : 1;
+   uint32_t icmpv4_csum_err : 1;
+   uint32_t icmpv6_csum_err : 1;
+   uint32_t sctp_crc_err : 1;
+   uint32_t hw_crc_err : 1;
+   uint32_t other_err : 1;
+   uint32_t err_resvd0 : 7;
+   uint32_t lro_num : 8;
+   uint32_t resvd1 : 1;
+   uint32_t lro_push : 1;
+   uint32_t lro_enter : 1;
+   uint32_t lro_intr : 1;
+   uint32_t flush : 1;
+   uint32_t decry : 1;
+   uint32_t bp_en : 1;
+   uint32_t done : 1;
+   };
+   struct {
+   uint32_t status_err : 16;
+   uint32_t status_rest : 16;
+   };
+   };
+
+   /* VLAN and length field */
+   union {
+   uint32_t dword1;
+   struct {
+   uint32_t vlan : 16;
+   uint32_t len : 16;
+   };
+   };
+
+   /* offload field */
+   union {
+   uint32_t dword2;
+   struct {
+   uint32_t pkt_type : 12;
+   uint32_t dword2_resvd0 : 9;
+   uint32_t vlan_en : 1;
+   uint32_t dword2_resvd1 : 2;
+   uint32_t rss_type : 8;
+   };
+   };
+
+   /* rss hash field */
+   union {
+   uint32_t dword3;
+  

[PATCH v3 17/32] net/sssnic: support Tx queue start and stop

2023-08-31 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 doc/guides/nics/features/sssnic.ini   |   1 +
 drivers/net/sssnic/sssnic_ethdev.c|   2 +
 drivers/net/sssnic/sssnic_ethdev_tx.c | 155 ++
 drivers/net/sssnic/sssnic_ethdev_tx.h |   4 +
 4 files changed, 162 insertions(+)

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index 82b527ba26..b75c68cb33 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -6,6 +6,7 @@
 [Features]
 Link status  = Y
 Link status event= Y
+Queue start/stop = Y
 Unicast MAC filter   = Y
 Multicast MAC filter = Y
 Linux= Y
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index 208f0db402..8a18f25889 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -360,6 +360,8 @@ static const struct eth_dev_ops sssnic_ethdev_ops = {
.tx_queue_release = sssnic_ethdev_tx_queue_release,
.rx_queue_start = sssnic_ethdev_rx_queue_start,
.rx_queue_stop = sssnic_ethdev_rx_queue_stop,
+   .tx_queue_start = sssnic_ethdev_tx_queue_start,
+   .tx_queue_stop = sssnic_ethdev_tx_queue_stop,
 };
 
 static int
diff --git a/drivers/net/sssnic/sssnic_ethdev_tx.c 
b/drivers/net/sssnic/sssnic_ethdev_tx.c
index d77cbc8647..392b877974 100644
--- a/drivers/net/sssnic/sssnic_ethdev_tx.c
+++ b/drivers/net/sssnic/sssnic_ethdev_tx.c
@@ -191,6 +191,18 @@ sssnic_ethdev_txq_ci_get(struct sssnic_ethdev_txq *txq)
return sssnic_workq_ci_get(txq->workq);
 }
 
+static inline int
+sssnic_ethdev_txq_pi_get(struct sssnic_ethdev_txq *txq)
+{
+   return sssnic_workq_pi_get(txq->workq);
+}
+
+static inline uint16_t
+sssnic_ethdev_txq_hw_ci_get(struct sssnic_ethdev_txq *txq)
+{
+   return *txq->hw_ci_addr & txq->idx_mask;
+}
+
 static inline void
 sssnic_ethdev_txq_consume(struct sssnic_ethdev_txq *txq, uint16_t num_entries)
 {
@@ -352,3 +364,146 @@ sssnic_ethdev_tx_queue_all_release(struct rte_eth_dev 
*ethdev)
for (qid = 0; qid < ethdev->data->nb_tx_queues; qid++)
sssnic_ethdev_tx_queue_release(ethdev, qid);
 }
+
+#define SSSNIC_ETHDEV_TX_FREE_BULK 64
+static inline int
+sssnic_ethdev_txq_pktmbufs_cleanup(struct sssnic_ethdev_txq *txq)
+{
+   struct sssnic_ethdev_tx_entry *txe;
+   struct rte_mbuf *free_pkts[SSSNIC_ETHDEV_TX_FREE_BULK];
+   uint16_t num_free_pkts = 0;
+   uint16_t hw_ci, ci, id_mask;
+   uint16_t count = 0;
+   int num_entries;
+
+   ci = sssnic_ethdev_txq_ci_get(txq);
+   hw_ci = sssnic_ethdev_txq_hw_ci_get(txq);
+   id_mask = txq->idx_mask;
+   num_entries = sssnic_ethdev_txq_num_used_entries(txq);
+
+   while (num_entries > 0) {
+   txe = &txq->txe[ci];
+
+   /* HW has not consumed enough entries of current packet */
+   if (((hw_ci - ci) & id_mask) < txe->num_workq_entries)
+   break;
+
+   num_entries -= txe->num_workq_entries;
+   count += txe->num_workq_entries;
+   ci = (ci + txe->num_workq_entries) & id_mask;
+
+   if (likely(txe->pktmbuf->nb_segs == 1)) {
+   struct rte_mbuf *pkt =
+   rte_pktmbuf_prefree_seg(txe->pktmbuf);
+   txe->pktmbuf = NULL;
+
+   if (unlikely(pkt == NULL))
+   continue;
+
+   free_pkts[num_free_pkts++] = pkt;
+   if (unlikely(pkt->pool != free_pkts[0]->pool ||
+num_free_pkts >=
+SSSNIC_ETHDEV_TX_FREE_BULK)) {
+   rte_mempool_put_bulk(free_pkts[0]->pool,
+   (void **)free_pkts, num_free_pkts - 1);
+   num_free_pkts = 0;
+   free_pkts[num_free_pkts++] = pkt;
+   }
+   } else {
+   rte_pktmbuf_free(txe->pktmbuf);
+   txe->pktmbuf = NULL;
+   }
+   }
+
+   if (num_free_pkts > 0)
+   rte_mempool_put_bulk(free_pkts[0]->pool, (void **)free_pkts,
+   num_free_pkts);
+
+   sssnic_ethdev_txq_consume(txq, count);
+
+   return count;
+}
+
+#define SSSNIC_ETHDEV_TXQ_FUSH_TIMEOUT 3000 /* 3 seconds */
+static int
+sssnic_ethdev_txq_flush(struct sssnic_ethdev_txq *txq)
+{
+   uint64_t timeout;
+   uint16_t used_entries;
+
+   timeout = rte_get_timer_cycles() +
+ rte_get_timer_hz() * SSSNIC_ETHDEV_TXQ_FUSH_TIMEOUT / 1000;
+
+   do {
+   sssnic_ethdev_txq_pktmbufs_cleanup(txq);
+   used_entries = sssnic_ethdev_txq_num_used_entries(txq);
+   if (used_entries == 0)
+   return 0;
+
+

[PATCH v3 18/32] net/sssnic: add Rx interrupt support

2023-08-31 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 doc/guides/nics/features/sssnic.ini   |   1 +
 drivers/net/sssnic/base/sssnic_hw.c   |  14 +++
 drivers/net/sssnic/base/sssnic_hw.h   |   2 +
 drivers/net/sssnic/sssnic_ethdev.c|   2 +
 drivers/net/sssnic/sssnic_ethdev_rx.c | 135 ++
 drivers/net/sssnic/sssnic_ethdev_rx.h |   6 ++
 6 files changed, 160 insertions(+)

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index b75c68cb33..e3b8166629 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -7,6 +7,7 @@
 Link status  = Y
 Link status event= Y
 Queue start/stop = Y
+Rx interrupt = Y
 Unicast MAC filter   = Y
 Multicast MAC filter = Y
 Linux= Y
diff --git a/drivers/net/sssnic/base/sssnic_hw.c 
b/drivers/net/sssnic/base/sssnic_hw.c
index 82eb4ea295..651a0aa7ef 100644
--- a/drivers/net/sssnic/base/sssnic_hw.c
+++ b/drivers/net/sssnic/base/sssnic_hw.c
@@ -145,6 +145,20 @@ sssnic_msix_resend_disable(struct sssnic_hw *hw, uint16_t 
msix_id)
sssnic_cfg_reg_write(hw, SSSNIC_MSIX_CTRL_REG, reg.u32);
 }
 
+void
+sssnic_msix_auto_mask_set(struct sssnic_hw *hw, uint16_t msix_id, int state)
+{
+   struct sssnic_msix_ctrl_reg reg;
+
+   reg.u32 = 0;
+   if (state == SSSNIC_MSIX_ENABLE)
+   reg.auto_msk_set = 1;
+   else
+   reg.auto_msk_clr = 1;
+   reg.msxi_idx = msix_id;
+   sssnic_cfg_reg_write(hw, SSSNIC_MSIX_CTRL_REG, reg.u32);
+}
+
 static void
 sssnic_pf_status_set(struct sssnic_hw *hw, enum sssnic_pf_status status)
 {
diff --git a/drivers/net/sssnic/base/sssnic_hw.h 
b/drivers/net/sssnic/base/sssnic_hw.h
index e25f5595e6..4820212543 100644
--- a/drivers/net/sssnic/base/sssnic_hw.h
+++ b/drivers/net/sssnic/base/sssnic_hw.h
@@ -100,6 +100,8 @@ int sssnic_hw_init(struct sssnic_hw *hw);
 void sssnic_hw_shutdown(struct sssnic_hw *hw);
 void sssnic_msix_state_set(struct sssnic_hw *hw, uint16_t msix_id, int state);
 void sssnic_msix_resend_disable(struct sssnic_hw *hw, uint16_t msix_id);
+void sssnic_msix_auto_mask_set(struct sssnic_hw *hw, uint16_t msix_id,
+   int state);
 int sssnic_link_event_callback_register(struct sssnic_hw *hw,
sssnic_link_event_cb_t *cb, void *priv);
 void sssnic_link_event_callback_unregister(struct sssnic_hw *hw);
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index 8a18f25889..35bb26a0b1 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -362,6 +362,8 @@ static const struct eth_dev_ops sssnic_ethdev_ops = {
.rx_queue_stop = sssnic_ethdev_rx_queue_stop,
.tx_queue_start = sssnic_ethdev_tx_queue_start,
.tx_queue_stop = sssnic_ethdev_tx_queue_stop,
+   .rx_queue_intr_enable = sssnic_ethdev_rx_queue_intr_enable,
+   .rx_queue_intr_disable = sssnic_ethdev_rx_queue_intr_disable,
 };
 
 static int
diff --git a/drivers/net/sssnic/sssnic_ethdev_rx.c 
b/drivers/net/sssnic/sssnic_ethdev_rx.c
index d8429e734d..9c1b2f20d1 100644
--- a/drivers/net/sssnic/sssnic_ethdev_rx.c
+++ b/drivers/net/sssnic/sssnic_ethdev_rx.c
@@ -136,6 +136,12 @@ static const uint16_t sssnic_ethdev_rx_buf_size_tbl[] = { 
32, 64, 96, 128, 192,
 /* Doorbell offset 8192 */
 #define SSSNIC_ETHDEV_RXQ_DB_OFFSET 0x2000
 
+#define SSSNIC_ETHDEV_RX_MSIX_ID_START 1
+#define SSSNIC_ETHDEV_RX_MSIX_ID_INVAL 0
+#define SSSNIC_ETHDEV_RX_MSIX_PENDING_LIMIT 2
+#define SSSNIC_ETHDEV_RX_MSIX_COALESCING_TIMER 2
+#define SSSNIC_ETHDEV_RX_MSIX_RESNEDING_TIMER 7
+
 struct sssnic_ethdev_rxq_doorbell {
union {
uint64_t u64;
@@ -750,3 +756,132 @@ sssnic_ethdev_rx_queue_all_stop(struct rte_eth_dev 
*ethdev)
 
return 0;
 }
+
+static int
+sssinc_ethdev_rxq_intr_attr_init(struct sssnic_ethdev_rxq *rxq)
+{
+   int ret;
+   struct sssnic_hw *hw = SSSNIC_ETHDEV_TO_HW(rxq->ethdev);
+   struct sssnic_msix_attr attr;
+
+   attr.lli_set = 0;
+   attr.coalescing_set = 1;
+   attr.pending_limit = SSSNIC_ETHDEV_RX_MSIX_PENDING_LIMIT;
+   attr.coalescing_timer = SSSNIC_ETHDEV_RX_MSIX_COALESCING_TIMER;
+   attr.resend_timer = SSSNIC_ETHDEV_RX_MSIX_RESNEDING_TIMER;
+
+   ret = sssnic_msix_attr_set(hw, rxq->intr.msix_id, &attr);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to set msxi attributes");
+   return ret;
+   }
+
+   return 0;
+}
+
+int
+sssnic_ethdev_rx_queue_intr_enable(struct rte_eth_dev *ethdev, uint16_t qid)
+{
+   struct sssnic_ethdev_rxq *rxq = ethdev->data->rx_queues[qid];
+   struct sssnic_hw *hw = SSSNIC_ETHDEV_TO_HW(ethdev);
+
+   if (rxq->intr.enable)
+   return 0;
+
+   sssnic_msix_auto_mask_set(hw, rxq->intr.msix_id, SSSNIC_MSIX_ENABLE);
+   sssnic_msix_state_set(hw, rxq->intr.msix_id, SSSNIC_MSIX_ENABLE);
+   rxq->intr.enable = 1;
+
+   return 0;
+}
+

[PATCH v3 19/32] net/sssnic: support dev start and stop

2023-08-31 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/base/sssnic_api.c  | 508 ++
 drivers/net/sssnic/base/sssnic_api.h  | 257 +
 drivers/net/sssnic/base/sssnic_cmd.h  | 100 +
 drivers/net/sssnic/base/sssnic_misc.h |  34 ++
 drivers/net/sssnic/sssnic_ethdev.c| 284 ++
 drivers/net/sssnic/sssnic_ethdev.h|  21 ++
 drivers/net/sssnic/sssnic_ethdev_rx.c | 270 +-
 drivers/net/sssnic/sssnic_ethdev_rx.h |   8 +
 drivers/net/sssnic/sssnic_ethdev_tx.c | 163 +
 drivers/net/sssnic/sssnic_ethdev_tx.h |   6 +
 10 files changed, 1650 insertions(+), 1 deletion(-)

diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index 3050d573bf..81020387bd 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -13,6 +13,7 @@
 #include "sssnic_mbox.h"
 #include "sssnic_ctrlq.h"
 #include "sssnic_api.h"
+#include "sssnic_misc.h"
 
 int
 sssnic_msix_attr_get(struct sssnic_hw *hw, uint16_t msix_idx,
@@ -497,3 +498,510 @@ sssnic_rxq_flush(struct sssnic_hw *hw, uint16_t qid)
 
return 0;
 }
+
+static int
+sssnic_rxtx_size_set(struct sssnic_hw *hw, uint16_t rx_size, uint16_t tx_size,
+   uint32_t flags)
+{
+   int ret;
+   struct sssnic_rxtx_size_set_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   if (hw == NULL)
+   return -EINVAL;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   cmd.rx_size = rx_size;
+   cmd.tx_size = tx_size;
+   cmd.flags = flags;
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_SET_PORT_RXTX_SIZE_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_SET_PORT_RXTX_SIZE_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
+
+int
+sssnic_rxtx_max_size_init(struct sssnic_hw *hw, uint16_t rx_size,
+   uint16_t tx_size)
+{
+   return sssnic_rxtx_size_set(hw, rx_size, tx_size,
+   SSSNIC_CMD_INIT_RXTX_SIZE_FLAG | SSSNIC_CMD_SET_RX_SIZE_FLAG |
+   SSSNIC_CMD_SET_TX_SIZE_FLAG);
+}
+
+int
+sssnic_tx_max_size_set(struct sssnic_hw *hw, uint16_t tx_size)
+{
+   return sssnic_rxtx_size_set(hw, 0, tx_size,
+   SSSNIC_CMD_SET_TX_SIZE_FLAG);
+}
+
+int
+sssnic_port_features_get(struct sssnic_hw *hw, uint64_t *features)
+{
+   int ret;
+   struct sssnic_port_feature_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   cmd.opcode = SSSNIC_CMD_OPCODE_GET;
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len, SSSNIC_PORT_FEATURE_CMD,
+   SSSNIC_MPU_FUNC_IDX, SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_PORT_FEATURE_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   *features = cmd.features;
+
+   return 0;
+}
+
+int
+sssnic_port_features_set(struct sssnic_hw *hw, uint64_t features)
+{
+   int ret;
+   struct sssnic_port_feature_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   cmd.features = features;
+   cmd.opcode = SSSNIC_CMD_OPCODE_SET;
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len, SSSNIC_PORT_FEATURE_CMD,
+   SSSNIC_MPU_FUNC_IDX, SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_PORT_FEATURE_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
+
+#define SSSNIC_MAX_NUM_RXTXQ_CTX_SET_IN_BULK   

[PATCH v3 20/32] net/sssnic: support dev close and reset

2023-08-31 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/sssnic_ethdev.c | 32 ++
 1 file changed, 32 insertions(+)

diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index 8201a1e3c4..b59c4fd3ad 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -13,6 +13,8 @@
 #include "sssnic_ethdev_rx.h"
 #include "sssnic_ethdev_tx.h"
 
+static int sssnic_ethdev_init(struct rte_eth_dev *ethdev);
+
 static int
 sssnic_ethdev_infos_get(struct rte_eth_dev *ethdev,
struct rte_eth_dev_info *devinfo)
@@ -622,9 +624,39 @@ sssnic_ethdev_stop(struct rte_eth_dev *ethdev)
return 0;
 }
 
+static int
+sssnic_ethdev_close(struct rte_eth_dev *ethdev)
+{
+   sssnic_ethdev_release(ethdev);
+
+   PMD_DRV_LOG(INFO, "Port %u is closed", ethdev->data->port_id);
+
+   return 0;
+}
+
+static int
+sssnic_ethdev_reset(struct rte_eth_dev *ethdev)
+{
+   int ret;
+
+   sssnic_ethdev_release(ethdev);
+
+   ret = sssnic_ethdev_init(ethdev);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to initialize sssnic ethdev");
+   return ret;
+   }
+
+   PMD_DRV_LOG(INFO, "Port %u is reset", ethdev->data->port_id);
+
+   return 0;
+}
+
 static const struct eth_dev_ops sssnic_ethdev_ops = {
.dev_start = sssnic_ethdev_start,
.dev_stop = sssnic_ethdev_stop,
+   .dev_close = sssnic_ethdev_close,
+   .dev_reset = sssnic_ethdev_reset,
.dev_set_link_up = sssnic_ethdev_set_link_up,
.dev_set_link_down = sssnic_ethdev_set_link_down,
.link_update = sssnic_ethdev_link_update,
-- 
2.27.0



[PATCH v3 21/32] net/sssnic: add allmulticast and promiscuous ops

2023-08-31 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 doc/guides/nics/features/sssnic.ini |  2 +
 drivers/net/sssnic/sssnic_ethdev.c  | 72 +
 2 files changed, 74 insertions(+)

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index e3b8166629..359834ce4c 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -8,6 +8,8 @@ Link status  = Y
 Link status event= Y
 Queue start/stop = Y
 Rx interrupt = Y
+Promiscuous mode = Y
+Allmulticast mode= Y
 Unicast MAC filter   = Y
 Multicast MAC filter = Y
 Linux= Y
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index b59c4fd3ad..e1c805aeea 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -652,6 +652,74 @@ sssnic_ethdev_reset(struct rte_eth_dev *ethdev)
return 0;
 }
 
+static int
+sssnic_ethdev_allmulticast_enable(struct rte_eth_dev *ethdev)
+{
+   struct sssnic_netdev *netdev = SSSNIC_ETHDEV_PRIVATE(ethdev);
+   uint32_t rx_mode;
+   int ret;
+
+   rx_mode = netdev->rx_mode | SSSNIC_ETHDEV_RX_ALL_MCAST;
+   ret = sssnic_ethdev_rx_mode_set(ethdev, rx_mode);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to set rx_mode: %x", rx_mode);
+   return ret;
+   }
+
+   return 0;
+}
+
+static int
+sssnic_ethdev_allmulticast_disable(struct rte_eth_dev *ethdev)
+{
+   struct sssnic_netdev *netdev = SSSNIC_ETHDEV_PRIVATE(ethdev);
+   uint32_t rx_mode;
+   int ret;
+
+   rx_mode = netdev->rx_mode & (~SSSNIC_ETHDEV_RX_ALL_MCAST);
+   ret = sssnic_ethdev_rx_mode_set(ethdev, rx_mode);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to set rx_mode: %x", rx_mode);
+   return ret;
+   }
+
+   return 0;
+}
+
+static int
+sssnic_ethdev_promiscuous_enable(struct rte_eth_dev *ethdev)
+{
+   struct sssnic_netdev *netdev = SSSNIC_ETHDEV_PRIVATE(ethdev);
+   uint32_t rx_mode;
+   int ret;
+
+   rx_mode = netdev->rx_mode | SSSNIC_ETHDEV_RX_PROMISC;
+   ret = sssnic_ethdev_rx_mode_set(ethdev, rx_mode);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to set rx_mode: %x", rx_mode);
+   return ret;
+   }
+
+   return 0;
+}
+
+static int
+sssnic_ethdev_promiscuous_disable(struct rte_eth_dev *ethdev)
+{
+   struct sssnic_netdev *netdev = SSSNIC_ETHDEV_PRIVATE(ethdev);
+   uint32_t rx_mode;
+   int ret;
+
+   rx_mode = netdev->rx_mode & (~SSSNIC_ETHDEV_RX_PROMISC);
+   ret = sssnic_ethdev_rx_mode_set(ethdev, rx_mode);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to set rx_mode: %x", rx_mode);
+   return ret;
+   }
+
+   return 0;
+}
+
 static const struct eth_dev_ops sssnic_ethdev_ops = {
.dev_start = sssnic_ethdev_start,
.dev_stop = sssnic_ethdev_stop,
@@ -676,6 +744,10 @@ static const struct eth_dev_ops sssnic_ethdev_ops = {
.tx_queue_stop = sssnic_ethdev_tx_queue_stop,
.rx_queue_intr_enable = sssnic_ethdev_rx_queue_intr_enable,
.rx_queue_intr_disable = sssnic_ethdev_rx_queue_intr_disable,
+   .allmulticast_enable = sssnic_ethdev_allmulticast_enable,
+   .allmulticast_disable = sssnic_ethdev_allmulticast_disable,
+   .promiscuous_enable = sssnic_ethdev_promiscuous_enable,
+   .promiscuous_disable = sssnic_ethdev_promiscuous_disable,
 };
 
 static int
-- 
2.27.0



[PATCH v3 22/32] net/sssnic: add basic and extended stats ops

2023-08-31 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Removed error.h from including files.
---
 doc/guides/nics/features/sssnic.ini  |   3 +
 drivers/net/sssnic/base/sssnic_api.c | 154 +
 drivers/net/sssnic/base/sssnic_api.h | 116 +++
 drivers/net/sssnic/base/sssnic_cmd.h |  12 +
 drivers/net/sssnic/meson.build   |   1 +
 drivers/net/sssnic/sssnic_ethdev.c   |   6 +
 drivers/net/sssnic/sssnic_ethdev_rx.c|  30 ++
 drivers/net/sssnic/sssnic_ethdev_rx.h|   4 +
 drivers/net/sssnic/sssnic_ethdev_stats.c | 391 +++
 drivers/net/sssnic/sssnic_ethdev_stats.h |  18 ++
 drivers/net/sssnic/sssnic_ethdev_tx.c|  36 +++
 drivers/net/sssnic/sssnic_ethdev_tx.h|   4 +
 12 files changed, 775 insertions(+)
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_stats.c
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_stats.h

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index 359834ce4c..aba0b78c95 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -12,6 +12,9 @@ Promiscuous mode = Y
 Allmulticast mode= Y
 Unicast MAC filter   = Y
 Multicast MAC filter = Y
+Basic stats  = Y
+Extended stats   = Y
+Stats per queue  = Y
 Linux= Y
 ARMv8= Y
 x86-64   = Y
diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index 81020387bd..9f063112f2 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -1005,3 +1005,157 @@ sssnic_port_resource_clean(struct sssnic_hw *hw)
 
return 0;
 }
+
+int
+sssnic_port_stats_get(struct sssnic_hw *hw, struct sssnic_port_stats *stats)
+{
+   int ret;
+   struct sssnic_port_stats_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len, resp_len;
+   struct {
+   struct sssnic_cmd_common common;
+   uint32_t size;
+   uint32_t resvd0;
+   struct sssnic_port_stats stats;
+   uint64_t rsvd1[6];
+   } resp;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   cmd_len = sizeof(cmd);
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_GET_PORT_STATS_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   memset(&resp, 0, sizeof(resp));
+   resp_len = sizeof(resp);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&resp, &resp_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (resp_len == 0 || resp.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_GET_PORT_STATS_CMD, len=%u, 
status=%u",
+   resp_len, resp.common.status);
+   return -EIO;
+   }
+
+   memcpy(stats, &resp.stats, sizeof(resp.stats));
+
+   return 0;
+}
+
+int
+sssnic_port_stats_clear(struct sssnic_hw *hw)
+{
+   int ret;
+   struct sssnic_port_stats_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_CLEAR_PORT_STATS_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_CLEAN_PORT_RES_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
+
+int
+sssnic_mac_stats_get(struct sssnic_hw *hw, struct sssnic_mac_stats *stats)
+{
+   int ret;
+   struct sssnic_msg msg;
+   uint32_t cmd_len, resp_len;
+   struct sssnic_mac_stats_cmd cmd;
+   struct {
+   struct sssnic_cmd_common common;
+   struct sssnic_mac_stats stats;
+   uint64_t resvd[15];
+   } *resp;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.port = SSSNIC_PHY_PORT(hw);
+   cmd_len = sizeof(cmd);
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_GET_NETIF_MAC_STATS_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_NETIF_MODULE, SSSNIC_MSG_TYPE_REQ);
+
+   resp_len = sizeof(*resp);
+   resp = rte_zmalloc(NULL, resp_len, 0);
+   if (resp == NULL) {
+   PMD_DRV_LOG(ERR,
+   "Failed to alloc memory for mac stats response cmd");
+   return -ENOMEM;

[PATCH v3 23/32] net/sssnic: support Rx packet burst

2023-08-31 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Fixed wrong format of printing uint64_t.
---
 doc/guides/nics/features/sssnic.ini   |   2 +
 drivers/net/sssnic/sssnic_ethdev.c|   2 +
 drivers/net/sssnic/sssnic_ethdev_rx.c | 167 ++
 drivers/net/sssnic/sssnic_ethdev_rx.h |   2 +
 4 files changed, 173 insertions(+)

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index aba0b78c95..320ac4533d 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -8,6 +8,8 @@ Link status  = Y
 Link status event= Y
 Queue start/stop = Y
 Rx interrupt = Y
+Scattered Rx = Y
+LRO  = Y
 Promiscuous mode = Y
 Allmulticast mode= Y
 Unicast MAC filter   = Y
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index 99e6d6152a..021fabcbe5 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -769,6 +769,8 @@ sssnic_ethdev_init(struct rte_eth_dev *ethdev)
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
return 0;
 
+   ethdev->rx_pkt_burst = sssnic_ethdev_rx_pkt_burst;
+
netdev = SSSNIC_ETHDEV_PRIVATE(ethdev);
pci_dev = RTE_ETH_DEV_TO_PCI(ethdev);
hw = rte_zmalloc("sssnic_hw", sizeof(struct sssnic_hw), 0);
diff --git a/drivers/net/sssnic/sssnic_ethdev_rx.c 
b/drivers/net/sssnic/sssnic_ethdev_rx.c
index 66045f7a98..82e65f2482 100644
--- a/drivers/net/sssnic/sssnic_ethdev_rx.c
+++ b/drivers/net/sssnic/sssnic_ethdev_rx.c
@@ -1183,3 +1183,170 @@ sssnic_ethdev_rx_queue_stats_clear(struct rte_eth_dev 
*ethdev, uint16_t qid)
memset(&rxq->stats, 0, sizeof(rxq->stats));
}
 };
+
+static inline void
+sssnic_ethdev_rx_csum_offload(struct sssnic_ethdev_rxq *rxq,
+   struct rte_mbuf *rxm, volatile struct sssnic_ethdev_rx_desc *rxd)
+{
+   /* no errors */
+   if (likely(rxd->status_err == 0)) {
+   rxm->ol_flags |= RTE_MBUF_F_RX_IP_CKSUM_GOOD |
+RTE_MBUF_F_RX_L4_CKSUM_GOOD;
+   return;
+   }
+
+   /* bypass hw crc error*/
+   if (unlikely(rxd->hw_crc_err)) {
+   rxm->ol_flags |= RTE_MBUF_F_RX_IP_CKSUM_UNKNOWN;
+   return;
+   }
+
+   if (rxd->ip_csum_err) {
+   rxm->ol_flags |= RTE_MBUF_F_RX_IP_CKSUM_BAD;
+   rxq->stats.csum_errors++;
+   }
+
+   if (rxd->tcp_csum_err || rxd->udp_csum_err || rxd->sctp_crc_err) {
+   rxm->ol_flags |= RTE_MBUF_F_RX_L4_CKSUM_BAD;
+   rxq->stats.csum_errors++;
+   }
+
+   if (unlikely(rxd->other_err))
+   rxq->stats.other_errors++;
+}
+
+static inline void
+sssnic_ethdev_rx_vlan_offload(struct rte_mbuf *rxm,
+   volatile struct sssnic_ethdev_rx_desc *rxd)
+{
+   if (rxd->vlan_en == 0 || rxd->vlan == 0) {
+   rxm->vlan_tci = 0;
+   return;
+   }
+
+   rxm->vlan_tci = rxd->vlan;
+   rxm->ol_flags |= RTE_MBUF_F_RX_VLAN | RTE_MBUF_F_RX_VLAN_STRIPPED;
+}
+
+static inline void
+sssnic_ethdev_rx_segments(struct sssnic_ethdev_rxq *rxq, struct rte_mbuf *head,
+   uint32_t remain_size)
+{
+   struct sssnic_ethdev_rx_entry *rxe;
+   struct rte_mbuf *curr, *prev = head;
+   uint16_t rx_buf_size = rxq->rx_buf_size;
+   uint16_t ci;
+   uint32_t rx_size;
+
+   while (remain_size > 0) {
+   ci = sssnic_ethdev_rxq_ci_get(rxq);
+   rxe = &rxq->rxe[ci];
+   curr = rxe->pktmbuf;
+
+   sssnic_ethdev_rxq_consume(rxq, 1);
+
+   rx_size = RTE_MIN(remain_size, rx_buf_size);
+   remain_size -= rx_size;
+
+   curr->data_len = rx_size;
+   curr->next = NULL;
+   prev->next = curr;
+   prev = curr;
+   head->nb_segs++;
+   }
+}
+
+uint16_t
+sssnic_ethdev_rx_pkt_burst(void *rx_queue, struct rte_mbuf **rx_pkts,
+   uint16_t nb_pkts)
+{
+   struct sssnic_ethdev_rxq *rxq = (struct sssnic_ethdev_rxq *)rx_queue;
+   struct sssnic_ethdev_rx_entry *rxe;
+   struct rte_mbuf *rxm;
+   struct sssnic_ethdev_rx_desc *rxd, rx_desc;
+   uint16_t ci, idle_entries;
+   uint16_t rx_buf_size;
+   uint32_t rx_size;
+   uint64_t nb_rx = 0;
+   uint64_t rx_bytes = 0;
+
+   ci = sssnic_ethdev_rxq_ci_get(rxq);
+   rx_buf_size = rxq->rx_buf_size;
+   rxd = &rx_desc;
+
+   while (nb_rx < nb_pkts) {
+   rxd->dword0 = __atomic_load_n(&rxq->desc[ci].dword0,
+   __ATOMIC_ACQUIRE);
+   /* check rx done */
+   if (!rxd->done)
+   break;
+
+   rxd->dword1 = rxq->desc[ci].dword1;
+   rxd->dword2 = rxq->desc[ci].dword2;
+   rxd->dword3 = rxq->desc[ci].dword3;
+
+   /* reset rx d

[PATCH v3 25/32] net/sssnic: add RSS support

2023-08-31 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Removed error.h from including files.
---
 doc/guides/nics/features/sssnic.ini|   4 +
 drivers/net/sssnic/base/sssnic_api.c   | 338 ++
 drivers/net/sssnic/base/sssnic_api.h   |  36 +++
 drivers/net/sssnic/base/sssnic_cmd.h   |  58 
 drivers/net/sssnic/meson.build |   1 +
 drivers/net/sssnic/sssnic_ethdev.c |  16 ++
 drivers/net/sssnic/sssnic_ethdev.h |   2 +
 drivers/net/sssnic/sssnic_ethdev_rss.c | 377 +
 drivers/net/sssnic/sssnic_ethdev_rss.h |  20 ++
 drivers/net/sssnic/sssnic_ethdev_rx.c  |  13 +
 10 files changed, 865 insertions(+)
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_rss.c
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_rss.h

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index 7e6b70684a..020a9e7056 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -15,6 +15,10 @@ Promiscuous mode = Y
 Allmulticast mode= Y
 Unicast MAC filter   = Y
 Multicast MAC filter = Y
+RSS hash = Y
+RSS key update   = Y
+RSS reta update  = Y
+Inner RSS= Y
 L3 checksum offload  = Y
 L4 checksum offload  = Y
 Inner L3 checksum= Y
diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index 9f063112f2..32b24e841c 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -1159,3 +1159,341 @@ sssnic_mac_stats_clear(struct sssnic_hw *hw)
 
return 0;
 }
+
+int
+sssnic_rss_enable_set(struct sssnic_hw *hw, bool state)
+{
+   int ret;
+   struct sssnic_rss_enable_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.state = state ? 1 : 0;
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   cmd_len = sizeof(cmd);
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len, SSSNIC_ENABLE_RSS_CMD,
+   SSSNIC_MPU_FUNC_IDX, SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_ENABLE_RSS_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
+
+static int
+sssnic_rss_profile_config(struct sssnic_hw *hw, bool new)
+{
+   int ret;
+   struct sssnic_rss_profile_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.opcode = new ? SSSNIC_RSS_PROFILE_CMD_OP_NEW :
+SSSNIC_RSS_PROFILE_CMD_OP_DEL;
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   cmd_len = sizeof(cmd);
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len, SSSNIC_RSS_PROFILE_CMD,
+   SSSNIC_MPU_FUNC_IDX, SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_RSS_PROFILE_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
+
+int
+sssnic_rss_profile_create(struct sssnic_hw *hw)
+{
+   return sssnic_rss_profile_config(hw, true);
+}
+
+int
+sssnic_rss_profile_destroy(struct sssnic_hw *hw)
+{
+   return sssnic_rss_profile_config(hw, false);
+}
+
+int
+sssnic_rss_hash_key_set(struct sssnic_hw *hw, uint8_t *key, uint16_t len)
+{
+   int ret;
+   struct sssnic_rss_hash_key_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   if (len > sizeof(cmd.key)) {
+   PMD_DRV_LOG(ERR, "Invalid rss hash key length: %u", len);
+   return -EINVAL;
+   }
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.opcode = SSSNIC_CMD_OPCODE_SET;
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   rte_memcpy(cmd.key, key, len);
+   cmd_len = sizeof(cmd);
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len, SSSNIC_RSS_HASH_KEY_CMD,
+   SSSNIC_MPU_FUNC_IDX, SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Ba

[PATCH v3 24/32] net/sssnic: support Tx packet burst

2023-08-31 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Fixed wrong format of printing uint64_t.
---
 doc/guides/nics/features/sssnic.ini   |   5 +
 drivers/net/sssnic/sssnic_ethdev.c|   1 +
 drivers/net/sssnic/sssnic_ethdev_tx.c | 404 ++
 drivers/net/sssnic/sssnic_ethdev_tx.h |   2 +
 4 files changed, 412 insertions(+)

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index 320ac4533d..7e6b70684a 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -9,11 +9,16 @@ Link status event= Y
 Queue start/stop = Y
 Rx interrupt = Y
 Scattered Rx = Y
+TSO  = Y
 LRO  = Y
 Promiscuous mode = Y
 Allmulticast mode= Y
 Unicast MAC filter   = Y
 Multicast MAC filter = Y
+L3 checksum offload  = Y
+L4 checksum offload  = Y
+Inner L3 checksum= Y
+Inner L4 checksum= Y
 Basic stats  = Y
 Extended stats   = Y
 Stats per queue  = Y
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index 021fabcbe5..328fb85d30 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -770,6 +770,7 @@ sssnic_ethdev_init(struct rte_eth_dev *ethdev)
return 0;
 
ethdev->rx_pkt_burst = sssnic_ethdev_rx_pkt_burst;
+   ethdev->tx_pkt_burst = sssnic_ethdev_tx_pkt_burst;
 
netdev = SSSNIC_ETHDEV_PRIVATE(ethdev);
pci_dev = RTE_ETH_DEV_TO_PCI(ethdev);
diff --git a/drivers/net/sssnic/sssnic_ethdev_tx.c 
b/drivers/net/sssnic/sssnic_ethdev_tx.c
index b4df71e616..6fed0a85c2 100644
--- a/drivers/net/sssnic/sssnic_ethdev_tx.c
+++ b/drivers/net/sssnic/sssnic_ethdev_tx.c
@@ -171,6 +171,17 @@ enum sssnic_ethdev_txq_entry_type {
SSSNIC_ETHDEV_TXQ_ENTRY_EXTEND = 1,
 };
 
+struct sssnic_ethdev_tx_info {
+   /* offload enable flag */
+   uint16_t offload_en;
+   /*l4 payload offset*/
+   uint16_t payload_off;
+   /* number of txq entries */
+   uint16_t nb_entries;
+   /* number of tx segs */
+   uint16_t nb_segs;
+};
+
 #define SSSNIC_ETHDEV_TXQ_ENTRY_SZ_BITS 4
 #define SSSNIC_ETHDEV_TXQ_ENTRY_SZ (RTE_BIT32(SSSNIC_ETHDEV_TXQ_ENTRY_SZ_BITS))
 
@@ -182,12 +193,44 @@ enum sssnic_ethdev_txq_entry_type {
 #define SSSNIC_ETHDEV_TX_CI_DEF_COALESCING_TIME 16
 #define SSSNIC_ETHDEV_TX_CI_DEF_PENDING_TIME 4
 
+#define SSSNIC_ETHDEV_TX_CSUM_OFFLOAD_MASK 
\
+   (RTE_MBUF_F_TX_IP_CKSUM | RTE_MBUF_F_TX_TCP_CKSUM |\
+   RTE_MBUF_F_TX_UDP_CKSUM | RTE_MBUF_F_TX_SCTP_CKSUM |   \
+   RTE_MBUF_F_TX_OUTER_IP_CKSUM | RTE_MBUF_F_TX_TCP_SEG)
+
+#define SSSNIC_ETHDEV_TX_OFFLOAD_MASK  
\
+   (RTE_MBUF_F_TX_VLAN | SSSNIC_ETHDEV_TX_CSUM_OFFLOAD_MASK)
+
+#define SSSNIC_ETHDEV_TX_MAX_NUM_SEGS 38
+#define SSSNIC_ETHDEV_TX_MAX_SEG_SIZE 65535
+#define SSSNIC_ETHDEV_TX_MAX_PAYLOAD_OFF 221
+#define SSSNIC_ETHDEV_TX_DEF_MSS 0x3e00
+#define SSSNIC_ETHDEV_TX_MIN_MSS 0x50
+#define SSSNIC_ETHDEV_TX_COMPACT_SEG_MAX_SIZE 0x3fff
+
+#define SSSNIC_ETHDEV_TXQ_DESC_ENTRY(txq, idx) 
\
+   (SSSNIC_WORKQ_ENTRY_CAST((txq)->workq, idx,\
+   struct sssnic_ethdev_tx_desc))
+
+#define SSSNIC_ETHDEV_TXQ_OFFLOAD_ENTRY(txq, idx)  
\
+   SSSNIC_WORKQ_ENTRY_CAST((txq)->workq, idx, \
+   struct sssnic_ethdev_tx_offload)
+
+#define SSSNIC_ETHDEV_TXQ_SEG_ENTRY(txq, idx)  
\
+   SSSNIC_WORKQ_ENTRY_CAST((txq)->workq, idx, struct sssnic_ethdev_tx_seg)
+
 static inline uint16_t
 sssnic_ethdev_txq_num_used_entries(struct sssnic_ethdev_txq *txq)
 {
return sssnic_workq_num_used_entries(txq->workq);
 }
 
+static inline uint16_t
+sssnic_ethdev_txq_num_idle_entries(struct sssnic_ethdev_txq *txq)
+{
+   return sssnic_workq_num_idle_entries(txq->workq);
+}
+
 static inline uint16_t
 sssnic_ethdev_txq_ci_get(struct sssnic_ethdev_txq *txq)
 {
@@ -212,6 +255,12 @@ sssnic_ethdev_txq_consume(struct sssnic_ethdev_txq *txq, 
uint16_t num_entries)
sssnic_workq_consume_fast(txq->workq, num_entries);
 }
 
+static inline void
+sssnic_ethdev_txq_produce(struct sssnic_ethdev_txq *txq, uint16_t num_entries)
+{
+   sssnic_workq_produce_fast(txq->workq, num_entries);
+}
+
 int
 sssnic_ethdev_tx_queue_setup(struct rte_eth_dev *ethdev, uint16_t tx_queue_id,
uint16_t nb_tx_desc, unsigned int socket_id,
@@ -706,3 +755,358 @@ sssnic_ethdev_tx_queue_stats_clear(struct rte_eth_dev 
*ethdev, uint16_t qid)
*(stat++) = 0;
}
 }
+
+static inline uint16_t
+sssnic_ethdev_tx_payload_calc(struct rte_mbuf *tx_mbuf)
+{
+   if ((tx_mbuf->ol_flags & RTE_MBUF_F_TX_TUNNEL_MASK) != 0) {
+   uint64_t mask = RTE_MBU

[PATCH v3 26/32] net/sssnic: support dev MTU set

2023-08-31 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/sssnic_ethdev.c | 7 +++
 1 file changed, 7 insertions(+)

diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index a00e96bebe..b086e91d2d 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -733,6 +733,12 @@ sssnic_ethdev_promiscuous_disable(struct rte_eth_dev 
*ethdev)
return 0;
 }
 
+static int
+sssnic_ethdev_mtu_set(struct rte_eth_dev *ethdev, uint16_t mtu)
+{
+   return sssnic_ethdev_tx_max_size_set(ethdev, mtu);
+}
+
 static const struct eth_dev_ops sssnic_ethdev_ops = {
.dev_start = sssnic_ethdev_start,
.dev_stop = sssnic_ethdev_stop,
@@ -770,6 +776,7 @@ static const struct eth_dev_ops sssnic_ethdev_ops = {
.rss_hash_update = sssnic_ethdev_rss_hash_update,
.reta_update = sssnic_ethdev_rss_reta_update,
.reta_query = sssnic_ethdev_rss_reta_query,
+   .mtu_set = sssnic_ethdev_mtu_set,
 };
 
 static int
-- 
2.27.0



[PATCH v3 27/32] net/sssnic: support dev queue info get

2023-08-31 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/sssnic_ethdev.c|  2 ++
 drivers/net/sssnic/sssnic_ethdev_rx.c | 13 +
 drivers/net/sssnic/sssnic_ethdev_rx.h |  2 ++
 drivers/net/sssnic/sssnic_ethdev_tx.c | 11 +++
 drivers/net/sssnic/sssnic_ethdev_tx.h |  2 ++
 5 files changed, 30 insertions(+)

diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index b086e91d2d..bde8d89ddc 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -777,6 +777,8 @@ static const struct eth_dev_ops sssnic_ethdev_ops = {
.reta_update = sssnic_ethdev_rss_reta_update,
.reta_query = sssnic_ethdev_rss_reta_query,
.mtu_set = sssnic_ethdev_mtu_set,
+   .rxq_info_get = sssnic_ethdev_rx_queue_info_get,
+   .txq_info_get = sssnic_ethdev_tx_queue_info_get,
 };
 
 static int
diff --git a/drivers/net/sssnic/sssnic_ethdev_rx.c 
b/drivers/net/sssnic/sssnic_ethdev_rx.c
index 2874a93a54..6c5f209262 100644
--- a/drivers/net/sssnic/sssnic_ethdev_rx.c
+++ b/drivers/net/sssnic/sssnic_ethdev_rx.c
@@ -1363,3 +1363,16 @@ sssnic_ethdev_rx_pkt_burst(void *rx_queue, struct 
rte_mbuf **rx_pkts,
 
return nb_rx;
 }
+
+void
+sssnic_ethdev_rx_queue_info_get(struct rte_eth_dev *ethdev,
+   uint16_t rx_queue_id, struct rte_eth_rxq_info *qinfo)
+{
+   struct sssnic_ethdev_rxq *rxq = ethdev->data->rx_queues[rx_queue_id];
+
+   qinfo->rx_buf_size = rxq->rx_buf_size;
+   qinfo->nb_desc = rxq->depth;
+   qinfo->queue_state = ethdev->data->rx_queue_state[rx_queue_id];
+   qinfo->mp = rxq->mp;
+   qinfo->conf.rx_free_thresh = rxq->rx_free_thresh;
+}
diff --git a/drivers/net/sssnic/sssnic_ethdev_rx.h 
b/drivers/net/sssnic/sssnic_ethdev_rx.h
index b0b35dee73..20e4d1ac0e 100644
--- a/drivers/net/sssnic/sssnic_ethdev_rx.h
+++ b/drivers/net/sssnic/sssnic_ethdev_rx.h
@@ -44,5 +44,7 @@ void sssnic_ethdev_rx_queue_stats_clear(struct rte_eth_dev 
*ethdev,
uint16_t qid);
 uint16_t sssnic_ethdev_rx_pkt_burst(void *rx_queue, struct rte_mbuf **rx_pkts,
uint16_t nb_pkts);
+void sssnic_ethdev_rx_queue_info_get(struct rte_eth_dev *ethdev,
+   uint16_t rx_queue_id, struct rte_eth_rxq_info *qinfo);
 
 #endif
diff --git a/drivers/net/sssnic/sssnic_ethdev_tx.c 
b/drivers/net/sssnic/sssnic_ethdev_tx.c
index 6fed0a85c2..cc0de9aa50 100644
--- a/drivers/net/sssnic/sssnic_ethdev_tx.c
+++ b/drivers/net/sssnic/sssnic_ethdev_tx.c
@@ -1110,3 +1110,14 @@ sssnic_ethdev_tx_pkt_burst(void *tx_queue, struct 
rte_mbuf **tx_pkts,
 
return nb_tx;
 }
+
+void
+sssnic_ethdev_tx_queue_info_get(struct rte_eth_dev *ethdev,
+   uint16_t tx_queue_id, struct rte_eth_txq_info *qinfo)
+{
+   struct sssnic_ethdev_txq *txq = ethdev->data->tx_queues[tx_queue_id];
+
+   qinfo->nb_desc = txq->depth;
+   qinfo->queue_state = ethdev->data->tx_queue_state[tx_queue_id];
+   qinfo->conf.tx_free_thresh = txq->tx_free_thresh;
+}
diff --git a/drivers/net/sssnic/sssnic_ethdev_tx.h 
b/drivers/net/sssnic/sssnic_ethdev_tx.h
index 3a7cd47080..6130ade4d1 100644
--- a/drivers/net/sssnic/sssnic_ethdev_tx.h
+++ b/drivers/net/sssnic/sssnic_ethdev_tx.h
@@ -39,5 +39,7 @@ void sssnic_ethdev_tx_queue_stats_clear(struct rte_eth_dev 
*ethdev,
uint16_t qid);
 uint16_t sssnic_ethdev_tx_pkt_burst(void *tx_queue, struct rte_mbuf **tx_pkts,
uint16_t nb_pkts);
+void sssnic_ethdev_tx_queue_info_get(struct rte_eth_dev *ethdev,
+   uint16_t tx_queue_id, struct rte_eth_txq_info *qinfo);
 
 #endif /* _SSSNIC_ETHDEV_TX_H_ */
-- 
2.27.0



[PATCH v3 29/32] net/sssnic: add dev flow control ops

2023-08-31 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 doc/guides/nics/features/sssnic.ini  |  1 +
 drivers/net/sssnic/base/sssnic_api.c | 68 
 drivers/net/sssnic/base/sssnic_api.h |  4 ++
 drivers/net/sssnic/base/sssnic_cmd.h | 11 +
 drivers/net/sssnic/sssnic_ethdev.c   | 65 ++
 5 files changed, 149 insertions(+)

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index a40b509558..9bf05cb968 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -26,6 +26,7 @@ Inner L4 checksum= Y
 Basic stats  = Y
 Extended stats   = Y
 Stats per queue  = Y
+Flow control = P
 FW version   = Y
 Linux= Y
 ARMv8= Y
diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index 12aca16995..d91896cdd2 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -1533,3 +1533,71 @@ sssnic_fw_version_get(struct sssnic_hw *hw, struct 
sssnic_fw_version *version)
 
return 0;
 }
+
+int
+sssnic_flow_ctrl_set(struct sssnic_hw *hw, bool autoneg, bool rx_en, bool 
tx_en)
+{
+   int ret;
+   struct sssnic_msg msg;
+   struct sssnic_flow_ctrl_cmd cmd;
+   uint32_t cmdlen = sizeof(cmd);
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.auto_neg = autoneg ? 1 : 0;
+   cmd.rx_en = rx_en ? 1 : 0;
+   cmd.tx_en = tx_en ? 1 : 0;
+   cmd.opcode = SSSNIC_CMD_OPCODE_SET;
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmdlen,
+   SSSNIC_PORT_FLOW_CTRL_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmdlen, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmdlen == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_PORT_FLOW_CTRL_CMD, len=%u, 
status=%u",
+   cmdlen, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
+
+int
+sssnic_flow_ctrl_get(struct sssnic_hw *hw, bool *autoneg, bool *rx_en,
+   bool *tx_en)
+{
+   int ret;
+   struct sssnic_msg msg;
+   struct sssnic_flow_ctrl_cmd cmd;
+   uint32_t cmdlen = sizeof(cmd);
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.opcode = SSSNIC_CMD_OPCODE_GET;
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmdlen,
+   SSSNIC_PORT_FLOW_CTRL_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmdlen, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmdlen == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_PORT_FLOW_CTRL_CMD, len=%u, 
status=%u",
+   cmdlen, cmd.common.status);
+   return -EIO;
+   }
+
+   *autoneg = cmd.auto_neg;
+   *rx_en = cmd.rx_en;
+   *tx_en = cmd.tx_en;
+
+   return 0;
+}
diff --git a/drivers/net/sssnic/base/sssnic_api.h 
b/drivers/net/sssnic/base/sssnic_api.h
index bd4f01d388..36544a5dc3 100644
--- a/drivers/net/sssnic/base/sssnic_api.h
+++ b/drivers/net/sssnic/base/sssnic_api.h
@@ -465,5 +465,9 @@ int sssnic_rss_indir_table_get(struct sssnic_hw *hw, 
uint16_t *entry,
uint32_t num_entries);
 int sssnic_fw_version_get(struct sssnic_hw *hw,
struct sssnic_fw_version *version);
+int sssnic_flow_ctrl_set(struct sssnic_hw *hw, bool autoneg, bool rx_en,
+   bool tx_en);
+int sssnic_flow_ctrl_get(struct sssnic_hw *hw, bool *autoneg, bool *rx_en,
+   bool *tx_en);
 
 #endif /* _SSSNIC_API_H_ */
diff --git a/drivers/net/sssnic/base/sssnic_cmd.h 
b/drivers/net/sssnic/base/sssnic_cmd.h
index 9da07770b1..d2054fad5a 100644
--- a/drivers/net/sssnic/base/sssnic_cmd.h
+++ b/drivers/net/sssnic/base/sssnic_cmd.h
@@ -414,4 +414,15 @@ struct sssnic_fw_version_get_cmd {
uint8_t time[20];
 };
 
+struct sssnic_flow_ctrl_cmd {
+   struct sssnic_cmd_common common;
+   uint8_t port;
+   uint8_t opcode;
+   uint16_t resvd0;
+   uint8_t auto_neg;
+   uint8_t rx_en;
+   uint8_t tx_en;
+   uint8_t resvd1[5];
+};
+
 #endif /* _SSSNIC_CMD_H_ */
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index cceaa5c8be..8999693027 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -758,6 +758,69 @@ sssnic_ethdev_fw_version_get(struct rte_eth_dev *ethdev, 
char *fw_version,
return 0;
 }
 
+static int
+sssnic_ethdev_flow_ctrl_set(struct rte_eth_dev *ethdev,
+   struct rte_eth_fc_c

[PATCH v3 30/32] net/sssnic: support VLAN offload and filter

2023-08-31 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 doc/guides/nics/features/sssnic.ini  |  2 +
 drivers/net/sssnic/base/sssnic_api.c | 34 +++
 drivers/net/sssnic/base/sssnic_api.h |  1 +
 drivers/net/sssnic/base/sssnic_cmd.h |  9 +++
 drivers/net/sssnic/sssnic_ethdev.c   | 87 
 5 files changed, 133 insertions(+)

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index 9bf05cb968..f5738ac934 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -19,6 +19,8 @@ RSS hash = Y
 RSS key update   = Y
 RSS reta update  = Y
 Inner RSS= Y
+VLAN filter  = Y
+VLAN offload = Y
 L3 checksum offload  = Y
 L4 checksum offload  = Y
 Inner L3 checksum= Y
diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index d91896cdd2..68c16c9c1e 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -1601,3 +1601,37 @@ sssnic_flow_ctrl_get(struct sssnic_hw *hw, bool 
*autoneg, bool *rx_en,
 
return 0;
 }
+
+int
+sssnic_vlan_filter_set(struct sssnic_hw *hw, uint16_t vid, bool add)
+{
+   int ret;
+   struct sssnic_vlan_filter_set_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   cmd.add = add ? 1 : 0;
+   cmd.vid = vid;
+   cmd_len = sizeof(cmd);
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_SET_PORT_VLAN_FILTER_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_SET_PORT_VLAN_FILTER_CMD, 
len=%u, status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
diff --git a/drivers/net/sssnic/base/sssnic_api.h 
b/drivers/net/sssnic/base/sssnic_api.h
index 36544a5dc3..28b235dda2 100644
--- a/drivers/net/sssnic/base/sssnic_api.h
+++ b/drivers/net/sssnic/base/sssnic_api.h
@@ -469,5 +469,6 @@ int sssnic_flow_ctrl_set(struct sssnic_hw *hw, bool 
autoneg, bool rx_en,
bool tx_en);
 int sssnic_flow_ctrl_get(struct sssnic_hw *hw, bool *autoneg, bool *rx_en,
bool *tx_en);
+int sssnic_vlan_filter_set(struct sssnic_hw *hw, uint16_t vid, bool add);
 
 #endif /* _SSSNIC_API_H_ */
diff --git a/drivers/net/sssnic/base/sssnic_cmd.h 
b/drivers/net/sssnic/base/sssnic_cmd.h
index d2054fad5a..3e70d0e223 100644
--- a/drivers/net/sssnic/base/sssnic_cmd.h
+++ b/drivers/net/sssnic/base/sssnic_cmd.h
@@ -425,4 +425,13 @@ struct sssnic_flow_ctrl_cmd {
uint8_t resvd1[5];
 };
 
+struct sssnic_vlan_filter_set_cmd {
+   struct sssnic_cmd_common common;
+   uint16_t function;
+   uint8_t add;
+   uint8_t resvd0;
+   uint16_t vid;
+   uint16_t resvd1;
+};
+
 #endif /* _SSSNIC_CMD_H_ */
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index 8999693027..8a1ccff70b 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -16,6 +16,7 @@
 #include "sssnic_ethdev_rss.h"
 
 static int sssnic_ethdev_init(struct rte_eth_dev *ethdev);
+static void sssnic_ethdev_vlan_filter_clean(struct rte_eth_dev *ethdev);
 
 static int
 sssnic_ethdev_infos_get(struct rte_eth_dev *ethdev,
@@ -340,6 +341,7 @@ sssnic_ethdev_release(struct rte_eth_dev *ethdev)
 {
struct sssnic_hw *hw = SSSNIC_ETHDEV_TO_HW(ethdev);
 
+   sssnic_ethdev_vlan_filter_clean(ethdev);
sssnic_ethdev_link_intr_disable(ethdev);
sssnic_ethdev_tx_queue_all_release(ethdev);
sssnic_ethdev_rx_queue_all_release(ethdev);
@@ -821,6 +823,89 @@ sssnic_ethdev_flow_ctrl_get(struct rte_eth_dev *ethdev,
return 0;
 }
 
+static int
+sssnic_ethdev_vlan_offload_set(struct rte_eth_dev *ethdev, int mask)
+{
+   struct sssnic_hw *hw = SSSNIC_ETHDEV_TO_HW(ethdev);
+   struct rte_eth_conf *dev_conf = ðdev->data->dev_conf;
+   uint8_t vlan_strip_en;
+   uint32_t vlan_filter_en;
+   int ret;
+
+   if (mask & RTE_ETH_VLAN_STRIP_MASK) {
+   if (dev_conf->rxmode.offloads & RTE_ETH_RX_OFFLOAD_VLAN_STRIP)
+   vlan_strip_en = 1;
+   else
+   vlan_strip_en = 0;
+
+   ret = sssnic_vlan_strip_enable_set(hw, vlan_strip_en);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to %s vlan strip offload",
+   vlan_strip_en ? "enable" : "disable");
+   return ret

[PATCH v3 28/32] net/sssnic: support dev firmware version get

2023-08-31 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 doc/guides/nics/features/sssnic.ini  |  1 +
 drivers/net/sssnic/base/sssnic_api.c | 36 
 drivers/net/sssnic/base/sssnic_api.h |  9 +++
 drivers/net/sssnic/base/sssnic_cmd.h |  8 +++
 drivers/net/sssnic/sssnic_ethdev.c   | 20 
 5 files changed, 74 insertions(+)

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index 020a9e7056..a40b509558 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -26,6 +26,7 @@ Inner L4 checksum= Y
 Basic stats  = Y
 Extended stats   = Y
 Stats per queue  = Y
+FW version   = Y
 Linux= Y
 ARMv8= Y
 x86-64   = Y
diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index 32b24e841c..12aca16995 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -1497,3 +1497,39 @@ sssnic_rss_indir_table_get(struct sssnic_hw *hw, 
uint16_t *entry,
sssnic_ctrlq_cmd_destroy(hw, cmd);
return ret;
 }
+
+int
+sssnic_fw_version_get(struct sssnic_hw *hw, struct sssnic_fw_version *version)
+{
+   int ret;
+   struct sssnic_msg msg;
+   struct sssnic_fw_version_get_cmd cmd;
+   uint32_t cmdlen = sizeof(cmd);
+   int len;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.type = 1; /* get MPU firmware version */
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmdlen,
+   SSSNIC_GET_FW_VERSION_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_COMM_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmdlen, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmdlen == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_GET_FW_VERSION_CMD, len=%u, 
status=%u",
+   cmdlen, cmd.common.status);
+   return -EIO;
+   }
+
+   len = RTE_MIN(sizeof(version->version), sizeof(cmd.version));
+   rte_memcpy(version->version, cmd.version, len);
+   len = RTE_MIN(sizeof(version->time), sizeof(cmd.time));
+   rte_memcpy(version->time, cmd.time, len);
+
+   return 0;
+}
diff --git a/drivers/net/sssnic/base/sssnic_api.h 
b/drivers/net/sssnic/base/sssnic_api.h
index 1d80b93e38..bd4f01d388 100644
--- a/drivers/net/sssnic/base/sssnic_api.h
+++ b/drivers/net/sssnic/base/sssnic_api.h
@@ -402,6 +402,13 @@ enum sssnic_rss_hash_engine_type {
SSSNIC_RSS_HASH_ENGINE_COUNT,
 };
 
+#define SSSNIC_FW_VERSION_LEN 16
+#define SSSNIC_FW_TIME_LEN 20
+struct sssnic_fw_version {
+   char version[SSSNIC_FW_VERSION_LEN];
+   char time[SSSNIC_FW_VERSION_LEN];
+};
+
 int sssnic_msix_attr_get(struct sssnic_hw *hw, uint16_t msix_idx,
struct sssnic_msix_attr *attr);
 int sssnic_msix_attr_set(struct sssnic_hw *hw, uint16_t msix_idx,
@@ -456,5 +463,7 @@ int sssnic_rss_indir_table_set(struct sssnic_hw *hw, const 
uint16_t *entry,
uint32_t num_entries);
 int sssnic_rss_indir_table_get(struct sssnic_hw *hw, uint16_t *entry,
uint32_t num_entries);
+int sssnic_fw_version_get(struct sssnic_hw *hw,
+   struct sssnic_fw_version *version);
 
 #endif /* _SSSNIC_API_H_ */
diff --git a/drivers/net/sssnic/base/sssnic_cmd.h 
b/drivers/net/sssnic/base/sssnic_cmd.h
index 56818471b6..9da07770b1 100644
--- a/drivers/net/sssnic/base/sssnic_cmd.h
+++ b/drivers/net/sssnic/base/sssnic_cmd.h
@@ -406,4 +406,12 @@ struct sssnic_rss_indir_table_cmd {
uint16_t entry[256];
 };
 
+struct sssnic_fw_version_get_cmd {
+   struct sssnic_cmd_common common;
+   uint16_t type;
+   uint16_t resvd;
+   uint8_t version[16];
+   uint8_t time[20];
+};
+
 #endif /* _SSSNIC_CMD_H_ */
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index bde8d89ddc..cceaa5c8be 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -739,6 +739,25 @@ sssnic_ethdev_mtu_set(struct rte_eth_dev *ethdev, uint16_t 
mtu)
return sssnic_ethdev_tx_max_size_set(ethdev, mtu);
 }
 
+static int
+sssnic_ethdev_fw_version_get(struct rte_eth_dev *ethdev, char *fw_version,
+   size_t fw_size)
+{
+   struct sssnic_hw *hw = SSSNIC_ETHDEV_TO_HW(ethdev);
+   struct sssnic_fw_version version;
+   int ret;
+
+   ret = sssnic_fw_version_get(hw, &version);
+   if (ret) {
+   PMD_DRV_LOG(ERR, "Failed to get firmware version");
+   return ret;
+   }
+
+   snprintf(fw_version, fw_size, "%s", version.version);
+
+   return 0;
+}
+
 static const struct eth_dev_ops sssnic_ethdev_ops = {
.dev_start = sssnic_ethdev_start,
.dev_stop = sssnic_ethdev_stop,
@@ -779,6 +

[PATCH v3 31/32] net/sssnic: add generic flow ops

2023-08-31 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Fixed 'mask->hdr.src_addr' will always evaluate to 'true'.
* Removed error.h from including files.
---
 doc/guides/nics/features/sssnic.ini |   12 +
 drivers/net/sssnic/base/sssnic_api.c|  264 ++
 drivers/net/sssnic/base/sssnic_api.h|   22 +
 drivers/net/sssnic/base/sssnic_cmd.h|   71 ++
 drivers/net/sssnic/base/sssnic_hw.h |3 +
 drivers/net/sssnic/base/sssnic_misc.h   |7 +
 drivers/net/sssnic/meson.build  |2 +
 drivers/net/sssnic/sssnic_ethdev.c  |   12 +
 drivers/net/sssnic/sssnic_ethdev.h  |1 +
 drivers/net/sssnic/sssnic_ethdev_fdir.c | 1017 +++
 drivers/net/sssnic/sssnic_ethdev_fdir.h |  332 
 drivers/net/sssnic/sssnic_ethdev_flow.c |  981 ++
 drivers/net/sssnic/sssnic_ethdev_flow.h |   11 +
 drivers/net/sssnic/sssnic_ethdev_rx.c   |   18 +
 14 files changed, 2753 insertions(+)
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_fdir.c
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_fdir.h
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_flow.c
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_flow.h

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index f5738ac934..57e7440d86 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -33,3 +33,15 @@ FW version   = Y
 Linux= Y
 ARMv8= Y
 x86-64   = Y
+
+[rte_flow items]
+any  = Y
+eth  = Y
+ipv4 = Y
+ipv6 = Y
+tcp  = Y
+udp  = Y
+vxlan= Y
+
+[rte_flow actions]
+queue= Y
diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index 68c16c9c1e..0e965442fd 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -1635,3 +1635,267 @@ sssnic_vlan_filter_set(struct sssnic_hw *hw, uint16_t 
vid, bool add)
 
return 0;
 }
+
+int
+sssnic_tcam_enable_set(struct sssnic_hw *hw, bool enabled)
+{
+   struct sssnic_tcam_enable_set_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+   int ret;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd_len = sizeof(cmd);
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   cmd.enabled = enabled ? 1 : 0;
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_SET_TCAM_ENABLE_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   if (cmd.common.status == SSSNIC_TCAM_CMD_STATUS_UNSUPPORTED)
+   PMD_DRV_LOG(WARNING,
+   "SSSNIC_SET_TCAM_ENABLED_CMD is unsupported");
+   else
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_SET_TCAM_ENABLE_CMD, 
len=%u, status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
+
+int
+sssnic_tcam_flush(struct sssnic_hw *hw)
+{
+   struct sssnic_tcam_flush_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+   int ret;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd_len = sizeof(cmd);
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len, SSSNIC_FLUSH_TCAM_CMD,
+   SSSNIC_MPU_FUNC_IDX, SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   if (cmd.common.status == SSSNIC_TCAM_CMD_STATUS_UNSUPPORTED)
+   PMD_DRV_LOG(WARNING,
+   "SSSNIC_FLUSH_TCAM_CMD is unsupported");
+   else
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_FLUSH_TCAM_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+   return 0;
+}
+
+int
+sssnic_tcam_disable_and_flush(struct sssnic_hw *hw)
+{
+   int ret;
+
+   ret = sssnic_tcam_enable_set(hw, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Could not disable TCAM");
+   return ret;
+   }
+
+   ret = sssnic_tcam_flush(hw);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Could not flush TCAM");
+   return ret;
+   }
+

[PATCH v3 32/32] net/sssnic: add VF dev support

2023-08-31 Thread wanry
From: Renyong Wan 

In comparison to PF, VF PMD does not support the following features:

1. link up and link down set
2. promiscuous enable and disable
3. MAC stats in extend xstats

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/base/sssnic_api.c | 42 +
 drivers/net/sssnic/base/sssnic_api.h |  2 +
 drivers/net/sssnic/base/sssnic_cmd.h |  6 +++
 drivers/net/sssnic/base/sssnic_hw.c  | 19 ++--
 drivers/net/sssnic/base/sssnic_hw.h  |  4 ++
 drivers/net/sssnic/sssnic_ethdev.c   | 60 +++-
 drivers/net/sssnic/sssnic_ethdev_stats.c | 29 ++--
 7 files changed, 153 insertions(+), 9 deletions(-)

diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index 0e965442fd..2d829bc884 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -1899,3 +1899,45 @@ sssnic_tcam_entry_del(struct sssnic_hw *hw, uint32_t 
entry_idx)
 
return 0;
 }
+
+static int
+sssnic_vf_port_register_op(struct sssnic_hw *hw, bool op)
+{
+   int ret;
+   struct sssnic_vf_port_register_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.op = op ? 1 : 0;
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_REGISTER_VF_PORT_CMD, SSSNIC_PF_FUNC_IDX(hw),
+   SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_REGISTER_VF_PORT_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
+
+int
+sssnic_vf_port_register(struct sssnic_hw *hw)
+{
+   return sssnic_vf_port_register_op(hw, true);
+}
+
+int
+sssnic_vf_port_unregister(struct sssnic_hw *hw)
+{
+   return sssnic_vf_port_register_op(hw, false);
+}
diff --git a/drivers/net/sssnic/base/sssnic_api.h 
b/drivers/net/sssnic/base/sssnic_api.h
index 7a02ec61ee..2506682821 100644
--- a/drivers/net/sssnic/base/sssnic_api.h
+++ b/drivers/net/sssnic/base/sssnic_api.h
@@ -492,5 +492,7 @@ int sssnic_tcam_packet_type_filter_set(struct sssnic_hw 
*hw, uint8_t ptype,
 int sssnic_tcam_entry_add(struct sssnic_hw *hw,
struct sssnic_tcam_entry *entry);
 int sssnic_tcam_entry_del(struct sssnic_hw *hw, uint32_t entry_idx);
+int sssnic_vf_port_register(struct sssnic_hw *hw);
+int sssnic_vf_port_unregister(struct sssnic_hw *hw);
 
 #endif /* _SSSNIC_API_H_ */
diff --git a/drivers/net/sssnic/base/sssnic_cmd.h 
b/drivers/net/sssnic/base/sssnic_cmd.h
index c75cb0dad3..058ab298f3 100644
--- a/drivers/net/sssnic/base/sssnic_cmd.h
+++ b/drivers/net/sssnic/base/sssnic_cmd.h
@@ -505,4 +505,10 @@ struct sssnic_tcam_entry_del_cmd {
uint32_t num; /* number of entries to be deleted */
 };
 
+struct sssnic_vf_port_register_cmd {
+   struct sssnic_cmd_common common;
+   uint8_t op; /* 0: unregister, 1: register */
+   uint8_t resvd[39];
+};
+
 #endif /* _SSSNIC_CMD_H_ */
diff --git a/drivers/net/sssnic/base/sssnic_hw.c 
b/drivers/net/sssnic/base/sssnic_hw.c
index 651a0aa7ef..0edd5b9508 100644
--- a/drivers/net/sssnic/base/sssnic_hw.c
+++ b/drivers/net/sssnic/base/sssnic_hw.c
@@ -345,10 +345,16 @@ sssnic_base_init(struct sssnic_hw *hw)
pci_dev = hw->pci_dev;
 
/* get base addresses of hw registers */
-   hw->cfg_base_addr =
-   (uint8_t *)pci_dev->mem_resource[SSSNIC_PCI_BAR_CFG].addr;
-   hw->mgmt_base_addr =
-   (uint8_t *)pci_dev->mem_resource[SSSNIC_PCI_BAR_MGMT].addr;
+   if (pci_dev->id.device_id == SSSNIC_VF_DEVICE_ID) {
+   uint8_t *addr =
+   (uint8_t 
*)pci_dev->mem_resource[SSSNIC_VF_PCI_BAR_CFG].addr;
+   hw->cfg_base_addr = addr + SSSNIC_VF_CFG_ADDR_OFFSET;
+   } else {
+   hw->cfg_base_addr =
+   (uint8_t 
*)pci_dev->mem_resource[SSSNIC_PCI_BAR_CFG].addr;
+   hw->mgmt_base_addr =
+   (uint8_t 
*)pci_dev->mem_resource[SSSNIC_PCI_BAR_MGMT].addr;
+   }
hw->db_base_addr =
(uint8_t *)pci_dev->mem_resource[SSSNIC_PCI_BAR_DB].addr;
hw->db_mem_len =
@@ -365,7 +371,10 @@ sssnic_base_init(struct sssnic_hw *hw)
PMD_DRV_LOG(ERR, "Doorbell is not enabled!");
return -EBUSY;
}
-   sssnic_af_setup(hw);
+
+   if (SSSNIC_FUNC_TYPE(hw) != SSSNIC_FUNC_TYPE_VF)
+   sssnic_af_setup(hw);
+
sssnic_msix_all_disable(hw);
sssnic_pf_status_set(hw, SSSNIC_PF_STATUS_INIT);
 
diff --git a/drivers/net/sssnic/base

[PATCH v3 08/32] net/sssnic/base: add work queue

2023-08-31 Thread wanry
From: Renyong Wan 

Work queue is used to maintain hardware queue information by
driver, it is usually used in control queue, rx queue
and tx queue.

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Removed error.h from including files.
---
 drivers/net/sssnic/base/meson.build|   1 +
 drivers/net/sssnic/base/sssnic_workq.c | 141 +
 drivers/net/sssnic/base/sssnic_workq.h | 108 +++
 3 files changed, 250 insertions(+)
 create mode 100644 drivers/net/sssnic/base/sssnic_workq.c
 create mode 100644 drivers/net/sssnic/base/sssnic_workq.h

diff --git a/drivers/net/sssnic/base/meson.build 
b/drivers/net/sssnic/base/meson.build
index 4abd1a0daf..7c23a82ff3 100644
--- a/drivers/net/sssnic/base/meson.build
+++ b/drivers/net/sssnic/base/meson.build
@@ -6,6 +6,7 @@ sources = [
 'sssnic_eventq.c',
 'sssnic_msg.c',
 'sssnic_mbox.c',
+'sssnic_workq.c',
 ]
 
 c_args = cflags
diff --git a/drivers/net/sssnic/base/sssnic_workq.c 
b/drivers/net/sssnic/base/sssnic_workq.c
new file mode 100644
index 00..25b7585246
--- /dev/null
+++ b/drivers/net/sssnic/base/sssnic_workq.c
@@ -0,0 +1,141 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include "../sssnic_log.h"
+#include "sssnic_workq.h"
+
+/* Consume num_entries and increase CI
+ * Return the first entry address of previous CI position
+ */
+void *
+sssnic_workq_consume(struct sssnic_workq *workq, uint16_t num_entries,
+   uint16_t *ci)
+{
+   void *e;
+   uint16_t current_ci;
+
+   if (workq->idle_entries + num_entries > workq->num_entries)
+   return NULL;
+
+   current_ci = sssnic_workq_ci_get(workq);
+   e = (void *)sssnic_workq_entry_get(workq, current_ci);
+   workq->idle_entries += num_entries;
+   workq->ci += num_entries;
+   if (ci != NULL)
+   *ci = current_ci;
+
+   return e;
+}
+
+/* Produce num_entries and increase pi.
+ * Return the first entry address of previous PI position
+ */
+void *
+sssnic_workq_produce(struct sssnic_workq *workq, uint16_t num_entries,
+   uint16_t *pi)
+{
+   void *e;
+   uint16_t current_pi;
+
+   if (workq->idle_entries < num_entries)
+   return NULL;
+
+   current_pi = sssnic_workq_pi_get(workq);
+   e = (void *)sssnic_workq_entry_get(workq, current_pi);
+   workq->idle_entries -= num_entries;
+   workq->pi += num_entries;
+   if (pi != NULL)
+   *pi = current_pi;
+
+   return e;
+}
+
+static int
+sssnic_workq_init(struct sssnic_workq *workq, const char *name, int socket_id,
+   uint32_t entry_size, uint32_t depth)
+{
+   char zname[RTE_MEMZONE_NAMESIZE];
+
+   if (!rte_is_power_of_2(entry_size)) {
+   PMD_DRV_LOG(ERR,
+   "The entry size(%u) of workq(%s) is not power of 2",
+   entry_size, name);
+   return -EINVAL;
+   }
+
+   if (!rte_is_power_of_2(depth)) {
+   PMD_DRV_LOG(ERR, "The depth(%u) of workq(%s) is not power of 2",
+   depth, name);
+   return -EINVAL;
+   }
+
+   workq->buf_size = entry_size * depth;
+   workq->entry_size = entry_size;
+   workq->entry_shift = rte_log2_u32(entry_size);
+   workq->num_entries = depth;
+   workq->idle_entries = depth;
+   workq->index_mask = depth - 1;
+
+   snprintf(zname, sizeof(zname), "%s_mz", name);
+   workq->buf_mz = rte_memzone_reserve_aligned(zname, workq->buf_size,
+   socket_id, RTE_MEMZONE_IOVA_CONTIG, RTE_PGSIZE_256K);
+   if (workq->buf_mz == NULL) {
+   PMD_DRV_LOG(ERR, "Failed to alloc DMA memory for %s", name);
+   return -ENOMEM;
+   }
+   workq->buf_addr = workq->buf_mz->addr;
+   workq->buf_phyaddr = workq->buf_mz->iova;
+
+   return 0;
+}
+
+static void
+sssnic_workq_cleanup(struct sssnic_workq *workq)
+{
+   if (workq != NULL && workq->buf_mz != NULL)
+   rte_memzone_free(workq->buf_mz);
+}
+
+/* Cleanup a work queue and free it*/
+void
+sssnic_workq_destroy(struct sssnic_workq *workq)
+{
+   if (workq != NULL) {
+   sssnic_workq_cleanup(workq);
+   rte_free(workq);
+   }
+}
+
+/*Create a work queue and initialize*/
+struct sssnic_workq *
+sssnic_workq_new(const char *name, int socket_id, uint32_t entry_size,
+   uint32_t depth)
+{
+   int ret;
+   struct sssnic_workq *workq;
+
+   if (name == NULL) {
+   PMD_DRV_LOG(ERR, "Bad parameter, workq name is NULL");
+   return NULL;
+   }
+
+   workq = rte_zmalloc(name, sizeof(struct sssnic_workq), 0);
+   if (workq == NULL) {
+   PMD_DRV_LOG(ERR, "Could not alloc memory for  %s", name);
+   return NULL;
+   }
+   ret = sssnic_workq_

[PATCH v3 05/32] net/sssnic: add event queue

2023-08-31 Thread wanry
From: Renyong Wan 

Event queue is intended for receiving event from hardware as well
as mailbox response message.

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/base/meson.build |   1 +
 drivers/net/sssnic/base/sssnic_eventq.c | 426 
 drivers/net/sssnic/base/sssnic_eventq.h |  84 +
 drivers/net/sssnic/base/sssnic_hw.c |   9 +-
 drivers/net/sssnic/base/sssnic_hw.h |   5 +
 drivers/net/sssnic/base/sssnic_reg.h|  51 +++
 drivers/net/sssnic/sssnic_ethdev.c  |   1 +
 7 files changed, 576 insertions(+), 1 deletion(-)
 create mode 100644 drivers/net/sssnic/base/sssnic_eventq.c
 create mode 100644 drivers/net/sssnic/base/sssnic_eventq.h

diff --git a/drivers/net/sssnic/base/meson.build 
b/drivers/net/sssnic/base/meson.build
index 3e64112c72..7758faa482 100644
--- a/drivers/net/sssnic/base/meson.build
+++ b/drivers/net/sssnic/base/meson.build
@@ -3,6 +3,7 @@
 
 sources = [
 'sssnic_hw.c',
+'sssnic_eventq.c'
 ]
 
 c_args = cflags
diff --git a/drivers/net/sssnic/base/sssnic_eventq.c 
b/drivers/net/sssnic/base/sssnic_eventq.c
new file mode 100644
index 00..a479bdff35
--- /dev/null
+++ b/drivers/net/sssnic/base/sssnic_eventq.c
@@ -0,0 +1,426 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "../sssnic_log.h"
+#include "sssnic_hw.h"
+#include "sssnic_reg.h"
+#include "sssnic_eventq.h"
+
+#define SSSNIC_EVENTQ_DEF_DEPTH 64
+#define SSSNIC_EVENTQ_NUM_PAGES 4
+#define SSSNIC_EVENTQ_MAX_PAGE_SZ 0x40
+#define SSSNIC_EVENTQ_MIN_PAGE_SZ 0x1000
+
+#define SSSNIC_EVENT_ADDR(base_addr, event_sz, idx)
\
+   (struct sssnic_event *)(((uint8_t *)(base_addr)) + ((idx) * (event_sz)))
+
+static inline struct sssnic_event *
+sssnic_eventq_peek(struct sssnic_eventq *eq)
+{
+   uint16_t page = eq->ci / eq->page_len;
+   uint16_t idx = eq->ci % eq->page_len;
+
+   return SSSNIC_EVENT_ADDR(eq->pages[page]->addr, eq->entry_size, idx);
+}
+
+static inline void
+sssnic_eventq_reg_write(struct sssnic_eventq *eq, uint32_t reg, uint32_t val)
+{
+   sssnic_cfg_reg_write(eq->hw, reg, val);
+}
+
+static inline uint32_t
+sssnic_eventq_reg_read(struct sssnic_eventq *eq, uint32_t reg)
+{
+   return sssnic_cfg_reg_read(eq->hw, reg);
+}
+
+static inline void
+sssnic_eventq_reg_write64(struct sssnic_eventq *eq, uint32_t reg, uint64_t val)
+{
+   sssnic_cfg_reg_write(eq->hw, reg, (uint32_t)((val >> 16) >> 16));
+   sssnic_cfg_reg_write(eq->hw, reg + sizeof(uint32_t), (uint32_t)val);
+}
+
+/* all eventq registers that to be access must be selected first */
+static inline void
+sssnic_eventq_reg_select(struct sssnic_eventq *eq)
+{
+   sssnic_eventq_reg_write(eq, SSSNIC_EVENTQ_IDX_SEL_REG, eq->qid);
+}
+
+static const struct rte_memzone *
+sssnic_eventq_page_alloc(struct sssnic_eventq *eq, int page_idx)
+{
+   const struct rte_memzone *mz = NULL;
+   char mz_name[RTE_MEMZONE_NAMESIZE];
+
+   snprintf(mz_name, sizeof(mz_name), "sssnic%u_eq%d_page%d",
+   SSSNIC_ETH_PORT_ID(eq->hw), eq->qid, page_idx);
+   mz = rte_memzone_reserve_aligned(mz_name, eq->page_size, SOCKET_ID_ANY,
+   RTE_MEMZONE_IOVA_CONTIG, eq->page_size);
+   return mz;
+}
+
+static uint32_t
+sssnic_eventq_page_size_calc(uint32_t depth, uint32_t entry_size)
+{
+   uint32_t pages = SSSNIC_EVENTQ_NUM_PAGES;
+   uint32_t size;
+
+   size = RTE_ALIGN(depth * entry_size, SSSNIC_EVENTQ_MIN_PAGE_SZ);
+   if (size <= pages * SSSNIC_EVENTQ_MIN_PAGE_SZ) {
+   /* use minimum page size */
+   return SSSNIC_EVENTQ_MIN_PAGE_SZ;
+   }
+
+   /* Calculate how many pages of minimum size page the big size page 
covers */
+   size = RTE_ALIGN(size / pages, SSSNIC_EVENTQ_MIN_PAGE_SZ);
+   pages = rte_fls_u32(size / SSSNIC_EVENTQ_MIN_PAGE_SZ);
+
+   return SSSNIC_EVENTQ_MIN_PAGE_SZ * pages;
+}
+
+static int
+sssnic_eventq_pages_setup(struct sssnic_eventq *eq)
+{
+   const struct rte_memzone *mz;
+   struct sssnic_event *ev;
+   int i, j;
+
+   eq->pages = rte_zmalloc(NULL,
+   eq->num_pages * sizeof(struct rte_memzone *), 1);
+   if (eq->pages == NULL) {
+   PMD_DRV_LOG(ERR, "Could not alloc memory for pages");
+   return -ENOMEM;
+   }
+
+   for (i = 0; i < eq->num_pages; i++) {
+   mz = sssnic_eventq_page_alloc(eq, i);
+   if (mz == NULL) {
+   PMD_DRV_LOG(ERR,
+   "Could not alloc DMA memory for eventq page %d",
+   i);
+   goto alloc_dma_fail;
+   }
+   /* init eventq entries */
+   for (j = 0; j < eq->page_len; j++) {
+   ev = SSS

[PATCH v3 16/32] net/sssnic: support Rx queue start and stop

2023-08-31 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/base/sssnic_api.c  |  63 +
 drivers/net/sssnic/base/sssnic_api.h  |   2 +
 drivers/net/sssnic/base/sssnic_cmd.h  |  49 
 drivers/net/sssnic/sssnic_ethdev.c|   2 +
 drivers/net/sssnic/sssnic_ethdev.h|   2 +
 drivers/net/sssnic/sssnic_ethdev_rx.c | 332 ++
 drivers/net/sssnic/sssnic_ethdev_rx.h |   4 +
 7 files changed, 454 insertions(+)

diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index 3bb31009c5..3050d573bf 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -11,6 +11,7 @@
 #include "sssnic_hw.h"
 #include "sssnic_cmd.h"
 #include "sssnic_mbox.h"
+#include "sssnic_ctrlq.h"
 #include "sssnic_api.h"
 
 int
@@ -434,3 +435,65 @@ sssnic_netif_enable_set(struct sssnic_hw *hw, uint8_t 
state)
 
return 0;
 }
+
+int
+sssnic_port_enable_set(struct sssnic_hw *hw, bool state)
+{
+   int ret;
+   struct sssnic_port_enable_set_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   if (hw == NULL)
+   return -EINVAL;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   cmd.state = state ? 1 : 0;
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_SET_PORT_ENABLE_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_SET_PORT_ENABLE_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
+
+int
+sssnic_rxq_flush(struct sssnic_hw *hw, uint16_t qid)
+{
+   struct sssnic_ctrlq_cmd cmd;
+   struct sssnic_rxq_flush_cmd data;
+   int ret;
+
+   data.u32 = 0;
+   data.qid = qid;
+   data.u32 = rte_cpu_to_be_32(data.u32);
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.data = &data;
+   cmd.module = SSSNIC_LAN_MODULE;
+   cmd.data_len = sizeof(data);
+   cmd.cmd = SSSNIC_FLUSH_RXQ_CMD;
+
+   ret = sssnic_ctrlq_cmd_exec(hw, &cmd, 0);
+   if (ret != 0 || cmd.result != 0) {
+   PMD_DRV_LOG(ERR,
+   "Failed to execulte ctrlq command %s, ret=%d, result=%" 
PRIu64,
+   "SSSNIC_FLUSH_RXQ_CMD", ret, cmd.result);
+   return -EIO;
+   }
+
+   return 0;
+}
diff --git a/drivers/net/sssnic/base/sssnic_api.h 
b/drivers/net/sssnic/base/sssnic_api.h
index 168aa152b9..29962aabf8 100644
--- a/drivers/net/sssnic/base/sssnic_api.h
+++ b/drivers/net/sssnic/base/sssnic_api.h
@@ -45,5 +45,7 @@ int sssnic_netif_link_status_get(struct sssnic_hw *hw, 
uint8_t *status);
 int sssnic_netif_link_info_get(struct sssnic_hw *hw,
struct sssnic_netif_link_info *info);
 int sssnic_netif_enable_set(struct sssnic_hw *hw, uint8_t state);
+int sssnic_port_enable_set(struct sssnic_hw *hw, bool state);
+int sssnic_rxq_flush(struct sssnic_hw *hw, uint16_t qid);
 
 #endif /* _SSSNIC_API_H_ */
diff --git a/drivers/net/sssnic/base/sssnic_cmd.h 
b/drivers/net/sssnic/base/sssnic_cmd.h
index 6957b742fc..6364058d36 100644
--- a/drivers/net/sssnic/base/sssnic_cmd.h
+++ b/drivers/net/sssnic/base/sssnic_cmd.h
@@ -35,6 +35,37 @@ enum sssnic_netif_cmd_id {
SSSNIC_GET_NETIF_LINK_INFO_CMD = 153,
 };
 
+enum sssnic_port_cmd_id {
+   SSSNIC_REGISTER_VF_PORT_CMD = 0,
+   SSSNIC_SET_PORT_RXTX_SIZE_CMD = 5,
+   SSSNIC_SET_PORT_ENABLE_CMD = 6,
+   SSSNIC_SET_PORT_RX_MODE_CMD = 7,
+   SSSNIC_SET_PORT_TX_CI_ATTR_CMD = 8,
+   SSSNIC_GET_PORT_STATS_CMD = 9,
+   SSSNIC_CLEAR_PORT_STATS_CMD = 10,
+
+   SSSNIC_CLEAN_PORT_RES_CMD = 11,
+
+   SSSNIC_PORT_LRO_CFG_CMD = 13,
+   SSSNIC_PORT_LRO_TIMER_CMD = 14,
+   SSSNIC_PORT_FEATURE_CMD = 15,
+
+   SSSNIC_SET_PORT_VLAN_FILTER_CMD = 25,
+   SSSNIC_ENABLE_PORT_VLAN_FILTER_CMD = 26,
+   SSSNIC_ENABLE_PORT_VLAN_STRIP_CMD = 27,
+
+   SSSNIC_PORT_FLOW_CTRL_CMD = 101,
+};
+
+enum sssnic_ctrlq_cmd_id {
+   SSSNIC_SET_RXTXQ_CTX_CMD = 0,
+   SSSNIC_RESET_OFFLOAD_CTX_CMD = 1,
+   SSSNIC_SET_RSS_INDIR_TABLE_CMD = 4,
+   SSSNIC_SET_RSS_KEY_CTRLQ_CMD = 5,
+   SSSNIC_GET_RSS_INDIR_TABLE_CMD = 6,
+   SSSNIC_FLUSH_RXQ_CMD = 10,
+};
+
 struct sssnic_cmd_common {
uint8_t status;
uint8_t version;
@@ -187,4 +218,22 @@ struct sssnic_netif_enable_set_cmd {
uint8_t resvd1[3];
 };
 
+struct sssnic_port_enable_set_cmd {
+   struct sssnic_cmd_common common;
+   uint16_t function;
+   uint16_t resvd0;
+

[PATCH v4 01/32] net/sssnic: add build and doc infrastructure

2023-09-01 Thread wanry
From: Renyong Wan 

Adding minimum PMD code, doc and build infrastructure for sssnic.

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Fixed 'Title underline too short' in doc/guides/nics/sssnic.rst.
* Removed error.h from including files.
---
 .mailmap|  5 +-
 MAINTAINERS |  8 
 doc/guides/nics/features/sssnic.ini |  9 
 doc/guides/nics/index.rst   |  1 +
 doc/guides/nics/sssnic.rst  | 73 +
 drivers/net/meson.build |  1 +
 drivers/net/sssnic/meson.build  | 18 +++
 drivers/net/sssnic/sssnic_ethdev.c  | 28 +++
 8 files changed, 140 insertions(+), 3 deletions(-)
 create mode 100644 doc/guides/nics/features/sssnic.ini
 create mode 100644 doc/guides/nics/sssnic.rst
 create mode 100644 drivers/net/sssnic/meson.build
 create mode 100644 drivers/net/sssnic/sssnic_ethdev.c

diff --git a/.mailmap b/.mailmap
index 864d33ee46..6fa73d3b79 100644
--- a/.mailmap
+++ b/.mailmap
@@ -151,7 +151,6 @@ Bao-Long Tran 
 Bar Neuman 
 Barak Enat 
 Barry Cao 
-Bartosz Staszewski 
 Baruch Siach 
 Bassam Zaid AlKilani 
 Beilei Xing 
@@ -496,7 +495,6 @@ Helin Zhang 
 Hemant Agrawal  
 Heng Ding 
 Hengjian Zhang 
-Heng Jiang 
 Heng Wang 
 Henning Schild 
 Henry Cai 
@@ -630,7 +628,6 @@ Jie Liu 
 Jie Pan 
 Jie Wang 
 Jie Zhou  
-Jieqiang Wang 
 Jijiang Liu 
 Jilei Chen 
 Jim Harris 
@@ -1156,6 +1153,7 @@ Rebecca Troy 
 Remi Pommarel 
 Remy Horton 
 Renata Saiakhova 
+Renyong Wan 
 Reshma Pattan  
 Ricardo Roldan 
 Ricardo Salveti 
@@ -1329,6 +1327,7 @@ Stephen Hurd  

 Steve Capper 
 Steven Lariau 
 Steven Luong 
+Steven Song 
 Steven Webster 
 Steven Zou 
 Steve Rempe 
diff --git a/MAINTAINERS b/MAINTAINERS
index a926155f26..1e57d29aa3 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -633,6 +633,13 @@ F: drivers/net/af_xdp/
 F: doc/guides/nics/af_xdp.rst
 F: doc/guides/nics/features/af_xdp.ini
 
+3SNIC sssnic
+M: Renyong Wan 
+M: Steven Song 
+F: driver/net/sssnic/
+F: doc/guides/nics/sssnic.rst
+F: doc/guides/nics/features/sssnic.ini
+
 Amazon ENA
 M: Michal Krawczyk 
 M: Shai Brandes 
@@ -1793,6 +1800,7 @@ F: doc/guides/tools/img/eventdev_*
 F: app/test/test_event_ring.c
 
 Procinfo tool
+M: Maryam Tahhan 
 M: Reshma Pattan 
 F: app/proc-info/
 F: doc/guides/tools/proc_info.rst
diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
new file mode 100644
index 00..6d9786db7e
--- /dev/null
+++ b/doc/guides/nics/features/sssnic.ini
@@ -0,0 +1,9 @@
+;
+; Supported features of the 'sssnic' network poll mode driver.
+;
+; Refer to default.ini for the full list of available PMD features.
+;
+[Features]
+Linux= Y
+ARMv8= Y
+x86-64   = Y
diff --git a/doc/guides/nics/index.rst b/doc/guides/nics/index.rst
index 7bfcac880f..9d2b29383b 100644
--- a/doc/guides/nics/index.rst
+++ b/doc/guides/nics/index.rst
@@ -61,6 +61,7 @@ Network Interface Controller Drivers
 qede
 sfc_efx
 softnic
+sssnic
 tap
 thunderx
 txgbe
diff --git a/doc/guides/nics/sssnic.rst b/doc/guides/nics/sssnic.rst
new file mode 100644
index 00..fe0180c2e6
--- /dev/null
+++ b/doc/guides/nics/sssnic.rst
@@ -0,0 +1,73 @@
+..  SPDX-License-Identifier: BSD-3-Clause
+Copyright(c) 2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+
+SSSNIC Poll Mode Driver
+===
+
+The sssnic PMD (**librte_pmd_sssnic**) provides poll mode driver support
+for 3SNIC 9x0 serials family of Ethernet adapters.
+
+
+Supported NICs
+--
+
+- 3S910 Dual Port SFP28 10/25GbE Ethernet adapter
+- 3S920 Quad Port SFP28 10/25GbE Ethernet adapter
+- 3S920 Quad Port QSFP28 100GbE Ethernet adapter
+
+
+Features
+
+
+Features of sssnic PMD are:
+
+- Link status
+- Link status event
+- Queue start/stop
+- Rx interrupt
+- Scattered Rx
+- TSO
+- LRO
+- Promiscuous mode
+- Allmulticast mode
+- Unicast MAC filter
+- Multicast MAC filte
+- RSS hash
+- RSS key update
+- RSS reta update
+- Inner RSS
+- VLAN filter
+- VLAN offload
+- L3 checksum offload
+- L4 checksum offload
+- Inner L3 checksum
+- Inner L4 checksum
+- Basic stats
+- Extended stats
+- Stats per queue
+- Flow control
+- FW version
+- Generic flow API
+
+
+Prerequisites
+-
+
+- Learning about 3SNIC Ethernet NICs using
+  ``_.
+
+- Follow the DPDK :ref:`Getting Started Guide for Linux ` to setup 
the basic DPDK environment.
+
+
+Driver compilation and testing
+--
+
+Refer to the document :ref:`compiling and testing a PMD for a NIC 
`
+for details.
+
+
+Limitations or Known issues
+---
+
+Build with ICC is not supported yet.
+Power8, ARMv7 and BSD are not supported yet.
diff --git a/drivers/net/meson.build b/drivers/net/meson.build
index bd38b533c5..224eab99a7 100644
--- a/drivers/net/meson.build
+++ b/drivers/net/meson.build
@@ -54,6 +54,7 @@ drivers = [

[PATCH v4 02/32] net/sssnic: add log type and log macros

2023-09-01 Thread wanry
From: Renyong Wan 

Adding log macros to print runtime messages and trace functions.

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/sssnic_ethdev.c | 13 
 drivers/net/sssnic/sssnic_log.h| 51 ++
 2 files changed, 64 insertions(+)
 create mode 100644 drivers/net/sssnic/sssnic_log.h

diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index dcda01eeb8..0f1017af9d 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -5,11 +5,14 @@
 #include 
 #include 
 
+#include "sssnic_log.h"
+
 static int
 sssnic_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device 
*pci_dev)
 {
RTE_SET_USED(pci_drv);
RTE_SET_USED(pci_dev);
+   PMD_INIT_FUNC_TRACE();
return -EINVAL;
 }
 
@@ -17,6 +20,7 @@ static int
 sssnic_pci_remove(struct rte_pci_device *pci_dev)
 {
RTE_SET_USED(pci_dev);
+   PMD_INIT_FUNC_TRACE();
return -EINVAL;
 }
 
@@ -26,3 +30,12 @@ static struct rte_pci_driver sssnic_pmd = {
 };
 
 RTE_PMD_REGISTER_PCI(net_sssnic, sssnic_pmd);
+
+RTE_LOG_REGISTER_SUFFIX(sssnic_logtype_driver, driver, INFO);
+RTE_LOG_REGISTER_SUFFIX(sssnic_logtype_init, init, NOTICE);
+#ifdef RTE_ETHDEV_DEBUG_RX
+RTE_LOG_REGISTER_SUFFIX(sssnic_logtype_rx, rx, DEBUG);
+#endif /*RTE_ETHDEV_DEBUG_RX*/
+#ifdef RTE_ETHDEV_DEBUG_TX
+RTE_LOG_REGISTER_SUFFIX(sssnic_logtype_tx, tx, DEBUG);
+#endif /*RTE_ETHDEV_DEBUG_TX*/
diff --git a/drivers/net/sssnic/sssnic_log.h b/drivers/net/sssnic/sssnic_log.h
new file mode 100644
index 00..629e12100c
--- /dev/null
+++ b/drivers/net/sssnic/sssnic_log.h
@@ -0,0 +1,51 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#ifndef _SSSNIC_LOG_H_
+#define _SSSNIC_LOG_H_
+
+#include 
+
+extern int sssnic_logtype_driver;
+extern int sssnic_logtype_init;
+
+#define SSSNIC_LOG_NAME "sssnic"
+#define PMD_DRV_LOG(level, fmt, args...)   
\
+   rte_log(RTE_LOG_##level, sssnic_logtype_driver,\
+   SSSNIC_LOG_NAME ": " fmt "\n", ##args)
+#define PMD_INIT_LOG(level, fmt, args...)  
\
+   rte_log(RTE_LOG_##level, sssnic_logtype_init, "%s(): " fmt "\n",   \
+   __func__, ##args)
+
+#define SSSNIC_DEBUG(fmt, args...) 
\
+   PMD_DRV_LOG(DEBUG, "[%s():%d] " fmt, __func__, __LINE__, ##args)
+
+/*
+ * Trace driver init and uninit.
+ */
+#define PMD_INIT_FUNC_TRACE() PMD_INIT_LOG(DEBUG, " >>")
+
+#ifdef RTE_ETHDEV_DEBUG_RX
+extern int sssnic_logtype_rx;
+#define SSSNIC_RX_LOG(level, fmt, args...) 
\
+   rte_log(RTE_LOG_##level, sssnic_logtype_rx,\
+   "sssnic_rx: [%s():%d] " fmt "\n", __func__, __LINE__, ##args)
+#else
+#define SSSNIC_RX_LOG(level, fmt, args...) 
\
+   do {   \
+   } while (0)
+#endif /*RTE_ETHDEV_DEBUG_RX*/
+
+#ifdef RTE_ETHDEV_DEBUG_TX
+extern int sssnic_logtype_tx;
+#define SSSNIC_TX_LOG(level, fmt, args...) 
\
+   rte_log(RTE_LOG_##level, sssnic_logtype_rx,\
+   "sssnic_tx: [%s():%d] " fmt "\n", __func__, __LINE__, ##args)
+#else
+#define SSSNIC_TX_LOG(level, fmt, args...) 
\
+   do {   \
+   } while (0)
+#endif /*RTE_ETHDEV_DEBUG_TX*/
+
+#endif /*_SSSNIC_LOG_H_*/
-- 
2.27.0



[PATCH v4 04/32] net/sssnic: initialize hardware base

2023-09-01 Thread wanry
From: Renyong Wan 

Initializing hardware base make hardware ready to be access.

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/base/meson.build  |  13 ++
 drivers/net/sssnic/base/sssnic_hw.c  | 207 +++
 drivers/net/sssnic/base/sssnic_hw.h  |  49 +++
 drivers/net/sssnic/base/sssnic_reg.h | 169 ++
 drivers/net/sssnic/meson.build   |   3 +
 drivers/net/sssnic/sssnic_ethdev.c   |  46 +-
 drivers/net/sssnic/sssnic_ethdev.h   |  18 +++
 7 files changed, 501 insertions(+), 4 deletions(-)
 create mode 100644 drivers/net/sssnic/base/meson.build
 create mode 100644 drivers/net/sssnic/base/sssnic_hw.c
 create mode 100644 drivers/net/sssnic/base/sssnic_reg.h
 create mode 100644 drivers/net/sssnic/sssnic_ethdev.h

diff --git a/drivers/net/sssnic/base/meson.build 
b/drivers/net/sssnic/base/meson.build
new file mode 100644
index 00..3e64112c72
--- /dev/null
+++ b/drivers/net/sssnic/base/meson.build
@@ -0,0 +1,13 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+
+sources = [
+'sssnic_hw.c',
+]
+
+c_args = cflags
+base_lib = static_library('sssnic_base', sources,
+   dependencies: [static_rte_eal, static_rte_ethdev, static_rte_bus_pci, 
static_rte_net],
+   c_args: c_args)
+
+base_objs = base_lib.extract_all_objects()
diff --git a/drivers/net/sssnic/base/sssnic_hw.c 
b/drivers/net/sssnic/base/sssnic_hw.c
new file mode 100644
index 00..8b7bba7644
--- /dev/null
+++ b/drivers/net/sssnic/base/sssnic_hw.c
@@ -0,0 +1,207 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#include 
+#include 
+#include 
+
+#include "../sssnic_log.h"
+#include "sssnic_hw.h"
+#include "sssnic_reg.h"
+
+static int
+wait_for_sssnic_hw_ready(struct sssnic_hw *hw)
+{
+   struct sssnic_attr1_reg reg;
+   uint32_t timeout_ms = 10;
+
+   do {
+   reg.u32 = sssnic_cfg_reg_read(hw, SSSNIC_ATTR1_REG);
+   if (reg.u32 != 0x && reg.mgmt_init_status != 0)
+   return 0;
+   rte_delay_ms(1);
+   } while (--timeout_ms);
+
+   return -EBUSY;
+}
+
+static int
+wait_for_sssnic_db_enabled(struct sssnic_hw *hw)
+{
+   struct sssnic_attr4_reg r4;
+   struct sssnic_attr5_reg r5;
+   uint32_t timeout_ms = 6;
+
+   do {
+   r4.u32 = sssnic_cfg_reg_read(hw, SSSNIC_ATTR4_REG);
+   r5.u32 = sssnic_cfg_reg_read(hw, SSSNIC_ATTR5_REG);
+   if (r4.db_ctrl == SSSNIC_DB_CTRL_ENABLE &&
+   r5.outbound_ctrl == SSSNIC_DB_CTRL_ENABLE)
+   return 0;
+   rte_delay_ms(1);
+   } while (--timeout_ms);
+
+   return -EBUSY;
+}
+
+static void
+sssnic_attr_setup(struct sssnic_hw *hw)
+{
+   struct sssnic_attr0_reg attr0;
+   struct sssnic_attr1_reg attr1;
+   struct sssnic_attr2_reg attr2;
+   struct sssnic_attr3_reg attr3;
+   struct sssnic_hw_attr *attr = &hw->attr;
+
+   attr0.u32 = sssnic_cfg_reg_read(hw, SSSNIC_ATTR0_REG);
+   attr1.u32 = sssnic_cfg_reg_read(hw, SSSNIC_ATTR1_REG);
+   attr2.u32 = sssnic_cfg_reg_read(hw, SSSNIC_ATTR2_REG);
+   attr3.u32 = sssnic_cfg_reg_read(hw, SSSNIC_ATTR3_REG);
+
+   attr->func_idx = attr0.func_idx;
+   attr->pf_idx = attr0.pf_idx;
+   attr->pci_idx = attr0.pci_idx;
+   attr->vf_off = attr0.vf_off;
+   attr->func_type = attr0.func_type;
+   attr->af_idx = attr1.af_idx;
+   attr->num_aeq = RTE_BIT32(attr1.num_aeq);
+   attr->num_ceq = attr2.num_ceq;
+   attr->num_irq = attr2.num_irq;
+   attr->global_vf_off = attr3.global_vf_off;
+
+   PMD_DRV_LOG(DEBUG, "attr0=0x%x, attr1=0x%x, attr2=0x%x, attr3=0x%x",
+   attr0.u32, attr1.u32, attr2.u32, attr3.u32);
+}
+
+/* AF and MF election */
+static void
+sssnic_af_setup(struct sssnic_hw *hw)
+{
+   struct sssnic_af_election_reg reg0;
+   struct sssnic_mf_election_reg reg1;
+
+   /* AF election */
+   reg0.u32 = sssnic_mgmt_reg_read(hw, SSSNIC_AF_ELECTION_REG);
+   reg0.func_idx = hw->attr.func_idx;
+   sssnic_mgmt_reg_write(hw, SSSNIC_AF_ELECTION_REG, reg0.u32);
+   reg0.u32 = sssnic_mgmt_reg_read(hw, SSSNIC_AF_ELECTION_REG);
+   hw->attr.af_idx = reg0.func_idx;
+   if (hw->attr.af_idx == hw->attr.func_idx) {
+   hw->attr.func_type = SSSNIC_FUNC_TYPE_AF;
+   PMD_DRV_LOG(INFO, "Elected PF %d as AF", hw->attr.func_idx);
+
+   /* MF election */
+   reg1.u32 = sssnic_mgmt_reg_read(hw, SSSNIC_MF_ELECTION_REG);
+   reg1.func_idx = hw->attr.func_idx;
+   sssnic_mgmt_reg_write(hw, SSSNIC_MF_ELECTION_REG, reg1.u32);
+   reg1.u32 = sssnic_mgmt_reg_read(hw, SSSNIC_MF_ELECTION_REG);
+   hw->attr.mf_idx = reg1.func_idx;
+   if (hw->at

[PATCH v4 03/32] net/sssnic: support probe and remove

2023-09-01 Thread wanry
From: Renyong Wan 

Register device ID for 3SNIC ethernet adapter to support
PCI ethdev probe and remove.

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/base/sssnic_hw.h | 11 +
 drivers/net/sssnic/sssnic_ethdev.c  | 37 +
 2 files changed, 44 insertions(+), 4 deletions(-)
 create mode 100644 drivers/net/sssnic/base/sssnic_hw.h

diff --git a/drivers/net/sssnic/base/sssnic_hw.h 
b/drivers/net/sssnic/base/sssnic_hw.h
new file mode 100644
index 00..db916b1977
--- /dev/null
+++ b/drivers/net/sssnic/base/sssnic_hw.h
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#ifndef _SSSNIC_HW_H_
+#define _SSSNIC_HW_H_
+
+#define SSSNIC_PCI_VENDOR_ID 0x1F3F
+#define SSSNIC_DEVICE_ID_STD 0x9020
+
+#endif /* _SSSNIC_HW_H_ */
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index 0f1017af9d..4f8b5c2684 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -6,25 +6,54 @@
 #include 
 
 #include "sssnic_log.h"
+#include "base/sssnic_hw.h"
+
+static int
+sssnic_ethdev_init(struct rte_eth_dev *ethdev)
+{
+   RTE_SET_USED(ethdev);
+   PMD_INIT_FUNC_TRACE();
+
+   return -EINVAL;
+}
+
+static int
+sssnic_ethdev_uninit(struct rte_eth_dev *ethdev)
+{
+   RTE_SET_USED(ethdev);
+   PMD_INIT_FUNC_TRACE();
+
+   if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+   return 0;
+
+   return -EINVAL;
+}
 
 static int
 sssnic_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device 
*pci_dev)
 {
RTE_SET_USED(pci_drv);
-   RTE_SET_USED(pci_dev);
PMD_INIT_FUNC_TRACE();
-   return -EINVAL;
+
+   return rte_eth_dev_pci_generic_probe(pci_dev, 0, sssnic_ethdev_init);
 }
 
 static int
 sssnic_pci_remove(struct rte_pci_device *pci_dev)
 {
-   RTE_SET_USED(pci_dev);
PMD_INIT_FUNC_TRACE();
-   return -EINVAL;
+
+   return rte_eth_dev_pci_generic_remove(pci_dev, sssnic_ethdev_uninit);
 }
 
+static const struct rte_pci_id sssnic_pci_id_map[] = {
+   { RTE_PCI_DEVICE(SSSNIC_PCI_VENDOR_ID, SSSNIC_DEVICE_ID_STD) },
+   { .vendor_id = 0 },
+};
+
 static struct rte_pci_driver sssnic_pmd = {
+   .id_table = sssnic_pci_id_map,
+   .drv_flags = RTE_PCI_DRV_NEED_MAPPING,
.probe = sssnic_pci_probe,
.remove = sssnic_pci_remove,
 };
-- 
2.27.0



[PATCH v4 06/32] net/sssnic/base: add message definition and utility

2023-09-01 Thread wanry
From: Renyong Wan 

sssnic message is used to encapsulate sssnic command for transmission
between driver and firmware. sssnic message is sent by driver via mail
box and is received by driver via event queue.

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Removed error.h from including files.
---
 drivers/net/sssnic/base/meson.build |   3 +-
 drivers/net/sssnic/base/sssnic_eventq.c |  29 +++
 drivers/net/sssnic/base/sssnic_hw.c |  15 +-
 drivers/net/sssnic/base/sssnic_hw.h |   2 +
 drivers/net/sssnic/base/sssnic_msg.c| 254 
 drivers/net/sssnic/base/sssnic_msg.h| 166 
 6 files changed, 467 insertions(+), 2 deletions(-)
 create mode 100644 drivers/net/sssnic/base/sssnic_msg.c
 create mode 100644 drivers/net/sssnic/base/sssnic_msg.h

diff --git a/drivers/net/sssnic/base/meson.build 
b/drivers/net/sssnic/base/meson.build
index 7758faa482..dd4dd08fc1 100644
--- a/drivers/net/sssnic/base/meson.build
+++ b/drivers/net/sssnic/base/meson.build
@@ -3,7 +3,8 @@
 
 sources = [
 'sssnic_hw.c',
-'sssnic_eventq.c'
+'sssnic_eventq.c',
+'sssnic_msg.c',
 ]
 
 c_args = cflags
diff --git a/drivers/net/sssnic/base/sssnic_eventq.c 
b/drivers/net/sssnic/base/sssnic_eventq.c
index a74b74f756..e90d24bb6b 100644
--- a/drivers/net/sssnic/base/sssnic_eventq.c
+++ b/drivers/net/sssnic/base/sssnic_eventq.c
@@ -14,6 +14,7 @@
 #include "../sssnic_log.h"
 #include "sssnic_hw.h"
 #include "sssnic_reg.h"
+#include "sssnic_msg.h"
 #include "sssnic_eventq.h"
 
 #define SSSNIC_EVENTQ_DEF_DEPTH 64
@@ -184,6 +185,32 @@ sssnic_eventq_ci_update(struct sssnic_eventq *eq, int 
informed)
sssnic_eventq_reg_write(eq, SSSNIC_EVENTQ_CI_CTRL_REG, reg.u32);
 }
 
+static int
+sssnic_event_default_handler_func(struct sssnic_eventq *eq,
+   struct sssnic_event *ev, __rte_unused void *data)
+{
+   struct sssnic_hw *hw;
+   int ret;
+
+   hw = eq->hw;
+   ret = sssnic_msg_rx_handle(hw, (struct sssnic_msg_hdr *)(ev->data));
+   if (ret != SSSNIC_MSG_DONE)
+   return -1;
+
+   return SSSNIC_EVENT_DONE;
+}
+
+static void
+sssnic_eventq_handlers_init(struct sssnic_eventq *eq)
+{
+   int i;
+
+   for (i = SSSNIC_EVENT_CODE_MIN; i <= SSSNIC_EVENT_CODE_MAX; i++) {
+   eq->handlers[i].func = sssnic_event_default_handler_func;
+   eq->handlers[i].data = NULL;
+   }
+}
+
 static int
 sssnic_eventq_init(struct sssnic_hw *hw, struct sssnic_eventq *eq, uint16_t 
qid)
 {
@@ -230,6 +257,8 @@ sssnic_eventq_init(struct sssnic_hw *hw, struct 
sssnic_eventq *eq, uint16_t qid)
PMD_DRV_LOG(ERR, "Failed to setup eventq pages!");
return ret;
}
+
+   sssnic_eventq_handlers_init(eq);
sssnic_eventq_ctrl_setup(eq);
sssnic_eventq_ci_update(eq, 1);
if (qid == 0)
diff --git a/drivers/net/sssnic/base/sssnic_hw.c 
b/drivers/net/sssnic/base/sssnic_hw.c
index 44e04486a5..387c823c7e 100644
--- a/drivers/net/sssnic/base/sssnic_hw.c
+++ b/drivers/net/sssnic/base/sssnic_hw.c
@@ -10,6 +10,7 @@
 #include "sssnic_hw.h"
 #include "sssnic_reg.h"
 #include "sssnic_eventq.h"
+#include "sssnic_msg.h"
 
 static int
 wait_for_sssnic_hw_ready(struct sssnic_hw *hw)
@@ -197,18 +198,30 @@ sssnic_hw_init(struct sssnic_hw *hw)
return ret;
}
 
+   ret = sssnic_msg_inbox_init(hw);
+   if (ret) {
+   PMD_DRV_LOG(ERR, "Failed to initialize message inbox.");
+   return ret;
+   }
+
ret = sssnic_eventq_all_init(hw);
if (ret != 0) {
PMD_DRV_LOG(ERR, "Failed to initialize event queues");
-   return ret;
+   goto eventq_init_fail;
}
 
return -EINVAL;
+
+eventq_init_fail:
+   sssnic_msg_inbox_shutdown(hw);
+   return ret;
 }
 
 void
 sssnic_hw_shutdown(struct sssnic_hw *hw)
 {
PMD_INIT_FUNC_TRACE();
+
sssnic_eventq_all_shutdown(hw);
+   sssnic_msg_inbox_shutdown(hw);
 }
diff --git a/drivers/net/sssnic/base/sssnic_hw.h 
b/drivers/net/sssnic/base/sssnic_hw.h
index 6caf3a6d66..38fb9ac1ac 100644
--- a/drivers/net/sssnic/base/sssnic_hw.h
+++ b/drivers/net/sssnic/base/sssnic_hw.h
@@ -52,11 +52,13 @@ struct sssnic_hw {
uint8_t *db_mem_len;
struct sssnic_hw_attr attr;
struct sssnic_eventq *eventqs;
+   struct sssnic_msg_inbox *msg_inbox;
uint8_t num_eventqs;
uint16_t eth_port_id;
 };
 
 #define SSSNIC_ETH_PORT_ID(hw) ((hw)->eth_port_id)
+#define SSSNIC_MPU_FUNC_IDX 0x1fff
 
 int sssnic_hw_init(struct sssnic_hw *hw);
 void sssnic_hw_shutdown(struct sssnic_hw *hw);
diff --git a/drivers/net/sssnic/base/sssnic_msg.c 
b/drivers/net/sssnic/base/sssnic_msg.c
new file mode 100644
index 00..4b98fee75b
--- /dev/null
+++ b/drivers/net/sssnic/base/sssnic_msg.c
@@ -0,0 +1,254 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Techn

[PATCH v4 05/32] net/sssnic: add event queue

2023-09-01 Thread wanry
From: Renyong Wan 

Event queue is intended for receiving event from hardware as well
as mailbox response message.

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v4:
* Fixed dereferencing type-punned pointer.
* Fixed coding style issue of COMPLEX_MACRO.
---
 drivers/net/sssnic/base/meson.build |   1 +
 drivers/net/sssnic/base/sssnic_eventq.c | 432 
 drivers/net/sssnic/base/sssnic_eventq.h |  84 +
 drivers/net/sssnic/base/sssnic_hw.c |   9 +-
 drivers/net/sssnic/base/sssnic_hw.h |   5 +
 drivers/net/sssnic/base/sssnic_reg.h|  51 +++
 drivers/net/sssnic/sssnic_ethdev.c  |   1 +
 7 files changed, 582 insertions(+), 1 deletion(-)
 create mode 100644 drivers/net/sssnic/base/sssnic_eventq.c
 create mode 100644 drivers/net/sssnic/base/sssnic_eventq.h

diff --git a/drivers/net/sssnic/base/meson.build 
b/drivers/net/sssnic/base/meson.build
index 3e64112c72..7758faa482 100644
--- a/drivers/net/sssnic/base/meson.build
+++ b/drivers/net/sssnic/base/meson.build
@@ -3,6 +3,7 @@
 
 sources = [
 'sssnic_hw.c',
+'sssnic_eventq.c'
 ]
 
 c_args = cflags
diff --git a/drivers/net/sssnic/base/sssnic_eventq.c 
b/drivers/net/sssnic/base/sssnic_eventq.c
new file mode 100644
index 00..a74b74f756
--- /dev/null
+++ b/drivers/net/sssnic/base/sssnic_eventq.c
@@ -0,0 +1,432 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "../sssnic_log.h"
+#include "sssnic_hw.h"
+#include "sssnic_reg.h"
+#include "sssnic_eventq.h"
+
+#define SSSNIC_EVENTQ_DEF_DEPTH 64
+#define SSSNIC_EVENTQ_NUM_PAGES 4
+#define SSSNIC_EVENTQ_MAX_PAGE_SZ 0x40
+#define SSSNIC_EVENTQ_MIN_PAGE_SZ 0x1000
+
+#define SSSNIC_EVENT_ADDR(base_addr, event_sz, idx)
\
+   ((struct sssnic_event *)(((uint8_t *)(base_addr)) + ((idx) * 
(event_sz
+
+static inline struct sssnic_event *
+sssnic_eventq_peek(struct sssnic_eventq *eq)
+{
+   uint16_t page = eq->ci / eq->page_len;
+   uint16_t idx = eq->ci % eq->page_len;
+
+   return SSSNIC_EVENT_ADDR(eq->pages[page]->addr, eq->entry_size, idx);
+}
+
+static inline void
+sssnic_eventq_reg_write(struct sssnic_eventq *eq, uint32_t reg, uint32_t val)
+{
+   sssnic_cfg_reg_write(eq->hw, reg, val);
+}
+
+static inline uint32_t
+sssnic_eventq_reg_read(struct sssnic_eventq *eq, uint32_t reg)
+{
+   return sssnic_cfg_reg_read(eq->hw, reg);
+}
+
+static inline void
+sssnic_eventq_reg_write64(struct sssnic_eventq *eq, uint32_t reg, uint64_t val)
+{
+   sssnic_cfg_reg_write(eq->hw, reg, (uint32_t)((val >> 16) >> 16));
+   sssnic_cfg_reg_write(eq->hw, reg + sizeof(uint32_t), (uint32_t)val);
+}
+
+/* all eventq registers that to be access must be selected first */
+static inline void
+sssnic_eventq_reg_select(struct sssnic_eventq *eq)
+{
+   sssnic_eventq_reg_write(eq, SSSNIC_EVENTQ_IDX_SEL_REG, eq->qid);
+}
+
+static const struct rte_memzone *
+sssnic_eventq_page_alloc(struct sssnic_eventq *eq, int page_idx)
+{
+   const struct rte_memzone *mz = NULL;
+   char mz_name[RTE_MEMZONE_NAMESIZE];
+
+   snprintf(mz_name, sizeof(mz_name), "sssnic%u_eq%d_page%d",
+   SSSNIC_ETH_PORT_ID(eq->hw), eq->qid, page_idx);
+   mz = rte_memzone_reserve_aligned(mz_name, eq->page_size, SOCKET_ID_ANY,
+   RTE_MEMZONE_IOVA_CONTIG, eq->page_size);
+   return mz;
+}
+
+static uint32_t
+sssnic_eventq_page_size_calc(uint32_t depth, uint32_t entry_size)
+{
+   uint32_t pages = SSSNIC_EVENTQ_NUM_PAGES;
+   uint32_t size;
+
+   size = RTE_ALIGN(depth * entry_size, SSSNIC_EVENTQ_MIN_PAGE_SZ);
+   if (size <= pages * SSSNIC_EVENTQ_MIN_PAGE_SZ) {
+   /* use minimum page size */
+   return SSSNIC_EVENTQ_MIN_PAGE_SZ;
+   }
+
+   /* Calculate how many pages of minimum size page the big size page 
covers */
+   size = RTE_ALIGN(size / pages, SSSNIC_EVENTQ_MIN_PAGE_SZ);
+   pages = rte_fls_u32(size / SSSNIC_EVENTQ_MIN_PAGE_SZ);
+
+   return SSSNIC_EVENTQ_MIN_PAGE_SZ * pages;
+}
+
+static int
+sssnic_eventq_pages_setup(struct sssnic_eventq *eq)
+{
+   const struct rte_memzone *mz;
+   struct sssnic_event *ev;
+   int i, j;
+
+   eq->pages = rte_zmalloc(NULL,
+   eq->num_pages * sizeof(struct rte_memzone *), 1);
+   if (eq->pages == NULL) {
+   PMD_DRV_LOG(ERR, "Could not alloc memory for pages");
+   return -ENOMEM;
+   }
+
+   for (i = 0; i < eq->num_pages; i++) {
+   mz = sssnic_eventq_page_alloc(eq, i);
+   if (mz == NULL) {
+   PMD_DRV_LOG(ERR,
+   "Could not alloc DMA memory for eventq page %d",
+   i);
+   goto alloc_dma_fail;
+   }
+   /* init even

[PATCH v4 08/32] net/sssnic/base: add work queue

2023-09-01 Thread wanry
From: Renyong Wan 

Work queue is used to maintain hardware queue information by
driver, it is usually used in control queue, rx queue
and tx queue.

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Removed error.h from including files.
---
 drivers/net/sssnic/base/meson.build|   1 +
 drivers/net/sssnic/base/sssnic_workq.c | 141 +
 drivers/net/sssnic/base/sssnic_workq.h | 108 +++
 3 files changed, 250 insertions(+)
 create mode 100644 drivers/net/sssnic/base/sssnic_workq.c
 create mode 100644 drivers/net/sssnic/base/sssnic_workq.h

diff --git a/drivers/net/sssnic/base/meson.build 
b/drivers/net/sssnic/base/meson.build
index 4abd1a0daf..7c23a82ff3 100644
--- a/drivers/net/sssnic/base/meson.build
+++ b/drivers/net/sssnic/base/meson.build
@@ -6,6 +6,7 @@ sources = [
 'sssnic_eventq.c',
 'sssnic_msg.c',
 'sssnic_mbox.c',
+'sssnic_workq.c',
 ]
 
 c_args = cflags
diff --git a/drivers/net/sssnic/base/sssnic_workq.c 
b/drivers/net/sssnic/base/sssnic_workq.c
new file mode 100644
index 00..25b7585246
--- /dev/null
+++ b/drivers/net/sssnic/base/sssnic_workq.c
@@ -0,0 +1,141 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include "../sssnic_log.h"
+#include "sssnic_workq.h"
+
+/* Consume num_entries and increase CI
+ * Return the first entry address of previous CI position
+ */
+void *
+sssnic_workq_consume(struct sssnic_workq *workq, uint16_t num_entries,
+   uint16_t *ci)
+{
+   void *e;
+   uint16_t current_ci;
+
+   if (workq->idle_entries + num_entries > workq->num_entries)
+   return NULL;
+
+   current_ci = sssnic_workq_ci_get(workq);
+   e = (void *)sssnic_workq_entry_get(workq, current_ci);
+   workq->idle_entries += num_entries;
+   workq->ci += num_entries;
+   if (ci != NULL)
+   *ci = current_ci;
+
+   return e;
+}
+
+/* Produce num_entries and increase pi.
+ * Return the first entry address of previous PI position
+ */
+void *
+sssnic_workq_produce(struct sssnic_workq *workq, uint16_t num_entries,
+   uint16_t *pi)
+{
+   void *e;
+   uint16_t current_pi;
+
+   if (workq->idle_entries < num_entries)
+   return NULL;
+
+   current_pi = sssnic_workq_pi_get(workq);
+   e = (void *)sssnic_workq_entry_get(workq, current_pi);
+   workq->idle_entries -= num_entries;
+   workq->pi += num_entries;
+   if (pi != NULL)
+   *pi = current_pi;
+
+   return e;
+}
+
+static int
+sssnic_workq_init(struct sssnic_workq *workq, const char *name, int socket_id,
+   uint32_t entry_size, uint32_t depth)
+{
+   char zname[RTE_MEMZONE_NAMESIZE];
+
+   if (!rte_is_power_of_2(entry_size)) {
+   PMD_DRV_LOG(ERR,
+   "The entry size(%u) of workq(%s) is not power of 2",
+   entry_size, name);
+   return -EINVAL;
+   }
+
+   if (!rte_is_power_of_2(depth)) {
+   PMD_DRV_LOG(ERR, "The depth(%u) of workq(%s) is not power of 2",
+   depth, name);
+   return -EINVAL;
+   }
+
+   workq->buf_size = entry_size * depth;
+   workq->entry_size = entry_size;
+   workq->entry_shift = rte_log2_u32(entry_size);
+   workq->num_entries = depth;
+   workq->idle_entries = depth;
+   workq->index_mask = depth - 1;
+
+   snprintf(zname, sizeof(zname), "%s_mz", name);
+   workq->buf_mz = rte_memzone_reserve_aligned(zname, workq->buf_size,
+   socket_id, RTE_MEMZONE_IOVA_CONTIG, RTE_PGSIZE_256K);
+   if (workq->buf_mz == NULL) {
+   PMD_DRV_LOG(ERR, "Failed to alloc DMA memory for %s", name);
+   return -ENOMEM;
+   }
+   workq->buf_addr = workq->buf_mz->addr;
+   workq->buf_phyaddr = workq->buf_mz->iova;
+
+   return 0;
+}
+
+static void
+sssnic_workq_cleanup(struct sssnic_workq *workq)
+{
+   if (workq != NULL && workq->buf_mz != NULL)
+   rte_memzone_free(workq->buf_mz);
+}
+
+/* Cleanup a work queue and free it*/
+void
+sssnic_workq_destroy(struct sssnic_workq *workq)
+{
+   if (workq != NULL) {
+   sssnic_workq_cleanup(workq);
+   rte_free(workq);
+   }
+}
+
+/*Create a work queue and initialize*/
+struct sssnic_workq *
+sssnic_workq_new(const char *name, int socket_id, uint32_t entry_size,
+   uint32_t depth)
+{
+   int ret;
+   struct sssnic_workq *workq;
+
+   if (name == NULL) {
+   PMD_DRV_LOG(ERR, "Bad parameter, workq name is NULL");
+   return NULL;
+   }
+
+   workq = rte_zmalloc(name, sizeof(struct sssnic_workq), 0);
+   if (workq == NULL) {
+   PMD_DRV_LOG(ERR, "Could not alloc memory for  %s", name);
+   return NULL;
+   }
+   ret = sssnic_workq_

[PATCH v4 07/32] net/sssnic/base: add mailbox support

2023-09-01 Thread wanry
From: Renyong Wan 

Mailbox is a message channel used to communicate between PF and
VF as well as driver and hardware functions.
Mailbox messages are received by driver through event queue, and
sent by driver through registers of mailbox.
There are two transfer modes for sending mailbox message, one is
DMA mode used to send message to PF, another is inline mode used
to send message to VF.

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v3:
* Fixed dereferencing type-punned pointer.
---
 drivers/net/sssnic/base/meson.build   |   1 +
 drivers/net/sssnic/base/sssnic_hw.c   |  10 +
 drivers/net/sssnic/base/sssnic_hw.h   |   4 +
 drivers/net/sssnic/base/sssnic_mbox.c | 615 ++
 drivers/net/sssnic/base/sssnic_mbox.h |  45 ++
 drivers/net/sssnic/base/sssnic_misc.h |  11 +
 drivers/net/sssnic/base/sssnic_reg.h  |  47 ++
 7 files changed, 733 insertions(+)
 create mode 100644 drivers/net/sssnic/base/sssnic_mbox.c
 create mode 100644 drivers/net/sssnic/base/sssnic_mbox.h
 create mode 100644 drivers/net/sssnic/base/sssnic_misc.h

diff --git a/drivers/net/sssnic/base/meson.build 
b/drivers/net/sssnic/base/meson.build
index dd4dd08fc1..4abd1a0daf 100644
--- a/drivers/net/sssnic/base/meson.build
+++ b/drivers/net/sssnic/base/meson.build
@@ -5,6 +5,7 @@ sources = [
 'sssnic_hw.c',
 'sssnic_eventq.c',
 'sssnic_msg.c',
+'sssnic_mbox.c',
 ]
 
 c_args = cflags
diff --git a/drivers/net/sssnic/base/sssnic_hw.c 
b/drivers/net/sssnic/base/sssnic_hw.c
index 387c823c7e..ff527b2c7f 100644
--- a/drivers/net/sssnic/base/sssnic_hw.c
+++ b/drivers/net/sssnic/base/sssnic_hw.c
@@ -11,6 +11,7 @@
 #include "sssnic_reg.h"
 #include "sssnic_eventq.h"
 #include "sssnic_msg.h"
+#include "sssnic_mbox.h"
 
 static int
 wait_for_sssnic_hw_ready(struct sssnic_hw *hw)
@@ -210,8 +211,16 @@ sssnic_hw_init(struct sssnic_hw *hw)
goto eventq_init_fail;
}
 
+   ret = sssnic_mbox_init(hw);
+   if (ret) {
+   PMD_DRV_LOG(ERR, "Failed to initialize mailbox");
+   goto mbox_init_fail;
+   }
+
return -EINVAL;
 
+mbox_init_fail:
+   sssnic_eventq_all_shutdown(hw);
 eventq_init_fail:
sssnic_msg_inbox_shutdown(hw);
return ret;
@@ -222,6 +231,7 @@ sssnic_hw_shutdown(struct sssnic_hw *hw)
 {
PMD_INIT_FUNC_TRACE();
 
+   sssnic_mbox_shutdown(hw);
sssnic_eventq_all_shutdown(hw);
sssnic_msg_inbox_shutdown(hw);
 }
diff --git a/drivers/net/sssnic/base/sssnic_hw.h 
b/drivers/net/sssnic/base/sssnic_hw.h
index 38fb9ac1ac..41e65f5880 100644
--- a/drivers/net/sssnic/base/sssnic_hw.h
+++ b/drivers/net/sssnic/base/sssnic_hw.h
@@ -53,12 +53,16 @@ struct sssnic_hw {
struct sssnic_hw_attr attr;
struct sssnic_eventq *eventqs;
struct sssnic_msg_inbox *msg_inbox;
+   struct sssnic_mbox *mbox;
uint8_t num_eventqs;
uint16_t eth_port_id;
 };
 
+#define SSSNIC_FUNC_IDX(hw) ((hw)->attr.func_idx)
 #define SSSNIC_ETH_PORT_ID(hw) ((hw)->eth_port_id)
 #define SSSNIC_MPU_FUNC_IDX 0x1fff
+#define SSSNIC_FUNC_TYPE(hw) ((hw)->attr.func_type)
+#define SSSNIC_AF_FUNC_IDX(hw) ((hw)->attr.af_idx)
 
 int sssnic_hw_init(struct sssnic_hw *hw);
 void sssnic_hw_shutdown(struct sssnic_hw *hw);
diff --git a/drivers/net/sssnic/base/sssnic_mbox.c 
b/drivers/net/sssnic/base/sssnic_mbox.c
new file mode 100644
index 00..02957137ea
--- /dev/null
+++ b/drivers/net/sssnic/base/sssnic_mbox.c
@@ -0,0 +1,615 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "../sssnic_log.h"
+#include "sssnic_hw.h"
+#include "sssnic_reg.h"
+#include "sssnic_misc.h"
+#include "sssnic_eventq.h"
+#include "sssnic_mbox.h"
+
+#define SSSNIC_MBOX_SEND_RESULT_SIZE 16
+#define SSSNIC_MBOX_SEND_BUF_SIZE 2048UL
+#define SSSNIC_MBOX_RESP_MSG_EVENTQ 1
+#define SSSNIC_MBOX_SEND_DONE_TIMEOUT 50 /* uint is 10us */
+#define SSSNIC_MBOX_DEF_REQ_TIMEOUT 4000 /* millisecond */
+#define SSSNIC_MBOX_REQ_ID_MASK 0xf /* request id only 4 bits*/
+
+struct sssnic_sendbox {
+   struct sssnic_mbox *mbox;
+   /* Send data memory */
+   uint8_t *data;
+   /* Send result DMA memory zone */
+   const struct rte_memzone *result_mz;
+   /* Send result DMA virtual address */
+   volatile uint64_t *result_addr;
+   /* DMA buffer mz */
+   const struct rte_memzone *buf_mz;
+   /* DMA buffer virtual address */
+   uint8_t *buf_addr;
+   pthread_mutex_t lock;
+};
+
+struct sssnic_mbox_msg_dma_desc {
+   /* 32bit xor checksum for DMA data */
+   uint32_t checksum;
+   /* dword of high DMA address */
+   uint32_t dma_addr_hi;
+   /* dword of low DMA address */
+   uint32_t dma_addr_lo;
+   /* DMA data length */
+   uint32_t len;
+   uint32_t resvd[2];
+};
+#define SSSNIC_MBOX_MSG_

[PATCH v4 10/32] net/sssnic: add dev configure and infos get

2023-09-01 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/base/sssnic_api.c | 33 
 drivers/net/sssnic/base/sssnic_api.h |  8 +++
 drivers/net/sssnic/base/sssnic_cmd.h | 14 +
 drivers/net/sssnic/base/sssnic_hw.c  | 33 +++-
 drivers/net/sssnic/base/sssnic_hw.h  |  6 +++
 drivers/net/sssnic/sssnic_ethdev.c   | 76 
 drivers/net/sssnic/sssnic_ethdev.h   | 53 +++
 7 files changed, 222 insertions(+), 1 deletion(-)

diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index 51a59f0f25..bf0859cd63 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -100,3 +100,36 @@ sssnic_msix_attr_set(struct sssnic_hw *hw, uint16_t 
msix_idx,
 
return 0;
 }
+
+int
+sssnic_capability_get(struct sssnic_hw *hw, struct sssnic_capability *capa)
+{
+   struct sssnic_capability_get_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+   int ret;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd_len = sizeof(cmd);
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_GET_CAPABILITY_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_CFG_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_GET_CAPABILITY_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   capa->phy_port = cmd.phy_port;
+   capa->max_num_rxq = cmd.rxq_max_id + 1;
+   capa->max_num_txq = cmd.txq_max_id + 1;
+
+   return 0;
+}
diff --git a/drivers/net/sssnic/base/sssnic_api.h 
b/drivers/net/sssnic/base/sssnic_api.h
index 3d54eb826a..8011cc8b0f 100644
--- a/drivers/net/sssnic/base/sssnic_api.h
+++ b/drivers/net/sssnic/base/sssnic_api.h
@@ -15,9 +15,17 @@ struct sssnic_msix_attr {
uint8_t resend_timer;
 };
 
+struct sssnic_capability {
+   uint16_t max_num_txq;
+   uint16_t max_num_rxq;
+   uint8_t phy_port;
+   uint8_t cos;
+};
+
 int sssnic_msix_attr_get(struct sssnic_hw *hw, uint16_t msix_idx,
struct sssnic_msix_attr *attr);
 int sssnic_msix_attr_set(struct sssnic_hw *hw, uint16_t msix_idx,
struct sssnic_msix_attr *attr);
+int sssnic_capability_get(struct sssnic_hw *hw, struct sssnic_capability 
*capa);
 
 #endif /* _SSSNIC_API_H_ */
diff --git a/drivers/net/sssnic/base/sssnic_cmd.h 
b/drivers/net/sssnic/base/sssnic_cmd.h
index ee9f536ac2..79192affbc 100644
--- a/drivers/net/sssnic/base/sssnic_cmd.h
+++ b/drivers/net/sssnic/base/sssnic_cmd.h
@@ -18,6 +18,8 @@ enum sssnic_mgmt_cmd_id {
SSSNIC_GET_FW_VERSION_CMD = 60,
 };
 
+#define SSSNIC_GET_CAPABILITY_CMD 0
+
 struct sssnic_cmd_common {
uint8_t status;
uint8_t version;
@@ -111,4 +113,16 @@ struct sssnic_msix_ctrl_cmd {
uint8_t resvd1[5];
 };
 
+struct sssnic_capability_get_cmd {
+   struct sssnic_cmd_common common;
+   uint16_t function;
+   uint16_t resvd0;
+   uint8_t resvd1[3];
+   uint8_t phy_port;
+   uint32_t resvd2[16];
+   uint16_t txq_max_id;
+   uint16_t rxq_max_id;
+   uint32_t resvd3[63];
+};
+
 #endif /* _SSSNIC_CMD_H_ */
diff --git a/drivers/net/sssnic/base/sssnic_hw.c 
b/drivers/net/sssnic/base/sssnic_hw.c
index 4ca75208af..8f5f556bde 100644
--- a/drivers/net/sssnic/base/sssnic_hw.c
+++ b/drivers/net/sssnic/base/sssnic_hw.c
@@ -253,6 +253,29 @@ sssnic_msix_attr_init(struct sssnic_hw *hw)
return 0;
 }
 
+static int
+sssnic_capability_init(struct sssnic_hw *hw)
+{
+   struct sssnic_capability cap;
+   int ret;
+
+   ret = sssnic_capability_get(hw, &cap);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to get sssnic capability");
+   return ret;
+   }
+
+   PMD_DRV_LOG(INFO,
+   "Initialized capability, physic port:%u, max %u txqs, max %u 
rxqs",
+   cap.phy_port, cap.max_num_txq, cap.max_num_rxq);
+
+   hw->phy_port = cap.phy_port;
+   hw->max_num_rxq = cap.max_num_rxq;
+   hw->max_num_txq = cap.max_num_txq;
+
+   return 0;
+}
+
 static int
 sssnic_base_init(struct sssnic_hw *hw)
 {
@@ -360,10 +383,18 @@ sssnic_hw_init(struct sssnic_hw *hw)
goto ctrlq_init_fail;
}
 
+   ret = sssnic_capability_init(hw);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to initialize capability");
+   goto capbility_init_fail;
+   }
+
sssnic_pf_status_set(hw, SSSNIC_PF_STATUS_ACTIVE);
 
-   return -EINVAL;
+   return 0;
 
+capbility_init_fail:
+   sssnic_ctrlq_s

[PATCH v4 09/32] net/sssnic/base: add control queue

2023-09-01 Thread wanry
From: Renyong Wan 

Control queue is used for communication between driver and datapath code
of firmware.

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Fixed variable 'cmd_len' is uninitialized when used.
---
 drivers/net/sssnic/base/meson.build|   2 +
 drivers/net/sssnic/base/sssnic_api.c   | 102 +
 drivers/net/sssnic/base/sssnic_api.h   |  23 ++
 drivers/net/sssnic/base/sssnic_cmd.h   | 114 ++
 drivers/net/sssnic/base/sssnic_ctrlq.c | 521 +
 drivers/net/sssnic/base/sssnic_ctrlq.h |  58 +++
 drivers/net/sssnic/base/sssnic_hw.c| 149 +++
 drivers/net/sssnic/base/sssnic_hw.h|   8 +
 8 files changed, 977 insertions(+)
 create mode 100644 drivers/net/sssnic/base/sssnic_api.c
 create mode 100644 drivers/net/sssnic/base/sssnic_api.h
 create mode 100644 drivers/net/sssnic/base/sssnic_cmd.h
 create mode 100644 drivers/net/sssnic/base/sssnic_ctrlq.c
 create mode 100644 drivers/net/sssnic/base/sssnic_ctrlq.h

diff --git a/drivers/net/sssnic/base/meson.build 
b/drivers/net/sssnic/base/meson.build
index 7c23a82ff3..e93ca7b24b 100644
--- a/drivers/net/sssnic/base/meson.build
+++ b/drivers/net/sssnic/base/meson.build
@@ -7,6 +7,8 @@ sources = [
 'sssnic_msg.c',
 'sssnic_mbox.c',
 'sssnic_workq.c',
+'sssnic_ctrlq.c',
+'sssnic_api.c',
 ]
 
 c_args = cflags
diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
new file mode 100644
index 00..51a59f0f25
--- /dev/null
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -0,0 +1,102 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include "../sssnic_log.h"
+#include "sssnic_hw.h"
+#include "sssnic_cmd.h"
+#include "sssnic_mbox.h"
+#include "sssnic_api.h"
+
+int
+sssnic_msix_attr_get(struct sssnic_hw *hw, uint16_t msix_idx,
+   struct sssnic_msix_attr *attr)
+{
+   int ret;
+   struct sssnic_msg msg;
+   struct sssnic_msix_ctrl_cmd cmd;
+   uint32_t cmd_len;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.func_id = SSSNIC_FUNC_IDX(hw);
+   cmd.opcode = SSSNIC_CMD_OPCODE_GET;
+   cmd.idx = msix_idx;
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len, SSSNIC_MSIX_CTRL_CMD,
+   SSSNIC_MPU_FUNC_IDX, SSSNIC_COMM_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to MSIX_CTRL_CMD, len=%u, status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+   attr->lli_credit = cmd.lli_credit;
+   attr->lli_timer = cmd.lli_timer;
+   attr->pending_limit = cmd.pending_count;
+   attr->coalescing_timer = cmd.coalescing_timer;
+   attr->resend_timer = cmd.resend_timer;
+
+   return 0;
+}
+
+int
+sssnic_msix_attr_set(struct sssnic_hw *hw, uint16_t msix_idx,
+   struct sssnic_msix_attr *attr)
+{
+   int ret;
+   struct sssnic_msg msg;
+   struct sssnic_msix_ctrl_cmd cmd;
+   struct sssnic_msix_attr tmp;
+   uint32_t cmd_len;
+
+   ret = sssnic_msix_attr_get(hw, msix_idx, &tmp);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to get interrupt configuration");
+   return ret;
+   }
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.func_id = SSSNIC_FUNC_IDX(hw);
+   cmd.opcode = SSSNIC_CMD_OPCODE_SET;
+   cmd.idx = msix_idx;
+   cmd.lli_credit = tmp.lli_credit;
+   cmd.lli_timer = tmp.lli_timer;
+   cmd.pending_count = tmp.pending_limit;
+   cmd.coalescing_timer = tmp.coalescing_timer;
+   cmd.resend_timer = tmp.resend_timer;
+   if (attr->lli_set != 0) {
+   cmd.lli_credit = attr->lli_credit;
+   cmd.lli_timer = attr->lli_timer;
+   }
+   if (attr->coalescing_set != 0) {
+   cmd.pending_count = attr->pending_limit;
+   cmd.coalescing_timer = attr->coalescing_timer;
+   cmd.resend_timer = attr->resend_timer;
+   }
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len, SSSNIC_MSIX_CTRL_CMD,
+   SSSNIC_MPU_FUNC_IDX, SSSNIC_COMM_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to MSIX_CTRL_CMD, len=%u, status=%u",
+   cmd_len, cmd.common.statu

[PATCH v4 15/32] net/sssnic: support Tx queue setup and release

2023-09-01 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Removed error.h from including files.

v4:
* Fixed coding style issue of REPEATED_WORD.
---
 drivers/net/sssnic/meson.build|   1 +
 drivers/net/sssnic/sssnic_ethdev.c|   4 +
 drivers/net/sssnic/sssnic_ethdev.h|   1 +
 drivers/net/sssnic/sssnic_ethdev_tx.c | 354 ++
 drivers/net/sssnic/sssnic_ethdev_tx.h |  27 ++
 5 files changed, 387 insertions(+)
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_tx.c
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_tx.h

diff --git a/drivers/net/sssnic/meson.build b/drivers/net/sssnic/meson.build
index 7c3516a279..0c6e21310d 100644
--- a/drivers/net/sssnic/meson.build
+++ b/drivers/net/sssnic/meson.build
@@ -20,4 +20,5 @@ sources = files(
 'sssnic_ethdev.c',
 'sssnic_ethdev_link.c',
 'sssnic_ethdev_rx.c',
+'sssnic_ethdev_tx.c',
 )
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index f98510a55d..732fddfcf7 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -11,6 +11,7 @@
 #include "sssnic_ethdev.h"
 #include "sssnic_ethdev_link.h"
 #include "sssnic_ethdev_rx.h"
+#include "sssnic_ethdev_tx.h"
 
 static int
 sssnic_ethdev_infos_get(struct rte_eth_dev *ethdev,
@@ -336,6 +337,7 @@ sssnic_ethdev_release(struct rte_eth_dev *ethdev)
struct sssnic_hw *hw = SSSNIC_ETHDEV_TO_HW(ethdev);
 
sssnic_ethdev_link_intr_disable(ethdev);
+   sssnic_ethdev_tx_queue_all_release(ethdev);
sssnic_ethdev_rx_queue_all_release(ethdev);
sssnic_ethdev_mac_addrs_clean(ethdev);
sssnic_hw_shutdown(hw);
@@ -354,6 +356,8 @@ static const struct eth_dev_ops sssnic_ethdev_ops = {
.set_mc_addr_list = sssnic_ethdev_set_mc_addr_list,
.rx_queue_setup = sssnic_ethdev_rx_queue_setup,
.rx_queue_release = sssnic_ethdev_rx_queue_release,
+   .tx_queue_setup = sssnic_ethdev_tx_queue_setup,
+   .tx_queue_release = sssnic_ethdev_tx_queue_release,
 };
 
 static int
diff --git a/drivers/net/sssnic/sssnic_ethdev.h 
b/drivers/net/sssnic/sssnic_ethdev.h
index 51740413c6..ab832d179f 100644
--- a/drivers/net/sssnic/sssnic_ethdev.h
+++ b/drivers/net/sssnic/sssnic_ethdev.h
@@ -57,6 +57,7 @@
 #define SSSNIC_ETHDEV_MAX_NUM_MC_MAC 2048
 
 #define SSSNIC_ETHDEV_DEF_RX_FREE_THRESH 32
+#define SSSNIC_ETHDEV_DEF_TX_FREE_THRESH 32
 
 struct sssnic_netdev {
void *hw;
diff --git a/drivers/net/sssnic/sssnic_ethdev_tx.c 
b/drivers/net/sssnic/sssnic_ethdev_tx.c
new file mode 100644
index 00..e80bf8c396
--- /dev/null
+++ b/drivers/net/sssnic/sssnic_ethdev_tx.c
@@ -0,0 +1,354 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#include 
+#include 
+#include 
+
+#include "sssnic_log.h"
+#include "sssnic_ethdev.h"
+#include "sssnic_ethdev_tx.h"
+#include "base/sssnic_hw.h"
+#include "base/sssnic_workq.h"
+#include "base/sssnic_api.h"
+#include "base/sssnic_misc.h"
+
+/* Hardware format of tx desc */
+struct sssnic_ethdev_tx_desc {
+   union {
+   uint32_t dw0;
+   struct {
+   /* length of the first tx seg data */
+   uint32_t data_len : 18;
+   uint32_t dw0_resvd0 : 1;
+   /* number of tx segments in tx entry */
+   uint32_t num_segs : 8;
+   /* offload desc enable */
+   uint32_t offload_en : 1;
+   /* data format, use SGL if 0 else inline */
+   uint32_t data_fmt : 1;
+   /* DN, always set 0  */
+   uint32_t dw0_resvd1 : 1;
+   /* refer sssnic_ethdev_txq_entry_type */
+   uint32_t entry_type : 1;
+   uint32_t owner : 1;
+   };
+   };
+   union {
+   uint32_t dw1;
+   struct {
+   uint32_t pkt_type : 2;
+   uint32_t payload_off : 8;
+   /* UFO, not used, always set 0 */
+   uint32_t dw1_resvd0 : 1;
+   uint32_t tso_en : 1;
+   /* TCP/UDP checksum offload enable flag */
+   uint32_t csum_en : 1;
+   uint32_t mss : 14;
+   uint32_t sctp_crc_en : 1;
+   /* set 1 if entry type is not compact else set 0 */
+   uint32_t uc : 1;
+   /* PRI, not used, always set 0  */
+   uint32_t dw1_resvd1 : 3;
+   };
+   };
+   union {
+   uint32_t dw2;
+   /* high 32bit of  DMA address of the first tx seg data */
+   uint32_t data_addr_hi;
+   };
+   union {
+   uint32_t dw3;
+ 

[PATCH v4 12/32] net/sssnic: support dev link status

2023-09-01 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Removed error.h from including files.
---
 doc/guides/nics/features/sssnic.ini |   1 +
 drivers/net/sssnic/base/sssnic_api.c| 127 
 drivers/net/sssnic/base/sssnic_api.h|  14 +++
 drivers/net/sssnic/base/sssnic_cmd.h|  37 +++
 drivers/net/sssnic/meson.build  |   1 +
 drivers/net/sssnic/sssnic_ethdev.c  |   4 +
 drivers/net/sssnic/sssnic_ethdev_link.c | 111 +
 drivers/net/sssnic/sssnic_ethdev_link.h |  12 +++
 8 files changed, 307 insertions(+)
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_link.c
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_link.h

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index 602839d301..a0688e70ef 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -4,6 +4,7 @@
 ; Refer to default.ini for the full list of available PMD features.
 ;
 [Features]
+Link status  = Y
 Unicast MAC filter   = Y
 Multicast MAC filter = Y
 Linux= Y
diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index 76266dfbae..3bb31009c5 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -307,3 +307,130 @@ sssnic_mac_addr_del(struct sssnic_hw *hw, uint8_t *addr)
 
return 0;
 }
+
+int
+sssnic_netif_link_status_get(struct sssnic_hw *hw, uint8_t *status)
+{
+   int ret;
+   struct sssnic_netif_link_status_get_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+   uint16_t func;
+
+   if (hw == NULL || status == NULL)
+   return -EINVAL;
+
+   if (SSSNIC_FUNC_TYPE(hw) == SSSNIC_FUNC_TYPE_VF)
+   func = SSSNIC_PF_FUNC_IDX(hw);
+   else
+   func = SSSNIC_MPU_FUNC_IDX;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.port = SSSNIC_PHY_PORT(hw);
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_GET_NETIF_LINK_STATUS_CMD, func, SSSNIC_NETIF_MODULE,
+   SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_GET_NETIF_LINK_STATUS_CMD, 
len=%u, status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   *status = cmd.status;
+
+   return 0;
+}
+
+int
+sssnic_netif_link_info_get(struct sssnic_hw *hw,
+   struct sssnic_netif_link_info *info)
+{
+   int ret;
+   struct sssnic_netif_link_info_get_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   if (hw == NULL || info == NULL)
+   return -EINVAL;
+
+   ret = sssnic_netif_link_status_get(hw, &info->status);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to get netif link state!");
+   return ret;
+   }
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.port = SSSNIC_PHY_PORT(hw);
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_GET_NETIF_LINK_INFO_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_NETIF_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_GET_NETIF_LINK_INFO_CMD, 
len=%u, status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   info->speed = cmd.speed;
+   info->duplex = cmd.duplex;
+   info->fec = cmd.fec;
+   info->type = cmd.type;
+   info->autoneg_capa = cmd.autoneg_capa;
+   info->autoneg = cmd.autoneg;
+
+   return 0;
+}
+
+int
+sssnic_netif_enable_set(struct sssnic_hw *hw, uint8_t state)
+{
+   int ret;
+   struct sssnic_netif_enable_set_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   if (hw == NULL)
+   return -EINVAL;
+
+   if (SSSNIC_FUNC_TYPE(hw) == SSSNIC_FUNC_TYPE_VF)
+   return 0;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   if (state != 0)
+   cmd.flag = SSSNIC_SET_NETIF_ENABLE_CMD_FLAG_RX_EN |
+  SSSNIC_SET_NETIF_ENABLE_CMD_FLAG_TX_EN;
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_SET_NETIF_ENABLE_CMD, SSSNIC_MPU_FUNC_ID

[PATCH v4 11/32] net/sssnic: add dev MAC ops

2023-09-01 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 doc/guides/nics/features/sssnic.ini  |   2 +
 drivers/net/sssnic/base/sssnic_api.c | 174 +
 drivers/net/sssnic/base/sssnic_api.h |   4 +
 drivers/net/sssnic/base/sssnic_cmd.h |  25 +++
 drivers/net/sssnic/base/sssnic_hw.h  |   1 +
 drivers/net/sssnic/sssnic_ethdev.c   | 270 ++-
 drivers/net/sssnic/sssnic_ethdev.h   |   2 +
 7 files changed, 477 insertions(+), 1 deletion(-)

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index 6d9786db7e..602839d301 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -4,6 +4,8 @@
 ; Refer to default.ini for the full list of available PMD features.
 ;
 [Features]
+Unicast MAC filter   = Y
+Multicast MAC filter = Y
 Linux= Y
 ARMv8= Y
 x86-64   = Y
diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index bf0859cd63..76266dfbae 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -133,3 +133,177 @@ sssnic_capability_get(struct sssnic_hw *hw, struct 
sssnic_capability *capa)
 
return 0;
 }
+
+int
+sssnic_mac_addr_get(struct sssnic_hw *hw, uint8_t *addr)
+{
+   int ret;
+   struct sssnic_mac_addr_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+   uint16_t func;
+
+   if (hw == NULL || addr == NULL)
+   return -EINVAL;
+
+   if (SSSNIC_FUNC_TYPE(hw) == SSSNIC_FUNC_TYPE_VF)
+   func = SSSNIC_PF_FUNC_IDX(hw);
+   else
+   func = SSSNIC_MPU_FUNC_IDX;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd_len = sizeof(cmd);
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len, SSSNIC_GET_MAC_ADDR_CMD,
+   func, SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_GET_DEF_MAC_ADDR_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   rte_memcpy(addr, cmd.addr, 6);
+
+   return 0;
+}
+
+int
+sssnic_mac_addr_update(struct sssnic_hw *hw, uint8_t *new, uint8_t *old)
+{
+   int ret;
+   struct sssnic_mac_addr_update_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+   uint16_t func;
+
+   if (hw == NULL || new == NULL || old == NULL)
+   return -EINVAL;
+
+   if (SSSNIC_FUNC_TYPE(hw) == SSSNIC_FUNC_TYPE_VF)
+   func = SSSNIC_PF_FUNC_IDX(hw);
+   else
+   func = SSSNIC_MPU_FUNC_IDX;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd_len = sizeof(cmd);
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   rte_memcpy(cmd.new_addr, new, 6);
+   rte_memcpy(cmd.old_addr, old, 6);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_UPDATE_MAC_ADDR_CMD, func, SSSNIC_LAN_MODULE,
+   SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   if (cmd.common.status == SSSNIC_MAC_ADDR_CMD_STATUS_IGNORED) {
+   PMD_DRV_LOG(WARNING,
+   "MAC address operation is ignored");
+   return 0;
+   }
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_UPDATE_MAC_ADDR_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
+
+int
+sssnic_mac_addr_add(struct sssnic_hw *hw, uint8_t *addr)
+{
+   int ret;
+   struct sssnic_mac_addr_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+   uint16_t func;
+
+   if (hw == NULL || addr == NULL)
+   return -EINVAL;
+
+   if (SSSNIC_FUNC_TYPE(hw) == SSSNIC_FUNC_TYPE_VF)
+   func = SSSNIC_PF_FUNC_IDX(hw);
+   else
+   func = SSSNIC_MPU_FUNC_IDX;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd_len = sizeof(cmd);
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   rte_memcpy(cmd.addr, addr, 6);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len, SSSNIC_ADD_MAC_ADDR_CMD,
+   func, SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbo

[PATCH v4 16/32] net/sssnic: support Rx queue start and stop

2023-09-01 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/base/sssnic_api.c  |  63 +
 drivers/net/sssnic/base/sssnic_api.h  |   2 +
 drivers/net/sssnic/base/sssnic_cmd.h  |  49 
 drivers/net/sssnic/sssnic_ethdev.c|   2 +
 drivers/net/sssnic/sssnic_ethdev.h|   2 +
 drivers/net/sssnic/sssnic_ethdev_rx.c | 332 ++
 drivers/net/sssnic/sssnic_ethdev_rx.h |   4 +
 7 files changed, 454 insertions(+)

diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index 3bb31009c5..3050d573bf 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -11,6 +11,7 @@
 #include "sssnic_hw.h"
 #include "sssnic_cmd.h"
 #include "sssnic_mbox.h"
+#include "sssnic_ctrlq.h"
 #include "sssnic_api.h"
 
 int
@@ -434,3 +435,65 @@ sssnic_netif_enable_set(struct sssnic_hw *hw, uint8_t 
state)
 
return 0;
 }
+
+int
+sssnic_port_enable_set(struct sssnic_hw *hw, bool state)
+{
+   int ret;
+   struct sssnic_port_enable_set_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   if (hw == NULL)
+   return -EINVAL;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   cmd.state = state ? 1 : 0;
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_SET_PORT_ENABLE_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_SET_PORT_ENABLE_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
+
+int
+sssnic_rxq_flush(struct sssnic_hw *hw, uint16_t qid)
+{
+   struct sssnic_ctrlq_cmd cmd;
+   struct sssnic_rxq_flush_cmd data;
+   int ret;
+
+   data.u32 = 0;
+   data.qid = qid;
+   data.u32 = rte_cpu_to_be_32(data.u32);
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.data = &data;
+   cmd.module = SSSNIC_LAN_MODULE;
+   cmd.data_len = sizeof(data);
+   cmd.cmd = SSSNIC_FLUSH_RXQ_CMD;
+
+   ret = sssnic_ctrlq_cmd_exec(hw, &cmd, 0);
+   if (ret != 0 || cmd.result != 0) {
+   PMD_DRV_LOG(ERR,
+   "Failed to execulte ctrlq command %s, ret=%d, result=%" 
PRIu64,
+   "SSSNIC_FLUSH_RXQ_CMD", ret, cmd.result);
+   return -EIO;
+   }
+
+   return 0;
+}
diff --git a/drivers/net/sssnic/base/sssnic_api.h 
b/drivers/net/sssnic/base/sssnic_api.h
index 168aa152b9..29962aabf8 100644
--- a/drivers/net/sssnic/base/sssnic_api.h
+++ b/drivers/net/sssnic/base/sssnic_api.h
@@ -45,5 +45,7 @@ int sssnic_netif_link_status_get(struct sssnic_hw *hw, 
uint8_t *status);
 int sssnic_netif_link_info_get(struct sssnic_hw *hw,
struct sssnic_netif_link_info *info);
 int sssnic_netif_enable_set(struct sssnic_hw *hw, uint8_t state);
+int sssnic_port_enable_set(struct sssnic_hw *hw, bool state);
+int sssnic_rxq_flush(struct sssnic_hw *hw, uint16_t qid);
 
 #endif /* _SSSNIC_API_H_ */
diff --git a/drivers/net/sssnic/base/sssnic_cmd.h 
b/drivers/net/sssnic/base/sssnic_cmd.h
index 6957b742fc..6364058d36 100644
--- a/drivers/net/sssnic/base/sssnic_cmd.h
+++ b/drivers/net/sssnic/base/sssnic_cmd.h
@@ -35,6 +35,37 @@ enum sssnic_netif_cmd_id {
SSSNIC_GET_NETIF_LINK_INFO_CMD = 153,
 };
 
+enum sssnic_port_cmd_id {
+   SSSNIC_REGISTER_VF_PORT_CMD = 0,
+   SSSNIC_SET_PORT_RXTX_SIZE_CMD = 5,
+   SSSNIC_SET_PORT_ENABLE_CMD = 6,
+   SSSNIC_SET_PORT_RX_MODE_CMD = 7,
+   SSSNIC_SET_PORT_TX_CI_ATTR_CMD = 8,
+   SSSNIC_GET_PORT_STATS_CMD = 9,
+   SSSNIC_CLEAR_PORT_STATS_CMD = 10,
+
+   SSSNIC_CLEAN_PORT_RES_CMD = 11,
+
+   SSSNIC_PORT_LRO_CFG_CMD = 13,
+   SSSNIC_PORT_LRO_TIMER_CMD = 14,
+   SSSNIC_PORT_FEATURE_CMD = 15,
+
+   SSSNIC_SET_PORT_VLAN_FILTER_CMD = 25,
+   SSSNIC_ENABLE_PORT_VLAN_FILTER_CMD = 26,
+   SSSNIC_ENABLE_PORT_VLAN_STRIP_CMD = 27,
+
+   SSSNIC_PORT_FLOW_CTRL_CMD = 101,
+};
+
+enum sssnic_ctrlq_cmd_id {
+   SSSNIC_SET_RXTXQ_CTX_CMD = 0,
+   SSSNIC_RESET_OFFLOAD_CTX_CMD = 1,
+   SSSNIC_SET_RSS_INDIR_TABLE_CMD = 4,
+   SSSNIC_SET_RSS_KEY_CTRLQ_CMD = 5,
+   SSSNIC_GET_RSS_INDIR_TABLE_CMD = 6,
+   SSSNIC_FLUSH_RXQ_CMD = 10,
+};
+
 struct sssnic_cmd_common {
uint8_t status;
uint8_t version;
@@ -187,4 +218,22 @@ struct sssnic_netif_enable_set_cmd {
uint8_t resvd1[3];
 };
 
+struct sssnic_port_enable_set_cmd {
+   struct sssnic_cmd_common common;
+   uint16_t function;
+   uint16_t resvd0;
+

[PATCH v4 13/32] net/sssnic: support link status event

2023-09-01 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Fixed 'EINVAL' undeclared.
---
 doc/guides/nics/features/sssnic.ini|   1 +
 drivers/net/sssnic/base/meson.build|   1 +
 drivers/net/sssnic/base/sssnic_exception.c | 116 +
 drivers/net/sssnic/base/sssnic_exception.h |  10 ++
 drivers/net/sssnic/base/sssnic_hw.c|  46 
 drivers/net/sssnic/base/sssnic_hw.h|  22 
 drivers/net/sssnic/sssnic_ethdev.c |   6 +-
 drivers/net/sssnic/sssnic_ethdev_link.c|  98 +
 drivers/net/sssnic/sssnic_ethdev_link.h|   2 +
 9 files changed, 301 insertions(+), 1 deletion(-)
 create mode 100644 drivers/net/sssnic/base/sssnic_exception.c
 create mode 100644 drivers/net/sssnic/base/sssnic_exception.h

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index a0688e70ef..82b527ba26 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -5,6 +5,7 @@
 ;
 [Features]
 Link status  = Y
+Link status event= Y
 Unicast MAC filter   = Y
 Multicast MAC filter = Y
 Linux= Y
diff --git a/drivers/net/sssnic/base/meson.build 
b/drivers/net/sssnic/base/meson.build
index e93ca7b24b..cf0c177cab 100644
--- a/drivers/net/sssnic/base/meson.build
+++ b/drivers/net/sssnic/base/meson.build
@@ -9,6 +9,7 @@ sources = [
 'sssnic_workq.c',
 'sssnic_ctrlq.c',
 'sssnic_api.c',
+   'sssnic_exception.c',
 ]
 
 c_args = cflags
diff --git a/drivers/net/sssnic/base/sssnic_exception.c 
b/drivers/net/sssnic/base/sssnic_exception.c
new file mode 100644
index 00..738ca9c6cd
--- /dev/null
+++ b/drivers/net/sssnic/base/sssnic_exception.c
@@ -0,0 +1,116 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#include 
+#include 
+#include 
+
+#include "../sssnic_log.h"
+#include "sssnic_hw.h"
+#include "sssnic_reg.h"
+#include "sssnic_cmd.h"
+#include "sssnic_msg.h"
+#include "sssnic_eventq.h"
+#include "sssnic_mbox.h"
+#include "sssnic_exception.h"
+
+static void
+sssnic_link_event_msg_handle(struct sssnic_hw *hw, struct sssnic_msg *msg,
+   __rte_unused enum sssnic_msg_chann_id chan_id)
+{
+   struct sssnic_netif_link_status_get_cmd *cmd;
+   sssnic_link_event_cb_t *cb;
+   enum sssnic_link_status status;
+   void *priv;
+
+   cb = hw->link_event_handler.cb;
+   priv = hw->link_event_handler.priv;
+
+   cmd = (struct sssnic_netif_link_status_get_cmd *)msg->data_buf;
+   if (cb != NULL) {
+   if (cmd->status)
+   status = SSSNIC_LINK_STATUS_UP;
+   else
+   status = SSSNIC_LINK_STATUS_DOWN;
+
+   PMD_DRV_LOG(DEBUG, "Received sssnic%u link %s event",
+   SSSNIC_ETH_PORT_ID(hw), status ? "up" : "down");
+
+   return cb(cmd->port, status, priv);
+   }
+
+   PMD_DRV_LOG(WARNING, "Link event was not processed, port=%u, status=%u",
+   cmd->port, cmd->status);
+}
+
+static void
+sssnic_netif_vf_link_status_msg_handle(struct sssnic_hw *hw,
+   struct sssnic_msg *msg)
+{
+   int ret;
+
+   if (msg->ack != 0) {
+   msg->ack = 0;
+   msg->type = SSSNIC_MSG_TYPE_RESP;
+   msg->data_len = 1; /* indicate no data */
+   ret = sssnic_mbox_send(hw, msg, NULL, 0, 0);
+   if (ret != 0)
+   PMD_DRV_LOG(ERR,
+   "Failed to send VF link status response, 
ret=%d",
+   ret);
+   }
+}
+
+static void
+sssnic_netif_exception_msg_handle(struct sssnic_hw *hw, struct sssnic_msg *msg,
+   enum sssnic_msg_chann_id chan_id)
+{
+   if (msg->command == SSSNIC_GET_NETIF_LINK_STATUS_CMD) {
+   if (SSSNIC_FUNC_TYPE(hw) == SSSNIC_FUNC_TYPE_VF)
+   sssnic_netif_vf_link_status_msg_handle(hw, msg);
+
+   sssnic_link_event_msg_handle(hw, msg, chan_id);
+   return;
+   }
+
+   PMD_DRV_LOG(WARNING,
+   "Netif exception message was not processed, cmd=%u",
+   msg->command);
+}
+
+static int
+sssnic_exception_msg_process(struct sssnic_msg *msg,
+   enum sssnic_msg_chann_id chan_id, void *priv)
+{
+   struct sssnic_hw *hw = (struct sssnic_hw *)priv;
+
+   SSSNIC_DEBUG("command=%u, func=%u module=%u, type=%u, ack=%u, seq=%u, "
+"status=%u, id=%u data_buf=%p, data_len=%u",
+   msg->command, msg->func, msg->module, msg->type, msg->ack,
+   msg->seg, msg->status, msg->id, msg->data_buf, msg->data_len);
+
+   if (msg->module == SSSNIC_NETIF_MODULE) {
+   sssnic_netif_exception_msg_handle(hw, msg, chan_id);
+   return SSSNIC_MSG_DONE;
+   }
+
+   PMD_DRV_LOG(WARNING, "Exception message was not proce

[PATCH v4 17/32] net/sssnic: support Tx queue start and stop

2023-09-01 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 doc/guides/nics/features/sssnic.ini   |   1 +
 drivers/net/sssnic/sssnic_ethdev.c|   2 +
 drivers/net/sssnic/sssnic_ethdev_tx.c | 155 ++
 drivers/net/sssnic/sssnic_ethdev_tx.h |   4 +
 4 files changed, 162 insertions(+)

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index 82b527ba26..b75c68cb33 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -6,6 +6,7 @@
 [Features]
 Link status  = Y
 Link status event= Y
+Queue start/stop = Y
 Unicast MAC filter   = Y
 Multicast MAC filter = Y
 Linux= Y
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index 208f0db402..8a18f25889 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -360,6 +360,8 @@ static const struct eth_dev_ops sssnic_ethdev_ops = {
.tx_queue_release = sssnic_ethdev_tx_queue_release,
.rx_queue_start = sssnic_ethdev_rx_queue_start,
.rx_queue_stop = sssnic_ethdev_rx_queue_stop,
+   .tx_queue_start = sssnic_ethdev_tx_queue_start,
+   .tx_queue_stop = sssnic_ethdev_tx_queue_stop,
 };
 
 static int
diff --git a/drivers/net/sssnic/sssnic_ethdev_tx.c 
b/drivers/net/sssnic/sssnic_ethdev_tx.c
index e80bf8c396..47d7e3f343 100644
--- a/drivers/net/sssnic/sssnic_ethdev_tx.c
+++ b/drivers/net/sssnic/sssnic_ethdev_tx.c
@@ -191,6 +191,18 @@ sssnic_ethdev_txq_ci_get(struct sssnic_ethdev_txq *txq)
return sssnic_workq_ci_get(txq->workq);
 }
 
+static inline int
+sssnic_ethdev_txq_pi_get(struct sssnic_ethdev_txq *txq)
+{
+   return sssnic_workq_pi_get(txq->workq);
+}
+
+static inline uint16_t
+sssnic_ethdev_txq_hw_ci_get(struct sssnic_ethdev_txq *txq)
+{
+   return *txq->hw_ci_addr & txq->idx_mask;
+}
+
 static inline void
 sssnic_ethdev_txq_consume(struct sssnic_ethdev_txq *txq, uint16_t num_entries)
 {
@@ -352,3 +364,146 @@ sssnic_ethdev_tx_queue_all_release(struct rte_eth_dev 
*ethdev)
for (qid = 0; qid < ethdev->data->nb_tx_queues; qid++)
sssnic_ethdev_tx_queue_release(ethdev, qid);
 }
+
+#define SSSNIC_ETHDEV_TX_FREE_BULK 64
+static inline int
+sssnic_ethdev_txq_pktmbufs_cleanup(struct sssnic_ethdev_txq *txq)
+{
+   struct sssnic_ethdev_tx_entry *txe;
+   struct rte_mbuf *free_pkts[SSSNIC_ETHDEV_TX_FREE_BULK];
+   uint16_t num_free_pkts = 0;
+   uint16_t hw_ci, ci, id_mask;
+   uint16_t count = 0;
+   int num_entries;
+
+   ci = sssnic_ethdev_txq_ci_get(txq);
+   hw_ci = sssnic_ethdev_txq_hw_ci_get(txq);
+   id_mask = txq->idx_mask;
+   num_entries = sssnic_ethdev_txq_num_used_entries(txq);
+
+   while (num_entries > 0) {
+   txe = &txq->txe[ci];
+
+   /* HW has not consumed enough entries of current packet */
+   if (((hw_ci - ci) & id_mask) < txe->num_workq_entries)
+   break;
+
+   num_entries -= txe->num_workq_entries;
+   count += txe->num_workq_entries;
+   ci = (ci + txe->num_workq_entries) & id_mask;
+
+   if (likely(txe->pktmbuf->nb_segs == 1)) {
+   struct rte_mbuf *pkt =
+   rte_pktmbuf_prefree_seg(txe->pktmbuf);
+   txe->pktmbuf = NULL;
+
+   if (unlikely(pkt == NULL))
+   continue;
+
+   free_pkts[num_free_pkts++] = pkt;
+   if (unlikely(pkt->pool != free_pkts[0]->pool ||
+num_free_pkts >=
+SSSNIC_ETHDEV_TX_FREE_BULK)) {
+   rte_mempool_put_bulk(free_pkts[0]->pool,
+   (void **)free_pkts, num_free_pkts - 1);
+   num_free_pkts = 0;
+   free_pkts[num_free_pkts++] = pkt;
+   }
+   } else {
+   rte_pktmbuf_free(txe->pktmbuf);
+   txe->pktmbuf = NULL;
+   }
+   }
+
+   if (num_free_pkts > 0)
+   rte_mempool_put_bulk(free_pkts[0]->pool, (void **)free_pkts,
+   num_free_pkts);
+
+   sssnic_ethdev_txq_consume(txq, count);
+
+   return count;
+}
+
+#define SSSNIC_ETHDEV_TXQ_FUSH_TIMEOUT 3000 /* 3 seconds */
+static int
+sssnic_ethdev_txq_flush(struct sssnic_ethdev_txq *txq)
+{
+   uint64_t timeout;
+   uint16_t used_entries;
+
+   timeout = rte_get_timer_cycles() +
+ rte_get_timer_hz() * SSSNIC_ETHDEV_TXQ_FUSH_TIMEOUT / 1000;
+
+   do {
+   sssnic_ethdev_txq_pktmbufs_cleanup(txq);
+   used_entries = sssnic_ethdev_txq_num_used_entries(txq);
+   if (used_entries == 0)
+   return 0;
+
+

[PATCH v4 14/32] net/sssnic: support Rx queue setup and release

2023-09-01 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Removed error.h from including files.
---
 drivers/net/sssnic/meson.build|   1 +
 drivers/net/sssnic/sssnic_ethdev.c|   4 +
 drivers/net/sssnic/sssnic_ethdev.h|   2 +
 drivers/net/sssnic/sssnic_ethdev_rx.c | 420 ++
 drivers/net/sssnic/sssnic_ethdev_rx.h |  24 ++
 5 files changed, 451 insertions(+)
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_rx.c
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_rx.h

diff --git a/drivers/net/sssnic/meson.build b/drivers/net/sssnic/meson.build
index 12e967722a..7c3516a279 100644
--- a/drivers/net/sssnic/meson.build
+++ b/drivers/net/sssnic/meson.build
@@ -19,4 +19,5 @@ objs = [base_objs]
 sources = files(
 'sssnic_ethdev.c',
 'sssnic_ethdev_link.c',
+'sssnic_ethdev_rx.c',
 )
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index 1e2b5c0450..f98510a55d 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -10,6 +10,7 @@
 #include "base/sssnic_api.h"
 #include "sssnic_ethdev.h"
 #include "sssnic_ethdev_link.h"
+#include "sssnic_ethdev_rx.h"
 
 static int
 sssnic_ethdev_infos_get(struct rte_eth_dev *ethdev,
@@ -335,6 +336,7 @@ sssnic_ethdev_release(struct rte_eth_dev *ethdev)
struct sssnic_hw *hw = SSSNIC_ETHDEV_TO_HW(ethdev);
 
sssnic_ethdev_link_intr_disable(ethdev);
+   sssnic_ethdev_rx_queue_all_release(ethdev);
sssnic_ethdev_mac_addrs_clean(ethdev);
sssnic_hw_shutdown(hw);
rte_free(hw);
@@ -350,6 +352,8 @@ static const struct eth_dev_ops sssnic_ethdev_ops = {
.mac_addr_remove = sssnic_ethdev_mac_addr_remove,
.mac_addr_add = sssnic_ethdev_mac_addr_add,
.set_mc_addr_list = sssnic_ethdev_set_mc_addr_list,
+   .rx_queue_setup = sssnic_ethdev_rx_queue_setup,
+   .rx_queue_release = sssnic_ethdev_rx_queue_release,
 };
 
 static int
diff --git a/drivers/net/sssnic/sssnic_ethdev.h 
b/drivers/net/sssnic/sssnic_ethdev.h
index 636b3fd04c..51740413c6 100644
--- a/drivers/net/sssnic/sssnic_ethdev.h
+++ b/drivers/net/sssnic/sssnic_ethdev.h
@@ -56,6 +56,8 @@
 #define SSSNIC_ETHDEV_MAX_NUM_UC_MAC 128
 #define SSSNIC_ETHDEV_MAX_NUM_MC_MAC 2048
 
+#define SSSNIC_ETHDEV_DEF_RX_FREE_THRESH 32
+
 struct sssnic_netdev {
void *hw;
struct rte_ether_addr *mcast_addrs;
diff --git a/drivers/net/sssnic/sssnic_ethdev_rx.c 
b/drivers/net/sssnic/sssnic_ethdev_rx.c
new file mode 100644
index 00..0f489cf82f
--- /dev/null
+++ b/drivers/net/sssnic/sssnic_ethdev_rx.c
@@ -0,0 +1,420 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include "sssnic_log.h"
+#include "sssnic_ethdev.h"
+#include "sssnic_ethdev_rx.h"
+#include "base/sssnic_hw.h"
+#include "base/sssnic_workq.h"
+#include "base/sssnic_api.h"
+#include "base/sssnic_misc.h"
+
+/* hardware format of rx descriptor*/
+struct sssnic_ethdev_rx_desc {
+   /* status field */
+   union {
+   uint32_t dword0;
+   struct {
+   uint32_t ip_csum_err : 1;
+   uint32_t tcp_csum_err : 1;
+   uint32_t udp_csum_err : 1;
+   uint32_t igmp_csum_err : 1;
+   uint32_t icmpv4_csum_err : 1;
+   uint32_t icmpv6_csum_err : 1;
+   uint32_t sctp_crc_err : 1;
+   uint32_t hw_crc_err : 1;
+   uint32_t other_err : 1;
+   uint32_t err_resvd0 : 7;
+   uint32_t lro_num : 8;
+   uint32_t resvd1 : 1;
+   uint32_t lro_push : 1;
+   uint32_t lro_enter : 1;
+   uint32_t lro_intr : 1;
+   uint32_t flush : 1;
+   uint32_t decry : 1;
+   uint32_t bp_en : 1;
+   uint32_t done : 1;
+   };
+   struct {
+   uint32_t status_err : 16;
+   uint32_t status_rest : 16;
+   };
+   };
+
+   /* VLAN and length field */
+   union {
+   uint32_t dword1;
+   struct {
+   uint32_t vlan : 16;
+   uint32_t len : 16;
+   };
+   };
+
+   /* offload field */
+   union {
+   uint32_t dword2;
+   struct {
+   uint32_t pkt_type : 12;
+   uint32_t dword2_resvd0 : 9;
+   uint32_t vlan_en : 1;
+   uint32_t dword2_resvd1 : 2;
+   uint32_t rss_type : 8;
+   };
+   };
+
+   /* rss hash field */
+   union {
+   uint32_t dword3;
+  

[PATCH v4 18/32] net/sssnic: add Rx interrupt support

2023-09-01 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 doc/guides/nics/features/sssnic.ini   |   1 +
 drivers/net/sssnic/base/sssnic_hw.c   |  14 +++
 drivers/net/sssnic/base/sssnic_hw.h   |   2 +
 drivers/net/sssnic/sssnic_ethdev.c|   2 +
 drivers/net/sssnic/sssnic_ethdev_rx.c | 135 ++
 drivers/net/sssnic/sssnic_ethdev_rx.h |   6 ++
 6 files changed, 160 insertions(+)

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index b75c68cb33..e3b8166629 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -7,6 +7,7 @@
 Link status  = Y
 Link status event= Y
 Queue start/stop = Y
+Rx interrupt = Y
 Unicast MAC filter   = Y
 Multicast MAC filter = Y
 Linux= Y
diff --git a/drivers/net/sssnic/base/sssnic_hw.c 
b/drivers/net/sssnic/base/sssnic_hw.c
index 82eb4ea295..651a0aa7ef 100644
--- a/drivers/net/sssnic/base/sssnic_hw.c
+++ b/drivers/net/sssnic/base/sssnic_hw.c
@@ -145,6 +145,20 @@ sssnic_msix_resend_disable(struct sssnic_hw *hw, uint16_t 
msix_id)
sssnic_cfg_reg_write(hw, SSSNIC_MSIX_CTRL_REG, reg.u32);
 }
 
+void
+sssnic_msix_auto_mask_set(struct sssnic_hw *hw, uint16_t msix_id, int state)
+{
+   struct sssnic_msix_ctrl_reg reg;
+
+   reg.u32 = 0;
+   if (state == SSSNIC_MSIX_ENABLE)
+   reg.auto_msk_set = 1;
+   else
+   reg.auto_msk_clr = 1;
+   reg.msxi_idx = msix_id;
+   sssnic_cfg_reg_write(hw, SSSNIC_MSIX_CTRL_REG, reg.u32);
+}
+
 static void
 sssnic_pf_status_set(struct sssnic_hw *hw, enum sssnic_pf_status status)
 {
diff --git a/drivers/net/sssnic/base/sssnic_hw.h 
b/drivers/net/sssnic/base/sssnic_hw.h
index e25f5595e6..4820212543 100644
--- a/drivers/net/sssnic/base/sssnic_hw.h
+++ b/drivers/net/sssnic/base/sssnic_hw.h
@@ -100,6 +100,8 @@ int sssnic_hw_init(struct sssnic_hw *hw);
 void sssnic_hw_shutdown(struct sssnic_hw *hw);
 void sssnic_msix_state_set(struct sssnic_hw *hw, uint16_t msix_id, int state);
 void sssnic_msix_resend_disable(struct sssnic_hw *hw, uint16_t msix_id);
+void sssnic_msix_auto_mask_set(struct sssnic_hw *hw, uint16_t msix_id,
+   int state);
 int sssnic_link_event_callback_register(struct sssnic_hw *hw,
sssnic_link_event_cb_t *cb, void *priv);
 void sssnic_link_event_callback_unregister(struct sssnic_hw *hw);
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index 8a18f25889..35bb26a0b1 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -362,6 +362,8 @@ static const struct eth_dev_ops sssnic_ethdev_ops = {
.rx_queue_stop = sssnic_ethdev_rx_queue_stop,
.tx_queue_start = sssnic_ethdev_tx_queue_start,
.tx_queue_stop = sssnic_ethdev_tx_queue_stop,
+   .rx_queue_intr_enable = sssnic_ethdev_rx_queue_intr_enable,
+   .rx_queue_intr_disable = sssnic_ethdev_rx_queue_intr_disable,
 };
 
 static int
diff --git a/drivers/net/sssnic/sssnic_ethdev_rx.c 
b/drivers/net/sssnic/sssnic_ethdev_rx.c
index d8429e734d..9c1b2f20d1 100644
--- a/drivers/net/sssnic/sssnic_ethdev_rx.c
+++ b/drivers/net/sssnic/sssnic_ethdev_rx.c
@@ -136,6 +136,12 @@ static const uint16_t sssnic_ethdev_rx_buf_size_tbl[] = { 
32, 64, 96, 128, 192,
 /* Doorbell offset 8192 */
 #define SSSNIC_ETHDEV_RXQ_DB_OFFSET 0x2000
 
+#define SSSNIC_ETHDEV_RX_MSIX_ID_START 1
+#define SSSNIC_ETHDEV_RX_MSIX_ID_INVAL 0
+#define SSSNIC_ETHDEV_RX_MSIX_PENDING_LIMIT 2
+#define SSSNIC_ETHDEV_RX_MSIX_COALESCING_TIMER 2
+#define SSSNIC_ETHDEV_RX_MSIX_RESNEDING_TIMER 7
+
 struct sssnic_ethdev_rxq_doorbell {
union {
uint64_t u64;
@@ -750,3 +756,132 @@ sssnic_ethdev_rx_queue_all_stop(struct rte_eth_dev 
*ethdev)
 
return 0;
 }
+
+static int
+sssinc_ethdev_rxq_intr_attr_init(struct sssnic_ethdev_rxq *rxq)
+{
+   int ret;
+   struct sssnic_hw *hw = SSSNIC_ETHDEV_TO_HW(rxq->ethdev);
+   struct sssnic_msix_attr attr;
+
+   attr.lli_set = 0;
+   attr.coalescing_set = 1;
+   attr.pending_limit = SSSNIC_ETHDEV_RX_MSIX_PENDING_LIMIT;
+   attr.coalescing_timer = SSSNIC_ETHDEV_RX_MSIX_COALESCING_TIMER;
+   attr.resend_timer = SSSNIC_ETHDEV_RX_MSIX_RESNEDING_TIMER;
+
+   ret = sssnic_msix_attr_set(hw, rxq->intr.msix_id, &attr);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to set msxi attributes");
+   return ret;
+   }
+
+   return 0;
+}
+
+int
+sssnic_ethdev_rx_queue_intr_enable(struct rte_eth_dev *ethdev, uint16_t qid)
+{
+   struct sssnic_ethdev_rxq *rxq = ethdev->data->rx_queues[qid];
+   struct sssnic_hw *hw = SSSNIC_ETHDEV_TO_HW(ethdev);
+
+   if (rxq->intr.enable)
+   return 0;
+
+   sssnic_msix_auto_mask_set(hw, rxq->intr.msix_id, SSSNIC_MSIX_ENABLE);
+   sssnic_msix_state_set(hw, rxq->intr.msix_id, SSSNIC_MSIX_ENABLE);
+   rxq->intr.enable = 1;
+
+   return 0;
+}
+

[PATCH v4 20/32] net/sssnic: support dev close and reset

2023-09-01 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/sssnic_ethdev.c | 32 ++
 1 file changed, 32 insertions(+)

diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index 8201a1e3c4..b59c4fd3ad 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -13,6 +13,8 @@
 #include "sssnic_ethdev_rx.h"
 #include "sssnic_ethdev_tx.h"
 
+static int sssnic_ethdev_init(struct rte_eth_dev *ethdev);
+
 static int
 sssnic_ethdev_infos_get(struct rte_eth_dev *ethdev,
struct rte_eth_dev_info *devinfo)
@@ -622,9 +624,39 @@ sssnic_ethdev_stop(struct rte_eth_dev *ethdev)
return 0;
 }
 
+static int
+sssnic_ethdev_close(struct rte_eth_dev *ethdev)
+{
+   sssnic_ethdev_release(ethdev);
+
+   PMD_DRV_LOG(INFO, "Port %u is closed", ethdev->data->port_id);
+
+   return 0;
+}
+
+static int
+sssnic_ethdev_reset(struct rte_eth_dev *ethdev)
+{
+   int ret;
+
+   sssnic_ethdev_release(ethdev);
+
+   ret = sssnic_ethdev_init(ethdev);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to initialize sssnic ethdev");
+   return ret;
+   }
+
+   PMD_DRV_LOG(INFO, "Port %u is reset", ethdev->data->port_id);
+
+   return 0;
+}
+
 static const struct eth_dev_ops sssnic_ethdev_ops = {
.dev_start = sssnic_ethdev_start,
.dev_stop = sssnic_ethdev_stop,
+   .dev_close = sssnic_ethdev_close,
+   .dev_reset = sssnic_ethdev_reset,
.dev_set_link_up = sssnic_ethdev_set_link_up,
.dev_set_link_down = sssnic_ethdev_set_link_down,
.link_update = sssnic_ethdev_link_update,
-- 
2.27.0



[PATCH v4 19/32] net/sssnic: support dev start and stop

2023-09-01 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/base/sssnic_api.c  | 508 ++
 drivers/net/sssnic/base/sssnic_api.h  | 257 +
 drivers/net/sssnic/base/sssnic_cmd.h  | 100 +
 drivers/net/sssnic/base/sssnic_misc.h |  34 ++
 drivers/net/sssnic/sssnic_ethdev.c| 284 ++
 drivers/net/sssnic/sssnic_ethdev.h|  21 ++
 drivers/net/sssnic/sssnic_ethdev_rx.c | 270 +-
 drivers/net/sssnic/sssnic_ethdev_rx.h |   8 +
 drivers/net/sssnic/sssnic_ethdev_tx.c | 163 +
 drivers/net/sssnic/sssnic_ethdev_tx.h |   6 +
 10 files changed, 1650 insertions(+), 1 deletion(-)

diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index 3050d573bf..81020387bd 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -13,6 +13,7 @@
 #include "sssnic_mbox.h"
 #include "sssnic_ctrlq.h"
 #include "sssnic_api.h"
+#include "sssnic_misc.h"
 
 int
 sssnic_msix_attr_get(struct sssnic_hw *hw, uint16_t msix_idx,
@@ -497,3 +498,510 @@ sssnic_rxq_flush(struct sssnic_hw *hw, uint16_t qid)
 
return 0;
 }
+
+static int
+sssnic_rxtx_size_set(struct sssnic_hw *hw, uint16_t rx_size, uint16_t tx_size,
+   uint32_t flags)
+{
+   int ret;
+   struct sssnic_rxtx_size_set_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   if (hw == NULL)
+   return -EINVAL;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   cmd.rx_size = rx_size;
+   cmd.tx_size = tx_size;
+   cmd.flags = flags;
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_SET_PORT_RXTX_SIZE_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_SET_PORT_RXTX_SIZE_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
+
+int
+sssnic_rxtx_max_size_init(struct sssnic_hw *hw, uint16_t rx_size,
+   uint16_t tx_size)
+{
+   return sssnic_rxtx_size_set(hw, rx_size, tx_size,
+   SSSNIC_CMD_INIT_RXTX_SIZE_FLAG | SSSNIC_CMD_SET_RX_SIZE_FLAG |
+   SSSNIC_CMD_SET_TX_SIZE_FLAG);
+}
+
+int
+sssnic_tx_max_size_set(struct sssnic_hw *hw, uint16_t tx_size)
+{
+   return sssnic_rxtx_size_set(hw, 0, tx_size,
+   SSSNIC_CMD_SET_TX_SIZE_FLAG);
+}
+
+int
+sssnic_port_features_get(struct sssnic_hw *hw, uint64_t *features)
+{
+   int ret;
+   struct sssnic_port_feature_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   cmd.opcode = SSSNIC_CMD_OPCODE_GET;
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len, SSSNIC_PORT_FEATURE_CMD,
+   SSSNIC_MPU_FUNC_IDX, SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_PORT_FEATURE_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   *features = cmd.features;
+
+   return 0;
+}
+
+int
+sssnic_port_features_set(struct sssnic_hw *hw, uint64_t features)
+{
+   int ret;
+   struct sssnic_port_feature_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   cmd.features = features;
+   cmd.opcode = SSSNIC_CMD_OPCODE_SET;
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len, SSSNIC_PORT_FEATURE_CMD,
+   SSSNIC_MPU_FUNC_IDX, SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_PORT_FEATURE_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
+
+#define SSSNIC_MAX_NUM_RXTXQ_CTX_SET_IN_BULK   

[PATCH v4 23/32] net/sssnic: support Rx packet burst

2023-09-01 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Fixed wrong format of printing uint64_t.
---
 doc/guides/nics/features/sssnic.ini   |   2 +
 drivers/net/sssnic/sssnic_ethdev.c|   2 +
 drivers/net/sssnic/sssnic_ethdev_rx.c | 167 ++
 drivers/net/sssnic/sssnic_ethdev_rx.h |   2 +
 4 files changed, 173 insertions(+)

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index aba0b78c95..320ac4533d 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -8,6 +8,8 @@ Link status  = Y
 Link status event= Y
 Queue start/stop = Y
 Rx interrupt = Y
+Scattered Rx = Y
+LRO  = Y
 Promiscuous mode = Y
 Allmulticast mode= Y
 Unicast MAC filter   = Y
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index 99e6d6152a..021fabcbe5 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -769,6 +769,8 @@ sssnic_ethdev_init(struct rte_eth_dev *ethdev)
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
return 0;
 
+   ethdev->rx_pkt_burst = sssnic_ethdev_rx_pkt_burst;
+
netdev = SSSNIC_ETHDEV_PRIVATE(ethdev);
pci_dev = RTE_ETH_DEV_TO_PCI(ethdev);
hw = rte_zmalloc("sssnic_hw", sizeof(struct sssnic_hw), 0);
diff --git a/drivers/net/sssnic/sssnic_ethdev_rx.c 
b/drivers/net/sssnic/sssnic_ethdev_rx.c
index 66045f7a98..82e65f2482 100644
--- a/drivers/net/sssnic/sssnic_ethdev_rx.c
+++ b/drivers/net/sssnic/sssnic_ethdev_rx.c
@@ -1183,3 +1183,170 @@ sssnic_ethdev_rx_queue_stats_clear(struct rte_eth_dev 
*ethdev, uint16_t qid)
memset(&rxq->stats, 0, sizeof(rxq->stats));
}
 };
+
+static inline void
+sssnic_ethdev_rx_csum_offload(struct sssnic_ethdev_rxq *rxq,
+   struct rte_mbuf *rxm, volatile struct sssnic_ethdev_rx_desc *rxd)
+{
+   /* no errors */
+   if (likely(rxd->status_err == 0)) {
+   rxm->ol_flags |= RTE_MBUF_F_RX_IP_CKSUM_GOOD |
+RTE_MBUF_F_RX_L4_CKSUM_GOOD;
+   return;
+   }
+
+   /* bypass hw crc error*/
+   if (unlikely(rxd->hw_crc_err)) {
+   rxm->ol_flags |= RTE_MBUF_F_RX_IP_CKSUM_UNKNOWN;
+   return;
+   }
+
+   if (rxd->ip_csum_err) {
+   rxm->ol_flags |= RTE_MBUF_F_RX_IP_CKSUM_BAD;
+   rxq->stats.csum_errors++;
+   }
+
+   if (rxd->tcp_csum_err || rxd->udp_csum_err || rxd->sctp_crc_err) {
+   rxm->ol_flags |= RTE_MBUF_F_RX_L4_CKSUM_BAD;
+   rxq->stats.csum_errors++;
+   }
+
+   if (unlikely(rxd->other_err))
+   rxq->stats.other_errors++;
+}
+
+static inline void
+sssnic_ethdev_rx_vlan_offload(struct rte_mbuf *rxm,
+   volatile struct sssnic_ethdev_rx_desc *rxd)
+{
+   if (rxd->vlan_en == 0 || rxd->vlan == 0) {
+   rxm->vlan_tci = 0;
+   return;
+   }
+
+   rxm->vlan_tci = rxd->vlan;
+   rxm->ol_flags |= RTE_MBUF_F_RX_VLAN | RTE_MBUF_F_RX_VLAN_STRIPPED;
+}
+
+static inline void
+sssnic_ethdev_rx_segments(struct sssnic_ethdev_rxq *rxq, struct rte_mbuf *head,
+   uint32_t remain_size)
+{
+   struct sssnic_ethdev_rx_entry *rxe;
+   struct rte_mbuf *curr, *prev = head;
+   uint16_t rx_buf_size = rxq->rx_buf_size;
+   uint16_t ci;
+   uint32_t rx_size;
+
+   while (remain_size > 0) {
+   ci = sssnic_ethdev_rxq_ci_get(rxq);
+   rxe = &rxq->rxe[ci];
+   curr = rxe->pktmbuf;
+
+   sssnic_ethdev_rxq_consume(rxq, 1);
+
+   rx_size = RTE_MIN(remain_size, rx_buf_size);
+   remain_size -= rx_size;
+
+   curr->data_len = rx_size;
+   curr->next = NULL;
+   prev->next = curr;
+   prev = curr;
+   head->nb_segs++;
+   }
+}
+
+uint16_t
+sssnic_ethdev_rx_pkt_burst(void *rx_queue, struct rte_mbuf **rx_pkts,
+   uint16_t nb_pkts)
+{
+   struct sssnic_ethdev_rxq *rxq = (struct sssnic_ethdev_rxq *)rx_queue;
+   struct sssnic_ethdev_rx_entry *rxe;
+   struct rte_mbuf *rxm;
+   struct sssnic_ethdev_rx_desc *rxd, rx_desc;
+   uint16_t ci, idle_entries;
+   uint16_t rx_buf_size;
+   uint32_t rx_size;
+   uint64_t nb_rx = 0;
+   uint64_t rx_bytes = 0;
+
+   ci = sssnic_ethdev_rxq_ci_get(rxq);
+   rx_buf_size = rxq->rx_buf_size;
+   rxd = &rx_desc;
+
+   while (nb_rx < nb_pkts) {
+   rxd->dword0 = __atomic_load_n(&rxq->desc[ci].dword0,
+   __ATOMIC_ACQUIRE);
+   /* check rx done */
+   if (!rxd->done)
+   break;
+
+   rxd->dword1 = rxq->desc[ci].dword1;
+   rxd->dword2 = rxq->desc[ci].dword2;
+   rxd->dword3 = rxq->desc[ci].dword3;
+
+   /* reset rx d

[PATCH v4 22/32] net/sssnic: add basic and extended stats ops

2023-09-01 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Removed error.h from including files.
---
 doc/guides/nics/features/sssnic.ini  |   3 +
 drivers/net/sssnic/base/sssnic_api.c | 154 +
 drivers/net/sssnic/base/sssnic_api.h | 116 +++
 drivers/net/sssnic/base/sssnic_cmd.h |  12 +
 drivers/net/sssnic/meson.build   |   1 +
 drivers/net/sssnic/sssnic_ethdev.c   |   6 +
 drivers/net/sssnic/sssnic_ethdev_rx.c|  30 ++
 drivers/net/sssnic/sssnic_ethdev_rx.h|   4 +
 drivers/net/sssnic/sssnic_ethdev_stats.c | 391 +++
 drivers/net/sssnic/sssnic_ethdev_stats.h |  18 ++
 drivers/net/sssnic/sssnic_ethdev_tx.c|  36 +++
 drivers/net/sssnic/sssnic_ethdev_tx.h|   4 +
 12 files changed, 775 insertions(+)
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_stats.c
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_stats.h

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index 359834ce4c..aba0b78c95 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -12,6 +12,9 @@ Promiscuous mode = Y
 Allmulticast mode= Y
 Unicast MAC filter   = Y
 Multicast MAC filter = Y
+Basic stats  = Y
+Extended stats   = Y
+Stats per queue  = Y
 Linux= Y
 ARMv8= Y
 x86-64   = Y
diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index 81020387bd..9f063112f2 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -1005,3 +1005,157 @@ sssnic_port_resource_clean(struct sssnic_hw *hw)
 
return 0;
 }
+
+int
+sssnic_port_stats_get(struct sssnic_hw *hw, struct sssnic_port_stats *stats)
+{
+   int ret;
+   struct sssnic_port_stats_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len, resp_len;
+   struct {
+   struct sssnic_cmd_common common;
+   uint32_t size;
+   uint32_t resvd0;
+   struct sssnic_port_stats stats;
+   uint64_t rsvd1[6];
+   } resp;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   cmd_len = sizeof(cmd);
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_GET_PORT_STATS_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   memset(&resp, 0, sizeof(resp));
+   resp_len = sizeof(resp);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&resp, &resp_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (resp_len == 0 || resp.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_GET_PORT_STATS_CMD, len=%u, 
status=%u",
+   resp_len, resp.common.status);
+   return -EIO;
+   }
+
+   memcpy(stats, &resp.stats, sizeof(resp.stats));
+
+   return 0;
+}
+
+int
+sssnic_port_stats_clear(struct sssnic_hw *hw)
+{
+   int ret;
+   struct sssnic_port_stats_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_CLEAR_PORT_STATS_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_CLEAN_PORT_RES_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
+
+int
+sssnic_mac_stats_get(struct sssnic_hw *hw, struct sssnic_mac_stats *stats)
+{
+   int ret;
+   struct sssnic_msg msg;
+   uint32_t cmd_len, resp_len;
+   struct sssnic_mac_stats_cmd cmd;
+   struct {
+   struct sssnic_cmd_common common;
+   struct sssnic_mac_stats stats;
+   uint64_t resvd[15];
+   } *resp;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.port = SSSNIC_PHY_PORT(hw);
+   cmd_len = sizeof(cmd);
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_GET_NETIF_MAC_STATS_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_NETIF_MODULE, SSSNIC_MSG_TYPE_REQ);
+
+   resp_len = sizeof(*resp);
+   resp = rte_zmalloc(NULL, resp_len, 0);
+   if (resp == NULL) {
+   PMD_DRV_LOG(ERR,
+   "Failed to alloc memory for mac stats response cmd");
+   return -ENOMEM;

[PATCH v4 21/32] net/sssnic: add allmulticast and promiscuous ops

2023-09-01 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 doc/guides/nics/features/sssnic.ini |  2 +
 drivers/net/sssnic/sssnic_ethdev.c  | 72 +
 2 files changed, 74 insertions(+)

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index e3b8166629..359834ce4c 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -8,6 +8,8 @@ Link status  = Y
 Link status event= Y
 Queue start/stop = Y
 Rx interrupt = Y
+Promiscuous mode = Y
+Allmulticast mode= Y
 Unicast MAC filter   = Y
 Multicast MAC filter = Y
 Linux= Y
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index b59c4fd3ad..e1c805aeea 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -652,6 +652,74 @@ sssnic_ethdev_reset(struct rte_eth_dev *ethdev)
return 0;
 }
 
+static int
+sssnic_ethdev_allmulticast_enable(struct rte_eth_dev *ethdev)
+{
+   struct sssnic_netdev *netdev = SSSNIC_ETHDEV_PRIVATE(ethdev);
+   uint32_t rx_mode;
+   int ret;
+
+   rx_mode = netdev->rx_mode | SSSNIC_ETHDEV_RX_ALL_MCAST;
+   ret = sssnic_ethdev_rx_mode_set(ethdev, rx_mode);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to set rx_mode: %x", rx_mode);
+   return ret;
+   }
+
+   return 0;
+}
+
+static int
+sssnic_ethdev_allmulticast_disable(struct rte_eth_dev *ethdev)
+{
+   struct sssnic_netdev *netdev = SSSNIC_ETHDEV_PRIVATE(ethdev);
+   uint32_t rx_mode;
+   int ret;
+
+   rx_mode = netdev->rx_mode & (~SSSNIC_ETHDEV_RX_ALL_MCAST);
+   ret = sssnic_ethdev_rx_mode_set(ethdev, rx_mode);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to set rx_mode: %x", rx_mode);
+   return ret;
+   }
+
+   return 0;
+}
+
+static int
+sssnic_ethdev_promiscuous_enable(struct rte_eth_dev *ethdev)
+{
+   struct sssnic_netdev *netdev = SSSNIC_ETHDEV_PRIVATE(ethdev);
+   uint32_t rx_mode;
+   int ret;
+
+   rx_mode = netdev->rx_mode | SSSNIC_ETHDEV_RX_PROMISC;
+   ret = sssnic_ethdev_rx_mode_set(ethdev, rx_mode);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to set rx_mode: %x", rx_mode);
+   return ret;
+   }
+
+   return 0;
+}
+
+static int
+sssnic_ethdev_promiscuous_disable(struct rte_eth_dev *ethdev)
+{
+   struct sssnic_netdev *netdev = SSSNIC_ETHDEV_PRIVATE(ethdev);
+   uint32_t rx_mode;
+   int ret;
+
+   rx_mode = netdev->rx_mode & (~SSSNIC_ETHDEV_RX_PROMISC);
+   ret = sssnic_ethdev_rx_mode_set(ethdev, rx_mode);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to set rx_mode: %x", rx_mode);
+   return ret;
+   }
+
+   return 0;
+}
+
 static const struct eth_dev_ops sssnic_ethdev_ops = {
.dev_start = sssnic_ethdev_start,
.dev_stop = sssnic_ethdev_stop,
@@ -676,6 +744,10 @@ static const struct eth_dev_ops sssnic_ethdev_ops = {
.tx_queue_stop = sssnic_ethdev_tx_queue_stop,
.rx_queue_intr_enable = sssnic_ethdev_rx_queue_intr_enable,
.rx_queue_intr_disable = sssnic_ethdev_rx_queue_intr_disable,
+   .allmulticast_enable = sssnic_ethdev_allmulticast_enable,
+   .allmulticast_disable = sssnic_ethdev_allmulticast_disable,
+   .promiscuous_enable = sssnic_ethdev_promiscuous_enable,
+   .promiscuous_disable = sssnic_ethdev_promiscuous_disable,
 };
 
 static int
-- 
2.27.0



[PATCH v4 24/32] net/sssnic: support Tx packet burst

2023-09-01 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Fixed wrong format of printing uint64_t.
---
 doc/guides/nics/features/sssnic.ini   |   5 +
 drivers/net/sssnic/sssnic_ethdev.c|   1 +
 drivers/net/sssnic/sssnic_ethdev_tx.c | 404 ++
 drivers/net/sssnic/sssnic_ethdev_tx.h |   2 +
 4 files changed, 412 insertions(+)

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index 320ac4533d..7e6b70684a 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -9,11 +9,16 @@ Link status event= Y
 Queue start/stop = Y
 Rx interrupt = Y
 Scattered Rx = Y
+TSO  = Y
 LRO  = Y
 Promiscuous mode = Y
 Allmulticast mode= Y
 Unicast MAC filter   = Y
 Multicast MAC filter = Y
+L3 checksum offload  = Y
+L4 checksum offload  = Y
+Inner L3 checksum= Y
+Inner L4 checksum= Y
 Basic stats  = Y
 Extended stats   = Y
 Stats per queue  = Y
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index 021fabcbe5..328fb85d30 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -770,6 +770,7 @@ sssnic_ethdev_init(struct rte_eth_dev *ethdev)
return 0;
 
ethdev->rx_pkt_burst = sssnic_ethdev_rx_pkt_burst;
+   ethdev->tx_pkt_burst = sssnic_ethdev_tx_pkt_burst;
 
netdev = SSSNIC_ETHDEV_PRIVATE(ethdev);
pci_dev = RTE_ETH_DEV_TO_PCI(ethdev);
diff --git a/drivers/net/sssnic/sssnic_ethdev_tx.c 
b/drivers/net/sssnic/sssnic_ethdev_tx.c
index d167e3f307..533befb6ea 100644
--- a/drivers/net/sssnic/sssnic_ethdev_tx.c
+++ b/drivers/net/sssnic/sssnic_ethdev_tx.c
@@ -171,6 +171,17 @@ enum sssnic_ethdev_txq_entry_type {
SSSNIC_ETHDEV_TXQ_ENTRY_EXTEND = 1,
 };
 
+struct sssnic_ethdev_tx_info {
+   /* offload enable flag */
+   uint16_t offload_en;
+   /*l4 payload offset*/
+   uint16_t payload_off;
+   /* number of txq entries */
+   uint16_t nb_entries;
+   /* number of tx segs */
+   uint16_t nb_segs;
+};
+
 #define SSSNIC_ETHDEV_TXQ_ENTRY_SZ_BITS 4
 #define SSSNIC_ETHDEV_TXQ_ENTRY_SZ (RTE_BIT32(SSSNIC_ETHDEV_TXQ_ENTRY_SZ_BITS))
 
@@ -182,12 +193,44 @@ enum sssnic_ethdev_txq_entry_type {
 #define SSSNIC_ETHDEV_TX_CI_DEF_COALESCING_TIME 16
 #define SSSNIC_ETHDEV_TX_CI_DEF_PENDING_TIME 4
 
+#define SSSNIC_ETHDEV_TX_CSUM_OFFLOAD_MASK 
\
+   (RTE_MBUF_F_TX_IP_CKSUM | RTE_MBUF_F_TX_TCP_CKSUM |\
+   RTE_MBUF_F_TX_UDP_CKSUM | RTE_MBUF_F_TX_SCTP_CKSUM |   \
+   RTE_MBUF_F_TX_OUTER_IP_CKSUM | RTE_MBUF_F_TX_TCP_SEG)
+
+#define SSSNIC_ETHDEV_TX_OFFLOAD_MASK  
\
+   (RTE_MBUF_F_TX_VLAN | SSSNIC_ETHDEV_TX_CSUM_OFFLOAD_MASK)
+
+#define SSSNIC_ETHDEV_TX_MAX_NUM_SEGS 38
+#define SSSNIC_ETHDEV_TX_MAX_SEG_SIZE 65535
+#define SSSNIC_ETHDEV_TX_MAX_PAYLOAD_OFF 221
+#define SSSNIC_ETHDEV_TX_DEF_MSS 0x3e00
+#define SSSNIC_ETHDEV_TX_MIN_MSS 0x50
+#define SSSNIC_ETHDEV_TX_COMPACT_SEG_MAX_SIZE 0x3fff
+
+#define SSSNIC_ETHDEV_TXQ_DESC_ENTRY(txq, idx) 
\
+   (SSSNIC_WORKQ_ENTRY_CAST((txq)->workq, idx,\
+   struct sssnic_ethdev_tx_desc))
+
+#define SSSNIC_ETHDEV_TXQ_OFFLOAD_ENTRY(txq, idx)  
\
+   SSSNIC_WORKQ_ENTRY_CAST((txq)->workq, idx, \
+   struct sssnic_ethdev_tx_offload)
+
+#define SSSNIC_ETHDEV_TXQ_SEG_ENTRY(txq, idx)  
\
+   SSSNIC_WORKQ_ENTRY_CAST((txq)->workq, idx, struct sssnic_ethdev_tx_seg)
+
 static inline uint16_t
 sssnic_ethdev_txq_num_used_entries(struct sssnic_ethdev_txq *txq)
 {
return sssnic_workq_num_used_entries(txq->workq);
 }
 
+static inline uint16_t
+sssnic_ethdev_txq_num_idle_entries(struct sssnic_ethdev_txq *txq)
+{
+   return sssnic_workq_num_idle_entries(txq->workq);
+}
+
 static inline uint16_t
 sssnic_ethdev_txq_ci_get(struct sssnic_ethdev_txq *txq)
 {
@@ -212,6 +255,12 @@ sssnic_ethdev_txq_consume(struct sssnic_ethdev_txq *txq, 
uint16_t num_entries)
sssnic_workq_consume_fast(txq->workq, num_entries);
 }
 
+static inline void
+sssnic_ethdev_txq_produce(struct sssnic_ethdev_txq *txq, uint16_t num_entries)
+{
+   sssnic_workq_produce_fast(txq->workq, num_entries);
+}
+
 int
 sssnic_ethdev_tx_queue_setup(struct rte_eth_dev *ethdev, uint16_t tx_queue_id,
uint16_t nb_tx_desc, unsigned int socket_id,
@@ -706,3 +755,358 @@ sssnic_ethdev_tx_queue_stats_clear(struct rte_eth_dev 
*ethdev, uint16_t qid)
*(stat++) = 0;
}
 }
+
+static inline uint16_t
+sssnic_ethdev_tx_payload_calc(struct rte_mbuf *tx_mbuf)
+{
+   if ((tx_mbuf->ol_flags & RTE_MBUF_F_TX_TUNNEL_MASK) != 0) {
+   uint64_t mask = RTE_MBU

[PATCH v4 26/32] net/sssnic: support dev MTU set

2023-09-01 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/sssnic_ethdev.c | 7 +++
 1 file changed, 7 insertions(+)

diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index a00e96bebe..b086e91d2d 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -733,6 +733,12 @@ sssnic_ethdev_promiscuous_disable(struct rte_eth_dev 
*ethdev)
return 0;
 }
 
+static int
+sssnic_ethdev_mtu_set(struct rte_eth_dev *ethdev, uint16_t mtu)
+{
+   return sssnic_ethdev_tx_max_size_set(ethdev, mtu);
+}
+
 static const struct eth_dev_ops sssnic_ethdev_ops = {
.dev_start = sssnic_ethdev_start,
.dev_stop = sssnic_ethdev_stop,
@@ -770,6 +776,7 @@ static const struct eth_dev_ops sssnic_ethdev_ops = {
.rss_hash_update = sssnic_ethdev_rss_hash_update,
.reta_update = sssnic_ethdev_rss_reta_update,
.reta_query = sssnic_ethdev_rss_reta_query,
+   .mtu_set = sssnic_ethdev_mtu_set,
 };
 
 static int
-- 
2.27.0



[PATCH v4 25/32] net/sssnic: add RSS support

2023-09-01 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Removed error.h from including files.
---
 doc/guides/nics/features/sssnic.ini|   4 +
 drivers/net/sssnic/base/sssnic_api.c   | 338 ++
 drivers/net/sssnic/base/sssnic_api.h   |  36 +++
 drivers/net/sssnic/base/sssnic_cmd.h   |  58 
 drivers/net/sssnic/meson.build |   1 +
 drivers/net/sssnic/sssnic_ethdev.c |  16 ++
 drivers/net/sssnic/sssnic_ethdev.h |   2 +
 drivers/net/sssnic/sssnic_ethdev_rss.c | 377 +
 drivers/net/sssnic/sssnic_ethdev_rss.h |  20 ++
 drivers/net/sssnic/sssnic_ethdev_rx.c  |  13 +
 10 files changed, 865 insertions(+)
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_rss.c
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_rss.h

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index 7e6b70684a..020a9e7056 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -15,6 +15,10 @@ Promiscuous mode = Y
 Allmulticast mode= Y
 Unicast MAC filter   = Y
 Multicast MAC filter = Y
+RSS hash = Y
+RSS key update   = Y
+RSS reta update  = Y
+Inner RSS= Y
 L3 checksum offload  = Y
 L4 checksum offload  = Y
 Inner L3 checksum= Y
diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index 9f063112f2..32b24e841c 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -1159,3 +1159,341 @@ sssnic_mac_stats_clear(struct sssnic_hw *hw)
 
return 0;
 }
+
+int
+sssnic_rss_enable_set(struct sssnic_hw *hw, bool state)
+{
+   int ret;
+   struct sssnic_rss_enable_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.state = state ? 1 : 0;
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   cmd_len = sizeof(cmd);
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len, SSSNIC_ENABLE_RSS_CMD,
+   SSSNIC_MPU_FUNC_IDX, SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_ENABLE_RSS_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
+
+static int
+sssnic_rss_profile_config(struct sssnic_hw *hw, bool new)
+{
+   int ret;
+   struct sssnic_rss_profile_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.opcode = new ? SSSNIC_RSS_PROFILE_CMD_OP_NEW :
+SSSNIC_RSS_PROFILE_CMD_OP_DEL;
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   cmd_len = sizeof(cmd);
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len, SSSNIC_RSS_PROFILE_CMD,
+   SSSNIC_MPU_FUNC_IDX, SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_RSS_PROFILE_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
+
+int
+sssnic_rss_profile_create(struct sssnic_hw *hw)
+{
+   return sssnic_rss_profile_config(hw, true);
+}
+
+int
+sssnic_rss_profile_destroy(struct sssnic_hw *hw)
+{
+   return sssnic_rss_profile_config(hw, false);
+}
+
+int
+sssnic_rss_hash_key_set(struct sssnic_hw *hw, uint8_t *key, uint16_t len)
+{
+   int ret;
+   struct sssnic_rss_hash_key_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   if (len > sizeof(cmd.key)) {
+   PMD_DRV_LOG(ERR, "Invalid rss hash key length: %u", len);
+   return -EINVAL;
+   }
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.opcode = SSSNIC_CMD_OPCODE_SET;
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   rte_memcpy(cmd.key, key, len);
+   cmd_len = sizeof(cmd);
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len, SSSNIC_RSS_HASH_KEY_CMD,
+   SSSNIC_MPU_FUNC_IDX, SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Ba

[PATCH v4 27/32] net/sssnic: support dev queue info get

2023-09-01 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/sssnic_ethdev.c|  2 ++
 drivers/net/sssnic/sssnic_ethdev_rx.c | 13 +
 drivers/net/sssnic/sssnic_ethdev_rx.h |  2 ++
 drivers/net/sssnic/sssnic_ethdev_tx.c | 11 +++
 drivers/net/sssnic/sssnic_ethdev_tx.h |  2 ++
 5 files changed, 30 insertions(+)

diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index b086e91d2d..bde8d89ddc 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -777,6 +777,8 @@ static const struct eth_dev_ops sssnic_ethdev_ops = {
.reta_update = sssnic_ethdev_rss_reta_update,
.reta_query = sssnic_ethdev_rss_reta_query,
.mtu_set = sssnic_ethdev_mtu_set,
+   .rxq_info_get = sssnic_ethdev_rx_queue_info_get,
+   .txq_info_get = sssnic_ethdev_tx_queue_info_get,
 };
 
 static int
diff --git a/drivers/net/sssnic/sssnic_ethdev_rx.c 
b/drivers/net/sssnic/sssnic_ethdev_rx.c
index 2874a93a54..6c5f209262 100644
--- a/drivers/net/sssnic/sssnic_ethdev_rx.c
+++ b/drivers/net/sssnic/sssnic_ethdev_rx.c
@@ -1363,3 +1363,16 @@ sssnic_ethdev_rx_pkt_burst(void *rx_queue, struct 
rte_mbuf **rx_pkts,
 
return nb_rx;
 }
+
+void
+sssnic_ethdev_rx_queue_info_get(struct rte_eth_dev *ethdev,
+   uint16_t rx_queue_id, struct rte_eth_rxq_info *qinfo)
+{
+   struct sssnic_ethdev_rxq *rxq = ethdev->data->rx_queues[rx_queue_id];
+
+   qinfo->rx_buf_size = rxq->rx_buf_size;
+   qinfo->nb_desc = rxq->depth;
+   qinfo->queue_state = ethdev->data->rx_queue_state[rx_queue_id];
+   qinfo->mp = rxq->mp;
+   qinfo->conf.rx_free_thresh = rxq->rx_free_thresh;
+}
diff --git a/drivers/net/sssnic/sssnic_ethdev_rx.h 
b/drivers/net/sssnic/sssnic_ethdev_rx.h
index b0b35dee73..20e4d1ac0e 100644
--- a/drivers/net/sssnic/sssnic_ethdev_rx.h
+++ b/drivers/net/sssnic/sssnic_ethdev_rx.h
@@ -44,5 +44,7 @@ void sssnic_ethdev_rx_queue_stats_clear(struct rte_eth_dev 
*ethdev,
uint16_t qid);
 uint16_t sssnic_ethdev_rx_pkt_burst(void *rx_queue, struct rte_mbuf **rx_pkts,
uint16_t nb_pkts);
+void sssnic_ethdev_rx_queue_info_get(struct rte_eth_dev *ethdev,
+   uint16_t rx_queue_id, struct rte_eth_rxq_info *qinfo);
 
 #endif
diff --git a/drivers/net/sssnic/sssnic_ethdev_tx.c 
b/drivers/net/sssnic/sssnic_ethdev_tx.c
index 533befb6ea..51931df645 100644
--- a/drivers/net/sssnic/sssnic_ethdev_tx.c
+++ b/drivers/net/sssnic/sssnic_ethdev_tx.c
@@ -1110,3 +1110,14 @@ sssnic_ethdev_tx_pkt_burst(void *tx_queue, struct 
rte_mbuf **tx_pkts,
 
return nb_tx;
 }
+
+void
+sssnic_ethdev_tx_queue_info_get(struct rte_eth_dev *ethdev,
+   uint16_t tx_queue_id, struct rte_eth_txq_info *qinfo)
+{
+   struct sssnic_ethdev_txq *txq = ethdev->data->tx_queues[tx_queue_id];
+
+   qinfo->nb_desc = txq->depth;
+   qinfo->queue_state = ethdev->data->tx_queue_state[tx_queue_id];
+   qinfo->conf.tx_free_thresh = txq->tx_free_thresh;
+}
diff --git a/drivers/net/sssnic/sssnic_ethdev_tx.h 
b/drivers/net/sssnic/sssnic_ethdev_tx.h
index 3a7cd47080..6130ade4d1 100644
--- a/drivers/net/sssnic/sssnic_ethdev_tx.h
+++ b/drivers/net/sssnic/sssnic_ethdev_tx.h
@@ -39,5 +39,7 @@ void sssnic_ethdev_tx_queue_stats_clear(struct rte_eth_dev 
*ethdev,
uint16_t qid);
 uint16_t sssnic_ethdev_tx_pkt_burst(void *tx_queue, struct rte_mbuf **tx_pkts,
uint16_t nb_pkts);
+void sssnic_ethdev_tx_queue_info_get(struct rte_eth_dev *ethdev,
+   uint16_t tx_queue_id, struct rte_eth_txq_info *qinfo);
 
 #endif /* _SSSNIC_ETHDEV_TX_H_ */
-- 
2.27.0



[PATCH v4 29/32] net/sssnic: add dev flow control ops

2023-09-01 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 doc/guides/nics/features/sssnic.ini  |  1 +
 drivers/net/sssnic/base/sssnic_api.c | 68 
 drivers/net/sssnic/base/sssnic_api.h |  4 ++
 drivers/net/sssnic/base/sssnic_cmd.h | 11 +
 drivers/net/sssnic/sssnic_ethdev.c   | 65 ++
 5 files changed, 149 insertions(+)

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index a40b509558..9bf05cb968 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -26,6 +26,7 @@ Inner L4 checksum= Y
 Basic stats  = Y
 Extended stats   = Y
 Stats per queue  = Y
+Flow control = P
 FW version   = Y
 Linux= Y
 ARMv8= Y
diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index 12aca16995..d91896cdd2 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -1533,3 +1533,71 @@ sssnic_fw_version_get(struct sssnic_hw *hw, struct 
sssnic_fw_version *version)
 
return 0;
 }
+
+int
+sssnic_flow_ctrl_set(struct sssnic_hw *hw, bool autoneg, bool rx_en, bool 
tx_en)
+{
+   int ret;
+   struct sssnic_msg msg;
+   struct sssnic_flow_ctrl_cmd cmd;
+   uint32_t cmdlen = sizeof(cmd);
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.auto_neg = autoneg ? 1 : 0;
+   cmd.rx_en = rx_en ? 1 : 0;
+   cmd.tx_en = tx_en ? 1 : 0;
+   cmd.opcode = SSSNIC_CMD_OPCODE_SET;
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmdlen,
+   SSSNIC_PORT_FLOW_CTRL_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmdlen, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmdlen == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_PORT_FLOW_CTRL_CMD, len=%u, 
status=%u",
+   cmdlen, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
+
+int
+sssnic_flow_ctrl_get(struct sssnic_hw *hw, bool *autoneg, bool *rx_en,
+   bool *tx_en)
+{
+   int ret;
+   struct sssnic_msg msg;
+   struct sssnic_flow_ctrl_cmd cmd;
+   uint32_t cmdlen = sizeof(cmd);
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.opcode = SSSNIC_CMD_OPCODE_GET;
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmdlen,
+   SSSNIC_PORT_FLOW_CTRL_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmdlen, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmdlen == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_PORT_FLOW_CTRL_CMD, len=%u, 
status=%u",
+   cmdlen, cmd.common.status);
+   return -EIO;
+   }
+
+   *autoneg = cmd.auto_neg;
+   *rx_en = cmd.rx_en;
+   *tx_en = cmd.tx_en;
+
+   return 0;
+}
diff --git a/drivers/net/sssnic/base/sssnic_api.h 
b/drivers/net/sssnic/base/sssnic_api.h
index bd4f01d388..36544a5dc3 100644
--- a/drivers/net/sssnic/base/sssnic_api.h
+++ b/drivers/net/sssnic/base/sssnic_api.h
@@ -465,5 +465,9 @@ int sssnic_rss_indir_table_get(struct sssnic_hw *hw, 
uint16_t *entry,
uint32_t num_entries);
 int sssnic_fw_version_get(struct sssnic_hw *hw,
struct sssnic_fw_version *version);
+int sssnic_flow_ctrl_set(struct sssnic_hw *hw, bool autoneg, bool rx_en,
+   bool tx_en);
+int sssnic_flow_ctrl_get(struct sssnic_hw *hw, bool *autoneg, bool *rx_en,
+   bool *tx_en);
 
 #endif /* _SSSNIC_API_H_ */
diff --git a/drivers/net/sssnic/base/sssnic_cmd.h 
b/drivers/net/sssnic/base/sssnic_cmd.h
index 9da07770b1..d2054fad5a 100644
--- a/drivers/net/sssnic/base/sssnic_cmd.h
+++ b/drivers/net/sssnic/base/sssnic_cmd.h
@@ -414,4 +414,15 @@ struct sssnic_fw_version_get_cmd {
uint8_t time[20];
 };
 
+struct sssnic_flow_ctrl_cmd {
+   struct sssnic_cmd_common common;
+   uint8_t port;
+   uint8_t opcode;
+   uint16_t resvd0;
+   uint8_t auto_neg;
+   uint8_t rx_en;
+   uint8_t tx_en;
+   uint8_t resvd1[5];
+};
+
 #endif /* _SSSNIC_CMD_H_ */
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index cceaa5c8be..8999693027 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -758,6 +758,69 @@ sssnic_ethdev_fw_version_get(struct rte_eth_dev *ethdev, 
char *fw_version,
return 0;
 }
 
+static int
+sssnic_ethdev_flow_ctrl_set(struct rte_eth_dev *ethdev,
+   struct rte_eth_fc_c

[PATCH v4 28/32] net/sssnic: support dev firmware version get

2023-09-01 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 doc/guides/nics/features/sssnic.ini  |  1 +
 drivers/net/sssnic/base/sssnic_api.c | 36 
 drivers/net/sssnic/base/sssnic_api.h |  9 +++
 drivers/net/sssnic/base/sssnic_cmd.h |  8 +++
 drivers/net/sssnic/sssnic_ethdev.c   | 20 
 5 files changed, 74 insertions(+)

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index 020a9e7056..a40b509558 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -26,6 +26,7 @@ Inner L4 checksum= Y
 Basic stats  = Y
 Extended stats   = Y
 Stats per queue  = Y
+FW version   = Y
 Linux= Y
 ARMv8= Y
 x86-64   = Y
diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index 32b24e841c..12aca16995 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -1497,3 +1497,39 @@ sssnic_rss_indir_table_get(struct sssnic_hw *hw, 
uint16_t *entry,
sssnic_ctrlq_cmd_destroy(hw, cmd);
return ret;
 }
+
+int
+sssnic_fw_version_get(struct sssnic_hw *hw, struct sssnic_fw_version *version)
+{
+   int ret;
+   struct sssnic_msg msg;
+   struct sssnic_fw_version_get_cmd cmd;
+   uint32_t cmdlen = sizeof(cmd);
+   int len;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.type = 1; /* get MPU firmware version */
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmdlen,
+   SSSNIC_GET_FW_VERSION_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_COMM_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmdlen, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmdlen == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_GET_FW_VERSION_CMD, len=%u, 
status=%u",
+   cmdlen, cmd.common.status);
+   return -EIO;
+   }
+
+   len = RTE_MIN(sizeof(version->version), sizeof(cmd.version));
+   rte_memcpy(version->version, cmd.version, len);
+   len = RTE_MIN(sizeof(version->time), sizeof(cmd.time));
+   rte_memcpy(version->time, cmd.time, len);
+
+   return 0;
+}
diff --git a/drivers/net/sssnic/base/sssnic_api.h 
b/drivers/net/sssnic/base/sssnic_api.h
index 1d80b93e38..bd4f01d388 100644
--- a/drivers/net/sssnic/base/sssnic_api.h
+++ b/drivers/net/sssnic/base/sssnic_api.h
@@ -402,6 +402,13 @@ enum sssnic_rss_hash_engine_type {
SSSNIC_RSS_HASH_ENGINE_COUNT,
 };
 
+#define SSSNIC_FW_VERSION_LEN 16
+#define SSSNIC_FW_TIME_LEN 20
+struct sssnic_fw_version {
+   char version[SSSNIC_FW_VERSION_LEN];
+   char time[SSSNIC_FW_VERSION_LEN];
+};
+
 int sssnic_msix_attr_get(struct sssnic_hw *hw, uint16_t msix_idx,
struct sssnic_msix_attr *attr);
 int sssnic_msix_attr_set(struct sssnic_hw *hw, uint16_t msix_idx,
@@ -456,5 +463,7 @@ int sssnic_rss_indir_table_set(struct sssnic_hw *hw, const 
uint16_t *entry,
uint32_t num_entries);
 int sssnic_rss_indir_table_get(struct sssnic_hw *hw, uint16_t *entry,
uint32_t num_entries);
+int sssnic_fw_version_get(struct sssnic_hw *hw,
+   struct sssnic_fw_version *version);
 
 #endif /* _SSSNIC_API_H_ */
diff --git a/drivers/net/sssnic/base/sssnic_cmd.h 
b/drivers/net/sssnic/base/sssnic_cmd.h
index 56818471b6..9da07770b1 100644
--- a/drivers/net/sssnic/base/sssnic_cmd.h
+++ b/drivers/net/sssnic/base/sssnic_cmd.h
@@ -406,4 +406,12 @@ struct sssnic_rss_indir_table_cmd {
uint16_t entry[256];
 };
 
+struct sssnic_fw_version_get_cmd {
+   struct sssnic_cmd_common common;
+   uint16_t type;
+   uint16_t resvd;
+   uint8_t version[16];
+   uint8_t time[20];
+};
+
 #endif /* _SSSNIC_CMD_H_ */
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index bde8d89ddc..cceaa5c8be 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -739,6 +739,25 @@ sssnic_ethdev_mtu_set(struct rte_eth_dev *ethdev, uint16_t 
mtu)
return sssnic_ethdev_tx_max_size_set(ethdev, mtu);
 }
 
+static int
+sssnic_ethdev_fw_version_get(struct rte_eth_dev *ethdev, char *fw_version,
+   size_t fw_size)
+{
+   struct sssnic_hw *hw = SSSNIC_ETHDEV_TO_HW(ethdev);
+   struct sssnic_fw_version version;
+   int ret;
+
+   ret = sssnic_fw_version_get(hw, &version);
+   if (ret) {
+   PMD_DRV_LOG(ERR, "Failed to get firmware version");
+   return ret;
+   }
+
+   snprintf(fw_version, fw_size, "%s", version.version);
+
+   return 0;
+}
+
 static const struct eth_dev_ops sssnic_ethdev_ops = {
.dev_start = sssnic_ethdev_start,
.dev_stop = sssnic_ethdev_stop,
@@ -779,6 +

[PATCH v4 30/32] net/sssnic: support VLAN offload and filter

2023-09-01 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 doc/guides/nics/features/sssnic.ini  |  2 +
 drivers/net/sssnic/base/sssnic_api.c | 34 +++
 drivers/net/sssnic/base/sssnic_api.h |  1 +
 drivers/net/sssnic/base/sssnic_cmd.h |  9 +++
 drivers/net/sssnic/sssnic_ethdev.c   | 87 
 5 files changed, 133 insertions(+)

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index 9bf05cb968..f5738ac934 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -19,6 +19,8 @@ RSS hash = Y
 RSS key update   = Y
 RSS reta update  = Y
 Inner RSS= Y
+VLAN filter  = Y
+VLAN offload = Y
 L3 checksum offload  = Y
 L4 checksum offload  = Y
 Inner L3 checksum= Y
diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index d91896cdd2..68c16c9c1e 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -1601,3 +1601,37 @@ sssnic_flow_ctrl_get(struct sssnic_hw *hw, bool 
*autoneg, bool *rx_en,
 
return 0;
 }
+
+int
+sssnic_vlan_filter_set(struct sssnic_hw *hw, uint16_t vid, bool add)
+{
+   int ret;
+   struct sssnic_vlan_filter_set_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   cmd.add = add ? 1 : 0;
+   cmd.vid = vid;
+   cmd_len = sizeof(cmd);
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_SET_PORT_VLAN_FILTER_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_SET_PORT_VLAN_FILTER_CMD, 
len=%u, status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
diff --git a/drivers/net/sssnic/base/sssnic_api.h 
b/drivers/net/sssnic/base/sssnic_api.h
index 36544a5dc3..28b235dda2 100644
--- a/drivers/net/sssnic/base/sssnic_api.h
+++ b/drivers/net/sssnic/base/sssnic_api.h
@@ -469,5 +469,6 @@ int sssnic_flow_ctrl_set(struct sssnic_hw *hw, bool 
autoneg, bool rx_en,
bool tx_en);
 int sssnic_flow_ctrl_get(struct sssnic_hw *hw, bool *autoneg, bool *rx_en,
bool *tx_en);
+int sssnic_vlan_filter_set(struct sssnic_hw *hw, uint16_t vid, bool add);
 
 #endif /* _SSSNIC_API_H_ */
diff --git a/drivers/net/sssnic/base/sssnic_cmd.h 
b/drivers/net/sssnic/base/sssnic_cmd.h
index d2054fad5a..3e70d0e223 100644
--- a/drivers/net/sssnic/base/sssnic_cmd.h
+++ b/drivers/net/sssnic/base/sssnic_cmd.h
@@ -425,4 +425,13 @@ struct sssnic_flow_ctrl_cmd {
uint8_t resvd1[5];
 };
 
+struct sssnic_vlan_filter_set_cmd {
+   struct sssnic_cmd_common common;
+   uint16_t function;
+   uint8_t add;
+   uint8_t resvd0;
+   uint16_t vid;
+   uint16_t resvd1;
+};
+
 #endif /* _SSSNIC_CMD_H_ */
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index 8999693027..8a1ccff70b 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -16,6 +16,7 @@
 #include "sssnic_ethdev_rss.h"
 
 static int sssnic_ethdev_init(struct rte_eth_dev *ethdev);
+static void sssnic_ethdev_vlan_filter_clean(struct rte_eth_dev *ethdev);
 
 static int
 sssnic_ethdev_infos_get(struct rte_eth_dev *ethdev,
@@ -340,6 +341,7 @@ sssnic_ethdev_release(struct rte_eth_dev *ethdev)
 {
struct sssnic_hw *hw = SSSNIC_ETHDEV_TO_HW(ethdev);
 
+   sssnic_ethdev_vlan_filter_clean(ethdev);
sssnic_ethdev_link_intr_disable(ethdev);
sssnic_ethdev_tx_queue_all_release(ethdev);
sssnic_ethdev_rx_queue_all_release(ethdev);
@@ -821,6 +823,89 @@ sssnic_ethdev_flow_ctrl_get(struct rte_eth_dev *ethdev,
return 0;
 }
 
+static int
+sssnic_ethdev_vlan_offload_set(struct rte_eth_dev *ethdev, int mask)
+{
+   struct sssnic_hw *hw = SSSNIC_ETHDEV_TO_HW(ethdev);
+   struct rte_eth_conf *dev_conf = ðdev->data->dev_conf;
+   uint8_t vlan_strip_en;
+   uint32_t vlan_filter_en;
+   int ret;
+
+   if (mask & RTE_ETH_VLAN_STRIP_MASK) {
+   if (dev_conf->rxmode.offloads & RTE_ETH_RX_OFFLOAD_VLAN_STRIP)
+   vlan_strip_en = 1;
+   else
+   vlan_strip_en = 0;
+
+   ret = sssnic_vlan_strip_enable_set(hw, vlan_strip_en);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to %s vlan strip offload",
+   vlan_strip_en ? "enable" : "disable");
+   return ret

[PATCH v4 31/32] net/sssnic: add generic flow ops

2023-09-01 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Fixed 'mask->hdr.src_addr' will always evaluate to 'true'.
* Removed error.h from including files.
---
 doc/guides/nics/features/sssnic.ini |   12 +
 drivers/net/sssnic/base/sssnic_api.c|  264 ++
 drivers/net/sssnic/base/sssnic_api.h|   22 +
 drivers/net/sssnic/base/sssnic_cmd.h|   71 ++
 drivers/net/sssnic/base/sssnic_hw.h |3 +
 drivers/net/sssnic/base/sssnic_misc.h   |7 +
 drivers/net/sssnic/meson.build  |2 +
 drivers/net/sssnic/sssnic_ethdev.c  |   12 +
 drivers/net/sssnic/sssnic_ethdev.h  |1 +
 drivers/net/sssnic/sssnic_ethdev_fdir.c | 1017 +++
 drivers/net/sssnic/sssnic_ethdev_fdir.h |  332 
 drivers/net/sssnic/sssnic_ethdev_flow.c |  981 ++
 drivers/net/sssnic/sssnic_ethdev_flow.h |   11 +
 drivers/net/sssnic/sssnic_ethdev_rx.c   |   18 +
 14 files changed, 2753 insertions(+)
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_fdir.c
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_fdir.h
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_flow.c
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_flow.h

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index f5738ac934..57e7440d86 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -33,3 +33,15 @@ FW version   = Y
 Linux= Y
 ARMv8= Y
 x86-64   = Y
+
+[rte_flow items]
+any  = Y
+eth  = Y
+ipv4 = Y
+ipv6 = Y
+tcp  = Y
+udp  = Y
+vxlan= Y
+
+[rte_flow actions]
+queue= Y
diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index 68c16c9c1e..0e965442fd 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -1635,3 +1635,267 @@ sssnic_vlan_filter_set(struct sssnic_hw *hw, uint16_t 
vid, bool add)
 
return 0;
 }
+
+int
+sssnic_tcam_enable_set(struct sssnic_hw *hw, bool enabled)
+{
+   struct sssnic_tcam_enable_set_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+   int ret;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd_len = sizeof(cmd);
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   cmd.enabled = enabled ? 1 : 0;
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_SET_TCAM_ENABLE_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   if (cmd.common.status == SSSNIC_TCAM_CMD_STATUS_UNSUPPORTED)
+   PMD_DRV_LOG(WARNING,
+   "SSSNIC_SET_TCAM_ENABLED_CMD is unsupported");
+   else
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_SET_TCAM_ENABLE_CMD, 
len=%u, status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
+
+int
+sssnic_tcam_flush(struct sssnic_hw *hw)
+{
+   struct sssnic_tcam_flush_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+   int ret;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd_len = sizeof(cmd);
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len, SSSNIC_FLUSH_TCAM_CMD,
+   SSSNIC_MPU_FUNC_IDX, SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   if (cmd.common.status == SSSNIC_TCAM_CMD_STATUS_UNSUPPORTED)
+   PMD_DRV_LOG(WARNING,
+   "SSSNIC_FLUSH_TCAM_CMD is unsupported");
+   else
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_FLUSH_TCAM_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+   return 0;
+}
+
+int
+sssnic_tcam_disable_and_flush(struct sssnic_hw *hw)
+{
+   int ret;
+
+   ret = sssnic_tcam_enable_set(hw, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Could not disable TCAM");
+   return ret;
+   }
+
+   ret = sssnic_tcam_flush(hw);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Could not flush TCAM");
+   return ret;
+   }
+

[PATCH v4 32/32] net/sssnic: add VF dev support

2023-09-01 Thread wanry
From: Renyong Wan 

In comparison to PF, VF PMD does not support the following features:

1. link up and link down set
2. promiscuous enable and disable
3. MAC stats in extend xstats

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/base/sssnic_api.c | 42 +
 drivers/net/sssnic/base/sssnic_api.h |  2 +
 drivers/net/sssnic/base/sssnic_cmd.h |  6 +++
 drivers/net/sssnic/base/sssnic_hw.c  | 19 ++--
 drivers/net/sssnic/base/sssnic_hw.h  |  4 ++
 drivers/net/sssnic/sssnic_ethdev.c   | 60 +++-
 drivers/net/sssnic/sssnic_ethdev_stats.c | 29 ++--
 7 files changed, 153 insertions(+), 9 deletions(-)

diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index 0e965442fd..2d829bc884 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -1899,3 +1899,45 @@ sssnic_tcam_entry_del(struct sssnic_hw *hw, uint32_t 
entry_idx)
 
return 0;
 }
+
+static int
+sssnic_vf_port_register_op(struct sssnic_hw *hw, bool op)
+{
+   int ret;
+   struct sssnic_vf_port_register_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.op = op ? 1 : 0;
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_REGISTER_VF_PORT_CMD, SSSNIC_PF_FUNC_IDX(hw),
+   SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_REGISTER_VF_PORT_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
+
+int
+sssnic_vf_port_register(struct sssnic_hw *hw)
+{
+   return sssnic_vf_port_register_op(hw, true);
+}
+
+int
+sssnic_vf_port_unregister(struct sssnic_hw *hw)
+{
+   return sssnic_vf_port_register_op(hw, false);
+}
diff --git a/drivers/net/sssnic/base/sssnic_api.h 
b/drivers/net/sssnic/base/sssnic_api.h
index 7a02ec61ee..2506682821 100644
--- a/drivers/net/sssnic/base/sssnic_api.h
+++ b/drivers/net/sssnic/base/sssnic_api.h
@@ -492,5 +492,7 @@ int sssnic_tcam_packet_type_filter_set(struct sssnic_hw 
*hw, uint8_t ptype,
 int sssnic_tcam_entry_add(struct sssnic_hw *hw,
struct sssnic_tcam_entry *entry);
 int sssnic_tcam_entry_del(struct sssnic_hw *hw, uint32_t entry_idx);
+int sssnic_vf_port_register(struct sssnic_hw *hw);
+int sssnic_vf_port_unregister(struct sssnic_hw *hw);
 
 #endif /* _SSSNIC_API_H_ */
diff --git a/drivers/net/sssnic/base/sssnic_cmd.h 
b/drivers/net/sssnic/base/sssnic_cmd.h
index c75cb0dad3..058ab298f3 100644
--- a/drivers/net/sssnic/base/sssnic_cmd.h
+++ b/drivers/net/sssnic/base/sssnic_cmd.h
@@ -505,4 +505,10 @@ struct sssnic_tcam_entry_del_cmd {
uint32_t num; /* number of entries to be deleted */
 };
 
+struct sssnic_vf_port_register_cmd {
+   struct sssnic_cmd_common common;
+   uint8_t op; /* 0: unregister, 1: register */
+   uint8_t resvd[39];
+};
+
 #endif /* _SSSNIC_CMD_H_ */
diff --git a/drivers/net/sssnic/base/sssnic_hw.c 
b/drivers/net/sssnic/base/sssnic_hw.c
index 651a0aa7ef..0edd5b9508 100644
--- a/drivers/net/sssnic/base/sssnic_hw.c
+++ b/drivers/net/sssnic/base/sssnic_hw.c
@@ -345,10 +345,16 @@ sssnic_base_init(struct sssnic_hw *hw)
pci_dev = hw->pci_dev;
 
/* get base addresses of hw registers */
-   hw->cfg_base_addr =
-   (uint8_t *)pci_dev->mem_resource[SSSNIC_PCI_BAR_CFG].addr;
-   hw->mgmt_base_addr =
-   (uint8_t *)pci_dev->mem_resource[SSSNIC_PCI_BAR_MGMT].addr;
+   if (pci_dev->id.device_id == SSSNIC_VF_DEVICE_ID) {
+   uint8_t *addr =
+   (uint8_t 
*)pci_dev->mem_resource[SSSNIC_VF_PCI_BAR_CFG].addr;
+   hw->cfg_base_addr = addr + SSSNIC_VF_CFG_ADDR_OFFSET;
+   } else {
+   hw->cfg_base_addr =
+   (uint8_t 
*)pci_dev->mem_resource[SSSNIC_PCI_BAR_CFG].addr;
+   hw->mgmt_base_addr =
+   (uint8_t 
*)pci_dev->mem_resource[SSSNIC_PCI_BAR_MGMT].addr;
+   }
hw->db_base_addr =
(uint8_t *)pci_dev->mem_resource[SSSNIC_PCI_BAR_DB].addr;
hw->db_mem_len =
@@ -365,7 +371,10 @@ sssnic_base_init(struct sssnic_hw *hw)
PMD_DRV_LOG(ERR, "Doorbell is not enabled!");
return -EBUSY;
}
-   sssnic_af_setup(hw);
+
+   if (SSSNIC_FUNC_TYPE(hw) != SSSNIC_FUNC_TYPE_VF)
+   sssnic_af_setup(hw);
+
sssnic_msix_all_disable(hw);
sssnic_pf_status_set(hw, SSSNIC_PF_STATUS_INIT);
 
diff --git a/drivers/net/sssnic/base

[PATCH v5 01/32] net/sssnic: add build and doc infrastructure

2023-09-03 Thread wanry
From: Renyong Wan 

Adding minimum PMD code, doc and build infrastructure for sssnic.

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Fixed 'Title underline too short' in doc/guides/nics/sssnic.rst.
* Removed error.h from including files.

v5:
* Fixed rebase mistake.
* Fixed incorrect path in MAINTAINERS file.
---
 .mailmap|  2 +
 MAINTAINERS |  7 +++
 doc/guides/nics/features/sssnic.ini |  9 
 doc/guides/nics/index.rst   |  1 +
 doc/guides/nics/sssnic.rst  | 73 +
 drivers/net/meson.build |  1 +
 drivers/net/sssnic/meson.build  | 18 +++
 drivers/net/sssnic/sssnic_ethdev.c  | 28 +++
 8 files changed, 139 insertions(+)
 create mode 100644 doc/guides/nics/features/sssnic.ini
 create mode 100644 doc/guides/nics/sssnic.rst
 create mode 100644 drivers/net/sssnic/meson.build
 create mode 100644 drivers/net/sssnic/sssnic_ethdev.c

diff --git a/.mailmap b/.mailmap
index 864d33ee46..8b66f866d0 100644
--- a/.mailmap
+++ b/.mailmap
@@ -1156,6 +1156,7 @@ Rebecca Troy 
 Remi Pommarel 
 Remy Horton 
 Renata Saiakhova 
+Renyong Wan 
 Reshma Pattan  
 Ricardo Roldan 
 Ricardo Salveti 
@@ -1329,6 +1330,7 @@ Stephen Hurd  

 Steve Capper 
 Steven Lariau 
 Steven Luong 
+Steven Song 
 Steven Webster 
 Steven Zou 
 Steve Rempe 
diff --git a/MAINTAINERS b/MAINTAINERS
index a926155f26..1e161c3305 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -633,6 +633,13 @@ F: drivers/net/af_xdp/
 F: doc/guides/nics/af_xdp.rst
 F: doc/guides/nics/features/af_xdp.ini
 
+3SNIC sssnic
+M: Renyong Wan 
+M: Steven Song 
+F: drivers/net/sssnic/
+F: doc/guides/nics/sssnic.rst
+F: doc/guides/nics/features/sssnic.ini
+
 Amazon ENA
 M: Michal Krawczyk 
 M: Shai Brandes 
diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
new file mode 100644
index 00..6d9786db7e
--- /dev/null
+++ b/doc/guides/nics/features/sssnic.ini
@@ -0,0 +1,9 @@
+;
+; Supported features of the 'sssnic' network poll mode driver.
+;
+; Refer to default.ini for the full list of available PMD features.
+;
+[Features]
+Linux= Y
+ARMv8= Y
+x86-64   = Y
diff --git a/doc/guides/nics/index.rst b/doc/guides/nics/index.rst
index 7bfcac880f..9d2b29383b 100644
--- a/doc/guides/nics/index.rst
+++ b/doc/guides/nics/index.rst
@@ -61,6 +61,7 @@ Network Interface Controller Drivers
 qede
 sfc_efx
 softnic
+sssnic
 tap
 thunderx
 txgbe
diff --git a/doc/guides/nics/sssnic.rst b/doc/guides/nics/sssnic.rst
new file mode 100644
index 00..fe0180c2e6
--- /dev/null
+++ b/doc/guides/nics/sssnic.rst
@@ -0,0 +1,73 @@
+..  SPDX-License-Identifier: BSD-3-Clause
+Copyright(c) 2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+
+SSSNIC Poll Mode Driver
+===
+
+The sssnic PMD (**librte_pmd_sssnic**) provides poll mode driver support
+for 3SNIC 9x0 serials family of Ethernet adapters.
+
+
+Supported NICs
+--
+
+- 3S910 Dual Port SFP28 10/25GbE Ethernet adapter
+- 3S920 Quad Port SFP28 10/25GbE Ethernet adapter
+- 3S920 Quad Port QSFP28 100GbE Ethernet adapter
+
+
+Features
+
+
+Features of sssnic PMD are:
+
+- Link status
+- Link status event
+- Queue start/stop
+- Rx interrupt
+- Scattered Rx
+- TSO
+- LRO
+- Promiscuous mode
+- Allmulticast mode
+- Unicast MAC filter
+- Multicast MAC filte
+- RSS hash
+- RSS key update
+- RSS reta update
+- Inner RSS
+- VLAN filter
+- VLAN offload
+- L3 checksum offload
+- L4 checksum offload
+- Inner L3 checksum
+- Inner L4 checksum
+- Basic stats
+- Extended stats
+- Stats per queue
+- Flow control
+- FW version
+- Generic flow API
+
+
+Prerequisites
+-
+
+- Learning about 3SNIC Ethernet NICs using
+  ``_.
+
+- Follow the DPDK :ref:`Getting Started Guide for Linux ` to setup 
the basic DPDK environment.
+
+
+Driver compilation and testing
+--
+
+Refer to the document :ref:`compiling and testing a PMD for a NIC 
`
+for details.
+
+
+Limitations or Known issues
+---
+
+Build with ICC is not supported yet.
+Power8, ARMv7 and BSD are not supported yet.
diff --git a/drivers/net/meson.build b/drivers/net/meson.build
index bd38b533c5..224eab99a7 100644
--- a/drivers/net/meson.build
+++ b/drivers/net/meson.build
@@ -54,6 +54,7 @@ drivers = [
 'ring',
 'sfc',
 'softnic',
+'sssnic',
 'tap',
 'thunderx',
 'txgbe',
diff --git a/drivers/net/sssnic/meson.build b/drivers/net/sssnic/meson.build
new file mode 100644
index 00..fda65aa380
--- /dev/null
+++ b/drivers/net/sssnic/meson.build
@@ -0,0 +1,18 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+
+if not is_linux
+build = false
+reason = 'only supported on Linux'
+subdir_done()
+endif
+

[PATCH v5 02/32] net/sssnic: add log type and log macros

2023-09-03 Thread wanry
From: Renyong Wan 

Adding log macros to print runtime messages and trace functions.

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/sssnic_ethdev.c | 13 
 drivers/net/sssnic/sssnic_log.h| 51 ++
 2 files changed, 64 insertions(+)
 create mode 100644 drivers/net/sssnic/sssnic_log.h

diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index dcda01eeb8..0f1017af9d 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -5,11 +5,14 @@
 #include 
 #include 
 
+#include "sssnic_log.h"
+
 static int
 sssnic_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device 
*pci_dev)
 {
RTE_SET_USED(pci_drv);
RTE_SET_USED(pci_dev);
+   PMD_INIT_FUNC_TRACE();
return -EINVAL;
 }
 
@@ -17,6 +20,7 @@ static int
 sssnic_pci_remove(struct rte_pci_device *pci_dev)
 {
RTE_SET_USED(pci_dev);
+   PMD_INIT_FUNC_TRACE();
return -EINVAL;
 }
 
@@ -26,3 +30,12 @@ static struct rte_pci_driver sssnic_pmd = {
 };
 
 RTE_PMD_REGISTER_PCI(net_sssnic, sssnic_pmd);
+
+RTE_LOG_REGISTER_SUFFIX(sssnic_logtype_driver, driver, INFO);
+RTE_LOG_REGISTER_SUFFIX(sssnic_logtype_init, init, NOTICE);
+#ifdef RTE_ETHDEV_DEBUG_RX
+RTE_LOG_REGISTER_SUFFIX(sssnic_logtype_rx, rx, DEBUG);
+#endif /*RTE_ETHDEV_DEBUG_RX*/
+#ifdef RTE_ETHDEV_DEBUG_TX
+RTE_LOG_REGISTER_SUFFIX(sssnic_logtype_tx, tx, DEBUG);
+#endif /*RTE_ETHDEV_DEBUG_TX*/
diff --git a/drivers/net/sssnic/sssnic_log.h b/drivers/net/sssnic/sssnic_log.h
new file mode 100644
index 00..629e12100c
--- /dev/null
+++ b/drivers/net/sssnic/sssnic_log.h
@@ -0,0 +1,51 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#ifndef _SSSNIC_LOG_H_
+#define _SSSNIC_LOG_H_
+
+#include 
+
+extern int sssnic_logtype_driver;
+extern int sssnic_logtype_init;
+
+#define SSSNIC_LOG_NAME "sssnic"
+#define PMD_DRV_LOG(level, fmt, args...)   
\
+   rte_log(RTE_LOG_##level, sssnic_logtype_driver,\
+   SSSNIC_LOG_NAME ": " fmt "\n", ##args)
+#define PMD_INIT_LOG(level, fmt, args...)  
\
+   rte_log(RTE_LOG_##level, sssnic_logtype_init, "%s(): " fmt "\n",   \
+   __func__, ##args)
+
+#define SSSNIC_DEBUG(fmt, args...) 
\
+   PMD_DRV_LOG(DEBUG, "[%s():%d] " fmt, __func__, __LINE__, ##args)
+
+/*
+ * Trace driver init and uninit.
+ */
+#define PMD_INIT_FUNC_TRACE() PMD_INIT_LOG(DEBUG, " >>")
+
+#ifdef RTE_ETHDEV_DEBUG_RX
+extern int sssnic_logtype_rx;
+#define SSSNIC_RX_LOG(level, fmt, args...) 
\
+   rte_log(RTE_LOG_##level, sssnic_logtype_rx,\
+   "sssnic_rx: [%s():%d] " fmt "\n", __func__, __LINE__, ##args)
+#else
+#define SSSNIC_RX_LOG(level, fmt, args...) 
\
+   do {   \
+   } while (0)
+#endif /*RTE_ETHDEV_DEBUG_RX*/
+
+#ifdef RTE_ETHDEV_DEBUG_TX
+extern int sssnic_logtype_tx;
+#define SSSNIC_TX_LOG(level, fmt, args...) 
\
+   rte_log(RTE_LOG_##level, sssnic_logtype_rx,\
+   "sssnic_tx: [%s():%d] " fmt "\n", __func__, __LINE__, ##args)
+#else
+#define SSSNIC_TX_LOG(level, fmt, args...) 
\
+   do {   \
+   } while (0)
+#endif /*RTE_ETHDEV_DEBUG_TX*/
+
+#endif /*_SSSNIC_LOG_H_*/
-- 
2.27.0



[PATCH v5 03/32] net/sssnic: support probe and remove

2023-09-03 Thread wanry
From: Renyong Wan 

Register device ID for 3SNIC ethernet adapter to support
PCI ethdev probe and remove.

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/base/sssnic_hw.h | 11 +
 drivers/net/sssnic/sssnic_ethdev.c  | 37 +
 2 files changed, 44 insertions(+), 4 deletions(-)
 create mode 100644 drivers/net/sssnic/base/sssnic_hw.h

diff --git a/drivers/net/sssnic/base/sssnic_hw.h 
b/drivers/net/sssnic/base/sssnic_hw.h
new file mode 100644
index 00..db916b1977
--- /dev/null
+++ b/drivers/net/sssnic/base/sssnic_hw.h
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#ifndef _SSSNIC_HW_H_
+#define _SSSNIC_HW_H_
+
+#define SSSNIC_PCI_VENDOR_ID 0x1F3F
+#define SSSNIC_DEVICE_ID_STD 0x9020
+
+#endif /* _SSSNIC_HW_H_ */
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index 0f1017af9d..4f8b5c2684 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -6,25 +6,54 @@
 #include 
 
 #include "sssnic_log.h"
+#include "base/sssnic_hw.h"
+
+static int
+sssnic_ethdev_init(struct rte_eth_dev *ethdev)
+{
+   RTE_SET_USED(ethdev);
+   PMD_INIT_FUNC_TRACE();
+
+   return -EINVAL;
+}
+
+static int
+sssnic_ethdev_uninit(struct rte_eth_dev *ethdev)
+{
+   RTE_SET_USED(ethdev);
+   PMD_INIT_FUNC_TRACE();
+
+   if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+   return 0;
+
+   return -EINVAL;
+}
 
 static int
 sssnic_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device 
*pci_dev)
 {
RTE_SET_USED(pci_drv);
-   RTE_SET_USED(pci_dev);
PMD_INIT_FUNC_TRACE();
-   return -EINVAL;
+
+   return rte_eth_dev_pci_generic_probe(pci_dev, 0, sssnic_ethdev_init);
 }
 
 static int
 sssnic_pci_remove(struct rte_pci_device *pci_dev)
 {
-   RTE_SET_USED(pci_dev);
PMD_INIT_FUNC_TRACE();
-   return -EINVAL;
+
+   return rte_eth_dev_pci_generic_remove(pci_dev, sssnic_ethdev_uninit);
 }
 
+static const struct rte_pci_id sssnic_pci_id_map[] = {
+   { RTE_PCI_DEVICE(SSSNIC_PCI_VENDOR_ID, SSSNIC_DEVICE_ID_STD) },
+   { .vendor_id = 0 },
+};
+
 static struct rte_pci_driver sssnic_pmd = {
+   .id_table = sssnic_pci_id_map,
+   .drv_flags = RTE_PCI_DRV_NEED_MAPPING,
.probe = sssnic_pci_probe,
.remove = sssnic_pci_remove,
 };
-- 
2.27.0



[PATCH v5 04/32] net/sssnic: initialize hardware base

2023-09-03 Thread wanry
From: Renyong Wan 

Initializing hardware base make hardware ready to be access.

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/base/meson.build  |  13 ++
 drivers/net/sssnic/base/sssnic_hw.c  | 207 +++
 drivers/net/sssnic/base/sssnic_hw.h  |  49 +++
 drivers/net/sssnic/base/sssnic_reg.h | 169 ++
 drivers/net/sssnic/meson.build   |   3 +
 drivers/net/sssnic/sssnic_ethdev.c   |  46 +-
 drivers/net/sssnic/sssnic_ethdev.h   |  18 +++
 7 files changed, 501 insertions(+), 4 deletions(-)
 create mode 100644 drivers/net/sssnic/base/meson.build
 create mode 100644 drivers/net/sssnic/base/sssnic_hw.c
 create mode 100644 drivers/net/sssnic/base/sssnic_reg.h
 create mode 100644 drivers/net/sssnic/sssnic_ethdev.h

diff --git a/drivers/net/sssnic/base/meson.build 
b/drivers/net/sssnic/base/meson.build
new file mode 100644
index 00..3e64112c72
--- /dev/null
+++ b/drivers/net/sssnic/base/meson.build
@@ -0,0 +1,13 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+
+sources = [
+'sssnic_hw.c',
+]
+
+c_args = cflags
+base_lib = static_library('sssnic_base', sources,
+   dependencies: [static_rte_eal, static_rte_ethdev, static_rte_bus_pci, 
static_rte_net],
+   c_args: c_args)
+
+base_objs = base_lib.extract_all_objects()
diff --git a/drivers/net/sssnic/base/sssnic_hw.c 
b/drivers/net/sssnic/base/sssnic_hw.c
new file mode 100644
index 00..8b7bba7644
--- /dev/null
+++ b/drivers/net/sssnic/base/sssnic_hw.c
@@ -0,0 +1,207 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#include 
+#include 
+#include 
+
+#include "../sssnic_log.h"
+#include "sssnic_hw.h"
+#include "sssnic_reg.h"
+
+static int
+wait_for_sssnic_hw_ready(struct sssnic_hw *hw)
+{
+   struct sssnic_attr1_reg reg;
+   uint32_t timeout_ms = 10;
+
+   do {
+   reg.u32 = sssnic_cfg_reg_read(hw, SSSNIC_ATTR1_REG);
+   if (reg.u32 != 0x && reg.mgmt_init_status != 0)
+   return 0;
+   rte_delay_ms(1);
+   } while (--timeout_ms);
+
+   return -EBUSY;
+}
+
+static int
+wait_for_sssnic_db_enabled(struct sssnic_hw *hw)
+{
+   struct sssnic_attr4_reg r4;
+   struct sssnic_attr5_reg r5;
+   uint32_t timeout_ms = 6;
+
+   do {
+   r4.u32 = sssnic_cfg_reg_read(hw, SSSNIC_ATTR4_REG);
+   r5.u32 = sssnic_cfg_reg_read(hw, SSSNIC_ATTR5_REG);
+   if (r4.db_ctrl == SSSNIC_DB_CTRL_ENABLE &&
+   r5.outbound_ctrl == SSSNIC_DB_CTRL_ENABLE)
+   return 0;
+   rte_delay_ms(1);
+   } while (--timeout_ms);
+
+   return -EBUSY;
+}
+
+static void
+sssnic_attr_setup(struct sssnic_hw *hw)
+{
+   struct sssnic_attr0_reg attr0;
+   struct sssnic_attr1_reg attr1;
+   struct sssnic_attr2_reg attr2;
+   struct sssnic_attr3_reg attr3;
+   struct sssnic_hw_attr *attr = &hw->attr;
+
+   attr0.u32 = sssnic_cfg_reg_read(hw, SSSNIC_ATTR0_REG);
+   attr1.u32 = sssnic_cfg_reg_read(hw, SSSNIC_ATTR1_REG);
+   attr2.u32 = sssnic_cfg_reg_read(hw, SSSNIC_ATTR2_REG);
+   attr3.u32 = sssnic_cfg_reg_read(hw, SSSNIC_ATTR3_REG);
+
+   attr->func_idx = attr0.func_idx;
+   attr->pf_idx = attr0.pf_idx;
+   attr->pci_idx = attr0.pci_idx;
+   attr->vf_off = attr0.vf_off;
+   attr->func_type = attr0.func_type;
+   attr->af_idx = attr1.af_idx;
+   attr->num_aeq = RTE_BIT32(attr1.num_aeq);
+   attr->num_ceq = attr2.num_ceq;
+   attr->num_irq = attr2.num_irq;
+   attr->global_vf_off = attr3.global_vf_off;
+
+   PMD_DRV_LOG(DEBUG, "attr0=0x%x, attr1=0x%x, attr2=0x%x, attr3=0x%x",
+   attr0.u32, attr1.u32, attr2.u32, attr3.u32);
+}
+
+/* AF and MF election */
+static void
+sssnic_af_setup(struct sssnic_hw *hw)
+{
+   struct sssnic_af_election_reg reg0;
+   struct sssnic_mf_election_reg reg1;
+
+   /* AF election */
+   reg0.u32 = sssnic_mgmt_reg_read(hw, SSSNIC_AF_ELECTION_REG);
+   reg0.func_idx = hw->attr.func_idx;
+   sssnic_mgmt_reg_write(hw, SSSNIC_AF_ELECTION_REG, reg0.u32);
+   reg0.u32 = sssnic_mgmt_reg_read(hw, SSSNIC_AF_ELECTION_REG);
+   hw->attr.af_idx = reg0.func_idx;
+   if (hw->attr.af_idx == hw->attr.func_idx) {
+   hw->attr.func_type = SSSNIC_FUNC_TYPE_AF;
+   PMD_DRV_LOG(INFO, "Elected PF %d as AF", hw->attr.func_idx);
+
+   /* MF election */
+   reg1.u32 = sssnic_mgmt_reg_read(hw, SSSNIC_MF_ELECTION_REG);
+   reg1.func_idx = hw->attr.func_idx;
+   sssnic_mgmt_reg_write(hw, SSSNIC_MF_ELECTION_REG, reg1.u32);
+   reg1.u32 = sssnic_mgmt_reg_read(hw, SSSNIC_MF_ELECTION_REG);
+   hw->attr.mf_idx = reg1.func_idx;
+   if (hw->at

[PATCH v5 05/32] net/sssnic: add event queue

2023-09-03 Thread wanry
From: Renyong Wan 

Event queue is intended for receiving event from hardware as well
as mailbox response message.

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v4:
* Fixed dereferencing type-punned pointer.
* Fixed coding style issue of COMPLEX_MACRO.
---
 drivers/net/sssnic/base/meson.build |   1 +
 drivers/net/sssnic/base/sssnic_eventq.c | 432 
 drivers/net/sssnic/base/sssnic_eventq.h |  84 +
 drivers/net/sssnic/base/sssnic_hw.c |   9 +-
 drivers/net/sssnic/base/sssnic_hw.h |   5 +
 drivers/net/sssnic/base/sssnic_reg.h|  51 +++
 drivers/net/sssnic/sssnic_ethdev.c  |   1 +
 7 files changed, 582 insertions(+), 1 deletion(-)
 create mode 100644 drivers/net/sssnic/base/sssnic_eventq.c
 create mode 100644 drivers/net/sssnic/base/sssnic_eventq.h

diff --git a/drivers/net/sssnic/base/meson.build 
b/drivers/net/sssnic/base/meson.build
index 3e64112c72..7758faa482 100644
--- a/drivers/net/sssnic/base/meson.build
+++ b/drivers/net/sssnic/base/meson.build
@@ -3,6 +3,7 @@
 
 sources = [
 'sssnic_hw.c',
+'sssnic_eventq.c'
 ]
 
 c_args = cflags
diff --git a/drivers/net/sssnic/base/sssnic_eventq.c 
b/drivers/net/sssnic/base/sssnic_eventq.c
new file mode 100644
index 00..a74b74f756
--- /dev/null
+++ b/drivers/net/sssnic/base/sssnic_eventq.c
@@ -0,0 +1,432 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "../sssnic_log.h"
+#include "sssnic_hw.h"
+#include "sssnic_reg.h"
+#include "sssnic_eventq.h"
+
+#define SSSNIC_EVENTQ_DEF_DEPTH 64
+#define SSSNIC_EVENTQ_NUM_PAGES 4
+#define SSSNIC_EVENTQ_MAX_PAGE_SZ 0x40
+#define SSSNIC_EVENTQ_MIN_PAGE_SZ 0x1000
+
+#define SSSNIC_EVENT_ADDR(base_addr, event_sz, idx)
\
+   ((struct sssnic_event *)(((uint8_t *)(base_addr)) + ((idx) * 
(event_sz
+
+static inline struct sssnic_event *
+sssnic_eventq_peek(struct sssnic_eventq *eq)
+{
+   uint16_t page = eq->ci / eq->page_len;
+   uint16_t idx = eq->ci % eq->page_len;
+
+   return SSSNIC_EVENT_ADDR(eq->pages[page]->addr, eq->entry_size, idx);
+}
+
+static inline void
+sssnic_eventq_reg_write(struct sssnic_eventq *eq, uint32_t reg, uint32_t val)
+{
+   sssnic_cfg_reg_write(eq->hw, reg, val);
+}
+
+static inline uint32_t
+sssnic_eventq_reg_read(struct sssnic_eventq *eq, uint32_t reg)
+{
+   return sssnic_cfg_reg_read(eq->hw, reg);
+}
+
+static inline void
+sssnic_eventq_reg_write64(struct sssnic_eventq *eq, uint32_t reg, uint64_t val)
+{
+   sssnic_cfg_reg_write(eq->hw, reg, (uint32_t)((val >> 16) >> 16));
+   sssnic_cfg_reg_write(eq->hw, reg + sizeof(uint32_t), (uint32_t)val);
+}
+
+/* all eventq registers that to be access must be selected first */
+static inline void
+sssnic_eventq_reg_select(struct sssnic_eventq *eq)
+{
+   sssnic_eventq_reg_write(eq, SSSNIC_EVENTQ_IDX_SEL_REG, eq->qid);
+}
+
+static const struct rte_memzone *
+sssnic_eventq_page_alloc(struct sssnic_eventq *eq, int page_idx)
+{
+   const struct rte_memzone *mz = NULL;
+   char mz_name[RTE_MEMZONE_NAMESIZE];
+
+   snprintf(mz_name, sizeof(mz_name), "sssnic%u_eq%d_page%d",
+   SSSNIC_ETH_PORT_ID(eq->hw), eq->qid, page_idx);
+   mz = rte_memzone_reserve_aligned(mz_name, eq->page_size, SOCKET_ID_ANY,
+   RTE_MEMZONE_IOVA_CONTIG, eq->page_size);
+   return mz;
+}
+
+static uint32_t
+sssnic_eventq_page_size_calc(uint32_t depth, uint32_t entry_size)
+{
+   uint32_t pages = SSSNIC_EVENTQ_NUM_PAGES;
+   uint32_t size;
+
+   size = RTE_ALIGN(depth * entry_size, SSSNIC_EVENTQ_MIN_PAGE_SZ);
+   if (size <= pages * SSSNIC_EVENTQ_MIN_PAGE_SZ) {
+   /* use minimum page size */
+   return SSSNIC_EVENTQ_MIN_PAGE_SZ;
+   }
+
+   /* Calculate how many pages of minimum size page the big size page 
covers */
+   size = RTE_ALIGN(size / pages, SSSNIC_EVENTQ_MIN_PAGE_SZ);
+   pages = rte_fls_u32(size / SSSNIC_EVENTQ_MIN_PAGE_SZ);
+
+   return SSSNIC_EVENTQ_MIN_PAGE_SZ * pages;
+}
+
+static int
+sssnic_eventq_pages_setup(struct sssnic_eventq *eq)
+{
+   const struct rte_memzone *mz;
+   struct sssnic_event *ev;
+   int i, j;
+
+   eq->pages = rte_zmalloc(NULL,
+   eq->num_pages * sizeof(struct rte_memzone *), 1);
+   if (eq->pages == NULL) {
+   PMD_DRV_LOG(ERR, "Could not alloc memory for pages");
+   return -ENOMEM;
+   }
+
+   for (i = 0; i < eq->num_pages; i++) {
+   mz = sssnic_eventq_page_alloc(eq, i);
+   if (mz == NULL) {
+   PMD_DRV_LOG(ERR,
+   "Could not alloc DMA memory for eventq page %d",
+   i);
+   goto alloc_dma_fail;
+   }
+   /* init even

[PATCH v5 06/32] net/sssnic/base: add message definition and utility

2023-09-03 Thread wanry
From: Renyong Wan 

sssnic message is used to encapsulate sssnic command for transmission
between driver and firmware. sssnic message is sent by driver via mail
box and is received by driver via event queue.

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Removed error.h from including files.
---
 drivers/net/sssnic/base/meson.build |   3 +-
 drivers/net/sssnic/base/sssnic_eventq.c |  29 +++
 drivers/net/sssnic/base/sssnic_hw.c |  15 +-
 drivers/net/sssnic/base/sssnic_hw.h |   2 +
 drivers/net/sssnic/base/sssnic_msg.c| 254 
 drivers/net/sssnic/base/sssnic_msg.h| 166 
 6 files changed, 467 insertions(+), 2 deletions(-)
 create mode 100644 drivers/net/sssnic/base/sssnic_msg.c
 create mode 100644 drivers/net/sssnic/base/sssnic_msg.h

diff --git a/drivers/net/sssnic/base/meson.build 
b/drivers/net/sssnic/base/meson.build
index 7758faa482..dd4dd08fc1 100644
--- a/drivers/net/sssnic/base/meson.build
+++ b/drivers/net/sssnic/base/meson.build
@@ -3,7 +3,8 @@
 
 sources = [
 'sssnic_hw.c',
-'sssnic_eventq.c'
+'sssnic_eventq.c',
+'sssnic_msg.c',
 ]
 
 c_args = cflags
diff --git a/drivers/net/sssnic/base/sssnic_eventq.c 
b/drivers/net/sssnic/base/sssnic_eventq.c
index a74b74f756..e90d24bb6b 100644
--- a/drivers/net/sssnic/base/sssnic_eventq.c
+++ b/drivers/net/sssnic/base/sssnic_eventq.c
@@ -14,6 +14,7 @@
 #include "../sssnic_log.h"
 #include "sssnic_hw.h"
 #include "sssnic_reg.h"
+#include "sssnic_msg.h"
 #include "sssnic_eventq.h"
 
 #define SSSNIC_EVENTQ_DEF_DEPTH 64
@@ -184,6 +185,32 @@ sssnic_eventq_ci_update(struct sssnic_eventq *eq, int 
informed)
sssnic_eventq_reg_write(eq, SSSNIC_EVENTQ_CI_CTRL_REG, reg.u32);
 }
 
+static int
+sssnic_event_default_handler_func(struct sssnic_eventq *eq,
+   struct sssnic_event *ev, __rte_unused void *data)
+{
+   struct sssnic_hw *hw;
+   int ret;
+
+   hw = eq->hw;
+   ret = sssnic_msg_rx_handle(hw, (struct sssnic_msg_hdr *)(ev->data));
+   if (ret != SSSNIC_MSG_DONE)
+   return -1;
+
+   return SSSNIC_EVENT_DONE;
+}
+
+static void
+sssnic_eventq_handlers_init(struct sssnic_eventq *eq)
+{
+   int i;
+
+   for (i = SSSNIC_EVENT_CODE_MIN; i <= SSSNIC_EVENT_CODE_MAX; i++) {
+   eq->handlers[i].func = sssnic_event_default_handler_func;
+   eq->handlers[i].data = NULL;
+   }
+}
+
 static int
 sssnic_eventq_init(struct sssnic_hw *hw, struct sssnic_eventq *eq, uint16_t 
qid)
 {
@@ -230,6 +257,8 @@ sssnic_eventq_init(struct sssnic_hw *hw, struct 
sssnic_eventq *eq, uint16_t qid)
PMD_DRV_LOG(ERR, "Failed to setup eventq pages!");
return ret;
}
+
+   sssnic_eventq_handlers_init(eq);
sssnic_eventq_ctrl_setup(eq);
sssnic_eventq_ci_update(eq, 1);
if (qid == 0)
diff --git a/drivers/net/sssnic/base/sssnic_hw.c 
b/drivers/net/sssnic/base/sssnic_hw.c
index 44e04486a5..387c823c7e 100644
--- a/drivers/net/sssnic/base/sssnic_hw.c
+++ b/drivers/net/sssnic/base/sssnic_hw.c
@@ -10,6 +10,7 @@
 #include "sssnic_hw.h"
 #include "sssnic_reg.h"
 #include "sssnic_eventq.h"
+#include "sssnic_msg.h"
 
 static int
 wait_for_sssnic_hw_ready(struct sssnic_hw *hw)
@@ -197,18 +198,30 @@ sssnic_hw_init(struct sssnic_hw *hw)
return ret;
}
 
+   ret = sssnic_msg_inbox_init(hw);
+   if (ret) {
+   PMD_DRV_LOG(ERR, "Failed to initialize message inbox.");
+   return ret;
+   }
+
ret = sssnic_eventq_all_init(hw);
if (ret != 0) {
PMD_DRV_LOG(ERR, "Failed to initialize event queues");
-   return ret;
+   goto eventq_init_fail;
}
 
return -EINVAL;
+
+eventq_init_fail:
+   sssnic_msg_inbox_shutdown(hw);
+   return ret;
 }
 
 void
 sssnic_hw_shutdown(struct sssnic_hw *hw)
 {
PMD_INIT_FUNC_TRACE();
+
sssnic_eventq_all_shutdown(hw);
+   sssnic_msg_inbox_shutdown(hw);
 }
diff --git a/drivers/net/sssnic/base/sssnic_hw.h 
b/drivers/net/sssnic/base/sssnic_hw.h
index 6caf3a6d66..38fb9ac1ac 100644
--- a/drivers/net/sssnic/base/sssnic_hw.h
+++ b/drivers/net/sssnic/base/sssnic_hw.h
@@ -52,11 +52,13 @@ struct sssnic_hw {
uint8_t *db_mem_len;
struct sssnic_hw_attr attr;
struct sssnic_eventq *eventqs;
+   struct sssnic_msg_inbox *msg_inbox;
uint8_t num_eventqs;
uint16_t eth_port_id;
 };
 
 #define SSSNIC_ETH_PORT_ID(hw) ((hw)->eth_port_id)
+#define SSSNIC_MPU_FUNC_IDX 0x1fff
 
 int sssnic_hw_init(struct sssnic_hw *hw);
 void sssnic_hw_shutdown(struct sssnic_hw *hw);
diff --git a/drivers/net/sssnic/base/sssnic_msg.c 
b/drivers/net/sssnic/base/sssnic_msg.c
new file mode 100644
index 00..4b98fee75b
--- /dev/null
+++ b/drivers/net/sssnic/base/sssnic_msg.c
@@ -0,0 +1,254 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Techn

[PATCH v5 08/32] net/sssnic/base: add work queue

2023-09-03 Thread wanry
From: Renyong Wan 

Work queue is used to maintain hardware queue information by
driver, it is usually used in control queue, rx queue
and tx queue.

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Removed error.h from including files.
---
 drivers/net/sssnic/base/meson.build|   1 +
 drivers/net/sssnic/base/sssnic_workq.c | 141 +
 drivers/net/sssnic/base/sssnic_workq.h | 108 +++
 3 files changed, 250 insertions(+)
 create mode 100644 drivers/net/sssnic/base/sssnic_workq.c
 create mode 100644 drivers/net/sssnic/base/sssnic_workq.h

diff --git a/drivers/net/sssnic/base/meson.build 
b/drivers/net/sssnic/base/meson.build
index 4abd1a0daf..7c23a82ff3 100644
--- a/drivers/net/sssnic/base/meson.build
+++ b/drivers/net/sssnic/base/meson.build
@@ -6,6 +6,7 @@ sources = [
 'sssnic_eventq.c',
 'sssnic_msg.c',
 'sssnic_mbox.c',
+'sssnic_workq.c',
 ]
 
 c_args = cflags
diff --git a/drivers/net/sssnic/base/sssnic_workq.c 
b/drivers/net/sssnic/base/sssnic_workq.c
new file mode 100644
index 00..25b7585246
--- /dev/null
+++ b/drivers/net/sssnic/base/sssnic_workq.c
@@ -0,0 +1,141 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include "../sssnic_log.h"
+#include "sssnic_workq.h"
+
+/* Consume num_entries and increase CI
+ * Return the first entry address of previous CI position
+ */
+void *
+sssnic_workq_consume(struct sssnic_workq *workq, uint16_t num_entries,
+   uint16_t *ci)
+{
+   void *e;
+   uint16_t current_ci;
+
+   if (workq->idle_entries + num_entries > workq->num_entries)
+   return NULL;
+
+   current_ci = sssnic_workq_ci_get(workq);
+   e = (void *)sssnic_workq_entry_get(workq, current_ci);
+   workq->idle_entries += num_entries;
+   workq->ci += num_entries;
+   if (ci != NULL)
+   *ci = current_ci;
+
+   return e;
+}
+
+/* Produce num_entries and increase pi.
+ * Return the first entry address of previous PI position
+ */
+void *
+sssnic_workq_produce(struct sssnic_workq *workq, uint16_t num_entries,
+   uint16_t *pi)
+{
+   void *e;
+   uint16_t current_pi;
+
+   if (workq->idle_entries < num_entries)
+   return NULL;
+
+   current_pi = sssnic_workq_pi_get(workq);
+   e = (void *)sssnic_workq_entry_get(workq, current_pi);
+   workq->idle_entries -= num_entries;
+   workq->pi += num_entries;
+   if (pi != NULL)
+   *pi = current_pi;
+
+   return e;
+}
+
+static int
+sssnic_workq_init(struct sssnic_workq *workq, const char *name, int socket_id,
+   uint32_t entry_size, uint32_t depth)
+{
+   char zname[RTE_MEMZONE_NAMESIZE];
+
+   if (!rte_is_power_of_2(entry_size)) {
+   PMD_DRV_LOG(ERR,
+   "The entry size(%u) of workq(%s) is not power of 2",
+   entry_size, name);
+   return -EINVAL;
+   }
+
+   if (!rte_is_power_of_2(depth)) {
+   PMD_DRV_LOG(ERR, "The depth(%u) of workq(%s) is not power of 2",
+   depth, name);
+   return -EINVAL;
+   }
+
+   workq->buf_size = entry_size * depth;
+   workq->entry_size = entry_size;
+   workq->entry_shift = rte_log2_u32(entry_size);
+   workq->num_entries = depth;
+   workq->idle_entries = depth;
+   workq->index_mask = depth - 1;
+
+   snprintf(zname, sizeof(zname), "%s_mz", name);
+   workq->buf_mz = rte_memzone_reserve_aligned(zname, workq->buf_size,
+   socket_id, RTE_MEMZONE_IOVA_CONTIG, RTE_PGSIZE_256K);
+   if (workq->buf_mz == NULL) {
+   PMD_DRV_LOG(ERR, "Failed to alloc DMA memory for %s", name);
+   return -ENOMEM;
+   }
+   workq->buf_addr = workq->buf_mz->addr;
+   workq->buf_phyaddr = workq->buf_mz->iova;
+
+   return 0;
+}
+
+static void
+sssnic_workq_cleanup(struct sssnic_workq *workq)
+{
+   if (workq != NULL && workq->buf_mz != NULL)
+   rte_memzone_free(workq->buf_mz);
+}
+
+/* Cleanup a work queue and free it*/
+void
+sssnic_workq_destroy(struct sssnic_workq *workq)
+{
+   if (workq != NULL) {
+   sssnic_workq_cleanup(workq);
+   rte_free(workq);
+   }
+}
+
+/*Create a work queue and initialize*/
+struct sssnic_workq *
+sssnic_workq_new(const char *name, int socket_id, uint32_t entry_size,
+   uint32_t depth)
+{
+   int ret;
+   struct sssnic_workq *workq;
+
+   if (name == NULL) {
+   PMD_DRV_LOG(ERR, "Bad parameter, workq name is NULL");
+   return NULL;
+   }
+
+   workq = rte_zmalloc(name, sizeof(struct sssnic_workq), 0);
+   if (workq == NULL) {
+   PMD_DRV_LOG(ERR, "Could not alloc memory for  %s", name);
+   return NULL;
+   }
+   ret = sssnic_workq_

[PATCH v5 07/32] net/sssnic/base: add mailbox support

2023-09-03 Thread wanry
From: Renyong Wan 

Mailbox is a message channel used to communicate between PF and
VF as well as driver and hardware functions.
Mailbox messages are received by driver through event queue, and
sent by driver through registers of mailbox.
There are two transfer modes for sending mailbox message, one is
DMA mode used to send message to PF, another is inline mode used
to send message to VF.

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v3:
* Fixed dereferencing type-punned pointer.
---
 drivers/net/sssnic/base/meson.build   |   1 +
 drivers/net/sssnic/base/sssnic_hw.c   |  10 +
 drivers/net/sssnic/base/sssnic_hw.h   |   4 +
 drivers/net/sssnic/base/sssnic_mbox.c | 615 ++
 drivers/net/sssnic/base/sssnic_mbox.h |  45 ++
 drivers/net/sssnic/base/sssnic_misc.h |  11 +
 drivers/net/sssnic/base/sssnic_reg.h  |  47 ++
 7 files changed, 733 insertions(+)
 create mode 100644 drivers/net/sssnic/base/sssnic_mbox.c
 create mode 100644 drivers/net/sssnic/base/sssnic_mbox.h
 create mode 100644 drivers/net/sssnic/base/sssnic_misc.h

diff --git a/drivers/net/sssnic/base/meson.build 
b/drivers/net/sssnic/base/meson.build
index dd4dd08fc1..4abd1a0daf 100644
--- a/drivers/net/sssnic/base/meson.build
+++ b/drivers/net/sssnic/base/meson.build
@@ -5,6 +5,7 @@ sources = [
 'sssnic_hw.c',
 'sssnic_eventq.c',
 'sssnic_msg.c',
+'sssnic_mbox.c',
 ]
 
 c_args = cflags
diff --git a/drivers/net/sssnic/base/sssnic_hw.c 
b/drivers/net/sssnic/base/sssnic_hw.c
index 387c823c7e..ff527b2c7f 100644
--- a/drivers/net/sssnic/base/sssnic_hw.c
+++ b/drivers/net/sssnic/base/sssnic_hw.c
@@ -11,6 +11,7 @@
 #include "sssnic_reg.h"
 #include "sssnic_eventq.h"
 #include "sssnic_msg.h"
+#include "sssnic_mbox.h"
 
 static int
 wait_for_sssnic_hw_ready(struct sssnic_hw *hw)
@@ -210,8 +211,16 @@ sssnic_hw_init(struct sssnic_hw *hw)
goto eventq_init_fail;
}
 
+   ret = sssnic_mbox_init(hw);
+   if (ret) {
+   PMD_DRV_LOG(ERR, "Failed to initialize mailbox");
+   goto mbox_init_fail;
+   }
+
return -EINVAL;
 
+mbox_init_fail:
+   sssnic_eventq_all_shutdown(hw);
 eventq_init_fail:
sssnic_msg_inbox_shutdown(hw);
return ret;
@@ -222,6 +231,7 @@ sssnic_hw_shutdown(struct sssnic_hw *hw)
 {
PMD_INIT_FUNC_TRACE();
 
+   sssnic_mbox_shutdown(hw);
sssnic_eventq_all_shutdown(hw);
sssnic_msg_inbox_shutdown(hw);
 }
diff --git a/drivers/net/sssnic/base/sssnic_hw.h 
b/drivers/net/sssnic/base/sssnic_hw.h
index 38fb9ac1ac..41e65f5880 100644
--- a/drivers/net/sssnic/base/sssnic_hw.h
+++ b/drivers/net/sssnic/base/sssnic_hw.h
@@ -53,12 +53,16 @@ struct sssnic_hw {
struct sssnic_hw_attr attr;
struct sssnic_eventq *eventqs;
struct sssnic_msg_inbox *msg_inbox;
+   struct sssnic_mbox *mbox;
uint8_t num_eventqs;
uint16_t eth_port_id;
 };
 
+#define SSSNIC_FUNC_IDX(hw) ((hw)->attr.func_idx)
 #define SSSNIC_ETH_PORT_ID(hw) ((hw)->eth_port_id)
 #define SSSNIC_MPU_FUNC_IDX 0x1fff
+#define SSSNIC_FUNC_TYPE(hw) ((hw)->attr.func_type)
+#define SSSNIC_AF_FUNC_IDX(hw) ((hw)->attr.af_idx)
 
 int sssnic_hw_init(struct sssnic_hw *hw);
 void sssnic_hw_shutdown(struct sssnic_hw *hw);
diff --git a/drivers/net/sssnic/base/sssnic_mbox.c 
b/drivers/net/sssnic/base/sssnic_mbox.c
new file mode 100644
index 00..02957137ea
--- /dev/null
+++ b/drivers/net/sssnic/base/sssnic_mbox.c
@@ -0,0 +1,615 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "../sssnic_log.h"
+#include "sssnic_hw.h"
+#include "sssnic_reg.h"
+#include "sssnic_misc.h"
+#include "sssnic_eventq.h"
+#include "sssnic_mbox.h"
+
+#define SSSNIC_MBOX_SEND_RESULT_SIZE 16
+#define SSSNIC_MBOX_SEND_BUF_SIZE 2048UL
+#define SSSNIC_MBOX_RESP_MSG_EVENTQ 1
+#define SSSNIC_MBOX_SEND_DONE_TIMEOUT 50 /* uint is 10us */
+#define SSSNIC_MBOX_DEF_REQ_TIMEOUT 4000 /* millisecond */
+#define SSSNIC_MBOX_REQ_ID_MASK 0xf /* request id only 4 bits*/
+
+struct sssnic_sendbox {
+   struct sssnic_mbox *mbox;
+   /* Send data memory */
+   uint8_t *data;
+   /* Send result DMA memory zone */
+   const struct rte_memzone *result_mz;
+   /* Send result DMA virtual address */
+   volatile uint64_t *result_addr;
+   /* DMA buffer mz */
+   const struct rte_memzone *buf_mz;
+   /* DMA buffer virtual address */
+   uint8_t *buf_addr;
+   pthread_mutex_t lock;
+};
+
+struct sssnic_mbox_msg_dma_desc {
+   /* 32bit xor checksum for DMA data */
+   uint32_t checksum;
+   /* dword of high DMA address */
+   uint32_t dma_addr_hi;
+   /* dword of low DMA address */
+   uint32_t dma_addr_lo;
+   /* DMA data length */
+   uint32_t len;
+   uint32_t resvd[2];
+};
+#define SSSNIC_MBOX_MSG_

[PATCH v5 09/32] net/sssnic/base: add control queue

2023-09-03 Thread wanry
From: Renyong Wan 

Control queue is used for communication between driver and datapath code
of firmware.

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Fixed variable 'cmd_len' is uninitialized when used.
---
 drivers/net/sssnic/base/meson.build|   2 +
 drivers/net/sssnic/base/sssnic_api.c   | 102 +
 drivers/net/sssnic/base/sssnic_api.h   |  23 ++
 drivers/net/sssnic/base/sssnic_cmd.h   | 114 ++
 drivers/net/sssnic/base/sssnic_ctrlq.c | 521 +
 drivers/net/sssnic/base/sssnic_ctrlq.h |  58 +++
 drivers/net/sssnic/base/sssnic_hw.c| 149 +++
 drivers/net/sssnic/base/sssnic_hw.h|   8 +
 8 files changed, 977 insertions(+)
 create mode 100644 drivers/net/sssnic/base/sssnic_api.c
 create mode 100644 drivers/net/sssnic/base/sssnic_api.h
 create mode 100644 drivers/net/sssnic/base/sssnic_cmd.h
 create mode 100644 drivers/net/sssnic/base/sssnic_ctrlq.c
 create mode 100644 drivers/net/sssnic/base/sssnic_ctrlq.h

diff --git a/drivers/net/sssnic/base/meson.build 
b/drivers/net/sssnic/base/meson.build
index 7c23a82ff3..e93ca7b24b 100644
--- a/drivers/net/sssnic/base/meson.build
+++ b/drivers/net/sssnic/base/meson.build
@@ -7,6 +7,8 @@ sources = [
 'sssnic_msg.c',
 'sssnic_mbox.c',
 'sssnic_workq.c',
+'sssnic_ctrlq.c',
+'sssnic_api.c',
 ]
 
 c_args = cflags
diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
new file mode 100644
index 00..51a59f0f25
--- /dev/null
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -0,0 +1,102 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include "../sssnic_log.h"
+#include "sssnic_hw.h"
+#include "sssnic_cmd.h"
+#include "sssnic_mbox.h"
+#include "sssnic_api.h"
+
+int
+sssnic_msix_attr_get(struct sssnic_hw *hw, uint16_t msix_idx,
+   struct sssnic_msix_attr *attr)
+{
+   int ret;
+   struct sssnic_msg msg;
+   struct sssnic_msix_ctrl_cmd cmd;
+   uint32_t cmd_len;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.func_id = SSSNIC_FUNC_IDX(hw);
+   cmd.opcode = SSSNIC_CMD_OPCODE_GET;
+   cmd.idx = msix_idx;
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len, SSSNIC_MSIX_CTRL_CMD,
+   SSSNIC_MPU_FUNC_IDX, SSSNIC_COMM_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to MSIX_CTRL_CMD, len=%u, status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+   attr->lli_credit = cmd.lli_credit;
+   attr->lli_timer = cmd.lli_timer;
+   attr->pending_limit = cmd.pending_count;
+   attr->coalescing_timer = cmd.coalescing_timer;
+   attr->resend_timer = cmd.resend_timer;
+
+   return 0;
+}
+
+int
+sssnic_msix_attr_set(struct sssnic_hw *hw, uint16_t msix_idx,
+   struct sssnic_msix_attr *attr)
+{
+   int ret;
+   struct sssnic_msg msg;
+   struct sssnic_msix_ctrl_cmd cmd;
+   struct sssnic_msix_attr tmp;
+   uint32_t cmd_len;
+
+   ret = sssnic_msix_attr_get(hw, msix_idx, &tmp);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to get interrupt configuration");
+   return ret;
+   }
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.func_id = SSSNIC_FUNC_IDX(hw);
+   cmd.opcode = SSSNIC_CMD_OPCODE_SET;
+   cmd.idx = msix_idx;
+   cmd.lli_credit = tmp.lli_credit;
+   cmd.lli_timer = tmp.lli_timer;
+   cmd.pending_count = tmp.pending_limit;
+   cmd.coalescing_timer = tmp.coalescing_timer;
+   cmd.resend_timer = tmp.resend_timer;
+   if (attr->lli_set != 0) {
+   cmd.lli_credit = attr->lli_credit;
+   cmd.lli_timer = attr->lli_timer;
+   }
+   if (attr->coalescing_set != 0) {
+   cmd.pending_count = attr->pending_limit;
+   cmd.coalescing_timer = attr->coalescing_timer;
+   cmd.resend_timer = attr->resend_timer;
+   }
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len, SSSNIC_MSIX_CTRL_CMD,
+   SSSNIC_MPU_FUNC_IDX, SSSNIC_COMM_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to MSIX_CTRL_CMD, len=%u, status=%u",
+   cmd_len, cmd.common.statu

[PATCH v5 11/32] net/sssnic: add dev MAC ops

2023-09-03 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 doc/guides/nics/features/sssnic.ini  |   2 +
 drivers/net/sssnic/base/sssnic_api.c | 174 +
 drivers/net/sssnic/base/sssnic_api.h |   4 +
 drivers/net/sssnic/base/sssnic_cmd.h |  25 +++
 drivers/net/sssnic/base/sssnic_hw.h  |   1 +
 drivers/net/sssnic/sssnic_ethdev.c   | 270 ++-
 drivers/net/sssnic/sssnic_ethdev.h   |   2 +
 7 files changed, 477 insertions(+), 1 deletion(-)

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index 6d9786db7e..602839d301 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -4,6 +4,8 @@
 ; Refer to default.ini for the full list of available PMD features.
 ;
 [Features]
+Unicast MAC filter   = Y
+Multicast MAC filter = Y
 Linux= Y
 ARMv8= Y
 x86-64   = Y
diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index bf0859cd63..76266dfbae 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -133,3 +133,177 @@ sssnic_capability_get(struct sssnic_hw *hw, struct 
sssnic_capability *capa)
 
return 0;
 }
+
+int
+sssnic_mac_addr_get(struct sssnic_hw *hw, uint8_t *addr)
+{
+   int ret;
+   struct sssnic_mac_addr_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+   uint16_t func;
+
+   if (hw == NULL || addr == NULL)
+   return -EINVAL;
+
+   if (SSSNIC_FUNC_TYPE(hw) == SSSNIC_FUNC_TYPE_VF)
+   func = SSSNIC_PF_FUNC_IDX(hw);
+   else
+   func = SSSNIC_MPU_FUNC_IDX;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd_len = sizeof(cmd);
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len, SSSNIC_GET_MAC_ADDR_CMD,
+   func, SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_GET_DEF_MAC_ADDR_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   rte_memcpy(addr, cmd.addr, 6);
+
+   return 0;
+}
+
+int
+sssnic_mac_addr_update(struct sssnic_hw *hw, uint8_t *new, uint8_t *old)
+{
+   int ret;
+   struct sssnic_mac_addr_update_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+   uint16_t func;
+
+   if (hw == NULL || new == NULL || old == NULL)
+   return -EINVAL;
+
+   if (SSSNIC_FUNC_TYPE(hw) == SSSNIC_FUNC_TYPE_VF)
+   func = SSSNIC_PF_FUNC_IDX(hw);
+   else
+   func = SSSNIC_MPU_FUNC_IDX;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd_len = sizeof(cmd);
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   rte_memcpy(cmd.new_addr, new, 6);
+   rte_memcpy(cmd.old_addr, old, 6);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_UPDATE_MAC_ADDR_CMD, func, SSSNIC_LAN_MODULE,
+   SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   if (cmd.common.status == SSSNIC_MAC_ADDR_CMD_STATUS_IGNORED) {
+   PMD_DRV_LOG(WARNING,
+   "MAC address operation is ignored");
+   return 0;
+   }
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_UPDATE_MAC_ADDR_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
+
+int
+sssnic_mac_addr_add(struct sssnic_hw *hw, uint8_t *addr)
+{
+   int ret;
+   struct sssnic_mac_addr_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+   uint16_t func;
+
+   if (hw == NULL || addr == NULL)
+   return -EINVAL;
+
+   if (SSSNIC_FUNC_TYPE(hw) == SSSNIC_FUNC_TYPE_VF)
+   func = SSSNIC_PF_FUNC_IDX(hw);
+   else
+   func = SSSNIC_MPU_FUNC_IDX;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd_len = sizeof(cmd);
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   rte_memcpy(cmd.addr, addr, 6);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len, SSSNIC_ADD_MAC_ADDR_CMD,
+   func, SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbo

[PATCH v5 14/32] net/sssnic: support Rx queue setup and release

2023-09-03 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Removed error.h from including files.
---
 drivers/net/sssnic/meson.build|   1 +
 drivers/net/sssnic/sssnic_ethdev.c|   4 +
 drivers/net/sssnic/sssnic_ethdev.h|   2 +
 drivers/net/sssnic/sssnic_ethdev_rx.c | 420 ++
 drivers/net/sssnic/sssnic_ethdev_rx.h |  24 ++
 5 files changed, 451 insertions(+)
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_rx.c
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_rx.h

diff --git a/drivers/net/sssnic/meson.build b/drivers/net/sssnic/meson.build
index 12e967722a..7c3516a279 100644
--- a/drivers/net/sssnic/meson.build
+++ b/drivers/net/sssnic/meson.build
@@ -19,4 +19,5 @@ objs = [base_objs]
 sources = files(
 'sssnic_ethdev.c',
 'sssnic_ethdev_link.c',
+'sssnic_ethdev_rx.c',
 )
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index 1e2b5c0450..f98510a55d 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -10,6 +10,7 @@
 #include "base/sssnic_api.h"
 #include "sssnic_ethdev.h"
 #include "sssnic_ethdev_link.h"
+#include "sssnic_ethdev_rx.h"
 
 static int
 sssnic_ethdev_infos_get(struct rte_eth_dev *ethdev,
@@ -335,6 +336,7 @@ sssnic_ethdev_release(struct rte_eth_dev *ethdev)
struct sssnic_hw *hw = SSSNIC_ETHDEV_TO_HW(ethdev);
 
sssnic_ethdev_link_intr_disable(ethdev);
+   sssnic_ethdev_rx_queue_all_release(ethdev);
sssnic_ethdev_mac_addrs_clean(ethdev);
sssnic_hw_shutdown(hw);
rte_free(hw);
@@ -350,6 +352,8 @@ static const struct eth_dev_ops sssnic_ethdev_ops = {
.mac_addr_remove = sssnic_ethdev_mac_addr_remove,
.mac_addr_add = sssnic_ethdev_mac_addr_add,
.set_mc_addr_list = sssnic_ethdev_set_mc_addr_list,
+   .rx_queue_setup = sssnic_ethdev_rx_queue_setup,
+   .rx_queue_release = sssnic_ethdev_rx_queue_release,
 };
 
 static int
diff --git a/drivers/net/sssnic/sssnic_ethdev.h 
b/drivers/net/sssnic/sssnic_ethdev.h
index 636b3fd04c..51740413c6 100644
--- a/drivers/net/sssnic/sssnic_ethdev.h
+++ b/drivers/net/sssnic/sssnic_ethdev.h
@@ -56,6 +56,8 @@
 #define SSSNIC_ETHDEV_MAX_NUM_UC_MAC 128
 #define SSSNIC_ETHDEV_MAX_NUM_MC_MAC 2048
 
+#define SSSNIC_ETHDEV_DEF_RX_FREE_THRESH 32
+
 struct sssnic_netdev {
void *hw;
struct rte_ether_addr *mcast_addrs;
diff --git a/drivers/net/sssnic/sssnic_ethdev_rx.c 
b/drivers/net/sssnic/sssnic_ethdev_rx.c
new file mode 100644
index 00..0f489cf82f
--- /dev/null
+++ b/drivers/net/sssnic/sssnic_ethdev_rx.c
@@ -0,0 +1,420 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include "sssnic_log.h"
+#include "sssnic_ethdev.h"
+#include "sssnic_ethdev_rx.h"
+#include "base/sssnic_hw.h"
+#include "base/sssnic_workq.h"
+#include "base/sssnic_api.h"
+#include "base/sssnic_misc.h"
+
+/* hardware format of rx descriptor*/
+struct sssnic_ethdev_rx_desc {
+   /* status field */
+   union {
+   uint32_t dword0;
+   struct {
+   uint32_t ip_csum_err : 1;
+   uint32_t tcp_csum_err : 1;
+   uint32_t udp_csum_err : 1;
+   uint32_t igmp_csum_err : 1;
+   uint32_t icmpv4_csum_err : 1;
+   uint32_t icmpv6_csum_err : 1;
+   uint32_t sctp_crc_err : 1;
+   uint32_t hw_crc_err : 1;
+   uint32_t other_err : 1;
+   uint32_t err_resvd0 : 7;
+   uint32_t lro_num : 8;
+   uint32_t resvd1 : 1;
+   uint32_t lro_push : 1;
+   uint32_t lro_enter : 1;
+   uint32_t lro_intr : 1;
+   uint32_t flush : 1;
+   uint32_t decry : 1;
+   uint32_t bp_en : 1;
+   uint32_t done : 1;
+   };
+   struct {
+   uint32_t status_err : 16;
+   uint32_t status_rest : 16;
+   };
+   };
+
+   /* VLAN and length field */
+   union {
+   uint32_t dword1;
+   struct {
+   uint32_t vlan : 16;
+   uint32_t len : 16;
+   };
+   };
+
+   /* offload field */
+   union {
+   uint32_t dword2;
+   struct {
+   uint32_t pkt_type : 12;
+   uint32_t dword2_resvd0 : 9;
+   uint32_t vlan_en : 1;
+   uint32_t dword2_resvd1 : 2;
+   uint32_t rss_type : 8;
+   };
+   };
+
+   /* rss hash field */
+   union {
+   uint32_t dword3;
+  

[PATCH v5 13/32] net/sssnic: support link status event

2023-09-03 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Fixed 'EINVAL' undeclared.
---
 doc/guides/nics/features/sssnic.ini|   1 +
 drivers/net/sssnic/base/meson.build|   1 +
 drivers/net/sssnic/base/sssnic_exception.c | 116 +
 drivers/net/sssnic/base/sssnic_exception.h |  10 ++
 drivers/net/sssnic/base/sssnic_hw.c|  46 
 drivers/net/sssnic/base/sssnic_hw.h|  22 
 drivers/net/sssnic/sssnic_ethdev.c |   6 +-
 drivers/net/sssnic/sssnic_ethdev_link.c|  98 +
 drivers/net/sssnic/sssnic_ethdev_link.h|   2 +
 9 files changed, 301 insertions(+), 1 deletion(-)
 create mode 100644 drivers/net/sssnic/base/sssnic_exception.c
 create mode 100644 drivers/net/sssnic/base/sssnic_exception.h

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index a0688e70ef..82b527ba26 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -5,6 +5,7 @@
 ;
 [Features]
 Link status  = Y
+Link status event= Y
 Unicast MAC filter   = Y
 Multicast MAC filter = Y
 Linux= Y
diff --git a/drivers/net/sssnic/base/meson.build 
b/drivers/net/sssnic/base/meson.build
index e93ca7b24b..cf0c177cab 100644
--- a/drivers/net/sssnic/base/meson.build
+++ b/drivers/net/sssnic/base/meson.build
@@ -9,6 +9,7 @@ sources = [
 'sssnic_workq.c',
 'sssnic_ctrlq.c',
 'sssnic_api.c',
+   'sssnic_exception.c',
 ]
 
 c_args = cflags
diff --git a/drivers/net/sssnic/base/sssnic_exception.c 
b/drivers/net/sssnic/base/sssnic_exception.c
new file mode 100644
index 00..738ca9c6cd
--- /dev/null
+++ b/drivers/net/sssnic/base/sssnic_exception.c
@@ -0,0 +1,116 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#include 
+#include 
+#include 
+
+#include "../sssnic_log.h"
+#include "sssnic_hw.h"
+#include "sssnic_reg.h"
+#include "sssnic_cmd.h"
+#include "sssnic_msg.h"
+#include "sssnic_eventq.h"
+#include "sssnic_mbox.h"
+#include "sssnic_exception.h"
+
+static void
+sssnic_link_event_msg_handle(struct sssnic_hw *hw, struct sssnic_msg *msg,
+   __rte_unused enum sssnic_msg_chann_id chan_id)
+{
+   struct sssnic_netif_link_status_get_cmd *cmd;
+   sssnic_link_event_cb_t *cb;
+   enum sssnic_link_status status;
+   void *priv;
+
+   cb = hw->link_event_handler.cb;
+   priv = hw->link_event_handler.priv;
+
+   cmd = (struct sssnic_netif_link_status_get_cmd *)msg->data_buf;
+   if (cb != NULL) {
+   if (cmd->status)
+   status = SSSNIC_LINK_STATUS_UP;
+   else
+   status = SSSNIC_LINK_STATUS_DOWN;
+
+   PMD_DRV_LOG(DEBUG, "Received sssnic%u link %s event",
+   SSSNIC_ETH_PORT_ID(hw), status ? "up" : "down");
+
+   return cb(cmd->port, status, priv);
+   }
+
+   PMD_DRV_LOG(WARNING, "Link event was not processed, port=%u, status=%u",
+   cmd->port, cmd->status);
+}
+
+static void
+sssnic_netif_vf_link_status_msg_handle(struct sssnic_hw *hw,
+   struct sssnic_msg *msg)
+{
+   int ret;
+
+   if (msg->ack != 0) {
+   msg->ack = 0;
+   msg->type = SSSNIC_MSG_TYPE_RESP;
+   msg->data_len = 1; /* indicate no data */
+   ret = sssnic_mbox_send(hw, msg, NULL, 0, 0);
+   if (ret != 0)
+   PMD_DRV_LOG(ERR,
+   "Failed to send VF link status response, 
ret=%d",
+   ret);
+   }
+}
+
+static void
+sssnic_netif_exception_msg_handle(struct sssnic_hw *hw, struct sssnic_msg *msg,
+   enum sssnic_msg_chann_id chan_id)
+{
+   if (msg->command == SSSNIC_GET_NETIF_LINK_STATUS_CMD) {
+   if (SSSNIC_FUNC_TYPE(hw) == SSSNIC_FUNC_TYPE_VF)
+   sssnic_netif_vf_link_status_msg_handle(hw, msg);
+
+   sssnic_link_event_msg_handle(hw, msg, chan_id);
+   return;
+   }
+
+   PMD_DRV_LOG(WARNING,
+   "Netif exception message was not processed, cmd=%u",
+   msg->command);
+}
+
+static int
+sssnic_exception_msg_process(struct sssnic_msg *msg,
+   enum sssnic_msg_chann_id chan_id, void *priv)
+{
+   struct sssnic_hw *hw = (struct sssnic_hw *)priv;
+
+   SSSNIC_DEBUG("command=%u, func=%u module=%u, type=%u, ack=%u, seq=%u, "
+"status=%u, id=%u data_buf=%p, data_len=%u",
+   msg->command, msg->func, msg->module, msg->type, msg->ack,
+   msg->seg, msg->status, msg->id, msg->data_buf, msg->data_len);
+
+   if (msg->module == SSSNIC_NETIF_MODULE) {
+   sssnic_netif_exception_msg_handle(hw, msg, chan_id);
+   return SSSNIC_MSG_DONE;
+   }
+
+   PMD_DRV_LOG(WARNING, "Exception message was not proce

[PATCH v5 12/32] net/sssnic: support dev link status

2023-09-03 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Removed error.h from including files.
---
 doc/guides/nics/features/sssnic.ini |   1 +
 drivers/net/sssnic/base/sssnic_api.c| 127 
 drivers/net/sssnic/base/sssnic_api.h|  14 +++
 drivers/net/sssnic/base/sssnic_cmd.h|  37 +++
 drivers/net/sssnic/meson.build  |   1 +
 drivers/net/sssnic/sssnic_ethdev.c  |   4 +
 drivers/net/sssnic/sssnic_ethdev_link.c | 111 +
 drivers/net/sssnic/sssnic_ethdev_link.h |  12 +++
 8 files changed, 307 insertions(+)
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_link.c
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_link.h

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index 602839d301..a0688e70ef 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -4,6 +4,7 @@
 ; Refer to default.ini for the full list of available PMD features.
 ;
 [Features]
+Link status  = Y
 Unicast MAC filter   = Y
 Multicast MAC filter = Y
 Linux= Y
diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index 76266dfbae..3bb31009c5 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -307,3 +307,130 @@ sssnic_mac_addr_del(struct sssnic_hw *hw, uint8_t *addr)
 
return 0;
 }
+
+int
+sssnic_netif_link_status_get(struct sssnic_hw *hw, uint8_t *status)
+{
+   int ret;
+   struct sssnic_netif_link_status_get_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+   uint16_t func;
+
+   if (hw == NULL || status == NULL)
+   return -EINVAL;
+
+   if (SSSNIC_FUNC_TYPE(hw) == SSSNIC_FUNC_TYPE_VF)
+   func = SSSNIC_PF_FUNC_IDX(hw);
+   else
+   func = SSSNIC_MPU_FUNC_IDX;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.port = SSSNIC_PHY_PORT(hw);
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_GET_NETIF_LINK_STATUS_CMD, func, SSSNIC_NETIF_MODULE,
+   SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_GET_NETIF_LINK_STATUS_CMD, 
len=%u, status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   *status = cmd.status;
+
+   return 0;
+}
+
+int
+sssnic_netif_link_info_get(struct sssnic_hw *hw,
+   struct sssnic_netif_link_info *info)
+{
+   int ret;
+   struct sssnic_netif_link_info_get_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   if (hw == NULL || info == NULL)
+   return -EINVAL;
+
+   ret = sssnic_netif_link_status_get(hw, &info->status);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to get netif link state!");
+   return ret;
+   }
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.port = SSSNIC_PHY_PORT(hw);
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_GET_NETIF_LINK_INFO_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_NETIF_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_GET_NETIF_LINK_INFO_CMD, 
len=%u, status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   info->speed = cmd.speed;
+   info->duplex = cmd.duplex;
+   info->fec = cmd.fec;
+   info->type = cmd.type;
+   info->autoneg_capa = cmd.autoneg_capa;
+   info->autoneg = cmd.autoneg;
+
+   return 0;
+}
+
+int
+sssnic_netif_enable_set(struct sssnic_hw *hw, uint8_t state)
+{
+   int ret;
+   struct sssnic_netif_enable_set_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   if (hw == NULL)
+   return -EINVAL;
+
+   if (SSSNIC_FUNC_TYPE(hw) == SSSNIC_FUNC_TYPE_VF)
+   return 0;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   if (state != 0)
+   cmd.flag = SSSNIC_SET_NETIF_ENABLE_CMD_FLAG_RX_EN |
+  SSSNIC_SET_NETIF_ENABLE_CMD_FLAG_TX_EN;
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_SET_NETIF_ENABLE_CMD, SSSNIC_MPU_FUNC_ID

[PATCH v5 17/32] net/sssnic: support Tx queue start and stop

2023-09-03 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 doc/guides/nics/features/sssnic.ini   |   1 +
 drivers/net/sssnic/sssnic_ethdev.c|   2 +
 drivers/net/sssnic/sssnic_ethdev_tx.c | 155 ++
 drivers/net/sssnic/sssnic_ethdev_tx.h |   4 +
 4 files changed, 162 insertions(+)

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index 82b527ba26..b75c68cb33 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -6,6 +6,7 @@
 [Features]
 Link status  = Y
 Link status event= Y
+Queue start/stop = Y
 Unicast MAC filter   = Y
 Multicast MAC filter = Y
 Linux= Y
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index 208f0db402..8a18f25889 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -360,6 +360,8 @@ static const struct eth_dev_ops sssnic_ethdev_ops = {
.tx_queue_release = sssnic_ethdev_tx_queue_release,
.rx_queue_start = sssnic_ethdev_rx_queue_start,
.rx_queue_stop = sssnic_ethdev_rx_queue_stop,
+   .tx_queue_start = sssnic_ethdev_tx_queue_start,
+   .tx_queue_stop = sssnic_ethdev_tx_queue_stop,
 };
 
 static int
diff --git a/drivers/net/sssnic/sssnic_ethdev_tx.c 
b/drivers/net/sssnic/sssnic_ethdev_tx.c
index e80bf8c396..47d7e3f343 100644
--- a/drivers/net/sssnic/sssnic_ethdev_tx.c
+++ b/drivers/net/sssnic/sssnic_ethdev_tx.c
@@ -191,6 +191,18 @@ sssnic_ethdev_txq_ci_get(struct sssnic_ethdev_txq *txq)
return sssnic_workq_ci_get(txq->workq);
 }
 
+static inline int
+sssnic_ethdev_txq_pi_get(struct sssnic_ethdev_txq *txq)
+{
+   return sssnic_workq_pi_get(txq->workq);
+}
+
+static inline uint16_t
+sssnic_ethdev_txq_hw_ci_get(struct sssnic_ethdev_txq *txq)
+{
+   return *txq->hw_ci_addr & txq->idx_mask;
+}
+
 static inline void
 sssnic_ethdev_txq_consume(struct sssnic_ethdev_txq *txq, uint16_t num_entries)
 {
@@ -352,3 +364,146 @@ sssnic_ethdev_tx_queue_all_release(struct rte_eth_dev 
*ethdev)
for (qid = 0; qid < ethdev->data->nb_tx_queues; qid++)
sssnic_ethdev_tx_queue_release(ethdev, qid);
 }
+
+#define SSSNIC_ETHDEV_TX_FREE_BULK 64
+static inline int
+sssnic_ethdev_txq_pktmbufs_cleanup(struct sssnic_ethdev_txq *txq)
+{
+   struct sssnic_ethdev_tx_entry *txe;
+   struct rte_mbuf *free_pkts[SSSNIC_ETHDEV_TX_FREE_BULK];
+   uint16_t num_free_pkts = 0;
+   uint16_t hw_ci, ci, id_mask;
+   uint16_t count = 0;
+   int num_entries;
+
+   ci = sssnic_ethdev_txq_ci_get(txq);
+   hw_ci = sssnic_ethdev_txq_hw_ci_get(txq);
+   id_mask = txq->idx_mask;
+   num_entries = sssnic_ethdev_txq_num_used_entries(txq);
+
+   while (num_entries > 0) {
+   txe = &txq->txe[ci];
+
+   /* HW has not consumed enough entries of current packet */
+   if (((hw_ci - ci) & id_mask) < txe->num_workq_entries)
+   break;
+
+   num_entries -= txe->num_workq_entries;
+   count += txe->num_workq_entries;
+   ci = (ci + txe->num_workq_entries) & id_mask;
+
+   if (likely(txe->pktmbuf->nb_segs == 1)) {
+   struct rte_mbuf *pkt =
+   rte_pktmbuf_prefree_seg(txe->pktmbuf);
+   txe->pktmbuf = NULL;
+
+   if (unlikely(pkt == NULL))
+   continue;
+
+   free_pkts[num_free_pkts++] = pkt;
+   if (unlikely(pkt->pool != free_pkts[0]->pool ||
+num_free_pkts >=
+SSSNIC_ETHDEV_TX_FREE_BULK)) {
+   rte_mempool_put_bulk(free_pkts[0]->pool,
+   (void **)free_pkts, num_free_pkts - 1);
+   num_free_pkts = 0;
+   free_pkts[num_free_pkts++] = pkt;
+   }
+   } else {
+   rte_pktmbuf_free(txe->pktmbuf);
+   txe->pktmbuf = NULL;
+   }
+   }
+
+   if (num_free_pkts > 0)
+   rte_mempool_put_bulk(free_pkts[0]->pool, (void **)free_pkts,
+   num_free_pkts);
+
+   sssnic_ethdev_txq_consume(txq, count);
+
+   return count;
+}
+
+#define SSSNIC_ETHDEV_TXQ_FUSH_TIMEOUT 3000 /* 3 seconds */
+static int
+sssnic_ethdev_txq_flush(struct sssnic_ethdev_txq *txq)
+{
+   uint64_t timeout;
+   uint16_t used_entries;
+
+   timeout = rte_get_timer_cycles() +
+ rte_get_timer_hz() * SSSNIC_ETHDEV_TXQ_FUSH_TIMEOUT / 1000;
+
+   do {
+   sssnic_ethdev_txq_pktmbufs_cleanup(txq);
+   used_entries = sssnic_ethdev_txq_num_used_entries(txq);
+   if (used_entries == 0)
+   return 0;
+
+

[PATCH v5 10/32] net/sssnic: add dev configure and infos get

2023-09-03 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/base/sssnic_api.c | 33 
 drivers/net/sssnic/base/sssnic_api.h |  8 +++
 drivers/net/sssnic/base/sssnic_cmd.h | 14 +
 drivers/net/sssnic/base/sssnic_hw.c  | 33 +++-
 drivers/net/sssnic/base/sssnic_hw.h  |  6 +++
 drivers/net/sssnic/sssnic_ethdev.c   | 76 
 drivers/net/sssnic/sssnic_ethdev.h   | 53 +++
 7 files changed, 222 insertions(+), 1 deletion(-)

diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index 51a59f0f25..bf0859cd63 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -100,3 +100,36 @@ sssnic_msix_attr_set(struct sssnic_hw *hw, uint16_t 
msix_idx,
 
return 0;
 }
+
+int
+sssnic_capability_get(struct sssnic_hw *hw, struct sssnic_capability *capa)
+{
+   struct sssnic_capability_get_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+   int ret;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd_len = sizeof(cmd);
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_GET_CAPABILITY_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_CFG_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_GET_CAPABILITY_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   capa->phy_port = cmd.phy_port;
+   capa->max_num_rxq = cmd.rxq_max_id + 1;
+   capa->max_num_txq = cmd.txq_max_id + 1;
+
+   return 0;
+}
diff --git a/drivers/net/sssnic/base/sssnic_api.h 
b/drivers/net/sssnic/base/sssnic_api.h
index 3d54eb826a..8011cc8b0f 100644
--- a/drivers/net/sssnic/base/sssnic_api.h
+++ b/drivers/net/sssnic/base/sssnic_api.h
@@ -15,9 +15,17 @@ struct sssnic_msix_attr {
uint8_t resend_timer;
 };
 
+struct sssnic_capability {
+   uint16_t max_num_txq;
+   uint16_t max_num_rxq;
+   uint8_t phy_port;
+   uint8_t cos;
+};
+
 int sssnic_msix_attr_get(struct sssnic_hw *hw, uint16_t msix_idx,
struct sssnic_msix_attr *attr);
 int sssnic_msix_attr_set(struct sssnic_hw *hw, uint16_t msix_idx,
struct sssnic_msix_attr *attr);
+int sssnic_capability_get(struct sssnic_hw *hw, struct sssnic_capability 
*capa);
 
 #endif /* _SSSNIC_API_H_ */
diff --git a/drivers/net/sssnic/base/sssnic_cmd.h 
b/drivers/net/sssnic/base/sssnic_cmd.h
index ee9f536ac2..79192affbc 100644
--- a/drivers/net/sssnic/base/sssnic_cmd.h
+++ b/drivers/net/sssnic/base/sssnic_cmd.h
@@ -18,6 +18,8 @@ enum sssnic_mgmt_cmd_id {
SSSNIC_GET_FW_VERSION_CMD = 60,
 };
 
+#define SSSNIC_GET_CAPABILITY_CMD 0
+
 struct sssnic_cmd_common {
uint8_t status;
uint8_t version;
@@ -111,4 +113,16 @@ struct sssnic_msix_ctrl_cmd {
uint8_t resvd1[5];
 };
 
+struct sssnic_capability_get_cmd {
+   struct sssnic_cmd_common common;
+   uint16_t function;
+   uint16_t resvd0;
+   uint8_t resvd1[3];
+   uint8_t phy_port;
+   uint32_t resvd2[16];
+   uint16_t txq_max_id;
+   uint16_t rxq_max_id;
+   uint32_t resvd3[63];
+};
+
 #endif /* _SSSNIC_CMD_H_ */
diff --git a/drivers/net/sssnic/base/sssnic_hw.c 
b/drivers/net/sssnic/base/sssnic_hw.c
index 4ca75208af..8f5f556bde 100644
--- a/drivers/net/sssnic/base/sssnic_hw.c
+++ b/drivers/net/sssnic/base/sssnic_hw.c
@@ -253,6 +253,29 @@ sssnic_msix_attr_init(struct sssnic_hw *hw)
return 0;
 }
 
+static int
+sssnic_capability_init(struct sssnic_hw *hw)
+{
+   struct sssnic_capability cap;
+   int ret;
+
+   ret = sssnic_capability_get(hw, &cap);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to get sssnic capability");
+   return ret;
+   }
+
+   PMD_DRV_LOG(INFO,
+   "Initialized capability, physic port:%u, max %u txqs, max %u 
rxqs",
+   cap.phy_port, cap.max_num_txq, cap.max_num_rxq);
+
+   hw->phy_port = cap.phy_port;
+   hw->max_num_rxq = cap.max_num_rxq;
+   hw->max_num_txq = cap.max_num_txq;
+
+   return 0;
+}
+
 static int
 sssnic_base_init(struct sssnic_hw *hw)
 {
@@ -360,10 +383,18 @@ sssnic_hw_init(struct sssnic_hw *hw)
goto ctrlq_init_fail;
}
 
+   ret = sssnic_capability_init(hw);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to initialize capability");
+   goto capbility_init_fail;
+   }
+
sssnic_pf_status_set(hw, SSSNIC_PF_STATUS_ACTIVE);
 
-   return -EINVAL;
+   return 0;
 
+capbility_init_fail:
+   sssnic_ctrlq_s

[PATCH v5 18/32] net/sssnic: add Rx interrupt support

2023-09-03 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 doc/guides/nics/features/sssnic.ini   |   1 +
 drivers/net/sssnic/base/sssnic_hw.c   |  14 +++
 drivers/net/sssnic/base/sssnic_hw.h   |   2 +
 drivers/net/sssnic/sssnic_ethdev.c|   2 +
 drivers/net/sssnic/sssnic_ethdev_rx.c | 135 ++
 drivers/net/sssnic/sssnic_ethdev_rx.h |   6 ++
 6 files changed, 160 insertions(+)

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index b75c68cb33..e3b8166629 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -7,6 +7,7 @@
 Link status  = Y
 Link status event= Y
 Queue start/stop = Y
+Rx interrupt = Y
 Unicast MAC filter   = Y
 Multicast MAC filter = Y
 Linux= Y
diff --git a/drivers/net/sssnic/base/sssnic_hw.c 
b/drivers/net/sssnic/base/sssnic_hw.c
index 82eb4ea295..651a0aa7ef 100644
--- a/drivers/net/sssnic/base/sssnic_hw.c
+++ b/drivers/net/sssnic/base/sssnic_hw.c
@@ -145,6 +145,20 @@ sssnic_msix_resend_disable(struct sssnic_hw *hw, uint16_t 
msix_id)
sssnic_cfg_reg_write(hw, SSSNIC_MSIX_CTRL_REG, reg.u32);
 }
 
+void
+sssnic_msix_auto_mask_set(struct sssnic_hw *hw, uint16_t msix_id, int state)
+{
+   struct sssnic_msix_ctrl_reg reg;
+
+   reg.u32 = 0;
+   if (state == SSSNIC_MSIX_ENABLE)
+   reg.auto_msk_set = 1;
+   else
+   reg.auto_msk_clr = 1;
+   reg.msxi_idx = msix_id;
+   sssnic_cfg_reg_write(hw, SSSNIC_MSIX_CTRL_REG, reg.u32);
+}
+
 static void
 sssnic_pf_status_set(struct sssnic_hw *hw, enum sssnic_pf_status status)
 {
diff --git a/drivers/net/sssnic/base/sssnic_hw.h 
b/drivers/net/sssnic/base/sssnic_hw.h
index e25f5595e6..4820212543 100644
--- a/drivers/net/sssnic/base/sssnic_hw.h
+++ b/drivers/net/sssnic/base/sssnic_hw.h
@@ -100,6 +100,8 @@ int sssnic_hw_init(struct sssnic_hw *hw);
 void sssnic_hw_shutdown(struct sssnic_hw *hw);
 void sssnic_msix_state_set(struct sssnic_hw *hw, uint16_t msix_id, int state);
 void sssnic_msix_resend_disable(struct sssnic_hw *hw, uint16_t msix_id);
+void sssnic_msix_auto_mask_set(struct sssnic_hw *hw, uint16_t msix_id,
+   int state);
 int sssnic_link_event_callback_register(struct sssnic_hw *hw,
sssnic_link_event_cb_t *cb, void *priv);
 void sssnic_link_event_callback_unregister(struct sssnic_hw *hw);
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index 8a18f25889..35bb26a0b1 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -362,6 +362,8 @@ static const struct eth_dev_ops sssnic_ethdev_ops = {
.rx_queue_stop = sssnic_ethdev_rx_queue_stop,
.tx_queue_start = sssnic_ethdev_tx_queue_start,
.tx_queue_stop = sssnic_ethdev_tx_queue_stop,
+   .rx_queue_intr_enable = sssnic_ethdev_rx_queue_intr_enable,
+   .rx_queue_intr_disable = sssnic_ethdev_rx_queue_intr_disable,
 };
 
 static int
diff --git a/drivers/net/sssnic/sssnic_ethdev_rx.c 
b/drivers/net/sssnic/sssnic_ethdev_rx.c
index d8429e734d..9c1b2f20d1 100644
--- a/drivers/net/sssnic/sssnic_ethdev_rx.c
+++ b/drivers/net/sssnic/sssnic_ethdev_rx.c
@@ -136,6 +136,12 @@ static const uint16_t sssnic_ethdev_rx_buf_size_tbl[] = { 
32, 64, 96, 128, 192,
 /* Doorbell offset 8192 */
 #define SSSNIC_ETHDEV_RXQ_DB_OFFSET 0x2000
 
+#define SSSNIC_ETHDEV_RX_MSIX_ID_START 1
+#define SSSNIC_ETHDEV_RX_MSIX_ID_INVAL 0
+#define SSSNIC_ETHDEV_RX_MSIX_PENDING_LIMIT 2
+#define SSSNIC_ETHDEV_RX_MSIX_COALESCING_TIMER 2
+#define SSSNIC_ETHDEV_RX_MSIX_RESNEDING_TIMER 7
+
 struct sssnic_ethdev_rxq_doorbell {
union {
uint64_t u64;
@@ -750,3 +756,132 @@ sssnic_ethdev_rx_queue_all_stop(struct rte_eth_dev 
*ethdev)
 
return 0;
 }
+
+static int
+sssinc_ethdev_rxq_intr_attr_init(struct sssnic_ethdev_rxq *rxq)
+{
+   int ret;
+   struct sssnic_hw *hw = SSSNIC_ETHDEV_TO_HW(rxq->ethdev);
+   struct sssnic_msix_attr attr;
+
+   attr.lli_set = 0;
+   attr.coalescing_set = 1;
+   attr.pending_limit = SSSNIC_ETHDEV_RX_MSIX_PENDING_LIMIT;
+   attr.coalescing_timer = SSSNIC_ETHDEV_RX_MSIX_COALESCING_TIMER;
+   attr.resend_timer = SSSNIC_ETHDEV_RX_MSIX_RESNEDING_TIMER;
+
+   ret = sssnic_msix_attr_set(hw, rxq->intr.msix_id, &attr);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to set msxi attributes");
+   return ret;
+   }
+
+   return 0;
+}
+
+int
+sssnic_ethdev_rx_queue_intr_enable(struct rte_eth_dev *ethdev, uint16_t qid)
+{
+   struct sssnic_ethdev_rxq *rxq = ethdev->data->rx_queues[qid];
+   struct sssnic_hw *hw = SSSNIC_ETHDEV_TO_HW(ethdev);
+
+   if (rxq->intr.enable)
+   return 0;
+
+   sssnic_msix_auto_mask_set(hw, rxq->intr.msix_id, SSSNIC_MSIX_ENABLE);
+   sssnic_msix_state_set(hw, rxq->intr.msix_id, SSSNIC_MSIX_ENABLE);
+   rxq->intr.enable = 1;
+
+   return 0;
+}
+

[PATCH v5 15/32] net/sssnic: support Tx queue setup and release

2023-09-03 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Removed error.h from including files.

v4:
* Fixed coding style issue of REPEATED_WORD.
---
 drivers/net/sssnic/meson.build|   1 +
 drivers/net/sssnic/sssnic_ethdev.c|   4 +
 drivers/net/sssnic/sssnic_ethdev.h|   1 +
 drivers/net/sssnic/sssnic_ethdev_tx.c | 354 ++
 drivers/net/sssnic/sssnic_ethdev_tx.h |  27 ++
 5 files changed, 387 insertions(+)
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_tx.c
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_tx.h

diff --git a/drivers/net/sssnic/meson.build b/drivers/net/sssnic/meson.build
index 7c3516a279..0c6e21310d 100644
--- a/drivers/net/sssnic/meson.build
+++ b/drivers/net/sssnic/meson.build
@@ -20,4 +20,5 @@ sources = files(
 'sssnic_ethdev.c',
 'sssnic_ethdev_link.c',
 'sssnic_ethdev_rx.c',
+'sssnic_ethdev_tx.c',
 )
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index f98510a55d..732fddfcf7 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -11,6 +11,7 @@
 #include "sssnic_ethdev.h"
 #include "sssnic_ethdev_link.h"
 #include "sssnic_ethdev_rx.h"
+#include "sssnic_ethdev_tx.h"
 
 static int
 sssnic_ethdev_infos_get(struct rte_eth_dev *ethdev,
@@ -336,6 +337,7 @@ sssnic_ethdev_release(struct rte_eth_dev *ethdev)
struct sssnic_hw *hw = SSSNIC_ETHDEV_TO_HW(ethdev);
 
sssnic_ethdev_link_intr_disable(ethdev);
+   sssnic_ethdev_tx_queue_all_release(ethdev);
sssnic_ethdev_rx_queue_all_release(ethdev);
sssnic_ethdev_mac_addrs_clean(ethdev);
sssnic_hw_shutdown(hw);
@@ -354,6 +356,8 @@ static const struct eth_dev_ops sssnic_ethdev_ops = {
.set_mc_addr_list = sssnic_ethdev_set_mc_addr_list,
.rx_queue_setup = sssnic_ethdev_rx_queue_setup,
.rx_queue_release = sssnic_ethdev_rx_queue_release,
+   .tx_queue_setup = sssnic_ethdev_tx_queue_setup,
+   .tx_queue_release = sssnic_ethdev_tx_queue_release,
 };
 
 static int
diff --git a/drivers/net/sssnic/sssnic_ethdev.h 
b/drivers/net/sssnic/sssnic_ethdev.h
index 51740413c6..ab832d179f 100644
--- a/drivers/net/sssnic/sssnic_ethdev.h
+++ b/drivers/net/sssnic/sssnic_ethdev.h
@@ -57,6 +57,7 @@
 #define SSSNIC_ETHDEV_MAX_NUM_MC_MAC 2048
 
 #define SSSNIC_ETHDEV_DEF_RX_FREE_THRESH 32
+#define SSSNIC_ETHDEV_DEF_TX_FREE_THRESH 32
 
 struct sssnic_netdev {
void *hw;
diff --git a/drivers/net/sssnic/sssnic_ethdev_tx.c 
b/drivers/net/sssnic/sssnic_ethdev_tx.c
new file mode 100644
index 00..e80bf8c396
--- /dev/null
+++ b/drivers/net/sssnic/sssnic_ethdev_tx.c
@@ -0,0 +1,354 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#include 
+#include 
+#include 
+
+#include "sssnic_log.h"
+#include "sssnic_ethdev.h"
+#include "sssnic_ethdev_tx.h"
+#include "base/sssnic_hw.h"
+#include "base/sssnic_workq.h"
+#include "base/sssnic_api.h"
+#include "base/sssnic_misc.h"
+
+/* Hardware format of tx desc */
+struct sssnic_ethdev_tx_desc {
+   union {
+   uint32_t dw0;
+   struct {
+   /* length of the first tx seg data */
+   uint32_t data_len : 18;
+   uint32_t dw0_resvd0 : 1;
+   /* number of tx segments in tx entry */
+   uint32_t num_segs : 8;
+   /* offload desc enable */
+   uint32_t offload_en : 1;
+   /* data format, use SGL if 0 else inline */
+   uint32_t data_fmt : 1;
+   /* DN, always set 0  */
+   uint32_t dw0_resvd1 : 1;
+   /* refer sssnic_ethdev_txq_entry_type */
+   uint32_t entry_type : 1;
+   uint32_t owner : 1;
+   };
+   };
+   union {
+   uint32_t dw1;
+   struct {
+   uint32_t pkt_type : 2;
+   uint32_t payload_off : 8;
+   /* UFO, not used, always set 0 */
+   uint32_t dw1_resvd0 : 1;
+   uint32_t tso_en : 1;
+   /* TCP/UDP checksum offload enable flag */
+   uint32_t csum_en : 1;
+   uint32_t mss : 14;
+   uint32_t sctp_crc_en : 1;
+   /* set 1 if entry type is not compact else set 0 */
+   uint32_t uc : 1;
+   /* PRI, not used, always set 0  */
+   uint32_t dw1_resvd1 : 3;
+   };
+   };
+   union {
+   uint32_t dw2;
+   /* high 32bit of  DMA address of the first tx seg data */
+   uint32_t data_addr_hi;
+   };
+   union {
+   uint32_t dw3;
+ 

[PATCH v5 20/32] net/sssnic: support dev close and reset

2023-09-03 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/sssnic_ethdev.c | 32 ++
 1 file changed, 32 insertions(+)

diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index 8201a1e3c4..b59c4fd3ad 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -13,6 +13,8 @@
 #include "sssnic_ethdev_rx.h"
 #include "sssnic_ethdev_tx.h"
 
+static int sssnic_ethdev_init(struct rte_eth_dev *ethdev);
+
 static int
 sssnic_ethdev_infos_get(struct rte_eth_dev *ethdev,
struct rte_eth_dev_info *devinfo)
@@ -622,9 +624,39 @@ sssnic_ethdev_stop(struct rte_eth_dev *ethdev)
return 0;
 }
 
+static int
+sssnic_ethdev_close(struct rte_eth_dev *ethdev)
+{
+   sssnic_ethdev_release(ethdev);
+
+   PMD_DRV_LOG(INFO, "Port %u is closed", ethdev->data->port_id);
+
+   return 0;
+}
+
+static int
+sssnic_ethdev_reset(struct rte_eth_dev *ethdev)
+{
+   int ret;
+
+   sssnic_ethdev_release(ethdev);
+
+   ret = sssnic_ethdev_init(ethdev);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to initialize sssnic ethdev");
+   return ret;
+   }
+
+   PMD_DRV_LOG(INFO, "Port %u is reset", ethdev->data->port_id);
+
+   return 0;
+}
+
 static const struct eth_dev_ops sssnic_ethdev_ops = {
.dev_start = sssnic_ethdev_start,
.dev_stop = sssnic_ethdev_stop,
+   .dev_close = sssnic_ethdev_close,
+   .dev_reset = sssnic_ethdev_reset,
.dev_set_link_up = sssnic_ethdev_set_link_up,
.dev_set_link_down = sssnic_ethdev_set_link_down,
.link_update = sssnic_ethdev_link_update,
-- 
2.27.0



[PATCH v5 16/32] net/sssnic: support Rx queue start and stop

2023-09-03 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/base/sssnic_api.c  |  63 +
 drivers/net/sssnic/base/sssnic_api.h  |   2 +
 drivers/net/sssnic/base/sssnic_cmd.h  |  49 
 drivers/net/sssnic/sssnic_ethdev.c|   2 +
 drivers/net/sssnic/sssnic_ethdev.h|   2 +
 drivers/net/sssnic/sssnic_ethdev_rx.c | 332 ++
 drivers/net/sssnic/sssnic_ethdev_rx.h |   4 +
 7 files changed, 454 insertions(+)

diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index 3bb31009c5..3050d573bf 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -11,6 +11,7 @@
 #include "sssnic_hw.h"
 #include "sssnic_cmd.h"
 #include "sssnic_mbox.h"
+#include "sssnic_ctrlq.h"
 #include "sssnic_api.h"
 
 int
@@ -434,3 +435,65 @@ sssnic_netif_enable_set(struct sssnic_hw *hw, uint8_t 
state)
 
return 0;
 }
+
+int
+sssnic_port_enable_set(struct sssnic_hw *hw, bool state)
+{
+   int ret;
+   struct sssnic_port_enable_set_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   if (hw == NULL)
+   return -EINVAL;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   cmd.state = state ? 1 : 0;
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_SET_PORT_ENABLE_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_SET_PORT_ENABLE_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
+
+int
+sssnic_rxq_flush(struct sssnic_hw *hw, uint16_t qid)
+{
+   struct sssnic_ctrlq_cmd cmd;
+   struct sssnic_rxq_flush_cmd data;
+   int ret;
+
+   data.u32 = 0;
+   data.qid = qid;
+   data.u32 = rte_cpu_to_be_32(data.u32);
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.data = &data;
+   cmd.module = SSSNIC_LAN_MODULE;
+   cmd.data_len = sizeof(data);
+   cmd.cmd = SSSNIC_FLUSH_RXQ_CMD;
+
+   ret = sssnic_ctrlq_cmd_exec(hw, &cmd, 0);
+   if (ret != 0 || cmd.result != 0) {
+   PMD_DRV_LOG(ERR,
+   "Failed to execulte ctrlq command %s, ret=%d, result=%" 
PRIu64,
+   "SSSNIC_FLUSH_RXQ_CMD", ret, cmd.result);
+   return -EIO;
+   }
+
+   return 0;
+}
diff --git a/drivers/net/sssnic/base/sssnic_api.h 
b/drivers/net/sssnic/base/sssnic_api.h
index 168aa152b9..29962aabf8 100644
--- a/drivers/net/sssnic/base/sssnic_api.h
+++ b/drivers/net/sssnic/base/sssnic_api.h
@@ -45,5 +45,7 @@ int sssnic_netif_link_status_get(struct sssnic_hw *hw, 
uint8_t *status);
 int sssnic_netif_link_info_get(struct sssnic_hw *hw,
struct sssnic_netif_link_info *info);
 int sssnic_netif_enable_set(struct sssnic_hw *hw, uint8_t state);
+int sssnic_port_enable_set(struct sssnic_hw *hw, bool state);
+int sssnic_rxq_flush(struct sssnic_hw *hw, uint16_t qid);
 
 #endif /* _SSSNIC_API_H_ */
diff --git a/drivers/net/sssnic/base/sssnic_cmd.h 
b/drivers/net/sssnic/base/sssnic_cmd.h
index 6957b742fc..6364058d36 100644
--- a/drivers/net/sssnic/base/sssnic_cmd.h
+++ b/drivers/net/sssnic/base/sssnic_cmd.h
@@ -35,6 +35,37 @@ enum sssnic_netif_cmd_id {
SSSNIC_GET_NETIF_LINK_INFO_CMD = 153,
 };
 
+enum sssnic_port_cmd_id {
+   SSSNIC_REGISTER_VF_PORT_CMD = 0,
+   SSSNIC_SET_PORT_RXTX_SIZE_CMD = 5,
+   SSSNIC_SET_PORT_ENABLE_CMD = 6,
+   SSSNIC_SET_PORT_RX_MODE_CMD = 7,
+   SSSNIC_SET_PORT_TX_CI_ATTR_CMD = 8,
+   SSSNIC_GET_PORT_STATS_CMD = 9,
+   SSSNIC_CLEAR_PORT_STATS_CMD = 10,
+
+   SSSNIC_CLEAN_PORT_RES_CMD = 11,
+
+   SSSNIC_PORT_LRO_CFG_CMD = 13,
+   SSSNIC_PORT_LRO_TIMER_CMD = 14,
+   SSSNIC_PORT_FEATURE_CMD = 15,
+
+   SSSNIC_SET_PORT_VLAN_FILTER_CMD = 25,
+   SSSNIC_ENABLE_PORT_VLAN_FILTER_CMD = 26,
+   SSSNIC_ENABLE_PORT_VLAN_STRIP_CMD = 27,
+
+   SSSNIC_PORT_FLOW_CTRL_CMD = 101,
+};
+
+enum sssnic_ctrlq_cmd_id {
+   SSSNIC_SET_RXTXQ_CTX_CMD = 0,
+   SSSNIC_RESET_OFFLOAD_CTX_CMD = 1,
+   SSSNIC_SET_RSS_INDIR_TABLE_CMD = 4,
+   SSSNIC_SET_RSS_KEY_CTRLQ_CMD = 5,
+   SSSNIC_GET_RSS_INDIR_TABLE_CMD = 6,
+   SSSNIC_FLUSH_RXQ_CMD = 10,
+};
+
 struct sssnic_cmd_common {
uint8_t status;
uint8_t version;
@@ -187,4 +218,22 @@ struct sssnic_netif_enable_set_cmd {
uint8_t resvd1[3];
 };
 
+struct sssnic_port_enable_set_cmd {
+   struct sssnic_cmd_common common;
+   uint16_t function;
+   uint16_t resvd0;
+

[PATCH v5 19/32] net/sssnic: support dev start and stop

2023-09-03 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/base/sssnic_api.c  | 508 ++
 drivers/net/sssnic/base/sssnic_api.h  | 257 +
 drivers/net/sssnic/base/sssnic_cmd.h  | 100 +
 drivers/net/sssnic/base/sssnic_misc.h |  34 ++
 drivers/net/sssnic/sssnic_ethdev.c| 284 ++
 drivers/net/sssnic/sssnic_ethdev.h|  21 ++
 drivers/net/sssnic/sssnic_ethdev_rx.c | 270 +-
 drivers/net/sssnic/sssnic_ethdev_rx.h |   8 +
 drivers/net/sssnic/sssnic_ethdev_tx.c | 163 +
 drivers/net/sssnic/sssnic_ethdev_tx.h |   6 +
 10 files changed, 1650 insertions(+), 1 deletion(-)

diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index 3050d573bf..81020387bd 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -13,6 +13,7 @@
 #include "sssnic_mbox.h"
 #include "sssnic_ctrlq.h"
 #include "sssnic_api.h"
+#include "sssnic_misc.h"
 
 int
 sssnic_msix_attr_get(struct sssnic_hw *hw, uint16_t msix_idx,
@@ -497,3 +498,510 @@ sssnic_rxq_flush(struct sssnic_hw *hw, uint16_t qid)
 
return 0;
 }
+
+static int
+sssnic_rxtx_size_set(struct sssnic_hw *hw, uint16_t rx_size, uint16_t tx_size,
+   uint32_t flags)
+{
+   int ret;
+   struct sssnic_rxtx_size_set_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   if (hw == NULL)
+   return -EINVAL;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   cmd.rx_size = rx_size;
+   cmd.tx_size = tx_size;
+   cmd.flags = flags;
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_SET_PORT_RXTX_SIZE_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_SET_PORT_RXTX_SIZE_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
+
+int
+sssnic_rxtx_max_size_init(struct sssnic_hw *hw, uint16_t rx_size,
+   uint16_t tx_size)
+{
+   return sssnic_rxtx_size_set(hw, rx_size, tx_size,
+   SSSNIC_CMD_INIT_RXTX_SIZE_FLAG | SSSNIC_CMD_SET_RX_SIZE_FLAG |
+   SSSNIC_CMD_SET_TX_SIZE_FLAG);
+}
+
+int
+sssnic_tx_max_size_set(struct sssnic_hw *hw, uint16_t tx_size)
+{
+   return sssnic_rxtx_size_set(hw, 0, tx_size,
+   SSSNIC_CMD_SET_TX_SIZE_FLAG);
+}
+
+int
+sssnic_port_features_get(struct sssnic_hw *hw, uint64_t *features)
+{
+   int ret;
+   struct sssnic_port_feature_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   cmd.opcode = SSSNIC_CMD_OPCODE_GET;
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len, SSSNIC_PORT_FEATURE_CMD,
+   SSSNIC_MPU_FUNC_IDX, SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_PORT_FEATURE_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   *features = cmd.features;
+
+   return 0;
+}
+
+int
+sssnic_port_features_set(struct sssnic_hw *hw, uint64_t features)
+{
+   int ret;
+   struct sssnic_port_feature_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   cmd.features = features;
+   cmd.opcode = SSSNIC_CMD_OPCODE_SET;
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len, SSSNIC_PORT_FEATURE_CMD,
+   SSSNIC_MPU_FUNC_IDX, SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_PORT_FEATURE_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
+
+#define SSSNIC_MAX_NUM_RXTXQ_CTX_SET_IN_BULK   

[PATCH v5 21/32] net/sssnic: add allmulticast and promiscuous ops

2023-09-03 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 doc/guides/nics/features/sssnic.ini |  2 +
 drivers/net/sssnic/sssnic_ethdev.c  | 72 +
 2 files changed, 74 insertions(+)

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index e3b8166629..359834ce4c 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -8,6 +8,8 @@ Link status  = Y
 Link status event= Y
 Queue start/stop = Y
 Rx interrupt = Y
+Promiscuous mode = Y
+Allmulticast mode= Y
 Unicast MAC filter   = Y
 Multicast MAC filter = Y
 Linux= Y
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index b59c4fd3ad..e1c805aeea 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -652,6 +652,74 @@ sssnic_ethdev_reset(struct rte_eth_dev *ethdev)
return 0;
 }
 
+static int
+sssnic_ethdev_allmulticast_enable(struct rte_eth_dev *ethdev)
+{
+   struct sssnic_netdev *netdev = SSSNIC_ETHDEV_PRIVATE(ethdev);
+   uint32_t rx_mode;
+   int ret;
+
+   rx_mode = netdev->rx_mode | SSSNIC_ETHDEV_RX_ALL_MCAST;
+   ret = sssnic_ethdev_rx_mode_set(ethdev, rx_mode);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to set rx_mode: %x", rx_mode);
+   return ret;
+   }
+
+   return 0;
+}
+
+static int
+sssnic_ethdev_allmulticast_disable(struct rte_eth_dev *ethdev)
+{
+   struct sssnic_netdev *netdev = SSSNIC_ETHDEV_PRIVATE(ethdev);
+   uint32_t rx_mode;
+   int ret;
+
+   rx_mode = netdev->rx_mode & (~SSSNIC_ETHDEV_RX_ALL_MCAST);
+   ret = sssnic_ethdev_rx_mode_set(ethdev, rx_mode);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to set rx_mode: %x", rx_mode);
+   return ret;
+   }
+
+   return 0;
+}
+
+static int
+sssnic_ethdev_promiscuous_enable(struct rte_eth_dev *ethdev)
+{
+   struct sssnic_netdev *netdev = SSSNIC_ETHDEV_PRIVATE(ethdev);
+   uint32_t rx_mode;
+   int ret;
+
+   rx_mode = netdev->rx_mode | SSSNIC_ETHDEV_RX_PROMISC;
+   ret = sssnic_ethdev_rx_mode_set(ethdev, rx_mode);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to set rx_mode: %x", rx_mode);
+   return ret;
+   }
+
+   return 0;
+}
+
+static int
+sssnic_ethdev_promiscuous_disable(struct rte_eth_dev *ethdev)
+{
+   struct sssnic_netdev *netdev = SSSNIC_ETHDEV_PRIVATE(ethdev);
+   uint32_t rx_mode;
+   int ret;
+
+   rx_mode = netdev->rx_mode & (~SSSNIC_ETHDEV_RX_PROMISC);
+   ret = sssnic_ethdev_rx_mode_set(ethdev, rx_mode);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to set rx_mode: %x", rx_mode);
+   return ret;
+   }
+
+   return 0;
+}
+
 static const struct eth_dev_ops sssnic_ethdev_ops = {
.dev_start = sssnic_ethdev_start,
.dev_stop = sssnic_ethdev_stop,
@@ -676,6 +744,10 @@ static const struct eth_dev_ops sssnic_ethdev_ops = {
.tx_queue_stop = sssnic_ethdev_tx_queue_stop,
.rx_queue_intr_enable = sssnic_ethdev_rx_queue_intr_enable,
.rx_queue_intr_disable = sssnic_ethdev_rx_queue_intr_disable,
+   .allmulticast_enable = sssnic_ethdev_allmulticast_enable,
+   .allmulticast_disable = sssnic_ethdev_allmulticast_disable,
+   .promiscuous_enable = sssnic_ethdev_promiscuous_enable,
+   .promiscuous_disable = sssnic_ethdev_promiscuous_disable,
 };
 
 static int
-- 
2.27.0



[PATCH v5 23/32] net/sssnic: support Rx packet burst

2023-09-03 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Fixed wrong format of printing uint64_t.
---
 doc/guides/nics/features/sssnic.ini   |   2 +
 drivers/net/sssnic/sssnic_ethdev.c|   2 +
 drivers/net/sssnic/sssnic_ethdev_rx.c | 167 ++
 drivers/net/sssnic/sssnic_ethdev_rx.h |   2 +
 4 files changed, 173 insertions(+)

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index aba0b78c95..320ac4533d 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -8,6 +8,8 @@ Link status  = Y
 Link status event= Y
 Queue start/stop = Y
 Rx interrupt = Y
+Scattered Rx = Y
+LRO  = Y
 Promiscuous mode = Y
 Allmulticast mode= Y
 Unicast MAC filter   = Y
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index 99e6d6152a..021fabcbe5 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -769,6 +769,8 @@ sssnic_ethdev_init(struct rte_eth_dev *ethdev)
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
return 0;
 
+   ethdev->rx_pkt_burst = sssnic_ethdev_rx_pkt_burst;
+
netdev = SSSNIC_ETHDEV_PRIVATE(ethdev);
pci_dev = RTE_ETH_DEV_TO_PCI(ethdev);
hw = rte_zmalloc("sssnic_hw", sizeof(struct sssnic_hw), 0);
diff --git a/drivers/net/sssnic/sssnic_ethdev_rx.c 
b/drivers/net/sssnic/sssnic_ethdev_rx.c
index 66045f7a98..82e65f2482 100644
--- a/drivers/net/sssnic/sssnic_ethdev_rx.c
+++ b/drivers/net/sssnic/sssnic_ethdev_rx.c
@@ -1183,3 +1183,170 @@ sssnic_ethdev_rx_queue_stats_clear(struct rte_eth_dev 
*ethdev, uint16_t qid)
memset(&rxq->stats, 0, sizeof(rxq->stats));
}
 };
+
+static inline void
+sssnic_ethdev_rx_csum_offload(struct sssnic_ethdev_rxq *rxq,
+   struct rte_mbuf *rxm, volatile struct sssnic_ethdev_rx_desc *rxd)
+{
+   /* no errors */
+   if (likely(rxd->status_err == 0)) {
+   rxm->ol_flags |= RTE_MBUF_F_RX_IP_CKSUM_GOOD |
+RTE_MBUF_F_RX_L4_CKSUM_GOOD;
+   return;
+   }
+
+   /* bypass hw crc error*/
+   if (unlikely(rxd->hw_crc_err)) {
+   rxm->ol_flags |= RTE_MBUF_F_RX_IP_CKSUM_UNKNOWN;
+   return;
+   }
+
+   if (rxd->ip_csum_err) {
+   rxm->ol_flags |= RTE_MBUF_F_RX_IP_CKSUM_BAD;
+   rxq->stats.csum_errors++;
+   }
+
+   if (rxd->tcp_csum_err || rxd->udp_csum_err || rxd->sctp_crc_err) {
+   rxm->ol_flags |= RTE_MBUF_F_RX_L4_CKSUM_BAD;
+   rxq->stats.csum_errors++;
+   }
+
+   if (unlikely(rxd->other_err))
+   rxq->stats.other_errors++;
+}
+
+static inline void
+sssnic_ethdev_rx_vlan_offload(struct rte_mbuf *rxm,
+   volatile struct sssnic_ethdev_rx_desc *rxd)
+{
+   if (rxd->vlan_en == 0 || rxd->vlan == 0) {
+   rxm->vlan_tci = 0;
+   return;
+   }
+
+   rxm->vlan_tci = rxd->vlan;
+   rxm->ol_flags |= RTE_MBUF_F_RX_VLAN | RTE_MBUF_F_RX_VLAN_STRIPPED;
+}
+
+static inline void
+sssnic_ethdev_rx_segments(struct sssnic_ethdev_rxq *rxq, struct rte_mbuf *head,
+   uint32_t remain_size)
+{
+   struct sssnic_ethdev_rx_entry *rxe;
+   struct rte_mbuf *curr, *prev = head;
+   uint16_t rx_buf_size = rxq->rx_buf_size;
+   uint16_t ci;
+   uint32_t rx_size;
+
+   while (remain_size > 0) {
+   ci = sssnic_ethdev_rxq_ci_get(rxq);
+   rxe = &rxq->rxe[ci];
+   curr = rxe->pktmbuf;
+
+   sssnic_ethdev_rxq_consume(rxq, 1);
+
+   rx_size = RTE_MIN(remain_size, rx_buf_size);
+   remain_size -= rx_size;
+
+   curr->data_len = rx_size;
+   curr->next = NULL;
+   prev->next = curr;
+   prev = curr;
+   head->nb_segs++;
+   }
+}
+
+uint16_t
+sssnic_ethdev_rx_pkt_burst(void *rx_queue, struct rte_mbuf **rx_pkts,
+   uint16_t nb_pkts)
+{
+   struct sssnic_ethdev_rxq *rxq = (struct sssnic_ethdev_rxq *)rx_queue;
+   struct sssnic_ethdev_rx_entry *rxe;
+   struct rte_mbuf *rxm;
+   struct sssnic_ethdev_rx_desc *rxd, rx_desc;
+   uint16_t ci, idle_entries;
+   uint16_t rx_buf_size;
+   uint32_t rx_size;
+   uint64_t nb_rx = 0;
+   uint64_t rx_bytes = 0;
+
+   ci = sssnic_ethdev_rxq_ci_get(rxq);
+   rx_buf_size = rxq->rx_buf_size;
+   rxd = &rx_desc;
+
+   while (nb_rx < nb_pkts) {
+   rxd->dword0 = __atomic_load_n(&rxq->desc[ci].dword0,
+   __ATOMIC_ACQUIRE);
+   /* check rx done */
+   if (!rxd->done)
+   break;
+
+   rxd->dword1 = rxq->desc[ci].dword1;
+   rxd->dword2 = rxq->desc[ci].dword2;
+   rxd->dword3 = rxq->desc[ci].dword3;
+
+   /* reset rx d

[PATCH v5 22/32] net/sssnic: add basic and extended stats ops

2023-09-03 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Removed error.h from including files.
---
 doc/guides/nics/features/sssnic.ini  |   3 +
 drivers/net/sssnic/base/sssnic_api.c | 154 +
 drivers/net/sssnic/base/sssnic_api.h | 116 +++
 drivers/net/sssnic/base/sssnic_cmd.h |  12 +
 drivers/net/sssnic/meson.build   |   1 +
 drivers/net/sssnic/sssnic_ethdev.c   |   6 +
 drivers/net/sssnic/sssnic_ethdev_rx.c|  30 ++
 drivers/net/sssnic/sssnic_ethdev_rx.h|   4 +
 drivers/net/sssnic/sssnic_ethdev_stats.c | 391 +++
 drivers/net/sssnic/sssnic_ethdev_stats.h |  18 ++
 drivers/net/sssnic/sssnic_ethdev_tx.c|  36 +++
 drivers/net/sssnic/sssnic_ethdev_tx.h|   4 +
 12 files changed, 775 insertions(+)
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_stats.c
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_stats.h

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index 359834ce4c..aba0b78c95 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -12,6 +12,9 @@ Promiscuous mode = Y
 Allmulticast mode= Y
 Unicast MAC filter   = Y
 Multicast MAC filter = Y
+Basic stats  = Y
+Extended stats   = Y
+Stats per queue  = Y
 Linux= Y
 ARMv8= Y
 x86-64   = Y
diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index 81020387bd..9f063112f2 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -1005,3 +1005,157 @@ sssnic_port_resource_clean(struct sssnic_hw *hw)
 
return 0;
 }
+
+int
+sssnic_port_stats_get(struct sssnic_hw *hw, struct sssnic_port_stats *stats)
+{
+   int ret;
+   struct sssnic_port_stats_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len, resp_len;
+   struct {
+   struct sssnic_cmd_common common;
+   uint32_t size;
+   uint32_t resvd0;
+   struct sssnic_port_stats stats;
+   uint64_t rsvd1[6];
+   } resp;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   cmd_len = sizeof(cmd);
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_GET_PORT_STATS_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   memset(&resp, 0, sizeof(resp));
+   resp_len = sizeof(resp);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&resp, &resp_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (resp_len == 0 || resp.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_GET_PORT_STATS_CMD, len=%u, 
status=%u",
+   resp_len, resp.common.status);
+   return -EIO;
+   }
+
+   memcpy(stats, &resp.stats, sizeof(resp.stats));
+
+   return 0;
+}
+
+int
+sssnic_port_stats_clear(struct sssnic_hw *hw)
+{
+   int ret;
+   struct sssnic_port_stats_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_CLEAR_PORT_STATS_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_CLEAN_PORT_RES_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
+
+int
+sssnic_mac_stats_get(struct sssnic_hw *hw, struct sssnic_mac_stats *stats)
+{
+   int ret;
+   struct sssnic_msg msg;
+   uint32_t cmd_len, resp_len;
+   struct sssnic_mac_stats_cmd cmd;
+   struct {
+   struct sssnic_cmd_common common;
+   struct sssnic_mac_stats stats;
+   uint64_t resvd[15];
+   } *resp;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.port = SSSNIC_PHY_PORT(hw);
+   cmd_len = sizeof(cmd);
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_GET_NETIF_MAC_STATS_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_NETIF_MODULE, SSSNIC_MSG_TYPE_REQ);
+
+   resp_len = sizeof(*resp);
+   resp = rte_zmalloc(NULL, resp_len, 0);
+   if (resp == NULL) {
+   PMD_DRV_LOG(ERR,
+   "Failed to alloc memory for mac stats response cmd");
+   return -ENOMEM;

[PATCH v5 24/32] net/sssnic: support Tx packet burst

2023-09-03 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Fixed wrong format of printing uint64_t.
---
 doc/guides/nics/features/sssnic.ini   |   5 +
 drivers/net/sssnic/sssnic_ethdev.c|   1 +
 drivers/net/sssnic/sssnic_ethdev_tx.c | 404 ++
 drivers/net/sssnic/sssnic_ethdev_tx.h |   2 +
 4 files changed, 412 insertions(+)

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index 320ac4533d..7e6b70684a 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -9,11 +9,16 @@ Link status event= Y
 Queue start/stop = Y
 Rx interrupt = Y
 Scattered Rx = Y
+TSO  = Y
 LRO  = Y
 Promiscuous mode = Y
 Allmulticast mode= Y
 Unicast MAC filter   = Y
 Multicast MAC filter = Y
+L3 checksum offload  = Y
+L4 checksum offload  = Y
+Inner L3 checksum= Y
+Inner L4 checksum= Y
 Basic stats  = Y
 Extended stats   = Y
 Stats per queue  = Y
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index 021fabcbe5..328fb85d30 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -770,6 +770,7 @@ sssnic_ethdev_init(struct rte_eth_dev *ethdev)
return 0;
 
ethdev->rx_pkt_burst = sssnic_ethdev_rx_pkt_burst;
+   ethdev->tx_pkt_burst = sssnic_ethdev_tx_pkt_burst;
 
netdev = SSSNIC_ETHDEV_PRIVATE(ethdev);
pci_dev = RTE_ETH_DEV_TO_PCI(ethdev);
diff --git a/drivers/net/sssnic/sssnic_ethdev_tx.c 
b/drivers/net/sssnic/sssnic_ethdev_tx.c
index d167e3f307..533befb6ea 100644
--- a/drivers/net/sssnic/sssnic_ethdev_tx.c
+++ b/drivers/net/sssnic/sssnic_ethdev_tx.c
@@ -171,6 +171,17 @@ enum sssnic_ethdev_txq_entry_type {
SSSNIC_ETHDEV_TXQ_ENTRY_EXTEND = 1,
 };
 
+struct sssnic_ethdev_tx_info {
+   /* offload enable flag */
+   uint16_t offload_en;
+   /*l4 payload offset*/
+   uint16_t payload_off;
+   /* number of txq entries */
+   uint16_t nb_entries;
+   /* number of tx segs */
+   uint16_t nb_segs;
+};
+
 #define SSSNIC_ETHDEV_TXQ_ENTRY_SZ_BITS 4
 #define SSSNIC_ETHDEV_TXQ_ENTRY_SZ (RTE_BIT32(SSSNIC_ETHDEV_TXQ_ENTRY_SZ_BITS))
 
@@ -182,12 +193,44 @@ enum sssnic_ethdev_txq_entry_type {
 #define SSSNIC_ETHDEV_TX_CI_DEF_COALESCING_TIME 16
 #define SSSNIC_ETHDEV_TX_CI_DEF_PENDING_TIME 4
 
+#define SSSNIC_ETHDEV_TX_CSUM_OFFLOAD_MASK 
\
+   (RTE_MBUF_F_TX_IP_CKSUM | RTE_MBUF_F_TX_TCP_CKSUM |\
+   RTE_MBUF_F_TX_UDP_CKSUM | RTE_MBUF_F_TX_SCTP_CKSUM |   \
+   RTE_MBUF_F_TX_OUTER_IP_CKSUM | RTE_MBUF_F_TX_TCP_SEG)
+
+#define SSSNIC_ETHDEV_TX_OFFLOAD_MASK  
\
+   (RTE_MBUF_F_TX_VLAN | SSSNIC_ETHDEV_TX_CSUM_OFFLOAD_MASK)
+
+#define SSSNIC_ETHDEV_TX_MAX_NUM_SEGS 38
+#define SSSNIC_ETHDEV_TX_MAX_SEG_SIZE 65535
+#define SSSNIC_ETHDEV_TX_MAX_PAYLOAD_OFF 221
+#define SSSNIC_ETHDEV_TX_DEF_MSS 0x3e00
+#define SSSNIC_ETHDEV_TX_MIN_MSS 0x50
+#define SSSNIC_ETHDEV_TX_COMPACT_SEG_MAX_SIZE 0x3fff
+
+#define SSSNIC_ETHDEV_TXQ_DESC_ENTRY(txq, idx) 
\
+   (SSSNIC_WORKQ_ENTRY_CAST((txq)->workq, idx,\
+   struct sssnic_ethdev_tx_desc))
+
+#define SSSNIC_ETHDEV_TXQ_OFFLOAD_ENTRY(txq, idx)  
\
+   SSSNIC_WORKQ_ENTRY_CAST((txq)->workq, idx, \
+   struct sssnic_ethdev_tx_offload)
+
+#define SSSNIC_ETHDEV_TXQ_SEG_ENTRY(txq, idx)  
\
+   SSSNIC_WORKQ_ENTRY_CAST((txq)->workq, idx, struct sssnic_ethdev_tx_seg)
+
 static inline uint16_t
 sssnic_ethdev_txq_num_used_entries(struct sssnic_ethdev_txq *txq)
 {
return sssnic_workq_num_used_entries(txq->workq);
 }
 
+static inline uint16_t
+sssnic_ethdev_txq_num_idle_entries(struct sssnic_ethdev_txq *txq)
+{
+   return sssnic_workq_num_idle_entries(txq->workq);
+}
+
 static inline uint16_t
 sssnic_ethdev_txq_ci_get(struct sssnic_ethdev_txq *txq)
 {
@@ -212,6 +255,12 @@ sssnic_ethdev_txq_consume(struct sssnic_ethdev_txq *txq, 
uint16_t num_entries)
sssnic_workq_consume_fast(txq->workq, num_entries);
 }
 
+static inline void
+sssnic_ethdev_txq_produce(struct sssnic_ethdev_txq *txq, uint16_t num_entries)
+{
+   sssnic_workq_produce_fast(txq->workq, num_entries);
+}
+
 int
 sssnic_ethdev_tx_queue_setup(struct rte_eth_dev *ethdev, uint16_t tx_queue_id,
uint16_t nb_tx_desc, unsigned int socket_id,
@@ -706,3 +755,358 @@ sssnic_ethdev_tx_queue_stats_clear(struct rte_eth_dev 
*ethdev, uint16_t qid)
*(stat++) = 0;
}
 }
+
+static inline uint16_t
+sssnic_ethdev_tx_payload_calc(struct rte_mbuf *tx_mbuf)
+{
+   if ((tx_mbuf->ol_flags & RTE_MBUF_F_TX_TUNNEL_MASK) != 0) {
+   uint64_t mask = RTE_MBU

[PATCH v5 30/32] net/sssnic: support VLAN offload and filter

2023-09-03 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 doc/guides/nics/features/sssnic.ini  |  2 +
 drivers/net/sssnic/base/sssnic_api.c | 34 +++
 drivers/net/sssnic/base/sssnic_api.h |  1 +
 drivers/net/sssnic/base/sssnic_cmd.h |  9 +++
 drivers/net/sssnic/sssnic_ethdev.c   | 87 
 5 files changed, 133 insertions(+)

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index 9bf05cb968..f5738ac934 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -19,6 +19,8 @@ RSS hash = Y
 RSS key update   = Y
 RSS reta update  = Y
 Inner RSS= Y
+VLAN filter  = Y
+VLAN offload = Y
 L3 checksum offload  = Y
 L4 checksum offload  = Y
 Inner L3 checksum= Y
diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index d91896cdd2..68c16c9c1e 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -1601,3 +1601,37 @@ sssnic_flow_ctrl_get(struct sssnic_hw *hw, bool 
*autoneg, bool *rx_en,
 
return 0;
 }
+
+int
+sssnic_vlan_filter_set(struct sssnic_hw *hw, uint16_t vid, bool add)
+{
+   int ret;
+   struct sssnic_vlan_filter_set_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   cmd.add = add ? 1 : 0;
+   cmd.vid = vid;
+   cmd_len = sizeof(cmd);
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_SET_PORT_VLAN_FILTER_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_SET_PORT_VLAN_FILTER_CMD, 
len=%u, status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
diff --git a/drivers/net/sssnic/base/sssnic_api.h 
b/drivers/net/sssnic/base/sssnic_api.h
index 36544a5dc3..28b235dda2 100644
--- a/drivers/net/sssnic/base/sssnic_api.h
+++ b/drivers/net/sssnic/base/sssnic_api.h
@@ -469,5 +469,6 @@ int sssnic_flow_ctrl_set(struct sssnic_hw *hw, bool 
autoneg, bool rx_en,
bool tx_en);
 int sssnic_flow_ctrl_get(struct sssnic_hw *hw, bool *autoneg, bool *rx_en,
bool *tx_en);
+int sssnic_vlan_filter_set(struct sssnic_hw *hw, uint16_t vid, bool add);
 
 #endif /* _SSSNIC_API_H_ */
diff --git a/drivers/net/sssnic/base/sssnic_cmd.h 
b/drivers/net/sssnic/base/sssnic_cmd.h
index d2054fad5a..3e70d0e223 100644
--- a/drivers/net/sssnic/base/sssnic_cmd.h
+++ b/drivers/net/sssnic/base/sssnic_cmd.h
@@ -425,4 +425,13 @@ struct sssnic_flow_ctrl_cmd {
uint8_t resvd1[5];
 };
 
+struct sssnic_vlan_filter_set_cmd {
+   struct sssnic_cmd_common common;
+   uint16_t function;
+   uint8_t add;
+   uint8_t resvd0;
+   uint16_t vid;
+   uint16_t resvd1;
+};
+
 #endif /* _SSSNIC_CMD_H_ */
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index 8999693027..8a1ccff70b 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -16,6 +16,7 @@
 #include "sssnic_ethdev_rss.h"
 
 static int sssnic_ethdev_init(struct rte_eth_dev *ethdev);
+static void sssnic_ethdev_vlan_filter_clean(struct rte_eth_dev *ethdev);
 
 static int
 sssnic_ethdev_infos_get(struct rte_eth_dev *ethdev,
@@ -340,6 +341,7 @@ sssnic_ethdev_release(struct rte_eth_dev *ethdev)
 {
struct sssnic_hw *hw = SSSNIC_ETHDEV_TO_HW(ethdev);
 
+   sssnic_ethdev_vlan_filter_clean(ethdev);
sssnic_ethdev_link_intr_disable(ethdev);
sssnic_ethdev_tx_queue_all_release(ethdev);
sssnic_ethdev_rx_queue_all_release(ethdev);
@@ -821,6 +823,89 @@ sssnic_ethdev_flow_ctrl_get(struct rte_eth_dev *ethdev,
return 0;
 }
 
+static int
+sssnic_ethdev_vlan_offload_set(struct rte_eth_dev *ethdev, int mask)
+{
+   struct sssnic_hw *hw = SSSNIC_ETHDEV_TO_HW(ethdev);
+   struct rte_eth_conf *dev_conf = ðdev->data->dev_conf;
+   uint8_t vlan_strip_en;
+   uint32_t vlan_filter_en;
+   int ret;
+
+   if (mask & RTE_ETH_VLAN_STRIP_MASK) {
+   if (dev_conf->rxmode.offloads & RTE_ETH_RX_OFFLOAD_VLAN_STRIP)
+   vlan_strip_en = 1;
+   else
+   vlan_strip_en = 0;
+
+   ret = sssnic_vlan_strip_enable_set(hw, vlan_strip_en);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to %s vlan strip offload",
+   vlan_strip_en ? "enable" : "disable");
+   return ret

[PATCH v5 25/32] net/sssnic: add RSS support

2023-09-03 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Removed error.h from including files.
---
 doc/guides/nics/features/sssnic.ini|   4 +
 drivers/net/sssnic/base/sssnic_api.c   | 338 ++
 drivers/net/sssnic/base/sssnic_api.h   |  36 +++
 drivers/net/sssnic/base/sssnic_cmd.h   |  58 
 drivers/net/sssnic/meson.build |   1 +
 drivers/net/sssnic/sssnic_ethdev.c |  16 ++
 drivers/net/sssnic/sssnic_ethdev.h |   2 +
 drivers/net/sssnic/sssnic_ethdev_rss.c | 377 +
 drivers/net/sssnic/sssnic_ethdev_rss.h |  20 ++
 drivers/net/sssnic/sssnic_ethdev_rx.c  |  13 +
 10 files changed, 865 insertions(+)
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_rss.c
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_rss.h

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index 7e6b70684a..020a9e7056 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -15,6 +15,10 @@ Promiscuous mode = Y
 Allmulticast mode= Y
 Unicast MAC filter   = Y
 Multicast MAC filter = Y
+RSS hash = Y
+RSS key update   = Y
+RSS reta update  = Y
+Inner RSS= Y
 L3 checksum offload  = Y
 L4 checksum offload  = Y
 Inner L3 checksum= Y
diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index 9f063112f2..32b24e841c 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -1159,3 +1159,341 @@ sssnic_mac_stats_clear(struct sssnic_hw *hw)
 
return 0;
 }
+
+int
+sssnic_rss_enable_set(struct sssnic_hw *hw, bool state)
+{
+   int ret;
+   struct sssnic_rss_enable_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.state = state ? 1 : 0;
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   cmd_len = sizeof(cmd);
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len, SSSNIC_ENABLE_RSS_CMD,
+   SSSNIC_MPU_FUNC_IDX, SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_ENABLE_RSS_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
+
+static int
+sssnic_rss_profile_config(struct sssnic_hw *hw, bool new)
+{
+   int ret;
+   struct sssnic_rss_profile_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.opcode = new ? SSSNIC_RSS_PROFILE_CMD_OP_NEW :
+SSSNIC_RSS_PROFILE_CMD_OP_DEL;
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   cmd_len = sizeof(cmd);
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len, SSSNIC_RSS_PROFILE_CMD,
+   SSSNIC_MPU_FUNC_IDX, SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_RSS_PROFILE_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
+
+int
+sssnic_rss_profile_create(struct sssnic_hw *hw)
+{
+   return sssnic_rss_profile_config(hw, true);
+}
+
+int
+sssnic_rss_profile_destroy(struct sssnic_hw *hw)
+{
+   return sssnic_rss_profile_config(hw, false);
+}
+
+int
+sssnic_rss_hash_key_set(struct sssnic_hw *hw, uint8_t *key, uint16_t len)
+{
+   int ret;
+   struct sssnic_rss_hash_key_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   if (len > sizeof(cmd.key)) {
+   PMD_DRV_LOG(ERR, "Invalid rss hash key length: %u", len);
+   return -EINVAL;
+   }
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.opcode = SSSNIC_CMD_OPCODE_SET;
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   rte_memcpy(cmd.key, key, len);
+   cmd_len = sizeof(cmd);
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len, SSSNIC_RSS_HASH_KEY_CMD,
+   SSSNIC_MPU_FUNC_IDX, SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Ba

[PATCH v5 29/32] net/sssnic: add dev flow control ops

2023-09-03 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 doc/guides/nics/features/sssnic.ini  |  1 +
 drivers/net/sssnic/base/sssnic_api.c | 68 
 drivers/net/sssnic/base/sssnic_api.h |  4 ++
 drivers/net/sssnic/base/sssnic_cmd.h | 11 +
 drivers/net/sssnic/sssnic_ethdev.c   | 65 ++
 5 files changed, 149 insertions(+)

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index a40b509558..9bf05cb968 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -26,6 +26,7 @@ Inner L4 checksum= Y
 Basic stats  = Y
 Extended stats   = Y
 Stats per queue  = Y
+Flow control = P
 FW version   = Y
 Linux= Y
 ARMv8= Y
diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index 12aca16995..d91896cdd2 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -1533,3 +1533,71 @@ sssnic_fw_version_get(struct sssnic_hw *hw, struct 
sssnic_fw_version *version)
 
return 0;
 }
+
+int
+sssnic_flow_ctrl_set(struct sssnic_hw *hw, bool autoneg, bool rx_en, bool 
tx_en)
+{
+   int ret;
+   struct sssnic_msg msg;
+   struct sssnic_flow_ctrl_cmd cmd;
+   uint32_t cmdlen = sizeof(cmd);
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.auto_neg = autoneg ? 1 : 0;
+   cmd.rx_en = rx_en ? 1 : 0;
+   cmd.tx_en = tx_en ? 1 : 0;
+   cmd.opcode = SSSNIC_CMD_OPCODE_SET;
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmdlen,
+   SSSNIC_PORT_FLOW_CTRL_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmdlen, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmdlen == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_PORT_FLOW_CTRL_CMD, len=%u, 
status=%u",
+   cmdlen, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
+
+int
+sssnic_flow_ctrl_get(struct sssnic_hw *hw, bool *autoneg, bool *rx_en,
+   bool *tx_en)
+{
+   int ret;
+   struct sssnic_msg msg;
+   struct sssnic_flow_ctrl_cmd cmd;
+   uint32_t cmdlen = sizeof(cmd);
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.opcode = SSSNIC_CMD_OPCODE_GET;
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmdlen,
+   SSSNIC_PORT_FLOW_CTRL_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmdlen, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmdlen == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_PORT_FLOW_CTRL_CMD, len=%u, 
status=%u",
+   cmdlen, cmd.common.status);
+   return -EIO;
+   }
+
+   *autoneg = cmd.auto_neg;
+   *rx_en = cmd.rx_en;
+   *tx_en = cmd.tx_en;
+
+   return 0;
+}
diff --git a/drivers/net/sssnic/base/sssnic_api.h 
b/drivers/net/sssnic/base/sssnic_api.h
index bd4f01d388..36544a5dc3 100644
--- a/drivers/net/sssnic/base/sssnic_api.h
+++ b/drivers/net/sssnic/base/sssnic_api.h
@@ -465,5 +465,9 @@ int sssnic_rss_indir_table_get(struct sssnic_hw *hw, 
uint16_t *entry,
uint32_t num_entries);
 int sssnic_fw_version_get(struct sssnic_hw *hw,
struct sssnic_fw_version *version);
+int sssnic_flow_ctrl_set(struct sssnic_hw *hw, bool autoneg, bool rx_en,
+   bool tx_en);
+int sssnic_flow_ctrl_get(struct sssnic_hw *hw, bool *autoneg, bool *rx_en,
+   bool *tx_en);
 
 #endif /* _SSSNIC_API_H_ */
diff --git a/drivers/net/sssnic/base/sssnic_cmd.h 
b/drivers/net/sssnic/base/sssnic_cmd.h
index 9da07770b1..d2054fad5a 100644
--- a/drivers/net/sssnic/base/sssnic_cmd.h
+++ b/drivers/net/sssnic/base/sssnic_cmd.h
@@ -414,4 +414,15 @@ struct sssnic_fw_version_get_cmd {
uint8_t time[20];
 };
 
+struct sssnic_flow_ctrl_cmd {
+   struct sssnic_cmd_common common;
+   uint8_t port;
+   uint8_t opcode;
+   uint16_t resvd0;
+   uint8_t auto_neg;
+   uint8_t rx_en;
+   uint8_t tx_en;
+   uint8_t resvd1[5];
+};
+
 #endif /* _SSSNIC_CMD_H_ */
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index cceaa5c8be..8999693027 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -758,6 +758,69 @@ sssnic_ethdev_fw_version_get(struct rte_eth_dev *ethdev, 
char *fw_version,
return 0;
 }
 
+static int
+sssnic_ethdev_flow_ctrl_set(struct rte_eth_dev *ethdev,
+   struct rte_eth_fc_c

[PATCH v5 27/32] net/sssnic: support dev queue info get

2023-09-03 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/sssnic_ethdev.c|  2 ++
 drivers/net/sssnic/sssnic_ethdev_rx.c | 13 +
 drivers/net/sssnic/sssnic_ethdev_rx.h |  2 ++
 drivers/net/sssnic/sssnic_ethdev_tx.c | 11 +++
 drivers/net/sssnic/sssnic_ethdev_tx.h |  2 ++
 5 files changed, 30 insertions(+)

diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index b086e91d2d..bde8d89ddc 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -777,6 +777,8 @@ static const struct eth_dev_ops sssnic_ethdev_ops = {
.reta_update = sssnic_ethdev_rss_reta_update,
.reta_query = sssnic_ethdev_rss_reta_query,
.mtu_set = sssnic_ethdev_mtu_set,
+   .rxq_info_get = sssnic_ethdev_rx_queue_info_get,
+   .txq_info_get = sssnic_ethdev_tx_queue_info_get,
 };
 
 static int
diff --git a/drivers/net/sssnic/sssnic_ethdev_rx.c 
b/drivers/net/sssnic/sssnic_ethdev_rx.c
index 2874a93a54..6c5f209262 100644
--- a/drivers/net/sssnic/sssnic_ethdev_rx.c
+++ b/drivers/net/sssnic/sssnic_ethdev_rx.c
@@ -1363,3 +1363,16 @@ sssnic_ethdev_rx_pkt_burst(void *rx_queue, struct 
rte_mbuf **rx_pkts,
 
return nb_rx;
 }
+
+void
+sssnic_ethdev_rx_queue_info_get(struct rte_eth_dev *ethdev,
+   uint16_t rx_queue_id, struct rte_eth_rxq_info *qinfo)
+{
+   struct sssnic_ethdev_rxq *rxq = ethdev->data->rx_queues[rx_queue_id];
+
+   qinfo->rx_buf_size = rxq->rx_buf_size;
+   qinfo->nb_desc = rxq->depth;
+   qinfo->queue_state = ethdev->data->rx_queue_state[rx_queue_id];
+   qinfo->mp = rxq->mp;
+   qinfo->conf.rx_free_thresh = rxq->rx_free_thresh;
+}
diff --git a/drivers/net/sssnic/sssnic_ethdev_rx.h 
b/drivers/net/sssnic/sssnic_ethdev_rx.h
index b0b35dee73..20e4d1ac0e 100644
--- a/drivers/net/sssnic/sssnic_ethdev_rx.h
+++ b/drivers/net/sssnic/sssnic_ethdev_rx.h
@@ -44,5 +44,7 @@ void sssnic_ethdev_rx_queue_stats_clear(struct rte_eth_dev 
*ethdev,
uint16_t qid);
 uint16_t sssnic_ethdev_rx_pkt_burst(void *rx_queue, struct rte_mbuf **rx_pkts,
uint16_t nb_pkts);
+void sssnic_ethdev_rx_queue_info_get(struct rte_eth_dev *ethdev,
+   uint16_t rx_queue_id, struct rte_eth_rxq_info *qinfo);
 
 #endif
diff --git a/drivers/net/sssnic/sssnic_ethdev_tx.c 
b/drivers/net/sssnic/sssnic_ethdev_tx.c
index 533befb6ea..51931df645 100644
--- a/drivers/net/sssnic/sssnic_ethdev_tx.c
+++ b/drivers/net/sssnic/sssnic_ethdev_tx.c
@@ -1110,3 +1110,14 @@ sssnic_ethdev_tx_pkt_burst(void *tx_queue, struct 
rte_mbuf **tx_pkts,
 
return nb_tx;
 }
+
+void
+sssnic_ethdev_tx_queue_info_get(struct rte_eth_dev *ethdev,
+   uint16_t tx_queue_id, struct rte_eth_txq_info *qinfo)
+{
+   struct sssnic_ethdev_txq *txq = ethdev->data->tx_queues[tx_queue_id];
+
+   qinfo->nb_desc = txq->depth;
+   qinfo->queue_state = ethdev->data->tx_queue_state[tx_queue_id];
+   qinfo->conf.tx_free_thresh = txq->tx_free_thresh;
+}
diff --git a/drivers/net/sssnic/sssnic_ethdev_tx.h 
b/drivers/net/sssnic/sssnic_ethdev_tx.h
index 3a7cd47080..6130ade4d1 100644
--- a/drivers/net/sssnic/sssnic_ethdev_tx.h
+++ b/drivers/net/sssnic/sssnic_ethdev_tx.h
@@ -39,5 +39,7 @@ void sssnic_ethdev_tx_queue_stats_clear(struct rte_eth_dev 
*ethdev,
uint16_t qid);
 uint16_t sssnic_ethdev_tx_pkt_burst(void *tx_queue, struct rte_mbuf **tx_pkts,
uint16_t nb_pkts);
+void sssnic_ethdev_tx_queue_info_get(struct rte_eth_dev *ethdev,
+   uint16_t tx_queue_id, struct rte_eth_txq_info *qinfo);
 
 #endif /* _SSSNIC_ETHDEV_TX_H_ */
-- 
2.27.0



[PATCH v5 28/32] net/sssnic: support dev firmware version get

2023-09-03 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 doc/guides/nics/features/sssnic.ini  |  1 +
 drivers/net/sssnic/base/sssnic_api.c | 36 
 drivers/net/sssnic/base/sssnic_api.h |  9 +++
 drivers/net/sssnic/base/sssnic_cmd.h |  8 +++
 drivers/net/sssnic/sssnic_ethdev.c   | 20 
 5 files changed, 74 insertions(+)

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index 020a9e7056..a40b509558 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -26,6 +26,7 @@ Inner L4 checksum= Y
 Basic stats  = Y
 Extended stats   = Y
 Stats per queue  = Y
+FW version   = Y
 Linux= Y
 ARMv8= Y
 x86-64   = Y
diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index 32b24e841c..12aca16995 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -1497,3 +1497,39 @@ sssnic_rss_indir_table_get(struct sssnic_hw *hw, 
uint16_t *entry,
sssnic_ctrlq_cmd_destroy(hw, cmd);
return ret;
 }
+
+int
+sssnic_fw_version_get(struct sssnic_hw *hw, struct sssnic_fw_version *version)
+{
+   int ret;
+   struct sssnic_msg msg;
+   struct sssnic_fw_version_get_cmd cmd;
+   uint32_t cmdlen = sizeof(cmd);
+   int len;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.type = 1; /* get MPU firmware version */
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmdlen,
+   SSSNIC_GET_FW_VERSION_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_COMM_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmdlen, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmdlen == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_GET_FW_VERSION_CMD, len=%u, 
status=%u",
+   cmdlen, cmd.common.status);
+   return -EIO;
+   }
+
+   len = RTE_MIN(sizeof(version->version), sizeof(cmd.version));
+   rte_memcpy(version->version, cmd.version, len);
+   len = RTE_MIN(sizeof(version->time), sizeof(cmd.time));
+   rte_memcpy(version->time, cmd.time, len);
+
+   return 0;
+}
diff --git a/drivers/net/sssnic/base/sssnic_api.h 
b/drivers/net/sssnic/base/sssnic_api.h
index 1d80b93e38..bd4f01d388 100644
--- a/drivers/net/sssnic/base/sssnic_api.h
+++ b/drivers/net/sssnic/base/sssnic_api.h
@@ -402,6 +402,13 @@ enum sssnic_rss_hash_engine_type {
SSSNIC_RSS_HASH_ENGINE_COUNT,
 };
 
+#define SSSNIC_FW_VERSION_LEN 16
+#define SSSNIC_FW_TIME_LEN 20
+struct sssnic_fw_version {
+   char version[SSSNIC_FW_VERSION_LEN];
+   char time[SSSNIC_FW_VERSION_LEN];
+};
+
 int sssnic_msix_attr_get(struct sssnic_hw *hw, uint16_t msix_idx,
struct sssnic_msix_attr *attr);
 int sssnic_msix_attr_set(struct sssnic_hw *hw, uint16_t msix_idx,
@@ -456,5 +463,7 @@ int sssnic_rss_indir_table_set(struct sssnic_hw *hw, const 
uint16_t *entry,
uint32_t num_entries);
 int sssnic_rss_indir_table_get(struct sssnic_hw *hw, uint16_t *entry,
uint32_t num_entries);
+int sssnic_fw_version_get(struct sssnic_hw *hw,
+   struct sssnic_fw_version *version);
 
 #endif /* _SSSNIC_API_H_ */
diff --git a/drivers/net/sssnic/base/sssnic_cmd.h 
b/drivers/net/sssnic/base/sssnic_cmd.h
index 56818471b6..9da07770b1 100644
--- a/drivers/net/sssnic/base/sssnic_cmd.h
+++ b/drivers/net/sssnic/base/sssnic_cmd.h
@@ -406,4 +406,12 @@ struct sssnic_rss_indir_table_cmd {
uint16_t entry[256];
 };
 
+struct sssnic_fw_version_get_cmd {
+   struct sssnic_cmd_common common;
+   uint16_t type;
+   uint16_t resvd;
+   uint8_t version[16];
+   uint8_t time[20];
+};
+
 #endif /* _SSSNIC_CMD_H_ */
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index bde8d89ddc..cceaa5c8be 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -739,6 +739,25 @@ sssnic_ethdev_mtu_set(struct rte_eth_dev *ethdev, uint16_t 
mtu)
return sssnic_ethdev_tx_max_size_set(ethdev, mtu);
 }
 
+static int
+sssnic_ethdev_fw_version_get(struct rte_eth_dev *ethdev, char *fw_version,
+   size_t fw_size)
+{
+   struct sssnic_hw *hw = SSSNIC_ETHDEV_TO_HW(ethdev);
+   struct sssnic_fw_version version;
+   int ret;
+
+   ret = sssnic_fw_version_get(hw, &version);
+   if (ret) {
+   PMD_DRV_LOG(ERR, "Failed to get firmware version");
+   return ret;
+   }
+
+   snprintf(fw_version, fw_size, "%s", version.version);
+
+   return 0;
+}
+
 static const struct eth_dev_ops sssnic_ethdev_ops = {
.dev_start = sssnic_ethdev_start,
.dev_stop = sssnic_ethdev_stop,
@@ -779,6 +

[PATCH v5 32/32] net/sssnic: add VF dev support

2023-09-03 Thread wanry
From: Renyong Wan 

In comparison to PF, VF PMD does not support the following features:

1. link up and link down set
2. promiscuous enable and disable
3. MAC stats in extend xstats

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/base/sssnic_api.c | 42 +
 drivers/net/sssnic/base/sssnic_api.h |  2 +
 drivers/net/sssnic/base/sssnic_cmd.h |  6 +++
 drivers/net/sssnic/base/sssnic_hw.c  | 19 ++--
 drivers/net/sssnic/base/sssnic_hw.h  |  4 ++
 drivers/net/sssnic/sssnic_ethdev.c   | 60 +++-
 drivers/net/sssnic/sssnic_ethdev_stats.c | 29 ++--
 7 files changed, 153 insertions(+), 9 deletions(-)

diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index 0e965442fd..2d829bc884 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -1899,3 +1899,45 @@ sssnic_tcam_entry_del(struct sssnic_hw *hw, uint32_t 
entry_idx)
 
return 0;
 }
+
+static int
+sssnic_vf_port_register_op(struct sssnic_hw *hw, bool op)
+{
+   int ret;
+   struct sssnic_vf_port_register_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd.op = op ? 1 : 0;
+   cmd_len = sizeof(cmd);
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_REGISTER_VF_PORT_CMD, SSSNIC_PF_FUNC_IDX(hw),
+   SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_REGISTER_VF_PORT_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
+
+int
+sssnic_vf_port_register(struct sssnic_hw *hw)
+{
+   return sssnic_vf_port_register_op(hw, true);
+}
+
+int
+sssnic_vf_port_unregister(struct sssnic_hw *hw)
+{
+   return sssnic_vf_port_register_op(hw, false);
+}
diff --git a/drivers/net/sssnic/base/sssnic_api.h 
b/drivers/net/sssnic/base/sssnic_api.h
index 7a02ec61ee..2506682821 100644
--- a/drivers/net/sssnic/base/sssnic_api.h
+++ b/drivers/net/sssnic/base/sssnic_api.h
@@ -492,5 +492,7 @@ int sssnic_tcam_packet_type_filter_set(struct sssnic_hw 
*hw, uint8_t ptype,
 int sssnic_tcam_entry_add(struct sssnic_hw *hw,
struct sssnic_tcam_entry *entry);
 int sssnic_tcam_entry_del(struct sssnic_hw *hw, uint32_t entry_idx);
+int sssnic_vf_port_register(struct sssnic_hw *hw);
+int sssnic_vf_port_unregister(struct sssnic_hw *hw);
 
 #endif /* _SSSNIC_API_H_ */
diff --git a/drivers/net/sssnic/base/sssnic_cmd.h 
b/drivers/net/sssnic/base/sssnic_cmd.h
index c75cb0dad3..058ab298f3 100644
--- a/drivers/net/sssnic/base/sssnic_cmd.h
+++ b/drivers/net/sssnic/base/sssnic_cmd.h
@@ -505,4 +505,10 @@ struct sssnic_tcam_entry_del_cmd {
uint32_t num; /* number of entries to be deleted */
 };
 
+struct sssnic_vf_port_register_cmd {
+   struct sssnic_cmd_common common;
+   uint8_t op; /* 0: unregister, 1: register */
+   uint8_t resvd[39];
+};
+
 #endif /* _SSSNIC_CMD_H_ */
diff --git a/drivers/net/sssnic/base/sssnic_hw.c 
b/drivers/net/sssnic/base/sssnic_hw.c
index 651a0aa7ef..0edd5b9508 100644
--- a/drivers/net/sssnic/base/sssnic_hw.c
+++ b/drivers/net/sssnic/base/sssnic_hw.c
@@ -345,10 +345,16 @@ sssnic_base_init(struct sssnic_hw *hw)
pci_dev = hw->pci_dev;
 
/* get base addresses of hw registers */
-   hw->cfg_base_addr =
-   (uint8_t *)pci_dev->mem_resource[SSSNIC_PCI_BAR_CFG].addr;
-   hw->mgmt_base_addr =
-   (uint8_t *)pci_dev->mem_resource[SSSNIC_PCI_BAR_MGMT].addr;
+   if (pci_dev->id.device_id == SSSNIC_VF_DEVICE_ID) {
+   uint8_t *addr =
+   (uint8_t 
*)pci_dev->mem_resource[SSSNIC_VF_PCI_BAR_CFG].addr;
+   hw->cfg_base_addr = addr + SSSNIC_VF_CFG_ADDR_OFFSET;
+   } else {
+   hw->cfg_base_addr =
+   (uint8_t 
*)pci_dev->mem_resource[SSSNIC_PCI_BAR_CFG].addr;
+   hw->mgmt_base_addr =
+   (uint8_t 
*)pci_dev->mem_resource[SSSNIC_PCI_BAR_MGMT].addr;
+   }
hw->db_base_addr =
(uint8_t *)pci_dev->mem_resource[SSSNIC_PCI_BAR_DB].addr;
hw->db_mem_len =
@@ -365,7 +371,10 @@ sssnic_base_init(struct sssnic_hw *hw)
PMD_DRV_LOG(ERR, "Doorbell is not enabled!");
return -EBUSY;
}
-   sssnic_af_setup(hw);
+
+   if (SSSNIC_FUNC_TYPE(hw) != SSSNIC_FUNC_TYPE_VF)
+   sssnic_af_setup(hw);
+
sssnic_msix_all_disable(hw);
sssnic_pf_status_set(hw, SSSNIC_PF_STATUS_INIT);
 
diff --git a/drivers/net/sssnic/base

[PATCH v5 31/32] net/sssnic: add generic flow ops

2023-09-03 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
v2:
* Fixed 'mask->hdr.src_addr' will always evaluate to 'true'.
* Removed error.h from including files.
---
 doc/guides/nics/features/sssnic.ini |   12 +
 drivers/net/sssnic/base/sssnic_api.c|  264 ++
 drivers/net/sssnic/base/sssnic_api.h|   22 +
 drivers/net/sssnic/base/sssnic_cmd.h|   71 ++
 drivers/net/sssnic/base/sssnic_hw.h |3 +
 drivers/net/sssnic/base/sssnic_misc.h   |7 +
 drivers/net/sssnic/meson.build  |2 +
 drivers/net/sssnic/sssnic_ethdev.c  |   12 +
 drivers/net/sssnic/sssnic_ethdev.h  |1 +
 drivers/net/sssnic/sssnic_ethdev_fdir.c | 1017 +++
 drivers/net/sssnic/sssnic_ethdev_fdir.h |  332 
 drivers/net/sssnic/sssnic_ethdev_flow.c |  981 ++
 drivers/net/sssnic/sssnic_ethdev_flow.h |   11 +
 drivers/net/sssnic/sssnic_ethdev_rx.c   |   18 +
 14 files changed, 2753 insertions(+)
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_fdir.c
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_fdir.h
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_flow.c
 create mode 100644 drivers/net/sssnic/sssnic_ethdev_flow.h

diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
index f5738ac934..57e7440d86 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -33,3 +33,15 @@ FW version   = Y
 Linux= Y
 ARMv8= Y
 x86-64   = Y
+
+[rte_flow items]
+any  = Y
+eth  = Y
+ipv4 = Y
+ipv6 = Y
+tcp  = Y
+udp  = Y
+vxlan= Y
+
+[rte_flow actions]
+queue= Y
diff --git a/drivers/net/sssnic/base/sssnic_api.c 
b/drivers/net/sssnic/base/sssnic_api.c
index 68c16c9c1e..0e965442fd 100644
--- a/drivers/net/sssnic/base/sssnic_api.c
+++ b/drivers/net/sssnic/base/sssnic_api.c
@@ -1635,3 +1635,267 @@ sssnic_vlan_filter_set(struct sssnic_hw *hw, uint16_t 
vid, bool add)
 
return 0;
 }
+
+int
+sssnic_tcam_enable_set(struct sssnic_hw *hw, bool enabled)
+{
+   struct sssnic_tcam_enable_set_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+   int ret;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd_len = sizeof(cmd);
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+   cmd.enabled = enabled ? 1 : 0;
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len,
+   SSSNIC_SET_TCAM_ENABLE_CMD, SSSNIC_MPU_FUNC_IDX,
+   SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   if (cmd.common.status == SSSNIC_TCAM_CMD_STATUS_UNSUPPORTED)
+   PMD_DRV_LOG(WARNING,
+   "SSSNIC_SET_TCAM_ENABLED_CMD is unsupported");
+   else
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_SET_TCAM_ENABLE_CMD, 
len=%u, status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+
+   return 0;
+}
+
+int
+sssnic_tcam_flush(struct sssnic_hw *hw)
+{
+   struct sssnic_tcam_flush_cmd cmd;
+   struct sssnic_msg msg;
+   uint32_t cmd_len;
+   int ret;
+
+   memset(&cmd, 0, sizeof(cmd));
+   cmd_len = sizeof(cmd);
+   cmd.function = SSSNIC_FUNC_IDX(hw);
+
+   sssnic_msg_init(&msg, (uint8_t *)&cmd, cmd_len, SSSNIC_FLUSH_TCAM_CMD,
+   SSSNIC_MPU_FUNC_IDX, SSSNIC_LAN_MODULE, SSSNIC_MSG_TYPE_REQ);
+   ret = sssnic_mbox_send(hw, &msg, (uint8_t *)&cmd, &cmd_len, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to send mbox message, ret=%d", ret);
+   return ret;
+   }
+
+   if (cmd_len == 0 || cmd.common.status != 0) {
+   if (cmd.common.status == SSSNIC_TCAM_CMD_STATUS_UNSUPPORTED)
+   PMD_DRV_LOG(WARNING,
+   "SSSNIC_FLUSH_TCAM_CMD is unsupported");
+   else
+   PMD_DRV_LOG(ERR,
+   "Bad response to SSSNIC_FLUSH_TCAM_CMD, len=%u, 
status=%u",
+   cmd_len, cmd.common.status);
+   return -EIO;
+   }
+   return 0;
+}
+
+int
+sssnic_tcam_disable_and_flush(struct sssnic_hw *hw)
+{
+   int ret;
+
+   ret = sssnic_tcam_enable_set(hw, 0);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Could not disable TCAM");
+   return ret;
+   }
+
+   ret = sssnic_tcam_flush(hw);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Could not flush TCAM");
+   return ret;
+   }
+

[PATCH v5 26/32] net/sssnic: support dev MTU set

2023-09-03 Thread wanry
From: Renyong Wan 

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/sssnic_ethdev.c | 7 +++
 1 file changed, 7 insertions(+)

diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index a00e96bebe..b086e91d2d 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -733,6 +733,12 @@ sssnic_ethdev_promiscuous_disable(struct rte_eth_dev 
*ethdev)
return 0;
 }
 
+static int
+sssnic_ethdev_mtu_set(struct rte_eth_dev *ethdev, uint16_t mtu)
+{
+   return sssnic_ethdev_tx_max_size_set(ethdev, mtu);
+}
+
 static const struct eth_dev_ops sssnic_ethdev_ops = {
.dev_start = sssnic_ethdev_start,
.dev_stop = sssnic_ethdev_stop,
@@ -770,6 +776,7 @@ static const struct eth_dev_ops sssnic_ethdev_ops = {
.rss_hash_update = sssnic_ethdev_rss_hash_update,
.reta_update = sssnic_ethdev_rss_reta_update,
.reta_query = sssnic_ethdev_rss_reta_query,
+   .mtu_set = sssnic_ethdev_mtu_set,
 };
 
 static int
-- 
2.27.0



[PATCH 01/32] net/sssnic: add build and doc infrastructure

2023-08-29 Thread wanry
From: Renyong Wan 

Adding minimum PMD code, doc and build infrastructure for sssnic.

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 .mailmap|  5 +-
 MAINTAINERS |  8 
 doc/guides/nics/features/sssnic.ini |  9 
 doc/guides/nics/index.rst   |  1 +
 doc/guides/nics/sssnic.rst  | 73 +
 drivers/net/meson.build |  1 +
 drivers/net/sssnic/meson.build  | 18 +++
 drivers/net/sssnic/sssnic_ethdev.c  | 29 
 8 files changed, 141 insertions(+), 3 deletions(-)
 create mode 100644 doc/guides/nics/features/sssnic.ini
 create mode 100644 doc/guides/nics/sssnic.rst
 create mode 100644 drivers/net/sssnic/meson.build
 create mode 100644 drivers/net/sssnic/sssnic_ethdev.c

diff --git a/.mailmap b/.mailmap
index 864d33ee46..6fa73d3b79 100644
--- a/.mailmap
+++ b/.mailmap
@@ -151,7 +151,6 @@ Bao-Long Tran 
 Bar Neuman 
 Barak Enat 
 Barry Cao 
-Bartosz Staszewski 
 Baruch Siach 
 Bassam Zaid AlKilani 
 Beilei Xing 
@@ -496,7 +495,6 @@ Helin Zhang 
 Hemant Agrawal  
 Heng Ding 
 Hengjian Zhang 
-Heng Jiang 
 Heng Wang 
 Henning Schild 
 Henry Cai 
@@ -630,7 +628,6 @@ Jie Liu 
 Jie Pan 
 Jie Wang 
 Jie Zhou  
-Jieqiang Wang 
 Jijiang Liu 
 Jilei Chen 
 Jim Harris 
@@ -1156,6 +1153,7 @@ Rebecca Troy 
 Remi Pommarel 
 Remy Horton 
 Renata Saiakhova 
+Renyong Wan 
 Reshma Pattan  
 Ricardo Roldan 
 Ricardo Salveti 
@@ -1329,6 +1327,7 @@ Stephen Hurd  

 Steve Capper 
 Steven Lariau 
 Steven Luong 
+Steven Song 
 Steven Webster 
 Steven Zou 
 Steve Rempe 
diff --git a/MAINTAINERS b/MAINTAINERS
index a926155f26..1e57d29aa3 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -633,6 +633,13 @@ F: drivers/net/af_xdp/
 F: doc/guides/nics/af_xdp.rst
 F: doc/guides/nics/features/af_xdp.ini
 
+3SNIC sssnic
+M: Renyong Wan 
+M: Steven Song 
+F: driver/net/sssnic/
+F: doc/guides/nics/sssnic.rst
+F: doc/guides/nics/features/sssnic.ini
+
 Amazon ENA
 M: Michal Krawczyk 
 M: Shai Brandes 
@@ -1793,6 +1800,7 @@ F: doc/guides/tools/img/eventdev_*
 F: app/test/test_event_ring.c
 
 Procinfo tool
+M: Maryam Tahhan 
 M: Reshma Pattan 
 F: app/proc-info/
 F: doc/guides/tools/proc_info.rst
diff --git a/doc/guides/nics/features/sssnic.ini 
b/doc/guides/nics/features/sssnic.ini
new file mode 100644
index 00..6d9786db7e
--- /dev/null
+++ b/doc/guides/nics/features/sssnic.ini
@@ -0,0 +1,9 @@
+;
+; Supported features of the 'sssnic' network poll mode driver.
+;
+; Refer to default.ini for the full list of available PMD features.
+;
+[Features]
+Linux= Y
+ARMv8= Y
+x86-64   = Y
diff --git a/doc/guides/nics/index.rst b/doc/guides/nics/index.rst
index 7bfcac880f..9d2b29383b 100644
--- a/doc/guides/nics/index.rst
+++ b/doc/guides/nics/index.rst
@@ -61,6 +61,7 @@ Network Interface Controller Drivers
 qede
 sfc_efx
 softnic
+sssnic
 tap
 thunderx
 txgbe
diff --git a/doc/guides/nics/sssnic.rst b/doc/guides/nics/sssnic.rst
new file mode 100644
index 00..d6ebdd49e8
--- /dev/null
+++ b/doc/guides/nics/sssnic.rst
@@ -0,0 +1,73 @@
+..  SPDX-License-Identifier: BSD-3-Clause
+Copyright(c) 2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+
+SSSNIC Poll Mode Driver
+=
+
+The sssnic PMD (**librte_pmd_sssnic**) provides poll mode driver support
+for 3SNIC 9x0 serials family of Ethernet adapters.
+
+
+Supported NICs
+--
+
+- 3S910 Dual Port SFP28 10/25GbE Ethernet adapter
+- 3S920 Quad Port SFP28 10/25GbE Ethernet adapter
+- 3S920 Quad Port QSFP28 100GbE Ethernet adapter
+
+
+Features:
+--
+
+Features of sssnic PMD are:
+
+- Link status
+- Link status event
+- Queue start/stop
+- Rx interrupt
+- Scattered Rx
+- TSO
+- LRO
+- Promiscuous mode
+- Allmulticast mode
+- Unicast MAC filter
+- Multicast MAC filte
+- RSS hash
+- RSS key update
+- RSS reta update
+- Inner RSS
+- VLAN filter
+- VLAN offload
+- L3 checksum offload
+- L4 checksum offload
+- Inner L3 checksum
+- Inner L4 checksum
+- Basic stats
+- Extended stats
+- Stats per queue
+- Flow control
+- FW version
+- Generic flow API
+
+
+Prerequisites
+-
+
+- Learning about 3SNIC Ethernet NICs using
+  ``_.
+
+- Follow the DPDK :ref:`Getting Started Guide for Linux ` to setup 
the basic DPDK environment.
+
+
+Driver compilation and testing
+--
+
+Refer to the document :ref:`compiling and testing a PMD for a NIC 
`
+for details.
+
+
+Limitations or Known issues
+---
+
+Build with ICC is not supported yet.
+Power8, ARMv7 and BSD are not supported yet.
diff --git a/drivers/net/meson.build b/drivers/net/meson.build
index bd38b533c5..224eab99a7 100644
--- a/drivers/net/meson.build
+++ b/drivers/net/meson.build
@@ -54,6 +54,7 @@ drivers = [
 'ring',
 'sfc',
 'softnic',
+'sssnic',
 'tap',
 'thunderx',

[PATCH 02/32] net/sssnic: add log type and log macros

2023-08-29 Thread wanry
From: Renyong Wan 

Adding log macros to print runtime messages and trace functions.

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/sssnic_ethdev.c | 13 
 drivers/net/sssnic/sssnic_log.h| 51 ++
 2 files changed, 64 insertions(+)
 create mode 100644 drivers/net/sssnic/sssnic_log.h

diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index 049fda705a..12438d2ee9 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -6,11 +6,14 @@
 #include 
 #include 
 
+#include "sssnic_log.h"
+
 static int
 sssnic_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device 
*pci_dev)
 {
RTE_SET_USED(pci_drv);
RTE_SET_USED(pci_dev);
+   PMD_INIT_FUNC_TRACE();
return -EINVAL;
 }
 
@@ -18,6 +21,7 @@ static int
 sssnic_pci_remove(struct rte_pci_device *pci_dev)
 {
RTE_SET_USED(pci_dev);
+   PMD_INIT_FUNC_TRACE();
return -EINVAL;
 }
 
@@ -27,3 +31,12 @@ static struct rte_pci_driver sssnic_pmd = {
 };
 
 RTE_PMD_REGISTER_PCI(net_sssnic, sssnic_pmd);
+
+RTE_LOG_REGISTER_SUFFIX(sssnic_logtype_driver, driver, INFO);
+RTE_LOG_REGISTER_SUFFIX(sssnic_logtype_init, init, NOTICE);
+#ifdef RTE_ETHDEV_DEBUG_RX
+RTE_LOG_REGISTER_SUFFIX(sssnic_logtype_rx, rx, DEBUG);
+#endif /*RTE_ETHDEV_DEBUG_RX*/
+#ifdef RTE_ETHDEV_DEBUG_TX
+RTE_LOG_REGISTER_SUFFIX(sssnic_logtype_tx, tx, DEBUG);
+#endif /*RTE_ETHDEV_DEBUG_TX*/
diff --git a/drivers/net/sssnic/sssnic_log.h b/drivers/net/sssnic/sssnic_log.h
new file mode 100644
index 00..629e12100c
--- /dev/null
+++ b/drivers/net/sssnic/sssnic_log.h
@@ -0,0 +1,51 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#ifndef _SSSNIC_LOG_H_
+#define _SSSNIC_LOG_H_
+
+#include 
+
+extern int sssnic_logtype_driver;
+extern int sssnic_logtype_init;
+
+#define SSSNIC_LOG_NAME "sssnic"
+#define PMD_DRV_LOG(level, fmt, args...)   
\
+   rte_log(RTE_LOG_##level, sssnic_logtype_driver,\
+   SSSNIC_LOG_NAME ": " fmt "\n", ##args)
+#define PMD_INIT_LOG(level, fmt, args...)  
\
+   rte_log(RTE_LOG_##level, sssnic_logtype_init, "%s(): " fmt "\n",   \
+   __func__, ##args)
+
+#define SSSNIC_DEBUG(fmt, args...) 
\
+   PMD_DRV_LOG(DEBUG, "[%s():%d] " fmt, __func__, __LINE__, ##args)
+
+/*
+ * Trace driver init and uninit.
+ */
+#define PMD_INIT_FUNC_TRACE() PMD_INIT_LOG(DEBUG, " >>")
+
+#ifdef RTE_ETHDEV_DEBUG_RX
+extern int sssnic_logtype_rx;
+#define SSSNIC_RX_LOG(level, fmt, args...) 
\
+   rte_log(RTE_LOG_##level, sssnic_logtype_rx,\
+   "sssnic_rx: [%s():%d] " fmt "\n", __func__, __LINE__, ##args)
+#else
+#define SSSNIC_RX_LOG(level, fmt, args...) 
\
+   do {   \
+   } while (0)
+#endif /*RTE_ETHDEV_DEBUG_RX*/
+
+#ifdef RTE_ETHDEV_DEBUG_TX
+extern int sssnic_logtype_tx;
+#define SSSNIC_TX_LOG(level, fmt, args...) 
\
+   rte_log(RTE_LOG_##level, sssnic_logtype_rx,\
+   "sssnic_tx: [%s():%d] " fmt "\n", __func__, __LINE__, ##args)
+#else
+#define SSSNIC_TX_LOG(level, fmt, args...) 
\
+   do {   \
+   } while (0)
+#endif /*RTE_ETHDEV_DEBUG_TX*/
+
+#endif /*_SSSNIC_LOG_H_*/
-- 
2.27.0



[PATCH 03/32] net/sssnic: support probe and remove

2023-08-29 Thread wanry
From: Renyong Wan 

Register device ID for 3SNIC ethernet adapter to support
PCI ethdev probe and remove.

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/base/sssnic_hw.h | 11 +
 drivers/net/sssnic/sssnic_ethdev.c  | 37 +
 2 files changed, 44 insertions(+), 4 deletions(-)
 create mode 100644 drivers/net/sssnic/base/sssnic_hw.h

diff --git a/drivers/net/sssnic/base/sssnic_hw.h 
b/drivers/net/sssnic/base/sssnic_hw.h
new file mode 100644
index 00..db916b1977
--- /dev/null
+++ b/drivers/net/sssnic/base/sssnic_hw.h
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#ifndef _SSSNIC_HW_H_
+#define _SSSNIC_HW_H_
+
+#define SSSNIC_PCI_VENDOR_ID 0x1F3F
+#define SSSNIC_DEVICE_ID_STD 0x9020
+
+#endif /* _SSSNIC_HW_H_ */
diff --git a/drivers/net/sssnic/sssnic_ethdev.c 
b/drivers/net/sssnic/sssnic_ethdev.c
index 12438d2ee9..27abe70ca6 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -7,25 +7,54 @@
 #include 
 
 #include "sssnic_log.h"
+#include "base/sssnic_hw.h"
+
+static int
+sssnic_ethdev_init(struct rte_eth_dev *ethdev)
+{
+   RTE_SET_USED(ethdev);
+   PMD_INIT_FUNC_TRACE();
+
+   return -EINVAL;
+}
+
+static int
+sssnic_ethdev_uninit(struct rte_eth_dev *ethdev)
+{
+   RTE_SET_USED(ethdev);
+   PMD_INIT_FUNC_TRACE();
+
+   if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+   return 0;
+
+   return -EINVAL;
+}
 
 static int
 sssnic_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device 
*pci_dev)
 {
RTE_SET_USED(pci_drv);
-   RTE_SET_USED(pci_dev);
PMD_INIT_FUNC_TRACE();
-   return -EINVAL;
+
+   return rte_eth_dev_pci_generic_probe(pci_dev, 0, sssnic_ethdev_init);
 }
 
 static int
 sssnic_pci_remove(struct rte_pci_device *pci_dev)
 {
-   RTE_SET_USED(pci_dev);
PMD_INIT_FUNC_TRACE();
-   return -EINVAL;
+
+   return rte_eth_dev_pci_generic_remove(pci_dev, sssnic_ethdev_uninit);
 }
 
+static const struct rte_pci_id sssnic_pci_id_map[] = {
+   { RTE_PCI_DEVICE(SSSNIC_PCI_VENDOR_ID, SSSNIC_DEVICE_ID_STD) },
+   { .vendor_id = 0 },
+};
+
 static struct rte_pci_driver sssnic_pmd = {
+   .id_table = sssnic_pci_id_map,
+   .drv_flags = RTE_PCI_DRV_NEED_MAPPING,
.probe = sssnic_pci_probe,
.remove = sssnic_pci_remove,
 };
-- 
2.27.0



[PATCH 05/32] net/sssnic: add event queue

2023-08-29 Thread wanry
From: Renyong Wan 

Event queue is intended for receiving event from hardware as well
as mailbox response message.

Signed-off-by: Steven Song 
Signed-off-by: Renyong Wan 
---
 drivers/net/sssnic/base/meson.build |   1 +
 drivers/net/sssnic/base/sssnic_eventq.c | 426 
 drivers/net/sssnic/base/sssnic_eventq.h |  84 +
 drivers/net/sssnic/base/sssnic_hw.c |   9 +-
 drivers/net/sssnic/base/sssnic_hw.h |   5 +
 drivers/net/sssnic/base/sssnic_reg.h|  51 +++
 drivers/net/sssnic/sssnic_ethdev.c  |   1 +
 7 files changed, 576 insertions(+), 1 deletion(-)
 create mode 100644 drivers/net/sssnic/base/sssnic_eventq.c
 create mode 100644 drivers/net/sssnic/base/sssnic_eventq.h

diff --git a/drivers/net/sssnic/base/meson.build 
b/drivers/net/sssnic/base/meson.build
index 3e64112c72..7758faa482 100644
--- a/drivers/net/sssnic/base/meson.build
+++ b/drivers/net/sssnic/base/meson.build
@@ -3,6 +3,7 @@
 
 sources = [
 'sssnic_hw.c',
+'sssnic_eventq.c'
 ]
 
 c_args = cflags
diff --git a/drivers/net/sssnic/base/sssnic_eventq.c 
b/drivers/net/sssnic/base/sssnic_eventq.c
new file mode 100644
index 00..a479bdff35
--- /dev/null
+++ b/drivers/net/sssnic/base/sssnic_eventq.c
@@ -0,0 +1,426 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2022 Shenzhen 3SNIC Information Technology Co., Ltd.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "../sssnic_log.h"
+#include "sssnic_hw.h"
+#include "sssnic_reg.h"
+#include "sssnic_eventq.h"
+
+#define SSSNIC_EVENTQ_DEF_DEPTH 64
+#define SSSNIC_EVENTQ_NUM_PAGES 4
+#define SSSNIC_EVENTQ_MAX_PAGE_SZ 0x40
+#define SSSNIC_EVENTQ_MIN_PAGE_SZ 0x1000
+
+#define SSSNIC_EVENT_ADDR(base_addr, event_sz, idx)
\
+   (struct sssnic_event *)(((uint8_t *)(base_addr)) + ((idx) * (event_sz)))
+
+static inline struct sssnic_event *
+sssnic_eventq_peek(struct sssnic_eventq *eq)
+{
+   uint16_t page = eq->ci / eq->page_len;
+   uint16_t idx = eq->ci % eq->page_len;
+
+   return SSSNIC_EVENT_ADDR(eq->pages[page]->addr, eq->entry_size, idx);
+}
+
+static inline void
+sssnic_eventq_reg_write(struct sssnic_eventq *eq, uint32_t reg, uint32_t val)
+{
+   sssnic_cfg_reg_write(eq->hw, reg, val);
+}
+
+static inline uint32_t
+sssnic_eventq_reg_read(struct sssnic_eventq *eq, uint32_t reg)
+{
+   return sssnic_cfg_reg_read(eq->hw, reg);
+}
+
+static inline void
+sssnic_eventq_reg_write64(struct sssnic_eventq *eq, uint32_t reg, uint64_t val)
+{
+   sssnic_cfg_reg_write(eq->hw, reg, (uint32_t)((val >> 16) >> 16));
+   sssnic_cfg_reg_write(eq->hw, reg + sizeof(uint32_t), (uint32_t)val);
+}
+
+/* all eventq registers that to be access must be selected first */
+static inline void
+sssnic_eventq_reg_select(struct sssnic_eventq *eq)
+{
+   sssnic_eventq_reg_write(eq, SSSNIC_EVENTQ_IDX_SEL_REG, eq->qid);
+}
+
+static const struct rte_memzone *
+sssnic_eventq_page_alloc(struct sssnic_eventq *eq, int page_idx)
+{
+   const struct rte_memzone *mz = NULL;
+   char mz_name[RTE_MEMZONE_NAMESIZE];
+
+   snprintf(mz_name, sizeof(mz_name), "sssnic%u_eq%d_page%d",
+   SSSNIC_ETH_PORT_ID(eq->hw), eq->qid, page_idx);
+   mz = rte_memzone_reserve_aligned(mz_name, eq->page_size, SOCKET_ID_ANY,
+   RTE_MEMZONE_IOVA_CONTIG, eq->page_size);
+   return mz;
+}
+
+static uint32_t
+sssnic_eventq_page_size_calc(uint32_t depth, uint32_t entry_size)
+{
+   uint32_t pages = SSSNIC_EVENTQ_NUM_PAGES;
+   uint32_t size;
+
+   size = RTE_ALIGN(depth * entry_size, SSSNIC_EVENTQ_MIN_PAGE_SZ);
+   if (size <= pages * SSSNIC_EVENTQ_MIN_PAGE_SZ) {
+   /* use minimum page size */
+   return SSSNIC_EVENTQ_MIN_PAGE_SZ;
+   }
+
+   /* Calculate how many pages of minimum size page the big size page 
covers */
+   size = RTE_ALIGN(size / pages, SSSNIC_EVENTQ_MIN_PAGE_SZ);
+   pages = rte_fls_u32(size / SSSNIC_EVENTQ_MIN_PAGE_SZ);
+
+   return SSSNIC_EVENTQ_MIN_PAGE_SZ * pages;
+}
+
+static int
+sssnic_eventq_pages_setup(struct sssnic_eventq *eq)
+{
+   const struct rte_memzone *mz;
+   struct sssnic_event *ev;
+   int i, j;
+
+   eq->pages = rte_zmalloc(NULL,
+   eq->num_pages * sizeof(struct rte_memzone *), 1);
+   if (eq->pages == NULL) {
+   PMD_DRV_LOG(ERR, "Could not alloc memory for pages");
+   return -ENOMEM;
+   }
+
+   for (i = 0; i < eq->num_pages; i++) {
+   mz = sssnic_eventq_page_alloc(eq, i);
+   if (mz == NULL) {
+   PMD_DRV_LOG(ERR,
+   "Could not alloc DMA memory for eventq page %d",
+   i);
+   goto alloc_dma_fail;
+   }
+   /* init eventq entries */
+   for (j = 0; j < eq->page_len; j++) {
+   ev = SSS

  1   2   >