DPDK patches and discussions
 help / color / mirror / Atom feed
* [PATCH 0/7] support link auto negotiation
@ 2023-12-11  3:08 Chaoyong He
  2023-12-11  3:08 ` [PATCH 1/7] net/nfp: set a new parameter to hwinfo Chaoyong He
                   ` (7 more replies)
  0 siblings, 8 replies; 9+ messages in thread
From: Chaoyong He @ 2023-12-11  3:08 UTC (permalink / raw)
  To: dev; +Cc: oss-drivers, Chaoyong He

This patch series add the support of link auto negotiation feature,
including speed and FEC mode.

Zerun Fu (7):
  net/nfp: set a new parameter to hwinfo
  net/nfp: support getting speed capability
  net/nfp: support setting port speed
  net/nfp: modify the link update function
  net/nfp: support getting FEC capability
  net/nfp: support getting FEC mode
  net/nfp: support setting FEC mode

 doc/guides/nics/features/nfp.ini  |   1 +
 drivers/net/nfp/nfp_ethdev.c      | 326 ++++++++++++++++++++++++++++++
 drivers/net/nfp/nfp_net_common.c  | 227 +++++++++++++++++++--
 drivers/net/nfp/nfp_net_common.h  |  10 +
 drivers/net/nfp/nfpcore/nfp_nsp.c |  38 +++-
 drivers/net/nfp/nfpcore/nfp_nsp.h |  59 ++++++
 6 files changed, 640 insertions(+), 21 deletions(-)

-- 
2.39.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/7] net/nfp: set a new parameter to hwinfo
  2023-12-11  3:08 [PATCH 0/7] support link auto negotiation Chaoyong He
@ 2023-12-11  3:08 ` Chaoyong He
  2023-12-11  3:08 ` [PATCH 2/7] net/nfp: support getting speed capability Chaoyong He
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Chaoyong He @ 2023-12-11  3:08 UTC (permalink / raw)
  To: dev; +Cc: oss-drivers, Zerun Fu, Long Wu, Peng Zhang, Chaoyong He

From: Zerun Fu <zerun.fu@corigine.com>

When switching speed the BSP needs to be informed whether
the firmware needs to be switched. Considering that whether
application firmware is indifferent to port speed is a
firmware property instead of port property, now use a new
rtsym to get the property. So 'sp_indiff' is written to
hwinfo to notify BSP.

Signed-off-by: Zerun Fu <zerun.fu@corigine.com>
Reviewed-by: Long Wu <long.wu@corigine.com>
Reviewed-by: Peng Zhang <peng.zhang@corigine.com>
Reviewed-by: Chaoyong He <chaoyong.he@corigine.com>
---
 drivers/net/nfp/nfp_ethdev.c      | 51 +++++++++++++++++++++++++++++++
 drivers/net/nfp/nfpcore/nfp_nsp.c | 17 +++++++++++
 drivers/net/nfp/nfpcore/nfp_nsp.h |  3 ++
 3 files changed, 71 insertions(+)

diff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c
index 336d18491e..ef0b0dcd48 100644
--- a/drivers/net/nfp/nfp_ethdev.c
+++ b/drivers/net/nfp/nfp_ethdev.c
@@ -25,6 +25,9 @@
 #include "nfp_logs.h"
 #include "nfp_net_flow.h"
 
+/* 64-bit per app capabilities */
+#define NFP_NET_APP_CAP_SP_INDIFF       RTE_BIT64(0) /* Indifferent to port speed */
+
 #define NFP_PF_DRIVER_NAME net_nfp_pf
 
 static void
@@ -1227,6 +1230,46 @@ nfp_init_app_fw_nic(struct nfp_pf_dev *pf_dev,
 	return ret;
 }
 
+static int
+nfp_net_hwinfo_set(uint8_t function_id,
+		struct nfp_rtsym_table *sym_tbl,
+		struct nfp_cpp *cpp)
+{
+	int ret = 0;
+	uint64_t app_cap;
+	uint8_t sp_indiff;
+	struct nfp_nsp *nsp;
+	char hw_info[RTE_ETH_NAME_MAX_LEN];
+	char app_cap_name[RTE_ETH_NAME_MAX_LEN];
+
+	/* Read the app capabilities of the firmware loaded */
+	snprintf(app_cap_name, sizeof(app_cap_name), "_pf%u_net_app_cap", function_id);
+	app_cap = nfp_rtsym_read_le(sym_tbl, app_cap_name, &ret);
+	if (ret != 0) {
+		PMD_INIT_LOG(ERR, "Couldn't read app_fw_cap from firmware.");
+		return ret;
+	}
+
+	/* Calculate the value of sp_indiff and write to hw_info */
+	sp_indiff = app_cap & NFP_NET_APP_CAP_SP_INDIFF;
+	snprintf(hw_info, sizeof(hw_info), "sp_indiff=%u", sp_indiff);
+
+	nsp = nfp_nsp_open(cpp);
+	if (nsp == NULL) {
+		PMD_INIT_LOG(ERR, "Couldn't get NSP.");
+		return -EIO;
+	}
+
+	ret = nfp_nsp_hwinfo_set(nsp, hw_info, sizeof(hw_info));
+	nfp_nsp_close(nsp);
+	if (ret != 0) {
+		PMD_INIT_LOG(ERR, "Failed to set parameter to hwinfo.");
+		return ret;
+	}
+
+	return 0;
+}
+
 static int
 nfp_pf_init(struct rte_pci_device *pci_dev)
 {
@@ -1337,6 +1380,14 @@ nfp_pf_init(struct rte_pci_device *pci_dev)
 		goto sym_tbl_cleanup;
 	}
 
+	/* Write sp_indiff to hw_info */
+	ret = nfp_net_hwinfo_set(function_id, sym_tbl, cpp);
+	if (ret != 0) {
+		PMD_INIT_LOG(ERR, "Failed to set hwinfo.");
+		ret = -EIO;
+		goto sym_tbl_cleanup;
+	}
+
 	/* Populate the newly created PF device */
 	pf_dev->app_fw_id = app_fw_id;
 	pf_dev->cpp = cpp;
diff --git a/drivers/net/nfp/nfpcore/nfp_nsp.c b/drivers/net/nfp/nfpcore/nfp_nsp.c
index e5aaef8d55..e57176adb3 100644
--- a/drivers/net/nfp/nfpcore/nfp_nsp.c
+++ b/drivers/net/nfp/nfpcore/nfp_nsp.c
@@ -711,3 +711,20 @@ nfp_nsp_read_sensors(struct nfp_nsp *state,
 
 	return nfp_nsp_command_buf(state, &sensors);
 }
+
+int
+nfp_nsp_hwinfo_set(struct nfp_nsp *state,
+		const void *buf,
+		size_t size)
+{
+	struct nfp_nsp_command_buf_arg hwinfo_set = {
+		{
+			.code   = SPCODE_HWINFO_SET,
+			.option = size,
+		},
+		.in_buf  = buf,
+		.in_size = size,
+	};
+
+	return nfp_nsp_command_buf(state, &hwinfo_set);
+}
diff --git a/drivers/net/nfp/nfpcore/nfp_nsp.h b/drivers/net/nfp/nfpcore/nfp_nsp.h
index 9f506a0b2e..f99ca941d5 100644
--- a/drivers/net/nfp/nfpcore/nfp_nsp.h
+++ b/drivers/net/nfp/nfpcore/nfp_nsp.h
@@ -169,6 +169,9 @@ void *nfp_nsp_config_entries(struct nfp_nsp *state);
 struct nfp_cpp *nfp_nsp_cpp(struct nfp_nsp *state);
 bool nfp_nsp_config_modified(struct nfp_nsp *state);
 uint32_t nfp_nsp_config_idx(struct nfp_nsp *state);
