kernel: backport mediatek WED DMA mask fixes
authorFelix Fietkau <[email protected]>
Mon, 13 Oct 2025 11:03:48 +0000 (13:03 +0200)
committerFelix Fietkau <[email protected]>
Tue, 14 Oct 2025 12:54:26 +0000 (14:54 +0200)
Fixes issues on devices with 4 GB RAM.

Signed-off-by: Felix Fietkau <[email protected]>
target/linux/generic/backport-6.12/732-v6.18-wifi-mt76-wed-use-proper-wed-reference-in-mt76-wed-d.patch [new file with mode: 0644]
target/linux/generic/backport-6.12/733-v6.18-net-mtk-wed-add-dma-mask-limitation-and-GFP_DMA32-fo.patch [new file with mode: 0644]
target/linux/generic/backport-6.6/752-32-v6.18-wifi-mt76-wed-use-proper-wed-reference-in-mt76-wed-d.patch [new file with mode: 0644]
target/linux/generic/backport-6.6/752-33-v6.18-net-mtk-wed-add-dma-mask-limitation-and-GFP_DMA32-fo.patch [new file with mode: 0644]

diff --git a/target/linux/generic/backport-6.12/732-v6.18-wifi-mt76-wed-use-proper-wed-reference-in-mt76-wed-d.patch b/target/linux/generic/backport-6.12/732-v6.18-wifi-mt76-wed-use-proper-wed-reference-in-mt76-wed-d.patch
new file mode 100644 (file)
index 0000000..883de54
--- /dev/null
@@ -0,0 +1,79 @@
+From: Lorenzo Bianconi <[email protected]>
+Date: Wed, 8 Oct 2025 12:41:48 +0200
+Subject: [PATCH] wifi: mt76: wed: use proper wed reference in mt76 wed driver
+ callabacks
+
+MT7996 driver can use both wed and wed_hif2 devices to offload traffic
+from/to the wireless NIC. In the current codebase we assume to always
+use the primary wed device in wed callbacks resulting in the following
+crash if the hw runs wed_hif2 (e.g. 6GHz link).
+
+[  297.455876] Unable to handle kernel read from unreadable memory at virtual address 000000000000080a
+[  297.464928] Mem abort info:
+[  297.467722]   ESR = 0x0000000096000005
+[  297.471461]   EC = 0x25: DABT (current EL), IL = 32 bits
+[  297.476766]   SET = 0, FnV = 0
+[  297.479809]   EA = 0, S1PTW = 0
+[  297.482940]   FSC = 0x05: level 1 translation fault
+[  297.487809] Data abort info:
+[  297.490679]   ISV = 0, ISS = 0x00000005, ISS2 = 0x00000000
+[  297.496156]   CM = 0, WnR = 0, TnD = 0, TagAccess = 0
+[  297.501196]   GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0
+[  297.506500] user pgtable: 4k pages, 39-bit VAs, pgdp=0000000107480000
+[  297.512927] [000000000000080a] pgd=08000001097fb003, p4d=08000001097fb003, pud=08000001097fb003, pmd=0000000000000000
+[  297.523532] Internal error: Oops: 0000000096000005 [#1] SMP
+[  297.715393] CPU: 2 UID: 0 PID: 45 Comm: kworker/u16:2 Tainted: G           O       6.12.50 #0
+[  297.723908] Tainted: [O]=OOT_MODULE
+[  297.727384] Hardware name: Banana Pi BPI-R4 (2x SFP+) (DT)
+[  297.732857] Workqueue: nf_ft_offload_del nf_flow_rule_route_ipv6 [nf_flow_table]
+[  297.740254] pstate: 60400005 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
+[  297.747205] pc : mt76_wed_offload_disable+0x64/0xa0 [mt76]
+[  297.752688] lr : mtk_wed_flow_remove+0x58/0x80
+[  297.757126] sp : ffffffc080fe3ae0
+[  297.760430] x29: ffffffc080fe3ae0 x28: ffffffc080fe3be0 x27: 00000000deadbef7
+[  297.767557] x26: ffffff80c5ebca00 x25: 0000000000000001 x24: ffffff80c85f4c00
+[  297.774683] x23: ffffff80c1875b78 x22: ffffffc080d42cd0 x21: ffffffc080660018
+[  297.781809] x20: ffffff80c6a076d0 x19: ffffff80c6a043c8 x18: 0000000000000000
+[  297.788935] x17: 0000000000000000 x16: 0000000000000001 x15: 0000000000000000
+[  297.796060] x14: 0000000000000019 x13: ffffff80c0ad8ec0 x12: 00000000fa83b2da
+[  297.803185] x11: ffffff80c02700c0 x10: ffffff80c0ad8ec0 x9 : ffffff81fef96200
+[  297.810311] x8 : ffffff80c02700c0 x7 : ffffff80c02700d0 x6 : 0000000000000002
+[  297.817435] x5 : 0000000000000400 x4 : 0000000000000000 x3 : 0000000000000000
+[  297.824561] x2 : 0000000000000001 x1 : 0000000000000800 x0 : ffffff80c6a063c8
+[  297.831686] Call trace:
+[  297.834123]  mt76_wed_offload_disable+0x64/0xa0 [mt76]
+[  297.839254]  mtk_wed_flow_remove+0x58/0x80
+[  297.843342]  mtk_flow_offload_cmd+0x434/0x574
+[  297.847689]  mtk_wed_setup_tc_block_cb+0x30/0x40
+[  297.852295]  nf_flow_offload_ipv6_hook+0x7f4/0x964 [nf_flow_table]
+[  297.858466]  nf_flow_rule_route_ipv6+0x438/0x4a4 [nf_flow_table]
+[  297.864463]  process_one_work+0x174/0x300
+[  297.868465]  worker_thread+0x278/0x430
+[  297.872204]  kthread+0xd8/0xdc
+[  297.875251]  ret_from_fork+0x10/0x20
+[  297.878820] Code: 928b5ae0 8b000273 91400a60 f943fa61 (79401421)
+[  297.884901] ---[ end trace 0000000000000000 ]---
+
+Fix the issue detecting the proper wed reference to use running wed
+callabacks.
+
+-- Partial backport for data structure change only (rest is in the mt76 package)
+
+Fixes: 83eafc9251d6 ("wifi: mt76: mt7996: add wed tx support")
+Tested-by: Daniel Pawlik <[email protected]>
+Tested-by: Matteo Croce <[email protected]>
+Signed-off-by: Lorenzo Bianconi <[email protected]>
+Link: https://patch.msgid.link/[email protected]
+Signed-off-by: Felix Fietkau <[email protected]>
+---
+
+--- a/include/linux/soc/mediatek/mtk_wed.h
++++ b/include/linux/soc/mediatek/mtk_wed.h
+@@ -154,6 +154,7 @@ struct mtk_wed_device {
+               bool wcid_512;
+               bool hw_rro;
+               bool msi;
++              bool hif2;
+               u16 token_start;
+               unsigned int nbuf;
diff --git a/target/linux/generic/backport-6.12/733-v6.18-net-mtk-wed-add-dma-mask-limitation-and-GFP_DMA32-fo.patch b/target/linux/generic/backport-6.12/733-v6.18-net-mtk-wed-add-dma-mask-limitation-and-GFP_DMA32-fo.patch
new file mode 100644 (file)
index 0000000..c1bb1b9
--- /dev/null
@@ -0,0 +1,50 @@
+From: Rex Lu <[email protected]>
+Date: Thu, 9 Oct 2025 08:29:34 +0200
+Subject: [PATCH] net: mtk: wed: add dma mask limitation and GFP_DMA32 for
+ device with more than 4GB DRAM
+
+Limit tx/rx buffer address to 32-bit address space for board with more
+than 4GB DRAM.
+
+Fixes: 804775dfc2885 ("net: ethernet: mtk_eth_soc: add support for Wireless Ethernet Dispatch (WED)")
+Fixes: 6757d345dd7db ("net: ethernet: mtk_wed: introduce hw_rro support for MT7988")
+Tested-by: Daniel Pawlik <[email protected]>
+Tested-by: Matteo Croce <[email protected]>
+Signed-off-by: Rex Lu <[email protected]>
+Co-developed-by: Lorenzo Bianconi <[email protected]>
+Signed-off-by: Lorenzo Bianconi <[email protected]>
+Reviewed-by: Simon Horman <[email protected]>
+Signed-off-by: David S. Miller <[email protected]>
+---
+
+--- a/drivers/net/ethernet/mediatek/mtk_wed.c
++++ b/drivers/net/ethernet/mediatek/mtk_wed.c
+@@ -677,7 +677,7 @@ mtk_wed_tx_buffer_alloc(struct mtk_wed_d
+               void *buf;
+               int s;
+-              page = __dev_alloc_page(GFP_KERNEL);
++              page = __dev_alloc_page(GFP_KERNEL | GFP_DMA32);
+               if (!page)
+                       return -ENOMEM;
+@@ -800,7 +800,7 @@ mtk_wed_hwrro_buffer_alloc(struct mtk_we
+               struct page *page;
+               int s;
+-              page = __dev_alloc_page(GFP_KERNEL);
++              page = __dev_alloc_page(GFP_KERNEL | GFP_DMA32);
+               if (!page)
+                       return -ENOMEM;
+@@ -2438,6 +2438,10 @@ mtk_wed_attach(struct mtk_wed_device *de
+       dev->version = hw->version;
+       dev->hw->pcie_base = mtk_wed_get_pcie_base(dev);
++      ret = dma_set_mask_and_coherent(hw->dev, DMA_BIT_MASK(32));
++      if (ret)
++              goto out;
++
+       if (hw->eth->dma_dev == hw->eth->dev &&
+           of_dma_is_coherent(hw->eth->dev->of_node))
+               mtk_eth_set_dma_device(hw->eth, hw->dev);
diff --git a/target/linux/generic/backport-6.6/752-32-v6.18-wifi-mt76-wed-use-proper-wed-reference-in-mt76-wed-d.patch b/target/linux/generic/backport-6.6/752-32-v6.18-wifi-mt76-wed-use-proper-wed-reference-in-mt76-wed-d.patch
new file mode 100644 (file)
index 0000000..883de54
--- /dev/null
@@ -0,0 +1,79 @@
+From: Lorenzo Bianconi <[email protected]>
+Date: Wed, 8 Oct 2025 12:41:48 +0200
+Subject: [PATCH] wifi: mt76: wed: use proper wed reference in mt76 wed driver
+ callabacks
+
+MT7996 driver can use both wed and wed_hif2 devices to offload traffic
+from/to the wireless NIC. In the current codebase we assume to always
+use the primary wed device in wed callbacks resulting in the following
+crash if the hw runs wed_hif2 (e.g. 6GHz link).
+
+[  297.455876] Unable to handle kernel read from unreadable memory at virtual address 000000000000080a
+[  297.464928] Mem abort info:
+[  297.467722]   ESR = 0x0000000096000005
+[  297.471461]   EC = 0x25: DABT (current EL), IL = 32 bits
+[  297.476766]   SET = 0, FnV = 0
+[  297.479809]   EA = 0, S1PTW = 0
+[  297.482940]   FSC = 0x05: level 1 translation fault
+[  297.487809] Data abort info:
+[  297.490679]   ISV = 0, ISS = 0x00000005, ISS2 = 0x00000000
+[  297.496156]   CM = 0, WnR = 0, TnD = 0, TagAccess = 0
+[  297.501196]   GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0
+[  297.506500] user pgtable: 4k pages, 39-bit VAs, pgdp=0000000107480000
+[  297.512927] [000000000000080a] pgd=08000001097fb003, p4d=08000001097fb003, pud=08000001097fb003, pmd=0000000000000000
+[  297.523532] Internal error: Oops: 0000000096000005 [#1] SMP
+[  297.715393] CPU: 2 UID: 0 PID: 45 Comm: kworker/u16:2 Tainted: G           O       6.12.50 #0
+[  297.723908] Tainted: [O]=OOT_MODULE
+[  297.727384] Hardware name: Banana Pi BPI-R4 (2x SFP+) (DT)
+[  297.732857] Workqueue: nf_ft_offload_del nf_flow_rule_route_ipv6 [nf_flow_table]
+[  297.740254] pstate: 60400005 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
+[  297.747205] pc : mt76_wed_offload_disable+0x64/0xa0 [mt76]
+[  297.752688] lr : mtk_wed_flow_remove+0x58/0x80
+[  297.757126] sp : ffffffc080fe3ae0
+[  297.760430] x29: ffffffc080fe3ae0 x28: ffffffc080fe3be0 x27: 00000000deadbef7
+[  297.767557] x26: ffffff80c5ebca00 x25: 0000000000000001 x24: ffffff80c85f4c00
+[  297.774683] x23: ffffff80c1875b78 x22: ffffffc080d42cd0 x21: ffffffc080660018
+[  297.781809] x20: ffffff80c6a076d0 x19: ffffff80c6a043c8 x18: 0000000000000000
+[  297.788935] x17: 0000000000000000 x16: 0000000000000001 x15: 0000000000000000
+[  297.796060] x14: 0000000000000019 x13: ffffff80c0ad8ec0 x12: 00000000fa83b2da
+[  297.803185] x11: ffffff80c02700c0 x10: ffffff80c0ad8ec0 x9 : ffffff81fef96200
+[  297.810311] x8 : ffffff80c02700c0 x7 : ffffff80c02700d0 x6 : 0000000000000002
+[  297.817435] x5 : 0000000000000400 x4 : 0000000000000000 x3 : 0000000000000000
+[  297.824561] x2 : 0000000000000001 x1 : 0000000000000800 x0 : ffffff80c6a063c8
+[  297.831686] Call trace:
+[  297.834123]  mt76_wed_offload_disable+0x64/0xa0 [mt76]
+[  297.839254]  mtk_wed_flow_remove+0x58/0x80
+[  297.843342]  mtk_flow_offload_cmd+0x434/0x574
+[  297.847689]  mtk_wed_setup_tc_block_cb+0x30/0x40
+[  297.852295]  nf_flow_offload_ipv6_hook+0x7f4/0x964 [nf_flow_table]
+[  297.858466]  nf_flow_rule_route_ipv6+0x438/0x4a4 [nf_flow_table]
+[  297.864463]  process_one_work+0x174/0x300
+[  297.868465]  worker_thread+0x278/0x430
+[  297.872204]  kthread+0xd8/0xdc
+[  297.875251]  ret_from_fork+0x10/0x20
+[  297.878820] Code: 928b5ae0 8b000273 91400a60 f943fa61 (79401421)
+[  297.884901] ---[ end trace 0000000000000000 ]---
+
+Fix the issue detecting the proper wed reference to use running wed
+callabacks.
+
+-- Partial backport for data structure change only (rest is in the mt76 package)
+
+Fixes: 83eafc9251d6 ("wifi: mt76: mt7996: add wed tx support")
+Tested-by: Daniel Pawlik <[email protected]>
+Tested-by: Matteo Croce <[email protected]>
+Signed-off-by: Lorenzo Bianconi <[email protected]>
+Link: https://patch.msgid.link/[email protected]
+Signed-off-by: Felix Fietkau <[email protected]>
+---
+
+--- a/include/linux/soc/mediatek/mtk_wed.h
++++ b/include/linux/soc/mediatek/mtk_wed.h
+@@ -154,6 +154,7 @@ struct mtk_wed_device {
+               bool wcid_512;
+               bool hw_rro;
+               bool msi;
++              bool hif2;
+               u16 token_start;
+               unsigned int nbuf;
diff --git a/target/linux/generic/backport-6.6/752-33-v6.18-net-mtk-wed-add-dma-mask-limitation-and-GFP_DMA32-fo.patch b/target/linux/generic/backport-6.6/752-33-v6.18-net-mtk-wed-add-dma-mask-limitation-and-GFP_DMA32-fo.patch
new file mode 100644 (file)
index 0000000..c1bb1b9
--- /dev/null
@@ -0,0 +1,50 @@
+From: Rex Lu <[email protected]>
+Date: Thu, 9 Oct 2025 08:29:34 +0200
+Subject: [PATCH] net: mtk: wed: add dma mask limitation and GFP_DMA32 for
+ device with more than 4GB DRAM
+
+Limit tx/rx buffer address to 32-bit address space for board with more
+than 4GB DRAM.
+
+Fixes: 804775dfc2885 ("net: ethernet: mtk_eth_soc: add support for Wireless Ethernet Dispatch (WED)")
+Fixes: 6757d345dd7db ("net: ethernet: mtk_wed: introduce hw_rro support for MT7988")
+Tested-by: Daniel Pawlik <[email protected]>
+Tested-by: Matteo Croce <[email protected]>
+Signed-off-by: Rex Lu <[email protected]>
+Co-developed-by: Lorenzo Bianconi <[email protected]>
+Signed-off-by: Lorenzo Bianconi <[email protected]>
+Reviewed-by: Simon Horman <[email protected]>
+Signed-off-by: David S. Miller <[email protected]>
+---
+
+--- a/drivers/net/ethernet/mediatek/mtk_wed.c
++++ b/drivers/net/ethernet/mediatek/mtk_wed.c
+@@ -677,7 +677,7 @@ mtk_wed_tx_buffer_alloc(struct mtk_wed_d
+               void *buf;
+               int s;
+-              page = __dev_alloc_page(GFP_KERNEL);
++              page = __dev_alloc_page(GFP_KERNEL | GFP_DMA32);
+               if (!page)
+                       return -ENOMEM;
+@@ -800,7 +800,7 @@ mtk_wed_hwrro_buffer_alloc(struct mtk_we
+               struct page *page;
+               int s;
+-              page = __dev_alloc_page(GFP_KERNEL);
++              page = __dev_alloc_page(GFP_KERNEL | GFP_DMA32);
+               if (!page)
+                       return -ENOMEM;
+@@ -2438,6 +2438,10 @@ mtk_wed_attach(struct mtk_wed_device *de
+       dev->version = hw->version;
+       dev->hw->pcie_base = mtk_wed_get_pcie_base(dev);
++      ret = dma_set_mask_and_coherent(hw->dev, DMA_BIT_MASK(32));
++      if (ret)
++              goto out;
++
+       if (hw->eth->dma_dev == hw->eth->dev &&
+           of_dma_is_coherent(hw->eth->dev->of_node))
+               mtk_eth_set_dma_device(hw->eth, hw->dev);