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