+int nfp_nsp_hwinfo_set(struct nfp_nsp *state,
+		const void *buf,
+		size_t size);
 
 static inline bool
 nfp_eth_can_support_fec(struct nfp_eth_table_port *eth_port)
-- 
2.39.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 2/7] net/nfp: support getting speed capability
  2023-12-11  3:08 [PATCH 0/7] support link auto negotiation Chaoyong He
  2023-12-11  3:08 ` [PATCH 1/7] net/nfp: set a new parameter to hwinfo Chaoyong He
@ 2023-12-11  3:08 ` Chaoyong He
  2023-12-11  3:08 ` [PATCH 3/7] net/nfp: support setting port speed Chaoyong He
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Chaoyong He @ 2023-12-11  3:08 UTC (permalink / raw)
  To: dev; +Cc: oss-drivers, Zerun Fu, Long Wu, Peng Zhang, Chaoyong He

From: Zerun Fu <zerun.fu@corigine.com>

Get the currently supported speed value from NSP. And the VF
can not get the speed capacity now.

Signed-off-by: Zerun Fu <zerun.fu@corigine.com>
Reviewed-by: Long Wu <long.wu@corigine.com>
Reviewed-by: Peng Zhang <peng.zhang@corigine.com>
Reviewed-by: Chaoyong He <chaoyong.he@corigine.com>
---
 drivers/net/nfp/nfp_ethdev.c      | 121 ++++++++++++++++++++++++++++++
 drivers/net/nfp/nfp_net_common.c  |   9 +--
 drivers/net/nfp/nfp_net_common.h  |   3 +
 drivers/net/nfp/nfpcore/nfp_nsp.c |  17 +++++
 drivers/net/nfp/nfpcore/nfp_nsp.h |  55 ++++++++++++++
 5 files changed, 199 insertions(+), 6 deletions(-)

diff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c
index ef0b0dcd48..591c2de53b 100644
--- a/drivers/net/nfp/nfp_ethdev.c
+++ b/drivers/net/nfp/nfp_ethdev.c
@@ -1270,6 +1270,116 @@ nfp_net_hwinfo_set(uint8_t function_id,
 	return 0;
 }
 
+const uint32_t nfp_eth_media_table[NFP_MEDIA_LINK_MODES_NUMBER] = {
+	[NFP_MEDIA_W0_RJ45_10M]     = RTE_ETH_LINK_SPEED_10M,
+	[NFP_MEDIA_W0_RJ45_10M_HD]  = RTE_ETH_LINK_SPEED_10M_HD,
+	[NFP_MEDIA_W0_RJ45_100M]    = RTE_ETH_LINK_SPEED_100M,
+	[NFP_MEDIA_W0_RJ45_100M_HD] = RTE_ETH_LINK_SPEED_100M_HD,
+	[NFP_MEDIA_W0_RJ45_1G]      = RTE_ETH_LINK_SPEED_1G,
+	[NFP_MEDIA_W0_RJ45_2P5G]    = RTE_ETH_LINK_SPEED_2_5G,
+	[NFP_MEDIA_W0_RJ45_5G]      = RTE_ETH_LINK_SPEED_5G,
+	[NFP_MEDIA_W0_RJ45_10G]     = RTE_ETH_LINK_SPEED_10G,
+	[NFP_MEDIA_1000BASE_CX]     = RTE_ETH_LINK_SPEED_1G,
+	[NFP_MEDIA_1000BASE_KX]     = RTE_ETH_LINK_SPEED_1G,
+	[NFP_MEDIA_10GBASE_KX4]     = RTE_ETH_LINK_SPEED_10G,
+	[NFP_MEDIA_10GBASE_KR]      = RTE_ETH_LINK_SPEED_10G,
+	[NFP_MEDIA_10GBASE_CX4]     = RTE_ETH_LINK_SPEED_10G,
+	[NFP_MEDIA_10GBASE_CR]      = RTE_ETH_LINK_SPEED_10G,
+	[NFP_MEDIA_10GBASE_SR]      = RTE_ETH_LINK_SPEED_10G,
+	[NFP_MEDIA_10GBASE_ER]      = RTE_ETH_LINK_SPEED_10G,
+	[NFP_MEDIA_25GBASE_KR]      = RTE_ETH_LINK_SPEED_25G,
+	[NFP_MEDIA_25GBASE_KR_S]    = RTE_ETH_LINK_SPEED_25G,
+	[NFP_MEDIA_25GBASE_CR]      = RTE_ETH_LINK_SPEED_25G,
+	[NFP_MEDIA_25GBASE_CR_S]    = RTE_ETH_LINK_SPEED_25G,
+	[NFP_MEDIA_25GBASE_SR]      = RTE_ETH_LINK_SPEED_25G,
+	[NFP_MEDIA_40GBASE_CR4]     = RTE_ETH_LINK_SPEED_40G,
+	[NFP_MEDIA_40GBASE_KR4]     = RTE_ETH_LINK_SPEED_40G,
+	[NFP_MEDIA_40GBASE_SR4]     = RTE_ETH_LINK_SPEED_40G,
+	[NFP_MEDIA_40GBASE_LR4]     = RTE_ETH_LINK_SPEED_40G,
+	[NFP_MEDIA_50GBASE_KR]      = RTE_ETH_LINK_SPEED_50G,
+	[NFP_MEDIA_50GBASE_SR]      = RTE_ETH_LINK_SPEED_50G,
+	[NFP_MEDIA_50GBASE_CR]      = RTE_ETH_LINK_SPEED_50G,
+	[NFP_MEDIA_50GBASE_LR]      = RTE_ETH_LINK_SPEED_50G,
+	[NFP_MEDIA_50GBASE_ER]      = RTE_ETH_LINK_SPEED_50G,
+	[NFP_MEDIA_50GBASE_FR]      = RTE_ETH_LINK_SPEED_50G,
+	[NFP_MEDIA_100GBASE_KR4]    = RTE_ETH_LINK_SPEED_100G,
+	[NFP_MEDIA_100GBASE_SR4]    = RTE_ETH_LINK_SPEED_100G,
+	[NFP_MEDIA_100GBASE_CR4]    = RTE_ETH_LINK_SPEED_100G,
+	[NFP_MEDIA_100GBASE_KP4]    = RTE_ETH_LINK_SPEED_100G,
+	[NFP_MEDIA_100GBASE_CR10]   = RTE_ETH_LINK_SPEED_100G,
+	[NFP_MEDIA_10GBASE_LR]      = RTE_ETH_LINK_SPEED_10G,
+	[NFP_MEDIA_25GBASE_LR]      = RTE_ETH_LINK_SPEED_25G,
+	[NFP_MEDIA_25GBASE_ER]      = RTE_ETH_LINK_SPEED_25G
+};
+
+static int
+nfp_net_speed_capa_get_real(struct nfp_eth_media_buf *media_buf,
+		struct nfp_pf_dev *pf_dev)
+{
+	uint32_t i;
+	uint32_t j;
+	uint32_t offset;
+	uint32_t speed_capa = 0;
+	uint64_t supported_modes;
+
+	for (i = 0; i < RTE_DIM(media_buf->supported_modes); i++) {
+		supported_modes = media_buf->supported_modes[i];
+		offset = i * UINT64_BIT;
+		for (j = 0; j < UINT64_BIT; j++) {
+			if (supported_modes == 0)
+				break;
+
+			if ((supported_modes & 1) != 0) {
+				if ((j + offset) >= NFP_MEDIA_LINK_MODES_NUMBER) {
+					PMD_DRV_LOG(ERR, "Invalid offset of media table.");
+					return -EINVAL;
+				}
+
+				speed_capa |= nfp_eth_media_table[j + offset];
+			}
+
+			supported_modes = supported_modes >> 1;
+		}
+	}
+
+	pf_dev->speed_capa = speed_capa;
+
+	return pf_dev->speed_capa == 0 ? -EINVAL : 0;
+}
+
+static int
+nfp_net_speed_capa_get(struct nfp_pf_dev *pf_dev,
+		uint32_t port_id)
+{
+	int ret;
+	struct nfp_nsp *nsp;
+	struct nfp_eth_media_buf media_buf;
+
+	media_buf.eth_index = pf_dev->nfp_eth_table->ports[port_id].eth_index;
+	pf_dev->speed_capa = 0;
+
+	nsp = nfp_nsp_open(pf_dev->cpp);
+	if (nsp == NULL) {
+		PMD_DRV_LOG(ERR, "Couldn't get NSP.");
+		return -EIO;
+	}
+
+	ret = nfp_nsp_read_media(nsp, &media_buf, sizeof(media_buf));
+	nfp_nsp_close(nsp);
+	if (ret != 0) {
+		PMD_DRV_LOG(ERR, "Failed to read media.");
+		return ret;
+	}
+
+	ret = nfp_net_speed_capa_get_real(&media_buf, pf_dev);
+	if (ret < 0) {
+		PMD_DRV_LOG(ERR, "Speed capability is invalid.");
+		return ret;
+	}
+
+	return 0;
+}
+
 static int
 nfp_pf_init(struct rte_pci_device *pci_dev)
 {
@@ -1396,6 +1506,17 @@ nfp_pf_init(struct rte_pci_device *pci_dev)
 	pf_dev->pci_dev = pci_dev;
 	pf_dev->nfp_eth_table = nfp_eth_table;
 
+	/* Get the speed capability */
+	for (i = 0; i < nfp_eth_table->count; i++) {
+		id = nfp_function_id_get(pf_dev, i);
+		ret = nfp_net_speed_capa_get(pf_dev, id);
+		if (ret != 0) {
+			PMD_INIT_LOG(ERR, "Failed to get speed capability.");
+			ret = -EIO;
+			goto sym_tbl_cleanup;
+		}
+	}
+
 	/* Configure access to tx/rx vNIC BARs */
 	addr = nfp_qcp_queue_offset(dev_info, 0);
 	cpp_id = NFP_CPP_ISLAND_ID(0, NFP_CPP_ACTION_RW, 0, 0);
diff --git a/drivers/net/nfp/nfp_net_common.c b/drivers/net/nfp/nfp_net_common.c
index eb480667c4..ed410a7313 100644
--- a/drivers/net/nfp/nfp_net_common.c
+++ b/drivers/net/nfp/nfp_net_common.c
@@ -1208,12 +1208,9 @@ nfp_net_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 		dev_info->hash_key_size = NFP_NET_CFG_RSS_KEY_SZ;
 	}
 
-	dev_info->speed_capa = RTE_ETH_LINK_SPEED_1G |
-			RTE_ETH_LINK_SPEED_10G |
-			RTE_ETH_LINK_SPEED_25G |
-			RTE_ETH_LINK_SPEED_40G |
-			RTE_ETH_LINK_SPEED_50G |
-			RTE_ETH_LINK_SPEED_100G;
+	/* Only PF supports getting speed capability. */
+	if (hw->pf_dev != NULL)
+		dev_info->speed_capa = hw->pf_dev->speed_capa;
 
 	return 0;
 }
diff --git a/drivers/net/nfp/nfp_net_common.h b/drivers/net/nfp/nfp_net_common.h
index 305b221a15..aec3c51bdf 100644
--- a/drivers/net/nfp/nfp_net_common.h
+++ b/drivers/net/nfp/nfp_net_common.h
@@ -106,6 +106,9 @@ struct nfp_pf_dev {
 
 	/** Multiple PF configuration */
 	struct nfp_multi_pf multi_pf;
+
+	/** Supported speeds bitmap */
+	uint32_t speed_capa;
 };
 
 #define NFP_NET_FLOW_LIMIT    1024
diff --git a/drivers/net/nfp/nfpcore/nfp_nsp.c b/drivers/net/nfp/nfpcore/nfp_nsp.c
index e57176adb3..f67572be87 100644
--- a/drivers/net/nfp/nfpcore/nfp_nsp.c
+++ b/drivers/net/nfp/nfpcore/nfp_nsp.c
@@ -728,3 +728,20 @@ nfp_nsp_hwinfo_set(struct nfp_nsp *state,
 
 	return nfp_nsp_command_buf(state, &hwinfo_set);
 }
+
+int
+nfp_nsp_read_media(struct nfp_nsp *state,
+		void *buf,
+		size_t size)
+{
+	struct nfp_nsp_command_buf_arg media = {
+		{
+			.code   = SPCODE_READ_MEDIA,
+			.option = size,
+		},
+		.out_buf  = buf,
+		.out_size = size,
+	};
+
+	return nfp_nsp_command_buf(state, &media);
+}
diff --git a/drivers/net/nfp/nfpcore/nfp_nsp.h b/drivers/net/nfp/nfpcore/nfp_nsp.h
index f99ca941d5..41e8402154 100644
--- a/drivers/net/nfp/nfpcore/nfp_nsp.h
+++ b/drivers/net/nfp/nfpcore/nfp_nsp.h
@@ -172,6 +172,9 @@ uint32_t nfp_nsp_config_idx(struct nfp_nsp *state);
 int nfp_nsp_hwinfo_set(struct nfp_nsp *state,
 		const void *buf,
 		size_t size);
+int nfp_nsp_read_media(struct nfp_nsp *state,
+		void *buf,
+		size_t size);
 
 static inline bool
 nfp_eth_can_support_fec(struct nfp_eth_table_port *eth_port)
@@ -221,4 +224,56 @@ int nfp_hwmon_read_sensor(struct nfp_cpp *cpp, enum nfp_nsp_sensor_id id,
 		uint32_t *val);
 bool nfp_nsp_fw_loaded(struct nfp_nsp *state);
 
+/* The buf used to receive bitmap of link modes */
+struct nfp_eth_media_buf {
+	uint8_t eth_index;
+	uint8_t reserved[7];
+	uint64_t supported_modes[2];
+	uint64_t reserved_2[2];
+};
+
+/* Link modes about RJ45 haven't been used, so there's no mapping to them */
+enum nfp_link_mode_list {
+	NFP_MEDIA_W0_RJ45_10M,
+	NFP_MEDIA_W0_RJ45_10M_HD,
+	NFP_MEDIA_W0_RJ45_100M,
+	NFP_MEDIA_W0_RJ45_100M_HD,
+	NFP_MEDIA_W0_RJ45_1G,
+	NFP_MEDIA_W0_RJ45_2P5G,
+	NFP_MEDIA_W0_RJ45_5G,
+	NFP_MEDIA_W0_RJ45_10G,
+	NFP_MEDIA_1000BASE_CX,
+	NFP_MEDIA_1000BASE_KX,
+	NFP_MEDIA_10GBASE_KX4,
+	NFP_MEDIA_10GBASE_KR,
+	NFP_MEDIA_10GBASE_CX4,
+	NFP_MEDIA_10GBASE_CR,
+	NFP_MEDIA_10GBASE_SR,
+	NFP_MEDIA_10GBASE_ER,
+	NFP_MEDIA_25GBASE_KR,
+	NFP_MEDIA_25GBASE_KR_S,
+	NFP_MEDIA_25GBASE_CR,
+	NFP_MEDIA_25GBASE_CR_S,
+	NFP_MEDIA_25GBASE_SR,
+	NFP_MEDIA_40GBASE_CR4,
+	NFP_MEDIA_40GBASE_KR4,
+	NFP_MEDIA_40GBASE_SR4,
+	NFP_MEDIA_40GBASE_LR4,
+	NFP_MEDIA_50GBASE_KR,
+	NFP_MEDIA_50GBASE_SR,
+	NFP_MEDIA_50GBASE_CR,
+	NFP_MEDIA_50GBASE_LR,
+	NFP_MEDIA_50GBASE_ER,
+	NFP_MEDIA_50GBASE_FR,
+	NFP_MEDIA_100GBASE_KR4,
+	NFP_MEDIA_100GBASE_SR4,
+	NFP_MEDIA_100GBASE_CR4,
+	NFP_MEDIA_100GBASE_KP4,
+	NFP_MEDIA_100GBASE_CR10,
+	NFP_MEDIA_10GBASE_LR,
+	NFP_MEDIA_25GBASE_LR,
+	NFP_MEDIA_25GBASE_ER,
+	NFP_MEDIA_LINK_MODES_NUMBER
+};
+
 #endif /* __NSP_NSP_H__ */
-- 
2.39.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 3/7] net/nfp: support setting port speed
  2023-12-11  3:08 [PATCH 0/7] support link auto negotiation Chaoyong He
  2023-12-11  3:08 ` [PATCH 1/7] net/nfp: set a new parameter to hwinfo Chaoyong He
  2023-12-11  3:08 ` [PATCH 2/7] net/nfp: support getting speed capability Chaoyong He
@ 2023-12-11  3:08 ` Chaoyong He
  2023-12-11  3:08 ` [PATCH 4/7] net/nfp: modify the link update function Chaoyong He
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Chaoyong He @ 2023-12-11  3:08 UTC (permalink / raw)
  To: dev; +Cc: oss-drivers, Zerun Fu, Long Wu, Peng Zhang, Chaoyong He

From: Zerun Fu <zerun.fu@corigine.com>

Add support of setting speed of port. This feature allows to set any
currently supported speed. When the port starts as default, the auto
negotiation mode will be set if it is supported.

Signed-off-by: Zerun Fu <zerun.fu@corigine.com>
Reviewed-by: Long Wu <long.wu@corigine.com>
Reviewed-by: Peng Zhang <peng.zhang@corigine.com>
Reviewed-by: Chaoyong He <chaoyong.he@corigine.com>
---
 drivers/net/nfp/nfp_ethdev.c | 151 +++++++++++++++++++++++++++++++++++
 1 file changed, 151 insertions(+)

diff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c
index 591c2de53b..54d018870d 100644
--- a/drivers/net/nfp/nfp_ethdev.c
+++ b/drivers/net/nfp/nfp_ethdev.c
@@ -45,6 +45,150 @@ nfp_net_pf_read_mac(struct nfp_app_fw_nic *app_fw_nic,
 	rte_ether_addr_copy(&nfp_eth_table->ports[port].mac_addr, &hw->super.mac_addr);
 }
 
+static uint32_t
+nfp_net_speed_bitmap2speed(uint32_t speeds_bitmap)
+{
+	switch (speeds_bitmap) {
+	case RTE_ETH_LINK_SPEED_10M_HD:
+		return RTE_ETH_SPEED_NUM_10M;
+	case RTE_ETH_LINK_SPEED_10M:
+		return RTE_ETH_SPEED_NUM_10M;
+	case RTE_ETH_LINK_SPEED_100M_HD:
+		return RTE_ETH_SPEED_NUM_100M;
+	case RTE_ETH_LINK_SPEED_100M:
+		return RTE_ETH_SPEED_NUM_100M;
+	case RTE_ETH_LINK_SPEED_1G:
+		return RTE_ETH_SPEED_NUM_1G;
+	case RTE_ETH_LINK_SPEED_2_5G:
+		return RTE_ETH_SPEED_NUM_2_5G;
+	case RTE_ETH_LINK_SPEED_5G:
+		return RTE_ETH_SPEED_NUM_5G;
+	case RTE_ETH_LINK_SPEED_10G:
+		return RTE_ETH_SPEED_NUM_10G;
+	case RTE_ETH_LINK_SPEED_20G:
+		return RTE_ETH_SPEED_NUM_20G;
+	case RTE_ETH_LINK_SPEED_25G:
+		return RTE_ETH_SPEED_NUM_25G;
+	case RTE_ETH_LINK_SPEED_40G:
+		return RTE_ETH_SPEED_NUM_40G;
+	case RTE_ETH_LINK_SPEED_50G:
+		return RTE_ETH_SPEED_NUM_50G;
+	case RTE_ETH_LINK_SPEED_56G:
+		return RTE_ETH_SPEED_NUM_56G;
+	case RTE_ETH_LINK_SPEED_100G:
+		return RTE_ETH_SPEED_NUM_100G;
+	case RTE_ETH_LINK_SPEED_200G:
+		return RTE_ETH_SPEED_NUM_200G;
+	case RTE_ETH_LINK_SPEED_400G:
+		return RTE_ETH_SPEED_NUM_400G;
+	default:
+		return RTE_ETH_SPEED_NUM_NONE;
+	}
+}
+
+static int
+nfp_net_nfp4000_speed_configure_check(uint16_t port_id,
+		uint32_t configure_speed,
+		struct nfp_eth_table *nfp_eth_table)
+{
+	switch (port_id) {
+	case 0:
+		if (configure_speed == RTE_ETH_SPEED_NUM_25G &&
+				nfp_eth_table->ports[1].speed == RTE_ETH_SPEED_NUM_10G) {
+			PMD_DRV_LOG(ERR, "The speed configuration is not supported for NFP4000.");
+			return -ENOTSUP;
+		}
+		break;
+	case 1:
+		if (configure_speed == RTE_ETH_SPEED_NUM_10G &&
+				nfp_eth_table->ports[0].speed == RTE_ETH_SPEED_NUM_25G) {
+			PMD_DRV_LOG(ERR, "The speed configuration is not supported for NFP4000.");
+			return -ENOTSUP;
+		}
+		break;
+	default:
+		PMD_DRV_LOG(ERR, "The port id is invalid.");
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
+static int
+nfp_net_speed_configure(struct rte_eth_dev *dev,
+		struct nfp_net_hw *net_hw)
+{
+	int ret;
+	uint32_t speed_capa;
+	struct nfp_nsp *nsp;
+	uint32_t link_speeds;
+	uint32_t configure_speed;
+	struct nfp_eth_table_port *eth_port;
+	struct nfp_eth_table *nfp_eth_table;
+
+	nfp_eth_table = net_hw->pf_dev->nfp_eth_table;
+	eth_port = &nfp_eth_table->ports[net_hw->idx];
+
+	speed_capa = net_hw->pf_dev->speed_capa;
+	if (speed_capa == 0) {
+		PMD_DRV_LOG(ERR, "Speed_capa is invalid.");
+		return -EINVAL;
+	}
+
+	link_speeds = dev->data->dev_conf.link_speeds;
+	configure_speed = nfp_net_speed_bitmap2speed(speed_capa & link_speeds);
+	if (configure_speed == RTE_ETH_SPEED_NUM_NONE &&
+			link_speeds != RTE_ETH_LINK_SPEED_AUTONEG) {
+		PMD_DRV_LOG(ERR, "Configured speed is invalid.");
+		return -EINVAL;
+	}
+
+	/* NFP4000 does not allow the port 0 25Gbps and port 1 10Gbps at the same time. */
+	if (net_hw->device_id == PCI_DEVICE_ID_NFP4000_PF_NIC) {
+		ret = nfp_net_nfp4000_speed_configure_check(net_hw->idx,
+				configure_speed, nfp_eth_table);
+		if (ret != 0) {
+			PMD_DRV_LOG(ERR, "Failed to configure speed for NFP4000.");
+			return ret;
+		}
+	}
+
+	nsp = nfp_eth_config_start(net_hw->cpp, eth_port->index);
+	if (nsp == NULL) {
+		PMD_DRV_LOG(ERR, "Couldn't get NSP.");
+		return -EIO;
+	}
+
+	if (link_speeds == RTE_ETH_LINK_SPEED_AUTONEG) {
+		if (eth_port->supp_aneg) {
+			ret = nfp_eth_set_aneg(nsp, NFP_ANEG_AUTO);
+			if (ret != 0) {
+				PMD_DRV_LOG(ERR, "Failed to set ANEG enable.");
+				goto config_cleanup;
+			}
+		}
+	} else {
+		ret = nfp_eth_set_aneg(nsp, NFP_ANEG_DISABLED);
+		if (ret != 0) {
+			PMD_DRV_LOG(ERR, "Failed to set ANEG disable.");
+			goto config_cleanup;
+		}
+
+		ret = nfp_eth_set_speed(nsp, configure_speed);
+		if (ret != 0) {
+			PMD_DRV_LOG(ERR, "Failed to set speed.");
+			goto config_cleanup;
+		}
+	}
+
+	return nfp_eth_config_commit_end(nsp);
+
+config_cleanup:
+	nfp_eth_config_cleanup_end(nsp);
+
+	return ret;
+}
+
 static int
 nfp_net_start(struct rte_eth_dev *dev)
 {
@@ -75,6 +219,13 @@ nfp_net_start(struct rte_eth_dev *dev)
 	/* Enabling the required queues in the device */
 	nfp_net_enable_queues(dev);
 
+	/* Configure the port speed and the auto-negotiation mode. */
+	ret = nfp_net_speed_configure(dev, net_hw);
+	if (ret < 0) {
+		PMD_DRV_LOG(ERR, "Failed to set the speed and auto-negotiation mode.");
+		return ret;
+	}
+
 	/* Check and configure queue intr-vector mapping */
 	if (dev->data->dev_conf.intr_conf.rxq != 0) {
 		if (app_fw_nic->multiport) {
-- 
2.39.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 4/7] net/nfp: modify the link update function
  2023-12-11  3:08 [PATCH 0/7] support link auto negotiation Chaoyong He
                   ` (2 preceding siblings ...)
  2023-12-11  3:08 ` [PATCH 3/7] net/nfp: support setting port speed Chaoyong He
@ 2023-12-11  3:08 ` Chaoyong He
  2023-12-11  3:08 ` [PATCH 5/7] net/nfp: support getting FEC capability Chaoyong He
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Chaoyong He @ 2023-12-11  3:08 UTC (permalink / raw)
  To: dev; +Cc: oss-drivers, Zerun Fu, Long Wu, Peng Zhang, Chaoyong He

From: Zerun Fu <zerun.fu@corigine.com>

Modify the link update function to get the new port speed state
after the port speed is changed, including the new speed and
whether the auto negotiation mode is enabled.

Signed-off-by: Zerun Fu <zerun.fu@corigine.com>
Reviewed-by: Long Wu <long.wu@corigine.com>
Reviewed-by: Peng Zhang <peng.zhang@corigine.com>
Reviewed-by: Chaoyong He <chaoyong.he@corigine.com>
---
 drivers/net/nfp/nfp_net_common.c  | 59 ++++++++++++++++++++++++-------
 drivers/net/nfp/nfpcore/nfp_nsp.c |  4 +--
 2 files changed, 48 insertions(+), 15 deletions(-)

diff --git a/drivers/net/nfp/nfp_net_common.c b/drivers/net/nfp/nfp_net_common.c
index ed410a7313..1658cc7d3c 100644
--- a/drivers/net/nfp/nfp_net_common.c
+++ b/drivers/net/nfp/nfp_net_common.c
@@ -643,6 +643,46 @@ nfp_net_allmulticast_disable(struct rte_eth_dev *dev)
 	return nfp_net_set_allmulticast_mode(dev, false);
 }
 
+static int
+nfp_net_speed_aneg_update(struct rte_eth_dev *dev,
+		struct nfp_net_hw *hw,
+		struct rte_eth_link *link)
+{
+	uint32_t i;
+	uint32_t speed;
+	struct nfp_eth_table *nfp_eth_table;
+	struct nfp_eth_table_port *eth_port;
+
+	/* Compare whether the current status has changed. */
+	if (dev->data->dev_link.link_status != link->link_status) {
+		nfp_eth_table = nfp_eth_read_ports(hw->cpp);
+		if (nfp_eth_table == NULL) {
+			PMD_DRV_LOG(DEBUG, "Error reading NFP ethernet table.");
+			return -EIO;
+		}
+
+		hw->pf_dev->nfp_eth_table->ports[hw->idx] = nfp_eth_table->ports[hw->idx];
+		free(nfp_eth_table);
+	}
+
+	nfp_eth_table = hw->pf_dev->nfp_eth_table;
+	eth_port = &nfp_eth_table->ports[hw->idx];
+	speed = eth_port->speed;
+
+	for (i = 0; i < RTE_DIM(nfp_net_link_speed_nfp2rte); i++) {
+		if (nfp_net_link_speed_nfp2rte[i] == speed) {
+			link->link_speed = speed;
+			break;
+		}
+	}
+
+	if (dev->data->dev_conf.link_speeds == RTE_ETH_LINK_SPEED_AUTONEG &&
+			eth_port->supp_aneg)
+		link->link_autoneg = RTE_ETH_LINK_AUTONEG;
+
+	return 0;
+}
+
 int
 nfp_net_link_update_common(struct rte_eth_dev *dev,
 		struct nfp_net_hw *hw,
@@ -650,23 +690,14 @@ nfp_net_link_update_common(struct rte_eth_dev *dev,
 		uint32_t link_status)
 {
 	int ret;
-	uint32_t i;
 	uint32_t nn_link_status;
-	struct nfp_eth_table *nfp_eth_table;
-
-	link->link_speed = RTE_ETH_SPEED_NUM_NONE;
 
 	if (link->link_status == RTE_ETH_LINK_UP) {
 		if (hw->pf_dev != NULL) {
-			nfp_eth_table = hw->pf_dev->nfp_eth_table;
-			if (nfp_eth_table != NULL) {
-				uint32_t speed = nfp_eth_table->ports[hw->idx].speed;
-				for (i = 0; i < RTE_DIM(nfp_net_link_speed_nfp2rte); i++) {
-					if (nfp_net_link_speed_nfp2rte[i] == speed) {
-						link->link_speed = speed;
-						break;
-					}
-				}
+			ret = nfp_net_speed_aneg_update(dev, hw, link);
+			if (ret != 0) {
+				PMD_DRV_LOG(DEBUG, "Failed to update speed and aneg.");
+				return ret;
 			}
 		} else {
 			/*
@@ -718,6 +749,8 @@ nfp_net_link_update(struct rte_eth_dev *dev,
 	link.link_duplex = RTE_ETH_LINK_FULL_DUPLEX;
 
 	ret = nfp_net_link_update_common(dev, hw, &link, nn_link_status);
+	if (ret == -EIO)
+		return ret;
 
 	/*
 	 * Notify the port to update the speed value in the CTRL BAR from NSP.
diff --git a/drivers/net/nfp/nfpcore/nfp_nsp.c b/drivers/net/nfp/nfpcore/nfp_nsp.c
index f67572be87..6a2ba709ab 100644
--- a/drivers/net/nfp/nfpcore/nfp_nsp.c
+++ b/drivers/net/nfp/nfpcore/nfp_nsp.c
@@ -221,7 +221,7 @@ nfp_nsp_check(struct nfp_nsp *state)
 	}
 
 	if ((reg & NSP_STATUS_BUSY) != 0) {
-		PMD_DRV_LOG(ERR, "Service processor busy!");
+		PMD_DRV_LOG(DEBUG, "Service processor busy!");
 		return -EBUSY;
 	}
 
@@ -258,7 +258,7 @@ nfp_nsp_open(struct nfp_cpp *cpp)
 
 	err = nfp_nsp_check(state);
 	if (err != 0) {
-		PMD_DRV_LOG(ERR, "NSP - check failed");
+		PMD_DRV_LOG(DEBUG, "NSP - check failed");
 		nfp_nsp_close(state);
 		return NULL;
 	}
-- 
2.39.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 5/7] net/nfp: support getting FEC capability
  2023-12-11  3:08 [PATCH 0/7] support link auto negotiation Chaoyong He
                   ` (3 preceding siblings ...)
  2023-12-11  3:08 ` [PATCH 4/7] net/nfp: modify the link update function Chaoyong He
@ 2023-12-11  3:08 ` Chaoyong He
  2023-12-11  3:08 ` [PATCH 6/7] net/nfp: support getting FEC mode Chaoyong He
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Chaoyong He @ 2023-12-11  3:08 UTC (permalink / raw)
  To: dev; +Cc: oss-drivers, Zerun Fu, Long Wu, Peng Zhang, Chaoyong He

From: Zerun Fu <zerun.fu@corigine.com>

Add support for querying FEC capabilities from the device. This
feature only shows the current port speed and the supported FEC
modes at that speed.

Signed-off-by: Zerun Fu <zerun.fu@corigine.com>
Reviewed-by: Long Wu <long.wu@corigine.com>
Reviewed-by: Peng Zhang <peng.zhang@corigine.com>
Reviewed-by: Chaoyong He <chaoyong.he@corigine.com>
---
 doc/guides/nics/features/nfp.ini |  1 +
 drivers/net/nfp/nfp_ethdev.c     |  1 +
 drivers/net/nfp/nfp_net_common.c | 45 ++++++++++++++++++++++++++++++++
 drivers/net/nfp/nfp_net_common.h |  3 +++
 4 files changed, 50 insertions(+)

diff --git a/doc/guides/nics/features/nfp.ini b/doc/guides/nics/features/nfp.ini
index df1d403c6e..3494111f86 100644
--- a/doc/guides/nics/features/nfp.ini
+++ b/doc/guides/nics/features/nfp.ini
@@ -19,6 +19,7 @@ RSS reta update      = Y
 Flow control         = Y
 VLAN offload         = Y
 QinQ offload         = Y
+FEC                  = Y
 L3 checksum offload  = Y
 L4 checksum offload  = Y
 Basic stats          = Y
diff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c
index 54d018870d..3c24ebeaf3 100644
--- a/drivers/net/nfp/nfp_ethdev.c
+++ b/drivers/net/nfp/nfp_ethdev.c
@@ -759,6 +759,7 @@ static const struct eth_dev_ops nfp_net_eth_dev_ops = {
 	.flow_ctrl_get          = nfp_net_flow_ctrl_get,
 	.flow_ctrl_set          = nfp_net_flow_ctrl_set,
 	.flow_ops_get           = nfp_net_flow_ops_get,
+	.fec_get_capability     = nfp_net_fec_get_capability,
 };
 
 static inline void
diff --git a/drivers/net/nfp/nfp_net_common.c b/drivers/net/nfp/nfp_net_common.c
index 1658cc7d3c..5aa85aa077 100644
--- a/drivers/net/nfp/nfp_net_common.c
+++ b/drivers/net/nfp/nfp_net_common.c
@@ -26,6 +26,9 @@
 #define NFP_ETH_OVERHEAD \
 	(RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN + RTE_VLAN_HLEN * 2)
 
+/* Only show FEC capability supported by the current speed. */
+#define NFP_FEC_CAPA_ENTRY_NUM  1
+
 enum nfp_xstat_group {
 	NFP_XSTAT_GROUP_NET,
 	NFP_XSTAT_GROUP_MAC
@@ -2281,3 +2284,45 @@ nfp_net_flow_ctrl_set(struct rte_eth_dev *dev,
 
 	return 0;
 }
+
+int
+nfp_net_fec_get_capability(struct rte_eth_dev *dev,
+		struct rte_eth_fec_capa *speed_fec_capa,
+		__rte_unused unsigned int num)
+{
+	uint16_t speed;
+	struct nfp_net_hw *hw;
+	uint32_t supported_fec;
+	struct nfp_eth_table *nfp_eth_table;
+	struct nfp_eth_table_port *eth_port;
+
+	hw = nfp_net_get_hw(dev);
+	if (hw->pf_dev == NULL)
+		return -EINVAL;
+
+	nfp_eth_table = hw->pf_dev->nfp_eth_table;
+	eth_port = &nfp_eth_table->ports[hw->idx];
+
+	speed = eth_port->speed;
+	supported_fec = nfp_eth_supported_fec_modes(eth_port);
+	if (speed == 0 || supported_fec == 0) {
+		PMD_DRV_LOG(ERR, "FEC modes supported or Speed is invalid.");
+		return -EINVAL;
+	}
+
+	if (speed_fec_capa == NULL)
+		return NFP_FEC_CAPA_ENTRY_NUM;
+
+	speed_fec_capa->speed = speed;
+
+	if ((supported_fec & NFP_FEC_AUTO) != 0)
+		speed_fec_capa->capa |= RTE_ETH_FEC_MODE_CAPA_MASK(AUTO);
+	if ((supported_fec & NFP_FEC_BASER) != 0)
+		speed_fec_capa->capa |= RTE_ETH_FEC_MODE_CAPA_MASK(BASER);
+	if ((supported_fec & NFP_FEC_REED_SOLOMON) != 0)
+		speed_fec_capa->capa |= RTE_ETH_FEC_MODE_CAPA_MASK(RS);
+	if ((supported_fec & NFP_FEC_DISABLED) != 0)
+		speed_fec_capa->capa |= RTE_ETH_FEC_MODE_CAPA_MASK(NOFEC);
+
+	return NFP_FEC_CAPA_ENTRY_NUM;
+}
diff --git a/drivers/net/nfp/nfp_net_common.h b/drivers/net/nfp/nfp_net_common.h
index aec3c51bdf..f0fe10b6cd 100644
--- a/drivers/net/nfp/nfp_net_common.h
+++ b/drivers/net/nfp/nfp_net_common.h
@@ -288,6 +288,9 @@ int nfp_net_flow_ctrl_get(struct rte_eth_dev *dev,
 int nfp_net_flow_ctrl_set(struct rte_eth_dev *dev,
 		struct rte_eth_fc_conf *fc_conf);
 void nfp_pf_uninit(struct nfp_pf_dev *pf_dev);
+int nfp_net_fec_get_capability(struct rte_eth_dev *dev,
+		struct rte_eth_fec_capa *speed_fec_capa,
+		unsigned int num);
 
 #define NFP_PRIV_TO_APP_FW_NIC(app_fw_priv)\
 	((struct nfp_app_fw_nic *)app_fw_priv)
-- 
2.39.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 6/7] net/nfp: support getting FEC mode
  2023-12-11  3:08 [PATCH 0/7] support link auto negotiation Chaoyong He
                   ` (4 preceding siblings ...)
  2023-12-11  3:08 ` [PATCH 5/7] net/nfp: support getting FEC capability Chaoyong He
@ 2023-12-11  3:08 ` Chaoyong He
  2023-12-11  3:08 ` [PATCH 7/7] net/nfp: support setting " Chaoyong He
  2023-12-12 15:28 ` [PATCH 0/7] support link auto negotiation Ferruh Yigit
  7 siblings, 0 replies; 9+ messages in thread
