All of lore.kernel.org
 help / color / mirror / Atom feed
From: Harman Kalra <hkalra@marvell.com>
To: <dev@dpdk.org>, Jerin Jacob <jerinj@marvell.com>,
	Maciej Czekaj <mczekaj@marvell.com>
Cc: Harman Kalra <hkalra@marvell.com>
Subject: [PATCH v2 07/11] net/thunderx: setting link attributes
Date: Mon, 23 May 2022 21:40:56 +0530	[thread overview]
Message-ID: <20220523161100.86280-7-hkalra@marvell.com> (raw)
In-Reply-To: <20220523161100.86280-1-hkalra@marvell.com>

Adding support to configure link attributes like speed,
duplex, negotiation.

Signed-off-by: Harman Kalra <hkalra@marvell.com>
---
 drivers/net/thunderx/base/nicvf_mbox.c | 16 +++++
 drivers/net/thunderx/base/nicvf_mbox.h | 14 ++++
 drivers/net/thunderx/nicvf_ethdev.c    | 88 ++++++++++++++++++++++++--
 drivers/net/thunderx/nicvf_struct.h    |  9 +++
 4 files changed, 122 insertions(+), 5 deletions(-)

diff --git a/drivers/net/thunderx/base/nicvf_mbox.c b/drivers/net/thunderx/base/nicvf_mbox.c
index 275e593286..352b85d9e2 100644
--- a/drivers/net/thunderx/base/nicvf_mbox.c
+++ b/drivers/net/thunderx/base/nicvf_mbox.c
@@ -423,6 +423,22 @@ nicvf_mbox_set_link_up_down(struct nicvf *nic, bool enable)
 	mbx.lbk.enable = enable;
 	return nicvf_mbox_send_msg_to_pf(nic, &mbx);
 }
