Lines Matching +full:smd +full:- +full:channels

129 	.channels	= wcn_2ghz_channels,
150 .channels = wcn_5ghz_channels,
183 return NL80211_IFTYPE_STATION == vif->type ? in get_sta_index()
184 sta_priv->bss_sta_index : in get_sta_index()
185 sta_priv->sta_index; in get_sta_index()
264 if (get_feat_caps(wcn->fw_feat_caps, i)) in wcn36xx_feat_caps_info()
271 struct wcn36xx *wcn = hw->priv; in wcn36xx_start()
276 /* SMD initialization */ in wcn36xx_start()
279 wcn36xx_err("Failed to open smd channel: %d\n", ret); in wcn36xx_start()
296 wcn->hal_buf = kmalloc(WCN36XX_HAL_BUF_SIZE, GFP_KERNEL); in wcn36xx_start()
297 if (!wcn->hal_buf) { in wcn36xx_start()
298 wcn36xx_err("Failed to allocate smd buf\n"); in wcn36xx_start()
299 ret = -ENOMEM; in wcn36xx_start()
332 INIT_LIST_HEAD(&wcn->vif_list); in wcn36xx_start()
333 spin_lock_init(&wcn->dxe_lock); in wcn36xx_start()
340 kfree(wcn->hal_buf); in wcn36xx_start()
353 struct wcn36xx *wcn = hw->priv; in wcn36xx_stop()
357 mutex_lock(&wcn->scan_lock); in wcn36xx_stop()
358 if (wcn->scan_req) { in wcn36xx_stop()
363 ieee80211_scan_completed(wcn->hw, &scan_info); in wcn36xx_stop()
365 wcn->scan_req = NULL; in wcn36xx_stop()
366 mutex_unlock(&wcn->scan_lock); in wcn36xx_stop()
376 kfree(wcn->hal_buf); in wcn36xx_stop()
384 list_for_each_entry(tmp, &wcn->vif_list, list) { in wcn36xx_change_ps()
386 if (enable && !wcn->sw_scan) { in wcn36xx_change_ps()
387 if (vif->bss_conf.ps) /* ps allowed ? */ in wcn36xx_change_ps()
400 list_for_each_entry(tmp, &wcn->vif_list, list) { in wcn36xx_change_opchannel()
408 struct wcn36xx *wcn = hw->priv; in wcn36xx_config()
412 mutex_lock(&wcn->conf_mutex); in wcn36xx_config()
419 if (wcn->sw_scan_opchannel == ch) { in wcn36xx_config()
425 wcn->sw_scan_vif); in wcn36xx_config()
426 } else if (wcn->sw_scan) { in wcn36xx_config()
431 wcn->sw_scan_vif); in wcn36xx_config()
439 wcn36xx_change_ps(wcn, hw->conf.flags & IEEE80211_CONF_PS); in wcn36xx_config()
441 mutex_unlock(&wcn->conf_mutex); in wcn36xx_config()
451 struct wcn36xx *wcn = hw->priv; in wcn36xx_configure_filter()
457 mutex_lock(&wcn->conf_mutex); in wcn36xx_configure_filter()
462 list_for_each_entry(tmp, &wcn->vif_list, list) { in wcn36xx_configure_filter()
468 else if (NL80211_IFTYPE_STATION == vif->type && tmp->sta_assoc) in wcn36xx_configure_filter()
472 mutex_unlock(&wcn->conf_mutex); in wcn36xx_configure_filter()
489 fp->mc_addr_count = 0; in wcn36xx_prepare_multicast()
494 memcpy(fp->mc_addr[fp->mc_addr_count], in wcn36xx_prepare_multicast()
495 ha->addr, ETH_ALEN); in wcn36xx_prepare_multicast()
496 fp->mc_addr_count++; in wcn36xx_prepare_multicast()
507 struct wcn36xx *wcn = hw->priv; in wcn36xx_tx()
510 if (control->sta) in wcn36xx_tx()
511 sta_priv = wcn36xx_sta_to_priv(control->sta); in wcn36xx_tx()
514 ieee80211_free_txskb(wcn->hw, skb); in wcn36xx_tx()
522 struct wcn36xx *wcn = hw->priv; in wcn36xx_set_key()
530 cmd, key_conf->cipher, key_conf->keyidx, in wcn36xx_set_key()
531 key_conf->keylen, key_conf->flags); in wcn36xx_set_key()
533 key_conf->key, in wcn36xx_set_key()
534 key_conf->keylen); in wcn36xx_set_key()
536 mutex_lock(&wcn->conf_mutex); in wcn36xx_set_key()
538 switch (key_conf->cipher) { in wcn36xx_set_key()
540 vif_priv->encrypt_type = WCN36XX_HAL_ED_WEP40; in wcn36xx_set_key()
543 vif_priv->encrypt_type = WCN36XX_HAL_ED_WEP104; in wcn36xx_set_key()
546 vif_priv->encrypt_type = WCN36XX_HAL_ED_CCMP; in wcn36xx_set_key()
549 vif_priv->encrypt_type = WCN36XX_HAL_ED_TKIP; in wcn36xx_set_key()
553 key_conf->cipher); in wcn36xx_set_key()
554 ret = -EOPNOTSUPP; in wcn36xx_set_key()
560 if (WCN36XX_HAL_ED_TKIP == vif_priv->encrypt_type) { in wcn36xx_set_key()
563 * Temporal Key (16 b) - TX MIC (8 b) - RX MIC (8 b) in wcn36xx_set_key()
566 * Temporal Key (16 b) - RX MIC (8 b) - TX MIC (8 b) in wcn36xx_set_key()
568 memcpy(key, key_conf->key, 16); in wcn36xx_set_key()
569 memcpy(key + 16, key_conf->key + 24, 8); in wcn36xx_set_key()
570 memcpy(key + 24, key_conf->key + 16, 8); in wcn36xx_set_key()
572 memcpy(key, key_conf->key, key_conf->keylen); in wcn36xx_set_key()
575 if (IEEE80211_KEY_FLAG_PAIRWISE & key_conf->flags) { in wcn36xx_set_key()
576 sta_priv->is_data_encrypted = true; in wcn36xx_set_key()
578 if (NL80211_IFTYPE_STATION == vif->type) in wcn36xx_set_key()
582 sta->addr, in wcn36xx_set_key()
586 vif_priv->encrypt_type, in wcn36xx_set_key()
587 key_conf->keyidx, in wcn36xx_set_key()
588 key_conf->keylen, in wcn36xx_set_key()
593 vif_priv->encrypt_type, in wcn36xx_set_key()
594 vif_priv->bss_index, in wcn36xx_set_key()
595 key_conf->keyidx, in wcn36xx_set_key()
596 key_conf->keylen, in wcn36xx_set_key()
599 if ((WLAN_CIPHER_SUITE_WEP40 == key_conf->cipher) || in wcn36xx_set_key()
600 (WLAN_CIPHER_SUITE_WEP104 == key_conf->cipher)) { in wcn36xx_set_key()
602 &vif_priv->sta_list, list) { in wcn36xx_set_key()
603 sta_priv->is_data_encrypted = true; in wcn36xx_set_key()
605 vif_priv->encrypt_type, in wcn36xx_set_key()
606 key_conf->keyidx, in wcn36xx_set_key()
607 key_conf->keylen, in wcn36xx_set_key()
614 * For any reasons, when connected to open/no-security BSS, in wcn36xx_set_key()
616 * 'wake-up' beacons despite AP sends DTIM with station AID. in wcn36xx_set_key()
620 if (vif->type == NL80211_IFTYPE_STATION) in wcn36xx_set_key()
621 vif_priv->allow_bmps = true; in wcn36xx_set_key()
624 if (!(IEEE80211_KEY_FLAG_PAIRWISE & key_conf->flags)) { in wcn36xx_set_key()
625 if (vif_priv->bss_index != WCN36XX_HAL_BSS_INVALID_IDX) in wcn36xx_set_key()
627 vif_priv->encrypt_type, in wcn36xx_set_key()
628 vif_priv->bss_index, in wcn36xx_set_key()
629 key_conf->keyidx); in wcn36xx_set_key()
631 vif_priv->encrypt_type = WCN36XX_HAL_ED_NONE; in wcn36xx_set_key()
633 sta_priv->is_data_encrypted = false; in wcn36xx_set_key()
635 if (sta_priv->aid) in wcn36xx_set_key()
637 vif_priv->encrypt_type, in wcn36xx_set_key()
638 key_conf->keyidx, in wcn36xx_set_key()
644 ret = -EOPNOTSUPP; in wcn36xx_set_key()
649 mutex_unlock(&wcn->conf_mutex); in wcn36xx_set_key()
658 struct wcn36xx *wcn = hw->priv; in wcn36xx_hw_scan()
661 if (!get_feat_caps(wcn->fw_feat_caps, SCAN_OFFLOAD)) { in wcn36xx_hw_scan()
667 * 2.4Ghz channels, fallback to software scan in other cases. in wcn36xx_hw_scan()
669 for (i = 0; i < hw_req->req.n_channels; i++) { in wcn36xx_hw_scan()
670 if (hw_req->req.channels[i]->band != NL80211_BAND_2GHZ) in wcn36xx_hw_scan()
674 mutex_lock(&wcn->scan_lock); in wcn36xx_hw_scan()
675 if (wcn->scan_req) { in wcn36xx_hw_scan()
676 mutex_unlock(&wcn->scan_lock); in wcn36xx_hw_scan()
677 return -EBUSY; in wcn36xx_hw_scan()
680 wcn->scan_aborted = false; in wcn36xx_hw_scan()
681 wcn->scan_req = &hw_req->req; in wcn36xx_hw_scan()
683 mutex_unlock(&wcn->scan_lock); in wcn36xx_hw_scan()
685 return wcn36xx_smd_start_hw_scan(wcn, vif, &hw_req->req); in wcn36xx_hw_scan()
691 struct wcn36xx *wcn = hw->priv; in wcn36xx_cancel_hw_scan()
693 mutex_lock(&wcn->scan_lock); in wcn36xx_cancel_hw_scan()
694 wcn->scan_aborted = true; in wcn36xx_cancel_hw_scan()
695 mutex_unlock(&wcn->scan_lock); in wcn36xx_cancel_hw_scan()
697 if (get_feat_caps(wcn->fw_feat_caps, SCAN_OFFLOAD)) { in wcn36xx_cancel_hw_scan()
708 struct wcn36xx *wcn = hw->priv; in wcn36xx_sw_scan_start()
711 wcn->sw_scan = true; in wcn36xx_sw_scan_start()
712 wcn->sw_scan_vif = vif; in wcn36xx_sw_scan_start()
713 if (vif_priv->sta_assoc) in wcn36xx_sw_scan_start()
714 wcn->sw_scan_opchannel = WCN36XX_HW_CHANNEL(wcn); in wcn36xx_sw_scan_start()
716 wcn->sw_scan_opchannel = 0; in wcn36xx_sw_scan_start()
722 struct wcn36xx *wcn = hw->priv; in wcn36xx_sw_scan_complete()
725 wcn36xx_smd_finish_scan(wcn, HAL_SYS_MODE_SCAN, wcn->sw_scan_vif); in wcn36xx_sw_scan_complete()
726 wcn->sw_scan = false; in wcn36xx_sw_scan_complete()
727 wcn->sw_scan_opchannel = 0; in wcn36xx_sw_scan_complete()
736 u32 rates = sta->supp_rates[band]; in wcn36xx_update_allowed_rates()
738 memset(&sta_priv->supported_rates, 0, in wcn36xx_update_allowed_rates()
739 sizeof(sta_priv->supported_rates)); in wcn36xx_update_allowed_rates()
740 sta_priv->supported_rates.op_rate_mode = STA_11n; in wcn36xx_update_allowed_rates()
742 size = ARRAY_SIZE(sta_priv->supported_rates.dsss_rates); in wcn36xx_update_allowed_rates()
743 rates_table = sta_priv->supported_rates.dsss_rates; in wcn36xx_update_allowed_rates()
753 size = ARRAY_SIZE(sta_priv->supported_rates.ofdm_rates); in wcn36xx_update_allowed_rates()
754 rates_table = sta_priv->supported_rates.ofdm_rates; in wcn36xx_update_allowed_rates()
762 if (sta->ht_cap.ht_supported) { in wcn36xx_update_allowed_rates()
763 BUILD_BUG_ON(sizeof(sta->ht_cap.mcs.rx_mask) > in wcn36xx_update_allowed_rates()
764 sizeof(sta_priv->supported_rates.supported_mcs_set)); in wcn36xx_update_allowed_rates()
765 memcpy(sta_priv->supported_rates.supported_mcs_set, in wcn36xx_update_allowed_rates()
766 sta->ht_cap.mcs.rx_mask, in wcn36xx_update_allowed_rates()
767 sizeof(sta->ht_cap.mcs.rx_mask)); in wcn36xx_update_allowed_rates()
770 if (sta->vht_cap.vht_supported) { in wcn36xx_update_allowed_rates()
771 sta_priv->supported_rates.op_rate_mode = STA_11ac; in wcn36xx_update_allowed_rates()
772 sta_priv->supported_rates.vht_rx_mcs_map = in wcn36xx_update_allowed_rates()
773 sta->vht_cap.vht_mcs.rx_mcs_map; in wcn36xx_update_allowed_rates()
774 sta_priv->supported_rates.vht_tx_mcs_map = in wcn36xx_update_allowed_rates()
775 sta->vht_cap.vht_mcs.tx_mcs_map; in wcn36xx_update_allowed_rates()
798 rates->op_rate_mode = STA_11n; in wcn36xx_set_default_rates()
799 memcpy(rates->dsss_rates, dsss_rates, in wcn36xx_set_default_rates()
801 memcpy(rates->ofdm_rates, ofdm_rates, in wcn36xx_set_default_rates()
803 rates->supported_mcs_set[0] = 0xFF; in wcn36xx_set_default_rates()
808 rates->op_rate_mode = STA_11ac; in wcn36xx_set_default_rates_v1()
809 rates->vht_rx_mcs_map = IEEE80211_VHT_MCS_SUPPORT_0_9; in wcn36xx_set_default_rates_v1()
810 rates->vht_tx_mcs_map = IEEE80211_VHT_MCS_SUPPORT_0_9; in wcn36xx_set_default_rates_v1()
818 struct wcn36xx *wcn = hw->priv; in wcn36xx_bss_info_changed()
827 mutex_lock(&wcn->conf_mutex); in wcn36xx_bss_info_changed()
832 bss_conf->dtim_period); in wcn36xx_bss_info_changed()
834 vif_priv->dtim_period = bss_conf->dtim_period; in wcn36xx_bss_info_changed()
839 bss_conf->bssid); in wcn36xx_bss_info_changed()
841 if (!is_zero_ether_addr(bss_conf->bssid)) { in wcn36xx_bss_info_changed()
842 vif_priv->is_joining = true; in wcn36xx_bss_info_changed()
843 vif_priv->bss_index = WCN36XX_HAL_BSS_INVALID_IDX; in wcn36xx_bss_info_changed()
844 wcn36xx_smd_set_link_st(wcn, bss_conf->bssid, vif->addr, in wcn36xx_bss_info_changed()
846 wcn36xx_smd_join(wcn, bss_conf->bssid, in wcn36xx_bss_info_changed()
847 vif->addr, WCN36XX_HW_CHANNEL(wcn)); in wcn36xx_bss_info_changed()
849 bss_conf->bssid, false); in wcn36xx_bss_info_changed()
851 vif_priv->is_joining = false; in wcn36xx_bss_info_changed()
853 wcn36xx_smd_set_link_st(wcn, bss_conf->bssid, vif->addr, in wcn36xx_bss_info_changed()
855 vif_priv->encrypt_type = WCN36XX_HAL_ED_NONE; in wcn36xx_bss_info_changed()
863 bss_conf->ssid, bss_conf->ssid_len); in wcn36xx_bss_info_changed()
865 vif_priv->ssid.length = bss_conf->ssid_len; in wcn36xx_bss_info_changed()
866 memcpy(&vif_priv->ssid.ssid, in wcn36xx_bss_info_changed()
867 bss_conf->ssid, in wcn36xx_bss_info_changed()
868 bss_conf->ssid_len); in wcn36xx_bss_info_changed()
872 vif_priv->is_joining = false; in wcn36xx_bss_info_changed()
873 if (bss_conf->assoc) { in wcn36xx_bss_info_changed()
879 bss_conf->bssid, in wcn36xx_bss_info_changed()
880 vif->addr, in wcn36xx_bss_info_changed()
881 bss_conf->aid); in wcn36xx_bss_info_changed()
883 vif_priv->sta_assoc = true; in wcn36xx_bss_info_changed()
891 sta = ieee80211_find_sta(vif, bss_conf->bssid); in wcn36xx_bss_info_changed()
894 bss_conf->bssid); in wcn36xx_bss_info_changed()
901 wcn36xx_smd_set_link_st(wcn, bss_conf->bssid, in wcn36xx_bss_info_changed()
902 vif->addr, in wcn36xx_bss_info_changed()
905 bss_conf->bssid, in wcn36xx_bss_info_changed()
907 sta_priv->aid = bss_conf->aid; in wcn36xx_bss_info_changed()
916 bss_conf->bssid, in wcn36xx_bss_info_changed()
917 vif->addr, in wcn36xx_bss_info_changed()
918 bss_conf->aid); in wcn36xx_bss_info_changed()
919 vif_priv->sta_assoc = false; in wcn36xx_bss_info_changed()
920 vif_priv->allow_bmps = false; in wcn36xx_bss_info_changed()
922 bss_conf->bssid, in wcn36xx_bss_info_changed()
923 vif->addr, in wcn36xx_bss_info_changed()
944 bss_conf->enable_beacon); in wcn36xx_bss_info_changed()
946 if (bss_conf->enable_beacon) { in wcn36xx_bss_info_changed()
947 vif_priv->dtim_period = bss_conf->dtim_period; in wcn36xx_bss_info_changed()
948 vif_priv->bss_index = WCN36XX_HAL_BSS_INVALID_IDX; in wcn36xx_bss_info_changed()
950 vif->addr, false); in wcn36xx_bss_info_changed()
960 if (vif->type == NL80211_IFTYPE_ADHOC || in wcn36xx_bss_info_changed()
961 vif->type == NL80211_IFTYPE_MESH_POINT) in wcn36xx_bss_info_changed()
966 wcn36xx_smd_set_link_st(wcn, vif->addr, vif->addr, in wcn36xx_bss_info_changed()
970 wcn36xx_smd_set_link_st(wcn, vif->addr, vif->addr, in wcn36xx_bss_info_changed()
976 mutex_unlock(&wcn->conf_mutex); in wcn36xx_bss_info_changed()
982 struct wcn36xx *wcn = hw->priv; in wcn36xx_set_rts_threshold()
985 mutex_lock(&wcn->conf_mutex); in wcn36xx_set_rts_threshold()
987 mutex_unlock(&wcn->conf_mutex); in wcn36xx_set_rts_threshold()
995 struct wcn36xx *wcn = hw->priv; in wcn36xx_remove_interface()
999 mutex_lock(&wcn->conf_mutex); in wcn36xx_remove_interface()
1001 list_del(&vif_priv->list); in wcn36xx_remove_interface()
1002 wcn36xx_smd_delete_sta_self(wcn, vif->addr); in wcn36xx_remove_interface()
1004 mutex_unlock(&wcn->conf_mutex); in wcn36xx_remove_interface()
1010 struct wcn36xx *wcn = hw->priv; in wcn36xx_add_interface()
1014 vif, vif->type); in wcn36xx_add_interface()
1016 if (!(NL80211_IFTYPE_STATION == vif->type || in wcn36xx_add_interface()
1017 NL80211_IFTYPE_AP == vif->type || in wcn36xx_add_interface()
1018 NL80211_IFTYPE_ADHOC == vif->type || in wcn36xx_add_interface()
1019 NL80211_IFTYPE_MESH_POINT == vif->type)) { in wcn36xx_add_interface()
1021 vif->type); in wcn36xx_add_interface()
1022 return -EOPNOTSUPP; in wcn36xx_add_interface()
1025 mutex_lock(&wcn->conf_mutex); in wcn36xx_add_interface()
1027 vif_priv->bss_index = WCN36XX_HAL_BSS_INVALID_IDX; in wcn36xx_add_interface()
1028 INIT_LIST_HEAD(&vif_priv->sta_list); in wcn36xx_add_interface()
1029 list_add(&vif_priv->list, &wcn->vif_list); in wcn36xx_add_interface()
1032 mutex_unlock(&wcn->conf_mutex); in wcn36xx_add_interface()
1040 struct wcn36xx *wcn = hw->priv; in wcn36xx_sta_add()
1044 vif, sta->addr); in wcn36xx_sta_add()
1046 mutex_lock(&wcn->conf_mutex); in wcn36xx_sta_add()
1048 spin_lock_init(&sta_priv->ampdu_lock); in wcn36xx_sta_add()
1049 sta_priv->vif = vif_priv; in wcn36xx_sta_add()
1050 list_add(&sta_priv->list, &vif_priv->sta_list); in wcn36xx_sta_add()
1056 if (NL80211_IFTYPE_STATION != vif->type) { in wcn36xx_sta_add()
1058 sta_priv->aid = sta->aid; in wcn36xx_sta_add()
1062 mutex_unlock(&wcn->conf_mutex); in wcn36xx_sta_add()
1071 struct wcn36xx *wcn = hw->priv; in wcn36xx_sta_remove()
1075 vif, sta->addr, sta_priv->sta_index); in wcn36xx_sta_remove()
1077 mutex_lock(&wcn->conf_mutex); in wcn36xx_sta_remove()
1079 list_del(&sta_priv->list); in wcn36xx_sta_remove()
1080 wcn36xx_smd_delete_sta(wcn, sta_priv->sta_index); in wcn36xx_sta_remove()
1081 sta_priv->vif = NULL; in wcn36xx_sta_remove()
1083 mutex_unlock(&wcn->conf_mutex); in wcn36xx_sta_remove()
1092 struct wcn36xx *wcn = hw->priv; in wcn36xx_suspend()
1096 flush_workqueue(wcn->hal_ind_wq); in wcn36xx_suspend()
1103 struct wcn36xx *wcn = hw->priv; in wcn36xx_resume()
1107 flush_workqueue(wcn->hal_ind_wq); in wcn36xx_resume()
1118 struct wcn36xx *wcn = hw->priv; in wcn36xx_ampdu_action()
1119 struct wcn36xx_sta *sta_priv = wcn36xx_sta_to_priv(params->sta); in wcn36xx_ampdu_action()
1120 struct ieee80211_sta *sta = params->sta; in wcn36xx_ampdu_action()
1121 enum ieee80211_ampdu_mlme_action action = params->action; in wcn36xx_ampdu_action()
1122 u16 tid = params->tid; in wcn36xx_ampdu_action()
1123 u16 *ssn = &params->ssn; in wcn36xx_ampdu_action()
1130 mutex_lock(&wcn->conf_mutex); in wcn36xx_ampdu_action()
1134 sta_priv->tid = tid; in wcn36xx_ampdu_action()
1145 spin_lock_bh(&sta_priv->ampdu_lock); in wcn36xx_ampdu_action()
1146 sta_priv->ampdu_state[tid] = WCN36XX_AMPDU_START; in wcn36xx_ampdu_action()
1147 spin_unlock_bh(&sta_priv->ampdu_lock); in wcn36xx_ampdu_action()
1152 spin_lock_bh(&sta_priv->ampdu_lock); in wcn36xx_ampdu_action()
1153 sta_priv->ampdu_state[tid] = WCN36XX_AMPDU_OPERATIONAL; in wcn36xx_ampdu_action()
1154 spin_unlock_bh(&sta_priv->ampdu_lock); in wcn36xx_ampdu_action()
1162 spin_lock_bh(&sta_priv->ampdu_lock); in wcn36xx_ampdu_action()
1163 sta_priv->ampdu_state[tid] = WCN36XX_AMPDU_NONE; in wcn36xx_ampdu_action()
1164 spin_unlock_bh(&sta_priv->ampdu_lock); in wcn36xx_ampdu_action()
1166 ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid); in wcn36xx_ampdu_action()
1172 mutex_unlock(&wcn->conf_mutex); in wcn36xx_ampdu_action()
1207 vht_cap->vht_supported = true; in wcn36xx_set_ieee80211_vht_caps()
1209 vht_cap->cap = (IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895 | in wcn36xx_set_ieee80211_vht_caps()
1217 vht_cap->vht_mcs.rx_mcs_map = in wcn36xx_set_ieee80211_vht_caps()
1227 vht_cap->vht_mcs.rx_highest = cpu_to_le16(433); in wcn36xx_set_ieee80211_vht_caps()
1228 vht_cap->vht_mcs.tx_highest = vht_cap->vht_mcs.rx_highest; in wcn36xx_set_ieee80211_vht_caps()
1230 vht_cap->vht_mcs.tx_mcs_map = vht_cap->vht_mcs.rx_mcs_map; in wcn36xx_set_ieee80211_vht_caps()
1242 ieee80211_hw_set(wcn->hw, TIMING_BEACON_ONLY); in wcn36xx_init_ieee80211()
1243 ieee80211_hw_set(wcn->hw, AMPDU_AGGREGATION); in wcn36xx_init_ieee80211()
1244 ieee80211_hw_set(wcn->hw, SUPPORTS_PS); in wcn36xx_init_ieee80211()
1245 ieee80211_hw_set(wcn->hw, SIGNAL_DBM); in wcn36xx_init_ieee80211()
1246 ieee80211_hw_set(wcn->hw, HAS_RATE_CONTROL); in wcn36xx_init_ieee80211()
1247 ieee80211_hw_set(wcn->hw, SINGLE_SCAN_ON_ALL_BANDS); in wcn36xx_init_ieee80211()
1248 ieee80211_hw_set(wcn->hw, REPORTS_TX_ACK_STATUS); in wcn36xx_init_ieee80211()
1250 wcn->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | in wcn36xx_init_ieee80211()
1255 wcn->hw->wiphy->bands[NL80211_BAND_2GHZ] = &wcn_band_2ghz; in wcn36xx_init_ieee80211()
1256 if (wcn->rf_id != RF_IRIS_WCN3620) in wcn36xx_init_ieee80211()
1257 wcn->hw->wiphy->bands[NL80211_BAND_5GHZ] = &wcn_band_5ghz; in wcn36xx_init_ieee80211()
1259 if (wcn->rf_id == RF_IRIS_WCN3680) in wcn36xx_init_ieee80211()
1262 wcn->hw->wiphy->max_scan_ssids = WCN36XX_MAX_SCAN_SSIDS; in wcn36xx_init_ieee80211()
1263 wcn->hw->wiphy->max_scan_ie_len = WCN36XX_MAX_SCAN_IE_LEN; in wcn36xx_init_ieee80211()
1265 wcn->hw->wiphy->cipher_suites = cipher_suites; in wcn36xx_init_ieee80211()
1266 wcn->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites); in wcn36xx_init_ieee80211()
1269 wcn->hw->wiphy->wowlan = &wowlan_support; in wcn36xx_init_ieee80211()
1272 wcn->hw->max_listen_interval = 200; in wcn36xx_init_ieee80211()
1274 wcn->hw->queues = 4; in wcn36xx_init_ieee80211()
1276 SET_IEEE80211_DEV(wcn->hw, wcn->dev); in wcn36xx_init_ieee80211()
1278 wcn->hw->sta_data_size = sizeof(struct wcn36xx_sta); in wcn36xx_init_ieee80211()
1279 wcn->hw->vif_data_size = sizeof(struct wcn36xx_vif); in wcn36xx_init_ieee80211()
1281 wiphy_ext_feature_set(wcn->hw->wiphy, in wcn36xx_init_ieee80211()
1300 return -ENOENT; in wcn36xx_platform_get_resources()
1302 wcn->tx_irq = res->start; in wcn36xx_platform_get_resources()
1308 return -ENOENT; in wcn36xx_platform_get_resources()
1310 wcn->rx_irq = res->start; in wcn36xx_platform_get_resources()
1313 wcn->tx_enable_state = qcom_smem_state_get(&pdev->dev, in wcn36xx_platform_get_resources()
1314 "tx-enable", &wcn->tx_enable_state_bit); in wcn36xx_platform_get_resources()
1315 if (IS_ERR(wcn->tx_enable_state)) { in wcn36xx_platform_get_resources()
1316 wcn36xx_err("failed to get tx-enable state\n"); in wcn36xx_platform_get_resources()
1317 return PTR_ERR(wcn->tx_enable_state); in wcn36xx_platform_get_resources()
1321 wcn->tx_rings_empty_state = qcom_smem_state_get(&pdev->dev, in wcn36xx_platform_get_resources()
1322 "tx-rings-empty", &wcn->tx_rings_empty_state_bit); in wcn36xx_platform_get_resources()
1323 if (IS_ERR(wcn->tx_rings_empty_state)) { in wcn36xx_platform_get_resources()
1324 wcn36xx_err("failed to get tx-rings-empty state\n"); in wcn36xx_platform_get_resources()
1325 return PTR_ERR(wcn->tx_rings_empty_state); in wcn36xx_platform_get_resources()
1328 mmio_node = of_parse_phandle(pdev->dev.parent->of_node, "qcom,mmio", 0); in wcn36xx_platform_get_resources()
1331 return -EINVAL; in wcn36xx_platform_get_resources()
1334 wcn->is_pronto = !!of_device_is_compatible(mmio_node, "qcom,pronto"); in wcn36xx_platform_get_resources()
1337 index = of_property_match_string(mmio_node, "reg-names", "ccu"); in wcn36xx_platform_get_resources()
1338 wcn->ccu_base = of_iomap(mmio_node, index); in wcn36xx_platform_get_resources()
1339 if (!wcn->ccu_base) { in wcn36xx_platform_get_resources()
1341 ret = -ENOMEM; in wcn36xx_platform_get_resources()
1346 index = of_property_match_string(mmio_node, "reg-names", "dxe"); in wcn36xx_platform_get_resources()
1347 wcn->dxe_base = of_iomap(mmio_node, index); in wcn36xx_platform_get_resources()
1348 if (!wcn->dxe_base) { in wcn36xx_platform_get_resources()
1350 ret = -ENOMEM; in wcn36xx_platform_get_resources()
1358 wcn->rf_id = RF_IRIS_WCN3620; in wcn36xx_platform_get_resources()
1360 wcn->rf_id = RF_IRIS_WCN3680; in wcn36xx_platform_get_resources()
1368 iounmap(wcn->ccu_base); in wcn36xx_platform_get_resources()
1384 wcnss = dev_get_drvdata(pdev->dev.parent); in wcn36xx_probe()
1389 ret = -ENOMEM; in wcn36xx_probe()
1393 wcn = hw->priv; in wcn36xx_probe()
1394 wcn->hw = hw; in wcn36xx_probe()
1395 wcn->dev = &pdev->dev; in wcn36xx_probe()
1396 wcn->first_boot = true; in wcn36xx_probe()
1397 mutex_init(&wcn->conf_mutex); in wcn36xx_probe()
1398 mutex_init(&wcn->hal_mutex); in wcn36xx_probe()
1399 mutex_init(&wcn->scan_lock); in wcn36xx_probe()
1401 ret = dma_set_mask_and_coherent(wcn->dev, DMA_BIT_MASK(32)); in wcn36xx_probe()
1407 wcn->smd_channel = qcom_wcnss_open_channel(wcnss, "WLAN_CTRL", wcn36xx_smd_rsp_process, hw); in wcn36xx_probe()
1408 if (IS_ERR(wcn->smd_channel)) { in wcn36xx_probe()
1410 ret = PTR_ERR(wcn->smd_channel); in wcn36xx_probe()
1414 addr = of_get_property(pdev->dev.of_node, "local-mac-address", &ret); in wcn36xx_probe()
1416 wcn36xx_err("invalid local-mac-address\n"); in wcn36xx_probe()
1417 ret = -EINVAL; in wcn36xx_probe()
1421 SET_IEEE80211_PERM_ADDR(wcn->hw, addr); in wcn36xx_probe()
1429 ret = ieee80211_register_hw(wcn->hw); in wcn36xx_probe()
1436 iounmap(wcn->ccu_base); in wcn36xx_probe()
1437 iounmap(wcn->dxe_base); in wcn36xx_probe()
1439 rpmsg_destroy_ept(wcn->smd_channel); in wcn36xx_probe()
1449 struct wcn36xx *wcn = hw->priv; in wcn36xx_remove()
1452 release_firmware(wcn->nv); in wcn36xx_remove()
1456 qcom_smem_state_put(wcn->tx_enable_state); in wcn36xx_remove()
1457 qcom_smem_state_put(wcn->tx_rings_empty_state); in wcn36xx_remove()
1459 rpmsg_destroy_ept(wcn->smd_channel); in wcn36xx_remove()
1461 iounmap(wcn->dxe_base); in wcn36xx_remove()
1462 iounmap(wcn->ccu_base); in wcn36xx_remove()
1464 mutex_destroy(&wcn->hal_mutex); in wcn36xx_remove()
1471 { .compatible = "qcom,wcnss-wlan" },