1 // SPDX-License-Identifier: ISC
2 /* Copyright (C) 2020 MediaTek Inc. */
3
4 #include <linux/etherdevice.h>
5 #include <linux/platform_device.h>
6 #include <linux/pci.h>
7 #include <linux/module.h>
8 #include "mt7915.h"
9 #include "mcu.h"
10
mt7915_dev_running(struct mt7915_dev * dev)11 static bool mt7915_dev_running(struct mt7915_dev *dev)
12 {
13 struct mt7915_phy *phy;
14
15 if (test_bit(MT76_STATE_RUNNING, &dev->mphy.state))
16 return true;
17
18 phy = mt7915_ext_phy(dev);
19
20 return phy && test_bit(MT76_STATE_RUNNING, &phy->mt76->state);
21 }
22
mt7915_start(struct ieee80211_hw * hw)23 static int mt7915_start(struct ieee80211_hw *hw)
24 {
25 struct mt7915_dev *dev = mt7915_hw_dev(hw);
26 struct mt7915_phy *phy = mt7915_hw_phy(hw);
27 bool running;
28
29 mutex_lock(&dev->mt76.mutex);
30
31 running = mt7915_dev_running(dev);
32
33 if (!running) {
34 mt7915_mcu_set_pm(dev, 0, 0);
35 mt7915_mcu_set_mac(dev, 0, true, false);
36 mt7915_mcu_set_scs(dev, 0, true);
37 }
38
39 if (phy != &dev->phy) {
40 mt7915_mcu_set_pm(dev, 1, 0);
41 mt7915_mcu_set_mac(dev, 1, true, false);
42 mt7915_mcu_set_scs(dev, 1, true);
43 }
44
45 mt7915_mcu_set_sku_en(phy, true);
46 mt7915_mcu_set_chan_info(phy, MCU_EXT_CMD_SET_RX_PATH);
47
48 set_bit(MT76_STATE_RUNNING, &phy->mt76->state);
49
50 ieee80211_queue_delayed_work(hw, &phy->mac_work,
51 MT7915_WATCHDOG_TIME);
52
53 if (!running)
54 mt7915_mac_reset_counters(phy);
55
56 mutex_unlock(&dev->mt76.mutex);
57
58 return 0;
59 }
60
mt7915_stop(struct ieee80211_hw * hw)61 static void mt7915_stop(struct ieee80211_hw *hw)
62 {
63 struct mt7915_dev *dev = mt7915_hw_dev(hw);
64 struct mt7915_phy *phy = mt7915_hw_phy(hw);
65
66 cancel_delayed_work_sync(&phy->mac_work);
67
68 mutex_lock(&dev->mt76.mutex);
69
70 clear_bit(MT76_STATE_RUNNING, &phy->mt76->state);
71
72 if (phy != &dev->phy) {
73 mt7915_mcu_set_pm(dev, 1, 1);
74 mt7915_mcu_set_mac(dev, 1, false, false);
75 }
76
77 if (!mt7915_dev_running(dev)) {
78 mt7915_mcu_set_pm(dev, 0, 1);
79 mt7915_mcu_set_mac(dev, 0, false, false);
80 }
81
82 mutex_unlock(&dev->mt76.mutex);
83 }
84
get_omac_idx(enum nl80211_iftype type,u32 mask)85 static int get_omac_idx(enum nl80211_iftype type, u32 mask)
86 {
87 int i;
88
89 switch (type) {
90 case NL80211_IFTYPE_MONITOR:
91 case NL80211_IFTYPE_AP:
92 /* ap uses hw bssid 0 and ext bssid */
93 if (~mask & BIT(HW_BSSID_0))
94 return HW_BSSID_0;
95
96 for (i = EXT_BSSID_1; i < EXT_BSSID_END; i++)
97 if (~mask & BIT(i))
98 return i;
99 break;
100 case NL80211_IFTYPE_MESH_POINT:
101 case NL80211_IFTYPE_ADHOC:
102 case NL80211_IFTYPE_STATION:
103 /* station uses hw bssid other than 0 */
104 for (i = HW_BSSID_1; i < HW_BSSID_MAX; i++)
105 if (~mask & BIT(i))
106 return i;
107 break;
108 default:
109 WARN_ON(1);
110 break;
111 }
112
113 return -1;
114 }
115
mt7915_add_interface(struct ieee80211_hw * hw,struct ieee80211_vif * vif)116 static int mt7915_add_interface(struct ieee80211_hw *hw,
117 struct ieee80211_vif *vif)
118 {
119 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
120 struct mt7915_dev *dev = mt7915_hw_dev(hw);
121 struct mt7915_phy *phy = mt7915_hw_phy(hw);
122 struct mt76_txq *mtxq;
123 bool ext_phy = phy != &dev->phy;
124 int idx, ret = 0;
125
126 mutex_lock(&dev->mt76.mutex);
127
128 mvif->idx = ffs(~phy->mt76->vif_mask) - 1;
129 if (mvif->idx >= MT7915_MAX_INTERFACES) {
130 ret = -ENOSPC;
131 goto out;
132 }
133
134 idx = get_omac_idx(vif->type, phy->omac_mask);
135 if (idx < 0) {
136 ret = -ENOSPC;
137 goto out;
138 }
139 mvif->omac_idx = idx;
140 mvif->phy = phy;
141 mvif->band_idx = ext_phy;
142
143 if (ext_phy)
144 mvif->wmm_idx = ext_phy * (MT7915_MAX_WMM_SETS / 2) +
145 mvif->idx % (MT7915_MAX_WMM_SETS / 2);
146 else
147 mvif->wmm_idx = mvif->idx % MT7915_MAX_WMM_SETS;
148
149 ret = mt7915_mcu_add_dev_info(dev, vif, true);
150 if (ret)
151 goto out;
152
153 phy->mt76->vif_mask |= BIT(mvif->idx);
154 phy->omac_mask |= BIT(mvif->omac_idx);
155
156 idx = MT7915_WTBL_RESERVED - mvif->idx;
157
158 INIT_LIST_HEAD(&mvif->sta.rc_list);
159 INIT_LIST_HEAD(&mvif->sta.stats_list);
160 INIT_LIST_HEAD(&mvif->sta.poll_list);
161 mvif->sta.wcid.idx = idx;
162 mvif->sta.wcid.ext_phy = mvif->band_idx;
163 mvif->sta.wcid.hw_key_idx = -1;
164 mvif->sta.wcid.tx_info |= MT_WCID_TX_INFO_SET;
165 mt7915_mac_wtbl_update(dev, idx,
166 MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
167
168 rcu_assign_pointer(dev->mt76.wcid[idx], &mvif->sta.wcid);
169 if (vif->txq) {
170 mtxq = (struct mt76_txq *)vif->txq->drv_priv;
171 mtxq->wcid = &mvif->sta.wcid;
172 }
173
174 out:
175 mutex_unlock(&dev->mt76.mutex);
176
177 return ret;
178 }
179
mt7915_remove_interface(struct ieee80211_hw * hw,struct ieee80211_vif * vif)180 static void mt7915_remove_interface(struct ieee80211_hw *hw,
181 struct ieee80211_vif *vif)
182 {
183 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
184 struct mt7915_sta *msta = &mvif->sta;
185 struct mt7915_dev *dev = mt7915_hw_dev(hw);
186 struct mt7915_phy *phy = mt7915_hw_phy(hw);
187 int idx = msta->wcid.idx;
188
189 /* TODO: disable beacon for the bss */
190
191 mt7915_mcu_add_dev_info(dev, vif, false);
192
193 rcu_assign_pointer(dev->mt76.wcid[idx], NULL);
194
195 mutex_lock(&dev->mt76.mutex);
196 phy->mt76->vif_mask &= ~BIT(mvif->idx);
197 phy->omac_mask &= ~BIT(mvif->omac_idx);
198 mutex_unlock(&dev->mt76.mutex);
199
200 spin_lock_bh(&dev->sta_poll_lock);
201 if (!list_empty(&msta->poll_list))
202 list_del_init(&msta->poll_list);
203 spin_unlock_bh(&dev->sta_poll_lock);
204 }
205
mt7915_init_dfs_state(struct mt7915_phy * phy)206 static void mt7915_init_dfs_state(struct mt7915_phy *phy)
207 {
208 struct mt76_phy *mphy = phy->mt76;
209 struct ieee80211_hw *hw = mphy->hw;
210 struct cfg80211_chan_def *chandef = &hw->conf.chandef;
211
212 if (hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)
213 return;
214
215 if (!(chandef->chan->flags & IEEE80211_CHAN_RADAR))
216 return;
217
218 if (mphy->chandef.chan->center_freq == chandef->chan->center_freq &&
219 mphy->chandef.width == chandef->width)
220 return;
221
222 phy->dfs_state = -1;
223 }
224
mt7915_set_channel(struct mt7915_phy * phy)225 static int mt7915_set_channel(struct mt7915_phy *phy)
226 {
227 struct mt7915_dev *dev = phy->dev;
228 int ret;
229
230 cancel_delayed_work_sync(&phy->mac_work);
231
232 mutex_lock(&dev->mt76.mutex);
233 set_bit(MT76_RESET, &phy->mt76->state);
234
235 mt7915_init_dfs_state(phy);
236 mt76_set_channel(phy->mt76);
237
238 ret = mt7915_mcu_set_chan_info(phy, MCU_EXT_CMD_CHANNEL_SWITCH);
239 if (ret)
240 goto out;
241
242 mt7915_mac_set_timing(phy);
243 ret = mt7915_dfs_init_radar_detector(phy);
244 mt7915_mac_cca_stats_reset(phy);
245
246 mt7915_mac_reset_counters(phy);
247 phy->noise = 0;
248
249 out:
250 clear_bit(MT76_RESET, &phy->mt76->state);
251 mutex_unlock(&dev->mt76.mutex);
252
253 mt76_txq_schedule_all(phy->mt76);
254 ieee80211_queue_delayed_work(phy->mt76->hw, &phy->mac_work,
255 MT7915_WATCHDOG_TIME);
256
257 return ret;
258 }
259
mt7915_set_key(struct ieee80211_hw * hw,enum set_key_cmd cmd,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct ieee80211_key_conf * key)260 static int mt7915_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
261 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
262 struct ieee80211_key_conf *key)
263 {
264 struct mt7915_dev *dev = mt7915_hw_dev(hw);
265 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
266 struct mt7915_sta *msta = sta ? (struct mt7915_sta *)sta->drv_priv :
267 &mvif->sta;
268 struct mt76_wcid *wcid = &msta->wcid;
269 int idx = key->keyidx;
270
271 /* The hardware does not support per-STA RX GTK, fallback
272 * to software mode for these.
273 */
274 if ((vif->type == NL80211_IFTYPE_ADHOC ||
275 vif->type == NL80211_IFTYPE_MESH_POINT) &&
276 (key->cipher == WLAN_CIPHER_SUITE_TKIP ||
277 key->cipher == WLAN_CIPHER_SUITE_CCMP) &&
278 !(key->flags & IEEE80211_KEY_FLAG_PAIRWISE))
279 return -EOPNOTSUPP;
280
281 /* fall back to sw encryption for unsupported ciphers */
282 switch (key->cipher) {
283 case WLAN_CIPHER_SUITE_AES_CMAC:
284 key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIE;
285 break;
286 case WLAN_CIPHER_SUITE_WEP40:
287 case WLAN_CIPHER_SUITE_WEP104:
288 case WLAN_CIPHER_SUITE_TKIP:
289 case WLAN_CIPHER_SUITE_CCMP:
290 case WLAN_CIPHER_SUITE_CCMP_256:
291 case WLAN_CIPHER_SUITE_GCMP:
292 case WLAN_CIPHER_SUITE_GCMP_256:
293 case WLAN_CIPHER_SUITE_SMS4:
294 break;
295 default:
296 return -EOPNOTSUPP;
297 }
298
299 if (cmd == SET_KEY) {
300 key->hw_key_idx = wcid->idx;
301 wcid->hw_key_idx = idx;
302 } else if (idx == wcid->hw_key_idx) {
303 wcid->hw_key_idx = -1;
304 }
305 mt76_wcid_key_setup(&dev->mt76, wcid,
306 cmd == SET_KEY ? key : NULL);
307
308 return mt7915_mcu_add_key(dev, vif, msta, key, cmd);
309 }
310
mt7915_config(struct ieee80211_hw * hw,u32 changed)311 static int mt7915_config(struct ieee80211_hw *hw, u32 changed)
312 {
313 struct mt7915_dev *dev = mt7915_hw_dev(hw);
314 struct mt7915_phy *phy = mt7915_hw_phy(hw);
315 bool band = phy != &dev->phy;
316 int ret;
317
318 if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
319 ieee80211_stop_queues(hw);
320 ret = mt7915_set_channel(phy);
321 if (ret)
322 return ret;
323 ieee80211_wake_queues(hw);
324 }
325
326 if (changed & IEEE80211_CONF_CHANGE_POWER) {
327 ret = mt7915_mcu_set_sku(phy);
328 if (ret)
329 return ret;
330 }
331
332 mutex_lock(&dev->mt76.mutex);
333
334 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
335 if (!(hw->conf.flags & IEEE80211_CONF_MONITOR))
336 phy->rxfilter |= MT_WF_RFCR_DROP_OTHER_UC;
337 else
338 phy->rxfilter &= ~MT_WF_RFCR_DROP_OTHER_UC;
339
340 mt76_wr(dev, MT_WF_RFCR(band), phy->rxfilter);
341 }
342
343 mutex_unlock(&dev->mt76.mutex);
344
345 return 0;
346 }
347
348 static int
mt7915_conf_tx(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u16 queue,const struct ieee80211_tx_queue_params * params)349 mt7915_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif, u16 queue,
350 const struct ieee80211_tx_queue_params *params)
351 {
352 struct mt7915_dev *dev = mt7915_hw_dev(hw);
353 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
354
355 /* no need to update right away, we'll get BSS_CHANGED_QOS */
356 queue = mt7915_lmac_mapping(dev, queue);
357 mvif->queue_params[queue] = *params;
358
359 return 0;
360 }
361
mt7915_configure_filter(struct ieee80211_hw * hw,unsigned int changed_flags,unsigned int * total_flags,u64 multicast)362 static void mt7915_configure_filter(struct ieee80211_hw *hw,
363 unsigned int changed_flags,
364 unsigned int *total_flags,
365 u64 multicast)
366 {
367 struct mt7915_dev *dev = mt7915_hw_dev(hw);
368 struct mt7915_phy *phy = mt7915_hw_phy(hw);
369 bool band = phy != &dev->phy;
370
371 u32 ctl_flags = MT_WF_RFCR1_DROP_ACK |
372 MT_WF_RFCR1_DROP_BF_POLL |
373 MT_WF_RFCR1_DROP_BA |
374 MT_WF_RFCR1_DROP_CFEND |
375 MT_WF_RFCR1_DROP_CFACK;
376 u32 flags = 0;
377
378 #define MT76_FILTER(_flag, _hw) do { \
379 flags |= *total_flags & FIF_##_flag; \
380 phy->rxfilter &= ~(_hw); \
381 phy->rxfilter |= !(flags & FIF_##_flag) * (_hw); \
382 } while (0)
383
384 phy->rxfilter &= ~(MT_WF_RFCR_DROP_OTHER_BSS |
385 MT_WF_RFCR_DROP_OTHER_BEACON |
386 MT_WF_RFCR_DROP_FRAME_REPORT |
387 MT_WF_RFCR_DROP_PROBEREQ |
388 MT_WF_RFCR_DROP_MCAST_FILTERED |
389 MT_WF_RFCR_DROP_MCAST |
390 MT_WF_RFCR_DROP_BCAST |
391 MT_WF_RFCR_DROP_DUPLICATE |
392 MT_WF_RFCR_DROP_A2_BSSID |
393 MT_WF_RFCR_DROP_UNWANTED_CTL |
394 MT_WF_RFCR_DROP_STBC_MULTI);
395
396 MT76_FILTER(OTHER_BSS, MT_WF_RFCR_DROP_OTHER_TIM |
397 MT_WF_RFCR_DROP_A3_MAC |
398 MT_WF_RFCR_DROP_A3_BSSID);
399
400 MT76_FILTER(FCSFAIL, MT_WF_RFCR_DROP_FCSFAIL);
401
402 MT76_FILTER(CONTROL, MT_WF_RFCR_DROP_CTS |
403 MT_WF_RFCR_DROP_RTS |
404 MT_WF_RFCR_DROP_CTL_RSV |
405 MT_WF_RFCR_DROP_NDPA);
406
407 *total_flags = flags;
408 mt76_wr(dev, MT_WF_RFCR(band), phy->rxfilter);
409
410 if (*total_flags & FIF_CONTROL)
411 mt76_clear(dev, MT_WF_RFCR1(band), ctl_flags);
412 else
413 mt76_set(dev, MT_WF_RFCR1(band), ctl_flags);
414 }
415
mt7915_bss_info_changed(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_bss_conf * info,u32 changed)416 static void mt7915_bss_info_changed(struct ieee80211_hw *hw,
417 struct ieee80211_vif *vif,
418 struct ieee80211_bss_conf *info,
419 u32 changed)
420 {
421 struct mt7915_phy *phy = mt7915_hw_phy(hw);
422 struct mt7915_dev *dev = mt7915_hw_dev(hw);
423
424 mutex_lock(&dev->mt76.mutex);
425
426 /*
427 * station mode uses BSSID to map the wlan entry to a peer,
428 * and then peer references bss_info_rfch to set bandwidth cap.
429 */
430 if (changed & BSS_CHANGED_BSSID &&
431 vif->type == NL80211_IFTYPE_STATION) {
432 bool join = !is_zero_ether_addr(info->bssid);
433
434 mt7915_mcu_add_bss_info(phy, vif, join);
435 mt7915_mcu_add_sta(dev, vif, NULL, join);
436 }
437
438 if (changed & BSS_CHANGED_ASSOC) {
439 mt7915_mcu_add_bss_info(phy, vif, info->assoc);
440 mt7915_mcu_add_obss_spr(dev, vif, info->he_obss_pd.enable);
441 }
442
443 if (changed & BSS_CHANGED_ERP_SLOT) {
444 int slottime = info->use_short_slot ? 9 : 20;
445
446 if (slottime != phy->slottime) {
447 phy->slottime = slottime;
448 mt7915_mac_set_timing(phy);
449 }
450 }
451
452 if (changed & BSS_CHANGED_BEACON_ENABLED) {
453 mt7915_mcu_add_bss_info(phy, vif, info->enable_beacon);
454 mt7915_mcu_add_sta(dev, vif, NULL, info->enable_beacon);
455 }
456
457 /* ensure that enable txcmd_mode after bss_info */
458 if (changed & (BSS_CHANGED_QOS | BSS_CHANGED_BEACON_ENABLED))
459 mt7915_mcu_set_tx(dev, vif);
460
461 if (changed & BSS_CHANGED_HE_OBSS_PD)
462 mt7915_mcu_add_obss_spr(dev, vif, info->he_obss_pd.enable);
463
464 if (changed & (BSS_CHANGED_BEACON |
465 BSS_CHANGED_BEACON_ENABLED))
466 mt7915_mcu_add_beacon(hw, vif, info->enable_beacon);
467
468 mutex_unlock(&dev->mt76.mutex);
469 }
470
471 static void
mt7915_channel_switch_beacon(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct cfg80211_chan_def * chandef)472 mt7915_channel_switch_beacon(struct ieee80211_hw *hw,
473 struct ieee80211_vif *vif,
474 struct cfg80211_chan_def *chandef)
475 {
476 struct mt7915_dev *dev = mt7915_hw_dev(hw);
477
478 mutex_lock(&dev->mt76.mutex);
479 mt7915_mcu_add_beacon(hw, vif, true);
480 mutex_unlock(&dev->mt76.mutex);
481 }
482
mt7915_mac_sta_add(struct mt76_dev * mdev,struct ieee80211_vif * vif,struct ieee80211_sta * sta)483 int mt7915_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
484 struct ieee80211_sta *sta)
485 {
486 struct mt7915_dev *dev = container_of(mdev, struct mt7915_dev, mt76);
487 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
488 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
489 int ret, idx;
490
491 idx = mt76_wcid_alloc(dev->mt76.wcid_mask, MT7915_WTBL_STA - 1);
492 if (idx < 0)
493 return -ENOSPC;
494
495 INIT_LIST_HEAD(&msta->rc_list);
496 INIT_LIST_HEAD(&msta->stats_list);
497 INIT_LIST_HEAD(&msta->poll_list);
498 msta->vif = mvif;
499 msta->wcid.sta = 1;
500 msta->wcid.idx = idx;
501 msta->wcid.ext_phy = mvif->band_idx;
502 msta->wcid.tx_info |= MT_WCID_TX_INFO_SET;
503 msta->stats.jiffies = jiffies;
504
505 mt7915_mac_wtbl_update(dev, idx,
506 MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
507
508 ret = mt7915_mcu_add_sta(dev, vif, sta, true);
509 if (ret)
510 return ret;
511
512 return mt7915_mcu_add_sta_adv(dev, vif, sta, true);
513 }
514
mt7915_mac_sta_remove(struct mt76_dev * mdev,struct ieee80211_vif * vif,struct ieee80211_sta * sta)515 void mt7915_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,
516 struct ieee80211_sta *sta)
517 {
518 struct mt7915_dev *dev = container_of(mdev, struct mt7915_dev, mt76);
519 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
520
521 mt7915_mcu_add_sta_adv(dev, vif, sta, false);
522 mt7915_mcu_add_sta(dev, vif, sta, false);
523
524 mt7915_mac_wtbl_update(dev, msta->wcid.idx,
525 MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
526
527 spin_lock_bh(&dev->sta_poll_lock);
528 if (!list_empty(&msta->poll_list))
529 list_del_init(&msta->poll_list);
530 if (!list_empty(&msta->stats_list))
531 list_del_init(&msta->stats_list);
532 if (!list_empty(&msta->rc_list))
533 list_del_init(&msta->rc_list);
534 spin_unlock_bh(&dev->sta_poll_lock);
535 }
536
mt7915_tx(struct ieee80211_hw * hw,struct ieee80211_tx_control * control,struct sk_buff * skb)537 static void mt7915_tx(struct ieee80211_hw *hw,
538 struct ieee80211_tx_control *control,
539 struct sk_buff *skb)
540 {
541 struct mt7915_dev *dev = mt7915_hw_dev(hw);
542 struct mt76_phy *mphy = hw->priv;
543 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
544 struct ieee80211_vif *vif = info->control.vif;
545 struct mt76_wcid *wcid = &dev->mt76.global_wcid;
546
547 if (control->sta) {
548 struct mt7915_sta *sta;
549
550 sta = (struct mt7915_sta *)control->sta->drv_priv;
551 wcid = &sta->wcid;
552 }
553
554 if (vif && !control->sta) {
555 struct mt7915_vif *mvif;
556
557 mvif = (struct mt7915_vif *)vif->drv_priv;
558 wcid = &mvif->sta.wcid;
559 }
560
561 mt76_tx(mphy, control->sta, wcid, skb);
562 }
563
mt7915_set_rts_threshold(struct ieee80211_hw * hw,u32 val)564 static int mt7915_set_rts_threshold(struct ieee80211_hw *hw, u32 val)
565 {
566 struct mt7915_dev *dev = mt7915_hw_dev(hw);
567 struct mt7915_phy *phy = mt7915_hw_phy(hw);
568
569 mutex_lock(&dev->mt76.mutex);
570 mt7915_mcu_set_rts_thresh(phy, val);
571 mutex_unlock(&dev->mt76.mutex);
572
573 return 0;
574 }
575
576 static int
mt7915_ampdu_action(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_ampdu_params * params)577 mt7915_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
578 struct ieee80211_ampdu_params *params)
579 {
580 enum ieee80211_ampdu_mlme_action action = params->action;
581 struct mt7915_dev *dev = mt7915_hw_dev(hw);
582 struct ieee80211_sta *sta = params->sta;
583 struct ieee80211_txq *txq = sta->txq[params->tid];
584 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
585 u16 tid = params->tid;
586 u16 ssn = params->ssn;
587 struct mt76_txq *mtxq;
588 int ret = 0;
589
590 if (!txq)
591 return -EINVAL;
592
593 mtxq = (struct mt76_txq *)txq->drv_priv;
594
595 mutex_lock(&dev->mt76.mutex);
596 switch (action) {
597 case IEEE80211_AMPDU_RX_START:
598 mt76_rx_aggr_start(&dev->mt76, &msta->wcid, tid, ssn,
599 params->buf_size);
600 mt7915_mcu_add_rx_ba(dev, params, true);
601 break;
602 case IEEE80211_AMPDU_RX_STOP:
603 mt76_rx_aggr_stop(&dev->mt76, &msta->wcid, tid);
604 mt7915_mcu_add_rx_ba(dev, params, false);
605 break;
606 case IEEE80211_AMPDU_TX_OPERATIONAL:
607 mtxq->aggr = true;
608 mtxq->send_bar = false;
609 mt7915_mcu_add_tx_ba(dev, params, true);
610 break;
611 case IEEE80211_AMPDU_TX_STOP_FLUSH:
612 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
613 mtxq->aggr = false;
614 clear_bit(tid, &msta->ampdu_state);
615 mt7915_mcu_add_tx_ba(dev, params, false);
616 break;
617 case IEEE80211_AMPDU_TX_START:
618 set_bit(tid, &msta->ampdu_state);
619 ret = IEEE80211_AMPDU_TX_START_IMMEDIATE;
620 break;
621 case IEEE80211_AMPDU_TX_STOP_CONT:
622 mtxq->aggr = false;
623 clear_bit(tid, &msta->ampdu_state);
624 mt7915_mcu_add_tx_ba(dev, params, false);
625 ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
626 break;
627 }
628 mutex_unlock(&dev->mt76.mutex);
629
630 return ret;
631 }
632
633 static int
mt7915_sta_add(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta)634 mt7915_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
635 struct ieee80211_sta *sta)
636 {
637 return mt76_sta_state(hw, vif, sta, IEEE80211_STA_NOTEXIST,
638 IEEE80211_STA_NONE);
639 }
640
641 static int
mt7915_sta_remove(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta)642 mt7915_sta_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
643 struct ieee80211_sta *sta)
644 {
645 return mt76_sta_state(hw, vif, sta, IEEE80211_STA_NONE,
646 IEEE80211_STA_NOTEXIST);
647 }
648
649 static int
mt7915_get_stats(struct ieee80211_hw * hw,struct ieee80211_low_level_stats * stats)650 mt7915_get_stats(struct ieee80211_hw *hw,
651 struct ieee80211_low_level_stats *stats)
652 {
653 struct mt7915_phy *phy = mt7915_hw_phy(hw);
654 struct mt7915_dev *dev = mt7915_hw_dev(hw);
655 struct mib_stats *mib = &phy->mib;
656
657 mutex_lock(&dev->mt76.mutex);
658 stats->dot11RTSSuccessCount = mib->rts_cnt;
659 stats->dot11RTSFailureCount = mib->rts_retries_cnt;
660 stats->dot11FCSErrorCount = mib->fcs_err_cnt;
661 stats->dot11ACKFailureCount = mib->ack_fail_cnt;
662
663 memset(mib, 0, sizeof(*mib));
664
665 mutex_unlock(&dev->mt76.mutex);
666
667 return 0;
668 }
669
670 static u64
mt7915_get_tsf(struct ieee80211_hw * hw,struct ieee80211_vif * vif)671 mt7915_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
672 {
673 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
674 struct mt7915_dev *dev = mt7915_hw_dev(hw);
675 struct mt7915_phy *phy = mt7915_hw_phy(hw);
676 bool band = phy != &dev->phy;
677 union {
678 u64 t64;
679 u32 t32[2];
680 } tsf;
681 u16 n;
682
683 mutex_lock(&dev->mt76.mutex);
684
685 n = mvif->omac_idx > HW_BSSID_MAX ? HW_BSSID_0 : mvif->omac_idx;
686 /* TSF software read */
687 mt76_set(dev, MT_LPON_TCR(band, n), MT_LPON_TCR_SW_MODE);
688 tsf.t32[0] = mt76_rr(dev, MT_LPON_UTTR0(band));
689 tsf.t32[1] = mt76_rr(dev, MT_LPON_UTTR1(band));
690
691 mutex_unlock(&dev->mt76.mutex);
692
693 return tsf.t64;
694 }
695
696 static void
mt7915_set_tsf(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u64 timestamp)697 mt7915_set_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
698 u64 timestamp)
699 {
700 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
701 struct mt7915_dev *dev = mt7915_hw_dev(hw);
702 struct mt7915_phy *phy = mt7915_hw_phy(hw);
703 bool band = phy != &dev->phy;
704 union {
705 u64 t64;
706 u32 t32[2];
707 } tsf = { .t64 = timestamp, };
708 u16 n;
709
710 mutex_lock(&dev->mt76.mutex);
711
712 n = mvif->omac_idx > HW_BSSID_MAX ? HW_BSSID_0 : mvif->omac_idx;
713 mt76_wr(dev, MT_LPON_UTTR0(band), tsf.t32[0]);
714 mt76_wr(dev, MT_LPON_UTTR1(band), tsf.t32[1]);
715 /* TSF software overwrite */
716 mt76_set(dev, MT_LPON_TCR(band, n), MT_LPON_TCR_SW_WRITE);
717
718 mutex_unlock(&dev->mt76.mutex);
719 }
720
721 static void
mt7915_set_coverage_class(struct ieee80211_hw * hw,s16 coverage_class)722 mt7915_set_coverage_class(struct ieee80211_hw *hw, s16 coverage_class)
723 {
724 struct mt7915_phy *phy = mt7915_hw_phy(hw);
725 struct mt7915_dev *dev = phy->dev;
726
727 mutex_lock(&dev->mt76.mutex);
728 phy->coverage_class = max_t(s16, coverage_class, 0);
729 mt7915_mac_set_timing(phy);
730 mutex_unlock(&dev->mt76.mutex);
731 }
732
733 static int
mt7915_set_antenna(struct ieee80211_hw * hw,u32 tx_ant,u32 rx_ant)734 mt7915_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
735 {
736 struct mt7915_dev *dev = mt7915_hw_dev(hw);
737 struct mt7915_phy *phy = mt7915_hw_phy(hw);
738 int max_nss = hweight8(hw->wiphy->available_antennas_tx);
739 bool ext_phy = phy != &dev->phy;
740
741 if (!tx_ant || tx_ant != rx_ant || ffs(tx_ant) > max_nss)
742 return -EINVAL;
743
744 if ((BIT(hweight8(tx_ant)) - 1) != tx_ant)
745 tx_ant = BIT(ffs(tx_ant) - 1) - 1;
746
747 mutex_lock(&dev->mt76.mutex);
748
749 phy->mt76->antenna_mask = tx_ant;
750
751 if (ext_phy) {
752 if (dev->chainmask == 0xf)
753 tx_ant <<= 2;
754 else
755 tx_ant <<= 1;
756 }
757 phy->chainmask = tx_ant;
758
759 mt76_set_stream_caps(phy->mt76, true);
760 mt7915_set_stream_vht_txbf_caps(phy);
761 mt7915_set_stream_he_caps(phy);
762
763 mutex_unlock(&dev->mt76.mutex);
764
765 return 0;
766 }
767
mt7915_sta_statistics(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct station_info * sinfo)768 static void mt7915_sta_statistics(struct ieee80211_hw *hw,
769 struct ieee80211_vif *vif,
770 struct ieee80211_sta *sta,
771 struct station_info *sinfo)
772 {
773 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
774 struct mt7915_sta_stats *stats = &msta->stats;
775
776 if (!stats->tx_rate.legacy && !stats->tx_rate.flags)
777 return;
778
779 if (stats->tx_rate.legacy) {
780 sinfo->txrate.legacy = stats->tx_rate.legacy;
781 } else {
782 sinfo->txrate.mcs = stats->tx_rate.mcs;
783 sinfo->txrate.nss = stats->tx_rate.nss;
784 sinfo->txrate.bw = stats->tx_rate.bw;
785 sinfo->txrate.he_gi = stats->tx_rate.he_gi;
786 sinfo->txrate.he_dcm = stats->tx_rate.he_dcm;
787 sinfo->txrate.he_ru_alloc = stats->tx_rate.he_ru_alloc;
788 }
789 sinfo->txrate.flags = stats->tx_rate.flags;
790 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
791 }
792
793 static void
mt7915_sta_rc_update(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta,u32 changed)794 mt7915_sta_rc_update(struct ieee80211_hw *hw,
795 struct ieee80211_vif *vif,
796 struct ieee80211_sta *sta,
797 u32 changed)
798 {
799 struct mt7915_dev *dev = mt7915_hw_dev(hw);
800 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
801
802 spin_lock_bh(&dev->sta_poll_lock);
803 msta->stats.changed |= changed;
804 if (list_empty(&msta->rc_list))
805 list_add_tail(&msta->rc_list, &dev->sta_rc_list);
806 spin_unlock_bh(&dev->sta_poll_lock);
807
808 ieee80211_queue_work(hw, &dev->rc_work);
809 }
810
811 const struct ieee80211_ops mt7915_ops = {
812 .tx = mt7915_tx,
813 .start = mt7915_start,
814 .stop = mt7915_stop,
815 .add_interface = mt7915_add_interface,
816 .remove_interface = mt7915_remove_interface,
817 .config = mt7915_config,
818 .conf_tx = mt7915_conf_tx,
819 .configure_filter = mt7915_configure_filter,
820 .bss_info_changed = mt7915_bss_info_changed,
821 .sta_add = mt7915_sta_add,
822 .sta_remove = mt7915_sta_remove,
823 .sta_pre_rcu_remove = mt76_sta_pre_rcu_remove,
824 .sta_rc_update = mt7915_sta_rc_update,
825 .set_key = mt7915_set_key,
826 .ampdu_action = mt7915_ampdu_action,
827 .set_rts_threshold = mt7915_set_rts_threshold,
828 .wake_tx_queue = mt76_wake_tx_queue,
829 .sw_scan_start = mt76_sw_scan,
830 .sw_scan_complete = mt76_sw_scan_complete,
831 .release_buffered_frames = mt76_release_buffered_frames,
832 .get_txpower = mt76_get_txpower,
833 .channel_switch_beacon = mt7915_channel_switch_beacon,
834 .get_stats = mt7915_get_stats,
835 .get_tsf = mt7915_get_tsf,
836 .set_tsf = mt7915_set_tsf,
837 .get_survey = mt76_get_survey,
838 .get_antenna = mt76_get_antenna,
839 .set_antenna = mt7915_set_antenna,
840 .set_coverage_class = mt7915_set_coverage_class,
841 .sta_statistics = mt7915_sta_statistics,
842 #ifdef CONFIG_MAC80211_DEBUGFS
843 .sta_add_debugfs = mt7915_sta_add_debugfs,
844 #endif
845 };
846