blob: 38c8c666bf7f02d655684d9be73aab030e22a856 [file] [log] [blame]
developerc992b602024-02-28 08:42:27 +08001From c9c56f04fe09013986b1cecf7a7a18bef5ea7f5b Mon Sep 17 00:00:00 2001
developer064da3c2023-06-13 15:57:26 +08002From: Bo Jiao <Bo.Jiao@mediatek.com>
3Date: Fri, 19 May 2023 14:56:07 +0800
developer07b5baf2024-01-10 04:38:47 +08004Subject: [PATCH 1016/1044] mtk: wifi: mt76: mt7996: add debugfs for fw
developer5f4e6c32023-12-20 06:12:53 +08005 coredump.
developer064da3c2023-06-13 15:57:26 +08006
7Signed-off-by: Bo Jiao <Bo.Jiao@mediatek.com>
8---
9 mt7996/debugfs.c | 19 +++++++++++++++++--
10 mt7996/mac.c | 28 +++++++++++++++++++++++++---
11 mt7996/mcu.h | 4 ++++
12 mt7996/mt7996.h | 10 ++++++++++
13 4 files changed, 56 insertions(+), 5 deletions(-)
14
15diff --git a/mt7996/debugfs.c b/mt7996/debugfs.c
developerc992b602024-02-28 08:42:27 +080016index ea78166b..7a03de12 100644
developer064da3c2023-06-13 15:57:26 +080017--- a/mt7996/debugfs.c
18+++ b/mt7996/debugfs.c
19@@ -84,6 +84,8 @@ mt7996_sys_recovery_set(struct file *file, const char __user *user_buf,
20 * 7: trigger & enable system error L4 mdp recovery.
21 * 8: trigger & enable system error full recovery.
22 * 9: trigger firmware crash.
23+ * 10: trigger grab wa firmware coredump.
24+ * 11: trigger grab wm firmware coredump.
25 */
26 case UNI_CMD_SER_QUERY:
27 ret = mt7996_mcu_set_ser(dev, UNI_CMD_SER_QUERY, 0, band);
28@@ -105,15 +107,25 @@ mt7996_sys_recovery_set(struct file *file, const char __user *user_buf,
29 /* enable full chip reset */
30 case UNI_CMD_SER_SET_RECOVER_FULL:
31 mt76_set(dev, MT_WFDMA0_MCU_HOST_INT_ENA, MT_MCU_CMD_WDT_MASK);
32- dev->recovery.state |= MT_MCU_CMD_WDT_MASK;
33+ dev->recovery.state |= MT_MCU_CMD_WM_WDT;
34 mt7996_reset(dev);
35 break;
36
37 /* WARNING: trigger firmware crash */
38 case UNI_CMD_SER_SET_SYSTEM_ASSERT:
39+ // trigger wm assert exception
40 ret = mt7996_mcu_trigger_assert(dev);
41 if (ret)
42 return ret;
43+ // trigger wa assert exception
44+ mt76_wr(dev, 0x89098108, 0x20);
45+ mt76_wr(dev, 0x89098118, 0x20);
46+ break;
47+ case UNI_CMD_SER_FW_COREDUMP_WA:
48+ mt7996_coredump(dev, MT7996_COREDUMP_MANUAL_WA);
49+ break;
50+ case UNI_CMD_SER_FW_COREDUMP_WM:
51+ mt7996_coredump(dev, MT7996_COREDUMP_MANUAL_WM);
52 break;
53 default:
54 break;
55@@ -160,7 +172,10 @@ mt7996_sys_recovery_get(struct file *file, char __user *user_buf,
56 "8: trigger system error full recovery\n");
57 desc += scnprintf(buff + desc, bufsz - desc,
58 "9: trigger firmware crash\n");
59-
60+ desc += scnprintf(buff + desc, bufsz - desc,
61+ "10: trigger grab wa firmware coredump\n");
62+ desc += scnprintf(buff + desc, bufsz - desc,
63+ "11: trigger grab wm firmware coredump\n");
64 /* SER statistics */
65 desc += scnprintf(buff + desc, bufsz - desc,
66 "\nlet's dump firmware SER statistics...\n");
67diff --git a/mt7996/mac.c b/mt7996/mac.c
developer67bb1212024-02-04 16:58:38 +080068index c266dc14..75657786 100644
developer064da3c2023-06-13 15:57:26 +080069--- a/mt7996/mac.c
70+++ b/mt7996/mac.c
developer67bb1212024-02-04 16:58:38 +080071@@ -2084,15 +2084,36 @@ void mt7996_mac_dump_work(struct work_struct *work)
developer064da3c2023-06-13 15:57:26 +080072 struct mt7996_dev *dev;
73
74 dev = container_of(work, struct mt7996_dev, dump_work);
75- if (READ_ONCE(dev->recovery.state) & MT_MCU_CMD_WA_WDT)
76+ if (dev->dump_state == MT7996_COREDUMP_MANUAL_WA ||
77+ READ_ONCE(dev->recovery.state) & MT_MCU_CMD_WA_WDT)
78 mt7996_mac_fw_coredump(dev, MT7996_RAM_TYPE_WA);
79
80- if (READ_ONCE(dev->recovery.state) & MT_MCU_CMD_WM_WDT)
81+ if (dev->dump_state == MT7996_COREDUMP_MANUAL_WM ||
82+ READ_ONCE(dev->recovery.state) & MT_MCU_CMD_WM_WDT)
83 mt7996_mac_fw_coredump(dev, MT7996_RAM_TYPE_WM);
84
85- queue_work(dev->mt76.wq, &dev->reset_work);
86+ if (READ_ONCE(dev->recovery.state) & MT_MCU_CMD_WDT_MASK)
87+ queue_work(dev->mt76.wq, &dev->reset_work);
88+
89+ dev->dump_state = MT7996_COREDUMP_IDLE;
90 }
91
92+void mt7996_coredump(struct mt7996_dev *dev, u8 state)
93+{
94+ if (state == MT7996_COREDUMP_IDLE ||
95+ state >= __MT7996_COREDUMP_TYPE_MAX)
96+ return;
97+
98+ if (dev->dump_state != MT7996_COREDUMP_IDLE)
99+ return;
100+
101+ dev->dump_state = state;
102+ dev_info(dev->mt76.dev, "%s attempting grab coredump\n",
103+ wiphy_name(dev->mt76.hw->wiphy));
104+
105+ queue_work(dev->mt76.wq, &dev->dump_work);
106+ }
107+
108 void mt7996_reset(struct mt7996_dev *dev)
109 {
developerc2cfe0f2023-09-22 04:11:09 +0800110 if (!dev->recovery.hw_init_done)
developer67bb1212024-02-04 16:58:38 +0800111@@ -2110,6 +2131,7 @@ void mt7996_reset(struct mt7996_dev *dev)
developer064da3c2023-06-13 15:57:26 +0800112
113 mt7996_irq_disable(dev, MT_INT_MCU_CMD);
114 queue_work(dev->mt76.wq, &dev->dump_work);
115+ mt7996_coredump(dev, MT7996_COREDUMP_AUTO);
116 return;
117 }
118
119diff --git a/mt7996/mcu.h b/mt7996/mcu.h
developer5f4e6c32023-12-20 06:12:53 +0800120index 68bf82fc..35f757dc 100644
developer064da3c2023-06-13 15:57:26 +0800121--- a/mt7996/mcu.h
122+++ b/mt7996/mcu.h
developer5f4e6c32023-12-20 06:12:53 +0800123@@ -956,7 +956,11 @@ enum {
developer064da3c2023-06-13 15:57:26 +0800124 UNI_CMD_SER_SET_RECOVER_L3_BF,
125 UNI_CMD_SER_SET_RECOVER_L4_MDP,
126 UNI_CMD_SER_SET_RECOVER_FULL,
127+ /* fw assert */
128 UNI_CMD_SER_SET_SYSTEM_ASSERT,
129+ /* coredump */
130+ UNI_CMD_SER_FW_COREDUMP_WA,
131+ UNI_CMD_SER_FW_COREDUMP_WM,
132 /* action */
133 UNI_CMD_SER_ENABLE = 1,
134 UNI_CMD_SER_SET,
135diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
developer5f4e6c32023-12-20 06:12:53 +0800136index 09ce3c35..dd9aa9e2 100644
developer064da3c2023-06-13 15:57:26 +0800137--- a/mt7996/mt7996.h
138+++ b/mt7996/mt7996.h
developer5f4e6c32023-12-20 06:12:53 +0800139@@ -139,6 +139,14 @@ enum mt7996_ram_type {
developer064da3c2023-06-13 15:57:26 +0800140 __MT7996_RAM_TYPE_MAX,
141 };
142
143+enum mt7996_coredump_state {
144+ MT7996_COREDUMP_IDLE = 0,
145+ MT7996_COREDUMP_MANUAL_WA,
146+ MT7996_COREDUMP_MANUAL_WM,
147+ MT7996_COREDUMP_AUTO,
148+ __MT7996_COREDUMP_TYPE_MAX,
149+};
150+
151 enum mt7996_txq_id {
152 MT7996_TXQ_FWDL = 16,
153 MT7996_TXQ_MCU_WM,
developer5f4e6c32023-12-20 06:12:53 +0800154@@ -388,6 +396,7 @@ struct mt7996_dev {
developer064da3c2023-06-13 15:57:26 +0800155
156 /* protects coredump data */
157 struct mutex dump_mutex;
158+ u8 dump_state;
159 #ifdef CONFIG_DEV_COREDUMP
160 struct {
161 struct mt7996_crash_data *crash_data[__MT7996_RAM_TYPE_MAX];
developer5f4e6c32023-12-20 06:12:53 +0800162@@ -573,6 +582,7 @@ void mt7996_init_txpower(struct mt7996_phy *phy);
developer064da3c2023-06-13 15:57:26 +0800163 int mt7996_txbf_init(struct mt7996_dev *dev);
developer5f4e6c32023-12-20 06:12:53 +0800164 int mt7996_get_chip_sku(struct mt7996_dev *dev);
developer064da3c2023-06-13 15:57:26 +0800165 void mt7996_reset(struct mt7996_dev *dev);
166+void mt7996_coredump(struct mt7996_dev *dev, u8 state);
167 int mt7996_run(struct ieee80211_hw *hw);
168 int mt7996_mcu_init(struct mt7996_dev *dev);
169 int mt7996_mcu_init_firmware(struct mt7996_dev *dev);
170--
developer7e2761e2023-10-12 08:11:13 +08001712.18.0
developer064da3c2023-06-13 15:57:26 +0800172