From: Chaoyong He @ 2023-12-11  3:08 UTC (permalink / raw)
  To: dev; +Cc: oss-drivers, Zerun Fu, Long Wu, Peng Zhang, Chaoyong He

From: Zerun Fu <zerun.fu@corigine.com>

Add support for querying current FEC mode from the device.

Signed-off-by: Zerun Fu <zerun.fu@corigine.com>
Reviewed-by: Long Wu <long.wu@corigine.com>
Reviewed-by: Peng Zhang <peng.zhang@corigine.com>
Reviewed-by: Chaoyong He <chaoyong.he@corigine.com>
---
 drivers/net/nfp/nfp_ethdev.c     |  1 +
 drivers/net/nfp/nfp_net_common.c | 60 ++++++++++++++++++++++++++++++++
 drivers/net/nfp/nfp_net_common.h |  2 ++
 3 files changed, 63 insertions(+)

diff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c
index 3c24ebeaf3..e3f5fe7917 100644
--- a/drivers/net/nfp/nfp_ethdev.c
+++ b/drivers/net/nfp/nfp_ethdev.c
@@ -760,6 +760,7 @@ static const struct eth_dev_ops nfp_net_eth_dev_ops = {
 	.flow_ctrl_set          = nfp_net_flow_ctrl_set,
 	.flow_ops_get           = nfp_net_flow_ops_get,
 	.fec_get_capability     = nfp_net_fec_get_capability,
+	.fec_get                = nfp_net_fec_get,
 };
 
 static inline void
