net: ethernet: mtk_eth_soc: fix RX VLAN offload
authorFelix Fietkau <nbd@nbd.name>
Fri, 23 Apr 2021 05:20:54 +0000 (22:20 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 23 Apr 2021 20:31:57 +0000 (13:31 -0700)
The VLAN ID in the rx descriptor is only valid if the RX_DMA_VTAG bit is
set. Fixes frames wrongly marked with VLAN tags.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
[Ilya: fix commit message]
Signed-off-by: Ilya Lipnitskiy <ilya.lipnitskiy@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mediatek/mtk_eth_soc.c
drivers/net/ethernet/mediatek/mtk_eth_soc.h

index 6b00c12..b2175ec 100644 (file)
@@ -1319,7 +1319,7 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget,
                skb->protocol = eth_type_trans(skb, netdev);
 
                if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX &&
-                   RX_DMA_VID(trxd.rxd3))
+                   (trxd.rxd2 & RX_DMA_VTAG))
                        __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q),
                                               RX_DMA_VID(trxd.rxd3));
                skb_record_rx_queue(skb, 0);
index 1a6750c..875e67b 100644 (file)
 #define RX_DMA_LSO             BIT(30)
 #define RX_DMA_PLEN0(_x)       (((_x) & 0x3fff) << 16)
 #define RX_DMA_GET_PLEN0(_x)   (((_x) >> 16) & 0x3fff)
+#define RX_DMA_VTAG            BIT(15)
 
 /* QDMA descriptor rxd3 */
 #define RX_DMA_VID(_x)         ((_x) & 0xfff)