+
+
+int
+nicvf_mbox_change_mode(struct nicvf *nic, struct change_link_mode *cfg)
+{
+	struct nic_mbx mbx = { .msg = { 0 } };
+
+	mbx.mode.msg = NIC_MBOX_MSG_CHANGE_MODE;
+	mbx.mode.vf_id = nic->vf_id;
+	mbx.mode.speed = cfg->speed;
+	mbx.mode.duplex = cfg->duplex;
+	mbx.mode.autoneg = cfg->autoneg;
+	mbx.mode.qlm_mode = cfg->qlm_mode;
+	return nicvf_mbox_send_msg_to_pf(nic, &mbx);
+}
+
 void
 nicvf_mbox_shutdown(struct nicvf *nic)
 {
diff --git a/drivers/net/thunderx/base/nicvf_mbox.h b/drivers/net/thunderx/base/nicvf_mbox.h
index 044220a2cd..322c8159cb 100644
--- a/drivers/net/thunderx/base/nicvf_mbox.h
+++ b/drivers/net/thunderx/base/nicvf_mbox.h
@@ -41,6 +41,7 @@
 #define	NIC_MBOX_MSG_LOOPBACK		0x16	/* Set interface in loopback */
 #define	NIC_MBOX_MSG_RESET_STAT_COUNTER 0x17	/* Reset statistics counters */
 #define	NIC_MBOX_MSG_SET_LINK		0x21	/* Set link up/down */
+#define	NIC_MBOX_MSG_CHANGE_MODE	0x22	/* Change mode */
 #define	NIC_MBOX_MSG_CFG_DONE		0xF0	/* VF configuration done */
 #define	NIC_MBOX_MSG_SHUTDOWN		0xF1	/* VF is being shutdown */
 #define NIC_MBOX_MSG_RESET_XCAST	0xF2    /* Reset DCAM filtering mode */
@@ -178,6 +179,17 @@ struct set_link_state {
 	bool	   enable;
 };
 
+/* Change link mode */
+struct change_link_mode_msg {
+	uint8_t    msg;
+	uint8_t    vf_id;
+	uint8_t    qlm_mode;
+	bool	   autoneg;
+	uint8_t    duplex;
+	uint32_t   speed;
+
+};
+
 struct nic_mbx {
 /* 128 bit shared memory between PF and each VF */
 union {
@@ -196,6 +208,7 @@ union {
 	struct set_loopback	lbk;
 	struct reset_stat_cfg	reset_stat;
 	struct set_link_state	set_link;
+	struct change_link_mode_msg mode;
 };
 };
 
@@ -225,5 +238,6 @@ void nicvf_mbox_shutdown(struct nicvf *nic);
 void nicvf_mbox_cfg_done(struct nicvf *nic);
 void nicvf_mbox_link_change(struct nicvf *nic);
 void nicvf_mbox_reset_xcast(struct nicvf *nic);
+int nicvf_mbox_change_mode(struct nicvf *nic, struct change_link_mode *cfg);
 
 #endif /* __THUNDERX_NICVF_MBOX__ */
diff --git a/drivers/net/thunderx/nicvf_ethdev.c b/drivers/net/thunderx/nicvf_ethdev.c
index 1e268d9b0f..0f79b02172 100644
--- a/drivers/net/thunderx/nicvf_ethdev.c
+++ b/drivers/net/thunderx/nicvf_ethdev.c
@@ -55,6 +55,82 @@ RTE_LOG_REGISTER_SUFFIX(nicvf_logtype_mbox, mbox, NOTICE);
 RTE_LOG_REGISTER_SUFFIX(nicvf_logtype_init, init, NOTICE);
 RTE_LOG_REGISTER_SUFFIX(nicvf_logtype_driver, driver, NOTICE);
 
+#define NICVF_QLM_MODE_SGMII  7
+#define NICVF_QLM_MODE_XFI   12
+
+enum nicvf_link_speed {
+	NICVF_LINK_SPEED_SGMII,
+	NICVF_LINK_SPEED_XAUI,
+	NICVF_LINK_SPEED_RXAUI,
+	NICVF_LINK_SPEED_10G_R,
+	NICVF_LINK_SPEED_40G_R,
+	NICVF_LINK_SPEED_RESERVE1,
+	NICVF_LINK_SPEED_QSGMII,
+	NICVF_LINK_SPEED_RESERVE2,
+	NICVF_LINK_SPEED_UNKNOWN = 255
+};
+
+static inline uint32_t
+nicvf_parse_link_speeds(uint32_t link_speeds)
+{
+	uint32_t link_speed = NICVF_LINK_SPEED_UNKNOWN;
+
+	if (link_speeds & RTE_ETH_LINK_SPEED_40G)
+		link_speed = NICVF_LINK_SPEED_40G_R;
+
+	if (link_speeds & RTE_ETH_LINK_SPEED_10G) {
+		link_speed  = NICVF_LINK_SPEED_XAUI;
+		link_speed |= NICVF_LINK_SPEED_RXAUI;
+		link_speed |= NICVF_LINK_SPEED_10G_R;
+	}
+
+	if (link_speeds & RTE_ETH_LINK_SPEED_5G)
+		link_speed = NICVF_LINK_SPEED_QSGMII;
+
+	if (link_speeds & RTE_ETH_LINK_SPEED_1G)
+		link_speed = NICVF_LINK_SPEED_SGMII;
+
+	return link_speed;
+}
+
+static inline uint8_t
+nicvf_parse_eth_link_duplex(uint32_t link_speeds)
+{
+	if ((link_speeds & RTE_ETH_LINK_SPEED_10M_HD) ||
+			(link_speeds & RTE_ETH_LINK_SPEED_100M_HD))
+		return RTE_ETH_LINK_HALF_DUPLEX;
+	else
+		return RTE_ETH_LINK_FULL_DUPLEX;
+}
+
+static int
+nicvf_apply_link_speed(struct rte_eth_dev *dev)
+{
+	struct nicvf *nic = nicvf_pmd_priv(dev);
+	struct rte_eth_conf *conf = &dev->data->dev_conf;
+	struct change_link_mode cfg;
+	if (conf->link_speeds == RTE_ETH_LINK_SPEED_AUTONEG)
+		/* TODO: Handle this case */
+		return 0;
+
+	cfg.speed = nicvf_parse_link_speeds(conf->link_speeds);
+	cfg.autoneg = (conf->link_speeds & RTE_ETH_LINK_SPEED_FIXED) ? 1 : 0;
+	cfg.duplex = nicvf_parse_eth_link_duplex(conf->link_speeds);
+	cfg.qlm_mode = ((conf->link_speeds & RTE_ETH_LINK_SPEED_1G) ?
+			NICVF_QLM_MODE_SGMII :
+			(conf->link_speeds & RTE_ETH_LINK_SPEED_10G) ?
+			NICVF_QLM_MODE_XFI : 0);
+
+	if (cfg.speed != NICVF_LINK_SPEED_UNKNOWN &&
+	    (cfg.speed != nic->speed || cfg.duplex != nic->duplex)) {
+		nic->speed = cfg.speed;
+		nic->duplex = cfg.duplex;
+		return nicvf_mbox_change_mode(nic, &cfg);
+	} else {
+		return 0;
+	}
+}
+
 static void
 nicvf_link_status_update(struct nicvf *nic,
 			 struct rte_eth_link *link)
@@ -1728,6 +1804,13 @@ nicvf_dev_start(struct rte_eth_dev *dev)
 		return -EBUSY;
 	}
 
+	/* Apply new link configurations if changed */
+	ret = nicvf_apply_link_speed(dev);
+	if (ret) {
+		PMD_INIT_LOG(ERR, "Failed to set link configuration\n");
+		return ret;
+	}
+
 	ret = nicvf_vf_start(dev, nic, rbdrsz);
 	if (ret != 0)
 		return ret;
@@ -1921,11 +2004,6 @@ nicvf_dev_configure(struct rte_eth_dev *dev)
 		return -EINVAL;
 	}
 
