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 <net/ipv6.h>
9 #include "mt7921.h"
10 #include "mcu.h"
11
12 static int
mt7921_init_he_caps(struct mt792x_phy * phy,enum nl80211_band band,struct ieee80211_sband_iftype_data * data)13 mt7921_init_he_caps(struct mt792x_phy *phy, enum nl80211_band band,
14 struct ieee80211_sband_iftype_data *data)
15 {
16 int i, idx = 0;
17 int nss = hweight8(phy->mt76->chainmask);
18 u16 mcs_map = 0;
19
20 for (i = 0; i < 8; i++) {
21 if (i < nss)
22 mcs_map |= (IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2));
23 else
24 mcs_map |= (IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2));
25 }
26
27 for (i = 0; i < NUM_NL80211_IFTYPES; i++) {
28 struct ieee80211_sta_he_cap *he_cap = &data[idx].he_cap;
29 struct ieee80211_he_cap_elem *he_cap_elem =
30 &he_cap->he_cap_elem;
31 struct ieee80211_he_mcs_nss_supp *he_mcs =
32 &he_cap->he_mcs_nss_supp;
33
34 switch (i) {
35 case NL80211_IFTYPE_STATION:
36 case NL80211_IFTYPE_AP:
37 break;
38 default:
39 continue;
40 }
41
42 data[idx].types_mask = BIT(i);
43 he_cap->has_he = true;
44
45 he_cap_elem->mac_cap_info[0] =
46 IEEE80211_HE_MAC_CAP0_HTC_HE;
47 he_cap_elem->mac_cap_info[3] =
48 IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
49 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3;
50 he_cap_elem->mac_cap_info[4] =
51 IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU;
52
53 if (band == NL80211_BAND_2GHZ)
54 he_cap_elem->phy_cap_info[0] =
55 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G;
56 else
57 he_cap_elem->phy_cap_info[0] =
58 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G;
59
60 he_cap_elem->phy_cap_info[1] =
61 IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD;
62 he_cap_elem->phy_cap_info[2] =
63 IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US |
64 IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ |
65 IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ |
66 IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
67 IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO;
68
69 switch (i) {
70 case NL80211_IFTYPE_AP:
71 he_cap_elem->mac_cap_info[2] |=
72 IEEE80211_HE_MAC_CAP2_BSR;
73 he_cap_elem->mac_cap_info[4] |=
74 IEEE80211_HE_MAC_CAP4_BQR;
75 he_cap_elem->mac_cap_info[5] |=
76 IEEE80211_HE_MAC_CAP5_OM_CTRL_UL_MU_DATA_DIS_RX;
77 he_cap_elem->phy_cap_info[3] |=
78 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_QPSK |
79 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_QPSK;
80 he_cap_elem->phy_cap_info[6] |=
81 IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE |
82 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT;
83 he_cap_elem->phy_cap_info[9] |=
84 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU |
85 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU;
86 break;
87 case NL80211_IFTYPE_STATION:
88 he_cap_elem->mac_cap_info[1] |=
89 IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US;
90
91 if (band == NL80211_BAND_2GHZ)
92 he_cap_elem->phy_cap_info[0] |=
93 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_2G;
94 else
95 he_cap_elem->phy_cap_info[0] |=
96 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_5G;
97
98 he_cap_elem->phy_cap_info[1] |=
99 IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
100 IEEE80211_HE_PHY_CAP1_HE_LTF_AND_GI_FOR_HE_PPDUS_0_8US;
101 he_cap_elem->phy_cap_info[3] |=
102 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_QPSK |
103 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_QPSK;
104 he_cap_elem->phy_cap_info[4] |=
105 IEEE80211_HE_PHY_CAP4_SU_BEAMFORMEE |
106 IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_4;
107 he_cap_elem->phy_cap_info[5] |=
108 IEEE80211_HE_PHY_CAP5_NG16_SU_FEEDBACK |
109 IEEE80211_HE_PHY_CAP5_NG16_MU_FEEDBACK;
110 he_cap_elem->phy_cap_info[6] |=
111 IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_42_SU |
112 IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU |
113 IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB |
114 IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE |
115 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT;
116 he_cap_elem->phy_cap_info[7] |=
117 IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP |
118 IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI;
119 he_cap_elem->phy_cap_info[8] |=
120 IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G |
121 IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_484;
122 he_cap_elem->phy_cap_info[9] |=
123 IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM |
124 IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK |
125 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU |
126 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU |
127 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB |
128 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB;
129
130 if (is_mt7922(phy->mt76->dev)) {
131 he_cap_elem->phy_cap_info[0] |=
132 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G;
133 he_cap_elem->phy_cap_info[8] |=
134 IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU |
135 IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU;
136 }
137 break;
138 }
139
140 he_mcs->rx_mcs_80 = cpu_to_le16(mcs_map);
141 he_mcs->tx_mcs_80 = cpu_to_le16(mcs_map);
142 if (is_mt7922(phy->mt76->dev)) {
143 he_mcs->rx_mcs_160 = cpu_to_le16(mcs_map);
144 he_mcs->tx_mcs_160 = cpu_to_le16(mcs_map);
145 }
146
147 memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres));
148 if (he_cap_elem->phy_cap_info[6] &
149 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) {
150 mt76_connac_gen_ppe_thresh(he_cap->ppe_thres, nss, band);
151 } else {
152 he_cap_elem->phy_cap_info[9] |=
153 u8_encode_bits(IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_16US,
154 IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_MASK);
155 }
156
157 if (band == NL80211_BAND_6GHZ) {
158 struct ieee80211_supported_band *sband =
159 &phy->mt76->sband_5g.sband;
160 struct ieee80211_sta_vht_cap *vht_cap = &sband->vht_cap;
161 struct ieee80211_sta_ht_cap *ht_cap = &sband->ht_cap;
162 u32 exp;
163 u16 cap;
164
165 cap = u16_encode_bits(ht_cap->ampdu_density,
166 IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START);
167 exp = u32_get_bits(vht_cap->cap,
168 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK);
169 cap |= u16_encode_bits(exp,
170 IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
171 exp = u32_get_bits(vht_cap->cap,
172 IEEE80211_VHT_CAP_MAX_MPDU_MASK);
173 cap |= u16_encode_bits(exp,
174 IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN);
175 if (vht_cap->cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN)
176 cap |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS;
177 if (vht_cap->cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN)
178 cap |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS;
179
180 data[idx].he_6ghz_capa.capa = cpu_to_le16(cap);
181 }
182 idx++;
183 }
184
185 return idx;
186 }
187
mt7921_set_stream_he_caps(struct mt792x_phy * phy)188 void mt7921_set_stream_he_caps(struct mt792x_phy *phy)
189 {
190 struct ieee80211_sband_iftype_data *data;
191 struct ieee80211_supported_band *band;
192 int n;
193
194 if (phy->mt76->cap.has_2ghz) {
195 data = phy->iftype[NL80211_BAND_2GHZ];
196 n = mt7921_init_he_caps(phy, NL80211_BAND_2GHZ, data);
197
198 band = &phy->mt76->sband_2g.sband;
199 _ieee80211_set_sband_iftype_data(band, data, n);
200 }
201
202 if (phy->mt76->cap.has_5ghz) {
203 data = phy->iftype[NL80211_BAND_5GHZ];
204 n = mt7921_init_he_caps(phy, NL80211_BAND_5GHZ, data);
205
206 band = &phy->mt76->sband_5g.sband;
207 _ieee80211_set_sband_iftype_data(band, data, n);
208
209 if (phy->mt76->cap.has_6ghz) {
210 data = phy->iftype[NL80211_BAND_6GHZ];
211 n = mt7921_init_he_caps(phy, NL80211_BAND_6GHZ, data);
212
213 band = &phy->mt76->sband_6g.sband;
214 _ieee80211_set_sband_iftype_data(band, data, n);
215 }
216 }
217 }
218
__mt7921_start(struct mt792x_phy * phy)219 int __mt7921_start(struct mt792x_phy *phy)
220 {
221 struct mt76_phy *mphy = phy->mt76;
222 int err;
223
224 err = mt76_connac_mcu_set_mac_enable(mphy->dev, 0, true, false);
225 if (err)
226 return err;
227
228 err = mt76_connac_mcu_set_channel_domain(mphy);
229 if (err)
230 return err;
231
232 err = mt7921_mcu_set_chan_info(phy, MCU_EXT_CMD(SET_RX_PATH));
233 if (err)
234 return err;
235
236 err = mt7921_set_tx_sar_pwr(mphy->hw, NULL);
237 if (err)
238 return err;
239
240 mt792x_mac_reset_counters(phy);
241 set_bit(MT76_STATE_RUNNING, &mphy->state);
242
243 ieee80211_queue_delayed_work(mphy->hw, &mphy->mac_work,
244 MT792x_WATCHDOG_TIME);
245 if (mt76_is_mmio(mphy->dev)) {
246 err = mt7921_mcu_radio_led_ctrl(phy->dev, EXT_CMD_RADIO_LED_CTRL_ENABLE);
247 if (err)
248 return err;
249
250 err = mt7921_mcu_radio_led_ctrl(phy->dev, EXT_CMD_RADIO_ON_LED);
251 if (err)
252 return err;
253 }
254
255 if (phy->chip_cap & MT792x_CHIP_CAP_WF_RF_PIN_CTRL_EVT_EN) {
256 mt7921_mcu_wf_rf_pin_ctrl(phy, WF_RF_PIN_INIT);
257 wiphy_rfkill_start_polling(mphy->hw->wiphy);
258 }
259
260 return 0;
261 }
262 EXPORT_SYMBOL_GPL(__mt7921_start);
263
mt7921_start(struct ieee80211_hw * hw)264 static int mt7921_start(struct ieee80211_hw *hw)
265 {
266 struct mt792x_phy *phy = mt792x_hw_phy(hw);
267 int err;
268
269 mt792x_mutex_acquire(phy->dev);
270 err = __mt7921_start(phy);
271 mt792x_mutex_release(phy->dev);
272
273 return err;
274 }
275
mt7921_stop(struct ieee80211_hw * hw,bool suspend)276 static void mt7921_stop(struct ieee80211_hw *hw, bool suspend)
277 {
278 struct mt792x_dev *dev = mt792x_hw_dev(hw);
279 int err = 0;
280
281 if (mt76_is_mmio(&dev->mt76)) {
282 mt792x_mutex_acquire(dev);
283 err = mt7921_mcu_radio_led_ctrl(dev, EXT_CMD_RADIO_OFF_LED);
284 mt792x_mutex_release(dev);
285 if (err)
286 return;
287 }
288
289 mt792x_stop(hw, false);
290 }
291
292 static int
mt7921_add_interface(struct ieee80211_hw * hw,struct ieee80211_vif * vif)293 mt7921_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
294 {
295 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
296 struct mt792x_dev *dev = mt792x_hw_dev(hw);
297 struct mt792x_phy *phy = mt792x_hw_phy(hw);
298 struct mt76_txq *mtxq;
299 int idx, ret = 0;
300
301 mt792x_mutex_acquire(dev);
302
303 mvif->bss_conf.mt76.idx = __ffs64(~dev->mt76.vif_mask);
304 if (mvif->bss_conf.mt76.idx >= MT792x_MAX_INTERFACES) {
305 ret = -ENOSPC;
306 goto out;
307 }
308
309 mvif->bss_conf.mt76.omac_idx = mvif->bss_conf.mt76.idx;
310 mvif->phy = phy;
311 mvif->bss_conf.vif = mvif;
312 mvif->bss_conf.mt76.band_idx = 0;
313 mvif->bss_conf.mt76.wmm_idx = mvif->bss_conf.mt76.idx % MT76_CONNAC_MAX_WMM_SETS;
314
315 ret = mt76_connac_mcu_uni_add_dev(&dev->mphy, &vif->bss_conf,
316 &mvif->bss_conf.mt76,
317 &mvif->sta.deflink.wcid, true);
318 if (ret)
319 goto out;
320
321 dev->mt76.vif_mask |= BIT_ULL(mvif->bss_conf.mt76.idx);
322 phy->omac_mask |= BIT_ULL(mvif->bss_conf.mt76.omac_idx);
323
324 idx = MT792x_WTBL_RESERVED - mvif->bss_conf.mt76.idx;
325
326 INIT_LIST_HEAD(&mvif->sta.deflink.wcid.poll_list);
327 mvif->sta.deflink.wcid.idx = idx;
328 mvif->sta.deflink.wcid.tx_info |= MT_WCID_TX_INFO_SET;
329 mt76_wcid_init(&mvif->sta.deflink.wcid, mvif->bss_conf.mt76.band_idx);
330
331 mt7921_mac_wtbl_update(dev, idx,
332 MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
333
334 ewma_rssi_init(&mvif->bss_conf.rssi);
335
336 rcu_assign_pointer(dev->mt76.wcid[idx], &mvif->sta.deflink.wcid);
337 if (vif->txq) {
338 mtxq = (struct mt76_txq *)vif->txq->drv_priv;
339 mtxq->wcid = idx;
340 }
341
342 vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER;
343 if (phy->chip_cap & MT792x_CHIP_CAP_RSSI_NOTIFY_EVT_EN)
344 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_CQM_RSSI;
345
346 INIT_WORK(&mvif->csa_work, mt7921_csa_work);
347 timer_setup(&mvif->csa_timer, mt792x_csa_timer, 0);
348 out:
349 mt792x_mutex_release(dev);
350
351 return ret;
352 }
353
mt7921_roc_iter(void * priv,u8 * mac,struct ieee80211_vif * vif)354 static void mt7921_roc_iter(void *priv, u8 *mac,
355 struct ieee80211_vif *vif)
356 {
357 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
358 struct mt792x_phy *phy = priv;
359
360 mt7921_mcu_abort_roc(phy, mvif, phy->roc_token_id);
361 }
362
mt7921_roc_abort_sync(struct mt792x_dev * dev)363 void mt7921_roc_abort_sync(struct mt792x_dev *dev)
364 {
365 struct mt792x_phy *phy = &dev->phy;
366
367 del_timer_sync(&phy->roc_timer);
368 cancel_work_sync(&phy->roc_work);
369 if (test_and_clear_bit(MT76_STATE_ROC, &phy->mt76->state))
370 ieee80211_iterate_interfaces(mt76_hw(dev),
371 IEEE80211_IFACE_ITER_RESUME_ALL,
372 mt7921_roc_iter, (void *)phy);
373 }
374 EXPORT_SYMBOL_GPL(mt7921_roc_abort_sync);
375
mt7921_roc_work(struct work_struct * work)376 void mt7921_roc_work(struct work_struct *work)
377 {
378 struct mt792x_phy *phy;
379
380 phy = (struct mt792x_phy *)container_of(work, struct mt792x_phy,
381 roc_work);
382
383 if (!test_and_clear_bit(MT76_STATE_ROC, &phy->mt76->state))
384 return;
385
386 mt792x_mutex_acquire(phy->dev);
387 ieee80211_iterate_active_interfaces(phy->mt76->hw,
388 IEEE80211_IFACE_ITER_RESUME_ALL,
389 mt7921_roc_iter, phy);
390 mt792x_mutex_release(phy->dev);
391 ieee80211_remain_on_channel_expired(phy->mt76->hw);
392 }
393
mt7921_abort_roc(struct mt792x_phy * phy,struct mt792x_vif * vif)394 static int mt7921_abort_roc(struct mt792x_phy *phy, struct mt792x_vif *vif)
395 {
396 int err = 0;
397
398 del_timer_sync(&phy->roc_timer);
399 cancel_work_sync(&phy->roc_work);
400
401 mt792x_mutex_acquire(phy->dev);
402 if (test_and_clear_bit(MT76_STATE_ROC, &phy->mt76->state))
403 err = mt7921_mcu_abort_roc(phy, vif, phy->roc_token_id);
404 mt792x_mutex_release(phy->dev);
405
406 return err;
407 }
408
mt7921_set_roc(struct mt792x_phy * phy,struct mt792x_vif * vif,struct ieee80211_channel * chan,int duration,enum mt7921_roc_req type)409 static int mt7921_set_roc(struct mt792x_phy *phy,
410 struct mt792x_vif *vif,
411 struct ieee80211_channel *chan,
412 int duration,
413 enum mt7921_roc_req type)
414 {
415 int err;
416
417 if (test_and_set_bit(MT76_STATE_ROC, &phy->mt76->state))
418 return -EBUSY;
419
420 phy->roc_grant = false;
421
422 err = mt7921_mcu_set_roc(phy, vif, chan, duration, type,
423 ++phy->roc_token_id);
424 if (err < 0) {
425 clear_bit(MT76_STATE_ROC, &phy->mt76->state);
426 goto out;
427 }
428
429 if (!wait_event_timeout(phy->roc_wait, phy->roc_grant, HZ)) {
430 mt7921_mcu_abort_roc(phy, vif, phy->roc_token_id);
431 clear_bit(MT76_STATE_ROC, &phy->mt76->state);
432 err = -ETIMEDOUT;
433 }
434
435 out:
436 return err;
437 }
438
mt7921_remain_on_channel(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_channel * chan,int duration,enum ieee80211_roc_type type)439 static int mt7921_remain_on_channel(struct ieee80211_hw *hw,
440 struct ieee80211_vif *vif,
441 struct ieee80211_channel *chan,
442 int duration,
443 enum ieee80211_roc_type type)
444 {
445 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
446 struct mt792x_phy *phy = mt792x_hw_phy(hw);
447 int err;
448
449 mt792x_mutex_acquire(phy->dev);
450 err = mt7921_set_roc(phy, mvif, chan, duration, MT7921_ROC_REQ_ROC);
451 mt792x_mutex_release(phy->dev);
452
453 return err;
454 }
455
mt7921_cancel_remain_on_channel(struct ieee80211_hw * hw,struct ieee80211_vif * vif)456 static int mt7921_cancel_remain_on_channel(struct ieee80211_hw *hw,
457 struct ieee80211_vif *vif)
458 {
459 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
460 struct mt792x_phy *phy = mt792x_hw_phy(hw);
461
462 return mt7921_abort_roc(phy, mvif);
463 }
464
mt7921_set_channel(struct mt76_phy * mphy)465 int mt7921_set_channel(struct mt76_phy *mphy)
466 {
467 struct mt792x_phy *phy = mphy->priv;
468 struct mt792x_dev *dev = phy->dev;
469 int ret;
470
471 mt76_connac_pm_wake(mphy, &dev->pm);
472 ret = mt7921_mcu_set_chan_info(phy, MCU_EXT_CMD(CHANNEL_SWITCH));
473 if (ret)
474 goto out;
475
476 mt792x_mac_set_timeing(phy);
477 mt792x_mac_reset_counters(phy);
478 phy->noise = 0;
479
480 out:
481 mt76_connac_power_save_sched(mphy, &dev->pm);
482
483 ieee80211_queue_delayed_work(mphy->hw, &mphy->mac_work,
484 MT792x_WATCHDOG_TIME);
485
486 return ret;
487 }
488 EXPORT_SYMBOL_GPL(mt7921_set_channel);
489
mt7921_set_key(struct ieee80211_hw * hw,enum set_key_cmd cmd,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct ieee80211_key_conf * key)490 static int mt7921_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
491 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
492 struct ieee80211_key_conf *key)
493 {
494 struct mt792x_dev *dev = mt792x_hw_dev(hw);
495 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
496 struct mt792x_sta *msta = sta ? (struct mt792x_sta *)sta->drv_priv :
497 &mvif->sta;
498 struct mt76_wcid *wcid = &msta->deflink.wcid;
499 u8 *wcid_keyidx = &wcid->hw_key_idx;
500 int idx = key->keyidx, err = 0;
501
502 /* The hardware does not support per-STA RX GTK, fallback
503 * to software mode for these.
504 */
505 if ((vif->type == NL80211_IFTYPE_ADHOC ||
506 vif->type == NL80211_IFTYPE_MESH_POINT) &&
507 (key->cipher == WLAN_CIPHER_SUITE_TKIP ||
508 key->cipher == WLAN_CIPHER_SUITE_CCMP) &&
509 !(key->flags & IEEE80211_KEY_FLAG_PAIRWISE))
510 return -EOPNOTSUPP;
511
512 /* fall back to sw encryption for unsupported ciphers */
513 switch (key->cipher) {
514 case WLAN_CIPHER_SUITE_AES_CMAC:
515 key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIE;
516 wcid_keyidx = &wcid->hw_key_idx2;
517 break;
518 case WLAN_CIPHER_SUITE_WEP40:
519 case WLAN_CIPHER_SUITE_WEP104:
520 if (!mvif->wep_sta)
521 return -EOPNOTSUPP;
522 break;
523 case WLAN_CIPHER_SUITE_TKIP:
524 case WLAN_CIPHER_SUITE_CCMP:
525 case WLAN_CIPHER_SUITE_CCMP_256:
526 case WLAN_CIPHER_SUITE_GCMP:
527 case WLAN_CIPHER_SUITE_GCMP_256:
528 case WLAN_CIPHER_SUITE_SMS4:
529 break;
530 default:
531 return -EOPNOTSUPP;
532 }
533
534 mt792x_mutex_acquire(dev);
535
536 if (cmd == SET_KEY) {
537 *wcid_keyidx = idx;
538 } else {
539 if (idx == *wcid_keyidx)
540 *wcid_keyidx = -1;
541
542 /* For security issue we don't trigger the key deletion when
543 * reassociating. But we should trigger the deletion process
544 * to avoid using incorrect cipher after disconnection,
545 */
546 if (vif->type != NL80211_IFTYPE_STATION || vif->cfg.assoc)
547 goto out;
548 }
549
550 mt76_wcid_key_setup(&dev->mt76, wcid, key);
551 err = mt76_connac_mcu_add_key(&dev->mt76, vif, &msta->deflink.bip,
552 key, MCU_UNI_CMD(STA_REC_UPDATE),
553 &msta->deflink.wcid, cmd);
554 if (err)
555 goto out;
556
557 if (key->cipher == WLAN_CIPHER_SUITE_WEP104 ||
558 key->cipher == WLAN_CIPHER_SUITE_WEP40)
559 err = mt76_connac_mcu_add_key(&dev->mt76, vif,
560 &mvif->wep_sta->deflink.bip,
561 key, MCU_UNI_CMD(STA_REC_UPDATE),
562 &mvif->wep_sta->deflink.wcid, cmd);
563 out:
564 mt792x_mutex_release(dev);
565
566 return err;
567 }
568
569 static void
mt7921_pm_interface_iter(void * priv,u8 * mac,struct ieee80211_vif * vif)570 mt7921_pm_interface_iter(void *priv, u8 *mac, struct ieee80211_vif *vif)
571 {
572 struct mt792x_dev *dev = priv;
573 struct ieee80211_hw *hw = mt76_hw(dev);
574 bool pm_enable = dev->pm.enable;
575 int err;
576
577 err = mt7921_mcu_set_beacon_filter(dev, vif, pm_enable);
578 if (err < 0)
579 return;
580
581 if (pm_enable) {
582 vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER;
583 ieee80211_hw_set(hw, CONNECTION_MONITOR);
584 } else {
585 vif->driver_flags &= ~IEEE80211_VIF_BEACON_FILTER;
586 __clear_bit(IEEE80211_HW_CONNECTION_MONITOR, hw->flags);
587 }
588 }
589
590 static void
mt7921_sniffer_interface_iter(void * priv,u8 * mac,struct ieee80211_vif * vif)591 mt7921_sniffer_interface_iter(void *priv, u8 *mac, struct ieee80211_vif *vif)
592 {
593 struct mt792x_dev *dev = priv;
594 struct ieee80211_hw *hw = mt76_hw(dev);
595 struct mt76_connac_pm *pm = &dev->pm;
596 bool monitor = !!(hw->conf.flags & IEEE80211_CONF_MONITOR);
597
598 mt7921_mcu_set_sniffer(dev, vif, monitor);
599 pm->enable = pm->enable_user && !monitor;
600 pm->ds_enable = pm->ds_enable_user && !monitor;
601
602 mt76_connac_mcu_set_deep_sleep(&dev->mt76, pm->ds_enable);
603
604 if (monitor)
605 mt7921_mcu_set_beacon_filter(dev, vif, false);
606 }
607
mt7921_set_runtime_pm(struct mt792x_dev * dev)608 void mt7921_set_runtime_pm(struct mt792x_dev *dev)
609 {
610 struct ieee80211_hw *hw = mt76_hw(dev);
611 struct mt76_connac_pm *pm = &dev->pm;
612 bool monitor = !!(hw->conf.flags & IEEE80211_CONF_MONITOR);
613
614 pm->enable = pm->enable_user && !monitor;
615 ieee80211_iterate_active_interfaces(hw,
616 IEEE80211_IFACE_ITER_RESUME_ALL,
617 mt7921_pm_interface_iter, dev);
618 pm->ds_enable = pm->ds_enable_user && !monitor;
619 mt76_connac_mcu_set_deep_sleep(&dev->mt76, pm->ds_enable);
620 }
621
mt7921_config(struct ieee80211_hw * hw,u32 changed)622 static int mt7921_config(struct ieee80211_hw *hw, u32 changed)
623 {
624 struct mt792x_dev *dev = mt792x_hw_dev(hw);
625 struct mt792x_phy *phy = mt792x_hw_phy(hw);
626 int ret = 0;
627
628 if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
629 ret = mt76_update_channel(phy->mt76);
630 if (ret)
631 return ret;
632 }
633
634 mt792x_mutex_acquire(dev);
635
636 if (changed & IEEE80211_CONF_CHANGE_POWER) {
637 ret = mt7921_set_tx_sar_pwr(hw, NULL);
638 if (ret)
639 goto out;
640 }
641
642 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
643 ieee80211_iterate_active_interfaces(hw,
644 IEEE80211_IFACE_ITER_RESUME_ALL,
645 mt7921_sniffer_interface_iter, dev);
646 }
647
648 out:
649 mt792x_mutex_release(dev);
650
651 return ret;
652 }
653
mt7921_configure_filter(struct ieee80211_hw * hw,unsigned int changed_flags,unsigned int * total_flags,u64 multicast)654 static void mt7921_configure_filter(struct ieee80211_hw *hw,
655 unsigned int changed_flags,
656 unsigned int *total_flags,
657 u64 multicast)
658 {
659 #define MT7921_FILTER_FCSFAIL BIT(2)
660 #define MT7921_FILTER_CONTROL BIT(5)
661 #define MT7921_FILTER_OTHER_BSS BIT(6)
662 #define MT7921_FILTER_ENABLE BIT(31)
663
664 struct mt792x_dev *dev = mt792x_hw_dev(hw);
665 u32 flags = MT7921_FILTER_ENABLE;
666
667 #define MT7921_FILTER(_fif, _type) do { \
668 if (*total_flags & (_fif)) \
669 flags |= MT7921_FILTER_##_type; \
670 } while (0)
671
672 MT7921_FILTER(FIF_FCSFAIL, FCSFAIL);
673 MT7921_FILTER(FIF_CONTROL, CONTROL);
674 MT7921_FILTER(FIF_OTHER_BSS, OTHER_BSS);
675
676 mt792x_mutex_acquire(dev);
677 mt7921_mcu_set_rxfilter(dev, flags, 0, 0);
678 mt792x_mutex_release(dev);
679
680 *total_flags &= (FIF_OTHER_BSS | FIF_FCSFAIL | FIF_CONTROL);
681 }
682
mt7921_bss_info_changed(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_bss_conf * info,u64 changed)683 static void mt7921_bss_info_changed(struct ieee80211_hw *hw,
684 struct ieee80211_vif *vif,
685 struct ieee80211_bss_conf *info,
686 u64 changed)
687 {
688 struct mt792x_phy *phy = mt792x_hw_phy(hw);
689 struct mt792x_dev *dev = mt792x_hw_dev(hw);
690
691 mt792x_mutex_acquire(dev);
692
693 if (changed & BSS_CHANGED_ERP_SLOT) {
694 int slottime = info->use_short_slot ? 9 : 20;
695
696 if (slottime != phy->slottime) {
697 phy->slottime = slottime;
698 mt792x_mac_set_timeing(phy);
699 }
700 }
701
702 if (changed & (BSS_CHANGED_BEACON |
703 BSS_CHANGED_BEACON_ENABLED))
704 mt7921_mcu_uni_add_beacon_offload(dev, hw, vif,
705 info->enable_beacon);
706
707 /* ensure that enable txcmd_mode after bss_info */
708 if (changed & (BSS_CHANGED_QOS | BSS_CHANGED_BEACON_ENABLED))
709 mt7921_mcu_set_tx(dev, vif);
710
711 if (changed & BSS_CHANGED_PS)
712 mt7921_mcu_uni_bss_ps(dev, vif);
713
714 if (changed & BSS_CHANGED_CQM)
715 mt7921_mcu_set_rssimonitor(dev, vif);
716
717 if (changed & BSS_CHANGED_ASSOC) {
718 mt7921_mcu_sta_update(dev, NULL, vif, true,
719 MT76_STA_INFO_STATE_ASSOC);
720 mt7921_mcu_set_beacon_filter(dev, vif, vif->cfg.assoc);
721 }
722
723 if (changed & BSS_CHANGED_ARP_FILTER) {
724 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
725
726 mt76_connac_mcu_update_arp_filter(&dev->mt76, &mvif->bss_conf.mt76,
727 info);
728 }
729
730 mt792x_mutex_release(dev);
731 }
732
733 static void
mt7921_calc_vif_num(void * priv,u8 * mac,struct ieee80211_vif * vif)734 mt7921_calc_vif_num(void *priv, u8 *mac, struct ieee80211_vif *vif)
735 {
736 u32 *num = priv;
737
738 if (!priv)
739 return;
740
741 switch (vif->type) {
742 case NL80211_IFTYPE_STATION:
743 case NL80211_IFTYPE_P2P_CLIENT:
744 case NL80211_IFTYPE_AP:
745 case NL80211_IFTYPE_P2P_GO:
746 *num += 1;
747 break;
748 default:
749 break;
750 }
751 }
752
753 static void
mt7921_regd_set_6ghz_power_type(struct ieee80211_vif * vif,bool is_add)754 mt7921_regd_set_6ghz_power_type(struct ieee80211_vif *vif, bool is_add)
755 {
756 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
757 struct mt792x_phy *phy = mvif->phy;
758 struct mt792x_dev *dev = phy->dev;
759 u32 valid_vif_num = 0;
760
761 ieee80211_iterate_active_interfaces(mt76_hw(dev),
762 IEEE80211_IFACE_ITER_RESUME_ALL,
763 mt7921_calc_vif_num, &valid_vif_num);
764
765 if (valid_vif_num > 1) {
766 phy->power_type = MT_AP_DEFAULT;
767 goto out;
768 }
769
770 if (!is_add)
771 vif->bss_conf.power_type = IEEE80211_REG_UNSET_AP;
772
773 switch (vif->bss_conf.power_type) {
774 case IEEE80211_REG_SP_AP:
775 phy->power_type = MT_AP_SP;
776 break;
777 case IEEE80211_REG_VLP_AP:
778 phy->power_type = MT_AP_VLP;
779 break;
780 case IEEE80211_REG_LPI_AP:
781 phy->power_type = MT_AP_LPI;
782 break;
783 case IEEE80211_REG_UNSET_AP:
784 phy->power_type = MT_AP_UNSET;
785 break;
786 default:
787 phy->power_type = MT_AP_DEFAULT;
788 break;
789 }
790
791 out:
792 mt7921_mcu_set_clc(dev, dev->mt76.alpha2, dev->country_ie_env);
793 }
794
mt7921_mac_sta_add(struct mt76_dev * mdev,struct ieee80211_vif * vif,struct ieee80211_sta * sta)795 int mt7921_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
796 struct ieee80211_sta *sta)
797 {
798 struct mt792x_dev *dev = container_of(mdev, struct mt792x_dev, mt76);
799 struct mt792x_sta *msta = (struct mt792x_sta *)sta->drv_priv;
800 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
801 int ret, idx;
802
803 idx = mt76_wcid_alloc(dev->mt76.wcid_mask, MT792x_WTBL_STA - 1);
804 if (idx < 0)
805 return -ENOSPC;
806
807 INIT_LIST_HEAD(&msta->deflink.wcid.poll_list);
808 msta->vif = mvif;
809 msta->deflink.wcid.sta = 1;
810 msta->deflink.wcid.idx = idx;
811 msta->deflink.wcid.phy_idx = mvif->bss_conf.mt76.band_idx;
812 msta->deflink.wcid.tx_info |= MT_WCID_TX_INFO_SET;
813 msta->deflink.last_txs = jiffies;
814 msta->deflink.sta = msta;
815
816 ret = mt76_connac_pm_wake(&dev->mphy, &dev->pm);
817 if (ret)
818 return ret;
819
820 if (vif->type == NL80211_IFTYPE_STATION)
821 mvif->wep_sta = msta;
822
823 mt7921_mac_wtbl_update(dev, idx,
824 MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
825
826 ret = mt7921_mcu_sta_update(dev, sta, vif, true,
827 MT76_STA_INFO_STATE_NONE);
828 if (ret)
829 return ret;
830
831 mt7921_regd_set_6ghz_power_type(vif, true);
832
833 mt76_connac_power_save_sched(&dev->mphy, &dev->pm);
834
835 return 0;
836 }
837 EXPORT_SYMBOL_GPL(mt7921_mac_sta_add);
838
mt7921_mac_sta_event(struct mt76_dev * mdev,struct ieee80211_vif * vif,struct ieee80211_sta * sta,enum mt76_sta_event ev)839 int mt7921_mac_sta_event(struct mt76_dev *mdev, struct ieee80211_vif *vif,
840 struct ieee80211_sta *sta, enum mt76_sta_event ev)
841 {
842 struct mt792x_dev *dev = container_of(mdev, struct mt792x_dev, mt76);
843 struct mt792x_sta *msta = (struct mt792x_sta *)sta->drv_priv;
844 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
845
846 if (ev != MT76_STA_EVENT_ASSOC)
847 return 0;
848
849 mt792x_mutex_acquire(dev);
850
851 if (vif->type == NL80211_IFTYPE_STATION && !sta->tdls)
852 mt76_connac_mcu_uni_add_bss(&dev->mphy, vif, &mvif->sta.deflink.wcid,
853 true, mvif->bss_conf.mt76.ctx);
854
855 ewma_avg_signal_init(&msta->deflink.avg_ack_signal);
856
857 mt7921_mac_wtbl_update(dev, msta->deflink.wcid.idx,
858 MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
859 memset(msta->deflink.airtime_ac, 0, sizeof(msta->deflink.airtime_ac));
860
861 mt7921_mcu_sta_update(dev, sta, vif, true, MT76_STA_INFO_STATE_ASSOC);
862
863 mt792x_mutex_release(dev);
864
865 return 0;
866 }
867 EXPORT_SYMBOL_GPL(mt7921_mac_sta_event);
868
mt7921_mac_sta_remove(struct mt76_dev * mdev,struct ieee80211_vif * vif,struct ieee80211_sta * sta)869 void mt7921_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,
870 struct ieee80211_sta *sta)
871 {
872 struct mt792x_dev *dev = container_of(mdev, struct mt792x_dev, mt76);
873 struct mt792x_sta *msta = (struct mt792x_sta *)sta->drv_priv;
874
875 mt7921_roc_abort_sync(dev);
876 mt76_connac_free_pending_tx_skbs(&dev->pm, &msta->deflink.wcid);
877 mt76_connac_pm_wake(&dev->mphy, &dev->pm);
878
879 mt7921_mcu_sta_update(dev, sta, vif, false, MT76_STA_INFO_STATE_NONE);
880 mt7921_mac_wtbl_update(dev, msta->deflink.wcid.idx,
881 MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
882
883 if (vif->type == NL80211_IFTYPE_STATION) {
884 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
885
886 mvif->wep_sta = NULL;
887 ewma_rssi_init(&mvif->bss_conf.rssi);
888 if (!sta->tdls)
889 mt76_connac_mcu_uni_add_bss(&dev->mphy, vif,
890 &mvif->sta.deflink.wcid, false,
891 mvif->bss_conf.mt76.ctx);
892 }
893
894 spin_lock_bh(&dev->mt76.sta_poll_lock);
895 if (!list_empty(&msta->deflink.wcid.poll_list))
896 list_del_init(&msta->deflink.wcid.poll_list);
897 spin_unlock_bh(&dev->mt76.sta_poll_lock);
898
899 mt7921_regd_set_6ghz_power_type(vif, false);
900
901 mt76_connac_power_save_sched(&dev->mphy, &dev->pm);
902 }
903 EXPORT_SYMBOL_GPL(mt7921_mac_sta_remove);
904
mt7921_set_rts_threshold(struct ieee80211_hw * hw,u32 val)905 static int mt7921_set_rts_threshold(struct ieee80211_hw *hw, u32 val)
906 {
907 struct mt792x_dev *dev = mt792x_hw_dev(hw);
908
909 mt792x_mutex_acquire(dev);
910 mt76_connac_mcu_set_rts_thresh(&dev->mt76, val, 0);
911 mt792x_mutex_release(dev);
912
913 return 0;
914 }
915
916 static int
mt7921_ampdu_action(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_ampdu_params * params)917 mt7921_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
918 struct ieee80211_ampdu_params *params)
919 {
920 enum ieee80211_ampdu_mlme_action action = params->action;
921 struct mt792x_dev *dev = mt792x_hw_dev(hw);
922 struct ieee80211_sta *sta = params->sta;
923 struct ieee80211_txq *txq = sta->txq[params->tid];
924 struct mt792x_sta *msta = (struct mt792x_sta *)sta->drv_priv;
925 u16 tid = params->tid;
926 u16 ssn = params->ssn;
927 struct mt76_txq *mtxq;
928 int ret = 0;
929
930 if (!txq)
931 return -EINVAL;
932
933 mtxq = (struct mt76_txq *)txq->drv_priv;
934
935 mt792x_mutex_acquire(dev);
936 switch (action) {
937 case IEEE80211_AMPDU_RX_START:
938 mt76_rx_aggr_start(&dev->mt76, &msta->deflink.wcid, tid, ssn,
939 params->buf_size);
940 mt7921_mcu_uni_rx_ba(dev, params, true);
941 break;
942 case IEEE80211_AMPDU_RX_STOP:
943 mt76_rx_aggr_stop(&dev->mt76, &msta->deflink.wcid, tid);
944 mt7921_mcu_uni_rx_ba(dev, params, false);
945 break;
946 case IEEE80211_AMPDU_TX_OPERATIONAL:
947 mtxq->aggr = true;
948 mtxq->send_bar = false;
949 mt7921_mcu_uni_tx_ba(dev, params, true);
950 break;
951 case IEEE80211_AMPDU_TX_STOP_FLUSH:
952 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
953 mtxq->aggr = false;
954 clear_bit(tid, &msta->deflink.wcid.ampdu_state);
955 mt7921_mcu_uni_tx_ba(dev, params, false);
956 break;
957 case IEEE80211_AMPDU_TX_START:
958 set_bit(tid, &msta->deflink.wcid.ampdu_state);
959 ret = IEEE80211_AMPDU_TX_START_IMMEDIATE;
960 break;
961 case IEEE80211_AMPDU_TX_STOP_CONT:
962 mtxq->aggr = false;
963 clear_bit(tid, &msta->deflink.wcid.ampdu_state);
964 mt7921_mcu_uni_tx_ba(dev, params, false);
965 ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
966 break;
967 }
968 mt792x_mutex_release(dev);
969
970 return ret;
971 }
972
mt7921_sta_state(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta,enum ieee80211_sta_state old_state,enum ieee80211_sta_state new_state)973 static int mt7921_sta_state(struct ieee80211_hw *hw,
974 struct ieee80211_vif *vif,
975 struct ieee80211_sta *sta,
976 enum ieee80211_sta_state old_state,
977 enum ieee80211_sta_state new_state)
978 {
979 struct mt792x_dev *dev = mt792x_hw_dev(hw);
980
981 if (dev->pm.ds_enable) {
982 mt792x_mutex_acquire(dev);
983 mt76_connac_sta_state_dp(&dev->mt76, old_state, new_state);
984 mt792x_mutex_release(dev);
985 }
986
987 return mt76_sta_state(hw, vif, sta, old_state, new_state);
988 }
989
mt7921_scan_work(struct work_struct * work)990 void mt7921_scan_work(struct work_struct *work)
991 {
992 struct mt792x_phy *phy;
993
994 phy = (struct mt792x_phy *)container_of(work, struct mt792x_phy,
995 scan_work.work);
996
997 while (true) {
998 struct mt76_connac2_mcu_rxd *rxd;
999 struct sk_buff *skb;
1000
1001 spin_lock_bh(&phy->dev->mt76.lock);
1002 skb = __skb_dequeue(&phy->scan_event_list);
1003 spin_unlock_bh(&phy->dev->mt76.lock);
1004
1005 if (!skb)
1006 break;
1007
1008 rxd = (struct mt76_connac2_mcu_rxd *)skb->data;
1009 if (rxd->eid == MCU_EVENT_SCHED_SCAN_DONE) {
1010 ieee80211_sched_scan_results(phy->mt76->hw);
1011 } else if (test_and_clear_bit(MT76_HW_SCANNING,
1012 &phy->mt76->state)) {
1013 struct cfg80211_scan_info info = {
1014 .aborted = false,
1015 };
1016
1017 ieee80211_scan_completed(phy->mt76->hw, &info);
1018 }
1019 dev_kfree_skb(skb);
1020 }
1021 }
1022
1023 static int
mt7921_hw_scan(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_scan_request * req)1024 mt7921_hw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
1025 struct ieee80211_scan_request *req)
1026 {
1027 struct mt792x_dev *dev = mt792x_hw_dev(hw);
1028 struct mt76_phy *mphy = hw->priv;
1029 int err;
1030
1031 mt792x_mutex_acquire(dev);
1032 err = mt76_connac_mcu_hw_scan(mphy, vif, req);
1033 mt792x_mutex_release(dev);
1034
1035 return err;
1036 }
1037
1038 static void
mt7921_cancel_hw_scan(struct ieee80211_hw * hw,struct ieee80211_vif * vif)1039 mt7921_cancel_hw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
1040 {
1041 struct mt792x_dev *dev = mt792x_hw_dev(hw);
1042 struct mt76_phy *mphy = hw->priv;
1043
1044 mt792x_mutex_acquire(dev);
1045 mt76_connac_mcu_cancel_hw_scan(mphy, vif);
1046 mt792x_mutex_release(dev);
1047 }
1048
1049 static int
mt7921_start_sched_scan(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct cfg80211_sched_scan_request * req,struct ieee80211_scan_ies * ies)1050 mt7921_start_sched_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
1051 struct cfg80211_sched_scan_request *req,
1052 struct ieee80211_scan_ies *ies)
1053 {
1054 struct mt792x_dev *dev = mt792x_hw_dev(hw);
1055 struct mt76_phy *mphy = hw->priv;
1056 int err;
1057
1058 mt792x_mutex_acquire(dev);
1059
1060 err = mt76_connac_mcu_sched_scan_req(mphy, vif, req);
1061 if (err < 0)
1062 goto out;
1063
1064 err = mt76_connac_mcu_sched_scan_enable(mphy, vif, true);
1065 out:
1066 mt792x_mutex_release(dev);
1067
1068 return err;
1069 }
1070
1071 static int
mt7921_stop_sched_scan(struct ieee80211_hw * hw,struct ieee80211_vif * vif)1072 mt7921_stop_sched_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
1073 {
1074 struct mt792x_dev *dev = mt792x_hw_dev(hw);
1075 struct mt76_phy *mphy = hw->priv;
1076 int err;
1077
1078 mt792x_mutex_acquire(dev);
1079 err = mt76_connac_mcu_sched_scan_enable(mphy, vif, false);
1080 mt792x_mutex_release(dev);
1081
1082 return err;
1083 }
1084
1085 static int
mt7921_set_antenna(struct ieee80211_hw * hw,u32 tx_ant,u32 rx_ant)1086 mt7921_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
1087 {
1088 struct mt792x_dev *dev = mt792x_hw_dev(hw);
1089 struct mt792x_phy *phy = mt792x_hw_phy(hw);
1090 int max_nss = hweight8(hw->wiphy->available_antennas_tx);
1091
1092 if (!tx_ant || tx_ant != rx_ant || ffs(tx_ant) > max_nss)
1093 return -EINVAL;
1094
1095 if ((BIT(hweight8(tx_ant)) - 1) != tx_ant)
1096 return -EINVAL;
1097
1098 mt792x_mutex_acquire(dev);
1099
1100 phy->mt76->antenna_mask = tx_ant;
1101 phy->mt76->chainmask = tx_ant;
1102
1103 mt76_set_stream_caps(phy->mt76, true);
1104 mt7921_set_stream_he_caps(phy);
1105
1106 mt792x_mutex_release(dev);
1107
1108 return 0;
1109 }
1110
1111 #ifdef CONFIG_PM
mt7921_suspend(struct ieee80211_hw * hw,struct cfg80211_wowlan * wowlan)1112 static int mt7921_suspend(struct ieee80211_hw *hw,
1113 struct cfg80211_wowlan *wowlan)
1114 {
1115 struct mt792x_dev *dev = mt792x_hw_dev(hw);
1116 struct mt792x_phy *phy = mt792x_hw_phy(hw);
1117
1118 cancel_delayed_work_sync(&phy->scan_work);
1119 cancel_delayed_work_sync(&phy->mt76->mac_work);
1120
1121 cancel_delayed_work_sync(&dev->pm.ps_work);
1122 mt76_connac_free_pending_tx_skbs(&dev->pm, NULL);
1123
1124 mt792x_mutex_acquire(dev);
1125
1126 clear_bit(MT76_STATE_RUNNING, &phy->mt76->state);
1127 ieee80211_iterate_active_interfaces(hw,
1128 IEEE80211_IFACE_ITER_RESUME_ALL,
1129 mt7921_mcu_set_suspend_iter,
1130 &dev->mphy);
1131
1132 mt792x_mutex_release(dev);
1133
1134 return 0;
1135 }
1136
mt7921_resume(struct ieee80211_hw * hw)1137 static int mt7921_resume(struct ieee80211_hw *hw)
1138 {
1139 struct mt792x_dev *dev = mt792x_hw_dev(hw);
1140 struct mt792x_phy *phy = mt792x_hw_phy(hw);
1141
1142 mt792x_mutex_acquire(dev);
1143
1144 set_bit(MT76_STATE_RUNNING, &phy->mt76->state);
1145 ieee80211_iterate_active_interfaces(hw,
1146 IEEE80211_IFACE_ITER_RESUME_ALL,
1147 mt76_connac_mcu_set_suspend_iter,
1148 &dev->mphy);
1149
1150 ieee80211_queue_delayed_work(hw, &phy->mt76->mac_work,
1151 MT792x_WATCHDOG_TIME);
1152
1153 mt792x_mutex_release(dev);
1154
1155 return 0;
1156 }
1157
mt7921_set_rekey_data(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct cfg80211_gtk_rekey_data * data)1158 static void mt7921_set_rekey_data(struct ieee80211_hw *hw,
1159 struct ieee80211_vif *vif,
1160 struct cfg80211_gtk_rekey_data *data)
1161 {
1162 struct mt792x_dev *dev = mt792x_hw_dev(hw);
1163
1164 mt792x_mutex_acquire(dev);
1165 mt76_connac_mcu_update_gtk_rekey(hw, vif, data);
1166 mt792x_mutex_release(dev);
1167 }
1168 #endif /* CONFIG_PM */
1169
mt7921_sta_set_decap_offload(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta,bool enabled)1170 static void mt7921_sta_set_decap_offload(struct ieee80211_hw *hw,
1171 struct ieee80211_vif *vif,
1172 struct ieee80211_sta *sta,
1173 bool enabled)
1174 {
1175 struct mt792x_sta *msta = (struct mt792x_sta *)sta->drv_priv;
1176 struct mt792x_dev *dev = mt792x_hw_dev(hw);
1177
1178 mt792x_mutex_acquire(dev);
1179
1180 if (enabled)
1181 set_bit(MT_WCID_FLAG_HDR_TRANS, &msta->deflink.wcid.flags);
1182 else
1183 clear_bit(MT_WCID_FLAG_HDR_TRANS, &msta->deflink.wcid.flags);
1184
1185 mt76_connac_mcu_sta_update_hdr_trans(&dev->mt76, vif, &msta->deflink.wcid,
1186 MCU_UNI_CMD(STA_REC_UPDATE));
1187
1188 mt792x_mutex_release(dev);
1189 }
1190
1191 #if IS_ENABLED(CONFIG_IPV6)
mt7921_ipv6_addr_change(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct inet6_dev * idev)1192 static void mt7921_ipv6_addr_change(struct ieee80211_hw *hw,
1193 struct ieee80211_vif *vif,
1194 struct inet6_dev *idev)
1195 {
1196 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
1197 struct mt792x_dev *dev = mt792x_hw_dev(hw);
1198 struct inet6_ifaddr *ifa;
1199 struct in6_addr ns_addrs[IEEE80211_BSS_ARP_ADDR_LIST_LEN];
1200 struct sk_buff *skb;
1201 u8 i, idx = 0;
1202
1203 struct {
1204 struct {
1205 u8 bss_idx;
1206 u8 pad[3];
1207 } __packed hdr;
1208 struct mt76_connac_arpns_tlv arpns;
1209 } req_hdr = {
1210 .hdr = {
1211 .bss_idx = mvif->bss_conf.mt76.idx,
1212 },
1213 .arpns = {
1214 .tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_ND),
1215 .mode = 2, /* update */
1216 .option = 1, /* update only */
1217 },
1218 };
1219
1220 read_lock_bh(&idev->lock);
1221 list_for_each_entry(ifa, &idev->addr_list, if_list) {
1222 if (ifa->flags & IFA_F_TENTATIVE)
1223 continue;
1224 ns_addrs[idx] = ifa->addr;
1225 if (++idx >= IEEE80211_BSS_ARP_ADDR_LIST_LEN)
1226 break;
1227 }
1228 read_unlock_bh(&idev->lock);
1229
1230 if (!idx)
1231 return;
1232
1233 req_hdr.arpns.ips_num = idx;
1234 req_hdr.arpns.len = cpu_to_le16(sizeof(struct mt76_connac_arpns_tlv)
1235 + idx * sizeof(struct in6_addr));
1236 skb = __mt76_mcu_msg_alloc(&dev->mt76, &req_hdr,
1237 sizeof(req_hdr) + idx * sizeof(struct in6_addr),
1238 sizeof(req_hdr), GFP_ATOMIC);
1239 if (!skb)
1240 return;
1241
1242 for (i = 0; i < idx; i++)
1243 skb_put_data(skb, &ns_addrs[i].in6_u, sizeof(struct in6_addr));
1244
1245 skb_queue_tail(&dev->ipv6_ns_list, skb);
1246
1247 ieee80211_queue_work(dev->mt76.hw, &dev->ipv6_ns_work);
1248 }
1249 #endif
1250
mt7921_set_tx_sar_pwr(struct ieee80211_hw * hw,const struct cfg80211_sar_specs * sar)1251 int mt7921_set_tx_sar_pwr(struct ieee80211_hw *hw,
1252 const struct cfg80211_sar_specs *sar)
1253 {
1254 struct mt76_phy *mphy = hw->priv;
1255
1256 if (sar) {
1257 int err = mt76_init_sar_power(hw, sar);
1258
1259 if (err)
1260 return err;
1261 }
1262 mt792x_init_acpi_sar_power(mt792x_hw_phy(hw), !sar);
1263
1264 return mt76_connac_mcu_set_rate_txpower(mphy);
1265 }
1266
mt7921_set_sar_specs(struct ieee80211_hw * hw,const struct cfg80211_sar_specs * sar)1267 static int mt7921_set_sar_specs(struct ieee80211_hw *hw,
1268 const struct cfg80211_sar_specs *sar)
1269 {
1270 struct mt792x_dev *dev = mt792x_hw_dev(hw);
1271 int err;
1272
1273 mt792x_mutex_acquire(dev);
1274 err = mt7921_mcu_set_clc(dev, dev->mt76.alpha2,
1275 dev->country_ie_env);
1276 if (err < 0)
1277 goto out;
1278
1279 err = mt7921_set_tx_sar_pwr(hw, sar);
1280 out:
1281 mt792x_mutex_release(dev);
1282
1283 return err;
1284 }
1285
1286 static void
mt7921_channel_switch_beacon(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct cfg80211_chan_def * chandef)1287 mt7921_channel_switch_beacon(struct ieee80211_hw *hw,
1288 struct ieee80211_vif *vif,
1289 struct cfg80211_chan_def *chandef)
1290 {
1291 struct mt792x_dev *dev = mt792x_hw_dev(hw);
1292
1293 mt792x_mutex_acquire(dev);
1294 mt7921_mcu_uni_add_beacon_offload(dev, hw, vif, true);
1295 mt792x_mutex_release(dev);
1296 }
1297
1298 static int
mt7921_start_ap(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_bss_conf * link_conf)1299 mt7921_start_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
1300 struct ieee80211_bss_conf *link_conf)
1301 {
1302 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
1303 struct mt792x_phy *phy = mt792x_hw_phy(hw);
1304 struct mt792x_dev *dev = mt792x_hw_dev(hw);
1305 int err;
1306
1307 mt792x_mutex_acquire(dev);
1308
1309 err = mt76_connac_mcu_uni_add_bss(phy->mt76, vif, &mvif->sta.deflink.wcid,
1310 true, mvif->bss_conf.mt76.ctx);
1311 if (err)
1312 goto out;
1313
1314 err = mt7921_mcu_set_bss_pm(dev, vif, true);
1315 if (err)
1316 goto out;
1317
1318 err = mt7921_mcu_sta_update(dev, NULL, vif, true,
1319 MT76_STA_INFO_STATE_NONE);
1320 out:
1321 mt792x_mutex_release(dev);
1322
1323 return err;
1324 }
1325
1326 static void
mt7921_stop_ap(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_bss_conf * link_conf)1327 mt7921_stop_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
1328 struct ieee80211_bss_conf *link_conf)
1329 {
1330 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
1331 struct mt792x_phy *phy = mt792x_hw_phy(hw);
1332 struct mt792x_dev *dev = mt792x_hw_dev(hw);
1333 int err;
1334
1335 mt792x_mutex_acquire(dev);
1336
1337 err = mt7921_mcu_set_bss_pm(dev, vif, false);
1338 if (err)
1339 goto out;
1340
1341 mt76_connac_mcu_uni_add_bss(phy->mt76, vif, &mvif->sta.deflink.wcid, false,
1342 mvif->bss_conf.mt76.ctx);
1343
1344 out:
1345 mt792x_mutex_release(dev);
1346 }
1347
1348 static int
mt7921_add_chanctx(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * ctx)1349 mt7921_add_chanctx(struct ieee80211_hw *hw,
1350 struct ieee80211_chanctx_conf *ctx)
1351 {
1352 struct mt792x_dev *dev = mt792x_hw_dev(hw);
1353
1354 dev->new_ctx = ctx;
1355 return 0;
1356 }
1357
1358 static void
mt7921_remove_chanctx(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * ctx)1359 mt7921_remove_chanctx(struct ieee80211_hw *hw,
1360 struct ieee80211_chanctx_conf *ctx)
1361 {
1362 struct mt792x_dev *dev = mt792x_hw_dev(hw);
1363
1364 if (dev->new_ctx == ctx)
1365 dev->new_ctx = NULL;
1366 }
1367
1368 static void
mt7921_change_chanctx(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * ctx,u32 changed)1369 mt7921_change_chanctx(struct ieee80211_hw *hw,
1370 struct ieee80211_chanctx_conf *ctx,
1371 u32 changed)
1372 {
1373 struct mt792x_chanctx *mctx = (struct mt792x_chanctx *)ctx->drv_priv;
1374 struct mt792x_phy *phy = mt792x_hw_phy(hw);
1375 struct ieee80211_vif *vif;
1376 struct mt792x_vif *mvif;
1377
1378 if (!mctx->bss_conf)
1379 return;
1380
1381 mvif = container_of(mctx->bss_conf, struct mt792x_vif, bss_conf);
1382 vif = container_of((void *)mvif, struct ieee80211_vif, drv_priv);
1383
1384 mt792x_mutex_acquire(phy->dev);
1385 if (vif->type == NL80211_IFTYPE_MONITOR)
1386 mt7921_mcu_config_sniffer(mvif, ctx);
1387 else
1388 mt76_connac_mcu_uni_set_chctx(mvif->phy->mt76, &mvif->bss_conf.mt76, ctx);
1389 mt792x_mutex_release(phy->dev);
1390 }
1391
mt7921_mgd_prepare_tx(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_prep_tx_info * info)1392 static void mt7921_mgd_prepare_tx(struct ieee80211_hw *hw,
1393 struct ieee80211_vif *vif,
1394 struct ieee80211_prep_tx_info *info)
1395 {
1396 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
1397 struct mt792x_dev *dev = mt792x_hw_dev(hw);
1398 u16 duration = info->duration ? info->duration :
1399 jiffies_to_msecs(HZ);
1400
1401 mt792x_mutex_acquire(dev);
1402 mt7921_set_roc(mvif->phy, mvif, mvif->bss_conf.mt76.ctx->def.chan, duration,
1403 MT7921_ROC_REQ_JOIN);
1404 mt792x_mutex_release(dev);
1405 }
1406
mt7921_mgd_complete_tx(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_prep_tx_info * info)1407 static void mt7921_mgd_complete_tx(struct ieee80211_hw *hw,
1408 struct ieee80211_vif *vif,
1409 struct ieee80211_prep_tx_info *info)
1410 {
1411 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
1412
1413 mt7921_abort_roc(mvif->phy, mvif);
1414 }
1415
mt7921_switch_vif_chanctx(struct ieee80211_hw * hw,struct ieee80211_vif_chanctx_switch * vifs,int n_vifs,enum ieee80211_chanctx_switch_mode mode)1416 static int mt7921_switch_vif_chanctx(struct ieee80211_hw *hw,
1417 struct ieee80211_vif_chanctx_switch *vifs,
1418 int n_vifs,
1419 enum ieee80211_chanctx_switch_mode mode)
1420 {
1421 return mt792x_assign_vif_chanctx(hw, vifs->vif, vifs->link_conf,
1422 vifs->new_ctx);
1423 }
1424
mt7921_csa_work(struct work_struct * work)1425 void mt7921_csa_work(struct work_struct *work)
1426 {
1427 struct mt792x_vif *mvif;
1428 struct mt792x_dev *dev;
1429 struct ieee80211_vif *vif;
1430 int ret;
1431
1432 mvif = (struct mt792x_vif *)container_of(work, struct mt792x_vif,
1433 csa_work);
1434 dev = mvif->phy->dev;
1435 vif = container_of((void *)mvif, struct ieee80211_vif, drv_priv);
1436
1437 mt792x_mutex_acquire(dev);
1438 ret = mt76_connac_mcu_uni_set_chctx(mvif->phy->mt76, &mvif->bss_conf.mt76,
1439 dev->new_ctx);
1440 mt792x_mutex_release(dev);
1441
1442 ieee80211_chswitch_done(vif, !ret, 0);
1443 }
1444
mt7921_pre_channel_switch(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_channel_switch * chsw)1445 static int mt7921_pre_channel_switch(struct ieee80211_hw *hw,
1446 struct ieee80211_vif *vif,
1447 struct ieee80211_channel_switch *chsw)
1448 {
1449 if (vif->type != NL80211_IFTYPE_STATION || !vif->cfg.assoc)
1450 return -EOPNOTSUPP;
1451
1452 /* Avoid beacon loss due to the CAC(Channel Availability Check) time
1453 * of the AP.
1454 */
1455 if (!cfg80211_chandef_usable(hw->wiphy, &chsw->chandef,
1456 IEEE80211_CHAN_RADAR))
1457 return -EOPNOTSUPP;
1458
1459 return 0;
1460 }
1461
mt7921_channel_switch(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_channel_switch * chsw)1462 static void mt7921_channel_switch(struct ieee80211_hw *hw,
1463 struct ieee80211_vif *vif,
1464 struct ieee80211_channel_switch *chsw)
1465 {
1466 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
1467 u16 beacon_interval = vif->bss_conf.beacon_int;
1468
1469 mvif->csa_timer.expires = TU_TO_EXP_TIME(beacon_interval * chsw->count);
1470 add_timer(&mvif->csa_timer);
1471 }
1472
mt7921_abort_channel_switch(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_bss_conf * link_conf)1473 static void mt7921_abort_channel_switch(struct ieee80211_hw *hw,
1474 struct ieee80211_vif *vif,
1475 struct ieee80211_bss_conf *link_conf)
1476 {
1477 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
1478
1479 del_timer_sync(&mvif->csa_timer);
1480 cancel_work_sync(&mvif->csa_work);
1481 }
1482
mt7921_channel_switch_rx_beacon(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_channel_switch * chsw)1483 static void mt7921_channel_switch_rx_beacon(struct ieee80211_hw *hw,
1484 struct ieee80211_vif *vif,
1485 struct ieee80211_channel_switch *chsw)
1486 {
1487 struct mt792x_dev *dev = mt792x_hw_dev(hw);
1488 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
1489 u16 beacon_interval = vif->bss_conf.beacon_int;
1490
1491 if (cfg80211_chandef_identical(&chsw->chandef,
1492 &dev->new_ctx->def) &&
1493 chsw->count) {
1494 mod_timer(&mvif->csa_timer,
1495 TU_TO_EXP_TIME(beacon_interval * chsw->count));
1496 }
1497 }
1498
mt7921_rfkill_poll(struct ieee80211_hw * hw)1499 static void mt7921_rfkill_poll(struct ieee80211_hw *hw)
1500 {
1501 struct mt792x_phy *phy = mt792x_hw_phy(hw);
1502 int ret = 0;
1503
1504 mt792x_mutex_acquire(phy->dev);
1505 ret = mt7921_mcu_wf_rf_pin_ctrl(phy, WF_RF_PIN_POLL);
1506 mt792x_mutex_release(phy->dev);
1507
1508 wiphy_rfkill_set_hw_state(hw->wiphy, ret ? false : true);
1509 }
1510
1511 const struct ieee80211_ops mt7921_ops = {
1512 .tx = mt792x_tx,
1513 .start = mt7921_start,
1514 .stop = mt7921_stop,
1515 .add_interface = mt7921_add_interface,
1516 .remove_interface = mt792x_remove_interface,
1517 .config = mt7921_config,
1518 .conf_tx = mt792x_conf_tx,
1519 .configure_filter = mt7921_configure_filter,
1520 .bss_info_changed = mt7921_bss_info_changed,
1521 .start_ap = mt7921_start_ap,
1522 .stop_ap = mt7921_stop_ap,
1523 .sta_state = mt7921_sta_state,
1524 .sta_pre_rcu_remove = mt76_sta_pre_rcu_remove,
1525 .set_key = mt7921_set_key,
1526 .sta_set_decap_offload = mt7921_sta_set_decap_offload,
1527 #if IS_ENABLED(CONFIG_IPV6)
1528 .ipv6_addr_change = mt7921_ipv6_addr_change,
1529 #endif /* CONFIG_IPV6 */
1530 .ampdu_action = mt7921_ampdu_action,
1531 .set_rts_threshold = mt7921_set_rts_threshold,
1532 .wake_tx_queue = mt76_wake_tx_queue,
1533 .release_buffered_frames = mt76_release_buffered_frames,
1534 .channel_switch_beacon = mt7921_channel_switch_beacon,
1535 .get_txpower = mt76_get_txpower,
1536 .get_stats = mt792x_get_stats,
1537 .get_et_sset_count = mt792x_get_et_sset_count,
1538 .get_et_strings = mt792x_get_et_strings,
1539 .get_et_stats = mt792x_get_et_stats,
1540 .get_tsf = mt792x_get_tsf,
1541 .set_tsf = mt792x_set_tsf,
1542 .get_survey = mt76_get_survey,
1543 .get_antenna = mt76_get_antenna,
1544 .set_antenna = mt7921_set_antenna,
1545 .set_coverage_class = mt792x_set_coverage_class,
1546 .hw_scan = mt7921_hw_scan,
1547 .cancel_hw_scan = mt7921_cancel_hw_scan,
1548 .sta_statistics = mt792x_sta_statistics,
1549 .sched_scan_start = mt7921_start_sched_scan,
1550 .sched_scan_stop = mt7921_stop_sched_scan,
1551 CFG80211_TESTMODE_CMD(mt7921_testmode_cmd)
1552 CFG80211_TESTMODE_DUMP(mt7921_testmode_dump)
1553 #ifdef CONFIG_PM
1554 .suspend = mt7921_suspend,
1555 .resume = mt7921_resume,
1556 .set_wakeup = mt792x_set_wakeup,
1557 .set_rekey_data = mt7921_set_rekey_data,
1558 #endif /* CONFIG_PM */
1559 .flush = mt792x_flush,
1560 .set_sar_specs = mt7921_set_sar_specs,
1561 .rfkill_poll = mt7921_rfkill_poll,
1562 .remain_on_channel = mt7921_remain_on_channel,
1563 .cancel_remain_on_channel = mt7921_cancel_remain_on_channel,
1564 .add_chanctx = mt7921_add_chanctx,
1565 .remove_chanctx = mt7921_remove_chanctx,
1566 .change_chanctx = mt7921_change_chanctx,
1567 .assign_vif_chanctx = mt792x_assign_vif_chanctx,
1568 .unassign_vif_chanctx = mt792x_unassign_vif_chanctx,
1569 .mgd_prepare_tx = mt7921_mgd_prepare_tx,
1570 .mgd_complete_tx = mt7921_mgd_complete_tx,
1571 .switch_vif_chanctx = mt7921_switch_vif_chanctx,
1572 .pre_channel_switch = mt7921_pre_channel_switch,
1573 .channel_switch = mt7921_channel_switch,
1574 .abort_channel_switch = mt7921_abort_channel_switch,
1575 .channel_switch_rx_beacon = mt7921_channel_switch_rx_beacon,
1576 };
1577 EXPORT_SYMBOL_GPL(mt7921_ops);
1578
1579 MODULE_DESCRIPTION("MediaTek MT7921 core driver");
1580 MODULE_LICENSE("Dual BSD/GPL");
1581 MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>");
1582