Lines Matching +full:cs +full:- +full:dev +full:- +full:assoc
8 * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
9 * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
10 * Copyright(c) 2012 - 2014, 2018 - 2020 Intel Corporation
26 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
30 * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
31 * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
32 * Copyright(c) 2012 - 2014, 2018 - 2020 Intel Corporation
74 #include "iwl-op-mode.h"
75 #include "iwl-io.h"
78 #include "time-event.h"
79 #include "iwl-eeprom-parse.h"
80 #include "iwl-phy-db.h"
82 #include "fw/error-dump.h"
83 #include "iwl-prph.h"
84 #include "iwl-nvm-parse.h"
117 * BC_FILTER_MAGIC_IP - configure the val of this attribute to
121 * BC_FILTER_MAGIC_MAC - set the val of this attribute to
137 /* frame type - arp, hw type - ethernet */
164 /* udp dest port - 68 (bootp client)*/
171 /* dhcp - lsb bytes of client hw address */
198 .max_bursts_exponent = -1, /* all supported */
221 memset(mvm->phy_ctxts, 0, sizeof(mvm->phy_ctxts)); in iwl_mvm_reset_phy_ctxts()
223 mvm->phy_ctxts[i].id = i; in iwl_mvm_reset_phy_ctxts()
224 mvm->phy_ctxts[i].ref = 0; in iwl_mvm_reset_phy_ctxts()
241 lockdep_assert_held(&mvm->mutex); in iwl_mvm_get_regdomain()
251 u32 status = le32_to_cpu(resp->status); in iwl_mvm_get_regdomain()
256 resp_ver = iwl_fw_lookup_notif_ver(mvm->fw, IWL_ALWAYS_LONG_GROUP, in iwl_mvm_get_regdomain()
260 regd = iwl_parse_nvm_mcc_info(mvm->trans->dev, mvm->cfg, in iwl_mvm_get_regdomain()
261 __le32_to_cpu(resp->n_channels), in iwl_mvm_get_regdomain()
262 resp->channels, in iwl_mvm_get_regdomain()
263 __le16_to_cpu(resp->mcc), in iwl_mvm_get_regdomain()
264 __le16_to_cpu(resp->geo_info), in iwl_mvm_get_regdomain()
265 __le16_to_cpu(resp->cap), resp_ver); in iwl_mvm_get_regdomain()
267 src_id = resp->source_id; in iwl_mvm_get_regdomain()
276 regd->alpha2, regd->alpha2[0], regd->alpha2[1], src_id); in iwl_mvm_get_regdomain()
277 mvm->lar_regdom_set = true; in iwl_mvm_get_regdomain()
278 mvm->mcc_src = src_id; in iwl_mvm_get_regdomain()
296 regulatory_set_wiphy_regd(mvm->hw->wiphy, regd); in iwl_mvm_update_changed_regdom()
305 return iwl_mvm_get_regdomain(mvm->hw->wiphy, "ZZ", in iwl_mvm_get_current_regdomain()
318 rtnl_dereference(mvm->hw->wiphy->regd); in iwl_mvm_init_fw_regd()
321 return -ENOENT; in iwl_mvm_init_fw_regd()
324 used_src = mvm->mcc_src; in iwl_mvm_init_fw_regd()
333 regd = iwl_mvm_get_regdomain(mvm->hw->wiphy, r->alpha2, used_src, in iwl_mvm_init_fw_regd()
336 return -EIO; in iwl_mvm_init_fw_regd()
340 ret = regulatory_set_wiphy_regd_sync_rtnl(mvm->hw->wiphy, regd); in iwl_mvm_init_fw_regd()
375 struct ieee80211_hw *hw = mvm->hw; in iwl_mvm_mac_setup_register()
384 bool unified = fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_mac_setup_register()
408 * On older devices, enabling TX A-MSDU occasionally leads to in iwl_mvm_mac_setup_register()
414 * support A-MSDU until moving the mac80211 iTXQs, just leave it in iwl_mvm_mac_setup_register()
418 if (mvm->trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_9000) in iwl_mvm_mac_setup_register()
430 if (fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_mac_setup_register()
439 return -EINVAL; in iwl_mvm_mac_setup_register()
442 if (mvm->trans->num_rx_queues > 1) in iwl_mvm_mac_setup_register()
445 if (mvm->trans->max_skb_frags) in iwl_mvm_mac_setup_register()
446 hw->netdev_features = NETIF_F_HIGHDMA | NETIF_F_SG; in iwl_mvm_mac_setup_register()
448 hw->queues = IEEE80211_MAX_QUEUES; in iwl_mvm_mac_setup_register()
449 hw->offchannel_tx_hw_queue = IWL_MVM_OFFCHANNEL_QUEUE; in iwl_mvm_mac_setup_register()
450 hw->radiotap_mcs_details |= IEEE80211_RADIOTAP_MCS_HAVE_FEC | in iwl_mvm_mac_setup_register()
452 hw->radiotap_vht_details |= IEEE80211_RADIOTAP_VHT_KNOWN_STBC | in iwl_mvm_mac_setup_register()
455 hw->radiotap_timestamp.units_pos = in iwl_mvm_mac_setup_register()
459 hw->radiotap_timestamp.accuracy = 22; in iwl_mvm_mac_setup_register()
462 hw->rate_control_algorithm = RS_NAME; in iwl_mvm_mac_setup_register()
464 hw->uapsd_queues = IWL_MVM_UAPSD_QUEUES; in iwl_mvm_mac_setup_register()
465 hw->uapsd_max_sp_len = IWL_UAPSD_MAX_SP; in iwl_mvm_mac_setup_register()
466 hw->max_tx_fragments = mvm->trans->max_skb_frags; in iwl_mvm_mac_setup_register()
468 BUILD_BUG_ON(ARRAY_SIZE(mvm->ciphers) < ARRAY_SIZE(mvm_ciphers) + 6); in iwl_mvm_mac_setup_register()
469 memcpy(mvm->ciphers, mvm_ciphers, sizeof(mvm_ciphers)); in iwl_mvm_mac_setup_register()
470 hw->wiphy->n_cipher_suites = ARRAY_SIZE(mvm_ciphers); in iwl_mvm_mac_setup_register()
471 hw->wiphy->cipher_suites = mvm->ciphers; in iwl_mvm_mac_setup_register()
474 mvm->ciphers[hw->wiphy->n_cipher_suites] = in iwl_mvm_mac_setup_register()
476 hw->wiphy->n_cipher_suites++; in iwl_mvm_mac_setup_register()
477 mvm->ciphers[hw->wiphy->n_cipher_suites] = in iwl_mvm_mac_setup_register()
479 hw->wiphy->n_cipher_suites++; in iwl_mvm_mac_setup_register()
490 mvm->ciphers[hw->wiphy->n_cipher_suites] = WLAN_CIPHER_SUITE_AES_CMAC; in iwl_mvm_mac_setup_register()
491 hw->wiphy->n_cipher_suites++; in iwl_mvm_mac_setup_register()
493 mvm->ciphers[hw->wiphy->n_cipher_suites] = in iwl_mvm_mac_setup_register()
495 hw->wiphy->n_cipher_suites++; in iwl_mvm_mac_setup_register()
496 mvm->ciphers[hw->wiphy->n_cipher_suites] = in iwl_mvm_mac_setup_register()
498 hw->wiphy->n_cipher_suites++; in iwl_mvm_mac_setup_register()
502 if (mvm->fw->cs[0].cipher) { in iwl_mvm_mac_setup_register()
503 const struct iwl_fw_cipher_scheme *fwcs = &mvm->fw->cs[0]; in iwl_mvm_mac_setup_register()
504 struct ieee80211_cipher_scheme *cs = &mvm->cs[0]; in iwl_mvm_mac_setup_register() local
506 mvm->hw->n_cipher_schemes = 1; in iwl_mvm_mac_setup_register()
508 cs->cipher = le32_to_cpu(fwcs->cipher); in iwl_mvm_mac_setup_register()
509 cs->iftype = BIT(NL80211_IFTYPE_STATION); in iwl_mvm_mac_setup_register()
510 cs->hdr_len = fwcs->hdr_len; in iwl_mvm_mac_setup_register()
511 cs->pn_len = fwcs->pn_len; in iwl_mvm_mac_setup_register()
512 cs->pn_off = fwcs->pn_off; in iwl_mvm_mac_setup_register()
513 cs->key_idx_off = fwcs->key_idx_off; in iwl_mvm_mac_setup_register()
514 cs->key_idx_mask = fwcs->key_idx_mask; in iwl_mvm_mac_setup_register()
515 cs->key_idx_shift = fwcs->key_idx_shift; in iwl_mvm_mac_setup_register()
516 cs->mic_len = fwcs->mic_len; in iwl_mvm_mac_setup_register()
518 mvm->hw->cipher_schemes = mvm->cs; in iwl_mvm_mac_setup_register()
519 mvm->ciphers[hw->wiphy->n_cipher_suites] = cs->cipher; in iwl_mvm_mac_setup_register()
520 hw->wiphy->n_cipher_suites++; in iwl_mvm_mac_setup_register()
523 if (fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_mac_setup_register()
525 wiphy_ext_feature_set(hw->wiphy, in iwl_mvm_mac_setup_register()
527 hw->wiphy->pmsr_capa = &iwl_mvm_pmsr_capa; in iwl_mvm_mac_setup_register()
531 hw->wiphy->features |= in iwl_mvm_mac_setup_register()
536 hw->sta_data_size = sizeof(struct iwl_mvm_sta); in iwl_mvm_mac_setup_register()
537 hw->vif_data_size = sizeof(struct iwl_mvm_vif); in iwl_mvm_mac_setup_register()
538 hw->chanctx_data_size = sizeof(u16); in iwl_mvm_mac_setup_register()
539 hw->txq_data_size = sizeof(struct iwl_mvm_txq); in iwl_mvm_mac_setup_register()
541 hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | in iwl_mvm_mac_setup_register()
548 hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; in iwl_mvm_mac_setup_register()
549 wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_VHT_IBSS); in iwl_mvm_mac_setup_register()
556 wiphy_ext_feature_set(hw->wiphy, in iwl_mvm_mac_setup_register()
558 hw->wiphy->features |= NL80211_FEATURE_HT_IBSS; in iwl_mvm_mac_setup_register()
560 hw->wiphy->regulatory_flags |= REGULATORY_ENABLE_RELAX_NO_IR; in iwl_mvm_mac_setup_register()
562 hw->wiphy->regulatory_flags |= REGULATORY_WIPHY_SELF_MANAGED; in iwl_mvm_mac_setup_register()
564 hw->wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG | in iwl_mvm_mac_setup_register()
567 hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD; in iwl_mvm_mac_setup_register()
568 hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH; in iwl_mvm_mac_setup_register()
570 hw->wiphy->iface_combinations = iwl_mvm_iface_combinations; in iwl_mvm_mac_setup_register()
571 hw->wiphy->n_iface_combinations = in iwl_mvm_mac_setup_register()
574 hw->wiphy->max_remain_on_channel_duration = 10000; in iwl_mvm_mac_setup_register()
575 hw->max_listen_interval = IWL_CONN_MAX_LISTEN_INTERVAL; in iwl_mvm_mac_setup_register()
578 memcpy(mvm->addresses[0].addr, mvm->nvm_data->hw_addr, ETH_ALEN); in iwl_mvm_mac_setup_register()
579 hw->wiphy->addresses = mvm->addresses; in iwl_mvm_mac_setup_register()
580 hw->wiphy->n_addresses = 1; in iwl_mvm_mac_setup_register()
583 num_mac = (mvm->nvm_data->n_hw_addrs > 1) ? in iwl_mvm_mac_setup_register()
584 min(IWL_MVM_MAX_ADDRESSES, mvm->nvm_data->n_hw_addrs) : 1; in iwl_mvm_mac_setup_register()
587 memcpy(mvm->addresses[i].addr, mvm->addresses[i-1].addr, in iwl_mvm_mac_setup_register()
589 mvm->addresses[i].addr[5]++; in iwl_mvm_mac_setup_register()
590 hw->wiphy->n_addresses++; in iwl_mvm_mac_setup_register()
595 hw->wiphy->max_scan_ie_len = iwl_mvm_max_scan_ie_len(mvm); in iwl_mvm_mac_setup_register()
597 hw->wiphy->max_scan_ssids = PROBE_OPTION_MAX; in iwl_mvm_mac_setup_register()
603 if (fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_UMAC_SCAN)) in iwl_mvm_mac_setup_register()
604 mvm->max_scans = IWL_MVM_MAX_UMAC_SCANS; in iwl_mvm_mac_setup_register()
606 mvm->max_scans = IWL_MVM_MAX_LMAC_SCANS; in iwl_mvm_mac_setup_register()
608 if (mvm->nvm_data->bands[NL80211_BAND_2GHZ].n_channels) in iwl_mvm_mac_setup_register()
609 hw->wiphy->bands[NL80211_BAND_2GHZ] = in iwl_mvm_mac_setup_register()
610 &mvm->nvm_data->bands[NL80211_BAND_2GHZ]; in iwl_mvm_mac_setup_register()
611 if (mvm->nvm_data->bands[NL80211_BAND_5GHZ].n_channels) { in iwl_mvm_mac_setup_register()
612 hw->wiphy->bands[NL80211_BAND_5GHZ] = in iwl_mvm_mac_setup_register()
613 &mvm->nvm_data->bands[NL80211_BAND_5GHZ]; in iwl_mvm_mac_setup_register()
615 if (fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_mac_setup_register()
617 fw_has_api(&mvm->fw->ucode_capa, in iwl_mvm_mac_setup_register()
619 hw->wiphy->bands[NL80211_BAND_5GHZ]->vht_cap.cap |= in iwl_mvm_mac_setup_register()
623 hw->wiphy->hw_version = mvm->trans->hw_id; in iwl_mvm_mac_setup_register()
626 hw->wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT; in iwl_mvm_mac_setup_register()
628 hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT; in iwl_mvm_mac_setup_register()
630 hw->wiphy->max_sched_scan_reqs = 1; in iwl_mvm_mac_setup_register()
631 hw->wiphy->max_sched_scan_ssids = PROBE_OPTION_MAX; in iwl_mvm_mac_setup_register()
632 hw->wiphy->max_match_sets = iwl_umac_scan_get_max_profiles(mvm->fw); in iwl_mvm_mac_setup_register()
634 hw->wiphy->max_sched_scan_ie_len = in iwl_mvm_mac_setup_register()
635 SCAN_OFFLOAD_PROBE_REQ_SIZE - 24 - 2; in iwl_mvm_mac_setup_register()
636 hw->wiphy->max_sched_scan_plans = IWL_MAX_SCHED_SCAN_PLANS; in iwl_mvm_mac_setup_register()
637 hw->wiphy->max_sched_scan_plan_interval = U16_MAX; in iwl_mvm_mac_setup_register()
643 hw->wiphy->max_sched_scan_plan_iterations = 254; in iwl_mvm_mac_setup_register()
645 hw->wiphy->features |= NL80211_FEATURE_P2P_GO_CTWIN | in iwl_mvm_mac_setup_register()
653 if (fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_mac_setup_register()
655 hw->wiphy->features |= NL80211_FEATURE_TX_POWER_INSERTION; in iwl_mvm_mac_setup_register()
656 if (fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_mac_setup_register()
658 hw->wiphy->features |= NL80211_FEATURE_QUIET; in iwl_mvm_mac_setup_register()
660 if (fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_mac_setup_register()
662 hw->wiphy->features |= in iwl_mvm_mac_setup_register()
665 if (fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_mac_setup_register()
667 hw->wiphy->features |= NL80211_FEATURE_WFA_TPC_IE_IN_PROBES; in iwl_mvm_mac_setup_register()
669 if (iwl_fw_lookup_cmd_ver(mvm->fw, IWL_ALWAYS_LONG_GROUP, in iwl_mvm_mac_setup_register()
672 hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK; in iwl_mvm_mac_setup_register()
674 if (fw_has_api(&mvm->fw->ucode_capa, in iwl_mvm_mac_setup_register()
676 wiphy_ext_feature_set(hw->wiphy, in iwl_mvm_mac_setup_register()
678 wiphy_ext_feature_set(hw->wiphy, in iwl_mvm_mac_setup_register()
683 wiphy_ext_feature_set(hw->wiphy, in iwl_mvm_mac_setup_register()
685 wiphy_ext_feature_set(hw->wiphy, in iwl_mvm_mac_setup_register()
687 wiphy_ext_feature_set(hw->wiphy, in iwl_mvm_mac_setup_register()
689 wiphy_ext_feature_set(hw->wiphy, in iwl_mvm_mac_setup_register()
693 if (mvm->nvm_data->sku_cap_11ax_enable && in iwl_mvm_mac_setup_register()
695 hw->wiphy->iftype_ext_capab = he_iftypes_ext_capa; in iwl_mvm_mac_setup_register()
696 hw->wiphy->num_iftype_ext_capab = in iwl_mvm_mac_setup_register()
703 mvm->rts_threshold = IEEE80211_MAX_RTS_THRESHOLD; in iwl_mvm_mac_setup_register()
706 if ((unified || mvm->fw->img[IWL_UCODE_WOWLAN].num_sec) && in iwl_mvm_mac_setup_register()
707 mvm->trans->ops->d3_suspend && in iwl_mvm_mac_setup_register()
708 mvm->trans->ops->d3_resume && in iwl_mvm_mac_setup_register()
709 device_can_wakeup(mvm->trans->dev)) { in iwl_mvm_mac_setup_register()
710 mvm->wowlan.flags |= WIPHY_WOWLAN_MAGIC_PKT | in iwl_mvm_mac_setup_register()
715 mvm->wowlan.flags |= WIPHY_WOWLAN_SUPPORTS_GTK_REKEY | in iwl_mvm_mac_setup_register()
719 mvm->wowlan.n_patterns = IWL_WOWLAN_MAX_PATTERNS; in iwl_mvm_mac_setup_register()
720 mvm->wowlan.pattern_min_len = IWL_WOWLAN_MIN_PATTERN_LEN; in iwl_mvm_mac_setup_register()
721 mvm->wowlan.pattern_max_len = IWL_WOWLAN_MAX_PATTERN_LEN; in iwl_mvm_mac_setup_register()
722 mvm->wowlan.max_nd_match_sets = in iwl_mvm_mac_setup_register()
723 iwl_umac_scan_get_max_profiles(mvm->fw); in iwl_mvm_mac_setup_register()
724 hw->wiphy->wowlan = &mvm->wowlan; in iwl_mvm_mac_setup_register()
730 mvm->bcast_filters = iwl_mvm_default_bcast_filters; in iwl_mvm_mac_setup_register()
737 if (fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_mac_setup_register()
740 hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS; in iwl_mvm_mac_setup_register()
744 if (fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_mac_setup_register()
747 hw->wiphy->features |= NL80211_FEATURE_TDLS_CHANNEL_SWITCH; in iwl_mvm_mac_setup_register()
750 hw->netdev_features |= mvm->cfg->features; in iwl_mvm_mac_setup_register()
752 hw->netdev_features &= ~(IWL_TX_CSUM_NETIF_FLAGS | in iwl_mvm_mac_setup_register()
756 hw->netdev_features |= IWL_TX_CSUM_NETIF_FLAGS; in iwl_mvm_mac_setup_register()
759 if (mvm->cfg->vht_mu_mimo_supported) in iwl_mvm_mac_setup_register()
760 wiphy_ext_feature_set(hw->wiphy, in iwl_mvm_mac_setup_register()
763 if (fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_PROTECTED_TWT)) in iwl_mvm_mac_setup_register()
764 wiphy_ext_feature_set(hw->wiphy, in iwl_mvm_mac_setup_register()
767 hw->wiphy->available_antennas_tx = iwl_mvm_get_valid_tx_ant(mvm); in iwl_mvm_mac_setup_register()
768 hw->wiphy->available_antennas_rx = iwl_mvm_get_valid_rx_ant(mvm); in iwl_mvm_mac_setup_register()
770 ret = ieee80211_register_hw(mvm->hw); in iwl_mvm_mac_setup_register()
789 ieee80211_free_txskb(mvm->hw, skb); in iwl_mvm_tx_skb()
797 struct ieee80211_sta *sta = control->sta; in iwl_mvm_mac_tx()
799 struct ieee80211_hdr *hdr = (void *)skb->data; in iwl_mvm_mac_tx()
800 bool offchannel = IEEE80211_SKB_CB(skb)->flags & in iwl_mvm_mac_tx()
804 IWL_DEBUG_DROP(mvm, "Dropping - RF/CT KILL\n"); in iwl_mvm_mac_tx()
809 !test_bit(IWL_MVM_STATUS_ROC_RUNNING, &mvm->status) && in iwl_mvm_mac_tx()
810 !test_bit(IWL_MVM_STATUS_ROC_AUX_RUNNING, &mvm->status)) in iwl_mvm_mac_tx()
813 /* treat non-bufferable MMPDUs on AP interfaces as broadcast */ in iwl_mvm_mac_tx()
814 if ((info->control.vif->type == NL80211_IFTYPE_AP || in iwl_mvm_mac_tx()
815 info->control.vif->type == NL80211_IFTYPE_ADHOC) && in iwl_mvm_mac_tx()
816 ieee80211_is_mgmt(hdr->frame_control) && in iwl_mvm_mac_tx()
817 !ieee80211_is_bufferable_mmpdu(hdr->frame_control)) in iwl_mvm_mac_tx()
820 /* If there is no sta, and it's not offchannel - send through AP */ in iwl_mvm_mac_tx()
821 if (!sta && info->control.vif->type == NL80211_IFTYPE_STATION && in iwl_mvm_mac_tx()
824 iwl_mvm_vif_from_mac80211(info->control.vif); in iwl_mvm_mac_tx()
825 u8 ap_sta_id = READ_ONCE(mvmvif->ap_sta_id); in iwl_mvm_mac_tx()
827 if (ap_sta_id < mvm->fw->ucode_capa.num_stations) { in iwl_mvm_mac_tx()
829 sta = rcu_dereference(mvm->fw_id_to_mac_id[ap_sta_id]); in iwl_mvm_mac_tx()
851 * mvmtxq->tx_request logic: in iwl_mvm_mac_itxq_xmit()
866 if (atomic_fetch_add_unless(&mvmtxq->tx_request, 1, 2)) in iwl_mvm_mac_itxq_xmit()
871 while (likely(!mvmtxq->stopped && in iwl_mvm_mac_itxq_xmit()
872 (mvm->trans->system_pm_mode == in iwl_mvm_mac_itxq_xmit()
877 if (txq->sta) in iwl_mvm_mac_itxq_xmit()
880 txq->sta->addr, in iwl_mvm_mac_itxq_xmit()
881 txq->tid); in iwl_mvm_mac_itxq_xmit()
885 iwl_mvm_tx_skb(mvm, skb, txq->sta); in iwl_mvm_mac_itxq_xmit()
887 } while (atomic_dec_return(&mvmtxq->tx_request)); in iwl_mvm_mac_itxq_xmit()
899 * mvmtxq->txq_id is updated during allocation, and mvmtxq->list is in iwl_mvm_mac_wake_tx_queue()
902 * mvmtxq->txq_id != INVALID_QUEUE && list_empty(&mvmtxq->list): in iwl_mvm_mac_wake_tx_queue()
904 * mvmtxq->txq_id != INVALID_QUEUE && !list_empty(&mvmtxq->list): in iwl_mvm_mac_wake_tx_queue()
906 * mvmtxq->txq_id == INVALID_QUEUE && list_empty(&mvmtxq->list): in iwl_mvm_mac_wake_tx_queue()
908 * mvmtxq->txq_id == INVALID_QUEUE && !list_empty(&mvmtxq->list): in iwl_mvm_mac_wake_tx_queue()
914 if (!txq->sta || mvmtxq->txq_id != IWL_MVM_INVALID_QUEUE) { in iwl_mvm_mac_wake_tx_queue()
920 if (unlikely(txq->sta && !list_empty(&mvmtxq->list))) in iwl_mvm_mac_wake_tx_queue()
928 if (!list_empty(&mvmtxq->list)) in iwl_mvm_mac_wake_tx_queue()
931 list_add_tail(&mvmtxq->list, &mvm->add_stream_txqs); in iwl_mvm_mac_wake_tx_queue()
932 schedule_work(&mvm->add_stream_wk); in iwl_mvm_mac_wake_tx_queue()
939 iwl_fw_dbg_collect_trig(&(_mvm)->fwrt, _trig, _fmt); \
950 trig = iwl_fw_dbg_trigger_on(&mvm->fwrt, ieee80211_vif_to_wdev(vif), in iwl_mvm_ampdu_check_trigger()
955 ba_trig = (void *)trig->data; in iwl_mvm_ampdu_check_trigger()
960 struct iwl_mvm_tid_data *tid_data = &mvmsta->tid_data[tid]; in iwl_mvm_ampdu_check_trigger()
962 CHECK_BA_TRIGGER(mvm, trig, ba_trig->tx_ba_start, tid, in iwl_mvm_ampdu_check_trigger()
964 sta->addr, tid, tid_data->ssn); in iwl_mvm_ampdu_check_trigger()
968 CHECK_BA_TRIGGER(mvm, trig, ba_trig->tx_ba_stop, tid, in iwl_mvm_ampdu_check_trigger()
970 sta->addr, tid); in iwl_mvm_ampdu_check_trigger()
973 CHECK_BA_TRIGGER(mvm, trig, ba_trig->rx_ba_start, tid, in iwl_mvm_ampdu_check_trigger()
975 sta->addr, tid, rx_ba_ssn); in iwl_mvm_ampdu_check_trigger()
978 CHECK_BA_TRIGGER(mvm, trig, ba_trig->rx_ba_stop, tid, in iwl_mvm_ampdu_check_trigger()
980 sta->addr, tid); in iwl_mvm_ampdu_check_trigger()
993 struct ieee80211_sta *sta = params->sta; in iwl_mvm_mac_ampdu_action()
994 enum ieee80211_ampdu_mlme_action action = params->action; in iwl_mvm_mac_ampdu_action()
995 u16 tid = params->tid; in iwl_mvm_mac_ampdu_action()
996 u16 *ssn = ¶ms->ssn; in iwl_mvm_mac_ampdu_action()
997 u16 buf_size = params->buf_size; in iwl_mvm_mac_ampdu_action()
998 bool amsdu = params->amsdu; in iwl_mvm_mac_ampdu_action()
999 u16 timeout = params->timeout; in iwl_mvm_mac_ampdu_action()
1001 IWL_DEBUG_HT(mvm, "A-MPDU action on addr %pM tid %d: action %d\n", in iwl_mvm_mac_ampdu_action()
1002 sta->addr, tid, action); in iwl_mvm_mac_ampdu_action()
1004 if (!(mvm->nvm_data->sku_cap_11n_enable)) in iwl_mvm_mac_ampdu_action()
1005 return -EACCES; in iwl_mvm_mac_ampdu_action()
1007 mutex_lock(&mvm->mutex); in iwl_mvm_mac_ampdu_action()
1011 if (iwl_mvm_vif_from_mac80211(vif)->ap_sta_id == in iwl_mvm_mac_ampdu_action()
1012 iwl_mvm_sta_from_mac80211(sta)->sta_id) { in iwl_mvm_mac_ampdu_action()
1014 u16 macid = iwl_mvm_vif_from_mac80211(vif)->id; in iwl_mvm_mac_ampdu_action()
1015 struct iwl_mvm_tcm_mac *mdata = &mvm->tcm.data[macid]; in iwl_mvm_mac_ampdu_action()
1017 mdata->opened_rx_ba_sessions = true; in iwl_mvm_mac_ampdu_action()
1019 cancel_delayed_work(&mvmvif->uapsd_nonagg_detected_wk); in iwl_mvm_mac_ampdu_action()
1022 ret = -EINVAL; in iwl_mvm_mac_ampdu_action()
1034 ret = -EINVAL; in iwl_mvm_mac_ampdu_action()
1052 ret = -EINVAL; in iwl_mvm_mac_ampdu_action()
1065 mutex_unlock(&mvm->mutex); in iwl_mvm_mac_ampdu_action()
1076 mvmvif->uploaded = false; in iwl_mvm_cleanup_iterator()
1077 mvmvif->ap_sta_id = IWL_MVM_INVALID_STA; in iwl_mvm_cleanup_iterator()
1079 spin_lock_bh(&mvm->time_event_lock); in iwl_mvm_cleanup_iterator()
1080 iwl_mvm_te_clear_data(mvm, &mvmvif->time_event_data); in iwl_mvm_cleanup_iterator()
1081 spin_unlock_bh(&mvm->time_event_lock); in iwl_mvm_cleanup_iterator()
1083 mvmvif->phy_ctxt = NULL; in iwl_mvm_cleanup_iterator()
1084 memset(&mvmvif->bf_data, 0, sizeof(mvmvif->bf_data)); in iwl_mvm_cleanup_iterator()
1085 memset(&mvmvif->probe_resp_data, 0, sizeof(mvmvif->probe_resp_data)); in iwl_mvm_cleanup_iterator()
1092 mvm->cur_aid = 0; in iwl_mvm_restart_cleanup()
1094 mvm->scan_status = 0; in iwl_mvm_restart_cleanup()
1095 mvm->ps_disabled = false; in iwl_mvm_restart_cleanup()
1096 mvm->rfkill_safe_init_done = false; in iwl_mvm_restart_cleanup()
1100 ieee80211_remain_on_channel_expired(mvm->hw); in iwl_mvm_restart_cleanup()
1108 ieee80211_iterate_interfaces(mvm->hw, 0, iwl_mvm_cleanup_iterator, mvm); in iwl_mvm_restart_cleanup()
1110 mvm->p2p_device_vif = NULL; in iwl_mvm_restart_cleanup()
1113 memset(mvm->fw_key_table, 0, sizeof(mvm->fw_key_table)); in iwl_mvm_restart_cleanup()
1114 memset(&mvm->last_bt_notif, 0, sizeof(mvm->last_bt_notif)); in iwl_mvm_restart_cleanup()
1115 memset(&mvm->last_bt_ci_cmd, 0, sizeof(mvm->last_bt_ci_cmd)); in iwl_mvm_restart_cleanup()
1117 ieee80211_wake_queues(mvm->hw); in iwl_mvm_restart_cleanup()
1119 mvm->vif_count = 0; in iwl_mvm_restart_cleanup()
1120 mvm->rx_ba_sessions = 0; in iwl_mvm_restart_cleanup()
1121 mvm->fwrt.dump.conf = FW_DBG_INVALID; in iwl_mvm_restart_cleanup()
1122 mvm->monitor_on = false; in iwl_mvm_restart_cleanup()
1132 lockdep_assert_held(&mvm->mutex); in __iwl_mvm_mac_start()
1134 if (test_bit(IWL_MVM_STATUS_HW_RESTART_REQUESTED, &mvm->status)) { in __iwl_mvm_mac_start()
1137 * so later code will - from now on - see that we're doing it. in __iwl_mvm_mac_start()
1139 set_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status); in __iwl_mvm_mac_start()
1140 clear_bit(IWL_MVM_STATUS_HW_RESTART_REQUESTED, &mvm->status); in __iwl_mvm_mac_start()
1146 iwl_dbg_tlv_time_point(&mvm->fwrt, IWL_FW_INI_TIME_POINT_POST_INIT, in __iwl_mvm_mac_start()
1148 iwl_dbg_tlv_time_point(&mvm->fwrt, IWL_FW_INI_TIME_POINT_PERIODIC, in __iwl_mvm_mac_start()
1151 if (ret && test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)) { in __iwl_mvm_mac_start()
1152 /* Something went wrong - we need to finish some cleanup in __iwl_mvm_mac_start()
1156 clear_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status); in __iwl_mvm_mac_start()
1167 mutex_lock(&mvm->mutex); in iwl_mvm_mac_start()
1169 mutex_unlock(&mvm->mutex); in iwl_mvm_mac_start()
1178 mutex_lock(&mvm->mutex); in iwl_mvm_restart_complete()
1180 clear_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status); in iwl_mvm_restart_complete()
1195 mutex_unlock(&mvm->mutex); in iwl_mvm_restart_complete()
1215 lockdep_assert_held(&mvm->mutex); in __iwl_mvm_mac_stop()
1222 memset(&mvm->accu_radio_stats, 0, sizeof(mvm->accu_radio_stats)); in __iwl_mvm_mac_stop()
1226 if (iwl_fw_lookup_cmd_ver(mvm->fw, LONG_GROUP, ADD_STA, 0) < 12) in __iwl_mvm_mac_stop()
1241 if (test_and_clear_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status) || in __iwl_mvm_mac_stop()
1243 &mvm->status)) in __iwl_mvm_mac_stop()
1244 ieee80211_iterate_interfaces(mvm->hw, 0, in __iwl_mvm_mac_stop()
1250 if (fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_UMAC_SCAN)) { in __iwl_mvm_mac_stop()
1253 for (i = 0; i < mvm->max_scans; i++) { in __iwl_mvm_mac_stop()
1254 if (WARN_ONCE(mvm->scan_uid_status[i], in __iwl_mvm_mac_stop()
1257 mvm->scan_uid_status[i] = 0; in __iwl_mvm_mac_stop()
1266 flush_work(&mvm->async_handlers_wk); in iwl_mvm_mac_stop()
1267 flush_work(&mvm->add_stream_wk); in iwl_mvm_mac_stop()
1277 clear_bit(IWL_MVM_STATUS_FIRMWARE_RUNNING, &mvm->status); in iwl_mvm_mac_stop()
1279 cancel_delayed_work_sync(&mvm->cs_tx_unblock_dwork); in iwl_mvm_mac_stop()
1280 cancel_delayed_work_sync(&mvm->scan_timeout_dwork); in iwl_mvm_mac_stop()
1286 flush_work(&mvm->roc_done_wk); in iwl_mvm_mac_stop()
1288 mutex_lock(&mvm->mutex); in iwl_mvm_mac_stop()
1290 mutex_unlock(&mvm->mutex); in iwl_mvm_mac_stop()
1296 cancel_work_sync(&mvm->async_handlers_wk); in iwl_mvm_mac_stop()
1303 lockdep_assert_held(&mvm->mutex); in iwl_mvm_get_free_phy_ctxt()
1306 if (!mvm->phy_ctxts[i].ref) in iwl_mvm_get_free_phy_ctxt()
1307 return &mvm->phy_ctxts[i]; in iwl_mvm_get_free_phy_ctxt()
1320 cpu_to_le32(iwl_mvm_vif_from_mac80211(vif)->id), in iwl_mvm_set_tx_power()
1323 u8 cmd_ver = iwl_fw_lookup_cmd_ver(mvm->fw, LONG_GROUP, in iwl_mvm_set_tx_power()
1332 else if (fw_has_api(&mvm->fw->ucode_capa, in iwl_mvm_set_tx_power()
1335 else if (fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_set_tx_power()
1354 mutex_lock(&mvm->mutex); in iwl_mvm_post_channel_switch()
1356 if (mvmvif->csa_failed) { in iwl_mvm_post_channel_switch()
1357 mvmvif->csa_failed = false; in iwl_mvm_post_channel_switch()
1358 ret = -EIO; in iwl_mvm_post_channel_switch()
1362 if (vif->type == NL80211_IFTYPE_STATION) { in iwl_mvm_post_channel_switch()
1365 mvmvif->csa_bcn_pending = false; in iwl_mvm_post_channel_switch()
1367 mvmvif->ap_sta_id); in iwl_mvm_post_channel_switch()
1370 ret = -EIO; in iwl_mvm_post_channel_switch()
1378 if (!fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_post_channel_switch()
1388 mvmvif->ps_disabled = false; in iwl_mvm_post_channel_switch()
1393 mutex_unlock(&mvm->mutex); in iwl_mvm_post_channel_switch()
1404 .mac_id = cpu_to_le32(FW_CMD_ID_AND_COLOR(mvmvif->id, in iwl_mvm_abort_channel_switch()
1405 mvmvif->color)), in iwl_mvm_abort_channel_switch()
1409 IWL_DEBUG_MAC80211(mvm, "Abort CSA on mac %d\n", mvmvif->id); in iwl_mvm_abort_channel_switch()
1411 mutex_lock(&mvm->mutex); in iwl_mvm_abort_channel_switch()
1412 if (!fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_abort_channel_switch()
1420 mutex_unlock(&mvm->mutex); in iwl_mvm_abort_channel_switch()
1433 mvm = mvmvif->mvm; in iwl_mvm_channel_switch_disconnect_wk()
1435 iwl_mvm_abort_channel_switch(mvm->hw, vif); in iwl_mvm_channel_switch_disconnect_wk()
1446 mvmvif->mvm = mvm; in iwl_mvm_mac_add_interface()
1447 RCU_INIT_POINTER(mvmvif->probe_resp_data, NULL); in iwl_mvm_mac_add_interface()
1455 mutex_lock(&mvm->mutex); in iwl_mvm_mac_add_interface()
1458 if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)) in iwl_mvm_mac_add_interface()
1459 mvmvif->beacon_stats.accu_num_beacons += in iwl_mvm_mac_add_interface()
1460 mvmvif->beacon_stats.num_beacons; in iwl_mvm_mac_add_interface()
1467 rcu_assign_pointer(mvm->vif_id_to_mac[mvmvif->id], vif); in iwl_mvm_mac_add_interface()
1470 if (vif->type != NL80211_IFTYPE_P2P_DEVICE) in iwl_mvm_mac_add_interface()
1471 mvm->vif_count++; in iwl_mvm_mac_add_interface()
1484 if (vif->type == NL80211_IFTYPE_AP || in iwl_mvm_mac_add_interface()
1485 vif->type == NL80211_IFTYPE_ADHOC) { in iwl_mvm_mac_add_interface()
1496 ret = iwl_mvm_allocate_int_sta(mvm, &mvmvif->mcast_sta, in iwl_mvm_mac_add_interface()
1497 0, vif->type, in iwl_mvm_mac_add_interface()
1506 mvmvif->features |= hw->netdev_features; in iwl_mvm_mac_add_interface()
1521 if (!mvm->bf_allowed_vif && in iwl_mvm_mac_add_interface()
1522 vif->type == NL80211_IFTYPE_STATION && !vif->p2p) { in iwl_mvm_mac_add_interface()
1523 mvm->bf_allowed_vif = mvmvif; in iwl_mvm_mac_add_interface()
1524 vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER | in iwl_mvm_mac_add_interface()
1533 if (vif->type == NL80211_IFTYPE_P2P_DEVICE) { in iwl_mvm_mac_add_interface()
1535 mvmvif->phy_ctxt = iwl_mvm_get_free_phy_ctxt(mvm); in iwl_mvm_mac_add_interface()
1536 if (!mvmvif->phy_ctxt) { in iwl_mvm_mac_add_interface()
1537 ret = -ENOSPC; in iwl_mvm_mac_add_interface()
1541 iwl_mvm_phy_ctxt_ref(mvm, mvmvif->phy_ctxt); in iwl_mvm_mac_add_interface()
1552 mvm->p2p_device_vif = vif; in iwl_mvm_mac_add_interface()
1556 INIT_DELAYED_WORK(&mvmvif->csa_work, in iwl_mvm_mac_add_interface()
1559 if (vif->type == NL80211_IFTYPE_MONITOR) in iwl_mvm_mac_add_interface()
1560 mvm->monitor_on = true; in iwl_mvm_mac_add_interface()
1568 iwl_mvm_phy_ctxt_unref(mvm, mvmvif->phy_ctxt); in iwl_mvm_mac_add_interface()
1570 if (mvm->bf_allowed_vif == mvmvif) { in iwl_mvm_mac_add_interface()
1571 mvm->bf_allowed_vif = NULL; in iwl_mvm_mac_add_interface()
1572 vif->driver_flags &= ~(IEEE80211_VIF_BEACON_FILTER | in iwl_mvm_mac_add_interface()
1576 mvmvif->phy_ctxt = NULL; in iwl_mvm_mac_add_interface()
1579 if (vif->type != NL80211_IFTYPE_P2P_DEVICE) in iwl_mvm_mac_add_interface()
1580 mvm->vif_count--; in iwl_mvm_mac_add_interface()
1582 mutex_unlock(&mvm->mutex); in iwl_mvm_mac_add_interface()
1590 if (vif->type == NL80211_IFTYPE_P2P_DEVICE) { in iwl_mvm_prepare_mac_removal()
1596 flush_work(&mvm->roc_done_wk); in iwl_mvm_prepare_mac_removal()
1609 if (!(vif->type == NL80211_IFTYPE_AP || in iwl_mvm_mac_remove_interface()
1610 vif->type == NL80211_IFTYPE_ADHOC)) in iwl_mvm_mac_remove_interface()
1613 mutex_lock(&mvm->mutex); in iwl_mvm_mac_remove_interface()
1615 probe_data = rcu_dereference_protected(mvmvif->probe_resp_data, in iwl_mvm_mac_remove_interface()
1616 lockdep_is_held(&mvm->mutex)); in iwl_mvm_mac_remove_interface()
1617 RCU_INIT_POINTER(mvmvif->probe_resp_data, NULL); in iwl_mvm_mac_remove_interface()
1621 if (mvm->bf_allowed_vif == mvmvif) { in iwl_mvm_mac_remove_interface()
1622 mvm->bf_allowed_vif = NULL; in iwl_mvm_mac_remove_interface()
1623 vif->driver_flags &= ~(IEEE80211_VIF_BEACON_FILTER | in iwl_mvm_mac_remove_interface()
1627 if (vif->bss_conf.ftm_responder) in iwl_mvm_mac_remove_interface()
1628 memset(&mvm->ftm_resp_stats, 0, sizeof(mvm->ftm_resp_stats)); in iwl_mvm_mac_remove_interface()
1636 if (vif->type == NL80211_IFTYPE_AP || in iwl_mvm_mac_remove_interface()
1637 vif->type == NL80211_IFTYPE_ADHOC) { in iwl_mvm_mac_remove_interface()
1639 if (vif == mvm->noa_vif) { in iwl_mvm_mac_remove_interface()
1640 mvm->noa_vif = NULL; in iwl_mvm_mac_remove_interface()
1641 mvm->noa_duration = 0; in iwl_mvm_mac_remove_interface()
1644 iwl_mvm_dealloc_int_sta(mvm, &mvmvif->mcast_sta); in iwl_mvm_mac_remove_interface()
1649 if (vif->type == NL80211_IFTYPE_P2P_DEVICE) { in iwl_mvm_mac_remove_interface()
1650 mvm->p2p_device_vif = NULL; in iwl_mvm_mac_remove_interface()
1653 iwl_mvm_phy_ctxt_unref(mvm, mvmvif->phy_ctxt); in iwl_mvm_mac_remove_interface()
1654 mvmvif->phy_ctxt = NULL; in iwl_mvm_mac_remove_interface()
1657 if (mvm->vif_count && vif->type != NL80211_IFTYPE_P2P_DEVICE) in iwl_mvm_mac_remove_interface()
1658 mvm->vif_count--; in iwl_mvm_mac_remove_interface()
1663 RCU_INIT_POINTER(mvm->vif_id_to_mac[mvmvif->id], NULL); in iwl_mvm_mac_remove_interface()
1665 if (vif->type == NL80211_IFTYPE_MONITOR) in iwl_mvm_mac_remove_interface()
1666 mvm->monitor_on = false; in iwl_mvm_mac_remove_interface()
1669 mutex_unlock(&mvm->mutex); in iwl_mvm_mac_remove_interface()
1686 struct iwl_mvm *mvm = data->mvm; in iwl_mvm_mc_iface_iterator()
1687 struct iwl_mcast_filter_cmd *cmd = mvm->mcast_filter_cmd; in iwl_mvm_mc_iface_iterator()
1696 if (WARN_ON_ONCE(data->port_id >= MAX_PORT_ID_NUM)) in iwl_mvm_mc_iface_iterator()
1699 if (vif->type != NL80211_IFTYPE_STATION || in iwl_mvm_mc_iface_iterator()
1700 !vif->bss_conf.assoc) in iwl_mvm_mc_iface_iterator()
1703 cmd->port_id = data->port_id++; in iwl_mvm_mc_iface_iterator()
1704 memcpy(cmd->bssid, vif->bss_conf.bssid, ETH_ALEN); in iwl_mvm_mc_iface_iterator()
1705 len = roundup(sizeof(*cmd) + cmd->count * ETH_ALEN, 4); in iwl_mvm_mc_iface_iterator()
1721 lockdep_assert_held(&mvm->mutex); in iwl_mvm_recalc_multicast()
1723 if (WARN_ON_ONCE(!mvm->mcast_filter_cmd)) in iwl_mvm_recalc_multicast()
1727 mvm->hw, IEEE80211_IFACE_ITER_NORMAL, in iwl_mvm_recalc_multicast()
1753 cmd->pass_all = 1; in iwl_mvm_prepare_multicast()
1759 cmd->count, addr->addr); in iwl_mvm_prepare_multicast()
1760 memcpy(&cmd->addr_list[cmd->count * ETH_ALEN], in iwl_mvm_prepare_multicast()
1761 addr->addr, ETH_ALEN); in iwl_mvm_prepare_multicast()
1762 cmd->count++; in iwl_mvm_prepare_multicast()
1776 mutex_lock(&mvm->mutex); in iwl_mvm_configure_filter()
1779 kfree(mvm->mcast_filter_cmd); in iwl_mvm_configure_filter()
1780 mvm->mcast_filter_cmd = cmd; in iwl_mvm_configure_filter()
1786 cmd->pass_all = !!(*total_flags & FIF_ALLMULTI); in iwl_mvm_configure_filter()
1788 if (cmd->pass_all) in iwl_mvm_configure_filter()
1789 cmd->count = 0; in iwl_mvm_configure_filter()
1793 mutex_unlock(&mvm->mutex); in iwl_mvm_configure_filter()
1809 if (vif->type != NL80211_IFTYPE_STATION || !vif->bss_conf.assoc || in iwl_mvm_config_iface_filter()
1810 !vif->p2p) in iwl_mvm_config_iface_filter()
1813 mutex_lock(&mvm->mutex); in iwl_mvm_config_iface_filter()
1815 mutex_unlock(&mvm->mutex); in iwl_mvm_config_iface_filter()
1835 for (i = 0; i < ARRAY_SIZE(out_filter->attrs); i++) { in iwl_mvm_set_bcast_filter()
1836 attr = &out_filter->attrs[i]; in iwl_mvm_set_bcast_filter()
1838 if (!attr->mask) in iwl_mvm_set_bcast_filter()
1841 switch (attr->reserved1) { in iwl_mvm_set_bcast_filter()
1843 if (vif->bss_conf.arp_addr_cnt != 1) { in iwl_mvm_set_bcast_filter()
1844 attr->mask = 0; in iwl_mvm_set_bcast_filter()
1848 attr->val = vif->bss_conf.arp_addr_list[0]; in iwl_mvm_set_bcast_filter()
1851 attr->val = *(__be32 *)&vif->addr[2]; in iwl_mvm_set_bcast_filter()
1856 attr->reserved1 = 0; in iwl_mvm_set_bcast_filter()
1857 out_filter->num_attrs++; in iwl_mvm_set_bcast_filter()
1865 struct iwl_mvm *mvm = data->mvm; in iwl_mvm_bcast_filter_iterator()
1866 struct iwl_bcast_filter_cmd *cmd = data->cmd; in iwl_mvm_bcast_filter_iterator()
1871 if (WARN_ON(mvmvif->id >= ARRAY_SIZE(cmd->macs))) in iwl_mvm_bcast_filter_iterator()
1874 bcast_mac = &cmd->macs[mvmvif->id]; in iwl_mvm_bcast_filter_iterator()
1880 if (vif->type != NL80211_IFTYPE_STATION || vif->p2p || in iwl_mvm_bcast_filter_iterator()
1881 !vif->bss_conf.assoc) in iwl_mvm_bcast_filter_iterator()
1884 bcast_mac->default_discard = 1; in iwl_mvm_bcast_filter_iterator()
1887 for (i = 0; mvm->bcast_filters[i].attrs[0].mask; i++) { in iwl_mvm_bcast_filter_iterator()
1893 if (WARN_ON_ONCE(data->current_filter >= in iwl_mvm_bcast_filter_iterator()
1894 ARRAY_SIZE(cmd->filters))) { in iwl_mvm_bcast_filter_iterator()
1895 bcast_mac->default_discard = 0; in iwl_mvm_bcast_filter_iterator()
1896 bcast_mac->attached_filters = 0; in iwl_mvm_bcast_filter_iterator()
1901 &mvm->bcast_filters[i], in iwl_mvm_bcast_filter_iterator()
1902 &cmd->filters[data->current_filter]); in iwl_mvm_bcast_filter_iterator()
1905 if (!cmd->filters[data->current_filter].num_attrs) in iwl_mvm_bcast_filter_iterator()
1909 bcast_mac->attached_filters |= in iwl_mvm_bcast_filter_iterator()
1910 cpu_to_le16(BIT(data->current_filter)); in iwl_mvm_bcast_filter_iterator()
1912 data->current_filter++; in iwl_mvm_bcast_filter_iterator()
1928 cmd->max_bcast_filters = ARRAY_SIZE(cmd->filters); in iwl_mvm_bcast_filter_build_cmd()
1929 cmd->max_macs = ARRAY_SIZE(cmd->macs); in iwl_mvm_bcast_filter_build_cmd()
1933 if (mvm->dbgfs_bcast_filtering.override) { in iwl_mvm_bcast_filter_build_cmd()
1934 memcpy(cmd->filters, &mvm->dbgfs_bcast_filtering.cmd.filters, in iwl_mvm_bcast_filter_build_cmd()
1935 sizeof(cmd->filters)); in iwl_mvm_bcast_filter_build_cmd()
1936 memcpy(cmd->macs, &mvm->dbgfs_bcast_filtering.cmd.macs, in iwl_mvm_bcast_filter_build_cmd()
1937 sizeof(cmd->macs)); in iwl_mvm_bcast_filter_build_cmd()
1943 if (!mvm->bcast_filters) in iwl_mvm_bcast_filter_build_cmd()
1948 mvm->hw, IEEE80211_IFACE_ITER_NORMAL, in iwl_mvm_bcast_filter_build_cmd()
1958 if (!(mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_BCAST_FILTERING)) in iwl_mvm_configure_bcast_filter()
1979 memcpy(cmd.membership_status, vif->bss_conf.mu_group.membership, in iwl_mvm_update_mu_groups()
1981 memcpy(cmd.user_position, vif->bss_conf.mu_group.position, in iwl_mvm_update_mu_groups()
1993 if (vif->mu_mimo_owner) { in iwl_mvm_mu_mimo_iface_iterator()
1997 * MU-MIMO Group Id action frame is little endian. We treat in iwl_mvm_mu_mimo_iface_iterator()
2002 (u8 *)¬if->membership_status, in iwl_mvm_mu_mimo_iface_iterator()
2003 (u8 *)¬if->user_position); in iwl_mvm_mu_mimo_iface_iterator()
2011 struct iwl_mu_group_mgmt_notif *notif = (void *)pkt->data; in iwl_mvm_mu_mimo_grp_notif()
2014 mvm->hw, IEEE80211_IFACE_ITER_NORMAL, in iwl_mvm_mu_mimo_grp_notif()
2027 (BIT(IEEE80211_PPE_THRES_INFO_PPET_SIZE) - 1); in iwl_mvm_he_get_ppe_val()
2035 residue_bits = 8 - bit_num; in iwl_mvm_he_get_ppe_val()
2038 (BIT(IEEE80211_PPE_THRES_INFO_PPET_SIZE - residue_bits) - 1)) << in iwl_mvm_he_get_ppe_val()
2040 res += (ppe[byte_num] >> bit_num) & (BIT(residue_bits) - 1); in iwl_mvm_he_get_ppe_val()
2052 .bss_color = vif->bss_conf.he_bss_color.color, in iwl_mvm_cfg_he_sta()
2053 .htc_trig_based_pkt_ext = vif->bss_conf.htc_trig_based_pkt_ext, in iwl_mvm_cfg_he_sta()
2055 cpu_to_le16(vif->bss_conf.frame_time_rts_th), in iwl_mvm_cfg_he_sta()
2057 int size = fw_has_api(&mvm->fw->ucode_capa, in iwl_mvm_cfg_he_sta()
2067 sta = rcu_dereference(mvm->fw_id_to_mac_id[sta_ctxt_cmd.sta_id]); in iwl_mvm_cfg_he_sta()
2074 if (!sta->he_cap.has_he) { in iwl_mvm_cfg_he_sta()
2081 /* Block 26-tone RU OFDMA transmissions */ in iwl_mvm_cfg_he_sta()
2082 if (mvmvif->he_ru_2mhz_block) in iwl_mvm_cfg_he_sta()
2086 if (sta->he_cap.he_cap_elem.mac_cap_info[0] & in iwl_mvm_cfg_he_sta()
2089 if ((sta->he_cap.he_cap_elem.mac_cap_info[1] & in iwl_mvm_cfg_he_sta()
2091 (sta->he_cap.he_cap_elem.mac_cap_info[2] & in iwl_mvm_cfg_he_sta()
2094 ((sta->he_cap.he_cap_elem.mac_cap_info[2] & in iwl_mvm_cfg_he_sta()
2096 (sta->he_cap.he_cap_elem.mac_cap_info[1] & in iwl_mvm_cfg_he_sta()
2106 if (sta->he_cap.he_cap_elem.mac_cap_info[2] & IEEE80211_HE_MAC_CAP2_BSR) in iwl_mvm_cfg_he_sta()
2108 if (sta->he_cap.he_cap_elem.mac_cap_info[3] & in iwl_mvm_cfg_he_sta()
2111 if (sta->he_cap.he_cap_elem.mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_BQR) in iwl_mvm_cfg_he_sta()
2116 * 9-262ac of 80211.ax/D3.0. in iwl_mvm_cfg_he_sta()
2120 /* If PPE Thresholds exist, parse them into a FW-familiar format. */ in iwl_mvm_cfg_he_sta()
2121 if (sta->he_cap.he_cap_elem.phy_cap_info[6] & in iwl_mvm_cfg_he_sta()
2123 u8 nss = (sta->he_cap.ppe_thres[0] & in iwl_mvm_cfg_he_sta()
2126 (sta->he_cap.ppe_thres[0] & in iwl_mvm_cfg_he_sta()
2129 u8 *ppe = &sta->he_cap.ppe_thres[0]; in iwl_mvm_cfg_he_sta()
2139 IWL_INFO(mvm, "Got NSS = %d - trimming to %d\n", nss, in iwl_mvm_cfg_he_sta()
2167 } else if ((sta->he_cap.he_cap_elem.phy_cap_info[9] & in iwl_mvm_cfg_he_sta()
2170 int low_th = -1; in iwl_mvm_cfg_he_sta()
2171 int high_th = -1; in iwl_mvm_cfg_he_sta()
2174 switch (sta->he_cap.he_cap_elem.phy_cap_info[9] & in iwl_mvm_cfg_he_sta()
2200 pkt_ext->pkt_ext_qam_th[i][bw][0] = in iwl_mvm_cfg_he_sta()
2202 pkt_ext->pkt_ext_qam_th[i][bw][1] = in iwl_mvm_cfg_he_sta()
2211 if (sta->he_cap.he_cap_elem.mac_cap_info[2] & in iwl_mvm_cfg_he_sta()
2215 if (sta->he_cap.he_cap_elem.mac_cap_info[2] & in iwl_mvm_cfg_he_sta()
2225 &mvmvif->queue_params[i].mu_edca_param_rec; in iwl_mvm_cfg_he_sta()
2228 if (!mvmvif->queue_params[i].mu_edca) { in iwl_mvm_cfg_he_sta()
2234 cpu_to_le16(mu_edca->ecw_min_max & 0xf); in iwl_mvm_cfg_he_sta()
2236 cpu_to_le16((mu_edca->ecw_min_max & 0xf0) >> 4); in iwl_mvm_cfg_he_sta()
2238 cpu_to_le16(mu_edca->aifsn); in iwl_mvm_cfg_he_sta()
2240 cpu_to_le16(mu_edca->mu_edca_timer); in iwl_mvm_cfg_he_sta()
2244 if (vif->bss_conf.uora_exists) { in iwl_mvm_cfg_he_sta()
2248 vif->bss_conf.uora_ocw_range & 0x7; in iwl_mvm_cfg_he_sta()
2250 (vif->bss_conf.uora_ocw_range >> 3) & 0x7; in iwl_mvm_cfg_he_sta()
2253 if (vif->bss_conf.nontransmitted) { in iwl_mvm_cfg_he_sta()
2256 vif->bss_conf.transmitter_bssid); in iwl_mvm_cfg_he_sta()
2258 vif->bss_conf.bssid_indicator; in iwl_mvm_cfg_he_sta()
2259 sta_ctxt_cmd.bssid_index = vif->bss_conf.bssid_index; in iwl_mvm_cfg_he_sta()
2260 sta_ctxt_cmd.ema_ap = vif->bss_conf.ema_ap; in iwl_mvm_cfg_he_sta()
2262 vif->bss_conf.profile_periodicity; in iwl_mvm_cfg_he_sta()
2282 * Re-calculate the tsf id, as the master-slave relations depend on the in iwl_mvm_bss_info_changed_station()
2286 if (changes & BSS_CHANGED_ASSOC && bss_conf->assoc) { in iwl_mvm_bss_info_changed_station()
2287 if (vif->bss_conf.he_support && in iwl_mvm_bss_info_changed_station()
2289 iwl_mvm_cfg_he_sta(mvm, vif, mvmvif->ap_sta_id); in iwl_mvm_bss_info_changed_station()
2295 if (changes & BSS_CHANGED_QOS && mvmvif->associated && in iwl_mvm_bss_info_changed_station()
2296 bss_conf->assoc && vif->bss_conf.he_support && in iwl_mvm_bss_info_changed_station()
2298 iwl_mvm_cfg_he_sta(mvm, vif, mvmvif->ap_sta_id); in iwl_mvm_bss_info_changed_station()
2306 if (changes & BSS_CHANGED_BSSID && !mvmvif->associated) in iwl_mvm_bss_info_changed_station()
2307 memcpy(mvmvif->bssid, bss_conf->bssid, ETH_ALEN); in iwl_mvm_bss_info_changed_station()
2309 ret = iwl_mvm_mac_ctxt_changed(mvm, vif, false, mvmvif->bssid); in iwl_mvm_bss_info_changed_station()
2311 IWL_ERR(mvm, "failed to update MAC %pM\n", vif->addr); in iwl_mvm_bss_info_changed_station()
2314 memcpy(mvmvif->bssid, bss_conf->bssid, ETH_ALEN); in iwl_mvm_bss_info_changed_station()
2315 mvmvif->associated = bss_conf->assoc; in iwl_mvm_bss_info_changed_station()
2318 if (bss_conf->assoc) { in iwl_mvm_bss_info_changed_station()
2321 memset(&mvmvif->beacon_stats, 0, in iwl_mvm_bss_info_changed_station()
2322 sizeof(mvmvif->beacon_stats)); in iwl_mvm_bss_info_changed_station()
2332 &mvm->status) && in iwl_mvm_bss_info_changed_station()
2333 !fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_bss_info_changed_station()
2353 u32 dur = (11 * vif->bss_conf.beacon_int) / 10; in iwl_mvm_bss_info_changed_station()
2360 if (vif->p2p) { in iwl_mvm_bss_info_changed_station()
2365 } else if (mvmvif->ap_sta_id != IWL_MVM_INVALID_STA) { in iwl_mvm_bss_info_changed_station()
2367 * If update fails - SF might be running in associated in iwl_mvm_bss_info_changed_station()
2368 * mode while disassociated - which is forbidden. in iwl_mvm_bss_info_changed_station()
2373 &mvm->status), in iwl_mvm_bss_info_changed_station()
2379 * to associated), mac80211 will re-add the station and in iwl_mvm_bss_info_changed_station()
2385 &mvm->status)) { in iwl_mvm_bss_info_changed_station()
2391 mvmvif->ap_sta_id); in iwl_mvm_bss_info_changed_station()
2396 mvmvif->ap_sta_id = IWL_MVM_INVALID_STA; in iwl_mvm_bss_info_changed_station()
2409 vif->addr); in iwl_mvm_bss_info_changed_station()
2413 * The firmware tracks the MU-MIMO group on its own. in iwl_mvm_bss_info_changed_station()
2416 if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status) && in iwl_mvm_bss_info_changed_station()
2417 (changes & BSS_CHANGED_MU_GROUPS) && vif->mu_mimo_owner) { in iwl_mvm_bss_info_changed_station()
2428 mvmvif->bf_data.ave_beacon_signal = 0; in iwl_mvm_bss_info_changed_station()
2433 if (fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_bss_info_changed_station()
2444 if (!fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_bss_info_changed_station()
2465 bss_conf->txpower); in iwl_mvm_bss_info_changed_station()
2466 iwl_mvm_set_tx_power(mvm, vif, bss_conf->txpower); in iwl_mvm_bss_info_changed_station()
2472 mvmvif->bf_data.last_cqm_event = 0; in iwl_mvm_bss_info_changed_station()
2473 if (mvmvif->bf_data.bf_enabled) { in iwl_mvm_bss_info_changed_station()
2494 mutex_lock(&mvm->mutex); in iwl_mvm_start_ap_ibss()
2502 * Re-calculate the tsf id, as the master-slave relations depend on the in iwl_mvm_start_ap_ibss()
2505 if (vif->type == NL80211_IFTYPE_AP) in iwl_mvm_start_ap_ibss()
2508 mvmvif->ap_assoc_sta_count = 0; in iwl_mvm_start_ap_ibss()
2527 if (fw_has_api(&mvm->fw->ucode_capa, IWL_UCODE_TLV_API_STA_TYPE)) { in iwl_mvm_start_ap_ibss()
2556 mvmvif->ap_ibss_active = true; in iwl_mvm_start_ap_ibss()
2559 for (i = 0; i < ARRAY_SIZE(mvmvif->ap_early_keys); i++) { in iwl_mvm_start_ap_ibss()
2560 struct ieee80211_key_conf *key = mvmvif->ap_early_keys[i]; in iwl_mvm_start_ap_ibss()
2565 mvmvif->ap_early_keys[i] = NULL; in iwl_mvm_start_ap_ibss()
2572 if (vif->type == NL80211_IFTYPE_AP && !vif->p2p) { in iwl_mvm_start_ap_ibss()
2575 iwl_mvm_send_low_latency_cmd(mvm, true, mvmvif->id); in iwl_mvm_start_ap_ibss()
2586 if (vif->p2p && mvm->p2p_device_vif) in iwl_mvm_start_ap_ibss()
2587 iwl_mvm_mac_ctxt_changed(mvm, mvm->p2p_device_vif, false, NULL); in iwl_mvm_start_ap_ibss()
2601 mvmvif->ap_ibss_active = false; in iwl_mvm_start_ap_ibss()
2609 mutex_unlock(&mvm->mutex); in iwl_mvm_start_ap_ibss()
2621 mutex_lock(&mvm->mutex); in iwl_mvm_stop_ap_ibss()
2624 if (rcu_access_pointer(mvm->csa_vif) == vif) { in iwl_mvm_stop_ap_ibss()
2626 &mvmvif->time_event_data); in iwl_mvm_stop_ap_ibss()
2627 RCU_INIT_POINTER(mvm->csa_vif, NULL); in iwl_mvm_stop_ap_ibss()
2628 mvmvif->csa_countdown = false; in iwl_mvm_stop_ap_ibss()
2631 if (rcu_access_pointer(mvm->csa_tx_blocked_vif) == vif) { in iwl_mvm_stop_ap_ibss()
2632 RCU_INIT_POINTER(mvm->csa_tx_blocked_vif, NULL); in iwl_mvm_stop_ap_ibss()
2633 mvm->csa_tx_block_bcn_timeout = 0; in iwl_mvm_stop_ap_ibss()
2636 mvmvif->ap_ibss_active = false; in iwl_mvm_stop_ap_ibss()
2637 mvm->ap_last_beacon_gp2 = 0; in iwl_mvm_stop_ap_ibss()
2639 if (vif->type == NL80211_IFTYPE_AP && !vif->p2p) { in iwl_mvm_stop_ap_ibss()
2642 iwl_mvm_send_low_latency_cmd(mvm, false, mvmvif->id); in iwl_mvm_stop_ap_ibss()
2648 if (vif->p2p && mvm->p2p_device_vif) in iwl_mvm_stop_ap_ibss()
2649 iwl_mvm_mac_ctxt_changed(mvm, mvm->p2p_device_vif, false, NULL); in iwl_mvm_stop_ap_ibss()
2663 if (!fw_has_api(&mvm->fw->ucode_capa, IWL_UCODE_TLV_API_STA_TYPE)) in iwl_mvm_stop_ap_ibss()
2666 if (fw_has_api(&mvm->fw->ucode_capa, IWL_UCODE_TLV_API_STA_TYPE)) in iwl_mvm_stop_ap_ibss()
2674 mutex_unlock(&mvm->mutex); in iwl_mvm_stop_ap_ibss()
2686 if (!mvmvif->ap_ibss_active) in iwl_mvm_bss_info_changed_ap_ibss()
2692 IWL_ERR(mvm, "failed to update MAC %pM\n", vif->addr); in iwl_mvm_bss_info_changed_ap_ibss()
2701 bss_conf->txpower); in iwl_mvm_bss_info_changed_ap_ibss()
2702 iwl_mvm_set_tx_power(mvm, vif, bss_conf->txpower); in iwl_mvm_bss_info_changed_ap_ibss()
2722 mutex_lock(&mvm->mutex); in iwl_mvm_bss_info_changed()
2724 if (changes & BSS_CHANGED_IDLE && !bss_conf->idle) in iwl_mvm_bss_info_changed()
2727 switch (vif->type) { in iwl_mvm_bss_info_changed()
2744 mutex_unlock(&mvm->mutex); in iwl_mvm_bss_info_changed()
2754 if (hw_req->req.n_channels == 0 || in iwl_mvm_mac_hw_scan()
2755 hw_req->req.n_channels > mvm->fw->ucode_capa.n_scan_channels) in iwl_mvm_mac_hw_scan()
2756 return -EINVAL; in iwl_mvm_mac_hw_scan()
2758 mutex_lock(&mvm->mutex); in iwl_mvm_mac_hw_scan()
2759 ret = iwl_mvm_reg_scan_start(mvm, vif, &hw_req->req, &hw_req->ies); in iwl_mvm_mac_hw_scan()
2760 mutex_unlock(&mvm->mutex); in iwl_mvm_mac_hw_scan()
2770 mutex_lock(&mvm->mutex); in iwl_mvm_mac_cancel_hw_scan()
2779 if (mvm->scan_status & IWL_MVM_SCAN_REGULAR) in iwl_mvm_mac_cancel_hw_scan()
2782 mutex_unlock(&mvm->mutex); in iwl_mvm_mac_cancel_hw_scan()
2825 * If we have TVQM then we get too high queue numbers - luckily in __iwl_mvm_mac_sta_notify()
2832 spin_lock_bh(&mvmsta->lock); in __iwl_mvm_mac_sta_notify()
2833 for (tid = 0; tid < ARRAY_SIZE(mvmsta->tid_data); tid++) { in __iwl_mvm_mac_sta_notify()
2834 struct iwl_mvm_tid_data *tid_data = &mvmsta->tid_data[tid]; in __iwl_mvm_mac_sta_notify()
2836 if (tid_data->txq_id == IWL_MVM_INVALID_QUEUE) in __iwl_mvm_mac_sta_notify()
2839 __set_bit(tid_data->txq_id, &txqs); in __iwl_mvm_mac_sta_notify()
2853 iwl_trans_freeze_txq_timer(mvm->trans, txqs, true); in __iwl_mvm_mac_sta_notify()
2861 if (WARN_ON(mvmsta->sta_id == IWL_MVM_INVALID_STA)) in __iwl_mvm_mac_sta_notify()
2865 iwl_trans_freeze_txq_timer(mvm->trans, txqs, false); in __iwl_mvm_mac_sta_notify()
2871 spin_unlock_bh(&mvmsta->lock); in __iwl_mvm_mac_sta_notify()
2885 struct iwl_mvm_pm_state_notification *notif = (void *)pkt->data; in iwl_mvm_sta_pm_notif()
2888 bool sleeping = (notif->type != IWL_MVM_PM_EVENT_AWAKE); in iwl_mvm_sta_pm_notif()
2890 if (WARN_ON(notif->sta_id >= mvm->fw->ucode_capa.num_stations)) in iwl_mvm_sta_pm_notif()
2894 sta = rcu_dereference(mvm->fw_id_to_mac_id[notif->sta_id]); in iwl_mvm_sta_pm_notif()
2902 if (!mvmsta->vif || in iwl_mvm_sta_pm_notif()
2903 mvmsta->vif->type != NL80211_IFTYPE_AP) { in iwl_mvm_sta_pm_notif()
2908 if (mvmsta->sleeping != sleeping) { in iwl_mvm_sta_pm_notif()
2909 mvmsta->sleeping = sleeping; in iwl_mvm_sta_pm_notif()
2910 __iwl_mvm_mac_sta_notify(mvm->hw, in iwl_mvm_sta_pm_notif()
2917 switch (notif->type) { in iwl_mvm_sta_pm_notif()
2944 * so here we already invalidate our internal RCU-protected in iwl_mvm_sta_pre_rcu_remove()
2950 mutex_lock(&mvm->mutex); in iwl_mvm_sta_pre_rcu_remove()
2951 if (sta == rcu_access_pointer(mvm->fw_id_to_mac_id[mvm_sta->sta_id])) in iwl_mvm_sta_pre_rcu_remove()
2952 rcu_assign_pointer(mvm->fw_id_to_mac_id[mvm_sta->sta_id], in iwl_mvm_sta_pre_rcu_remove()
2953 ERR_PTR(-ENOENT)); in iwl_mvm_sta_pre_rcu_remove()
2955 mutex_unlock(&mvm->mutex); in iwl_mvm_sta_pre_rcu_remove()
2963 if (!test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)) { in iwl_mvm_check_uapsd()
2966 mdata = &mvm->tcm.data[iwl_mvm_vif_from_mac80211(vif)->id]; in iwl_mvm_check_uapsd()
2967 ewma_rate_init(&mdata->uapsd_nonagg_detect.rate); in iwl_mvm_check_uapsd()
2968 mdata->opened_rx_ba_sessions = false; in iwl_mvm_check_uapsd()
2971 if (!(mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_UAPSD_SUPPORT)) in iwl_mvm_check_uapsd()
2974 if (vif->p2p && !iwl_mvm_is_p2p_scm_uapsd_supported(mvm)) { in iwl_mvm_check_uapsd()
2975 vif->driver_flags &= ~IEEE80211_VIF_SUPPORTS_UAPSD; in iwl_mvm_check_uapsd()
2979 if (!vif->p2p && in iwl_mvm_check_uapsd()
2981 vif->driver_flags &= ~IEEE80211_VIF_SUPPORTS_UAPSD; in iwl_mvm_check_uapsd()
2986 if (ether_addr_equal(mvm->uapsd_noagg_bssids[i].addr, bssid)) { in iwl_mvm_check_uapsd()
2987 vif->driver_flags &= ~IEEE80211_VIF_SUPPORTS_UAPSD; in iwl_mvm_check_uapsd()
2992 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD; in iwl_mvm_check_uapsd()
3003 trig = iwl_fw_dbg_trigger_on(&mvm->fwrt, ieee80211_vif_to_wdev(vif), in iwl_mvm_tdls_check_trigger()
3008 tdls_trig = (void *)trig->data; in iwl_mvm_tdls_check_trigger()
3010 if (!(tdls_trig->action_bitmap & BIT(action))) in iwl_mvm_tdls_check_trigger()
3013 if (tdls_trig->peer_mode && in iwl_mvm_tdls_check_trigger()
3014 memcmp(tdls_trig->peer, peer_addr, ETH_ALEN) != 0) in iwl_mvm_tdls_check_trigger()
3017 iwl_fw_dbg_collect_trig(&mvm->fwrt, trig, in iwl_mvm_tdls_check_trigger()
3033 elem = cfg80211_find_elem(WLAN_EID_EXT_CAPABILITY, bss->ies->data, in iwl_mvm_check_he_obss_narrow_bw_ru_iter()
3034 bss->ies->len); in iwl_mvm_check_he_obss_narrow_bw_ru_iter()
3036 if (!elem || elem->datalen < 10 || in iwl_mvm_check_he_obss_narrow_bw_ru_iter()
3037 !(elem->data[10] & in iwl_mvm_check_he_obss_narrow_bw_ru_iter()
3039 data->tolerated = false; in iwl_mvm_check_he_obss_narrow_bw_ru_iter()
3051 if (!(vif->bss_conf.chandef.chan->flags & IEEE80211_CHAN_RADAR)) { in iwl_mvm_check_he_obss_narrow_bw_ru()
3052 mvmvif->he_ru_2mhz_block = false; in iwl_mvm_check_he_obss_narrow_bw_ru()
3056 cfg80211_bss_iter(hw->wiphy, &vif->bss_conf.chandef, in iwl_mvm_check_he_obss_narrow_bw_ru()
3062 * tolerate 26-tone RU UL OFDMA transmissions using HE TB PPDU. in iwl_mvm_check_he_obss_narrow_bw_ru()
3064 mvmvif->he_ru_2mhz_block = !iter_data.tolerated; in iwl_mvm_check_he_obss_narrow_bw_ru()
3078 IWL_DEBUG_MAC80211(mvm, "station %pM state change %d->%d\n", in iwl_mvm_mac_sta_state()
3079 sta->addr, old_state, new_state); in iwl_mvm_mac_sta_state()
3082 if (WARN_ON_ONCE(!mvmvif->phy_ctxt)) in iwl_mvm_mac_sta_state()
3083 return test_bit(IWL_MVM_STATUS_HW_RESTART_REQUESTED, &mvm->status) ? 0 : -EINVAL; in iwl_mvm_mac_sta_state()
3095 * Drop any still-queued deferred-frame before removing the STA, and in iwl_mvm_mac_sta_state()
3100 flush_work(&mvm->add_stream_wk); in iwl_mvm_mac_sta_state()
3108 mutex_lock(&mvm->mutex); in iwl_mvm_mac_sta_state()
3110 mvm_sta->sta_state = new_state; in iwl_mvm_mac_sta_state()
3115 * Firmware bug - it'll crash if the beacon interval is less in iwl_mvm_mac_sta_state()
3121 if (vif->type == NL80211_IFTYPE_STATION && in iwl_mvm_mac_sta_state()
3122 vif->bss_conf.beacon_int < 16) { in iwl_mvm_mac_sta_state()
3125 sta->addr, vif->bss_conf.beacon_int); in iwl_mvm_mac_sta_state()
3126 ret = -EINVAL; in iwl_mvm_mac_sta_state()
3130 if (vif->type == NL80211_IFTYPE_STATION) in iwl_mvm_mac_sta_state()
3131 vif->bss_conf.he_support = sta->he_cap.has_he; in iwl_mvm_mac_sta_state()
3133 if (sta->tdls && in iwl_mvm_mac_sta_state()
3134 (vif->p2p || in iwl_mvm_mac_sta_state()
3139 ret = -EBUSY; in iwl_mvm_mac_sta_state()
3144 if (sta->tdls && ret == 0) { in iwl_mvm_mac_sta_state()
3146 iwl_mvm_tdls_check_trigger(mvm, vif, sta->addr, in iwl_mvm_mac_sta_state()
3150 sta->max_rc_amsdu_len = 1; in iwl_mvm_mac_sta_state()
3157 mvm->last_ebs_successful = true; in iwl_mvm_mac_sta_state()
3158 iwl_mvm_check_uapsd(mvm, vif, sta->addr); in iwl_mvm_mac_sta_state()
3162 if (vif->type == NL80211_IFTYPE_AP) { in iwl_mvm_mac_sta_state()
3163 vif->bss_conf.he_support = sta->he_cap.has_he; in iwl_mvm_mac_sta_state()
3164 mvmvif->ap_assoc_sta_count++; in iwl_mvm_mac_sta_state()
3166 if (vif->bss_conf.he_support && in iwl_mvm_mac_sta_state()
3168 iwl_mvm_cfg_he_sta(mvm, vif, mvm_sta->sta_id); in iwl_mvm_mac_sta_state()
3169 } else if (vif->type == NL80211_IFTYPE_STATION) { in iwl_mvm_mac_sta_state()
3170 vif->bss_conf.he_support = sta->he_cap.has_he; in iwl_mvm_mac_sta_state()
3172 mvmvif->he_ru_2mhz_block = false; in iwl_mvm_mac_sta_state()
3173 if (sta->he_cap.has_he) in iwl_mvm_mac_sta_state()
3179 iwl_mvm_rs_rate_init(mvm, sta, mvmvif->phy_ctxt->channel->band, in iwl_mvm_mac_sta_state()
3190 if (sta->tdls) in iwl_mvm_mac_sta_state()
3191 iwl_mvm_tdls_check_trigger(mvm, vif, sta->addr, in iwl_mvm_mac_sta_state()
3204 iwl_mvm_rs_rate_init(mvm, sta, mvmvif->phy_ctxt->channel->band, in iwl_mvm_mac_sta_state()
3215 &mvm->status)); in iwl_mvm_mac_sta_state()
3219 if (vif->type == NL80211_IFTYPE_AP) { in iwl_mvm_mac_sta_state()
3220 mvmvif->ap_assoc_sta_count--; in iwl_mvm_mac_sta_state()
3230 if (sta->tdls) { in iwl_mvm_mac_sta_state()
3232 iwl_mvm_tdls_check_trigger(mvm, vif, sta->addr, in iwl_mvm_mac_sta_state()
3238 &mvm->status))) in iwl_mvm_mac_sta_state()
3241 ret = -EIO; in iwl_mvm_mac_sta_state()
3244 mutex_unlock(&mvm->mutex); in iwl_mvm_mac_sta_state()
3246 if (sta->tdls && ret == 0) { in iwl_mvm_mac_sta_state()
3262 mvm->rts_threshold = value; in iwl_mvm_mac_set_rts_threshold()
3277 iwl_mvm_rs_rate_init(mvm, sta, mvmvif->phy_ctxt->channel->band, in iwl_mvm_sta_rc_update()
3280 if (vif->type == NL80211_IFTYPE_STATION && in iwl_mvm_sta_rc_update()
3292 mvmvif->queue_params[ac] = *params; in iwl_mvm_mac_conf_tx()
3298 if (vif->type == NL80211_IFTYPE_P2P_DEVICE) { in iwl_mvm_mac_conf_tx()
3301 mutex_lock(&mvm->mutex); in iwl_mvm_mac_conf_tx()
3303 mutex_unlock(&mvm->mutex); in iwl_mvm_mac_conf_tx()
3320 mutex_lock(&mvm->mutex); in iwl_mvm_mac_mgd_prepare_tx()
3330 if (fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_mac_mgd_prepare_tx()
3337 mutex_unlock(&mvm->mutex); in iwl_mvm_mac_mgd_prepare_tx()
3349 mutex_lock(&mvm->mutex); in iwl_mvm_mac_sched_scan_start()
3351 if (!vif->bss_conf.idle) { in iwl_mvm_mac_sched_scan_start()
3352 ret = -EBUSY; in iwl_mvm_mac_sched_scan_start()
3359 mutex_unlock(&mvm->mutex); in iwl_mvm_mac_sched_scan_start()
3369 mutex_lock(&mvm->mutex); in iwl_mvm_mac_sched_scan_stop()
3379 if (!(mvm->scan_status & IWL_MVM_SCAN_SCHED)) { in iwl_mvm_mac_sched_scan_stop()
3380 mutex_unlock(&mvm->mutex); in iwl_mvm_mac_sched_scan_stop()
3385 mutex_unlock(&mvm->mutex); in iwl_mvm_mac_sched_scan_stop()
3401 int keyidx = key->keyidx; in __iwl_mvm_mac_set_key()
3405 switch (key->cipher) { in __iwl_mvm_mac_set_key()
3407 if (!mvm->trans->trans_cfg->gen2) { in __iwl_mvm_mac_set_key()
3408 key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC; in __iwl_mvm_mac_set_key()
3409 key->flags |= IEEE80211_KEY_FLAG_PUT_IV_SPACE; in __iwl_mvm_mac_set_key()
3410 } else if (vif->type == NL80211_IFTYPE_STATION) { in __iwl_mvm_mac_set_key()
3411 key->flags |= IEEE80211_KEY_FLAG_PUT_MIC_SPACE; in __iwl_mvm_mac_set_key()
3414 return -EOPNOTSUPP; in __iwl_mvm_mac_set_key()
3421 key->flags |= IEEE80211_KEY_FLAG_PUT_IV_SPACE; in __iwl_mvm_mac_set_key()
3430 if (vif->type == NL80211_IFTYPE_STATION) in __iwl_mvm_mac_set_key()
3433 return -EOPNOTSUPP; in __iwl_mvm_mac_set_key()
3438 if (hw->n_cipher_schemes && in __iwl_mvm_mac_set_key()
3439 hw->cipher_schemes->cipher == key->cipher) in __iwl_mvm_mac_set_key()
3440 key->flags |= IEEE80211_KEY_FLAG_PUT_IV_SPACE; in __iwl_mvm_mac_set_key()
3442 return -EOPNOTSUPP; in __iwl_mvm_mac_set_key()
3447 if ((vif->type == NL80211_IFTYPE_ADHOC || in __iwl_mvm_mac_set_key()
3448 vif->type == NL80211_IFTYPE_AP) && !sta) { in __iwl_mvm_mac_set_key()
3450 * GTK on AP interface is a TX-only key, return 0; in __iwl_mvm_mac_set_key()
3451 * on IBSS they're per-station and because we're lazy in __iwl_mvm_mac_set_key()
3455 if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC || in __iwl_mvm_mac_set_key()
3456 key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 || in __iwl_mvm_mac_set_key()
3457 key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256) { in __iwl_mvm_mac_set_key()
3458 ret = -EOPNOTSUPP; in __iwl_mvm_mac_set_key()
3462 if (key->cipher != WLAN_CIPHER_SUITE_GCMP && in __iwl_mvm_mac_set_key()
3463 key->cipher != WLAN_CIPHER_SUITE_GCMP_256 && in __iwl_mvm_mac_set_key()
3465 key->hw_key_idx = STA_KEY_IDX_INVALID; in __iwl_mvm_mac_set_key()
3470 if (!mvmvif->ap_ibss_active) { in __iwl_mvm_mac_set_key()
3472 i < ARRAY_SIZE(mvmvif->ap_early_keys); in __iwl_mvm_mac_set_key()
3474 if (!mvmvif->ap_early_keys[i]) { in __iwl_mvm_mac_set_key()
3475 mvmvif->ap_early_keys[i] = key; in __iwl_mvm_mac_set_key()
3480 if (i >= ARRAY_SIZE(mvmvif->ap_early_keys)) in __iwl_mvm_mac_set_key()
3481 ret = -ENOSPC; in __iwl_mvm_mac_set_key()
3492 if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status) && in __iwl_mvm_mac_set_key()
3493 key->hw_key_idx == STA_KEY_IDX_INVALID) { in __iwl_mvm_mac_set_key()
3500 if (!test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status) && in __iwl_mvm_mac_set_key()
3502 key->flags & IEEE80211_KEY_FLAG_PAIRWISE && in __iwl_mvm_mac_set_key()
3503 (key->cipher == WLAN_CIPHER_SUITE_CCMP || in __iwl_mvm_mac_set_key()
3504 key->cipher == WLAN_CIPHER_SUITE_GCMP || in __iwl_mvm_mac_set_key()
3505 key->cipher == WLAN_CIPHER_SUITE_GCMP_256)) { in __iwl_mvm_mac_set_key()
3510 WARN_ON(rcu_access_pointer(mvmsta->ptk_pn[keyidx])); in __iwl_mvm_mac_set_key()
3512 mvm->trans->num_rx_queues), in __iwl_mvm_mac_set_key()
3515 ret = -ENOMEM; in __iwl_mvm_mac_set_key()
3521 for (q = 0; q < mvm->trans->num_rx_queues; q++) in __iwl_mvm_mac_set_key()
3522 memcpy(ptk_pn->q[q].pn[tid], in __iwl_mvm_mac_set_key()
3527 rcu_assign_pointer(mvmsta->ptk_pn[keyidx], ptk_pn); in __iwl_mvm_mac_set_key()
3531 if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)) in __iwl_mvm_mac_set_key()
3532 key_offset = key->hw_key_idx; in __iwl_mvm_mac_set_key()
3540 key->hw_key_idx = STA_KEY_IDX_INVALID; in __iwl_mvm_mac_set_key()
3548 ret = -EOPNOTSUPP; in __iwl_mvm_mac_set_key()
3555 ret = -ENOENT; in __iwl_mvm_mac_set_key()
3556 for (i = 0; i < ARRAY_SIZE(mvmvif->ap_early_keys); i++) { in __iwl_mvm_mac_set_key()
3557 if (mvmvif->ap_early_keys[i] == key) { in __iwl_mvm_mac_set_key()
3558 mvmvif->ap_early_keys[i] = NULL; in __iwl_mvm_mac_set_key()
3563 /* found in pending list - don't do anything else */ in __iwl_mvm_mac_set_key()
3567 if (key->hw_key_idx == STA_KEY_IDX_INVALID) { in __iwl_mvm_mac_set_key()
3573 key->flags & IEEE80211_KEY_FLAG_PAIRWISE && in __iwl_mvm_mac_set_key()
3574 (key->cipher == WLAN_CIPHER_SUITE_CCMP || in __iwl_mvm_mac_set_key()
3575 key->cipher == WLAN_CIPHER_SUITE_GCMP || in __iwl_mvm_mac_set_key()
3576 key->cipher == WLAN_CIPHER_SUITE_GCMP_256)) { in __iwl_mvm_mac_set_key()
3579 mvmsta->ptk_pn[keyidx], in __iwl_mvm_mac_set_key()
3580 lockdep_is_held(&mvm->mutex)); in __iwl_mvm_mac_set_key()
3581 RCU_INIT_POINTER(mvmsta->ptk_pn[keyidx], NULL); in __iwl_mvm_mac_set_key()
3590 ret = -EINVAL; in __iwl_mvm_mac_set_key()
3605 mutex_lock(&mvm->mutex); in iwl_mvm_mac_set_key()
3607 mutex_unlock(&mvm->mutex); in iwl_mvm_mac_set_key()
3620 if (keyconf->hw_key_idx == STA_KEY_IDX_INVALID) in iwl_mvm_mac_update_tkip_key()
3636 if (WARN_ON(pkt->hdr.cmd != HOT_SPOT_CMD)) in iwl_mvm_rx_aux_roc()
3644 resp = (void *)pkt->data; in iwl_mvm_rx_aux_roc()
3648 resp->status, resp->event_unique_id); in iwl_mvm_rx_aux_roc()
3650 te_data->uid = le32_to_cpu(resp->event_unique_id); in iwl_mvm_rx_aux_roc()
3651 IWL_DEBUG_TE(mvm, "TIME_EVENT_CMD response - UID = 0x%x\n", in iwl_mvm_rx_aux_roc()
3652 te_data->uid); in iwl_mvm_rx_aux_roc()
3654 spin_lock_bh(&mvm->time_event_lock); in iwl_mvm_rx_aux_roc()
3655 list_add_tail(&te_data->list, &mvm->aux_roc_te_list); in iwl_mvm_rx_aux_roc()
3656 spin_unlock_bh(&mvm->time_event_lock); in iwl_mvm_rx_aux_roc()
3673 struct iwl_mvm_time_event_data *te_data = &mvmvif->hs_time_event_data; in iwl_mvm_send_aux_roc_cmd()
3676 u32 dtim_interval = vif->bss_conf.dtim_period * in iwl_mvm_send_aux_roc_cmd()
3677 vif->bss_conf.beacon_int; in iwl_mvm_send_aux_roc_cmd()
3683 .sta_id_and_color = cpu_to_le32(mvm->aux_sta.sta_id), in iwl_mvm_send_aux_roc_cmd()
3687 u16 len = sizeof(aux_roc_req) - iwl_mvm_chan_info_padding(mvm); in iwl_mvm_send_aux_roc_cmd()
3690 iwl_mvm_set_chan_info(mvm, &aux_roc_req.channel_info, channel->hw_value, in iwl_mvm_send_aux_roc_cmd()
3691 iwl_mvm_phy_band_from_nl80211(channel->band), in iwl_mvm_send_aux_roc_cmd()
3696 tail->apply_time = cpu_to_le32(iwl_mvm_get_systime(mvm)); in iwl_mvm_send_aux_roc_cmd()
3705 * remain off-channel for the max duration. in iwl_mvm_send_aux_roc_cmd()
3707 * like the delay to be for 2-3 dtim intervals, in case there are in iwl_mvm_send_aux_roc_cmd()
3710 if (vif->bss_conf.assoc) { in iwl_mvm_send_aux_roc_cmd()
3712 /* We cannot remain off-channel longer than the DTIM interval */ in iwl_mvm_send_aux_roc_cmd()
3714 req_dur = dtim_interval - AUX_ROC_SAFETY_BUFFER; in iwl_mvm_send_aux_roc_cmd()
3716 req_dur = dtim_interval - in iwl_mvm_send_aux_roc_cmd()
3721 tail->duration = cpu_to_le32(req_dur); in iwl_mvm_send_aux_roc_cmd()
3722 tail->apply_time_max_delay = cpu_to_le32(delay); in iwl_mvm_send_aux_roc_cmd()
3726 channel->hw_value, req_dur); in iwl_mvm_send_aux_roc_cmd()
3732 memcpy(tail->node_addr, vif->addr, ETH_ALEN); in iwl_mvm_send_aux_roc_cmd()
3734 lockdep_assert_held(&mvm->mutex); in iwl_mvm_send_aux_roc_cmd()
3736 spin_lock_bh(&mvm->time_event_lock); in iwl_mvm_send_aux_roc_cmd()
3738 if (WARN_ON(te_data->id == HOT_SPOT_CMD)) { in iwl_mvm_send_aux_roc_cmd()
3739 spin_unlock_bh(&mvm->time_event_lock); in iwl_mvm_send_aux_roc_cmd()
3740 return -EIO; in iwl_mvm_send_aux_roc_cmd()
3743 te_data->vif = vif; in iwl_mvm_send_aux_roc_cmd()
3744 te_data->duration = duration; in iwl_mvm_send_aux_roc_cmd()
3745 te_data->id = HOT_SPOT_CMD; in iwl_mvm_send_aux_roc_cmd()
3747 spin_unlock_bh(&mvm->time_event_lock); in iwl_mvm_send_aux_roc_cmd()
3758 iwl_init_notification_wait(&mvm->notif_wait, &wait_time_event, in iwl_mvm_send_aux_roc_cmd()
3768 iwl_remove_notification(&mvm->notif_wait, &wait_time_event); in iwl_mvm_send_aux_roc_cmd()
3773 res = iwl_wait_notification(&mvm->notif_wait, &wait_time_event, 1); in iwl_mvm_send_aux_roc_cmd()
3779 spin_lock_bh(&mvm->time_event_lock); in iwl_mvm_send_aux_roc_cmd()
3781 spin_unlock_bh(&mvm->time_event_lock); in iwl_mvm_send_aux_roc_cmd()
3799 IWL_DEBUG_MAC80211(mvm, "enter (%d, %d, %d)\n", channel->hw_value, in iwl_mvm_roc()
3806 flush_work(&mvm->roc_done_wk); in iwl_mvm_roc()
3808 mutex_lock(&mvm->mutex); in iwl_mvm_roc()
3810 switch (vif->type) { in iwl_mvm_roc()
3812 if (fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_roc()
3815 if (iwl_fw_lookup_cmd_ver(mvm->fw, LONG_GROUP, in iwl_mvm_roc()
3819 lmac_id = iwl_mvm_get_lmac_id(mvm->fw, in iwl_mvm_roc()
3820 channel->band); in iwl_mvm_roc()
3831 ret = -EINVAL; in iwl_mvm_roc()
3837 IWL_ERR(mvm, "vif isn't P2P_DEVICE: %d\n", vif->type); in iwl_mvm_roc()
3838 ret = -EINVAL; in iwl_mvm_roc()
3843 phy_ctxt = &mvm->phy_ctxts[i]; in iwl_mvm_roc()
3844 if (phy_ctxt->ref == 0 || mvmvif->phy_ctxt == phy_ctxt) in iwl_mvm_roc()
3847 if (phy_ctxt->ref && channel == phy_ctxt->channel) { in iwl_mvm_roc()
3856 iwl_mvm_phy_ctxt_unref(mvm, mvmvif->phy_ctxt); in iwl_mvm_roc()
3859 mvmvif->phy_ctxt = phy_ctxt; in iwl_mvm_roc()
3865 iwl_mvm_phy_ctxt_ref(mvm, mvmvif->phy_ctxt); in iwl_mvm_roc()
3871 if (channel == mvmvif->phy_ctxt->channel) in iwl_mvm_roc()
3880 if (mvmvif->phy_ctxt->ref == 1) { in iwl_mvm_roc()
3881 ret = iwl_mvm_phy_ctxt_changed(mvm, mvmvif->phy_ctxt, in iwl_mvm_roc()
3893 ret = -ENOSPC; in iwl_mvm_roc()
3909 iwl_mvm_phy_ctxt_unref(mvm, mvmvif->phy_ctxt); in iwl_mvm_roc()
3912 mvmvif->phy_ctxt = phy_ctxt; in iwl_mvm_roc()
3918 iwl_mvm_phy_ctxt_ref(mvm, mvmvif->phy_ctxt); in iwl_mvm_roc()
3926 mutex_unlock(&mvm->mutex); in iwl_mvm_roc()
3938 mutex_lock(&mvm->mutex); in iwl_mvm_cancel_roc()
3940 mutex_unlock(&mvm->mutex); in iwl_mvm_cancel_roc()
3956 if (rcu_access_pointer(vif->chanctx_conf) == data->ctx && in iwl_mvm_ftm_responder_chanctx_iter()
3957 vif->type == NL80211_IFTYPE_AP && vif->bss_conf.ftmr_params) in iwl_mvm_ftm_responder_chanctx_iter()
3958 data->responder = true; in iwl_mvm_ftm_responder_chanctx_iter()
3969 ieee80211_iterate_active_interfaces_atomic(mvm->hw, in iwl_mvm_is_ftm_responder_chanctx()
3979 u16 *phy_ctxt_id = (u16 *)ctx->drv_priv; in __iwl_mvm_add_chanctx()
3982 struct cfg80211_chan_def *def = responder ? &ctx->def : &ctx->min_def; in __iwl_mvm_add_chanctx()
3985 lockdep_assert_held(&mvm->mutex); in __iwl_mvm_add_chanctx()
3991 ret = -ENOSPC; in __iwl_mvm_add_chanctx()
3996 ctx->rx_chains_static, in __iwl_mvm_add_chanctx()
3997 ctx->rx_chains_dynamic); in __iwl_mvm_add_chanctx()
4004 *phy_ctxt_id = phy_ctxt->id; in __iwl_mvm_add_chanctx()
4015 mutex_lock(&mvm->mutex); in iwl_mvm_add_chanctx()
4017 mutex_unlock(&mvm->mutex); in iwl_mvm_add_chanctx()
4025 u16 *phy_ctxt_id = (u16 *)ctx->drv_priv; in __iwl_mvm_remove_chanctx()
4026 struct iwl_mvm_phy_ctxt *phy_ctxt = &mvm->phy_ctxts[*phy_ctxt_id]; in __iwl_mvm_remove_chanctx()
4028 lockdep_assert_held(&mvm->mutex); in __iwl_mvm_remove_chanctx()
4038 mutex_lock(&mvm->mutex); in iwl_mvm_remove_chanctx()
4040 mutex_unlock(&mvm->mutex); in iwl_mvm_remove_chanctx()
4048 u16 *phy_ctxt_id = (u16 *)ctx->drv_priv; in iwl_mvm_change_chanctx()
4049 struct iwl_mvm_phy_ctxt *phy_ctxt = &mvm->phy_ctxts[*phy_ctxt_id]; in iwl_mvm_change_chanctx()
4051 struct cfg80211_chan_def *def = responder ? &ctx->def : &ctx->min_def; in iwl_mvm_change_chanctx()
4053 if (WARN_ONCE((phy_ctxt->ref > 1) && in iwl_mvm_change_chanctx()
4059 phy_ctxt->ref, changed)) in iwl_mvm_change_chanctx()
4062 mutex_lock(&mvm->mutex); in iwl_mvm_change_chanctx()
4066 if (phy_ctxt->width == def->width) in iwl_mvm_change_chanctx()
4070 if (phy_ctxt->width <= NL80211_CHAN_WIDTH_20 && in iwl_mvm_change_chanctx()
4071 def->width <= NL80211_CHAN_WIDTH_20) in iwl_mvm_change_chanctx()
4077 ctx->rx_chains_static, in iwl_mvm_change_chanctx()
4078 ctx->rx_chains_dynamic); in iwl_mvm_change_chanctx()
4081 mutex_unlock(&mvm->mutex); in iwl_mvm_change_chanctx()
4089 u16 *phy_ctxt_id = (u16 *)ctx->drv_priv; in __iwl_mvm_assign_vif_chanctx()
4090 struct iwl_mvm_phy_ctxt *phy_ctxt = &mvm->phy_ctxts[*phy_ctxt_id]; in __iwl_mvm_assign_vif_chanctx()
4094 lockdep_assert_held(&mvm->mutex); in __iwl_mvm_assign_vif_chanctx()
4096 mvmvif->phy_ctxt = phy_ctxt; in __iwl_mvm_assign_vif_chanctx()
4098 switch (vif->type) { in __iwl_mvm_assign_vif_chanctx()
4102 mvmvif->ap_ibss_active = true; in __iwl_mvm_assign_vif_chanctx()
4114 mvmvif->csa_bcn_pending = false; in __iwl_mvm_assign_vif_chanctx()
4118 mvmvif->ps_disabled = true; in __iwl_mvm_assign_vif_chanctx()
4121 ret = -EINVAL; in __iwl_mvm_assign_vif_chanctx()
4139 if (vif->type == NL80211_IFTYPE_MONITOR) { in __iwl_mvm_assign_vif_chanctx()
4140 mvmvif->monitor_active = true; in __iwl_mvm_assign_vif_chanctx()
4152 if (vif->type == NL80211_IFTYPE_AP) { in __iwl_mvm_assign_vif_chanctx()
4157 if (switching_chanctx && vif->type == NL80211_IFTYPE_STATION) { in __iwl_mvm_assign_vif_chanctx()
4158 mvmvif->csa_bcn_pending = true; in __iwl_mvm_assign_vif_chanctx()
4160 if (!fw_has_capa(&mvm->fw->ucode_capa, in __iwl_mvm_assign_vif_chanctx()
4162 u32 duration = 3 * vif->bss_conf.beacon_int; in __iwl_mvm_assign_vif_chanctx()
4168 vif->bss_conf.beacon_int / 2, in __iwl_mvm_assign_vif_chanctx()
4182 mvmvif->phy_ctxt = NULL; in __iwl_mvm_assign_vif_chanctx()
4192 mutex_lock(&mvm->mutex); in iwl_mvm_assign_vif_chanctx()
4194 mutex_unlock(&mvm->mutex); in iwl_mvm_assign_vif_chanctx()
4207 lockdep_assert_held(&mvm->mutex); in __iwl_mvm_unassign_vif_chanctx()
4209 iwl_mvm_remove_time_event(mvm, mvmvif, &mvmvif->time_event_data); in __iwl_mvm_unassign_vif_chanctx()
4211 switch (vif->type) { in __iwl_mvm_unassign_vif_chanctx()
4215 mvmvif->monitor_active = false; in __iwl_mvm_unassign_vif_chanctx()
4216 mvmvif->ps_disabled = false; in __iwl_mvm_unassign_vif_chanctx()
4221 if (!switching_chanctx || !mvmvif->ap_ibss_active) in __iwl_mvm_unassign_vif_chanctx()
4224 mvmvif->csa_countdown = false; in __iwl_mvm_unassign_vif_chanctx()
4226 /* Set CS bit on all the stations */ in __iwl_mvm_unassign_vif_chanctx()
4230 rcu_assign_pointer(mvm->csa_tx_blocked_vif, vif); in __iwl_mvm_unassign_vif_chanctx()
4232 mvmvif->ap_ibss_active = false; in __iwl_mvm_unassign_vif_chanctx()
4240 if (!fw_has_capa(&mvm->fw->ucode_capa, in __iwl_mvm_unassign_vif_chanctx()
4252 mvmvif->phy_ctxt = NULL; in __iwl_mvm_unassign_vif_chanctx()
4262 mutex_lock(&mvm->mutex); in iwl_mvm_unassign_vif_chanctx()
4264 mutex_unlock(&mvm->mutex); in iwl_mvm_unassign_vif_chanctx()
4273 mutex_lock(&mvm->mutex); in iwl_mvm_switch_vif_chanctx_swap()
4291 /* we don't support TDLS during DCM - can be caused by channel switch */ in iwl_mvm_switch_vif_chanctx_swap()
4319 mutex_unlock(&mvm->mutex); in iwl_mvm_switch_vif_chanctx_swap()
4330 mutex_lock(&mvm->mutex); in iwl_mvm_switch_vif_chanctx_reassign()
4357 mutex_unlock(&mvm->mutex); in iwl_mvm_switch_vif_chanctx_reassign()
4370 /* we only support a single-vif right now */ in iwl_mvm_switch_vif_chanctx()
4372 return -EOPNOTSUPP; in iwl_mvm_switch_vif_chanctx()
4382 ret = -EOPNOTSUPP; in iwl_mvm_switch_vif_chanctx()
4393 return mvm->ibss_manager; in iwl_mvm_tx_last_beacon()
4403 if (!mvm_sta || !mvm_sta->vif) { in iwl_mvm_set_tim()
4405 return -EINVAL; in iwl_mvm_set_tim()
4408 return iwl_mvm_mac_ctxt_beacon_changed(mvm, mvm_sta->vif); in iwl_mvm_set_tim()
4432 return -EINVAL; in __iwl_mvm_mac_testmode_cmd()
4436 if (!vif || vif->type != NL80211_IFTYPE_AP || !vif->p2p || in __iwl_mvm_mac_testmode_cmd()
4437 !vif->bss_conf.enable_beacon || in __iwl_mvm_mac_testmode_cmd()
4439 return -EINVAL; in __iwl_mvm_mac_testmode_cmd()
4442 if (noa_duration >= vif->bss_conf.beacon_int) in __iwl_mvm_mac_testmode_cmd()
4443 return -EINVAL; in __iwl_mvm_mac_testmode_cmd()
4445 mvm->noa_duration = noa_duration; in __iwl_mvm_mac_testmode_cmd()
4446 mvm->noa_vif = vif; in __iwl_mvm_mac_testmode_cmd()
4450 /* must be associated client vif - ignore authorized */ in __iwl_mvm_mac_testmode_cmd()
4451 if (!vif || vif->type != NL80211_IFTYPE_STATION || in __iwl_mvm_mac_testmode_cmd()
4452 !vif->bss_conf.assoc || !vif->bss_conf.dtim_period || in __iwl_mvm_mac_testmode_cmd()
4454 return -EINVAL; in __iwl_mvm_mac_testmode_cmd()
4461 return -EOPNOTSUPP; in __iwl_mvm_mac_testmode_cmd()
4471 mutex_lock(&mvm->mutex); in iwl_mvm_mac_testmode_cmd()
4473 mutex_unlock(&mvm->mutex); in iwl_mvm_mac_testmode_cmd()
4499 .mac_id = cpu_to_le32(FW_CMD_ID_AND_COLOR(mvmvif->id, in iwl_mvm_schedule_client_csa()
4500 mvmvif->color)), in iwl_mvm_schedule_client_csa()
4502 .tsf = cpu_to_le32(chsw->timestamp), in iwl_mvm_schedule_client_csa()
4503 .cs_count = chsw->count, in iwl_mvm_schedule_client_csa()
4504 .cs_mode = chsw->block_tx, in iwl_mvm_schedule_client_csa()
4507 lockdep_assert_held(&mvm->mutex); in iwl_mvm_schedule_client_csa()
4509 if (chsw->delay) in iwl_mvm_schedule_client_csa()
4511 DIV_ROUND_UP(chsw->delay, vif->bss_conf.beacon_int); in iwl_mvm_schedule_client_csa()
4532 if (chsw->count <= 1) in iwl_mvm_old_pre_chan_sw_sta()
4535 apply_time = chsw->device_timestamp + in iwl_mvm_old_pre_chan_sw_sta()
4536 ((vif->bss_conf.beacon_int * (chsw->count - 1) - in iwl_mvm_old_pre_chan_sw_sta()
4539 if (chsw->block_tx) in iwl_mvm_old_pre_chan_sw_sta()
4542 if (mvmvif->bf_data.bf_enabled) { in iwl_mvm_old_pre_chan_sw_sta()
4549 iwl_mvm_schedule_csa_period(mvm, vif, vif->bss_conf.beacon_int, in iwl_mvm_old_pre_chan_sw_sta()
4565 mutex_lock(&mvm->mutex); in iwl_mvm_pre_channel_switch()
4567 mvmvif->csa_failed = false; in iwl_mvm_pre_channel_switch()
4570 chsw->chandef.center_freq1); in iwl_mvm_pre_channel_switch()
4572 iwl_fw_dbg_trigger_simple_stop(&mvm->fwrt, in iwl_mvm_pre_channel_switch()
4576 switch (vif->type) { in iwl_mvm_pre_channel_switch()
4579 rcu_dereference_protected(mvm->csa_vif, in iwl_mvm_pre_channel_switch()
4580 lockdep_is_held(&mvm->mutex)); in iwl_mvm_pre_channel_switch()
4581 if (WARN_ONCE(csa_vif && csa_vif->csa_active, in iwl_mvm_pre_channel_switch()
4583 ret = -EBUSY; in iwl_mvm_pre_channel_switch()
4587 /* we still didn't unblock tx. prevent new CS meanwhile */ in iwl_mvm_pre_channel_switch()
4588 if (rcu_dereference_protected(mvm->csa_tx_blocked_vif, in iwl_mvm_pre_channel_switch()
4589 lockdep_is_held(&mvm->mutex))) { in iwl_mvm_pre_channel_switch()
4590 ret = -EBUSY; in iwl_mvm_pre_channel_switch()
4594 rcu_assign_pointer(mvm->csa_vif, vif); in iwl_mvm_pre_channel_switch()
4596 if (WARN_ONCE(mvmvif->csa_countdown, in iwl_mvm_pre_channel_switch()
4598 ret = -EBUSY; in iwl_mvm_pre_channel_switch()
4602 mvmvif->csa_target_freq = chsw->chandef.chan->center_freq; in iwl_mvm_pre_channel_switch()
4606 if (chsw->block_tx) { in iwl_mvm_pre_channel_switch()
4611 if (!chsw->count || in iwl_mvm_pre_channel_switch()
4612 chsw->count * vif->bss_conf.beacon_int > in iwl_mvm_pre_channel_switch()
4614 schedule_delayed_work(&mvmvif->csa_work, in iwl_mvm_pre_channel_switch()
4618 if (!fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_pre_channel_switch()
4627 mvmvif->csa_count = chsw->count; in iwl_mvm_pre_channel_switch()
4628 mvmvif->csa_misbehave = false; in iwl_mvm_pre_channel_switch()
4634 mvmvif->ps_disabled = true; in iwl_mvm_pre_channel_switch()
4644 mutex_unlock(&mvm->mutex); in iwl_mvm_pre_channel_switch()
4656 .mac_id = cpu_to_le32(FW_CMD_ID_AND_COLOR(mvmvif->id, in iwl_mvm_channel_switch_rx_beacon()
4657 mvmvif->color)), in iwl_mvm_channel_switch_rx_beacon()
4659 .tsf = cpu_to_le32(chsw->timestamp), in iwl_mvm_channel_switch_rx_beacon()
4660 .cs_count = chsw->count, in iwl_mvm_channel_switch_rx_beacon()
4661 .cs_mode = chsw->block_tx, in iwl_mvm_channel_switch_rx_beacon()
4664 if (!fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_CS_MODIFY)) in iwl_mvm_channel_switch_rx_beacon()
4667 if (chsw->count >= mvmvif->csa_count && chsw->block_tx) { in iwl_mvm_channel_switch_rx_beacon()
4668 if (mvmvif->csa_misbehave) { in iwl_mvm_channel_switch_rx_beacon()
4672 mvmvif->csa_misbehave = false; in iwl_mvm_channel_switch_rx_beacon()
4675 mvmvif->csa_misbehave = true; in iwl_mvm_channel_switch_rx_beacon()
4677 mvmvif->csa_count = chsw->count; in iwl_mvm_channel_switch_rx_beacon()
4679 IWL_DEBUG_MAC80211(mvm, "Modify CSA on mac %d\n", mvmvif->id); in iwl_mvm_channel_switch_rx_beacon()
4693 mutex_lock(&mvm->mutex); in iwl_mvm_flush_no_vif()
4696 mutex_unlock(&mvm->mutex); in iwl_mvm_flush_no_vif()
4698 iwl_trans_wait_tx_queues_empty(mvm->trans, queues); in iwl_mvm_flush_no_vif()
4703 mutex_lock(&mvm->mutex); in iwl_mvm_flush_no_vif()
4704 for (i = 0; i < mvm->fw->ucode_capa.num_stations; i++) { in iwl_mvm_flush_no_vif()
4707 sta = rcu_dereference_protected(mvm->fw_id_to_mac_id[i], in iwl_mvm_flush_no_vif()
4708 lockdep_is_held(&mvm->mutex)); in iwl_mvm_flush_no_vif()
4718 mutex_unlock(&mvm->mutex); in iwl_mvm_flush_no_vif()
4736 if (vif->type != NL80211_IFTYPE_STATION) in iwl_mvm_mac_flush()
4740 flush_work(&mvm->add_stream_wk); in iwl_mvm_mac_flush()
4742 mutex_lock(&mvm->mutex); in iwl_mvm_mac_flush()
4745 /* flush the AP-station and all TDLS peers */ in iwl_mvm_mac_flush()
4746 for (i = 0; i < mvm->fw->ucode_capa.num_stations; i++) { in iwl_mvm_mac_flush()
4747 sta = rcu_dereference_protected(mvm->fw_id_to_mac_id[i], in iwl_mvm_mac_flush()
4748 lockdep_is_held(&mvm->mutex)); in iwl_mvm_mac_flush()
4753 if (mvmsta->vif != vif) in iwl_mvm_mac_flush()
4757 WARN_ON(i != mvmvif->ap_sta_id && !sta->tdls); in iwl_mvm_mac_flush()
4763 msk |= mvmsta->tfd_queue_msk; in iwl_mvm_mac_flush()
4769 mutex_unlock(&mvm->mutex); in iwl_mvm_mac_flush()
4775 iwl_trans_wait_tx_queues_empty(mvm->trans, msk); in iwl_mvm_mac_flush()
4788 return -ENOENT; in iwl_mvm_mac_get_survey()
4790 if (!fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_mac_get_survey()
4792 return -ENOENT; in iwl_mvm_mac_get_survey()
4794 mutex_lock(&mvm->mutex); in iwl_mvm_mac_get_survey()
4802 survey->filled = SURVEY_INFO_TIME | in iwl_mvm_mac_get_survey()
4806 survey->time = mvm->accu_radio_stats.on_time_rf + in iwl_mvm_mac_get_survey()
4807 mvm->radio_stats.on_time_rf; in iwl_mvm_mac_get_survey()
4808 do_div(survey->time, USEC_PER_MSEC); in iwl_mvm_mac_get_survey()
4810 survey->time_rx = mvm->accu_radio_stats.rx_time + in iwl_mvm_mac_get_survey()
4811 mvm->radio_stats.rx_time; in iwl_mvm_mac_get_survey()
4812 do_div(survey->time_rx, USEC_PER_MSEC); in iwl_mvm_mac_get_survey()
4814 survey->time_tx = mvm->accu_radio_stats.tx_time + in iwl_mvm_mac_get_survey()
4815 mvm->radio_stats.tx_time; in iwl_mvm_mac_get_survey()
4816 do_div(survey->time_tx, USEC_PER_MSEC); in iwl_mvm_mac_get_survey()
4818 survey->time_scan = mvm->accu_radio_stats.on_time_scan + in iwl_mvm_mac_get_survey()
4819 mvm->radio_stats.on_time_scan; in iwl_mvm_mac_get_survey()
4820 do_div(survey->time_scan, USEC_PER_MSEC); in iwl_mvm_mac_get_survey()
4824 mutex_unlock(&mvm->mutex); in iwl_mvm_mac_get_survey()
4832 rinfo->bw = RATE_INFO_BW_20; in iwl_mvm_set_sta_rate()
4835 rinfo->bw = RATE_INFO_BW_40; in iwl_mvm_set_sta_rate()
4838 rinfo->bw = RATE_INFO_BW_80; in iwl_mvm_set_sta_rate()
4841 rinfo->bw = RATE_INFO_BW_160; in iwl_mvm_set_sta_rate()
4846 rinfo->flags |= RATE_INFO_FLAGS_MCS; in iwl_mvm_set_sta_rate()
4847 rinfo->mcs = u32_get_bits(rate_n_flags, RATE_HT_MCS_INDEX_MSK); in iwl_mvm_set_sta_rate()
4848 rinfo->nss = u32_get_bits(rate_n_flags, in iwl_mvm_set_sta_rate()
4851 rinfo->flags |= RATE_INFO_FLAGS_SHORT_GI; in iwl_mvm_set_sta_rate()
4853 rinfo->flags |= RATE_INFO_FLAGS_VHT_MCS; in iwl_mvm_set_sta_rate()
4854 rinfo->mcs = u32_get_bits(rate_n_flags, in iwl_mvm_set_sta_rate()
4856 rinfo->nss = u32_get_bits(rate_n_flags, in iwl_mvm_set_sta_rate()
4859 rinfo->flags |= RATE_INFO_FLAGS_SHORT_GI; in iwl_mvm_set_sta_rate()
4864 rinfo->flags |= RATE_INFO_FLAGS_HE_MCS; in iwl_mvm_set_sta_rate()
4865 rinfo->mcs = u32_get_bits(rate_n_flags, in iwl_mvm_set_sta_rate()
4867 rinfo->nss = u32_get_bits(rate_n_flags, in iwl_mvm_set_sta_rate()
4871 rinfo->bw = RATE_INFO_BW_HE_RU; in iwl_mvm_set_sta_rate()
4872 rinfo->he_ru_alloc = NL80211_RATE_INFO_HE_RU_ALLOC_106; in iwl_mvm_set_sta_rate()
4879 rinfo->he_gi = NL80211_RATE_INFO_HE_GI_0_8; in iwl_mvm_set_sta_rate()
4881 rinfo->he_gi = NL80211_RATE_INFO_HE_GI_1_6; in iwl_mvm_set_sta_rate()
4883 rinfo->he_gi = NL80211_RATE_INFO_HE_GI_0_8; in iwl_mvm_set_sta_rate()
4885 rinfo->he_gi = NL80211_RATE_INFO_HE_GI_3_2; in iwl_mvm_set_sta_rate()
4889 rinfo->he_gi = NL80211_RATE_INFO_HE_GI_0_8; in iwl_mvm_set_sta_rate()
4891 rinfo->he_gi = NL80211_RATE_INFO_HE_GI_1_6; in iwl_mvm_set_sta_rate()
4893 rinfo->he_gi = NL80211_RATE_INFO_HE_GI_3_2; in iwl_mvm_set_sta_rate()
4897 rinfo->he_gi = NL80211_RATE_INFO_HE_GI_1_6; in iwl_mvm_set_sta_rate()
4899 rinfo->he_gi = NL80211_RATE_INFO_HE_GI_3_2; in iwl_mvm_set_sta_rate()
4904 rinfo->he_dcm = 1; in iwl_mvm_set_sta_rate()
4908 rinfo->legacy = 10; in iwl_mvm_set_sta_rate()
4911 rinfo->legacy = 20; in iwl_mvm_set_sta_rate()
4914 rinfo->legacy = 55; in iwl_mvm_set_sta_rate()
4917 rinfo->legacy = 110; in iwl_mvm_set_sta_rate()
4920 rinfo->legacy = 60; in iwl_mvm_set_sta_rate()
4923 rinfo->legacy = 90; in iwl_mvm_set_sta_rate()
4926 rinfo->legacy = 120; in iwl_mvm_set_sta_rate()
4929 rinfo->legacy = 180; in iwl_mvm_set_sta_rate()
4932 rinfo->legacy = 240; in iwl_mvm_set_sta_rate()
4935 rinfo->legacy = 360; in iwl_mvm_set_sta_rate()
4938 rinfo->legacy = 480; in iwl_mvm_set_sta_rate()
4941 rinfo->legacy = 540; in iwl_mvm_set_sta_rate()
4956 if (mvmsta->avg_energy) { in iwl_mvm_mac_sta_statistics()
4957 sinfo->signal_avg = -(s8)mvmsta->avg_energy; in iwl_mvm_mac_sta_statistics()
4958 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG); in iwl_mvm_mac_sta_statistics()
4962 struct iwl_lq_sta_rs_fw *lq_sta = &mvmsta->lq_sta.rs_fw; in iwl_mvm_mac_sta_statistics()
4964 iwl_mvm_set_sta_rate(lq_sta->last_rate_n_flags, &sinfo->txrate); in iwl_mvm_mac_sta_statistics()
4965 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); in iwl_mvm_mac_sta_statistics()
4969 if (!(vif->driver_flags & IEEE80211_VIF_BEACON_FILTER)) in iwl_mvm_mac_sta_statistics()
4972 if (!vif->bss_conf.assoc) in iwl_mvm_mac_sta_statistics()
4975 mutex_lock(&mvm->mutex); in iwl_mvm_mac_sta_statistics()
4977 if (mvmvif->ap_sta_id != mvmsta->sta_id) in iwl_mvm_mac_sta_statistics()
4983 sinfo->rx_beacon = mvmvif->beacon_stats.num_beacons + in iwl_mvm_mac_sta_statistics()
4984 mvmvif->beacon_stats.accu_num_beacons; in iwl_mvm_mac_sta_statistics()
4985 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_BEACON_RX); in iwl_mvm_mac_sta_statistics()
4986 if (mvmvif->beacon_stats.avg_signal) { in iwl_mvm_mac_sta_statistics()
4988 sinfo->rx_beacon_signal_avg = mvmvif->beacon_stats.avg_signal; in iwl_mvm_mac_sta_statistics()
4989 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_BEACON_SIGNAL_AVG); in iwl_mvm_mac_sta_statistics()
4992 mutex_unlock(&mvm->mutex); in iwl_mvm_mac_sta_statistics()
5001 if ((trig_mlme->_cnt) && --(trig_mlme->_cnt)) \ in iwl_mvm_event_mlme_callback()
5003 iwl_fw_dbg_collect_trig(&(mvm)->fwrt, trig, _fmt); \ in iwl_mvm_event_mlme_callback()
5009 trig = iwl_fw_dbg_trigger_on(&mvm->fwrt, ieee80211_vif_to_wdev(vif), in iwl_mvm_event_mlme_callback()
5014 trig_mlme = (void *)trig->data; in iwl_mvm_event_mlme_callback()
5016 if (event->u.mlme.data == ASSOC_EVENT) { in iwl_mvm_event_mlme_callback()
5017 if (event->u.mlme.status == MLME_DENIED) in iwl_mvm_event_mlme_callback()
5019 "DENIED ASSOC: reason %d", in iwl_mvm_event_mlme_callback()
5020 event->u.mlme.reason); in iwl_mvm_event_mlme_callback()
5021 else if (event->u.mlme.status == MLME_TIMEOUT) in iwl_mvm_event_mlme_callback()
5023 "ASSOC TIMEOUT"); in iwl_mvm_event_mlme_callback()
5024 } else if (event->u.mlme.data == AUTH_EVENT) { in iwl_mvm_event_mlme_callback()
5025 if (event->u.mlme.status == MLME_DENIED) in iwl_mvm_event_mlme_callback()
5028 event->u.mlme.reason); in iwl_mvm_event_mlme_callback()
5029 else if (event->u.mlme.status == MLME_TIMEOUT) in iwl_mvm_event_mlme_callback()
5032 } else if (event->u.mlme.data == DEAUTH_RX_EVENT) { in iwl_mvm_event_mlme_callback()
5034 "DEAUTH RX %d", event->u.mlme.reason); in iwl_mvm_event_mlme_callback()
5035 } else if (event->u.mlme.data == DEAUTH_TX_EVENT) { in iwl_mvm_event_mlme_callback()
5037 "DEAUTH TX %d", event->u.mlme.reason); in iwl_mvm_event_mlme_callback()
5049 trig = iwl_fw_dbg_trigger_on(&mvm->fwrt, ieee80211_vif_to_wdev(vif), in iwl_mvm_event_bar_rx_callback()
5054 ba_trig = (void *)trig->data; in iwl_mvm_event_bar_rx_callback()
5056 if (!(le16_to_cpu(ba_trig->rx_bar) & BIT(event->u.ba.tid))) in iwl_mvm_event_bar_rx_callback()
5059 iwl_fw_dbg_collect_trig(&mvm->fwrt, trig, in iwl_mvm_event_bar_rx_callback()
5061 event->u.ba.sta->addr, event->u.ba.tid, in iwl_mvm_event_bar_rx_callback()
5062 event->u.ba.ssn); in iwl_mvm_event_bar_rx_callback()
5071 switch (event->type) { in iwl_mvm_mac_event_callback()
5079 iwl_mvm_event_frame_timeout_callback(mvm, vif, event->u.ba.sta, in iwl_mvm_mac_event_callback()
5080 event->u.ba.tid); in iwl_mvm_mac_event_callback()
5091 u32 qmask = BIT(mvm->trans->num_rx_queues) - 1; in iwl_mvm_sync_rx_queues_internal()
5098 if (notif->sync) { in iwl_mvm_sync_rx_queues_internal()
5099 notif->cookie = mvm->queue_sync_cookie; in iwl_mvm_sync_rx_queues_internal()
5100 atomic_set(&mvm->queue_sync_counter, in iwl_mvm_sync_rx_queues_internal()
5101 mvm->trans->num_rx_queues); in iwl_mvm_sync_rx_queues_internal()
5105 size, !notif->sync); in iwl_mvm_sync_rx_queues_internal()
5111 if (notif->sync) { in iwl_mvm_sync_rx_queues_internal()
5112 lockdep_assert_held(&mvm->mutex); in iwl_mvm_sync_rx_queues_internal()
5113 ret = wait_event_timeout(mvm->rx_sync_waitq, in iwl_mvm_sync_rx_queues_internal()
5114 atomic_read(&mvm->queue_sync_counter) == 0 || in iwl_mvm_sync_rx_queues_internal()
5121 atomic_set(&mvm->queue_sync_counter, 0); in iwl_mvm_sync_rx_queues_internal()
5122 if (notif->sync) in iwl_mvm_sync_rx_queues_internal()
5123 mvm->queue_sync_cookie++; in iwl_mvm_sync_rx_queues_internal()
5134 mutex_lock(&mvm->mutex); in iwl_mvm_sync_rx_queues()
5136 mutex_unlock(&mvm->mutex); in iwl_mvm_sync_rx_queues()
5147 if (vif->p2p || vif->type != NL80211_IFTYPE_AP || in iwl_mvm_mac_get_ftm_responder_stats()
5148 !mvmvif->ap_ibss_active || !vif->bss_conf.ftm_responder) in iwl_mvm_mac_get_ftm_responder_stats()
5149 return -EINVAL; in iwl_mvm_mac_get_ftm_responder_stats()
5151 mutex_lock(&mvm->mutex); in iwl_mvm_mac_get_ftm_responder_stats()
5152 *stats = mvm->ftm_resp_stats; in iwl_mvm_mac_get_ftm_responder_stats()
5153 mutex_unlock(&mvm->mutex); in iwl_mvm_mac_get_ftm_responder_stats()
5155 stats->filled = BIT(NL80211_FTM_STATS_SUCCESS_NUM) | in iwl_mvm_mac_get_ftm_responder_stats()
5175 mutex_lock(&mvm->mutex); in iwl_mvm_start_pmsr()
5177 mutex_unlock(&mvm->mutex); in iwl_mvm_start_pmsr()
5188 mutex_lock(&mvm->mutex); in iwl_mvm_abort_pmsr()
5190 mutex_unlock(&mvm->mutex); in iwl_mvm_abort_pmsr()
5195 u8 protocol = ip_hdr(skb)->protocol; in iwl_mvm_can_hw_csum()
5210 if (skb->protocol != htons(ETH_P_IP)) in iwl_mvm_mac_can_aggregate()