From: Kevin Liu <kevinx.liu@intel.com>
To: dev@dpdk.org
Cc: Yuying.Zhang@intel.com, beilei.xing@intel.com,
stevex.yang@intel.com, Kevin Liu <kevinx.liu@intel.com>
Subject: [PATCH] net/i40e: fix error disable double VLAN
Date: Wed, 29 Jun 2022 09:57:10 +0000 [thread overview]
Message-ID: <20220629095710.300200-1-kevinx.liu@intel.com> (raw)
Sync the kernel driver, enable double VLAN by default after
firmware v8.3 and disable double VLAN is not allowed in subsequent
operations.
Fixes: 4f13a78f1b8f ("net/i40e: add outer VLAN processing")
Signed-off-by: Kevin Liu <kevinx.liu@intel.com>
---
drivers/net/i40e/i40e_ethdev.c | 45 ++++++++++++----------------------
1 file changed, 15 insertions(+), 30 deletions(-)
diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index dd471d487e..b07ef89220 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -2575,7 +2575,6 @@ i40e_dev_close(struct rte_eth_dev *dev)
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;
@@ -2588,18 +2587,6 @@ i40e_dev_close(struct rte_eth_dev *dev)
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);
@@ -3950,20 +3937,8 @@ i40e_vlan_tpid_set(struct rte_eth_dev *dev,
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);
@@ -4043,6 +4018,12 @@ i40e_vlan_offload_set(struct rte_eth_dev *dev, int mask)
}
if (mask & RTE_ETH_VLAN_EXTEND_MASK) {
+ /* Sync the kernel driver. 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",
@@ -4078,9 +4059,6 @@ i40e_vlan_offload_set(struct rte_eth_dev *dev, int mask)
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 */
@@ -6176,6 +6154,7 @@ i40e_vsi_config_vlan_stripping(struct i40e_vsi *vsi, bool on)
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;
@@ -6185,6 +6164,12 @@ i40e_dev_init_vlan(struct rte_eth_dev *dev)
RTE_ETH_QINQ_STRIP_MASK |
RTE_ETH_VLAN_FILTER_MASK |
RTE_ETH_VLAN_EXTEND_MASK;
+
+ /* Sync the kernel driver. 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");
--
2.34.1
next reply other threads:[~2022-06-29 1:59 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-29 9:57 Kevin Liu [this message]
2022-06-29 10:47 ` [PATCH v2] " Kevin Liu
2022-06-29 14:41 ` [PATCH v3] " Kevin Liu
2022-06-29 14:53 ` [PATCH v4] " Kevin Liu
2022-06-29 15:39 ` [PATCH v5] " Kevin Liu
2022-06-29 7:53 ` Zhang, Qi Z
2022-07-06 10:59 ` Han, YingyaX
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220629095710.300200-1-kevinx.liu@intel.com \
--to=kevinx.liu@intel.com \
--cc=Yuying.Zhang@intel.com \
--cc=beilei.xing@intel.com \
--cc=dev@dpdk.org \
--cc=stevex.yang@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).