blob: 57dba95abb700542cbffbc9b98763de90ea5757d [file] [log] [blame]
developera20cdc22024-05-31 18:57:31 +08001From 358136dd0d94d84efda5c04e7b392111adcb2895 Mon Sep 17 00:00:00 2001
developer47efbdb2023-06-29 20:33:22 +08002From: Peter Chiu <chui-hao.chiu@mediatek.com>
3Date: Wed, 11 Jan 2023 10:56:27 +0800
developera20cdc22024-05-31 18:57:31 +08004Subject: [PATCH 2006/2015] wifi: mt76: add debugfs knob to show packet error
developera46f6132024-03-26 14:09:54 +08005 rate
developer47efbdb2023-06-29 20:33:22 +08006
7Get tx count and tx failed from mcu command
8---
9 mt76.h | 2 +
10 mt76_connac_mcu.h | 1 +
11 mt7915/mcu.c | 108 +++++++++++++++++++++++++++++++++++++++++++
12 mt7915/mcu.h | 21 ++++++++-
13 mt7915/mt7915.h | 1 +
14 mt7915/mtk_debugfs.c | 62 +++++++++++++++++++++++++
15 6 files changed, 194 insertions(+), 1 deletion(-)
16
17diff --git a/mt76.h b/mt76.h
developera20cdc22024-05-31 18:57:31 +080018index 5e71267..0ab1d74 100644
developer47efbdb2023-06-29 20:33:22 +080019--- a/mt76.h
20+++ b/mt76.h
developer753619c2024-02-22 13:42:45 +080021@@ -321,8 +321,10 @@ struct mt76_sta_stats {
developer1a173672023-12-21 14:49:33 +080022 u64 last_tx_bytes;
developer47efbdb2023-06-29 20:33:22 +080023 /* WED TX */
24 u32 tx_packets; /* unit: MSDU */
25+ u32 tx_mpdu_cnt;
26 u32 tx_retries;
27 u32 tx_failed;
28+ u32 tx_failed_wm;
29 /* WED RX */
30 u64 rx_bytes;
31 u32 rx_packets;
32diff --git a/mt76_connac_mcu.h b/mt76_connac_mcu.h
developera20cdc22024-05-31 18:57:31 +080033index 3786e69..91294a8 100644
developer47efbdb2023-06-29 20:33:22 +080034--- a/mt76_connac_mcu.h
35+++ b/mt76_connac_mcu.h
developerdc9eeae2024-04-08 14:36:46 +080036@@ -1207,6 +1207,7 @@ enum {
developer47efbdb2023-06-29 20:33:22 +080037 MCU_EXT_CMD_EDCA_UPDATE = 0x27,
38 MCU_EXT_CMD_DEV_INFO_UPDATE = 0x2A,
39 MCU_EXT_CMD_THERMAL_CTRL = 0x2c,
40+ MCU_EXT_CMD_GET_TX_STAT = 0x30,
41 MCU_EXT_CMD_WTBL_UPDATE = 0x32,
42 MCU_EXT_CMD_SET_DRR_CTRL = 0x36,
43 MCU_EXT_CMD_SET_FEATURE_CTRL = 0x38,
44diff --git a/mt7915/mcu.c b/mt7915/mcu.c
developera20cdc22024-05-31 18:57:31 +080045index e6e3152..8a07360 100644
developer47efbdb2023-06-29 20:33:22 +080046--- a/mt7915/mcu.c
47+++ b/mt7915/mcu.c
developerdc9eeae2024-04-08 14:36:46 +080048@@ -4565,6 +4565,114 @@ int mt7915_mcu_get_tx_rate(struct mt7915_phy *phy, u16 wcidx)
developer47efbdb2023-06-29 20:33:22 +080049 return mt7915_mcu_get_tx_rate_v2(phy, wcidx);
50 }
51
52+static int mt7915_mcu_get_tx_stat_v1(struct mt7915_phy *phy,
53+ u16 wlan_idx)
54+{
55+#define to_wcid(hi, lo) (hi << 8 | lo)
56+ struct mt7915_dev *dev = phy->dev;
57+ struct mt76_phy *mphy = phy->mt76;
58+ struct mt7915_mcu_tx_stat_v1 *res;
59+ struct mt76_wcid *wcid;
60+ struct sk_buff *skb;
61+ struct {
62+ __le32 category;
63+ u8 wlan_idx_lo;
64+ u8 band;
65+ u8 wlan_idx_hi;
66+ u8 __rsv[5];
67+ } __packed req = {
68+ .category = cpu_to_le32(MCU_GET_TX_STAT_CNT),
69+ .band = mphy->band_idx,
70+ .wlan_idx_lo = to_wcid_lo(wlan_idx),
71+ .wlan_idx_hi = to_wcid_hi(wlan_idx),
72+ };
73+ int ret;
74+
75+ ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_QUERY(GET_TX_STAT),
76+ &req, sizeof(req), true, &skb);
77+ if (ret)
78+ return ret;
79+
80+ res = (struct mt7915_mcu_tx_stat_v1 *)skb->data;
81+
82+ if (to_wcid(res->wlan_idx_hi, res->wlan_idx_lo) != wlan_idx) {
83+ ret = -EINVAL;
84+ goto out;
85+ }
86+
87+ rcu_read_lock();
88+
89+ wcid = rcu_dereference(dev->mt76.wcid[wlan_idx]);
90+ if (wcid) {
91+ wcid->stats.tx_mpdu_cnt += le32_to_cpu(res->tx_cnt);
92+ wcid->stats.tx_failed_wm += le32_to_cpu(res->tx_failed);
93+ } else {
94+ ret = -EINVAL;
95+ }
96+
97+ rcu_read_unlock();
98+out:
99+ dev_kfree_skb(skb);
100+
101+ return ret;
102+}
103+
104+static int mt7915_mcu_get_tx_stat_v2(struct mt7915_phy *phy,
105+ u16 wlan_idx)
106+{
107+ struct mt7915_dev *dev = phy->dev;
108+ struct mt76_phy *mphy = phy->mt76;
109+ struct mt7915_mcu_tx_stat_v2 *res;
110+ struct mt76_wcid *wcid;
111+ struct sk_buff *skb;
112+ struct {
113+ u8 category;
114+ u8 band;
115+ __le16 wcid;
116+ } __packed req = {
117+ .category = MCU_GET_TX_STAT_CNT,
118+ .band = mphy->band_idx,
119+ .wcid = cpu_to_le16(wlan_idx),
120+ };
121+ int ret;
122+
123+ ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_QUERY(GET_TX_STAT),
124+ &req, sizeof(req), true, &skb);
125+ if (ret)
126+ return ret;
127+
128+ res = (struct mt7915_mcu_tx_stat_v2 *)skb->data;
129+
130+ if (le16_to_cpu(res->wlan_idx) != wlan_idx) {
131+ ret = -EINVAL;
132+ goto out;
133+ }
134+
135+ rcu_read_lock();
136+
137+ wcid = rcu_dereference(dev->mt76.wcid[wlan_idx]);
138+ if (wcid) {
139+ wcid->stats.tx_mpdu_cnt += le32_to_cpu(res->tx_cnt);
140+ wcid->stats.tx_failed_wm += le32_to_cpu(res->tx_failed);
141+ } else {
142+ ret = -EINVAL;
143+ }
144+
145+ rcu_read_unlock();
146+out:
147+ dev_kfree_skb(skb);
148+
149+ return ret;
150+}
151+
152+int mt7915_get_tx_stat(struct mt7915_phy *phy, u16 wlan_idx)
153+{
154+ if (is_mt7915(&phy->dev->mt76))
155+ return mt7915_mcu_get_tx_stat_v1(phy, wlan_idx);
156+
157+ return mt7915_mcu_get_tx_stat_v2(phy, wlan_idx);
158+}
159+
160 int mt7915_mcu_update_bss_color(struct mt7915_dev *dev, struct ieee80211_vif *vif,
161 struct cfg80211_he_bss_color *he_bss_color)
162 {
163diff --git a/mt7915/mcu.h b/mt7915/mcu.h
developerdc9eeae2024-04-08 14:36:46 +0800164index 52baaa7..ec7ad7d 100644
developer47efbdb2023-06-29 20:33:22 +0800165--- a/mt7915/mcu.h
166+++ b/mt7915/mcu.h
developer753619c2024-02-22 13:42:45 +0800167@@ -854,7 +854,8 @@ mt7915_get_power_bound(struct mt7915_phy *phy, s8 txpower)
developer47efbdb2023-06-29 20:33:22 +0800168 }
169
170 enum {
171- MCU_GET_TX_RATE = 4
172+ MCU_GET_TX_RATE = 4,
173+ MCU_GET_TX_STAT_CNT = 8
174 };
175
176 #ifdef CONFIG_MTK_VENDOR
developer753619c2024-02-22 13:42:45 +0800177@@ -1130,6 +1131,24 @@ struct mt7915_muru {
developer47efbdb2023-06-29 20:33:22 +0800178 /* DL&UL User config */
179 #define MURU_USER_CNT BIT(4)
180
181+struct mt7915_mcu_tx_stat_v1 {
182+ u8 wlan_idx_lo;
183+ u8 band_idx;
184+ u8 wlan_idx_hi;
185+ u8 __rsv1[29];
186+ __le32 tx_cnt;
187+ __le32 tx_failed;
188+ u8 __rsv2[26];
189+};
190+
191+struct mt7915_mcu_tx_stat_v2 {
192+ u8 __rsv1[4];
193+ __le16 wlan_idx;
194+ u8 __rsv2[2];
195+ __le32 tx_cnt;
196+ __le32 tx_failed;
197+};
198+
199 enum {
200 CAPI_SU,
201 CAPI_MU,
202diff --git a/mt7915/mt7915.h b/mt7915/mt7915.h
developera20cdc22024-05-31 18:57:31 +0800203index f5a7e1e..aafdafd 100644
developer47efbdb2023-06-29 20:33:22 +0800204--- a/mt7915/mt7915.h
205+++ b/mt7915/mt7915.h
developera20cdc22024-05-31 18:57:31 +0800206@@ -755,6 +755,7 @@ int mt7915_mcu_get_rx_rate(struct mt7915_phy *phy, struct ieee80211_vif *vif,
developer47efbdb2023-06-29 20:33:22 +0800207 int mt7915_mcu_rdd_background_enable(struct mt7915_phy *phy,
208 struct cfg80211_chan_def *chandef);
209 int mt7915_mcu_wed_wa_tx_stats(struct mt7915_dev *dev, u16 wcid);
210+int mt7915_get_tx_stat(struct mt7915_phy *phy, u16 wlan_idx);
211 int mt7915_mcu_rf_regval(struct mt7915_dev *dev, u32 regidx, u32 *val, bool set);
212 int mt7915_mcu_wa_cmd(struct mt7915_dev *dev, int cmd, u32 a1, u32 a2, u32 a3);
213 int mt7915_mcu_fw_log_2_host(struct mt7915_dev *dev, u8 type, u8 ctrl);
214diff --git a/mt7915/mtk_debugfs.c b/mt7915/mtk_debugfs.c
developera20cdc22024-05-31 18:57:31 +0800215index 14ea5bc..c63bf90 100644
developer47efbdb2023-06-29 20:33:22 +0800216--- a/mt7915/mtk_debugfs.c
217+++ b/mt7915/mtk_debugfs.c
developera46f6132024-03-26 14:09:54 +0800218@@ -4027,6 +4027,66 @@ mt7915_sr_scene_cond_show(struct seq_file *file, void *data)
developer753619c2024-02-22 13:42:45 +0800219
220 DEFINE_SHOW_ATTRIBUTE(mt7915_sr_scene_cond);
developer47efbdb2023-06-29 20:33:22 +0800221
222+static int mt7915_reset_counter(void *data, u64 val)
223+{
224+ struct mt7915_phy *phy = data;
225+ struct mt7915_dev *dev = phy->dev;
226+ struct mt76_wcid *wcid;
227+
228+ /* Clear the firmware counters */
229+ mt7915_mcu_wed_wa_tx_stats(dev, dev->wlan_idx);
230+ mt7915_get_tx_stat(phy, dev->wlan_idx);
231+
232+ rcu_read_lock();
233+ wcid = rcu_dereference(dev->mt76.wcid[dev->wlan_idx]);
234+ if (!wcid)
235+ return -EINVAL;
236+
237+ memset(&wcid->stats, 0, sizeof(struct mt76_sta_stats));
238+
239+ rcu_read_unlock();
240+
241+ return 0;
242+}
243+
244+DEFINE_DEBUGFS_ATTRIBUTE(fops_reset_counter, NULL,
245+ mt7915_reset_counter, "%lld\n");
246+
247+static int
248+mt7915_per_read(struct seq_file *s, void *data)
249+{
250+ struct mt7915_dev *dev = dev_get_drvdata(s->private);
251+ struct mt76_sta_stats *stats;
252+ struct mt76_wcid *wcid;
253+ int ret;
254+ u8 phy_idx;
255+
256+ if (!dev->mt76.wcid[dev->wlan_idx])
257+ return -EINVAL;
258+
259+ phy_idx = dev->mt76.wcid[dev->wlan_idx]->phy_idx;
260+
261+ ret = mt7915_get_tx_stat(dev->mt76.phys[phy_idx]->priv, dev->wlan_idx);
262+ if (ret)
263+ return ret;
264+
265+ rcu_read_lock();
266+ wcid = rcu_dereference(dev->mt76.wcid[dev->wlan_idx]);
267+ if (!wcid)
268+ return -EINVAL;
269+
270+ stats = &wcid->stats;
271+
272+ seq_printf(s, "sta %d, tx_mpdu_cnt = %u, tx_failed = %u, PER = %u.%u%%\n", dev->wlan_idx,
273+ stats->tx_mpdu_cnt, stats->tx_failed_wm,
274+ stats->tx_mpdu_cnt ? stats->tx_failed_wm * 1000 / stats->tx_mpdu_cnt / 10 : 0,
275+ stats->tx_mpdu_cnt ? stats->tx_failed_wm * 1000 / stats->tx_mpdu_cnt % 10 : 0);
276+
277+ rcu_read_unlock();
278+
279+ return 0;
280+}
281+
282 int mt7915_mtk_init_debugfs(struct mt7915_phy *phy, struct dentry *dir)
283 {
284 struct mt7915_dev *dev = phy->dev;
developera46f6132024-03-26 14:09:54 +0800285@@ -4124,6 +4184,8 @@ int mt7915_mtk_init_debugfs(struct mt7915_phy *phy, struct dentry *dir)
developereb155692024-01-11 14:08:37 +0800286 debugfs_create_file("thermal_recal", 0200, dir, dev, &fops_thermal_recal);
developer753619c2024-02-22 13:42:45 +0800287 debugfs_create_file("sr_stats", 0400, dir, phy, &mt7915_sr_stats_fops);
288 debugfs_create_file("sr_scene_cond", 0400, dir, phy, &mt7915_sr_scene_cond_fops);
developerdc9eeae2024-04-08 14:36:46 +0800289+ debugfs_create_file("reset_counter", 0200, dir, phy, &fops_reset_counter);
developer47efbdb2023-06-29 20:33:22 +0800290+ debugfs_create_devm_seqfile(dev->mt76.dev, "per", dir, mt7915_per_read);
developereb155692024-01-11 14:08:37 +0800291
developer47efbdb2023-06-29 20:33:22 +0800292 return 0;
293 }
developer47efbdb2023-06-29 20:33:22 +0800294--
developerbddc9db2023-09-11 13:34:36 +08002952.18.0
developer47efbdb2023-06-29 20:33:22 +0800296