• Home
  • Raw
  • Download

Lines Matching full:wcn

49 /* The wcn firmware expects channel values to matching
261 static void wcn36xx_feat_caps_info(struct wcn36xx *wcn) in wcn36xx_feat_caps_info() argument
266 if (get_feat_caps(wcn->fw_feat_caps, i)) in wcn36xx_feat_caps_info()
273 struct wcn36xx *wcn = hw->priv; in wcn36xx_start() local
279 ret = wcn36xx_smd_open(wcn); in wcn36xx_start()
286 ret = wcn36xx_dxe_allocate_mem_pools(wcn); in wcn36xx_start()
292 ret = wcn36xx_dxe_alloc_ctl_blks(wcn); in wcn36xx_start()
298 ret = wcn36xx_smd_load_nv(wcn); in wcn36xx_start()
304 ret = wcn36xx_smd_start(wcn); in wcn36xx_start()
310 if (!wcn36xx_is_fw_version(wcn, 1, 2, 2, 24)) { in wcn36xx_start()
311 ret = wcn36xx_smd_feature_caps_exchange(wcn); in wcn36xx_start()
315 wcn36xx_feat_caps_info(wcn); in wcn36xx_start()
319 ret = wcn36xx_dxe_init(wcn); in wcn36xx_start()
325 wcn36xx_debugfs_init(wcn); in wcn36xx_start()
327 INIT_LIST_HEAD(&wcn->vif_list); in wcn36xx_start()
328 spin_lock_init(&wcn->dxe_lock); in wcn36xx_start()
333 wcn36xx_smd_stop(wcn); in wcn36xx_start()
335 wcn36xx_dxe_free_ctl_blks(wcn); in wcn36xx_start()
337 wcn36xx_dxe_free_mem_pools(wcn); in wcn36xx_start()
339 wcn36xx_smd_close(wcn); in wcn36xx_start()
346 struct wcn36xx *wcn = hw->priv; in wcn36xx_stop() local
350 mutex_lock(&wcn->scan_lock); in wcn36xx_stop()
351 if (wcn->scan_req) { in wcn36xx_stop()
356 ieee80211_scan_completed(wcn->hw, &scan_info); in wcn36xx_stop()
358 wcn->scan_req = NULL; in wcn36xx_stop()
359 mutex_unlock(&wcn->scan_lock); in wcn36xx_stop()
361 wcn36xx_debugfs_exit(wcn); in wcn36xx_stop()
362 wcn36xx_smd_stop(wcn); in wcn36xx_stop()
363 wcn36xx_dxe_deinit(wcn); in wcn36xx_stop()
364 wcn36xx_smd_close(wcn); in wcn36xx_stop()
366 wcn36xx_dxe_free_mem_pools(wcn); in wcn36xx_stop()
367 wcn36xx_dxe_free_ctl_blks(wcn); in wcn36xx_stop()
370 static void wcn36xx_change_ps(struct wcn36xx *wcn, bool enable) in wcn36xx_change_ps() argument
375 list_for_each_entry(tmp, &wcn->vif_list, list) { in wcn36xx_change_ps()
377 if (enable && !wcn->sw_scan) { in wcn36xx_change_ps()
379 wcn36xx_pmc_enter_bmps_state(wcn, vif); in wcn36xx_change_ps()
381 wcn36xx_pmc_exit_bmps_state(wcn, vif); in wcn36xx_change_ps()
386 static void wcn36xx_change_opchannel(struct wcn36xx *wcn, int ch) in wcn36xx_change_opchannel() argument
391 list_for_each_entry(tmp, &wcn->vif_list, list) { in wcn36xx_change_opchannel()
393 wcn36xx_smd_switch_channel(wcn, vif, ch); in wcn36xx_change_opchannel()
399 struct wcn36xx *wcn = hw->priv; in wcn36xx_config() local
404 mutex_lock(&wcn->conf_mutex); in wcn36xx_config()
407 int ch = WCN36XX_HW_CHANNEL(wcn); in wcn36xx_config()
411 if (wcn->sw_scan_opchannel == ch && wcn->sw_scan_channel) { in wcn36xx_config()
416 if (wcn->sw_scan_channel) in wcn36xx_config()
417 wcn36xx_smd_end_scan(wcn, wcn->sw_scan_channel); in wcn36xx_config()
418 if (wcn->sw_scan_init) { in wcn36xx_config()
419 wcn36xx_smd_finish_scan(wcn, HAL_SYS_MODE_SCAN, in wcn36xx_config()
420 wcn->sw_scan_vif); in wcn36xx_config()
422 } else if (wcn->sw_scan) { in wcn36xx_config()
426 if (wcn->sw_scan_channel) in wcn36xx_config()
427 wcn36xx_smd_end_scan(wcn, wcn->sw_scan_channel); in wcn36xx_config()
428 if (!wcn->sw_scan_init) { in wcn36xx_config()
432 ret = wcn36xx_smd_init_scan(wcn, in wcn36xx_config()
434 wcn->sw_scan_vif); in wcn36xx_config()
436 mutex_unlock(&wcn->conf_mutex); in wcn36xx_config()
440 wcn36xx_smd_start_scan(wcn, ch); in wcn36xx_config()
442 wcn36xx_change_opchannel(wcn, ch); in wcn36xx_config()
447 wcn36xx_change_ps(wcn, hw->conf.flags & IEEE80211_CONF_PS); in wcn36xx_config()
449 mutex_unlock(&wcn->conf_mutex); in wcn36xx_config()
459 struct wcn36xx *wcn = hw->priv; in wcn36xx_configure_filter() local
465 mutex_lock(&wcn->conf_mutex); in wcn36xx_configure_filter()
470 list_for_each_entry(tmp, &wcn->vif_list, list) { in wcn36xx_configure_filter()
475 wcn36xx_smd_set_mc_list(wcn, vif, NULL); in wcn36xx_configure_filter()
477 wcn36xx_smd_set_mc_list(wcn, vif, fp); in wcn36xx_configure_filter()
480 mutex_unlock(&wcn->conf_mutex); in wcn36xx_configure_filter()
515 struct wcn36xx *wcn = hw->priv; in wcn36xx_tx() local
521 if (wcn36xx_start_tx(wcn, sta_priv, skb)) in wcn36xx_tx()
522 ieee80211_free_txskb(wcn->hw, skb); in wcn36xx_tx()
530 struct wcn36xx *wcn = hw->priv; in wcn36xx_set_key() local
544 mutex_lock(&wcn->conf_mutex); in wcn36xx_set_key()
587 wcn36xx_smd_config_bss(wcn, in wcn36xx_set_key()
592 wcn36xx_smd_config_sta(wcn, vif, sta); in wcn36xx_set_key()
595 wcn36xx_smd_set_stakey(wcn, in wcn36xx_set_key()
602 wcn36xx_smd_set_bsskey(wcn, in wcn36xx_set_key()
614 wcn36xx_smd_set_stakey(wcn, in wcn36xx_set_key()
627 wcn36xx_smd_remove_bsskey(wcn, in wcn36xx_set_key()
637 wcn36xx_smd_remove_stakey(wcn, in wcn36xx_set_key()
650 mutex_unlock(&wcn->conf_mutex); in wcn36xx_set_key()
659 struct wcn36xx *wcn = hw->priv; in wcn36xx_hw_scan() local
662 if (!get_feat_caps(wcn->fw_feat_caps, SCAN_OFFLOAD)) { in wcn36xx_hw_scan()
675 mutex_lock(&wcn->scan_lock); in wcn36xx_hw_scan()
676 if (wcn->scan_req) { in wcn36xx_hw_scan()
677 mutex_unlock(&wcn->scan_lock); in wcn36xx_hw_scan()
681 wcn->scan_aborted = false; in wcn36xx_hw_scan()
682 wcn->scan_req = &hw_req->req; in wcn36xx_hw_scan()
684 mutex_unlock(&wcn->scan_lock); in wcn36xx_hw_scan()
686 return wcn36xx_smd_start_hw_scan(wcn, vif, &hw_req->req); in wcn36xx_hw_scan()
692 struct wcn36xx *wcn = hw->priv; in wcn36xx_cancel_hw_scan() local
694 mutex_lock(&wcn->scan_lock); in wcn36xx_cancel_hw_scan()
695 wcn->scan_aborted = true; in wcn36xx_cancel_hw_scan()
696 mutex_unlock(&wcn->scan_lock); in wcn36xx_cancel_hw_scan()
698 if (get_feat_caps(wcn->fw_feat_caps, SCAN_OFFLOAD)) { in wcn36xx_cancel_hw_scan()
701 wcn36xx_smd_stop_hw_scan(wcn); in wcn36xx_cancel_hw_scan()
709 struct wcn36xx *wcn = hw->priv; in wcn36xx_sw_scan_start() local
712 wcn->sw_scan = true; in wcn36xx_sw_scan_start()
713 wcn->sw_scan_vif = vif; in wcn36xx_sw_scan_start()
714 wcn->sw_scan_channel = 0; in wcn36xx_sw_scan_start()
716 wcn->sw_scan_opchannel = WCN36XX_HW_CHANNEL(wcn); in wcn36xx_sw_scan_start()
718 wcn->sw_scan_opchannel = 0; in wcn36xx_sw_scan_start()
724 struct wcn36xx *wcn = hw->priv; in wcn36xx_sw_scan_complete() local
727 if (wcn->sw_scan_channel) in wcn36xx_sw_scan_complete()
728 wcn36xx_smd_end_scan(wcn, wcn->sw_scan_channel); in wcn36xx_sw_scan_complete()
729 if (wcn->sw_scan_init) { in wcn36xx_sw_scan_complete()
730 wcn36xx_smd_finish_scan(wcn, HAL_SYS_MODE_SCAN, in wcn36xx_sw_scan_complete()
731 wcn->sw_scan_vif); in wcn36xx_sw_scan_complete()
733 wcn->sw_scan = false; in wcn36xx_sw_scan_complete()
734 wcn->sw_scan_opchannel = 0; in wcn36xx_sw_scan_complete()
825 struct wcn36xx *wcn = hw->priv; in wcn36xx_bss_info_changed() local
834 mutex_lock(&wcn->conf_mutex); in wcn36xx_bss_info_changed()
851 wcn36xx_smd_set_link_st(wcn, bss_conf->bssid, vif->addr, in wcn36xx_bss_info_changed()
853 wcn36xx_smd_join(wcn, bss_conf->bssid, in wcn36xx_bss_info_changed()
854 vif->addr, WCN36XX_HW_CHANNEL(wcn)); in wcn36xx_bss_info_changed()
855 wcn36xx_smd_config_bss(wcn, vif, NULL, in wcn36xx_bss_info_changed()
859 wcn36xx_smd_delete_bss(wcn, vif); in wcn36xx_bss_info_changed()
860 wcn36xx_smd_set_link_st(wcn, bss_conf->bssid, vif->addr, in wcn36xx_bss_info_changed()
906 wcn36xx_update_allowed_rates(sta, WCN36XX_BAND(wcn)); in wcn36xx_bss_info_changed()
908 wcn36xx_smd_set_link_st(wcn, bss_conf->bssid, in wcn36xx_bss_info_changed()
911 wcn36xx_smd_config_bss(wcn, vif, sta, in wcn36xx_bss_info_changed()
919 wcn36xx_smd_config_sta(wcn, vif, sta); in wcn36xx_bss_info_changed()
927 wcn36xx_smd_set_link_st(wcn, in wcn36xx_bss_info_changed()
942 wcn36xx_smd_update_proberesp_tmpl(wcn, vif, skb); in wcn36xx_bss_info_changed()
955 wcn36xx_smd_config_bss(wcn, vif, NULL, in wcn36xx_bss_info_changed()
963 wcn36xx_smd_send_beacon(wcn, vif, skb, tim_off, 0); in wcn36xx_bss_info_changed()
972 wcn36xx_smd_set_link_st(wcn, vif->addr, vif->addr, in wcn36xx_bss_info_changed()
975 wcn36xx_smd_delete_bss(wcn, vif); in wcn36xx_bss_info_changed()
976 wcn36xx_smd_set_link_st(wcn, vif->addr, vif->addr, in wcn36xx_bss_info_changed()
982 mutex_unlock(&wcn->conf_mutex); in wcn36xx_bss_info_changed()
988 struct wcn36xx *wcn = hw->priv; in wcn36xx_set_rts_threshold() local
991 mutex_lock(&wcn->conf_mutex); in wcn36xx_set_rts_threshold()
992 wcn36xx_smd_update_cfg(wcn, WCN36XX_HAL_CFG_RTS_THRESHOLD, value); in wcn36xx_set_rts_threshold()
993 mutex_unlock(&wcn->conf_mutex); in wcn36xx_set_rts_threshold()
1001 struct wcn36xx *wcn = hw->priv; in wcn36xx_remove_interface() local
1005 mutex_lock(&wcn->conf_mutex); in wcn36xx_remove_interface()
1008 wcn36xx_smd_delete_sta_self(wcn, vif->addr); in wcn36xx_remove_interface()
1010 mutex_unlock(&wcn->conf_mutex); in wcn36xx_remove_interface()
1016 struct wcn36xx *wcn = hw->priv; in wcn36xx_add_interface() local
1031 mutex_lock(&wcn->conf_mutex); in wcn36xx_add_interface()
1035 list_add(&vif_priv->list, &wcn->vif_list); in wcn36xx_add_interface()
1036 wcn36xx_smd_add_sta_self(wcn, vif); in wcn36xx_add_interface()
1038 mutex_unlock(&wcn->conf_mutex); in wcn36xx_add_interface()
1046 struct wcn36xx *wcn = hw->priv; in wcn36xx_sta_add() local
1052 mutex_lock(&wcn->conf_mutex); in wcn36xx_sta_add()
1063 wcn36xx_update_allowed_rates(sta, WCN36XX_BAND(wcn)); in wcn36xx_sta_add()
1065 wcn36xx_smd_config_sta(wcn, vif, sta); in wcn36xx_sta_add()
1068 mutex_unlock(&wcn->conf_mutex); in wcn36xx_sta_add()
1077 struct wcn36xx *wcn = hw->priv; in wcn36xx_sta_remove() local
1083 mutex_lock(&wcn->conf_mutex); in wcn36xx_sta_remove()
1086 wcn36xx_smd_delete_sta(wcn, sta_priv->sta_index); in wcn36xx_sta_remove()
1089 mutex_unlock(&wcn->conf_mutex); in wcn36xx_sta_remove()
1098 struct wcn36xx *wcn = hw->priv; in wcn36xx_suspend() local
1102 flush_workqueue(wcn->hal_ind_wq); in wcn36xx_suspend()
1103 wcn36xx_smd_set_power_params(wcn, true); in wcn36xx_suspend()
1109 struct wcn36xx *wcn = hw->priv; in wcn36xx_resume() local
1113 flush_workqueue(wcn->hal_ind_wq); in wcn36xx_resume()
1114 wcn36xx_smd_set_power_params(wcn, false); in wcn36xx_resume()
1124 struct wcn36xx *wcn = hw->priv; in wcn36xx_ampdu_action() local
1136 mutex_lock(&wcn->conf_mutex); in wcn36xx_ampdu_action()
1141 session = wcn36xx_smd_add_ba_session(wcn, sta, tid, ssn, 0, in wcn36xx_ampdu_action()
1143 wcn36xx_smd_add_ba(wcn, session); in wcn36xx_ampdu_action()
1144 wcn36xx_smd_trigger_ba(wcn, get_sta_index(vif, sta_priv), tid, in wcn36xx_ampdu_action()
1148 wcn36xx_smd_del_ba(wcn, tid, get_sta_index(vif, sta_priv)); in wcn36xx_ampdu_action()
1162 wcn36xx_smd_add_ba_session(wcn, sta, tid, ssn, 1, in wcn36xx_ampdu_action()
1178 mutex_unlock(&wcn->conf_mutex); in wcn36xx_ampdu_action()
1239 static int wcn36xx_init_ieee80211(struct wcn36xx *wcn) in wcn36xx_init_ieee80211() argument
1248 ieee80211_hw_set(wcn->hw, TIMING_BEACON_ONLY); in wcn36xx_init_ieee80211()
1249 ieee80211_hw_set(wcn->hw, AMPDU_AGGREGATION); in wcn36xx_init_ieee80211()
1250 ieee80211_hw_set(wcn->hw, SUPPORTS_PS); in wcn36xx_init_ieee80211()
1251 ieee80211_hw_set(wcn->hw, SIGNAL_DBM); in wcn36xx_init_ieee80211()
1252 ieee80211_hw_set(wcn->hw, HAS_RATE_CONTROL); in wcn36xx_init_ieee80211()
1253 ieee80211_hw_set(wcn->hw, SINGLE_SCAN_ON_ALL_BANDS); in wcn36xx_init_ieee80211()
1254 ieee80211_hw_set(wcn->hw, REPORTS_TX_ACK_STATUS); in wcn36xx_init_ieee80211()
1256 wcn->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | in wcn36xx_init_ieee80211()
1261 wcn->hw->wiphy->bands[NL80211_BAND_2GHZ] = &wcn_band_2ghz; in wcn36xx_init_ieee80211()
1262 if (wcn->rf_id != RF_IRIS_WCN3620) in wcn36xx_init_ieee80211()
1263 wcn->hw->wiphy->bands[NL80211_BAND_5GHZ] = &wcn_band_5ghz; in wcn36xx_init_ieee80211()
1265 if (wcn->rf_id == RF_IRIS_WCN3680) in wcn36xx_init_ieee80211()
1268 wcn->hw->wiphy->max_scan_ssids = WCN36XX_MAX_SCAN_SSIDS; in wcn36xx_init_ieee80211()
1269 wcn->hw->wiphy->max_scan_ie_len = WCN36XX_MAX_SCAN_IE_LEN; in wcn36xx_init_ieee80211()
1271 wcn->hw->wiphy->cipher_suites = cipher_suites; in wcn36xx_init_ieee80211()
1272 wcn->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites); in wcn36xx_init_ieee80211()
1275 wcn->hw->wiphy->wowlan = &wowlan_support; in wcn36xx_init_ieee80211()
1278 wcn->hw->max_listen_interval = 200; in wcn36xx_init_ieee80211()
1280 wcn->hw->queues = 4; in wcn36xx_init_ieee80211()
1282 SET_IEEE80211_DEV(wcn->hw, wcn->dev); in wcn36xx_init_ieee80211()
1284 wcn->hw->sta_data_size = sizeof(struct wcn36xx_sta); in wcn36xx_init_ieee80211()
1285 wcn->hw->vif_data_size = sizeof(struct wcn36xx_vif); in wcn36xx_init_ieee80211()
1287 wiphy_ext_feature_set(wcn->hw->wiphy, in wcn36xx_init_ieee80211()
1293 static int wcn36xx_platform_get_resources(struct wcn36xx *wcn, in wcn36xx_platform_get_resources() argument
1308 wcn->tx_irq = res->start; in wcn36xx_platform_get_resources()
1316 wcn->rx_irq = res->start; in wcn36xx_platform_get_resources()
1319 wcn->tx_enable_state = qcom_smem_state_get(&pdev->dev, in wcn36xx_platform_get_resources()
1320 "tx-enable", &wcn->tx_enable_state_bit); in wcn36xx_platform_get_resources()
1321 if (IS_ERR(wcn->tx_enable_state)) { in wcn36xx_platform_get_resources()
1323 return PTR_ERR(wcn->tx_enable_state); in wcn36xx_platform_get_resources()
1327 wcn->tx_rings_empty_state = qcom_smem_state_get(&pdev->dev, in wcn36xx_platform_get_resources()
1328 "tx-rings-empty", &wcn->tx_rings_empty_state_bit); in wcn36xx_platform_get_resources()
1329 if (IS_ERR(wcn->tx_rings_empty_state)) { in wcn36xx_platform_get_resources()
1331 return PTR_ERR(wcn->tx_rings_empty_state); in wcn36xx_platform_get_resources()
1340 wcn->is_pronto = !!of_device_is_compatible(mmio_node, "qcom,pronto"); in wcn36xx_platform_get_resources()
1344 wcn->ccu_base = of_iomap(mmio_node, index); in wcn36xx_platform_get_resources()
1345 if (!wcn->ccu_base) { in wcn36xx_platform_get_resources()
1353 wcn->dxe_base = of_iomap(mmio_node, index); in wcn36xx_platform_get_resources()
1354 if (!wcn->dxe_base) { in wcn36xx_platform_get_resources()
1364 wcn->rf_id = RF_IRIS_WCN3620; in wcn36xx_platform_get_resources()
1367 wcn->rf_id = RF_IRIS_WCN3660; in wcn36xx_platform_get_resources()
1369 wcn->rf_id = RF_IRIS_WCN3680; in wcn36xx_platform_get_resources()
1377 iounmap(wcn->ccu_base); in wcn36xx_platform_get_resources()
1386 struct wcn36xx *wcn; in wcn36xx_probe() local
1402 wcn = hw->priv; in wcn36xx_probe()
1403 wcn->hw = hw; in wcn36xx_probe()
1404 wcn->dev = &pdev->dev; in wcn36xx_probe()
1405 wcn->first_boot = true; in wcn36xx_probe()
1406 mutex_init(&wcn->conf_mutex); in wcn36xx_probe()
1407 mutex_init(&wcn->hal_mutex); in wcn36xx_probe()
1408 mutex_init(&wcn->scan_lock); in wcn36xx_probe()
1410 wcn->hal_buf = devm_kmalloc(wcn->dev, WCN36XX_HAL_BUF_SIZE, GFP_KERNEL); in wcn36xx_probe()
1411 if (!wcn->hal_buf) { in wcn36xx_probe()
1416 ret = dma_set_mask_and_coherent(wcn->dev, DMA_BIT_MASK(32)); in wcn36xx_probe()
1422 wcn->smd_channel = qcom_wcnss_open_channel(wcnss, "WLAN_CTRL", wcn36xx_smd_rsp_process, hw); in wcn36xx_probe()
1423 if (IS_ERR(wcn->smd_channel)) { in wcn36xx_probe()
1425 ret = PTR_ERR(wcn->smd_channel); in wcn36xx_probe()
1436 SET_IEEE80211_PERM_ADDR(wcn->hw, addr); in wcn36xx_probe()
1439 ret = wcn36xx_platform_get_resources(wcn, pdev); in wcn36xx_probe()
1443 wcn36xx_init_ieee80211(wcn); in wcn36xx_probe()
1444 ret = ieee80211_register_hw(wcn->hw); in wcn36xx_probe()
1451 iounmap(wcn->ccu_base); in wcn36xx_probe()
1452 iounmap(wcn->dxe_base); in wcn36xx_probe()
1454 rpmsg_destroy_ept(wcn->smd_channel); in wcn36xx_probe()
1464 struct wcn36xx *wcn = hw->priv; in wcn36xx_remove() local
1467 release_firmware(wcn->nv); in wcn36xx_remove()
1471 qcom_smem_state_put(wcn->tx_enable_state); in wcn36xx_remove()
1472 qcom_smem_state_put(wcn->tx_rings_empty_state); in wcn36xx_remove()
1474 rpmsg_destroy_ept(wcn->smd_channel); in wcn36xx_remove()
1476 iounmap(wcn->dxe_base); in wcn36xx_remove()
1477 iounmap(wcn->ccu_base); in wcn36xx_remove()
1479 mutex_destroy(&wcn->hal_mutex); in wcn36xx_remove()