When VLAN or QinQ stripping is enabled in the ice driver, an inconsistency was observed between the placement of the VLAN tag in the descriptors of the final Rx queue (irrespective of the number of queues) vs descriptors of all other queues. This inconsistency was due to the fact that the driver - when updating l2tsel (L2 tag selection) field - used the queue id, rather than the register index for the queue. Queue 0 is normally HW queue 1, etc., meaning the final queue never had its field updated.
Fixes: de5da9d16430 ("net/ice: support double VLAN") Cc: sta...@dpdk.org Signed-off-by: Bruce Richardson <bruce.richard...@intel.com> --- drivers/net/intel/ice/ice_ethdev.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/intel/ice/ice_ethdev.c b/drivers/net/intel/ice/ice_ethdev.c index 680e7724cd..513777e372 100644 --- a/drivers/net/intel/ice/ice_ethdev.c +++ b/drivers/net/intel/ice/ice_ethdev.c @@ -4988,11 +4988,11 @@ static void ice_vsi_update_l2tsel(struct ice_vsi *vsi, enum ice_l2tsel l2tsel) l2tsel_bit = BIT(ICE_L2TSEL_BIT_OFFSET); for (i = 0; i < dev_data->nb_rx_queues; i++) { + const struct ci_rx_queue *rxq = dev_data->rx_queues[i]; u32 qrx_context_offset; u32 regval; - qrx_context_offset = - QRX_CONTEXT(ICE_L2TSEL_QRX_CONTEXT_REG_IDX, i); + qrx_context_offset = QRX_CONTEXT(ICE_L2TSEL_QRX_CONTEXT_REG_IDX, rxq->reg_idx); regval = rd32(hw, qrx_context_offset); regval &= ~BIT(ICE_L2TSEL_BIT_OFFSET); -- 2.48.1