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