diff options
author | Felix Fietkau <nbd@nbd.name> | 2022-12-27 19:09:38 +0100 |
---|---|---|
committer | Felix Fietkau <nbd@nbd.name> | 2022-12-27 19:10:05 +0100 |
commit | 425945c313b93d54a4bf870d95e85fb4c7c694a6 (patch) | |
tree | 3d0a85a40a12f1c74399bb6debd013921e422e11 | |
parent | 78c51de847102541795d7c93b05ae8321fcd50e7 (diff) | |
download | upstream-425945c313b93d54a4bf870d95e85fb4c7c694a6.tar.gz upstream-425945c313b93d54a4bf870d95e85fb4c7c694a6.tar.bz2 upstream-425945c313b93d54a4bf870d95e85fb4c7c694a6.zip |
kernel: mediatek: fix WED offload regression on MT7622
Fix dealing with DSA untagging offload
Signed-off-by: Felix Fietkau <nbd@nbd.name>
-rw-r--r-- | target/linux/generic/pending-5.15/734-net-ethernet-mtk_eth_soc-ppe-fix-L2-offloading-with-.patch | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/target/linux/generic/pending-5.15/734-net-ethernet-mtk_eth_soc-ppe-fix-L2-offloading-with-.patch b/target/linux/generic/pending-5.15/734-net-ethernet-mtk_eth_soc-ppe-fix-L2-offloading-with-.patch new file mode 100644 index 0000000000..39d6d0c879 --- /dev/null +++ b/target/linux/generic/pending-5.15/734-net-ethernet-mtk_eth_soc-ppe-fix-L2-offloading-with-.patch @@ -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; + |