-	if (conf->link_speeds & RTE_ETH_LINK_SPEED_FIXED) {
-		PMD_INIT_LOG(INFO, "Setting link speed/duplex not supported");
-		return -EINVAL;
-	}
-
 	if (conf->dcb_capability_en) {
 		PMD_INIT_LOG(INFO, "DCB enable not supported");
 		return -EINVAL;
diff --git a/drivers/net/thunderx/nicvf_struct.h b/drivers/net/thunderx/nicvf_struct.h
index c7ea13313e..13cf8feeb1 100644
--- a/drivers/net/thunderx/nicvf_struct.h
+++ b/drivers/net/thunderx/nicvf_struct.h
@@ -113,4 +113,13 @@ struct nicvf {
 	struct nicvf *snicvf[MAX_SQS_PER_VF];
 } __rte_cache_aligned;
 
+struct change_link_mode {
+	bool	   enable;
+	uint8_t    qlm_mode;
+	bool	   autoneg;
+	uint8_t    duplex;
+	uint32_t   speed;
+
+};
+
 #endif /* _THUNDERX_NICVF_STRUCT_H */
-- 
2.18.0


  parent reply	other threads:[~2022-05-23 16:11 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-05-17 17:39 [PATCH 01/12] config: add thundert83 config Harman Kalra
2022-05-17 17:39 ` [PATCH 02/12] event/octeontx: fix SSO fastpath Harman Kalra
2022-05-23 16:10   ` [PATCH v2 01/11] " Harman Kalra
2022-05-23 16:10     ` [PATCH v2 02/11] net/octeontx: fix port close Harman Kalra
2022-05-23 16:10     ` [PATCH v2 03/11] net/octeontx: setting link attributes Harman Kalra
2022-05-23 16:10     ` [PATCH v2 04/11] net/octeontx: handle port reconfiguration Harman Kalra
2022-05-23 16:10     ` [PATCH v2 05/11] net/thunderx: implement polling of link state change Harman Kalra
2022-05-23 16:10     ` [PATCH v2 06/11] net/thunderx: reset Rx DMAC control register Harman Kalra
2022-05-23 16:10     ` Harman Kalra [this message]
2022-05-23 16:10     ` [PATCH v2 08/11] net/octeontx: implement xstats Harman Kalra
2022-05-23 16:10     ` [PATCH v2 09/11] net/octeontx: support allmulticast Harman Kalra
2022-05-23 16:10     ` [PATCH v2 10/11] net/thunderx: device attach from secondary Harman Kalra
2022-05-23 16:11     ` [PATCH v2 11/11] net/thunderx: populate max and min MTU values Harman Kalra
2022-05-24  8:42   ` [PATCH v3 01/11] event/octeontx: fix SSO fastpath Harman Kalra
2022-05-24  8:42     ` [PATCH v3 02/11] net/octeontx: fix port close Harman Kalra
2022-05-24  8:42     ` [PATCH v3 03/11] net/octeontx: setting link attributes Harman Kalra
2022-05-24  8:42     ` [PATCH v3 04/11] net/octeontx: handle port reconfiguration Harman Kalra
2022-05-24  8:42     ` [PATCH v3 05/11] net/thunderx: implement polling of link state change Harman Kalra
2022-05-24  8:42     ` [PATCH v3 06/11] net/thunderx: reset Rx DMAC control register Harman Kalra
2022-05-24  8:42     ` [PATCH v3 07/11] net/thunderx: setting link attributes Harman Kalra
2022-05-24  8:42     ` [PATCH v3 08/11] net/octeontx: implement xstats Harman Kalra
2022-06-09 16:13       ` Jerin Jacob
2022-05-24  8:42     ` [PATCH v3 09/11] net/octeontx: support allmulticast Harman Kalra
2022-05-24  8:42     ` [PATCH v3 10/11] net/thunderx: device attach from secondary Harman Kalra
2022-05-24  8:42     ` [PATCH v3 11/11] net/thunderx: populate max and min MTU values Harman Kalra
2022-06-09 15:55       ` Jerin Jacob
2022-06-09 15:53     ` [PATCH v3 01/11] event/octeontx: fix SSO fastpath Jerin Jacob
2022-05-17 17:39 ` [PATCH 03/12] net/octeontx: fix port close Harman Kalra
2022-05-17 17:39 ` [PATCH 04/12] net/octeontx: setting link attributes Harman Kalra
2022-05-17 17:39 ` [PATCH 05/12] net/octeontx: handle port reconfiguration Harman Kalra
2022-05-17 17:39 ` [PATCH 06/12] net/thunderx: implement polling of link state change Harman Kalra
2022-05-17 17:39 ` [PATCH 07/12] net/thunderx: reset Rx DMAC control register Harman Kalra
2022-05-17 17:39 ` [PATCH 08/12] net/thunderx: setting link attributes Harman Kalra
2022-05-17 17:39 ` [PATCH 09/12] net/octeontx: implement xstats Harman Kalra
2022-05-17 17:39 ` [PATCH 10/12] net/octeontx: support allmulticast Harman Kalra
2022-05-17 17:39 ` [PATCH 11/12] net/thunderx: device attach from secondary Harman Kalra
2022-05-17 17:39 ` [PATCH 12/12] net/thunderx: populate max and min MTU values Harman Kalra
2022-05-18  6:10 ` [PATCH 01/12] config: add thundert83 config Ruifeng Wang
2022-05-23 13:34 ` [PATCH v2] config: add thunderX t83 config Harman Kalra
2022-06-01 22:02   ` Thomas Monjalon

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220523161100.86280-7-hkalra@marvell.com \
    --to=hkalra@marvell.com \
    --cc=dev@dpdk.org \
    --cc=jerinj@marvell.com \
    --cc=mczekaj@marvell.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.