diff --git a/drivers/net/nfp/nfp_net_common.c b/drivers/net/nfp/nfp_net_common.c
index 5aa85aa077..063c048675 100644
--- a/drivers/net/nfp/nfp_net_common.c
+++ b/drivers/net/nfp/nfp_net_common.c
@@ -2326,3 +2326,63 @@ nfp_net_fec_get_capability(struct rte_eth_dev *dev,
 
 	return NFP_FEC_CAPA_ENTRY_NUM;
 }
+
+static uint32_t
+nfp_net_fec_nfp_to_rte(enum nfp_eth_fec fec)
+{
+	switch (fec) {
+	case NFP_FEC_AUTO_BIT:
+		return RTE_ETH_FEC_MODE_CAPA_MASK(AUTO);
+	case NFP_FEC_BASER_BIT:
+		return RTE_ETH_FEC_MODE_CAPA_MASK(BASER);
+	case NFP_FEC_REED_SOLOMON_BIT:
+		return RTE_ETH_FEC_MODE_CAPA_MASK(RS);
+	case NFP_FEC_DISABLED_BIT:
+		return RTE_ETH_FEC_MODE_CAPA_MASK(NOFEC);
+	default:
+		PMD_DRV_LOG(ERR, "FEC mode is invalid.");
+		return 0;
+	}
+}
+
+int
+nfp_net_fec_get(struct rte_eth_dev *dev,
+		uint32_t *fec_capa)
+{
+	struct nfp_net_hw *hw;
+	struct nfp_eth_table *nfp_eth_table;
+	struct nfp_eth_table_port *eth_port;
+
+	hw = nfp_net_get_hw(dev);
+	if (hw->pf_dev == NULL)
+		return -EINVAL;
+
+	if (dev->data->dev_link.link_status == RTE_ETH_LINK_DOWN) {
+		nfp_eth_table = nfp_eth_read_ports(hw->cpp);
+		hw->pf_dev->nfp_eth_table->ports[hw->idx] = nfp_eth_table->ports[hw->idx];
+		free(nfp_eth_table);
+	}
+
+	nfp_eth_table = hw->pf_dev->nfp_eth_table;
+	eth_port = &nfp_eth_table->ports[hw->idx];
+
+	if (!nfp_eth_can_support_fec(eth_port)) {
+		PMD_DRV_LOG(ERR, "NFP can not support FEC.");
+		return -ENOTSUP;
+	}
+
+	/*
+	 * If link is down and AUTO is enabled, AUTO is returned, otherwise,
+	 * configured FEC mode is returned.
+	 * If link is up, current FEC mode is returned.
+	 */
+	if (dev->data->dev_link.link_status == RTE_ETH_LINK_DOWN)
+		*fec_capa = nfp_net_fec_nfp_to_rte(eth_port->fec);
+	else
+		*fec_capa = nfp_net_fec_nfp_to_rte(eth_port->act_fec);
+
+	if (*fec_capa == 0)
+		return -EINVAL;
+
+	return 0;
+}
diff --git a/drivers/net/nfp/nfp_net_common.h b/drivers/net/nfp/nfp_net_common.h
index f0fe10b6cd..fa88323b7c 100644
--- a/drivers/net/nfp/nfp_net_common.h
+++ b/drivers/net/nfp/nfp_net_common.h
@@ -291,6 +291,8 @@ void nfp_pf_uninit(struct nfp_pf_dev *pf_dev);
 int nfp_net_fec_get_capability(struct rte_eth_dev *dev,
 		struct rte_eth_fec_capa *speed_fec_capa,
 		unsigned int num);
