x86/speculation: Fix redundant MDS mitigation message
[linux-2.6-block.git] / drivers / net / wireless / mediatek / mt76 / mt7615 / main.c
1 // SPDX-License-Identifier: ISC
2 /* Copyright (C) 2019 MediaTek Inc.
3  *
4  * Author: Roy Luo <royluo@google.com>
5  *         Ryder Lee <ryder.lee@mediatek.com>
6  *         Felix Fietkau <nbd@nbd.name>
7  */
8
9 #include <linux/etherdevice.h>
10 #include <linux/platform_device.h>
11 #include <linux/pci.h>
12 #include <linux/module.h>
13 #include "mt7615.h"
14
15 static int mt7615_start(struct ieee80211_hw *hw)
16 {
17         struct mt7615_dev *dev = hw->priv;
18
19         dev->mt76.survey_time = ktime_get_boottime();
20         set_bit(MT76_STATE_RUNNING, &dev->mt76.state);
21         ieee80211_queue_delayed_work(mt76_hw(dev), &dev->mt76.mac_work,
22                                      MT7615_WATCHDOG_TIME);
23
24         return 0;
25 }
26
27 static void mt7615_stop(struct ieee80211_hw *hw)
28 {
29         struct mt7615_dev *dev = hw->priv;
30
31         clear_bit(MT76_STATE_RUNNING, &dev->mt76.state);
32         cancel_delayed_work_sync(&dev->mt76.mac_work);
33 }
34
35 static int get_omac_idx(enum nl80211_iftype type, u32 mask)
36 {
37         int i;
38
39         switch (type) {
40         case NL80211_IFTYPE_AP:
41         case NL80211_IFTYPE_MESH_POINT:
42                 /* ap use hw bssid 0 and ext bssid */
43                 if (~mask & BIT(HW_BSSID_0))
44                         return HW_BSSID_0;
45
46                 for (i = EXT_BSSID_1; i < EXT_BSSID_END; i++)
47                         if (~mask & BIT(i))
48                                 return i;
49
50                 break;
51         case NL80211_IFTYPE_STATION:
52                 /* sta use hw bssid other than 0 */
53                 for (i = HW_BSSID_1; i < HW_BSSID_MAX; i++)
54                         if (~mask & BIT(i))
55                                 return i;
56
57                 break;
58         default:
59                 WARN_ON(1);
60                 break;
61         };
62
63         return -1;
64 }
65
66 static int mt7615_add_interface(struct ieee80211_hw *hw,
67                                 struct ieee80211_vif *vif)
68 {
69         struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
70         struct mt7615_dev *dev = hw->priv;
71         struct mt76_txq *mtxq;
72         int idx, ret = 0;
73
74         mutex_lock(&dev->mt76.mutex);
75
76         mvif->idx = ffs(~dev->vif_mask) - 1;
77         if (mvif->idx >= MT7615_MAX_INTERFACES) {
78                 ret = -ENOSPC;
79                 goto out;
80         }
81
82         idx = get_omac_idx(vif->type, dev->omac_mask);
83         if (idx < 0) {
84                 ret = -ENOSPC;
85                 goto out;
86         }
87         mvif->omac_idx = idx;
88
89         /* TODO: DBDC support. Use band 0 for now */
90         mvif->band_idx = 0;
91         mvif->wmm_idx = mvif->idx % MT7615_MAX_WMM_SETS;
92
93         ret = mt7615_mcu_set_dev_info(dev, vif, 1);
94         if (ret)
95                 goto out;
96
97         dev->vif_mask |= BIT(mvif->idx);
98         dev->omac_mask |= BIT(mvif->omac_idx);
99         idx = MT7615_WTBL_RESERVED - mvif->idx;
100         mvif->sta.wcid.idx = idx;
101         mvif->sta.wcid.hw_key_idx = -1;
102
103         rcu_assign_pointer(dev->mt76.wcid[idx], &mvif->sta.wcid);
104         mtxq = (struct mt76_txq *)vif->txq->drv_priv;
105         mtxq->wcid = &mvif->sta.wcid;
106         mt76_txq_init(&dev->mt76, vif->txq);
107
108 out:
109         mutex_unlock(&dev->mt76.mutex);
110
111         return ret;
112 }
113
114 static void mt7615_remove_interface(struct ieee80211_hw *hw,
115                                     struct ieee80211_vif *vif)
116 {
117         struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
118         struct mt7615_dev *dev = hw->priv;
119         int idx = mvif->sta.wcid.idx;
120
121         /* TODO: disable beacon for the bss */
122
123         mt7615_mcu_set_dev_info(dev, vif, 0);
124
125         rcu_assign_pointer(dev->mt76.wcid[idx], NULL);
126         mt76_txq_remove(&dev->mt76, vif->txq);
127
128         mutex_lock(&dev->mt76.mutex);
129         dev->vif_mask &= ~BIT(mvif->idx);
130         dev->omac_mask &= ~BIT(mvif->omac_idx);
131         mutex_unlock(&dev->mt76.mutex);
132 }
133
134 static int mt7615_set_channel(struct mt7615_dev *dev)
135 {
136         int ret;
137
138         cancel_delayed_work_sync(&dev->mt76.mac_work);
139
140         mutex_lock(&dev->mt76.mutex);
141         set_bit(MT76_RESET, &dev->mt76.state);
142
143         mt7615_dfs_check_channel(dev);
144
145         mt76_set_channel(&dev->mt76);
146
147         ret = mt7615_mcu_set_channel(dev);
148         if (ret)
149                 goto out;
150
151         ret = mt7615_dfs_init_radar_detector(dev);
152         mt7615_mac_cca_stats_reset(dev);
153         dev->mt76.survey_time = ktime_get_boottime();
154         /* TODO: add DBDC support */
155         mt76_rr(dev, MT_MIB_SDR16(0));
156
157 out:
158         clear_bit(MT76_RESET, &dev->mt76.state);
159         mutex_unlock(&dev->mt76.mutex);
160
161         mt76_txq_schedule_all(&dev->mt76);
162         ieee80211_queue_delayed_work(mt76_hw(dev), &dev->mt76.mac_work,
163                                      MT7615_WATCHDOG_TIME);
164         return ret;
165 }
166
167 static int mt7615_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
168                           struct ieee80211_vif *vif, struct ieee80211_sta *sta,
169                           struct ieee80211_key_conf *key)
170 {
171         struct mt7615_dev *dev = hw->priv;
172         struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
173         struct mt7615_sta *msta = sta ? (struct mt7615_sta *)sta->drv_priv :
174                                   &mvif->sta;
175         struct mt76_wcid *wcid = &msta->wcid;
176         int idx = key->keyidx;
177
178         /* The hardware does not support per-STA RX GTK, fallback
179          * to software mode for these.
180          */
181         if ((vif->type == NL80211_IFTYPE_ADHOC ||
182              vif->type == NL80211_IFTYPE_MESH_POINT) &&
183             (key->cipher == WLAN_CIPHER_SUITE_TKIP ||
184              key->cipher == WLAN_CIPHER_SUITE_CCMP) &&
185             !(key->flags & IEEE80211_KEY_FLAG_PAIRWISE))
186                 return -EOPNOTSUPP;
187
188         /* fall back to sw encryption for unsupported ciphers */
189         switch (key->cipher) {
190         case WLAN_CIPHER_SUITE_AES_CMAC:
191                 key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIE;
192                 break;
193         case WLAN_CIPHER_SUITE_WEP40:
194         case WLAN_CIPHER_SUITE_WEP104:
195         case WLAN_CIPHER_SUITE_TKIP:
196         case WLAN_CIPHER_SUITE_CCMP:
197         case WLAN_CIPHER_SUITE_CCMP_256:
198         case WLAN_CIPHER_SUITE_GCMP:
199         case WLAN_CIPHER_SUITE_GCMP_256:
200         case WLAN_CIPHER_SUITE_SMS4:
201                 break;
202         default:
203                 return -EOPNOTSUPP;
204         }
205
206         if (cmd == SET_KEY) {
207                 key->hw_key_idx = wcid->idx;
208                 wcid->hw_key_idx = idx;
209         } else if (idx == wcid->hw_key_idx) {
210                 wcid->hw_key_idx = -1;
211         }
212         mt76_wcid_key_setup(&dev->mt76, wcid,
213                             cmd == SET_KEY ? key : NULL);
214
215         return mt7615_mac_wtbl_set_key(dev, wcid, key, cmd);
216 }
217
218 static int mt7615_config(struct ieee80211_hw *hw, u32 changed)
219 {
220         struct mt7615_dev *dev = hw->priv;
221         int ret = 0;
222
223         if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
224                 ieee80211_stop_queues(hw);
225                 ret = mt7615_set_channel(dev);
226                 ieee80211_wake_queues(hw);
227         }
228
229         mutex_lock(&dev->mt76.mutex);
230
231         if (changed & IEEE80211_CONF_CHANGE_POWER)
232                 ret = mt7615_mcu_set_tx_power(dev);
233
234         if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
235                 if (!(hw->conf.flags & IEEE80211_CONF_MONITOR))
236                         dev->mt76.rxfilter |= MT_WF_RFCR_DROP_OTHER_UC;
237                 else
238                         dev->mt76.rxfilter &= ~MT_WF_RFCR_DROP_OTHER_UC;
239
240                 mt76_wr(dev, MT_WF_RFCR, dev->mt76.rxfilter);
241         }
242
243         mutex_unlock(&dev->mt76.mutex);
244
245         return ret;
246 }
247
248 static int
249 mt7615_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif, u16 queue,
250                const struct ieee80211_tx_queue_params *params)
251 {
252         struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
253         struct mt7615_dev *dev = hw->priv;
254
255         queue += mvif->wmm_idx * MT7615_MAX_WMM_SETS;
256
257         return mt7615_mcu_set_wmm(dev, queue, params);
258 }
259
260 static void mt7615_configure_filter(struct ieee80211_hw *hw,
261                                     unsigned int changed_flags,
262                                     unsigned int *total_flags,
263                                     u64 multicast)
264 {
265         struct mt7615_dev *dev = hw->priv;
266         u32 flags = 0;
267
268 #define MT76_FILTER(_flag, _hw) do { \
269                 flags |= *total_flags & FIF_##_flag;                    \
270                 dev->mt76.rxfilter &= ~(_hw);                           \
271                 dev->mt76.rxfilter |= !(flags & FIF_##_flag) * (_hw);   \
272         } while (0)
273
274         dev->mt76.rxfilter &= ~(MT_WF_RFCR_DROP_OTHER_BSS |
275                                 MT_WF_RFCR_DROP_OTHER_BEACON |
276                                 MT_WF_RFCR_DROP_FRAME_REPORT |
277                                 MT_WF_RFCR_DROP_PROBEREQ |
278                                 MT_WF_RFCR_DROP_MCAST_FILTERED |
279                                 MT_WF_RFCR_DROP_MCAST |
280                                 MT_WF_RFCR_DROP_BCAST |
281                                 MT_WF_RFCR_DROP_DUPLICATE |
282                                 MT_WF_RFCR_DROP_A2_BSSID |
283                                 MT_WF_RFCR_DROP_UNWANTED_CTL |
284                                 MT_WF_RFCR_DROP_STBC_MULTI);
285
286         MT76_FILTER(OTHER_BSS, MT_WF_RFCR_DROP_OTHER_TIM |
287                                MT_WF_RFCR_DROP_A3_MAC |
288                                MT_WF_RFCR_DROP_A3_BSSID);
289
290         MT76_FILTER(FCSFAIL, MT_WF_RFCR_DROP_FCSFAIL);
291
292         MT76_FILTER(CONTROL, MT_WF_RFCR_DROP_CTS |
293                              MT_WF_RFCR_DROP_RTS |
294                              MT_WF_RFCR_DROP_CTL_RSV |
295                              MT_WF_RFCR_DROP_NDPA);
296
297         *total_flags = flags;
298         mt76_wr(dev, MT_WF_RFCR, dev->mt76.rxfilter);
299 }
300
301 static void mt7615_bss_info_changed(struct ieee80211_hw *hw,
302                                     struct ieee80211_vif *vif,
303                                     struct ieee80211_bss_conf *info,
304                                     u32 changed)
305 {
306         struct mt7615_dev *dev = hw->priv;
307
308         mutex_lock(&dev->mt76.mutex);
309
310         if (changed & BSS_CHANGED_ASSOC)
311                 mt7615_mcu_set_bss_info(dev, vif, info->assoc);
312
313         /* TODO: update beacon content
314          * BSS_CHANGED_BEACON
315          */
316
317         if (changed & BSS_CHANGED_BEACON_ENABLED) {
318                 mt7615_mcu_set_bss_info(dev, vif, info->enable_beacon);
319                 mt7615_mcu_wtbl_bmc(dev, vif, info->enable_beacon);
320                 mt7615_mcu_set_sta_rec_bmc(dev, vif, info->enable_beacon);
321                 mt7615_mcu_set_bcn(dev, vif, info->enable_beacon);
322         }
323
324         mutex_unlock(&dev->mt76.mutex);
325 }
326
327 static void
328 mt7615_channel_switch_beacon(struct ieee80211_hw *hw,
329                              struct ieee80211_vif *vif,
330                              struct cfg80211_chan_def *chandef)
331 {
332         struct mt7615_dev *dev = hw->priv;
333
334         mutex_lock(&dev->mt76.mutex);
335         mt7615_mcu_set_bcn(dev, vif, true);
336         mutex_unlock(&dev->mt76.mutex);
337 }
338
339 int mt7615_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
340                    struct ieee80211_sta *sta)
341 {
342         struct mt7615_dev *dev = container_of(mdev, struct mt7615_dev, mt76);
343         struct mt7615_sta *msta = (struct mt7615_sta *)sta->drv_priv;
344         struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
345         int idx;
346
347         idx = mt76_wcid_alloc(dev->mt76.wcid_mask, MT7615_WTBL_STA - 1);
348         if (idx < 0)
349                 return -ENOSPC;
350
351         msta->vif = mvif;
352         msta->wcid.sta = 1;
353         msta->wcid.idx = idx;
354
355         mt7615_mcu_add_wtbl(dev, vif, sta);
356         mt7615_mcu_set_sta_rec(dev, vif, sta, 1);
357
358         return 0;
359 }
360
361 void mt7615_sta_assoc(struct mt76_dev *mdev, struct ieee80211_vif *vif,
362                       struct ieee80211_sta *sta)
363 {
364         struct mt7615_dev *dev = container_of(mdev, struct mt7615_dev, mt76);
365
366         if (sta->ht_cap.ht_supported)
367                 mt7615_mcu_set_ht_cap(dev, vif, sta);
368 }
369
370 void mt7615_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,
371                        struct ieee80211_sta *sta)
372 {
373         struct mt7615_dev *dev = container_of(mdev, struct mt7615_dev, mt76);
374
375         mt7615_mcu_set_sta_rec(dev, vif, sta, 0);
376         mt7615_mcu_del_wtbl(dev, sta);
377 }
378
379 static void mt7615_sta_rate_tbl_update(struct ieee80211_hw *hw,
380                                        struct ieee80211_vif *vif,
381                                        struct ieee80211_sta *sta)
382 {
383         struct mt7615_dev *dev = hw->priv;
384         struct mt7615_sta *msta = (struct mt7615_sta *)sta->drv_priv;
385         struct ieee80211_sta_rates *sta_rates = rcu_dereference(sta->rates);
386         int i;
387
388         spin_lock_bh(&dev->mt76.lock);
389         for (i = 0; i < ARRAY_SIZE(msta->rates); i++) {
390                 msta->rates[i].idx = sta_rates->rate[i].idx;
391                 msta->rates[i].count = sta_rates->rate[i].count;
392                 msta->rates[i].flags = sta_rates->rate[i].flags;
393
394                 if (msta->rates[i].idx < 0 || !msta->rates[i].count)
395                         break;
396         }
397         msta->n_rates = i;
398         mt7615_mac_set_rates(dev, msta, NULL, msta->rates);
399         msta->rate_probe = false;
400         spin_unlock_bh(&dev->mt76.lock);
401 }
402
403 static void mt7615_tx(struct ieee80211_hw *hw,
404                       struct ieee80211_tx_control *control,
405                       struct sk_buff *skb)
406 {
407         struct mt7615_dev *dev = hw->priv;
408         struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
409         struct ieee80211_vif *vif = info->control.vif;
410         struct mt76_wcid *wcid = &dev->mt76.global_wcid;
411
412         if (control->sta) {
413                 struct mt7615_sta *sta;
414
415                 sta = (struct mt7615_sta *)control->sta->drv_priv;
416                 wcid = &sta->wcid;
417         }
418
419         if (vif && !control->sta) {
420                 struct mt7615_vif *mvif;
421
422                 mvif = (struct mt7615_vif *)vif->drv_priv;
423                 wcid = &mvif->sta.wcid;
424         }
425
426         mt76_tx(&dev->mt76, control->sta, wcid, skb);
427 }
428
429 static int mt7615_set_rts_threshold(struct ieee80211_hw *hw, u32 val)
430 {
431         struct mt7615_dev *dev = hw->priv;
432
433         mutex_lock(&dev->mt76.mutex);
434         mt7615_mcu_set_rts_thresh(dev, val);
435         mutex_unlock(&dev->mt76.mutex);
436
437         return 0;
438 }
439
440 static int
441 mt7615_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
442                     struct ieee80211_ampdu_params *params)
443 {
444         enum ieee80211_ampdu_mlme_action action = params->action;
445         struct mt7615_dev *dev = hw->priv;
446         struct ieee80211_sta *sta = params->sta;
447         struct ieee80211_txq *txq = sta->txq[params->tid];
448         struct mt7615_sta *msta = (struct mt7615_sta *)sta->drv_priv;
449         u16 tid = params->tid;
450         u16 ssn = params->ssn;
451         struct mt76_txq *mtxq;
452
453         if (!txq)
454                 return -EINVAL;
455
456         mtxq = (struct mt76_txq *)txq->drv_priv;
457
458         switch (action) {
459         case IEEE80211_AMPDU_RX_START:
460                 mt76_rx_aggr_start(&dev->mt76, &msta->wcid, tid, ssn,
461                                    params->buf_size);
462                 mt7615_mcu_set_rx_ba(dev, params, 1);
463                 break;
464         case IEEE80211_AMPDU_RX_STOP:
465                 mt76_rx_aggr_stop(&dev->mt76, &msta->wcid, tid);
466                 mt7615_mcu_set_rx_ba(dev, params, 0);
467                 break;
468         case IEEE80211_AMPDU_TX_OPERATIONAL:
469                 mtxq->aggr = true;
470                 mtxq->send_bar = false;
471                 mt7615_mcu_set_tx_ba(dev, params, 1);
472                 break;
473         case IEEE80211_AMPDU_TX_STOP_FLUSH:
474         case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
475                 mtxq->aggr = false;
476                 mt7615_mcu_set_tx_ba(dev, params, 0);
477                 break;
478         case IEEE80211_AMPDU_TX_START:
479                 mtxq->agg_ssn = IEEE80211_SN_TO_SEQ(ssn);
480                 ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
481                 break;
482         case IEEE80211_AMPDU_TX_STOP_CONT:
483                 mtxq->aggr = false;
484                 mt7615_mcu_set_tx_ba(dev, params, 0);
485                 ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
486                 break;
487         }
488
489         return 0;
490 }
491
492 const struct ieee80211_ops mt7615_ops = {
493         .tx = mt7615_tx,
494         .start = mt7615_start,
495         .stop = mt7615_stop,
496         .add_interface = mt7615_add_interface,
497         .remove_interface = mt7615_remove_interface,
498         .config = mt7615_config,
499         .conf_tx = mt7615_conf_tx,
500         .configure_filter = mt7615_configure_filter,
501         .bss_info_changed = mt7615_bss_info_changed,
502         .sta_state = mt76_sta_state,
503         .set_key = mt7615_set_key,
504         .ampdu_action = mt7615_ampdu_action,
505         .set_rts_threshold = mt7615_set_rts_threshold,
506         .wake_tx_queue = mt76_wake_tx_queue,
507         .sta_rate_tbl_update = mt7615_sta_rate_tbl_update,
508         .sw_scan_start = mt76_sw_scan,
509         .sw_scan_complete = mt76_sw_scan_complete,
510         .release_buffered_frames = mt76_release_buffered_frames,
511         .get_txpower = mt76_get_txpower,
512         .channel_switch_beacon = mt7615_channel_switch_beacon,
513         .get_survey = mt76_get_survey,
514 };