> -----Original Message-----
> From: Intel-wired-lan <[email protected]> On Behalf
> Of Petr Oros
> Sent: Friday, March 20, 2026 2:53 PM
> To: [email protected]
> Cc: Kitszel, Przemyslaw <[email protected]>; Eric Dumazet
> <[email protected]>; [email protected]; Andrew Lunn
> <[email protected]>; Nguyen, Anthony L
> <[email protected]>; Mateusz Polchlopek
> <[email protected]>; Keller, Jacob E
> <[email protected]>; Jakub Kicinski <[email protected]>; Paolo
> Abeni <[email protected]>; David S. Miller <[email protected]>;
> [email protected]
> Subject: [Intel-wired-lan] [PATCH iwl-net] iavf: fix wrong VLAN mask
> for legacy Rx descriptors L2TAG2
>
> The IAVF_RXD_LEGACY_L2TAG2_M mask was incorrectly defined as
> GENMASK_ULL(63, 32), extracting 32 bits from qw2 instead of the 16-bit
> VLAN tag. In the legacy Rx descriptor layout, the 2nd L2TAG2 (VLAN
> tag) occupies bits 63:48 of qw2, not 63:32.
>
> The oversized mask causes FIELD_GET to return a 32-bit value where the
> actual VLAN tag sits in bits 31:16. When this value is passed to
> iavf_receive_skb() as a u16 parameter, it gets truncated to the lower
> 16 bits (which contain the 1st L2TAG2, typically zero). As a result,
> __vlan_hwaccel_put_tag() is never called and software VLAN interfaces
> on VFs receive no traffic.
>
> This affects VFs behind ice PF (VIRTCHNL VLAN v2) when the PF
> advertises VLAN stripping into L2TAG2_2 and legacy descriptors are
> used.
>
> The flex descriptor path already uses the correct mask
> (IAVF_RXD_FLEX_L2TAG2_2_M = GENMASK_ULL(63, 48)).
>
> Fixes: 2dc8e7c36d80 ("iavf: refactor iavf_clean_rx_irq to support
> legacy and flex descriptors")
> Signed-off-by: Petr Oros <[email protected]>
> ---
> drivers/net/ethernet/intel/iavf/iavf_type.h | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/net/ethernet/intel/iavf/iavf_type.h
> b/drivers/net/ethernet/intel/iavf/iavf_type.h
> index 1d8cf29cb65ac5..5bb1de1cfd33b1 100644
> --- a/drivers/net/ethernet/intel/iavf/iavf_type.h
> +++ b/drivers/net/ethernet/intel/iavf/iavf_type.h
> @@ -277,7 +277,7 @@ struct iavf_rx_desc {
> /* L2 Tag 2 Presence */
> #define IAVF_RXD_LEGACY_L2TAG2P_M BIT(0)
> /* Stripped S-TAG VLAN from the receive packet */
> -#define IAVF_RXD_LEGACY_L2TAG2_M GENMASK_ULL(63, 32)
> +#define IAVF_RXD_LEGACY_L2TAG2_M GENMASK_ULL(63, 48)
> /* Stripped S-TAG VLAN from the receive packet */
> #define IAVF_RXD_FLEX_L2TAG2_2_M GENMASK_ULL(63, 48)
> /* The packet is a UDP tunneled packet */
> --
> 2.52.0
Reviewed-by: Aleksandr Loktionov <[email protected]>