+int nfp_net_fec_get(struct rte_eth_dev *dev,
+		uint32_t *fec_capa);
 
 #define NFP_PRIV_TO_APP_FW_NIC(app_fw_priv)\
 	((struct nfp_app_fw_nic *)app_fw_priv)
-- 
2.39.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 7/7] net/nfp: support setting FEC mode
  2023-12-11  3:08 [PATCH 0/7] support link auto negotiation Chaoyong He
                   ` (5 preceding siblings ...)
  2023-12-11  3:08 ` [PATCH 6/7] net/nfp: support getting FEC mode Chaoyong He
@ 2023-12-11  3:08 ` Chaoyong He
  2023-12-12 15:28 ` [PATCH 0/7] support link auto negotiation Ferruh Yigit
  7 siblings, 0 replies; 9+ messages in thread
From: Chaoyong He @ 2023-12-11  3:08 UTC (permalink / raw)
  To: dev; +Cc: oss-drivers, Zerun Fu, Long Wu, Peng Zhang, Chaoyong He

From: Zerun Fu <zerun.fu@corigine.com>

Add support for configuring FEC mode. This feature allows to set any
currently supported FEC mode.

Signed-off-by: Zerun Fu <zerun.fu@corigine.com>
Reviewed-by: Long Wu <long.wu@corigine.com>
Reviewed-by: Peng Zhang <peng.zhang@corigine.com>
Reviewed-by: Chaoyong He <chaoyong.he@corigine.com>
---
 drivers/net/nfp/nfp_ethdev.c      |  1 +
 drivers/net/nfp/nfp_net_common.c  | 54 +++++++++++++++++++++++++++++++
 drivers/net/nfp/nfp_net_common.h  |  2 ++
 drivers/net/nfp/nfpcore/nfp_nsp.h |  1 +
 4 files changed, 58 insertions(+)

