Lines Matching refs:wcn
50 /* The wcn firmware expects channel values to matching
195 static void wcn36xx_feat_caps_info(struct wcn36xx *wcn)
200 if (wcn36xx_firmware_get_feat_caps(wcn->fw_feat_caps, i)) {
209 struct wcn36xx *wcn = hw->priv;
215 ret = wcn36xx_smd_open(wcn);
222 ret = wcn36xx_dxe_allocate_mem_pools(wcn);
228 ret = wcn36xx_dxe_alloc_ctl_blks(wcn);
234 ret = wcn36xx_smd_load_nv(wcn);
240 ret = wcn36xx_smd_start(wcn);
246 if (!wcn36xx_is_fw_version(wcn, 1, 2, 2, 24)) {
247 ret = wcn36xx_smd_feature_caps_exchange(wcn);
251 wcn36xx_feat_caps_info(wcn);
255 ret = wcn36xx_dxe_init(wcn);
261 wcn36xx_debugfs_init(wcn);
263 INIT_LIST_HEAD(&wcn->vif_list);
264 spin_lock_init(&wcn->dxe_lock);
265 spin_lock_init(&wcn->survey_lock);
270 wcn36xx_smd_stop(wcn);
272 wcn36xx_dxe_free_ctl_blks(wcn);
274 wcn36xx_dxe_free_mem_pools(wcn);
276 wcn36xx_smd_close(wcn);
283 struct wcn36xx *wcn = hw->priv;
287 mutex_lock(&wcn->scan_lock);
288 if (wcn->scan_req) {
293 ieee80211_scan_completed(wcn->hw, &scan_info);
295 wcn->scan_req = NULL;
296 mutex_unlock(&wcn->scan_lock);
298 wcn36xx_debugfs_exit(wcn);
299 wcn36xx_smd_stop(wcn);
300 wcn36xx_dxe_deinit(wcn);
301 wcn36xx_smd_close(wcn);
303 wcn36xx_dxe_free_mem_pools(wcn);
304 wcn36xx_dxe_free_ctl_blks(wcn);
307 static void wcn36xx_change_ps(struct wcn36xx *wcn, bool enable)
312 list_for_each_entry(tmp, &wcn->vif_list, list) {
314 if (enable && !wcn->sw_scan) {
316 wcn36xx_pmc_enter_bmps_state(wcn, vif);
318 wcn36xx_pmc_exit_bmps_state(wcn, vif);
323 static void wcn36xx_change_opchannel(struct wcn36xx *wcn, int ch)
332 for (i = 0; i < ARRAY_SIZE(wcn->hw->wiphy->bands); i++) {
333 band = wcn->hw->wiphy->bands[i];
351 spin_lock_irqsave(&wcn->survey_lock, flags);
352 wcn->band = band;
353 wcn->channel = channel;
354 spin_unlock_irqrestore(&wcn->survey_lock, flags);
356 list_for_each_entry(tmp, &wcn->vif_list, list) {
358 wcn36xx_smd_switch_channel(wcn, vif, ch);
366 struct wcn36xx *wcn = hw->priv;
371 mutex_lock(&wcn->conf_mutex);
374 int ch = WCN36XX_HW_CHANNEL(wcn);
378 if (wcn->sw_scan_opchannel == ch && wcn->sw_scan_channel) {
383 if (wcn->sw_scan_channel)
384 wcn36xx_smd_end_scan(wcn, wcn->sw_scan_channel);
385 if (wcn->sw_scan_init) {
386 wcn36xx_smd_finish_scan(wcn, HAL_SYS_MODE_SCAN,
387 wcn->sw_scan_vif);
389 } else if (wcn->sw_scan) {
393 if (wcn->sw_scan_channel)
394 wcn36xx_smd_end_scan(wcn, wcn->sw_scan_channel);
395 if (!wcn->sw_scan_init) {
399 ret = wcn36xx_smd_init_scan(wcn,
401 wcn->sw_scan_vif);
403 mutex_unlock(&wcn->conf_mutex);
407 wcn36xx_smd_start_scan(wcn, ch);
409 wcn36xx_change_opchannel(wcn, ch);
414 wcn36xx_change_ps(wcn, hw->conf.flags & IEEE80211_CONF_PS);
418 wcn36xx_smd_enter_imps(wcn);
420 wcn36xx_smd_exit_imps(wcn);
423 mutex_unlock(&wcn->conf_mutex);
433 struct wcn36xx *wcn = hw->priv;
439 mutex_lock(&wcn->conf_mutex);
444 list_for_each_entry(tmp, &wcn->vif_list, list) {
449 wcn36xx_smd_set_mc_list(wcn, vif, NULL);
451 wcn36xx_smd_set_mc_list(wcn, vif, fp);
454 mutex_unlock(&wcn->conf_mutex);
489 struct wcn36xx *wcn = hw->priv;
495 if (wcn36xx_start_tx(wcn, sta_priv, skb))
496 ieee80211_free_txskb(wcn->hw, skb);
504 struct wcn36xx *wcn = hw->priv;
518 mutex_lock(&wcn->conf_mutex);
561 wcn36xx_smd_config_bss(wcn,
566 wcn36xx_smd_config_sta(wcn, vif, sta);
569 wcn36xx_smd_set_stakey(wcn,
576 wcn36xx_smd_set_bsskey(wcn,
588 wcn36xx_smd_set_stakey(wcn,
601 wcn36xx_smd_remove_bsskey(wcn,
611 wcn36xx_smd_remove_stakey(wcn,
624 mutex_unlock(&wcn->conf_mutex);
633 struct wcn36xx *wcn = hw->priv;
635 if (!wcn36xx_firmware_get_feat_caps(wcn->fw_feat_caps, SCAN_OFFLOAD)) {
649 mutex_lock(&wcn->scan_lock);
650 if (wcn->scan_req) {
651 mutex_unlock(&wcn->scan_lock);
655 wcn->scan_aborted = false;
656 wcn->scan_req = &hw_req->req;
658 mutex_unlock(&wcn->scan_lock);
660 wcn36xx_smd_update_channel_list(wcn, &hw_req->req);
661 return wcn36xx_smd_start_hw_scan(wcn, vif, &hw_req->req);
667 struct wcn36xx *wcn = hw->priv;
669 mutex_lock(&wcn->scan_lock);
670 wcn->scan_aborted = true;
671 mutex_unlock(&wcn->scan_lock);
673 if (wcn36xx_firmware_get_feat_caps(wcn->fw_feat_caps, SCAN_OFFLOAD)) {
676 wcn36xx_smd_stop_hw_scan(wcn);
684 struct wcn36xx *wcn = hw->priv;
689 wcn->sw_scan = true;
690 wcn->sw_scan_vif = vif;
691 wcn->sw_scan_channel = 0;
693 wcn->sw_scan_opchannel = WCN36XX_HW_CHANNEL(wcn);
695 wcn->sw_scan_opchannel = 0;
701 struct wcn36xx *wcn = hw->priv;
706 if (wcn->sw_scan_channel)
707 wcn36xx_smd_end_scan(wcn, wcn->sw_scan_channel);
708 if (wcn->sw_scan_init) {
709 wcn36xx_smd_finish_scan(wcn, HAL_SYS_MODE_SCAN,
710 wcn->sw_scan_vif);
712 wcn->sw_scan = false;
713 wcn->sw_scan_opchannel = 0;
804 struct wcn36xx *wcn = hw->priv;
813 mutex_lock(&wcn->conf_mutex);
830 wcn36xx_smd_set_link_st(wcn, bss_conf->bssid, vif->addr,
832 wcn36xx_smd_join(wcn, bss_conf->bssid,
833 vif->addr, WCN36XX_HW_CHANNEL(wcn));
834 wcn36xx_smd_config_bss(wcn, vif, NULL,
838 wcn36xx_smd_delete_bss(wcn, vif);
839 wcn36xx_smd_set_link_st(wcn, bss_conf->bssid, vif->addr,
885 wcn36xx_update_allowed_rates(sta, WCN36XX_BAND(wcn));
887 wcn36xx_smd_set_link_st(wcn, bss_conf->bssid,
890 wcn36xx_smd_config_bss(wcn, vif, sta,
898 wcn36xx_smd_config_sta(wcn, vif, sta);
900 wcn36xx_smd_add_beacon_filter(wcn, vif);
901 wcn36xx_enable_keep_alive_null_packet(wcn, vif);
909 wcn36xx_smd_set_link_st(wcn,
924 wcn36xx_smd_update_proberesp_tmpl(wcn, vif, skb);
937 wcn36xx_smd_config_bss(wcn, vif, NULL,
945 wcn36xx_smd_send_beacon(wcn, vif, skb, tim_off, 0);
954 wcn36xx_smd_set_link_st(wcn, vif->addr, vif->addr,
957 wcn36xx_smd_delete_bss(wcn, vif);
958 wcn36xx_smd_set_link_st(wcn, vif->addr, vif->addr,
964 mutex_unlock(&wcn->conf_mutex);
970 struct wcn36xx *wcn = hw->priv;
973 mutex_lock(&wcn->conf_mutex);
974 wcn36xx_smd_update_cfg(wcn, WCN36XX_HAL_CFG_RTS_THRESHOLD, value);
975 mutex_unlock(&wcn->conf_mutex);
983 struct wcn36xx *wcn = hw->priv;
987 mutex_lock(&wcn->conf_mutex);
990 wcn36xx_smd_delete_sta_self(wcn, vif->addr);
992 mutex_unlock(&wcn->conf_mutex);
998 struct wcn36xx *wcn = hw->priv;
1013 mutex_lock(&wcn->conf_mutex);
1017 list_add(&vif_priv->list, &wcn->vif_list);
1018 wcn36xx_smd_add_sta_self(wcn, vif);
1020 mutex_unlock(&wcn->conf_mutex);
1028 struct wcn36xx *wcn = hw->priv;
1034 mutex_lock(&wcn->conf_mutex);
1045 wcn36xx_update_allowed_rates(sta, WCN36XX_BAND(wcn));
1047 wcn36xx_smd_config_sta(wcn, vif, sta);
1050 mutex_unlock(&wcn->conf_mutex);
1059 struct wcn36xx *wcn = hw->priv;
1065 mutex_lock(&wcn->conf_mutex);
1068 wcn36xx_smd_delete_sta(wcn, sta_priv->sta_index);
1071 mutex_unlock(&wcn->conf_mutex);
1078 static struct ieee80211_vif *wcn36xx_get_first_assoc_vif(struct wcn36xx *wcn)
1083 list_for_each_entry(vif_priv, &wcn->vif_list, list) {
1094 struct wcn36xx *wcn = hw->priv;
1100 mutex_lock(&wcn->conf_mutex);
1102 vif = wcn36xx_get_first_assoc_vif(wcn);
1104 ret = wcn36xx_smd_arp_offload(wcn, vif, true);
1107 ret = wcn36xx_smd_ipv6_ns_offload(wcn, vif, true);
1110 ret = wcn36xx_smd_gtk_offload(wcn, vif, true);
1113 ret = wcn36xx_smd_set_power_params(wcn, true);
1116 ret = wcn36xx_smd_wlan_host_suspend_ind(wcn);
1122 disable_irq(wcn->tx_irq);
1123 disable_irq(wcn->rx_irq);
1126 mutex_unlock(&wcn->conf_mutex);
1132 struct wcn36xx *wcn = hw->priv;
1137 mutex_lock(&wcn->conf_mutex);
1138 vif = wcn36xx_get_first_assoc_vif(wcn);
1140 wcn36xx_smd_host_resume(wcn);
1141 wcn36xx_smd_set_power_params(wcn, false);
1142 wcn36xx_smd_gtk_offload_get_info(wcn, vif);
1143 wcn36xx_smd_gtk_offload(wcn, vif, false);
1144 wcn36xx_smd_ipv6_ns_offload(wcn, vif, false);
1145 wcn36xx_smd_arp_offload(wcn, vif, false);
1148 enable_irq(wcn->tx_irq);
1149 enable_irq(wcn->rx_irq);
1151 mutex_unlock(&wcn->conf_mutex);
1160 struct wcn36xx *wcn = hw->priv;
1163 mutex_lock(&wcn->conf_mutex);
1171 mutex_unlock(&wcn->conf_mutex);
1180 struct wcn36xx *wcn = hw->priv;
1192 mutex_lock(&wcn->conf_mutex);
1197 session = wcn36xx_smd_add_ba_session(wcn, sta, tid, ssn, 0,
1203 wcn36xx_smd_add_ba(wcn, session);
1206 wcn36xx_smd_del_ba(wcn, tid, 0, get_sta_index(vif, sta_priv));
1215 wcn36xx_smd_trigger_ba(wcn, get_sta_index(vif, sta_priv), tid, ssn);
1219 session = wcn36xx_smd_add_ba_session(wcn, sta, tid, ssn, 1,
1240 wcn36xx_smd_del_ba(wcn, tid, 1, get_sta_index(vif, sta_priv));
1248 mutex_unlock(&wcn->conf_mutex);
1284 struct wcn36xx *wcn = hw->priv;
1286 if (wcn36xx_dxe_tx_flush(wcn)) {
1294 struct wcn36xx *wcn = hw->priv;
1300 sband = wcn->hw->wiphy->bands[NL80211_BAND_2GHZ];
1304 sband = wcn->hw->wiphy->bands[NL80211_BAND_5GHZ];
1310 spin_lock_irqsave(&wcn->survey_lock, flags);
1312 chan_survey = &wcn->chan_survey[idx];
1320 if (survey->channel == wcn->channel)
1323 spin_unlock_irqrestore(&wcn->survey_lock, flags);
1337 struct wcn36xx *wcn;
1341 wcn = hw->priv;
1343 status = wcn36xx_smd_get_stats(wcn, sta_index, HAL_GLOBAL_CLASS_A_STATS_INFO, sinfo);
1413 static int wcn36xx_init_ieee80211(struct wcn36xx *wcn)
1422 ieee80211_hw_set(wcn->hw, TIMING_BEACON_ONLY);
1423 ieee80211_hw_set(wcn->hw, AMPDU_AGGREGATION);
1424 ieee80211_hw_set(wcn->hw, SUPPORTS_PS);
1425 ieee80211_hw_set(wcn->hw, SIGNAL_DBM);
1426 ieee80211_hw_set(wcn->hw, HAS_RATE_CONTROL);
1427 ieee80211_hw_set(wcn->hw, SINGLE_SCAN_ON_ALL_BANDS);
1428 ieee80211_hw_set(wcn->hw, REPORTS_TX_ACK_STATUS);
1430 wcn->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
1435 wcn->hw->wiphy->bands[NL80211_BAND_2GHZ] = &wcn_band_2ghz;
1436 if (wcn->rf_id != RF_IRIS_WCN3620)
1437 wcn->hw->wiphy->bands[NL80211_BAND_5GHZ] = &wcn_band_5ghz;
1439 if (wcn->rf_id == RF_IRIS_WCN3680)
1442 wcn->hw->wiphy->max_scan_ssids = WCN36XX_MAX_SCAN_SSIDS;
1443 wcn->hw->wiphy->max_scan_ie_len = WCN36XX_MAX_SCAN_IE_LEN;
1445 wcn->hw->wiphy->cipher_suites = cipher_suites;
1446 wcn->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
1449 wcn->hw->wiphy->wowlan = &wowlan_support;
1452 wcn->hw->max_listen_interval = 200;
1454 wcn->hw->queues = 4;
1456 SET_IEEE80211_DEV(wcn->hw, wcn->dev);
1458 wcn->hw->sta_data_size = sizeof(struct wcn36xx_sta);
1459 wcn->hw->vif_data_size = sizeof(struct wcn36xx_vif);
1461 wiphy_ext_feature_set(wcn->hw->wiphy,
1467 static int wcn36xx_platform_get_resources(struct wcn36xx *wcn,
1479 wcn->tx_irq = ret;
1485 wcn->rx_irq = ret;
1488 wcn->tx_enable_state = qcom_smem_state_get(&pdev->dev,
1489 "tx-enable", &wcn->tx_enable_state_bit);
1490 if (IS_ERR(wcn->tx_enable_state)) {
1492 return PTR_ERR(wcn->tx_enable_state);
1496 wcn->tx_rings_empty_state = qcom_smem_state_get(&pdev->dev,
1497 "tx-rings-empty", &wcn->tx_rings_empty_state_bit);
1498 if (IS_ERR(wcn->tx_rings_empty_state)) {
1500 return PTR_ERR(wcn->tx_rings_empty_state);
1509 wcn->is_pronto = !!of_device_is_compatible(mmio_node, "qcom,pronto");
1510 wcn->is_pronto_v3 = !!of_device_is_compatible(mmio_node, "qcom,pronto-v3-pil");
1514 wcn->ccu_base = of_iomap(mmio_node, index);
1515 if (!wcn->ccu_base) {
1523 wcn->dxe_base = of_iomap(mmio_node, index);
1524 if (!wcn->dxe_base) {
1534 wcn->rf_id = RF_IRIS_WCN3620;
1537 wcn->rf_id = RF_IRIS_WCN3660;
1539 wcn->rf_id = RF_IRIS_WCN3680;
1547 iounmap(wcn->ccu_base);
1556 struct wcn36xx *wcn;
1573 wcn = hw->priv;
1574 wcn->hw = hw;
1575 wcn->dev = &pdev->dev;
1576 wcn->first_boot = true;
1577 mutex_init(&wcn->conf_mutex);
1578 mutex_init(&wcn->hal_mutex);
1579 mutex_init(&wcn->scan_lock);
1580 __skb_queue_head_init(&wcn->amsdu);
1582 wcn->hal_buf = devm_kmalloc(wcn->dev, WCN36XX_HAL_BUF_SIZE, GFP_KERNEL);
1583 if (!wcn->hal_buf) {
1589 wcn->chan_survey = devm_kmalloc(wcn->dev, n_channels, GFP_KERNEL);
1590 if (!wcn->chan_survey) {
1595 ret = dma_set_mask_and_coherent(wcn->dev, DMA_BIT_MASK(32));
1601 wcn->nv_file = WLAN_NV_FILE;
1602 ret = of_property_read_string(wcn->dev->parent->of_node, "firmware-name", &wcn->nv_file);
1608 wcn->smd_channel = qcom_wcnss_open_channel(wcnss, "WLAN_CTRL", wcn36xx_smd_rsp_process, hw);
1609 if (IS_ERR(wcn->smd_channel)) {
1611 ret = PTR_ERR(wcn->smd_channel);
1622 SET_IEEE80211_PERM_ADDR(wcn->hw, addr);
1625 ret = wcn36xx_platform_get_resources(wcn, pdev);
1629 wcn36xx_init_ieee80211(wcn);
1630 ret = ieee80211_register_hw(wcn->hw);
1637 iounmap(wcn->ccu_base);
1638 iounmap(wcn->dxe_base);
1640 rpmsg_destroy_ept(wcn->smd_channel);
1650 struct wcn36xx *wcn = hw->priv;
1653 release_firmware(wcn->nv);
1657 qcom_smem_state_put(wcn->tx_enable_state);
1658 qcom_smem_state_put(wcn->tx_rings_empty_state);
1660 rpmsg_destroy_ept(wcn->smd_channel);
1662 iounmap(wcn->dxe_base);
1663 iounmap(wcn->ccu_base);
1665 __skb_queue_purge(&wcn->amsdu);
1667 mutex_destroy(&wcn->hal_mutex);