From: Jiawen Wu Date: Thu, 21 Oct 2021 09:50:11 +0000 (+0800) Subject: net/ngbe: support loopback mode X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=d4a3fe694d0e1481212c328bef5fd8f3cc0b31df;p=dpdk.git net/ngbe: support loopback mode Support loopback operation mode. Signed-off-by: Jiawen Wu --- diff --git a/drivers/net/ngbe/ngbe_ethdev.c b/drivers/net/ngbe/ngbe_ethdev.c index 394b60247f..fc21aedd97 100644 --- a/drivers/net/ngbe/ngbe_ethdev.c +++ b/drivers/net/ngbe/ngbe_ethdev.c @@ -924,6 +924,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; @@ -967,6 +971,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 3315428397..b3d312c626 100644 --- a/drivers/net/ngbe/ngbe_rxtx.c +++ b/drivers/net/ngbe/ngbe_rxtx.c @@ -2468,6 +2468,17 @@ ngbe_dev_rx_init(struct rte_eth_dev *dev) wr32m(hw, NGBE_FRMSZ, NGBE_FRMSZ_MAX_MASK, NGBE_FRMSZ_MAX(dev->data->mtu + NGBE_ETH_OVERHEAD)); + /* + * 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 . @@ -2586,6 +2597,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. */ @@ -2640,6 +2664,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; }