diff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c
index e3f5fe7917..185b570892 100644
--- a/drivers/net/nfp/nfp_ethdev.c
+++ b/drivers/net/nfp/nfp_ethdev.c
@@ -761,6 +761,7 @@ static const struct eth_dev_ops nfp_net_eth_dev_ops = {
 	.flow_ops_get           = nfp_net_flow_ops_get,
 	.fec_get_capability     = nfp_net_fec_get_capability,
 	.fec_get                = nfp_net_fec_get,
+	.fec_set                = nfp_net_fec_set,
 };
 
 static inline void
diff --git a/drivers/net/nfp/nfp_net_common.c b/drivers/net/nfp/nfp_net_common.c
index 063c048675..eeb0aaae26 100644
--- a/drivers/net/nfp/nfp_net_common.c
+++ b/drivers/net/nfp/nfp_net_common.c
@@ -2386,3 +2386,57 @@ nfp_net_fec_get(struct rte_eth_dev *dev,
 
 	return 0;
 }
+
+static enum nfp_eth_fec
+nfp_net_fec_rte_to_nfp(uint32_t fec)
+{
+	switch (fec) {
+	case RTE_BIT32(RTE_ETH_FEC_AUTO):
+		return NFP_FEC_AUTO_BIT;
+	case RTE_BIT32(RTE_ETH_FEC_NOFEC):
+		return NFP_FEC_DISABLED_BIT;
+	case RTE_BIT32(RTE_ETH_FEC_RS):
+		return NFP_FEC_REED_SOLOMON_BIT;
+	case RTE_BIT32(RTE_ETH_FEC_BASER):
+		return NFP_FEC_BASER_BIT;
+	default:
+		return NFP_FEC_INVALID_BIT;
+	}
+}
+
+int
+nfp_net_fec_set(struct rte_eth_dev *dev,
+		uint32_t fec_capa)
+{
+	enum nfp_eth_fec fec;
+	struct nfp_net_hw *hw;
+	uint32_t supported_fec;
+	struct nfp_eth_table *nfp_eth_table;
+	struct nfp_eth_table_port *eth_port;
+
+	hw = nfp_net_get_hw(dev);
+	if (hw->pf_dev == NULL)
+		return -EINVAL;
+
+	nfp_eth_table = hw->pf_dev->nfp_eth_table;
+	eth_port = &nfp_eth_table->ports[hw->idx];
+
+	supported_fec = nfp_eth_supported_fec_modes(eth_port);
+	if (supported_fec == 0) {
+		PMD_DRV_LOG(ERR, "NFP can not support FEC.");
+		return -ENOTSUP;
+	}
+
+	fec = nfp_net_fec_rte_to_nfp(fec_capa);
+	if (fec == NFP_FEC_INVALID_BIT) {
+		PMD_DRV_LOG(ERR, "FEC modes is invalid.");
+		return -EINVAL;
+	}
+
+	if ((RTE_BIT32(fec) & supported_fec) == 0) {
+		PMD_DRV_LOG(ERR, "Unsupported FEC mode is set.");
+		return -EIO;
+	}
+
+	return nfp_eth_set_fec(hw->cpp, eth_port->index, fec);
+}
diff --git a/drivers/net/nfp/nfp_net_common.h b/drivers/net/nfp/nfp_net_common.h
index fa88323b7c..66c900e3b8 100644
--- a/drivers/net/nfp/nfp_net_common.h
+++ b/drivers/net/nfp/nfp_net_common.h
@@ -293,6 +293,8 @@ int nfp_net_fec_get_capability(struct rte_eth_dev *dev,
 		unsigned int num);
 int nfp_net_fec_get(struct rte_eth_dev *dev,
 		uint32_t *fec_capa);
