Lines Matching +full:in +full:- +full:band
1 // SPDX-License-Identifier: BSD-3-Clause-Clear
3 * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
20 .band = NL80211_BAND_2GHZ, \
29 .band = NL80211_BAND_5GHZ, \
38 .band = NL80211_BAND_6GHZ, \
231 #define ath11k_a_rates_size (ARRAY_SIZE(ath11k_legacy_rates) - 4)
233 #define ATH11K_MAC_SCAN_TIMEOUT_MSECS 200 /* in msecs */
305 return -EINVAL; in ath11k_mac_hw_ratecode_to_legacy_rate()
326 for (i = 0; i < sband->n_bitrates; i++) in ath11k_mac_bitrate_to_idx()
327 if (sband->bitrates[i].bitrate == bitrate) in ath11k_mac_bitrate_to_idx()
338 for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--) in ath11k_mac_max_ht_nss()
350 for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--) in ath11k_mac_max_vht_nss()
398 conf = rcu_dereference(vif->chanctx_conf); in ath11k_mac_vif_chan()
401 return -ENOENT; in ath11k_mac_vif_chan()
404 *def = conf->def; in ath11k_mac_vif_chan()
429 for (i = 0; i < sband->n_bitrates; i++) { in ath11k_mac_hw_rate_to_idx()
430 rate = &sband->bitrates[i]; in ath11k_mac_hw_rate_to_idx()
432 if (ath11k_mac_bitrate_is_cck(rate->bitrate) != cck) in ath11k_mac_hw_rate_to_idx()
435 if (rate->hw_value == hw_rate) in ath11k_mac_hw_rate_to_idx()
437 else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE && in ath11k_mac_hw_rate_to_idx()
438 rate->hw_value_short == hw_rate) in ath11k_mac_hw_rate_to_idx()
455 struct ath11k_vif *arvif = (void *)vif->drv_priv; in ath11k_get_arvif_iter()
457 if (arvif->vdev_id == arvif_iter->vdev_id) in ath11k_get_arvif_iter()
458 arvif_iter->arvif = arvif; in ath11k_get_arvif_iter()
470 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath11k_mac_get_arvif()
475 ath11k_warn(ar->ab, "No VIF found for vdev %d\n", vdev_id); in ath11k_mac_get_arvif()
489 for (i = 0; i < ab->num_radios; i++) { in ath11k_mac_get_arvif_by_vdev_id()
490 pdev = rcu_dereference(ab->pdevs_active[i]); in ath11k_mac_get_arvif_by_vdev_id()
491 if (pdev && pdev->ar) { in ath11k_mac_get_arvif_by_vdev_id()
492 arvif = ath11k_mac_get_arvif(pdev->ar, vdev_id); in ath11k_mac_get_arvif_by_vdev_id()
506 for (i = 0; i < ab->num_radios; i++) { in ath11k_mac_get_ar_by_vdev_id()
507 pdev = rcu_dereference(ab->pdevs_active[i]); in ath11k_mac_get_ar_by_vdev_id()
508 if (pdev && pdev->ar) { in ath11k_mac_get_ar_by_vdev_id()
509 if (pdev->ar->allocated_vdev_map & (1LL << vdev_id)) in ath11k_mac_get_ar_by_vdev_id()
510 return pdev->ar; in ath11k_mac_get_ar_by_vdev_id()
522 if (ab->hw_params.single_pdev_only) { in ath11k_mac_get_ar_by_pdev_id()
523 pdev = rcu_dereference(ab->pdevs_active[0]); in ath11k_mac_get_ar_by_pdev_id()
524 return pdev ? pdev->ar : NULL; in ath11k_mac_get_ar_by_pdev_id()
527 if (WARN_ON(pdev_id > ab->num_radios)) in ath11k_mac_get_ar_by_pdev_id()
530 for (i = 0; i < ab->num_radios; i++) { in ath11k_mac_get_ar_by_pdev_id()
531 pdev = rcu_dereference(ab->pdevs_active[i]); in ath11k_mac_get_ar_by_pdev_id()
533 if (pdev && pdev->pdev_id == pdev_id) in ath11k_mac_get_ar_by_pdev_id()
534 return (pdev->ar ? pdev->ar : NULL); in ath11k_mac_get_ar_by_pdev_id()
542 struct ath11k_base *ab = ar->ab; in ath11k_pdev_caps_update()
544 ar->max_tx_power = ab->target_caps.hw_max_tx_power; in ath11k_pdev_caps_update()
546 /* FIXME Set min_tx_power to ab->target_caps.hw_min_tx_power. in ath11k_pdev_caps_update()
547 * But since the received value in svcrdy is same as hw_max_tx_power, in ath11k_pdev_caps_update()
548 * we can set ar->min_tx_power to 0 currently until in ath11k_pdev_caps_update()
549 * this is fixed in firmware in ath11k_pdev_caps_update()
551 ar->min_tx_power = 0; in ath11k_pdev_caps_update()
553 ar->txpower_limit_2g = ar->max_tx_power; in ath11k_pdev_caps_update()
554 ar->txpower_limit_5g = ar->max_tx_power; in ath11k_pdev_caps_update()
555 ar->txpower_scale = WMI_HOST_TP_SCALE_MAX; in ath11k_pdev_caps_update()
560 struct ath11k_pdev *pdev = ar->pdev; in ath11k_mac_txpower_recalc()
562 int ret, txpower = -1; in ath11k_mac_txpower_recalc()
565 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_txpower_recalc()
567 list_for_each_entry(arvif, &ar->arvifs, list) { in ath11k_mac_txpower_recalc()
568 if (arvif->txpower <= 0) in ath11k_mac_txpower_recalc()
571 if (txpower == -1) in ath11k_mac_txpower_recalc()
572 txpower = arvif->txpower; in ath11k_mac_txpower_recalc()
574 txpower = min(txpower, arvif->txpower); in ath11k_mac_txpower_recalc()
577 if (txpower == -1) in ath11k_mac_txpower_recalc()
580 /* txpwr is set as 2 units per dBm in FW*/ in ath11k_mac_txpower_recalc()
581 txpower = min_t(u32, max_t(u32, ar->min_tx_power, txpower), in ath11k_mac_txpower_recalc()
582 ar->max_tx_power) * 2; in ath11k_mac_txpower_recalc()
584 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower to set in hw %d\n", in ath11k_mac_txpower_recalc()
587 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) && in ath11k_mac_txpower_recalc()
588 ar->txpower_limit_2g != txpower) { in ath11k_mac_txpower_recalc()
591 txpower, ar->pdev->pdev_id); in ath11k_mac_txpower_recalc()
594 ar->txpower_limit_2g = txpower; in ath11k_mac_txpower_recalc()
597 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) && in ath11k_mac_txpower_recalc()
598 ar->txpower_limit_5g != txpower) { in ath11k_mac_txpower_recalc()
601 txpower, ar->pdev->pdev_id); in ath11k_mac_txpower_recalc()
604 ar->txpower_limit_5g = txpower; in ath11k_mac_txpower_recalc()
610 ath11k_warn(ar->ab, "failed to recalc txpower limit %d using pdev param %d: %d\n", in ath11k_mac_txpower_recalc()
617 struct ath11k *ar = arvif->ar; in ath11k_recalc_rtscts_prot()
621 lockdep_assert_held(&ar->conf_mutex); in ath11k_recalc_rtscts_prot()
626 * are in BSS) or by default only for second rate series. in ath11k_recalc_rtscts_prot()
627 * TODO: Check if we need to enable CTS 2 Self in any case in ath11k_recalc_rtscts_prot()
631 if (arvif->num_legacy_stations > 0) in ath11k_recalc_rtscts_prot()
637 if (arvif->rtscts_prot_mode == rts_cts) in ath11k_recalc_rtscts_prot()
640 arvif->rtscts_prot_mode = rts_cts; in ath11k_recalc_rtscts_prot()
642 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev %d recalc rts/cts prot %d\n", in ath11k_recalc_rtscts_prot()
643 arvif->vdev_id, rts_cts); in ath11k_recalc_rtscts_prot()
645 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_recalc_rtscts_prot()
648 ath11k_warn(ar->ab, "failed to recalculate rts/cts prot for vdev %d: %d\n", in ath11k_recalc_rtscts_prot()
649 arvif->vdev_id, ret); in ath11k_recalc_rtscts_prot()
656 struct ath11k *ar = arvif->ar; in ath11k_mac_set_kickout()
662 ar->pdev->pdev_id); in ath11k_mac_set_kickout()
664 ath11k_warn(ar->ab, "failed to set kickout threshold on vdev %i: %d\n", in ath11k_mac_set_kickout()
665 arvif->vdev_id, ret); in ath11k_mac_set_kickout()
670 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, in ath11k_mac_set_kickout()
673 ath11k_warn(ar->ab, "failed to set keepalive minimum idle time on vdev %i: %d\n", in ath11k_mac_set_kickout()
674 arvif->vdev_id, ret); in ath11k_mac_set_kickout()
679 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, in ath11k_mac_set_kickout()
682 ath11k_warn(ar->ab, "failed to set keepalive maximum idle time on vdev %i: %d\n", in ath11k_mac_set_kickout()
683 arvif->vdev_id, ret); in ath11k_mac_set_kickout()
688 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, in ath11k_mac_set_kickout()
691 ath11k_warn(ar->ab, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n", in ath11k_mac_set_kickout()
692 arvif->vdev_id, ret); in ath11k_mac_set_kickout()
702 struct ath11k_base *ab = ar->ab; in ath11k_mac_peer_cleanup_all()
704 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_peer_cleanup_all()
706 spin_lock_bh(&ab->base_lock); in ath11k_mac_peer_cleanup_all()
707 list_for_each_entry_safe(peer, tmp, &ab->peers, list) { in ath11k_mac_peer_cleanup_all()
709 list_del(&peer->list); in ath11k_mac_peer_cleanup_all()
712 spin_unlock_bh(&ab->base_lock); in ath11k_mac_peer_cleanup_all()
714 ar->num_peers = 0; in ath11k_mac_peer_cleanup_all()
715 ar->num_stations = 0; in ath11k_mac_peer_cleanup_all()
722 ret = ath11k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr); in ath11k_monitor_vdev_up()
724 ath11k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n", in ath11k_monitor_vdev_up()
729 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac monitor vdev %i started\n", in ath11k_monitor_vdev_up()
746 struct ath11k *ar = arvif->ar; in ath11k_mac_setup_bcn_tmpl()
747 struct ath11k_base *ab = ar->ab; in ath11k_mac_setup_bcn_tmpl()
748 struct ieee80211_hw *hw = ar->hw; in ath11k_mac_setup_bcn_tmpl()
749 struct ieee80211_vif *vif = arvif->vif; in ath11k_mac_setup_bcn_tmpl()
756 if (arvif->vdev_type != WMI_VDEV_TYPE_AP) in ath11k_mac_setup_bcn_tmpl()
762 return -EPERM; in ath11k_mac_setup_bcn_tmpl()
765 ies = bcn->data + ieee80211_get_hdrlen_from_skb(bcn); in ath11k_mac_setup_bcn_tmpl()
766 ies += sizeof(mgmt->u.beacon); in ath11k_mac_setup_bcn_tmpl()
768 if (cfg80211_find_ie(WLAN_EID_RSN, ies, (skb_tail_pointer(bcn) - ies))) in ath11k_mac_setup_bcn_tmpl()
769 arvif->rsnie_present = true; in ath11k_mac_setup_bcn_tmpl()
773 ies, (skb_tail_pointer(bcn) - ies))) in ath11k_mac_setup_bcn_tmpl()
774 arvif->wpaie_present = true; in ath11k_mac_setup_bcn_tmpl()
776 ret = ath11k_wmi_bcn_tmpl(ar, arvif->vdev_id, &offs, bcn); in ath11k_mac_setup_bcn_tmpl()
790 struct ath11k *ar = arvif->ar; in ath11k_control_beaconing()
793 lockdep_assert_held(&arvif->ar->conf_mutex); in ath11k_control_beaconing()
795 if (!info->enable_beacon) { in ath11k_control_beaconing()
796 ret = ath11k_wmi_vdev_down(ar, arvif->vdev_id); in ath11k_control_beaconing()
798 ath11k_warn(ar->ab, "failed to down vdev_id %i: %d\n", in ath11k_control_beaconing()
799 arvif->vdev_id, ret); in ath11k_control_beaconing()
801 arvif->is_up = false; in ath11k_control_beaconing()
808 ath11k_warn(ar->ab, "failed to update bcn tmpl during vdev up: %d\n", in ath11k_control_beaconing()
813 arvif->tx_seq_no = 0x1000; in ath11k_control_beaconing()
815 arvif->aid = 0; in ath11k_control_beaconing()
817 ether_addr_copy(arvif->bssid, info->bssid); in ath11k_control_beaconing()
819 ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, in ath11k_control_beaconing()
820 arvif->bssid); in ath11k_control_beaconing()
822 ath11k_warn(ar->ab, "failed to bring up vdev %d: %i\n", in ath11k_control_beaconing()
823 arvif->vdev_id, ret); in ath11k_control_beaconing()
827 arvif->is_up = true; in ath11k_control_beaconing()
829 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id); in ath11k_control_beaconing()
836 struct ieee80211_mgmt *mgmt = (void *)skb->data; in ath11k_mac_handle_beacon_iter()
837 struct ath11k_vif *arvif = (void *)vif->drv_priv; in ath11k_mac_handle_beacon_iter()
839 if (vif->type != NL80211_IFTYPE_STATION) in ath11k_mac_handle_beacon_iter()
842 if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid)) in ath11k_mac_handle_beacon_iter()
845 cancel_delayed_work(&arvif->connection_loss_work); in ath11k_mac_handle_beacon_iter()
850 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath11k_mac_handle_beacon()
860 struct ath11k_vif *arvif = (void *)vif->drv_priv; in ath11k_mac_handle_beacon_miss_iter()
861 struct ath11k *ar = arvif->ar; in ath11k_mac_handle_beacon_miss_iter()
862 struct ieee80211_hw *hw = ar->hw; in ath11k_mac_handle_beacon_miss_iter()
864 if (arvif->vdev_id != *vdev_id) in ath11k_mac_handle_beacon_miss_iter()
867 if (!arvif->is_up) in ath11k_mac_handle_beacon_miss_iter()
877 ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work, in ath11k_mac_handle_beacon_miss_iter()
883 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath11k_mac_handle_beacon_miss()
893 struct ieee80211_vif *vif = arvif->vif; in ath11k_mac_vif_sta_connection_loss_work()
895 if (!arvif->is_up) in ath11k_mac_vif_sta_connection_loss_work()
906 struct ath11k_vif *arvif = (void *)vif->drv_priv; in ath11k_peer_assoc_h_basic()
909 lockdep_assert_held(&ar->conf_mutex); in ath11k_peer_assoc_h_basic()
911 if (vif->type == NL80211_IFTYPE_STATION) in ath11k_peer_assoc_h_basic()
912 aid = vif->bss_conf.aid; in ath11k_peer_assoc_h_basic()
914 aid = sta->aid; in ath11k_peer_assoc_h_basic()
916 ether_addr_copy(arg->peer_mac, sta->addr); in ath11k_peer_assoc_h_basic()
917 arg->vdev_id = arvif->vdev_id; in ath11k_peer_assoc_h_basic()
918 arg->peer_associd = aid; in ath11k_peer_assoc_h_basic()
919 arg->auth_flag = true; in ath11k_peer_assoc_h_basic()
920 /* TODO: STA WAR in ath10k for listen interval required? */ in ath11k_peer_assoc_h_basic()
921 arg->peer_listen_intval = ar->hw->conf.listen_interval; in ath11k_peer_assoc_h_basic()
922 arg->peer_nss = 1; in ath11k_peer_assoc_h_basic()
923 arg->peer_caps = vif->bss_conf.assoc_capability; in ath11k_peer_assoc_h_basic()
931 struct ieee80211_bss_conf *info = &vif->bss_conf; in ath11k_peer_assoc_h_crypto()
934 struct ath11k_vif *arvif = (struct ath11k_vif *)vif->drv_priv; in ath11k_peer_assoc_h_crypto()
938 lockdep_assert_held(&ar->conf_mutex); in ath11k_peer_assoc_h_crypto()
943 bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid, NULL, 0, in ath11k_peer_assoc_h_crypto()
946 if (arvif->rsnie_present || arvif->wpaie_present) { in ath11k_peer_assoc_h_crypto()
947 arg->need_ptk_4_way = true; in ath11k_peer_assoc_h_crypto()
948 if (arvif->wpaie_present) in ath11k_peer_assoc_h_crypto()
949 arg->need_gtk_2_way = true; in ath11k_peer_assoc_h_crypto()
956 ies = rcu_dereference(bss->ies); in ath11k_peer_assoc_h_crypto()
960 ies->data, in ath11k_peer_assoc_h_crypto()
961 ies->len); in ath11k_peer_assoc_h_crypto()
963 cfg80211_put_bss(ar->hw->wiphy, bss); in ath11k_peer_assoc_h_crypto()
968 ath11k_dbg(ar->ab, ATH11K_DBG_WMI, in ath11k_peer_assoc_h_crypto()
970 arg->need_ptk_4_way = true; in ath11k_peer_assoc_h_crypto()
974 ath11k_dbg(ar->ab, ATH11K_DBG_WMI, in ath11k_peer_assoc_h_crypto()
976 arg->need_gtk_2_way = true; in ath11k_peer_assoc_h_crypto()
979 if (sta->mfp) { in ath11k_peer_assoc_h_crypto()
981 arg->is_pmf_enabled = true; in ath11k_peer_assoc_h_crypto()
984 /* TODO: safe_mode_enabled (bypass 4-way handshake) flag req? */ in ath11k_peer_assoc_h_crypto()
992 struct ath11k_vif *arvif = (void *)vif->drv_priv; in ath11k_peer_assoc_h_rates()
993 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates; in ath11k_peer_assoc_h_rates()
997 enum nl80211_band band; in ath11k_peer_assoc_h_rates() local
1002 lockdep_assert_held(&ar->conf_mutex); in ath11k_peer_assoc_h_rates()
1007 band = def.chan->band; in ath11k_peer_assoc_h_rates()
1008 sband = ar->hw->wiphy->bands[band]; in ath11k_peer_assoc_h_rates()
1009 ratemask = sta->supp_rates[band]; in ath11k_peer_assoc_h_rates()
1010 ratemask &= arvif->bitrate_mask.control[band].legacy; in ath11k_peer_assoc_h_rates()
1011 rates = sband->bitrates; in ath11k_peer_assoc_h_rates()
1013 rateset->num_rates = 0; in ath11k_peer_assoc_h_rates()
1019 rate = ath11k_mac_bitrate_to_rate(rates->bitrate); in ath11k_peer_assoc_h_rates()
1020 rateset->rates[rateset->num_rates] = rate; in ath11k_peer_assoc_h_rates()
1021 rateset->num_rates++; in ath11k_peer_assoc_h_rates()
1054 const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap; in ath11k_peer_assoc_h_ht()
1055 struct ath11k_vif *arvif = (void *)vif->drv_priv; in ath11k_peer_assoc_h_ht()
1057 enum nl80211_band band; in ath11k_peer_assoc_h_ht() local
1063 lockdep_assert_held(&ar->conf_mutex); in ath11k_peer_assoc_h_ht()
1068 if (!ht_cap->ht_supported) in ath11k_peer_assoc_h_ht()
1071 band = def.chan->band; in ath11k_peer_assoc_h_ht()
1072 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; in ath11k_peer_assoc_h_ht()
1077 arg->ht_flag = true; in ath11k_peer_assoc_h_ht()
1079 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR + in ath11k_peer_assoc_h_ht()
1080 ht_cap->ampdu_factor)) - 1; in ath11k_peer_assoc_h_ht()
1082 arg->peer_mpdu_density = in ath11k_peer_assoc_h_ht()
1083 ath11k_parse_mpdudensity(ht_cap->ampdu_density); in ath11k_peer_assoc_h_ht()
1085 arg->peer_ht_caps = ht_cap->cap; in ath11k_peer_assoc_h_ht()
1086 arg->peer_rate_caps |= WMI_HOST_RC_HT_FLAG; in ath11k_peer_assoc_h_ht()
1088 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING) in ath11k_peer_assoc_h_ht()
1089 arg->ldpc_flag = true; in ath11k_peer_assoc_h_ht()
1091 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) { in ath11k_peer_assoc_h_ht()
1092 arg->bw_40 = true; in ath11k_peer_assoc_h_ht()
1093 arg->peer_rate_caps |= WMI_HOST_RC_CW40_FLAG; in ath11k_peer_assoc_h_ht()
1096 if (arvif->bitrate_mask.control[band].gi != NL80211_TXRATE_FORCE_LGI) { in ath11k_peer_assoc_h_ht()
1097 if (ht_cap->cap & (IEEE80211_HT_CAP_SGI_20 | in ath11k_peer_assoc_h_ht()
1099 arg->peer_rate_caps |= WMI_HOST_RC_SGI_FLAG; in ath11k_peer_assoc_h_ht()
1102 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) { in ath11k_peer_assoc_h_ht()
1103 arg->peer_rate_caps |= WMI_HOST_RC_TX_STBC_FLAG; in ath11k_peer_assoc_h_ht()
1104 arg->stbc_flag = true; in ath11k_peer_assoc_h_ht()
1107 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) { in ath11k_peer_assoc_h_ht()
1108 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC; in ath11k_peer_assoc_h_ht()
1111 arg->peer_rate_caps |= stbc; in ath11k_peer_assoc_h_ht()
1112 arg->stbc_flag = true; in ath11k_peer_assoc_h_ht()
1115 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2]) in ath11k_peer_assoc_h_ht()
1116 arg->peer_rate_caps |= WMI_HOST_RC_TS_FLAG; in ath11k_peer_assoc_h_ht()
1117 else if (ht_cap->mcs.rx_mask[1]) in ath11k_peer_assoc_h_ht()
1118 arg->peer_rate_caps |= WMI_HOST_RC_DS_FLAG; in ath11k_peer_assoc_h_ht()
1121 if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) && in ath11k_peer_assoc_h_ht()
1124 arg->peer_ht_rates.rates[n++] = i; in ath11k_peer_assoc_h_ht()
1127 /* This is a workaround for HT-enabled STAs which break the spec in ath11k_peer_assoc_h_ht()
1130 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS), in ath11k_peer_assoc_h_ht()
1131 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs. in ath11k_peer_assoc_h_ht()
1136 arg->peer_ht_rates.num_rates = 8; in ath11k_peer_assoc_h_ht()
1137 for (i = 0; i < arg->peer_ht_rates.num_rates; i++) in ath11k_peer_assoc_h_ht()
1138 arg->peer_ht_rates.rates[i] = i; in ath11k_peer_assoc_h_ht()
1140 arg->peer_ht_rates.num_rates = n; in ath11k_peer_assoc_h_ht()
1141 arg->peer_nss = min(sta->rx_nss, max_nss); in ath11k_peer_assoc_h_ht()
1144 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n", in ath11k_peer_assoc_h_ht()
1145 arg->peer_mac, in ath11k_peer_assoc_h_ht()
1146 arg->peer_ht_rates.num_rates, in ath11k_peer_assoc_h_ht()
1147 arg->peer_nss); in ath11k_peer_assoc_h_ht()
1153 case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1; in ath11k_mac_get_max_vht_mcs_map()
1154 case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1; in ath11k_mac_get_max_vht_mcs_map()
1155 case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1; in ath11k_mac_get_max_vht_mcs_map()
1174 idx_limit = fls(mcs_map) - 1; in ath11k_peer_assoc_h_vht_limit()
1176 idx_limit = -1; in ath11k_peer_assoc_h_vht_limit()
1198 case -1: in ath11k_peer_assoc_h_vht_limit()
1215 const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap; in ath11k_peer_assoc_h_vht()
1216 struct ath11k_vif *arvif = (void *)vif->drv_priv; in ath11k_peer_assoc_h_vht()
1218 enum nl80211_band band; in ath11k_peer_assoc_h_vht() local
1227 if (!vht_cap->vht_supported) in ath11k_peer_assoc_h_vht()
1230 band = def.chan->band; in ath11k_peer_assoc_h_vht()
1231 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; in ath11k_peer_assoc_h_vht()
1236 arg->vht_flag = true; in ath11k_peer_assoc_h_vht()
1239 arg->vht_capable = true; in ath11k_peer_assoc_h_vht()
1241 if (def.chan->band == NL80211_BAND_2GHZ) in ath11k_peer_assoc_h_vht()
1242 arg->vht_ng_flag = true; in ath11k_peer_assoc_h_vht()
1244 arg->peer_vht_caps = vht_cap->cap; in ath11k_peer_assoc_h_vht()
1246 ampdu_factor = (vht_cap->cap & in ath11k_peer_assoc_h_vht()
1250 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to in ath11k_peer_assoc_h_vht()
1251 * zero in VHT IE. Using it would result in degraded throughput. in ath11k_peer_assoc_h_vht()
1252 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep in ath11k_peer_assoc_h_vht()
1255 arg->peer_max_mpdu = max(arg->peer_max_mpdu, in ath11k_peer_assoc_h_vht()
1257 ampdu_factor)) - 1); in ath11k_peer_assoc_h_vht()
1259 if (sta->bandwidth == IEEE80211_STA_RX_BW_80) in ath11k_peer_assoc_h_vht()
1260 arg->bw_80 = true; in ath11k_peer_assoc_h_vht()
1262 if (sta->bandwidth == IEEE80211_STA_RX_BW_160) in ath11k_peer_assoc_h_vht()
1263 arg->bw_160 = true; in ath11k_peer_assoc_h_vht()
1269 vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >> in ath11k_peer_assoc_h_vht()
1276 arg->peer_nss = min(sta->rx_nss, max_nss); in ath11k_peer_assoc_h_vht()
1277 arg->rx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.rx_highest); in ath11k_peer_assoc_h_vht()
1278 arg->rx_mcs_set = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map); in ath11k_peer_assoc_h_vht()
1279 arg->tx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.tx_highest); in ath11k_peer_assoc_h_vht()
1280 arg->tx_mcs_set = ath11k_peer_assoc_h_vht_limit( in ath11k_peer_assoc_h_vht()
1281 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map), vht_mcs_mask); in ath11k_peer_assoc_h_vht()
1283 /* In IPQ8074 platform, VHT mcs rate 10 and 11 is enabled by default. in ath11k_peer_assoc_h_vht()
1284 * VHT mcs rate 10 and 11 is not suppoerted in 11ac standard. in ath11k_peer_assoc_h_vht()
1285 * so explicitly disable the VHT MCS rate 10 and 11 in 11ac mode. in ath11k_peer_assoc_h_vht()
1287 arg->tx_mcs_set &= ~IEEE80211_VHT_MCS_SUPPORT_0_11_MASK; in ath11k_peer_assoc_h_vht()
1288 arg->tx_mcs_set |= IEEE80211_DISABLE_VHT_MCS_SUPPORT_0_11; in ath11k_peer_assoc_h_vht()
1290 if ((arg->tx_mcs_set & IEEE80211_VHT_MCS_NOT_SUPPORTED) == in ath11k_peer_assoc_h_vht()
1292 arg->peer_vht_caps &= ~IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE; in ath11k_peer_assoc_h_vht()
1295 arg->tx_max_mcs_nss = 0xFF; in ath11k_peer_assoc_h_vht()
1297 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n", in ath11k_peer_assoc_h_vht()
1298 sta->addr, arg->peer_max_mpdu, arg->peer_flags); in ath11k_peer_assoc_h_vht()
1308 const struct ieee80211_sta_he_cap *he_cap = &sta->he_cap; in ath11k_peer_assoc_h_he()
1312 if (!he_cap->has_he) in ath11k_peer_assoc_h_he()
1315 arg->he_flag = true; in ath11k_peer_assoc_h_he()
1317 memcpy_and_pad(&arg->peer_he_cap_macinfo, in ath11k_peer_assoc_h_he()
1318 sizeof(arg->peer_he_cap_macinfo), in ath11k_peer_assoc_h_he()
1319 he_cap->he_cap_elem.mac_cap_info, in ath11k_peer_assoc_h_he()
1320 sizeof(he_cap->he_cap_elem.mac_cap_info), in ath11k_peer_assoc_h_he()
1322 memcpy_and_pad(&arg->peer_he_cap_phyinfo, in ath11k_peer_assoc_h_he()
1323 sizeof(arg->peer_he_cap_phyinfo), in ath11k_peer_assoc_h_he()
1324 he_cap->he_cap_elem.phy_cap_info, in ath11k_peer_assoc_h_he()
1325 sizeof(he_cap->he_cap_elem.phy_cap_info), in ath11k_peer_assoc_h_he()
1327 arg->peer_he_ops = vif->bss_conf.he_oper.params; in ath11k_peer_assoc_h_he()
1330 arg->peer_he_ops &= 0xffffff; in ath11k_peer_assoc_h_he()
1333 * in HE cap is zero, use the arg->peer_max_mpdu as calculated while parsing in ath11k_peer_assoc_h_he()
1336 * For non-zero value of Max AMPDU Extponent Extension in HE MAC caps, in ath11k_peer_assoc_h_he()
1337 * if a HE STA sends VHT cap and HE cap IE in assoc request then, use in ath11k_peer_assoc_h_he()
1339 * If a HE STA that does not send VHT cap, but HE and HT cap in assoc in ath11k_peer_assoc_h_he()
1343 ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3], in ath11k_peer_assoc_h_he()
1347 if (sta->vht_cap.vht_supported) in ath11k_peer_assoc_h_he()
1348 arg->peer_max_mpdu = (1 << (IEEE80211_HE_VHT_MAX_AMPDU_FACTOR + in ath11k_peer_assoc_h_he()
1349 ampdu_factor)) - 1; in ath11k_peer_assoc_h_he()
1350 else if (sta->ht_cap.ht_supported) in ath11k_peer_assoc_h_he()
1351 arg->peer_max_mpdu = (1 << (IEEE80211_HE_HT_MAX_AMPDU_FACTOR + in ath11k_peer_assoc_h_he()
1352 ampdu_factor)) - 1; in ath11k_peer_assoc_h_he()
1355 if (he_cap->he_cap_elem.phy_cap_info[6] & in ath11k_peer_assoc_h_he()
1360 arg->peer_ppet.numss_m1 = he_cap->ppe_thres[0] & in ath11k_peer_assoc_h_he()
1362 arg->peer_ppet.ru_bit_mask = in ath11k_peer_assoc_h_he()
1363 (he_cap->ppe_thres[0] & in ath11k_peer_assoc_h_he()
1367 for (nss = 0; nss <= arg->peer_ppet.numss_m1; nss++) { in ath11k_peer_assoc_h_he()
1372 if ((arg->peer_ppet.ru_bit_mask & BIT(ru)) == 0) in ath11k_peer_assoc_h_he()
1376 val |= ((he_cap->ppe_thres[bit / 8] >> in ath11k_peer_assoc_h_he()
1380 arg->peer_ppet.ppet16_ppet8_ru3_ru0[nss] |= in ath11k_peer_assoc_h_he()
1386 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_RES) in ath11k_peer_assoc_h_he()
1387 arg->twt_responder = true; in ath11k_peer_assoc_h_he()
1388 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_REQ) in ath11k_peer_assoc_h_he()
1389 arg->twt_requester = true; in ath11k_peer_assoc_h_he()
1391 switch (sta->bandwidth) { in ath11k_peer_assoc_h_he()
1393 if (he_cap->he_cap_elem.phy_cap_info[0] & in ath11k_peer_assoc_h_he()
1395 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80p80); in ath11k_peer_assoc_h_he()
1396 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v; in ath11k_peer_assoc_h_he()
1398 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80p80); in ath11k_peer_assoc_h_he()
1399 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v; in ath11k_peer_assoc_h_he()
1401 arg->peer_he_mcs_count++; in ath11k_peer_assoc_h_he()
1403 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160); in ath11k_peer_assoc_h_he()
1404 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v; in ath11k_peer_assoc_h_he()
1406 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_160); in ath11k_peer_assoc_h_he()
1407 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v; in ath11k_peer_assoc_h_he()
1409 arg->peer_he_mcs_count++; in ath11k_peer_assoc_h_he()
1413 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80); in ath11k_peer_assoc_h_he()
1414 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v; in ath11k_peer_assoc_h_he()
1416 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80); in ath11k_peer_assoc_h_he()
1417 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v; in ath11k_peer_assoc_h_he()
1419 arg->peer_he_mcs_count++; in ath11k_peer_assoc_h_he()
1427 const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap; in ath11k_peer_assoc_h_smps()
1430 if (!ht_cap->ht_supported) in ath11k_peer_assoc_h_smps()
1433 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS; in ath11k_peer_assoc_h_smps()
1438 arg->static_mimops_flag = true; in ath11k_peer_assoc_h_smps()
1441 arg->dynamic_mimops_flag = true; in ath11k_peer_assoc_h_smps()
1444 arg->spatial_mux_flag = true; in ath11k_peer_assoc_h_smps()
1456 struct ath11k_vif *arvif = (void *)vif->drv_priv; in ath11k_peer_assoc_h_qos()
1458 switch (arvif->vdev_type) { in ath11k_peer_assoc_h_qos()
1460 if (sta->wme) { in ath11k_peer_assoc_h_qos()
1462 arg->is_wme_set = true; in ath11k_peer_assoc_h_qos()
1463 arg->qos_flag = true; in ath11k_peer_assoc_h_qos()
1466 if (sta->wme && sta->uapsd_queues) { in ath11k_peer_assoc_h_qos()
1468 arg->is_wme_set = true; in ath11k_peer_assoc_h_qos()
1469 arg->apsd_flag = true; in ath11k_peer_assoc_h_qos()
1470 arg->peer_rate_caps |= WMI_HOST_RC_UAPSD_FLAG; in ath11k_peer_assoc_h_qos()
1474 if (sta->wme) { in ath11k_peer_assoc_h_qos()
1475 arg->is_wme_set = true; in ath11k_peer_assoc_h_qos()
1476 arg->qos_flag = true; in ath11k_peer_assoc_h_qos()
1483 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac peer %pM qos %d\n", in ath11k_peer_assoc_h_qos()
1484 sta->addr, arg->qos_flag); in ath11k_peer_assoc_h_qos()
1496 lockdep_assert_held(&ar->conf_mutex); in ath11k_peer_assoc_qos_ap()
1498 params.vdev_id = arvif->vdev_id; in ath11k_peer_assoc_qos_ap()
1500 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n", in ath11k_peer_assoc_qos_ap()
1501 sta->uapsd_queues, sta->max_sp); in ath11k_peer_assoc_qos_ap()
1504 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO) in ath11k_peer_assoc_qos_ap()
1507 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI) in ath11k_peer_assoc_qos_ap()
1510 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK) in ath11k_peer_assoc_qos_ap()
1513 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE) in ath11k_peer_assoc_qos_ap()
1518 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP) in ath11k_peer_assoc_qos_ap()
1519 max_sp = sta->max_sp; in ath11k_peer_assoc_qos_ap()
1523 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, ¶ms); in ath11k_peer_assoc_qos_ap()
1529 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, ¶ms); in ath11k_peer_assoc_qos_ap()
1536 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, ¶ms); in ath11k_peer_assoc_qos_ap()
1542 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, ¶ms); in ath11k_peer_assoc_qos_ap()
1549 ath11k_warn(ar->ab, "failed to set ap ps peer param %d for vdev %i: %d\n", in ath11k_peer_assoc_qos_ap()
1550 params.param, arvif->vdev_id, ret); in ath11k_peer_assoc_qos_ap()
1556 return sta->supp_rates[NL80211_BAND_2GHZ] >> in ath11k_mac_sta_has_ofdm_only()
1563 if (sta->bandwidth == IEEE80211_STA_RX_BW_160) { in ath11k_mac_get_phymode_vht()
1564 switch (sta->vht_cap.cap & in ath11k_mac_get_phymode_vht()
1576 if (sta->bandwidth == IEEE80211_STA_RX_BW_80) in ath11k_mac_get_phymode_vht()
1579 if (sta->bandwidth == IEEE80211_STA_RX_BW_40) in ath11k_mac_get_phymode_vht()
1582 if (sta->bandwidth == IEEE80211_STA_RX_BW_20) in ath11k_mac_get_phymode_vht()
1591 if (sta->bandwidth == IEEE80211_STA_RX_BW_160) { in ath11k_mac_get_phymode_he()
1592 if (sta->he_cap.he_cap_elem.phy_cap_info[0] & in ath11k_mac_get_phymode_he()
1595 else if (sta->he_cap.he_cap_elem.phy_cap_info[0] & in ath11k_mac_get_phymode_he()
1602 if (sta->bandwidth == IEEE80211_STA_RX_BW_80) in ath11k_mac_get_phymode_he()
1605 if (sta->bandwidth == IEEE80211_STA_RX_BW_40) in ath11k_mac_get_phymode_he()
1608 if (sta->bandwidth == IEEE80211_STA_RX_BW_20) in ath11k_mac_get_phymode_he()
1619 struct ath11k_vif *arvif = (void *)vif->drv_priv; in ath11k_peer_assoc_h_phymode()
1621 enum nl80211_band band; in ath11k_peer_assoc_h_phymode() local
1629 band = def.chan->band; in ath11k_peer_assoc_h_phymode()
1630 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; in ath11k_peer_assoc_h_phymode()
1631 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; in ath11k_peer_assoc_h_phymode()
1633 switch (band) { in ath11k_peer_assoc_h_phymode()
1635 if (sta->he_cap.has_he) { in ath11k_peer_assoc_h_phymode()
1636 if (sta->bandwidth == IEEE80211_STA_RX_BW_80) in ath11k_peer_assoc_h_phymode()
1638 else if (sta->bandwidth == IEEE80211_STA_RX_BW_40) in ath11k_peer_assoc_h_phymode()
1642 } else if (sta->vht_cap.vht_supported && in ath11k_peer_assoc_h_phymode()
1644 if (sta->bandwidth == IEEE80211_STA_RX_BW_40) in ath11k_peer_assoc_h_phymode()
1648 } else if (sta->ht_cap.ht_supported && in ath11k_peer_assoc_h_phymode()
1650 if (sta->bandwidth == IEEE80211_STA_RX_BW_40) in ath11k_peer_assoc_h_phymode()
1663 if (sta->he_cap.has_he) { in ath11k_peer_assoc_h_phymode()
1665 } else if (sta->vht_cap.vht_supported && in ath11k_peer_assoc_h_phymode()
1668 } else if (sta->ht_cap.ht_supported && in ath11k_peer_assoc_h_phymode()
1670 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) in ath11k_peer_assoc_h_phymode()
1682 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac peer %pM phymode %s\n", in ath11k_peer_assoc_h_phymode()
1683 sta->addr, ath11k_wmi_phymode_str(phymode)); in ath11k_peer_assoc_h_phymode()
1685 arg->peer_phymode = phymode; in ath11k_peer_assoc_h_phymode()
1695 lockdep_assert_held(&ar->conf_mutex); in ath11k_peer_assoc_prepare()
1699 reinit_completion(&ar->peer_assoc_done); in ath11k_peer_assoc_prepare()
1701 arg->peer_new_assoc = !reassoc; in ath11k_peer_assoc_prepare()
1721 if (!ht_cap->ht_supported) in ath11k_setup_peer_smps()
1724 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS; in ath11k_setup_peer_smps()
1728 return -EINVAL; in ath11k_setup_peer_smps()
1730 return ath11k_wmi_set_peer_param(ar, addr, arvif->vdev_id, in ath11k_setup_peer_smps()
1739 struct ath11k *ar = hw->priv; in ath11k_bss_assoc()
1740 struct ath11k_vif *arvif = (void *)vif->drv_priv; in ath11k_bss_assoc()
1745 lockdep_assert_held(&ar->conf_mutex); in ath11k_bss_assoc()
1747 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n", in ath11k_bss_assoc()
1748 arvif->vdev_id, arvif->bssid, arvif->aid); in ath11k_bss_assoc()
1752 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid); in ath11k_bss_assoc()
1754 ath11k_warn(ar->ab, "failed to find station entry for bss %pM vdev %i\n", in ath11k_bss_assoc()
1755 bss_conf->bssid, arvif->vdev_id); in ath11k_bss_assoc()
1766 ath11k_warn(ar->ab, "failed to run peer assoc for %pM vdev %i: %d\n", in ath11k_bss_assoc()
1767 bss_conf->bssid, arvif->vdev_id, ret); in ath11k_bss_assoc()
1771 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) { in ath11k_bss_assoc()
1772 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", in ath11k_bss_assoc()
1773 bss_conf->bssid, arvif->vdev_id); in ath11k_bss_assoc()
1777 ret = ath11k_setup_peer_smps(ar, arvif, bss_conf->bssid, in ath11k_bss_assoc()
1778 &ap_sta->ht_cap); in ath11k_bss_assoc()
1780 ath11k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n", in ath11k_bss_assoc()
1781 arvif->vdev_id, ret); in ath11k_bss_assoc()
1785 WARN_ON(arvif->is_up); in ath11k_bss_assoc()
1787 arvif->aid = bss_conf->aid; in ath11k_bss_assoc()
1788 ether_addr_copy(arvif->bssid, bss_conf->bssid); in ath11k_bss_assoc()
1790 ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid); in ath11k_bss_assoc()
1792 ath11k_warn(ar->ab, "failed to set vdev %d up: %d\n", in ath11k_bss_assoc()
1793 arvif->vdev_id, ret); in ath11k_bss_assoc()
1797 arvif->is_up = true; in ath11k_bss_assoc()
1799 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_bss_assoc()
1801 arvif->vdev_id, bss_conf->bssid, bss_conf->aid); in ath11k_bss_assoc()
1804 ret = ath11k_wmi_set_peer_param(ar, arvif->bssid, in ath11k_bss_assoc()
1805 arvif->vdev_id, in ath11k_bss_assoc()
1809 ath11k_warn(ar->ab, "Unable to authorize BSS peer: %d\n", ret); in ath11k_bss_assoc()
1811 ret = ath11k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id, in ath11k_bss_assoc()
1812 &bss_conf->he_obss_pd); in ath11k_bss_assoc()
1814 ath11k_warn(ar->ab, "failed to set vdev %i OBSS PD parameters: %d\n", in ath11k_bss_assoc()
1815 arvif->vdev_id, ret); in ath11k_bss_assoc()
1821 struct ath11k *ar = hw->priv; in ath11k_bss_disassoc()
1822 struct ath11k_vif *arvif = (void *)vif->drv_priv; in ath11k_bss_disassoc()
1825 lockdep_assert_held(&ar->conf_mutex); in ath11k_bss_disassoc()
1827 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n", in ath11k_bss_disassoc()
1828 arvif->vdev_id, arvif->bssid); in ath11k_bss_disassoc()
1830 ret = ath11k_wmi_vdev_down(ar, arvif->vdev_id); in ath11k_bss_disassoc()
1832 ath11k_warn(ar->ab, "failed to down vdev %i: %d\n", in ath11k_bss_disassoc()
1833 arvif->vdev_id, ret); in ath11k_bss_disassoc()
1835 arvif->is_up = false; in ath11k_bss_disassoc()
1837 cancel_delayed_work_sync(&arvif->connection_loss_work); in ath11k_bss_disassoc()
1862 return -EINVAL; in ath11k_mac_get_rate_hw_value()
1869 struct ath11k_vif *arvif = (void *)vif->drv_priv; in ath11k_recalculate_mgmt_rate()
1877 lockdep_assert_held(&ar->conf_mutex); in ath11k_recalculate_mgmt_rate()
1879 sband = ar->hw->wiphy->bands[def->chan->band]; in ath11k_recalculate_mgmt_rate()
1880 basic_rate_idx = ffs(vif->bss_conf.basic_rates) - 1; in ath11k_recalculate_mgmt_rate()
1881 bitrate = sband->bitrates[basic_rate_idx].bitrate; in ath11k_recalculate_mgmt_rate()
1885 ath11k_warn(ar->ab, "bitrate not supported %d\n", bitrate); in ath11k_recalculate_mgmt_rate()
1890 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param, in ath11k_recalculate_mgmt_rate()
1893 ath11k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret); in ath11k_recalculate_mgmt_rate()
1896 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param, in ath11k_recalculate_mgmt_rate()
1899 ath11k_warn(ar->ab, "failed to set beacon tx rate %d\n", ret); in ath11k_recalculate_mgmt_rate()
1905 struct ath11k *ar = arvif->ar; in ath11k_mac_fils_discovery()
1911 if (info->fils_discovery.max_interval) { in ath11k_mac_fils_discovery()
1912 interval = info->fils_discovery.max_interval; in ath11k_mac_fils_discovery()
1914 tmpl = ieee80211_get_fils_discovery_tmpl(ar->hw, arvif->vif); in ath11k_mac_fils_discovery()
1916 ret = ath11k_wmi_fils_discovery_tmpl(ar, arvif->vdev_id, in ath11k_mac_fils_discovery()
1918 } else if (info->unsol_bcast_probe_resp_interval) { in ath11k_mac_fils_discovery()
1920 interval = info->unsol_bcast_probe_resp_interval; in ath11k_mac_fils_discovery()
1922 tmpl = ieee80211_get_unsol_bcast_probe_resp_tmpl(ar->hw, in ath11k_mac_fils_discovery()
1923 arvif->vif); in ath11k_mac_fils_discovery()
1925 ret = ath11k_wmi_probe_resp_tmpl(ar, arvif->vdev_id, in ath11k_mac_fils_discovery()
1928 return ath11k_wmi_fils_discovery(ar, arvif->vdev_id, 0, false); in ath11k_mac_fils_discovery()
1932 ath11k_warn(ar->ab, in ath11k_mac_fils_discovery()
1934 arvif->vdev_id, (unsol_bcast_probe_resp_enabled ? in ath11k_mac_fils_discovery()
1937 return -EPERM; in ath11k_mac_fils_discovery()
1942 ret = ath11k_wmi_fils_discovery(ar, arvif->vdev_id, interval, in ath11k_mac_fils_discovery()
1955 pdev_id = ar->pdev->pdev_id; in ath11k_mac_config_obss_pd()
1957 /* Set and enable SRG/non-SRG OBSS PD Threshold */ in ath11k_mac_config_obss_pd()
1959 if (test_bit(ATH11K_FLAG_MONITOR_ENABLED, &ar->monitor_flags)) { in ath11k_mac_config_obss_pd()
1962 ath11k_warn(ar->ab, in ath11k_mac_config_obss_pd()
1968 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_config_obss_pd()
1970 he_obss_pd->sr_ctrl, he_obss_pd->non_srg_max_offset, in ath11k_mac_config_obss_pd()
1971 he_obss_pd->max_offset); in ath11k_mac_config_obss_pd()
1975 if (he_obss_pd->sr_ctrl & in ath11k_mac_config_obss_pd()
1979 if (he_obss_pd->sr_ctrl & IEEE80211_HE_SPR_NON_SRG_OFFSET_PRESENT) in ath11k_mac_config_obss_pd()
1981 he_obss_pd->non_srg_max_offset); in ath11k_mac_config_obss_pd()
1988 if (he_obss_pd->sr_ctrl & IEEE80211_HE_SPR_SRG_INFORMATION_PRESENT) { in ath11k_mac_config_obss_pd()
1989 srg_th = ATH11K_OBSS_PD_MAX_THRESHOLD + he_obss_pd->max_offset; in ath11k_mac_config_obss_pd()
1994 ar->ab->wmi_ab.svc_map)) { in ath11k_mac_config_obss_pd()
1998 non_srg_th -= ATH11K_DEFAULT_NOISE_FLOOR; in ath11k_mac_config_obss_pd()
1999 /* SRG not supported and threshold in dB */ in ath11k_mac_config_obss_pd()
2007 ath11k_warn(ar->ab, in ath11k_mac_config_obss_pd()
2018 ath11k_warn(ar->ab, in ath11k_mac_config_obss_pd()
2026 param_val = !!(he_obss_pd->sr_ctrl & in ath11k_mac_config_obss_pd()
2030 ath11k_warn(ar->ab, "failed to set sr_prohibit for pdev: %u\n", in ath11k_mac_config_obss_pd()
2036 ar->ab->wmi_ab.svc_map)) in ath11k_mac_config_obss_pd()
2040 memcpy(bitmap, he_obss_pd->bss_color_bitmap, sizeof(bitmap)); in ath11k_mac_config_obss_pd()
2043 ath11k_warn(ar->ab, in ath11k_mac_config_obss_pd()
2050 memcpy(bitmap, he_obss_pd->partial_bssid_bitmap, sizeof(bitmap)); in ath11k_mac_config_obss_pd()
2053 ath11k_warn(ar->ab, in ath11k_mac_config_obss_pd()
2064 ath11k_warn(ar->ab, in ath11k_mac_config_obss_pd()
2073 ath11k_warn(ar->ab, in ath11k_mac_config_obss_pd()
2079 /* Enable all BSS Colors for non-SRG */ in ath11k_mac_config_obss_pd()
2082 ath11k_warn(ar->ab, in ath11k_mac_config_obss_pd()
2088 /* Enable all patial BSSID mask for non-SRG */ in ath11k_mac_config_obss_pd()
2091 ath11k_warn(ar->ab, in ath11k_mac_config_obss_pd()
2105 struct ath11k *ar = hw->priv; in ath11k_mac_op_bss_info_changed()
2109 enum nl80211_band band; in ath11k_mac_op_bss_info_changed() local
2119 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_bss_info_changed()
2122 arvif->beacon_interval = info->beacon_int; in ath11k_mac_op_bss_info_changed()
2125 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_bss_info_changed()
2127 arvif->beacon_interval); in ath11k_mac_op_bss_info_changed()
2129 ath11k_warn(ar->ab, "Failed to set beacon interval for VDEV: %d\n", in ath11k_mac_op_bss_info_changed()
2130 arvif->vdev_id); in ath11k_mac_op_bss_info_changed()
2132 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_op_bss_info_changed()
2134 arvif->beacon_interval, arvif->vdev_id); in ath11k_mac_op_bss_info_changed()
2141 param_value, ar->pdev->pdev_id); in ath11k_mac_op_bss_info_changed()
2143 ath11k_warn(ar->ab, "Failed to set beacon mode for VDEV: %d\n", in ath11k_mac_op_bss_info_changed()
2144 arvif->vdev_id); in ath11k_mac_op_bss_info_changed()
2146 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_op_bss_info_changed()
2148 arvif->vdev_id); in ath11k_mac_op_bss_info_changed()
2152 ath11k_warn(ar->ab, "failed to update bcn template: %d\n", in ath11k_mac_op_bss_info_changed()
2157 arvif->dtim_period = info->dtim_period; in ath11k_mac_op_bss_info_changed()
2160 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_bss_info_changed()
2162 arvif->dtim_period); in ath11k_mac_op_bss_info_changed()
2165 ath11k_warn(ar->ab, "Failed to set dtim period for VDEV %d: %i\n", in ath11k_mac_op_bss_info_changed()
2166 arvif->vdev_id, ret); in ath11k_mac_op_bss_info_changed()
2168 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_op_bss_info_changed()
2170 arvif->dtim_period, arvif->vdev_id); in ath11k_mac_op_bss_info_changed()
2174 vif->type == NL80211_IFTYPE_AP) { in ath11k_mac_op_bss_info_changed()
2175 arvif->u.ap.ssid_len = info->ssid_len; in ath11k_mac_op_bss_info_changed()
2176 if (info->ssid_len) in ath11k_mac_op_bss_info_changed()
2177 memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len); in ath11k_mac_op_bss_info_changed()
2178 arvif->u.ap.hidden_ssid = info->hidden_ssid; in ath11k_mac_op_bss_info_changed()
2181 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid)) in ath11k_mac_op_bss_info_changed()
2182 ether_addr_copy(arvif->bssid, info->bssid); in ath11k_mac_op_bss_info_changed()
2187 if (arvif->is_up && vif->bss_conf.he_support && in ath11k_mac_op_bss_info_changed()
2188 vif->bss_conf.he_oper.params) { in ath11k_mac_op_bss_info_changed()
2189 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_bss_info_changed()
2193 ath11k_warn(ar->ab, in ath11k_mac_op_bss_info_changed()
2195 arvif->vdev_id); in ath11k_mac_op_bss_info_changed()
2198 param_value = vif->bss_conf.he_oper.params; in ath11k_mac_op_bss_info_changed()
2199 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_bss_info_changed()
2201 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_op_bss_info_changed()
2203 param_value, arvif->vdev_id); in ath11k_mac_op_bss_info_changed()
2206 ath11k_warn(ar->ab, "Failed to set he oper params %x for VDEV %d: %i\n", in ath11k_mac_op_bss_info_changed()
2207 param_value, arvif->vdev_id, ret); in ath11k_mac_op_bss_info_changed()
2214 cts_prot = !!(info->use_cts_prot); in ath11k_mac_op_bss_info_changed()
2217 if (arvif->is_started) { in ath11k_mac_op_bss_info_changed()
2218 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_bss_info_changed()
2221 ath11k_warn(ar->ab, "Failed to set CTS prot for VDEV: %d\n", in ath11k_mac_op_bss_info_changed()
2222 arvif->vdev_id); in ath11k_mac_op_bss_info_changed()
2224 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "Set CTS prot: %d for VDEV: %d\n", in ath11k_mac_op_bss_info_changed()
2225 cts_prot, arvif->vdev_id); in ath11k_mac_op_bss_info_changed()
2227 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "defer protection mode setup, vdev is not ready yet\n"); in ath11k_mac_op_bss_info_changed()
2234 if (info->use_short_slot) in ath11k_mac_op_bss_info_changed()
2241 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_bss_info_changed()
2244 ath11k_warn(ar->ab, "Failed to set erp slot for VDEV: %d\n", in ath11k_mac_op_bss_info_changed()
2245 arvif->vdev_id); in ath11k_mac_op_bss_info_changed()
2247 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_op_bss_info_changed()
2249 slottime, arvif->vdev_id); in ath11k_mac_op_bss_info_changed()
2255 if (info->use_short_preamble) in ath11k_mac_op_bss_info_changed()
2261 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_bss_info_changed()
2264 ath11k_warn(ar->ab, "Failed to set preamble for VDEV: %d\n", in ath11k_mac_op_bss_info_changed()
2265 arvif->vdev_id); in ath11k_mac_op_bss_info_changed()
2267 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_op_bss_info_changed()
2269 preamble, arvif->vdev_id); in ath11k_mac_op_bss_info_changed()
2273 if (info->assoc) in ath11k_mac_op_bss_info_changed()
2280 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev_id %i txpower %d\n", in ath11k_mac_op_bss_info_changed()
2281 arvif->vdev_id, info->txpower); in ath11k_mac_op_bss_info_changed()
2283 arvif->txpower = info->txpower; in ath11k_mac_op_bss_info_changed()
2288 !ath11k_mac_vif_chan(arvif->vif, &def)) { in ath11k_mac_op_bss_info_changed()
2289 band = def.chan->band; in ath11k_mac_op_bss_info_changed()
2290 mcast_rate = vif->bss_conf.mcast_rate[band]; in ath11k_mac_op_bss_info_changed()
2293 rateidx = mcast_rate - 1; in ath11k_mac_op_bss_info_changed()
2295 rateidx = ffs(vif->bss_conf.basic_rates) - 1; in ath11k_mac_op_bss_info_changed()
2297 if (ar->pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) in ath11k_mac_op_bss_info_changed()
2310 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_op_bss_info_changed()
2312 arvif->vdev_id, rate); in ath11k_mac_op_bss_info_changed()
2315 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_bss_info_changed()
2318 ath11k_warn(ar->ab, in ath11k_mac_op_bss_info_changed()
2320 arvif->vdev_id, ret); in ath11k_mac_op_bss_info_changed()
2323 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_bss_info_changed()
2326 ath11k_warn(ar->ab, in ath11k_mac_op_bss_info_changed()
2328 arvif->vdev_id, ret); in ath11k_mac_op_bss_info_changed()
2332 !ath11k_mac_vif_chan(arvif->vif, &def)) in ath11k_mac_op_bss_info_changed()
2336 if (info->twt_requester || info->twt_responder) in ath11k_mac_op_bss_info_changed()
2337 ath11k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id); in ath11k_mac_op_bss_info_changed()
2339 ath11k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id); in ath11k_mac_op_bss_info_changed()
2343 ath11k_mac_config_obss_pd(ar, &info->he_obss_pd); in ath11k_mac_op_bss_info_changed()
2346 if (vif->type == NL80211_IFTYPE_AP) { in ath11k_mac_op_bss_info_changed()
2348 ar, arvif->vdev_id, info->he_bss_color.color, in ath11k_mac_op_bss_info_changed()
2350 info->he_bss_color.enabled); in ath11k_mac_op_bss_info_changed()
2352 ath11k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n", in ath11k_mac_op_bss_info_changed()
2353 arvif->vdev_id, ret); in ath11k_mac_op_bss_info_changed()
2354 } else if (vif->type == NL80211_IFTYPE_STATION) { in ath11k_mac_op_bss_info_changed()
2356 arvif->vdev_id, in ath11k_mac_op_bss_info_changed()
2359 ath11k_warn(ar->ab, "failed to enable bss color change on vdev %i: %d\n", in ath11k_mac_op_bss_info_changed()
2360 arvif->vdev_id, ret); in ath11k_mac_op_bss_info_changed()
2362 ar, arvif->vdev_id, 0, in ath11k_mac_op_bss_info_changed()
2365 ath11k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n", in ath11k_mac_op_bss_info_changed()
2366 arvif->vdev_id, ret); in ath11k_mac_op_bss_info_changed()
2374 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_bss_info_changed()
2379 lockdep_assert_held(&ar->data_lock); in __ath11k_mac_scan_finish()
2381 switch (ar->scan.state) { in __ath11k_mac_scan_finish()
2386 if (!ar->scan.is_roc) { in __ath11k_mac_scan_finish()
2388 .aborted = (ar->scan.state == in __ath11k_mac_scan_finish()
2392 ieee80211_scan_completed(ar->hw, &info); in __ath11k_mac_scan_finish()
2393 } else if (ar->scan.roc_notify) { in __ath11k_mac_scan_finish()
2394 ieee80211_remain_on_channel_expired(ar->hw); in __ath11k_mac_scan_finish()
2398 ar->scan.state = ATH11K_SCAN_IDLE; in __ath11k_mac_scan_finish()
2399 ar->scan_channel = NULL; in __ath11k_mac_scan_finish()
2400 ar->scan.roc_freq = 0; in __ath11k_mac_scan_finish()
2401 cancel_delayed_work(&ar->scan.timeout); in __ath11k_mac_scan_finish()
2402 complete(&ar->scan.completed); in __ath11k_mac_scan_finish()
2409 spin_lock_bh(&ar->data_lock); in ath11k_mac_scan_finish()
2411 spin_unlock_bh(&ar->data_lock); in ath11k_mac_scan_finish()
2422 lockdep_assert_held(&ar->conf_mutex); in ath11k_scan_stop()
2425 arg.pdev_id = ar->pdev->pdev_id; in ath11k_scan_stop()
2429 ath11k_warn(ar->ab, "failed to stop wmi scan: %d\n", ret); in ath11k_scan_stop()
2433 ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ); in ath11k_scan_stop()
2435 ath11k_warn(ar->ab, in ath11k_scan_stop()
2437 ret = -ETIMEDOUT; in ath11k_scan_stop()
2443 /* Scan state should be updated upon scan completion but in case in ath11k_scan_stop()
2450 spin_lock_bh(&ar->data_lock); in ath11k_scan_stop()
2451 if (ar->scan.state != ATH11K_SCAN_IDLE) in ath11k_scan_stop()
2453 spin_unlock_bh(&ar->data_lock); in ath11k_scan_stop()
2462 lockdep_assert_held(&ar->conf_mutex); in ath11k_scan_abort()
2464 spin_lock_bh(&ar->data_lock); in ath11k_scan_abort()
2466 switch (ar->scan.state) { in ath11k_scan_abort()
2468 /* This can happen if timeout worker kicked in and called in ath11k_scan_abort()
2474 ath11k_warn(ar->ab, "refusing scan abortion due to invalid scan state: %d\n", in ath11k_scan_abort()
2475 ar->scan.state); in ath11k_scan_abort()
2478 ar->scan.state = ATH11K_SCAN_ABORTING; in ath11k_scan_abort()
2479 spin_unlock_bh(&ar->data_lock); in ath11k_scan_abort()
2483 ath11k_warn(ar->ab, "failed to abort scan: %d\n", ret); in ath11k_scan_abort()
2485 spin_lock_bh(&ar->data_lock); in ath11k_scan_abort()
2489 spin_unlock_bh(&ar->data_lock); in ath11k_scan_abort()
2497 mutex_lock(&ar->conf_mutex); in ath11k_scan_timeout_work()
2499 mutex_unlock(&ar->conf_mutex); in ath11k_scan_timeout_work()
2507 lockdep_assert_held(&ar->conf_mutex); in ath11k_start_scan()
2516 ret = wait_for_completion_timeout(&ar->scan.started, 1 * HZ); in ath11k_start_scan()
2520 ath11k_warn(ar->ab, "failed to stop scan: %d\n", ret); in ath11k_start_scan()
2522 return -ETIMEDOUT; in ath11k_start_scan()
2526 * this point. This is probably due to some issue in the in ath11k_start_scan()
2529 spin_lock_bh(&ar->data_lock); in ath11k_start_scan()
2530 if (ar->scan.state == ATH11K_SCAN_IDLE) { in ath11k_start_scan()
2531 spin_unlock_bh(&ar->data_lock); in ath11k_start_scan()
2532 return -EINVAL; in ath11k_start_scan()
2534 spin_unlock_bh(&ar->data_lock); in ath11k_start_scan()
2543 struct ath11k *ar = hw->priv; in ath11k_mac_op_hw_scan()
2545 struct cfg80211_scan_request *req = &hw_req->req; in ath11k_mac_op_hw_scan()
2550 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_hw_scan()
2552 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_hw_scan()
2553 switch (ar->scan.state) { in ath11k_mac_op_hw_scan()
2555 reinit_completion(&ar->scan.started); in ath11k_mac_op_hw_scan()
2556 reinit_completion(&ar->scan.completed); in ath11k_mac_op_hw_scan()
2557 ar->scan.state = ATH11K_SCAN_STARTING; in ath11k_mac_op_hw_scan()
2558 ar->scan.is_roc = false; in ath11k_mac_op_hw_scan()
2559 ar->scan.vdev_id = arvif->vdev_id; in ath11k_mac_op_hw_scan()
2565 ret = -EBUSY; in ath11k_mac_op_hw_scan()
2568 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_hw_scan()
2575 arg.vdev_id = arvif->vdev_id; in ath11k_mac_op_hw_scan()
2578 if (req->ie_len) { in ath11k_mac_op_hw_scan()
2579 arg.extraie.len = req->ie_len; in ath11k_mac_op_hw_scan()
2580 arg.extraie.ptr = kzalloc(req->ie_len, GFP_KERNEL); in ath11k_mac_op_hw_scan()
2581 memcpy(arg.extraie.ptr, req->ie, req->ie_len); in ath11k_mac_op_hw_scan()
2584 if (req->n_ssids) { in ath11k_mac_op_hw_scan()
2585 arg.num_ssids = req->n_ssids; in ath11k_mac_op_hw_scan()
2587 arg.ssid[i].length = req->ssids[i].ssid_len; in ath11k_mac_op_hw_scan()
2588 memcpy(&arg.ssid[i].ssid, req->ssids[i].ssid, in ath11k_mac_op_hw_scan()
2589 req->ssids[i].ssid_len); in ath11k_mac_op_hw_scan()
2595 if (req->n_channels) { in ath11k_mac_op_hw_scan()
2596 arg.num_chan = req->n_channels; in ath11k_mac_op_hw_scan()
2598 arg.chan_list[i] = req->channels[i]->center_freq; in ath11k_mac_op_hw_scan()
2603 ath11k_warn(ar->ab, "failed to start hw scan: %d\n", ret); in ath11k_mac_op_hw_scan()
2604 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_hw_scan()
2605 ar->scan.state = ATH11K_SCAN_IDLE; in ath11k_mac_op_hw_scan()
2606 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_hw_scan()
2610 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout, in ath11k_mac_op_hw_scan()
2615 if (req->ie_len) in ath11k_mac_op_hw_scan()
2618 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_hw_scan()
2625 struct ath11k *ar = hw->priv; in ath11k_mac_op_cancel_hw_scan()
2627 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_cancel_hw_scan()
2629 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_cancel_hw_scan()
2631 cancel_delayed_work_sync(&ar->scan.timeout); in ath11k_mac_op_cancel_hw_scan()
2640 struct ath11k *ar = arvif->ar; in ath11k_install_key()
2642 .vdev_id = arvif->vdev_id, in ath11k_install_key()
2643 .key_idx = key->keyidx, in ath11k_install_key()
2644 .key_len = key->keylen, in ath11k_install_key()
2645 .key_data = key->key, in ath11k_install_key()
2650 lockdep_assert_held(&arvif->ar->conf_mutex); in ath11k_install_key()
2652 reinit_completion(&ar->install_key_done); in ath11k_install_key()
2654 if (test_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags)) in ath11k_install_key()
2665 switch (key->cipher) { in ath11k_install_key()
2668 /* TODO: Re-check if flag is valid */ in ath11k_install_key()
2669 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT; in ath11k_install_key()
2684 ath11k_warn(ar->ab, "cipher %d is not supported\n", key->cipher); in ath11k_install_key()
2685 return -EOPNOTSUPP; in ath11k_install_key()
2688 if (test_bit(ATH11K_FLAG_RAW_MODE, &ar->ab->dev_flags)) in ath11k_install_key()
2689 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV | in ath11k_install_key()
2693 ret = ath11k_wmi_vdev_install_key(arvif->ar, &arg); in ath11k_install_key()
2698 if (!wait_for_completion_timeout(&ar->install_key_done, 1 * HZ)) in ath11k_install_key()
2699 return -ETIMEDOUT; in ath11k_install_key()
2701 return ar->install_key_status ? -EINVAL : 0; in ath11k_install_key()
2707 struct ath11k *ar = arvif->ar; in ath11k_clear_peer_keys()
2708 struct ath11k_base *ab = ar->ab; in ath11k_clear_peer_keys()
2715 lockdep_assert_held(&ar->conf_mutex); in ath11k_clear_peer_keys()
2717 spin_lock_bh(&ab->base_lock); in ath11k_clear_peer_keys()
2718 peer = ath11k_peer_find(ab, arvif->vdev_id, addr); in ath11k_clear_peer_keys()
2719 spin_unlock_bh(&ab->base_lock); in ath11k_clear_peer_keys()
2722 return -ENOENT; in ath11k_clear_peer_keys()
2724 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) { in ath11k_clear_peer_keys()
2725 if (!peer->keys[i]) in ath11k_clear_peer_keys()
2729 ret = ath11k_install_key(arvif, peer->keys[i], in ath11k_clear_peer_keys()
2738 spin_lock_bh(&ab->base_lock); in ath11k_clear_peer_keys()
2739 peer->keys[i] = NULL; in ath11k_clear_peer_keys()
2740 spin_unlock_bh(&ab->base_lock); in ath11k_clear_peer_keys()
2750 struct ath11k *ar = hw->priv; in ath11k_mac_op_set_key()
2751 struct ath11k_base *ab = ar->ab; in ath11k_mac_op_set_key()
2759 /* BIP needs to be done in software */ in ath11k_mac_op_set_key()
2760 if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC || in ath11k_mac_op_set_key()
2761 key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 || in ath11k_mac_op_set_key()
2762 key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256 || in ath11k_mac_op_set_key()
2763 key->cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256) in ath11k_mac_op_set_key()
2766 if (test_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags)) in ath11k_mac_op_set_key()
2769 if (key->keyidx > WMI_MAX_KEY_INDEX) in ath11k_mac_op_set_key()
2770 return -ENOSPC; in ath11k_mac_op_set_key()
2772 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_set_key()
2775 peer_addr = sta->addr; in ath11k_mac_op_set_key()
2776 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA) in ath11k_mac_op_set_key()
2777 peer_addr = vif->bss_conf.bssid; in ath11k_mac_op_set_key()
2779 peer_addr = vif->addr; in ath11k_mac_op_set_key()
2781 key->hw_key_idx = key->keyidx; in ath11k_mac_op_set_key()
2783 /* the peer should not disappear in mid-way (unless FW goes awry) since in ath11k_mac_op_set_key()
2786 spin_lock_bh(&ab->base_lock); in ath11k_mac_op_set_key()
2787 peer = ath11k_peer_find(ab, arvif->vdev_id, peer_addr); in ath11k_mac_op_set_key()
2790 * ensure all frags in the new frag list belong to the same key. in ath11k_mac_op_set_key()
2794 spin_unlock_bh(&ab->base_lock); in ath11k_mac_op_set_key()
2798 ath11k_warn(ab, "cannot install key for non-existent peer %pM\n", in ath11k_mac_op_set_key()
2800 ret = -EOPNOTSUPP; in ath11k_mac_op_set_key()
2810 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) in ath11k_mac_op_set_key()
2827 spin_lock_bh(&ab->base_lock); in ath11k_mac_op_set_key()
2828 peer = ath11k_peer_find(ab, arvif->vdev_id, peer_addr); in ath11k_mac_op_set_key()
2830 peer->keys[key->keyidx] = key; in ath11k_mac_op_set_key()
2831 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) { in ath11k_mac_op_set_key()
2832 peer->ucast_keyidx = key->keyidx; in ath11k_mac_op_set_key()
2833 peer->sec_type = ath11k_dp_tx_get_encrypt_type(key->cipher); in ath11k_mac_op_set_key()
2835 peer->mcast_keyidx = key->keyidx; in ath11k_mac_op_set_key()
2836 peer->sec_type_grp = ath11k_dp_tx_get_encrypt_type(key->cipher); in ath11k_mac_op_set_key()
2839 peer->keys[key->keyidx] = NULL; in ath11k_mac_op_set_key()
2840 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) in ath11k_mac_op_set_key()
2841 peer->ucast_keyidx = 0; in ath11k_mac_op_set_key()
2843 peer->mcast_keyidx = 0; in ath11k_mac_op_set_key()
2849 arsta = (struct ath11k_sta *)sta->drv_priv; in ath11k_mac_op_set_key()
2851 switch (key->cipher) { in ath11k_mac_op_set_key()
2858 arsta->pn_type = HAL_PN_TYPE_WPA; in ath11k_mac_op_set_key()
2860 arsta->pn_type = HAL_PN_TYPE_NONE; in ath11k_mac_op_set_key()
2863 arsta->pn_type = HAL_PN_TYPE_NONE; in ath11k_mac_op_set_key()
2868 spin_unlock_bh(&ab->base_lock); in ath11k_mac_op_set_key()
2871 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_set_key()
2877 enum nl80211_band band, in ath11k_mac_bitrate_mask_num_vht_rates() argument
2883 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) in ath11k_mac_bitrate_mask_num_vht_rates()
2884 num_rates += hweight16(mask->control[band].vht_mcs[i]); in ath11k_mac_bitrate_mask_num_vht_rates()
2893 enum nl80211_band band) in ath11k_mac_set_peer_vht_fixed_rate() argument
2895 struct ath11k *ar = arvif->ar; in ath11k_mac_set_peer_vht_fixed_rate()
2900 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_set_peer_vht_fixed_rate()
2904 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) { in ath11k_mac_set_peer_vht_fixed_rate()
2905 if (hweight16(mask->control[band].vht_mcs[i]) == 1) { in ath11k_mac_set_peer_vht_fixed_rate()
2907 vht_rate = ffs(mask->control[band].vht_mcs[i]) - 1; in ath11k_mac_set_peer_vht_fixed_rate()
2912 ath11k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM", in ath11k_mac_set_peer_vht_fixed_rate()
2913 sta->addr); in ath11k_mac_set_peer_vht_fixed_rate()
2914 return -EINVAL; in ath11k_mac_set_peer_vht_fixed_rate()
2917 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_set_peer_vht_fixed_rate()
2919 sta->addr); in ath11k_mac_set_peer_vht_fixed_rate()
2921 rate_code = ATH11K_HW_RATE_CODE(vht_rate, nss - 1, in ath11k_mac_set_peer_vht_fixed_rate()
2923 ret = ath11k_wmi_set_peer_param(ar, sta->addr, in ath11k_mac_set_peer_vht_fixed_rate()
2924 arvif->vdev_id, in ath11k_mac_set_peer_vht_fixed_rate()
2928 ath11k_warn(ar->ab, in ath11k_mac_set_peer_vht_fixed_rate()
2930 sta->addr, rate_code, ret); in ath11k_mac_set_peer_vht_fixed_rate()
2944 enum nl80211_band band; in ath11k_station_assoc() local
2948 lockdep_assert_held(&ar->conf_mutex); in ath11k_station_assoc()
2951 return -EPERM; in ath11k_station_assoc()
2953 band = def.chan->band; in ath11k_station_assoc()
2954 mask = &arvif->bitrate_mask; in ath11k_station_assoc()
2960 ath11k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n", in ath11k_station_assoc()
2961 sta->addr, arvif->vdev_id, ret); in ath11k_station_assoc()
2965 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) { in ath11k_station_assoc()
2966 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", in ath11k_station_assoc()
2967 sta->addr, arvif->vdev_id); in ath11k_station_assoc()
2968 return -ETIMEDOUT; in ath11k_station_assoc()
2971 num_vht_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask); in ath11k_station_assoc()
2978 if (sta->vht_cap.vht_supported && num_vht_rates == 1) { in ath11k_station_assoc()
2980 band); in ath11k_station_assoc()
2985 /* Re-assoc is run only to update supported rates for given station. It in ath11k_station_assoc()
2991 ret = ath11k_setup_peer_smps(ar, arvif, sta->addr, in ath11k_station_assoc()
2992 &sta->ht_cap); in ath11k_station_assoc()
2994 ath11k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n", in ath11k_station_assoc()
2995 arvif->vdev_id, ret); in ath11k_station_assoc()
2999 if (!sta->wme) { in ath11k_station_assoc()
3000 arvif->num_legacy_stations++; in ath11k_station_assoc()
3006 if (sta->wme && sta->uapsd_queues) { in ath11k_station_assoc()
3009 ath11k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n", in ath11k_station_assoc()
3010 sta->addr, arvif->vdev_id, ret); in ath11k_station_assoc()
3022 struct ath11k_vif *arvif = (void *)vif->drv_priv; in ath11k_station_disassoc()
3025 lockdep_assert_held(&ar->conf_mutex); in ath11k_station_disassoc()
3027 if (!sta->wme) { in ath11k_station_disassoc()
3028 arvif->num_legacy_stations--; in ath11k_station_disassoc()
3034 ret = ath11k_clear_peer_keys(arvif, sta->addr); in ath11k_station_disassoc()
3036 ath11k_warn(ar->ab, "failed to clear all peer keys for vdev %i: %d\n", in ath11k_station_disassoc()
3037 arvif->vdev_id, ret); in ath11k_station_disassoc()
3050 enum nl80211_band band; in ath11k_sta_rc_update_wk() local
3060 arvif = arsta->arvif; in ath11k_sta_rc_update_wk()
3061 ar = arvif->ar; in ath11k_sta_rc_update_wk()
3063 if (WARN_ON(ath11k_mac_vif_chan(arvif->vif, &def))) in ath11k_sta_rc_update_wk()
3066 band = def.chan->band; in ath11k_sta_rc_update_wk()
3067 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; in ath11k_sta_rc_update_wk()
3068 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; in ath11k_sta_rc_update_wk()
3070 spin_lock_bh(&ar->data_lock); in ath11k_sta_rc_update_wk()
3072 changed = arsta->changed; in ath11k_sta_rc_update_wk()
3073 arsta->changed = 0; in ath11k_sta_rc_update_wk()
3075 bw = arsta->bw; in ath11k_sta_rc_update_wk()
3076 nss = arsta->nss; in ath11k_sta_rc_update_wk()
3077 smps = arsta->smps; in ath11k_sta_rc_update_wk()
3079 spin_unlock_bh(&ar->data_lock); in ath11k_sta_rc_update_wk()
3081 mutex_lock(&ar->conf_mutex); in ath11k_sta_rc_update_wk()
3088 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id, in ath11k_sta_rc_update_wk()
3091 ath11k_warn(ar->ab, "failed to update STA %pM peer bw %d: %d\n", in ath11k_sta_rc_update_wk()
3092 sta->addr, bw, err); in ath11k_sta_rc_update_wk()
3096 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac update sta %pM nss %d\n", in ath11k_sta_rc_update_wk()
3097 sta->addr, nss); in ath11k_sta_rc_update_wk()
3099 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id, in ath11k_sta_rc_update_wk()
3102 ath11k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n", in ath11k_sta_rc_update_wk()
3103 sta->addr, nss, err); in ath11k_sta_rc_update_wk()
3107 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac update sta %pM smps %d\n", in ath11k_sta_rc_update_wk()
3108 sta->addr, smps); in ath11k_sta_rc_update_wk()
3110 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id, in ath11k_sta_rc_update_wk()
3113 ath11k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n", in ath11k_sta_rc_update_wk()
3114 sta->addr, smps, err); in ath11k_sta_rc_update_wk()
3118 mask = &arvif->bitrate_mask; in ath11k_sta_rc_update_wk()
3119 num_vht_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band, in ath11k_sta_rc_update_wk()
3122 /* Peer_assoc_prepare will reject vht rates in in ath11k_sta_rc_update_wk()
3123 * bitrate_mask if its not available in range format and in ath11k_sta_rc_update_wk()
3126 * But, Single rate in VHT mask can be set as per-peer in ath11k_sta_rc_update_wk()
3127 * fixed rate. But even if any HT rates are configured in in ath11k_sta_rc_update_wk()
3129 * when per-peer Fixed rate is set. in ath11k_sta_rc_update_wk()
3133 if (sta->vht_cap.vht_supported && num_vht_rates == 1) { in ath11k_sta_rc_update_wk()
3135 band); in ath11k_sta_rc_update_wk()
3137 /* If the peer is non-VHT or no fixed VHT rate in ath11k_sta_rc_update_wk()
3138 * is provided in the new bitrate mask we set the in ath11k_sta_rc_update_wk()
3141 ath11k_peer_assoc_prepare(ar, arvif->vif, sta, in ath11k_sta_rc_update_wk()
3146 ath11k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n", in ath11k_sta_rc_update_wk()
3147 sta->addr, arvif->vdev_id, err); in ath11k_sta_rc_update_wk()
3149 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) in ath11k_sta_rc_update_wk()
3150 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", in ath11k_sta_rc_update_wk()
3151 sta->addr, arvif->vdev_id); in ath11k_sta_rc_update_wk()
3155 mutex_unlock(&ar->conf_mutex); in ath11k_sta_rc_update_wk()
3161 struct ath11k *ar = arvif->ar; in ath11k_mac_inc_num_stations()
3163 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_inc_num_stations()
3165 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls) in ath11k_mac_inc_num_stations()
3168 if (ar->num_stations >= ar->max_num_stations) in ath11k_mac_inc_num_stations()
3169 return -ENOBUFS; in ath11k_mac_inc_num_stations()
3171 ar->num_stations++; in ath11k_mac_inc_num_stations()
3179 struct ath11k *ar = arvif->ar; in ath11k_mac_dec_num_stations()
3181 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_dec_num_stations()
3183 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls) in ath11k_mac_dec_num_stations()
3186 ar->num_stations--; in ath11k_mac_dec_num_stations()
3193 struct ath11k_base *ab = ar->ab; in ath11k_mac_station_add()
3195 struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv; in ath11k_mac_station_add()
3199 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_station_add()
3204 ar->max_num_stations); in ath11k_mac_station_add()
3208 arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL); in ath11k_mac_station_add()
3209 if (!arsta->rx_stats) { in ath11k_mac_station_add()
3210 ret = -ENOMEM; in ath11k_mac_station_add()
3214 peer_param.vdev_id = arvif->vdev_id; in ath11k_mac_station_add()
3215 peer_param.peer_addr = sta->addr; in ath11k_mac_station_add()
3221 sta->addr, arvif->vdev_id); in ath11k_mac_station_add()
3226 sta->addr, arvif->vdev_id); in ath11k_mac_station_add()
3229 arsta->tx_stats = kzalloc(sizeof(*arsta->tx_stats), GFP_KERNEL); in ath11k_mac_station_add()
3230 if (!arsta->tx_stats) { in ath11k_mac_station_add()
3231 ret = -ENOMEM; in ath11k_mac_station_add()
3237 ret = ath11k_wmi_set_peer_param(ar, sta->addr, in ath11k_mac_station_add()
3238 arvif->vdev_id, in ath11k_mac_station_add()
3242 sta->addr, ret); in ath11k_mac_station_add()
3247 ret = ath11k_dp_peer_setup(ar, arvif->vdev_id, sta->addr); in ath11k_mac_station_add()
3250 sta->addr, arvif->vdev_id, ret); in ath11k_mac_station_add()
3254 if (ab->hw_params.vdev_start_delay && in ath11k_mac_station_add()
3255 !arvif->is_started && in ath11k_mac_station_add()
3256 arvif->vdev_type != WMI_VDEV_TYPE_AP) { in ath11k_mac_station_add()
3257 ret = ath11k_start_vdev_delay(ar->hw, vif); in ath11k_mac_station_add()
3267 kfree(arsta->tx_stats); in ath11k_mac_station_add()
3268 arsta->tx_stats = NULL; in ath11k_mac_station_add()
3270 ath11k_peer_delete(ar, arvif->vdev_id, sta->addr); in ath11k_mac_station_add()
3272 kfree(arsta->rx_stats); in ath11k_mac_station_add()
3273 arsta->rx_stats = NULL; in ath11k_mac_station_add()
3286 struct ath11k *ar = hw->priv; in ath11k_mac_op_sta_state()
3288 struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv; in ath11k_mac_op_sta_state()
3295 cancel_work_sync(&arsta->update_wk); in ath11k_mac_op_sta_state()
3297 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_sta_state()
3302 arsta->arvif = arvif; in ath11k_mac_op_sta_state()
3303 INIT_WORK(&arsta->update_wk, ath11k_sta_rc_update_wk); in ath11k_mac_op_sta_state()
3307 ath11k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n", in ath11k_mac_op_sta_state()
3308 sta->addr, arvif->vdev_id); in ath11k_mac_op_sta_state()
3311 ath11k_dp_peer_cleanup(ar, arvif->vdev_id, sta->addr); in ath11k_mac_op_sta_state()
3313 ret = ath11k_peer_delete(ar, arvif->vdev_id, sta->addr); in ath11k_mac_op_sta_state()
3315 ath11k_warn(ar->ab, "Failed to delete peer: %pM for VDEV: %d\n", in ath11k_mac_op_sta_state()
3316 sta->addr, arvif->vdev_id); in ath11k_mac_op_sta_state()
3318 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "Removed peer: %pM for VDEV: %d\n", in ath11k_mac_op_sta_state()
3319 sta->addr, arvif->vdev_id); in ath11k_mac_op_sta_state()
3322 spin_lock_bh(&ar->ab->base_lock); in ath11k_mac_op_sta_state()
3323 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr); in ath11k_mac_op_sta_state()
3324 if (peer && peer->sta == sta) { in ath11k_mac_op_sta_state()
3325 ath11k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n", in ath11k_mac_op_sta_state()
3326 vif->addr, arvif->vdev_id); in ath11k_mac_op_sta_state()
3327 peer->sta = NULL; in ath11k_mac_op_sta_state()
3328 list_del(&peer->list); in ath11k_mac_op_sta_state()
3330 ar->num_peers--; in ath11k_mac_op_sta_state()
3332 spin_unlock_bh(&ar->ab->base_lock); in ath11k_mac_op_sta_state()
3334 kfree(arsta->tx_stats); in ath11k_mac_op_sta_state()
3335 arsta->tx_stats = NULL; in ath11k_mac_op_sta_state()
3337 kfree(arsta->rx_stats); in ath11k_mac_op_sta_state()
3338 arsta->rx_stats = NULL; in ath11k_mac_op_sta_state()
3341 (vif->type == NL80211_IFTYPE_AP || in ath11k_mac_op_sta_state()
3342 vif->type == NL80211_IFTYPE_MESH_POINT || in ath11k_mac_op_sta_state()
3343 vif->type == NL80211_IFTYPE_ADHOC)) { in ath11k_mac_op_sta_state()
3346 ath11k_warn(ar->ab, "Failed to associate station: %pM\n", in ath11k_mac_op_sta_state()
3347 sta->addr); in ath11k_mac_op_sta_state()
3350 (vif->type == NL80211_IFTYPE_AP || in ath11k_mac_op_sta_state()
3351 vif->type == NL80211_IFTYPE_MESH_POINT || in ath11k_mac_op_sta_state()
3352 vif->type == NL80211_IFTYPE_ADHOC)) { in ath11k_mac_op_sta_state()
3355 ath11k_warn(ar->ab, "Failed to disassociate station: %pM\n", in ath11k_mac_op_sta_state()
3356 sta->addr); in ath11k_mac_op_sta_state()
3359 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_sta_state()
3367 struct ath11k *ar = hw->priv; in ath11k_mac_op_sta_set_txpwr()
3368 struct ath11k_vif *arvif = (void *)vif->drv_priv; in ath11k_mac_op_sta_set_txpwr()
3372 if (sta->txpwr.type == NL80211_TX_POWER_AUTOMATIC) { in ath11k_mac_op_sta_set_txpwr()
3375 txpwr = sta->txpwr.power; in ath11k_mac_op_sta_set_txpwr()
3377 return -EINVAL; in ath11k_mac_op_sta_set_txpwr()
3381 return -EINVAL; in ath11k_mac_op_sta_set_txpwr()
3383 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_sta_set_txpwr()
3385 ret = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id, in ath11k_mac_op_sta_set_txpwr()
3388 ath11k_warn(ar->ab, "failed to set tx power for station ret: %d\n", in ath11k_mac_op_sta_set_txpwr()
3394 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_sta_set_txpwr()
3403 struct ath11k *ar = hw->priv; in ath11k_mac_op_sta_rc_update()
3404 struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv; in ath11k_mac_op_sta_rc_update()
3405 struct ath11k_vif *arvif = (void *)vif->drv_priv; in ath11k_mac_op_sta_rc_update()
3409 spin_lock_bh(&ar->ab->base_lock); in ath11k_mac_op_sta_rc_update()
3411 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr); in ath11k_mac_op_sta_rc_update()
3413 spin_unlock_bh(&ar->ab->base_lock); in ath11k_mac_op_sta_rc_update()
3414 ath11k_warn(ar->ab, "mac sta rc update failed to find peer %pM on vdev %i\n", in ath11k_mac_op_sta_rc_update()
3415 sta->addr, arvif->vdev_id); in ath11k_mac_op_sta_rc_update()
3419 spin_unlock_bh(&ar->ab->base_lock); in ath11k_mac_op_sta_rc_update()
3421 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_op_sta_rc_update()
3423 sta->addr, changed, sta->bandwidth, sta->rx_nss, in ath11k_mac_op_sta_rc_update()
3424 sta->smps_mode); in ath11k_mac_op_sta_rc_update()
3426 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_sta_rc_update()
3431 switch (sta->bandwidth) { in ath11k_mac_op_sta_rc_update()
3445 ath11k_warn(ar->ab, "Invalid bandwidth %d in rc update for %pM\n", in ath11k_mac_op_sta_rc_update()
3446 sta->bandwidth, sta->addr); in ath11k_mac_op_sta_rc_update()
3451 arsta->bw = bw; in ath11k_mac_op_sta_rc_update()
3455 arsta->nss = sta->rx_nss; in ath11k_mac_op_sta_rc_update()
3460 switch (sta->smps_mode) { in ath11k_mac_op_sta_rc_update()
3472 ath11k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM\n", in ath11k_mac_op_sta_rc_update()
3473 sta->smps_mode, sta->addr); in ath11k_mac_op_sta_rc_update()
3478 arsta->smps = smps; in ath11k_mac_op_sta_rc_update()
3481 arsta->changed |= changed; in ath11k_mac_op_sta_rc_update()
3483 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_sta_rc_update()
3485 ieee80211_queue_work(hw, &arsta->update_wk); in ath11k_mac_op_sta_rc_update()
3495 if (arvif->vdev_type != WMI_VDEV_TYPE_STA) in ath11k_conf_tx_uapsd()
3518 arvif->u.sta.uapsd |= value; in ath11k_conf_tx_uapsd()
3520 arvif->u.sta.uapsd &= ~value; in ath11k_conf_tx_uapsd()
3522 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath11k_conf_tx_uapsd()
3524 arvif->u.sta.uapsd); in ath11k_conf_tx_uapsd()
3526 ath11k_warn(ar->ab, "could not set uapsd params %d\n", ret); in ath11k_conf_tx_uapsd()
3530 if (arvif->u.sta.uapsd) in ath11k_conf_tx_uapsd()
3535 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath11k_conf_tx_uapsd()
3539 ath11k_warn(ar->ab, "could not set rx wake param %d\n", ret); in ath11k_conf_tx_uapsd()
3549 struct ath11k *ar = hw->priv; in ath11k_mac_op_conf_tx()
3550 struct ath11k_vif *arvif = (void *)vif->drv_priv; in ath11k_mac_op_conf_tx()
3554 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_conf_tx()
3558 p = &arvif->wmm_params.ac_vo; in ath11k_mac_op_conf_tx()
3561 p = &arvif->wmm_params.ac_vi; in ath11k_mac_op_conf_tx()
3564 p = &arvif->wmm_params.ac_be; in ath11k_mac_op_conf_tx()
3567 p = &arvif->wmm_params.ac_bk; in ath11k_mac_op_conf_tx()
3572 ret = -EINVAL; in ath11k_mac_op_conf_tx()
3576 p->cwmin = params->cw_min; in ath11k_mac_op_conf_tx()
3577 p->cwmax = params->cw_max; in ath11k_mac_op_conf_tx()
3578 p->aifs = params->aifs; in ath11k_mac_op_conf_tx()
3579 p->txop = params->txop; in ath11k_mac_op_conf_tx()
3581 ret = ath11k_wmi_send_wmm_update_cmd_tlv(ar, arvif->vdev_id, in ath11k_mac_op_conf_tx()
3582 &arvif->wmm_params); in ath11k_mac_op_conf_tx()
3584 ath11k_warn(ar->ab, "failed to set wmm params: %d\n", ret); in ath11k_mac_op_conf_tx()
3588 ret = ath11k_conf_tx_uapsd(ar, vif, ac, params->uapsd); in ath11k_mac_op_conf_tx()
3591 ath11k_warn(ar->ab, "failed to set sta uapsd: %d\n", ret); in ath11k_mac_op_conf_tx()
3594 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_conf_tx()
3603 u32 ar_vht_cap = ar->pdev->cap.vht_cap; in ath11k_create_ht_cap()
3654 for (i = 0; i < ar->num_rx_chains; i++) { in ath11k_create_ht_cap()
3667 struct ath11k *ar = arvif->ar; in ath11k_mac_set_txbf_conf()
3670 u32 vht_cap = ar->pdev->cap.vht_cap; in ath11k_mac_set_txbf_conf()
3683 if (sound_dim > (ar->num_tx_chains - 1)) in ath11k_mac_set_txbf_conf()
3684 sound_dim = ar->num_tx_chains - 1; in ath11k_mac_set_txbf_conf()
3695 arvif->vdev_type == WMI_VDEV_TYPE_AP) in ath11k_mac_set_txbf_conf()
3699 /* TODO: SUBFEE not validated in HK, disable here until validated? */ in ath11k_mac_set_txbf_conf()
3705 arvif->vdev_type == WMI_VDEV_TYPE_STA) in ath11k_mac_set_txbf_conf()
3709 return ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_set_txbf_conf()
3721 if (ar->num_tx_chains < 2) { in ath11k_set_vht_txbf_cap()
3742 if (sound_dim > (ar->num_tx_chains - 1)) in ath11k_set_vht_txbf_cap()
3743 sound_dim = ar->num_tx_chains - 1; in ath11k_set_vht_txbf_cap()
3764 vht_cap.cap = ar->pdev->cap.vht_cap; in ath11k_create_vht_cap()
3776 if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i)) in ath11k_create_vht_cap()
3781 if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i)) in ath11k_create_vht_cap()
3800 struct ieee80211_supported_band *band; in ath11k_mac_setup_ht_vht_cap() local
3805 rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift; in ath11k_mac_setup_ht_vht_cap()
3806 rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift; in ath11k_mac_setup_ht_vht_cap()
3808 if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) { in ath11k_mac_setup_ht_vht_cap()
3809 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; in ath11k_mac_setup_ht_vht_cap()
3810 ht_cap = cap->band[NL80211_BAND_2GHZ].ht_cap_info; in ath11k_mac_setup_ht_vht_cap()
3813 band->ht_cap = ath11k_create_ht_cap(ar, ht_cap, in ath11k_mac_setup_ht_vht_cap()
3817 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP && !ar->supports_6ghz) { in ath11k_mac_setup_ht_vht_cap()
3818 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; in ath11k_mac_setup_ht_vht_cap()
3819 ht_cap = cap->band[NL80211_BAND_5GHZ].ht_cap_info; in ath11k_mac_setup_ht_vht_cap()
3822 band->ht_cap = ath11k_create_ht_cap(ar, ht_cap, in ath11k_mac_setup_ht_vht_cap()
3824 band->vht_cap = ath11k_create_vht_cap(ar, rate_cap_tx_chainmask, in ath11k_mac_setup_ht_vht_cap()
3832 * chainmask table which is advertised in extented_service_ready event in ath11k_check_chain_mask()
3844 he_ppet[0] = fw_ppet->numss_m1 & IEEE80211_PPE_THRES_NSS_MASK; in ath11k_gen_ppe_thresh()
3845 he_ppet[0] |= (fw_ppet->ru_bit_mask << in ath11k_gen_ppe_thresh()
3848 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) { in ath11k_gen_ppe_thresh()
3853 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0) in ath11k_gen_ppe_thresh()
3855 val = (fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> (ru * 6)) & in ath11k_gen_ppe_thresh()
3858 for (i = 5; i >= 0; i--) { in ath11k_gen_ppe_thresh()
3874 he_cap_elem->mac_cap_info[0] &= ~m; in ath11k_mac_filter_he_cap_mesh()
3879 he_cap_elem->mac_cap_info[2] &= ~m; in ath11k_mac_filter_he_cap_mesh()
3884 he_cap_elem->mac_cap_info[3] &= ~m; in ath11k_mac_filter_he_cap_mesh()
3888 he_cap_elem->mac_cap_info[4] &= ~m; in ath11k_mac_filter_he_cap_mesh()
3894 he_cap_elem->mac_cap_info[5] &= ~m; in ath11k_mac_filter_he_cap_mesh()
3898 he_cap_elem->phy_cap_info[2] &= ~m; in ath11k_mac_filter_he_cap_mesh()
3903 he_cap_elem->phy_cap_info[3] &= ~m; in ath11k_mac_filter_he_cap_mesh()
3906 he_cap_elem->phy_cap_info[4] &= ~m; in ath11k_mac_filter_he_cap_mesh()
3909 he_cap_elem->phy_cap_info[5] &= ~m; in ath11k_mac_filter_he_cap_mesh()
3915 he_cap_elem->phy_cap_info[6] &= ~m; in ath11k_mac_filter_he_cap_mesh()
3921 he_cap_elem->phy_cap_info[7] &= ~m; in ath11k_mac_filter_he_cap_mesh()
3927 he_cap_elem->phy_cap_info[8] &= ~m; in ath11k_mac_filter_he_cap_mesh()
3935 he_cap_elem->phy_cap_info[9] &= ~m; in ath11k_mac_filter_he_cap_mesh()
3943 bcap->he_6ghz_capa = IEEE80211_HT_MPDU_DENSITY_NONE; in ath11k_mac_setup_he_6ghz_cap()
3944 if (bcap->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) in ath11k_mac_setup_he_6ghz_cap()
3945 bcap->he_6ghz_capa |= in ath11k_mac_setup_he_6ghz_cap()
3949 bcap->he_6ghz_capa |= in ath11k_mac_setup_he_6ghz_cap()
3953 pcap->vht_cap); in ath11k_mac_setup_he_6ghz_cap()
3954 bcap->he_6ghz_capa |= in ath11k_mac_setup_he_6ghz_cap()
3956 val = FIELD_GET(IEEE80211_VHT_CAP_MAX_MPDU_MASK, pcap->vht_cap); in ath11k_mac_setup_he_6ghz_cap()
3957 bcap->he_6ghz_capa |= in ath11k_mac_setup_he_6ghz_cap()
3959 if (pcap->vht_cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN) in ath11k_mac_setup_he_6ghz_cap()
3960 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS; in ath11k_mac_setup_he_6ghz_cap()
3961 if (pcap->vht_cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN) in ath11k_mac_setup_he_6ghz_cap()
3962 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS; in ath11k_mac_setup_he_6ghz_cap()
3964 return cpu_to_le16(bcap->he_6ghz_capa); in ath11k_mac_setup_he_6ghz_cap()
3970 int band) in ath11k_mac_copy_he_cap() argument
3976 struct ath11k_band_cap *band_cap = &cap->band[band]; in ath11k_mac_copy_he_cap()
3978 &he_cap->he_cap_elem; in ath11k_mac_copy_he_cap()
3991 he_cap->has_he = true; in ath11k_mac_copy_he_cap()
3992 memcpy(he_cap_elem->mac_cap_info, band_cap->he_cap_info, in ath11k_mac_copy_he_cap()
3993 sizeof(he_cap_elem->mac_cap_info)); in ath11k_mac_copy_he_cap()
3994 memcpy(he_cap_elem->phy_cap_info, band_cap->he_cap_phy_info, in ath11k_mac_copy_he_cap()
3995 sizeof(he_cap_elem->phy_cap_info)); in ath11k_mac_copy_he_cap()
3997 he_cap_elem->mac_cap_info[1] &= in ath11k_mac_copy_he_cap()
4000 he_cap_elem->phy_cap_info[5] &= in ath11k_mac_copy_he_cap()
4002 he_cap_elem->phy_cap_info[5] |= ar->num_tx_chains - 1; in ath11k_mac_copy_he_cap()
4006 he_cap_elem->phy_cap_info[3] &= in ath11k_mac_copy_he_cap()
4008 he_cap_elem->phy_cap_info[9] |= in ath11k_mac_copy_he_cap()
4012 he_cap_elem->mac_cap_info[0] &= in ath11k_mac_copy_he_cap()
4014 he_cap_elem->mac_cap_info[0] |= in ath11k_mac_copy_he_cap()
4016 he_cap_elem->phy_cap_info[9] |= in ath11k_mac_copy_he_cap()
4024 he_cap->he_mcs_nss_supp.rx_mcs_80 = in ath11k_mac_copy_he_cap()
4025 cpu_to_le16(band_cap->he_mcs & 0xffff); in ath11k_mac_copy_he_cap()
4026 he_cap->he_mcs_nss_supp.tx_mcs_80 = in ath11k_mac_copy_he_cap()
4027 cpu_to_le16(band_cap->he_mcs & 0xffff); in ath11k_mac_copy_he_cap()
4028 he_cap->he_mcs_nss_supp.rx_mcs_160 = in ath11k_mac_copy_he_cap()
4029 cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff); in ath11k_mac_copy_he_cap()
4030 he_cap->he_mcs_nss_supp.tx_mcs_160 = in ath11k_mac_copy_he_cap()
4031 cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff); in ath11k_mac_copy_he_cap()
4032 he_cap->he_mcs_nss_supp.rx_mcs_80p80 = in ath11k_mac_copy_he_cap()
4033 cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff); in ath11k_mac_copy_he_cap()
4034 he_cap->he_mcs_nss_supp.tx_mcs_80p80 = in ath11k_mac_copy_he_cap()
4035 cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff); in ath11k_mac_copy_he_cap()
4037 memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres)); in ath11k_mac_copy_he_cap()
4038 if (he_cap_elem->phy_cap_info[6] & in ath11k_mac_copy_he_cap()
4040 ath11k_gen_ppe_thresh(&band_cap->he_ppet, in ath11k_mac_copy_he_cap()
4041 he_cap->ppe_thres); in ath11k_mac_copy_he_cap()
4043 if (band == NL80211_BAND_6GHZ) { in ath11k_mac_copy_he_cap()
4056 struct ieee80211_supported_band *band; in ath11k_mac_setup_he_cap() local
4059 if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) { in ath11k_mac_setup_he_cap()
4061 ar->mac.iftype[NL80211_BAND_2GHZ], in ath11k_mac_setup_he_cap()
4063 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; in ath11k_mac_setup_he_cap()
4064 band->iftype_data = ar->mac.iftype[NL80211_BAND_2GHZ]; in ath11k_mac_setup_he_cap()
4065 band->n_iftype_data = count; in ath11k_mac_setup_he_cap()
4068 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP) { in ath11k_mac_setup_he_cap()
4070 ar->mac.iftype[NL80211_BAND_5GHZ], in ath11k_mac_setup_he_cap()
4072 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; in ath11k_mac_setup_he_cap()
4073 band->iftype_data = ar->mac.iftype[NL80211_BAND_5GHZ]; in ath11k_mac_setup_he_cap()
4074 band->n_iftype_data = count; in ath11k_mac_setup_he_cap()
4077 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP && in ath11k_mac_setup_he_cap()
4078 ar->supports_6ghz) { in ath11k_mac_setup_he_cap()
4080 ar->mac.iftype[NL80211_BAND_6GHZ], in ath11k_mac_setup_he_cap()
4082 band = &ar->mac.sbands[NL80211_BAND_6GHZ]; in ath11k_mac_setup_he_cap()
4083 band->iftype_data = ar->mac.iftype[NL80211_BAND_6GHZ]; in ath11k_mac_setup_he_cap()
4084 band->n_iftype_data = count; in ath11k_mac_setup_he_cap()
4092 lockdep_assert_held(&ar->conf_mutex); in __ath11k_set_antenna()
4095 return -EINVAL; in __ath11k_set_antenna()
4098 return -EINVAL; in __ath11k_set_antenna()
4100 ar->cfg_tx_chainmask = tx_ant; in __ath11k_set_antenna()
4101 ar->cfg_rx_chainmask = rx_ant; in __ath11k_set_antenna()
4103 if (ar->state != ATH11K_STATE_ON && in __ath11k_set_antenna()
4104 ar->state != ATH11K_STATE_RESTARTED) in __ath11k_set_antenna()
4108 tx_ant, ar->pdev->pdev_id); in __ath11k_set_antenna()
4110 ath11k_warn(ar->ab, "failed to set tx-chainmask: %d, req 0x%x\n", in __ath11k_set_antenna()
4115 ar->num_tx_chains = get_num_chains(tx_ant); in __ath11k_set_antenna()
4118 rx_ant, ar->pdev->pdev_id); in __ath11k_set_antenna()
4120 ath11k_warn(ar->ab, "failed to set rx-chainmask: %d, req 0x%x\n", in __ath11k_set_antenna()
4125 ar->num_rx_chains = get_num_chains(rx_ant); in __ath11k_set_antenna()
4128 ath11k_mac_setup_ht_vht_cap(ar, &ar->pdev->cap, NULL); in __ath11k_set_antenna()
4129 ath11k_mac_setup_he_cap(ar, &ar->pdev->cap); in __ath11k_set_antenna()
4139 struct ath11k_base *ab = ar->ab; in ath11k_mac_tx_mgmt_pending_free()
4141 spin_lock_bh(&ar->txmgmt_idr_lock); in ath11k_mac_tx_mgmt_pending_free()
4142 idr_remove(&ar->txmgmt_idr, buf_id); in ath11k_mac_tx_mgmt_pending_free()
4143 spin_unlock_bh(&ar->txmgmt_idr_lock); in ath11k_mac_tx_mgmt_pending_free()
4144 dma_unmap_single(ab->dev, ATH11K_SKB_CB(msdu)->paddr, msdu->len, in ath11k_mac_tx_mgmt_pending_free()
4148 memset(&info->status, 0, sizeof(info->status)); in ath11k_mac_tx_mgmt_pending_free()
4150 ieee80211_free_txskb(ar->hw, msdu); in ath11k_mac_tx_mgmt_pending_free()
4160 struct ath11k *ar = skb_cb->ar; in ath11k_mac_vif_txmgmt_idr_remove()
4161 struct ath11k_base *ab = ar->ab; in ath11k_mac_vif_txmgmt_idr_remove()
4163 if (skb_cb->vif == vif) { in ath11k_mac_vif_txmgmt_idr_remove()
4164 spin_lock_bh(&ar->txmgmt_idr_lock); in ath11k_mac_vif_txmgmt_idr_remove()
4165 idr_remove(&ar->txmgmt_idr, buf_id); in ath11k_mac_vif_txmgmt_idr_remove()
4166 spin_unlock_bh(&ar->txmgmt_idr_lock); in ath11k_mac_vif_txmgmt_idr_remove()
4167 dma_unmap_single(ab->dev, skb_cb->paddr, msdu->len, in ath11k_mac_vif_txmgmt_idr_remove()
4177 struct ath11k_base *ab = ar->ab; in ath11k_mac_mgmt_tx_wmi()
4178 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ath11k_mac_mgmt_tx_wmi()
4184 spin_lock_bh(&ar->txmgmt_idr_lock); in ath11k_mac_mgmt_tx_wmi()
4185 buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0, in ath11k_mac_mgmt_tx_wmi()
4187 spin_unlock_bh(&ar->txmgmt_idr_lock); in ath11k_mac_mgmt_tx_wmi()
4189 return -ENOSPC; in ath11k_mac_mgmt_tx_wmi()
4192 if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) { in ath11k_mac_mgmt_tx_wmi()
4193 if ((ieee80211_is_action(hdr->frame_control) || in ath11k_mac_mgmt_tx_wmi()
4194 ieee80211_is_deauth(hdr->frame_control) || in ath11k_mac_mgmt_tx_wmi()
4195 ieee80211_is_disassoc(hdr->frame_control)) && in ath11k_mac_mgmt_tx_wmi()
4196 ieee80211_has_protected(hdr->frame_control)) { in ath11k_mac_mgmt_tx_wmi()
4201 paddr = dma_map_single(ab->dev, skb->data, skb->len, DMA_TO_DEVICE); in ath11k_mac_mgmt_tx_wmi()
4202 if (dma_mapping_error(ab->dev, paddr)) { in ath11k_mac_mgmt_tx_wmi()
4204 ret = -EIO; in ath11k_mac_mgmt_tx_wmi()
4208 ATH11K_SKB_CB(skb)->paddr = paddr; in ath11k_mac_mgmt_tx_wmi()
4210 ret = ath11k_wmi_mgmt_send(ar, arvif->vdev_id, buf_id, skb); in ath11k_mac_mgmt_tx_wmi()
4212 ath11k_warn(ar->ab, "failed to send mgmt frame: %d\n", ret); in ath11k_mac_mgmt_tx_wmi()
4219 dma_unmap_single(ab->dev, ATH11K_SKB_CB(skb)->paddr, in ath11k_mac_mgmt_tx_wmi()
4220 skb->len, DMA_TO_DEVICE); in ath11k_mac_mgmt_tx_wmi()
4222 spin_lock_bh(&ar->txmgmt_idr_lock); in ath11k_mac_mgmt_tx_wmi()
4223 idr_remove(&ar->txmgmt_idr, buf_id); in ath11k_mac_mgmt_tx_wmi()
4224 spin_unlock_bh(&ar->txmgmt_idr_lock); in ath11k_mac_mgmt_tx_wmi()
4233 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) in ath11k_mgmt_over_wmi_tx_purge()
4234 ieee80211_free_txskb(ar->hw, skb); in ath11k_mgmt_over_wmi_tx_purge()
4245 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) { in ath11k_mgmt_over_wmi_tx_work()
4247 if (!skb_cb->vif) { in ath11k_mgmt_over_wmi_tx_work()
4248 ath11k_warn(ar->ab, "no vif found for mgmt frame\n"); in ath11k_mgmt_over_wmi_tx_work()
4249 ieee80211_free_txskb(ar->hw, skb); in ath11k_mgmt_over_wmi_tx_work()
4253 arvif = ath11k_vif_to_arvif(skb_cb->vif); in ath11k_mgmt_over_wmi_tx_work()
4254 if (ar->allocated_vdev_map & (1LL << arvif->vdev_id) && in ath11k_mgmt_over_wmi_tx_work()
4255 arvif->is_started) { in ath11k_mgmt_over_wmi_tx_work()
4258 ath11k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n", in ath11k_mgmt_over_wmi_tx_work()
4259 arvif->vdev_id, ret); in ath11k_mgmt_over_wmi_tx_work()
4260 ieee80211_free_txskb(ar->hw, skb); in ath11k_mgmt_over_wmi_tx_work()
4262 atomic_inc(&ar->num_pending_mgmt_tx); in ath11k_mgmt_over_wmi_tx_work()
4265 ath11k_warn(ar->ab, in ath11k_mgmt_over_wmi_tx_work()
4267 arvif->vdev_id, in ath11k_mgmt_over_wmi_tx_work()
4268 arvif->is_started); in ath11k_mgmt_over_wmi_tx_work()
4269 ieee80211_free_txskb(ar->hw, skb); in ath11k_mgmt_over_wmi_tx_work()
4277 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue; in ath11k_mac_mgmt_tx()
4279 if (test_bit(ATH11K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags)) in ath11k_mac_mgmt_tx()
4280 return -ESHUTDOWN; in ath11k_mac_mgmt_tx()
4288 atomic_read(&ar->num_pending_mgmt_tx) > ATH11K_PRB_RSP_DROP_THRESHOLD) { in ath11k_mac_mgmt_tx()
4289 ath11k_warn(ar->ab, in ath11k_mac_mgmt_tx()
4291 return -ENOSPC; in ath11k_mac_mgmt_tx()
4295 ath11k_warn(ar->ab, "mgmt tx queue is full\n"); in ath11k_mac_mgmt_tx()
4296 return -ENOSPC; in ath11k_mac_mgmt_tx()
4300 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work); in ath11k_mac_mgmt_tx()
4310 struct ath11k *ar = hw->priv; in ath11k_mac_op_tx()
4312 struct ieee80211_vif *vif = info->control.vif; in ath11k_mac_op_tx()
4314 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ath11k_mac_op_tx()
4315 struct ieee80211_key_conf *key = info->control.hw_key; in ath11k_mac_op_tx()
4316 u32 info_flags = info->flags; in ath11k_mac_op_tx()
4321 skb_cb->vif = vif; in ath11k_mac_op_tx()
4324 skb_cb->cipher = key->cipher; in ath11k_mac_op_tx()
4325 skb_cb->flags |= ATH11K_SKB_CIPHER_SET; in ath11k_mac_op_tx()
4329 skb_cb->flags |= ATH11K_SKB_HW_80211_ENCAP; in ath11k_mac_op_tx()
4330 } else if (ieee80211_is_mgmt(hdr->frame_control)) { in ath11k_mac_op_tx()
4331 is_prb_rsp = ieee80211_is_probe_resp(hdr->frame_control); in ath11k_mac_op_tx()
4334 ath11k_warn(ar->ab, "failed to queue management frame %d\n", in ath11k_mac_op_tx()
4336 ieee80211_free_txskb(ar->hw, skb); in ath11k_mac_op_tx()
4343 ath11k_warn(ar->ab, "failed to transmit frame %d\n", ret); in ath11k_mac_op_tx()
4344 ieee80211_free_txskb(ar->hw, skb); in ath11k_mac_op_tx()
4350 /* make sure rcu-protected mac80211 tx path itself is drained */ in ath11k_mac_drain_tx()
4353 cancel_work_sync(&ar->wmi_mgmt_tx_work); in ath11k_mac_drain_tx()
4360 struct ath11k_base *ab = ar->ab; in ath11k_mac_config_mon_status_default()
4370 for (i = 0; i < ab->hw_params.num_rxmda_per_pdev; i++) { in ath11k_mac_config_mon_status_default()
4371 ring_id = ar->dp.rx_mon_status_refill_ring[i].refill_buf_ring.ring_id; in ath11k_mac_config_mon_status_default()
4372 ret = ath11k_dp_tx_htt_rx_filter_setup(ar->ab, ring_id, in ath11k_mac_config_mon_status_default()
4373 ar->dp.mac_id + i, in ath11k_mac_config_mon_status_default()
4379 if (enable && !ar->ab->hw_params.rxdma1_enable) in ath11k_mac_config_mon_status_default()
4380 mod_timer(&ar->ab->mon_reap_timer, jiffies + in ath11k_mac_config_mon_status_default()
4388 struct ath11k *ar = hw->priv; in ath11k_mac_op_start()
4389 struct ath11k_base *ab = ar->ab; in ath11k_mac_op_start()
4390 struct ath11k_pdev *pdev = ar->pdev; in ath11k_mac_op_start()
4394 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_start()
4396 switch (ar->state) { in ath11k_mac_op_start()
4398 ar->state = ATH11K_STATE_ON; in ath11k_mac_op_start()
4401 ar->state = ATH11K_STATE_RESTARTED; in ath11k_mac_op_start()
4407 ret = -EINVAL; in ath11k_mac_op_start()
4412 1, pdev->pdev_id); in ath11k_mac_op_start()
4415 ath11k_err(ar->ab, "failed to enable PMF QOS: (%d\n", ret); in ath11k_mac_op_start()
4420 pdev->pdev_id); in ath11k_mac_op_start()
4422 ath11k_err(ar->ab, "failed to enable dynamic bw: %d\n", ret); in ath11k_mac_op_start()
4427 0, pdev->pdev_id); in ath11k_mac_op_start()
4434 ret = ath11k_wmi_send_dfs_phyerr_offload_enable_cmd(ar, pdev->pdev_id); in ath11k_mac_op_start()
4449 1, pdev->pdev_id); in ath11k_mac_op_start()
4452 ath11k_err(ar->ab, "failed to enable MESH MCAST ENABLE: (%d\n", ret); in ath11k_mac_op_start()
4456 __ath11k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask); in ath11k_mac_op_start()
4462 ar->num_started_vdevs = 0; in ath11k_mac_op_start()
4463 ar->num_created_vdevs = 0; in ath11k_mac_op_start()
4464 ar->num_peers = 0; in ath11k_mac_op_start()
4465 ar->allocated_vdev_map = 0; in ath11k_mac_op_start()
4478 ath11k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id); in ath11k_mac_op_start()
4481 if (ab->hw_params.idle_ps) { in ath11k_mac_op_start()
4483 1, pdev->pdev_id); in ath11k_mac_op_start()
4490 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_start()
4492 rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx], in ath11k_mac_op_start()
4493 &ab->pdevs[ar->pdev_idx]); in ath11k_mac_op_start()
4498 ar->state = ATH11K_STATE_OFF; in ath11k_mac_op_start()
4499 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_start()
4506 struct ath11k *ar = hw->priv; in ath11k_mac_op_stop()
4512 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_stop()
4515 ath11k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n", in ath11k_mac_op_stop()
4518 clear_bit(ATH11K_CAC_RUNNING, &ar->dev_flags); in ath11k_mac_op_stop()
4519 ar->state = ATH11K_STATE_OFF; in ath11k_mac_op_stop()
4520 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_stop()
4522 cancel_delayed_work_sync(&ar->scan.timeout); in ath11k_mac_op_stop()
4523 cancel_work_sync(&ar->regd_update_work); in ath11k_mac_op_stop()
4525 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_stop()
4526 list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, list) { in ath11k_mac_op_stop()
4527 list_del(&ppdu_stats->list); in ath11k_mac_op_stop()
4530 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_stop()
4532 rcu_assign_pointer(ar->ab->pdevs_active[ar->pdev_idx], NULL); in ath11k_mac_op_stop()
4536 atomic_set(&ar->num_pending_mgmt_tx, 0); in ath11k_mac_op_stop()
4543 struct ath11k *ar = arvif->ar; in ath11k_mac_setup_vdev_create_params()
4544 struct ath11k_pdev *pdev = ar->pdev; in ath11k_mac_setup_vdev_create_params()
4546 params->if_id = arvif->vdev_id; in ath11k_mac_setup_vdev_create_params()
4547 params->type = arvif->vdev_type; in ath11k_mac_setup_vdev_create_params()
4548 params->subtype = arvif->vdev_subtype; in ath11k_mac_setup_vdev_create_params()
4549 params->pdev_id = pdev->pdev_id; in ath11k_mac_setup_vdev_create_params()
4551 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) { in ath11k_mac_setup_vdev_create_params()
4552 params->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains; in ath11k_mac_setup_vdev_create_params()
4553 params->chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains; in ath11k_mac_setup_vdev_create_params()
4555 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) { in ath11k_mac_setup_vdev_create_params()
4556 params->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains; in ath11k_mac_setup_vdev_create_params()
4557 params->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains; in ath11k_mac_setup_vdev_create_params()
4559 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP && in ath11k_mac_setup_vdev_create_params()
4560 ar->supports_6ghz) { in ath11k_mac_setup_vdev_create_params()
4561 params->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains; in ath11k_mac_setup_vdev_create_params()
4562 params->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains; in ath11k_mac_setup_vdev_create_params()
4569 struct ath11k_pdev_cap *pdev_cap = &pdev->cap; in ath11k_mac_prepare_he_mode()
4574 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) in ath11k_mac_prepare_he_mode()
4575 cap_band = &pdev_cap->band[NL80211_BAND_2GHZ]; in ath11k_mac_prepare_he_mode()
4577 cap_band = &pdev_cap->band[NL80211_BAND_5GHZ]; in ath11k_mac_prepare_he_mode()
4579 hecap_phy_ptr = &cap_band->he_cap_phy_info[0]; in ath11k_mac_prepare_he_mode()
4602 struct ath11k_base *ab = ar->ab; in ath11k_set_he_mu_sounding_mode()
4606 param_value = ath11k_mac_prepare_he_mode(ar->pdev, arvif->vif->type); in ath11k_set_he_mu_sounding_mode()
4607 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_set_he_mu_sounding_mode()
4611 arvif->vdev_id, ret, param_value); in ath11k_set_he_mu_sounding_mode()
4619 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_set_he_mu_sounding_mode()
4623 arvif->vdev_id, ret); in ath11k_set_he_mu_sounding_mode()
4632 struct ath11k *ar = hw->priv; in ath11k_mac_op_update_vif_offload()
4633 struct ath11k_base *ab = ar->ab; in ath11k_mac_op_update_vif_offload()
4640 (vif->type != NL80211_IFTYPE_STATION && in ath11k_mac_op_update_vif_offload()
4641 vif->type != NL80211_IFTYPE_AP)) in ath11k_mac_op_update_vif_offload()
4642 vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED; in ath11k_mac_op_update_vif_offload()
4644 if (vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED) in ath11k_mac_op_update_vif_offload()
4646 else if (test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags)) in ath11k_mac_op_update_vif_offload()
4651 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_update_vif_offload()
4655 arvif->vdev_id, ret); in ath11k_mac_op_update_vif_offload()
4656 vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED; in ath11k_mac_op_update_vif_offload()
4663 struct ath11k *ar = hw->priv; in ath11k_mac_op_add_interface()
4664 struct ath11k_base *ab = ar->ab; in ath11k_mac_op_add_interface()
4674 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD; in ath11k_mac_op_add_interface()
4676 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_add_interface()
4678 if (vif->type == NL80211_IFTYPE_AP && in ath11k_mac_op_add_interface()
4679 ar->num_peers > (ar->max_num_peers - 1)) { in ath11k_mac_op_add_interface()
4680 ath11k_warn(ab, "failed to create vdev due to insufficient peer entry resource in firmware\n"); in ath11k_mac_op_add_interface()
4681 ret = -ENOBUFS; in ath11k_mac_op_add_interface()
4685 if (ar->num_created_vdevs > (TARGET_NUM_VDEVS - 1)) { in ath11k_mac_op_add_interface()
4688 ret = -EBUSY; in ath11k_mac_op_add_interface()
4694 arvif->ar = ar; in ath11k_mac_op_add_interface()
4695 arvif->vif = vif; in ath11k_mac_op_add_interface()
4697 INIT_LIST_HEAD(&arvif->list); in ath11k_mac_op_add_interface()
4698 INIT_DELAYED_WORK(&arvif->connection_loss_work, in ath11k_mac_op_add_interface()
4701 for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) { in ath11k_mac_op_add_interface()
4702 arvif->bitrate_mask.control[i].legacy = 0xffffffff; in ath11k_mac_op_add_interface()
4703 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff, in ath11k_mac_op_add_interface()
4704 sizeof(arvif->bitrate_mask.control[i].ht_mcs)); in ath11k_mac_op_add_interface()
4705 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff, in ath11k_mac_op_add_interface()
4706 sizeof(arvif->bitrate_mask.control[i].vht_mcs)); in ath11k_mac_op_add_interface()
4709 bit = __ffs64(ab->free_vdev_map); in ath11k_mac_op_add_interface()
4711 arvif->vdev_id = bit; in ath11k_mac_op_add_interface()
4712 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE; in ath11k_mac_op_add_interface()
4714 switch (vif->type) { in ath11k_mac_op_add_interface()
4717 arvif->vdev_type = WMI_VDEV_TYPE_STA; in ath11k_mac_op_add_interface()
4720 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_MESH_11S; in ath11k_mac_op_add_interface()
4723 arvif->vdev_type = WMI_VDEV_TYPE_AP; in ath11k_mac_op_add_interface()
4726 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR; in ath11k_mac_op_add_interface()
4733 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac add interface id %d type %d subtype %d map %llx\n", in ath11k_mac_op_add_interface()
4734 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype, in ath11k_mac_op_add_interface()
4735 ab->free_vdev_map); in ath11k_mac_op_add_interface()
4737 vif->cab_queue = arvif->vdev_id % (ATH11K_HW_MAX_QUEUES - 1); in ath11k_mac_op_add_interface()
4738 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++) in ath11k_mac_op_add_interface()
4739 vif->hw_queue[i] = i % (ATH11K_HW_MAX_QUEUES - 1); in ath11k_mac_op_add_interface()
4743 ret = ath11k_wmi_vdev_create(ar, vif->addr, &vdev_param); in ath11k_mac_op_add_interface()
4746 arvif->vdev_id, ret); in ath11k_mac_op_add_interface()
4750 ar->num_created_vdevs++; in ath11k_mac_op_add_interface()
4752 vif->addr, arvif->vdev_id); in ath11k_mac_op_add_interface()
4753 ar->allocated_vdev_map |= 1LL << arvif->vdev_id; in ath11k_mac_op_add_interface()
4754 ab->free_vdev_map &= ~(1LL << arvif->vdev_id); in ath11k_mac_op_add_interface()
4756 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_add_interface()
4757 list_add(&arvif->list, &ar->arvifs); in ath11k_mac_op_add_interface()
4758 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_add_interface()
4762 nss = get_num_chains(ar->cfg_tx_chainmask) ? : 1; in ath11k_mac_op_add_interface()
4763 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_add_interface()
4767 arvif->vdev_id, ar->cfg_tx_chainmask, nss, ret); in ath11k_mac_op_add_interface()
4771 switch (arvif->vdev_type) { in ath11k_mac_op_add_interface()
4773 peer_param.vdev_id = arvif->vdev_id; in ath11k_mac_op_add_interface()
4774 peer_param.peer_addr = vif->addr; in ath11k_mac_op_add_interface()
4779 arvif->vdev_id, ret); in ath11k_mac_op_add_interface()
4785 ath11k_warn(ar->ab, "failed to set vdev %i kickout parameters: %d\n", in ath11k_mac_op_add_interface()
4786 arvif->vdev_id, ret); in ath11k_mac_op_add_interface()
4793 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath11k_mac_op_add_interface()
4796 ath11k_warn(ar->ab, "failed to set vdev %d RX wake policy: %d\n", in ath11k_mac_op_add_interface()
4797 arvif->vdev_id, ret); in ath11k_mac_op_add_interface()
4803 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath11k_mac_op_add_interface()
4806 ath11k_warn(ar->ab, "failed to set vdev %d TX wake threshold: %d\n", in ath11k_mac_op_add_interface()
4807 arvif->vdev_id, ret); in ath11k_mac_op_add_interface()
4813 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath11k_mac_op_add_interface()
4816 ath11k_warn(ar->ab, "failed to set vdev %d pspoll count: %d\n", in ath11k_mac_op_add_interface()
4817 arvif->vdev_id, ret); in ath11k_mac_op_add_interface()
4821 ret = ath11k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, false); in ath11k_mac_op_add_interface()
4823 ath11k_warn(ar->ab, "failed to disable vdev %d ps mode: %d\n", in ath11k_mac_op_add_interface()
4824 arvif->vdev_id, ret); in ath11k_mac_op_add_interface()
4832 arvif->txpower = vif->bss_conf.txpower; in ath11k_mac_op_add_interface()
4838 param_value = ar->hw->wiphy->rts_threshold; in ath11k_mac_op_add_interface()
4839 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_add_interface()
4842 ath11k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n", in ath11k_mac_op_add_interface()
4843 arvif->vdev_id, ret); in ath11k_mac_op_add_interface()
4848 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_add_interface()
4853 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) { in ath11k_mac_op_add_interface()
4854 reinit_completion(&ar->peer_delete_done); in ath11k_mac_op_add_interface()
4856 ret = ath11k_wmi_send_peer_delete_cmd(ar, vif->addr, in ath11k_mac_op_add_interface()
4857 arvif->vdev_id); in ath11k_mac_op_add_interface()
4859 ath11k_warn(ar->ab, "failed to delete peer vdev_id %d addr %pM\n", in ath11k_mac_op_add_interface()
4860 arvif->vdev_id, vif->addr); in ath11k_mac_op_add_interface()
4864 ret = ath11k_wait_for_peer_delete_done(ar, arvif->vdev_id, in ath11k_mac_op_add_interface()
4865 vif->addr); in ath11k_mac_op_add_interface()
4869 ar->num_peers--; in ath11k_mac_op_add_interface()
4873 ath11k_wmi_vdev_delete(ar, arvif->vdev_id); in ath11k_mac_op_add_interface()
4874 ar->num_created_vdevs--; in ath11k_mac_op_add_interface()
4875 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id); in ath11k_mac_op_add_interface()
4876 ab->free_vdev_map |= 1LL << arvif->vdev_id; in ath11k_mac_op_add_interface()
4877 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_add_interface()
4878 list_del(&arvif->list); in ath11k_mac_op_add_interface()
4879 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_add_interface()
4882 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_add_interface()
4892 if (skb_cb->vif == vif) in ath11k_mac_vif_unref()
4893 skb_cb->vif = NULL; in ath11k_mac_vif_unref()
4901 struct ath11k *ar = hw->priv; in ath11k_mac_op_remove_interface()
4903 struct ath11k_base *ab = ar->ab; in ath11k_mac_op_remove_interface()
4908 cancel_delayed_work_sync(&arvif->connection_loss_work); in ath11k_mac_op_remove_interface()
4910 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_remove_interface()
4913 arvif->vdev_id); in ath11k_mac_op_remove_interface()
4915 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) { in ath11k_mac_op_remove_interface()
4916 ret = ath11k_peer_delete(ar, arvif->vdev_id, vif->addr); in ath11k_mac_op_remove_interface()
4918 ath11k_warn(ab, "failed to submit AP self-peer removal on vdev %d: %d\n", in ath11k_mac_op_remove_interface()
4919 arvif->vdev_id, ret); in ath11k_mac_op_remove_interface()
4922 reinit_completion(&ar->vdev_delete_done); in ath11k_mac_op_remove_interface()
4924 ret = ath11k_wmi_vdev_delete(ar, arvif->vdev_id); in ath11k_mac_op_remove_interface()
4927 arvif->vdev_id, ret); in ath11k_mac_op_remove_interface()
4931 time_left = wait_for_completion_timeout(&ar->vdev_delete_done, in ath11k_mac_op_remove_interface()
4934 ath11k_warn(ab, "Timeout in receiving vdev delete response\n"); in ath11k_mac_op_remove_interface()
4938 ab->free_vdev_map |= 1LL << (arvif->vdev_id); in ath11k_mac_op_remove_interface()
4939 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id); in ath11k_mac_op_remove_interface()
4940 ar->num_created_vdevs--; in ath11k_mac_op_remove_interface()
4943 vif->addr, arvif->vdev_id); in ath11k_mac_op_remove_interface()
4946 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_remove_interface()
4947 list_del(&arvif->list); in ath11k_mac_op_remove_interface()
4948 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_remove_interface()
4950 ath11k_peer_cleanup(ar, arvif->vdev_id); in ath11k_mac_op_remove_interface()
4952 idr_for_each(&ar->txmgmt_idr, in ath11k_mac_op_remove_interface()
4956 spin_lock_bh(&ab->dp.tx_ring[i].tx_idr_lock); in ath11k_mac_op_remove_interface()
4957 idr_for_each(&ab->dp.tx_ring[i].txbuf_idr, in ath11k_mac_op_remove_interface()
4959 spin_unlock_bh(&ab->dp.tx_ring[i].tx_idr_lock); in ath11k_mac_op_remove_interface()
4964 clear_bit(ATH11K_FLAG_MONITOR_ENABLED, &ar->monitor_flags); in ath11k_mac_op_remove_interface()
4968 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_remove_interface()
4986 struct ath11k *ar = hw->priv; in ath11k_mac_op_configure_filter()
4990 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_configure_filter()
4994 ar->filter_flags = *total_flags; in ath11k_mac_op_configure_filter()
4997 reset_flag = !(ar->filter_flags & FIF_BCN_PRBRESP_PROMISC); in ath11k_mac_op_configure_filter()
5002 set_bit(ATH11K_FLAG_MONITOR_ENABLED, &ar->monitor_flags); in ath11k_mac_op_configure_filter()
5004 clear_bit(ATH11K_FLAG_MONITOR_ENABLED, &ar->monitor_flags); in ath11k_mac_op_configure_filter()
5006 ath11k_warn(ar->ab, in ath11k_mac_op_configure_filter()
5009 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_op_configure_filter()
5013 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_configure_filter()
5018 struct ath11k *ar = hw->priv; in ath11k_mac_op_get_antenna()
5020 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_get_antenna()
5022 *tx_ant = ar->cfg_tx_chainmask; in ath11k_mac_op_get_antenna()
5023 *rx_ant = ar->cfg_rx_chainmask; in ath11k_mac_op_get_antenna()
5025 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_get_antenna()
5032 struct ath11k *ar = hw->priv; in ath11k_mac_op_set_antenna()
5035 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_set_antenna()
5037 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_set_antenna()
5046 struct ath11k *ar = hw->priv; in ath11k_mac_op_ampdu_action()
5047 int ret = -EINVAL; in ath11k_mac_op_ampdu_action()
5049 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_ampdu_action()
5051 switch (params->action) { in ath11k_mac_op_ampdu_action()
5063 /* Tx A-MPDU aggregation offloaded to hw/fw so deny mac80211 in ath11k_mac_op_ampdu_action()
5066 ret = -EOPNOTSUPP; in ath11k_mac_op_ampdu_action()
5070 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_ampdu_action()
5078 struct ath11k *ar = hw->priv; in ath11k_mac_op_add_chanctx()
5079 struct ath11k_base *ab = ar->ab; in ath11k_mac_op_add_chanctx()
5083 ctx->def.chan->center_freq, ctx->def.width, ctx); in ath11k_mac_op_add_chanctx()
5085 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_add_chanctx()
5087 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_add_chanctx()
5088 /* TODO: In case of multiple channel context, populate rx_channel from in ath11k_mac_op_add_chanctx()
5091 ar->rx_channel = ctx->def.chan; in ath11k_mac_op_add_chanctx()
5092 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_add_chanctx()
5094 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_add_chanctx()
5102 struct ath11k *ar = hw->priv; in ath11k_mac_op_remove_chanctx()
5103 struct ath11k_base *ab = ar->ab; in ath11k_mac_op_remove_chanctx()
5107 ctx->def.chan->center_freq, ctx->def.width, ctx); in ath11k_mac_op_remove_chanctx()
5109 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_remove_chanctx()
5111 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_remove_chanctx()
5112 /* TODO: In case of there is one more channel context left, populate in ath11k_mac_op_remove_chanctx()
5115 ar->rx_channel = NULL; in ath11k_mac_op_remove_chanctx()
5116 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_remove_chanctx()
5118 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_remove_chanctx()
5123 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_vdev_setup_sync()
5125 if (test_bit(ATH11K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags)) in ath11k_mac_vdev_setup_sync()
5126 return -ESHUTDOWN; in ath11k_mac_vdev_setup_sync()
5128 if (!wait_for_completion_timeout(&ar->vdev_setup_done, in ath11k_mac_vdev_setup_sync()
5130 return -ETIMEDOUT; in ath11k_mac_vdev_setup_sync()
5132 return ar->last_wmi_vdev_start_status ? -EINVAL : 0; in ath11k_mac_vdev_setup_sync()
5140 struct ath11k *ar = arvif->ar; in ath11k_mac_vdev_start_restart()
5141 struct ath11k_base *ab = ar->ab; in ath11k_mac_vdev_start_restart()
5143 int he_support = arvif->vif->bss_conf.he_support; in ath11k_mac_vdev_start_restart()
5146 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_vdev_start_restart()
5148 reinit_completion(&ar->vdev_setup_done); in ath11k_mac_vdev_start_restart()
5150 arg.vdev_id = arvif->vdev_id; in ath11k_mac_vdev_start_restart()
5151 arg.dtim_period = arvif->dtim_period; in ath11k_mac_vdev_start_restart()
5152 arg.bcn_intval = arvif->beacon_interval; in ath11k_mac_vdev_start_restart()
5154 arg.channel.freq = chandef->chan->center_freq; in ath11k_mac_vdev_start_restart()
5155 arg.channel.band_center_freq1 = chandef->center_freq1; in ath11k_mac_vdev_start_restart()
5156 arg.channel.band_center_freq2 = chandef->center_freq2; in ath11k_mac_vdev_start_restart()
5158 ath11k_phymodes[chandef->chan->band][chandef->width]; in ath11k_mac_vdev_start_restart()
5161 arg.channel.max_power = chandef->chan->max_power * 2; in ath11k_mac_vdev_start_restart()
5162 arg.channel.max_reg_power = chandef->chan->max_reg_power * 2; in ath11k_mac_vdev_start_restart()
5163 arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain * 2; in ath11k_mac_vdev_start_restart()
5165 arg.pref_tx_streams = ar->num_tx_chains; in ath11k_mac_vdev_start_restart()
5166 arg.pref_rx_streams = ar->num_rx_chains; in ath11k_mac_vdev_start_restart()
5168 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) { in ath11k_mac_vdev_start_restart()
5169 arg.ssid = arvif->u.ap.ssid; in ath11k_mac_vdev_start_restart()
5170 arg.ssid_len = arvif->u.ap.ssid_len; in ath11k_mac_vdev_start_restart()
5171 arg.hidden_ssid = arvif->u.ap.hidden_ssid; in ath11k_mac_vdev_start_restart()
5175 !!(chandef->chan->flags & IEEE80211_CHAN_RADAR); in ath11k_mac_vdev_start_restart()
5178 !!(chandef->chan->flags & IEEE80211_CHAN_RADAR); in ath11k_mac_vdev_start_restart()
5182 spin_lock_bh(&ab->base_lock); in ath11k_mac_vdev_start_restart()
5183 arg.regdomain = ar->ab->dfs_region; in ath11k_mac_vdev_start_restart()
5184 spin_unlock_bh(&ab->base_lock); in ath11k_mac_vdev_start_restart()
5189 ath11k_warn(ar->ab, "failed to set he mode vdev %i\n", in ath11k_mac_vdev_start_restart()
5196 arg.channel.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR); in ath11k_mac_vdev_start_restart()
5205 ath11k_warn(ar->ab, "failed to %s WMI vdev %i\n", in ath11k_mac_vdev_start_restart()
5217 ar->num_started_vdevs++; in ath11k_mac_vdev_start_restart()
5219 arvif->vif->addr, arvif->vdev_id); in ath11k_mac_vdev_start_restart()
5221 /* Enable CAC Flag in the driver by checking the channel DFS cac time, in ath11k_mac_vdev_start_restart()
5228 if (arvif->vdev_type == WMI_VDEV_TYPE_AP && in ath11k_mac_vdev_start_restart()
5229 chandef->chan->dfs_cac_ms && in ath11k_mac_vdev_start_restart()
5230 chandef->chan->dfs_state == NL80211_DFS_USABLE) { in ath11k_mac_vdev_start_restart()
5231 set_bit(ATH11K_CAC_RUNNING, &ar->dev_flags); in ath11k_mac_vdev_start_restart()
5233 "CAC Started in chan_freq %d for vdev %d\n", in ath11k_mac_vdev_start_restart()
5240 arvif->vdev_id, ret); in ath11k_mac_vdev_start_restart()
5247 struct ath11k *ar = arvif->ar; in ath11k_mac_vdev_stop()
5250 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_vdev_stop()
5252 reinit_completion(&ar->vdev_setup_done); in ath11k_mac_vdev_stop()
5254 ret = ath11k_wmi_vdev_stop(ar, arvif->vdev_id); in ath11k_mac_vdev_stop()
5256 ath11k_warn(ar->ab, "failed to stop WMI vdev %i: %d\n", in ath11k_mac_vdev_stop()
5257 arvif->vdev_id, ret); in ath11k_mac_vdev_stop()
5263 ath11k_warn(ar->ab, "failed to synchronize setup for vdev %i: %d\n", in ath11k_mac_vdev_stop()
5264 arvif->vdev_id, ret); in ath11k_mac_vdev_stop()
5268 WARN_ON(ar->num_started_vdevs == 0); in ath11k_mac_vdev_stop()
5270 ar->num_started_vdevs--; in ath11k_mac_vdev_stop()
5271 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %pM stopped, vdev_id %d\n", in ath11k_mac_vdev_stop()
5272 arvif->vif->addr, arvif->vdev_id); in ath11k_mac_vdev_stop()
5274 if (test_bit(ATH11K_CAC_RUNNING, &ar->dev_flags)) { in ath11k_mac_vdev_stop()
5275 clear_bit(ATH11K_CAC_RUNNING, &ar->dev_flags); in ath11k_mac_vdev_stop()
5276 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "CAC Stopped for vdev %d\n", in ath11k_mac_vdev_stop()
5277 arvif->vdev_id); in ath11k_mac_vdev_stop()
5310 if (rcu_access_pointer(vif->chanctx_conf) != arg->ctx) in ath11k_mac_change_chanctx_cnt_iter()
5313 arg->n_vifs++; in ath11k_mac_change_chanctx_cnt_iter()
5323 ctx = rcu_access_pointer(vif->chanctx_conf); in ath11k_mac_change_chanctx_fill_iter()
5324 if (ctx != arg->ctx) in ath11k_mac_change_chanctx_fill_iter()
5327 if (WARN_ON(arg->next_vif == arg->n_vifs)) in ath11k_mac_change_chanctx_fill_iter()
5330 arg->vifs[arg->next_vif].vif = vif; in ath11k_mac_change_chanctx_fill_iter()
5331 arg->vifs[arg->next_vif].old_ctx = ctx; in ath11k_mac_change_chanctx_fill_iter()
5332 arg->vifs[arg->next_vif].new_ctx = ctx; in ath11k_mac_change_chanctx_fill_iter()
5333 arg->next_vif++; in ath11k_mac_change_chanctx_fill_iter()
5341 struct ath11k_base *ab = ar->ab; in ath11k_mac_update_vif_chan()
5346 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_update_vif_chan()
5349 arvif = (void *)vifs[i].vif->drv_priv; in ath11k_mac_update_vif_chan()
5352 "mac chanctx switch vdev_id %i freq %u->%u width %d->%d\n", in ath11k_mac_update_vif_chan()
5353 arvif->vdev_id, in ath11k_mac_update_vif_chan()
5354 vifs[i].old_ctx->def.chan->center_freq, in ath11k_mac_update_vif_chan()
5355 vifs[i].new_ctx->def.chan->center_freq, in ath11k_mac_update_vif_chan()
5356 vifs[i].old_ctx->def.width, in ath11k_mac_update_vif_chan()
5357 vifs[i].new_ctx->def.width); in ath11k_mac_update_vif_chan()
5359 if (WARN_ON(!arvif->is_started)) in ath11k_mac_update_vif_chan()
5362 if (WARN_ON(!arvif->is_up)) in ath11k_mac_update_vif_chan()
5365 ret = ath11k_wmi_vdev_down(ar, arvif->vdev_id); in ath11k_mac_update_vif_chan()
5368 arvif->vdev_id, ret); in ath11k_mac_update_vif_chan()
5377 /* TODO: Update ar->rx_channel */ in ath11k_mac_update_vif_chan()
5380 arvif = (void *)vifs[i].vif->drv_priv; in ath11k_mac_update_vif_chan()
5382 if (WARN_ON(!arvif->is_started)) in ath11k_mac_update_vif_chan()
5385 if (WARN_ON(!arvif->is_up)) in ath11k_mac_update_vif_chan()
5388 ret = ath11k_mac_vdev_restart(arvif, &vifs[i].new_ctx->def); in ath11k_mac_update_vif_chan()
5391 arvif->vdev_id, ret); in ath11k_mac_update_vif_chan()
5400 ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, in ath11k_mac_update_vif_chan()
5401 arvif->bssid); in ath11k_mac_update_vif_chan()
5404 arvif->vdev_id, ret); in ath11k_mac_update_vif_chan()
5416 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_update_active_vif_chan()
5418 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath11k_mac_update_active_vif_chan()
5429 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath11k_mac_update_active_vif_chan()
5443 struct ath11k *ar = hw->priv; in ath11k_mac_op_change_chanctx()
5444 struct ath11k_base *ab = ar->ab; in ath11k_mac_op_change_chanctx()
5446 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_change_chanctx()
5450 ctx->def.chan->center_freq, ctx->def.width, ctx, changed); in ath11k_mac_op_change_chanctx()
5464 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_change_chanctx()
5470 struct ath11k *ar = hw->priv; in ath11k_start_vdev_delay()
5471 struct ath11k_base *ab = ar->ab; in ath11k_start_vdev_delay()
5472 struct ath11k_vif *arvif = (void *)vif->drv_priv; in ath11k_start_vdev_delay()
5475 if (WARN_ON(arvif->is_started)) in ath11k_start_vdev_delay()
5476 return -EBUSY; in ath11k_start_vdev_delay()
5478 ret = ath11k_mac_vdev_start(arvif, &arvif->chanctx.def); in ath11k_start_vdev_delay()
5481 arvif->vdev_id, vif->addr, in ath11k_start_vdev_delay()
5482 arvif->chanctx.def.chan->center_freq, ret); in ath11k_start_vdev_delay()
5486 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { in ath11k_start_vdev_delay()
5487 ret = ath11k_monitor_vdev_up(ar, arvif->vdev_id); in ath11k_start_vdev_delay()
5494 arvif->is_started = true; in ath11k_start_vdev_delay()
5505 struct ath11k *ar = hw->priv; in ath11k_mac_op_assign_vif_chanctx()
5506 struct ath11k_base *ab = ar->ab; in ath11k_mac_op_assign_vif_chanctx()
5507 struct ath11k_vif *arvif = (void *)vif->drv_priv; in ath11k_mac_op_assign_vif_chanctx()
5511 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_assign_vif_chanctx()
5515 ctx, arvif->vdev_id); in ath11k_mac_op_assign_vif_chanctx()
5518 if (ab->hw_params.vdev_start_delay && in ath11k_mac_op_assign_vif_chanctx()
5519 arvif->vdev_type != WMI_VDEV_TYPE_AP && in ath11k_mac_op_assign_vif_chanctx()
5520 arvif->vdev_type != WMI_VDEV_TYPE_MONITOR && in ath11k_mac_op_assign_vif_chanctx()
5521 !ath11k_peer_find_by_vdev_id(ab, arvif->vdev_id)) { in ath11k_mac_op_assign_vif_chanctx()
5522 memcpy(&arvif->chanctx, ctx, sizeof(*ctx)); in ath11k_mac_op_assign_vif_chanctx()
5527 if (WARN_ON(arvif->is_started)) { in ath11k_mac_op_assign_vif_chanctx()
5528 ret = -EBUSY; in ath11k_mac_op_assign_vif_chanctx()
5532 if (ab->hw_params.vdev_start_delay && in ath11k_mac_op_assign_vif_chanctx()
5533 arvif->vdev_type != WMI_VDEV_TYPE_AP && in ath11k_mac_op_assign_vif_chanctx()
5534 arvif->vdev_type != WMI_VDEV_TYPE_MONITOR) { in ath11k_mac_op_assign_vif_chanctx()
5535 param.vdev_id = arvif->vdev_id; in ath11k_mac_op_assign_vif_chanctx()
5537 param.peer_addr = ar->mac_addr; in ath11k_mac_op_assign_vif_chanctx()
5547 ret = ath11k_mac_vdev_start(arvif, &ctx->def); in ath11k_mac_op_assign_vif_chanctx()
5550 arvif->vdev_id, vif->addr, in ath11k_mac_op_assign_vif_chanctx()
5551 ctx->def.chan->center_freq, ret); in ath11k_mac_op_assign_vif_chanctx()
5554 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { in ath11k_mac_op_assign_vif_chanctx()
5555 ret = ath11k_monitor_vdev_up(ar, arvif->vdev_id); in ath11k_mac_op_assign_vif_chanctx()
5560 arvif->is_started = true; in ath11k_mac_op_assign_vif_chanctx()
5567 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_assign_vif_chanctx()
5577 struct ath11k *ar = hw->priv; in ath11k_mac_op_unassign_vif_chanctx()
5578 struct ath11k_base *ab = ar->ab; in ath11k_mac_op_unassign_vif_chanctx()
5579 struct ath11k_vif *arvif = (void *)vif->drv_priv; in ath11k_mac_op_unassign_vif_chanctx()
5582 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_unassign_vif_chanctx()
5586 ctx, arvif->vdev_id); in ath11k_mac_op_unassign_vif_chanctx()
5588 WARN_ON(!arvif->is_started); in ath11k_mac_op_unassign_vif_chanctx()
5590 if (ab->hw_params.vdev_start_delay && in ath11k_mac_op_unassign_vif_chanctx()
5591 arvif->vdev_type == WMI_VDEV_TYPE_MONITOR && in ath11k_mac_op_unassign_vif_chanctx()
5592 ath11k_peer_find_by_addr(ab, ar->mac_addr)) in ath11k_mac_op_unassign_vif_chanctx()
5593 ath11k_peer_delete(ar, arvif->vdev_id, ar->mac_addr); in ath11k_mac_op_unassign_vif_chanctx()
5598 arvif->vdev_id, ret); in ath11k_mac_op_unassign_vif_chanctx()
5600 arvif->is_started = false; in ath11k_mac_op_unassign_vif_chanctx()
5602 if (ab->hw_params.vdev_start_delay && in ath11k_mac_op_unassign_vif_chanctx()
5603 arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) in ath11k_mac_op_unassign_vif_chanctx()
5604 ath11k_wmi_vdev_down(ar, arvif->vdev_id); in ath11k_mac_op_unassign_vif_chanctx()
5606 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_unassign_vif_chanctx()
5615 struct ath11k *ar = hw->priv; in ath11k_mac_op_switch_vif_chanctx()
5617 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_switch_vif_chanctx()
5619 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_op_switch_vif_chanctx()
5624 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_switch_vif_chanctx()
5635 mutex_lock(&ar->conf_mutex); in ath11k_set_vdev_param_to_all_vifs()
5636 list_for_each_entry(arvif, &ar->arvifs, list) { in ath11k_set_vdev_param_to_all_vifs()
5637 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "setting mac vdev %d param %d value %d\n", in ath11k_set_vdev_param_to_all_vifs()
5638 param, arvif->vdev_id, value); in ath11k_set_vdev_param_to_all_vifs()
5640 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_set_vdev_param_to_all_vifs()
5643 ath11k_warn(ar->ab, "failed to set param %d for vdev %d: %d\n", in ath11k_set_vdev_param_to_all_vifs()
5644 param, arvif->vdev_id, ret); in ath11k_set_vdev_param_to_all_vifs()
5648 mutex_unlock(&ar->conf_mutex); in ath11k_set_vdev_param_to_all_vifs()
5657 struct ath11k *ar = hw->priv; in ath11k_mac_op_set_rts_threshold()
5668 * "more fragments" bit in frame control making it impossible for remote in ath11k_mac_op_set_frag_threshold()
5673 * fragmentation in software. in ath11k_mac_op_set_frag_threshold()
5675 return -EOPNOTSUPP; in ath11k_mac_op_set_frag_threshold()
5681 struct ath11k *ar = hw->priv; in ath11k_mac_op_flush()
5687 time_left = wait_event_timeout(ar->dp.tx_empty_waitq, in ath11k_mac_op_flush()
5688 (atomic_read(&ar->dp.num_tx_pending) == 0), in ath11k_mac_op_flush()
5691 ath11k_warn(ar->ab, "failed to flush transmit queue %ld\n", time_left); in ath11k_mac_op_flush()
5696 enum nl80211_band band, in ath11k_mac_bitrate_mask_num_ht_rates() argument
5702 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) in ath11k_mac_bitrate_mask_num_ht_rates()
5703 num_rates += hweight16(mask->control[band].ht_mcs[i]); in ath11k_mac_bitrate_mask_num_ht_rates()
5710 enum nl80211_band band, in ath11k_mac_has_single_legacy_rate() argument
5715 num_rates = hweight32(mask->control[band].legacy); in ath11k_mac_has_single_legacy_rate()
5717 if (ath11k_mac_bitrate_mask_num_ht_rates(ar, band, mask)) in ath11k_mac_has_single_legacy_rate()
5720 if (ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask)) in ath11k_mac_has_single_legacy_rate()
5728 enum nl80211_band band, in ath11k_mac_bitrate_mask_get_single_nss() argument
5732 struct ieee80211_supported_band *sband = &ar->mac.sbands[band]; in ath11k_mac_bitrate_mask_get_single_nss()
5733 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); in ath11k_mac_bitrate_mask_get_single_nss()
5739 * in bitrate mask in ath11k_mac_bitrate_mask_get_single_nss()
5742 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) { in ath11k_mac_bitrate_mask_get_single_nss()
5743 if (mask->control[band].ht_mcs[i] == 0) in ath11k_mac_bitrate_mask_get_single_nss()
5745 else if (mask->control[band].ht_mcs[i] == in ath11k_mac_bitrate_mask_get_single_nss()
5746 sband->ht_cap.mcs.rx_mask[i]) in ath11k_mac_bitrate_mask_get_single_nss()
5752 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) { in ath11k_mac_bitrate_mask_get_single_nss()
5753 if (mask->control[band].vht_mcs[i] == 0) in ath11k_mac_bitrate_mask_get_single_nss()
5755 else if (mask->control[band].vht_mcs[i] == in ath11k_mac_bitrate_mask_get_single_nss()
5768 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask) in ath11k_mac_bitrate_mask_get_single_nss()
5778 enum nl80211_band band, in ath11k_mac_get_single_legacy_rate() argument
5787 if (hweight32(mask->control[band].legacy) != 1) in ath11k_mac_get_single_legacy_rate()
5788 return -EINVAL; in ath11k_mac_get_single_legacy_rate()
5790 rate_idx = ffs(mask->control[band].legacy) - 1; in ath11k_mac_get_single_legacy_rate()
5792 if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ) in ath11k_mac_get_single_legacy_rate()
5812 struct ath11k *ar = arvif->ar; in ath11k_mac_set_fixed_rate_params()
5816 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_set_fixed_rate_params()
5818 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac set fixed rate params vdev %i rate 0x%02x nss %u sgi %u\n", in ath11k_mac_set_fixed_rate_params()
5819 arvif->vdev_id, rate, nss, sgi); in ath11k_mac_set_fixed_rate_params()
5822 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_set_fixed_rate_params()
5825 ath11k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n", in ath11k_mac_set_fixed_rate_params()
5831 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_set_fixed_rate_params()
5834 ath11k_warn(ar->ab, "failed to set nss param %d: %d\n", in ath11k_mac_set_fixed_rate_params()
5840 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_set_fixed_rate_params()
5843 ath11k_warn(ar->ab, "failed to set sgi param %d: %d\n", in ath11k_mac_set_fixed_rate_params()
5849 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_set_fixed_rate_params()
5852 ath11k_warn(ar->ab, "failed to set ldpc param %d: %d\n", in ath11k_mac_set_fixed_rate_params()
5862 enum nl80211_band band, in ath11k_mac_vht_mcs_range_present() argument
5869 vht_mcs = mask->control[band].vht_mcs[i]; in ath11k_mac_vht_mcs_range_present()
5873 case BIT(8) - 1: in ath11k_mac_vht_mcs_range_present()
5874 case BIT(9) - 1: in ath11k_mac_vht_mcs_range_present()
5875 case BIT(10) - 1: in ath11k_mac_vht_mcs_range_present()
5889 struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv; in ath11k_mac_set_bitrate_mask_iter()
5890 struct ath11k *ar = arvif->ar; in ath11k_mac_set_bitrate_mask_iter()
5892 spin_lock_bh(&ar->data_lock); in ath11k_mac_set_bitrate_mask_iter()
5893 arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED; in ath11k_mac_set_bitrate_mask_iter()
5894 spin_unlock_bh(&ar->data_lock); in ath11k_mac_set_bitrate_mask_iter()
5896 ieee80211_queue_work(ar->hw, &arsta->update_wk); in ath11k_mac_set_bitrate_mask_iter()
5903 struct ath11k *ar = arvif->ar; in ath11k_mac_disable_peer_fixed_rate()
5906 ret = ath11k_wmi_set_peer_param(ar, sta->addr, in ath11k_mac_disable_peer_fixed_rate()
5907 arvif->vdev_id, in ath11k_mac_disable_peer_fixed_rate()
5911 ath11k_warn(ar->ab, in ath11k_mac_disable_peer_fixed_rate()
5913 sta->addr, ret); in ath11k_mac_disable_peer_fixed_rate()
5921 struct ath11k_vif *arvif = (void *)vif->drv_priv; in ath11k_mac_op_set_bitrate_mask()
5923 struct ath11k *ar = arvif->ar; in ath11k_mac_op_set_bitrate_mask()
5924 enum nl80211_band band; in ath11k_mac_op_set_bitrate_mask() local
5936 return -EPERM; in ath11k_mac_op_set_bitrate_mask()
5938 band = def.chan->band; in ath11k_mac_op_set_bitrate_mask()
5939 ht_mcs_mask = mask->control[band].ht_mcs; in ath11k_mac_op_set_bitrate_mask()
5940 vht_mcs_mask = mask->control[band].vht_mcs; in ath11k_mac_op_set_bitrate_mask()
5941 ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC); in ath11k_mac_op_set_bitrate_mask()
5943 sgi = mask->control[band].gi; in ath11k_mac_op_set_bitrate_mask()
5945 return -EINVAL; in ath11k_mac_op_set_bitrate_mask()
5955 if (ath11k_mac_has_single_legacy_rate(ar, band, mask)) { in ath11k_mac_op_set_bitrate_mask()
5956 ret = ath11k_mac_get_single_legacy_rate(ar, band, mask, &rate, in ath11k_mac_op_set_bitrate_mask()
5959 ath11k_warn(ar->ab, "failed to get single legacy rate for vdev %i: %d\n", in ath11k_mac_op_set_bitrate_mask()
5960 arvif->vdev_id, ret); in ath11k_mac_op_set_bitrate_mask()
5963 ieee80211_iterate_stations_atomic(ar->hw, in ath11k_mac_op_set_bitrate_mask()
5966 } else if (ath11k_mac_bitrate_mask_get_single_nss(ar, band, mask, in ath11k_mac_op_set_bitrate_mask()
5972 nss = min_t(u32, ar->num_tx_chains, in ath11k_mac_op_set_bitrate_mask()
5979 * - Single VHT Rate : peer_assoc command accommodates only MCS in ath11k_mac_op_set_bitrate_mask()
5980 * range values i.e 0-7, 0-8, 0-9 for VHT. Though mac80211 in ath11k_mac_op_set_bitrate_mask()
5988 * - Multiple VHT Rates : When Multiple VHT rates are given,this in ath11k_mac_op_set_bitrate_mask()
5989 * can be set using RATEMASK CMD which uses FW rate-ctl alg. in ath11k_mac_op_set_bitrate_mask()
5996 num_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band, in ath11k_mac_op_set_bitrate_mask()
5999 if (!ath11k_mac_vht_mcs_range_present(ar, band, mask) && in ath11k_mac_op_set_bitrate_mask()
6004 ath11k_warn(ar->ab, in ath11k_mac_op_set_bitrate_mask()
6005 "Setting more than one MCS Value in bitrate mask not supported\n"); in ath11k_mac_op_set_bitrate_mask()
6006 return -EINVAL; in ath11k_mac_op_set_bitrate_mask()
6009 ieee80211_iterate_stations_atomic(ar->hw, in ath11k_mac_op_set_bitrate_mask()
6013 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_set_bitrate_mask()
6015 arvif->bitrate_mask = *mask; in ath11k_mac_op_set_bitrate_mask()
6016 ieee80211_iterate_stations_atomic(ar->hw, in ath11k_mac_op_set_bitrate_mask()
6020 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_set_bitrate_mask()
6023 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_set_bitrate_mask()
6027 ath11k_warn(ar->ab, "failed to set fixed rate params on vdev %i: %d\n", in ath11k_mac_op_set_bitrate_mask()
6028 arvif->vdev_id, ret); in ath11k_mac_op_set_bitrate_mask()
6031 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_set_bitrate_mask()
6040 struct ath11k *ar = hw->priv; in ath11k_mac_op_reconfig_complete()
6045 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_reconfig_complete()
6047 if (ar->state == ATH11K_STATE_RESTARTED) { in ath11k_mac_op_reconfig_complete()
6048 ath11k_warn(ar->ab, "pdev %d successfully recovered\n", in ath11k_mac_op_reconfig_complete()
6049 ar->pdev->pdev_id); in ath11k_mac_op_reconfig_complete()
6050 ar->state = ATH11K_STATE_ON; in ath11k_mac_op_reconfig_complete()
6051 ieee80211_wake_queues(ar->hw); in ath11k_mac_op_reconfig_complete()
6054 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_reconfig_complete()
6064 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_update_bss_chan_survey()
6066 if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) || in ath11k_mac_update_bss_chan_survey()
6067 ar->rx_channel != channel) in ath11k_mac_update_bss_chan_survey()
6070 if (ar->scan.state != ATH11K_SCAN_IDLE) { in ath11k_mac_update_bss_chan_survey()
6071 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_update_bss_chan_survey()
6076 reinit_completion(&ar->bss_survey_done); in ath11k_mac_update_bss_chan_survey()
6080 ath11k_warn(ar->ab, "failed to send pdev bss chan info request\n"); in ath11k_mac_update_bss_chan_survey()
6084 ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ); in ath11k_mac_update_bss_chan_survey()
6086 ath11k_warn(ar->ab, "bss channel survey timed out\n"); in ath11k_mac_update_bss_chan_survey()
6092 struct ath11k *ar = hw->priv; in ath11k_mac_op_get_survey()
6098 return -ENOENT; in ath11k_mac_op_get_survey()
6100 ar_survey = &ar->survey[idx]; in ath11k_mac_op_get_survey()
6102 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_get_survey()
6104 sband = hw->wiphy->bands[NL80211_BAND_2GHZ]; in ath11k_mac_op_get_survey()
6105 if (sband && idx >= sband->n_channels) { in ath11k_mac_op_get_survey()
6106 idx -= sband->n_channels; in ath11k_mac_op_get_survey()
6111 sband = hw->wiphy->bands[NL80211_BAND_5GHZ]; in ath11k_mac_op_get_survey()
6113 if (!sband || idx >= sband->n_channels) { in ath11k_mac_op_get_survey()
6114 ret = -ENOENT; in ath11k_mac_op_get_survey()
6118 ath11k_mac_update_bss_chan_survey(ar, &sband->channels[idx]); in ath11k_mac_op_get_survey()
6120 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_get_survey()
6122 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_get_survey()
6124 survey->channel = &sband->channels[idx]; in ath11k_mac_op_get_survey()
6126 if (ar->rx_channel == survey->channel) in ath11k_mac_op_get_survey()
6127 survey->filled |= SURVEY_INFO_IN_USE; in ath11k_mac_op_get_survey()
6130 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_get_survey()
6139 struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv; in ath11k_mac_op_sta_statistics()
6141 sinfo->rx_duration = arsta->rx_duration; in ath11k_mac_op_sta_statistics()
6142 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION); in ath11k_mac_op_sta_statistics()
6144 sinfo->tx_duration = arsta->tx_duration; in ath11k_mac_op_sta_statistics()
6145 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION); in ath11k_mac_op_sta_statistics()
6147 if (!arsta->txrate.legacy && !arsta->txrate.nss) in ath11k_mac_op_sta_statistics()
6150 if (arsta->txrate.legacy) { in ath11k_mac_op_sta_statistics()
6151 sinfo->txrate.legacy = arsta->txrate.legacy; in ath11k_mac_op_sta_statistics()
6153 sinfo->txrate.mcs = arsta->txrate.mcs; in ath11k_mac_op_sta_statistics()
6154 sinfo->txrate.nss = arsta->txrate.nss; in ath11k_mac_op_sta_statistics()
6155 sinfo->txrate.bw = arsta->txrate.bw; in ath11k_mac_op_sta_statistics()
6156 sinfo->txrate.he_gi = arsta->txrate.he_gi; in ath11k_mac_op_sta_statistics()
6157 sinfo->txrate.he_dcm = arsta->txrate.he_dcm; in ath11k_mac_op_sta_statistics()
6158 sinfo->txrate.he_ru_alloc = arsta->txrate.he_ru_alloc; in ath11k_mac_op_sta_statistics()
6160 sinfo->txrate.flags = arsta->txrate.flags; in ath11k_mac_op_sta_statistics()
6161 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); in ath11k_mac_op_sta_statistics()
6164 sinfo->signal = arsta->rssi_comb + ATH11K_DEFAULT_NOISE_FLOOR; in ath11k_mac_op_sta_statistics()
6165 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL); in ath11k_mac_op_sta_statistics()
6208 struct ieee80211_supported_band *band, in ath11k_mac_update_ch_list() argument
6216 for (i = 0; i < band->n_channels; i++) { in ath11k_mac_update_ch_list()
6217 if (band->channels[i].center_freq < freq_low || in ath11k_mac_update_ch_list()
6218 band->channels[i].center_freq > freq_high) in ath11k_mac_update_ch_list()
6219 band->channels[i].flags |= IEEE80211_CHAN_DISABLED; in ath11k_mac_update_ch_list()
6223 static u32 ath11k_get_phy_id(struct ath11k *ar, u32 band) in ath11k_get_phy_id() argument
6225 struct ath11k_pdev *pdev = ar->pdev; in ath11k_get_phy_id()
6226 struct ath11k_pdev_cap *pdev_cap = &pdev->cap; in ath11k_get_phy_id()
6228 if (band == WMI_HOST_WLAN_2G_CAP) in ath11k_get_phy_id()
6229 return pdev_cap->band[NL80211_BAND_2GHZ].phy_id; in ath11k_get_phy_id()
6231 if (band == WMI_HOST_WLAN_5G_CAP) in ath11k_get_phy_id()
6232 return pdev_cap->band[NL80211_BAND_5GHZ].phy_id; in ath11k_get_phy_id()
6234 ath11k_warn(ar->ab, "unsupported phy cap:%d\n", band); in ath11k_get_phy_id()
6242 struct ieee80211_supported_band *band; in ath11k_mac_setup_channels_rates() local
6252 reg_cap = &ar->ab->hal_reg_cap[ar->pdev_idx]; in ath11k_mac_setup_channels_rates()
6259 return -ENOMEM; in ath11k_mac_setup_channels_rates()
6261 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; in ath11k_mac_setup_channels_rates()
6262 band->band = NL80211_BAND_2GHZ; in ath11k_mac_setup_channels_rates()
6263 band->n_channels = ARRAY_SIZE(ath11k_2ghz_channels); in ath11k_mac_setup_channels_rates()
6264 band->channels = channels; in ath11k_mac_setup_channels_rates()
6265 band->n_bitrates = ath11k_g_rates_size; in ath11k_mac_setup_channels_rates()
6266 band->bitrates = ath11k_g_rates; in ath11k_mac_setup_channels_rates()
6267 ar->hw->wiphy->bands[NL80211_BAND_2GHZ] = band; in ath11k_mac_setup_channels_rates()
6269 if (ar->ab->hw_params.single_pdev_only) { in ath11k_mac_setup_channels_rates()
6271 reg_cap = &ar->ab->hal_reg_cap[phy_id]; in ath11k_mac_setup_channels_rates()
6273 ath11k_mac_update_ch_list(ar, band, in ath11k_mac_setup_channels_rates()
6274 reg_cap->low_2ghz_chan, in ath11k_mac_setup_channels_rates()
6275 reg_cap->high_2ghz_chan); in ath11k_mac_setup_channels_rates()
6279 if (reg_cap->high_5ghz_chan >= ATH11K_MAX_6G_FREQ) { in ath11k_mac_setup_channels_rates()
6283 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in ath11k_mac_setup_channels_rates()
6284 return -ENOMEM; in ath11k_mac_setup_channels_rates()
6287 ar->supports_6ghz = true; in ath11k_mac_setup_channels_rates()
6288 band = &ar->mac.sbands[NL80211_BAND_6GHZ]; in ath11k_mac_setup_channels_rates()
6289 band->band = NL80211_BAND_6GHZ; in ath11k_mac_setup_channels_rates()
6290 band->n_channels = ARRAY_SIZE(ath11k_6ghz_channels); in ath11k_mac_setup_channels_rates()
6291 band->channels = channels; in ath11k_mac_setup_channels_rates()
6292 band->n_bitrates = ath11k_a_rates_size; in ath11k_mac_setup_channels_rates()
6293 band->bitrates = ath11k_a_rates; in ath11k_mac_setup_channels_rates()
6294 ar->hw->wiphy->bands[NL80211_BAND_6GHZ] = band; in ath11k_mac_setup_channels_rates()
6295 ath11k_mac_update_ch_list(ar, band, in ath11k_mac_setup_channels_rates()
6296 reg_cap->low_5ghz_chan, in ath11k_mac_setup_channels_rates()
6297 reg_cap->high_5ghz_chan); in ath11k_mac_setup_channels_rates()
6300 if (reg_cap->low_5ghz_chan < ATH11K_MIN_6G_FREQ) { in ath11k_mac_setup_channels_rates()
6305 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in ath11k_mac_setup_channels_rates()
6306 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); in ath11k_mac_setup_channels_rates()
6307 return -ENOMEM; in ath11k_mac_setup_channels_rates()
6310 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; in ath11k_mac_setup_channels_rates()
6311 band->band = NL80211_BAND_5GHZ; in ath11k_mac_setup_channels_rates()
6312 band->n_channels = ARRAY_SIZE(ath11k_5ghz_channels); in ath11k_mac_setup_channels_rates()
6313 band->channels = channels; in ath11k_mac_setup_channels_rates()
6314 band->n_bitrates = ath11k_a_rates_size; in ath11k_mac_setup_channels_rates()
6315 band->bitrates = ath11k_a_rates; in ath11k_mac_setup_channels_rates()
6316 ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = band; in ath11k_mac_setup_channels_rates()
6318 if (ar->ab->hw_params.single_pdev_only) { in ath11k_mac_setup_channels_rates()
6320 reg_cap = &ar->ab->hal_reg_cap[phy_id]; in ath11k_mac_setup_channels_rates()
6323 ath11k_mac_update_ch_list(ar, band, in ath11k_mac_setup_channels_rates()
6324 reg_cap->low_5ghz_chan, in ath11k_mac_setup_channels_rates()
6325 reg_cap->high_5ghz_chan); in ath11k_mac_setup_channels_rates()
6334 struct ath11k_base *ab = ar->ab; in ath11k_mac_setup_iface_combinations()
6341 return -ENOMEM; in ath11k_mac_setup_iface_combinations()
6348 return -ENOMEM; in ath11k_mac_setup_iface_combinations()
6358 ab->hw_params.interface_modes & BIT(NL80211_IFTYPE_MESH_POINT)) in ath11k_mac_setup_iface_combinations()
6372 ar->hw->wiphy->iface_combinations = combinations; in ath11k_mac_setup_iface_combinations()
6373 ar->hw->wiphy->n_iface_combinations = 1; in ath11k_mac_setup_iface_combinations()
6417 cancel_work_sync(&ar->regd_update_work); in __ath11k_mac_unregister()
6419 ieee80211_unregister_hw(ar->hw); in __ath11k_mac_unregister()
6421 idr_for_each(&ar->txmgmt_idr, ath11k_mac_tx_mgmt_pending_free, ar); in __ath11k_mac_unregister()
6422 idr_destroy(&ar->txmgmt_idr); in __ath11k_mac_unregister()
6424 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in __ath11k_mac_unregister()
6425 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels); in __ath11k_mac_unregister()
6426 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); in __ath11k_mac_unregister()
6428 kfree(ar->hw->wiphy->iface_combinations[0].limits); in __ath11k_mac_unregister()
6429 kfree(ar->hw->wiphy->iface_combinations); in __ath11k_mac_unregister()
6431 SET_IEEE80211_DEV(ar->hw, NULL); in __ath11k_mac_unregister()
6440 for (i = 0; i < ab->num_radios; i++) { in ath11k_mac_unregister()
6441 pdev = &ab->pdevs[i]; in ath11k_mac_unregister()
6442 ar = pdev->ar; in ath11k_mac_unregister()
6452 struct ath11k_base *ab = ar->ab; in __ath11k_mac_register()
6453 struct ath11k_pdev_cap *cap = &ar->pdev->cap; in __ath11k_mac_register()
6470 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr); in __ath11k_mac_register()
6472 SET_IEEE80211_DEV(ar->hw, ab->dev); in __ath11k_mac_register()
6475 cap->supported_bands); in __ath11k_mac_register()
6484 ath11k_err(ar->ab, "failed to setup interface combinations: %d\n", ret); in __ath11k_mac_register()
6488 ar->hw->wiphy->available_antennas_rx = cap->rx_chain_mask; in __ath11k_mac_register()
6489 ar->hw->wiphy->available_antennas_tx = cap->tx_chain_mask; in __ath11k_mac_register()
6491 ar->hw->wiphy->interface_modes = ab->hw_params.interface_modes; in __ath11k_mac_register()
6493 ieee80211_hw_set(ar->hw, SIGNAL_DBM); in __ath11k_mac_register()
6494 ieee80211_hw_set(ar->hw, SUPPORTS_PS); in __ath11k_mac_register()
6495 ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS); in __ath11k_mac_register()
6496 ieee80211_hw_set(ar->hw, MFP_CAPABLE); in __ath11k_mac_register()
6497 ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS); in __ath11k_mac_register()
6498 ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL); in __ath11k_mac_register()
6499 ieee80211_hw_set(ar->hw, AP_LINK_PS); in __ath11k_mac_register()
6500 ieee80211_hw_set(ar->hw, SPECTRUM_MGMT); in __ath11k_mac_register()
6501 ieee80211_hw_set(ar->hw, CONNECTION_MONITOR); in __ath11k_mac_register()
6502 ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK); in __ath11k_mac_register()
6503 ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF); in __ath11k_mac_register()
6504 ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA); in __ath11k_mac_register()
6505 ieee80211_hw_set(ar->hw, QUEUE_CONTROL); in __ath11k_mac_register()
6506 ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG); in __ath11k_mac_register()
6507 ieee80211_hw_set(ar->hw, REPORTS_LOW_ACK); in __ath11k_mac_register()
6508 ieee80211_hw_set(ar->hw, SUPPORTS_TX_ENCAP_OFFLOAD); in __ath11k_mac_register()
6510 ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION); in __ath11k_mac_register()
6511 ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW); in __ath11k_mac_register()
6512 ieee80211_hw_set(ar->hw, SUPPORTS_REORDERING_BUFFER); in __ath11k_mac_register()
6513 ieee80211_hw_set(ar->hw, SUPPORTS_AMSDU_IN_AMPDU); in __ath11k_mac_register()
6514 ieee80211_hw_set(ar->hw, USES_RSS); in __ath11k_mac_register()
6517 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS; in __ath11k_mac_register()
6518 ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; in __ath11k_mac_register()
6521 * for each band for a dual band capable radio. It will be tricky to in __ath11k_mac_register()
6522 * handle it when the ht capability different for each band. in __ath11k_mac_register()
6525 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS; in __ath11k_mac_register()
6527 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID; in __ath11k_mac_register()
6528 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN; in __ath11k_mac_register()
6530 ar->hw->max_listen_interval = ATH11K_MAX_HW_LISTEN_INTERVAL; in __ath11k_mac_register()
6532 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; in __ath11k_mac_register()
6533 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH; in __ath11k_mac_register()
6534 ar->hw->wiphy->max_remain_on_channel_duration = 5000; in __ath11k_mac_register()
6536 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD; in __ath11k_mac_register()
6537 ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE | in __ath11k_mac_register()
6540 ar->max_num_stations = TARGET_NUM_STATIONS; in __ath11k_mac_register()
6541 ar->max_num_peers = TARGET_NUM_PEERS_PDEV; in __ath11k_mac_register()
6543 ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations; in __ath11k_mac_register()
6545 ar->hw->queues = ATH11K_HW_MAX_QUEUES; in __ath11k_mac_register()
6546 ar->hw->wiphy->tx_queue_len = ATH11K_QUEUE_LEN; in __ath11k_mac_register()
6547 ar->hw->offchannel_tx_hw_queue = ATH11K_HW_MAX_QUEUES - 1; in __ath11k_mac_register()
6548 ar->hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF; in __ath11k_mac_register()
6550 ar->hw->vif_data_size = sizeof(struct ath11k_vif); in __ath11k_mac_register()
6551 ar->hw->sta_data_size = sizeof(struct ath11k_sta); in __ath11k_mac_register()
6553 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); in __ath11k_mac_register()
6554 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_STA_TX_PWR); in __ath11k_mac_register()
6556 ar->hw->wiphy->cipher_suites = cipher_suites; in __ath11k_mac_register()
6557 ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites); in __ath11k_mac_register()
6559 ar->hw->wiphy->iftype_ext_capab = ath11k_iftypes_ext_capa; in __ath11k_mac_register()
6560 ar->hw->wiphy->num_iftype_ext_capab = in __ath11k_mac_register()
6563 if (ar->supports_6ghz) { in __ath11k_mac_register()
6564 wiphy_ext_feature_set(ar->hw->wiphy, in __ath11k_mac_register()
6566 wiphy_ext_feature_set(ar->hw->wiphy, in __ath11k_mac_register()
6572 if (!test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags)) { in __ath11k_mac_register()
6573 ar->hw->netdev_features = NETIF_F_HW_CSUM; in __ath11k_mac_register()
6574 ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL); in __ath11k_mac_register()
6575 ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT); in __ath11k_mac_register()
6578 ret = ieee80211_register_hw(ar->hw); in __ath11k_mac_register()
6580 ath11k_err(ar->ab, "ieee80211 registration failed: %d\n", ret); in __ath11k_mac_register()
6584 if (!ab->hw_params.supports_monitor) in __ath11k_mac_register()
6587 * while. But that time is so short and in practise it make in __ath11k_mac_register()
6588 * a difference in real life. in __ath11k_mac_register()
6590 ar->hw->wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR); in __ath11k_mac_register()
6595 ath11k_err(ar->ab, "ath11k regd update failed: %d\n", ret); in __ath11k_mac_register()
6601 ath11k_err(ar->ab, "debugfs registration failed: %d\n", ret); in __ath11k_mac_register()
6608 ieee80211_unregister_hw(ar->hw); in __ath11k_mac_register()
6611 kfree(ar->hw->wiphy->iface_combinations[0].limits); in __ath11k_mac_register()
6612 kfree(ar->hw->wiphy->iface_combinations); in __ath11k_mac_register()
6615 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in __ath11k_mac_register()
6616 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels); in __ath11k_mac_register()
6617 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); in __ath11k_mac_register()
6620 SET_IEEE80211_DEV(ar->hw, NULL); in __ath11k_mac_register()
6631 if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags)) in ath11k_mac_register()
6634 for (i = 0; i < ab->num_radios; i++) { in ath11k_mac_register()
6635 pdev = &ab->pdevs[i]; in ath11k_mac_register()
6636 ar = pdev->ar; in ath11k_mac_register()
6637 if (ab->pdevs_macaddr_valid) { in ath11k_mac_register()
6638 ether_addr_copy(ar->mac_addr, pdev->mac_addr); in ath11k_mac_register()
6640 ether_addr_copy(ar->mac_addr, ab->mac_addr); in ath11k_mac_register()
6641 ar->mac_addr[4] += i; in ath11k_mac_register()
6648 idr_init(&ar->txmgmt_idr); in ath11k_mac_register()
6649 spin_lock_init(&ar->txmgmt_idr_lock); in ath11k_mac_register()
6652 /* Initialize channel counters frequency value in hertz */ in ath11k_mac_register()
6653 ab->cc_freq_hz = IPQ8074_CC_FREQ_HERTZ; in ath11k_mac_register()
6654 ab->free_vdev_map = (1LL << (ab->num_radios * TARGET_NUM_VDEVS)) - 1; in ath11k_mac_register()
6659 for (i = i - 1; i >= 0; i--) { in ath11k_mac_register()
6660 pdev = &ab->pdevs[i]; in ath11k_mac_register()
6661 ar = pdev->ar; in ath11k_mac_register()
6676 if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags)) in ath11k_mac_allocate()
6679 for (i = 0; i < ab->num_radios; i++) { in ath11k_mac_allocate()
6680 pdev = &ab->pdevs[i]; in ath11k_mac_allocate()
6684 ret = -ENOMEM; in ath11k_mac_allocate()
6688 ar = hw->priv; in ath11k_mac_allocate()
6689 ar->hw = hw; in ath11k_mac_allocate()
6690 ar->ab = ab; in ath11k_mac_allocate()
6691 ar->pdev = pdev; in ath11k_mac_allocate()
6692 ar->pdev_idx = i; in ath11k_mac_allocate()
6693 ar->lmac_id = ath11k_hw_get_mac_from_pdev_id(&ab->hw_params, i); in ath11k_mac_allocate()
6695 ar->wmi = &ab->wmi_ab.wmi[i]; in ath11k_mac_allocate()
6701 ar->cfg_tx_chainmask = pdev->cap.tx_chain_mask; in ath11k_mac_allocate()
6702 ar->cfg_rx_chainmask = pdev->cap.rx_chain_mask; in ath11k_mac_allocate()
6703 ar->num_tx_chains = get_num_chains(pdev->cap.tx_chain_mask); in ath11k_mac_allocate()
6704 ar->num_rx_chains = get_num_chains(pdev->cap.rx_chain_mask); in ath11k_mac_allocate()
6706 pdev->ar = ar; in ath11k_mac_allocate()
6707 spin_lock_init(&ar->data_lock); in ath11k_mac_allocate()
6708 INIT_LIST_HEAD(&ar->arvifs); in ath11k_mac_allocate()
6709 INIT_LIST_HEAD(&ar->ppdu_stats_info); in ath11k_mac_allocate()
6710 mutex_init(&ar->conf_mutex); in ath11k_mac_allocate()
6711 init_completion(&ar->vdev_setup_done); in ath11k_mac_allocate()
6712 init_completion(&ar->vdev_delete_done); in ath11k_mac_allocate()
6713 init_completion(&ar->peer_assoc_done); in ath11k_mac_allocate()
6714 init_completion(&ar->peer_delete_done); in ath11k_mac_allocate()
6715 init_completion(&ar->install_key_done); in ath11k_mac_allocate()
6716 init_completion(&ar->bss_survey_done); in ath11k_mac_allocate()
6717 init_completion(&ar->scan.started); in ath11k_mac_allocate()
6718 init_completion(&ar->scan.completed); in ath11k_mac_allocate()
6719 init_completion(&ar->thermal.wmi_sync); in ath11k_mac_allocate()
6721 INIT_DELAYED_WORK(&ar->scan.timeout, ath11k_scan_timeout_work); in ath11k_mac_allocate()
6722 INIT_WORK(&ar->regd_update_work, ath11k_regd_update_work); in ath11k_mac_allocate()
6724 INIT_WORK(&ar->wmi_mgmt_tx_work, ath11k_mgmt_over_wmi_tx_work); in ath11k_mac_allocate()
6725 skb_queue_head_init(&ar->wmi_mgmt_tx_queue); in ath11k_mac_allocate()
6726 clear_bit(ATH11K_FLAG_MONITOR_ENABLED, &ar->monitor_flags); in ath11k_mac_allocate()
6743 for (i = 0; i < ab->num_radios; i++) { in ath11k_mac_destroy()
6744 pdev = &ab->pdevs[i]; in ath11k_mac_destroy()
6745 ar = pdev->ar; in ath11k_mac_destroy()
6749 ieee80211_free_hw(ar->hw); in ath11k_mac_destroy()
6750 pdev->ar = NULL; in ath11k_mac_destroy()