From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <dev-bounces@dpdk.org>
Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124])
	by inbox.dpdk.org (Postfix) with ESMTP id BEB19A0C56;
	Wed,  8 Sep 2021 10:37:47 +0200 (CEST)
Received: from [217.70.189.124] (localhost [127.0.0.1])
	by mails.dpdk.org (Postfix) with ESMTP id 466B9411C3;
	Wed,  8 Sep 2021 10:36:49 +0200 (CEST)
Received: from smtpproxy21.qq.com (smtpbg702.qq.com [203.205.195.102])
 by mails.dpdk.org (Postfix) with ESMTP id 0375E411A9
 for <dev@dpdk.org>; Wed,  8 Sep 2021 10:36:47 +0200 (CEST)
X-QQ-mid: bizesmtp47t1631090204tdqap80a
Received: from wxdbg.localdomain.com (unknown [183.129.236.74])
 by esmtp6.qq.com (ESMTP) with 
 id ; Wed, 08 Sep 2021 16:36:43 +0800 (CST)
X-QQ-SSF: 01400000002000E0G000B00A0000000
X-QQ-FEAT: 83ShfzFP0oC6bJ7C+d6Pgqvbsoj0NjLnna/InzWGePxQOp8E5JgXLZYRO1zcx
 rjljFCZmuhDhwSxRMF1Rm5vWbtQDe5KH510fnCOeJft/9IOkJWUS/xVOMgkrhgYGrsby45Z
 cGkH44x512mtZNRt++tFH9nvWeqVzbHsqQDwKGHMLt7p4gIUpfm9h+u4cveAPsymFLjeDVS
 v0KHUsJW4nTDQ7iupD72MZidQOm46yjY+am6PVI8ndv8nGg1xwto09qoTrUfBhr5SKqUp+I
 dJIqjQMN0NoSwnCW5e3gMhaer8fNSw+XnqJs4ChmWfcfmQ1wmSR7ZZAcuq0KOF5OgWCSFPC
 Cxe6ChxwTfIDY42LkLbSMk8ANs9SMp4R/5tW2Pf
X-QQ-GoodBg: 2
From: Jiawen Wu <jiawenwu@trustnetic.com>
To: dev@dpdk.org
Cc: Jiawen Wu <jiawenwu@trustnetic.com>
Date: Wed,  8 Sep 2021 16:37:39 +0800
Message-Id: <20210908083758.312055-14-jiawenwu@trustnetic.com>
X-Mailer: git-send-email 2.27.0
In-Reply-To: <20210908083758.312055-1-jiawenwu@trustnetic.com>
References: <20210908083758.312055-1-jiawenwu@trustnetic.com>
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
X-QQ-SENDSIZE: 520
Feedback-ID: bizesmtp:trustnetic.com:qybgforeign:qybgforeign6
X-QQ-Bgrelay: 1
Subject: [dpdk-dev] [PATCH 13/32] net/ngbe: add loopback mode
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: DPDK patches and discussions <dev.dpdk.org>
List-Unsubscribe: <https://mails.dpdk.org/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://mails.dpdk.org/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <https://mails.dpdk.org/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
Errors-To: dev-bounces@dpdk.org
Sender: "dev" <dev-bounces@dpdk.org>

Support loopback operation mode.

Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com>
---
 drivers/net/ngbe/ngbe_ethdev.c |  6 ++++++
 drivers/net/ngbe/ngbe_rxtx.c   | 28 ++++++++++++++++++++++++++++
 2 files changed, 34 insertions(+)

diff --git a/drivers/net/ngbe/ngbe_ethdev.c b/drivers/net/ngbe/ngbe_ethdev.c
index 5566bf26a9..9caca55df3 100644
--- a/drivers/net/ngbe/ngbe_ethdev.c
+++ b/drivers/net/ngbe/ngbe_ethdev.c
@@ -850,6 +850,10 @@ ngbe_dev_start(struct rte_eth_dev *dev)
 		goto error;
 	}
 
+	/* Skip link setup if loopback mode is enabled. */
+	if (hw->is_pf && dev->data->dev_conf.lpbk_mode)
+		goto skip_link_setup;
+
 	err = hw->mac.check_link(hw, &speed, &link_up, 0);
 	if (err != 0)
 		goto error;
@@ -893,6 +897,8 @@ ngbe_dev_start(struct rte_eth_dev *dev)
 	if (err != 0)
 		goto error;
 
+skip_link_setup:
+
 	if (rte_intr_allow_others(intr_handle)) {
 		ngbe_dev_misc_interrupt_setup(dev);
 		/* check if lsc interrupt is enabled */
diff --git a/drivers/net/ngbe/ngbe_rxtx.c b/drivers/net/ngbe/ngbe_rxtx.c
index 1151173b02..22693c144a 100644
--- a/drivers/net/ngbe/ngbe_rxtx.c
+++ b/drivers/net/ngbe/ngbe_rxtx.c
@@ -2420,6 +2420,17 @@ ngbe_dev_rx_init(struct rte_eth_dev *dev)
 			NGBE_FRMSZ_MAX(NGBE_FRAME_SIZE_DFT));
 	}
 
+	/*
+	 * If loopback mode is configured, set LPBK bit.
+	 */
+	hlreg0 = rd32(hw, NGBE_PSRCTL);
+	if (hw->is_pf && dev->data->dev_conf.lpbk_mode)
+		hlreg0 |= NGBE_PSRCTL_LBENA;
+	else
+		hlreg0 &= ~NGBE_PSRCTL_LBENA;
+
+	wr32(hw, NGBE_PSRCTL, hlreg0);
+
 	/*
 	 * Assume no header split and no VLAN strip support
 	 * on any Rx queue first .
@@ -2538,6 +2549,19 @@ ngbe_dev_tx_init(struct rte_eth_dev *dev)
 	}
 }
 
+/*
+ * Set up link loopback mode Tx->Rx.
+ */
+static inline void
+ngbe_setup_loopback_link(struct ngbe_hw *hw)
+{
+	PMD_INIT_FUNC_TRACE();
+
+	wr32m(hw, NGBE_MACRXCFG, NGBE_MACRXCFG_LB, NGBE_MACRXCFG_LB);
+
+	msec_delay(50);
+}
+
 /*
  * Start Transmit and Receive Units.
  */
@@ -2592,6 +2616,10 @@ ngbe_dev_rxtx_start(struct rte_eth_dev *dev)
 	rxctrl |= NGBE_PBRXCTL_ENA;
 	hw->mac.enable_rx_dma(hw, rxctrl);
 
+	/* If loopback mode is enabled, set up the link accordingly */
+	if (hw->is_pf && dev->data->dev_conf.lpbk_mode)
+		ngbe_setup_loopback_link(hw);
+
 	return 0;
 }
 
-- 
2.21.0.windows.1