+int nfp_net_fec_set(struct rte_eth_dev *dev,
+		uint32_t fec_capa);
 
 #define NFP_PRIV_TO_APP_FW_NIC(app_fw_priv)\
 	((struct nfp_app_fw_nic *)app_fw_priv)
diff --git a/drivers/net/nfp/nfpcore/nfp_nsp.h b/drivers/net/nfp/nfpcore/nfp_nsp.h
index 41e8402154..2ce05c2ec9 100644
--- a/drivers/net/nfp/nfpcore/nfp_nsp.h
+++ b/drivers/net/nfp/nfpcore/nfp_nsp.h
@@ -100,6 +100,7 @@ enum nfp_eth_fec {
 	NFP_FEC_BASER_BIT,
 	NFP_FEC_REED_SOLOMON_BIT,
 	NFP_FEC_DISABLED_BIT,
+	NFP_FEC_INVALID_BIT,
 };
 
 #define NFP_FEC_AUTO            RTE_BIT32(NFP_FEC_AUTO_BIT)
-- 
2.39.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 0/7] support link auto negotiation
  2023-12-11  3:08 [PATCH 0/7] support link auto negotiation Chaoyong He
                   ` (6 preceding siblings ...)
  2023-12-11  3:08 ` [PATCH 7/7] net/nfp: support setting " Chaoyong He
