blob: fd4d484cb945a43fb505ba6d611b1422bbc432f4 [file] [log] [blame]
developer29344f12022-10-17 12:01:44 +08001From 1672984d38b180a4e7cd64cc262a7a30cf39a329 Mon Sep 17 00:00:00 2001
developer20126ad2022-09-12 14:42:56 +08002From: Sujuan Chen <sujuan.chen@mediatek.com>
3Date: Sat, 10 Sep 2022 17:09:21 +0800
developer29344f12022-10-17 12:01:44 +08004Subject: [PATCH 3002/3011] mt76: mt7915: add-wed-tx-wds-support-on-mt7986
developer20126ad2022-09-12 14:42:56 +08005
6Signed-off-by: Sujuan Chen <sujuan.chen@mediatek.com>
7---
8 mac80211.c | 5 ++++-
9 mt76.h | 2 ++
10 mt7915/init.c | 9 +++++++++
developercaeb1a02022-10-12 18:25:15 +080011 mt7915/main.c | 45 +++++++++++++++++++++++++++++++++++++++++++--
developer20126ad2022-09-12 14:42:56 +080012 mt7915/mcu.c | 12 ++++++++++--
13 mt7915/mcu.h | 1 +
developer33907d42022-09-19 14:33:58 +080014 mt7915/mmio.c | 3 +++
developer20126ad2022-09-12 14:42:56 +080015 mt7915/mt7915.h | 4 ++++
developercaeb1a02022-10-12 18:25:15 +080016 8 files changed, 76 insertions(+), 5 deletions(-)
developer20126ad2022-09-12 14:42:56 +080017
18diff --git a/mac80211.c b/mac80211.c
developer29344f12022-10-17 12:01:44 +080019index b7c1b13b..1e13b654 100644
developer20126ad2022-09-12 14:42:56 +080020--- a/mac80211.c
21+++ b/mac80211.c
developerf1313102022-10-11 11:02:55 +080022@@ -1364,7 +1364,10 @@ void __mt76_sta_remove(struct mt76_dev *dev, struct ieee80211_vif *vif,
developer20126ad2022-09-12 14:42:56 +080023
24 mt76_packet_id_flush(dev, wcid);
25
26- mt76_wcid_mask_clear(dev->wcid_mask, idx);
developercaeb1a02022-10-12 18:25:15 +080027+ if (dev->drv->wed_wds_check && dev->drv->wed_wds_check(dev, sta))
developer20126ad2022-09-12 14:42:56 +080028+ mt76_wcid_mask_clear(dev->wcid_wds_mask, idx);
29+ else
30+ mt76_wcid_mask_clear(dev->wcid_mask, idx);
31 mt76_wcid_mask_clear(dev->wcid_phy_mask, idx);
32 }
33 EXPORT_SYMBOL_GPL(__mt76_sta_remove);
34diff --git a/mt76.h b/mt76.h
developer29344f12022-10-17 12:01:44 +080035index e547f79e..335f0b10 100644
developer20126ad2022-09-12 14:42:56 +080036--- a/mt76.h
37+++ b/mt76.h
developerf1313102022-10-11 11:02:55 +080038@@ -454,6 +454,7 @@ struct mt76_driver_ops {
developer20126ad2022-09-12 14:42:56 +080039
40 void (*sta_remove)(struct mt76_dev *dev, struct ieee80211_vif *vif,
41 struct ieee80211_sta *sta);
42+ bool (*wed_wds_check)(struct mt76_dev *dev, struct ieee80211_sta *sta);
43 };
44
45 struct mt76_channel_state {
developerf1313102022-10-11 11:02:55 +080046@@ -814,6 +815,7 @@ struct mt76_dev {
developer20126ad2022-09-12 14:42:56 +080047 spinlock_t status_lock;
48
49 u32 wcid_mask[DIV_ROUND_UP(MT76_N_WCIDS, 32)];
50+ u32 wcid_wds_mask[DIV_ROUND_UP(MT76_N_WCIDS, 32)];
51 u32 wcid_phy_mask[DIV_ROUND_UP(MT76_N_WCIDS, 32)];
52
53 u64 vif_mask;
54diff --git a/mt7915/init.c b/mt7915/init.c
developer29344f12022-10-17 12:01:44 +080055index 6833bbf5..8055c6ea 100644
developer20126ad2022-09-12 14:42:56 +080056--- a/mt7915/init.c
57+++ b/mt7915/init.c
58@@ -695,6 +695,15 @@ mt7915_init_hardware(struct mt7915_dev *dev, struct mt7915_phy *phy2)
59 return ret;
60 }
61
62+ /* wds workaround for mt7986 */
63+ if (mtk_wed_device_active(&dev->mt76.mmio.wed) && is_mt7986(&dev->mt76)) {
64+ for(idx = MT7915_WTBL_WDS_START; idx < MT7915_WTBL_WDS_END; idx++)
65+ mt76_wcid_mask_set(dev->mt76.wcid_mask, idx);
66+
67+ for (idx = 0; idx < DIV_ROUND_UP(MT7915_WTBL_STA, 32); idx++)
68+ dev->mt76.wcid_wds_mask[idx] = ~dev->mt76.wcid_mask[idx];
69+ }
70+
71 /* Beacon and mgmt frames should occupy wcid 0 */
72 idx = mt76_wcid_alloc(dev->mt76.wcid_mask, MT7915_WTBL_STA);
73 if (idx)
74diff --git a/mt7915/main.c b/mt7915/main.c
developer29344f12022-10-17 12:01:44 +080075index 4e915279..62b9658b 100644
developer20126ad2022-09-12 14:42:56 +080076--- a/mt7915/main.c
77+++ b/mt7915/main.c
78@@ -658,6 +658,24 @@ mt7915_channel_switch_beacon(struct ieee80211_hw *hw,
79 mutex_unlock(&dev->mt76.mutex);
80 }
81
82+bool
83+mt7915_wed_wds_check(struct mt76_dev *mdev, struct ieee80211_sta *sta)
84+{
85+ struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
86+
87+ if (!mtk_wed_device_active(&mdev->mmio.wed))
88+ return false;
89+
90+ if(!is_mt7986(mdev))
91+ return false;
92+
93+ if((msta->wcid.idx < MT7915_WTBL_WDS_START ||
94+ msta->wcid.idx > MT7915_WTBL_WDS_END))
95+ return false;
96+
97+ return true;
98+}
99+
100 int mt7915_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
101 struct ieee80211_sta *sta)
102 {
103@@ -670,8 +688,18 @@ int mt7915_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
104 #endif
105 int ret, idx;
106 u32 addr;
107+ bool wed_wds = false;
developerf1313102022-10-11 11:02:55 +0800108+
developer20126ad2022-09-12 14:42:56 +0800109+ if (mtk_wed_device_active(&mdev->mmio.wed) && is_mt7986(mdev))
110+ wed_wds = !!test_bit(MT_WCID_FLAG_4ADDR, &msta->wcid.flags);
developerf1313102022-10-11 11:02:55 +0800111
112- idx = mt76_wcid_alloc(dev->mt76.wcid_mask, MT7915_WTBL_STA);
developer20126ad2022-09-12 14:42:56 +0800113+ if (wed_wds)
114+ idx = mt76_wcid_alloc(mdev->wcid_wds_mask, MT7915_WTBL_STA);
115+ else {
116+ idx = mt76_wcid_alloc(mdev->wcid_mask, MT7915_WTBL_STA);
117+ if (idx < 0)
118+ idx = mt76_wcid_alloc(mdev->wcid_wds_mask, MT7915_WTBL_STA);
119+ }
120 if (idx < 0)
121 return -ENOSPC;
122
developercaeb1a02022-10-12 18:25:15 +0800123@@ -1125,6 +1153,15 @@ static void mt7915_sta_set_4addr(struct ieee80211_hw *hw,
developer20126ad2022-09-12 14:42:56 +0800124 else
125 clear_bit(MT_WCID_FLAG_4ADDR, &msta->wcid.flags);
126
127+ if (mtk_wed_device_active(&dev->mt76.mmio.wed) &&
128+ is_mt7986(&dev->mt76) &&
129+ (msta->wcid.idx < MT7915_WTBL_WDS_START ||
130+ msta->wcid.idx > MT7915_WTBL_WDS_END)) {
131+ mt7915_sta_remove(hw, vif, sta);
developercaeb1a02022-10-12 18:25:15 +0800132+ mt76_sta_pre_rcu_remove(hw, vif, sta);
developer20126ad2022-09-12 14:42:56 +0800133+ mt7915_sta_add(hw, vif, sta);
134+ }
135+
136 mt76_connac_mcu_wtbl_update_hdr_trans(&dev->mt76, vif, sta);
137 }
138
developercaeb1a02022-10-12 18:25:15 +0800139@@ -1464,7 +1501,11 @@ mt7915_net_fill_forward_path(struct ieee80211_hw *hw,
developer33907d42022-09-19 14:33:58 +0800140 path->dev = ctx->dev;
141 path->mtk_wdma.wdma_idx = wed->wdma_idx;
142 path->mtk_wdma.bss = mvif->mt76.idx;
developerf1313102022-10-11 11:02:55 +0800143- path->mtk_wdma.wcid = is_mt7915(&dev->mt76) ? 0xff : 0x3ff;
144+
145+ if (test_bit(MT_WCID_FLAG_4ADDR, &msta->wcid.flags))
developer33907d42022-09-19 14:33:58 +0800146+ path->mtk_wdma.wcid = msta->wcid.idx;
developerf1313102022-10-11 11:02:55 +0800147+ else
148+ path->mtk_wdma.wcid = is_mt7915(&dev->mt76) ? 0xff : 0x3ff;
developer20126ad2022-09-12 14:42:56 +0800149 path->mtk_wdma.queue = phy != &dev->phy;
150
151 ctx->dev = NULL;
152diff --git a/mt7915/mcu.c b/mt7915/mcu.c
developer29344f12022-10-17 12:01:44 +0800153index bd7b81e6..4aa859e5 100644
developer20126ad2022-09-12 14:42:56 +0800154--- a/mt7915/mcu.c
155+++ b/mt7915/mcu.c
developer33907d42022-09-19 14:33:58 +0800156@@ -2350,6 +2350,7 @@ mt7915_mcu_init_rx_airtime(struct mt7915_dev *dev)
developer20126ad2022-09-12 14:42:56 +0800157 int mt7915_run_firmware(struct mt7915_dev *dev)
158 {
159 int ret;
160+ struct mtk_wed_device *wed = &dev->mt76.mmio.wed;
161
162 /* force firmware operation mode into normal state,
163 * which should be set before firmware download stage.
developer33907d42022-09-19 14:33:58 +0800164@@ -2379,8 +2380,15 @@ int mt7915_run_firmware(struct mt7915_dev *dev)
developer20126ad2022-09-12 14:42:56 +0800165 if (ret)
166 return ret;
167
168- if (mtk_wed_device_active(&dev->mt76.mmio.wed) && is_mt7915(&dev->mt76))
169- mt7915_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(CAPABILITY), 0, 0, 0);
170+ if (mtk_wed_device_active(wed)) {
171+ if (is_mt7915(&dev->mt76))
172+ mt7915_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(CAPABILITY),
173+ 0, 0, 0);
174+ else
175+ mt7915_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(SET),
176+ MCU_WA_PARAM_WED_VERSION,
177+ wed->rev_id, 0);
178+ }
179
180 ret = mt7915_mcu_set_mwds(dev, 1);
181 if (ret)
182diff --git a/mt7915/mcu.h b/mt7915/mcu.h
developer29344f12022-10-17 12:01:44 +0800183index 9d0fac47..1f56db6b 100644
developer20126ad2022-09-12 14:42:56 +0800184--- a/mt7915/mcu.h
185+++ b/mt7915/mcu.h
186@@ -268,6 +268,7 @@ enum {
187 MCU_WA_PARAM_RED_SHOW_STA = 0xf,
188 MCU_WA_PARAM_RED_TARGET_DELAY = 0x10,
189 #endif
190+ MCU_WA_PARAM_WED_VERSION = 0x32,
191 };
192
193 enum mcu_mmps_mode {
194diff --git a/mt7915/mmio.c b/mt7915/mmio.c
developer29344f12022-10-17 12:01:44 +0800195index 5819281c..84a47c94 100644
developer20126ad2022-09-12 14:42:56 +0800196--- a/mt7915/mmio.c
197+++ b/mt7915/mmio.c
developercaeb1a02022-10-12 18:25:15 +0800198@@ -596,6 +596,8 @@ int mt7915_mmio_wed_init(struct mt7915_dev *dev, void *pdev_ptr,
developerf1313102022-10-11 11:02:55 +0800199 wed->wlan.init_buf = mt7915_wed_init_buf;
200 wed->wlan.offload_enable = mt7915_mmio_wed_offload_enable;
201 wed->wlan.offload_disable = mt7915_mmio_wed_offload_disable;
developer33907d42022-09-19 14:33:58 +0800202+ if (!is_mt7915(mdev))
203+ wed->wlan.wcid_512 = true;
204
developerf1313102022-10-11 11:02:55 +0800205 if (mtk_wed_device_attach(wed))
developer33907d42022-09-19 14:33:58 +0800206 return 0;
developercaeb1a02022-10-12 18:25:15 +0800207@@ -810,6 +812,7 @@ struct mt7915_dev *mt7915_mmio_probe(struct device *pdev,
developer20126ad2022-09-12 14:42:56 +0800208 .sta_add = mt7915_mac_sta_add,
209 .sta_remove = mt7915_mac_sta_remove,
210 .update_survey = mt7915_update_channel,
211+ .wed_wds_check = mt7915_wed_wds_check,
212 };
213 struct mt7915_dev *dev;
214 struct mt76_dev *mdev;
215diff --git a/mt7915/mt7915.h b/mt7915/mt7915.h
developer29344f12022-10-17 12:01:44 +0800216index b5784d92..5a2d15ff 100644
developer20126ad2022-09-12 14:42:56 +0800217--- a/mt7915/mt7915.h
218+++ b/mt7915/mt7915.h
219@@ -18,6 +18,9 @@
220 #define MT7915_WTBL_STA (MT7915_WTBL_RESERVED - \
221 MT7915_MAX_INTERFACES)
222
223+#define MT7915_WTBL_WDS_START 256
224+#define MT7915_WTBL_WDS_END 271
225+
226 #define MT7915_WATCHDOG_TIME (HZ / 10)
227 #define MT7915_RESET_TIMEOUT (30 * HZ)
228
developer29344f12022-10-17 12:01:44 +0800229@@ -696,6 +699,7 @@ void mt7915_tx_token_put(struct mt7915_dev *dev);
developer20126ad2022-09-12 14:42:56 +0800230 void mt7915_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
231 struct sk_buff *skb);
232 bool mt7915_rx_check(struct mt76_dev *mdev, void *data, int len);
233+bool mt7915_wed_wds_check(struct mt76_dev *mdev, struct ieee80211_sta *sta);
234 void mt7915_sta_ps(struct mt76_dev *mdev, struct ieee80211_sta *sta, bool ps);
235 void mt7915_stats_work(struct work_struct *work);
236 int mt76_dfs_start_rdd(struct mt7915_dev *dev, bool force);
237--
developer29344f12022-10-17 12:01:44 +08002382.25.1
developer20126ad2022-09-12 14:42:56 +0800239