which means the current rule's input set conflicts with the first rule's.
Remove the first rule if want to change the input set of the PCTYPE.
-PF reset fail after QinQ set with FW >= 8.4
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Disable QinQ is not supported when FW >= 8.4
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-If upgrade FW to version 8.4 and higher, after set MAC VLAN filter and configure outer VLAN on PF, kill
-DPDK process will cause the card crash.
+If upgrade FW to version 8.4 and higher, enable QinQ by default and disable QinQ is not supported.
Example of getting best performance with l3fwd example
struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
struct rte_intr_handle *intr_handle = pci_dev->intr_handle;
- struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
struct i40e_filter_control_settings settings;
struct rte_flow *p_flow;
uint32_t reg;
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
return 0;
- /*
- * It is a workaround, if the double VLAN is disabled when
- * the program exits, an abnormal error will occur on the
- * NIC. Need to enable double VLAN when dev is closed.
- */
- if (pf->fw8_3gt) {
- if (!(rxmode->offloads & RTE_ETH_RX_OFFLOAD_VLAN_EXTEND)) {
- rxmode->offloads |= RTE_ETH_RX_OFFLOAD_VLAN_EXTEND;
- i40e_vlan_offload_set(dev, RTE_ETH_VLAN_EXTEND_MASK);
- }
- }
-
ret = rte_eth_switch_domain_free(pf->switch_domain_id);
if (ret)
PMD_INIT_LOG(WARNING, "failed to free switch domain: %d", ret);
else if (vlan_type == RTE_ETH_VLAN_TYPE_INNER)
hw->second_tag = rte_cpu_to_le_16(tpid);
} else {
- /*
- * If tpid is equal to 0x88A8, indicates that the
- * disable double VLAN operation is in progress.
- * Need set switch configuration back to default.
- */
- if (pf->fw8_3gt && tpid == RTE_ETHER_TYPE_QINQ) {
- sw_flags = 0;
- valid_flags = I40E_AQ_SET_SWITCH_CFG_OUTER_VLAN;
- if (vlan_type == RTE_ETH_VLAN_TYPE_OUTER)
- hw->first_tag = rte_cpu_to_le_16(tpid);
- } else {
- if (vlan_type == RTE_ETH_VLAN_TYPE_OUTER)
- hw->second_tag = rte_cpu_to_le_16(tpid);
- }
+ if (vlan_type == RTE_ETH_VLAN_TYPE_OUTER)
+ hw->second_tag = rte_cpu_to_le_16(tpid);
}
ret = i40e_aq_set_switch_config(hw, sw_flags,
valid_flags, 0, NULL);
}
if (mask & RTE_ETH_VLAN_EXTEND_MASK) {
+ /* Double VLAN not allowed to be disabled.*/
+ if (pf->fw8_3gt && !(rxmode->offloads & RTE_ETH_RX_OFFLOAD_VLAN_EXTEND)) {
+ PMD_DRV_LOG(WARNING,
+ "Disable double VLAN is not allowed after firmwarev8.3!");
+ return 0;
+ }
i = 0;
num = vsi->mac_num;
mac_filter = rte_zmalloc("mac_filter_info_data",
i40e_vlan_tpid_set(dev, RTE_ETH_VLAN_TYPE_INNER,
RTE_ETHER_TYPE_VLAN);
} else {
- if (pf->fw8_3gt)
- i40e_vlan_tpid_set(dev, RTE_ETH_VLAN_TYPE_OUTER,
- RTE_ETHER_TYPE_QINQ);
i40e_vsi_config_double_vlan(vsi, FALSE);
}
/* Restore all mac */
static int
i40e_dev_init_vlan(struct rte_eth_dev *dev)
{
+ struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
struct rte_eth_dev_data *data = dev->data;
int ret;
int mask = 0;
RTE_ETH_QINQ_STRIP_MASK |
RTE_ETH_VLAN_FILTER_MASK |
RTE_ETH_VLAN_EXTEND_MASK;
+
+ /* Double VLAN be enabled by default.*/
+ if (pf->fw8_3gt) {
+ struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
+ rxmode->offloads |= RTE_ETH_RX_OFFLOAD_VLAN_EXTEND;
+ }
ret = i40e_vlan_offload_set(dev, mask);
if (ret) {
PMD_DRV_LOG(INFO, "Failed to update vlan offload");