@ 2023-12-12 15:28 ` Ferruh Yigit
  7 siblings, 0 replies; 9+ messages in thread
From: Ferruh Yigit @ 2023-12-12 15:28 UTC (permalink / raw)
  To: Chaoyong He, dev; +Cc: oss-drivers

On 12/11/2023 3:08 AM, Chaoyong He wrote:
> This patch series add the support of link auto negotiation feature,
> including speed and FEC mode.
> 
> Zerun Fu (7):
>   net/nfp: set a new parameter to hwinfo
>   net/nfp: support getting speed capability
>   net/nfp: support setting port speed
>   net/nfp: modify the link update function
>   net/nfp: support getting FEC capability
>   net/nfp: support getting FEC mode
>   net/nfp: support setting FEC mode
>

Series applied to dpdk-next-net/main, thanks.

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2023-12-12 15:28 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-12-11  3:08 [PATCH 0/7] support link auto negotiation Chaoyong He
2023-12-11  3:08 ` [PATCH 1/7] net/nfp: set a new parameter to hwinfo Chaoyong He
2023-12-11  3:08 ` [PATCH 2/7] net/nfp: support getting speed capability Chaoyong He
2023-12-11  3:08 ` [PATCH 3/7] net/nfp: support setting port speed Chaoyong He
2023-12-11  3:08 ` [PATCH 4/7] net/nfp: modify the link update function Chaoyong He
2023-12-11  3:08 ` [PATCH 5/7] net/nfp: support getting FEC capability Chaoyong He
2023-12-11  3:08 ` [PATCH 6/7] net/nfp: support getting FEC mode Chaoyong He
2023-12-11  3:08 ` [PATCH 7/7] net/nfp: support setting " Chaoyong He
2023-12-12 15:28 ` [PATCH 0/7] support link auto negotiation Ferruh Yigit

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).