[dpdk-dev] [PATCH] Add support for Tx->Rx loopback mode for 82599.
Ivan Boule
ivan.boule at 6wind.com
Fri Sep 27 10:30:27 CEST 2013
Acked-by: Ivan Boule <ivan.boule at 6wind.com>
On 09/26/2013 03:34 PM, Qinglai Xiao wrote:
> 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
> operation mode for certain ethernet controller. By default the value
> of lpbk_mode is 0, meaning loopback mode disabled.
>
> Since each ethernet controller has its own definition of loopback modes,
> API 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 values of 82599 loopback mode.
>
> Signed-off-by: Qinglai Xiao <jigsaw at gmail.com>
> ---
> 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);
>
> + /* Skip link setup if loopback mode is enabled for 82599. */
> + if (hw->mac.type == ixgbe_mac_82599EB &&
> + dev->data->dev_conf.lpbk_mode == IXGBE_LPBK_82599_TX_RX)
> + goto skip_link_setup;
> +
> err = 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;
>
> +skip_link_setup:
> +
> /* check if lsc interrupt is enabled */
> if (dev->data->dev_conf.intr_conf.lsc != 0)
> ixgbe_dev_lsc_interrupt_setup(dev);
> diff --git a/lib/librte_pmd_ixgbe/ixgbe_ethdev.h b/lib/librte_pmd_ixgbe/ixgbe_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))
>
> +/* 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 enabled. */
> +
>
> /*
> * 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"
>
>
> #define RTE_PMD_IXGBE_TX_MAX_BURST 32
> @@ -3252,6 +3253,13 @@ ixgbe_dev_rx_init(struct rte_eth_dev *dev)
> } else
> hlreg0 &= ~IXGBE_HLREG0_JUMBOEN;
>
> + /*
> + * If loopback mode is configured for 82599, set LPBK bit.
> + */
> + if (hw->mac.type == ixgbe_mac_82599EB &&
> + dev->data->dev_conf.lpbk_mode == IXGBE_LPBK_82599_TX_RX)
> + hlreg0 |= IXGBE_HLREG0_LPBK;
> +
> IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg0);
>
> /* Setup RX queues */
> @@ -3432,6 +3440,34 @@ ixgbe_dev_tx_init(struct rte_eth_dev *dev)
> }
>
> /*
> + * 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) !=
> + 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 |= IXGBE_RXCTRL_DMBYPS;
> rxctrl |= 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 == ixgbe_mac_82599EB &&
> + dev->data->dev_conf.lpbk_mode == IXGBE_LPBK_82599_TX_RX)
> + ixgbe_setup_loopback_link_82599(hw);
> +
> }
>
>
--
Ivan Boule
6WIND Development Engineer
More information about the dev
mailing list