]> git.droids-corp.org - dpdk.git/commitdiff
net/ngbe: support loopback mode
authorJiawen Wu <jiawenwu@trustnetic.com>
Thu, 21 Oct 2021 09:50:11 +0000 (17:50 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 29 Oct 2021 22:53:19 +0000 (00:53 +0200)
Support loopback operation mode.

Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com>
drivers/net/ngbe/ngbe_ethdev.c
drivers/net/ngbe/ngbe_rxtx.c

index 394b60247ff11730b97d004e3f3b48276461a6ed..fc21aedd97179ddff48a70786aff7efde670c37c 100644 (file)
@@ -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 */
index 3315428397ce9cbdabbc543c92b0a10abc5a1477..b3d312c62697736ab468c320420e2da6b1ff9eba 100644 (file)
@@ -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;
 }