Lines Matching refs:ar
461 struct ath11k_vif *ath11k_mac_get_arvif(struct ath11k *ar, u32 vdev_id) in ath11k_mac_get_arvif() argument
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()
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()
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()
524 return pdev ? pdev->ar : NULL; in ath11k_mac_get_ar_by_pdev_id()
534 return (pdev->ar ? pdev->ar : NULL); in ath11k_mac_get_ar_by_pdev_id()
545 struct ath11k *ar; in ath11k_mac_get_ar_vdev_stop_status() local
549 if (pdev && pdev->ar) { in ath11k_mac_get_ar_vdev_stop_status()
550 ar = pdev->ar; in ath11k_mac_get_ar_vdev_stop_status()
552 spin_lock_bh(&ar->data_lock); in ath11k_mac_get_ar_vdev_stop_status()
553 if (ar->vdev_stop_status.stop_in_progress && in ath11k_mac_get_ar_vdev_stop_status()
554 ar->vdev_stop_status.vdev_id == vdev_id) { in ath11k_mac_get_ar_vdev_stop_status()
555 ar->vdev_stop_status.stop_in_progress = false; in ath11k_mac_get_ar_vdev_stop_status()
556 spin_unlock_bh(&ar->data_lock); in ath11k_mac_get_ar_vdev_stop_status()
557 return ar; in ath11k_mac_get_ar_vdev_stop_status()
559 spin_unlock_bh(&ar->data_lock); in ath11k_mac_get_ar_vdev_stop_status()
565 static void ath11k_pdev_caps_update(struct ath11k *ar) in ath11k_pdev_caps_update() argument
567 struct ath11k_base *ab = ar->ab; in ath11k_pdev_caps_update()
569 ar->max_tx_power = ab->target_caps.hw_max_tx_power; in ath11k_pdev_caps_update()
576 ar->min_tx_power = 0; in ath11k_pdev_caps_update()
578 ar->txpower_limit_2g = ar->max_tx_power; in ath11k_pdev_caps_update()
579 ar->txpower_limit_5g = ar->max_tx_power; in ath11k_pdev_caps_update()
580 ar->txpower_scale = WMI_HOST_TP_SCALE_MAX; in ath11k_pdev_caps_update()
583 static int ath11k_mac_txpower_recalc(struct ath11k *ar) in ath11k_mac_txpower_recalc() argument
585 struct ath11k_pdev *pdev = ar->pdev; in ath11k_mac_txpower_recalc()
590 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_txpower_recalc()
592 list_for_each_entry(arvif, &ar->arvifs, list) { in ath11k_mac_txpower_recalc()
606 txpower = min_t(u32, max_t(u32, ar->min_tx_power, txpower), in ath11k_mac_txpower_recalc()
607 ar->max_tx_power) * 2; in ath11k_mac_txpower_recalc()
609 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower to set in hw %d\n", in ath11k_mac_txpower_recalc()
613 ar->txpower_limit_2g != txpower) { in ath11k_mac_txpower_recalc()
615 ret = ath11k_wmi_pdev_set_param(ar, param, in ath11k_mac_txpower_recalc()
616 txpower, ar->pdev->pdev_id); in ath11k_mac_txpower_recalc()
619 ar->txpower_limit_2g = txpower; in ath11k_mac_txpower_recalc()
623 ar->txpower_limit_5g != txpower) { in ath11k_mac_txpower_recalc()
625 ret = ath11k_wmi_pdev_set_param(ar, param, in ath11k_mac_txpower_recalc()
626 txpower, ar->pdev->pdev_id); in ath11k_mac_txpower_recalc()
629 ar->txpower_limit_5g = txpower; in ath11k_mac_txpower_recalc()
635 ath11k_warn(ar->ab, "failed to recalc txpower limit %d using pdev param %d: %d\n", in ath11k_mac_txpower_recalc()
642 struct ath11k *ar = arvif->ar; in ath11k_recalc_rtscts_prot() local
646 lockdep_assert_held(&ar->conf_mutex); in ath11k_recalc_rtscts_prot()
667 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev %d recalc rts/cts prot %d\n", in ath11k_recalc_rtscts_prot()
670 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_recalc_rtscts_prot()
673 ath11k_warn(ar->ab, "failed to recalculate rts/cts prot for vdev %d: %d\n", in ath11k_recalc_rtscts_prot()
681 struct ath11k *ar = arvif->ar; in ath11k_mac_set_kickout() local
685 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_STA_KICKOUT_TH, in ath11k_mac_set_kickout()
687 ar->pdev->pdev_id); in ath11k_mac_set_kickout()
689 ath11k_warn(ar->ab, "failed to set kickout threshold on vdev %i: %d\n", in ath11k_mac_set_kickout()
695 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, in ath11k_mac_set_kickout()
698 ath11k_warn(ar->ab, "failed to set keepalive minimum idle time on vdev %i: %d\n", in ath11k_mac_set_kickout()
704 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, in ath11k_mac_set_kickout()
707 ath11k_warn(ar->ab, "failed to set keepalive maximum idle time on vdev %i: %d\n", in ath11k_mac_set_kickout()
713 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, in ath11k_mac_set_kickout()
716 ath11k_warn(ar->ab, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n", in ath11k_mac_set_kickout()
724 void ath11k_mac_peer_cleanup_all(struct ath11k *ar) in ath11k_mac_peer_cleanup_all() argument
727 struct ath11k_base *ab = ar->ab; in ath11k_mac_peer_cleanup_all()
729 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_peer_cleanup_all()
733 ath11k_peer_rx_tid_cleanup(ar, peer); in ath11k_mac_peer_cleanup_all()
739 ar->num_peers = 0; in ath11k_mac_peer_cleanup_all()
740 ar->num_stations = 0; in ath11k_mac_peer_cleanup_all()
743 static int ath11k_monitor_vdev_up(struct ath11k *ar, int vdev_id) in ath11k_monitor_vdev_up() argument
747 ret = ath11k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr); in ath11k_monitor_vdev_up()
749 ath11k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n", in ath11k_monitor_vdev_up()
754 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac monitor vdev %i started\n", in ath11k_monitor_vdev_up()
771 struct ath11k *ar = arvif->ar; in ath11k_mac_setup_bcn_tmpl() local
772 struct ath11k_base *ab = ar->ab; in ath11k_mac_setup_bcn_tmpl()
773 struct ieee80211_hw *hw = ar->hw; in ath11k_mac_setup_bcn_tmpl()
801 ret = ath11k_wmi_bcn_tmpl(ar, arvif->vdev_id, &offs, bcn); in ath11k_mac_setup_bcn_tmpl()
815 struct ath11k *ar = arvif->ar; in ath11k_control_beaconing() local
818 lockdep_assert_held(&arvif->ar->conf_mutex); in ath11k_control_beaconing()
821 ret = ath11k_wmi_vdev_down(ar, arvif->vdev_id); in ath11k_control_beaconing()
823 ath11k_warn(ar->ab, "failed to down vdev_id %i: %d\n", in ath11k_control_beaconing()
833 ath11k_warn(ar->ab, "failed to update bcn tmpl during vdev up: %d\n", in ath11k_control_beaconing()
844 ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, in ath11k_control_beaconing()
847 ath11k_warn(ar->ab, "failed to bring up vdev %d: %i\n", in ath11k_control_beaconing()
854 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id); in ath11k_control_beaconing()
857 static void ath11k_peer_assoc_h_basic(struct ath11k *ar, in ath11k_peer_assoc_h_basic() argument
865 lockdep_assert_held(&ar->conf_mutex); in ath11k_peer_assoc_h_basic()
877 arg->peer_listen_intval = ar->hw->conf.listen_interval; in ath11k_peer_assoc_h_basic()
882 static void ath11k_peer_assoc_h_crypto(struct ath11k *ar, in ath11k_peer_assoc_h_crypto() argument
894 lockdep_assert_held(&ar->conf_mutex); in ath11k_peer_assoc_h_crypto()
899 bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid, NULL, 0, in ath11k_peer_assoc_h_crypto()
919 cfg80211_put_bss(ar->hw->wiphy, bss); in ath11k_peer_assoc_h_crypto()
924 ath11k_dbg(ar->ab, ATH11K_DBG_WMI, in ath11k_peer_assoc_h_crypto()
930 ath11k_dbg(ar->ab, ATH11K_DBG_WMI, in ath11k_peer_assoc_h_crypto()
943 static void ath11k_peer_assoc_h_rates(struct ath11k *ar, in ath11k_peer_assoc_h_rates() argument
958 lockdep_assert_held(&ar->conf_mutex); in ath11k_peer_assoc_h_rates()
964 sband = ar->hw->wiphy->bands[band]; in ath11k_peer_assoc_h_rates()
1005 static void ath11k_peer_assoc_h_ht(struct ath11k *ar, in ath11k_peer_assoc_h_ht() argument
1019 lockdep_assert_held(&ar->conf_mutex); in ath11k_peer_assoc_h_ht()
1100 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n", in ath11k_peer_assoc_h_ht()
1166 static void ath11k_peer_assoc_h_vht(struct ath11k *ar, in ath11k_peer_assoc_h_vht() argument
1253 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n", in ath11k_peer_assoc_h_vht()
1259 static void ath11k_peer_assoc_h_he(struct ath11k *ar, in ath11k_peer_assoc_h_he() argument
1402 static void ath11k_peer_assoc_h_qos(struct ath11k *ar, in ath11k_peer_assoc_h_qos() argument
1434 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac peer %pM qos %d\n", in ath11k_peer_assoc_h_qos()
1438 static int ath11k_peer_assoc_qos_ap(struct ath11k *ar, in ath11k_peer_assoc_qos_ap() argument
1447 lockdep_assert_held(&ar->conf_mutex); in ath11k_peer_assoc_qos_ap()
1451 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n", in ath11k_peer_assoc_qos_ap()
1474 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, ¶ms); in ath11k_peer_assoc_qos_ap()
1480 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, ¶ms); in ath11k_peer_assoc_qos_ap()
1487 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, ¶ms); in ath11k_peer_assoc_qos_ap()
1493 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, ¶ms); in ath11k_peer_assoc_qos_ap()
1500 ath11k_warn(ar->ab, "failed to set ap ps peer param %d for vdev %i: %d\n", in ath11k_peer_assoc_qos_ap()
1511 static enum wmi_phy_mode ath11k_mac_get_phymode_vht(struct ath11k *ar, in ath11k_mac_get_phymode_vht() argument
1539 static enum wmi_phy_mode ath11k_mac_get_phymode_he(struct ath11k *ar, in ath11k_mac_get_phymode_he() argument
1565 static void ath11k_peer_assoc_h_phymode(struct ath11k *ar, in ath11k_peer_assoc_h_phymode() argument
1615 phymode = ath11k_mac_get_phymode_he(ar, sta); in ath11k_peer_assoc_h_phymode()
1618 phymode = ath11k_mac_get_phymode_vht(ar, sta); in ath11k_peer_assoc_h_phymode()
1633 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac peer %pM phymode %s\n", in ath11k_peer_assoc_h_phymode()
1640 static void ath11k_peer_assoc_prepare(struct ath11k *ar, in ath11k_peer_assoc_prepare() argument
1646 lockdep_assert_held(&ar->conf_mutex); in ath11k_peer_assoc_prepare()
1650 reinit_completion(&ar->peer_assoc_done); in ath11k_peer_assoc_prepare()
1653 ath11k_peer_assoc_h_basic(ar, vif, sta, arg); in ath11k_peer_assoc_prepare()
1654 ath11k_peer_assoc_h_crypto(ar, vif, sta, arg); in ath11k_peer_assoc_prepare()
1655 ath11k_peer_assoc_h_rates(ar, vif, sta, arg); in ath11k_peer_assoc_prepare()
1656 ath11k_peer_assoc_h_ht(ar, vif, sta, arg); in ath11k_peer_assoc_prepare()
1657 ath11k_peer_assoc_h_vht(ar, vif, sta, arg); in ath11k_peer_assoc_prepare()
1658 ath11k_peer_assoc_h_he(ar, vif, sta, arg); in ath11k_peer_assoc_prepare()
1659 ath11k_peer_assoc_h_qos(ar, vif, sta, arg); in ath11k_peer_assoc_prepare()
1660 ath11k_peer_assoc_h_phymode(ar, vif, sta, arg); in ath11k_peer_assoc_prepare()
1666 static int ath11k_setup_peer_smps(struct ath11k *ar, struct ath11k_vif *arvif, in ath11k_setup_peer_smps() argument
1681 return ath11k_wmi_set_peer_param(ar, addr, arvif->vdev_id, in ath11k_setup_peer_smps()
1690 struct ath11k *ar = hw->priv; in ath11k_bss_assoc() local
1696 lockdep_assert_held(&ar->conf_mutex); in ath11k_bss_assoc()
1698 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n", in ath11k_bss_assoc()
1705 ath11k_warn(ar->ab, "failed to find station entry for bss %pM vdev %i\n", in ath11k_bss_assoc()
1711 ath11k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg, false); in ath11k_bss_assoc()
1715 ret = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg); in ath11k_bss_assoc()
1717 ath11k_warn(ar->ab, "failed to run peer assoc for %pM vdev %i: %d\n", in ath11k_bss_assoc()
1722 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) { in ath11k_bss_assoc()
1723 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", in ath11k_bss_assoc()
1728 ret = ath11k_setup_peer_smps(ar, arvif, bss_conf->bssid, in ath11k_bss_assoc()
1731 ath11k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n", in ath11k_bss_assoc()
1741 ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid); in ath11k_bss_assoc()
1743 ath11k_warn(ar->ab, "failed to set vdev %d up: %d\n", in ath11k_bss_assoc()
1750 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_bss_assoc()
1755 ret = ath11k_wmi_set_peer_param(ar, arvif->bssid, in ath11k_bss_assoc()
1760 ath11k_warn(ar->ab, "Unable to authorize BSS peer: %d\n", ret); in ath11k_bss_assoc()
1762 ret = ath11k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id, in ath11k_bss_assoc()
1765 ath11k_warn(ar->ab, "failed to set vdev %i OBSS PD parameters: %d\n", in ath11k_bss_assoc()
1772 struct ath11k *ar = hw->priv; in ath11k_bss_disassoc() local
1776 lockdep_assert_held(&ar->conf_mutex); in ath11k_bss_disassoc()
1778 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n", in ath11k_bss_disassoc()
1781 ret = ath11k_wmi_vdev_down(ar, arvif->vdev_id); in ath11k_bss_disassoc()
1783 ath11k_warn(ar->ab, "failed to down vdev %i: %d\n", in ath11k_bss_disassoc()
1816 static void ath11k_recalculate_mgmt_rate(struct ath11k *ar, in ath11k_recalculate_mgmt_rate() argument
1828 lockdep_assert_held(&ar->conf_mutex); in ath11k_recalculate_mgmt_rate()
1830 sband = ar->hw->wiphy->bands[def->chan->band]; in ath11k_recalculate_mgmt_rate()
1836 ath11k_warn(ar->ab, "bitrate not supported %d\n", bitrate); in ath11k_recalculate_mgmt_rate()
1841 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param, in ath11k_recalculate_mgmt_rate()
1844 ath11k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret); in ath11k_recalculate_mgmt_rate()
1847 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param, in ath11k_recalculate_mgmt_rate()
1850 ath11k_warn(ar->ab, "failed to set beacon tx rate %d\n", ret); in ath11k_recalculate_mgmt_rate()
1858 struct ath11k *ar = hw->priv; in ath11k_mac_op_bss_info_changed() local
1872 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_bss_info_changed()
1878 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_bss_info_changed()
1882 ath11k_warn(ar->ab, "Failed to set beacon interval for VDEV: %d\n", in ath11k_mac_op_bss_info_changed()
1885 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_op_bss_info_changed()
1893 ret = ath11k_wmi_pdev_set_param(ar, param_id, in ath11k_mac_op_bss_info_changed()
1894 param_value, ar->pdev->pdev_id); in ath11k_mac_op_bss_info_changed()
1896 ath11k_warn(ar->ab, "Failed to set beacon mode for VDEV: %d\n", in ath11k_mac_op_bss_info_changed()
1899 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_op_bss_info_changed()
1905 ath11k_warn(ar->ab, "failed to update bcn template: %d\n", in ath11k_mac_op_bss_info_changed()
1909 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_bss_info_changed()
1913 ath11k_warn(ar->ab, in ath11k_mac_op_bss_info_changed()
1917 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_op_bss_info_changed()
1927 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_bss_info_changed()
1932 ath11k_warn(ar->ab, "Failed to set dtim period for VDEV %d: %i\n", in ath11k_mac_op_bss_info_changed()
1935 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_op_bss_info_changed()
1961 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_bss_info_changed()
1964 ath11k_warn(ar->ab, "Failed to set CTS prot for VDEV: %d\n", in ath11k_mac_op_bss_info_changed()
1967 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "Set CTS prot: %d for VDEV: %d\n", in ath11k_mac_op_bss_info_changed()
1970 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "defer protection mode setup, vdev is not ready yet\n"); in ath11k_mac_op_bss_info_changed()
1984 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_bss_info_changed()
1987 ath11k_warn(ar->ab, "Failed to set erp slot for VDEV: %d\n", in ath11k_mac_op_bss_info_changed()
1990 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_op_bss_info_changed()
2004 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_bss_info_changed()
2007 ath11k_warn(ar->ab, "Failed to set preamble for VDEV: %d\n", in ath11k_mac_op_bss_info_changed()
2010 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_op_bss_info_changed()
2023 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev_id %i txpower %d\n", in ath11k_mac_op_bss_info_changed()
2027 ath11k_mac_txpower_recalc(ar); in ath11k_mac_op_bss_info_changed()
2040 if (ar->pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) in ath11k_mac_op_bss_info_changed()
2053 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_op_bss_info_changed()
2058 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_bss_info_changed()
2061 ath11k_warn(ar->ab, in ath11k_mac_op_bss_info_changed()
2066 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_bss_info_changed()
2069 ath11k_warn(ar->ab, in ath11k_mac_op_bss_info_changed()
2076 ath11k_recalculate_mgmt_rate(ar, vif, &def); in ath11k_mac_op_bss_info_changed()
2080 ath11k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id); in ath11k_mac_op_bss_info_changed()
2082 ath11k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id); in ath11k_mac_op_bss_info_changed()
2086 ath11k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id, in ath11k_mac_op_bss_info_changed()
2092 ar, arvif->vdev_id, info->he_bss_color.color, in ath11k_mac_op_bss_info_changed()
2096 ath11k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n", in ath11k_mac_op_bss_info_changed()
2099 ret = ath11k_wmi_send_bss_color_change_enable_cmd(ar, in ath11k_mac_op_bss_info_changed()
2103 ath11k_warn(ar->ab, "failed to enable bss color change on vdev %i: %d\n", in ath11k_mac_op_bss_info_changed()
2106 ar, arvif->vdev_id, 0, in ath11k_mac_op_bss_info_changed()
2109 ath11k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n", in ath11k_mac_op_bss_info_changed()
2114 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_bss_info_changed()
2117 void __ath11k_mac_scan_finish(struct ath11k *ar) in __ath11k_mac_scan_finish() argument
2119 lockdep_assert_held(&ar->data_lock); in __ath11k_mac_scan_finish()
2121 switch (ar->scan.state) { in __ath11k_mac_scan_finish()
2126 if (!ar->scan.is_roc) { in __ath11k_mac_scan_finish()
2128 .aborted = (ar->scan.state == in __ath11k_mac_scan_finish()
2132 ieee80211_scan_completed(ar->hw, &info); in __ath11k_mac_scan_finish()
2133 } else if (ar->scan.roc_notify) { in __ath11k_mac_scan_finish()
2134 ieee80211_remain_on_channel_expired(ar->hw); in __ath11k_mac_scan_finish()
2138 ar->scan.state = ATH11K_SCAN_IDLE; in __ath11k_mac_scan_finish()
2139 ar->scan_channel = NULL; in __ath11k_mac_scan_finish()
2140 ar->scan.roc_freq = 0; in __ath11k_mac_scan_finish()
2141 cancel_delayed_work(&ar->scan.timeout); in __ath11k_mac_scan_finish()
2142 complete(&ar->scan.completed); in __ath11k_mac_scan_finish()
2147 void ath11k_mac_scan_finish(struct ath11k *ar) in ath11k_mac_scan_finish() argument
2149 spin_lock_bh(&ar->data_lock); in ath11k_mac_scan_finish()
2150 __ath11k_mac_scan_finish(ar); in ath11k_mac_scan_finish()
2151 spin_unlock_bh(&ar->data_lock); in ath11k_mac_scan_finish()
2154 static int ath11k_scan_stop(struct ath11k *ar) in ath11k_scan_stop() argument
2162 lockdep_assert_held(&ar->conf_mutex); in ath11k_scan_stop()
2165 arg.pdev_id = ar->pdev->pdev_id; in ath11k_scan_stop()
2167 ret = ath11k_wmi_send_scan_stop_cmd(ar, &arg); in ath11k_scan_stop()
2169 ath11k_warn(ar->ab, "failed to stop wmi scan: %d\n", ret); in ath11k_scan_stop()
2173 ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ); in ath11k_scan_stop()
2175 ath11k_warn(ar->ab, in ath11k_scan_stop()
2190 spin_lock_bh(&ar->data_lock); in ath11k_scan_stop()
2191 if (ar->scan.state != ATH11K_SCAN_IDLE) in ath11k_scan_stop()
2192 __ath11k_mac_scan_finish(ar); in ath11k_scan_stop()
2193 spin_unlock_bh(&ar->data_lock); in ath11k_scan_stop()
2198 static void ath11k_scan_abort(struct ath11k *ar) in ath11k_scan_abort() argument
2202 lockdep_assert_held(&ar->conf_mutex); in ath11k_scan_abort()
2204 spin_lock_bh(&ar->data_lock); in ath11k_scan_abort()
2206 switch (ar->scan.state) { in ath11k_scan_abort()
2214 ath11k_warn(ar->ab, "refusing scan abortion due to invalid scan state: %d\n", in ath11k_scan_abort()
2215 ar->scan.state); in ath11k_scan_abort()
2218 ar->scan.state = ATH11K_SCAN_ABORTING; in ath11k_scan_abort()
2219 spin_unlock_bh(&ar->data_lock); in ath11k_scan_abort()
2221 ret = ath11k_scan_stop(ar); in ath11k_scan_abort()
2223 ath11k_warn(ar->ab, "failed to abort scan: %d\n", ret); in ath11k_scan_abort()
2225 spin_lock_bh(&ar->data_lock); in ath11k_scan_abort()
2229 spin_unlock_bh(&ar->data_lock); in ath11k_scan_abort()
2234 struct ath11k *ar = container_of(work, struct ath11k, in ath11k_scan_timeout_work() local
2237 mutex_lock(&ar->conf_mutex); in ath11k_scan_timeout_work()
2238 ath11k_scan_abort(ar); in ath11k_scan_timeout_work()
2239 mutex_unlock(&ar->conf_mutex); in ath11k_scan_timeout_work()
2242 static int ath11k_start_scan(struct ath11k *ar, in ath11k_start_scan() argument
2247 lockdep_assert_held(&ar->conf_mutex); in ath11k_start_scan()
2249 if (ath11k_spectral_get_mode(ar) == ATH11K_SPECTRAL_BACKGROUND) in ath11k_start_scan()
2250 ath11k_spectral_reset_buffer(ar); in ath11k_start_scan()
2252 ret = ath11k_wmi_send_scan_start_cmd(ar, arg); in ath11k_start_scan()
2256 ret = wait_for_completion_timeout(&ar->scan.started, 1 * HZ); in ath11k_start_scan()
2258 ret = ath11k_scan_stop(ar); in ath11k_start_scan()
2260 ath11k_warn(ar->ab, "failed to stop scan: %d\n", ret); in ath11k_start_scan()
2269 spin_lock_bh(&ar->data_lock); in ath11k_start_scan()
2270 if (ar->scan.state == ATH11K_SCAN_IDLE) { in ath11k_start_scan()
2271 spin_unlock_bh(&ar->data_lock); in ath11k_start_scan()
2274 spin_unlock_bh(&ar->data_lock); in ath11k_start_scan()
2283 struct ath11k *ar = hw->priv; in ath11k_mac_op_hw_scan() local
2290 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_hw_scan()
2292 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_hw_scan()
2293 switch (ar->scan.state) { in ath11k_mac_op_hw_scan()
2295 reinit_completion(&ar->scan.started); in ath11k_mac_op_hw_scan()
2296 reinit_completion(&ar->scan.completed); in ath11k_mac_op_hw_scan()
2297 ar->scan.state = ATH11K_SCAN_STARTING; in ath11k_mac_op_hw_scan()
2298 ar->scan.is_roc = false; in ath11k_mac_op_hw_scan()
2299 ar->scan.vdev_id = arvif->vdev_id; in ath11k_mac_op_hw_scan()
2308 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_hw_scan()
2314 ath11k_wmi_start_scan_init(ar, &arg); in ath11k_mac_op_hw_scan()
2341 ret = ath11k_start_scan(ar, &arg); in ath11k_mac_op_hw_scan()
2343 ath11k_warn(ar->ab, "failed to start hw scan: %d\n", ret); in ath11k_mac_op_hw_scan()
2344 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_hw_scan()
2345 ar->scan.state = ATH11K_SCAN_IDLE; in ath11k_mac_op_hw_scan()
2346 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_hw_scan()
2350 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout, in ath11k_mac_op_hw_scan()
2358 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_hw_scan()
2365 struct ath11k *ar = hw->priv; in ath11k_mac_op_cancel_hw_scan() local
2367 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_cancel_hw_scan()
2368 ath11k_scan_abort(ar); in ath11k_mac_op_cancel_hw_scan()
2369 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_cancel_hw_scan()
2371 cancel_delayed_work_sync(&ar->scan.timeout); in ath11k_mac_op_cancel_hw_scan()
2380 struct ath11k *ar = arvif->ar; in ath11k_install_key() local
2390 lockdep_assert_held(&arvif->ar->conf_mutex); in ath11k_install_key()
2392 reinit_completion(&ar->install_key_done); in ath11k_install_key()
2394 if (test_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags)) in ath11k_install_key()
2424 ath11k_warn(ar->ab, "cipher %d is not supported\n", key->cipher); in ath11k_install_key()
2428 if (test_bit(ATH11K_FLAG_RAW_MODE, &ar->ab->dev_flags)) in ath11k_install_key()
2433 ret = ath11k_wmi_vdev_install_key(arvif->ar, &arg); in ath11k_install_key()
2438 if (!wait_for_completion_timeout(&ar->install_key_done, 1 * HZ)) in ath11k_install_key()
2441 return ar->install_key_status ? -EINVAL : 0; in ath11k_install_key()
2447 struct ath11k *ar = arvif->ar; in ath11k_clear_peer_keys() local
2448 struct ath11k_base *ab = ar->ab; in ath11k_clear_peer_keys()
2455 lockdep_assert_held(&ar->conf_mutex); in ath11k_clear_peer_keys()
2490 struct ath11k *ar = hw->priv; in ath11k_mac_op_set_key() local
2491 struct ath11k_base *ab = ar->ab; in ath11k_mac_op_set_key()
2506 if (test_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags)) in ath11k_mac_op_set_key()
2512 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_set_key()
2605 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_set_key()
2610 ath11k_mac_bitrate_mask_num_vht_rates(struct ath11k *ar, in ath11k_mac_bitrate_mask_num_vht_rates() argument
2629 struct ath11k *ar = arvif->ar; in ath11k_mac_set_peer_vht_fixed_rate() local
2634 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_set_peer_vht_fixed_rate()
2646 ath11k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM", in ath11k_mac_set_peer_vht_fixed_rate()
2651 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_set_peer_vht_fixed_rate()
2657 ret = ath11k_wmi_set_peer_param(ar, sta->addr, in ath11k_mac_set_peer_vht_fixed_rate()
2662 ath11k_warn(ar->ab, in ath11k_mac_set_peer_vht_fixed_rate()
2669 static int ath11k_station_assoc(struct ath11k *ar, in ath11k_station_assoc() argument
2682 lockdep_assert_held(&ar->conf_mutex); in ath11k_station_assoc()
2690 ath11k_peer_assoc_prepare(ar, vif, sta, &peer_arg, reassoc); in ath11k_station_assoc()
2692 ret = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg); in ath11k_station_assoc()
2694 ath11k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n", in ath11k_station_assoc()
2699 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) { in ath11k_station_assoc()
2700 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", in ath11k_station_assoc()
2705 num_vht_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask); in ath11k_station_assoc()
2725 ret = ath11k_setup_peer_smps(ar, arvif, sta->addr, in ath11k_station_assoc()
2728 ath11k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n", in ath11k_station_assoc()
2741 ret = ath11k_peer_assoc_qos_ap(ar, arvif, sta); in ath11k_station_assoc()
2743 ath11k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n", in ath11k_station_assoc()
2752 static int ath11k_station_disassoc(struct ath11k *ar, in ath11k_station_disassoc() argument
2759 lockdep_assert_held(&ar->conf_mutex); in ath11k_station_disassoc()
2770 ath11k_warn(ar->ab, "failed to clear all peer keys for vdev %i: %d\n", in ath11k_station_disassoc()
2779 struct ath11k *ar; in ath11k_sta_rc_update_wk() local
2795 ar = arvif->ar; in ath11k_sta_rc_update_wk()
2804 spin_lock_bh(&ar->data_lock); in ath11k_sta_rc_update_wk()
2813 spin_unlock_bh(&ar->data_lock); in ath11k_sta_rc_update_wk()
2815 mutex_lock(&ar->conf_mutex); in ath11k_sta_rc_update_wk()
2822 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id, in ath11k_sta_rc_update_wk()
2825 ath11k_warn(ar->ab, "failed to update STA %pM peer bw %d: %d\n", in ath11k_sta_rc_update_wk()
2830 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac update sta %pM nss %d\n", in ath11k_sta_rc_update_wk()
2833 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id, in ath11k_sta_rc_update_wk()
2836 ath11k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n", in ath11k_sta_rc_update_wk()
2841 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac update sta %pM smps %d\n", in ath11k_sta_rc_update_wk()
2844 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id, in ath11k_sta_rc_update_wk()
2847 ath11k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n", in ath11k_sta_rc_update_wk()
2853 num_vht_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band, in ath11k_sta_rc_update_wk()
2875 ath11k_peer_assoc_prepare(ar, arvif->vif, sta, in ath11k_sta_rc_update_wk()
2878 err = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg); in ath11k_sta_rc_update_wk()
2880 ath11k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n", in ath11k_sta_rc_update_wk()
2883 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) in ath11k_sta_rc_update_wk()
2884 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", in ath11k_sta_rc_update_wk()
2889 mutex_unlock(&ar->conf_mutex); in ath11k_sta_rc_update_wk()
2895 struct ath11k *ar = arvif->ar; in ath11k_mac_inc_num_stations() local
2897 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_inc_num_stations()
2902 if (ar->num_stations >= ar->max_num_stations) in ath11k_mac_inc_num_stations()
2905 ar->num_stations++; in ath11k_mac_inc_num_stations()
2913 struct ath11k *ar = arvif->ar; in ath11k_mac_dec_num_stations() local
2915 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_dec_num_stations()
2920 ar->num_stations--; in ath11k_mac_dec_num_stations()
2923 static int ath11k_mac_station_add(struct ath11k *ar, in ath11k_mac_station_add() argument
2927 struct ath11k_base *ab = ar->ab; in ath11k_mac_station_add()
2933 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_station_add()
2938 ar->max_num_stations); in ath11k_mac_station_add()
2952 ret = ath11k_peer_create(ar, arvif, sta, &peer_param); in ath11k_mac_station_add()
2962 if (ath11k_debugfs_is_extd_tx_stats_enabled(ar)) { in ath11k_mac_station_add()
2971 ret = ath11k_wmi_set_peer_param(ar, sta->addr, in ath11k_mac_station_add()
2981 ret = ath11k_dp_peer_setup(ar, arvif->vdev_id, sta->addr); in ath11k_mac_station_add()
2990 ret = ath11k_start_vdev_delay(ar->hw, vif); in ath11k_mac_station_add()
3003 ath11k_peer_delete(ar, arvif->vdev_id, sta->addr); in ath11k_mac_station_add()
3019 struct ath11k *ar = hw->priv; in ath11k_mac_op_sta_state() local
3030 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_sta_state()
3038 ret = ath11k_mac_station_add(ar, vif, sta); in ath11k_mac_op_sta_state()
3040 ath11k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n", in ath11k_mac_op_sta_state()
3044 ath11k_dp_peer_cleanup(ar, arvif->vdev_id, sta->addr); in ath11k_mac_op_sta_state()
3046 ret = ath11k_peer_delete(ar, arvif->vdev_id, sta->addr); in ath11k_mac_op_sta_state()
3048 ath11k_warn(ar->ab, "Failed to delete peer: %pM for VDEV: %d\n", in ath11k_mac_op_sta_state()
3051 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "Removed peer: %pM for VDEV: %d\n", in ath11k_mac_op_sta_state()
3055 spin_lock_bh(&ar->ab->base_lock); in ath11k_mac_op_sta_state()
3056 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr); in ath11k_mac_op_sta_state()
3058 ath11k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n", in ath11k_mac_op_sta_state()
3063 ar->num_peers--; in ath11k_mac_op_sta_state()
3065 spin_unlock_bh(&ar->ab->base_lock); in ath11k_mac_op_sta_state()
3077 ret = ath11k_station_assoc(ar, vif, sta, false); in ath11k_mac_op_sta_state()
3079 ath11k_warn(ar->ab, "Failed to associate station: %pM\n", in ath11k_mac_op_sta_state()
3086 ret = ath11k_station_disassoc(ar, vif, sta); in ath11k_mac_op_sta_state()
3088 ath11k_warn(ar->ab, "Failed to disassociate station: %pM\n", in ath11k_mac_op_sta_state()
3092 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_sta_state()
3100 struct ath11k *ar = hw->priv; in ath11k_mac_op_sta_set_txpwr() local
3116 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_sta_set_txpwr()
3118 ret = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id, in ath11k_mac_op_sta_set_txpwr()
3121 ath11k_warn(ar->ab, "failed to set tx power for station ret: %d\n", in ath11k_mac_op_sta_set_txpwr()
3127 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_sta_set_txpwr()
3136 struct ath11k *ar = hw->priv; in ath11k_mac_op_sta_rc_update() local
3142 spin_lock_bh(&ar->ab->base_lock); in ath11k_mac_op_sta_rc_update()
3144 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr); in ath11k_mac_op_sta_rc_update()
3146 spin_unlock_bh(&ar->ab->base_lock); in ath11k_mac_op_sta_rc_update()
3147 ath11k_warn(ar->ab, "mac sta rc update failed to find peer %pM on vdev %i\n", in ath11k_mac_op_sta_rc_update()
3152 spin_unlock_bh(&ar->ab->base_lock); in ath11k_mac_op_sta_rc_update()
3154 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_op_sta_rc_update()
3159 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_sta_rc_update()
3178 ath11k_warn(ar->ab, "Invalid bandwidth %d in rc update for %pM\n", in ath11k_mac_op_sta_rc_update()
3205 ath11k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM\n", in ath11k_mac_op_sta_rc_update()
3216 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_sta_rc_update()
3221 static int ath11k_conf_tx_uapsd(struct ath11k *ar, struct ieee80211_vif *vif, in ath11k_conf_tx_uapsd() argument
3255 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath11k_conf_tx_uapsd()
3259 ath11k_warn(ar->ab, "could not set uapsd params %d\n", ret); in ath11k_conf_tx_uapsd()
3268 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath11k_conf_tx_uapsd()
3272 ath11k_warn(ar->ab, "could not set rx wake param %d\n", ret); in ath11k_conf_tx_uapsd()
3282 struct ath11k *ar = hw->priv; in ath11k_mac_op_conf_tx() local
3287 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_conf_tx()
3314 ret = ath11k_wmi_send_wmm_update_cmd_tlv(ar, arvif->vdev_id, in ath11k_mac_op_conf_tx()
3317 ath11k_warn(ar->ab, "failed to set wmm params: %d\n", ret); in ath11k_mac_op_conf_tx()
3321 ret = ath11k_conf_tx_uapsd(ar, vif, ac, params->uapsd); in ath11k_mac_op_conf_tx()
3324 ath11k_warn(ar->ab, "failed to set sta uapsd: %d\n", ret); in ath11k_mac_op_conf_tx()
3327 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_conf_tx()
3332 ath11k_create_ht_cap(struct ath11k *ar, u32 ar_ht_cap, u32 rate_cap_rx_chainmask) in ath11k_create_ht_cap() argument
3336 u32 ar_vht_cap = ar->pdev->cap.vht_cap; in ath11k_create_ht_cap()
3387 for (i = 0; i < ar->num_rx_chains; i++) { in ath11k_create_ht_cap()
3400 struct ath11k *ar = arvif->ar; in ath11k_mac_set_txbf_conf() local
3403 u32 vht_cap = ar->pdev->cap.vht_cap; in ath11k_mac_set_txbf_conf()
3416 if (sound_dim > (ar->num_tx_chains - 1)) in ath11k_mac_set_txbf_conf()
3417 sound_dim = ar->num_tx_chains - 1; in ath11k_mac_set_txbf_conf()
3442 return ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_set_txbf_conf()
3446 static void ath11k_set_vht_txbf_cap(struct ath11k *ar, u32 *vht_cap) in ath11k_set_vht_txbf_cap() argument
3454 if (ar->num_tx_chains < 2) { in ath11k_set_vht_txbf_cap()
3475 if (sound_dim > (ar->num_tx_chains - 1)) in ath11k_set_vht_txbf_cap()
3476 sound_dim = ar->num_tx_chains - 1; in ath11k_set_vht_txbf_cap()
3489 ath11k_create_vht_cap(struct ath11k *ar, u32 rate_cap_tx_chainmask, in ath11k_create_vht_cap() argument
3497 vht_cap.cap = ar->pdev->cap.vht_cap; in ath11k_create_vht_cap()
3499 ath11k_set_vht_txbf_cap(ar, &vht_cap.cap); in ath11k_create_vht_cap()
3509 if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i)) in ath11k_create_vht_cap()
3514 if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i)) in ath11k_create_vht_cap()
3529 static void ath11k_mac_setup_ht_vht_cap(struct ath11k *ar, in ath11k_mac_setup_ht_vht_cap() argument
3538 rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift; in ath11k_mac_setup_ht_vht_cap()
3539 rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift; in ath11k_mac_setup_ht_vht_cap()
3542 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; in ath11k_mac_setup_ht_vht_cap()
3546 band->ht_cap = ath11k_create_ht_cap(ar, ht_cap, in ath11k_mac_setup_ht_vht_cap()
3550 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP && !ar->supports_6ghz) { in ath11k_mac_setup_ht_vht_cap()
3551 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; in ath11k_mac_setup_ht_vht_cap()
3555 band->ht_cap = ath11k_create_ht_cap(ar, ht_cap, in ath11k_mac_setup_ht_vht_cap()
3557 band->vht_cap = ath11k_create_vht_cap(ar, rate_cap_tx_chainmask, in ath11k_mac_setup_ht_vht_cap()
3562 static int ath11k_check_chain_mask(struct ath11k *ar, u32 ant, bool is_tx_ant) in ath11k_check_chain_mask() argument
3700 static int ath11k_mac_copy_he_cap(struct ath11k *ar, in ath11k_mac_copy_he_cap() argument
3736 he_cap_elem->phy_cap_info[4] |= (ar->num_tx_chains - 1) << 2; in ath11k_mac_copy_he_cap()
3742 he_cap_elem->phy_cap_info[5] |= ar->num_tx_chains - 1; in ath11k_mac_copy_he_cap()
3793 static void ath11k_mac_setup_he_cap(struct ath11k *ar, in ath11k_mac_setup_he_cap() argument
3800 count = ath11k_mac_copy_he_cap(ar, cap, in ath11k_mac_setup_he_cap()
3801 ar->mac.iftype[NL80211_BAND_2GHZ], in ath11k_mac_setup_he_cap()
3803 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; in ath11k_mac_setup_he_cap()
3804 band->iftype_data = ar->mac.iftype[NL80211_BAND_2GHZ]; in ath11k_mac_setup_he_cap()
3809 count = ath11k_mac_copy_he_cap(ar, cap, in ath11k_mac_setup_he_cap()
3810 ar->mac.iftype[NL80211_BAND_5GHZ], in ath11k_mac_setup_he_cap()
3812 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; in ath11k_mac_setup_he_cap()
3813 band->iftype_data = ar->mac.iftype[NL80211_BAND_5GHZ]; in ath11k_mac_setup_he_cap()
3818 ar->supports_6ghz) { in ath11k_mac_setup_he_cap()
3819 count = ath11k_mac_copy_he_cap(ar, cap, in ath11k_mac_setup_he_cap()
3820 ar->mac.iftype[NL80211_BAND_6GHZ], in ath11k_mac_setup_he_cap()
3822 band = &ar->mac.sbands[NL80211_BAND_6GHZ]; in ath11k_mac_setup_he_cap()
3823 band->iftype_data = ar->mac.iftype[NL80211_BAND_6GHZ]; in ath11k_mac_setup_he_cap()
3828 static int __ath11k_set_antenna(struct ath11k *ar, u32 tx_ant, u32 rx_ant) in __ath11k_set_antenna() argument
3832 lockdep_assert_held(&ar->conf_mutex); in __ath11k_set_antenna()
3834 if (ath11k_check_chain_mask(ar, tx_ant, true)) in __ath11k_set_antenna()
3837 if (ath11k_check_chain_mask(ar, rx_ant, false)) in __ath11k_set_antenna()
3840 ar->cfg_tx_chainmask = tx_ant; in __ath11k_set_antenna()
3841 ar->cfg_rx_chainmask = rx_ant; in __ath11k_set_antenna()
3843 if (ar->state != ATH11K_STATE_ON && in __ath11k_set_antenna()
3844 ar->state != ATH11K_STATE_RESTARTED) in __ath11k_set_antenna()
3847 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_TX_CHAIN_MASK, in __ath11k_set_antenna()
3848 tx_ant, ar->pdev->pdev_id); in __ath11k_set_antenna()
3850 ath11k_warn(ar->ab, "failed to set tx-chainmask: %d, req 0x%x\n", in __ath11k_set_antenna()
3855 ar->num_tx_chains = get_num_chains(tx_ant); in __ath11k_set_antenna()
3857 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RX_CHAIN_MASK, in __ath11k_set_antenna()
3858 rx_ant, ar->pdev->pdev_id); in __ath11k_set_antenna()
3860 ath11k_warn(ar->ab, "failed to set rx-chainmask: %d, req 0x%x\n", in __ath11k_set_antenna()
3865 ar->num_rx_chains = get_num_chains(rx_ant); in __ath11k_set_antenna()
3868 ath11k_mac_setup_ht_vht_cap(ar, &ar->pdev->cap, NULL); in __ath11k_set_antenna()
3869 ath11k_mac_setup_he_cap(ar, &ar->pdev->cap); in __ath11k_set_antenna()
3878 struct ath11k *ar = ctx; in ath11k_mac_tx_mgmt_pending_free() local
3879 struct ath11k_base *ab = ar->ab; in ath11k_mac_tx_mgmt_pending_free()
3881 spin_lock_bh(&ar->txmgmt_idr_lock); in ath11k_mac_tx_mgmt_pending_free()
3882 idr_remove(&ar->txmgmt_idr, buf_id); in ath11k_mac_tx_mgmt_pending_free()
3883 spin_unlock_bh(&ar->txmgmt_idr_lock); in ath11k_mac_tx_mgmt_pending_free()
3890 ieee80211_free_txskb(ar->hw, msdu); in ath11k_mac_tx_mgmt_pending_free()
3900 struct ath11k *ar = skb_cb->ar; in ath11k_mac_vif_txmgmt_idr_remove() local
3901 struct ath11k_base *ab = ar->ab; in ath11k_mac_vif_txmgmt_idr_remove()
3904 spin_lock_bh(&ar->txmgmt_idr_lock); in ath11k_mac_vif_txmgmt_idr_remove()
3905 idr_remove(&ar->txmgmt_idr, buf_id); in ath11k_mac_vif_txmgmt_idr_remove()
3906 spin_unlock_bh(&ar->txmgmt_idr_lock); in ath11k_mac_vif_txmgmt_idr_remove()
3914 static int ath11k_mac_mgmt_tx_wmi(struct ath11k *ar, struct ath11k_vif *arvif, in ath11k_mac_mgmt_tx_wmi() argument
3917 struct ath11k_base *ab = ar->ab; in ath11k_mac_mgmt_tx_wmi()
3924 spin_lock_bh(&ar->txmgmt_idr_lock); in ath11k_mac_mgmt_tx_wmi()
3925 buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0, in ath11k_mac_mgmt_tx_wmi()
3927 spin_unlock_bh(&ar->txmgmt_idr_lock); in ath11k_mac_mgmt_tx_wmi()
3950 ret = ath11k_wmi_mgmt_send(ar, arvif->vdev_id, buf_id, skb); in ath11k_mac_mgmt_tx_wmi()
3952 ath11k_warn(ar->ab, "failed to send mgmt frame: %d\n", ret); in ath11k_mac_mgmt_tx_wmi()
3962 spin_lock_bh(&ar->txmgmt_idr_lock); in ath11k_mac_mgmt_tx_wmi()
3963 idr_remove(&ar->txmgmt_idr, buf_id); in ath11k_mac_mgmt_tx_wmi()
3964 spin_unlock_bh(&ar->txmgmt_idr_lock); in ath11k_mac_mgmt_tx_wmi()
3969 static void ath11k_mgmt_over_wmi_tx_purge(struct ath11k *ar) in ath11k_mgmt_over_wmi_tx_purge() argument
3973 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) in ath11k_mgmt_over_wmi_tx_purge()
3974 ieee80211_free_txskb(ar->hw, skb); in ath11k_mgmt_over_wmi_tx_purge()
3979 struct ath11k *ar = container_of(work, struct ath11k, wmi_mgmt_tx_work); in ath11k_mgmt_over_wmi_tx_work() local
3985 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) { in ath11k_mgmt_over_wmi_tx_work()
3988 ath11k_warn(ar->ab, "no vif found for mgmt frame, flags 0x%x\n", in ath11k_mgmt_over_wmi_tx_work()
3990 ieee80211_free_txskb(ar->hw, skb); in ath11k_mgmt_over_wmi_tx_work()
3995 if (ar->allocated_vdev_map & (1LL << arvif->vdev_id) && in ath11k_mgmt_over_wmi_tx_work()
3997 ret = ath11k_mac_mgmt_tx_wmi(ar, arvif, skb); in ath11k_mgmt_over_wmi_tx_work()
3999 ath11k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n", in ath11k_mgmt_over_wmi_tx_work()
4001 ieee80211_free_txskb(ar->hw, skb); in ath11k_mgmt_over_wmi_tx_work()
4003 atomic_inc(&ar->num_pending_mgmt_tx); in ath11k_mgmt_over_wmi_tx_work()
4006 ath11k_warn(ar->ab, in ath11k_mgmt_over_wmi_tx_work()
4010 ieee80211_free_txskb(ar->hw, skb); in ath11k_mgmt_over_wmi_tx_work()
4015 static int ath11k_mac_mgmt_tx(struct ath11k *ar, struct sk_buff *skb, in ath11k_mac_mgmt_tx() argument
4018 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue; in ath11k_mac_mgmt_tx()
4020 if (test_bit(ATH11K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags)) in ath11k_mac_mgmt_tx()
4029 atomic_read(&ar->num_pending_mgmt_tx) > ATH11K_PRB_RSP_DROP_THRESHOLD) { in ath11k_mac_mgmt_tx()
4030 ath11k_warn(ar->ab, in ath11k_mac_mgmt_tx()
4036 ath11k_warn(ar->ab, "mgmt tx queue is full\n"); in ath11k_mac_mgmt_tx()
4041 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work); in ath11k_mac_mgmt_tx()
4051 struct ath11k *ar = hw->priv; in ath11k_mac_op_tx() local
4063 ret = ath11k_mac_mgmt_tx(ar, skb, is_prb_rsp); in ath11k_mac_op_tx()
4065 ath11k_warn(ar->ab, "failed to queue management frame %d\n", in ath11k_mac_op_tx()
4067 ieee80211_free_txskb(ar->hw, skb); in ath11k_mac_op_tx()
4072 ret = ath11k_dp_tx(ar, arvif, skb); in ath11k_mac_op_tx()
4074 ath11k_warn(ar->ab, "failed to transmit frame %d\n", ret); in ath11k_mac_op_tx()
4075 ieee80211_free_txskb(ar->hw, skb); in ath11k_mac_op_tx()
4079 void ath11k_mac_drain_tx(struct ath11k *ar) in ath11k_mac_drain_tx() argument
4084 cancel_work_sync(&ar->wmi_mgmt_tx_work); in ath11k_mac_drain_tx()
4085 ath11k_mgmt_over_wmi_tx_purge(ar); in ath11k_mac_drain_tx()
4088 static int ath11k_mac_config_mon_status_default(struct ath11k *ar, bool enable) in ath11k_mac_config_mon_status_default() argument
4091 struct ath11k_base *ab = ar->ab; in ath11k_mac_config_mon_status_default()
4097 tlv_filter.rx_filter = ath11k_debugfs_rx_filter(ar); in ath11k_mac_config_mon_status_default()
4101 ring_id = ar->dp.rx_mon_status_refill_ring[i].refill_buf_ring.ring_id; in ath11k_mac_config_mon_status_default()
4102 ret = ath11k_dp_tx_htt_rx_filter_setup(ar->ab, ring_id, in ath11k_mac_config_mon_status_default()
4103 ar->dp.mac_id + i, in ath11k_mac_config_mon_status_default()
4114 struct ath11k *ar = hw->priv; in ath11k_mac_op_start() local
4115 struct ath11k_base *ab = ar->ab; in ath11k_mac_op_start()
4116 struct ath11k_pdev *pdev = ar->pdev; in ath11k_mac_op_start()
4119 ath11k_mac_drain_tx(ar); in ath11k_mac_op_start()
4120 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_start()
4122 switch (ar->state) { in ath11k_mac_op_start()
4124 ar->state = ATH11K_STATE_ON; in ath11k_mac_op_start()
4127 ar->state = ATH11K_STATE_RESTARTED; in ath11k_mac_op_start()
4137 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS, in ath11k_mac_op_start()
4141 ath11k_err(ar->ab, "failed to enable PMF QOS: (%d\n", ret); in ath11k_mac_op_start()
4145 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_DYNAMIC_BW, 1, in ath11k_mac_op_start()
4148 ath11k_err(ar->ab, "failed to enable dynamic bw: %d\n", ret); in ath11k_mac_op_start()
4152 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_ARP_AC_OVERRIDE, in ath11k_mac_op_start()
4160 ret = ath11k_wmi_send_dfs_phyerr_offload_enable_cmd(ar, pdev->pdev_id); in ath11k_mac_op_start()
4167 ret = ath11k_dp_tx_htt_h2t_ppdu_stats_req(ar, in ath11k_mac_op_start()
4174 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_MESH_MCAST_ENABLE, in ath11k_mac_op_start()
4178 ath11k_err(ar->ab, "failed to enable MESH MCAST ENABLE: (%d\n", ret); in ath11k_mac_op_start()
4182 __ath11k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask); in ath11k_mac_op_start()
4186 ath11k_reg_update_chan_list(ar); in ath11k_mac_op_start()
4188 ar->num_started_vdevs = 0; in ath11k_mac_op_start()
4189 ar->num_created_vdevs = 0; in ath11k_mac_op_start()
4190 ar->num_peers = 0; in ath11k_mac_op_start()
4191 ar->allocated_vdev_map = 0; in ath11k_mac_op_start()
4196 ret = ath11k_mac_config_mon_status_default(ar, true); in ath11k_mac_op_start()
4204 ath11k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id); in ath11k_mac_op_start()
4206 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_start()
4208 rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx], in ath11k_mac_op_start()
4209 &ab->pdevs[ar->pdev_idx]); in ath11k_mac_op_start()
4213 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_IDLE_PS_CONFIG, in ath11k_mac_op_start()
4223 ar->state = ATH11K_STATE_OFF; in ath11k_mac_op_start()
4224 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_start()
4231 struct ath11k *ar = hw->priv; in ath11k_mac_op_stop() local
4235 ath11k_mac_drain_tx(ar); in ath11k_mac_op_stop()
4237 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_stop()
4238 ret = ath11k_mac_config_mon_status_default(ar, false); in ath11k_mac_op_stop()
4240 ath11k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n", in ath11k_mac_op_stop()
4243 clear_bit(ATH11K_CAC_RUNNING, &ar->dev_flags); in ath11k_mac_op_stop()
4244 ar->state = ATH11K_STATE_OFF; in ath11k_mac_op_stop()
4245 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_stop()
4247 cancel_delayed_work_sync(&ar->scan.timeout); in ath11k_mac_op_stop()
4248 cancel_work_sync(&ar->regd_update_work); in ath11k_mac_op_stop()
4250 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_stop()
4251 list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, list) { in ath11k_mac_op_stop()
4255 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_stop()
4257 rcu_assign_pointer(ar->ab->pdevs_active[ar->pdev_idx], NULL); in ath11k_mac_op_stop()
4261 atomic_set(&ar->num_pending_mgmt_tx, 0); in ath11k_mac_op_stop()
4268 struct ath11k *ar = arvif->ar; in ath11k_mac_setup_vdev_create_params() local
4269 struct ath11k_pdev *pdev = ar->pdev; in ath11k_mac_setup_vdev_create_params()
4277 params->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains; in ath11k_mac_setup_vdev_create_params()
4278 params->chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains; in ath11k_mac_setup_vdev_create_params()
4281 params->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains; in ath11k_mac_setup_vdev_create_params()
4282 params->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains; in ath11k_mac_setup_vdev_create_params()
4285 ar->supports_6ghz) { in ath11k_mac_setup_vdev_create_params()
4286 params->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains; in ath11k_mac_setup_vdev_create_params()
4287 params->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains; in ath11k_mac_setup_vdev_create_params()
4323 static int ath11k_set_he_mu_sounding_mode(struct ath11k *ar, in ath11k_set_he_mu_sounding_mode() argument
4327 struct ath11k_base *ab = ar->ab; in ath11k_set_he_mu_sounding_mode()
4331 param_value = ath11k_mac_prepare_he_mode(ar->pdev, arvif->vif->type); in ath11k_set_he_mu_sounding_mode()
4332 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_set_he_mu_sounding_mode()
4344 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_set_he_mu_sounding_mode()
4357 struct ath11k *ar = hw->priv; in ath11k_mac_op_update_vif_offload() local
4358 struct ath11k_base *ab = ar->ab; in ath11k_mac_op_update_vif_offload()
4376 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_update_vif_offload()
4388 struct ath11k *ar = hw->priv; in ath11k_mac_op_add_interface() local
4389 struct ath11k_base *ab = ar->ab; in ath11k_mac_op_add_interface()
4401 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_add_interface()
4404 ar->num_peers > (ar->max_num_peers - 1)) { in ath11k_mac_op_add_interface()
4410 if (ar->num_created_vdevs > (TARGET_NUM_VDEVS - 1)) { in ath11k_mac_op_add_interface()
4419 arvif->ar = ar; in ath11k_mac_op_add_interface()
4460 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()
4470 ret = ath11k_wmi_vdev_create(ar, vif->addr, &vdev_param); in ath11k_mac_op_add_interface()
4477 ar->num_created_vdevs++; in ath11k_mac_op_add_interface()
4480 ar->allocated_vdev_map |= 1LL << arvif->vdev_id; in ath11k_mac_op_add_interface()
4483 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_add_interface()
4484 list_add(&arvif->list, &ar->arvifs); in ath11k_mac_op_add_interface()
4485 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_add_interface()
4489 nss = get_num_chains(ar->cfg_tx_chainmask) ? : 1; in ath11k_mac_op_add_interface()
4490 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_add_interface()
4494 arvif->vdev_id, ar->cfg_tx_chainmask, nss, ret); in ath11k_mac_op_add_interface()
4503 ret = ath11k_peer_create(ar, arvif, NULL, &peer_param); in ath11k_mac_op_add_interface()
4512 ath11k_warn(ar->ab, "failed to set vdev %i kickout parameters: %d\n", in ath11k_mac_op_add_interface()
4520 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath11k_mac_op_add_interface()
4523 ath11k_warn(ar->ab, "failed to set vdev %d RX wake policy: %d\n", in ath11k_mac_op_add_interface()
4530 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath11k_mac_op_add_interface()
4533 ath11k_warn(ar->ab, "failed to set vdev %d TX wake threshold: %d\n", in ath11k_mac_op_add_interface()
4540 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id, in ath11k_mac_op_add_interface()
4543 ath11k_warn(ar->ab, "failed to set vdev %d pspoll count: %d\n", in ath11k_mac_op_add_interface()
4548 ret = ath11k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, false); in ath11k_mac_op_add_interface()
4550 ath11k_warn(ar->ab, "failed to disable vdev %d ps mode: %d\n", in ath11k_mac_op_add_interface()
4560 ret = ath11k_mac_txpower_recalc(ar); in ath11k_mac_op_add_interface()
4565 param_value = ar->hw->wiphy->rts_threshold; in ath11k_mac_op_add_interface()
4566 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_op_add_interface()
4569 ath11k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n", in ath11k_mac_op_add_interface()
4573 ath11k_dp_vdev_tx_attach(ar, arvif); in ath11k_mac_op_add_interface()
4575 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_add_interface()
4581 ar->num_peers--; in ath11k_mac_op_add_interface()
4582 ath11k_wmi_send_peer_delete_cmd(ar, vif->addr, arvif->vdev_id); in ath11k_mac_op_add_interface()
4586 ath11k_wmi_vdev_delete(ar, arvif->vdev_id); in ath11k_mac_op_add_interface()
4587 ar->num_created_vdevs--; in ath11k_mac_op_add_interface()
4588 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id); in ath11k_mac_op_add_interface()
4590 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_add_interface()
4592 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_add_interface()
4595 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_add_interface()
4614 struct ath11k *ar = hw->priv; in ath11k_mac_op_remove_interface() local
4616 struct ath11k_base *ab = ar->ab; in ath11k_mac_op_remove_interface()
4620 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_remove_interface()
4625 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_remove_interface()
4627 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_remove_interface()
4630 ret = ath11k_peer_delete(ar, arvif->vdev_id, vif->addr); in ath11k_mac_op_remove_interface()
4636 ret = ath11k_wmi_vdev_delete(ar, arvif->vdev_id); in ath11k_mac_op_remove_interface()
4641 ar->num_created_vdevs--; in ath11k_mac_op_remove_interface()
4644 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id); in ath11k_mac_op_remove_interface()
4647 ath11k_peer_cleanup(ar, arvif->vdev_id); in ath11k_mac_op_remove_interface()
4649 idr_for_each(&ar->txmgmt_idr, in ath11k_mac_op_remove_interface()
4660 ath11k_mac_txpower_recalc(ar); in ath11k_mac_op_remove_interface()
4661 clear_bit(ATH11K_FLAG_MONITOR_ENABLED, &ar->monitor_flags); in ath11k_mac_op_remove_interface()
4665 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_remove_interface()
4683 struct ath11k *ar = hw->priv; in ath11k_mac_op_configure_filter() local
4687 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_configure_filter()
4691 ar->filter_flags = *total_flags; in ath11k_mac_op_configure_filter()
4694 reset_flag = !(ar->filter_flags & FIF_BCN_PRBRESP_PROMISC); in ath11k_mac_op_configure_filter()
4696 ret = ath11k_dp_tx_htt_monitor_mode_ring_config(ar, reset_flag); in ath11k_mac_op_configure_filter()
4699 set_bit(ATH11K_FLAG_MONITOR_ENABLED, &ar->monitor_flags); in ath11k_mac_op_configure_filter()
4701 clear_bit(ATH11K_FLAG_MONITOR_ENABLED, &ar->monitor_flags); in ath11k_mac_op_configure_filter()
4703 ath11k_warn(ar->ab, in ath11k_mac_op_configure_filter()
4706 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_op_configure_filter()
4710 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_configure_filter()
4715 struct ath11k *ar = hw->priv; in ath11k_mac_op_get_antenna() local
4717 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_get_antenna()
4719 *tx_ant = ar->cfg_tx_chainmask; in ath11k_mac_op_get_antenna()
4720 *rx_ant = ar->cfg_rx_chainmask; in ath11k_mac_op_get_antenna()
4722 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_get_antenna()
4729 struct ath11k *ar = hw->priv; in ath11k_mac_op_set_antenna() local
4732 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_set_antenna()
4733 ret = __ath11k_set_antenna(ar, tx_ant, rx_ant); in ath11k_mac_op_set_antenna()
4734 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_set_antenna()
4743 struct ath11k *ar = hw->priv; in ath11k_mac_op_ampdu_action() local
4746 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_ampdu_action()
4750 ret = ath11k_dp_rx_ampdu_start(ar, params); in ath11k_mac_op_ampdu_action()
4753 ret = ath11k_dp_rx_ampdu_stop(ar, params); in ath11k_mac_op_ampdu_action()
4767 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_ampdu_action()
4775 struct ath11k *ar = hw->priv; in ath11k_mac_op_add_chanctx() local
4776 struct ath11k_base *ab = ar->ab; in ath11k_mac_op_add_chanctx()
4782 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_add_chanctx()
4784 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_add_chanctx()
4788 ar->rx_channel = ctx->def.chan; in ath11k_mac_op_add_chanctx()
4789 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_add_chanctx()
4791 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_add_chanctx()
4799 struct ath11k *ar = hw->priv; in ath11k_mac_op_remove_chanctx() local
4800 struct ath11k_base *ab = ar->ab; in ath11k_mac_op_remove_chanctx()
4806 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_remove_chanctx()
4808 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_remove_chanctx()
4812 ar->rx_channel = NULL; in ath11k_mac_op_remove_chanctx()
4813 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_remove_chanctx()
4815 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_remove_chanctx()
4818 static inline int ath11k_mac_vdev_setup_sync(struct ath11k *ar) in ath11k_mac_vdev_setup_sync() argument
4820 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_vdev_setup_sync()
4822 if (test_bit(ATH11K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags)) in ath11k_mac_vdev_setup_sync()
4825 if (!wait_for_completion_timeout(&ar->vdev_setup_done, in ath11k_mac_vdev_setup_sync()
4829 return ar->last_wmi_vdev_start_status ? -EINVAL : 0; in ath11k_mac_vdev_setup_sync()
4837 struct ath11k *ar = arvif->ar; in ath11k_mac_vdev_start_restart() local
4838 struct ath11k_base *ab = ar->ab; in ath11k_mac_vdev_start_restart()
4843 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_vdev_start_restart()
4845 reinit_completion(&ar->vdev_setup_done); in ath11k_mac_vdev_start_restart()
4862 arg.pref_tx_streams = ar->num_tx_chains; in ath11k_mac_vdev_start_restart()
4863 arg.pref_rx_streams = ar->num_rx_chains; in ath11k_mac_vdev_start_restart()
4877 arg.regdomain = ar->ab->dfs_region; in ath11k_mac_vdev_start_restart()
4882 ret = ath11k_set_he_mu_sounding_mode(ar, arvif); in ath11k_mac_vdev_start_restart()
4884 ath11k_warn(ar->ab, "failed to set he mode vdev %i\n", in ath11k_mac_vdev_start_restart()
4898 ret = ath11k_wmi_vdev_start(ar, &arg, restart); in ath11k_mac_vdev_start_restart()
4900 ath11k_warn(ar->ab, "failed to %s WMI vdev %i\n", in ath11k_mac_vdev_start_restart()
4905 ret = ath11k_mac_vdev_setup_sync(ar); in ath11k_mac_vdev_start_restart()
4912 ar->num_started_vdevs++; in ath11k_mac_vdev_start_restart()
4926 set_bit(ATH11K_CAC_RUNNING, &ar->dev_flags); in ath11k_mac_vdev_start_restart()
4942 struct ath11k *ar = arvif->ar; in ath11k_mac_vdev_stop() local
4945 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_vdev_stop()
4947 reinit_completion(&ar->vdev_setup_done); in ath11k_mac_vdev_stop()
4949 spin_lock_bh(&ar->data_lock); in ath11k_mac_vdev_stop()
4951 ar->vdev_stop_status.stop_in_progress = true; in ath11k_mac_vdev_stop()
4952 ar->vdev_stop_status.vdev_id = arvif->vdev_id; in ath11k_mac_vdev_stop()
4954 spin_unlock_bh(&ar->data_lock); in ath11k_mac_vdev_stop()
4956 ret = ath11k_wmi_vdev_stop(ar, arvif->vdev_id); in ath11k_mac_vdev_stop()
4958 ath11k_warn(ar->ab, "failed to stop WMI vdev %i: %d\n", in ath11k_mac_vdev_stop()
4963 ret = ath11k_mac_vdev_setup_sync(ar); in ath11k_mac_vdev_stop()
4965 ath11k_warn(ar->ab, "failed to synchronize setup for vdev %i: %d\n", in ath11k_mac_vdev_stop()
4970 WARN_ON(ar->num_started_vdevs == 0); in ath11k_mac_vdev_stop()
4972 ar->num_started_vdevs--; in ath11k_mac_vdev_stop()
4973 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %pM stopped, vdev_id %d\n", in ath11k_mac_vdev_stop()
4976 if (test_bit(ATH11K_CAC_RUNNING, &ar->dev_flags)) { in ath11k_mac_vdev_stop()
4977 clear_bit(ATH11K_CAC_RUNNING, &ar->dev_flags); in ath11k_mac_vdev_stop()
4978 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "CAC Stopped for vdev %d\n", in ath11k_mac_vdev_stop()
4984 spin_lock_bh(&ar->data_lock); in ath11k_mac_vdev_stop()
4985 ar->vdev_stop_status.stop_in_progress = false; in ath11k_mac_vdev_stop()
4986 spin_unlock_bh(&ar->data_lock); in ath11k_mac_vdev_stop()
5043 ath11k_mac_update_vif_chan(struct ath11k *ar, in ath11k_mac_update_vif_chan() argument
5047 struct ath11k_base *ab = ar->ab; in ath11k_mac_update_vif_chan()
5052 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_update_vif_chan()
5071 ret = ath11k_wmi_vdev_down(ar, arvif->vdev_id); in ath11k_mac_update_vif_chan()
5106 ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, in ath11k_mac_update_vif_chan()
5117 ath11k_mac_update_active_vif_chan(struct ath11k *ar, in ath11k_mac_update_active_vif_chan() argument
5122 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_update_active_vif_chan()
5124 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath11k_mac_update_active_vif_chan()
5135 ieee80211_iterate_active_interfaces_atomic(ar->hw, in ath11k_mac_update_active_vif_chan()
5140 ath11k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs); in ath11k_mac_update_active_vif_chan()
5149 struct ath11k *ar = hw->priv; in ath11k_mac_op_change_chanctx() local
5150 struct ath11k_base *ab = ar->ab; in ath11k_mac_op_change_chanctx()
5152 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_change_chanctx()
5165 ath11k_mac_update_active_vif_chan(ar, ctx); in ath11k_mac_op_change_chanctx()
5170 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_change_chanctx()
5176 struct ath11k *ar = hw->priv; in ath11k_start_vdev_delay() local
5177 struct ath11k_base *ab = ar->ab; in ath11k_start_vdev_delay()
5193 ret = ath11k_monitor_vdev_up(ar, arvif->vdev_id); in ath11k_start_vdev_delay()
5211 struct ath11k *ar = hw->priv; in ath11k_mac_op_assign_vif_chanctx() local
5212 struct ath11k_base *ab = ar->ab; in ath11k_mac_op_assign_vif_chanctx()
5217 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_assign_vif_chanctx()
5228 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_assign_vif_chanctx()
5233 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_assign_vif_chanctx()
5240 param.peer_addr = ar->mac_addr; in ath11k_mac_op_assign_vif_chanctx()
5241 ret = ath11k_peer_create(ar, arvif, NULL, ¶m); in ath11k_mac_op_assign_vif_chanctx()
5252 ret = ath11k_monitor_vdev_up(ar, arvif->vdev_id); in ath11k_mac_op_assign_vif_chanctx()
5261 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_assign_vif_chanctx()
5266 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_assign_vif_chanctx()
5276 struct ath11k *ar = hw->priv; in ath11k_mac_op_unassign_vif_chanctx() local
5277 struct ath11k_base *ab = ar->ab; in ath11k_mac_op_unassign_vif_chanctx()
5281 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_unassign_vif_chanctx()
5291 ath11k_peer_find_by_addr(ab, ar->mac_addr)) in ath11k_mac_op_unassign_vif_chanctx()
5292 ath11k_peer_delete(ar, arvif->vdev_id, ar->mac_addr); in ath11k_mac_op_unassign_vif_chanctx()
5303 ath11k_wmi_vdev_down(ar, arvif->vdev_id); in ath11k_mac_op_unassign_vif_chanctx()
5305 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_unassign_vif_chanctx()
5314 struct ath11k *ar = hw->priv; in ath11k_mac_op_switch_vif_chanctx() local
5316 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_switch_vif_chanctx()
5318 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_op_switch_vif_chanctx()
5321 ath11k_mac_update_vif_chan(ar, vifs, n_vifs); in ath11k_mac_op_switch_vif_chanctx()
5323 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_switch_vif_chanctx()
5329 ath11k_set_vdev_param_to_all_vifs(struct ath11k *ar, int param, u32 value) in ath11k_set_vdev_param_to_all_vifs() argument
5334 mutex_lock(&ar->conf_mutex); in ath11k_set_vdev_param_to_all_vifs()
5335 list_for_each_entry(arvif, &ar->arvifs, list) { in ath11k_set_vdev_param_to_all_vifs()
5336 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "setting mac vdev %d param %d value %d\n", in ath11k_set_vdev_param_to_all_vifs()
5339 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_set_vdev_param_to_all_vifs()
5342 ath11k_warn(ar->ab, "failed to set param %d for vdev %d: %d\n", in ath11k_set_vdev_param_to_all_vifs()
5347 mutex_unlock(&ar->conf_mutex); in ath11k_set_vdev_param_to_all_vifs()
5356 struct ath11k *ar = hw->priv; in ath11k_mac_op_set_rts_threshold() local
5359 return ath11k_set_vdev_param_to_all_vifs(ar, param_id, value); in ath11k_mac_op_set_rts_threshold()
5380 struct ath11k *ar = hw->priv; in ath11k_mac_op_flush() local
5386 time_left = wait_event_timeout(ar->dp.tx_empty_waitq, in ath11k_mac_op_flush()
5387 (atomic_read(&ar->dp.num_tx_pending) == 0), in ath11k_mac_op_flush()
5390 ath11k_warn(ar->ab, "failed to flush transmit queue %ld\n", time_left); in ath11k_mac_op_flush()
5394 ath11k_mac_bitrate_mask_num_ht_rates(struct ath11k *ar, in ath11k_mac_bitrate_mask_num_ht_rates() argument
5408 ath11k_mac_has_single_legacy_rate(struct ath11k *ar, in ath11k_mac_has_single_legacy_rate() argument
5416 if (ath11k_mac_bitrate_mask_num_ht_rates(ar, band, mask)) in ath11k_mac_has_single_legacy_rate()
5419 if (ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask)) in ath11k_mac_has_single_legacy_rate()
5426 ath11k_mac_bitrate_mask_get_single_nss(struct ath11k *ar, in ath11k_mac_bitrate_mask_get_single_nss() argument
5431 struct ieee80211_supported_band *sband = &ar->mac.sbands[band]; in ath11k_mac_bitrate_mask_get_single_nss()
5476 ath11k_mac_get_single_legacy_rate(struct ath11k *ar, in ath11k_mac_get_single_legacy_rate() argument
5511 struct ath11k *ar = arvif->ar; in ath11k_mac_set_fixed_rate_params() local
5515 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_set_fixed_rate_params()
5517 …ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac set fixed rate params vdev %i rate 0x%02hhx nss %hhu sgi %… in ath11k_mac_set_fixed_rate_params()
5521 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_set_fixed_rate_params()
5524 ath11k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n", in ath11k_mac_set_fixed_rate_params()
5530 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_set_fixed_rate_params()
5533 ath11k_warn(ar->ab, "failed to set nss param %d: %d\n", in ath11k_mac_set_fixed_rate_params()
5539 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_set_fixed_rate_params()
5542 ath11k_warn(ar->ab, "failed to set sgi param %d: %d\n", in ath11k_mac_set_fixed_rate_params()
5548 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, in ath11k_mac_set_fixed_rate_params()
5551 ath11k_warn(ar->ab, "failed to set ldpc param %d: %d\n", in ath11k_mac_set_fixed_rate_params()
5560 ath11k_mac_vht_mcs_range_present(struct ath11k *ar, in ath11k_mac_vht_mcs_range_present() argument
5589 struct ath11k *ar = arvif->ar; in ath11k_mac_set_bitrate_mask_iter() local
5591 spin_lock_bh(&ar->data_lock); in ath11k_mac_set_bitrate_mask_iter()
5593 spin_unlock_bh(&ar->data_lock); in ath11k_mac_set_bitrate_mask_iter()
5595 ieee80211_queue_work(ar->hw, &arsta->update_wk); in ath11k_mac_set_bitrate_mask_iter()
5602 struct ath11k *ar = arvif->ar; in ath11k_mac_disable_peer_fixed_rate() local
5605 ret = ath11k_wmi_set_peer_param(ar, sta->addr, in ath11k_mac_disable_peer_fixed_rate()
5610 ath11k_warn(ar->ab, in ath11k_mac_disable_peer_fixed_rate()
5622 struct ath11k *ar = arvif->ar; in ath11k_mac_op_set_bitrate_mask() local
5640 ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC); in ath11k_mac_op_set_bitrate_mask()
5654 if (ath11k_mac_has_single_legacy_rate(ar, band, mask)) { in ath11k_mac_op_set_bitrate_mask()
5655 ret = ath11k_mac_get_single_legacy_rate(ar, band, mask, &rate, in ath11k_mac_op_set_bitrate_mask()
5658 ath11k_warn(ar->ab, "failed to get single legacy rate for vdev %i: %d\n", in ath11k_mac_op_set_bitrate_mask()
5662 ieee80211_iterate_stations_atomic(ar->hw, in ath11k_mac_op_set_bitrate_mask()
5665 } else if (ath11k_mac_bitrate_mask_get_single_nss(ar, band, mask, in ath11k_mac_op_set_bitrate_mask()
5671 nss = min_t(u32, ar->num_tx_chains, in ath11k_mac_op_set_bitrate_mask()
5695 num_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band, in ath11k_mac_op_set_bitrate_mask()
5698 if (!ath11k_mac_vht_mcs_range_present(ar, band, mask) && in ath11k_mac_op_set_bitrate_mask()
5703 ath11k_warn(ar->ab, in ath11k_mac_op_set_bitrate_mask()
5708 ieee80211_iterate_stations_atomic(ar->hw, in ath11k_mac_op_set_bitrate_mask()
5712 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_set_bitrate_mask()
5715 ieee80211_iterate_stations_atomic(ar->hw, in ath11k_mac_op_set_bitrate_mask()
5719 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_set_bitrate_mask()
5722 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_set_bitrate_mask()
5726 ath11k_warn(ar->ab, "failed to set fixed rate params on vdev %i: %d\n", in ath11k_mac_op_set_bitrate_mask()
5730 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_set_bitrate_mask()
5739 struct ath11k *ar = hw->priv; in ath11k_mac_op_reconfig_complete() local
5744 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_reconfig_complete()
5746 if (ar->state == ATH11K_STATE_RESTARTED) { in ath11k_mac_op_reconfig_complete()
5747 ath11k_warn(ar->ab, "pdev %d successfully recovered\n", in ath11k_mac_op_reconfig_complete()
5748 ar->pdev->pdev_id); in ath11k_mac_op_reconfig_complete()
5749 ar->state = ATH11K_STATE_ON; in ath11k_mac_op_reconfig_complete()
5750 ieee80211_wake_queues(ar->hw); in ath11k_mac_op_reconfig_complete()
5753 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_reconfig_complete()
5757 ath11k_mac_update_bss_chan_survey(struct ath11k *ar, in ath11k_mac_update_bss_chan_survey() argument
5763 lockdep_assert_held(&ar->conf_mutex); in ath11k_mac_update_bss_chan_survey()
5765 if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) || in ath11k_mac_update_bss_chan_survey()
5766 ar->rx_channel != channel) in ath11k_mac_update_bss_chan_survey()
5769 if (ar->scan.state != ATH11K_SCAN_IDLE) { in ath11k_mac_update_bss_chan_survey()
5770 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, in ath11k_mac_update_bss_chan_survey()
5775 reinit_completion(&ar->bss_survey_done); in ath11k_mac_update_bss_chan_survey()
5777 ret = ath11k_wmi_pdev_bss_chan_info_request(ar, type); in ath11k_mac_update_bss_chan_survey()
5779 ath11k_warn(ar->ab, "failed to send pdev bss chan info request\n"); in ath11k_mac_update_bss_chan_survey()
5783 ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ); in ath11k_mac_update_bss_chan_survey()
5785 ath11k_warn(ar->ab, "bss channel survey timed out\n"); in ath11k_mac_update_bss_chan_survey()
5791 struct ath11k *ar = hw->priv; in ath11k_mac_op_get_survey() local
5799 ar_survey = &ar->survey[idx]; in ath11k_mac_op_get_survey()
5801 mutex_lock(&ar->conf_mutex); in ath11k_mac_op_get_survey()
5817 ath11k_mac_update_bss_chan_survey(ar, &sband->channels[idx]); in ath11k_mac_op_get_survey()
5819 spin_lock_bh(&ar->data_lock); in ath11k_mac_op_get_survey()
5821 spin_unlock_bh(&ar->data_lock); in ath11k_mac_op_get_survey()
5825 if (ar->rx_channel == survey->channel) in ath11k_mac_op_get_survey()
5829 mutex_unlock(&ar->conf_mutex); in ath11k_mac_op_get_survey()
5905 static void ath11k_mac_update_ch_list(struct ath11k *ar, in ath11k_mac_update_ch_list() argument
5921 static u32 ath11k_get_phy_id(struct ath11k *ar, u32 band) in ath11k_get_phy_id() argument
5923 struct ath11k_pdev *pdev = ar->pdev; in ath11k_get_phy_id()
5932 ath11k_warn(ar->ab, "unsupported phy cap:%d\n", band); in ath11k_get_phy_id()
5937 static int ath11k_mac_setup_channels_rates(struct ath11k *ar, in ath11k_mac_setup_channels_rates() argument
5950 reg_cap = &ar->ab->hal_reg_cap[ar->pdev_idx]; in ath11k_mac_setup_channels_rates()
5959 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; in ath11k_mac_setup_channels_rates()
5965 ar->hw->wiphy->bands[NL80211_BAND_2GHZ] = band; in ath11k_mac_setup_channels_rates()
5967 if (ar->ab->hw_params.single_pdev_only) { in ath11k_mac_setup_channels_rates()
5968 phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_2G_CAP); in ath11k_mac_setup_channels_rates()
5969 reg_cap = &ar->ab->hal_reg_cap[phy_id]; in ath11k_mac_setup_channels_rates()
5971 ath11k_mac_update_ch_list(ar, band, in ath11k_mac_setup_channels_rates()
5981 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in ath11k_mac_setup_channels_rates()
5985 ar->supports_6ghz = true; in ath11k_mac_setup_channels_rates()
5986 band = &ar->mac.sbands[NL80211_BAND_6GHZ]; in ath11k_mac_setup_channels_rates()
5992 ar->hw->wiphy->bands[NL80211_BAND_6GHZ] = band; in ath11k_mac_setup_channels_rates()
5993 ath11k_mac_update_ch_list(ar, band, in ath11k_mac_setup_channels_rates()
6003 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in ath11k_mac_setup_channels_rates()
6004 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); in ath11k_mac_setup_channels_rates()
6008 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; in ath11k_mac_setup_channels_rates()
6014 ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = band; in ath11k_mac_setup_channels_rates()
6016 if (ar->ab->hw_params.single_pdev_only) { in ath11k_mac_setup_channels_rates()
6017 phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_5G_CAP); in ath11k_mac_setup_channels_rates()
6018 reg_cap = &ar->ab->hal_reg_cap[phy_id]; in ath11k_mac_setup_channels_rates()
6021 ath11k_mac_update_ch_list(ar, band, in ath11k_mac_setup_channels_rates()
6030 static int ath11k_mac_setup_iface_combinations(struct ath11k *ar) in ath11k_mac_setup_iface_combinations() argument
6032 struct ath11k_base *ab = ar->ab; in ath11k_mac_setup_iface_combinations()
6070 ar->hw->wiphy->iface_combinations = combinations; in ath11k_mac_setup_iface_combinations()
6071 ar->hw->wiphy->n_iface_combinations = 1; in ath11k_mac_setup_iface_combinations()
6113 static void __ath11k_mac_unregister(struct ath11k *ar) in __ath11k_mac_unregister() argument
6115 cancel_work_sync(&ar->regd_update_work); in __ath11k_mac_unregister()
6117 ieee80211_unregister_hw(ar->hw); in __ath11k_mac_unregister()
6119 idr_for_each(&ar->txmgmt_idr, ath11k_mac_tx_mgmt_pending_free, ar); in __ath11k_mac_unregister()
6120 idr_destroy(&ar->txmgmt_idr); in __ath11k_mac_unregister()
6122 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in __ath11k_mac_unregister()
6123 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels); in __ath11k_mac_unregister()
6124 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); in __ath11k_mac_unregister()
6126 kfree(ar->hw->wiphy->iface_combinations[0].limits); in __ath11k_mac_unregister()
6127 kfree(ar->hw->wiphy->iface_combinations); in __ath11k_mac_unregister()
6129 SET_IEEE80211_DEV(ar->hw, NULL); in __ath11k_mac_unregister()
6134 struct ath11k *ar; in ath11k_mac_unregister() local
6140 ar = pdev->ar; in ath11k_mac_unregister()
6141 if (!ar) in ath11k_mac_unregister()
6144 __ath11k_mac_unregister(ar); in ath11k_mac_unregister()
6148 static int __ath11k_mac_register(struct ath11k *ar) in __ath11k_mac_register() argument
6150 struct ath11k_base *ab = ar->ab; in __ath11k_mac_register()
6151 struct ath11k_pdev_cap *cap = &ar->pdev->cap; in __ath11k_mac_register()
6166 ath11k_pdev_caps_update(ar); in __ath11k_mac_register()
6168 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr); in __ath11k_mac_register()
6170 SET_IEEE80211_DEV(ar->hw, ab->dev); in __ath11k_mac_register()
6172 ret = ath11k_mac_setup_channels_rates(ar, in __ath11k_mac_register()
6177 ath11k_mac_setup_ht_vht_cap(ar, cap, &ht_cap); in __ath11k_mac_register()
6178 ath11k_mac_setup_he_cap(ar, cap); in __ath11k_mac_register()
6180 ret = ath11k_mac_setup_iface_combinations(ar); in __ath11k_mac_register()
6182 ath11k_err(ar->ab, "failed to setup interface combinations: %d\n", ret); in __ath11k_mac_register()
6186 ar->hw->wiphy->available_antennas_rx = cap->rx_chain_mask; in __ath11k_mac_register()
6187 ar->hw->wiphy->available_antennas_tx = cap->tx_chain_mask; in __ath11k_mac_register()
6189 ar->hw->wiphy->interface_modes = ab->hw_params.interface_modes; in __ath11k_mac_register()
6191 ieee80211_hw_set(ar->hw, SIGNAL_DBM); in __ath11k_mac_register()
6192 ieee80211_hw_set(ar->hw, SUPPORTS_PS); in __ath11k_mac_register()
6193 ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS); in __ath11k_mac_register()
6194 ieee80211_hw_set(ar->hw, MFP_CAPABLE); in __ath11k_mac_register()
6195 ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS); in __ath11k_mac_register()
6196 ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL); in __ath11k_mac_register()
6197 ieee80211_hw_set(ar->hw, AP_LINK_PS); in __ath11k_mac_register()
6198 ieee80211_hw_set(ar->hw, SPECTRUM_MGMT); in __ath11k_mac_register()
6199 ieee80211_hw_set(ar->hw, CONNECTION_MONITOR); in __ath11k_mac_register()
6200 ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK); in __ath11k_mac_register()
6201 ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF); in __ath11k_mac_register()
6202 ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA); in __ath11k_mac_register()
6203 ieee80211_hw_set(ar->hw, QUEUE_CONTROL); in __ath11k_mac_register()
6204 ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG); in __ath11k_mac_register()
6205 ieee80211_hw_set(ar->hw, REPORTS_LOW_ACK); in __ath11k_mac_register()
6206 ieee80211_hw_set(ar->hw, SUPPORTS_TX_ENCAP_OFFLOAD); in __ath11k_mac_register()
6208 ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION); in __ath11k_mac_register()
6209 ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW); in __ath11k_mac_register()
6210 ieee80211_hw_set(ar->hw, SUPPORTS_REORDERING_BUFFER); in __ath11k_mac_register()
6211 ieee80211_hw_set(ar->hw, SUPPORTS_AMSDU_IN_AMPDU); in __ath11k_mac_register()
6212 ieee80211_hw_set(ar->hw, USES_RSS); in __ath11k_mac_register()
6215 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS; in __ath11k_mac_register()
6216 ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; in __ath11k_mac_register()
6223 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS; in __ath11k_mac_register()
6225 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID; in __ath11k_mac_register()
6226 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN; in __ath11k_mac_register()
6228 ar->hw->max_listen_interval = ATH11K_MAX_HW_LISTEN_INTERVAL; in __ath11k_mac_register()
6230 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; in __ath11k_mac_register()
6231 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH; in __ath11k_mac_register()
6232 ar->hw->wiphy->max_remain_on_channel_duration = 5000; in __ath11k_mac_register()
6234 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD; in __ath11k_mac_register()
6235 ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE | in __ath11k_mac_register()
6238 ar->max_num_stations = TARGET_NUM_STATIONS; in __ath11k_mac_register()
6239 ar->max_num_peers = TARGET_NUM_PEERS_PDEV; in __ath11k_mac_register()
6241 ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations; in __ath11k_mac_register()
6243 ar->hw->queues = ATH11K_HW_MAX_QUEUES; in __ath11k_mac_register()
6244 ar->hw->wiphy->tx_queue_len = ATH11K_QUEUE_LEN; in __ath11k_mac_register()
6245 ar->hw->offchannel_tx_hw_queue = ATH11K_HW_MAX_QUEUES - 1; in __ath11k_mac_register()
6246 ar->hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF; in __ath11k_mac_register()
6248 ar->hw->vif_data_size = sizeof(struct ath11k_vif); in __ath11k_mac_register()
6249 ar->hw->sta_data_size = sizeof(struct ath11k_sta); in __ath11k_mac_register()
6251 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); in __ath11k_mac_register()
6252 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_STA_TX_PWR); in __ath11k_mac_register()
6254 ar->hw->wiphy->cipher_suites = cipher_suites; in __ath11k_mac_register()
6255 ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites); in __ath11k_mac_register()
6257 ar->hw->wiphy->iftype_ext_capab = ath11k_iftypes_ext_capa; in __ath11k_mac_register()
6258 ar->hw->wiphy->num_iftype_ext_capab = in __ath11k_mac_register()
6261 ath11k_reg_init(ar); in __ath11k_mac_register()
6264 ar->hw->netdev_features = NETIF_F_HW_CSUM; in __ath11k_mac_register()
6265 ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL); in __ath11k_mac_register()
6266 ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT); in __ath11k_mac_register()
6269 ret = ieee80211_register_hw(ar->hw); in __ath11k_mac_register()
6271 ath11k_err(ar->ab, "ieee80211 registration failed: %d\n", ret); in __ath11k_mac_register()
6281 ar->hw->wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR); in __ath11k_mac_register()
6284 ret = ath11k_regd_update(ar, true); in __ath11k_mac_register()
6286 ath11k_err(ar->ab, "ath11k regd update failed: %d\n", ret); in __ath11k_mac_register()
6290 ret = ath11k_debugfs_register(ar); in __ath11k_mac_register()
6292 ath11k_err(ar->ab, "debugfs registration failed: %d\n", ret); in __ath11k_mac_register()
6299 kfree(ar->hw->wiphy->iface_combinations[0].limits); in __ath11k_mac_register()
6300 kfree(ar->hw->wiphy->iface_combinations); in __ath11k_mac_register()
6303 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); in __ath11k_mac_register()
6304 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels); in __ath11k_mac_register()
6305 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); in __ath11k_mac_register()
6308 SET_IEEE80211_DEV(ar->hw, NULL); in __ath11k_mac_register()
6314 struct ath11k *ar; in ath11k_mac_register() local
6324 ar = pdev->ar; in ath11k_mac_register()
6326 ether_addr_copy(ar->mac_addr, pdev->mac_addr); in ath11k_mac_register()
6328 ether_addr_copy(ar->mac_addr, ab->mac_addr); in ath11k_mac_register()
6329 ar->mac_addr[4] += i; in ath11k_mac_register()
6332 ret = __ath11k_mac_register(ar); in ath11k_mac_register()
6336 idr_init(&ar->txmgmt_idr); in ath11k_mac_register()
6337 spin_lock_init(&ar->txmgmt_idr_lock); in ath11k_mac_register()
6349 ar = pdev->ar; in ath11k_mac_register()
6350 __ath11k_mac_unregister(ar); in ath11k_mac_register()
6359 struct ath11k *ar; in ath11k_mac_allocate() local
6376 ar = hw->priv; in ath11k_mac_allocate()
6377 ar->hw = hw; in ath11k_mac_allocate()
6378 ar->ab = ab; in ath11k_mac_allocate()
6379 ar->pdev = pdev; in ath11k_mac_allocate()
6380 ar->pdev_idx = i; in ath11k_mac_allocate()
6381 ar->lmac_id = ath11k_hw_get_mac_from_pdev_id(&ab->hw_params, i); in ath11k_mac_allocate()
6383 ar->wmi = &ab->wmi_ab.wmi[i]; in ath11k_mac_allocate()
6389 ar->cfg_tx_chainmask = pdev->cap.tx_chain_mask; in ath11k_mac_allocate()
6390 ar->cfg_rx_chainmask = pdev->cap.rx_chain_mask; in ath11k_mac_allocate()
6391 ar->num_tx_chains = get_num_chains(pdev->cap.tx_chain_mask); in ath11k_mac_allocate()
6392 ar->num_rx_chains = get_num_chains(pdev->cap.rx_chain_mask); in ath11k_mac_allocate()
6394 pdev->ar = ar; in ath11k_mac_allocate()
6395 spin_lock_init(&ar->data_lock); in ath11k_mac_allocate()
6396 INIT_LIST_HEAD(&ar->arvifs); in ath11k_mac_allocate()
6397 INIT_LIST_HEAD(&ar->ppdu_stats_info); in ath11k_mac_allocate()
6398 mutex_init(&ar->conf_mutex); in ath11k_mac_allocate()
6399 init_completion(&ar->vdev_setup_done); in ath11k_mac_allocate()
6400 init_completion(&ar->peer_assoc_done); in ath11k_mac_allocate()
6401 init_completion(&ar->install_key_done); in ath11k_mac_allocate()
6402 init_completion(&ar->bss_survey_done); in ath11k_mac_allocate()
6403 init_completion(&ar->scan.started); in ath11k_mac_allocate()
6404 init_completion(&ar->scan.completed); in ath11k_mac_allocate()
6405 init_completion(&ar->thermal.wmi_sync); in ath11k_mac_allocate()
6407 INIT_DELAYED_WORK(&ar->scan.timeout, ath11k_scan_timeout_work); in ath11k_mac_allocate()
6408 INIT_WORK(&ar->regd_update_work, ath11k_regd_update_work); in ath11k_mac_allocate()
6410 INIT_WORK(&ar->wmi_mgmt_tx_work, ath11k_mgmt_over_wmi_tx_work); in ath11k_mac_allocate()
6411 skb_queue_head_init(&ar->wmi_mgmt_tx_queue); in ath11k_mac_allocate()
6412 clear_bit(ATH11K_FLAG_MONITOR_ENABLED, &ar->monitor_flags); in ath11k_mac_allocate()
6425 struct ath11k *ar; in ath11k_mac_destroy() local
6431 ar = pdev->ar; in ath11k_mac_destroy()
6432 if (!ar) in ath11k_mac_destroy()
6435 ieee80211_free_hw(ar->hw); in ath11k_mac_destroy()
6436 pdev->ar = NULL; in ath11k_mac_destroy()