kernel: mediatek: fix WED offload regression on MT7622
Fix dealing with DSA untagging offload Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
		| @@ -0,0 +1,55 @@ | |||||||
|  | From: Felix Fietkau <nbd@nbd.name> | ||||||
|  | Date: Tue, 27 Dec 2022 15:02:51 +0100 | ||||||
|  | Subject: [PATCH] net: ethernet: mtk_eth_soc: ppe: fix L2 offloading with DSA | ||||||
|  |  untagging offload enabled | ||||||
|  |  | ||||||
|  | Check for skb metadata in order to detect the case where the DSA header is not | ||||||
|  | present. | ||||||
|  |  | ||||||
|  | Fixes: 2d7605a72906 ("net: ethernet: mtk_eth_soc: enable hardware DSA untagging") | ||||||
|  | Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c | ||||||
|  | +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c | ||||||
|  | @@ -1992,9 +1992,6 @@ static int mtk_poll_rx(struct napi_struc | ||||||
|  |  			skb_checksum_none_assert(skb); | ||||||
|  |  		skb->protocol = eth_type_trans(skb, netdev); | ||||||
|  |   | ||||||
|  | -		if (reason == MTK_PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED) | ||||||
|  | -			mtk_ppe_check_skb(eth->ppe[0], skb, hash); | ||||||
|  | - | ||||||
|  |  		/* When using VLAN untagging in combination with DSA, the | ||||||
|  |  		 * hardware treats the MTK special tag as a VLAN and untags it. | ||||||
|  |  		 */ | ||||||
|  | @@ -2007,6 +2004,9 @@ static int mtk_poll_rx(struct napi_struc | ||||||
|  |  				skb_dst_set_noref(skb, ð->dsa_meta[port]->dst); | ||||||
|  |  		} | ||||||
|  |   | ||||||
|  | +		if (reason == MTK_PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED) | ||||||
|  | +			mtk_ppe_check_skb(eth->ppe[0], skb, hash); | ||||||
|  | + | ||||||
|  |  		skb_record_rx_queue(skb, 0); | ||||||
|  |  		napi_gro_receive(napi, skb); | ||||||
|  |   | ||||||
|  | --- a/drivers/net/ethernet/mediatek/mtk_ppe.c | ||||||
|  | +++ b/drivers/net/ethernet/mediatek/mtk_ppe.c | ||||||
|  | @@ -8,6 +8,7 @@ | ||||||
|  |  #include <linux/platform_device.h> | ||||||
|  |  #include <linux/if_ether.h> | ||||||
|  |  #include <linux/if_vlan.h> | ||||||
|  | +#include <net/dst_metadata.h> | ||||||
|  |  #include <net/dsa.h> | ||||||
|  |  #include "mtk_eth_soc.h" | ||||||
|  |  #include "mtk_ppe.h" | ||||||
|  | @@ -756,7 +757,9 @@ void __mtk_ppe_check_skb(struct mtk_ppe | ||||||
|  |  		    skb->dev->dsa_ptr->tag_ops->proto != DSA_TAG_PROTO_MTK) | ||||||
|  |  			goto out; | ||||||
|  |   | ||||||
|  | -		tag += 4; | ||||||
|  | +		if (!skb_metadata_dst(skb)) | ||||||
|  | +			tag += 4; | ||||||
|  | + | ||||||
|  |  		if (get_unaligned_be16(tag) != ETH_P_8021Q) | ||||||
|  |  			break; | ||||||
|  |   | ||||||
		Reference in New Issue
	
	Block a user
	 Felix Fietkau
					Felix Fietkau