net/igc: support MAC loopback mode
authorAlvin Zhang <alvinx.zhang@intel.com>
Wed, 15 Apr 2020 08:48:09 +0000 (16:48 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 21 Apr 2020 11:57:08 +0000 (13:57 +0200)
Enable mac-loopback mode.

Signed-off-by: Alvin Zhang <alvinx.zhang@intel.com>
Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>
drivers/net/igc/igc_ethdev.c
drivers/net/igc/igc_txrx.c

index 15b63d1..af910b9 100644 (file)
 /* External VLAN Enable bit mask */
 #define IGC_CTRL_EXT_EXT_VLAN          (1u << 26)
 
+/* Speed select */
+#define IGC_CTRL_SPEED_MASK            (7u << 8)
+#define IGC_CTRL_SPEED_2500            (6u << 8)
+
 /* External VLAN Ether Type bit mask and shift */
 #define IGC_VET_EXT                    0xFFFF0000
 #define IGC_VET_EXT_SHIFT              16
 
+/* Force EEE Auto-negotiation */
+#define IGC_EEER_EEE_FRC_AN            (1u << 28)
+
 /* Per Queue Good Packets Received Count */
 #define IGC_PQGPRC(idx)                (0x10010 + 0x100 * (idx))
 /* Per Queue Good Octets Received Count */
@@ -635,6 +642,9 @@ eth_igc_stop(struct rte_eth_dev *dev)
        /* disable all wake up */
        IGC_WRITE_REG(hw, IGC_WUC, 0);
 
+       /* disable checking EEE operation in MAC loopback mode */
+       igc_read_reg_check_clear_bits(hw, IGC_EEER, IGC_EEER_EEE_FRC_AN);
+
        /* Set bit for Go Link disconnect */
        igc_read_reg_check_set_bits(hw, IGC_82580_PHY_POWER_MGMT,
                        IGC_82580_PM_GO_LINKD);
@@ -1060,6 +1070,19 @@ eth_igc_start(struct rte_eth_dev *dev)
        eth_igc_rxtx_control(dev, true);
        eth_igc_link_update(dev, 0);
 
+       /* configure MAC-loopback mode */
+       if (dev->data->dev_conf.lpbk_mode == 1) {
+               uint32_t reg_val;
+
+               reg_val = IGC_READ_REG(hw, IGC_CTRL);
+               reg_val &= ~IGC_CTRL_SPEED_MASK;
+               reg_val |= IGC_CTRL_SLU | IGC_CTRL_FRCSPD |
+                       IGC_CTRL_FRCDPX | IGC_CTRL_FD | IGC_CTRL_SPEED_2500;
+               IGC_WRITE_REG(hw, IGC_CTRL, reg_val);
+
+               igc_read_reg_check_set_bits(hw, IGC_EEER, IGC_EEER_EEE_FRC_AN);
+       }
+
        return 0;
 
 error_invalid_config:
index 3832484..0bdc3f4 100644 (file)
@@ -1142,6 +1142,9 @@ igc_rx_init(struct rte_eth_dev *dev)
                        IGC_RCTL_DPF |
                        (hw->mac.mc_filter_type << IGC_RCTL_MO_SHIFT);
 
+       if (dev->data->dev_conf.lpbk_mode == 1)
+               rctl |= IGC_RCTL_LBM_MAC;
+
        rctl &= ~(IGC_RCTL_HSEL_MSK | IGC_RCTL_CFIEN | IGC_RCTL_CFI |
                        IGC_RCTL_PSP | IGC_RCTL_PMCF);