Lines Matching +full:assoc +full:- +full:select

1 // SPDX-License-Identifier: ISC
15 if (test_bit(MT76_STATE_RUNNING, &dev->mphy.state)) in mt7915_dev_running()
20 return phy && test_bit(MT76_STATE_RUNNING, &phy->mt76->state); in mt7915_dev_running()
33 ret = mt76_connac_mcu_set_pm(&dev->mt76, in mt7915_run()
34 dev->phy.mt76->band_idx, 0); in mt7915_run()
38 ret = mt7915_mcu_set_mac(dev, dev->phy.mt76->band_idx, in mt7915_run()
43 mt7915_mac_enable_nf(dev, dev->phy.mt76->band_idx); in mt7915_run()
46 if (phy != &dev->phy) { in mt7915_run()
47 ret = mt76_connac_mcu_set_pm(&dev->mt76, in mt7915_run()
48 phy->mt76->band_idx, 0); in mt7915_run()
52 ret = mt7915_mcu_set_mac(dev, phy->mt76->band_idx, in mt7915_run()
57 mt7915_mac_enable_nf(dev, phy->mt76->band_idx); in mt7915_run()
71 ret = mt76_connac_mcu_set_rts_thresh(&dev->mt76, 0x92b, in mt7915_run()
72 phy->mt76->band_idx); in mt7915_run()
84 set_bit(MT76_STATE_RUNNING, &phy->mt76->state); in mt7915_run()
86 if (!mt76_testmode_enabled(phy->mt76)) in mt7915_run()
87 ieee80211_queue_delayed_work(hw, &phy->mt76->mac_work, in mt7915_run()
102 flush_work(&dev->init_work); in mt7915_start()
104 mutex_lock(&dev->mt76.mutex); in mt7915_start()
106 mutex_unlock(&dev->mt76.mutex); in mt7915_start()
116 cancel_delayed_work_sync(&phy->mt76->mac_work); in mt7915_stop()
118 mutex_lock(&dev->mt76.mutex); in mt7915_stop()
120 mt76_testmode_reset(phy->mt76, true); in mt7915_stop()
122 clear_bit(MT76_STATE_RUNNING, &phy->mt76->state); in mt7915_stop()
124 if (phy != &dev->phy) { in mt7915_stop()
125 mt76_connac_mcu_set_pm(&dev->mt76, phy->mt76->band_idx, 1); in mt7915_stop()
126 mt7915_mcu_set_mac(dev, phy->mt76->band_idx, false, false); in mt7915_stop()
130 mt76_connac_mcu_set_pm(&dev->mt76, dev->phy.mt76->band_idx, 1); in mt7915_stop()
131 mt7915_mcu_set_mac(dev, dev->phy.mt76->band_idx, false, false); in mt7915_stop()
134 mutex_unlock(&dev->mt76.mutex); in mt7915_stop()
150 /* prefer hw bssid slot 1-3 */ in get_omac_idx()
153 return i - 1; in get_omac_idx()
160 return i - 1; in get_omac_idx()
174 return i - 1; in get_omac_idx()
182 return -1; in get_omac_idx()
187 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; in mt7915_init_bitrate_mask()
190 for (i = 0; i < ARRAY_SIZE(mvif->bitrate_mask.control); i++) { in mt7915_init_bitrate_mask()
191 mvif->bitrate_mask.control[i].gi = NL80211_TXRATE_DEFAULT_GI; in mt7915_init_bitrate_mask()
192 mvif->bitrate_mask.control[i].he_gi = 0xff; in mt7915_init_bitrate_mask()
193 mvif->bitrate_mask.control[i].he_ltf = 0xff; in mt7915_init_bitrate_mask()
194 mvif->bitrate_mask.control[i].legacy = GENMASK(31, 0); in mt7915_init_bitrate_mask()
195 memset(mvif->bitrate_mask.control[i].ht_mcs, 0xff, in mt7915_init_bitrate_mask()
196 sizeof(mvif->bitrate_mask.control[i].ht_mcs)); in mt7915_init_bitrate_mask()
197 memset(mvif->bitrate_mask.control[i].vht_mcs, 0xff, in mt7915_init_bitrate_mask()
198 sizeof(mvif->bitrate_mask.control[i].vht_mcs)); in mt7915_init_bitrate_mask()
199 memset(mvif->bitrate_mask.control[i].he_mcs, 0xff, in mt7915_init_bitrate_mask()
200 sizeof(mvif->bitrate_mask.control[i].he_mcs)); in mt7915_init_bitrate_mask()
207 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; in mt7915_add_interface()
211 bool ext_phy = phy != &dev->phy; in mt7915_add_interface()
214 mutex_lock(&dev->mt76.mutex); in mt7915_add_interface()
216 mt76_testmode_reset(phy->mt76, true); in mt7915_add_interface()
218 if (vif->type == NL80211_IFTYPE_MONITOR && in mt7915_add_interface()
219 is_zero_ether_addr(vif->addr)) in mt7915_add_interface()
220 phy->monitor_vif = vif; in mt7915_add_interface()
222 mvif->mt76.idx = __ffs64(~dev->mt76.vif_mask); in mt7915_add_interface()
223 if (mvif->mt76.idx >= (MT7915_MAX_INTERFACES << dev->dbdc_support)) { in mt7915_add_interface()
224 ret = -ENOSPC; in mt7915_add_interface()
228 idx = get_omac_idx(vif->type, phy->omac_mask); in mt7915_add_interface()
230 ret = -ENOSPC; in mt7915_add_interface()
233 mvif->mt76.omac_idx = idx; in mt7915_add_interface()
234 mvif->phy = phy; in mt7915_add_interface()
235 mvif->mt76.band_idx = phy->mt76->band_idx; in mt7915_add_interface()
236 mvif->mt76.wcid = &mvif->sta.wcid; in mt7915_add_interface()
238 mvif->mt76.wmm_idx = vif->type != NL80211_IFTYPE_AP; in mt7915_add_interface()
240 mvif->mt76.wmm_idx += 2; in mt7915_add_interface()
246 dev->mt76.vif_mask |= BIT_ULL(mvif->mt76.idx); in mt7915_add_interface()
247 phy->omac_mask |= BIT_ULL(mvif->mt76.omac_idx); in mt7915_add_interface()
249 idx = mt76_wcid_alloc(dev->mt76.wcid_mask, mt7915_wtbl_size(dev)); in mt7915_add_interface()
251 ret = -ENOSPC; in mt7915_add_interface()
255 INIT_LIST_HEAD(&mvif->sta.rc_list); in mt7915_add_interface()
256 mvif->sta.wcid.idx = idx; in mt7915_add_interface()
257 mvif->sta.wcid.tx_info |= MT_WCID_TX_INFO_SET; in mt7915_add_interface()
258 mt76_wcid_init(&mvif->sta.wcid, phy->mt76->band_idx); in mt7915_add_interface()
263 if (vif->txq) { in mt7915_add_interface()
264 mtxq = (struct mt76_txq *)vif->txq->drv_priv; in mt7915_add_interface()
265 mtxq->wcid = idx; in mt7915_add_interface()
268 if (vif->type != NL80211_IFTYPE_AP && in mt7915_add_interface()
269 (!mvif->mt76.omac_idx || mvif->mt76.omac_idx > 3)) in mt7915_add_interface()
270 vif->offload_flags = 0; in mt7915_add_interface()
271 vif->offload_flags |= IEEE80211_OFFLOAD_ENCAP_4ADDR; in mt7915_add_interface()
274 memset(&mvif->cap, -1, sizeof(mvif->cap)); in mt7915_add_interface()
278 rcu_assign_pointer(dev->mt76.wcid[idx], &mvif->sta.wcid); in mt7915_add_interface()
281 mutex_unlock(&dev->mt76.mutex); in mt7915_add_interface()
289 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; in mt7915_remove_interface()
290 struct mt7915_sta *msta = &mvif->sta; in mt7915_remove_interface()
293 int idx = msta->wcid.idx; in mt7915_remove_interface()
297 mt76_wcid_mask_clear(dev->mt76.wcid_mask, mvif->sta.wcid.idx); in mt7915_remove_interface()
299 mutex_lock(&dev->mt76.mutex); in mt7915_remove_interface()
300 mt76_testmode_reset(phy->mt76, true); in mt7915_remove_interface()
301 mutex_unlock(&dev->mt76.mutex); in mt7915_remove_interface()
303 if (vif == phy->monitor_vif) in mt7915_remove_interface()
304 phy->monitor_vif = NULL; in mt7915_remove_interface()
308 rcu_assign_pointer(dev->mt76.wcid[idx], NULL); in mt7915_remove_interface()
310 mutex_lock(&dev->mt76.mutex); in mt7915_remove_interface()
311 dev->mt76.vif_mask &= ~BIT_ULL(mvif->mt76.idx); in mt7915_remove_interface()
312 phy->omac_mask &= ~BIT_ULL(mvif->mt76.omac_idx); in mt7915_remove_interface()
313 mutex_unlock(&dev->mt76.mutex); in mt7915_remove_interface()
315 spin_lock_bh(&dev->mt76.sta_poll_lock); in mt7915_remove_interface()
316 if (!list_empty(&msta->wcid.poll_list)) in mt7915_remove_interface()
317 list_del_init(&msta->wcid.poll_list); in mt7915_remove_interface()
318 spin_unlock_bh(&dev->mt76.sta_poll_lock); in mt7915_remove_interface()
320 mt76_wcid_cleanup(&dev->mt76, &msta->wcid); in mt7915_remove_interface()
325 struct mt7915_phy *phy = mphy->priv; in mt7915_set_channel()
326 struct mt7915_dev *dev = phy->dev; in mt7915_set_channel()
329 if (dev->cal) { in mt7915_set_channel()
344 phy->noise = 0; in mt7915_set_channel()
347 if (!mt76_testmode_enabled(phy->mt76)) in mt7915_set_channel()
348 ieee80211_queue_delayed_work(phy->mt76->hw, in mt7915_set_channel()
349 &phy->mt76->mac_work, in mt7915_set_channel()
361 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; in mt7915_set_key()
362 struct mt7915_sta *msta = sta ? (struct mt7915_sta *)sta->drv_priv : in mt7915_set_key()
363 &mvif->sta; in mt7915_set_key()
364 struct mt76_wcid *wcid = &msta->wcid; in mt7915_set_key()
365 u8 *wcid_keyidx = &wcid->hw_key_idx; in mt7915_set_key()
366 int idx = key->keyidx; in mt7915_set_key()
369 if (sta && !wcid->sta) { in mt7915_set_key()
373 return -EOPNOTSUPP; in mt7915_set_key()
376 /* The hardware does not support per-STA RX GTK, fallback in mt7915_set_key()
379 if ((vif->type == NL80211_IFTYPE_ADHOC || in mt7915_set_key()
380 vif->type == NL80211_IFTYPE_MESH_POINT) && in mt7915_set_key()
381 (key->cipher == WLAN_CIPHER_SUITE_TKIP || in mt7915_set_key()
382 key->cipher == WLAN_CIPHER_SUITE_CCMP) && in mt7915_set_key()
383 !(key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) in mt7915_set_key()
384 return -EOPNOTSUPP; in mt7915_set_key()
387 switch (key->cipher) { in mt7915_set_key()
389 wcid_keyidx = &wcid->hw_key_idx2; in mt7915_set_key()
390 key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIE; in mt7915_set_key()
402 return -EOPNOTSUPP; in mt7915_set_key()
405 mutex_lock(&dev->mt76.mutex); in mt7915_set_key()
407 if (cmd == SET_KEY && !sta && !mvif->mt76.cipher) { in mt7915_set_key()
408 mvif->mt76.cipher = mt76_connac_mcu_get_cipher(key->cipher); in mt7915_set_key()
416 *wcid_keyidx = -1; in mt7915_set_key()
420 mt76_wcid_key_setup(&dev->mt76, wcid, key); in mt7915_set_key()
421 err = mt76_connac_mcu_add_key(&dev->mt76, vif, &msta->bip, in mt7915_set_key()
423 &msta->wcid, cmd); in mt7915_set_key()
425 mutex_unlock(&dev->mt76.mutex); in mt7915_set_key()
435 int err = -EINVAL; in mt7915_set_sar_specs()
437 mutex_lock(&dev->mt76.mutex); in mt7915_set_sar_specs()
438 if (!cfg80211_chandef_valid(&phy->mt76->chandef)) in mt7915_set_sar_specs()
447 mutex_unlock(&dev->mt76.mutex); in mt7915_set_sar_specs()
461 if (phy->mt76->test.state != MT76_TM_STATE_OFF) { in mt7915_config()
462 mutex_lock(&dev->mt76.mutex); in mt7915_config()
463 mt76_testmode_reset(phy->mt76, false); in mt7915_config()
464 mutex_unlock(&dev->mt76.mutex); in mt7915_config()
467 ret = mt76_update_channel(phy->mt76); in mt7915_config()
479 mutex_lock(&dev->mt76.mutex); in mt7915_config()
482 bool enabled = !!(hw->conf.flags & IEEE80211_CONF_MONITOR); in mt7915_config()
483 bool band = phy->mt76->band_idx; in mt7915_config()
484 u32 rxfilter = phy->rxfilter; in mt7915_config()
488 dev->monitor_mask &= ~BIT(band); in mt7915_config()
491 dev->monitor_mask |= BIT(band); in mt7915_config()
497 !dev->monitor_mask); in mt7915_config()
498 mt76_testmode_reset(phy->mt76, true); in mt7915_config()
502 mutex_unlock(&dev->mt76.mutex); in mt7915_config()
512 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; in mt7915_conf_tx()
516 mvif->queue_params[queue] = *params; in mt7915_conf_tx()
528 bool band = phy->mt76->band_idx; in mt7915_configure_filter()
539 phy->rxfilter &= ~(_hw); \ in mt7915_configure_filter()
540 phy->rxfilter |= !(flags & FIF_##_flag) * (_hw); \ in mt7915_configure_filter()
543 mutex_lock(&dev->mt76.mutex); in mt7915_configure_filter()
545 phy->rxfilter &= ~(MT_WF_RFCR_DROP_OTHER_BSS | in mt7915_configure_filter()
568 rxfilter = phy->rxfilter; in mt7915_configure_filter()
569 if (hw->conf.flags & IEEE80211_CONF_MONITOR) in mt7915_configure_filter()
580 mutex_unlock(&dev->mt76.mutex); in mt7915_configure_filter()
590 switch (vif->type) { in mt7915_update_bss_color()
592 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; in mt7915_update_bss_color()
594 if (mvif->mt76.omac_idx > HW_BSSID_MAX) in mt7915_update_bss_color()
613 int set_bss_info = -1, set_sta = -1; in mt7915_bss_info_changed()
615 mutex_lock(&dev->mt76.mutex); in mt7915_bss_info_changed()
622 vif->type == NL80211_IFTYPE_STATION) in mt7915_bss_info_changed()
623 set_bss_info = set_sta = !is_zero_ether_addr(info->bssid); in mt7915_bss_info_changed()
625 set_bss_info = vif->cfg.assoc; in mt7915_bss_info_changed()
627 info->enable_beacon && in mt7915_bss_info_changed()
628 vif->type != NL80211_IFTYPE_AP) in mt7915_bss_info_changed()
637 mt7915_mac_enable_rtscts(dev, vif, info->use_cts_prot); in mt7915_bss_info_changed()
642 if (phy->mt76->chandef.chan->band == NL80211_BAND_2GHZ && in mt7915_bss_info_changed()
643 !info->use_short_slot) in mt7915_bss_info_changed()
646 if (slottime != phy->slottime) { in mt7915_bss_info_changed()
647 phy->slottime = slottime; in mt7915_bss_info_changed()
657 mt7915_mcu_add_obss_spr(phy, vif, &info->he_obss_pd); in mt7915_bss_info_changed()
660 mt7915_update_bss_color(hw, vif, &info->he_bss_color); in mt7915_bss_info_changed()
664 mt7915_mcu_add_beacon(hw, vif, info->enable_beacon, changed); in mt7915_bss_info_changed()
675 mutex_unlock(&dev->mt76.mutex); in mt7915_bss_info_changed()
681 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; in mt7915_vif_check_caps()
682 struct mt7915_vif_cap *vc = &mvif->cap; in mt7915_vif_check_caps()
684 vc->ht_ldpc = vif->bss_conf.ht_ldpc; in mt7915_vif_check_caps()
685 vc->vht_ldpc = vif->bss_conf.vht_ldpc; in mt7915_vif_check_caps()
686 vc->vht_su_ebfer = vif->bss_conf.vht_su_beamformer; in mt7915_vif_check_caps()
687 vc->vht_su_ebfee = vif->bss_conf.vht_su_beamformee; in mt7915_vif_check_caps()
688 vc->vht_mu_ebfer = vif->bss_conf.vht_mu_beamformer; in mt7915_vif_check_caps()
689 vc->vht_mu_ebfee = vif->bss_conf.vht_mu_beamformee; in mt7915_vif_check_caps()
690 vc->he_ldpc = vif->bss_conf.he_ldpc; in mt7915_vif_check_caps()
691 vc->he_su_ebfer = vif->bss_conf.he_su_beamformer; in mt7915_vif_check_caps()
692 vc->he_su_ebfee = vif->bss_conf.he_su_beamformee; in mt7915_vif_check_caps()
693 vc->he_mu_ebfer = vif->bss_conf.he_mu_beamformer; in mt7915_vif_check_caps()
704 mutex_lock(&dev->mt76.mutex); in mt7915_start_ap()
713 mutex_unlock(&dev->mt76.mutex); in mt7915_start_ap()
724 mutex_lock(&dev->mt76.mutex); in mt7915_stop_ap()
726 mutex_unlock(&dev->mt76.mutex); in mt7915_stop_ap()
736 mutex_lock(&dev->mt76.mutex); in mt7915_channel_switch_beacon()
738 mutex_unlock(&dev->mt76.mutex); in mt7915_channel_switch_beacon()
745 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; in mt7915_mac_sta_add()
746 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; in mt7915_mac_sta_add()
747 bool ext_phy = mvif->phy != &dev->phy; in mt7915_mac_sta_add()
750 idx = mt76_wcid_alloc(dev->mt76.wcid_mask, MT7915_WTBL_STA); in mt7915_mac_sta_add()
752 return -ENOSPC; in mt7915_mac_sta_add()
754 INIT_LIST_HEAD(&msta->rc_list); in mt7915_mac_sta_add()
755 INIT_LIST_HEAD(&msta->wcid.poll_list); in mt7915_mac_sta_add()
756 msta->vif = mvif; in mt7915_mac_sta_add()
757 msta->wcid.sta_disabled = 1; in mt7915_mac_sta_add()
758 msta->wcid.idx = idx; in mt7915_mac_sta_add()
759 msta->wcid.phy_idx = ext_phy; in mt7915_mac_sta_add()
760 msta->jiffies = jiffies; in mt7915_mac_sta_add()
762 ewma_avg_signal_init(&msta->avg_ack_signal); in mt7915_mac_sta_add()
785 if (vif == data->vif || vif->type != NL80211_IFTYPE_AP) in __mt7915_drop_sta()
788 sta = ieee80211_find_sta_by_ifaddr(data->hw, data->sta_addr, mac); in __mt7915_drop_sta()
792 msta = (struct mt7915_sta *)sta->drv_priv; in __mt7915_drop_sta()
793 mt7915_mcu_add_sta(data->dev, vif, sta, CONN_STATE_DISCONNECT, false); in __mt7915_drop_sta()
794 msta->wcid.sta_disabled = 1; in __mt7915_drop_sta()
795 msta->wcid.sta = 0; in __mt7915_drop_sta()
802 struct mt76_phy *ext_phy = dev->mt76.phys[MT_BAND1]; in mt7915_drop_other_sta()
805 .hw = dev->mphy.hw, in mt7915_drop_other_sta()
809 if (vif->type != NL80211_IFTYPE_AP) in mt7915_drop_other_sta()
812 memcpy(data.sta_addr, sta->addr, ETH_ALEN); in mt7915_drop_other_sta()
818 data.hw = ext_phy->hw; in mt7915_drop_other_sta()
826 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; in mt7915_mac_sta_event()
836 addr = mt7915_mac_wtbl_lmac_addr(dev, msta->wcid.idx, 30); in mt7915_mac_sta_event()
843 msta->wcid.tx_info |= MT_WCID_TX_INFO_SET; in mt7915_mac_sta_event()
844 msta->wcid.sta = 1; in mt7915_mac_sta_event()
845 msta->wcid.sta_disabled = 0; in mt7915_mac_sta_event()
854 for (i = 0; i < ARRAY_SIZE(msta->twt.flow); i++) in mt7915_mac_sta_event()
858 msta->wcid.sta_disabled = 1; in mt7915_mac_sta_event()
859 msta->wcid.sta = 0; in mt7915_mac_sta_event()
870 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; in mt7915_mac_sta_remove()
872 mt7915_mac_wtbl_update(dev, msta->wcid.idx, in mt7915_mac_sta_remove()
875 spin_lock_bh(&mdev->sta_poll_lock); in mt7915_mac_sta_remove()
876 if (!list_empty(&msta->wcid.poll_list)) in mt7915_mac_sta_remove()
877 list_del_init(&msta->wcid.poll_list); in mt7915_mac_sta_remove()
878 if (!list_empty(&msta->rc_list)) in mt7915_mac_sta_remove()
879 list_del_init(&msta->rc_list); in mt7915_mac_sta_remove()
880 spin_unlock_bh(&mdev->sta_poll_lock); in mt7915_mac_sta_remove()
888 struct mt76_phy *mphy = hw->priv; in mt7915_tx()
890 struct ieee80211_vif *vif = info->control.vif; in mt7915_tx()
891 struct mt76_wcid *wcid = &dev->mt76.global_wcid; in mt7915_tx()
893 if (control->sta) { in mt7915_tx()
896 sta = (struct mt7915_sta *)control->sta->drv_priv; in mt7915_tx()
897 wcid = &sta->wcid; in mt7915_tx()
900 if (vif && !control->sta) { in mt7915_tx()
903 mvif = (struct mt7915_vif *)vif->drv_priv; in mt7915_tx()
904 wcid = &mvif->sta.wcid; in mt7915_tx()
907 mt76_tx(mphy, control->sta, wcid, skb); in mt7915_tx()
917 mutex_lock(&dev->mt76.mutex); in mt7915_set_rts_threshold()
918 ret = mt76_connac_mcu_set_rts_thresh(&dev->mt76, val, in mt7915_set_rts_threshold()
919 phy->mt76->band_idx); in mt7915_set_rts_threshold()
920 mutex_unlock(&dev->mt76.mutex); in mt7915_set_rts_threshold()
929 enum ieee80211_ampdu_mlme_action action = params->action; in mt7915_ampdu_action()
931 struct ieee80211_sta *sta = params->sta; in mt7915_ampdu_action()
932 struct ieee80211_txq *txq = sta->txq[params->tid]; in mt7915_ampdu_action()
933 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; in mt7915_ampdu_action()
934 u16 tid = params->tid; in mt7915_ampdu_action()
935 u16 ssn = params->ssn; in mt7915_ampdu_action()
940 return -EINVAL; in mt7915_ampdu_action()
942 mtxq = (struct mt76_txq *)txq->drv_priv; in mt7915_ampdu_action()
944 mutex_lock(&dev->mt76.mutex); in mt7915_ampdu_action()
947 mt76_rx_aggr_start(&dev->mt76, &msta->wcid, tid, ssn, in mt7915_ampdu_action()
948 params->buf_size); in mt7915_ampdu_action()
952 mt76_rx_aggr_stop(&dev->mt76, &msta->wcid, tid); in mt7915_ampdu_action()
956 mtxq->aggr = true; in mt7915_ampdu_action()
957 mtxq->send_bar = false; in mt7915_ampdu_action()
962 mtxq->aggr = false; in mt7915_ampdu_action()
963 clear_bit(tid, &msta->wcid.ampdu_state); in mt7915_ampdu_action()
967 set_bit(tid, &msta->wcid.ampdu_state); in mt7915_ampdu_action()
971 mtxq->aggr = false; in mt7915_ampdu_action()
972 clear_bit(tid, &msta->wcid.ampdu_state); in mt7915_ampdu_action()
974 ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid); in mt7915_ampdu_action()
977 mutex_unlock(&dev->mt76.mutex); in mt7915_ampdu_action()
988 struct mt76_mib_stats *mib = &phy->mib; in mt7915_get_stats()
990 mutex_lock(&dev->mt76.mutex); in mt7915_get_stats()
992 stats->dot11RTSSuccessCount = mib->rts_cnt; in mt7915_get_stats()
993 stats->dot11RTSFailureCount = mib->rts_retries_cnt; in mt7915_get_stats()
994 stats->dot11FCSErrorCount = mib->fcs_err_cnt; in mt7915_get_stats()
995 stats->dot11ACKFailureCount = mib->ack_fail_cnt; in mt7915_get_stats()
997 mutex_unlock(&dev->mt76.mutex); in mt7915_get_stats()
1006 bool band = phy->mt76->band_idx; in __mt7915_get_tsf()
1013 lockdep_assert_held(&dev->mt76.mutex); in __mt7915_get_tsf()
1015 n = mvif->mt76.omac_idx > HW_BSSID_MAX ? HW_BSSID_0 in __mt7915_get_tsf()
1016 : mvif->mt76.omac_idx; in __mt7915_get_tsf()
1018 if (is_mt7915(&dev->mt76)) in __mt7915_get_tsf()
1033 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; in mt7915_get_tsf()
1037 mutex_lock(&dev->mt76.mutex); in mt7915_get_tsf()
1039 mutex_unlock(&dev->mt76.mutex); in mt7915_get_tsf()
1048 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; in mt7915_set_tsf()
1051 bool band = phy->mt76->band_idx; in mt7915_set_tsf()
1058 mutex_lock(&dev->mt76.mutex); in mt7915_set_tsf()
1060 n = mvif->mt76.omac_idx > HW_BSSID_MAX ? HW_BSSID_0 in mt7915_set_tsf()
1061 : mvif->mt76.omac_idx; in mt7915_set_tsf()
1065 if (is_mt7915(&dev->mt76)) in mt7915_set_tsf()
1072 mutex_unlock(&dev->mt76.mutex); in mt7915_set_tsf()
1079 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; in mt7915_offset_tsf()
1082 bool band = phy->mt76->band_idx; in mt7915_offset_tsf()
1089 mutex_lock(&dev->mt76.mutex); in mt7915_offset_tsf()
1091 n = mvif->mt76.omac_idx > HW_BSSID_MAX ? HW_BSSID_0 in mt7915_offset_tsf()
1092 : mvif->mt76.omac_idx; in mt7915_offset_tsf()
1096 if (is_mt7915(&dev->mt76)) in mt7915_offset_tsf()
1103 mutex_unlock(&dev->mt76.mutex); in mt7915_offset_tsf()
1111 struct mt7915_dev *dev = phy->dev; in mt7915_set_coverage_class()
1113 mutex_lock(&dev->mt76.mutex); in mt7915_set_coverage_class()
1114 phy->coverage_class = max_t(s16, coverage_class, 0); in mt7915_set_coverage_class()
1116 mutex_unlock(&dev->mt76.mutex); in mt7915_set_coverage_class()
1124 int max_nss = hweight8(hw->wiphy->available_antennas_tx); in mt7915_set_antenna()
1125 u8 chainshift = dev->chainshift; in mt7915_set_antenna()
1126 u8 band = phy->mt76->band_idx; in mt7915_set_antenna()
1129 return -EINVAL; in mt7915_set_antenna()
1131 mutex_lock(&dev->mt76.mutex); in mt7915_set_antenna()
1133 phy->mt76->antenna_mask = tx_ant; in mt7915_set_antenna()
1136 if ((is_mt7916(&dev->mt76) || is_mt7981(&dev->mt76)) && in mt7915_set_antenna()
1138 phy->mt76->chainmask = (dev->chainmask >> chainshift) << chainshift; in mt7915_set_antenna()
1140 phy->mt76->chainmask = tx_ant << (chainshift * band); in mt7915_set_antenna()
1142 mt76_set_stream_caps(phy->mt76, true); in mt7915_set_antenna()
1146 mutex_unlock(&dev->mt76.mutex); in mt7915_set_antenna()
1157 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; in mt7915_sta_statistics()
1158 struct rate_info *txrate = &msta->wcid.rate; in mt7915_sta_statistics()
1162 sinfo->rxrate = rxrate; in mt7915_sta_statistics()
1163 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BITRATE); in mt7915_sta_statistics()
1166 if (txrate->legacy || txrate->flags) { in mt7915_sta_statistics()
1167 if (txrate->legacy) { in mt7915_sta_statistics()
1168 sinfo->txrate.legacy = txrate->legacy; in mt7915_sta_statistics()
1170 sinfo->txrate.mcs = txrate->mcs; in mt7915_sta_statistics()
1171 sinfo->txrate.nss = txrate->nss; in mt7915_sta_statistics()
1172 sinfo->txrate.bw = txrate->bw; in mt7915_sta_statistics()
1173 sinfo->txrate.he_gi = txrate->he_gi; in mt7915_sta_statistics()
1174 sinfo->txrate.he_dcm = txrate->he_dcm; in mt7915_sta_statistics()
1175 sinfo->txrate.he_ru_alloc = txrate->he_ru_alloc; in mt7915_sta_statistics()
1177 sinfo->txrate.flags = txrate->flags; in mt7915_sta_statistics()
1178 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); in mt7915_sta_statistics()
1184 if (mtk_wed_device_active(&phy->dev->mt76.mmio.wed)) { in mt7915_sta_statistics()
1185 sinfo->tx_bytes = msta->wcid.stats.tx_bytes; in mt7915_sta_statistics()
1186 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BYTES64); in mt7915_sta_statistics()
1188 if (!mt7915_mcu_wed_wa_tx_stats(phy->dev, msta->wcid.idx)) { in mt7915_sta_statistics()
1189 sinfo->tx_packets = msta->wcid.stats.tx_packets; in mt7915_sta_statistics()
1190 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_PACKETS); in mt7915_sta_statistics()
1193 if (mtk_wed_get_rx_capa(&phy->dev->mt76.mmio.wed)) { in mt7915_sta_statistics()
1194 sinfo->rx_bytes = msta->wcid.stats.rx_bytes; in mt7915_sta_statistics()
1195 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BYTES64); in mt7915_sta_statistics()
1197 sinfo->rx_packets = msta->wcid.stats.rx_packets; in mt7915_sta_statistics()
1198 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_PACKETS); in mt7915_sta_statistics()
1202 sinfo->tx_failed = msta->wcid.stats.tx_failed; in mt7915_sta_statistics()
1203 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED); in mt7915_sta_statistics()
1205 sinfo->tx_retries = msta->wcid.stats.tx_retries; in mt7915_sta_statistics()
1206 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES); in mt7915_sta_statistics()
1208 sinfo->ack_signal = (s8)msta->ack_signal; in mt7915_sta_statistics()
1209 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL); in mt7915_sta_statistics()
1211 sinfo->avg_ack_signal = -(s8)ewma_avg_signal_read(&msta->avg_ack_signal); in mt7915_sta_statistics()
1212 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL_AVG); in mt7915_sta_statistics()
1217 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; in mt7915_sta_rc_work()
1218 struct mt7915_dev *dev = msta->vif->phy->dev; in mt7915_sta_rc_work()
1221 spin_lock_bh(&dev->mt76.sta_poll_lock); in mt7915_sta_rc_work()
1222 msta->changed |= *changed; in mt7915_sta_rc_work()
1223 if (list_empty(&msta->rc_list)) in mt7915_sta_rc_work()
1224 list_add_tail(&msta->rc_list, &dev->sta_rc_list); in mt7915_sta_rc_work()
1225 spin_unlock_bh(&dev->mt76.sta_poll_lock); in mt7915_sta_rc_work()
1233 struct ieee80211_sta *sta = link_sta->sta; in mt7915_sta_rc_update()
1235 struct mt7915_dev *dev = phy->dev; in mt7915_sta_rc_update()
1236 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; in mt7915_sta_rc_update()
1238 if (!msta->wcid.sta) in mt7915_sta_rc_update()
1242 ieee80211_queue_work(hw, &dev->rc_work); in mt7915_sta_rc_update()
1249 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; in mt7915_set_bitrate_mask()
1251 struct mt7915_dev *dev = phy->dev; in mt7915_set_bitrate_mask()
1254 mvif->bitrate_mask = *mask; in mt7915_set_bitrate_mask()
1259 * - single rate : if a rate is passed along with different preambles, in mt7915_set_bitrate_mask()
1260 * we select the highest one as fixed rate. i.e VHT MCS for VHT peers. in mt7915_set_bitrate_mask()
1261 * - multiple rates: if it's not in range format i.e 0-{7,8,9} for VHT in mt7915_set_bitrate_mask()
1265 ieee80211_queue_work(hw, &dev->rc_work); in mt7915_set_bitrate_mask()
1276 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; in mt7915_sta_set_4addr()
1279 set_bit(MT_WCID_FLAG_4ADDR, &msta->wcid.flags); in mt7915_sta_set_4addr()
1281 clear_bit(MT_WCID_FLAG_4ADDR, &msta->wcid.flags); in mt7915_sta_set_4addr()
1283 if (!msta->wcid.sta) in mt7915_sta_set_4addr()
1286 mt76_connac_mcu_wtbl_update_hdr_trans(&dev->mt76, vif, sta); in mt7915_sta_set_4addr()
1295 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; in mt7915_sta_set_decap_offload()
1298 set_bit(MT_WCID_FLAG_HDR_TRANS, &msta->wcid.flags); in mt7915_sta_set_decap_offload()
1300 clear_bit(MT_WCID_FLAG_HDR_TRANS, &msta->wcid.flags); in mt7915_sta_set_decap_offload()
1302 if (!msta->wcid.sta) in mt7915_sta_set_decap_offload()
1305 mt76_connac_mcu_wtbl_update_hdr_trans(&dev->mt76, vif, sta); in mt7915_sta_set_decap_offload()
1314 s16 txpower = sta->deflink.txpwr.power; in mt7915_sta_set_txpwr()
1317 if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) in mt7915_sta_set_txpwr()
1320 mutex_lock(&dev->mt76.mutex); in mt7915_sta_set_txpwr()
1336 mutex_unlock(&dev->mt76.mutex); in mt7915_sta_set_txpwr()
1350 "tx_ampdu_len:0-1",
1351 "tx_ampdu_len:2-10",
1352 "tx_ampdu_len:11-19",
1353 "tx_ampdu_len:20-28",
1354 "tx_ampdu_len:29-37",
1355 "tx_ampdu_len:38-46",
1356 "tx_ampdu_len:47-55",
1357 "tx_ampdu_len:56-79",
1358 "tx_ampdu_len:80-103",
1359 "tx_ampdu_len:104-127",
1360 "tx_ampdu_len:128-151",
1361 "tx_ampdu_len:152-175",
1362 "tx_ampdu_len:176-199",
1363 "tx_ampdu_len:200-223",
1364 "tx_ampdu_len:224-247",
1412 /* muru mu-mimo and ofdma related stats */
1505 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; in mt7915_ethtool_worker()
1507 if (msta->vif->mt76.idx != wi->idx) in mt7915_ethtool_worker()
1510 mt76_ethtool_worker(wi, &msta->wcid.stats, false); in mt7915_ethtool_worker()
1520 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; in mt7915_get_et_stats()
1521 struct mt76_mib_stats *mib = &phy->mib; in mt7915_get_et_stats()
1524 .idx = mvif->mt76.idx, in mt7915_get_et_stats()
1529 mutex_lock(&dev->mt76.mutex); in mt7915_get_et_stats()
1533 data[ei++] = mib->tx_ampdu_cnt; in mt7915_get_et_stats()
1534 data[ei++] = mib->tx_stop_q_empty_cnt; in mt7915_get_et_stats()
1535 data[ei++] = mib->tx_mpdu_attempts_cnt; in mt7915_get_et_stats()
1536 data[ei++] = mib->tx_mpdu_success_cnt; in mt7915_get_et_stats()
1537 data[ei++] = mib->tx_rwp_fail_cnt; in mt7915_get_et_stats()
1538 data[ei++] = mib->tx_rwp_need_cnt; in mt7915_get_et_stats()
1539 data[ei++] = mib->tx_pkt_ebf_cnt; in mt7915_get_et_stats()
1540 data[ei++] = mib->tx_pkt_ibf_cnt; in mt7915_get_et_stats()
1544 data[ei++] = phy->mt76->aggr_stats[i]; in mt7915_get_et_stats()
1546 data[ei++] = phy->mib.ba_miss_cnt; in mt7915_get_et_stats()
1549 data[ei++] = mib->tx_bf_ibf_ppdu_cnt; in mt7915_get_et_stats()
1550 data[ei++] = mib->tx_bf_ebf_ppdu_cnt; in mt7915_get_et_stats()
1553 data[ei++] = mib->tx_bf_rx_fb_all_cnt; in mt7915_get_et_stats()
1554 data[ei++] = mib->tx_bf_rx_fb_he_cnt; in mt7915_get_et_stats()
1555 data[ei++] = mib->tx_bf_rx_fb_vht_cnt; in mt7915_get_et_stats()
1556 data[ei++] = mib->tx_bf_rx_fb_ht_cnt; in mt7915_get_et_stats()
1558 data[ei++] = mib->tx_bf_rx_fb_bw; in mt7915_get_et_stats()
1559 data[ei++] = mib->tx_bf_rx_fb_nc_cnt; in mt7915_get_et_stats()
1560 data[ei++] = mib->tx_bf_rx_fb_nr_cnt; in mt7915_get_et_stats()
1563 data[ei++] = mib->tx_bf_fb_cpl_cnt; in mt7915_get_et_stats()
1564 data[ei++] = mib->tx_bf_fb_trig_cnt; in mt7915_get_et_stats()
1567 data[ei++] = mib->tx_bf_cnt; in mt7915_get_et_stats()
1568 data[ei++] = mib->tx_mu_mpdu_cnt; in mt7915_get_et_stats()
1569 data[ei++] = mib->tx_mu_acked_mpdu_cnt; in mt7915_get_et_stats()
1570 data[ei++] = mib->tx_su_acked_mpdu_cnt; in mt7915_get_et_stats()
1572 /* Tx amsdu info (pack-count histogram) */ in mt7915_get_et_stats()
1573 for (i = 0; i < ARRAY_SIZE(mib->tx_amsdu); i++) in mt7915_get_et_stats()
1574 data[ei++] = mib->tx_amsdu[i]; in mt7915_get_et_stats()
1577 data[ei++] = mib->rx_fifo_full_cnt; in mt7915_get_et_stats()
1578 data[ei++] = mib->rx_mpdu_cnt; in mt7915_get_et_stats()
1579 data[ei++] = mib->channel_idle_cnt; in mt7915_get_et_stats()
1580 data[ei++] = mib->primary_cca_busy_time; in mt7915_get_et_stats()
1581 data[ei++] = mib->secondary_cca_busy_time; in mt7915_get_et_stats()
1582 data[ei++] = mib->primary_energy_detect_time; in mt7915_get_et_stats()
1583 data[ei++] = mib->cck_mdrdy_time; in mt7915_get_et_stats()
1584 data[ei++] = mib->ofdm_mdrdy_time; in mt7915_get_et_stats()
1585 data[ei++] = mib->green_mdrdy_time; in mt7915_get_et_stats()
1586 data[ei++] = mib->rx_vector_mismatch_cnt; in mt7915_get_et_stats()
1587 data[ei++] = mib->rx_delimiter_fail_cnt; in mt7915_get_et_stats()
1588 data[ei++] = mib->rx_mrdy_cnt; in mt7915_get_et_stats()
1589 data[ei++] = mib->rx_len_mismatch_cnt; in mt7915_get_et_stats()
1590 data[ei++] = mib->rx_ampdu_cnt; in mt7915_get_et_stats()
1591 data[ei++] = mib->rx_ampdu_bytes_cnt; in mt7915_get_et_stats()
1592 data[ei++] = mib->rx_ampdu_valid_subframe_cnt; in mt7915_get_et_stats()
1593 data[ei++] = mib->rx_ampdu_valid_subframe_bytes_cnt; in mt7915_get_et_stats()
1594 data[ei++] = mib->rx_pfdrop_cnt; in mt7915_get_et_stats()
1595 data[ei++] = mib->rx_vec_queue_overflow_drop_cnt; in mt7915_get_et_stats()
1596 data[ei++] = mib->rx_ba_cnt; in mt7915_get_et_stats()
1598 data[ei++] = mib->dl_cck_cnt; in mt7915_get_et_stats()
1599 data[ei++] = mib->dl_ofdm_cnt; in mt7915_get_et_stats()
1600 data[ei++] = mib->dl_htmix_cnt; in mt7915_get_et_stats()
1601 data[ei++] = mib->dl_htgf_cnt; in mt7915_get_et_stats()
1602 data[ei++] = mib->dl_vht_su_cnt; in mt7915_get_et_stats()
1603 data[ei++] = mib->dl_vht_2mu_cnt; in mt7915_get_et_stats()
1604 data[ei++] = mib->dl_vht_3mu_cnt; in mt7915_get_et_stats()
1605 data[ei++] = mib->dl_vht_4mu_cnt; in mt7915_get_et_stats()
1606 data[ei++] = mib->dl_he_su_cnt; in mt7915_get_et_stats()
1607 data[ei++] = mib->dl_he_ext_su_cnt; in mt7915_get_et_stats()
1608 data[ei++] = mib->dl_he_2ru_cnt; in mt7915_get_et_stats()
1609 data[ei++] = mib->dl_he_2mu_cnt; in mt7915_get_et_stats()
1610 data[ei++] = mib->dl_he_3ru_cnt; in mt7915_get_et_stats()
1611 data[ei++] = mib->dl_he_3mu_cnt; in mt7915_get_et_stats()
1612 data[ei++] = mib->dl_he_4ru_cnt; in mt7915_get_et_stats()
1613 data[ei++] = mib->dl_he_4mu_cnt; in mt7915_get_et_stats()
1614 data[ei++] = mib->dl_he_5to8ru_cnt; in mt7915_get_et_stats()
1615 data[ei++] = mib->dl_he_9to16ru_cnt; in mt7915_get_et_stats()
1616 data[ei++] = mib->dl_he_gtr16ru_cnt; in mt7915_get_et_stats()
1618 data[ei++] = mib->ul_hetrig_su_cnt; in mt7915_get_et_stats()
1619 data[ei++] = mib->ul_hetrig_2ru_cnt; in mt7915_get_et_stats()
1620 data[ei++] = mib->ul_hetrig_3ru_cnt; in mt7915_get_et_stats()
1621 data[ei++] = mib->ul_hetrig_4ru_cnt; in mt7915_get_et_stats()
1622 data[ei++] = mib->ul_hetrig_5to8ru_cnt; in mt7915_get_et_stats()
1623 data[ei++] = mib->ul_hetrig_9to16ru_cnt; in mt7915_get_et_stats()
1624 data[ei++] = mib->ul_hetrig_gtr16ru_cnt; in mt7915_get_et_stats()
1625 data[ei++] = mib->ul_hetrig_2mu_cnt; in mt7915_get_et_stats()
1626 data[ei++] = mib->ul_hetrig_3mu_cnt; in mt7915_get_et_stats()
1627 data[ei++] = mib->ul_hetrig_4mu_cnt; in mt7915_get_et_stats()
1633 mutex_unlock(&dev->mt76.mutex); in mt7915_get_et_stats()
1640 mt76_ethtool_page_pool_stats(&dev->mt76, &data[ei], &ei); in mt7915_get_et_stats()
1644 dev_err(dev->mt76.dev, "ei: %d size: %d", ei, stats_size); in mt7915_get_et_stats()
1652 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; in mt7915_twt_teardown_request()
1655 mutex_lock(&dev->mt76.mutex); in mt7915_twt_teardown_request()
1657 mutex_unlock(&dev->mt76.mutex); in mt7915_twt_teardown_request()
1671 struct mt7915_dev *dev = phy->dev; in mt7915_set_radar_background()
1672 int ret = -EINVAL; in mt7915_set_radar_background()
1675 mutex_lock(&dev->mt76.mutex); in mt7915_set_radar_background()
1677 if (dev->mt76.region == NL80211_DFS_UNSET) in mt7915_set_radar_background()
1680 if (dev->rdd2_phy && dev->rdd2_phy != phy) { in mt7915_set_radar_background()
1682 ret = -EBUSY; in mt7915_set_radar_background()
1687 running = dev->rdd2_phy && in mt7915_set_radar_background()
1688 cfg80211_chandef_valid(&dev->rdd2_chandef) && in mt7915_set_radar_background()
1689 !!(dev->rdd2_chandef.chan->flags & IEEE80211_CHAN_RADAR); in mt7915_set_radar_background()
1692 !(chandef->chan->flags & IEEE80211_CHAN_RADAR)) { in mt7915_set_radar_background()
1706 dev->rdd2_phy = chandef ? phy : NULL; in mt7915_set_radar_background()
1708 dev->rdd2_chandef = *chandef; in mt7915_set_radar_background()
1710 mutex_unlock(&dev->mt76.mutex); in mt7915_set_radar_background()
1723 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; in mt7915_net_fill_forward_path()
1724 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; in mt7915_net_fill_forward_path()
1727 struct mtk_wed_device *wed = &dev->mt76.mmio.wed; in mt7915_net_fill_forward_path()
1730 return -ENODEV; in mt7915_net_fill_forward_path()
1732 if (msta->wcid.idx > 0xff) in mt7915_net_fill_forward_path()
1733 return -EIO; in mt7915_net_fill_forward_path()
1735 path->type = DEV_PATH_MTK_WDMA; in mt7915_net_fill_forward_path()
1736 path->dev = ctx->dev; in mt7915_net_fill_forward_path()
1737 path->mtk_wdma.wdma_idx = wed->wdma_idx; in mt7915_net_fill_forward_path()
1738 path->mtk_wdma.bss = mvif->mt76.idx; in mt7915_net_fill_forward_path()
1739 path->mtk_wdma.wcid = is_mt7915(&dev->mt76) ? msta->wcid.idx : 0x3ff; in mt7915_net_fill_forward_path()
1740 path->mtk_wdma.queue = phy != &dev->phy; in mt7915_net_fill_forward_path()
1742 ctx->dev = NULL; in mt7915_net_fill_forward_path()
1755 ieee80211_queue_delayed_work(hw, &phy->mt76->mac_work, in mt7915_reconfig_complete()