[][MAC80211][hnat][Fix double kfree wo issue when init wo fail]
[Description]
Fix double kfree wo issue when init wo fail
1. when init wo fail, we will kfree wo both on mtk_wed_wo_init and mtk_wed_wo_exit.
It will do double kfree wo. So change to only kfree wo at mtk_wed_wo_exit.
2. add fail status log when init wo fail
[Release-log]
Change-Id: Ie54b46f222230f7794a314613f0c80e912015219
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/9592654
diff --git a/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3008-add-wed-rx-support-for-netsys2.patch b/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3008-add-wed-rx-support-for-netsys2.patch
index 15a8c7e..41beadc 100644
--- a/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3008-add-wed-rx-support-for-netsys2.patch
+++ b/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3008-add-wed-rx-support-for-netsys2.patch
@@ -1,4 +1,4 @@
-From f4cfa86dd8d8f2a129572c1df66a68ba999d8eb5 Mon Sep 17 00:00:00 2001
+From 0f661756eee5a5940985def830aa90307ee53559 Mon Sep 17 00:00:00 2001
From: Sujuan Chen <sujuan.chen@mediatek.com>
Date: Mon, 18 Sep 2023 11:04:53 +0800
Subject: [PATCH] add-wed-rx-support-for-netsys2
@@ -10,16 +10,16 @@
drivers/net/ethernet/mediatek/Makefile | 2 +-
drivers/net/ethernet/mediatek/mtk_wed.c | 645 ++++++++++++++++--
drivers/net/ethernet/mediatek/mtk_wed.h | 51 ++
- drivers/net/ethernet/mediatek/mtk_wed_ccif.c | 133 ++++
+ drivers/net/ethernet/mediatek/mtk_wed_ccif.c | 136 ++++
drivers/net/ethernet/mediatek/mtk_wed_ccif.h | 45 ++
.../net/ethernet/mediatek/mtk_wed_debugfs.c | 90 +++
- drivers/net/ethernet/mediatek/mtk_wed_mcu.c | 604 ++++++++++++++++
+ drivers/net/ethernet/mediatek/mtk_wed_mcu.c | 605 ++++++++++++++++
drivers/net/ethernet/mediatek/mtk_wed_mcu.h | 97 +++
drivers/net/ethernet/mediatek/mtk_wed_regs.h | 143 +++-
- drivers/net/ethernet/mediatek/mtk_wed_wo.c | 564 +++++++++++++++
+ drivers/net/ethernet/mediatek/mtk_wed_wo.c | 568 +++++++++++++++
drivers/net/ethernet/mediatek/mtk_wed_wo.h | 325 +++++++++
include/linux/soc/mediatek/mtk_wed.h | 114 +++-
- 15 files changed, 2822 insertions(+), 98 deletions(-)
+ 15 files changed, 2830 insertions(+), 98 deletions(-)
create mode 100644 drivers/net/ethernet/mediatek/mtk_wed_ccif.c
create mode 100644 drivers/net/ethernet/mediatek/mtk_wed_ccif.h
create mode 100644 drivers/net/ethernet/mediatek/mtk_wed_mcu.c
@@ -225,7 +225,7 @@
+obj-$(CONFIG_NET_MEDIATEK_SOC_WED) += mtk_wed_ops.o mtk_wed_wo.o mtk_wed_mcu.o mtk_wed_ccif.o
obj-$(CONFIG_NET_MEDIATEK_HNAT) += mtk_hnat/
diff --git a/drivers/net/ethernet/mediatek/mtk_wed.c b/drivers/net/ethernet/mediatek/mtk_wed.c
-index 33b4b37..251549d 100644
+index 33b4b37..288bed8 100644
--- a/drivers/net/ethernet/mediatek/mtk_wed.c
+++ b/drivers/net/ethernet/mediatek/mtk_wed.c
@@ -13,10 +13,13 @@
@@ -329,16 +329,16 @@
+ mtk_wdma_tx_reset(dev);
+
+ mtk_wed_reset(dev, MTK_WED_RESET_WED);
++ if (wo) {
++ mtk_wed_mcu_send_msg(wo, MTK_WED_MODULE_ID_WO,
++ MTK_WED_WO_CMD_CHANGE_STATE, &state,
++ sizeof(state), false);
+
-+ mtk_wed_mcu_send_msg(wo, MTK_WED_MODULE_ID_WO,
-+ MTK_WED_WO_CMD_CHANGE_STATE, &state,
-+ sizeof(state), false);
-+
-+ if (readx_poll_timeout(mtk_wed_wo_read_status, dev, val,
-+ val == WOIF_DISABLE_DONE,
-+ 100, WOCPU_TIMEOUT))
-+ dev_err(dev->hw->dev, "failed to disable wed-wo\n");
-+
++ if (readx_poll_timeout(mtk_wed_wo_read_status, dev, val,
++ val == WOIF_DISABLE_DONE,
++ 100, WOCPU_TIMEOUT))
++ dev_err(dev->hw->dev, "failed to disable wed-wo\n");
++ }
+ reg = ioremap(WOCPU_MCUSYS_RESET_ADDR, 4);
+ val = readl((void *)reg);
+ switch(dev->hw->index) {
@@ -1338,10 +1338,10 @@
#endif
diff --git a/drivers/net/ethernet/mediatek/mtk_wed_ccif.c b/drivers/net/ethernet/mediatek/mtk_wed_ccif.c
new file mode 100644
-index 0000000..951278b
+index 0000000..7839c0a
--- /dev/null
+++ b/drivers/net/ethernet/mediatek/mtk_wed_ccif.c
-@@ -0,0 +1,133 @@
+@@ -0,0 +1,136 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include <linux/soc/mediatek/mtk_wed.h>
@@ -1415,7 +1415,7 @@
+ ret = request_irq(wo->ccif.irq, isr, IRQF_TRIGGER_HIGH,
+ "wo_ccif_isr", wo);
+ if (ret)
-+ goto free_irq;
++ return ret;
+
+ queues.desc_base = MTK_WED_WO_CCIF_DUMMY1;
+ queues.ring_size = MTK_WED_WO_CCIF_DUMMY2;
@@ -1438,13 +1438,13 @@
+ MTK_WED_WO_CMD_LEN, MTK_WED_WO_RXCH_NUM,
+ &queues);
+ if (ret)
-+ goto free_irq;
++ goto free_txq;
+
+ wo->ccif.q_int_mask = MTK_WED_WO_RXCH_INT_MASK;
+
+ ret = mtk_wed_wo_q_init(wo, mtk_wed_wo_rx_poll);
+ if (ret)
-+ goto free_irq;
++ goto free_rxq;
+
+ wo->ccif.q_exep_mask = MTK_WED_WO_EXCEPTION_INT_MASK;
+ wo->ccif.irqmask = MTK_WED_WO_ALL_INT_MASK;
@@ -1454,6 +1454,10 @@
+
+ return 0;
+
++free_rxq:
++ mtk_wed_wo_q_free(wo, &wo->q_rx);
++free_txq:
++ mtk_wed_wo_q_free(wo, &wo->q_tx);
+free_irq:
+ free_irq(wo->ccif.irq, wo);
+
@@ -1463,13 +1467,12 @@
+void wed_wo_hardware_exit(struct mtk_wed_wo *wo)
+{
+ wo->drv_ops->set_isr(wo, 0);
-+
-+ disable_irq(wo->ccif.irq);
-+ free_irq(wo->ccif.irq, wo);
-+
-+ tasklet_disable(&wo->irq_tasklet);
-+ netif_napi_del(&wo->napi);
++ if (wo->q_rx.desc) {
++ disable_irq(wo->ccif.irq);
++ free_irq(wo->ccif.irq, wo);
+
++ netif_napi_del(&wo->napi);
++ }
+ mtk_wed_wo_q_tx_clean(wo, &wo->q_tx);
+ mtk_wed_wo_q_rx_clean(wo, &wo->q_rx);
+ mtk_wed_wo_q_free(wo, &wo->q_tx);
@@ -1669,10 +1672,10 @@
}
diff --git a/drivers/net/ethernet/mediatek/mtk_wed_mcu.c b/drivers/net/ethernet/mediatek/mtk_wed_mcu.c
new file mode 100644
-index 0000000..be63406
+index 0000000..f071eeb
--- /dev/null
+++ b/drivers/net/ethernet/mediatek/mtk_wed_mcu.c
-@@ -0,0 +1,604 @@
+@@ -0,0 +1,605 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include <linux/skbuff.h>
@@ -1841,6 +1844,7 @@
+
+free:
+ kfree(exp->log);
++ exp->log = NULL;
+ return -ENOMEM;
+}
+
@@ -2636,10 +2640,10 @@
#endif
diff --git a/drivers/net/ethernet/mediatek/mtk_wed_wo.c b/drivers/net/ethernet/mediatek/mtk_wed_wo.c
new file mode 100644
-index 0000000..54b7787
+index 0000000..7e5bd17
--- /dev/null
+++ b/drivers/net/ethernet/mediatek/mtk_wed_wo.c
-@@ -0,0 +1,564 @@
+@@ -0,0 +1,568 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include <linux/kernel.h>
@@ -2831,6 +2835,7 @@
+
+ size = q->ndesc * sizeof(struct wed_wo_desc);
+ dma_free_coherent(dev->hw->dev, size, q->desc, q->desc_dma);
++ q->desc = NULL;
+}
+
+static void
@@ -3182,10 +3187,8 @@
+ goto error;
+
+ return ret;
-+
+error:
-+ kfree(wo);
-+
++ mtk_wed_wo_exit(hw);
+ return ret;
+}
+
@@ -3193,7 +3196,11 @@
+{
+ struct mtk_wed_wo *wo = hw->wed_wo;
+
++ if(!wo)
++ return;
++
+ wed_wo_hardware_exit(wo);
++ tasklet_disable(&wo->irq_tasklet);
+
+ if (wo->exp.log) {
+ dma_unmap_single(wo->hw->dev, wo->exp.phys, wo->exp.log_size, DMA_FROM_DEVICE);
@@ -3203,6 +3210,7 @@
+ wo->hw = NULL;
+ memset(wo, 0, sizeof(*wo));
+ kfree(wo);
++ hw->wed_wo = NULL;
+}
diff --git a/drivers/net/ethernet/mediatek/mtk_wed_wo.h b/drivers/net/ethernet/mediatek/mtk_wed_wo.h
new file mode 100644
@@ -3750,5 +3758,5 @@
#endif
--
-2.18.0
+2.45.2
diff --git a/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3009-add-wed-ser-support.patch b/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3009-add-wed-ser-support.patch
index 2aa0131..f6ef979 100644
--- a/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3009-add-wed-ser-support.patch
+++ b/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3009-add-wed-ser-support.patch
@@ -1,21 +1,21 @@
-From 7f1319357888271ea4aeeda81723b19a8f5ef2c0 Mon Sep 17 00:00:00 2001
+From 13171455fd9ff6fe043a8e1c9f67c89cfab8493d Mon Sep 17 00:00:00 2001
From: Sujuan Chen <sujuan.chen@mediatek.com>
Date: Mon, 18 Sep 2023 11:05:45 +0800
Subject: [PATCH] add-wed-ser-support
---
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 8 +
- drivers/net/ethernet/mediatek/mtk_wed.c | 391 ++++++++++++++-----
+ drivers/net/ethernet/mediatek/mtk_wed.c | 385 ++++++++++++++-----
drivers/net/ethernet/mediatek/mtk_wed.h | 10 +
drivers/net/ethernet/mediatek/mtk_wed_regs.h | 9 +
include/linux/soc/mediatek/mtk_wed.h | 25 +-
- 5 files changed, 342 insertions(+), 101 deletions(-)
+ 5 files changed, 338 insertions(+), 99 deletions(-)
diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-index 268c9e7..a24b223 100644
+index fc43617..a7c73f5 100644
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -4619,6 +4619,9 @@ static void mtk_pending_work(struct work_struct *work)
+@@ -4794,6 +4794,9 @@ static void mtk_pending_work(struct work_struct *work)
for (i = 0; i < MTK_MAC_COUNT; i++) {
if (!eth->netdev[i])
continue;
@@ -25,7 +25,7 @@
if (mtk_reset_flag == MTK_FE_STOP_TRAFFIC) {
pr_info("send MTK_FE_STOP_TRAFFIC event\n");
call_netdevice_notifiers(MTK_FE_STOP_TRAFFIC,
-@@ -4644,6 +4647,7 @@ static void mtk_pending_work(struct work_struct *work)
+@@ -4820,6 +4823,7 @@ static void mtk_pending_work(struct work_struct *work)
pr_warn("wait for MTK_FE_START_RESET\n");
}
rtnl_lock();
@@ -33,7 +33,7 @@
break;
}
-@@ -4682,6 +4686,9 @@ static void mtk_pending_work(struct work_struct *work)
+@@ -4858,6 +4862,9 @@ static void mtk_pending_work(struct work_struct *work)
for (i = 0; i < MTK_MAC_COUNT; i++) {
if (!eth->netdev[i])
continue;
@@ -43,7 +43,7 @@
if (mtk_reset_flag == MTK_FE_STOP_TRAFFIC) {
pr_info("send MTK_FE_START_TRAFFIC event\n");
call_netdevice_notifiers(MTK_FE_START_TRAFFIC,
-@@ -4691,6 +4698,7 @@ static void mtk_pending_work(struct work_struct *work)
+@@ -4867,6 +4874,7 @@ static void mtk_pending_work(struct work_struct *work)
call_netdevice_notifiers(MTK_FE_RESET_DONE,
eth->netdev[i]);
}
@@ -52,7 +52,7 @@
eth->netdev[i]);
break;
diff --git a/drivers/net/ethernet/mediatek/mtk_wed.c b/drivers/net/ethernet/mediatek/mtk_wed.c
-index ad9f3d5..b993f0e 100644
+index 288bed8..40943ee 100644
--- a/drivers/net/ethernet/mediatek/mtk_wed.c
+++ b/drivers/net/ethernet/mediatek/mtk_wed.c
@@ -13,8 +13,10 @@
@@ -199,7 +199,7 @@
wed_w32(dev, MTK_WED_WPDMA_INT_TRIGGER, 0);
wed_w32(dev, MTK_WED_WDMA_INT_TRIGGER, 0);
wdma_w32(dev, MTK_WDMA_INT_MASK, 0);
-@@ -543,39 +594,49 @@ mtk_wed_stop(struct mtk_wed_device *dev)
+@@ -543,31 +594,39 @@ mtk_wed_stop(struct mtk_wed_device *dev)
wed_w32(dev, MTK_WED_EXT_INT_MASK1, 0);
wed_w32(dev, MTK_WED_EXT_INT_MASK2, 0);
@@ -254,20 +254,16 @@
mtk_wed_free_tx_buffer(dev);
mtk_wed_free_tx_rings(dev);
- if (mtk_wed_get_rx_capa(dev)) {
-- mtk_wed_wo_reset(dev);
-+ if(hw->wed_wo)
-+ mtk_wed_wo_reset(dev);
+@@ -575,7 +634,7 @@ mtk_wed_detach(struct mtk_wed_device *dev)
+ mtk_wed_wo_reset(dev);
mtk_wed_free_rx_rings(dev);
-- mtk_wed_wo_exit(hw);
+ mtk_wed_wo_exit(hw);
- mtk_wdma_rx_reset(dev);
-+ if(hw->wed_wo)
-+ mtk_wed_wo_exit(hw);
+ mtk_wdma_tx_reset(dev);
}
if (dev->wlan.bus_type == MTK_WED_BUS_PCIE) {
-@@ -593,6 +654,13 @@ mtk_wed_detach(struct mtk_wed_device *dev)
+@@ -593,6 +652,13 @@ mtk_wed_detach(struct mtk_wed_device *dev)
module_put(THIS_MODULE);
hw->wed_dev = NULL;
@@ -281,7 +277,7 @@
mutex_unlock(&hw_lock);
}
-@@ -665,7 +733,7 @@ mtk_wed_hw_init_early(struct mtk_wed_device *dev)
+@@ -665,7 +731,7 @@ mtk_wed_hw_init_early(struct mtk_wed_device *dev)
{
u32 mask, set;
@@ -290,7 +286,7 @@
mtk_wed_reset(dev, MTK_WED_RESET_WED);
mtk_wed_set_wpdma(dev);
-@@ -715,7 +783,6 @@ mtk_wed_rro_ring_alloc(struct mtk_wed_device *dev, struct mtk_wed_ring *ring,
+@@ -715,7 +781,6 @@ mtk_wed_rro_ring_alloc(struct mtk_wed_device *dev, struct mtk_wed_ring *ring,
ring->desc_size = sizeof(*ring->desc);
ring->size = size;
@@ -298,7 +294,7 @@
return 0;
}
-@@ -938,44 +1005,140 @@ mtk_wed_ring_reset(struct mtk_wed_ring *ring, int size, bool tx)
+@@ -938,44 +1003,140 @@ mtk_wed_ring_reset(struct mtk_wed_ring *ring, int size, bool tx)
}
static u32
@@ -463,7 +459,7 @@
static void
mtk_wed_reset_dma(struct mtk_wed_device *dev)
{
-@@ -991,22 +1154,25 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
+@@ -991,22 +1152,25 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
true);
}
@@ -497,7 +493,7 @@
if (busy) {
mtk_wed_reset(dev, MTK_WED_RESET_WDMA_INT_AGENT);
-@@ -1023,6 +1189,9 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
+@@ -1023,6 +1187,9 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
MTK_WED_WDMA_GLO_CFG_RST_INIT_COMPLETE);
}
@@ -507,7 +503,7 @@
for (i = 0; i < 100; i++) {
val = wed_r32(dev, MTK_WED_TX_BM_INTF);
if (FIELD_GET(MTK_WED_TX_BM_INTF_TKFIFO_FDEP, val) == 0x40)
-@@ -1030,8 +1199,21 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
+@@ -1030,8 +1197,21 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
}
mtk_wed_reset(dev, MTK_WED_RESET_TX_FREE_AGENT);
@@ -529,7 +525,7 @@
if (busy) {
mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_INT_AGENT);
mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_TX_DRV);
-@@ -1043,6 +1225,16 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
+@@ -1043,6 +1223,16 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
wed_w32(dev, MTK_WED_WPDMA_RESET_IDX, 0);
}
@@ -546,7 +542,7 @@
}
static int
-@@ -1062,7 +1254,8 @@ mtk_wed_ring_alloc(struct mtk_wed_device *dev, struct mtk_wed_ring *ring,
+@@ -1062,7 +1252,8 @@ mtk_wed_ring_alloc(struct mtk_wed_device *dev, struct mtk_wed_ring *ring,
}
static int
@@ -556,7 +552,7 @@
{
u32 desc_size = sizeof(struct mtk_wdma_desc) * dev->hw->version;
struct mtk_wed_ring *wdma;
-@@ -1071,8 +1264,8 @@ mtk_wed_wdma_rx_ring_setup(struct mtk_wed_device *dev, int idx, int size)
+@@ -1071,8 +1262,8 @@ mtk_wed_wdma_rx_ring_setup(struct mtk_wed_device *dev, int idx, int size)
return -EINVAL;
wdma = &dev->rx_wdma[idx];
@@ -567,7 +563,7 @@
return -ENOMEM;
wdma_w32(dev, MTK_WDMA_RING_RX(idx) + MTK_WED_RING_OFS_BASE,
-@@ -1090,7 +1283,8 @@ mtk_wed_wdma_rx_ring_setup(struct mtk_wed_device *dev, int idx, int size)
+@@ -1090,7 +1281,8 @@ mtk_wed_wdma_rx_ring_setup(struct mtk_wed_device *dev, int idx, int size)
}
static int
@@ -577,7 +573,7 @@
{
u32 desc_size = sizeof(struct mtk_wdma_desc) * dev->hw->version;
struct mtk_wed_ring *wdma;
-@@ -1099,8 +1293,8 @@ mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size)
+@@ -1099,8 +1291,8 @@ mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size)
return -EINVAL;
wdma = &dev->tx_wdma[idx];
@@ -588,7 +584,7 @@
return -ENOMEM;
wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_BASE,
-@@ -1112,6 +1306,9 @@ mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size)
+@@ -1112,6 +1304,9 @@ mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size)
wdma_w32(dev,
MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_DMA_IDX, 0);
@@ -598,7 +594,7 @@
if (!idx) {
wed_w32(dev, MTK_WED_WDMA_RING_TX + MTK_WED_RING_OFS_BASE,
wdma->desc_phys);
-@@ -1267,9 +1464,12 @@ mtk_wed_start(struct mtk_wed_device *dev, u32 irq_mask)
+@@ -1267,9 +1462,12 @@ mtk_wed_start(struct mtk_wed_device *dev, u32 irq_mask)
{
int i;
@@ -612,7 +608,7 @@
mtk_wed_hw_init(dev);
-@@ -1278,10 +1478,9 @@ mtk_wed_start(struct mtk_wed_device *dev, u32 irq_mask)
+@@ -1278,10 +1476,9 @@ mtk_wed_start(struct mtk_wed_device *dev, u32 irq_mask)
mtk_wed_set_ext_int(dev, true);
if (dev->hw->version == 1) {
@@ -626,7 +622,7 @@
val |= BIT(0) | (BIT(1) * !!dev->hw->index);
regmap_write(dev->hw->mirror, dev->hw->index * 4, val);
-@@ -1353,10 +1552,6 @@ mtk_wed_attach(struct mtk_wed_device *dev)
+@@ -1353,10 +1550,6 @@ mtk_wed_attach(struct mtk_wed_device *dev)
goto out;
if (mtk_wed_get_rx_capa(dev)) {
@@ -637,7 +633,7 @@
ret = mtk_wed_rro_alloc(dev);
if (ret)
goto out;
-@@ -1364,6 +1559,10 @@ mtk_wed_attach(struct mtk_wed_device *dev)
+@@ -1364,6 +1557,10 @@ mtk_wed_attach(struct mtk_wed_device *dev)
mtk_wed_hw_init_early(dev);
@@ -648,20 +644,20 @@
if (hw->version == 1) {
regmap_update_bits(hw->hifsys, HIFSYS_DMA_AG_MAP,
BIT(hw->index), 0);
-@@ -1373,8 +1572,10 @@ mtk_wed_attach(struct mtk_wed_device *dev)
+@@ -1373,8 +1570,10 @@ mtk_wed_attach(struct mtk_wed_device *dev)
}
out:
- if (ret)
- mtk_wed_detach(dev);
+ if (ret) {
-+ dev_err(dev->hw->dev, "failed to attach wed device\n");
++ dev_err(dev->hw->dev, "failed to attach wed device ret %d\n", ret);
+ __mtk_wed_detach(dev);
+ }
unlock:
mutex_unlock(&hw_lock);
-@@ -1382,7 +1583,8 @@ mtk_wed_attach(struct mtk_wed_device *dev)
+@@ -1382,7 +1581,8 @@ mtk_wed_attach(struct mtk_wed_device *dev)
}
static int
@@ -671,7 +667,7 @@
{
struct mtk_wed_ring *ring = &dev->tx_ring[idx];
-@@ -1401,11 +1603,12 @@ mtk_wed_tx_ring_setup(struct mtk_wed_device *dev, int idx, void __iomem *regs)
+@@ -1401,11 +1601,12 @@ mtk_wed_tx_ring_setup(struct mtk_wed_device *dev, int idx, void __iomem *regs)
if (WARN_ON(idx >= ARRAY_SIZE(dev->tx_ring)))
return -EINVAL;
@@ -687,7 +683,7 @@
return -ENOMEM;
ring->reg_base = MTK_WED_RING_TX(idx);
-@@ -1450,18 +1653,20 @@ mtk_wed_txfree_ring_setup(struct mtk_wed_device *dev, void __iomem *regs)
+@@ -1450,18 +1651,20 @@ mtk_wed_txfree_ring_setup(struct mtk_wed_device *dev, void __iomem *regs)
}
static int
@@ -856,5 +852,5 @@
#endif
--
-2.18.0
+2.45.2
diff --git a/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3019-mtk-wed-add-wed3-support.patch b/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3019-mtk-wed-add-wed3-support.patch
index fe68b04..8bb6e79 100644
--- a/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3019-mtk-wed-add-wed3-support.patch
+++ b/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3019-mtk-wed-add-wed3-support.patch
@@ -1,4 +1,4 @@
-From 1865b8b9a152b199ab1590859621aef31c5499b3 Mon Sep 17 00:00:00 2001
+From cd1673703b8a5340f58445d3a30738b9f5f20248 Mon Sep 17 00:00:00 2001
From: Sujuan Chen <sujuan.chen@mediatek.com>
Date: Mon, 18 Sep 2023 13:21:15 +0800
Subject: [PATCH] mtk:wed:add wed3 support
@@ -22,7 +22,7 @@
mode change 100755 => 100644 drivers/net/ethernet/mediatek/mtk_ppe.c
diff --git a/arch/arm64/boot/dts/mediatek/mt7988.dtsi b/arch/arm64/boot/dts/mediatek/mt7988.dtsi
-index f38b2b7..3ae7b9f 100644
+index b2b2fde..d6737fe 100644
--- a/arch/arm64/boot/dts/mediatek/mt7988.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt7988.dtsi
@@ -241,44 +241,49 @@
@@ -212,7 +212,7 @@
};
reserved-memory {
-@@ -947,6 +984,7 @@
+@@ -941,6 +978,7 @@
<&topckgen CK_TOP_CB_SGM_325M>;
mediatek,ethsys = <ðsys>;
mediatek,sgmiisys = <&sgmiisys0>, <&sgmiisys1>;
@@ -221,10 +221,10 @@
mediatek,xfi_pextp = <&xfi_pextp0>, <&xfi_pextp1>;
mediatek,xfi_pll = <&xfi_pll>;
diff --git a/arch/arm64/boot/dts/mediatek/mt7988a-dsa-10g-spim-nor.dts b/arch/arm64/boot/dts/mediatek/mt7988a-dsa-10g-spim-nor.dts
-index 24c7799..c283c5e 100644
+index e0f1326..2f50104 100644
--- a/arch/arm64/boot/dts/mediatek/mt7988a-dsa-10g-spim-nor.dts
+++ b/arch/arm64/boot/dts/mediatek/mt7988a-dsa-10g-spim-nor.dts
-@@ -434,9 +434,23 @@
+@@ -435,9 +435,23 @@
status = "okay";
};
@@ -251,10 +251,10 @@
+};
\ No newline at end of file
diff --git a/arch/arm64/boot/dts/mediatek/mt7988d-dsa-10g-spim-nor.dts b/arch/arm64/boot/dts/mediatek/mt7988d-dsa-10g-spim-nor.dts
-index f72c5d3..6503700 100644
+index 3df84cc..37b86dc 100644
--- a/arch/arm64/boot/dts/mediatek/mt7988d-dsa-10g-spim-nor.dts
+++ b/arch/arm64/boot/dts/mediatek/mt7988d-dsa-10g-spim-nor.dts
-@@ -444,9 +444,23 @@
+@@ -445,9 +445,23 @@
status = "okay";
};
@@ -283,7 +283,7 @@
diff --git a/drivers/net/ethernet/mediatek/mtk_ppe.c b/drivers/net/ethernet/mediatek/mtk_ppe.c
old mode 100755
new mode 100644
-index 0e9c0bd..c9a13c4
+index 2ff0426..71a161f
--- a/drivers/net/ethernet/mediatek/mtk_ppe.c
+++ b/drivers/net/ethernet/mediatek/mtk_ppe.c
@@ -9,6 +9,7 @@
@@ -316,10 +316,10 @@
if (wdma_idx)
*ib2 |= MTK_FOE_IB2_WDMA_DEVIDX;
diff --git a/drivers/net/ethernet/mediatek/mtk_ppe.h b/drivers/net/ethernet/mediatek/mtk_ppe.h
-index 2a8b6ef..c19a91d 100644
+index 43fbe1d..38a3776 100644
--- a/drivers/net/ethernet/mediatek/mtk_ppe.h
+++ b/drivers/net/ethernet/mediatek/mtk_ppe.h
-@@ -428,7 +428,7 @@ int mtk_foe_entry_set_dsa(struct mtk_foe_entry *entry, int port);
+@@ -414,7 +414,7 @@ int mtk_foe_entry_set_dsa(struct mtk_foe_entry *entry, int port);
int mtk_foe_entry_set_vlan(struct mtk_foe_entry *entry, int vid);
int mtk_foe_entry_set_pppoe(struct mtk_foe_entry *entry, int sid);
int mtk_foe_entry_set_wdma(struct mtk_foe_entry *entry, int wdma_idx, int txq,
@@ -329,7 +329,7 @@
int mtk_foe_entry_set_dscp(struct mtk_foe_entry *entry, int dscp);
bool mtk_foe_entry_match(struct mtk_foe_entry *entry, struct mtk_foe_entry *data);
diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
-index f362771..e5003a8 100644
+index b9983d7..64b1d9e 100644
--- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
+++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
@@ -88,7 +88,7 @@ mtk_flow_offload_mangle_eth(const struct flow_action_entry *act, void *eth)
@@ -379,7 +379,7 @@
return -EOPNOTSUPP;
#endif
diff --git a/drivers/net/ethernet/mediatek/mtk_wed.c b/drivers/net/ethernet/mediatek/mtk_wed.c
-index edc41c4..a72484c 100644
+index 45af859..71d57cd 100644
--- a/drivers/net/ethernet/mediatek/mtk_wed.c
+++ b/drivers/net/ethernet/mediatek/mtk_wed.c
@@ -23,9 +23,45 @@
@@ -1123,15 +1123,15 @@
mtk_wed_free_tx_buffer(dev);
mtk_wed_free_tx_rings(dev);
-@@ -636,7 +951,6 @@ __mtk_wed_detach(struct mtk_wed_device *dev)
+@@ -634,7 +949,6 @@ __mtk_wed_detach(struct mtk_wed_device *dev)
+ mtk_wed_wo_reset(dev);
mtk_wed_free_rx_rings(dev);
- if(hw->wed_wo)
- mtk_wed_wo_exit(hw);
+ mtk_wed_wo_exit(hw);
- mtk_wdma_tx_reset(dev);
}
if (dev->wlan.bus_type == MTK_WED_BUS_PCIE) {
-@@ -664,21 +978,36 @@ mtk_wed_detach(struct mtk_wed_device *dev)
+@@ -662,21 +976,36 @@ mtk_wed_detach(struct mtk_wed_device *dev)
mutex_unlock(&hw_lock);
}
@@ -1175,7 +1175,7 @@
wed_w32(dev, MTK_WED_PCIE_INT_CTRL,
FIELD_PREP(MTK_WED_PCIE_INT_CTRL_POLL_EN, 2));
-@@ -686,19 +1015,9 @@ mtk_wed_bus_init(struct mtk_wed_device *dev)
+@@ -684,19 +1013,9 @@ mtk_wed_bus_init(struct mtk_wed_device *dev)
/* pcie interrupt control: pola/source selection */
wed_set(dev, MTK_WED_PCIE_INT_CTRL,
MTK_WED_PCIE_INT_CTRL_MSK_EN_POLA |
@@ -1198,7 +1198,7 @@
break;
}
case MTK_WED_BUS_AXI:
-@@ -714,45 +1033,71 @@ mtk_wed_bus_init(struct mtk_wed_device *dev)
+@@ -712,45 +1031,71 @@ mtk_wed_bus_init(struct mtk_wed_device *dev)
static void
mtk_wed_set_wpdma(struct mtk_wed_device *dev)
{
@@ -1290,7 +1290,7 @@
} else {
wed_w32(dev, MTK_WED_WDMA_CFG_BASE, dev->hw->wdma_phy);
wed_set(dev, MTK_WED_CTRL, MTK_WED_CTRL_ETH_DMAD_FMT);
-@@ -844,7 +1189,8 @@ mtk_wed_rro_cfg(struct mtk_wed_device *dev)
+@@ -842,7 +1187,8 @@ mtk_wed_rro_cfg(struct mtk_wed_device *dev)
},
};
@@ -1300,7 +1300,7 @@
&req, sizeof(req), true);
}
-@@ -895,11 +1241,18 @@ mtk_wed_route_qm_hw_init(struct mtk_wed_device *dev)
+@@ -893,11 +1239,18 @@ mtk_wed_route_qm_hw_init(struct mtk_wed_device *dev)
}
/* configure RX_ROUTE_QM */
@@ -1324,7 +1324,7 @@
/* enable RX_ROUTE_QM */
wed_set(dev, MTK_WED_CTRL, MTK_WED_CTRL_RX_ROUTE_QM_EN);
-@@ -918,35 +1271,26 @@ mtk_wed_hw_init(struct mtk_wed_device *dev)
+@@ -916,35 +1269,26 @@ mtk_wed_hw_init(struct mtk_wed_device *dev)
wed_w32(dev, MTK_WED_TX_BM_BUF_LEN, MTK_WED_PKT_SIZE);
@@ -1365,7 +1365,7 @@
wed_w32(dev, MTK_WED_TX_BM_DYN_THR,
FIELD_PREP(MTK_WED_TX_BM_DYN_THR_LO_V2, 0) |
MTK_WED_TX_BM_DYN_THR_HI_V2);
-@@ -956,32 +1300,73 @@ mtk_wed_hw_init(struct mtk_wed_device *dev)
+@@ -954,32 +1298,73 @@ mtk_wed_hw_init(struct mtk_wed_device *dev)
dev->tx_buf_ring.size / 128) |
FIELD_PREP(MTK_WED_TX_TKID_CTRL_RSV_GRP_NUM,
dev->tx_buf_ring.size / 128));
@@ -1446,7 +1446,7 @@
}
static void
-@@ -1099,13 +1484,8 @@ mtk_wed_rx_reset(struct mtk_wed_device *dev)
+@@ -1097,13 +1482,8 @@ mtk_wed_rx_reset(struct mtk_wed_device *dev)
if (ret) {
mtk_wed_reset(dev, MTK_WED_RESET_WED_RX_DMA);
} else {
@@ -1462,7 +1462,7 @@
wed_w32(dev, MTK_WED_RESET_IDX, 0);
}
-@@ -1162,7 +1542,8 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
+@@ -1160,7 +1540,8 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
if (busy) {
mtk_wed_reset(dev, MTK_WED_RESET_WED_TX_DMA);
} else {
@@ -1472,7 +1472,7 @@
wed_w32(dev, MTK_WED_RESET_IDX, 0);
}
-@@ -1226,7 +1607,7 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
+@@ -1224,7 +1605,7 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
}
dev->init_done = false;
@@ -1481,7 +1481,7 @@
return;
if (!busy) {
-@@ -1257,7 +1638,6 @@ static int
+@@ -1255,7 +1636,6 @@ static int
mtk_wed_wdma_rx_ring_setup(struct mtk_wed_device *dev, int idx, int size,
bool reset)
{
@@ -1489,7 +1489,7 @@
struct mtk_wed_ring *wdma;
if (idx >= ARRAY_SIZE(dev->rx_wdma))
-@@ -1265,9 +1645,11 @@ mtk_wed_wdma_rx_ring_setup(struct mtk_wed_device *dev, int idx, int size,
+@@ -1263,9 +1643,11 @@ mtk_wed_wdma_rx_ring_setup(struct mtk_wed_device *dev, int idx, int size,
wdma = &dev->rx_wdma[idx];
if (!reset && mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE,
@@ -1502,7 +1502,7 @@
wdma_w32(dev, MTK_WDMA_RING_RX(idx) + MTK_WED_RING_OFS_BASE,
wdma->desc_phys);
wdma_w32(dev, MTK_WDMA_RING_RX(idx) + MTK_WED_RING_OFS_COUNT,
-@@ -1286,7 +1668,6 @@ static int
+@@ -1284,7 +1666,6 @@ static int
mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size,
bool reset)
{
@@ -1510,7 +1510,7 @@
struct mtk_wed_ring *wdma;
if (idx >= ARRAY_SIZE(dev->tx_wdma))
-@@ -1294,9 +1675,29 @@ mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size,
+@@ -1292,9 +1673,29 @@ mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size,
wdma = &dev->tx_wdma[idx];
if (!reset && mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE,
@@ -1541,7 +1541,7 @@
wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_BASE,
wdma->desc_phys);
wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_COUNT,
-@@ -1354,7 +1755,7 @@ mtk_wed_configure_irq(struct mtk_wed_device *dev, u32 irq_mask)
+@@ -1352,7 +1753,7 @@ mtk_wed_configure_irq(struct mtk_wed_device *dev, u32 irq_mask)
MTK_WED_CTRL_WED_TX_BM_EN |
MTK_WED_CTRL_WED_TX_FREE_AGENT_EN);
@@ -1550,7 +1550,7 @@
wed_w32(dev, MTK_WED_PCIE_INT_TRIGGER,
MTK_WED_PCIE_INT_TRIGGER_STATUS);
-@@ -1364,8 +1765,9 @@ mtk_wed_configure_irq(struct mtk_wed_device *dev, u32 irq_mask)
+@@ -1362,8 +1763,9 @@ mtk_wed_configure_irq(struct mtk_wed_device *dev, u32 irq_mask)
wed_clr(dev, MTK_WED_WDMA_INT_CTRL, wdma_mask);
} else {
@@ -1562,7 +1562,7 @@
/* initail tx interrupt trigger */
wed_w32(dev, MTK_WED_WPDMA_INT_CTRL_TX,
MTK_WED_WPDMA_INT_CTRL_TX0_DONE_EN |
-@@ -1384,19 +1786,25 @@ mtk_wed_configure_irq(struct mtk_wed_device *dev, u32 irq_mask)
+@@ -1382,19 +1784,25 @@ mtk_wed_configure_irq(struct mtk_wed_device *dev, u32 irq_mask)
FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_TX_FREE_DONE_TRIG,
dev->wlan.txfree_tbit));
@@ -1598,7 +1598,7 @@
}
/* initail wdma interrupt agent */
wed_w32(dev, MTK_WED_WDMA_INT_TRIGGER, wdma_mask);
-@@ -1407,58 +1815,295 @@ mtk_wed_configure_irq(struct mtk_wed_device *dev, u32 irq_mask)
+@@ -1405,58 +1813,295 @@ mtk_wed_configure_irq(struct mtk_wed_device *dev, u32 irq_mask)
wed_w32(dev, MTK_WED_INT_MASK, irq_mask);
}
@@ -1924,7 +1924,7 @@
static void
mtk_wed_start(struct mtk_wed_device *dev, u32 irq_mask)
{
-@@ -1471,20 +2116,29 @@ mtk_wed_start(struct mtk_wed_device *dev, u32 irq_mask)
+@@ -1469,20 +2114,29 @@ mtk_wed_start(struct mtk_wed_device *dev, u32 irq_mask)
if (!dev->rx_wdma[i].desc)
mtk_wed_wdma_rx_ring_setup(dev, i, 16, false);
@@ -1956,7 +1956,7 @@
/* driver set mid ready and only once */
wed_w32(dev, MTK_WED_EXT_INT_MASK1,
MTK_WED_EXT_INT_STATUS_WPDMA_MID_RDY);
-@@ -1494,12 +2148,19 @@ mtk_wed_start(struct mtk_wed_device *dev, u32 irq_mask)
+@@ -1492,12 +2146,19 @@ mtk_wed_start(struct mtk_wed_device *dev, u32 irq_mask)
wed_r32(dev, MTK_WED_EXT_INT_MASK1);
wed_r32(dev, MTK_WED_EXT_INT_MASK2);
@@ -1976,7 +1976,7 @@
mtk_wed_dma_enable(dev);
dev->running = true;
-@@ -1516,9 +2177,7 @@ mtk_wed_attach(struct mtk_wed_device *dev)
+@@ -1514,9 +2175,7 @@ mtk_wed_attach(struct mtk_wed_device *dev)
RCU_LOCKDEP_WARN(!rcu_read_lock_held(),
"mtk_wed_attach without holding the RCU read lock");
@@ -1987,7 +1987,7 @@
return -ENODEV;
rcu_read_unlock();
-@@ -1537,11 +2196,13 @@ mtk_wed_attach(struct mtk_wed_device *dev)
+@@ -1535,11 +2194,13 @@ mtk_wed_attach(struct mtk_wed_device *dev)
: &dev->wlan.platform_dev->dev;
dev_info(device, "attaching wed device %d version %d\n",
hw->index, hw->version);
@@ -2001,7 +2001,7 @@
if (hw->eth->dma_dev == hw->eth->dev &&
of_dma_is_coherent(hw->eth->dev->of_node))
-@@ -1551,6 +2212,10 @@ mtk_wed_attach(struct mtk_wed_device *dev)
+@@ -1549,6 +2210,10 @@ mtk_wed_attach(struct mtk_wed_device *dev)
if (ret)
goto out;
@@ -2012,7 +2012,7 @@
if (mtk_wed_get_rx_capa(dev)) {
ret = mtk_wed_rro_alloc(dev);
if (ret)
-@@ -1563,13 +2228,14 @@ mtk_wed_attach(struct mtk_wed_device *dev)
+@@ -1561,13 +2226,14 @@ mtk_wed_attach(struct mtk_wed_device *dev)
init_completion(&dev->wlan_reset_done);
atomic_set(&dev->fe_reset, 0);
@@ -2030,7 +2030,7 @@
out:
if (ret) {
-@@ -1613,6 +2279,24 @@ mtk_wed_tx_ring_setup(struct mtk_wed_device *dev, int idx,
+@@ -1611,6 +2277,24 @@ mtk_wed_tx_ring_setup(struct mtk_wed_device *dev, int idx,
ring->reg_base = MTK_WED_RING_TX(idx);
ring->wpdma = regs;
@@ -2055,7 +2055,7 @@
/* WED -> WPDMA */
wpdma_tx_w32(dev, idx, MTK_WED_RING_OFS_BASE, ring->desc_phys);
-@@ -1632,7 +2316,7 @@ static int
+@@ -1630,7 +2314,7 @@ static int
mtk_wed_txfree_ring_setup(struct mtk_wed_device *dev, void __iomem *regs)
{
struct mtk_wed_ring *ring = &dev->txfree_ring;
@@ -2064,7 +2064,7 @@
/*
* For txfree event handling, the same DMA ring is shared between WED
-@@ -1692,9 +2376,13 @@ mtk_wed_irq_get(struct mtk_wed_device *dev, u32 mask)
+@@ -1690,9 +2374,13 @@ mtk_wed_irq_get(struct mtk_wed_device *dev, u32 mask)
val = wed_r32(dev, MTK_WED_EXT_INT_STATUS);
wed_w32(dev, MTK_WED_EXT_INT_STATUS, val);
@@ -2081,7 +2081,7 @@
if (val && net_ratelimit())
pr_err("mtk_wed%d: error status=%08x\n", dev->hw->index, val);
-@@ -1718,19 +2406,20 @@ mtk_wed_irq_set_mask(struct mtk_wed_device *dev, u32 mask)
+@@ -1716,19 +2404,20 @@ mtk_wed_irq_set_mask(struct mtk_wed_device *dev, u32 mask)
int mtk_wed_flow_add(int index)
{
struct mtk_wed_hw *hw = hw_list[index];
@@ -2111,7 +2111,7 @@
goto out;
}
-@@ -1749,14 +2438,15 @@ void mtk_wed_flow_remove(int index)
+@@ -1747,14 +2436,15 @@ void mtk_wed_flow_remove(int index)
{
struct mtk_wed_hw *hw = hw_list[index];
@@ -2133,7 +2133,7 @@
goto out;
hw->wed_dev->wlan.offload_disable(hw->wed_dev);
-@@ -1799,6 +2489,10 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
+@@ -1797,6 +2487,10 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
.detach = mtk_wed_detach,
.setup_tc = mtk_wed_eth_setup_tc,
.ppe_check = mtk_wed_ppe_check,
@@ -2144,7 +2144,7 @@
};
struct device_node *eth_np = eth->dev->of_node;
struct platform_device *pdev;
-@@ -1840,14 +2534,22 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
+@@ -1838,14 +2532,22 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
hw->wdma_phy = wdma_phy;
hw->index = index;
hw->irq = irq;
@@ -2172,7 +2172,7 @@
if (IS_ERR(hw->mirror) || IS_ERR(hw->hifsys)) {
kfree(hw);
goto unlock;
-@@ -1857,8 +2559,10 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
+@@ -1855,8 +2557,10 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
regmap_write(hw->mirror, 0, 0);
regmap_write(hw->mirror, 4, 0);
}
@@ -3014,7 +3014,7 @@
}
}
diff --git a/drivers/net/ethernet/mediatek/mtk_wed_mcu.c b/drivers/net/ethernet/mediatek/mtk_wed_mcu.c
-index be63406..18d1fb1 100644
+index f071eeb..20d0ad9 100644
--- a/drivers/net/ethernet/mediatek/mtk_wed_mcu.c
+++ b/drivers/net/ethernet/mediatek/mtk_wed_mcu.c
@@ -91,7 +91,7 @@ mtk_wed_mcu_msg_update(struct mtk_wed_device *dev, int id, void *data, int len)
@@ -3026,7 +3026,7 @@
return 0;
if (WARN_ON(!wo))
-@@ -248,7 +248,7 @@ mtk_wed_load_firmware(struct mtk_wed_wo *wo)
+@@ -249,7 +249,7 @@ mtk_wed_load_firmware(struct mtk_wed_wo *wo)
u8 reserved1[15];
} __packed *region;
@@ -3035,7 +3035,7 @@
const struct mtk_wed_fw_trailer *hdr;
static u8 shared[MAX_REGION_SIZE] = {0};
const struct firmware *fw;
-@@ -256,13 +256,24 @@ mtk_wed_load_firmware(struct mtk_wed_wo *wo)
+@@ -257,13 +257,24 @@ mtk_wed_load_firmware(struct mtk_wed_wo *wo)
u32 ofs = 0;
u32 boot_cr, val;
@@ -3066,7 +3066,7 @@
if (ret)
return ret;
-@@ -307,8 +318,11 @@ mtk_wed_load_firmware(struct mtk_wed_wo *wo)
+@@ -308,8 +319,11 @@ mtk_wed_load_firmware(struct mtk_wed_wo *wo)
}
/* write the start address */
@@ -3080,7 +3080,7 @@
wo_w32(wo, boot_cr, (wo->region[WO_REGION_EMI].addr_pa >> 16));
/* wo firmware reset */
-@@ -316,8 +330,10 @@ mtk_wed_load_firmware(struct mtk_wed_wo *wo)
+@@ -317,8 +331,10 @@ mtk_wed_load_firmware(struct mtk_wed_wo *wo)
val = wo_r32(wo, WOX_MCU_CFG_LS_WF_MCU_CFG_WM_WA_ADDR);
@@ -3094,7 +3094,7 @@
wo_w32(wo, WOX_MCU_CFG_LS_WF_MCU_CFG_WM_WA_ADDR, val);
diff --git a/drivers/net/ethernet/mediatek/mtk_wed_mcu.h b/drivers/net/ethernet/mediatek/mtk_wed_mcu.h
-index dbb17ae..6d4c9a7 100644
+index 1b4c3b7..27d7c18 100644
--- a/drivers/net/ethernet/mediatek/mtk_wed_mcu.h
+++ b/drivers/net/ethernet/mediatek/mtk_wed_mcu.h
@@ -17,8 +17,11 @@
@@ -3856,5 +3856,5 @@
#endif
--
-2.18.0
+2.45.2
diff --git a/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3021-mtk-wed-add-dma-mask-limitation-and-GFP_DMA32-for-bo.patch b/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3021-mtk-wed-add-dma-mask-limitation-and-GFP_DMA32-for-bo.patch
index 0ad8ba7..58cf34b 100644
--- a/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3021-mtk-wed-add-dma-mask-limitation-and-GFP_DMA32-for-bo.patch
+++ b/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3021-mtk-wed-add-dma-mask-limitation-and-GFP_DMA32-for-bo.patch
@@ -1,4 +1,4 @@
-From f83c601c7b525c0adedcf1f5e8041acd350c7e2d Mon Sep 17 00:00:00 2001
+From 1946b547d6e2297b841f77b03af6e17a7c26ea10 Mon Sep 17 00:00:00 2001
From: Sujuan Chen <sujuan.chen@mediatek.com>
Date: Mon, 18 Sep 2023 13:23:56 +0800
Subject: [PATCH] mtk: wed: add dma mask limitation and GFP_DMA32 for board >=
@@ -12,7 +12,7 @@
4 files changed, 16 insertions(+), 9 deletions(-)
diff --git a/drivers/net/ethernet/mediatek/mtk_wed.c b/drivers/net/ethernet/mediatek/mtk_wed.c
-index 5eeb3ed..094bc94 100644
+index 662891c..4f40f83 100644
--- a/drivers/net/ethernet/mediatek/mtk_wed.c
+++ b/drivers/net/ethernet/mediatek/mtk_wed.c
@@ -625,7 +625,7 @@ mtk_wed_tx_buffer_alloc(struct mtk_wed_device *dev)
@@ -68,7 +68,7 @@
desc++;
buf += MTK_WED_PAGE_BUF_SIZE;
buf_phys += MTK_WED_PAGE_BUF_SIZE;
-@@ -2457,6 +2459,10 @@ mtk_wed_attach(struct mtk_wed_device *dev)
+@@ -2456,6 +2458,10 @@ mtk_wed_attach(struct mtk_wed_device *dev)
dev->version = hw->version;
dev->hw->pci_base = mtk_wed_get_pci_base(dev);
@@ -80,7 +80,7 @@
of_dma_is_coherent(hw->eth->dev->of_node))
mtk_eth_set_dma_device(hw->eth, hw->dev);
diff --git a/drivers/net/ethernet/mediatek/mtk_wed_mcu.c b/drivers/net/ethernet/mediatek/mtk_wed_mcu.c
-index 18d1fb1..a88061c 100644
+index 20d0ad9..cd14d47 100644
--- a/drivers/net/ethernet/mediatek/mtk_wed_mcu.c
+++ b/drivers/net/ethernet/mediatek/mtk_wed_mcu.c
@@ -145,7 +145,7 @@ int mtk_wed_exception_init(struct mtk_wed_wo *wo)
@@ -98,11 +98,11 @@
free:
- kfree(exp->log);
+ skb_free_frag(exp->log);
+ exp->log = NULL;
return -ENOMEM;
}
-
diff --git a/drivers/net/ethernet/mediatek/mtk_wed_wo.c b/drivers/net/ethernet/mediatek/mtk_wed_wo.c
-index 54b7787..e991d20 100644
+index ea102f4..b9e80ae 100644
--- a/drivers/net/ethernet/mediatek/mtk_wed_wo.c
+++ b/drivers/net/ethernet/mediatek/mtk_wed_wo.c
@@ -88,7 +88,7 @@ woif_q_rx_fill(struct mtk_wed_wo *wo, struct wed_wo_queue *q, bool rx)
@@ -114,7 +114,7 @@
if (!buf)
break;
-@@ -555,7 +555,7 @@ void mtk_wed_wo_exit(struct mtk_wed_hw *hw)
+@@ -553,7 +553,7 @@ void mtk_wed_wo_exit(struct mtk_wed_hw *hw)
if (wo->exp.log) {
dma_unmap_single(wo->hw->dev, wo->exp.phys, wo->exp.log_size, DMA_FROM_DEVICE);
@@ -136,5 +136,5 @@
struct net_device napi_dev;
spinlock_t rx_lock;
--
-2.18.0
+2.45.2