From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by dpdk.org (Postfix) with ESMTP id 56D731F3 for ; Fri, 27 Sep 2013 17:40:55 +0200 (CEST) Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga102.fm.intel.com with ESMTP; 27 Sep 2013 08:41:36 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.90,994,1371106800"; d="scan'208";a="401996739" Received: from orsmsx103.amr.corp.intel.com ([10.22.225.130]) by fmsmga001.fm.intel.com with ESMTP; 27 Sep 2013 08:41:35 -0700 Received: from orsmsx102.amr.corp.intel.com ([169.254.1.143]) by ORSMSX103.amr.corp.intel.com ([169.254.2.200]) with mapi id 14.03.0123.003; Fri, 27 Sep 2013 08:41:34 -0700 From: "Venkatesan, Venky" To: Qinglai Xiao , "dev@dpdk.org" Thread-Topic: [dpdk-dev] [PATCH] Add support for Tx->Rx loopback mode for 82599. Thread-Index: AQHOur51JrsOncwAbUSThCjj2/po1pnZumlQ Date: Fri, 27 Sep 2013 15:41:33 +0000 Message-ID: <1FD9B82B8BF2CF418D9A1000154491D973F52E84@ORSMSX102.amr.corp.intel.com> References: <1380202484-4835-1-git-send-email-jigsaw@gmail.com> In-Reply-To: <1380202484-4835-1-git-send-email-jigsaw@gmail.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.22.254.140] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Subject: Re: [dpdk-dev] [PATCH] Add support for Tx->Rx loopback mode for 82599. X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 27 Sep 2013 15:40:56 -0000 Qinglai,=20 Looks good. I will try it out tonight.=20 Thanks ...=20 -Venky -----Original Message----- From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Qinglai Xiao Sent: Thursday, September 26, 2013 6:35 AM To: dev@dpdk.org Subject: [dpdk-dev] [PATCH] Add support for Tx->Rx loopback mode for 82599. 82599 has two loopback operation modes, Tx->Rx and Rx->Tx. For the time being only Tx->Rx is supported. The new field lpbk_mode added in struct rte_eth_conf defines loopback opera= tion mode for certain ethernet controller. By default the value of lpbk_mod= e is 0, meaning loopback mode disabled. Since each ethernet controller has its own definition of loopback modes, AP= I user has to check both datasheet and implementation of certain driver so = as to understand what are valid values to be set, and what are the expected= behaviors. Check IXGBE_LPBK_82599_XXX which are defined in ixgbe_ethdev.h for valid va= lues of 82599 loopback mode. Signed-off-by: Qinglai Xiao --- lib/librte_ether/rte_ethdev.h | 5 +++++ lib/librte_pmd_ixgbe/ixgbe_ethdev.c | 7 ++++++ lib/librte_pmd_ixgbe/ixgbe_ethdev.h | 5 +++++ lib/librte_pmd_ixgbe/ixgbe_rxtx.c | 42 +++++++++++++++++++++++++++++++= ++++ 4 files changed, 59 insertions(+) diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h = index 2d7385f..4c1b3c8 100644 --- a/lib/librte_ether/rte_ethdev.h +++ b/lib/librte_ether/rte_ethdev.h @@ -672,6 +672,11 @@ struct rte_eth_conf { /**< ETH_LINK_[HALF_DUPLEX|FULL_DUPLEX], or 0 for autonegotation */ struct rte_eth_rxmode rxmode; /**< Port RX configuration. */ struct rte_eth_txmode txmode; /**< Port TX configuration. */ + uint32_t lpbk_mode; /**< Loopback operation mode. By default the value + is 0, meaning the loopback mode is disabled. + Read the datasheet of given ethernet controller + for details. The possible values of this field + are defined in implementation of each driver. */ union { struct rte_eth_rss_conf rss_conf; /**< Port RSS configuration */ struct rte_eth_vmdq_dcb_conf vmdq_dcb_conf; diff --git a/lib/librte_pmd_= ixgbe/ixgbe_ethdev.c b/lib/librte_pmd_ixgbe/ixgbe_ethdev.c index 9235f9d..efb8a3b 100644 --- a/lib/librte_pmd_ixgbe/ixgbe_ethdev.c +++ b/lib/librte_pmd_ixgbe/ixgbe_ethdev.c @@ -1203,6 +1203,11 @@ ixgbe_dev_start(struct rte_eth_dev *dev) /* Turn on the laser */ ixgbe_enable_tx_laser(hw); =20 + /* Skip link setup if loopback mode is enabled for 82599. */ + if (hw->mac.type =3D=3D ixgbe_mac_82599EB && + dev->data->dev_conf.lpbk_mode =3D=3D IXGBE_LPBK_82599_TX_RX) + goto skip_link_setup; + err =3D ixgbe_check_link(hw, &speed, &link_up, 0); if (err) goto error; @@ -1239,6 +1244,8 @@ ixgbe_dev_start(struct rte_eth_dev *dev) if (err) goto error; =20 +skip_link_setup: + /* check if lsc interrupt is enabled */ if (dev->data->dev_conf.intr_conf.lsc !=3D 0) ixgbe_dev_lsc_interrupt_setup(dev); diff --git a/lib/librte_pmd_ixgbe/ixgbe_ethdev.h b/lib/librte_pmd_ixgbe/ixg= be_ethdev.h index 260622a..4884841 100644 --- a/lib/librte_pmd_ixgbe/ixgbe_ethdev.h +++ b/lib/librte_pmd_ixgbe/ixgbe_ethdev.h @@ -62,6 +62,11 @@ #endif #define IXGBE_HWSTRIP_BITMAP_SIZE (IXGBE_MAX_RX_QUEUE_NUM / (sizeof(uint32= _t) * NBBY)) =20 +/* Loopback operation modes */ +/* 82599 specific loopback operation types */ +#define IXGBE_LPBK_82599_NONE 0x0 /* Default value. Loopback is disabled.= */ +#define IXGBE_LPBK_82599_TX_RX 0x1 /* Tx->Rx loopback operation is enable= d. */ + =20 /* * Information about the fdir mode. diff --git a/lib/librte_pmd_ixgbe/ixgbe_rxtx.c b/lib/librte_pmd_ixgbe/ixgbe= _rxtx.c index 5fba01d..5c8668e 100644 --- a/lib/librte_pmd_ixgbe/ixgbe_rxtx.c +++ b/lib/librte_pmd_ixgbe/ixgbe_rxtx.c @@ -78,6 +78,7 @@ #include "ixgbe/ixgbe_vf.h" #include "ixgbe_ethdev.h" #include "ixgbe/ixgbe_dcb.h" +#include "ixgbe/ixgbe_common.h" =20 =20 #define RTE_PMD_IXGBE_TX_MAX_BURST 32 @@ -3252,6 +3253,13 @@ ixgbe_dev_rx_init(struct rte_eth_dev *dev) } else hlreg0 &=3D ~IXGBE_HLREG0_JUMBOEN; =20 + /* + * If loopback mode is configured for 82599, set LPBK bit. + */ + if (hw->mac.type =3D=3D ixgbe_mac_82599EB && + dev->data->dev_conf.lpbk_mode =3D=3D IXGBE_LPBK_82599_TX_RX) + hlreg0 |=3D IXGBE_HLREG0_LPBK; + IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg0); =20 /* Setup RX queues */ @@ -3432,6 +3440,34 @@ ixgbe_dev_tx_init(struct rte_eth_dev *dev) } =20 /* + * Set up link for 82599 loopback mode Tx->Rx. + */ +static inline void +ixgbe_setup_loopback_link_82599(struct ixgbe_hw *hw) { + DEBUGFUNC("ixgbe_setup_loopback_link_82599"); + + if (ixgbe_verify_lesm_fw_enabled_82599(hw)) { + if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_MAC_CSR_SM) !=3D + IXGBE_SUCCESS) { + PMD_INIT_LOG(ERR, "Could not enable loopback mode\n"); + /* ignore error */ + return; + } + } + + /* Restart link */ + IXGBE_WRITE_REG(hw, + IXGBE_AUTOC, + IXGBE_AUTOC_LMS_10G_LINK_NO_AN | IXGBE_AUTOC_FLU); + ixgbe_reset_pipeline_82599(hw); + + hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_MAC_CSR_SM); + msec_delay(50); +} + + +/* * Start Transmit and Receive Units. */ void @@ -3509,6 +3545,12 @@ ixgbe_dev_rxtx_start(struct rte_eth_dev *dev) rxctrl |=3D IXGBE_RXCTRL_DMBYPS; rxctrl |=3D IXGBE_RXCTRL_RXEN; hw->mac.ops.enable_rx_dma(hw, rxctrl); + + /* If loopback mode is enabled for 82599, set up the link accordingly */ + if (hw->mac.type =3D=3D ixgbe_mac_82599EB && + dev->data->dev_conf.lpbk_mode =3D=3D IXGBE_LPBK_82599_TX_RX) + ixgbe_setup_loopback_link_82599(hw); + } =20 =20 -- 1.7.9.5