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

Reply via email to