Lines Matching +full:smd +full:- +full:channels
130 .channels = wcn_2ghz_channels,
151 .channels = wcn_5ghz_channels,
186 return NL80211_IFTYPE_STATION == vif->type ? in get_sta_index()
187 sta_priv->bss_sta_index : in get_sta_index()
188 sta_priv->sta_index; in get_sta_index()
267 if (get_feat_caps(wcn->fw_feat_caps, i)) in wcn36xx_feat_caps_info()
274 struct wcn36xx *wcn = hw->priv; in wcn36xx_start()
279 /* SMD initialization */ in wcn36xx_start()
282 wcn36xx_err("Failed to open smd channel: %d\n", ret); in wcn36xx_start()
328 INIT_LIST_HEAD(&wcn->vif_list); in wcn36xx_start()
329 spin_lock_init(&wcn->dxe_lock); in wcn36xx_start()
347 struct wcn36xx *wcn = hw->priv; in wcn36xx_stop()
351 mutex_lock(&wcn->scan_lock); in wcn36xx_stop()
352 if (wcn->scan_req) { in wcn36xx_stop()
357 ieee80211_scan_completed(wcn->hw, &scan_info); in wcn36xx_stop()
359 wcn->scan_req = NULL; in wcn36xx_stop()
360 mutex_unlock(&wcn->scan_lock); in wcn36xx_stop()
376 list_for_each_entry(tmp, &wcn->vif_list, list) { in wcn36xx_change_ps()
378 if (enable && !wcn->sw_scan) { in wcn36xx_change_ps()
379 if (vif->bss_conf.ps) /* ps allowed ? */ in wcn36xx_change_ps()
392 list_for_each_entry(tmp, &wcn->vif_list, list) { in wcn36xx_change_opchannel()
400 struct wcn36xx *wcn = hw->priv; in wcn36xx_config()
404 mutex_lock(&wcn->conf_mutex); in wcn36xx_config()
411 if (wcn->sw_scan_opchannel == ch && wcn->sw_scan_channel) { in wcn36xx_config()
417 wcn->sw_scan_vif); in wcn36xx_config()
418 wcn->sw_scan_channel = 0; in wcn36xx_config()
419 } else if (wcn->sw_scan) { in wcn36xx_config()
424 wcn->sw_scan_vif); in wcn36xx_config()
426 wcn->sw_scan_channel = ch; in wcn36xx_config()
433 wcn36xx_change_ps(wcn, hw->conf.flags & IEEE80211_CONF_PS); in wcn36xx_config()
435 mutex_unlock(&wcn->conf_mutex); in wcn36xx_config()
445 struct wcn36xx *wcn = hw->priv; in wcn36xx_configure_filter()
451 mutex_lock(&wcn->conf_mutex); in wcn36xx_configure_filter()
456 list_for_each_entry(tmp, &wcn->vif_list, list) { in wcn36xx_configure_filter()
462 else if (NL80211_IFTYPE_STATION == vif->type && tmp->sta_assoc) in wcn36xx_configure_filter()
466 mutex_unlock(&wcn->conf_mutex); in wcn36xx_configure_filter()
483 fp->mc_addr_count = 0; in wcn36xx_prepare_multicast()
488 memcpy(fp->mc_addr[fp->mc_addr_count], in wcn36xx_prepare_multicast()
489 ha->addr, ETH_ALEN); in wcn36xx_prepare_multicast()
490 fp->mc_addr_count++; in wcn36xx_prepare_multicast()
501 struct wcn36xx *wcn = hw->priv; in wcn36xx_tx()
504 if (control->sta) in wcn36xx_tx()
505 sta_priv = wcn36xx_sta_to_priv(control->sta); in wcn36xx_tx()
508 ieee80211_free_txskb(wcn->hw, skb); in wcn36xx_tx()
516 struct wcn36xx *wcn = hw->priv; in wcn36xx_set_key()
524 cmd, key_conf->cipher, key_conf->keyidx, in wcn36xx_set_key()
525 key_conf->keylen, key_conf->flags); in wcn36xx_set_key()
527 key_conf->key, in wcn36xx_set_key()
528 key_conf->keylen); in wcn36xx_set_key()
530 mutex_lock(&wcn->conf_mutex); in wcn36xx_set_key()
532 switch (key_conf->cipher) { in wcn36xx_set_key()
534 vif_priv->encrypt_type = WCN36XX_HAL_ED_WEP40; in wcn36xx_set_key()
537 vif_priv->encrypt_type = WCN36XX_HAL_ED_WEP104; in wcn36xx_set_key()
540 vif_priv->encrypt_type = WCN36XX_HAL_ED_CCMP; in wcn36xx_set_key()
543 vif_priv->encrypt_type = WCN36XX_HAL_ED_TKIP; in wcn36xx_set_key()
547 key_conf->cipher); in wcn36xx_set_key()
548 ret = -EOPNOTSUPP; in wcn36xx_set_key()
554 if (WCN36XX_HAL_ED_TKIP == vif_priv->encrypt_type) { in wcn36xx_set_key()
557 * Temporal Key (16 b) - TX MIC (8 b) - RX MIC (8 b) in wcn36xx_set_key()
560 * Temporal Key (16 b) - RX MIC (8 b) - TX MIC (8 b) in wcn36xx_set_key()
562 memcpy(key, key_conf->key, 16); in wcn36xx_set_key()
563 memcpy(key + 16, key_conf->key + 24, 8); in wcn36xx_set_key()
564 memcpy(key + 24, key_conf->key + 16, 8); in wcn36xx_set_key()
566 memcpy(key, key_conf->key, key_conf->keylen); in wcn36xx_set_key()
569 if (IEEE80211_KEY_FLAG_PAIRWISE & key_conf->flags) { in wcn36xx_set_key()
570 sta_priv->is_data_encrypted = true; in wcn36xx_set_key()
572 if (NL80211_IFTYPE_STATION == vif->type) in wcn36xx_set_key()
576 sta->addr, in wcn36xx_set_key()
580 vif_priv->encrypt_type, in wcn36xx_set_key()
581 key_conf->keyidx, in wcn36xx_set_key()
582 key_conf->keylen, in wcn36xx_set_key()
587 vif_priv->encrypt_type, in wcn36xx_set_key()
588 vif_priv->bss_index, in wcn36xx_set_key()
589 key_conf->keyidx, in wcn36xx_set_key()
590 key_conf->keylen, in wcn36xx_set_key()
593 if ((WLAN_CIPHER_SUITE_WEP40 == key_conf->cipher) || in wcn36xx_set_key()
594 (WLAN_CIPHER_SUITE_WEP104 == key_conf->cipher)) { in wcn36xx_set_key()
596 &vif_priv->sta_list, list) { in wcn36xx_set_key()
597 sta_priv->is_data_encrypted = true; in wcn36xx_set_key()
599 vif_priv->encrypt_type, in wcn36xx_set_key()
600 key_conf->keyidx, in wcn36xx_set_key()
601 key_conf->keylen, in wcn36xx_set_key()
608 * For any reasons, when connected to open/no-security BSS, in wcn36xx_set_key()
610 * 'wake-up' beacons despite AP sends DTIM with station AID. in wcn36xx_set_key()
614 if (vif->type == NL80211_IFTYPE_STATION) in wcn36xx_set_key()
615 vif_priv->allow_bmps = true; in wcn36xx_set_key()
618 if (!(IEEE80211_KEY_FLAG_PAIRWISE & key_conf->flags)) { in wcn36xx_set_key()
619 if (vif_priv->bss_index != WCN36XX_HAL_BSS_INVALID_IDX) in wcn36xx_set_key()
621 vif_priv->encrypt_type, in wcn36xx_set_key()
622 vif_priv->bss_index, in wcn36xx_set_key()
623 key_conf->keyidx); in wcn36xx_set_key()
625 vif_priv->encrypt_type = WCN36XX_HAL_ED_NONE; in wcn36xx_set_key()
627 sta_priv->is_data_encrypted = false; in wcn36xx_set_key()
629 if (sta_priv->aid) in wcn36xx_set_key()
631 vif_priv->encrypt_type, in wcn36xx_set_key()
632 key_conf->keyidx, in wcn36xx_set_key()
638 ret = -EOPNOTSUPP; in wcn36xx_set_key()
643 mutex_unlock(&wcn->conf_mutex); in wcn36xx_set_key()
652 struct wcn36xx *wcn = hw->priv; in wcn36xx_hw_scan()
655 if (!get_feat_caps(wcn->fw_feat_caps, SCAN_OFFLOAD)) { in wcn36xx_hw_scan()
661 * 2.4Ghz channels, fallback to software scan in other cases. in wcn36xx_hw_scan()
663 for (i = 0; i < hw_req->req.n_channels; i++) { in wcn36xx_hw_scan()
664 if (hw_req->req.channels[i]->band != NL80211_BAND_2GHZ) in wcn36xx_hw_scan()
668 mutex_lock(&wcn->scan_lock); in wcn36xx_hw_scan()
669 if (wcn->scan_req) { in wcn36xx_hw_scan()
670 mutex_unlock(&wcn->scan_lock); in wcn36xx_hw_scan()
671 return -EBUSY; in wcn36xx_hw_scan()
674 wcn->scan_aborted = false; in wcn36xx_hw_scan()
675 wcn->scan_req = &hw_req->req; in wcn36xx_hw_scan()
677 mutex_unlock(&wcn->scan_lock); in wcn36xx_hw_scan()
679 return wcn36xx_smd_start_hw_scan(wcn, vif, &hw_req->req); in wcn36xx_hw_scan()
685 struct wcn36xx *wcn = hw->priv; in wcn36xx_cancel_hw_scan()
687 mutex_lock(&wcn->scan_lock); in wcn36xx_cancel_hw_scan()
688 wcn->scan_aborted = true; in wcn36xx_cancel_hw_scan()
689 mutex_unlock(&wcn->scan_lock); in wcn36xx_cancel_hw_scan()
691 if (get_feat_caps(wcn->fw_feat_caps, SCAN_OFFLOAD)) { in wcn36xx_cancel_hw_scan()
702 struct wcn36xx *wcn = hw->priv; in wcn36xx_sw_scan_start()
705 wcn->sw_scan = true; in wcn36xx_sw_scan_start()
706 wcn->sw_scan_vif = vif; in wcn36xx_sw_scan_start()
707 wcn->sw_scan_channel = 0; in wcn36xx_sw_scan_start()
708 if (vif_priv->sta_assoc) in wcn36xx_sw_scan_start()
709 wcn->sw_scan_opchannel = WCN36XX_HW_CHANNEL(wcn); in wcn36xx_sw_scan_start()
711 wcn->sw_scan_opchannel = 0; in wcn36xx_sw_scan_start()
717 struct wcn36xx *wcn = hw->priv; in wcn36xx_sw_scan_complete()
720 wcn36xx_smd_finish_scan(wcn, HAL_SYS_MODE_SCAN, wcn->sw_scan_vif); in wcn36xx_sw_scan_complete()
721 wcn->sw_scan = false; in wcn36xx_sw_scan_complete()
722 wcn->sw_scan_opchannel = 0; in wcn36xx_sw_scan_complete()
731 u32 rates = sta->supp_rates[band]; in wcn36xx_update_allowed_rates()
733 memset(&sta_priv->supported_rates, 0, in wcn36xx_update_allowed_rates()
734 sizeof(sta_priv->supported_rates)); in wcn36xx_update_allowed_rates()
735 sta_priv->supported_rates.op_rate_mode = STA_11n; in wcn36xx_update_allowed_rates()
737 size = ARRAY_SIZE(sta_priv->supported_rates.dsss_rates); in wcn36xx_update_allowed_rates()
738 rates_table = sta_priv->supported_rates.dsss_rates; in wcn36xx_update_allowed_rates()
748 size = ARRAY_SIZE(sta_priv->supported_rates.ofdm_rates); in wcn36xx_update_allowed_rates()
749 rates_table = sta_priv->supported_rates.ofdm_rates; in wcn36xx_update_allowed_rates()
757 if (sta->ht_cap.ht_supported) { in wcn36xx_update_allowed_rates()
758 BUILD_BUG_ON(sizeof(sta->ht_cap.mcs.rx_mask) > in wcn36xx_update_allowed_rates()
759 sizeof(sta_priv->supported_rates.supported_mcs_set)); in wcn36xx_update_allowed_rates()
760 memcpy(sta_priv->supported_rates.supported_mcs_set, in wcn36xx_update_allowed_rates()
761 sta->ht_cap.mcs.rx_mask, in wcn36xx_update_allowed_rates()
762 sizeof(sta->ht_cap.mcs.rx_mask)); in wcn36xx_update_allowed_rates()
765 if (sta->vht_cap.vht_supported) { in wcn36xx_update_allowed_rates()
766 sta_priv->supported_rates.op_rate_mode = STA_11ac; in wcn36xx_update_allowed_rates()
767 sta_priv->supported_rates.vht_rx_mcs_map = in wcn36xx_update_allowed_rates()
768 sta->vht_cap.vht_mcs.rx_mcs_map; in wcn36xx_update_allowed_rates()
769 sta_priv->supported_rates.vht_tx_mcs_map = in wcn36xx_update_allowed_rates()
770 sta->vht_cap.vht_mcs.tx_mcs_map; in wcn36xx_update_allowed_rates()
793 rates->op_rate_mode = STA_11n; in wcn36xx_set_default_rates()
794 memcpy(rates->dsss_rates, dsss_rates, in wcn36xx_set_default_rates()
796 memcpy(rates->ofdm_rates, ofdm_rates, in wcn36xx_set_default_rates()
798 rates->supported_mcs_set[0] = 0xFF; in wcn36xx_set_default_rates()
803 rates->op_rate_mode = STA_11ac; in wcn36xx_set_default_rates_v1()
804 rates->vht_rx_mcs_map = IEEE80211_VHT_MCS_SUPPORT_0_9; in wcn36xx_set_default_rates_v1()
805 rates->vht_tx_mcs_map = IEEE80211_VHT_MCS_SUPPORT_0_9; in wcn36xx_set_default_rates_v1()
813 struct wcn36xx *wcn = hw->priv; in wcn36xx_bss_info_changed()
822 mutex_lock(&wcn->conf_mutex); in wcn36xx_bss_info_changed()
827 bss_conf->dtim_period); in wcn36xx_bss_info_changed()
829 vif_priv->dtim_period = bss_conf->dtim_period; in wcn36xx_bss_info_changed()
834 bss_conf->bssid); in wcn36xx_bss_info_changed()
836 if (!is_zero_ether_addr(bss_conf->bssid)) { in wcn36xx_bss_info_changed()
837 vif_priv->is_joining = true; in wcn36xx_bss_info_changed()
838 vif_priv->bss_index = WCN36XX_HAL_BSS_INVALID_IDX; in wcn36xx_bss_info_changed()
839 wcn36xx_smd_set_link_st(wcn, bss_conf->bssid, vif->addr, in wcn36xx_bss_info_changed()
841 wcn36xx_smd_join(wcn, bss_conf->bssid, in wcn36xx_bss_info_changed()
842 vif->addr, WCN36XX_HW_CHANNEL(wcn)); in wcn36xx_bss_info_changed()
844 bss_conf->bssid, false); in wcn36xx_bss_info_changed()
846 vif_priv->is_joining = false; in wcn36xx_bss_info_changed()
848 wcn36xx_smd_set_link_st(wcn, bss_conf->bssid, vif->addr, in wcn36xx_bss_info_changed()
850 vif_priv->encrypt_type = WCN36XX_HAL_ED_NONE; in wcn36xx_bss_info_changed()
858 bss_conf->ssid, bss_conf->ssid_len); in wcn36xx_bss_info_changed()
860 vif_priv->ssid.length = bss_conf->ssid_len; in wcn36xx_bss_info_changed()
861 memcpy(&vif_priv->ssid.ssid, in wcn36xx_bss_info_changed()
862 bss_conf->ssid, in wcn36xx_bss_info_changed()
863 bss_conf->ssid_len); in wcn36xx_bss_info_changed()
867 vif_priv->is_joining = false; in wcn36xx_bss_info_changed()
868 if (bss_conf->assoc) { in wcn36xx_bss_info_changed()
874 bss_conf->bssid, in wcn36xx_bss_info_changed()
875 vif->addr, in wcn36xx_bss_info_changed()
876 bss_conf->aid); in wcn36xx_bss_info_changed()
878 vif_priv->sta_assoc = true; in wcn36xx_bss_info_changed()
886 sta = ieee80211_find_sta(vif, bss_conf->bssid); in wcn36xx_bss_info_changed()
889 bss_conf->bssid); in wcn36xx_bss_info_changed()
896 wcn36xx_smd_set_link_st(wcn, bss_conf->bssid, in wcn36xx_bss_info_changed()
897 vif->addr, in wcn36xx_bss_info_changed()
900 bss_conf->bssid, in wcn36xx_bss_info_changed()
902 sta_priv->aid = bss_conf->aid; in wcn36xx_bss_info_changed()
912 bss_conf->bssid, in wcn36xx_bss_info_changed()
913 vif->addr, in wcn36xx_bss_info_changed()
914 bss_conf->aid); in wcn36xx_bss_info_changed()
915 vif_priv->sta_assoc = false; in wcn36xx_bss_info_changed()
916 vif_priv->allow_bmps = false; in wcn36xx_bss_info_changed()
918 bss_conf->bssid, in wcn36xx_bss_info_changed()
919 vif->addr, in wcn36xx_bss_info_changed()
940 bss_conf->enable_beacon); in wcn36xx_bss_info_changed()
942 if (bss_conf->enable_beacon) { in wcn36xx_bss_info_changed()
943 vif_priv->dtim_period = bss_conf->dtim_period; in wcn36xx_bss_info_changed()
944 vif_priv->bss_index = WCN36XX_HAL_BSS_INVALID_IDX; in wcn36xx_bss_info_changed()
946 vif->addr, false); in wcn36xx_bss_info_changed()
956 if (vif->type == NL80211_IFTYPE_ADHOC || in wcn36xx_bss_info_changed()
957 vif->type == NL80211_IFTYPE_MESH_POINT) in wcn36xx_bss_info_changed()
962 wcn36xx_smd_set_link_st(wcn, vif->addr, vif->addr, in wcn36xx_bss_info_changed()
966 wcn36xx_smd_set_link_st(wcn, vif->addr, vif->addr, in wcn36xx_bss_info_changed()
972 mutex_unlock(&wcn->conf_mutex); in wcn36xx_bss_info_changed()
978 struct wcn36xx *wcn = hw->priv; in wcn36xx_set_rts_threshold()
981 mutex_lock(&wcn->conf_mutex); in wcn36xx_set_rts_threshold()
983 mutex_unlock(&wcn->conf_mutex); in wcn36xx_set_rts_threshold()
991 struct wcn36xx *wcn = hw->priv; in wcn36xx_remove_interface()
995 mutex_lock(&wcn->conf_mutex); in wcn36xx_remove_interface()
997 list_del(&vif_priv->list); in wcn36xx_remove_interface()
998 wcn36xx_smd_delete_sta_self(wcn, vif->addr); in wcn36xx_remove_interface()
1000 mutex_unlock(&wcn->conf_mutex); in wcn36xx_remove_interface()
1006 struct wcn36xx *wcn = hw->priv; in wcn36xx_add_interface()
1010 vif, vif->type); in wcn36xx_add_interface()
1012 if (!(NL80211_IFTYPE_STATION == vif->type || in wcn36xx_add_interface()
1013 NL80211_IFTYPE_AP == vif->type || in wcn36xx_add_interface()
1014 NL80211_IFTYPE_ADHOC == vif->type || in wcn36xx_add_interface()
1015 NL80211_IFTYPE_MESH_POINT == vif->type)) { in wcn36xx_add_interface()
1017 vif->type); in wcn36xx_add_interface()
1018 return -EOPNOTSUPP; in wcn36xx_add_interface()
1021 mutex_lock(&wcn->conf_mutex); in wcn36xx_add_interface()
1023 vif_priv->bss_index = WCN36XX_HAL_BSS_INVALID_IDX; in wcn36xx_add_interface()
1024 INIT_LIST_HEAD(&vif_priv->sta_list); in wcn36xx_add_interface()
1025 list_add(&vif_priv->list, &wcn->vif_list); in wcn36xx_add_interface()
1028 mutex_unlock(&wcn->conf_mutex); in wcn36xx_add_interface()
1036 struct wcn36xx *wcn = hw->priv; in wcn36xx_sta_add()
1040 vif, sta->addr); in wcn36xx_sta_add()
1042 mutex_lock(&wcn->conf_mutex); in wcn36xx_sta_add()
1044 spin_lock_init(&sta_priv->ampdu_lock); in wcn36xx_sta_add()
1045 sta_priv->vif = vif_priv; in wcn36xx_sta_add()
1046 list_add(&sta_priv->list, &vif_priv->sta_list); in wcn36xx_sta_add()
1052 if (NL80211_IFTYPE_STATION != vif->type) { in wcn36xx_sta_add()
1054 sta_priv->aid = sta->aid; in wcn36xx_sta_add()
1058 mutex_unlock(&wcn->conf_mutex); in wcn36xx_sta_add()
1067 struct wcn36xx *wcn = hw->priv; in wcn36xx_sta_remove()
1071 vif, sta->addr, sta_priv->sta_index); in wcn36xx_sta_remove()
1073 mutex_lock(&wcn->conf_mutex); in wcn36xx_sta_remove()
1075 list_del(&sta_priv->list); in wcn36xx_sta_remove()
1076 wcn36xx_smd_delete_sta(wcn, sta_priv->sta_index); in wcn36xx_sta_remove()
1077 sta_priv->vif = NULL; in wcn36xx_sta_remove()
1079 mutex_unlock(&wcn->conf_mutex); in wcn36xx_sta_remove()
1091 list_for_each_entry(vif_priv, &wcn->vif_list, list) { in wcn36xx_get_first_assoc_vif()
1092 if (vif_priv->sta_assoc) { in wcn36xx_get_first_assoc_vif()
1102 struct wcn36xx *wcn = hw->priv; in wcn36xx_suspend()
1108 mutex_lock(&wcn->conf_mutex); in wcn36xx_suspend()
1127 mutex_unlock(&wcn->conf_mutex); in wcn36xx_suspend()
1133 struct wcn36xx *wcn = hw->priv; in wcn36xx_resume()
1138 mutex_lock(&wcn->conf_mutex); in wcn36xx_resume()
1148 mutex_unlock(&wcn->conf_mutex); in wcn36xx_resume()
1157 struct wcn36xx *wcn = hw->priv; in wcn36xx_set_rekey_data()
1160 mutex_lock(&wcn->conf_mutex); in wcn36xx_set_rekey_data()
1162 memcpy(vif_priv->rekey_data.kek, data->kek, NL80211_KEK_LEN); in wcn36xx_set_rekey_data()
1163 memcpy(vif_priv->rekey_data.kck, data->kck, NL80211_KCK_LEN); in wcn36xx_set_rekey_data()
1164 vif_priv->rekey_data.replay_ctr = in wcn36xx_set_rekey_data()
1165 cpu_to_le64(be64_to_cpup((__be64 *)data->replay_ctr)); in wcn36xx_set_rekey_data()
1166 vif_priv->rekey_data.valid = true; in wcn36xx_set_rekey_data()
1168 mutex_unlock(&wcn->conf_mutex); in wcn36xx_set_rekey_data()
1177 struct wcn36xx *wcn = hw->priv; in wcn36xx_ampdu_action()
1178 struct wcn36xx_sta *sta_priv = wcn36xx_sta_to_priv(params->sta); in wcn36xx_ampdu_action()
1179 struct ieee80211_sta *sta = params->sta; in wcn36xx_ampdu_action()
1180 enum ieee80211_ampdu_mlme_action action = params->action; in wcn36xx_ampdu_action()
1181 u16 tid = params->tid; in wcn36xx_ampdu_action()
1182 u16 *ssn = ¶ms->ssn; in wcn36xx_ampdu_action()
1189 mutex_lock(&wcn->conf_mutex); in wcn36xx_ampdu_action()
1193 sta_priv->tid = tid; in wcn36xx_ampdu_action()
1204 spin_lock_bh(&sta_priv->ampdu_lock); in wcn36xx_ampdu_action()
1205 sta_priv->ampdu_state[tid] = WCN36XX_AMPDU_START; in wcn36xx_ampdu_action()
1206 spin_unlock_bh(&sta_priv->ampdu_lock); in wcn36xx_ampdu_action()
1211 spin_lock_bh(&sta_priv->ampdu_lock); in wcn36xx_ampdu_action()
1212 sta_priv->ampdu_state[tid] = WCN36XX_AMPDU_OPERATIONAL; in wcn36xx_ampdu_action()
1213 spin_unlock_bh(&sta_priv->ampdu_lock); in wcn36xx_ampdu_action()
1221 spin_lock_bh(&sta_priv->ampdu_lock); in wcn36xx_ampdu_action()
1222 sta_priv->ampdu_state[tid] = WCN36XX_AMPDU_NONE; in wcn36xx_ampdu_action()
1223 spin_unlock_bh(&sta_priv->ampdu_lock); in wcn36xx_ampdu_action()
1226 ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid); in wcn36xx_ampdu_action()
1232 mutex_unlock(&wcn->conf_mutex); in wcn36xx_ampdu_action()
1246 memset(vif_priv->tentative_addrs, 0, sizeof(vif_priv->tentative_addrs)); in wcn36xx_ipv6_addr_change()
1248 read_lock_bh(&idev->lock); in wcn36xx_ipv6_addr_change()
1249 list_for_each_entry(ifa, &idev->addr_list, if_list) { in wcn36xx_ipv6_addr_change()
1250 vif_priv->target_ipv6_addrs[idx] = ifa->addr; in wcn36xx_ipv6_addr_change()
1251 if (ifa->flags & IFA_F_TENTATIVE) in wcn36xx_ipv6_addr_change()
1252 __set_bit(idx, vif_priv->tentative_addrs); in wcn36xx_ipv6_addr_change()
1256 wcn36xx_dbg(WCN36XX_DBG_MAC, "%pI6 %s\n", &ifa->addr, in wcn36xx_ipv6_addr_change()
1257 (ifa->flags & IFA_F_TENTATIVE) ? "tentative" : NULL); in wcn36xx_ipv6_addr_change()
1259 read_unlock_bh(&idev->lock); in wcn36xx_ipv6_addr_change()
1261 vif_priv->num_target_ipv6_addrs = idx; in wcn36xx_ipv6_addr_change()
1299 vht_cap->vht_supported = true; in wcn36xx_set_ieee80211_vht_caps()
1301 vht_cap->cap = (IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895 | in wcn36xx_set_ieee80211_vht_caps()
1309 vht_cap->vht_mcs.rx_mcs_map = in wcn36xx_set_ieee80211_vht_caps()
1319 vht_cap->vht_mcs.rx_highest = cpu_to_le16(433); in wcn36xx_set_ieee80211_vht_caps()
1320 vht_cap->vht_mcs.tx_highest = vht_cap->vht_mcs.rx_highest; in wcn36xx_set_ieee80211_vht_caps()
1322 vht_cap->vht_mcs.tx_mcs_map = vht_cap->vht_mcs.rx_mcs_map; in wcn36xx_set_ieee80211_vht_caps()
1334 ieee80211_hw_set(wcn->hw, TIMING_BEACON_ONLY); in wcn36xx_init_ieee80211()
1335 ieee80211_hw_set(wcn->hw, AMPDU_AGGREGATION); in wcn36xx_init_ieee80211()
1336 ieee80211_hw_set(wcn->hw, SUPPORTS_PS); in wcn36xx_init_ieee80211()
1337 ieee80211_hw_set(wcn->hw, SIGNAL_DBM); in wcn36xx_init_ieee80211()
1338 ieee80211_hw_set(wcn->hw, HAS_RATE_CONTROL); in wcn36xx_init_ieee80211()
1339 ieee80211_hw_set(wcn->hw, SINGLE_SCAN_ON_ALL_BANDS); in wcn36xx_init_ieee80211()
1340 ieee80211_hw_set(wcn->hw, REPORTS_TX_ACK_STATUS); in wcn36xx_init_ieee80211()
1341 ieee80211_hw_set(wcn->hw, CONNECTION_MONITOR); in wcn36xx_init_ieee80211()
1343 wcn->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | in wcn36xx_init_ieee80211()
1348 wcn->hw->wiphy->bands[NL80211_BAND_2GHZ] = &wcn_band_2ghz; in wcn36xx_init_ieee80211()
1349 if (wcn->rf_id != RF_IRIS_WCN3620) in wcn36xx_init_ieee80211()
1350 wcn->hw->wiphy->bands[NL80211_BAND_5GHZ] = &wcn_band_5ghz; in wcn36xx_init_ieee80211()
1352 if (wcn->rf_id == RF_IRIS_WCN3680) in wcn36xx_init_ieee80211()
1355 wcn->hw->wiphy->max_scan_ssids = WCN36XX_MAX_SCAN_SSIDS; in wcn36xx_init_ieee80211()
1356 wcn->hw->wiphy->max_scan_ie_len = WCN36XX_MAX_SCAN_IE_LEN; in wcn36xx_init_ieee80211()
1358 wcn->hw->wiphy->cipher_suites = cipher_suites; in wcn36xx_init_ieee80211()
1359 wcn->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites); in wcn36xx_init_ieee80211()
1362 wcn->hw->wiphy->wowlan = &wowlan_support; in wcn36xx_init_ieee80211()
1365 wcn->hw->max_listen_interval = 200; in wcn36xx_init_ieee80211()
1367 wcn->hw->queues = 4; in wcn36xx_init_ieee80211()
1369 SET_IEEE80211_DEV(wcn->hw, wcn->dev); in wcn36xx_init_ieee80211()
1371 wcn->hw->sta_data_size = sizeof(struct wcn36xx_sta); in wcn36xx_init_ieee80211()
1372 wcn->hw->vif_data_size = sizeof(struct wcn36xx_vif); in wcn36xx_init_ieee80211()
1374 wiphy_ext_feature_set(wcn->hw->wiphy, in wcn36xx_init_ieee80211()
1393 return -ENOENT; in wcn36xx_platform_get_resources()
1395 wcn->tx_irq = res->start; in wcn36xx_platform_get_resources()
1401 return -ENOENT; in wcn36xx_platform_get_resources()
1403 wcn->rx_irq = res->start; in wcn36xx_platform_get_resources()
1406 wcn->tx_enable_state = qcom_smem_state_get(&pdev->dev, in wcn36xx_platform_get_resources()
1407 "tx-enable", &wcn->tx_enable_state_bit); in wcn36xx_platform_get_resources()
1408 if (IS_ERR(wcn->tx_enable_state)) { in wcn36xx_platform_get_resources()
1409 wcn36xx_err("failed to get tx-enable state\n"); in wcn36xx_platform_get_resources()
1410 return PTR_ERR(wcn->tx_enable_state); in wcn36xx_platform_get_resources()
1414 wcn->tx_rings_empty_state = qcom_smem_state_get(&pdev->dev, in wcn36xx_platform_get_resources()
1415 "tx-rings-empty", &wcn->tx_rings_empty_state_bit); in wcn36xx_platform_get_resources()
1416 if (IS_ERR(wcn->tx_rings_empty_state)) { in wcn36xx_platform_get_resources()
1417 wcn36xx_err("failed to get tx-rings-empty state\n"); in wcn36xx_platform_get_resources()
1418 return PTR_ERR(wcn->tx_rings_empty_state); in wcn36xx_platform_get_resources()
1421 mmio_node = of_parse_phandle(pdev->dev.parent->of_node, "qcom,mmio", 0); in wcn36xx_platform_get_resources()
1424 return -EINVAL; in wcn36xx_platform_get_resources()
1427 wcn->is_pronto = !!of_device_is_compatible(mmio_node, "qcom,pronto"); in wcn36xx_platform_get_resources()
1430 index = of_property_match_string(mmio_node, "reg-names", "ccu"); in wcn36xx_platform_get_resources()
1431 wcn->ccu_base = of_iomap(mmio_node, index); in wcn36xx_platform_get_resources()
1432 if (!wcn->ccu_base) { in wcn36xx_platform_get_resources()
1434 ret = -ENOMEM; in wcn36xx_platform_get_resources()
1439 index = of_property_match_string(mmio_node, "reg-names", "dxe"); in wcn36xx_platform_get_resources()
1440 wcn->dxe_base = of_iomap(mmio_node, index); in wcn36xx_platform_get_resources()
1441 if (!wcn->dxe_base) { in wcn36xx_platform_get_resources()
1443 ret = -ENOMEM; in wcn36xx_platform_get_resources()
1451 wcn->rf_id = RF_IRIS_WCN3620; in wcn36xx_platform_get_resources()
1453 wcn->rf_id = RF_IRIS_WCN3680; in wcn36xx_platform_get_resources()
1461 iounmap(wcn->ccu_base); in wcn36xx_platform_get_resources()
1477 wcnss = dev_get_drvdata(pdev->dev.parent); in wcn36xx_probe()
1482 ret = -ENOMEM; in wcn36xx_probe()
1486 wcn = hw->priv; in wcn36xx_probe()
1487 wcn->hw = hw; in wcn36xx_probe()
1488 wcn->dev = &pdev->dev; in wcn36xx_probe()
1489 wcn->first_boot = true; in wcn36xx_probe()
1490 mutex_init(&wcn->conf_mutex); in wcn36xx_probe()
1491 mutex_init(&wcn->hal_mutex); in wcn36xx_probe()
1492 mutex_init(&wcn->scan_lock); in wcn36xx_probe()
1494 wcn->hal_buf = devm_kmalloc(wcn->dev, WCN36XX_HAL_BUF_SIZE, GFP_KERNEL); in wcn36xx_probe()
1495 if (!wcn->hal_buf) { in wcn36xx_probe()
1496 ret = -ENOMEM; in wcn36xx_probe()
1500 ret = dma_set_mask_and_coherent(wcn->dev, DMA_BIT_MASK(32)); in wcn36xx_probe()
1506 wcn->nv_file = WLAN_NV_FILE; in wcn36xx_probe()
1507 ret = of_property_read_string(wcn->dev->parent->of_node, "firmware-name", &wcn->nv_file); in wcn36xx_probe()
1508 if (ret < 0 && ret != -EINVAL) { in wcn36xx_probe()
1509 wcn36xx_err("failed to read \"firmware-name\" property: %d\n", ret); in wcn36xx_probe()
1513 wcn->smd_channel = qcom_wcnss_open_channel(wcnss, "WLAN_CTRL", wcn36xx_smd_rsp_process, hw); in wcn36xx_probe()
1514 if (IS_ERR(wcn->smd_channel)) { in wcn36xx_probe()
1516 ret = PTR_ERR(wcn->smd_channel); in wcn36xx_probe()
1520 addr = of_get_property(pdev->dev.of_node, "local-mac-address", &ret); in wcn36xx_probe()
1522 wcn36xx_err("invalid local-mac-address\n"); in wcn36xx_probe()
1523 ret = -EINVAL; in wcn36xx_probe()
1527 SET_IEEE80211_PERM_ADDR(wcn->hw, addr); in wcn36xx_probe()
1535 ret = ieee80211_register_hw(wcn->hw); in wcn36xx_probe()
1542 iounmap(wcn->ccu_base); in wcn36xx_probe()
1543 iounmap(wcn->dxe_base); in wcn36xx_probe()
1545 rpmsg_destroy_ept(wcn->smd_channel); in wcn36xx_probe()
1555 struct wcn36xx *wcn = hw->priv; in wcn36xx_remove()
1558 release_firmware(wcn->nv); in wcn36xx_remove()
1562 qcom_smem_state_put(wcn->tx_enable_state); in wcn36xx_remove()
1563 qcom_smem_state_put(wcn->tx_rings_empty_state); in wcn36xx_remove()
1565 rpmsg_destroy_ept(wcn->smd_channel); in wcn36xx_remove()
1567 iounmap(wcn->dxe_base); in wcn36xx_remove()
1568 iounmap(wcn->ccu_base); in wcn36xx_remove()
1570 mutex_destroy(&wcn->hal_mutex); in wcn36xx_remove()
1577 { .compatible = "qcom,wcnss-wlan" },