Lines Matching refs:wcn
216 static void wcn36xx_feat_caps_info(struct wcn36xx *wcn) in wcn36xx_feat_caps_info() argument
221 if (get_feat_caps(wcn->fw_feat_caps, i)) in wcn36xx_feat_caps_info()
226 static void wcn36xx_detect_chip_version(struct wcn36xx *wcn) in wcn36xx_detect_chip_version() argument
228 if (get_feat_caps(wcn->fw_feat_caps, DOT11AC)) { in wcn36xx_detect_chip_version()
230 wcn->chip_version = WCN36XX_CHIP_3680; in wcn36xx_detect_chip_version()
233 wcn->chip_version = WCN36XX_CHIP_3660; in wcn36xx_detect_chip_version()
239 struct wcn36xx *wcn = hw->priv; in wcn36xx_start() local
245 ret = wcn36xx_smd_open(wcn); in wcn36xx_start()
252 ret = wcn36xx_dxe_allocate_mem_pools(wcn); in wcn36xx_start()
258 ret = wcn36xx_dxe_alloc_ctl_blks(wcn); in wcn36xx_start()
264 wcn->hal_buf = kmalloc(WCN36XX_HAL_BUF_SIZE, GFP_KERNEL); in wcn36xx_start()
265 if (!wcn->hal_buf) { in wcn36xx_start()
271 ret = wcn36xx_smd_load_nv(wcn); in wcn36xx_start()
277 ret = wcn36xx_smd_start(wcn); in wcn36xx_start()
283 if (!wcn36xx_is_fw_version(wcn, 1, 2, 2, 24)) { in wcn36xx_start()
284 ret = wcn36xx_smd_feature_caps_exchange(wcn); in wcn36xx_start()
288 wcn36xx_feat_caps_info(wcn); in wcn36xx_start()
291 wcn36xx_detect_chip_version(wcn); in wcn36xx_start()
294 ret = wcn36xx_dxe_init(wcn); in wcn36xx_start()
300 wcn36xx_debugfs_init(wcn); in wcn36xx_start()
302 INIT_LIST_HEAD(&wcn->vif_list); in wcn36xx_start()
303 spin_lock_init(&wcn->dxe_lock); in wcn36xx_start()
308 wcn36xx_smd_stop(wcn); in wcn36xx_start()
310 kfree(wcn->hal_buf); in wcn36xx_start()
312 wcn36xx_dxe_free_mem_pools(wcn); in wcn36xx_start()
314 wcn36xx_dxe_free_ctl_blks(wcn); in wcn36xx_start()
316 wcn36xx_smd_close(wcn); in wcn36xx_start()
323 struct wcn36xx *wcn = hw->priv; in wcn36xx_stop() local
327 wcn36xx_debugfs_exit(wcn); in wcn36xx_stop()
328 wcn36xx_smd_stop(wcn); in wcn36xx_stop()
329 wcn36xx_dxe_deinit(wcn); in wcn36xx_stop()
330 wcn36xx_smd_close(wcn); in wcn36xx_stop()
332 wcn36xx_dxe_free_mem_pools(wcn); in wcn36xx_stop()
333 wcn36xx_dxe_free_ctl_blks(wcn); in wcn36xx_stop()
335 kfree(wcn->hal_buf); in wcn36xx_stop()
340 struct wcn36xx *wcn = hw->priv; in wcn36xx_config() local
347 int ch = WCN36XX_HW_CHANNEL(wcn); in wcn36xx_config()
350 list_for_each_entry(tmp, &wcn->vif_list, list) { in wcn36xx_config()
354 wcn36xx_smd_switch_channel(wcn, vif, ch); in wcn36xx_config()
376 struct wcn36xx *wcn = hw->priv; in wcn36xx_tx() local
382 if (wcn36xx_start_tx(wcn, sta_priv, skb)) in wcn36xx_tx()
383 ieee80211_free_txskb(wcn->hw, skb); in wcn36xx_tx()
391 struct wcn36xx *wcn = hw->priv; in wcn36xx_set_key() local
446 wcn36xx_smd_config_bss(wcn, in wcn36xx_set_key()
452 wcn36xx_smd_set_stakey(wcn, in wcn36xx_set_key()
459 wcn36xx_smd_set_bsskey(wcn, in wcn36xx_set_key()
467 wcn36xx_smd_set_stakey(wcn, in wcn36xx_set_key()
478 wcn36xx_smd_remove_bsskey(wcn, in wcn36xx_set_key()
485 wcn36xx_smd_remove_stakey(wcn, in wcn36xx_set_key()
505 struct wcn36xx *wcn = hw->priv; in wcn36xx_sw_scan_start() local
507 wcn36xx_smd_init_scan(wcn, HAL_SYS_MODE_SCAN); in wcn36xx_sw_scan_start()
508 wcn36xx_smd_start_scan(wcn); in wcn36xx_sw_scan_start()
514 struct wcn36xx *wcn = hw->priv; in wcn36xx_sw_scan_complete() local
516 wcn36xx_smd_end_scan(wcn); in wcn36xx_sw_scan_complete()
517 wcn36xx_smd_finish_scan(wcn, HAL_SYS_MODE_SCAN); in wcn36xx_sw_scan_complete()
591 struct wcn36xx *wcn = hw->priv; in wcn36xx_bss_info_changed() local
613 wcn36xx_pmc_enter_bmps_state(wcn, vif); in wcn36xx_bss_info_changed()
615 wcn36xx_pmc_exit_bmps_state(wcn, vif); in wcn36xx_bss_info_changed()
626 wcn36xx_smd_join(wcn, bss_conf->bssid, in wcn36xx_bss_info_changed()
627 vif->addr, WCN36XX_HW_CHANNEL(wcn)); in wcn36xx_bss_info_changed()
628 wcn36xx_smd_config_bss(wcn, vif, NULL, in wcn36xx_bss_info_changed()
632 wcn36xx_smd_delete_bss(wcn, vif); in wcn36xx_bss_info_changed()
670 wcn36xx_update_allowed_rates(sta, WCN36XX_BAND(wcn)); in wcn36xx_bss_info_changed()
672 wcn36xx_smd_set_link_st(wcn, bss_conf->bssid, in wcn36xx_bss_info_changed()
675 wcn36xx_smd_config_bss(wcn, vif, sta, in wcn36xx_bss_info_changed()
683 wcn36xx_smd_config_sta(wcn, vif, sta); in wcn36xx_bss_info_changed()
691 wcn36xx_smd_set_link_st(wcn, in wcn36xx_bss_info_changed()
706 wcn36xx_smd_update_proberesp_tmpl(wcn, vif, skb); in wcn36xx_bss_info_changed()
719 wcn36xx_smd_config_bss(wcn, vif, NULL, in wcn36xx_bss_info_changed()
727 wcn36xx_smd_send_beacon(wcn, vif, skb, tim_off, 0); in wcn36xx_bss_info_changed()
736 wcn36xx_smd_set_link_st(wcn, vif->addr, vif->addr, in wcn36xx_bss_info_changed()
739 wcn36xx_smd_set_link_st(wcn, vif->addr, vif->addr, in wcn36xx_bss_info_changed()
741 wcn36xx_smd_delete_bss(wcn, vif); in wcn36xx_bss_info_changed()
751 struct wcn36xx *wcn = hw->priv; in wcn36xx_set_rts_threshold() local
754 wcn36xx_smd_update_cfg(wcn, WCN36XX_HAL_CFG_RTS_THRESHOLD, value); in wcn36xx_set_rts_threshold()
761 struct wcn36xx *wcn = hw->priv; in wcn36xx_remove_interface() local
766 wcn36xx_smd_delete_sta_self(wcn, vif->addr); in wcn36xx_remove_interface()
772 struct wcn36xx *wcn = hw->priv; in wcn36xx_add_interface() local
787 list_add(&vif_priv->list, &wcn->vif_list); in wcn36xx_add_interface()
788 wcn36xx_smd_add_sta_self(wcn, vif); in wcn36xx_add_interface()
796 struct wcn36xx *wcn = hw->priv; in wcn36xx_sta_add() local
810 wcn36xx_update_allowed_rates(sta, WCN36XX_BAND(wcn)); in wcn36xx_sta_add()
812 wcn36xx_smd_config_sta(wcn, vif, sta); in wcn36xx_sta_add()
821 struct wcn36xx *wcn = hw->priv; in wcn36xx_sta_remove() local
828 wcn36xx_smd_delete_sta(wcn, sta_priv->sta_index); in wcn36xx_sta_remove()
838 struct wcn36xx *wcn = hw->priv; in wcn36xx_suspend() local
842 flush_workqueue(wcn->hal_ind_wq); in wcn36xx_suspend()
843 wcn36xx_smd_set_power_params(wcn, true); in wcn36xx_suspend()
849 struct wcn36xx *wcn = hw->priv; in wcn36xx_resume() local
853 flush_workqueue(wcn->hal_ind_wq); in wcn36xx_resume()
854 wcn36xx_smd_set_power_params(wcn, false); in wcn36xx_resume()
864 struct wcn36xx *wcn = hw->priv; in wcn36xx_ampdu_action() local
879 wcn36xx_smd_add_ba_session(wcn, sta, tid, ssn, 0, in wcn36xx_ampdu_action()
881 wcn36xx_smd_add_ba(wcn); in wcn36xx_ampdu_action()
882 wcn36xx_smd_trigger_ba(wcn, get_sta_index(vif, sta_priv)); in wcn36xx_ampdu_action()
885 wcn36xx_smd_del_ba(wcn, tid, get_sta_index(vif, sta_priv)); in wcn36xx_ampdu_action()
899 wcn36xx_smd_add_ba_session(wcn, sta, tid, ssn, 1, in wcn36xx_ampdu_action()
940 static int wcn36xx_init_ieee80211(struct wcn36xx *wcn) in wcn36xx_init_ieee80211() argument
951 ieee80211_hw_set(wcn->hw, TIMING_BEACON_ONLY); in wcn36xx_init_ieee80211()
952 ieee80211_hw_set(wcn->hw, AMPDU_AGGREGATION); in wcn36xx_init_ieee80211()
953 ieee80211_hw_set(wcn->hw, CONNECTION_MONITOR); in wcn36xx_init_ieee80211()
954 ieee80211_hw_set(wcn->hw, SUPPORTS_PS); in wcn36xx_init_ieee80211()
955 ieee80211_hw_set(wcn->hw, SIGNAL_DBM); in wcn36xx_init_ieee80211()
956 ieee80211_hw_set(wcn->hw, HAS_RATE_CONTROL); in wcn36xx_init_ieee80211()
958 wcn->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | in wcn36xx_init_ieee80211()
963 wcn->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &wcn_band_2ghz; in wcn36xx_init_ieee80211()
964 wcn->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = &wcn_band_5ghz; in wcn36xx_init_ieee80211()
966 wcn->hw->wiphy->cipher_suites = cipher_suites; in wcn36xx_init_ieee80211()
967 wcn->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites); in wcn36xx_init_ieee80211()
969 wcn->hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD; in wcn36xx_init_ieee80211()
972 wcn->hw->wiphy->wowlan = &wowlan_support; in wcn36xx_init_ieee80211()
975 wcn->hw->max_listen_interval = 200; in wcn36xx_init_ieee80211()
977 wcn->hw->queues = 4; in wcn36xx_init_ieee80211()
979 SET_IEEE80211_DEV(wcn->hw, wcn->dev); in wcn36xx_init_ieee80211()
981 wcn->hw->sta_data_size = sizeof(struct wcn36xx_sta); in wcn36xx_init_ieee80211()
982 wcn->hw->vif_data_size = sizeof(struct wcn36xx_vif); in wcn36xx_init_ieee80211()
987 static int wcn36xx_platform_get_resources(struct wcn36xx *wcn, in wcn36xx_platform_get_resources() argument
998 wcn->tx_irq = res->start; in wcn36xx_platform_get_resources()
1007 wcn->rx_irq = res->start; in wcn36xx_platform_get_resources()
1016 wcn->mmio = ioremap(res->start, resource_size(res)); in wcn36xx_platform_get_resources()
1017 if (!wcn->mmio) { in wcn36xx_platform_get_resources()
1027 struct wcn36xx *wcn; in wcn36xx_probe() local
1040 wcn = hw->priv; in wcn36xx_probe()
1041 wcn->hw = hw; in wcn36xx_probe()
1042 wcn->dev = &pdev->dev; in wcn36xx_probe()
1043 wcn->ctrl_ops = pdev->dev.platform_data; in wcn36xx_probe()
1045 mutex_init(&wcn->hal_mutex); in wcn36xx_probe()
1047 if (!wcn->ctrl_ops->get_hw_mac(addr)) { in wcn36xx_probe()
1049 SET_IEEE80211_PERM_ADDR(wcn->hw, addr); in wcn36xx_probe()
1052 ret = wcn36xx_platform_get_resources(wcn, pdev); in wcn36xx_probe()
1056 wcn36xx_init_ieee80211(wcn); in wcn36xx_probe()
1057 ret = ieee80211_register_hw(wcn->hw); in wcn36xx_probe()
1064 iounmap(wcn->mmio); in wcn36xx_probe()
1073 struct wcn36xx *wcn = hw->priv; in wcn36xx_remove() local
1076 release_firmware(wcn->nv); in wcn36xx_remove()
1077 mutex_destroy(&wcn->hal_mutex); in wcn36xx_remove()
1080 iounmap(wcn->mmio); in wcn36xx_remove()