[1/4] net/txgbe: fix RSS in double VALN
Checks
Commit Message
Regard QINQ as one case of extend VLAN, and always enable QINQ mode when
double VLAN is set, to avoid RSS does not work for QINQ packets.
Fixes: 220b0e49bc47 ("net/txgbe: support VLAN")
Cc: stable@dpdk.org
Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com>
---
drivers/net/txgbe/txgbe_ethdev.c | 12 ++++--------
1 file changed, 4 insertions(+), 8 deletions(-)
Comments
On 4/25/2021 9:03 AM, Jiawen Wu wrote:
> Regard QINQ as one case of extend VLAN, and always enable QINQ mode when
> double VLAN is set, to avoid RSS does not work for QINQ packets.
>
It is hard to understand above paragraph, can you please reword it?
Also in the patch title s/VALN/VLAN
VLAN_EXTEND mainly comes from ixgbe, it is different than QinQ, which one does
your device supports?
> Fixes: 220b0e49bc47 ("net/txgbe: support VLAN")
> Cc: stable@dpdk.org
>
> Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com>
> ---
> drivers/net/txgbe/txgbe_ethdev.c | 12 ++++--------
> 1 file changed, 4 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/net/txgbe/txgbe_ethdev.c b/drivers/net/txgbe/txgbe_ethdev.c
> index 97796f040b..87c041c2ec 100644
> --- a/drivers/net/txgbe/txgbe_ethdev.c
> +++ b/drivers/net/txgbe/txgbe_ethdev.c
> @@ -1217,17 +1217,12 @@ static void
> txgbe_vlan_hw_extend_enable(struct rte_eth_dev *dev)
> {
> struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
> - struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
> - struct rte_eth_txmode *txmode = &dev->data->dev_conf.txmode;
> uint32_t ctrl;
>
> PMD_INIT_FUNC_TRACE();
>
> ctrl = rd32(hw, TXGBE_PORTCTL);
> - ctrl |= TXGBE_PORTCTL_VLANEXT;
> - if (rxmode->offloads & DEV_RX_OFFLOAD_QINQ_STRIP ||
> - txmode->offloads & DEV_TX_OFFLOAD_QINQ_INSERT)
> - ctrl |= TXGBE_PORTCTL_QINQ;
> + ctrl |= TXGBE_PORTCTL_VLANEXT | TXGBE_PORTCTL_QINQ;
> wr32(hw, TXGBE_PORTCTL, ctrl);
> }
>
> @@ -1287,8 +1282,9 @@ txgbe_vlan_offload_config(struct rte_eth_dev *dev, int mask)
> txgbe_vlan_hw_filter_disable(dev);
> }
>
> - if (mask & ETH_VLAN_EXTEND_MASK) {
> - if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_EXTEND)
> + if (mask & (ETH_VLAN_EXTEND_MASK | ETH_QINQ_STRIP_MASK)) {
> + if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_EXTEND ||
> + rxmode->offloads & DEV_RX_OFFLOAD_QINQ_STRIP)
> txgbe_vlan_hw_extend_enable(dev);
> else
> txgbe_vlan_hw_extend_disable(dev);
>
@@ -1217,17 +1217,12 @@ static void
txgbe_vlan_hw_extend_enable(struct rte_eth_dev *dev)
{
struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
- struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
- struct rte_eth_txmode *txmode = &dev->data->dev_conf.txmode;
uint32_t ctrl;
PMD_INIT_FUNC_TRACE();
ctrl = rd32(hw, TXGBE_PORTCTL);
- ctrl |= TXGBE_PORTCTL_VLANEXT;
- if (rxmode->offloads & DEV_RX_OFFLOAD_QINQ_STRIP ||
- txmode->offloads & DEV_TX_OFFLOAD_QINQ_INSERT)
- ctrl |= TXGBE_PORTCTL_QINQ;
+ ctrl |= TXGBE_PORTCTL_VLANEXT | TXGBE_PORTCTL_QINQ;
wr32(hw, TXGBE_PORTCTL, ctrl);
}
@@ -1287,8 +1282,9 @@ txgbe_vlan_offload_config(struct rte_eth_dev *dev, int mask)
txgbe_vlan_hw_filter_disable(dev);
}
- if (mask & ETH_VLAN_EXTEND_MASK) {
- if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_EXTEND)
+ if (mask & (ETH_VLAN_EXTEND_MASK | ETH_QINQ_STRIP_MASK)) {
+ if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_EXTEND ||
+ rxmode->offloads & DEV_RX_OFFLOAD_QINQ_STRIP)
txgbe_vlan_hw_extend_enable(dev);
else
txgbe_vlan_hw_extend_disable(dev);