kernel: move accepted mtk_eth_soc patches to generic-backport
[openwrt/staging/noltari.git] / target / linux / generic / backport-5.15 / 730-03-v6.3-net-ethernet-mtk_eth_soc-avoid-port_mg-assignment-on.patch
diff --git a/target/linux/generic/backport-5.15/730-03-v6.3-net-ethernet-mtk_eth_soc-avoid-port_mg-assignment-on.patch b/target/linux/generic/backport-5.15/730-03-v6.3-net-ethernet-mtk_eth_soc-avoid-port_mg-assignment-on.patch
new file mode 100644 (file)
index 0000000..67b3894
--- /dev/null
@@ -0,0 +1,52 @@
+From: Felix Fietkau <nbd@nbd.name>
+Date: Fri, 4 Nov 2022 19:49:08 +0100
+Subject: [PATCH] net: ethernet: mtk_eth_soc: avoid port_mg assignment on
+ MT7622 and newer
+
+On newer chips, this field is unused and contains some bits related to queue
+assignment. Initialize it to 0 in those cases.
+Fix offload_version on MT7621 and MT7623, which still need the previous value.
+
+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
+@@ -4427,7 +4427,7 @@ static const struct mtk_soc_data mt7621_
+       .hw_features = MTK_HW_FEATURES,
+       .required_clks = MT7621_CLKS_BITMAP,
+       .required_pctl = false,
+-      .offload_version = 2,
++      .offload_version = 1,
+       .hash_offset = 2,
+       .foe_entry_size = sizeof(struct mtk_foe_entry) - 16,
+       .txrx = {
+@@ -4466,7 +4466,7 @@ static const struct mtk_soc_data mt7623_
+       .hw_features = MTK_HW_FEATURES,
+       .required_clks = MT7623_CLKS_BITMAP,
+       .required_pctl = true,
+-      .offload_version = 2,
++      .offload_version = 1,
+       .hash_offset = 2,
+       .foe_entry_size = sizeof(struct mtk_foe_entry) - 16,
+       .txrx = {
+--- a/drivers/net/ethernet/mediatek/mtk_ppe.c
++++ b/drivers/net/ethernet/mediatek/mtk_ppe.c
+@@ -175,6 +175,8 @@ int mtk_foe_entry_prepare(struct mtk_eth
+               val = FIELD_PREP(MTK_FOE_IB2_DEST_PORT_V2, pse_port) |
+                     FIELD_PREP(MTK_FOE_IB2_PORT_AG_V2, 0xf);
+       } else {
++              int port_mg = eth->soc->offload_version > 1 ? 0 : 0x3f;
++
+               val = FIELD_PREP(MTK_FOE_IB1_STATE, MTK_FOE_STATE_BIND) |
+                     FIELD_PREP(MTK_FOE_IB1_PACKET_TYPE, type) |
+                     FIELD_PREP(MTK_FOE_IB1_UDP, l4proto == IPPROTO_UDP) |
+@@ -182,7 +184,7 @@ int mtk_foe_entry_prepare(struct mtk_eth
+               entry->ib1 = val;
+               val = FIELD_PREP(MTK_FOE_IB2_DEST_PORT, pse_port) |
+-                    FIELD_PREP(MTK_FOE_IB2_PORT_MG, 0x3f) |
++                    FIELD_PREP(MTK_FOE_IB2_PORT_MG, port_mg) |
+                     FIELD_PREP(MTK_FOE_IB2_PORT_AG, 0x1f);
+       }