Lines Matching +full:ac +full:- +full:link
1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2 /* Copyright(c) 2019-2020 Realtek Corporation
23 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_tx()
25 struct ieee80211_vif *vif = info->control.vif; in rtw89_ops_tx()
27 struct ieee80211_sta *sta = control->sta; in rtw89_ops_tx()
28 u32 flags = IEEE80211_SKB_CB(skb)->flags; in rtw89_ops_tx()
31 if (rtwvif->offchan && !(flags & IEEE80211_TX_CTL_TX_OFFCHAN) && sta) { in rtw89_ops_tx()
35 skb_queue_tail(&rtwsta->roc_queue, skb); in rtw89_ops_tx()
51 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_wake_tx_queue()
54 queue_work(rtwdev->txq_wq, &rtwdev->txq_work); in rtw89_ops_wake_tx_queue()
59 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_start()
61 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_start()
68 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_stop()
70 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_stop()
77 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_config()
79 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_config()
82 wiphy_work_cancel(hw->wiphy, &rtwdev->ips_work); in rtw89_ops_config()
87 !(hw->conf.flags & IEEE80211_CONF_IDLE)) in rtw89_ops_config()
92 &hw->conf.chandef); in rtw89_ops_config()
97 (hw->conf.flags & IEEE80211_CONF_IDLE) && in rtw89_ops_config()
98 !rtwdev->scanning) in rtw89_ops_config()
114 wiphy_work_init(&rtwvif_link->update_beacon_work, rtw89_core_update_beacon_work); in __rtw89_ops_add_iface_link()
115 wiphy_delayed_work_init(&rtwvif_link->csa_beacon_work, rtw89_core_csa_beacon_work); in __rtw89_ops_add_iface_link()
116 wiphy_delayed_work_init(&rtwvif_link->mcc_gc_detect_beacon_work, in __rtw89_ops_add_iface_link()
119 INIT_LIST_HEAD(&rtwvif_link->general_pkt_list); in __rtw89_ops_add_iface_link()
123 rtwvif_link->hit_rule = 0; in __rtw89_ops_add_iface_link()
124 rtwvif_link->bcn_hit_cond = 0; in __rtw89_ops_add_iface_link()
125 rtwvif_link->chanctx_assigned = false; in __rtw89_ops_add_iface_link()
126 rtwvif_link->chanctx_idx = RTW89_CHANCTX_0; in __rtw89_ops_add_iface_link()
127 rtwvif_link->reg_6ghz_power = RTW89_REG_6GHZ_POWER_DFLT; in __rtw89_ops_add_iface_link()
128 rtwvif_link->rand_tsf_done = false; in __rtw89_ops_add_iface_link()
129 rtwvif_link->detect_bcn_count = 0; in __rtw89_ops_add_iface_link()
134 ether_addr_copy(rtwvif_link->mac_addr, bss_conf->addr); in __rtw89_ops_add_iface_link()
149 lockdep_assert_wiphy(rtwdev->hw->wiphy); in __rtw89_ops_remove_iface_link()
151 wiphy_work_cancel(rtwdev->hw->wiphy, &rtwvif_link->update_beacon_work); in __rtw89_ops_remove_iface_link()
152 wiphy_delayed_work_cancel(rtwdev->hw->wiphy, &rtwvif_link->csa_beacon_work); in __rtw89_ops_remove_iface_link()
153 wiphy_delayed_work_cancel(rtwdev->hw->wiphy, in __rtw89_ops_remove_iface_link()
154 &rtwvif_link->mcc_gc_detect_beacon_work); in __rtw89_ops_remove_iface_link()
168 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_add_interface()
174 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_add_interface()
177 vif->addr, vif->type, vif->p2p); in rtw89_ops_add_interface()
181 if (RTW89_CHK_FW_FEATURE(BEACON_FILTER, &rtwdev->fw)) in rtw89_ops_add_interface()
182 vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER | in rtw89_ops_add_interface()
187 return -ENOSPC; in rtw89_ops_add_interface()
189 port = rtw89_core_acquire_bit_map(rtwdev->hw_port, RTW89_PORT_NUM); in rtw89_ops_add_interface()
191 ret = -ENOSPC; in rtw89_ops_add_interface()
197 rtw89_core_txq_init(rtwdev, vif->txq); in rtw89_ops_add_interface()
200 list_add_tail(&rtwvif->list, &rtwdev->rtwvifs_list); in rtw89_ops_add_interface()
201 INIT_LIST_HEAD(&rtwvif->mgnt_entry); in rtw89_ops_add_interface()
202 INIT_LIST_HEAD(&rtwvif->dlink_pool); in rtw89_ops_add_interface()
205 ether_addr_copy(rtwvif->mac_addr, vif->addr); in rtw89_ops_add_interface()
207 rtwvif->offchan = false; in rtw89_ops_add_interface()
208 rtwvif->roc.state = RTW89_ROC_IDLE; in rtw89_ops_add_interface()
209 wiphy_delayed_work_init(&rtwvif->roc.roc_work, rtw89_roc_work); in rtw89_ops_add_interface()
211 rtw89_traffic_stats_init(rtwdev, &rtwvif->stats); in rtw89_ops_add_interface()
215 ret = -EINVAL; in rtw89_ops_add_interface()
229 list_del_init(&rtwvif->list); in rtw89_ops_add_interface()
230 rtw89_core_release_bit_map(rtwdev->hw_port, port); in rtw89_ops_add_interface()
240 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_remove_interface()
246 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_remove_interface()
249 vif->addr, vif->type, vif->p2p); in rtw89_ops_remove_interface()
251 wiphy_delayed_work_cancel(hw->wiphy, &rtwvif->roc.roc_work); in rtw89_ops_remove_interface()
253 rtwvif_link = rtwvif->links[RTW89_VIF_IDLE_LINK_ID]; in rtw89_ops_remove_interface()
256 "%s: rtwvif link (link_id %u) is not active\n", in rtw89_ops_remove_interface()
266 list_del_init(&rtwvif->list); in rtw89_ops_remove_interface()
267 rtw89_core_release_bit_map(rtwdev->hw_port, port); in rtw89_ops_remove_interface()
278 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_change_interface()
281 set_bit(RTW89_FLAG_CHANGING_INTERFACE, rtwdev->flags); in rtw89_ops_change_interface()
283 rtw89_debug(rtwdev, RTW89_DBG_STATE, "change vif %pM (%d)->(%d), p2p (%d)->(%d)\n", in rtw89_ops_change_interface()
284 vif->addr, vif->type, type, vif->p2p, p2p); in rtw89_ops_change_interface()
288 vif->type = type; in rtw89_ops_change_interface()
289 vif->p2p = p2p; in rtw89_ops_change_interface()
295 clear_bit(RTW89_FLAG_CHANGING_INTERFACE, rtwdev->flags); in rtw89_ops_change_interface()
305 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_configure_filter()
306 const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def; in rtw89_ops_configure_filter()
309 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_configure_filter()
318 rtwdev->hal.rx_fltr &= ~B_AX_A_MC; in rtw89_ops_configure_filter()
320 rtwdev->hal.rx_fltr |= B_AX_A_MC; in rtw89_ops_configure_filter()
324 rtwdev->hal.rx_fltr |= B_AX_A_CRC32_ERR; in rtw89_ops_configure_filter()
326 rtwdev->hal.rx_fltr &= ~B_AX_A_CRC32_ERR; in rtw89_ops_configure_filter()
330 rtwdev->hal.rx_fltr &= ~B_AX_A_A1_MATCH; in rtw89_ops_configure_filter()
332 rtwdev->hal.rx_fltr |= B_AX_A_A1_MATCH; in rtw89_ops_configure_filter()
336 rtwdev->hal.rx_fltr &= ~B_AX_A_BCN_CHK_EN; in rtw89_ops_configure_filter()
337 rtwdev->hal.rx_fltr &= ~B_AX_A_BC; in rtw89_ops_configure_filter()
338 rtwdev->hal.rx_fltr &= ~B_AX_A_A1_MATCH; in rtw89_ops_configure_filter()
340 rtwdev->hal.rx_fltr |= B_AX_A_BCN_CHK_EN; in rtw89_ops_configure_filter()
341 rtwdev->hal.rx_fltr |= B_AX_A_BC; in rtw89_ops_configure_filter()
342 rtwdev->hal.rx_fltr |= B_AX_A_A1_MATCH; in rtw89_ops_configure_filter()
347 rtwdev->hal.rx_fltr &= ~B_AX_A_BC_CAM_MATCH; in rtw89_ops_configure_filter()
348 rtwdev->hal.rx_fltr &= ~B_AX_A_UC_CAM_MATCH; in rtw89_ops_configure_filter()
350 rtwdev->hal.rx_fltr |= B_AX_A_BC_CAM_MATCH; in rtw89_ops_configure_filter()
351 rtwdev->hal.rx_fltr |= B_AX_A_UC_CAM_MATCH; in rtw89_ops_configure_filter()
355 rx_fltr = rtwdev->hal.rx_fltr; in rtw89_ops_configure_filter()
362 if (rtwdev->scanning) { in rtw89_ops_configure_filter()
369 rtw89_mac_reg_by_idx(rtwdev, mac->rx_fltr, RTW89_MAC_0), in rtw89_ops_configure_filter()
372 if (!rtwdev->dbcc_en) in rtw89_ops_configure_filter()
375 rtw89_mac_reg_by_idx(rtwdev, mac->rx_fltr, RTW89_MAC_1), in rtw89_ops_configure_filter()
391 rtwvif_link->chanctx_idx); in rtw89_aifsn_to_aifs()
399 slot_time = bss_conf->use_short_slot ? 9 : 20; in rtw89_aifsn_to_aifs()
403 sifs = chan->band_type == RTW89_BAND_2G ? 10 : 16; in rtw89_aifsn_to_aifs()
409 struct rtw89_vif_link *rtwvif_link, u16 ac) in ____rtw89_conf_tx_edca() argument
411 struct ieee80211_tx_queue_params *params = &rtwvif_link->tx_params[ac]; in ____rtw89_conf_tx_edca()
416 /* 2^ecw - 1 = cw; ecw = log2(cw + 1) */ in ____rtw89_conf_tx_edca()
417 ecw_max = ilog2(params->cw_max + 1); in ____rtw89_conf_tx_edca()
418 ecw_min = ilog2(params->cw_min + 1); in ____rtw89_conf_tx_edca()
419 aifs = rtw89_aifsn_to_aifs(rtwdev, rtwvif_link, params->aifs); in ____rtw89_conf_tx_edca()
420 val = FIELD_PREP(FW_EDCA_PARAM_TXOPLMT_MSK, params->txop) | in ____rtw89_conf_tx_edca()
424 rtw89_fw_h2c_set_edca(rtwdev, rtwvif_link, ac_to_fw_idx[ac], val); in ____rtw89_conf_tx_edca()
438 struct rtw89_vif_link *rtwvif_link, u16 ac) in ____rtw89_conf_tx_mu_edca() argument
440 struct ieee80211_tx_queue_params *params = &rtwvif_link->tx_params[ac]; in ____rtw89_conf_tx_mu_edca()
442 int gen = rtwdev->chip->chip_gen; in ____rtw89_conf_tx_mu_edca()
448 if (!params->mu_edca) in ____rtw89_conf_tx_mu_edca()
451 mu_edca = ¶ms->mu_edca_param_rec; in ____rtw89_conf_tx_mu_edca()
452 aifsn = FIELD_GET(GENMASK(3, 0), mu_edca->aifsn); in ____rtw89_conf_tx_mu_edca()
454 timer_32us = mu_edca->mu_edca_timer << 8; in ____rtw89_conf_tx_mu_edca()
457 FIELD_PREP(B_AX_MUEDCA_BE_PARAM_0_CW_MASK, mu_edca->ecw_min_max) | in ____rtw89_conf_tx_mu_edca()
459 reg = rtw89_mac_reg_by_idx(rtwdev, ac_to_mu_edca_param[ac][gen], in ____rtw89_conf_tx_mu_edca()
460 rtwvif_link->mac_idx); in ____rtw89_conf_tx_mu_edca()
467 struct rtw89_vif_link *rtwvif_link, u16 ac) in __rtw89_conf_tx() argument
469 ____rtw89_conf_tx_edca(rtwdev, rtwvif_link, ac); in __rtw89_conf_tx()
470 ____rtw89_conf_tx_mu_edca(rtwdev, rtwvif_link, ac); in __rtw89_conf_tx()
476 u16 ac; in rtw89_conf_tx() local
478 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) in rtw89_conf_tx()
479 __rtw89_conf_tx(rtwdev, rtwvif_link, ac); in rtw89_conf_tx()
495 if (vif->type == NL80211_IFTYPE_STATION && !sta->tdls) { in __rtw89_ops_sta_add()
496 rtwvif->mlo_mode = RTW89_MLO_MODE_MLSR; in __rtw89_ops_sta_add()
503 return -ENOSPC; in __rtw89_ops_sta_add()
510 for (i = 0; i < ARRAY_SIZE(sta->txq); i++) in __rtw89_ops_sta_add()
511 rtw89_core_txq_init(rtwdev, sta->txq[i]); in __rtw89_ops_sta_add()
513 INIT_LIST_HEAD(&rtwsta->dlink_pool); in __rtw89_ops_sta_add()
515 skb_queue_head_init(&rtwsta->roc_queue); in __rtw89_ops_sta_add()
516 bitmap_zero(rtwsta->pairwise_sec_cam_map, RTW89_MAX_SEC_CAM_NUM); in __rtw89_ops_sta_add()
518 rtwsta_link = rtw89_sta_set_link(rtwsta, sta->deflink.link_id); in __rtw89_ops_sta_add()
520 ret = -EINVAL; in __rtw89_ops_sta_add()
524 rtwvif_link = rtwsta_link->rtwvif_link; in __rtw89_ops_sta_add()
530 if (vif->type == NL80211_IFTYPE_AP || sta->tdls) in __rtw89_ops_sta_add()
536 rtw89_sta_unset_link(rtwsta, sta->deflink.link_id); in __rtw89_ops_sta_add()
557 rtwvif_link = rtwsta_link->rtwvif_link; in __rtw89_ops_sta_assoc()
567 rtwdev->total_sta_assoc++; in __rtw89_ops_sta_assoc()
568 if (sta->tdls) in __rtw89_ops_sta_assoc()
569 rtwvif->tdls_peer++; in __rtw89_ops_sta_assoc()
586 rtwvif_link = rtwsta_link->rtwvif_link; in __rtw89_ops_sta_disassoc()
592 rtwsta->disassoc = true; in __rtw89_ops_sta_disassoc()
594 rtwdev->total_sta_assoc--; in __rtw89_ops_sta_disassoc()
595 if (sta->tdls) in __rtw89_ops_sta_disassoc()
596 rtwvif->tdls_peer--; in __rtw89_ops_sta_disassoc()
616 rtwvif_link = rtwsta_link->rtwvif_link; in __rtw89_ops_sta_disconnect()
637 rtwvif_link = rtwsta_link->rtwvif_link; in __rtw89_ops_sta_remove()
645 if (vif->type == NL80211_IFTYPE_AP || sta->tdls) { in __rtw89_ops_sta_remove()
658 if (vif->type != NL80211_IFTYPE_STATION) in rtw89_station_mode_sta_assoc()
661 sta = ieee80211_find_sta(vif, vif->cfg.ap_addr); in rtw89_station_mode_sta_assoc()
694 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_vif_cfg_changed()
697 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_vif_cfg_changed()
702 if (vif->cfg.assoc) { in rtw89_ops_vif_cfg_changed()
711 if (rtwdev->scanning) in rtw89_ops_vif_cfg_changed()
712 rtw89_hw_scan_abort(rtwdev, rtwdev->scan_info.scanning_vif); in rtw89_ops_vif_cfg_changed()
720 rtwvif->ip_addr = vif->cfg.arp_addr_list[0]; in rtw89_ops_vif_cfg_changed()
728 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_link_info_changed()
732 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_link_info_changed()
736 rtwvif_link = rtwvif->links[conf->link_id]; in rtw89_ops_link_info_changed()
739 "%s: rtwvif link (link_id %u) is not active\n", in rtw89_ops_link_info_changed()
740 __func__, conf->link_id); in rtw89_ops_link_info_changed()
745 ether_addr_copy(rtwvif_link->bssid, conf->bssid); in rtw89_ops_link_info_changed()
748 WRITE_ONCE(rtwvif_link->sync_bcn_tsf, 0); in rtw89_ops_link_info_changed()
777 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_start_ap()
783 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_start_ap()
785 rtwvif_link = rtwvif->links[link_conf->link_id]; in rtw89_ops_start_ap()
788 "%s: rtwvif link (link_id %u) is not active\n", in rtw89_ops_start_ap()
789 __func__, link_conf->link_id); in rtw89_ops_start_ap()
790 return -ENOLINK; in rtw89_ops_start_ap()
793 chan = rtw89_chan_get(rtwdev, rtwvif_link->chanctx_idx); in rtw89_ops_start_ap()
794 if (chan->band_type == RTW89_BAND_6G) in rtw89_ops_start_ap()
795 return -EOPNOTSUPP; in rtw89_ops_start_ap()
797 if (rtwdev->scanning) in rtw89_ops_start_ap()
798 rtw89_hw_scan_abort(rtwdev, rtwdev->scan_info.scanning_vif); in rtw89_ops_start_ap()
800 ether_addr_copy(rtwvif_link->bssid, link_conf->bssid); in rtw89_ops_start_ap()
809 if (RTW89_CHK_FW_FEATURE(NOTIFY_AP_INFO, &rtwdev->fw)) { in rtw89_ops_start_ap()
824 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_stop_ap()
828 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_stop_ap()
830 rtwvif_link = rtwvif->links[link_conf->link_id]; in rtw89_ops_stop_ap()
833 "%s: rtwvif link (link_id %u) is not active\n", in rtw89_ops_stop_ap()
834 __func__, link_conf->link_id); in rtw89_ops_stop_ap()
838 if (RTW89_CHK_FW_FEATURE(NOTIFY_AP_INFO, &rtwdev->fw)) in rtw89_ops_stop_ap()
850 struct rtw89_vif *rtwvif = rtwsta->rtwvif; in rtw89_ops_set_tim()
855 wiphy_work_queue(hw->wiphy, &rtwvif_link->update_beacon_work); in rtw89_ops_set_tim()
862 unsigned int link_id, u16 ac, in rtw89_ops_conf_tx() argument
865 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_conf_tx()
869 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_conf_tx()
873 rtwvif_link = rtwvif->links[link_id]; in rtw89_ops_conf_tx()
876 "%s: rtwvif link (link_id %u) is not active\n", in rtw89_ops_conf_tx()
878 return -ENOLINK; in rtw89_ops_conf_tx()
881 rtwvif_link->tx_params[ac] = *params; in rtw89_ops_conf_tx()
882 __rtw89_conf_tx(rtwdev, rtwvif_link, ac); in rtw89_ops_conf_tx()
893 struct rtw89_dev *rtwdev = hw->priv; in __rtw89_ops_sta_state()
901 if (vif->type == NL80211_IFTYPE_STATION && !sta->tdls) in __rtw89_ops_sta_state()
927 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_sta_state()
929 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_sta_state()
940 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_set_key()
943 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_set_key()
951 if (ret && ret != -EOPNOTSUPP) { in rtw89_ops_set_key()
957 rtw89_hci_flush_queues(rtwdev, BIT(rtwdev->hw->queues) - 1, in rtw89_ops_set_key()
959 rtw89_mac_flush_txq(rtwdev, BIT(rtwdev->hw->queues) - 1, false); in rtw89_ops_set_key()
975 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_ampdu_action()
976 struct ieee80211_sta *sta = params->sta; in rtw89_ops_ampdu_action()
979 u16 tid = params->tid; in rtw89_ops_ampdu_action()
980 struct ieee80211_txq *txq = sta->txq[tid]; in rtw89_ops_ampdu_action()
981 struct rtw89_txq *rtwtxq = (struct rtw89_txq *)txq->drv_priv; in rtw89_ops_ampdu_action()
983 lockdep_assert_wiphy(rtwdev->hw->wiphy); in rtw89_ops_ampdu_action()
985 switch (params->action) { in rtw89_ops_ampdu_action()
991 clear_bit(RTW89_TXQ_F_AMPDU, &rtwtxq->flags); in rtw89_ops_ampdu_action()
992 clear_bit(tid, rtwsta->ampdu_map); in rtw89_ops_ampdu_action()
994 ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid); in rtw89_ops_ampdu_action()
997 set_bit(RTW89_TXQ_F_AMPDU, &rtwtxq->flags); in rtw89_ops_ampdu_action()
998 rtwsta->ampdu_params[tid].agg_num = params->buf_size; in rtw89_ops_ampdu_action()
999 rtwsta->ampdu_params[tid].amsdu = params->amsdu; in rtw89_ops_ampdu_action()
1000 set_bit(tid, rtwsta->ampdu_map); in rtw89_ops_ampdu_action()
1012 return -ENOTSUPP; in rtw89_ops_ampdu_action()
1021 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_set_rts_threshold()
1023 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_set_rts_threshold()
1026 if (test_bit(RTW89_FLAG_POWERON, rtwdev->flags)) in rtw89_ops_set_rts_threshold()
1044 sinfo->txrate = rtwsta_link->ra_report.txrate; in rtw89_ops_sta_statistics()
1045 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); in rtw89_ops_sta_statistics()
1065 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_flush()
1067 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_flush()
1072 if (drop && !RTW89_CHK_FW_FEATURE(NO_PACKET_DROP, &rtwdev->fw)) in rtw89_ops_flush()
1088 struct rtw89_vif *rtwvif = rtwsta->rtwvif; in rtw89_ra_mask_info_update_iter()
1093 if (vif != br_data->vif || vif->p2p) in rtw89_ra_mask_info_update_iter()
1097 rtwsta_link->use_cfg_mask = true; in rtw89_ra_mask_info_update_iter()
1098 rtwsta_link->mask = *br_data->mask; in rtw89_ra_mask_info_update_iter()
1101 rtw89_phy_ra_update_sta(br_data->rtwdev, sta, IEEE80211_RC_SUPP_RATES_CHANGED); in rtw89_ra_mask_info_update_iter()
1112 ieee80211_iterate_stations_atomic(rtwdev->hw, rtw89_ra_mask_info_update_iter, in rtw89_ra_mask_info_update()
1120 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_set_bitrate_mask()
1122 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_set_bitrate_mask()
1133 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_set_antenna()
1134 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_ops_set_antenna()
1136 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_set_antenna()
1138 if (hal->ant_diversity) { in rtw89_ops_set_antenna()
1140 return -EINVAL; in rtw89_ops_set_antenna()
1141 } else if (rx_ant != hw->wiphy->available_antennas_rx && rx_ant != hal->antenna_rx) { in rtw89_ops_set_antenna()
1142 return -EINVAL; in rtw89_ops_set_antenna()
1145 hal->antenna_tx = tx_ant; in rtw89_ops_set_antenna()
1146 hal->antenna_rx = rx_ant; in rtw89_ops_set_antenna()
1147 hal->tx_path_diversity = false; in rtw89_ops_set_antenna()
1148 hal->ant_diversity_fixed = true; in rtw89_ops_set_antenna()
1157 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_get_antenna()
1158 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_ops_get_antenna()
1160 *tx_ant = hal->antenna_tx; in rtw89_ops_get_antenna()
1161 *rx_ant = hal->antenna_rx; in rtw89_ops_get_antenna()
1170 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_sw_scan_start()
1174 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_sw_scan_start()
1178 rtw89_err(rtwdev, "sw scan start: find no designated link\n"); in rtw89_ops_sw_scan_start()
1190 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_sw_scan_complete()
1194 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_sw_scan_complete()
1198 rtw89_err(rtwdev, "sw scan complete: find no designated link\n"); in rtw89_ops_sw_scan_complete()
1208 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_reconfig_complete()
1217 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_hw_scan()
1222 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_hw_scan()
1224 if (!RTW89_CHK_FW_FEATURE(SCAN_OFFLOAD, &rtwdev->fw)) in rtw89_ops_hw_scan()
1227 if (rtwdev->scanning || rtwvif->offchan) in rtw89_ops_hw_scan()
1228 return -EBUSY; in rtw89_ops_hw_scan()
1232 rtw89_err(rtwdev, "hw scan: find no designated link\n"); in rtw89_ops_hw_scan()
1233 return -ENOLINK; in rtw89_ops_hw_scan()
1255 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_cancel_hw_scan()
1259 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_cancel_hw_scan()
1261 if (!RTW89_CHK_FW_FEATURE(SCAN_OFFLOAD, &rtwdev->fw)) in rtw89_ops_cancel_hw_scan()
1264 if (!rtwdev->scanning) in rtw89_ops_cancel_hw_scan()
1269 rtw89_err(rtwdev, "cancel hw scan: find no designated link\n"); in rtw89_ops_cancel_hw_scan()
1281 struct rtw89_sta *rtwsta = sta_to_rtwsta(link_sta->sta); in rtw89_ops_sta_rc_update()
1282 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_sta_rc_update()
1285 rtwsta_link = rtwsta->links[link_sta->link_id]; in rtw89_ops_sta_rc_update()
1295 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_add_chanctx()
1297 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_add_chanctx()
1305 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_remove_chanctx()
1307 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_remove_chanctx()
1316 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_change_chanctx()
1318 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_change_chanctx()
1328 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_assign_vif_chanctx()
1332 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_assign_vif_chanctx()
1334 rtwvif_link = rtwvif->links[link_conf->link_id]; in rtw89_ops_assign_vif_chanctx()
1337 "%s: rtwvif link (link_id %u) is not active\n", in rtw89_ops_assign_vif_chanctx()
1338 __func__, link_conf->link_id); in rtw89_ops_assign_vif_chanctx()
1339 return -ENOLINK; in rtw89_ops_assign_vif_chanctx()
1350 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_unassign_vif_chanctx()
1354 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_unassign_vif_chanctx()
1356 rtwvif_link = rtwvif->links[link_conf->link_id]; in rtw89_ops_unassign_vif_chanctx()
1359 "%s: rtwvif link (link_id %u) is not active\n", in rtw89_ops_unassign_vif_chanctx()
1360 __func__, link_conf->link_id); in rtw89_ops_unassign_vif_chanctx()
1373 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_switch_vif_chanctx()
1378 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_switch_vif_chanctx()
1388 return -EOPNOTSUPP; in rtw89_ops_switch_vif_chanctx()
1393 struct ieee80211_bss_conf *link_conf = p->link_conf; in rtw89_ops_switch_vif_chanctx()
1394 struct rtw89_vif *rtwvif = vif_to_rtwvif(p->vif); in rtw89_ops_switch_vif_chanctx()
1397 rtwvif_link = rtwvif->links[link_conf->link_id]; in rtw89_ops_switch_vif_chanctx()
1400 "%s: rtwvif link (link_id %u) is not active\n", in rtw89_ops_switch_vif_chanctx()
1401 __func__, link_conf->link_id); in rtw89_ops_switch_vif_chanctx()
1402 return -ENOLINK; in rtw89_ops_switch_vif_chanctx()
1406 p->old_ctx, p->new_ctx, in rtw89_ops_switch_vif_chanctx()
1420 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_channel_switch_beacon()
1427 rtw89_err(rtwdev, "chsw bcn: find no link on HW-0\n"); in rtw89_ops_channel_switch_beacon()
1431 wiphy_delayed_work_queue(hw->wiphy, &rtwvif_link->csa_beacon_work, 0); in rtw89_ops_channel_switch_beacon()
1440 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_remain_on_channel()
1442 struct rtw89_roc *roc = &rtwvif->roc; in rtw89_ops_remain_on_channel()
1444 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_remain_on_channel()
1447 return -EINVAL; in rtw89_ops_remain_on_channel()
1449 if (roc->state != RTW89_ROC_IDLE) { in rtw89_ops_remain_on_channel()
1450 return -EBUSY; in rtw89_ops_remain_on_channel()
1453 if (rtwdev->scanning) in rtw89_ops_remain_on_channel()
1454 rtw89_hw_scan_abort(rtwdev, rtwdev->scan_info.scanning_vif); in rtw89_ops_remain_on_channel()
1457 roc->state = RTW89_ROC_MGMT; in rtw89_ops_remain_on_channel()
1459 roc->state = RTW89_ROC_NORMAL; in rtw89_ops_remain_on_channel()
1461 roc->duration = duration; in rtw89_ops_remain_on_channel()
1462 roc->chan = *chan; in rtw89_ops_remain_on_channel()
1463 roc->type = type; in rtw89_ops_remain_on_channel()
1473 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_cancel_remain_on_channel()
1476 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_cancel_remain_on_channel()
1479 return -EINVAL; in rtw89_ops_cancel_remain_on_channel()
1481 wiphy_delayed_work_cancel(hw->wiphy, &rtwvif->roc.roc_work); in rtw89_ops_cancel_remain_on_channel()
1492 struct rtw89_dev *rtwdev = rtwsta->rtwdev; in rtw89_set_tid_config_iter()
1502 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_set_tid_config()
1504 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_set_tid_config()
1509 ieee80211_iterate_stations_atomic(rtwdev->hw, in rtw89_ops_set_tid_config()
1522 if (vif->type != NL80211_IFTYPE_STATION && in rtw89_can_work_on_links()
1526 return w <= rtwvif->links_inst_valid_num; in rtw89_can_work_on_links()
1533 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_can_activate_links()
1535 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_can_activate_links()
1548 rtwvif_link = rtwvif->links[link_id]; in __rtw89_ops_clr_vif_links()
1569 return -EINVAL; in __rtw89_ops_set_vif_links()
1573 rtw89_err(rtwdev, "%s: failed to add iface (link id %u)\n", in __rtw89_ops_set_vif_links()
1588 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_change_vif_links()
1597 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_change_vif_links()
1600 "%s: old_links (0x%08x) -> new_links (0x%08x)\n", in rtw89_ops_change_vif_links()
1604 return -EOPNOTSUPP; in rtw89_ops_change_vif_links()
1609 return -ENOMEM; in rtw89_ops_change_vif_links()
1611 for (i = 0; i < ARRAY_SIZE(snap->link_conf); i++) in rtw89_ops_change_vif_links()
1612 snap->link_conf[i] = old[i]; in rtw89_ops_change_vif_links()
1614 rcu_assign_pointer(rtwvif->snap_link_confs, snap); in rtw89_ops_change_vif_links()
1620 if (rtwdev->scanning) in rtw89_ops_change_vif_links()
1621 rtw89_hw_scan_abort(rtwdev, rtwdev->scan_info.scanning_vif); in rtw89_ops_change_vif_links()
1633 rcu_assign_pointer(rtwvif->snap_link_confs, NULL); in rtw89_ops_change_vif_links()
1667 rtwsta_link = rtwsta->links[link_id]; in __rtw89_ops_clr_sta_links()
1671 rtwvif_link = rtwsta_link->rtwvif_link; in __rtw89_ops_clr_sta_links()
1694 return -EINVAL; in __rtw89_ops_set_sta_links()
1696 rtwvif_link = rtwsta_link->rtwvif_link; in __rtw89_ops_set_sta_links()
1700 rtw89_err(rtwdev, "%s: failed to add sta (link id %u)\n", in __rtw89_ops_set_sta_links()
1709 rtw89_err(rtwdev, "%s: failed to assoc sta (link id %u)\n", in __rtw89_ops_set_sta_links()
1716 for_each_set_bit(sec_cam_idx, rtwsta->pairwise_sec_cam_map, in __rtw89_ops_set_sta_links()
1724 "%s: failed to apply pairwise key (link id %u)\n", in __rtw89_ops_set_sta_links()
1740 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_change_sta_links()
1746 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_change_sta_links()
1749 "%s: old_links (0x%08x) -> new_links (0x%08x)\n", in rtw89_ops_change_sta_links()
1753 return -EOPNOTSUPP; in rtw89_ops_change_sta_links()
1773 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_suspend()
1776 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_suspend()
1778 set_bit(RTW89_FLAG_FORBIDDEN_TRACK_WORK, rtwdev->flags); in rtw89_ops_suspend()
1779 wiphy_delayed_work_cancel(hw->wiphy, &rtwdev->track_work); in rtw89_ops_suspend()
1780 wiphy_delayed_work_cancel(hw->wiphy, &rtwdev->track_ps_work); in rtw89_ops_suspend()
1785 clear_bit(RTW89_FLAG_FORBIDDEN_TRACK_WORK, rtwdev->flags); in rtw89_ops_suspend()
1794 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_resume()
1797 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_resume()
1803 clear_bit(RTW89_FLAG_FORBIDDEN_TRACK_WORK, rtwdev->flags); in rtw89_ops_resume()
1804 wiphy_delayed_work_queue(hw->wiphy, &rtwdev->track_work, in rtw89_ops_resume()
1806 wiphy_delayed_work_queue(hw->wiphy, &rtwdev->track_ps_work, in rtw89_ops_resume()
1814 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_set_wakeup()
1816 device_set_wakeup_enable(rtwdev->dev, enabled); in rtw89_ops_set_wakeup()
1823 struct rtw89_dev *rtwdev = hw->priv; in rtw89_set_rekey_data()
1824 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_set_rekey_data()
1825 struct rtw89_wow_gtk_info *gtk_info = &rtw_wow->gtk_info; in rtw89_set_rekey_data()
1827 lockdep_assert_wiphy(hw->wiphy); in rtw89_set_rekey_data()
1829 if (data->kek_len > sizeof(gtk_info->kek) || in rtw89_set_rekey_data()
1830 data->kck_len > sizeof(gtk_info->kck)) { in rtw89_set_rekey_data()
1835 memcpy(gtk_info->kek, data->kek, data->kek_len); in rtw89_set_rekey_data()
1836 memcpy(gtk_info->kck, data->kck, data->kck_len); in rtw89_set_rekey_data()
1842 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_rfkill_poll()
1844 lockdep_assert_wiphy(hw->wiphy); in rtw89_ops_rfkill_poll()
1847 if (test_bit(RTW89_FLAG_RUNNING, rtwdev->flags)) in rtw89_ops_rfkill_poll()