blob: 253ed632ea383cfab59894b76a62d31358a41732 [file] [log] [blame]
developerbbd45e12023-05-19 08:22:06 +08001From 2692ebd0cb63c666eb7e8db099e71f5b67fcd323 Mon Sep 17 00:00:00 2001
2From: Evelyn Tsai <evelyn.tsai@mediatek.com>
3Date: Thu, 18 May 2023 18:11:37 +0800
4Subject: [PATCH 5/6] wifi: mt76: fix incorrect HE TX GI report
developer1557f6c2023-04-13 18:48:23 +08005
6Change GI reporting source from static capability to rate-tuning module.
7
8Signed-off-by: Benjamin Lin <benjamin-jw.lin@mediatek.com>
9---
10 mt76.h | 4 ++
11 mt7915/init.c | 4 ++
developer22eedcc2023-05-03 22:59:35 +080012 mt7915/mac.c | 60 ++++++++++++------
13 mt7915/main.c | 7 +++
14 mt7915/mcu.c | 161 ++++++++++++++++++++++++++++++++++++++++++++++++
15 mt7915/mcu.h | 58 +++++++++++++++++
developer663dccd2023-04-28 11:35:16 +080016 mt7915/mt7915.h | 6 ++
developer22eedcc2023-05-03 22:59:35 +080017 7 files changed, 280 insertions(+), 20 deletions(-)
developer1557f6c2023-04-13 18:48:23 +080018
19diff --git a/mt76.h b/mt76.h
developerbbd45e12023-05-19 08:22:06 +080020index 8b4635e..3f13cec 100644
developer1557f6c2023-04-13 18:48:23 +080021--- a/mt76.h
22+++ b/mt76.h
23@@ -254,12 +254,16 @@ struct mt76_queue_ops {
24 void (*reset_q)(struct mt76_dev *dev, struct mt76_queue *q);
25 };
26
27+#define MT_PHY_TYPE_LEGACY GENMASK(2, 0)
28+#define MT_PHY_TYPE_EXT GENMASK(7, 3)
29+
30 enum mt76_phy_type {
31 MT_PHY_TYPE_CCK,
32 MT_PHY_TYPE_OFDM,
33 MT_PHY_TYPE_HT,
34 MT_PHY_TYPE_HT_GF,
35 MT_PHY_TYPE_VHT,
36+ MT_PHY_TYPE_HE_REMAP,
37 MT_PHY_TYPE_HE_SU = 8,
38 MT_PHY_TYPE_HE_EXT_SU,
39 MT_PHY_TYPE_HE_TB,
40diff --git a/mt7915/init.c b/mt7915/init.c
developerbbd45e12023-05-19 08:22:06 +080041index f85f7d3..abca909 100644
developer1557f6c2023-04-13 18:48:23 +080042--- a/mt7915/init.c
43+++ b/mt7915/init.c
developerbbd45e12023-05-19 08:22:06 +080044@@ -648,6 +648,8 @@ mt7915_register_ext_phy(struct mt7915_dev *dev, struct mt7915_phy *phy)
developer1557f6c2023-04-13 18:48:23 +080045 struct mt76_phy *mphy = phy->mt76;
46 int ret;
47
48+ INIT_LIST_HEAD(&phy->stats_list);
49+ spin_lock_init(&phy->stats_lock);
50 INIT_DELAYED_WORK(&mphy->mac_work, mt7915_mac_work);
51
52 mt7915_eeprom_parse_hw_cap(dev, phy);
developerbbd45e12023-05-19 08:22:06 +080053@@ -1180,6 +1182,8 @@ int mt7915_register_device(struct mt7915_dev *dev)
developer1557f6c2023-04-13 18:48:23 +080054 dev->phy.dev = dev;
55 dev->phy.mt76 = &dev->mt76.phy;
56 dev->mt76.phy.priv = &dev->phy;
57+ INIT_LIST_HEAD(&dev->phy.stats_list);
58+ spin_lock_init(&dev->phy.stats_lock);
59 INIT_WORK(&dev->rc_work, mt7915_mac_sta_rc_work);
60 INIT_DELAYED_WORK(&dev->mphy.mac_work, mt7915_mac_work);
61 INIT_LIST_HEAD(&dev->sta_rc_list);
62diff --git a/mt7915/mac.c b/mt7915/mac.c
developerbbd45e12023-05-19 08:22:06 +080063index 7be1e17..a3ed4dd 100644
developer1557f6c2023-04-13 18:48:23 +080064--- a/mt7915/mac.c
65+++ b/mt7915/mac.c
developerbbd45e12023-05-19 08:22:06 +080066@@ -173,15 +173,7 @@ static void mt7915_mac_sta_poll(struct mt7915_dev *dev)
developer1557f6c2023-04-13 18:48:23 +080067 rx_cur);
68 }
69
70- /*
71- * We don't support reading GI info from txs packets.
72- * For accurate tx status reporting and AQL improvement,
73- * we need to make sure that flags match so polling GI
74- * from per-sta counters directly.
75- */
76 rate = &msta->wcid.rate;
77- addr = mt7915_mac_wtbl_lmac_addr(dev, idx, 7);
78- val = mt76_rr(dev, addr);
79
80 switch (rate->bw) {
81 case RATE_INFO_BW_160:
developerbbd45e12023-05-19 08:22:06 +080082@@ -198,18 +190,6 @@ static void mt7915_mac_sta_poll(struct mt7915_dev *dev)
developer1557f6c2023-04-13 18:48:23 +080083 break;
84 }
85
86- if (rate->flags & RATE_INFO_FLAGS_HE_MCS) {
87- u8 offs = 24 + 2 * bw;
88-
89- rate->he_gi = (val & (0x3 << offs)) >> offs;
90- } else if (rate->flags &
91- (RATE_INFO_FLAGS_VHT_MCS | RATE_INFO_FLAGS_MCS)) {
92- if (val & BIT(12 + bw))
93- rate->flags |= RATE_INFO_FLAGS_SHORT_GI;
94- else
95- rate->flags &= ~RATE_INFO_FLAGS_SHORT_GI;
96- }
97-
98 /* get signal strength of resp frames (CTS/BA/ACK) */
99 addr = mt7915_mac_wtbl_lmac_addr(dev, idx, 30);
100 val = mt76_rr(dev, addr);
developerbbd45e12023-05-19 08:22:06 +0800101@@ -978,6 +958,7 @@ mt7915_mac_tx_free(struct mt7915_dev *dev, void *data, int len)
developer1557f6c2023-04-13 18:48:23 +0800102 if (info & MT_TX_FREE_PAIR) {
103 struct mt7915_sta *msta;
104 struct mt76_wcid *wcid;
105+ struct mt7915_phy *phy;
106 u16 idx;
107
108 idx = FIELD_GET(MT_TX_FREE_WLAN_ID, info);
developerbbd45e12023-05-19 08:22:06 +0800109@@ -987,10 +968,17 @@ mt7915_mac_tx_free(struct mt7915_dev *dev, void *data, int len)
developer1557f6c2023-04-13 18:48:23 +0800110 continue;
111
112 msta = container_of(wcid, struct mt7915_sta, wcid);
113+ phy = msta->vif->phy;
114 spin_lock_bh(&dev->sta_poll_lock);
115 if (list_empty(&msta->poll_list))
116 list_add_tail(&msta->poll_list, &dev->sta_poll_list);
117 spin_unlock_bh(&dev->sta_poll_lock);
118+
119+ spin_lock_bh(&phy->stats_lock);
120+ if (list_empty(&msta->stats_list))
121+ list_add_tail(&msta->stats_list, &phy->stats_list);
122+ spin_unlock_bh(&phy->stats_lock);
123+
124 continue;
125 }
126
developerbbd45e12023-05-19 08:22:06 +0800127@@ -1051,6 +1039,7 @@ mt7915_mac_tx_free_v0(struct mt7915_dev *dev, void *data, int len)
developer663dccd2023-04-28 11:35:16 +0800128 static void mt7915_mac_add_txs(struct mt7915_dev *dev, void *data)
129 {
130 struct mt7915_sta *msta = NULL;
131+ struct mt7915_phy *phy;
132 struct mt76_wcid *wcid;
133 __le32 *txs_data = data;
134 u16 wcidx;
developerbbd45e12023-05-19 08:22:06 +0800135@@ -1086,6 +1075,11 @@ static void mt7915_mac_add_txs(struct mt7915_dev *dev, void *data)
developer663dccd2023-04-28 11:35:16 +0800136 list_add_tail(&msta->poll_list, &dev->sta_poll_list);
137 spin_unlock_bh(&dev->sta_poll_lock);
138
139+ phy = msta->vif->phy;
140+ spin_lock_bh(&phy->stats_lock);
141+ if (list_empty(&msta->stats_list))
142+ list_add_tail(&msta->stats_list, &phy->stats_list);
143+ spin_unlock_bh(&phy->stats_lock);
144 out:
145 rcu_read_unlock();
146 }
developerbbd45e12023-05-19 08:22:06 +0800147@@ -2012,6 +2006,27 @@ static void mt7915_mac_severe_check(struct mt7915_phy *phy)
developer1557f6c2023-04-13 18:48:23 +0800148 phy->trb_ts = trb;
149 }
150
151+static void mt7915_mac_sta_stats_work(struct mt7915_phy *phy)
152+{
153+ struct mt7915_sta *sta;
154+ LIST_HEAD(list);
155+
156+ spin_lock_bh(&phy->stats_lock);
157+ list_splice_init(&phy->stats_list, &list);
158+
159+ while (!list_empty(&list)) {
160+ sta = list_first_entry(&list, struct mt7915_sta, stats_list);
161+ list_del_init(&sta->stats_list);
162+ spin_unlock_bh(&phy->stats_lock);
163+
164+ mt7915_mcu_get_tx_rate(phy, sta->wcid.idx);
165+
166+ spin_lock_bh(&phy->stats_lock);
167+ }
168+
169+ spin_unlock_bh(&phy->stats_lock);
170+}
171+
172 void mt7915_mac_sta_rc_work(struct work_struct *work)
173 {
174 struct mt7915_dev *dev = container_of(work, struct mt7915_dev, rc_work);
developerbbd45e12023-05-19 08:22:06 +0800175@@ -2067,6 +2082,11 @@ void mt7915_mac_work(struct work_struct *work)
developer1557f6c2023-04-13 18:48:23 +0800176 mt7915_mac_severe_check(phy);
177 }
178
179+ if (++phy->stats_work_count == 10) {
180+ phy->stats_work_count = 0;
181+ mt7915_mac_sta_stats_work(phy);
182+ }
183+
184 mutex_unlock(&mphy->dev->mutex);
185
186 mt76_tx_status_check(mphy->dev, false);
187diff --git a/mt7915/main.c b/mt7915/main.c
developerbbd45e12023-05-19 08:22:06 +0800188index 14930f5..1a741b8 100644
developer1557f6c2023-04-13 18:48:23 +0800189--- a/mt7915/main.c
190+++ b/mt7915/main.c
developerbbd45e12023-05-19 08:22:06 +0800191@@ -682,6 +682,7 @@ int mt7915_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
developer1557f6c2023-04-13 18:48:23 +0800192
193 INIT_LIST_HEAD(&msta->rc_list);
194 INIT_LIST_HEAD(&msta->poll_list);
195+ INIT_LIST_HEAD(&msta->stats_list);
196 msta->vif = mvif;
197 msta->wcid.sta = 1;
198 msta->wcid.idx = idx;
developerbbd45e12023-05-19 08:22:06 +0800199@@ -706,6 +707,7 @@ void mt7915_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,
developer1557f6c2023-04-13 18:48:23 +0800200 {
201 struct mt7915_dev *dev = container_of(mdev, struct mt7915_dev, mt76);
202 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
203+ struct mt7915_phy *phy = msta->vif->phy;
204 int i;
205
206 mt7915_mcu_add_sta(dev, vif, sta, false);
developerbbd45e12023-05-19 08:22:06 +0800207@@ -722,6 +724,11 @@ void mt7915_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,
developer1557f6c2023-04-13 18:48:23 +0800208 if (!list_empty(&msta->rc_list))
209 list_del_init(&msta->rc_list);
210 spin_unlock_bh(&dev->sta_poll_lock);
211+
212+ spin_lock_bh(&phy->stats_lock);
213+ if (!list_empty(&msta->stats_list))
214+ list_del_init(&msta->stats_list);
215+ spin_unlock_bh(&phy->stats_lock);
216 }
217
218 static void mt7915_tx(struct ieee80211_hw *hw,
219diff --git a/mt7915/mcu.c b/mt7915/mcu.c
developerbbd45e12023-05-19 08:22:06 +0800220index d374465..8d8a203 100644
developer1557f6c2023-04-13 18:48:23 +0800221--- a/mt7915/mcu.c
222+++ b/mt7915/mcu.c
developerbbd45e12023-05-19 08:22:06 +0800223@@ -3672,6 +3672,167 @@ out:
developer1557f6c2023-04-13 18:48:23 +0800224 return ret;
225 }
226
227+static int
developer663dccd2023-04-28 11:35:16 +0800228+mt7915_mcu_parse_tx_gi(struct mt76_dev *dev, u8 mode, u8 gi, u8 bw,
229+ struct rate_info *rate)
developer1557f6c2023-04-13 18:48:23 +0800230+{
developer1557f6c2023-04-13 18:48:23 +0800231+ /* Legacy drivers only use 3 bits for PHY mode. For backward
232+ * compatibility, HE and newer PHY mode indices are remapped
233+ * to the extended bits.
234+ */
235+ if (u8_get_bits(mode, MT_PHY_TYPE_LEGACY) == MT_PHY_TYPE_HE_REMAP)
236+ mode = u8_get_bits(mode, MT_PHY_TYPE_EXT);
237+
238+ switch (mode) {
239+ case MT_PHY_TYPE_CCK:
240+ case MT_PHY_TYPE_OFDM:
241+ break;
242+ case MT_PHY_TYPE_HT:
243+ case MT_PHY_TYPE_HT_GF:
244+ case MT_PHY_TYPE_VHT:
245+ if (gi)
246+ rate->flags |= RATE_INFO_FLAGS_SHORT_GI;
247+ break;
248+ case MT_PHY_TYPE_HE_SU:
249+ case MT_PHY_TYPE_HE_EXT_SU:
250+ case MT_PHY_TYPE_HE_TB:
251+ case MT_PHY_TYPE_HE_MU:
developer663dccd2023-04-28 11:35:16 +0800252+ if (!is_mt7915(dev)) {
253+ switch (bw) {
254+ case MCU_PHY_BW_20:
255+ gi = u8_get_bits(gi, HE_GI_BW_20);
256+ break;
257+ case MCU_PHY_BW_40:
258+ gi = u8_get_bits(gi, HE_GI_BW_40);
259+ break;
260+ case MCU_PHY_BW_80:
261+ gi = u8_get_bits(gi, HE_GI_BW_80);
262+ break;
263+ case MCU_PHY_BW_160:
264+ gi = u8_get_bits(gi, HE_GI_BW_160);
265+ break;
266+ default:
267+ return -EINVAL;
268+ }
developer1557f6c2023-04-13 18:48:23 +0800269+ }
270+
271+ if (gi > NL80211_RATE_INFO_HE_GI_3_2)
272+ return -EINVAL;
273+
274+ rate->he_gi = gi;
275+ break;
276+ default:
277+ return -EINVAL;
278+ }
279+
280+ return 0;
281+}
282+
developer663dccd2023-04-28 11:35:16 +0800283+int mt7915_mcu_get_tx_rate_v1(struct mt7915_phy *phy, u16 wcidx)
developer1557f6c2023-04-13 18:48:23 +0800284+{
developer663dccd2023-04-28 11:35:16 +0800285+ struct mt7915_mcu_ra_info_v1 *rate;
developer1557f6c2023-04-13 18:48:23 +0800286+ struct mt7915_dev *dev = phy->dev;
287+ struct mt76_phy *mphy = phy->mt76;
developer1557f6c2023-04-13 18:48:23 +0800288+ struct mt76_wcid *wcid;
289+ struct sk_buff *skb;
290+ int ret;
291+
292+ struct {
developer663dccd2023-04-28 11:35:16 +0800293+ __le32 category;
294+ u8 wcidx_lo;
295+ u8 band;
296+ u8 wcidx_hi;
297+ u8 rsv[5];
298+ } req = {
299+ .category = cpu_to_le32(MCU_GET_TX_RATE),
300+ .wcidx_lo = to_wcid_lo(wcidx),
301+ .band = mphy->band_idx,
302+ .wcidx_hi = to_wcid_hi(wcidx)
303+ };
304+
305+ ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_QUERY(GET_TX_STAT),
306+ &req, sizeof(req), true, &skb);
307+ if (ret)
308+ return ret;
309+
310+ rate = (struct mt7915_mcu_ra_info_v1 *)skb->data;
311+ if ((rate->wcidx_hi << 8 | rate->wcidx_lo) != wcidx) {
312+ ret = -EINVAL;
313+ goto out;
314+ }
315+
316+ rcu_read_lock();
317+ wcid = rcu_dereference(dev->mt76.wcid[wcidx]);
318+ if (!wcid) {
319+ ret = -EINVAL;
320+ goto unlock;
321+ }
322+
323+ ret = mt7915_mcu_parse_tx_gi(mphy->dev, rate->mode, rate->gi,
324+ rate->bw, &wcid->rate);
developer663dccd2023-04-28 11:35:16 +0800325+unlock:
326+ rcu_read_unlock();
327+out:
328+ dev_kfree_skb(skb);
329+
330+ return ret;
331+}
332+
333+int mt7915_mcu_get_tx_rate_v2(struct mt7915_phy *phy, u16 wcidx)
334+{
developer663dccd2023-04-28 11:35:16 +0800335+ struct mt7915_mcu_ra_info_v2 *rate;
336+ struct mt7915_dev *dev = phy->dev;
337+ struct mt76_phy *mphy = phy->mt76;
338+ struct mt76_wcid *wcid;
339+ struct sk_buff *skb;
340+ int ret;
341+
342+ struct {
developer1557f6c2023-04-13 18:48:23 +0800343+ u8 category;
344+ u8 band;
345+ __le16 wcidx;
346+ } req = {
347+ .category = MCU_GET_TX_RATE,
348+ .band = mphy->band_idx,
349+ .wcidx = cpu_to_le16(wcidx)
350+ };
351+
352+ ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_QUERY(GET_TX_STAT),
353+ &req, sizeof(req), true, &skb);
354+ if (ret)
355+ return ret;
356+
developer663dccd2023-04-28 11:35:16 +0800357+ rate = (struct mt7915_mcu_ra_info_v2 *)skb->data;
developer1557f6c2023-04-13 18:48:23 +0800358+ if (le16_to_cpu(rate->wcidx) != wcidx) {
359+ ret = -EINVAL;
360+ goto out;
361+ }
362+
363+ rcu_read_lock();
364+ wcid = rcu_dereference(dev->mt76.wcid[wcidx]);
365+ if (!wcid) {
366+ ret = -EINVAL;
367+ goto unlock;
368+ }
369+
developer663dccd2023-04-28 11:35:16 +0800370+ ret = mt7915_mcu_parse_tx_gi(mphy->dev, rate->mode, rate->gi,
371+ rate->bw, &wcid->rate);
developer1557f6c2023-04-13 18:48:23 +0800372+unlock:
373+ rcu_read_unlock();
374+out:
375+ dev_kfree_skb(skb);
376+
377+ return ret;
378+}
379+
developer663dccd2023-04-28 11:35:16 +0800380+int mt7915_mcu_get_tx_rate(struct mt7915_phy *phy, u16 wcidx)
381+{
382+ if (is_mt7915(&phy->dev->mt76))
383+ return mt7915_mcu_get_tx_rate_v1(phy, wcidx);
384+ else
385+ return mt7915_mcu_get_tx_rate_v2(phy, wcidx);
386+}
387+
developer1557f6c2023-04-13 18:48:23 +0800388 int mt7915_mcu_update_bss_color(struct mt7915_dev *dev, struct ieee80211_vif *vif,
389 struct cfg80211_he_bss_color *he_bss_color)
390 {
391diff --git a/mt7915/mcu.h b/mt7915/mcu.h
developerbbd45e12023-05-19 08:22:06 +0800392index 1592b5d..aebacc7 100644
developer1557f6c2023-04-13 18:48:23 +0800393--- a/mt7915/mcu.h
394+++ b/mt7915/mcu.h
developer663dccd2023-04-28 11:35:16 +0800395@@ -152,6 +152,61 @@ struct mt7915_mcu_eeprom_info {
developer1557f6c2023-04-13 18:48:23 +0800396 u8 data[16];
397 } __packed;
398
399+enum {
400+ MCU_PHY_BW_20 = 0,
401+ MCU_PHY_BW_40,
402+ MCU_PHY_BW_80,
403+ MCU_PHY_BW_160,
404+ MCU_PHY_BW_10,
405+ MCU_PHY_BW_5,
406+ MCU_PHY_BW_8080,
407+ MCU_PHY_BW_320,
408+ MCU_PHY_BW_NUM
409+};
410+
411+#define HE_GI_BW_20 GENMASK(1, 0)
412+#define HE_GI_BW_40 GENMASK(3, 2)
413+#define HE_GI_BW_80 GENMASK(5, 4)
414+#define HE_GI_BW_160 GENMASK(7, 6)
415+
developer663dccd2023-04-28 11:35:16 +0800416+struct mt7915_mcu_ra_info_v1 {
417+ u8 wcidx_lo;
418+ u8 band;
419+ u8 wcidx_hi;
420+ u8 rsv1[46];
421+
422+ u8 mode;
423+ u8 flags;
424+ u8 stbc;
425+ u8 gi;
426+ u8 bw;
427+ u8 ldpc;
428+ u8 mcs;
429+ u8 nss;
430+ u8 ltf;
431+
432+ u8 rsv2[8];
433+};
434+
435+struct mt7915_mcu_ra_info_v2 {
developer1557f6c2023-04-13 18:48:23 +0800436+ u8 category;
437+ u8 rsv1;
438+ __le16 num;
439+ __le16 wcidx;
440+
441+ u8 mode;
442+ u8 flags;
443+ u8 stbc;
444+ u8 gi;
445+ u8 bw;
446+ u8 ldpc;
447+ u8 mcs;
448+ u8 nss;
449+ u8 ltf;
450+
451+ u8 rsv2;
452+};
453+
454 struct mt7915_mcu_phy_rx_info {
455 u8 category;
456 u8 rate;
developer663dccd2023-04-28 11:35:16 +0800457@@ -527,4 +582,7 @@ mt7915_get_power_bound(struct mt7915_phy *phy, s8 txpower)
developer1557f6c2023-04-13 18:48:23 +0800458 return txpower;
459 }
460
461+enum {
462+ MCU_GET_TX_RATE = 4
463+};
464 #endif
465diff --git a/mt7915/mt7915.h b/mt7915/mt7915.h
developerbbd45e12023-05-19 08:22:06 +0800466index d1715ff..5451024 100644
developer1557f6c2023-04-13 18:48:23 +0800467--- a/mt7915/mt7915.h
468+++ b/mt7915/mt7915.h
developerbbd45e12023-05-19 08:22:06 +0800469@@ -138,6 +138,7 @@ struct mt7915_sta {
developer1557f6c2023-04-13 18:48:23 +0800470
471 struct list_head poll_list;
472 struct list_head rc_list;
473+ struct list_head stats_list;
474 u32 airtime_ac[8];
475
476 int ack_signal;
developerbbd45e12023-05-19 08:22:06 +0800477@@ -273,6 +274,10 @@ struct mt7915_phy {
developer1557f6c2023-04-13 18:48:23 +0800478 struct mib_stats mib;
479 struct mt76_channel_state state_ts;
480
481+ u8 stats_work_count;
482+ struct list_head stats_list;
483+ spinlock_t stats_lock;
484+
485 #ifdef CONFIG_NL80211_TESTMODE
486 struct {
487 u32 *reg_backup;
developerbbd45e12023-05-19 08:22:06 +0800488@@ -544,6 +549,7 @@ int mt7915_mcu_get_chan_mib_info(struct mt7915_phy *phy, bool chan_switch);
developer1557f6c2023-04-13 18:48:23 +0800489 int mt7915_mcu_get_temperature(struct mt7915_phy *phy);
490 int mt7915_mcu_set_thermal_throttling(struct mt7915_phy *phy, u8 state);
491 int mt7915_mcu_set_thermal_protect(struct mt7915_phy *phy);
492+int mt7915_mcu_get_tx_rate(struct mt7915_phy *phy, u16 wcidx);
493 int mt7915_mcu_get_rx_rate(struct mt7915_phy *phy, struct ieee80211_vif *vif,
494 struct ieee80211_sta *sta, struct rate_info *rate);
495 int mt7915_mcu_rdd_background_enable(struct mt7915_phy *phy,
496--
4972.18.0
498