blob: 7bbe50ae99530cff77818aca9e335acdc794b15a [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
Yue Ma34321602019-12-23 12:39:20 -08002 * Copyright (c) 2013-2020 The Linux Foundation. All rights reserved.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003 *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004 * Permission to use, copy, modify, and/or distribute this software for
5 * any purpose with or without fee is hereby granted, provided that the
6 * above copyright notice and this permission notice appear in all
7 * copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16 * PERFORMANCE OF THIS SOFTWARE.
17 */
18
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080019/**
20 * DOC: wma_main.c
21 *
22 * This file contains wma initialization and FW exchange
23 * related functions.
24 */
25
26/* Header files */
27
28#include "wma.h"
29#include "wma_api.h"
30#include "cds_api.h"
31#include "wmi_unified_api.h"
32#include "wlan_qct_sys.h"
33#include "wni_api.h"
34#include "ani_global.h"
35#include "wmi_unified.h"
36#include "wni_cfg.h"
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +053037#if defined(CONFIG_HL_SUPPORT)
38#include "wlan_tgt_def_config_hl.h"
39#else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080040#include "wlan_tgt_def_config.h"
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +053041#endif
Nirav Shahcbc6d722016-03-01 16:24:53 +053042#include "qdf_nbuf.h"
Anurag Chouhan6d760662016-02-20 16:05:43 +053043#include "qdf_types.h"
Anurag Chouhan600c3a02016-03-01 10:33:54 +053044#include "qdf_mem.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080045#include "wma_types.h"
46#include "lim_api.h"
47#include "lim_session_utils.h"
48
49#include "cds_utils.h"
50
51#if !defined(REMOVE_PKT_LOG)
52#include "pktlog_ac.h"
53#endif /* REMOVE_PKT_LOG */
54
55#include "dbglog_host.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080056#include "csr_api.h"
57#include "ol_fw.h"
58
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080059#include "wma_internal.h"
60
61#include "wma_ocb.h"
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -070062#include "wlan_policy_mgr_api.h"
Dhanashri Atreb08959a2016-03-01 17:28:03 -080063#include "cdp_txrx_cfg.h"
64#include "cdp_txrx_flow_ctrl_legacy.h"
65#include "cdp_txrx_flow_ctrl_v2.h"
66#include "cdp_txrx_ipa.h"
Leo Chang96464902016-10-28 11:10:54 -070067#include "cdp_txrx_misc.h"
Jeff Johnson6136fb92017-03-30 15:21:49 -070068#include "wma_fips_api.h"
Deepak Dhamdhere13230d32016-05-26 00:46:53 -070069#include "wma_nan_datapath.h"
Qun Zhangef655622019-02-25 10:48:10 +080070#include "wma_fw_state.h"
Frank Liu65b17d92016-11-23 15:58:44 +080071#include "wlan_lmac_if_def.h"
72#include "wlan_lmac_if_api.h"
Mukul Sharmac3e7a782017-02-03 12:16:11 +053073#include "target_if.h"
Harprit Chhabada31e3e162019-01-16 16:48:14 -080074#include "target_if_scan.h"
Mukul Sharmadad267e2017-02-04 13:25:34 +053075#include "wlan_global_lmac_if_api.h"
Mukul Sharma3d36c392017-01-18 18:39:12 +053076#include "target_if_pmo.h"
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -070077#include "wma_he.h"
Mukul Sharma6411bb82017-03-01 15:57:07 +053078#include "wlan_pmo_obj_mgmt_api.h"
Frank Liu65b17d92016-11-23 15:58:44 +080079
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070080#include "wlan_reg_tgt_api.h"
81#include "wlan_reg_services_api.h"
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -080082#include <cdp_txrx_handle.h>
Tushnim Bhattacharyya45ed04f2017-03-15 10:15:05 -070083#include <wlan_pmo_ucfg_api.h>
Naveen Rawat4efe41b2017-04-29 16:23:14 -070084#include "wifi_pos_api.h"
85#include "hif_main.h"
Sandeep Puligilla063a4342018-01-10 02:50:14 -080086#include <target_if_spectral.h>
87#include <wlan_spectral_utils_api.h>
Arunk Khandavallia6305a32018-01-25 11:19:18 +053088#include "init_event_handler.h"
Sourav Mohapatracf632572018-04-02 11:01:35 +053089#include "init_deinit_lmac.h"
Himanshu Agarwalceb9faa2018-01-24 22:30:05 +053090#include "target_if_green_ap.h"
Arunk Khandavalli10af7282018-02-05 16:55:48 +053091#include "service_ready_param.h"
Naveen Rawat3ff5cff2018-01-29 14:31:16 -080092#include "wlan_cp_stats_mc_ucfg_api.h"
Manikandan Mohandcd0fdf2018-08-02 18:13:37 -070093#include "cfg_nan_api.h"
Pragaspathi Thilagaraj00bd8bc2018-08-18 01:23:01 +053094#include "wlan_mlme_api.h"
Wu Gao51a63562018-11-08 16:29:10 +080095#include "wlan_mlme_ucfg_api.h"
Alok Kumar02301292018-11-28 18:10:34 +053096#include "cfg_ucfg_api.h"
hangtian351b7c92019-01-17 16:52:45 +080097#include "init_cmd_api.h"
Nachiket Kukade15bd4f72019-02-19 17:30:50 +053098#include "nan_ucfg_api.h"
Arun Kumar Khandavallideda5a82019-03-11 15:32:19 +053099#include "wma_coex.h"
Abhishek Amburecbef1442019-06-10 17:15:00 +0530100#include "target_if_vdev_mgr_rx_ops.h"
gaurank kathpaliae3140292019-11-12 16:44:31 +0530101#include "wlan_policy_mgr_i.h"
Arun Kumar Khandavalli7b6bee72019-11-14 14:19:20 +0530102#include "target_if_psoc_timer_tx_ops.h"
Abhishek Amburecbef1442019-06-10 17:15:00 +0530103
Wu Gao492f1ad2019-06-03 21:25:50 +0800104#ifdef DIRECT_BUF_RX_ENABLE
105#include <target_if_direct_buf_rx_api.h>
106#endif
Tushnim Bhattacharyya45ed04f2017-03-15 10:15:05 -0700107
Agrawal Ashishb0aa0752017-04-21 19:31:10 +0530108#define WMA_LOG_COMPLETION_TIMER 3000 /* 3 seconds */
Rajeev Kumar Sirasanagandla47873002016-09-09 13:46:09 +0530109#define WMI_TLV_HEADROOM 128
gaurank kathpalia85f8a612018-02-21 18:55:24 +0530110
111#define WMA_FW_TIME_SYNC_TIMER 60000 /* 1 min */
112
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800113static uint32_t g_fw_wlan_feat_caps;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800114/**
115 * wma_get_fw_wlan_feat_caps() - get fw feature capablity
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -0700116 * @feature: feature enum value
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800117 *
118 * Return: true/false
119 */
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -0700120bool wma_get_fw_wlan_feat_caps(enum cap_bitmap feature)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800121{
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -0700122 return (g_fw_wlan_feat_caps & (1 << feature)) ? true : false;
123}
124
125/**
126 * wma_set_fw_wlan_feat_caps() - set fw feature capablity
127 * @feature: feature enum value
128 *
129 * Return: None
130 */
131void wma_set_fw_wlan_feat_caps(enum cap_bitmap feature)
132{
133 g_fw_wlan_feat_caps |= (1 << feature);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800134}
135
136/**
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +0530137 * wma_service_ready_ext_evt_timeout() - Service ready extended event timeout
138 * @data: Timeout handler data
139 *
140 * This function is called when the FW fails to send WMI_SERVICE_READY_EXT_EVENT
141 * message
142 *
143 * Return: None
144 */
145static void wma_service_ready_ext_evt_timeout(void *data)
146{
147 tp_wma_handle wma_handle;
148
149 WMA_LOGA("%s: Timeout waiting for WMI_SERVICE_READY_EXT_EVENT",
150 __func__);
151
152 wma_handle = (tp_wma_handle) data;
153
154 if (!wma_handle) {
155 WMA_LOGE("%s: Invalid WMA handle", __func__);
156 goto end;
157 }
158
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +0530159end:
Naveen Rawatac39a102016-10-07 10:58:29 -0700160 /* Assert here. Panic is being called in insmod thread */
161 QDF_ASSERT(0);
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +0530162}
163
164/**
Komal Seelam02d09342016-02-23 18:03:19 +0530165 * wma_get_ini_handle() - API to get WMA ini info handle
166 * @wma: WMA Handle
167 *
168 * Returns the pointer to WMA ini structure.
169 * Return: struct wma_ini_config
170 */
171struct wma_ini_config *wma_get_ini_handle(tp_wma_handle wma)
172{
173 if (!wma) {
174 WMA_LOGE("%s: Invalid WMA context\n", __func__);
175 return NULL;
176 }
177
178 return &wma->ini_config;
179}
180
181#define MAX_SUPPORTED_PEERS_REV1_1 14
182#define MAX_SUPPORTED_PEERS_REV1_3 32
183#define MIN_NO_OF_PEERS 1
184
185/**
186 * wma_get_number_of_peers_supported - API to query for number of peers
187 * supported
188 * @wma: WMA Handle
189 *
190 * Return: Max Number of Peers Supported
191 */
192static uint8_t wma_get_number_of_peers_supported(tp_wma_handle wma)
193{
Komal Seelam02d09342016-02-23 18:03:19 +0530194 struct wma_ini_config *cfg = wma_get_ini_handle(wma);
195 uint8_t max_no_of_peers = cfg ? cfg->max_no_of_peers : MIN_NO_OF_PEERS;
Komal Seelam02d09342016-02-23 18:03:19 +0530196
197 return max_no_of_peers;
198}
199
200/**
bings6b3614e2017-02-21 10:18:36 +0800201 * wma_get_number_of_tids_supported - API to query for number of tids supported
202 * @no_of_peers_supported: Number of peer supported
203 *
204 * Return: Max number of tids supported
205 */
206#if defined(CONFIG_HL_SUPPORT)
Rachit Kankane0106e382018-05-16 18:59:28 +0530207static uint32_t wma_get_number_of_tids_supported(uint8_t no_of_peers_supported,
208 uint8_t num_vdevs)
bings6b3614e2017-02-21 10:18:36 +0800209{
210 return 4 * no_of_peers_supported;
211}
212#else
Rachit Kankane0106e382018-05-16 18:59:28 +0530213static uint32_t wma_get_number_of_tids_supported(uint8_t no_of_peers_supported,
214 uint8_t num_vdevs)
bings6b3614e2017-02-21 10:18:36 +0800215{
Abhishek Ambure921dd732019-12-06 20:30:27 +0530216 return 2 * (no_of_peers_supported + num_vdevs + 2);
bings6b3614e2017-02-21 10:18:36 +0800217}
218#endif
219
Chaoli Zhou31bb8252019-12-30 18:44:59 +0800220#if (defined(IPA_DISABLE_OVERRIDE)) && (!defined(IPA_OFFLOAD))
221static void wma_set_ipa_disable_config(
222 target_resource_config *tgt_cfg)
223{
224 tgt_cfg->ipa_disable = true;
225}
226#else
227static void wma_set_ipa_disable_config(
228 target_resource_config *tgt_cfg)
229{
230 tgt_cfg->ipa_disable = false;
231}
232#endif
233
Rachit Kankane0106e382018-05-16 18:59:28 +0530234#ifndef NUM_OF_ADDITIONAL_FW_PEERS
235#define NUM_OF_ADDITIONAL_FW_PEERS 2
236#endif
Srinivas Dasari79a1e172020-04-06 17:34:03 +0530237
238/**
239 * wma_update_num_peers_tids() - Update num_peers and tids based on num_vdevs
240 * @wma_handle: wma handle
241 * @tgt_cfg: Resource config given to target
242 *
243 * Get num_vdevs from tgt_cfg and update num_peers and tids based on it.
244 *
245 * Return: none
246 */
247static void wma_update_num_peers_tids(t_wma_handle *wma_handle,
248 target_resource_config *tgt_cfg)
249
250{
251 uint8_t no_of_peers_supported;
252
253 no_of_peers_supported = wma_get_number_of_peers_supported(wma_handle);
254
255 tgt_cfg->num_peers = no_of_peers_supported + tgt_cfg->num_vdevs +
256 NUM_OF_ADDITIONAL_FW_PEERS;
257 /* The current firmware implementation requires the number of
258 * offload peers should be (number of vdevs + 1).
259 */
260 tgt_cfg->num_tids =
261 wma_get_number_of_tids_supported(no_of_peers_supported,
262 tgt_cfg->num_vdevs);
263}
264
bings6b3614e2017-02-21 10:18:36 +0800265/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800266 * wma_set_default_tgt_config() - set default tgt config
267 * @wma_handle: wma handle
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530268 * @tgt_cfg: Resource config given to target
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800269 *
270 * Return: none
271 */
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530272static void wma_set_default_tgt_config(tp_wma_handle wma_handle,
Rachit Kankane0106e382018-05-16 18:59:28 +0530273 target_resource_config *tgt_cfg,
274 struct cds_config_info *cds_cfg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800275{
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530276 qdf_mem_zero(tgt_cfg, sizeof(target_resource_config));
Srinivas Dasari79a1e172020-04-06 17:34:03 +0530277
Rachit Kankane0106e382018-05-16 18:59:28 +0530278 tgt_cfg->num_vdevs = cds_cfg->num_vdevs;
Srinivas Dasari79a1e172020-04-06 17:34:03 +0530279 wma_update_num_peers_tids(wma_handle, tgt_cfg);
280
Rachit Kankane0106e382018-05-16 18:59:28 +0530281 /* The current firmware implementation requires the number of
282 * offload peers should be (number of vdevs + 1).
283 */
284 tgt_cfg->num_offload_peers = cds_cfg->ap_maxoffload_peers + 1;
285 tgt_cfg->num_offload_reorder_buffs =
286 cds_cfg->ap_maxoffload_reorderbuffs + 1;
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530287 tgt_cfg->num_peer_keys = CFG_TGT_NUM_PEER_KEYS;
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530288 tgt_cfg->ast_skid_limit = CFG_TGT_AST_SKID_LIMIT;
289 tgt_cfg->tx_chain_mask = CFG_TGT_DEFAULT_TX_CHAIN_MASK;
290 tgt_cfg->rx_chain_mask = CFG_TGT_DEFAULT_RX_CHAIN_MASK;
291 tgt_cfg->rx_timeout_pri[0] = CFG_TGT_RX_TIMEOUT_LO_PRI;
292 tgt_cfg->rx_timeout_pri[1] = CFG_TGT_RX_TIMEOUT_LO_PRI;
293 tgt_cfg->rx_timeout_pri[2] = CFG_TGT_RX_TIMEOUT_LO_PRI;
294 tgt_cfg->rx_timeout_pri[3] = CFG_TGT_RX_TIMEOUT_HI_PRI;
295 tgt_cfg->rx_decap_mode = CFG_TGT_RX_DECAP_MODE;
Harprit Chhabada31e3e162019-01-16 16:48:14 -0800296 tgt_cfg->scan_max_pending_req = WLAN_MAX_ACTIVE_SCANS_ALLOWED;
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530297 tgt_cfg->bmiss_offload_max_vdev =
298 CFG_TGT_DEFAULT_BMISS_OFFLOAD_MAX_VDEV;
299 tgt_cfg->roam_offload_max_vdev = CFG_TGT_DEFAULT_ROAM_OFFLOAD_MAX_VDEV;
300 tgt_cfg->roam_offload_max_ap_profiles =
Mukul Sharmab10c8c72017-11-02 17:25:59 +0530301 CFG_TGT_DEFAULT_ROAM_OFFLOAD_MAX_PROFILES;
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530302 tgt_cfg->num_mcast_groups = CFG_TGT_DEFAULT_NUM_MCAST_GROUPS;
303 tgt_cfg->num_mcast_table_elems = CFG_TGT_DEFAULT_NUM_MCAST_TABLE_ELEMS;
304 tgt_cfg->mcast2ucast_mode = CFG_TGT_DEFAULT_MCAST2UCAST_MODE;
305 tgt_cfg->tx_dbg_log_size = CFG_TGT_DEFAULT_TX_DBG_LOG_SIZE;
306 tgt_cfg->num_wds_entries = CFG_TGT_WDS_ENTRIES;
307 tgt_cfg->dma_burst_size = CFG_TGT_DEFAULT_DMA_BURST_SIZE;
308 tgt_cfg->mac_aggr_delim = CFG_TGT_DEFAULT_MAC_AGGR_DELIM;
309 tgt_cfg->rx_skip_defrag_timeout_dup_detection_check =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800310 CFG_TGT_DEFAULT_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK,
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530311 tgt_cfg->vow_config = CFG_TGT_DEFAULT_VOW_CONFIG;
312 tgt_cfg->gtk_offload_max_vdev = CFG_TGT_DEFAULT_GTK_OFFLOAD_MAX_VDEV;
313 tgt_cfg->num_msdu_desc = CFG_TGT_NUM_MSDU_DESC;
314 tgt_cfg->max_frag_entries = CFG_TGT_MAX_FRAG_TABLE_ENTRIES;
315 tgt_cfg->num_tdls_vdevs = CFG_TGT_NUM_TDLS_VDEVS;
316 tgt_cfg->num_tdls_conn_table_entries =
Mukul Sharmab10c8c72017-11-02 17:25:59 +0530317 CFG_TGT_NUM_TDLS_CONN_TABLE_ENTRIES;
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530318 tgt_cfg->beacon_tx_offload_max_vdev =
Mukul Sharmab10c8c72017-11-02 17:25:59 +0530319 CFG_TGT_DEFAULT_BEACON_TX_OFFLOAD_MAX_VDEV;
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530320 tgt_cfg->num_multicast_filter_entries =
Mukul Sharmab10c8c72017-11-02 17:25:59 +0530321 CFG_TGT_MAX_MULTICAST_FILTER_ENTRIES;
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530322 tgt_cfg->num_wow_filters = 0;
Rachit Kankane0106e382018-05-16 18:59:28 +0530323 tgt_cfg->num_keep_alive_pattern = WMA_MAXNUM_PERIODIC_TX_PTRNS;
jsreekumac44b922018-06-12 20:18:39 +0530324 tgt_cfg->num_max_sta_vdevs = CFG_TGT_DEFAULT_MAX_STA_VDEVS;
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530325 tgt_cfg->keep_alive_pattern_size = 0;
326 tgt_cfg->max_tdls_concurrent_sleep_sta =
Mukul Sharmab10c8c72017-11-02 17:25:59 +0530327 CFG_TGT_NUM_TDLS_CONC_SLEEP_STAS;
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530328 tgt_cfg->max_tdls_concurrent_buffer_sta =
Mukul Sharmab10c8c72017-11-02 17:25:59 +0530329 CFG_TGT_NUM_TDLS_CONC_BUFFER_STAS;
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530330 tgt_cfg->wmi_send_separate = 0;
331 tgt_cfg->num_ocb_vdevs = CFG_TGT_NUM_OCB_VDEVS;
332 tgt_cfg->num_ocb_channels = CFG_TGT_NUM_OCB_CHANNELS;
333 tgt_cfg->num_ocb_schedules = CFG_TGT_NUM_OCB_SCHEDULES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800334
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800335
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530336 tgt_cfg->mgmt_comp_evt_bundle_support = true;
337 tgt_cfg->tx_msdu_new_partition_id_support = true;
Nirav Shah20489972016-06-16 19:20:28 +0530338
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530339 if (cds_get_conparam() == QDF_GLOBAL_MONITOR_MODE)
340 tgt_cfg->rx_decap_mode = CFG_TGT_RX_DECAP_MODE_RAW;
Chaoli Zhou31bb8252019-12-30 18:44:59 +0800341
342 wma_set_ipa_disable_config(tgt_cfg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800343}
344
345/**
346 * wma_cli_get_command() - WMA "get" command processor
347 * @vdev_id: virtual device for the command
348 * @param_id: parameter id
349 * @vpdev: parameter category
350 *
351 * Return: parameter value on success, -EINVAL on failure
352 */
353int wma_cli_get_command(int vdev_id, int param_id, int vpdev)
354{
355 int ret = 0;
356 tp_wma_handle wma;
357 struct wma_txrx_node *intr = NULL;
358
Anurag Chouhan6d760662016-02-20 16:05:43 +0530359 wma = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800360
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -0700361 if (!wma) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800362 WMA_LOGE("%s: Invalid wma handle", __func__);
363 return -EINVAL;
364 }
365
366 intr = wma->interfaces;
367
368 if (VDEV_CMD == vpdev) {
369 switch (param_id) {
370 case WMI_VDEV_PARAM_NSS:
371 ret = intr[vdev_id].config.nss;
372 break;
373#ifdef QCA_SUPPORT_GTX
374 case WMI_VDEV_PARAM_GTX_HT_MCS:
375 ret = intr[vdev_id].config.gtx_info.gtxRTMask[0];
376 break;
377 case WMI_VDEV_PARAM_GTX_VHT_MCS:
378 ret = intr[vdev_id].config.gtx_info.gtxRTMask[1];
379 break;
380 case WMI_VDEV_PARAM_GTX_USR_CFG:
381 ret = intr[vdev_id].config.gtx_info.gtxUsrcfg;
382 break;
383 case WMI_VDEV_PARAM_GTX_THRE:
384 ret = intr[vdev_id].config.gtx_info.gtxPERThreshold;
385 break;
386 case WMI_VDEV_PARAM_GTX_MARGIN:
387 ret = intr[vdev_id].config.gtx_info.gtxPERMargin;
388 break;
389 case WMI_VDEV_PARAM_GTX_STEP:
390 ret = intr[vdev_id].config.gtx_info.gtxTPCstep;
391 break;
392 case WMI_VDEV_PARAM_GTX_MINTPC:
393 ret = intr[vdev_id].config.gtx_info.gtxTPCMin;
394 break;
395 case WMI_VDEV_PARAM_GTX_BW_MASK:
396 ret = intr[vdev_id].config.gtx_info.gtxBWMask;
397 break;
398#endif /* QCA_SUPPORT_GTX */
399 case WMI_VDEV_PARAM_LDPC:
400 ret = intr[vdev_id].config.ldpc;
401 break;
402 case WMI_VDEV_PARAM_TX_STBC:
403 ret = intr[vdev_id].config.tx_stbc;
404 break;
405 case WMI_VDEV_PARAM_RX_STBC:
406 ret = intr[vdev_id].config.rx_stbc;
407 break;
408 case WMI_VDEV_PARAM_SGI:
409 ret = intr[vdev_id].config.shortgi;
410 break;
411 case WMI_VDEV_PARAM_ENABLE_RTSCTS:
412 ret = intr[vdev_id].config.rtscts_en;
413 break;
414 case WMI_VDEV_PARAM_CHWIDTH:
415 ret = intr[vdev_id].config.chwidth;
416 break;
417 case WMI_VDEV_PARAM_FIXED_RATE:
418 ret = intr[vdev_id].config.tx_rate;
419 break;
Krishna Kumaar Natarajan1a71ec72017-03-23 12:26:31 -0700420 case WMI_VDEV_PARAM_HE_DCM:
Krishna Kumaar Natarajan150cd012017-03-23 12:29:10 -0700421 case WMI_VDEV_PARAM_HE_RANGE_EXT:
Krishna Kumaar Natarajan1a71ec72017-03-23 12:26:31 -0700422 ret = wma_get_he_vdev_param(&intr[vdev_id], param_id);
423 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800424 default:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700425 WMA_LOGE("Invalid cli_get vdev command/Not yet implemented 0x%x",
426 param_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800427 return -EINVAL;
428 }
429 } else if (PDEV_CMD == vpdev) {
430 switch (param_id) {
431 case WMI_PDEV_PARAM_ANI_ENABLE:
432 ret = wma->pdevconfig.ani_enable;
433 break;
434 case WMI_PDEV_PARAM_ANI_POLL_PERIOD:
435 ret = wma->pdevconfig.ani_poll_len;
436 break;
437 case WMI_PDEV_PARAM_ANI_LISTEN_PERIOD:
438 ret = wma->pdevconfig.ani_listen_len;
439 break;
440 case WMI_PDEV_PARAM_ANI_OFDM_LEVEL:
441 ret = wma->pdevconfig.ani_ofdm_level;
442 break;
443 case WMI_PDEV_PARAM_ANI_CCK_LEVEL:
444 ret = wma->pdevconfig.ani_cck_level;
445 break;
446 case WMI_PDEV_PARAM_DYNAMIC_BW:
447 ret = wma->pdevconfig.cwmenable;
448 break;
449 case WMI_PDEV_PARAM_CTS_CBW:
450 ret = wma->pdevconfig.cts_cbw;
451 break;
452 case WMI_PDEV_PARAM_TX_CHAIN_MASK:
453 ret = wma->pdevconfig.txchainmask;
454 break;
455 case WMI_PDEV_PARAM_RX_CHAIN_MASK:
456 ret = wma->pdevconfig.rxchainmask;
457 break;
458 case WMI_PDEV_PARAM_TXPOWER_LIMIT2G:
459 ret = wma->pdevconfig.txpow2g;
460 break;
461 case WMI_PDEV_PARAM_TXPOWER_LIMIT5G:
462 ret = wma->pdevconfig.txpow5g;
463 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800464 default:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700465 WMA_LOGE("Invalid cli_get pdev command/Not yet implemented 0x%x",
466 param_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800467 return -EINVAL;
468 }
469 } else if (GEN_CMD == vpdev) {
470 switch (param_id) {
471 case GEN_VDEV_PARAM_AMPDU:
472 ret = intr[vdev_id].config.ampdu;
473 break;
474 case GEN_VDEV_PARAM_AMSDU:
475 ret = intr[vdev_id].config.amsdu;
476 break;
Varun Reddy Yeturu5ab47462016-05-08 18:08:11 -0700477 case GEN_VDEV_ROAM_SYNCH_DELAY:
478 ret = intr[vdev_id].roam_synch_delay;
479 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800480 default:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700481 WMA_LOGE("Invalid generic vdev command/Not yet implemented 0x%x",
482 param_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800483 return -EINVAL;
484 }
485 } else if (PPS_CMD == vpdev) {
486 switch (param_id) {
487 case WMI_VDEV_PPS_PAID_MATCH:
488 ret = intr[vdev_id].config.pps_params.paid_match_enable;
489 break;
490 case WMI_VDEV_PPS_GID_MATCH:
491 ret = intr[vdev_id].config.pps_params.gid_match_enable;
492 break;
493 case WMI_VDEV_PPS_EARLY_TIM_CLEAR:
494 ret = intr[vdev_id].config.pps_params.tim_clear;
495 break;
496 case WMI_VDEV_PPS_EARLY_DTIM_CLEAR:
497 ret = intr[vdev_id].config.pps_params.dtim_clear;
498 break;
499 case WMI_VDEV_PPS_EOF_PAD_DELIM:
500 ret = intr[vdev_id].config.pps_params.eof_delim;
501 break;
502 case WMI_VDEV_PPS_MACADDR_MISMATCH:
503 ret = intr[vdev_id].config.pps_params.mac_match;
504 break;
505 case WMI_VDEV_PPS_DELIM_CRC_FAIL:
506 ret = intr[vdev_id].config.pps_params.delim_fail;
507 break;
508 case WMI_VDEV_PPS_GID_NSTS_ZERO:
509 ret = intr[vdev_id].config.pps_params.nsts_zero;
510 break;
511 case WMI_VDEV_PPS_RSSI_CHECK:
512 ret = intr[vdev_id].config.pps_params.rssi_chk;
513 break;
514 default:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700515 WMA_LOGE("Invalid pps vdev command/Not yet implemented 0x%x",
516 param_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800517 return -EINVAL;
518 }
519 } else if (QPOWER_CMD == vpdev) {
520 switch (param_id) {
521 case WMI_STA_PS_PARAM_QPOWER_PSPOLL_COUNT:
522 ret = intr[vdev_id].config.qpower_params.
523 max_ps_poll_cnt;
524 break;
525 case WMI_STA_PS_PARAM_QPOWER_MAX_TX_BEFORE_WAKE:
526 ret = intr[vdev_id].config.qpower_params.
527 max_tx_before_wake;
528 break;
529 case WMI_STA_PS_PARAM_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL:
530 ret = intr[vdev_id].config.qpower_params.
531 spec_ps_poll_wake_interval;
532 break;
533 case WMI_STA_PS_PARAM_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL:
534 ret = intr[vdev_id].config.qpower_params.
535 max_spec_nodata_ps_poll;
536 break;
537 default:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700538 WMA_LOGE("Invalid generic vdev command/Not yet implemented 0x%x",
539 param_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800540 return -EINVAL;
541 }
542 } else if (GTX_CMD == vpdev) {
543 switch (param_id) {
544 case WMI_VDEV_PARAM_GTX_HT_MCS:
545 ret = intr[vdev_id].config.gtx_info.gtxRTMask[0];
546 break;
547 case WMI_VDEV_PARAM_GTX_VHT_MCS:
548 ret = intr[vdev_id].config.gtx_info.gtxRTMask[1];
549 break;
550 case WMI_VDEV_PARAM_GTX_USR_CFG:
551 ret = intr[vdev_id].config.gtx_info.gtxUsrcfg;
552 break;
553 case WMI_VDEV_PARAM_GTX_THRE:
554 ret = intr[vdev_id].config.gtx_info.gtxPERThreshold;
555 break;
556 case WMI_VDEV_PARAM_GTX_MARGIN:
557 ret = intr[vdev_id].config.gtx_info.gtxPERMargin;
558 break;
559 case WMI_VDEV_PARAM_GTX_STEP:
560 ret = intr[vdev_id].config.gtx_info.gtxTPCstep;
561 break;
562 case WMI_VDEV_PARAM_GTX_MINTPC:
563 ret = intr[vdev_id].config.gtx_info.gtxTPCMin;
564 break;
565 case WMI_VDEV_PARAM_GTX_BW_MASK:
566 ret = intr[vdev_id].config.gtx_info.gtxBWMask;
567 break;
568 default:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700569 WMA_LOGE("Invalid generic vdev command/Not yet implemented 0x%x",
570 param_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800571 return -EINVAL;
572 }
573 }
574 return ret;
575}
576
577/**
578 * wma_cli_set2_command() - WMA "set 2 params" command processor
579 * @vdev_id: virtual device for the command
580 * @param_id: parameter id
581 * @sval1: first parameter value
582 * @sval2: second parameter value
583 * @vpdev: parameter category
584 *
585 * Command handler for set operations which require 2 parameters
586 *
587 * Return: 0 on success, errno on failure
588 */
589int wma_cli_set2_command(int vdev_id, int param_id, int sval1,
590 int sval2, int vpdev)
591{
Rajeev Kumarb60abe42017-01-21 15:39:31 -0800592 struct scheduler_msg msg = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800593 wma_cli_set_cmd_t *iwcmd;
594
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530595 iwcmd = qdf_mem_malloc(sizeof(*iwcmd));
Arif Hussain157263f2018-10-03 13:07:15 -0700596 if (!iwcmd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800597 return -ENOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800598
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530599 qdf_mem_zero(iwcmd, sizeof(*iwcmd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800600 iwcmd->param_value = sval1;
601 iwcmd->param_sec_value = sval2;
602 iwcmd->param_vdev_id = vdev_id;
603 iwcmd->param_id = param_id;
604 iwcmd->param_vp_dev = vpdev;
605 msg.type = WMA_CLI_SET_CMD;
606 msg.reserved = 0;
607 msg.bodyptr = iwcmd;
608
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530609 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia00861f02018-08-28 19:16:12 +0530610 scheduler_post_message(QDF_MODULE_ID_WMA,
611 QDF_MODULE_ID_WMA,
612 QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530613 qdf_mem_free(iwcmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800614 return -EIO;
615 }
616 return 0;
617}
618
619/**
620 * wma_cli_set_command() - WMA "set" command processor
621 * @vdev_id: virtual device for the command
622 * @param_id: parameter id
623 * @sval: parameter value
624 * @vpdev: parameter category
625 *
626 * Command handler for set operations
627 *
628 * Return: 0 on success, errno on failure
629 */
630int wma_cli_set_command(int vdev_id, int param_id, int sval, int vpdev)
631{
632 return wma_cli_set2_command(vdev_id, param_id, sval, 0, vpdev);
633
634}
635
Krunal Soniaadaa272017-10-04 16:42:55 -0700636QDF_STATUS wma_form_unit_test_cmd_and_send(uint32_t vdev_id,
637 uint32_t module_id, uint32_t arg_count, uint32_t *arg)
638{
639 struct wmi_unit_test_cmd *unit_test_args;
640 tp_wma_handle wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
641 uint32_t i;
642 QDF_STATUS status;
643
644 WMA_LOGD(FL("enter"));
sheenam mongae0e91c42020-02-11 12:32:22 +0530645
646 if (!wma_is_vdev_valid(vdev_id))
647 return QDF_STATUS_E_FAILURE;
648
Sourav Mohapatraea7210b2018-11-16 16:58:52 +0530649 if (arg_count > WMA_MAX_NUM_ARGS) {
Krunal Soniaadaa272017-10-04 16:42:55 -0700650 WMA_LOGE(FL("arg_count is crossed the boundary"));
651 return QDF_STATUS_E_FAILURE;
652 }
653 if (!wma_handle || !wma_handle->wmi_handle) {
654 WMA_LOGE(FL("Invalid WMA/WMI handle"));
655 return QDF_STATUS_E_FAILURE;
656 }
657 unit_test_args = qdf_mem_malloc(sizeof(*unit_test_args));
Arif Hussain157263f2018-10-03 13:07:15 -0700658 if (!unit_test_args)
Krunal Soniaadaa272017-10-04 16:42:55 -0700659 return QDF_STATUS_E_NOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -0700660
Krunal Soniaadaa272017-10-04 16:42:55 -0700661 unit_test_args->vdev_id = vdev_id;
662 unit_test_args->module_id = module_id;
663 unit_test_args->num_args = arg_count;
664 for (i = 0; i < arg_count; i++)
665 unit_test_args->args[i] = arg[i];
666
667 status = wmi_unified_unit_test_cmd(wma_handle->wmi_handle,
668 unit_test_args);
669 qdf_mem_free(unit_test_args);
670 WMA_LOGD(FL("exit"));
671
672 return status;
673}
674
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -0800675static void wma_process_send_addba_req(tp_wma_handle wma_handle,
676 struct send_add_ba_req *send_addba)
677{
678 QDF_STATUS status;
679
680 if (!wma_handle || !wma_handle->wmi_handle) {
681 WMA_LOGE(FL("Invalid WMA/WMI handle"));
682 qdf_mem_free(send_addba);
683 return;
684 }
685
686 status = wmi_unified_addba_send_cmd_send(wma_handle->wmi_handle,
687 send_addba->mac_addr,
688 &send_addba->param);
689 if (QDF_STATUS_SUCCESS != status) {
690 WMA_LOGE(FL("Failed to process WMA_SEND_ADDBA_REQ"));
691 }
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -0700692 wma_debug("sent ADDBA req to" QDF_MAC_ADDR_STR "tid %d buff_size %d",
Srinivas Girigowda34fbba02019-04-08 12:07:44 -0700693 QDF_MAC_ADDR_ARRAY(send_addba->mac_addr),
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -0800694 send_addba->param.tidno,
695 send_addba->param.buffersize);
696
697 qdf_mem_free(send_addba);
698}
699
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800700/**
701 * wma_set_priv_cfg() - set private config parameters
702 * @wma_handle: wma handle
703 * @privcmd: private command
704 *
705 * Return: 0 for success or error code
706 */
707static int32_t wma_set_priv_cfg(tp_wma_handle wma_handle,
708 wma_cli_set_cmd_t *privcmd)
709{
710 int32_t ret = 0;
711
712 switch (privcmd->param_id) {
713 case WMA_VDEV_TXRX_FWSTATS_ENABLE_CMDID:
714 ret = wma_set_txrx_fw_stats_level(wma_handle,
715 privcmd->param_vdev_id,
716 privcmd->param_value);
717 break;
718 case WMA_VDEV_TXRX_FWSTATS_RESET_CMDID:
719 ret = wma_txrx_fw_stats_reset(wma_handle,
720 privcmd->param_vdev_id,
721 privcmd->param_value);
722 break;
723 case WMI_STA_SMPS_FORCE_MODE_CMDID:
Archana Ramachandran20d2e232016-02-11 16:58:40 -0800724 ret = wma_set_mimops(wma_handle,
725 privcmd->param_vdev_id,
726 privcmd->param_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800727 break;
728 case WMI_STA_SMPS_PARAM_CMDID:
729 wma_set_smps_params(wma_handle, privcmd->param_vdev_id,
730 privcmd->param_value);
731 break;
732 case WMA_VDEV_MCC_SET_TIME_LATENCY:
733 {
734 /* Extract first MCC adapter/vdev channel number and latency */
735 uint8_t mcc_channel = privcmd->param_value & 0x000000FF;
736 uint8_t mcc_channel_latency =
737 (privcmd->param_value & 0x0000FF00) >> 8;
738 int ret = -1;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700739
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800740 WMA_LOGD("%s: Parsed input: Channel #1:%d, latency:%dms",
741 __func__, mcc_channel, mcc_channel_latency);
742 ret = wma_set_mcc_channel_time_latency(wma_handle,
743 mcc_channel,
744 mcc_channel_latency);
745 }
746 break;
747 case WMA_VDEV_MCC_SET_TIME_QUOTA:
748 {
749 /* Extract the MCC 2 adapters/vdevs channel numbers and time
750 * quota value for the first adapter only (which is specified
751 * in iwpriv command.
752 */
753 uint8_t adapter_2_chan_number =
754 privcmd->param_value & 0x000000FF;
755 uint8_t adapter_1_chan_number =
756 (privcmd->param_value & 0x0000FF00) >> 8;
757 uint8_t adapter_1_quota =
758 (privcmd->param_value & 0x00FF0000) >> 16;
759 int ret = -1;
760
761 WMA_LOGD("%s: Parsed input: Channel #1:%d, Channel #2:%d, quota 1:%dms",
762 __func__, adapter_1_chan_number,
763 adapter_2_chan_number, adapter_1_quota);
764
765 ret = wma_set_mcc_channel_time_quota(wma_handle,
766 adapter_1_chan_number,
767 adapter_1_quota,
768 adapter_2_chan_number);
769 }
770 break;
771 case WMA_VDEV_IBSS_SET_ATIM_WINDOW_SIZE:
772 {
773 wma_handle->wma_ibss_power_save_params.atimWindowLength =
774 privcmd->param_value;
775 WMA_LOGD("%s: IBSS power save ATIM Window = %d",
776 __func__, wma_handle->wma_ibss_power_save_params.
777 atimWindowLength);
778 }
779 break;
780 case WMA_VDEV_IBSS_SET_POWER_SAVE_ALLOWED:
781 {
782 wma_handle->wma_ibss_power_save_params.isPowerSaveAllowed =
783 privcmd->param_value;
784 WMA_LOGD("%s: IBSS is Power Save Allowed = %d",
785 __func__, wma_handle->wma_ibss_power_save_params.
786 isPowerSaveAllowed);
787 }
788 break;
789 case WMA_VDEV_IBSS_SET_POWER_COLLAPSE_ALLOWED:
790 {
791 wma_handle->wma_ibss_power_save_params. isPowerCollapseAllowed =
792 privcmd->param_value;
793 WMA_LOGD("%s: IBSS is Power Collapse Allowed = %d",
794 __func__, wma_handle->wma_ibss_power_save_params.
795 isPowerCollapseAllowed);
796 }
797 break;
798 case WMA_VDEV_IBSS_SET_AWAKE_ON_TX_RX:
799 {
800 wma_handle->wma_ibss_power_save_params.isAwakeonTxRxEnabled =
801 privcmd->param_value;
802 WMA_LOGD("%s: IBSS Power Save Awake on Tx/Rx Enabled = %d",
803 __func__, wma_handle->wma_ibss_power_save_params.
804 isAwakeonTxRxEnabled);
805 }
806 break;
807 case WMA_VDEV_IBSS_SET_INACTIVITY_TIME:
808 {
809 wma_handle->wma_ibss_power_save_params.inactivityCount =
810 privcmd->param_value;
811 WMA_LOGD("%s: IBSS Power Save Data Inactivity Count = %d",
812 __func__, wma_handle->wma_ibss_power_save_params.
813 inactivityCount);
814 }
815 break;
816 case WMA_VDEV_IBSS_SET_TXSP_END_INACTIVITY_TIME:
817 {
818 wma_handle->wma_ibss_power_save_params.txSPEndInactivityTime =
819 privcmd->param_value;
820 WMA_LOGD("%s: IBSS Power Save Transmit EOSP inactivity time out = %d",
821 __func__, wma_handle->wma_ibss_power_save_params.
822 txSPEndInactivityTime);
823 }
824 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800825 case WMA_VDEV_IBSS_PS_SET_WARMUP_TIME_SECS:
826 {
827 wma_handle->wma_ibss_power_save_params.ibssPsWarmupTime =
828 privcmd->param_value;
829 WMA_LOGD("%s: IBSS Power Save Warm Up Time in Seconds = %d",
830 __func__, wma_handle->wma_ibss_power_save_params.
831 ibssPsWarmupTime);
832 }
833 break;
834 case WMA_VDEV_IBSS_PS_SET_1RX_CHAIN_IN_ATIM_WINDOW:
835 {
836 wma_handle->wma_ibss_power_save_params.ibssPs1RxChainInAtimEnable
837 = privcmd->param_value;
838 WMA_LOGD("%s: IBSS Power Save single RX Chain Enable In ATIM = %d",
839 __func__, wma_handle->wma_ibss_power_save_params.
840 ibssPs1RxChainInAtimEnable);
841 }
842 break;
843
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800844 default:
845 WMA_LOGE("Invalid wma config command id:%d", privcmd->param_id);
846 ret = -EINVAL;
847 }
848 return ret;
849}
850
851/**
Kiran Kumar Lokere6d3a30d2018-01-15 18:18:29 -0800852 * wma_set_dtim_period() - set dtim period to FW
853 * @wma: wma handle
854 * @dtim_params: dtim params
855 *
856 * Return: none
857 */
858static void wma_set_dtim_period(tp_wma_handle wma,
859 struct set_dtim_params *dtim_params)
860{
861 struct wma_txrx_node *iface =
862 &wma->interfaces[dtim_params->session_id];
863 if (!wma_is_vdev_valid(dtim_params->session_id)) {
864 WMA_LOGE("%s: invalid VDEV", __func__);
865 return;
866 }
867 WMA_LOGD("%s: set dtim_period %d", __func__,
868 dtim_params->dtim_period);
869 iface->dtimPeriod = dtim_params->dtim_period;
870
871}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800872
873/**
874 * wma_process_cli_set_cmd() - set parameters to fw
875 * @wma: wma handle
876 * @privcmd: command
877 *
878 * Return: none
879 */
880static void wma_process_cli_set_cmd(tp_wma_handle wma,
881 wma_cli_set_cmd_t *privcmd)
882{
Govind Singhd76a5b02016-03-08 15:12:14 +0530883 int vid = privcmd->param_vdev_id, pps_val = 0;
884 QDF_STATUS ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800885 struct wma_txrx_node *intr = wma->interfaces;
Jeff Johnson9f18aa72018-12-02 12:05:12 -0800886 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800887 struct qpower_params *qparams = &intr[vid].config.qpower_params;
Govind Singhd76a5b02016-03-08 15:12:14 +0530888 struct pdev_params pdev_param;
Leo Chang96464902016-10-28 11:10:54 -0700889 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Arunk Khandavalli2462f462018-01-25 14:41:02 +0530890 struct target_psoc_info *tgt_hdl;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800891
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -0700892 if (!mac) {
Jeff Johnsonfe8dc692018-11-22 08:45:13 -0800893 WMA_LOGE("%s: Failed to get mac", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800894 return;
895 }
896
Arunk Khandavalli2462f462018-01-25 14:41:02 +0530897 tgt_hdl = wlan_psoc_get_tgt_if_handle(wma->psoc);
898 if (!tgt_hdl) {
899 WMA_LOGE("%s: target psoc info is NULL", __func__);
900 return;
901 }
902
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800903 if (privcmd->param_id >= WMI_CMDID_MAX) {
904 /*
905 * This configuration setting is not done using any wmi
906 * command, call appropriate handler.
907 */
908 if (wma_set_priv_cfg(wma, privcmd))
909 WMA_LOGE("Failed to set wma priv congiuration");
910 return;
911 }
912
913 switch (privcmd->param_vp_dev) {
914 case VDEV_CMD:
Pragaspathi Thilagarajf81a8f02018-08-15 21:44:07 +0530915 if (!wma_is_vdev_valid(privcmd->param_vdev_id)) {
Bhargav Shaha89d3b42016-04-20 13:04:56 +0530916 WMA_LOGE("%s Vdev id is not valid", __func__);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700917 return;
Bhargav Shaha89d3b42016-04-20 13:04:56 +0530918 }
919
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800920 WMA_LOGD("vdev id %d pid %d pval %d", privcmd->param_vdev_id,
921 privcmd->param_id, privcmd->param_value);
Govind Singhd76a5b02016-03-08 15:12:14 +0530922 ret = wma_vdev_set_param(wma->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800923 privcmd->param_vdev_id,
924 privcmd->param_id,
925 privcmd->param_value);
Govind Singhd76a5b02016-03-08 15:12:14 +0530926 if (QDF_IS_STATUS_ERROR(ret)) {
927 WMA_LOGE("wma_vdev_set_param failed ret %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800928 ret);
929 return;
930 }
931 break;
932 case PDEV_CMD:
933 WMA_LOGD("pdev pid %d pval %d", privcmd->param_id,
934 privcmd->param_value);
935 if ((privcmd->param_id == WMI_PDEV_PARAM_RX_CHAIN_MASK) ||
936 (privcmd->param_id == WMI_PDEV_PARAM_TX_CHAIN_MASK)) {
Jiachao Wu08719b02017-07-05 13:05:34 +0800937 if (QDF_STATUS_SUCCESS !=
938 wma_check_txrx_chainmask(
Arunk Khandavalli2462f462018-01-25 14:41:02 +0530939 target_if_get_num_rf_chains(tgt_hdl),
Jiachao Wu08719b02017-07-05 13:05:34 +0800940 privcmd->param_value)) {
941 WMA_LOGD("Chainmask value is invalid");
942 return;
943 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800944 }
Govind Singhd76a5b02016-03-08 15:12:14 +0530945 pdev_param.param_id = privcmd->param_id;
946 pdev_param.param_value = privcmd->param_value;
947 ret = wmi_unified_pdev_param_send(wma->wmi_handle,
948 &pdev_param,
949 WMA_WILDCARD_PDEV_ID);
950 if (QDF_IS_STATUS_ERROR(ret)) {
951 WMA_LOGE("wma_vdev_set_param failed ret %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800952 ret);
953 return;
954 }
955 break;
956 case GEN_CMD:
957 {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800958 struct wma_txrx_node *intr = wma->interfaces;
Abhishek Ambure74709762019-05-27 19:43:26 +0530959 wmi_vdev_custom_aggr_type_t aggr_type =
960 WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800961
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800962 WMA_LOGD("gen pid %d pval %d", privcmd->param_id,
963 privcmd->param_value);
964
965 switch (privcmd->param_id) {
Arif Hussain0e246802018-05-01 18:13:44 -0700966 case GEN_VDEV_PARAM_AMSDU:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800967 case GEN_VDEV_PARAM_AMPDU:
Lin Baic1351142018-05-17 11:50:01 +0800968 if (!soc) {
969 WMA_LOGE("%s:SOC context is NULL", __func__);
970 return;
971 }
972
973 if (privcmd->param_id == GEN_VDEV_PARAM_AMPDU) {
Vevek Venkatesan0ac759f2019-10-03 04:14:29 +0530974 ret = cdp_aggr_cfg(soc, privcmd->param_vdev_id,
975 privcmd->param_value, 0);
Nishank Aggarwala13b61d2016-12-01 12:53:58 +0530976 if (ret)
977 WMA_LOGE("cdp_aggr_cfg set ampdu failed ret %d",
978 ret);
979 else
980 intr[privcmd->param_vdev_id].config.
981 ampdu = privcmd->param_value;
Arif Hussain0e246802018-05-01 18:13:44 -0700982
Abhishek Ambure74709762019-05-27 19:43:26 +0530983 aggr_type =
Lin Baic1351142018-05-17 11:50:01 +0800984 WMI_VDEV_CUSTOM_AGGR_TYPE_AMPDU;
Lin Baic1351142018-05-17 11:50:01 +0800985 }
986
Abhishek Ambure74709762019-05-27 19:43:26 +0530987 ret = wma_set_tx_rx_aggr_size(vid,
988 privcmd->param_value,
989 privcmd->param_value,
990 aggr_type);
Lin Baic1351142018-05-17 11:50:01 +0800991 if (QDF_IS_STATUS_ERROR(ret)) {
992 WMA_LOGE("set_aggr_size failed ret %d", ret);
Nishank Aggarwala13b61d2016-12-01 12:53:58 +0530993 return;
994 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800995 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800996 case GEN_PARAM_CRASH_INJECT:
Rajeev Kumar0a9901b2015-12-15 15:59:19 -0800997 if (QDF_GLOBAL_FTM_MODE == cds_get_conparam())
998 WMA_LOGE("Crash inject not allowed in FTM mode");
999 else
1000 ret = wma_crash_inject(wma,
1001 privcmd->param_value,
1002 privcmd->param_sec_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001003 break;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07001004 case GEN_PARAM_CAPTURE_TSF:
1005 ret = wma_capture_tsf(wma, privcmd->param_value);
1006 break;
1007 case GEN_PARAM_RESET_TSF_GPIO:
1008 ret = wma_reset_tsf_gpio(wma, privcmd->param_value);
1009 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001010 default:
1011 WMA_LOGE("Invalid param id 0x%x",
1012 privcmd->param_id);
1013 break;
1014 }
1015 break;
1016 }
1017 case DBG_CMD:
1018 WMA_LOGD("dbg pid %d pval %d", privcmd->param_id,
1019 privcmd->param_value);
1020 switch (privcmd->param_id) {
1021 case WMI_DBGLOG_LOG_LEVEL:
1022 ret = dbglog_set_log_lvl(wma->wmi_handle,
1023 privcmd->param_value);
1024 if (ret)
1025 WMA_LOGE("dbglog_set_log_lvl failed ret %d",
1026 ret);
1027 break;
1028 case WMI_DBGLOG_VAP_ENABLE:
1029 ret = dbglog_vap_log_enable(wma->wmi_handle,
1030 privcmd->param_value, true);
1031 if (ret)
1032 WMA_LOGE("dbglog_vap_log_enable failed ret %d",
1033 ret);
1034 break;
1035 case WMI_DBGLOG_VAP_DISABLE:
1036 ret = dbglog_vap_log_enable(wma->wmi_handle,
1037 privcmd->param_value, false);
1038 if (ret)
1039 WMA_LOGE("dbglog_vap_log_enable failed ret %d",
1040 ret);
1041 break;
1042 case WMI_DBGLOG_MODULE_ENABLE:
1043 ret = dbglog_module_log_enable(wma->wmi_handle,
1044 privcmd->param_value, true);
1045 if (ret)
1046 WMA_LOGE("dbglog_module_log_enable failed ret %d",
1047 ret);
1048 break;
1049 case WMI_DBGLOG_MODULE_DISABLE:
1050 ret = dbglog_module_log_enable(wma->wmi_handle,
1051 privcmd->param_value, false);
1052 if (ret)
1053 WMA_LOGE("dbglog_module_log_enable failed ret %d",
1054 ret);
1055 break;
1056 case WMI_DBGLOG_MOD_LOG_LEVEL:
1057 ret = dbglog_set_mod_log_lvl(wma->wmi_handle,
1058 privcmd->param_value);
1059 if (ret)
1060 WMA_LOGE("dbglog_module_log_enable failed ret %d",
1061 ret);
1062 break;
1063 case WMI_DBGLOG_TYPE:
1064 ret = dbglog_parser_type_init(wma->wmi_handle,
1065 privcmd->param_value);
1066 if (ret)
1067 WMA_LOGE("dbglog_parser_type_init failed ret %d",
1068 ret);
1069 break;
1070 case WMI_DBGLOG_REPORT_ENABLE:
1071 ret = dbglog_report_enable(wma->wmi_handle,
1072 privcmd->param_value);
1073 if (ret)
1074 WMA_LOGE("dbglog_report_enable failed ret %d",
1075 ret);
1076 break;
Govind Singha471e5e2015-10-12 17:11:14 +05301077 case WMI_WLAN_PROFILE_TRIGGER_CMDID:
Govind Singhf25a0f12016-03-08 16:09:48 +05301078 ret = wma_unified_fw_profiling_cmd(wma->wmi_handle,
Govind Singha471e5e2015-10-12 17:11:14 +05301079 WMI_WLAN_PROFILE_TRIGGER_CMDID,
1080 privcmd->param_value, 0);
1081 if (ret)
1082 WMA_LOGE("Profile cmd failed for %d ret %d",
1083 WMI_WLAN_PROFILE_TRIGGER_CMDID, ret);
1084 break;
1085 case WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID:
Govind Singhf25a0f12016-03-08 16:09:48 +05301086 ret = wma_unified_fw_profiling_cmd(wma->wmi_handle,
Govind Singha471e5e2015-10-12 17:11:14 +05301087 WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
1088 privcmd->param_value,
1089 privcmd->param_sec_value);
1090 if (ret)
1091 WMA_LOGE("Profile cmd failed for %d ret %d",
1092 WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
1093 ret);
1094 break;
1095 case WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID:
Govind Singhf25a0f12016-03-08 16:09:48 +05301096 ret = wma_unified_fw_profiling_cmd(wma->wmi_handle,
Govind Singha471e5e2015-10-12 17:11:14 +05301097 WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
1098 privcmd->param_value,
1099 privcmd->param_sec_value);
1100 if (ret)
1101 WMA_LOGE("Profile cmd failed for %d ret %d",
1102 WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
1103 ret);
1104 break;
1105 case WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID:
Govind Singhf25a0f12016-03-08 16:09:48 +05301106 ret = wma_unified_fw_profiling_cmd(wma->wmi_handle,
Govind Singha471e5e2015-10-12 17:11:14 +05301107 WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
1108 0, 0);
1109 if (ret)
1110 WMA_LOGE("Profile cmd failed for %d ret %d",
1111 WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
1112 ret);
1113 break;
1114 case WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID:
Govind Singhf25a0f12016-03-08 16:09:48 +05301115 ret = wma_unified_fw_profiling_cmd(wma->wmi_handle,
Govind Singha471e5e2015-10-12 17:11:14 +05301116 WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
1117 0, 0);
1118 if (ret)
1119 WMA_LOGE("Profile cmd failed for %d ret %d",
1120 WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
1121 ret);
1122 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001123 case WMI_PDEV_GREEN_AP_PS_ENABLE_CMDID:
1124 /* Set the Green AP */
Govind Singhd76a5b02016-03-08 15:12:14 +05301125 ret = wmi_unified_green_ap_ps_send
1126 (wma->wmi_handle, privcmd->param_value,
1127 WMA_WILDCARD_PDEV_ID);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001128 if (ret) {
1129 WMA_LOGE("Set GreenAP Failed val %d",
1130 privcmd->param_value);
1131 }
1132 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001133
1134 default:
1135 WMA_LOGE("Invalid param id 0x%x", privcmd->param_id);
1136 break;
1137 }
1138 break;
1139 case PPS_CMD:
1140 WMA_LOGD("dbg pid %d pval %d", privcmd->param_id,
1141 privcmd->param_value);
1142 switch (privcmd->param_id) {
1143
1144 case WMI_VDEV_PPS_PAID_MATCH:
1145 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1146 (PKT_PWR_SAVE_PAID_MATCH & 0xffff);
1147 intr[vid].config.pps_params.paid_match_enable =
1148 privcmd->param_value;
1149 break;
1150 case WMI_VDEV_PPS_GID_MATCH:
1151 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1152 (PKT_PWR_SAVE_GID_MATCH & 0xffff);
1153 intr[vid].config.pps_params.gid_match_enable =
1154 privcmd->param_value;
1155 break;
1156 case WMI_VDEV_PPS_EARLY_TIM_CLEAR:
1157 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1158 (PKT_PWR_SAVE_EARLY_TIM_CLEAR & 0xffff);
1159 intr[vid].config.pps_params.tim_clear =
1160 privcmd->param_value;
1161 break;
1162 case WMI_VDEV_PPS_EARLY_DTIM_CLEAR:
1163 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1164 (PKT_PWR_SAVE_EARLY_DTIM_CLEAR & 0xffff);
1165 intr[vid].config.pps_params.dtim_clear =
1166 privcmd->param_value;
1167 break;
1168 case WMI_VDEV_PPS_EOF_PAD_DELIM:
1169 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1170 (PKT_PWR_SAVE_EOF_PAD_DELIM & 0xffff);
1171 intr[vid].config.pps_params.eof_delim =
1172 privcmd->param_value;
1173 break;
1174 case WMI_VDEV_PPS_MACADDR_MISMATCH:
1175 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1176 (PKT_PWR_SAVE_MACADDR_MISMATCH & 0xffff);
1177 intr[vid].config.pps_params.mac_match =
1178 privcmd->param_value;
1179 break;
1180 case WMI_VDEV_PPS_DELIM_CRC_FAIL:
1181 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1182 (PKT_PWR_SAVE_DELIM_CRC_FAIL & 0xffff);
1183 intr[vid].config.pps_params.delim_fail =
1184 privcmd->param_value;
1185 break;
1186 case WMI_VDEV_PPS_GID_NSTS_ZERO:
1187 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1188 (PKT_PWR_SAVE_GID_NSTS_ZERO & 0xffff);
1189 intr[vid].config.pps_params.nsts_zero =
1190 privcmd->param_value;
1191 break;
1192 case WMI_VDEV_PPS_RSSI_CHECK:
1193 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1194 (PKT_PWR_SAVE_RSSI_CHECK & 0xffff);
1195 intr[vid].config.pps_params.rssi_chk =
1196 privcmd->param_value;
1197 break;
1198 case WMI_VDEV_PPS_5G_EBT:
1199 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1200 (PKT_PWR_SAVE_5G_EBT & 0xffff);
1201 intr[vid].config.pps_params.ebt_5g =
1202 privcmd->param_value;
1203 break;
1204 default:
1205 WMA_LOGE("Invalid param id 0x%x", privcmd->param_id);
1206 break;
1207 }
1208 break;
1209
1210 case QPOWER_CMD:
1211 WMA_LOGD("QPOWER CLI CMD pid %d pval %d", privcmd->param_id,
1212 privcmd->param_value);
1213 switch (privcmd->param_id) {
1214 case WMI_STA_PS_PARAM_QPOWER_PSPOLL_COUNT:
1215 WMA_LOGD("QPOWER CLI CMD:Ps Poll Cnt val %d",
1216 privcmd->param_value);
1217 /* Set the QPower Ps Poll Count */
Govind Singhd76a5b02016-03-08 15:12:14 +05301218 ret = wma_unified_set_sta_ps_param(wma->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001219 vid, WMI_STA_PS_PARAM_QPOWER_PSPOLL_COUNT,
1220 privcmd->param_value);
1221 if (ret) {
1222 WMA_LOGE("Set Q-PsPollCnt Failed vdevId %d val %d",
1223 vid, privcmd->param_value);
1224 } else {
1225 qparams->max_ps_poll_cnt = privcmd->param_value;
1226 }
1227 break;
1228 case WMI_STA_PS_PARAM_QPOWER_MAX_TX_BEFORE_WAKE:
1229 WMA_LOGD("QPOWER CLI CMD:Max Tx Before wake val %d",
1230 privcmd->param_value);
1231 /* Set the QPower Max Tx Before Wake */
Govind Singhd76a5b02016-03-08 15:12:14 +05301232 ret = wma_unified_set_sta_ps_param(wma->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001233 vid, WMI_STA_PS_PARAM_QPOWER_MAX_TX_BEFORE_WAKE,
1234 privcmd->param_value);
1235 if (ret) {
1236 WMA_LOGE("Set Q-MaxTxBefWake Failed vId %d val %d",
1237 vid, privcmd->param_value);
1238 } else {
1239 qparams->max_tx_before_wake =
1240 privcmd->param_value;
1241 }
1242 break;
1243 case WMI_STA_PS_PARAM_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL:
1244 WMA_LOGD("QPOWER CLI CMD:Ps Poll Wake Inv val %d",
1245 privcmd->param_value);
1246 /* Set the QPower Spec Ps Poll Wake Inv */
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001247 ret = wma_unified_set_sta_ps_param(wma->wmi_handle, vid,
1248 WMI_STA_PS_PARAM_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001249 privcmd->param_value);
1250 if (ret) {
1251 WMA_LOGE("Set Q-PsPoll WakeIntv Failed vId %d val %d",
1252 vid, privcmd->param_value);
1253 } else {
1254 qparams->spec_ps_poll_wake_interval =
1255 privcmd->param_value;
1256 }
1257 break;
1258 case WMI_STA_PS_PARAM_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL:
1259 WMA_LOGD("QPOWER CLI CMD:Spec NoData Ps Poll val %d",
1260 privcmd->param_value);
1261 /* Set the QPower Spec NoData PsPoll */
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001262 ret = wma_unified_set_sta_ps_param(wma->wmi_handle, vid,
1263 WMI_STA_PS_PARAM_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001264 privcmd->param_value);
1265 if (ret) {
1266 WMA_LOGE("Set Q-SpecNoDataPsPoll Failed vId %d val %d",
1267 vid, privcmd->param_value);
1268 } else {
1269 qparams->max_spec_nodata_ps_poll =
1270 privcmd->param_value;
1271 }
1272 break;
1273
1274 default:
1275 WMA_LOGE("Invalid param id 0x%x", privcmd->param_id);
1276 break;
1277 }
1278 break;
1279 case GTX_CMD:
1280 WMA_LOGD("vdev id %d pid %d pval %d", privcmd->param_vdev_id,
1281 privcmd->param_id, privcmd->param_value);
1282 switch (privcmd->param_id) {
1283 case WMI_VDEV_PARAM_GTX_HT_MCS:
1284 intr[vid].config.gtx_info.gtxRTMask[0] =
1285 privcmd->param_value;
1286 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1287 privcmd->param_vdev_id,
1288 &intr[vid].config.gtx_info);
1289 break;
1290 case WMI_VDEV_PARAM_GTX_VHT_MCS:
1291 intr[vid].config.gtx_info.gtxRTMask[1] =
1292 privcmd->param_value;
1293 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1294 privcmd->param_vdev_id,
1295 &intr[vid].config.gtx_info);
1296 break;
1297
1298 case WMI_VDEV_PARAM_GTX_USR_CFG:
1299 intr[vid].config.gtx_info.gtxUsrcfg =
1300 privcmd->param_value;
1301 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1302 privcmd->param_vdev_id,
1303 &intr[vid].config.gtx_info);
1304 break;
1305
1306 case WMI_VDEV_PARAM_GTX_THRE:
1307 intr[vid].config.gtx_info.gtxPERThreshold =
1308 privcmd->param_value;
1309 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1310 privcmd->param_vdev_id,
1311 &intr[vid].config.gtx_info);
1312 break;
1313
1314 case WMI_VDEV_PARAM_GTX_MARGIN:
1315 intr[vid].config.gtx_info.gtxPERMargin =
1316 privcmd->param_value;
1317 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1318 privcmd->param_vdev_id,
1319 &intr[vid].config.gtx_info);
1320 break;
1321
1322 case WMI_VDEV_PARAM_GTX_STEP:
1323 intr[vid].config.gtx_info.gtxTPCstep =
1324 privcmd->param_value;
1325 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1326 privcmd->param_vdev_id,
1327 &intr[vid].config.gtx_info);
1328 break;
1329
1330 case WMI_VDEV_PARAM_GTX_MINTPC:
1331 intr[vid].config.gtx_info.gtxTPCMin =
1332 privcmd->param_value;
1333 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1334 privcmd->param_vdev_id,
1335 &intr[vid].config.gtx_info);
1336 break;
1337
1338 case WMI_VDEV_PARAM_GTX_BW_MASK:
1339 intr[vid].config.gtx_info.gtxBWMask =
1340 privcmd->param_value;
1341 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1342 privcmd->param_vdev_id,
1343 &intr[vid].config.gtx_info);
1344 if (ret) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001345 WMA_LOGE("wma_vdev_set_param failed ret %d",
1346 ret);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001347 return;
1348 }
1349 break;
1350 default:
1351 break;
1352 }
1353 break;
1354
1355 default:
1356 WMA_LOGE("Invalid vpdev command id");
1357 }
1358 if (1 == privcmd->param_vp_dev) {
1359 switch (privcmd->param_id) {
1360 case WMI_VDEV_PARAM_NSS:
1361 intr[vid].config.nss = privcmd->param_value;
1362 break;
1363 case WMI_VDEV_PARAM_LDPC:
1364 intr[vid].config.ldpc = privcmd->param_value;
1365 break;
1366 case WMI_VDEV_PARAM_TX_STBC:
1367 intr[vid].config.tx_stbc = privcmd->param_value;
1368 break;
1369 case WMI_VDEV_PARAM_RX_STBC:
1370 intr[vid].config.rx_stbc = privcmd->param_value;
1371 break;
1372 case WMI_VDEV_PARAM_SGI:
1373 intr[vid].config.shortgi = privcmd->param_value;
1374 break;
1375 case WMI_VDEV_PARAM_ENABLE_RTSCTS:
1376 intr[vid].config.rtscts_en = privcmd->param_value;
1377 break;
1378 case WMI_VDEV_PARAM_CHWIDTH:
1379 intr[vid].config.chwidth = privcmd->param_value;
1380 break;
1381 case WMI_VDEV_PARAM_FIXED_RATE:
1382 intr[vid].config.tx_rate = privcmd->param_value;
1383 break;
1384 case WMI_VDEV_PARAM_EARLY_RX_ADJUST_ENABLE:
1385 intr[vid].config.erx_adjust = privcmd->param_value;
1386 break;
1387 case WMI_VDEV_PARAM_EARLY_RX_TGT_BMISS_NUM:
1388 intr[vid].config.erx_bmiss_num = privcmd->param_value;
1389 break;
1390 case WMI_VDEV_PARAM_EARLY_RX_BMISS_SAMPLE_CYCLE:
1391 intr[vid].config.erx_bmiss_cycle = privcmd->param_value;
1392 break;
1393 case WMI_VDEV_PARAM_EARLY_RX_SLOP_STEP:
1394 intr[vid].config.erx_slop_step = privcmd->param_value;
1395 break;
1396 case WMI_VDEV_PARAM_EARLY_RX_INIT_SLOP:
1397 intr[vid].config.erx_init_slop = privcmd->param_value;
1398 break;
1399 case WMI_VDEV_PARAM_EARLY_RX_ADJUST_PAUSE:
1400 intr[vid].config.erx_adj_pause = privcmd->param_value;
1401 break;
1402 case WMI_VDEV_PARAM_EARLY_RX_DRIFT_SAMPLE:
1403 intr[vid].config.erx_dri_sample = privcmd->param_value;
1404 break;
Krishna Kumaar Natarajan1a71ec72017-03-23 12:26:31 -07001405 case WMI_VDEV_PARAM_HE_DCM:
Krishna Kumaar Natarajan150cd012017-03-23 12:29:10 -07001406 case WMI_VDEV_PARAM_HE_RANGE_EXT:
Krishna Kumaar Natarajan1a71ec72017-03-23 12:26:31 -07001407 wma_set_he_vdev_param(&intr[vid], privcmd->param_id,
1408 privcmd->param_value);
1409 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001410 default:
Yeshwanth Sriram Guntukacbe61442018-08-23 18:08:44 +05301411 WMA_LOGD("Invalid wma_cli_set vdev command/Not yet implemented 0x%x",
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001412 privcmd->param_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001413 break;
1414 }
1415 } else if (2 == privcmd->param_vp_dev) {
1416 switch (privcmd->param_id) {
1417 case WMI_PDEV_PARAM_ANI_ENABLE:
1418 wma->pdevconfig.ani_enable = privcmd->param_value;
1419 break;
1420 case WMI_PDEV_PARAM_ANI_POLL_PERIOD:
1421 wma->pdevconfig.ani_poll_len = privcmd->param_value;
1422 break;
1423 case WMI_PDEV_PARAM_ANI_LISTEN_PERIOD:
1424 wma->pdevconfig.ani_listen_len = privcmd->param_value;
1425 break;
1426 case WMI_PDEV_PARAM_ANI_OFDM_LEVEL:
1427 wma->pdevconfig.ani_ofdm_level = privcmd->param_value;
1428 break;
1429 case WMI_PDEV_PARAM_ANI_CCK_LEVEL:
1430 wma->pdevconfig.ani_cck_level = privcmd->param_value;
1431 break;
1432 case WMI_PDEV_PARAM_DYNAMIC_BW:
1433 wma->pdevconfig.cwmenable = privcmd->param_value;
1434 break;
1435 case WMI_PDEV_PARAM_CTS_CBW:
1436 wma->pdevconfig.cts_cbw = privcmd->param_value;
1437 break;
1438 case WMI_PDEV_PARAM_TX_CHAIN_MASK:
1439 wma->pdevconfig.txchainmask = privcmd->param_value;
1440 break;
1441 case WMI_PDEV_PARAM_RX_CHAIN_MASK:
1442 wma->pdevconfig.rxchainmask = privcmd->param_value;
1443 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001444 case WMI_PDEV_PARAM_TXPOWER_LIMIT2G:
1445 wma->pdevconfig.txpow2g = privcmd->param_value;
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08001446 if ((mac->mlme_cfg->gen.band_capability ==
Varun Reddy Yeturua48bc412017-11-17 15:33:35 -08001447 BAND_ALL) ||
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08001448 (mac->mlme_cfg->gen.band_capability ==
Wu Gao5f764082019-01-04 15:54:38 +08001449 BAND_2G))
1450 mac->mlme_cfg->power.current_tx_power_level =
1451 (uint8_t)privcmd->param_value;
1452 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001453 WMA_LOGE("Current band is not 2G");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001454 break;
1455 case WMI_PDEV_PARAM_TXPOWER_LIMIT5G:
1456 wma->pdevconfig.txpow5g = privcmd->param_value;
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08001457 if ((mac->mlme_cfg->gen.band_capability ==
Varun Reddy Yeturua48bc412017-11-17 15:33:35 -08001458 BAND_ALL) ||
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08001459 (mac->mlme_cfg->gen.band_capability ==
Wu Gao5f764082019-01-04 15:54:38 +08001460 BAND_5G))
1461 mac->mlme_cfg->power.current_tx_power_level =
1462 (uint8_t)privcmd->param_value;
1463 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001464 WMA_LOGE("Current band is not 5G");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001465 break;
1466 default:
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07001467 WMA_LOGD("Invalid wma_cli_set pdev command/Not yet implemented 0x%x",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001468 privcmd->param_id);
1469 break;
1470 }
1471 } else if (5 == privcmd->param_vp_dev) {
Govind Singhd76a5b02016-03-08 15:12:14 +05301472 ret = wma_vdev_set_param(wma->wmi_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001473 privcmd->param_vdev_id,
1474 WMI_VDEV_PARAM_PACKET_POWERSAVE,
1475 pps_val);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001476 if (ret)
1477 WMA_LOGE("Failed to send wmi packet power save cmd");
1478 else
1479 WMA_LOGD("Sent packet power save cmd %d value %x to target",
1480 privcmd->param_id, pps_val);
1481 }
1482}
1483
Dustin Brown05557182017-10-12 14:44:49 -07001484uint32_t wma_critical_events_in_flight(void)
1485{
1486 t_wma_handle *wma;
1487
1488 wma = cds_get_context(QDF_MODULE_ID_WMA);
Jianmin Zhubc999992019-10-22 23:32:56 +08001489 if (!wma || !wma->wmi_handle) {
1490 WMA_LOGE("Invalid wma or wmi handle");
Dustin Brown05557182017-10-12 14:44:49 -07001491 return 0;
Jianmin Zhubc999992019-10-22 23:32:56 +08001492 }
1493 return wmi_critical_events_in_flight(wma->wmi_handle);
Dustin Brown05557182017-10-12 14:44:49 -07001494}
1495
Govind Singhd76a5b02016-03-08 15:12:14 +05301496/**
Manjeet Singhf82ed072016-07-08 11:40:00 +05301497 * wma_process_hal_pwr_dbg_cmd() - send hal pwr dbg cmd to fw.
1498 * @handle: wma handle
1499 * @sir_pwr_dbg_params: unit test command
1500 *
1501 * This function send unit test command to fw.
1502 *
1503 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_** on error
1504 */
1505QDF_STATUS wma_process_hal_pwr_dbg_cmd(WMA_HANDLE handle,
1506 struct sir_mac_pwr_dbg_cmd *
1507 sir_pwr_dbg_params)
1508{
1509 tp_wma_handle wma_handle = (tp_wma_handle)handle;
1510 int i;
1511 struct wmi_power_dbg_params wmi_pwr_dbg_params;
1512 QDF_STATUS status;
1513
1514 if (!sir_pwr_dbg_params) {
1515 WMA_LOGE("%s: sir_pwr_dbg_params is null", __func__);
1516 return QDF_STATUS_E_INVAL;
1517 }
1518 wmi_pwr_dbg_params.module_id = sir_pwr_dbg_params->module_id;
1519 wmi_pwr_dbg_params.pdev_id = sir_pwr_dbg_params->pdev_id;
1520 wmi_pwr_dbg_params.num_args = sir_pwr_dbg_params->num_args;
1521
1522 for (i = 0; i < wmi_pwr_dbg_params.num_args; i++)
1523 wmi_pwr_dbg_params.args[i] = sir_pwr_dbg_params->args[i];
1524
1525 status = wmi_unified_send_power_dbg_cmd(wma_handle->wmi_handle,
1526 &wmi_pwr_dbg_params);
1527
1528 return status;
1529}
1530
Houston Hoffmanb6084f12017-05-30 19:24:07 -07001531static void wma_discard_fw_event(struct scheduler_msg *msg)
1532{
Will Huang9323e852018-02-02 17:55:15 +08001533 if (!msg->bodyptr)
1534 return;
1535
Will Huang9323e852018-02-02 17:55:15 +08001536 qdf_mem_free(msg->bodyptr);
Houston Hoffmanb6084f12017-05-30 19:24:07 -07001537 msg->bodyptr = NULL;
1538 msg->bodyval = 0;
1539 msg->type = 0;
1540}
1541
gaurank kathpalia748c7272018-10-24 22:05:15 +05301542QDF_STATUS
1543wma_vdev_nss_chain_params_send(uint8_t vdev_id,
1544 struct wlan_mlme_nss_chains *user_cfg)
1545{
1546 tp_wma_handle wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
gaurank kathpalia2fc3b892018-11-14 13:48:44 +05301547 struct vdev_nss_chains vdev_user_cfg;
gaurank kathpalia748c7272018-10-24 22:05:15 +05301548 if (!wma_handle) {
1549 WMA_LOGE("%s: wma_handle is NULL", __func__);
1550 return QDF_STATUS_E_FAILURE;
1551 }
1552
gaurank kathpalia2fc3b892018-11-14 13:48:44 +05301553 vdev_user_cfg.disable_rx_mrc[NSS_CHAINS_BAND_2GHZ] =
1554 user_cfg->disable_rx_mrc[NSS_CHAINS_BAND_2GHZ];
1555 vdev_user_cfg.disable_tx_mrc[NSS_CHAINS_BAND_2GHZ] =
1556 user_cfg->disable_tx_mrc[NSS_CHAINS_BAND_2GHZ];
1557 vdev_user_cfg.disable_rx_mrc[NSS_CHAINS_BAND_5GHZ] =
1558 user_cfg->disable_rx_mrc[NSS_CHAINS_BAND_5GHZ];
1559 vdev_user_cfg.disable_tx_mrc[NSS_CHAINS_BAND_5GHZ] =
1560 user_cfg->disable_tx_mrc[NSS_CHAINS_BAND_5GHZ];
1561
1562 vdev_user_cfg.num_rx_chains[NSS_CHAINS_BAND_2GHZ]
1563 = user_cfg->num_rx_chains[NSS_CHAINS_BAND_2GHZ];
1564 vdev_user_cfg.num_tx_chains[NSS_CHAINS_BAND_2GHZ]
1565 = user_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ];
1566 vdev_user_cfg.num_rx_chains[NSS_CHAINS_BAND_5GHZ] =
1567 user_cfg->num_rx_chains[NSS_CHAINS_BAND_5GHZ];
1568 vdev_user_cfg.num_tx_chains[NSS_CHAINS_BAND_5GHZ] =
1569 user_cfg->num_tx_chains[NSS_CHAINS_BAND_5GHZ];
1570
1571 vdev_user_cfg.rx_nss[NSS_CHAINS_BAND_2GHZ] =
1572 user_cfg->rx_nss[NSS_CHAINS_BAND_2GHZ];
1573 vdev_user_cfg.tx_nss[NSS_CHAINS_BAND_2GHZ] =
1574 user_cfg->tx_nss[NSS_CHAINS_BAND_2GHZ];
1575 vdev_user_cfg.rx_nss[NSS_CHAINS_BAND_5GHZ] =
1576 user_cfg->rx_nss[NSS_CHAINS_BAND_5GHZ];
1577 vdev_user_cfg.tx_nss[NSS_CHAINS_BAND_5GHZ] =
1578 user_cfg->tx_nss[NSS_CHAINS_BAND_5GHZ];
1579
1580 vdev_user_cfg.num_tx_chains_11a = user_cfg->num_tx_chains_11a;
1581 vdev_user_cfg.num_tx_chains_11b = user_cfg->num_tx_chains_11b;
1582 vdev_user_cfg.num_tx_chains_11g = user_cfg->num_tx_chains_11g;
1583
gaurank kathpalia748c7272018-10-24 22:05:15 +05301584 return wmi_unified_vdev_nss_chain_params_send(wma_handle->wmi_handle,
1585 vdev_id,
gaurank kathpalia2fc3b892018-11-14 13:48:44 +05301586 &vdev_user_cfg);
gaurank kathpalia748c7272018-10-24 22:05:15 +05301587}
1588
Manjeet Singhf82ed072016-07-08 11:40:00 +05301589/**
guangde4853c402019-05-06 15:54:04 +08001590 * wma_antenna_isolation_event_handler() - antenna isolation event handler
1591 * @handle: wma handle
1592 * @param: event data
1593 * @len: length
1594 *
1595 * Return: 0 for success or error code
1596 */
1597static int wma_antenna_isolation_event_handler(void *handle,
1598 u8 *param,
1599 u32 len)
1600{
1601 struct scheduler_msg cds_msg = {0};
1602 wmi_coex_report_isolation_event_fixed_param *event;
1603 WMI_COEX_REPORT_ANTENNA_ISOLATION_EVENTID_param_tlvs *param_buf;
1604 struct sir_isolation_resp *pisolation;
1605 struct mac_context *mac = NULL;
1606
1607 WMA_LOGD("%s: handle %pK param %pK len %d", __func__,
1608 handle, param, len);
1609
1610 mac = (struct mac_context *)cds_get_context(QDF_MODULE_ID_PE);
1611 if (!mac) {
1612 WMA_LOGE("%s: Invalid mac context", __func__);
1613 return -EINVAL;
1614 }
1615
1616 pisolation = qdf_mem_malloc(sizeof(*pisolation));
1617 if (!pisolation)
1618 return 0;
1619
1620 param_buf =
1621 (WMI_COEX_REPORT_ANTENNA_ISOLATION_EVENTID_param_tlvs *)param;
1622 if (!param_buf) {
1623 WMA_LOGE("%s: Invalid isolation event", __func__);
1624 return -EINVAL;
1625 }
1626 event = param_buf->fixed_param;
1627 pisolation->isolation_chain0 = event->isolation_chain0;
1628 pisolation->isolation_chain1 = event->isolation_chain1;
1629 pisolation->isolation_chain2 = event->isolation_chain2;
1630 pisolation->isolation_chain3 = event->isolation_chain3;
1631
1632 WMA_LOGD("%s: chain1 %d chain2 %d chain3 %d chain4 %d", __func__,
1633 pisolation->isolation_chain0, pisolation->isolation_chain1,
1634 pisolation->isolation_chain2, pisolation->isolation_chain3);
1635
1636 cds_msg.type = eWNI_SME_ANTENNA_ISOLATION_RSP;
1637 cds_msg.bodyptr = pisolation;
1638 cds_msg.bodyval = 0;
1639 if (QDF_STATUS_SUCCESS !=
1640 scheduler_post_message(QDF_MODULE_ID_WMA,
1641 QDF_MODULE_ID_SME,
1642 QDF_MODULE_ID_SME, &cds_msg)) {
1643 WMA_LOGE("%s: could not post peer info rsp msg to SME",
1644 __func__);
1645 /* free the mem and return */
1646 qdf_mem_free(pisolation);
1647 }
1648
1649 return 0;
1650}
1651
1652/**
Komal Seelam02d09342016-02-23 18:03:19 +05301653 * wma_init_max_no_of_peers - API to initialize wma configuration params
1654 * @wma_handle: WMA Handle
1655 * @max_peers: Max Peers supported
1656 *
1657 * Return: void
1658 */
Rachit Kankane0106e382018-05-16 18:59:28 +05301659static uint8_t wma_init_max_no_of_peers(tp_wma_handle wma_handle,
Komal Seelam02d09342016-02-23 18:03:19 +05301660 uint16_t max_peers)
1661{
1662 struct wma_ini_config *cfg = wma_get_ini_handle(wma_handle);
Rachit Kankane0106e382018-05-16 18:59:28 +05301663 struct hif_opaque_softc *scn = cds_get_context(QDF_MODULE_ID_HIF);
1664 uint32_t tgt_version = hif_get_target_info_handle(scn)->target_version;
1665 uint8_t max_no_of_peers;
1666 uint8_t max_supported_peers = (tgt_version == AR6320_REV1_1_VERSION) ?
1667 MAX_SUPPORTED_PEERS_REV1_1 : MAX_SUPPORTED_PEERS_REV1_3;
Komal Seelam02d09342016-02-23 18:03:19 +05301668
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07001669 if (!cfg) {
Naveen Rawat35804772016-06-27 15:40:28 -07001670 WMA_LOGE("%s: NULL WMA ini handle", __func__);
Rachit Kankane0106e382018-05-16 18:59:28 +05301671 return 0;
Naveen Rawat35804772016-06-27 15:40:28 -07001672 }
1673
Rachit Kankane0106e382018-05-16 18:59:28 +05301674 max_no_of_peers = (max_peers > max_supported_peers) ?
1675 max_supported_peers : max_peers;
1676 cfg->max_no_of_peers = max_no_of_peers;
1677 return max_no_of_peers;
Komal Seelam02d09342016-02-23 18:03:19 +05301678}
1679
Prashanth Bhattae675ca72016-10-20 18:42:37 -07001680/**
Abhishek Singhc614ec42017-04-25 16:17:34 +05301681 * wma_cleanup_hold_req() - cleanup hold request queue
1682 * @wma: wma handle
1683 *
1684 * Return: none
1685 */
1686static void wma_cleanup_hold_req(tp_wma_handle wma)
1687{
1688 struct wma_target_req *req_msg = NULL;
1689 qdf_list_node_t *node1 = NULL;
1690
1691 qdf_spin_lock_bh(&wma->wma_hold_req_q_lock);
1692 if (!qdf_list_size(&wma->wma_hold_req_queue)) {
1693 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
1694 WMA_LOGD(FL("request queue is empty"));
1695 return;
1696 }
1697
Wu Gao30f65eb2017-08-09 19:56:10 +08001698 /* peek front, and then cleanup it in wma_hold_req_timer */
Abhishek Singhc614ec42017-04-25 16:17:34 +05301699 while (QDF_STATUS_SUCCESS ==
Wu Gao30f65eb2017-08-09 19:56:10 +08001700 qdf_list_peek_front(&wma->wma_hold_req_queue, &node1)) {
Abhishek Singhc614ec42017-04-25 16:17:34 +05301701 req_msg = qdf_container_of(node1, struct wma_target_req, node);
1702 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
1703 /* Cleanup timeout handler */
1704 qdf_mc_timer_stop(&req_msg->event_timeout);
Abhishek Singhc614ec42017-04-25 16:17:34 +05301705 wma_hold_req_timer(req_msg);
1706 qdf_spin_lock_bh(&wma->wma_hold_req_q_lock);
1707 }
1708 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
1709}
1710
1711/**
Abhishek Singh0ac37442018-05-02 21:07:57 +05301712 * wma_cleanup_vdev_resp_and_hold_req() - cleaunup the vdev resp and hold req
1713 * queue
1714 * @msg :scheduler msg
1715 *
1716 * Return: QDF_STATUS
1717 */
1718static QDF_STATUS
1719wma_cleanup_vdev_resp_and_hold_req(struct scheduler_msg *msg)
1720{
Abhishek Amburee9af5b52019-09-17 14:17:57 +05301721 tp_wma_handle wma;
1722
Abhishek Singh0ac37442018-05-02 21:07:57 +05301723 if (!msg || !msg->bodyptr) {
1724 WMA_LOGE(FL("msg or body pointer is NULL"));
1725 return QDF_STATUS_E_INVAL;
1726 }
1727
Abhishek Amburee9af5b52019-09-17 14:17:57 +05301728 wma = msg->bodyptr;
Arun Kumar Khandavalli7b6bee72019-11-14 14:19:20 +05301729 target_if_flush_psoc_vdev_timers(wma->psoc);
Abhishek Amburee9af5b52019-09-17 14:17:57 +05301730 wma_cleanup_hold_req(wma);
Abhishek Singh0ac37442018-05-02 21:07:57 +05301731
1732 return QDF_STATUS_SUCCESS;
1733}
1734
1735/**
Abhishek Singhac3df1e2019-09-18 12:33:39 +05301736 * wma_cleanup_vdev_resp_and_hold_req_flush_cb() - flush cb for the msg to clean
1737 * up vdev resp and hold req
1738 * @msg :scheduler msg
1739 *
1740 * As passed msg->bodyptr is wma in this case this is dummy flush cb so that
1741 * driver doesnt try to free msg->bodyptr when this msg is flushed.
1742 *
1743 * Return: QDF_STATUS
1744 */
1745static inline QDF_STATUS
1746wma_cleanup_vdev_resp_and_hold_req_flush_cb(struct scheduler_msg *msg)
1747{
1748 return QDF_STATUS_SUCCESS;
1749}
1750
1751/**
Prashanth Bhattae675ca72016-10-20 18:42:37 -07001752 * wma_shutdown_notifier_cb - Shutdown notifer call back
1753 * @priv : WMA handle
1754 *
1755 * During recovery, WMA may wait for resume to complete if the crash happens
1756 * while in suspend. This may cause delays in completing the recovery. This call
1757 * back would be called during recovery and the event is completed so that if
1758 * the resume is waiting on FW to respond then it can get out of the wait so
1759 * that recovery thread can start bringing down all the modules.
1760 *
1761 * Return: None
1762 */
1763static void wma_shutdown_notifier_cb(void *priv)
1764{
1765 tp_wma_handle wma_handle = priv;
Abhishek Singh0ac37442018-05-02 21:07:57 +05301766 struct scheduler_msg msg = { 0 };
1767 QDF_STATUS status;
Prashanth Bhattae675ca72016-10-20 18:42:37 -07001768
Wu Gaod7dd6e42018-10-16 17:22:56 +08001769 ucfg_pmo_psoc_wakeup_host_event_received(wma_handle->psoc);
Rajeev Kumar64beb9f2018-10-10 11:23:51 -07001770 wmi_stop(wma_handle->wmi_handle);
Abhishek Singh0ac37442018-05-02 21:07:57 +05301771
Abhishek Singhac3df1e2019-09-18 12:33:39 +05301772 msg.bodyptr = wma_handle;
Abhishek Singh0ac37442018-05-02 21:07:57 +05301773 msg.callback = wma_cleanup_vdev_resp_and_hold_req;
Abhishek Singhac3df1e2019-09-18 12:33:39 +05301774 msg.flush_callback = wma_cleanup_vdev_resp_and_hold_req_flush_cb;
gaurank kathpalia00861f02018-08-28 19:16:12 +05301775 status = scheduler_post_message(QDF_MODULE_ID_WMA,
1776 QDF_MODULE_ID_WMA,
1777 QDF_MODULE_ID_TARGET_IF, &msg);
Prashanth Bhattae675ca72016-10-20 18:42:37 -07001778}
1779
Mukul Sharma5ff3c582016-09-12 15:23:35 +05301780struct wma_version_info g_wmi_version_info;
1781
Wen Gong3f003382018-05-14 14:26:37 +08001782#ifdef WLAN_FEATURE_MEMDUMP_ENABLE
Komal Seelam02d09342016-02-23 18:03:19 +05301783/**
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05301784 * wma_state_info_dump() - prints state information of wma layer
1785 * @buf: buffer pointer
1786 * @size: size of buffer to be filled
1787 *
1788 * This function is used to dump state information of wma layer
1789 *
1790 * Return: None
1791 */
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001792static void wma_state_info_dump(char **buf_ptr, uint16_t *size)
1793{
1794 uint8_t vdev_id;
1795 uint16_t len = 0;
1796 t_wma_handle *wma;
1797 char *buf = *buf_ptr;
1798 struct wma_txrx_node *iface;
1799 struct wake_lock_stats stats;
1800 struct wlan_objmgr_vdev *vdev;
Abhishek Ambure0b2ea322019-09-23 19:25:39 +05301801 uint32_t rate_flag;
1802 QDF_STATUS status;
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001803
1804 wma = cds_get_context(QDF_MODULE_ID_WMA);
1805 if (!wma) {
1806 WMA_LOGE("%s: WMA context is invald!", __func__);
1807 return;
1808 }
1809
Yeshwanth Sriram Guntukacbe61442018-08-23 18:08:44 +05301810 WMA_LOGD("%s: size of buffer: %d", __func__, *size);
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001811
1812 for (vdev_id = 0; vdev_id < wma->max_bssid; vdev_id++) {
1813 iface = &wma->interfaces[vdev_id];
Abhishek Ambure0b2ea322019-09-23 19:25:39 +05301814 vdev = iface->vdev;
1815 if (!vdev)
1816 continue;
1817
Abhishek Ambure0b2ea322019-09-23 19:25:39 +05301818 status = wma_get_vdev_rate_flag(iface->vdev, &rate_flag);
1819 if (QDF_IS_STATUS_ERROR(status))
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001820 continue;
1821
1822 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(wma->psoc,
1823 vdev_id, WLAN_LEGACY_WMA_ID);
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07001824 if (!vdev)
Yeshwanth Sriram Guntuka0e6f4462018-05-07 17:33:43 +05301825 continue;
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001826 ucfg_mc_cp_stats_get_vdev_wake_lock_stats(vdev, &stats);
1827 len += qdf_scnprintf(buf + len, *size - len,
1828 "\n"
1829 "vdev_id %d\n"
1830 "WoW Stats\n"
1831 "\tpno_match %u\n"
1832 "\tpno_complete %u\n"
1833 "\tgscan %u\n"
1834 "\tlow_rssi %u\n"
1835 "\trssi_breach %u\n"
1836 "\tucast %u\n"
1837 "\tbcast %u\n"
1838 "\ticmpv4 %u\n"
1839 "\ticmpv6 %u\n"
1840 "\tipv4_mcast %u\n"
1841 "\tipv6_mcast %u\n"
1842 "\tipv6_mcast_ra %u\n"
1843 "\tipv6_mcast_ns %u\n"
1844 "\tipv6_mcast_na %u\n"
1845 "\toem_response %u\n"
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001846 "dtimPeriod %d\n"
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001847 "chan_width %d\n"
1848 "vdev_active %d\n"
1849 "vdev_up %d\n"
1850 "aid %d\n"
1851 "rate_flags %d\n"
1852 "nss %d\n"
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001853 "nwType %d\n"
Abhishek Singh989f8b82019-09-07 16:55:44 +05301854 "tx_streams %d",
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001855 vdev_id,
1856 stats.pno_match_wake_up_count,
1857 stats.pno_complete_wake_up_count,
1858 stats.gscan_wake_up_count,
1859 stats.low_rssi_wake_up_count,
1860 stats.rssi_breach_wake_up_count,
1861 stats.ucast_wake_up_count,
1862 stats.bcast_wake_up_count,
1863 stats.icmpv4_count,
1864 stats.icmpv6_count,
1865 stats.ipv4_mcast_wake_up_count,
1866 stats.ipv6_mcast_wake_up_count,
1867 stats.ipv6_mcast_ra_stats,
1868 stats.ipv6_mcast_ns_stats,
1869 stats.ipv6_mcast_na_stats,
1870 stats.oem_response_wake_up_count,
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001871 iface->dtimPeriod,
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001872 iface->chan_width,
1873 iface->vdev_active,
1874 wma_is_vdev_up(vdev_id),
1875 iface->aid,
Abhishek Ambure0b2ea322019-09-23 19:25:39 +05301876 rate_flag,
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001877 iface->nss,
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001878 iface->nwType,
Abhishek Singh989f8b82019-09-07 16:55:44 +05301879 iface->tx_streams);
Yeshwanth Sriram Guntuka0e6f4462018-05-07 17:33:43 +05301880 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID);
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001881 }
1882
1883 *size -= len;
1884 *buf_ptr += len;
1885}
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05301886
1887/**
1888 * wma_register_debug_callback() - registration function for wma layer
1889 * to print wma state information
1890 */
1891static void wma_register_debug_callback(void)
1892{
1893 qdf_register_debug_callback(QDF_MODULE_ID_WMA, &wma_state_info_dump);
1894}
Wen Gong3f003382018-05-14 14:26:37 +08001895#else /* WLAN_FEATURE_MEMDUMP_ENABLE */
Wen Gongaa6d55d2018-04-26 16:33:21 +08001896static void wma_register_debug_callback(void)
1897{
1898}
Wen Gong3f003382018-05-14 14:26:37 +08001899#endif /* WLAN_FEATURE_MEMDUMP_ENABLE */
Frank Liu65b17d92016-11-23 15:58:44 +08001900/**
1901 * wma_register_tx_ops_handler() - register tx_ops of southbound
1902 * @tx_ops: tx_ops pointer in southbound
1903 *
1904 * Return: 0 on success, errno on failure
1905 */
1906static QDF_STATUS
1907wma_register_tx_ops_handler(struct wlan_lmac_if_tx_ops *tx_ops)
1908{
1909 /*
1910 * Assign tx_ops, it's up to UMAC modules to declare and define these
1911 * functions which are used to send wmi command to target.
1912 */
1913
Himanshu Agarwalce716f82016-12-21 19:07:54 +05301914 if (!tx_ops) {
1915 WMA_LOGE("%s: pointer to lmac if tx ops is NULL", __func__);
1916 return QDF_STATUS_E_INVAL;
1917 }
1918
1919 /* mgmt_txrx component's tx ops */
1920 tx_ops->mgmt_txrx_tx_ops.mgmt_tx_send = wma_mgmt_unified_cmd_send;
1921
Sravan Kumar Kairam0fbaefe2018-09-10 16:57:50 +05301922 /* mgmt txrx component nbuf op for nbuf dma unmap */
1923 tx_ops->mgmt_txrx_tx_ops.tx_drain_nbuf_op = wma_mgmt_nbuf_unmap_cb;
1924
Frank Liu65b17d92016-11-23 15:58:44 +08001925 return QDF_STATUS_SUCCESS;
1926}
1927
1928/**
1929 * wma_target_if_open() - Attach UMAC modules' interface with wmi layer
1930 * @wma_handle: wma handle
1931 *
1932 * Separate module defines below functions:
1933 * 1. tgt_wmi_<module>_<action> api sends wmi command, assigned to south bound
1934 * tx_ops function pointers;
1935 * 2. module's south dispatcher handles information from lower layer, assigned
1936 * to south bound rx_ops function pointers;
1937 * 3. wmi event handler deals with wmi event, extracts umac needed information,
1938 * and call rx_ops(module's dispatcher). It executes in tasklet context and
1939 * is up to dispatcher to decide the context to reside in tasklet or in
1940 * thread context.
1941 *
1942 * Return: None
1943 */
1944static void wma_target_if_open(tp_wma_handle wma_handle)
1945{
Selvaraj, Sridhar0672a122016-12-29 16:11:48 +05301946 struct wlan_objmgr_psoc *psoc = wma_handle->psoc;
Frank Liu65b17d92016-11-23 15:58:44 +08001947
1948 if (!psoc)
1949 return;
1950
Mukul Sharmadad267e2017-02-04 13:25:34 +05301951 wlan_global_lmac_if_set_txops_registration_cb(WLAN_DEV_OL,
1952 target_if_register_tx_ops);
1953 wlan_lmac_if_set_umac_txops_registration_cb(
1954 wma_register_tx_ops_handler);
1955 wlan_global_lmac_if_open(psoc);
Frank Liu65b17d92016-11-23 15:58:44 +08001956
Frank Liu65b17d92016-11-23 15:58:44 +08001957}
1958
1959/**
1960 * wma_target_if_close() - Detach UMAC modules' interface with wmi layer
1961 * @wma_handle: wma handle
1962 *
1963 * Return: None
1964 */
1965static void wma_target_if_close(tp_wma_handle wma_handle)
1966{
Selvaraj, Sridhar0672a122016-12-29 16:11:48 +05301967 struct wlan_objmgr_psoc *psoc = wma_handle->psoc;
Frank Liu65b17d92016-11-23 15:58:44 +08001968
1969 if (!psoc)
1970 return;
1971
Mukul Sharmadad267e2017-02-04 13:25:34 +05301972 wlan_global_lmac_if_close(psoc);
Frank Liu65b17d92016-11-23 15:58:44 +08001973}
Frank Liu65b17d92016-11-23 15:58:44 +08001974
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05301975/**
Rajeev Kumarda2444c2017-01-10 22:42:07 -08001976 * wma_legacy_service_ready_event_handler() - legacy (ext)service ready handler
1977 * @event_id: event_id
1978 * @handle: wma handle
1979 * @event_data: event data
1980 * @length: event length
1981 *
1982 * Return: 0 for success, negative error code for failure
1983 */
1984static int wma_legacy_service_ready_event_handler(uint32_t event_id,
1985 void *handle,
1986 uint8_t *event_data,
1987 uint32_t length)
1988{
Arunk Khandavallia6305a32018-01-25 11:19:18 +05301989 switch (event_id) {
1990 case wmi_service_ready_event_id:
Rajeev Kumarda2444c2017-01-10 22:42:07 -08001991 return wma_rx_service_ready_event(handle, event_data, length);
Arunk Khandavallia6305a32018-01-25 11:19:18 +05301992 case wmi_service_ready_ext_event_id:
Rajeev Kumarda2444c2017-01-10 22:42:07 -08001993 return wma_rx_service_ready_ext_event(handle, event_data,
1994 length);
Arunk Khandavallia6305a32018-01-25 11:19:18 +05301995 case wmi_ready_event_id:
1996 return wma_rx_ready_event(handle, event_data, length);
1997 default:
1998 WMA_LOGE("Legacy callback invoked with invalid event_id:%d",
1999 event_id);
Rajeev Kumarda2444c2017-01-10 22:42:07 -08002000 QDF_BUG(0);
Arunk Khandavallia6305a32018-01-25 11:19:18 +05302001 }
Rajeev Kumarda2444c2017-01-10 22:42:07 -08002002
2003 return 0;
2004}
Mukul Sharmac3e7a782017-02-03 12:16:11 +05302005
2006/**
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002007 * wma_flush_complete_evt_handler() - FW log flush complete event handler
2008 * @handle: WMI handle
2009 * @event: Event recevied from FW
2010 * @len: Length of the event
2011 *
2012 */
2013static int wma_flush_complete_evt_handler(void *handle,
2014 u_int8_t *event,
2015 u_int32_t len)
2016{
2017 QDF_STATUS status;
2018 tp_wma_handle wma = (tp_wma_handle) handle;
2019
2020 WMI_DEBUG_MESG_FLUSH_COMPLETE_EVENTID_param_tlvs *param_buf;
2021 wmi_debug_mesg_flush_complete_fixed_param *wmi_event;
Poddar, Siddarthc2c08142017-09-13 17:49:56 +05302022 wmi_debug_mesg_fw_data_stall_param *data_stall_event;
2023 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
2024 uint8_t *buf_ptr;
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002025 uint32_t reason_code;
2026
2027 param_buf = (WMI_DEBUG_MESG_FLUSH_COMPLETE_EVENTID_param_tlvs *) event;
2028 if (!param_buf) {
2029 WMA_LOGE("Invalid log flush complete event buffer");
2030 return QDF_STATUS_E_FAILURE;
2031 }
2032
2033 wmi_event = param_buf->fixed_param;
2034 reason_code = wmi_event->reserved0;
Rajeev Kumardcce8092018-05-02 15:48:17 -07002035 WMA_LOGD("Received reason code %d from FW", reason_code);
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002036
Poddar, Siddarthc2c08142017-09-13 17:49:56 +05302037 buf_ptr = (uint8_t *)wmi_event;
2038 buf_ptr = buf_ptr + sizeof(wmi_debug_mesg_flush_complete_fixed_param) +
2039 WMI_TLV_HDR_SIZE;
2040 data_stall_event = (wmi_debug_mesg_fw_data_stall_param *) buf_ptr;
2041
2042 if (((data_stall_event->tlv_header & 0xFFFF0000) >> 16 ==
2043 WMITLV_TAG_STRUC_wmi_debug_mesg_fw_data_stall_param)) {
2044 /**
2045 * Log data stall info received from FW:
2046 *
2047 * Possible data stall recovery types:
2048 * WLAN_DBG_DATA_STALL_RECOVERY_CONNECT_DISCONNECT
2049 * WLAN_DBG_DATA_STALL_RECOVERY_CONNECT_MAC_PHY_RESET
2050 * WLAN_DBG_DATA_STALL_RECOVERY_CONNECT_PDR
2051 *
2052 * Possible data stall event types:
2053 * WLAN_DBG_DATA_STALL_VDEV_PAUSE
2054 * WLAN_DBG_DATA_STALL_HWSCHED_CMD_FILTER
2055 * WLAN_DBG_DATA_STALL_HWSCHED_CMD_FLUSH
2056 * WLAN_DBG_DATA_STALL_RX_REFILL_FAILED
2057 * WLAN_DBG_DATA_STALL_RX_FCS_LEN_ERROR
2058 *
2059 * reason_code1:
2060 * The information stored in reason_code1 varies based on the
2061 * data stall type values:
2062 *
2063 * data_stall_type | reason_code1
2064 * -----------------------------------------------------
2065 * HWSCHED_CMD_FLUSH | flush req reason (0-40)
2066 * RX_REFILL_FAILED | ring_id (0-7)
2067 * RX_FCS_LEN_ERROR | exact error type
2068 *
2069 * reasone_code2:
2070 * on which tid/hwq stall happened
2071 *
2072 */
2073 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG,
2074 "Data Stall event:");
2075 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG,
2076 "data_stall_type: %x vdev_id_bitmap: %x reason_code1: %x reason_code2: %x recovery_type: %x ",
2077 data_stall_event->data_stall_type,
2078 data_stall_event->vdev_id_bitmap,
2079 data_stall_event->reason_code1,
2080 data_stall_event->reason_code2,
2081 data_stall_event->recovery_type);
2082
2083 cdp_post_data_stall_event(soc,
2084 DATA_STALL_LOG_INDICATOR_FIRMWARE,
2085 data_stall_event->data_stall_type,
Rakesh Pillai6a36b0a2019-09-06 16:30:05 +05302086 OL_TXRX_PDEV_ID,
Poddar, Siddarthc2c08142017-09-13 17:49:56 +05302087 data_stall_event->vdev_id_bitmap,
2088 data_stall_event->recovery_type);
2089 }
2090
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002091 /*
2092 * reason_code = 0; Flush event in response to flush command
2093 * reason_code = other value; Asynchronous flush event for fatal events
2094 */
2095 if (!reason_code && (cds_is_log_report_in_progress() == false)) {
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08002096 WMA_LOGD("Received WMI flush event without sending CMD");
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002097 return -EINVAL;
2098 } else if (!reason_code && cds_is_log_report_in_progress() == true) {
2099 /* Flush event in response to flush command */
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08002100 WMA_LOGD("Received WMI flush event in response to flush CMD");
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002101 status = qdf_mc_timer_stop(&wma->log_completion_timer);
2102 if (status != QDF_STATUS_SUCCESS)
2103 WMA_LOGE("Failed to stop the log completion timeout");
2104 cds_logging_set_fw_flush_complete();
Zhu Jianminb639e9b2017-10-26 19:09:12 +08002105 return QDF_STATUS_SUCCESS;
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002106 } else if (reason_code && cds_is_log_report_in_progress() == false) {
2107 /* Asynchronous flush event for fatal events */
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002108 status = cds_set_log_completion(WLAN_LOG_TYPE_FATAL,
2109 WLAN_LOG_INDICATOR_FIRMWARE,
2110 reason_code, false);
2111 if (QDF_STATUS_SUCCESS != status) {
2112 WMA_LOGE("%s: Failed to set log trigger params",
2113 __func__);
2114 return QDF_STATUS_E_FAILURE;
2115 }
2116 cds_logging_set_fw_flush_complete();
2117 return status;
2118 } else {
2119 /* Asynchronous flush event for fatal event,
2120 * but, report in progress already
2121 */
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08002122 WMA_LOGD("%s: Bug report already in progress - dropping! type:%d, indicator=%d reason_code=%d",
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002123 __func__, WLAN_LOG_TYPE_FATAL,
2124 WLAN_LOG_INDICATOR_FIRMWARE, reason_code);
2125 return QDF_STATUS_E_FAILURE;
2126 }
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002127 /* Asynchronous flush event for fatal event,
2128 * but, report in progress already
2129 */
2130 WMA_LOGW("%s: Bug report already in progress - dropping! type:%d, indicator=%d reason_code=%d",
2131 __func__, WLAN_LOG_TYPE_FATAL,
2132 WLAN_LOG_INDICATOR_FIRMWARE, reason_code);
2133 return QDF_STATUS_E_FAILURE;
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002134}
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07002135
2136#ifdef WLAN_CONV_SPECTRAL_ENABLE
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002137/**
2138 * wma_extract_single_phyerr_spectral() - extract single phy error from event
2139 * @handle: wma handle
2140 * @param evt_buf: pointer to event buffer
2141 * @param datalen: data length of event buffer
2142 * @param buf_offset: Pointer to hold value of current event buffer offset
2143 * post extraction
2144 * @param phyerr: Pointer to hold phyerr
2145 *
2146 * Return: QDF_STATUS
2147 */
2148static QDF_STATUS wma_extract_single_phyerr_spectral(void *handle,
2149 void *evt_buf,
2150 uint16_t datalen, uint16_t *buf_offset,
2151 wmi_host_phyerr_t *phyerr)
2152{
2153 wmi_single_phyerr_rx_event *ev;
2154 int n = *buf_offset;
2155
2156 ev = (wmi_single_phyerr_rx_event *)((uint8_t *)evt_buf + n);
2157
2158 if (n < datalen) {
2159 /* ensure there's at least space for the header */
2160 if ((datalen - n) < sizeof(ev->hdr)) {
2161 WMA_LOGE("%s: not enough space? (datalen=%d, n=%d, hdr=%zu bytes",
2162 __func__, datalen, n, sizeof(ev->hdr));
2163 return QDF_STATUS_E_FAILURE;
2164 }
2165
2166 phyerr->bufp = ev->bufp;
2167 phyerr->buf_len = ev->hdr.buf_len;
2168
2169 /*
2170 * Sanity check the buffer length of the event against
2171 * what we currently have.
2172 *
2173 * Since buf_len is 32 bits, we check if it overflows
2174 * a large 32 bit value. It's not 0x7fffffff because
2175 * we increase n by (buf_len + sizeof(hdr)), which would
2176 * in itself cause n to overflow.
2177 *
2178 * If "int" is 64 bits then this becomes a moot point.
2179 */
2180 if (ev->hdr.buf_len > 0x7f000000) {
2181 WMA_LOGE("%s: buf_len is garbage? (0x%x)",
2182 __func__, ev->hdr.buf_len);
2183 return QDF_STATUS_E_FAILURE;
2184 }
2185 if (n + ev->hdr.buf_len > datalen) {
2186 WMA_LOGE("%s: buf_len exceeds available space n=%d, buf_len=%d, datalen=%d",
2187 __func__, n, ev->hdr.buf_len, datalen);
2188 return QDF_STATUS_E_FAILURE;
2189 }
2190
2191 phyerr->phy_err_code = WMI_UNIFIED_PHYERRCODE_GET(&ev->hdr);
2192 phyerr->tsf_timestamp = ev->hdr.tsf_timestamp;
2193
2194#ifdef DEBUG_SPECTRAL_SCAN
2195 WMA_LOGD("%s: len=%d, tsf=0x%08x, rssi = 0x%x/0x%x/0x%x/0x%x, comb rssi = 0x%x, phycode=%d",
2196 __func__,
2197 ev->hdr.buf_len,
2198 ev->hdr.tsf_timestamp,
2199 ev->hdr.rssi_chain0,
2200 ev->hdr.rssi_chain1,
2201 ev->hdr.rssi_chain2,
2202 ev->hdr.rssi_chain3,
2203 WMI_UNIFIED_RSSI_COMB_GET(&ev->hdr),
2204 phyerr->phy_err_code);
2205
2206 /*
2207 * For now, unroll this loop - the chain 'value' field isn't
2208 * a variable but glued together into a macro field definition.
2209 * Grr. :-)
2210 */
2211 WMA_LOGD("%s: chain 0: raw=0x%08x; pri20=%d sec20=%d sec40=%d sec80=%d",
2212 __func__,
2213 ev->hdr.rssi_chain0,
2214 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 0, PRI20),
2215 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 0, SEC20),
2216 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 0, SEC40),
2217 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 0, SEC80));
2218
2219 WMA_LOGD("%s: chain 1: raw=0x%08x: pri20=%d sec20=%d sec40=%d sec80=%d",
2220 __func__,
2221 ev->hdr.rssi_chain1,
2222 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 1, PRI20),
2223 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 1, SEC20),
2224 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 1, SEC40),
2225 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 1, SEC80));
2226
2227 WMA_LOGD("%s: chain 2: raw=0x%08x: pri20=%d sec20=%d sec40=%d sec80=%d",
2228 __func__,
2229 ev->hdr.rssi_chain2,
2230 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 2, PRI20),
2231 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 2, SEC20),
2232 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 2, SEC40),
2233 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 2, SEC80));
2234
2235 WMA_LOGD("%s: chain 3: raw=0x%08x: pri20=%d sec20=%d sec40=%d sec80=%d",
2236 __func__,
2237 ev->hdr.rssi_chain3,
2238 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 3, PRI20),
2239 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 3, SEC20),
2240 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 3, SEC40),
2241 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 3, SEC80));
2242
2243
2244 WMA_LOGD("%s: freq_info_1=0x%08x, freq_info_2=0x%08x",
2245 __func__, ev->hdr.freq_info_1, ev->hdr.freq_info_2);
2246
2247 /*
2248 * The NF chain values are signed and are negative - hence
2249 * the cast evilness.
2250 */
2251 WMA_LOGD("%s: nfval[1]=0x%08x, nfval[2]=0x%08x, nf=%d/%d/%d/%d, freq1=%d, freq2=%d, cw=%d",
2252 __func__,
2253 ev->hdr.nf_list_1,
2254 ev->hdr.nf_list_2,
2255 (int) WMI_UNIFIED_NF_CHAIN_GET(&ev->hdr, 0),
2256 (int) WMI_UNIFIED_NF_CHAIN_GET(&ev->hdr, 1),
2257 (int) WMI_UNIFIED_NF_CHAIN_GET(&ev->hdr, 2),
2258 (int) WMI_UNIFIED_NF_CHAIN_GET(&ev->hdr, 3),
2259 WMI_UNIFIED_FREQ_INFO_GET(&ev->hdr, 1),
2260 WMI_UNIFIED_FREQ_INFO_GET(&ev->hdr, 2),
2261 WMI_UNIFIED_CHWIDTH_GET(&ev->hdr));
2262#endif
2263
2264 /*
2265 * If required, pass spectral events to the spectral module
2266 */
2267 if (ev->hdr.buf_len > 0) {
2268
2269 /* Initialize the NF values to Zero. */
2270 phyerr->rf_info.noise_floor[0] =
2271 WMI_UNIFIED_NF_CHAIN_GET(&ev->hdr, 0);
2272 phyerr->rf_info.noise_floor[1] =
2273 WMI_UNIFIED_NF_CHAIN_GET(&ev->hdr, 1);
2274 phyerr->rf_info.noise_floor[2] =
2275 WMI_UNIFIED_NF_CHAIN_GET(&ev->hdr, 2);
2276 phyerr->rf_info.noise_floor[3] =
2277 WMI_UNIFIED_NF_CHAIN_GET(&ev->hdr, 3);
2278
2279 /* populate the rf info */
2280 phyerr->rf_info.rssi_comb =
2281 WMI_UNIFIED_RSSI_COMB_GET(&ev->hdr);
2282
2283 /* Need to unroll loop due to macro
2284 * constraints chain 0
2285 */
2286 phyerr->rf_info.pc_rssi_info[0].rssi_pri20 =
2287 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 0, PRI20);
2288 phyerr->rf_info.pc_rssi_info[0].rssi_sec20 =
2289 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 0, SEC20);
2290 phyerr->rf_info.pc_rssi_info[0].rssi_sec40 =
2291 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 0, SEC40);
2292 phyerr->rf_info.pc_rssi_info[0].rssi_sec80 =
2293 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 0, SEC80);
2294
2295 /* chain 1 */
2296 phyerr->rf_info.pc_rssi_info[1].rssi_pri20 =
2297 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 1, PRI20);
2298 phyerr->rf_info.pc_rssi_info[1].rssi_sec20 =
2299 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 1, SEC20);
2300 phyerr->rf_info.pc_rssi_info[1].rssi_sec40 =
2301 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 1, SEC40);
2302 phyerr->rf_info.pc_rssi_info[1].rssi_sec80 =
2303 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 1, SEC80);
2304
2305 /* chain 2 */
2306 phyerr->rf_info.pc_rssi_info[2].rssi_pri20 =
2307 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 2, PRI20);
2308 phyerr->rf_info.pc_rssi_info[2].rssi_sec20 =
2309 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 2, SEC20);
2310 phyerr->rf_info.pc_rssi_info[2].rssi_sec40 =
2311 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 2, SEC40);
2312 phyerr->rf_info.pc_rssi_info[2].rssi_sec80 =
2313 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 2, SEC80);
2314
2315 /* chain 3 */
2316 phyerr->rf_info.pc_rssi_info[3].rssi_pri20 =
2317 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 3, PRI20);
2318 phyerr->rf_info.pc_rssi_info[3].rssi_sec20 =
2319 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 3, SEC20);
2320 phyerr->rf_info.pc_rssi_info[3].rssi_sec40 =
2321 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 3, SEC40);
2322 phyerr->rf_info.pc_rssi_info[3].rssi_sec80 =
2323 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 3, SEC80);
2324
2325 phyerr->chan_info.center_freq1 =
2326 WMI_UNIFIED_FREQ_INFO_GET(&ev->hdr, 1);
2327 phyerr->chan_info.center_freq2 =
2328 WMI_UNIFIED_FREQ_INFO_GET(&ev->hdr, 2);
2329
2330 }
2331
2332 /*
2333 * Advance the buffer pointer to the next PHY error.
2334 * buflen is the length of this payload, so we need to
2335 * advance past the current header _AND_ the payload.
2336 */
2337 n += sizeof(*ev) + ev->hdr.buf_len;
2338 }
2339 *buf_offset += n;
2340
2341 return QDF_STATUS_SUCCESS;
2342}
2343
2344/**
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002345 * spectral_phyerr_event_handler() - spectral phyerr event handler
2346 * @handle: wma handle
2347 * @data: data buffer
2348 * @datalen: buffer length
2349 *
2350 * Return: QDF_STATUS
2351 */
2352static QDF_STATUS spectral_phyerr_event_handler(void *handle,
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07002353 uint8_t *data,
2354 uint32_t datalen)
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002355{
2356 tp_wma_handle wma = (tp_wma_handle) handle;
2357 QDF_STATUS status = QDF_STATUS_SUCCESS;
2358 uint16_t buf_offset, event_buf_len = 0;
2359 wmi_single_phyerr_rx_event *ev;
2360 wmi_host_phyerr_t phyerr;
2361 struct target_if_spectral_rfqual_info rfqual_info;
2362 struct target_if_spectral_chan_info chan_info;
2363 struct target_if_spectral_acs_stats acs_stats;
2364
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07002365 if (!wma) {
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002366 WMA_LOGE("%s:wma handle is NULL", __func__);
2367 return QDF_STATUS_E_FAILURE;
2368 }
2369
2370 memset(&phyerr, 0, sizeof(wmi_host_phyerr_t));
Arif Hussaind54b62c2018-03-01 13:31:37 -08002371 status = wmi_extract_comb_phyerr(wma->wmi_handle, data, datalen,
2372 &buf_offset, &phyerr);
2373 if (QDF_IS_STATUS_ERROR(status)) {
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002374 WMA_LOGE("%s: extract comb phyerr failed", __func__);
2375 return QDF_STATUS_E_FAILURE;
2376 }
2377
2378 ev = (wmi_single_phyerr_rx_event *)phyerr.bufp;
2379 event_buf_len = phyerr.buf_len;
2380 /* Loop over the bufp, extracting out phyerrors */
2381 buf_offset = 0;
2382 while (buf_offset < event_buf_len) {
2383 if (wma_extract_single_phyerr_spectral(handle, ev,
2384 event_buf_len, &buf_offset, &phyerr)) {
2385 WMA_LOGE("%s: extract single phy err failed", __func__);
2386 return QDF_STATUS_E_FAILURE;
2387 }
2388
2389 if (phyerr.buf_len > 0) {
2390 if (sizeof(phyerr.rf_info) > sizeof(rfqual_info))
2391 qdf_mem_copy(&rfqual_info, &phyerr.rf_info,
2392 sizeof(rfqual_info));
2393 else
2394 qdf_mem_copy(&rfqual_info, &phyerr.rf_info,
2395 sizeof(phyerr.rf_info));
2396
2397 if (sizeof(phyerr.chan_info) > sizeof(chan_info))
2398 qdf_mem_copy(&chan_info, &phyerr.chan_info,
2399 sizeof(chan_info));
2400 else
2401 qdf_mem_copy(&chan_info, &phyerr.chan_info,
2402 sizeof(phyerr.chan_info));
2403
2404 target_if_spectral_process_phyerr(wma->pdev, phyerr.bufp,
2405 phyerr.buf_len,
2406 &rfqual_info,
2407 &chan_info,
2408 phyerr.tsf64,
2409 &acs_stats);
2410 }
2411 }
2412
2413 return status;
2414}
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07002415#else
Chaoli Zhou5d6bad12018-06-13 14:29:33 +08002416static QDF_STATUS
2417wma_extract_single_phyerr_spectral(void *handle, void *evt_buf,
2418 uint16_t datalen,
2419 uint16_t *buf_offset,
2420 wmi_host_phyerr_t *phyerr)
2421{
2422 return QDF_STATUS_SUCCESS;
2423}
2424
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07002425static QDF_STATUS spectral_phyerr_event_handler(void *handle,
2426 uint8_t *data, uint32_t datalen)
2427{
2428 return QDF_STATUS_SUCCESS;
2429}
2430#endif
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002431
Arif Hussainf63f7a32017-08-22 12:49:42 -07002432/**
Arif Hussaind54b62c2018-03-01 13:31:37 -08002433 * dfs_phyerr_event_handler() - dfs phyerr event handler
2434 * @handle: wma handle
2435 * @data: data buffer
2436 * @datalen: buffer length
2437 * @fulltsf: 64 bit event TSF
2438 *
2439 * Function to process DFS phy errors.
2440 *
2441 * Return: QDF_STATUS
2442 */
2443static QDF_STATUS dfs_phyerr_event_handler(tp_wma_handle handle,
2444 uint8_t *data,
2445 uint32_t datalen,
2446 uint64_t fulltsf)
2447{
2448 QDF_STATUS status = QDF_STATUS_SUCCESS;
2449 struct wlan_lmac_if_dfs_rx_ops *dfs_rx_ops;
2450 wmi_host_phyerr_t phyerr;
2451 int8_t rssi_comb;
2452 uint16_t buf_offset;
2453
2454 if (!handle->psoc) {
2455 WMA_LOGE("%s: psoc is null", __func__);
2456 return QDF_STATUS_E_INVAL;
2457 }
2458
2459 dfs_rx_ops = wlan_lmac_if_get_dfs_rx_ops(handle->psoc);
2460 if (!dfs_rx_ops) {
2461 WMA_LOGE("%s: dfs_rx_ops is null", __func__);
2462 return QDF_STATUS_E_INVAL;
2463 }
2464
2465 if (!dfs_rx_ops->dfs_process_phyerr) {
2466 WMA_LOGE("%s: dfs_process_phyerr handler is null", __func__);
2467 return QDF_STATUS_E_INVAL;
2468 }
2469
2470 if (!handle->pdev) {
2471 WMA_LOGE("%s: pdev is null", __func__);
2472 return -EINVAL;
2473 }
2474
2475 buf_offset = 0;
2476 while (buf_offset < datalen) {
2477 status = wmi_extract_single_phyerr(handle->wmi_handle, data, datalen,
2478 &buf_offset, &phyerr);
2479 if (QDF_IS_STATUS_ERROR(status)) {
2480 /* wmi_extract_single_phyerr has logs */
2481 return status;
2482 }
2483
2484 rssi_comb = phyerr.rf_info.rssi_comb & 0xFF;
2485 if (phyerr.buf_len > 0)
2486 dfs_rx_ops->dfs_process_phyerr(handle->pdev,
2487 &phyerr.bufp[0],
2488 phyerr.buf_len,
2489 rssi_comb,
2490 rssi_comb,
2491 phyerr.tsf_timestamp,
2492 fulltsf);
2493 }
2494
2495 return QDF_STATUS_SUCCESS;
2496}
2497
2498/**
Arif Hussainf63f7a32017-08-22 12:49:42 -07002499 * wma_unified_phyerr_rx_event_handler() - phyerr event handler
2500 * @handle: wma handle
2501 * @data: data buffer
2502 * @datalen: buffer length
2503 *
2504 * WMI Handler for WMI_PHYERR_EVENTID event from firmware.
2505 * This handler is currently handling DFS and spectral scan
2506 * phy errors.
2507 *
2508 * Return: 0 for success, other value for failure
2509 */
2510static int wma_unified_phyerr_rx_event_handler(void *handle,
Arif Hussaind54b62c2018-03-01 13:31:37 -08002511 uint8_t *data,
2512 uint32_t datalen)
2513{
Arif Hussainf63f7a32017-08-22 12:49:42 -07002514 /* phyerr handling is moved to cmn project
2515 * As WIN still uses handler registration in non-cmn code.
2516 * need complete testing of non offloaded DFS code before we enable
2517 * it in cmn code.
2518 **/
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002519 tp_wma_handle wma = (tp_wma_handle) handle;
2520 QDF_STATUS status = QDF_STATUS_SUCCESS;
2521 wmi_host_phyerr_t phyerr;
2522 uint16_t buf_offset = 0;
Chaoli Zhou5d6bad12018-06-13 14:29:33 +08002523 wmi_single_phyerr_rx_event *ev;
2524 uint16_t event_buf_len = 0;
2525 wmi_host_phyerr_t phyerr2;
2526 bool spectralscan = false;
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002527
Arif Hussaind54b62c2018-03-01 13:31:37 -08002528 if (!wma) {
2529 WMA_LOGE("%s: wma handle is null", __func__);
2530 return -EINVAL;
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002531 }
2532
2533 /* sanity check on data length */
Arif Hussaind54b62c2018-03-01 13:31:37 -08002534 status = wmi_extract_comb_phyerr(wma->wmi_handle, data, datalen,
2535 &buf_offset, &phyerr);
2536 if (QDF_IS_STATUS_ERROR(status)) {
2537 WMA_LOGE("%s: extract phyerr failed: %d", __func__, status);
2538 return qdf_status_to_os_return(status);
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002539 }
Chaoli Zhou5d6bad12018-06-13 14:29:33 +08002540 ev = (wmi_single_phyerr_rx_event *)phyerr.bufp;
2541 event_buf_len = phyerr.buf_len;
2542 /* Loop over the bufp, extracting out phyerrors */
2543 buf_offset = 0;
2544 while (ev && (buf_offset < event_buf_len)) {
2545 if (wma_extract_single_phyerr_spectral(handle, ev,
2546 event_buf_len,
2547 &buf_offset,
2548 &phyerr2)) {
2549 WMA_LOGE("%s: extract single phy err failed", __func__);
2550 return qdf_status_to_os_return(QDF_STATUS_E_FAILURE);
2551 }
2552 if ((buf_offset != 0) && (phyerr2.phy_err_code == 0x26 ||
2553 phyerr2.phy_err_code == 0x24)) {
2554 spectralscan = true;
2555 } else {
2556 break;
2557 }
2558 }
2559 if (spectralscan) {
2560 status = spectral_phyerr_event_handler(wma, data, datalen);
2561 return qdf_status_to_os_return(status);
2562 }
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002563 /* handle different PHY Error conditions */
2564 if (((phyerr.phy_err_mask0 & (WMI_PHY_ERROR_MASK0_RADAR |
Arif Hussaind54b62c2018-03-01 13:31:37 -08002565 WMI_PHY_ERROR_MASK0_FALSE_RADAR_EXT |
2566 WMI_PHY_ERROR_MASK0_SPECTRAL_SCAN)) == 0)) {
2567 WMA_LOGD("%s: Unknown phy error event", __func__);
2568 return -EINVAL;
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002569 }
2570
2571 /* Handle Spectral or DFS PHY Error */
2572 if (phyerr.phy_err_mask0 & (WMI_PHY_ERROR_MASK0_RADAR |
Arif Hussaind54b62c2018-03-01 13:31:37 -08002573 WMI_PHY_ERROR_MASK0_FALSE_RADAR_EXT)) {
2574 if (wma->is_dfs_offloaded) {
2575 WMA_LOGD("%s: Unexpected phy error, dfs offloaded",
2576 __func__);
2577 return -EINVAL;
2578 }
2579 status = dfs_phyerr_event_handler(wma,
2580 phyerr.bufp,
2581 phyerr.buf_len,
2582 phyerr.tsf64);
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002583 } else if (phyerr.phy_err_mask0 & (WMI_PHY_ERROR_MASK0_SPECTRAL_SCAN |
Arif Hussaind54b62c2018-03-01 13:31:37 -08002584 WMI_PHY_ERROR_MASK0_FALSE_RADAR_EXT)) {
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002585 status = spectral_phyerr_event_handler(wma, data, datalen);
2586 }
Arif Hussaind54b62c2018-03-01 13:31:37 -08002587
2588 return qdf_status_to_os_return(status);
Arif Hussainf63f7a32017-08-22 12:49:42 -07002589}
2590
Dustin Brownec2c92e2017-07-26 11:13:49 -07002591void wma_vdev_init(struct wma_txrx_node *vdev)
2592{
Rajeev Kumar155a3e42017-10-10 15:31:17 -07002593 qdf_wake_lock_create(&vdev->vdev_set_key_wakelock, "vdev_set_key");
Alan Chen34250b72019-08-12 16:06:35 -07002594 qdf_runtime_lock_init(&vdev->vdev_set_key_runtime_wakelock);
Naveen Rawatd7734142017-10-27 10:02:40 -07002595 vdev->is_waiting_for_key = false;
Dustin Brownec2c92e2017-07-26 11:13:49 -07002596}
2597
2598void wma_vdev_deinit(struct wma_txrx_node *vdev)
2599{
Abhinav Kumar0a846132018-08-09 11:49:46 +05302600 struct beacon_info *bcn;
2601 tp_wma_handle wma_handle;
2602
2603 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
2604 /* validate the wma_handle */
2605 if (!wma_handle) {
2606 WMA_LOGE("%s: Invalid wma handle", __func__);
2607 return;
2608 }
2609
2610 bcn = vdev->beacon;
2611 if (bcn) {
2612 if (bcn->dma_mapped)
2613 qdf_nbuf_unmap_single(wma_handle->qdf_dev,
2614 bcn->buf, QDF_DMA_TO_DEVICE);
2615 qdf_nbuf_free(bcn->buf);
2616 qdf_mem_free(bcn);
2617 vdev->beacon = NULL;
2618 }
2619
Vevek Venkatesan0ac759f2019-10-03 04:14:29 +05302620 if (vdev->vdev_active == true)
2621 vdev->vdev_active = false;
2622
Abhinav Kumar0a846132018-08-09 11:49:46 +05302623 if (vdev->addBssStaContext) {
2624 qdf_mem_free(vdev->addBssStaContext);
2625 vdev->addBssStaContext = NULL;
2626 }
2627
2628 if (vdev->staKeyParams) {
2629 qdf_mem_free(vdev->staKeyParams);
2630 vdev->staKeyParams = NULL;
2631 }
2632
Abhinav Kumar0a846132018-08-09 11:49:46 +05302633 if (vdev->psnr_req) {
2634 qdf_mem_free(vdev->psnr_req);
2635 vdev->psnr_req = NULL;
2636 }
2637
2638 if (vdev->rcpi_req) {
2639 qdf_mem_free(vdev->rcpi_req);
2640 vdev->rcpi_req = NULL;
2641 }
2642
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +05302643 if (vdev->roam_scan_stats_req) {
2644 struct sir_roam_scan_stats *req;
2645
2646 req = vdev->roam_scan_stats_req;
2647 vdev->roam_scan_stats_req = NULL;
2648 qdf_mem_free(req);
2649 }
2650
Abhinav Kumar0a846132018-08-09 11:49:46 +05302651 if (vdev->roam_synch_frame_ind.bcn_probe_rsp) {
2652 qdf_mem_free(vdev->roam_synch_frame_ind.bcn_probe_rsp);
2653 vdev->roam_synch_frame_ind.bcn_probe_rsp = NULL;
2654 }
2655
2656 if (vdev->roam_synch_frame_ind.reassoc_req) {
2657 qdf_mem_free(vdev->roam_synch_frame_ind.reassoc_req);
2658 vdev->roam_synch_frame_ind.reassoc_req = NULL;
2659 }
2660
2661 if (vdev->roam_synch_frame_ind.reassoc_rsp) {
2662 qdf_mem_free(vdev->roam_synch_frame_ind.reassoc_rsp);
2663 vdev->roam_synch_frame_ind.reassoc_rsp = NULL;
2664 }
2665
Alan Chen34250b72019-08-12 16:06:35 -07002666 qdf_runtime_lock_deinit(&vdev->vdev_set_key_runtime_wakelock);
Rajeev Kumar155a3e42017-10-10 15:31:17 -07002667 qdf_wake_lock_destroy(&vdev->vdev_set_key_wakelock);
Naveen Rawatd7734142017-10-27 10:02:40 -07002668 vdev->is_waiting_for_key = false;
Dustin Brownec2c92e2017-07-26 11:13:49 -07002669}
2670
Kabilan Kannanfc3a8c02018-02-21 13:36:29 -08002671/**
2672 * wma_wmi_stop() - generic function to block WMI commands
2673 * @return: None
2674 */
2675void wma_wmi_stop(void)
2676{
2677 tp_wma_handle wma_handle;
2678
2679 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Pragaspathi Thilagarajbc5a34b2018-10-09 18:35:45 +05302680 if ((!wma_handle) || (!wma_handle->wmi_handle)) {
Kabilan Kannanfc3a8c02018-02-21 13:36:29 -08002681 QDF_TRACE(QDF_MODULE_ID_WMI, QDF_TRACE_LEVEL_INFO,
Pragaspathi Thilagarajbc5a34b2018-10-09 18:35:45 +05302682 "wma_handle or wmi_handle is NULL\n");
Kabilan Kannanfc3a8c02018-02-21 13:36:29 -08002683 return;
2684 }
2685 wmi_stop(wma_handle->wmi_handle);
2686}
2687
Liangwei Dong03e080c2019-07-02 17:06:39 +08002688#ifdef WLAN_WMI_BCN
Harprit Chhabada98225f62018-12-11 15:29:55 -08002689static QDF_STATUS
2690wma_register_swba_events(wmi_unified_t wmi_handle)
2691{
2692 QDF_STATUS status;
2693
2694 status = wmi_unified_register_event_handler(wmi_handle,
2695 wmi_host_swba_event_id,
2696 wma_beacon_swba_handler,
2697 WMA_RX_SERIALIZER_CTX);
2698
2699 return status;
2700}
2701#else
2702static QDF_STATUS wma_register_swba_events(wmi_unified_t wmi_handle)
2703{
2704 return QDF_STATUS_SUCCESS;
2705}
2706#endif
2707
Nachiket Kukade177b5b02018-05-22 20:52:17 +05302708#ifdef FEATURE_WLAN_APF
2709static void wma_register_apf_events(tp_wma_handle wma_handle)
2710{
2711 if (!wma_handle) {
2712 QDF_TRACE(QDF_MODULE_ID_WMI, QDF_TRACE_LEVEL_INFO,
2713 "wma_handle is NULL\n");
2714 return;
2715 }
2716
2717 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2718 wmi_apf_capability_info_event_id,
2719 wma_get_apf_caps_event_handler,
2720 WMA_RX_SERIALIZER_CTX);
2721 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2722 wmi_apf_get_vdev_work_memory_resp_event_id,
2723 wma_apf_read_work_memory_event_handler,
2724 WMA_RX_SERIALIZER_CTX);
2725}
2726#else /* FEATURE_WLAN_APF */
2727static void wma_register_apf_events(tp_wma_handle wma_handle)
2728{
2729}
2730#endif /* FEATURE_WLAN_APF */
2731
Visweswara Tanuku633976b2019-01-07 16:13:12 +05302732#ifdef WLAN_FEATURE_MOTION_DETECTION
2733/**
2734 * wma_register_md_events - Register motion detection event handlers
2735 * @wma_handle: wma handle
2736 * Return: None
2737 */
2738static void wma_register_md_events(tp_wma_handle wma_handle)
2739{
2740 if (!wma_handle) {
2741 QDF_TRACE(QDF_MODULE_ID_WMI, QDF_TRACE_LEVEL_INFO,
2742 "wma_handle is NULL\n");
2743 return;
2744 }
2745
2746 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Visweswara Tanuku1a5e9922019-10-18 11:54:16 +05302747 wmi_motion_det_host_eventid,
Visweswara Tanuku633976b2019-01-07 16:13:12 +05302748 wma_motion_det_host_event_handler,
2749 WMA_RX_SERIALIZER_CTX);
2750
2751 wmi_unified_register_event_handler(
2752 wma_handle->wmi_handle,
Visweswara Tanuku1a5e9922019-10-18 11:54:16 +05302753 wmi_motion_det_base_line_host_eventid,
Visweswara Tanuku633976b2019-01-07 16:13:12 +05302754 wma_motion_det_base_line_host_event_handler,
2755 WMA_RX_SERIALIZER_CTX);
2756}
2757#else /* WLAN_FEATURE_MOTION_DETECTION */
2758/**
2759 * wma_register_md_events - Register motion detection event handlers
2760 * @wma_handle: wma handle
2761 * Return: None
2762 */
2763static void wma_register_md_events(tp_wma_handle wma_handle)
2764{
2765}
2766#endif /* WLAN_FEATURE_MOTION_DETECTION */
2767
Krunal Sonif9ba53d2019-01-03 21:44:41 -08002768#ifdef FEATURE_WLM_STATS
2769static void wma_register_wlm_stats_events(tp_wma_handle wma_handle)
2770{
2771 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2772 wmi_wlm_stats_event_id,
2773 wma_wlm_stats_rsp,
2774 WMA_RX_SERIALIZER_CTX);
2775}
2776#else /* FEATURE_WLM_STATS */
2777static void wma_register_wlm_stats_events(tp_wma_handle wma_handle)
2778{
2779}
2780#endif /* FEATURE_WLM_STATS */
2781
Arif Hussain49698112018-07-31 00:32:50 -07002782struct wlan_objmgr_psoc *wma_get_psoc_from_scn_handle(void *scn_handle)
2783{
2784 tp_wma_handle wma_handle;
2785
2786 if (!scn_handle) {
2787 WMA_LOGE("invalid scn handle");
2788 return NULL;
2789 }
2790 wma_handle = (tp_wma_handle)scn_handle;
2791
2792 return wma_handle->psoc;
2793}
2794
Vinay Gannevaram81843a72020-02-07 20:16:58 +05302795void wma_get_fw_phy_mode_for_freq_cb(uint32_t freq, uint32_t chan_width,
2796 uint32_t *phy_mode)
2797{
2798 uint32_t dot11_mode;
2799 enum wlan_phymode host_phy_mode;
2800 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
2801
2802 if (!mac) {
2803 wma_err("MAC context is NULL");
2804 *phy_mode = WLAN_PHYMODE_AUTO;
2805 return;
2806 }
2807
2808 dot11_mode = mac->mlme_cfg->dot11_mode.dot11_mode;
2809 host_phy_mode = wma_chan_phy_mode(freq, chan_width, dot11_mode);
2810 *phy_mode = wma_host_to_fw_phymode(host_phy_mode);
2811}
2812
Abhishek Ambure6a2773e2019-10-14 15:15:42 +05302813void wma_get_phy_mode_cb(uint8_t chan, uint32_t chan_width,
2814 enum wlan_phymode *phy_mode)
Ashish Kumar Dhanotiyacd311c82018-09-14 10:55:10 +05302815{
2816 uint32_t dot11_mode;
Jeff Johnson009c40f2018-11-05 09:54:37 -08002817 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
gaurank kathpaliac99859b2019-07-23 12:02:35 +05302818 uint32_t freq;
Ashish Kumar Dhanotiyacd311c82018-09-14 10:55:10 +05302819
2820 if (!mac) {
2821 wma_err("MAC context is NULL");
Abhishek Ambure6a2773e2019-10-14 15:15:42 +05302822 *phy_mode = WLAN_PHYMODE_AUTO;
Ashish Kumar Dhanotiyacd311c82018-09-14 10:55:10 +05302823 return;
2824 }
2825
gaurank kathpaliac99859b2019-07-23 12:02:35 +05302826 freq = wlan_reg_chan_to_freq(mac->pdev, chan);
gaurank kathpalia1be77fa2019-01-04 13:32:09 +05302827 dot11_mode = mac->mlme_cfg->dot11_mode.dot11_mode;
gaurank kathpaliac99859b2019-07-23 12:02:35 +05302828 *phy_mode = wma_chan_phy_mode(freq, chan_width, dot11_mode);
Ashish Kumar Dhanotiyacd311c82018-09-14 10:55:10 +05302829}
2830
Nachiket Kukade15bd4f72019-02-19 17:30:50 +05302831#ifdef WLAN_FEATURE_NAN
2832static void
2833wma_register_nan_callbacks(tp_wma_handle wma_handle)
2834{
2835 struct nan_callbacks cb_obj = {0};
2836
2837 cb_obj.update_ndi_conn = wma_ndi_update_connection_info;
2838
2839 ucfg_nan_register_wma_callbacks(wma_handle->psoc, &cb_obj);
2840}
2841#else
2842static void wma_register_nan_callbacks(tp_wma_handle wma_handle)
2843{
2844}
2845#endif
2846
Ashish Kumar Dhanotiyacd311c82018-09-14 10:55:10 +05302847/**
Kabilan Kannanfc3a8c02018-02-21 13:36:29 -08002848 * wma_open() - Allocate wma context and initialize it.
2849 * @cds_context: cds context
2850 * @wma_tgt_cfg_cb: tgt config callback fun
2851 * @radar_ind_cb: dfs radar indication callback
2852 * @cds_cfg: mac parameters
2853 *
2854 * Return: 0 on success, errno on failure
2855 */
Jeff Johnsonff6addf2017-09-13 10:06:03 -07002856QDF_STATUS wma_open(struct wlan_objmgr_psoc *psoc,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002857 wma_tgt_cfg_cb tgt_cfg_cb,
bings482bae22018-01-17 16:25:31 +08002858 struct cds_config_info *cds_cfg,
2859 uint32_t target_type)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002860{
2861 tp_wma_handle wma_handle;
2862 HTC_HANDLE htc_handle;
Anurag Chouhan6d760662016-02-20 16:05:43 +05302863 qdf_device_t qdf_dev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002864 void *wmi_handle;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302865 QDF_STATUS qdf_status;
Lin Bai04f603e2018-03-19 11:01:06 +08002866 struct wmi_unified_attach_params *params;
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07002867 struct policy_mgr_wma_cbacks wma_cbacks;
Frank Liu00d73fe2017-05-19 22:11:28 +08002868 struct target_psoc_info *tgt_psoc_info;
Dustin Brownec2c92e2017-07-26 11:13:49 -07002869 int i;
Pragaspathi Thilagaraj00bd8bc2018-08-18 01:23:01 +05302870 bool val = 0;
Jeff Johnsonff6addf2017-09-13 10:06:03 -07002871 void *cds_context;
Arunk Khandavallicfde2712018-01-25 11:27:42 +05302872 target_resource_config *wlan_res_cfg;
Wu Gao51a63562018-11-08 16:29:10 +08002873 uint8_t delay_before_vdev_stop;
lifeng0b46ae52018-12-13 09:42:27 +08002874 uint32_t self_gen_frm_pwr = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002875
2876 WMA_LOGD("%s: Enter", __func__);
2877
Jeff Johnsonff6addf2017-09-13 10:06:03 -07002878 cds_context = cds_get_global_context();
2879 if (!cds_context) {
2880 WMA_LOGE("%s: Invalid CDS context", __func__);
2881 return QDF_STATUS_E_INVAL;
2882 }
2883
Mukul Sharma5ff3c582016-09-12 15:23:35 +05302884 g_wmi_version_info.major = __WMI_VER_MAJOR_;
2885 g_wmi_version_info.minor = __WMI_VER_MINOR_;
2886 g_wmi_version_info.revision = __WMI_REVISION_;
2887
Anurag Chouhan6d760662016-02-20 16:05:43 +05302888 qdf_dev = cds_get_context(QDF_MODULE_ID_QDF_DEVICE);
2889 htc_handle = cds_get_context(QDF_MODULE_ID_HTC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002890
2891 if (!htc_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07002892 WMA_LOGE("%s: Invalid HTC handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302893 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002894 }
2895
2896 /* Alloc memory for WMA Context */
Jeff Johnsonadb3b1c2017-09-13 10:42:36 -07002897 qdf_status = cds_alloc_context(QDF_MODULE_ID_WMA,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002898 (void **)&wma_handle,
Jeff Johnsonadb3b1c2017-09-13 10:42:36 -07002899 sizeof(*wma_handle));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002900
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302901 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07002902 WMA_LOGE("%s: Memory allocation failed for wma_handle",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002903 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302904 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002905 }
2906
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302907 qdf_mem_zero(wma_handle, sizeof(t_wma_handle));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002908
Arunk Khandavallia6305a32018-01-25 11:19:18 +05302909 if (target_if_alloc_psoc_tgt_info(psoc)) {
2910 WMA_LOGE("%s target psoc info allocation failed", __func__);
2911 qdf_status = QDF_STATUS_E_NOMEM;
2912 goto err_free_wma_handle;
Frank Liu00d73fe2017-05-19 22:11:28 +08002913 }
2914
Anurag Chouhan6d760662016-02-20 16:05:43 +05302915 if (cds_get_conparam() != QDF_GLOBAL_FTM_MODE) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002916#ifdef FEATURE_WLAN_EXTSCAN
Anurag Chouhana37b5b72016-02-21 14:53:42 +05302917 qdf_wake_lock_create(&wma_handle->extscan_wake_lock,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002918 "wlan_extscan_wl");
2919#endif /* FEATURE_WLAN_EXTSCAN */
Mukul Sharmae44d0542017-05-23 21:50:56 +05302920 qdf_wake_lock_create(&wma_handle->wow_wake_lock,
2921 "wlan_wow_wl");
2922 qdf_wake_lock_create(&wma_handle->wow_auth_req_wl,
2923 "wlan_auth_req_wl");
2924 qdf_wake_lock_create(&wma_handle->wow_assoc_req_wl,
2925 "wlan_assoc_req_wl");
2926 qdf_wake_lock_create(&wma_handle->wow_deauth_rec_wl,
2927 "wlan_deauth_rec_wl");
2928 qdf_wake_lock_create(&wma_handle->wow_disassoc_rec_wl,
2929 "wlan_disassoc_rec_wl");
2930 qdf_wake_lock_create(&wma_handle->wow_ap_assoc_lost_wl,
2931 "wlan_ap_assoc_lost_wl");
2932 qdf_wake_lock_create(&wma_handle->wow_auto_shutdown_wl,
2933 "wlan_auto_shutdown_wl");
2934 qdf_wake_lock_create(&wma_handle->roam_ho_wl,
2935 "wlan_roam_ho_wl");
Pragaspathi Thilagaraj0c4489f2019-08-05 20:50:23 +05302936 qdf_wake_lock_create(&wma_handle->roam_preauth_wl,
2937 "wlan_roam_preauth_wl");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002938 }
2939
Selvaraj, Sridhar3a1823f2017-02-01 17:32:21 +05302940 qdf_status = wlan_objmgr_psoc_try_get_ref(psoc, WLAN_LEGACY_WMA_ID);
2941 if (QDF_IS_STATUS_ERROR(qdf_status)) {
2942 WMA_LOGE("%s: PSOC get_ref fails", __func__);
Zhu Jianminf9e2e2d2018-05-30 16:20:24 +08002943 goto err_get_psoc_ref;
Selvaraj, Sridhar3a1823f2017-02-01 17:32:21 +05302944 }
Selvaraj, Sridhar0672a122016-12-29 16:11:48 +05302945 wma_handle->psoc = psoc;
2946
Rajeev Kumarda2444c2017-01-10 22:42:07 -08002947 wma_target_if_open(wma_handle);
Rajeev Kumarda2444c2017-01-10 22:42:07 -08002948
Lin Bai04f603e2018-03-19 11:01:06 +08002949 /*
2950 * Allocate locally used params with its rx_ops member,
2951 * and free it immediately after used.
2952 */
Jianmin Zhudc76e632019-10-29 15:53:56 +08002953 params = qdf_mem_malloc(sizeof(*params));
Lin Bai04f603e2018-03-19 11:01:06 +08002954 if (!params) {
Lin Bai04f603e2018-03-19 11:01:06 +08002955 qdf_status = QDF_STATUS_E_NOMEM;
2956 goto err_wma_handle;
2957 }
2958
Lin Bai04f603e2018-03-19 11:01:06 +08002959 params->osdev = NULL;
2960 params->target_type = WMI_TLV_TARGET;
2961 params->use_cookie = false;
2962 params->psoc = psoc;
2963 params->max_commands = WMI_MAX_CMDS;
Surabhi Vishnoi75b1a812018-02-09 12:07:16 +05302964
Himanshu Agarwal88b16a42018-02-06 15:10:59 +05302965 /* initialize tlv attach */
2966 wmi_tlv_init();
Surabhi Vishnoi75b1a812018-02-09 12:07:16 +05302967
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002968 /* attach the wmi */
Lin Bai04f603e2018-03-19 11:01:06 +08002969 wmi_handle = wmi_unified_attach(wma_handle, params);
2970 qdf_mem_free(params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002971 if (!wmi_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07002972 WMA_LOGE("%s: failed to attach WMI", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302973 qdf_status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002974 goto err_wma_handle;
2975 }
2976
Rajeev Kumarda2444c2017-01-10 22:42:07 -08002977 target_if_register_legacy_service_ready_cb(
2978 wma_legacy_service_ready_event_handler);
2979
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002980 WMA_LOGA("WMA --> wmi_unified_attach - success");
Mukul Sharmacc1f3f92017-01-30 19:56:24 +05302981
Frank Liu00d73fe2017-05-19 22:11:28 +08002982 /* store the wmi handle in tgt_if_handle */
Arunk Khandavallia6305a32018-01-25 11:19:18 +05302983 tgt_psoc_info = wlan_psoc_get_tgt_if_handle(psoc);
Mukul Sharmacc1f3f92017-01-30 19:56:24 +05302984
bings6b413662018-02-06 17:51:36 +08002985 target_psoc_set_target_type(tgt_psoc_info, target_type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002986 /* Save the WMI & HTC handle */
Arunk Khandavallia6305a32018-01-25 11:19:18 +05302987 target_psoc_set_wmi_hdl(tgt_psoc_info, wmi_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002988 wma_handle->wmi_handle = wmi_handle;
Arunk Khandavallia6305a32018-01-25 11:19:18 +05302989 target_psoc_set_htc_hdl(tgt_psoc_info, htc_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002990 wma_handle->cds_context = cds_context;
Anurag Chouhan6d760662016-02-20 16:05:43 +05302991 wma_handle->qdf_dev = qdf_dev;
Jiani Liu6d3b6a12019-05-08 15:15:06 +08002992 wma_handle->enable_tx_compl_tsf64 =
2993 cds_cfg->enable_tx_compl_tsf64;
2994
Arunk Khandavallia6305a32018-01-25 11:19:18 +05302995 /* Register Converged Event handlers */
2996 init_deinit_register_tgt_psoc_ev_handlers(psoc);
2997
Manishekar Chandrasekaranebcab882016-05-04 12:55:14 +05302998 /* Initialize max_no_of_peers for wma_get_number_of_peers_supported() */
Rachit Kankane0106e382018-05-16 18:59:28 +05302999 cds_cfg->max_station = wma_init_max_no_of_peers(wma_handle,
3000 cds_cfg->max_station);
Manishekar Chandrasekaranebcab882016-05-04 12:55:14 +05303001
Tushnim Bhattacharyya80e9e3b2019-06-11 13:01:00 -07003002 wlan_mlme_set_assoc_sta_limit(psoc, cds_cfg->max_station);
3003
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003004 /* initialize default target config */
Arunk Khandavallicfde2712018-01-25 11:27:42 +05303005 wlan_res_cfg = target_psoc_get_wlan_res_cfg(tgt_psoc_info);
Arif Hussaind15902c2018-03-02 00:08:29 -08003006 if (!wlan_res_cfg) {
3007 WMA_LOGE("%s: wlan_res_cfg is null", __func__);
3008 qdf_status = QDF_STATUS_E_NOMEM;
3009 goto err_wma_handle;
3010 }
Arunk Khandavallicfde2712018-01-25 11:27:42 +05303011
Rachit Kankane0106e382018-05-16 18:59:28 +05303012 wma_set_default_tgt_config(wma_handle, wlan_res_cfg, cds_cfg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003013
Pragaspathi Thilagaraj00bd8bc2018-08-18 01:23:01 +05303014 qdf_status = wlan_mlme_get_tx_chainmask_cck(psoc, &val);
3015 if (qdf_status != QDF_STATUS_SUCCESS) {
3016 WMA_LOGE("%s: Failed to get tx_chainmask_cck", __func__);
3017 qdf_status = QDF_STATUS_E_FAILURE;
3018 goto err_wma_handle;
3019 }
3020 wma_handle->tx_chain_mask_cck = val;
lifeng0b46ae52018-12-13 09:42:27 +08003021
3022 qdf_status = wlan_mlme_get_self_gen_frm_pwr(psoc, &self_gen_frm_pwr);
3023 if (qdf_status != QDF_STATUS_SUCCESS)
3024 WMA_LOGE("%s: Failed to get self_gen_frm_pwr", __func__);
3025 wma_handle->self_gen_frm_pwr = self_gen_frm_pwr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003026
Dustin Browne8d91fc2019-02-04 14:49:04 -08003027 cds_cfg->max_bssid = WLAN_MAX_VDEVS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003028
Arun Khandavallic811dcc2016-06-26 07:37:21 +05303029 wma_handle->max_station = cds_cfg->max_station;
3030 wma_handle->max_bssid = cds_cfg->max_bssid;
Wu Gao66454f12018-09-26 19:55:41 +08003031 wma_handle->enable_mc_list =
3032 ucfg_pmo_is_mc_addr_list_enabled(wma_handle->psoc);
Wu Gao9d117fb2019-01-10 21:52:31 +08003033 wma_handle->active_uc_apf_mode =
3034 ucfg_pmo_get_active_uc_apf_mode(wma_handle->psoc);
3035 wma_handle->active_mc_bc_apf_mode =
3036 ucfg_pmo_get_active_mc_bc_apf_mode(wma_handle->psoc);
Srinivas Girigowda57b450e2016-10-27 21:00:46 -07003037 wma_handle->link_stats_results = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003038#ifdef WLAN_FEATURE_LPSS
Arun Khandavallic811dcc2016-06-26 07:37:21 +05303039 wma_handle->is_lpass_enabled = cds_cfg->is_lpass_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003040#endif
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303041 wma_handle->interfaces = qdf_mem_malloc(sizeof(struct wma_txrx_node) *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003042 wma_handle->max_bssid);
3043 if (!wma_handle->interfaces) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303044 qdf_status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003045 goto err_scn_context;
3046 }
Dustin Brownec2c92e2017-07-26 11:13:49 -07003047
Zhu Jianmina2f8e8d2018-02-11 16:37:10 +08003048 for (i = 0; i < wma_handle->max_bssid; ++i) {
Dustin Brownec2c92e2017-07-26 11:13:49 -07003049 wma_vdev_init(&wma_handle->interfaces[i]);
Wu Gao51a63562018-11-08 16:29:10 +08003050 ucfg_mlme_get_delay_before_vdev_stop(wma_handle->psoc,
3051 &delay_before_vdev_stop);
Zhu Jianmina2f8e8d2018-02-11 16:37:10 +08003052 wma_handle->interfaces[i].delay_before_vdev_stop =
Wu Gao51a63562018-11-08 16:29:10 +08003053 delay_before_vdev_stop;
Zhu Jianmina2f8e8d2018-02-11 16:37:10 +08003054 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003055 /* Register the debug print event handler */
3056 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303057 wmi_debug_print_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303058 wma_unified_debug_print_event_handler,
3059 WMA_RX_SERIALIZER_CTX);
Govind Singha471e5e2015-10-12 17:11:14 +05303060 /* Register profiling event Handler */
3061 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303062 wmi_wlan_profile_data_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303063 wma_profile_data_report_event_handler,
3064 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003065
3066 wma_handle->tgt_cfg_update_cb = tgt_cfg_cb;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003067 wma_handle->old_hw_mode_index = WMA_DEFAULT_HW_MODE_INDEX;
3068 wma_handle->new_hw_mode_index = WMA_DEFAULT_HW_MODE_INDEX;
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05303069 wma_handle->saved_chan.num_channels = 0;
Sandeep Puligillaafa52892016-10-26 19:03:16 -07003070 wma_handle->fw_timeout_crash = cds_cfg->fw_timeout_crash;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003071
Anurag Chouhan210db072016-02-22 18:42:15 +05303072 qdf_status = qdf_mc_timer_init(&wma_handle->service_ready_ext_timer,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303073 QDF_TIMER_TYPE_SW,
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05303074 wma_service_ready_ext_evt_timeout,
3075 wma_handle);
Anurag Chouhandf2b2682016-02-29 14:15:27 +05303076 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05303077 WMA_LOGE("Failed to initialize service ready ext timeout");
3078 goto err_event_init;
3079 }
3080
Anurag Chouhandf2b2682016-02-29 14:15:27 +05303081 qdf_status = qdf_event_create(&wma_handle->target_suspend);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303082 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003083 WMA_LOGE("%s: target suspend event initialization failed",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003084 __func__);
3085 goto err_event_init;
3086 }
3087
3088 /* Init Tx Frame Complete event */
Anurag Chouhandf2b2682016-02-29 14:15:27 +05303089 qdf_status = qdf_event_create(&wma_handle->tx_frm_download_comp_event);
3090 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003091 WMA_LOGE("%s: failed to init tx_frm_download_comp_event",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003092 __func__);
3093 goto err_event_init;
3094 }
3095
3096 /* Init tx queue empty check event */
Anurag Chouhandf2b2682016-02-29 14:15:27 +05303097 qdf_status = qdf_event_create(&wma_handle->tx_queue_empty_event);
3098 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003099 WMA_LOGE("%s: failed to init tx_queue_empty_event", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003100 goto err_event_init;
3101 }
3102
Prashanth Bhattae675ca72016-10-20 18:42:37 -07003103 qdf_status = cds_shutdown_notifier_register(wma_shutdown_notifier_cb,
3104 wma_handle);
3105 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003106 WMA_LOGE("%s: Shutdown notifier register failed: %d",
Prashanth Bhattae675ca72016-10-20 18:42:37 -07003107 __func__, qdf_status);
3108 goto err_event_init;
3109 }
3110
Anurag Chouhandf2b2682016-02-29 14:15:27 +05303111 qdf_status = qdf_event_create(&wma_handle->runtime_suspend);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303112 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003113 WMA_LOGE("%s: runtime_suspend event initialization failed",
Houston Hoffmana76591b2015-11-10 16:52:05 -08003114 __func__);
3115 goto err_event_init;
3116 }
3117
Anurag Chouhandf2b2682016-02-29 14:15:27 +05303118 qdf_status = qdf_event_create(&wma_handle->recovery_event);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303119 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003120 WMA_LOGE("%s: recovery event initialization failed", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003121 goto err_event_init;
3122 }
3123
Anurag Chouhanffb21542016-02-17 14:33:03 +05303124 qdf_list_create(&wma_handle->wma_hold_req_queue,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003125 MAX_ENTRY_HOLD_REQ_QUEUE);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303126 qdf_spinlock_create(&wma_handle->wma_hold_req_q_lock);
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05303127 qdf_atomic_init(&wma_handle->is_wow_bus_suspended);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003128
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003129 /* register for STA kickout function */
3130 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303131 wmi_peer_sta_kickout_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303132 wma_peer_sta_kickout_event_handler,
3133 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003134
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05303135 /* register for stats response event */
3136 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303137 wmi_get_arp_stats_req_id,
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05303138 wma_get_arp_stats_handler,
3139 WMA_RX_SERIALIZER_CTX);
3140
Qun Zhangef655622019-02-25 10:48:10 +08003141 /* register for fw state response event */
3142 wma_register_fw_state_events(wma_handle->wmi_handle);
3143
Will Huanga9814592017-05-24 15:47:58 +08003144 /* register for peer info response event */
3145 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303146 wmi_peer_stats_info_event_id,
Will Huanga9814592017-05-24 15:47:58 +08003147 wma_peer_info_event_handler,
3148 WMA_RX_SERIALIZER_CTX);
3149
Aditya Kodukula0a590372020-04-15 13:30:14 -07003150#ifdef WLAN_POWER_DEBUG
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05303151 /* register for Chip Power stats event */
3152 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303153 wmi_pdev_chip_power_stats_event_id,
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05303154 wma_unified_power_debug_stats_event_handler,
3155 WMA_RX_SERIALIZER_CTX);
Aditya Kodukula0a590372020-04-15 13:30:14 -07003156#endif
Arunk Khandavallica56d4b2018-11-29 15:46:00 +05303157#ifdef WLAN_FEATURE_BEACON_RECEPTION_STATS
3158 /* register for beacon stats event */
3159 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3160 wmi_vdev_bcn_reception_stats_event_id,
3161 wma_unified_beacon_debug_stats_event_handler,
3162 WMA_RX_SERIALIZER_CTX);
3163#endif
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05303164
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003165 /* register for linkspeed response event */
3166 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303167 wmi_peer_estimated_linkspeed_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303168 wma_link_speed_event_handler,
3169 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003170
3171#ifdef FEATURE_OEM_DATA_SUPPORT
3172 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303173 wmi_oem_response_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303174 wma_oem_data_response_handler,
3175 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003176#endif /* FEATURE_OEM_DATA_SUPPORT */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003177
3178 /* Register peer change event handler */
3179 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303180 wmi_peer_state_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303181 wma_peer_state_change_event_handler,
3182 WMA_RX_WORK_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003183
3184 /* Register beacon tx complete event id. The event is required
3185 * for sending channel switch announcement frames
3186 */
3187 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303188 wmi_offload_bcn_tx_status_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303189 wma_unified_bcntx_status_event_handler,
3190 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003191
3192 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303193 wmi_update_vdev_rate_stats_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303194 wma_link_status_event_handler,
3195 WMA_RX_SERIALIZER_CTX);
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +05303196
3197 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3198 wmi_roam_scan_stats_event_id,
3199 wma_roam_scan_stats_event_handler,
3200 WMA_RX_SERIALIZER_CTX);
3201
Yeshwanth Sriram Guntukafa9f3792019-02-28 18:24:58 +05303202 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3203 wmi_pdev_cold_boot_cal_event_id,
3204 wma_cold_boot_cal_event_handler,
3205 WMA_RX_WORK_CTX);
3206
Ashish Kumar Dhanotiyad8d7dea2019-10-24 14:34:56 +05303207#ifdef FEATURE_OEM_DATA
3208 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3209 wmi_oem_data_event_id,
3210 wma_oem_event_handler,
3211 WMA_RX_WORK_CTX);
3212#endif
3213
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003214#ifdef WLAN_FEATURE_LINK_LAYER_STATS
3215 /* Register event handler for processing Link Layer Stats
3216 * response from the FW
3217 */
3218 wma_register_ll_stats_event_handler(wma_handle);
3219
3220#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
3221
SaidiReddy Yenugacc733af2016-11-09 17:45:42 +05303222 wmi_set_tgt_assert(wma_handle->wmi_handle,
3223 cds_cfg->force_target_assert_enabled);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003224 /* Firmware debug log */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303225 qdf_status = dbglog_init(wma_handle->wmi_handle);
3226 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003227 WMA_LOGE("%s: Firmware Dbglog initialization failed", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003228 goto err_dbglog_init;
3229 }
3230
3231 /*
3232 * Update Powersave mode
3233 * 1 - Legacy Powersave + Deepsleep Disabled
3234 * 2 - QPower + Deepsleep Disabled
3235 * 3 - Legacy Powersave + Deepsleep Enabled
3236 * 4 - QPower + Deepsleep Enabled
3237 */
Wu Gao66454f12018-09-26 19:55:41 +08003238 wma_handle->powersave_mode =
3239 ucfg_pmo_power_save_offload_enabled(wma_handle->psoc);
Arun Khandavallic811dcc2016-06-26 07:37:21 +05303240 wma_handle->staMaxLIModDtim = cds_cfg->sta_maxlimod_dtim;
Wu Gao66454f12018-09-26 19:55:41 +08003241 wma_handle->staModDtim = ucfg_pmo_get_sta_mod_dtim(wma_handle->psoc);
3242 wma_handle->staDynamicDtim =
3243 ucfg_pmo_get_sta_dynamic_dtim(wma_handle->psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003244
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003245 /* register for install key completion event */
3246 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303247 wmi_vdev_install_key_complete_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303248 wma_vdev_install_key_complete_event_handler,
3249 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003250
3251#ifdef WLAN_FEATURE_STATS_EXT
3252 /* register for extended stats event */
3253 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303254 wmi_stats_ext_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303255 wma_stats_ext_event_handler,
3256 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003257#endif /* WLAN_FEATURE_STATS_EXT */
3258#ifdef FEATURE_WLAN_EXTSCAN
3259 wma_register_extscan_event_handler(wma_handle);
3260#endif /* WLAN_FEATURE_STATS_EXT */
3261
3262 WMA_LOGD("%s: Exit", __func__);
3263
3264#ifdef WLAN_FEATURE_ROAM_OFFLOAD
3265 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303266 wmi_roam_synch_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303267 wma_roam_synch_event_handler,
3268 WMA_RX_SERIALIZER_CTX);
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05303269 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303270 wmi_roam_synch_frame_event_id,
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05303271 wma_roam_synch_frame_event_handler,
3272 WMA_RX_SERIALIZER_CTX);
Pragaspathi Thilagaraj7a7163b2019-07-14 22:47:09 +05303273
3274 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3275 wmi_roam_auth_offload_event_id,
3276 wma_roam_auth_offload_event_handler,
3277 WMA_RX_SERIALIZER_CTX);
Pragaspathi Thilagaraj5292e0a2019-11-29 17:36:30 +05303278
3279 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3280 wmi_roam_stats_event_id,
3281 wma_roam_stats_event_handler,
3282 WMA_RX_SERIALIZER_CTX);
Srikanth Marepalli6a872782020-01-24 18:12:05 +05303283
Amar Singhal72212d52020-02-25 09:48:03 -08003284 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3285 wmi_roam_scan_chan_list_id,
3286 wma_roam_scan_chan_list_event_handler,
3287 WMA_RX_SERIALIZER_CTX);
3288
3289 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3290 wmi_roam_blacklist_event_id,
3291 wma_handle_btm_blacklist_event,
3292 WMA_RX_SERIALIZER_CTX);
Abhishek Ambure5e9b6a42020-02-12 21:32:35 +05303293
Srikanth Marepalli6a872782020-01-24 18:12:05 +05303294 wma_register_pmkid_req_event_handler(wma_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003295#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
3296 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303297 wmi_rssi_breach_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303298 wma_rssi_breached_event_handler,
3299 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003300
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303301 qdf_wake_lock_create(&wma_handle->wmi_cmd_rsp_wake_lock,
Govind Singhd76a5b02016-03-08 15:12:14 +05303302 "wlan_fw_rsp_wakelock");
Prashanth Bhatta87b6dc02017-01-19 15:17:58 -08003303 qdf_runtime_lock_init(&wma_handle->wmi_cmd_rsp_runtime_lock);
Rajeev Kumarc58f7c22019-05-10 11:07:38 -07003304 qdf_runtime_lock_init(&wma_handle->sap_prevent_runtime_pm_lock);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003305
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003306 /* Register peer assoc conf event handler */
3307 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303308 wmi_peer_assoc_conf_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303309 wma_peer_assoc_conf_handler,
3310 WMA_RX_SERIALIZER_CTX);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003311 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303312 wmi_peer_delete_response_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303313 wma_peer_delete_handler,
3314 WMA_RX_SERIALIZER_CTX);
Arun Khandavalli2476ef52016-04-26 20:19:43 +05303315 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303316 wmi_chan_info_event_id,
Kapil Gupta4f0c0c12017-02-07 15:21:15 +05303317 wma_chan_info_event_handler,
3318 WMA_RX_SERIALIZER_CTX);
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08003319 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303320 wmi_dbg_mesg_flush_complete_event_id,
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08003321 wma_flush_complete_evt_handler,
Rajeev Kumarc3032b82017-02-14 15:56:01 -08003322 WMA_RX_WORK_CTX);
lifeng66831662017-05-19 16:01:35 +08003323 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303324 wmi_report_rx_aggr_failure_event_id,
lifeng66831662017-05-19 16:01:35 +08003325 wma_rx_aggr_failure_event_handler,
3326 WMA_RX_SERIALIZER_CTX);
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08003327
guangde4853c402019-05-06 15:54:04 +08003328 wmi_unified_register_event_handler(
3329 wma_handle->wmi_handle,
3330 wmi_coex_report_antenna_isolation_event_id,
3331 wma_antenna_isolation_event_handler,
3332 WMA_RX_SERIALIZER_CTX);
3333
Ashish Kumar Dhanotiya9335d812017-06-30 16:57:20 +05303334 wma_handle->ito_repeat_count = cds_cfg->ito_repeat_count;
Sandeep Puligilla819d94f2017-10-10 18:33:56 -07003335 wma_handle->bandcapability = cds_cfg->bandcapability;
Ashish Kumar Dhanotiya9335d812017-06-30 16:57:20 +05303336
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +05303337 /* Register PWR_SAVE_FAIL event only in case of recovery(1) */
Wu Gao66454f12018-09-26 19:55:41 +08003338 if (ucfg_pmo_get_auto_power_fail_mode(wma_handle->psoc) ==
Hanumanth Reddy Pothulaab395952017-09-05 19:12:26 +05303339 PMO_FW_TO_SEND_WOW_IND_ON_PWR_FAILURE) {
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +05303340 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303341 wmi_pdev_chip_pwr_save_failure_detect_event_id,
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +05303342 wma_chip_power_save_failure_detected_handler,
3343 WMA_RX_WORK_CTX);
3344 }
3345
lifengd217d192017-05-09 19:44:16 +08003346 wmi_unified_register_event_handler(wma_handle->wmi_handle,
lifengfe6c3e22018-04-03 12:10:04 +08003347 wmi_pdev_div_rssi_antid_event_id,
3348 wma_pdev_div_info_evt_handler,
lifengd217d192017-05-09 19:44:16 +08003349 WMA_RX_WORK_CTX);
3350
Sourav Mohapatra2a67b0e2019-10-15 17:59:59 +05303351 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3352 wmi_get_ani_level_event_id,
3353 wma_get_ani_level_evt_handler,
3354 WMA_RX_WORK_CTX);
Frank Liu65b17d92016-11-23 15:58:44 +08003355
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05303356 wma_register_debug_callback();
Ashish Kumar Dhanotiyacd311c82018-09-14 10:55:10 +05303357 wifi_pos_register_get_phy_mode_cb(wma_handle->psoc,
3358 wma_get_phy_mode_cb);
Vinay Gannevaram81843a72020-02-07 20:16:58 +05303359 wifi_pos_register_get_fw_phy_mode_for_freq_cb(
3360 wma_handle->psoc,
3361 wma_get_fw_phy_mode_for_freq_cb);
Ashish Kumar Dhanotiyacd311c82018-09-14 10:55:10 +05303362
Mukul Sharma6411bb82017-03-01 15:57:07 +05303363 /* Register callback with PMO so PMO can update the vdev pause bitmap*/
3364 pmo_register_pause_bitmap_notifier(wma_handle->psoc,
3365 wma_vdev_update_pause_bitmap);
3366 pmo_register_get_pause_bitmap(wma_handle->psoc,
3367 wma_vdev_get_pause_bitmap);
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +05303368 pmo_register_is_device_in_low_pwr_mode(wma_handle->psoc,
3369 wma_vdev_is_device_in_low_pwr_mode);
Nachiket Kukade37b4e6d2018-06-01 18:44:42 +05303370 pmo_register_get_dtim_period_callback(wma_handle->psoc,
3371 wma_vdev_get_dtim_period);
3372 pmo_register_get_beacon_interval_callback(wma_handle->psoc,
3373 wma_vdev_get_beacon_interval);
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07003374 wma_cbacks.wma_get_connection_info = wma_get_connection_info;
Nachiket Kukade15bd4f72019-02-19 17:30:50 +05303375 wma_register_nan_callbacks(wma_handle);
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07003376 qdf_status = policy_mgr_register_wma_cb(wma_handle->psoc, &wma_cbacks);
3377 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
3378 WMA_LOGE("Failed to register wma cb with Policy Manager");
3379 }
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05303380
Arif Hussainf63f7a32017-08-22 12:49:42 -07003381 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303382 wmi_phyerr_event_id,
Arif Hussainf63f7a32017-08-22 12:49:42 -07003383 wma_unified_phyerr_rx_event_handler,
3384 WMA_RX_WORK_CTX);
3385
Arif Hussainee10f902017-12-27 16:30:17 -08003386 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3387 wmi_sap_obss_detection_report_event_id,
3388 wma_vdev_obss_detection_info_handler,
3389 WMA_RX_SERIALIZER_CTX);
3390
Arif Hussain05fb4872018-01-03 16:02:55 -08003391 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3392 wmi_obss_color_collision_report_event_id,
3393 wma_vdev_bss_color_collision_info_handler,
3394 WMA_RX_WORK_CTX);
3395
Varun Reddy Yeturud33033f2018-06-11 10:58:30 -07003396#ifdef WLAN_SUPPORT_TWT
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -07003397 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3398 wmi_twt_enable_complete_event_id,
3399 wma_twt_en_complete_event_handler,
3400 WMA_RX_SERIALIZER_CTX);
Kiran Kumar Lokere54819a32019-10-04 18:30:43 -07003401 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3402 wmi_twt_disable_complete_event_id,
3403 wma_twt_disable_comp_event_handler,
3404 WMA_RX_SERIALIZER_CTX);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -07003405#endif
3406
Nachiket Kukade177b5b02018-05-22 20:52:17 +05303407 wma_register_apf_events(wma_handle);
Visweswara Tanuku633976b2019-01-07 16:13:12 +05303408 wma_register_md_events(wma_handle);
Krunal Sonif9ba53d2019-01-03 21:44:41 -08003409 wma_register_wlm_stats_events(wma_handle);
Arun Kumar Khandavallideda5a82019-03-11 15:32:19 +05303410 wma_register_mws_coex_events(wma_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303411 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003412
3413err_dbglog_init:
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303414 qdf_wake_lock_destroy(&wma_handle->wmi_cmd_rsp_wake_lock);
Rajeev Kumarc58f7c22019-05-10 11:07:38 -07003415 qdf_runtime_lock_deinit(&wma_handle->sap_prevent_runtime_pm_lock);
Prashanth Bhatta87b6dc02017-01-19 15:17:58 -08003416 qdf_runtime_lock_deinit(&wma_handle->wmi_cmd_rsp_runtime_lock);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303417 qdf_spinlock_destroy(&wma_handle->wma_hold_req_q_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003418err_event_init:
3419 wmi_unified_unregister_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303420 wmi_debug_print_event_id);
Dustin Brownec2c92e2017-07-26 11:13:49 -07003421
3422 for (i = 0; i < wma_handle->max_bssid; ++i)
3423 wma_vdev_deinit(&wma_handle->interfaces[i]);
3424
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303425 qdf_mem_free(wma_handle->interfaces);
Dustin Brownec2c92e2017-07-26 11:13:49 -07003426
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003427err_scn_context:
Jeff Johnson2b6982c2018-05-29 14:56:11 -07003428 qdf_mem_free(((struct cds_context *) cds_context)->cfg_ctx);
Rajeev Kumarfe6e62f2018-10-22 16:18:41 -07003429 ((struct cds_context *)cds_context)->cfg_ctx = NULL;
Dustin Brown96310112019-02-21 16:42:58 -08003430 qdf_mem_free(wmi_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003431
3432err_wma_handle:
Zhu Jianminf9e2e2d2018-05-30 16:20:24 +08003433 wlan_objmgr_psoc_release_ref(psoc, WLAN_LEGACY_WMA_ID);
3434err_get_psoc_ref:
Arunk Khandavallia6305a32018-01-25 11:19:18 +05303435 target_if_free_psoc_tgt_info(psoc);
Anurag Chouhan6d760662016-02-20 16:05:43 +05303436 if (cds_get_conparam() != QDF_GLOBAL_FTM_MODE) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003437#ifdef FEATURE_WLAN_EXTSCAN
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303438 qdf_wake_lock_destroy(&wma_handle->extscan_wake_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003439#endif /* FEATURE_WLAN_EXTSCAN */
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303440 qdf_wake_lock_destroy(&wma_handle->wow_wake_lock);
Mukul Sharmae44d0542017-05-23 21:50:56 +05303441 qdf_wake_lock_destroy(&wma_handle->wow_auth_req_wl);
3442 qdf_wake_lock_destroy(&wma_handle->wow_assoc_req_wl);
3443 qdf_wake_lock_destroy(&wma_handle->wow_deauth_rec_wl);
3444 qdf_wake_lock_destroy(&wma_handle->wow_disassoc_rec_wl);
3445 qdf_wake_lock_destroy(&wma_handle->wow_ap_assoc_lost_wl);
3446 qdf_wake_lock_destroy(&wma_handle->wow_auto_shutdown_wl);
3447 qdf_wake_lock_destroy(&wma_handle->roam_ho_wl);
Pragaspathi Thilagaraj0c4489f2019-08-05 20:50:23 +05303448 qdf_wake_lock_destroy(&wma_handle->roam_preauth_wl);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003449 }
Arunk Khandavallia6305a32018-01-25 11:19:18 +05303450err_free_wma_handle:
Jeff Johnsonadb3b1c2017-09-13 10:42:36 -07003451 cds_free_context(QDF_MODULE_ID_WMA, wma_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003452
3453 WMA_LOGD("%s: Exit", __func__);
3454
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303455 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003456}
3457
3458/**
3459 * wma_pre_start() - wma pre start
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003460 *
3461 * Return: 0 on success, errno on failure
3462 */
Jeff Johnson8ad89c62017-09-13 08:55:55 -07003463QDF_STATUS wma_pre_start(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003464{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303465 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003466 tp_wma_handle wma_handle;
Arunk Khandavallia6305a32018-01-25 11:19:18 +05303467 void *htc_handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003468
3469 WMA_LOGD("%s: Enter", __func__);
3470
Anurag Chouhan6d760662016-02-20 16:05:43 +05303471 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003472
3473 /* Validate the wma_handle */
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07003474 if (!wma_handle) {
Arunk Khandavallia6305a32018-01-25 11:19:18 +05303475 WMA_LOGE("%s: invalid wma handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303476 qdf_status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003477 goto end;
3478 }
Nachiket Kukade8003d252017-03-30 15:55:58 +05303479
Sourav Mohapatracf632572018-04-02 11:01:35 +05303480 htc_handle = lmac_get_htc_hdl(wma_handle->psoc);
Arunk Khandavallia6305a32018-01-25 11:19:18 +05303481 if (!htc_handle) {
3482 WMA_LOGE("%s: invalid htc handle", __func__);
3483 qdf_status = QDF_STATUS_E_INVAL;
3484 goto end;
3485 }
3486
3487 /* Open endpoint for ctrl path - WMI <--> HTC */
3488 qdf_status = wmi_unified_connect_htc_service(wma_handle->wmi_handle,
3489 htc_handle);
3490 if (qdf_status != QDF_STATUS_SUCCESS) {
3491 WMA_LOGE("%s: wmi_unified_connect_htc_service", __func__);
Nachiket Kukade8003d252017-03-30 15:55:58 +05303492 if (!cds_is_fw_down())
3493 QDF_BUG(0);
3494
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303495 qdf_status = QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003496 goto end;
3497 }
3498
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08003499 WMA_LOGD("WMA --> wmi_unified_connect_htc_service - success");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003500
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003501end:
3502 WMA_LOGD("%s: Exit", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303503 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003504}
3505
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303506void wma_send_msg_by_priority(tp_wma_handle wma_handle, uint16_t msg_type,
3507 void *body_ptr, uint32_t body_val, bool is_high_priority)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003508{
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303509 struct scheduler_msg msg = {0};
3510 QDF_STATUS status;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003511
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003512 msg.type = msg_type;
3513 msg.bodyval = body_val;
3514 msg.bodyptr = body_ptr;
Will Huang9323e852018-02-02 17:55:15 +08003515 msg.flush_callback = wma_discard_fw_event;
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303516
3517 status = scheduler_post_msg_by_priority(QDF_MODULE_ID_PE,
3518 &msg, is_high_priority);
3519 if (!QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303520 if (body_ptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303521 qdf_mem_free(body_ptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003522 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003523}
3524
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303525
3526void wma_send_msg(tp_wma_handle wma_handle, uint16_t msg_type,
3527 void *body_ptr, uint32_t body_val)
3528{
3529 wma_send_msg_by_priority(wma_handle, msg_type,
3530 body_ptr, body_val, false);
3531}
3532
3533void wma_send_msg_high_priority(tp_wma_handle wma_handle, uint16_t msg_type,
3534 void *body_ptr, uint32_t body_val)
3535{
3536 wma_send_msg_by_priority(wma_handle, msg_type,
3537 body_ptr, body_val, true);
3538}
3539
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003540/**
3541 * wma_set_base_macaddr_indicate() - set base mac address in fw
3542 * @wma_handle: wma handle
3543 * @customAddr: base mac address
3544 *
3545 * Return: 0 for success or error code
3546 */
3547static int wma_set_base_macaddr_indicate(tp_wma_handle wma_handle,
3548 tSirMacAddr *customAddr)
3549{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003550 int err;
3551
Govind Singhf25a0f12016-03-08 16:09:48 +05303552 err = wmi_unified_set_base_macaddr_indicate_cmd(wma_handle->wmi_handle,
3553 (uint8_t *)customAddr);
3554 if (err)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003555 return -EIO;
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -07003556 wma_debug("Base MAC Addr: " QDF_MAC_ADDR_STR,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -07003557 QDF_MAC_ADDR_ARRAY((*customAddr)));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003558
3559 return 0;
3560}
3561
3562/**
3563 * wma_log_supported_evt_handler() - Enable/Disable FW diag/log events
3564 * @handle: WMA handle
3565 * @event: Event received from FW
3566 * @len: Length of the event
3567 *
3568 * Enables the low frequency events and disables the high frequency
3569 * events. Bit 17 indicates if the event if low/high frequency.
3570 * 1 - high frequency, 0 - low frequency
3571 *
3572 * Return: 0 on successfully enabling/disabling the events
3573 */
3574static int wma_log_supported_evt_handler(void *handle,
3575 uint8_t *event,
3576 uint32_t len)
3577{
3578 tp_wma_handle wma = (tp_wma_handle) handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003579
Govind Singhf25a0f12016-03-08 16:09:48 +05303580 if (wmi_unified_log_supported_evt_cmd(wma->wmi_handle,
3581 event, len))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003582 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003583
3584 return 0;
3585}
3586
3587/**
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303588 * wma_pdev_set_hw_mode_resp_evt_handler() - Set HW mode resp evt handler
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003589 * @handle: WMI handle
3590 * @event: Event recevied from FW
3591 * @len: Length of the event
3592 *
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303593 * Event handler for WMI_PDEV_SET_HW_MODE_RESP_EVENTID that is sent to host
3594 * driver in response to a WMI_PDEV_SET_HW_MODE_CMDID being sent to WLAN
3595 * firmware
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003596 *
Dustin Brownec2c92e2017-07-26 11:13:49 -07003597 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003598 */
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303599static int wma_pdev_set_hw_mode_resp_evt_handler(void *handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003600 uint8_t *event,
3601 uint32_t len)
3602{
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303603 WMI_PDEV_SET_HW_MODE_RESP_EVENTID_param_tlvs *param_buf;
3604 wmi_pdev_set_hw_mode_response_event_fixed_param *wmi_event;
3605 wmi_pdev_set_hw_mode_response_vdev_mac_entry *vdev_mac_entry;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003606 uint32_t i;
3607 struct sir_set_hw_mode_resp *hw_mode_resp;
3608 tp_wma_handle wma = (tp_wma_handle) handle;
3609
3610 if (!wma) {
3611 WMA_LOGE("%s: Invalid WMA handle", __func__);
3612 /* Since WMA handle itself is NULL, we cannot send fail
3613 * response back to LIM here
3614 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303615 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003616 }
Dustin Brownec2c92e2017-07-26 11:13:49 -07003617
3618 wma_release_wakelock(&wma->wmi_cmd_rsp_wake_lock);
Tushnim Bhattacharyya4a03db82017-11-10 17:58:28 -08003619 wma_remove_req(wma, 0, WMA_PDEV_SET_HW_MODE_RESP);
Dustin Brownec2c92e2017-07-26 11:13:49 -07003620
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303621 hw_mode_resp = qdf_mem_malloc(sizeof(*hw_mode_resp));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003622 if (!hw_mode_resp) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003623 /* Since this memory allocation itself failed, we cannot
3624 * send fail response back to LIM here
3625 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303626 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003627 }
3628
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303629 param_buf = (WMI_PDEV_SET_HW_MODE_RESP_EVENTID_param_tlvs *) event;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003630 if (!param_buf) {
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303631 WMA_LOGE("Invalid WMI_PDEV_SET_HW_MODE_RESP_EVENTID event");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003632 /* Need to send response back to upper layer to free
3633 * active command list
3634 */
3635 goto fail;
3636 }
Krunal Soni50a05542017-10-03 19:39:48 -07003637 if (param_buf->fixed_param->num_vdev_mac_entries >=
3638 MAX_VDEV_SUPPORTED) {
3639 WMA_LOGE("num_vdev_mac_entries crossed max value");
3640 goto fail;
3641 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003642
3643 wmi_event = param_buf->fixed_param;
Abhinav Kumara03659c2017-12-28 15:18:07 +05303644 if (wmi_event->num_vdev_mac_entries >
3645 param_buf->num_wmi_pdev_set_hw_mode_response_vdev_mac_mapping) {
3646 WMA_LOGE("Invalid num_vdev_mac_entries: %d",
3647 wmi_event->num_vdev_mac_entries);
3648 goto fail;
3649 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003650 hw_mode_resp->status = wmi_event->status;
3651 hw_mode_resp->cfgd_hw_mode_index = wmi_event->cfgd_hw_mode_index;
3652 hw_mode_resp->num_vdev_mac_entries = wmi_event->num_vdev_mac_entries;
3653
Kiran Kumar Lokere1d411bb2017-11-29 15:24:05 -08003654 WMA_LOGD("%s: status:%d cfgd_hw_mode_index:%d num_vdev_mac_entries:%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003655 __func__, wmi_event->status,
3656 wmi_event->cfgd_hw_mode_index,
3657 wmi_event->num_vdev_mac_entries);
3658 vdev_mac_entry =
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303659 param_buf->wmi_pdev_set_hw_mode_response_vdev_mac_mapping;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003660
3661 /* Store the vdev-mac map in WMA and prepare to send to PE */
3662 for (i = 0; i < wmi_event->num_vdev_mac_entries; i++) {
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303663 uint32_t vdev_id, mac_id, pdev_id;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003664
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003665 vdev_id = vdev_mac_entry[i].vdev_id;
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303666 pdev_id = vdev_mac_entry[i].pdev_id;
Rakesh Pillai6a36b0a2019-09-06 16:30:05 +05303667 if (pdev_id == OL_TXRX_PDEV_ID) {
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303668 WMA_LOGE("%s: soc level id received for mac id)",
Tushnim Bhattacharyyac23d56c2018-10-05 14:11:43 -07003669 __func__);
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303670 goto fail;
3671 }
Pragaspathi Thilagaraj0092b672018-05-23 17:08:45 +05303672 if (vdev_id >= wma->max_bssid) {
3673 WMA_LOGE("%s: vdev_id: %d is invalid, max_bssid: %d",
3674 __func__, vdev_id, wma->max_bssid);
3675 goto fail;
3676 }
3677
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303678 mac_id = WMA_PDEV_TO_MAC_MAP(vdev_mac_entry[i].pdev_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003679
Kiran Kumar Lokere1d411bb2017-11-29 15:24:05 -08003680 WMA_LOGD("%s: vdev_id:%d mac_id:%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003681 __func__, vdev_id, mac_id);
3682
3683 hw_mode_resp->vdev_mac_map[i].vdev_id = vdev_id;
3684 hw_mode_resp->vdev_mac_map[i].mac_id = mac_id;
3685 wma_update_intf_hw_mode_params(vdev_id, mac_id,
3686 wmi_event->cfgd_hw_mode_index);
3687 }
3688
3689 if (hw_mode_resp->status == SET_HW_MODE_STATUS_OK) {
3690 if (WMA_DEFAULT_HW_MODE_INDEX == wma->new_hw_mode_index) {
3691 wma->new_hw_mode_index = wmi_event->cfgd_hw_mode_index;
3692 } else {
3693 wma->old_hw_mode_index = wma->new_hw_mode_index;
3694 wma->new_hw_mode_index = wmi_event->cfgd_hw_mode_index;
3695 }
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003696 policy_mgr_update_hw_mode_index(wma->psoc,
3697 wmi_event->cfgd_hw_mode_index);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003698 }
3699
Kiran Kumar Lokere1d411bb2017-11-29 15:24:05 -08003700 WMA_LOGD("%s: Updated: old_hw_mode_index:%d new_hw_mode_index:%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003701 __func__, wma->old_hw_mode_index, wma->new_hw_mode_index);
3702
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303703 wma_send_msg(wma, SIR_HAL_PDEV_SET_HW_MODE_RESP,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003704 (void *) hw_mode_resp, 0);
3705
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303706 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003707
3708fail:
3709 WMA_LOGE("%s: Sending fail response to LIM", __func__);
3710 hw_mode_resp->status = SET_HW_MODE_STATUS_ECANCELED;
3711 hw_mode_resp->cfgd_hw_mode_index = 0;
3712 hw_mode_resp->num_vdev_mac_entries = 0;
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303713 wma_send_msg(wma, SIR_HAL_PDEV_SET_HW_MODE_RESP,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003714 (void *) hw_mode_resp, 0);
3715
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303716 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003717}
3718
3719/**
Naveen Rawat8cc23b02016-07-14 12:22:56 -07003720 * wma_process_pdev_hw_mode_trans_ind() - Process HW mode transition info
3721 *
3722 * @handle: WMA handle
3723 * @fixed_param: Event fixed parameters
3724 * @vdev_mac_entry - vdev mac entry
3725 * @hw_mode_trans_ind - Buffer to store parsed information
3726 *
3727 * Parses fixed_param, vdev_mac_entry and fills in the information into
3728 * hw_mode_trans_ind and wma
3729 *
3730 * Return: None
3731 */
3732void wma_process_pdev_hw_mode_trans_ind(void *handle,
3733 wmi_pdev_hw_mode_transition_event_fixed_param *fixed_param,
3734 wmi_pdev_set_hw_mode_response_vdev_mac_entry *vdev_mac_entry,
3735 struct sir_hw_mode_trans_ind *hw_mode_trans_ind)
3736{
3737 uint32_t i;
3738 tp_wma_handle wma = (tp_wma_handle) handle;
Harprit Chhabada3cfca962018-12-04 13:41:31 -08003739
gaurank kathpaliad2967a72018-05-01 12:35:14 +05303740 if (fixed_param->num_vdev_mac_entries > MAX_VDEV_SUPPORTED) {
3741 WMA_LOGE("Number of Vdev mac entries %d exceeded"
3742 " max vdev supported %d",
3743 fixed_param->num_vdev_mac_entries,
3744 MAX_VDEV_SUPPORTED);
3745 return;
3746 }
Naveen Rawat8cc23b02016-07-14 12:22:56 -07003747 hw_mode_trans_ind->old_hw_mode_index = fixed_param->old_hw_mode_index;
3748 hw_mode_trans_ind->new_hw_mode_index = fixed_param->new_hw_mode_index;
3749 hw_mode_trans_ind->num_vdev_mac_entries =
3750 fixed_param->num_vdev_mac_entries;
Kiran Kumar Lokere1d411bb2017-11-29 15:24:05 -08003751 WMA_LOGD("%s: old_hw_mode_index:%d new_hw_mode_index:%d entries=%d",
Naveen Rawat8cc23b02016-07-14 12:22:56 -07003752 __func__, fixed_param->old_hw_mode_index,
3753 fixed_param->new_hw_mode_index,
3754 fixed_param->num_vdev_mac_entries);
3755
Harprit Chhabada3cfca962018-12-04 13:41:31 -08003756 if (!vdev_mac_entry) {
3757 WMA_LOGE("Invalid vdev_mac_entry");
3758 return;
3759 }
3760
Naveen Rawat8cc23b02016-07-14 12:22:56 -07003761 /* Store the vdev-mac map in WMA and send to policy manager */
3762 for (i = 0; i < fixed_param->num_vdev_mac_entries; i++) {
3763 uint32_t vdev_id, mac_id, pdev_id;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003764
Naveen Rawat8cc23b02016-07-14 12:22:56 -07003765 vdev_id = vdev_mac_entry[i].vdev_id;
3766 pdev_id = vdev_mac_entry[i].pdev_id;
3767
Rakesh Pillai6a36b0a2019-09-06 16:30:05 +05303768 if (pdev_id == OL_TXRX_PDEV_ID) {
Naveen Rawat8cc23b02016-07-14 12:22:56 -07003769 WMA_LOGE("%s: soc level id received for mac id)",
Tushnim Bhattacharyyac23d56c2018-10-05 14:11:43 -07003770 __func__);
Naveen Rawat8cc23b02016-07-14 12:22:56 -07003771 return;
3772 }
Pragaspathi Thilagaraj0092b672018-05-23 17:08:45 +05303773 if (vdev_id >= wma->max_bssid) {
3774 WMA_LOGE("%s: vdev_id: %d is invalid, max_bssid: %d",
3775 __func__, vdev_id, wma->max_bssid);
3776 return;
3777 }
Naveen Rawat8cc23b02016-07-14 12:22:56 -07003778
3779 mac_id = WMA_PDEV_TO_MAC_MAP(vdev_mac_entry[i].pdev_id);
3780
Jianmin Zhucc6b3d02019-03-07 14:19:34 +08003781 wma_debug("vdev_id:%d mac_id:%d", vdev_id, mac_id);
Naveen Rawat8cc23b02016-07-14 12:22:56 -07003782
3783 hw_mode_trans_ind->vdev_mac_map[i].vdev_id = vdev_id;
3784 hw_mode_trans_ind->vdev_mac_map[i].mac_id = mac_id;
3785 wma_update_intf_hw_mode_params(vdev_id, mac_id,
3786 fixed_param->new_hw_mode_index);
3787 }
3788 wma->old_hw_mode_index = fixed_param->old_hw_mode_index;
3789 wma->new_hw_mode_index = fixed_param->new_hw_mode_index;
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003790 policy_mgr_update_new_hw_mode_index(wma->psoc,
3791 fixed_param->new_hw_mode_index);
3792 policy_mgr_update_old_hw_mode_index(wma->psoc,
3793 fixed_param->old_hw_mode_index);
Naveen Rawat8cc23b02016-07-14 12:22:56 -07003794
Kiran Kumar Lokere1d411bb2017-11-29 15:24:05 -08003795 WMA_LOGD("%s: Updated: old_hw_mode_index:%d new_hw_mode_index:%d",
Naveen Rawat8cc23b02016-07-14 12:22:56 -07003796 __func__, wma->old_hw_mode_index, wma->new_hw_mode_index);
3797}
3798
3799/**
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05303800 * wma_pdev_hw_mode_transition_evt_handler() - HW mode transition evt handler
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003801 * @handle: WMI handle
3802 * @event: Event recevied from FW
3803 * @len: Length of the event
3804 *
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05303805 * Event handler for WMI_PDEV_HW_MODE_TRANSITION_EVENTID that indicates an
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003806 * asynchronous hardware mode transition. This event notifies the host driver
3807 * that firmware independently changed the hardware mode for some reason, such
3808 * as Coex, LFR 3.0, etc
3809 *
3810 * Return: Success on receiving valid params from FW
3811 */
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05303812static int wma_pdev_hw_mode_transition_evt_handler(void *handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003813 uint8_t *event,
3814 uint32_t len)
3815{
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05303816 WMI_PDEV_HW_MODE_TRANSITION_EVENTID_param_tlvs *param_buf;
3817 wmi_pdev_hw_mode_transition_event_fixed_param *wmi_event;
3818 wmi_pdev_set_hw_mode_response_vdev_mac_entry *vdev_mac_entry;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003819 struct sir_hw_mode_trans_ind *hw_mode_trans_ind;
3820 tp_wma_handle wma = (tp_wma_handle) handle;
3821
3822 if (!wma) {
3823 /* This is an async event. So, not sending any event to LIM */
3824 WMA_LOGE("Invalid WMA handle");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303825 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003826 }
3827
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05303828 param_buf = (WMI_PDEV_HW_MODE_TRANSITION_EVENTID_param_tlvs *) event;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003829 if (!param_buf) {
3830 /* This is an async event. So, not sending any event to LIM */
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05303831 WMA_LOGE("Invalid WMI_PDEV_HW_MODE_TRANSITION_EVENTID event");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303832 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003833 }
3834
Arif Hussain34f72062017-10-04 17:25:24 -07003835 if (param_buf->fixed_param->num_vdev_mac_entries > MAX_VDEV_SUPPORTED) {
3836 WMA_LOGE("num_vdev_mac_entries: %d crossed max value: %d",
3837 param_buf->fixed_param->num_vdev_mac_entries,
3838 MAX_VDEV_SUPPORTED);
3839 return QDF_STATUS_E_FAILURE;
3840 }
3841
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303842 hw_mode_trans_ind = qdf_mem_malloc(sizeof(*hw_mode_trans_ind));
Arif Hussain157263f2018-10-03 13:07:15 -07003843 if (!hw_mode_trans_ind)
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003844 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003845
3846 wmi_event = param_buf->fixed_param;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003847 vdev_mac_entry =
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05303848 param_buf->wmi_pdev_set_hw_mode_response_vdev_mac_mapping;
Abhinav Kumara03659c2017-12-28 15:18:07 +05303849 if (wmi_event->num_vdev_mac_entries >
3850 param_buf->num_wmi_pdev_set_hw_mode_response_vdev_mac_mapping) {
3851 WMA_LOGE("Invalid num_vdev_mac_entries: %d",
3852 wmi_event->num_vdev_mac_entries);
3853 qdf_mem_free(hw_mode_trans_ind);
3854 return -EINVAL;
3855 }
Naveen Rawat8cc23b02016-07-14 12:22:56 -07003856 wma_process_pdev_hw_mode_trans_ind(wma, wmi_event, vdev_mac_entry,
3857 hw_mode_trans_ind);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003858 /* Pass the message to PE */
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05303859 wma_send_msg(wma, SIR_HAL_PDEV_HW_MODE_TRANS_IND,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003860 (void *) hw_mode_trans_ind, 0);
3861
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303862 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003863}
3864
3865/**
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05303866 * wma_pdev_set_dual_mode_config_resp_evt_handler() - Dual mode evt handler
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003867 * @handle: WMI handle
3868 * @event: Event received from FW
3869 * @len: Length of the event
3870 *
3871 * Notifies the host driver of the completion or failure of a
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05303872 * WMI_PDEV_SET_MAC_CONFIG_CMDID command. This event would be returned to
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003873 * the host driver once the firmware has completed a reconfiguration of the Scan
3874 * and FW mode configuration. This changes could include entering or leaving a
3875 * dual mac configuration for either scan and/or more permanent firmware mode.
3876 *
3877 * Return: Success on receiving valid params from FW
3878 */
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05303879static int wma_pdev_set_dual_mode_config_resp_evt_handler(void *handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003880 uint8_t *event,
3881 uint32_t len)
3882{
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05303883 WMI_PDEV_SET_MAC_CONFIG_RESP_EVENTID_param_tlvs *param_buf;
3884 wmi_pdev_set_mac_config_response_event_fixed_param *wmi_event;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003885 tp_wma_handle wma = (tp_wma_handle) handle;
3886 struct sir_dual_mac_config_resp *dual_mac_cfg_resp;
3887
3888 if (!wma) {
3889 WMA_LOGE("%s: Invalid WMA handle", __func__);
3890 /* Since the WMA handle is NULL, we cannot send resp to LIM.
3891 * So, returning from here.
3892 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303893 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003894 }
Krunal Sonia5ccb802017-07-03 12:59:40 -07003895 wma_release_wakelock(&wma->wmi_cmd_rsp_wake_lock);
Abhishek Singhd93a0b22018-10-30 17:04:56 +05303896 wma_remove_req(wma, 0, WMA_PDEV_MAC_CFG_RESP);
3897
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303898 dual_mac_cfg_resp = qdf_mem_malloc(sizeof(*dual_mac_cfg_resp));
Arif Hussain157263f2018-10-03 13:07:15 -07003899 if (!dual_mac_cfg_resp)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003900 /* Since the mem alloc failed, we cannot send resp to LIM.
3901 * So, returning from here.
3902 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303903 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003904
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05303905 param_buf = (WMI_PDEV_SET_MAC_CONFIG_RESP_EVENTID_param_tlvs *)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003906 event;
3907 if (!param_buf) {
3908 WMA_LOGE("%s: Invalid event", __func__);
3909 goto fail;
3910 }
3911
3912 wmi_event = param_buf->fixed_param;
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003913 WMA_LOGD("%s: status:%d", __func__, wmi_event->status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003914 dual_mac_cfg_resp->status = wmi_event->status;
3915
3916 if (SET_HW_MODE_STATUS_OK == dual_mac_cfg_resp->status) {
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003917 policy_mgr_update_dbs_scan_config(wma->psoc);
3918 policy_mgr_update_dbs_fw_config(wma->psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003919 }
3920
3921 /* Pass the message to PE */
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05303922 wma_send_msg(wma, SIR_HAL_PDEV_MAC_CFG_RESP,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003923 (void *) dual_mac_cfg_resp, 0);
3924
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303925 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003926
3927fail:
3928 WMA_LOGE("%s: Sending fail response to LIM", __func__);
3929 dual_mac_cfg_resp->status = SET_HW_MODE_STATUS_ECANCELED;
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05303930 wma_send_msg(wma, SIR_HAL_PDEV_MAC_CFG_RESP,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003931 (void *) dual_mac_cfg_resp, 0);
3932
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303933 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003934
3935}
3936
3937/**
gaurank kathpalia85f8a612018-02-21 18:55:24 +05303938 * wma_send_time_stamp_sync_cmd() - timer callback send timestamp to
3939 * firmware to sync with host.
3940 * @wma_handle: wma handle
3941 *
3942 * Return: void
3943 */
3944static void wma_send_time_stamp_sync_cmd(void *data)
3945{
3946 tp_wma_handle wma_handle;
3947 QDF_STATUS qdf_status;
3948
3949 wma_handle = (tp_wma_handle) data;
3950
3951 wmi_send_time_stamp_sync_cmd_tlv(wma_handle->wmi_handle);
3952
3953 /* Start/Restart the timer */
3954 qdf_status = qdf_mc_timer_start(&wma_handle->wma_fw_time_sync_timer,
3955 WMA_FW_TIME_SYNC_TIMER);
3956 if (QDF_IS_STATUS_ERROR(qdf_status))
3957 WMA_LOGE("Failed to start the firmware time sync timer");
3958}
3959
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07003960#ifdef WLAN_CONV_SPECTRAL_ENABLE
3961static void wma_register_spectral_cmds(tp_wma_handle wma_handle)
3962{
3963 struct wmi_spectral_cmd_ops cmd_ops;
3964
3965 cmd_ops.wmi_spectral_configure_cmd_send =
3966 wmi_unified_vdev_spectral_configure_cmd_send;
3967 cmd_ops.wmi_spectral_enable_cmd_send =
3968 wmi_unified_vdev_spectral_enable_cmd_send;
3969 wlan_register_wmi_spectral_cmd_ops(wma_handle->pdev, &cmd_ops);
3970}
3971#else
3972static void wma_register_spectral_cmds(tp_wma_handle wma_handle)
3973{
3974}
3975#endif
gaurank kathpalia85f8a612018-02-21 18:55:24 +05303976/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003977 * wma_start() - wma start function.
Jeff Johnsonc97816c2018-05-12 17:13:23 -07003978 * Initialize event handlers and timers.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003979 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303980 * Return: 0 on success, QDF Error on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003981 */
Jeff Johnsond4892552017-09-13 08:41:31 -07003982QDF_STATUS wma_start(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003983{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303984 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003985 tp_wma_handle wma_handle;
3986 int status;
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05303987 struct wmi_unified *wmi_handle;
Ke Huangae49ad02018-11-27 10:53:11 +08003988 struct mac_context *mac = NULL;
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07003989
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003990 WMA_LOGD("%s: Enter", __func__);
3991
Anurag Chouhan6d760662016-02-20 16:05:43 +05303992 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003993 /* validate the wma_handle */
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07003994 if (!wma_handle) {
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05303995 WMA_LOGE("%s: Invalid wma handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303996 qdf_status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003997 goto end;
3998 }
Sandeep Puligillad698bf52017-09-15 16:07:02 -07003999
Sourav Mohapatracf632572018-04-02 11:01:35 +05304000 wmi_handle = get_wmi_unified_hdl_from_psoc(wma_handle->psoc);
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304001 if (!wmi_handle) {
4002 WMA_LOGE("%s: Invalid wmi handle", __func__);
4003 qdf_status = QDF_STATUS_E_INVAL;
4004 goto end;
4005 }
4006
Ke Huangae49ad02018-11-27 10:53:11 +08004007 mac = cds_get_context(QDF_MODULE_ID_PE);
4008 if (!mac) {
4009 WMA_LOGE("%s: Invalid mac context", __func__);
4010 goto end;
4011 }
4012
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304013 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304014 wmi_roam_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05304015 wma_roam_event_callback,
Padma, Santhosh Kumar18169ce2017-03-02 18:04:02 +05304016 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004017 if (0 != status) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004018 WMA_LOGE("%s: Failed to register Roam callback", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304019 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004020 goto end;
4021 }
4022
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304023 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304024 wmi_wow_wakeup_host_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05304025 wma_wow_wakeup_host_event,
4026 WMA_RX_TASKLET_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004027 if (status) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004028 WMA_LOGE("%s: Failed to register wow wakeup host event handler",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004029 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304030 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004031 goto end;
4032 }
4033
Will Huang3cd2b7c2017-11-17 13:16:56 +08004034 if (wma_d0_wow_is_supported()) {
4035 status = wmi_unified_register_event_handler(
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304036 wmi_handle,
Will Huang9adefff2017-12-15 14:50:03 +08004037 wmi_d0_wow_disable_ack_event_id,
Will Huang3cd2b7c2017-11-17 13:16:56 +08004038 wma_d0_wow_disable_ack_event,
4039 WMA_RX_TASKLET_CTX);
4040 if (status) {
4041 WMA_LOGE("%s: Failed to register d0wow disable ack"
4042 " event handler", __func__);
4043 qdf_status = QDF_STATUS_E_FAILURE;
4044 goto end;
4045 }
4046 }
4047
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304048 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304049 wmi_pdev_resume_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05304050 wma_pdev_resume_event_handler,
4051 WMA_RX_TASKLET_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004052 if (status) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004053 WMA_LOGE("%s: Failed to register PDEV resume event handler",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004054 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304055 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004056 goto end;
4057 }
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05304058#if defined(QCA_LL_LEGACY_TX_FLOW_CONTROL) || \
4059 defined(QCA_LL_TX_FLOW_CONTROL_V2) || defined(CONFIG_HL_SUPPORT)
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08004060 WMA_LOGD("MCC TX Pause Event Handler register");
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304061 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304062 wmi_tx_pause_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05304063 wma_mcc_vdev_tx_pause_evt_handler,
4064 WMA_RX_TASKLET_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004065#endif /* QCA_LL_LEGACY_TX_FLOW_CONTROL */
4066
Kabilan Kannancaa85502018-04-13 18:04:58 -07004067 WMA_LOGD("Registering SAR2 response handler");
4068 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
4069 wmi_wlan_sar2_result_event_id,
4070 wma_sar_rsp_evt_handler,
4071 WMA_RX_SERIALIZER_CTX);
4072 if (status) {
4073 WMA_LOGE("Failed to register sar response event cb");
4074 qdf_status = QDF_STATUS_E_FAILURE;
4075 goto end;
4076 }
4077
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004078#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
4079 WMA_LOGD("Registering auto shutdown handler");
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304080 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304081 wmi_host_auto_shutdown_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05304082 wma_auto_shutdown_event_handler,
4083 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004084 if (status) {
4085 WMA_LOGE("Failed to register WMI Auto shutdown event handler");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304086 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004087 goto end;
4088 }
4089#endif /* FEATURE_WLAN_AUTO_SHUTDOWN */
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304090 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304091 wmi_thermal_mgmt_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05304092 wma_thermal_mgmt_evt_handler,
4093 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004094 if (status) {
4095 WMA_LOGE("Failed to register thermal mitigation event cb");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304096 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004097 goto end;
4098 }
4099
Zhang Qian47e22ce2018-01-04 15:38:38 +08004100 status = wma_ocb_register_callbacks(wma_handle);
4101 if (!QDF_IS_STATUS_SUCCESS(status)) {
4102 WMA_LOGE("Failed to register OCB callbacks");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304103 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004104 goto end;
4105 }
4106
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304107 qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004108
4109#ifdef QCA_WIFI_FTM
4110 /*
4111 * Tx mgmt attach requires TXRX context which is not created
4112 * in FTM mode. So skip the TX mgmt attach.
4113 */
Anurag Chouhan6d760662016-02-20 16:05:43 +05304114 if (cds_get_conparam() == QDF_GLOBAL_FTM_MODE)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004115 goto end;
4116#endif /* QCA_WIFI_FTM */
4117
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304118 if (wmi_service_enabled(wmi_handle, wmi_service_rmc)) {
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08004119
4120 WMA_LOGD("FW supports cesium network, registering event handlers");
4121
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004122 status = wmi_unified_register_event_handler(
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304123 wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304124 wmi_peer_info_event_id,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004125 wma_ibss_peer_info_event_handler,
4126 WMA_RX_SERIALIZER_CTX);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08004127 if (status) {
4128 WMA_LOGE("Failed to register ibss peer info event cb");
4129 qdf_status = QDF_STATUS_E_FAILURE;
4130 goto end;
4131 }
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004132 status = wmi_unified_register_event_handler(
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304133 wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304134 wmi_peer_tx_fail_cnt_thr_event_id,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004135 wma_fast_tx_fail_event_handler,
4136 WMA_RX_SERIALIZER_CTX);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08004137 if (status) {
4138 WMA_LOGE("Failed to register peer fast tx failure event cb");
4139 qdf_status = QDF_STATUS_E_FAILURE;
4140 goto end;
4141 }
4142 } else {
Bapiraju Alla779675f2020-01-23 14:24:55 +05304143 WMA_LOGD("Target does not support cesium network");
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08004144 }
4145
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304146 qdf_status = wma_tx_attach(wma_handle);
4147 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004148 WMA_LOGE("%s: Failed to register tx management", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004149 goto end;
4150 }
4151
Wu Gaof3cbeaf2019-01-15 18:26:25 +08004152 if (!mac->mlme_cfg->gen.enable_remove_time_stamp_sync_cmd &&
4153 cds_get_conparam() != QDF_GLOBAL_FTM_MODE) {
4154 /* Initialize firmware time stamp sync timer */
4155 qdf_status = qdf_mc_timer_init(
Ke Huangae49ad02018-11-27 10:53:11 +08004156 &wma_handle->wma_fw_time_sync_timer,
4157 QDF_TIMER_TYPE_SW,
4158 wma_send_time_stamp_sync_cmd,
4159 wma_handle);
Wu Gaof3cbeaf2019-01-15 18:26:25 +08004160 if (QDF_IS_STATUS_ERROR(qdf_status)) {
4161 WMA_LOGE("Failed to init fw time sync timer");
4162 goto end;
Lin Bai5dc8ddb2018-08-23 17:46:34 +08004163 }
Wu Gaof3cbeaf2019-01-15 18:26:25 +08004164
4165 /* Start firmware time stamp sync timer */
4166 wma_send_time_stamp_sync_cmd(wma_handle);
gaurank kathpalia85f8a612018-02-21 18:55:24 +05304167 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004168 /* Initialize log completion timeout */
Anurag Chouhan210db072016-02-22 18:42:15 +05304169 qdf_status = qdf_mc_timer_init(&wma_handle->log_completion_timer,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304170 QDF_TIMER_TYPE_SW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004171 wma_log_completion_timeout,
4172 wma_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304173 if (qdf_status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004174 WMA_LOGE("Failed to initialize log completion timeout");
4175 goto end;
4176 }
4177
Jeff Johnson6136fb92017-03-30 15:21:49 -07004178 status = wma_fips_register_event_handlers(wma_handle);
4179 if (!QDF_IS_STATUS_SUCCESS(status)) {
4180 WMA_LOGE("Failed to register FIPS event handler");
4181 qdf_status = QDF_STATUS_E_FAILURE;
4182 goto end;
4183 }
4184
Jeff Johnsonf0e54b02017-12-18 15:22:25 -08004185 status = wma_sar_register_event_handlers(wma_handle);
4186 if (!QDF_IS_STATUS_SUCCESS(status)) {
4187 WMA_LOGE("Failed to register SAR event handlers");
4188 qdf_status = QDF_STATUS_E_FAILURE;
4189 goto end;
4190 }
4191
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004192 /* Initialize the get temperature event handler */
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304193 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304194 wmi_pdev_temperature_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05304195 wma_pdev_temperature_evt_handler,
4196 WMA_RX_SERIALIZER_CTX);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304197 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004198 WMA_LOGE("Failed to register get_temperature event cb");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304199 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004200 goto end;
4201 }
4202
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304203 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304204 wmi_vdev_tsf_report_event_id,
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07004205 wma_vdev_tsf_handler,
4206 WMA_RX_SERIALIZER_CTX);
4207 if (0 != status) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004208 WMA_LOGE("%s: Failed to register tsf callback", __func__);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07004209 qdf_status = QDF_STATUS_E_FAILURE;
4210 goto end;
4211 }
4212
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05304213 /* Initialize the wma_pdev_set_hw_mode_resp_evt_handler event handler */
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304214 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304215 wmi_pdev_set_hw_mode_rsp_event_id,
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05304216 wma_pdev_set_hw_mode_resp_evt_handler,
Govind Singhd76a5b02016-03-08 15:12:14 +05304217 WMA_RX_SERIALIZER_CTX);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304218 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004219 WMA_LOGE("Failed to register set hw mode resp event cb");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304220 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004221 goto end;
4222 }
4223
4224 /* Initialize the WMI_SOC_HW_MODE_TRANSITION_EVENTID event handler */
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304225 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304226 wmi_pdev_hw_mode_transition_event_id,
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05304227 wma_pdev_hw_mode_transition_evt_handler,
Govind Singhd76a5b02016-03-08 15:12:14 +05304228 WMA_RX_SERIALIZER_CTX);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304229 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004230 WMA_LOGE("Failed to register hw mode transition event cb");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304231 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004232 goto end;
4233 }
4234
4235 /* Initialize the set dual mac configuration event handler */
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304236 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304237 wmi_pdev_set_mac_config_resp_event_id,
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05304238 wma_pdev_set_dual_mode_config_resp_evt_handler,
Govind Singhd76a5b02016-03-08 15:12:14 +05304239 WMA_RX_SERIALIZER_CTX);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304240 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004241 WMA_LOGE("Failed to register hw mode transition event cb");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304242 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004243 goto end;
4244 }
4245
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304246 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304247 wmi_coex_bt_activity_event_id,
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05304248 wma_wlan_bt_activity_evt_handler,
4249 WMA_RX_SERIALIZER_CTX);
4250 if (!QDF_IS_STATUS_SUCCESS(status)) {
4251 WMA_LOGE("Failed to register coex bt activity event handler");
4252 qdf_status = QDF_STATUS_E_FAILURE;
4253 goto end;
4254 }
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07004255 wma_register_spectral_cmds(wma_handle);
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05304256
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004257end:
4258 WMA_LOGD("%s: Exit", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304259 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004260}
4261
Jeff Johnson62cd6802018-07-20 12:38:25 -07004262QDF_STATUS wma_stop(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004263{
4264 tp_wma_handle wma_handle;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304265 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Govind Singhede435f2015-12-01 16:16:36 +05304266 int i;
Ke Huangae49ad02018-11-27 10:53:11 +08004267 struct mac_context *mac = NULL;
Abhishek Ambure0b2ea322019-09-23 19:25:39 +05304268 struct wlan_objmgr_vdev *vdev;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004269
Anurag Chouhan6d760662016-02-20 16:05:43 +05304270 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004271 WMA_LOGD("%s: Enter", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004272 /* validate the wma_handle */
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07004273 if (!wma_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004274 WMA_LOGE("%s: Invalid handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304275 qdf_status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004276 goto end;
4277 }
Ke Huangae49ad02018-11-27 10:53:11 +08004278 mac = cds_get_context(QDF_MODULE_ID_PE);
4279 if (!mac) {
4280 WMA_LOGE("%s: Invalid mac context", __func__);
4281 goto end;
4282 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004283#ifdef QCA_WIFI_FTM
4284 /*
4285 * Tx mgmt detach requires TXRX context which is not created
4286 * in FTM mode. So skip the TX mgmt detach.
4287 */
Anurag Chouhan6d760662016-02-20 16:05:43 +05304288 if (cds_get_conparam() == QDF_GLOBAL_FTM_MODE) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304289 qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004290 goto end;
4291 }
4292#endif /* QCA_WIFI_FTM */
4293
4294 if (wma_handle->ack_work_ctx) {
4295 cds_flush_work(&wma_handle->ack_work_ctx->ack_cmp_work);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304296 qdf_mem_free(wma_handle->ack_work_ctx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004297 wma_handle->ack_work_ctx = NULL;
4298 }
4299
4300 /* Destroy the timer for log completion */
Anurag Chouhan210db072016-02-22 18:42:15 +05304301 qdf_status = qdf_mc_timer_destroy(&wma_handle->log_completion_timer);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004302 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004303 WMA_LOGE("Failed to destroy the log completion timer");
Govind Singhede435f2015-12-01 16:16:36 +05304304 /* clean up ll-queue for all vdev */
4305 for (i = 0; i < wma_handle->max_bssid; i++) {
Abhishek Ambure0b2ea322019-09-23 19:25:39 +05304306 vdev = wma_handle->interfaces[i].vdev;
4307 if (!vdev)
4308 continue;
Rakesh Pillaied736052020-01-13 14:59:45 +05304309
4310 if (wma_is_vdev_up(i))
Rakesh Pillaif94b1622019-11-07 19:54:01 +05304311 cdp_fc_vdev_flush(cds_get_context(QDF_MODULE_ID_SOC),
4312 i);
Govind Singhede435f2015-12-01 16:16:36 +05304313 }
gaurank kathpalia85f8a612018-02-21 18:55:24 +05304314
Wu Gaof3cbeaf2019-01-15 18:26:25 +08004315 if (!mac->mlme_cfg->gen.enable_remove_time_stamp_sync_cmd &&
4316 cds_get_conparam() != QDF_GLOBAL_FTM_MODE) {
4317 /* Destroy firmware time stamp sync timer */
4318 qdf_status = qdf_mc_timer_destroy(
4319 &wma_handle->wma_fw_time_sync_timer);
4320 if (QDF_IS_STATUS_ERROR(qdf_status))
4321 WMA_LOGE("Failed to destroy fw sync timer");
gaurank kathpalia85f8a612018-02-21 18:55:24 +05304322 }
4323
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304324 qdf_status = wma_tx_detach(wma_handle);
4325 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004326 WMA_LOGE("%s: Failed to deregister tx management", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004327 goto end;
4328 }
4329
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004330end:
4331 WMA_LOGD("%s: Exit", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304332 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004333}
4334
4335/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004336 * wma_wmi_service_close() - close wma wmi service interface.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004337 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05304338 * Return: 0 on success, QDF Error on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004339 */
Jeff Johnson7b3ddc22017-09-13 09:42:44 -07004340QDF_STATUS wma_wmi_service_close(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004341{
Jeff Johnson7b3ddc22017-09-13 09:42:44 -07004342 void *cds_ctx;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004343 tp_wma_handle wma_handle;
Arun Kumar Khandavalli3801c4f2019-12-09 15:06:28 +05304344 uint8_t i;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004345
4346 WMA_LOGD("%s: Enter", __func__);
4347
Jeff Johnson7b3ddc22017-09-13 09:42:44 -07004348 cds_ctx = cds_get_global_context();
4349 if (!cds_ctx) {
4350 WMA_LOGE("%s: Invalid CDS context", __func__);
4351 return QDF_STATUS_E_INVAL;
4352 }
4353
Anurag Chouhan6d760662016-02-20 16:05:43 +05304354 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004355
4356 /* validate the wma_handle */
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07004357 if (!wma_handle) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004358 WMA_LOGE("%s: Invalid wma handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304359 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004360 }
4361
4362 /* validate the wmi handle */
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07004363 if (!wma_handle->wmi_handle) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004364 WMA_LOGE("%s: Invalid wmi handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304365 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004366 }
4367
4368 /* dettach the wmi serice */
4369 WMA_LOGD("calling wmi_unified_detach");
4370 wmi_unified_detach(wma_handle->wmi_handle);
4371 wma_handle->wmi_handle = NULL;
4372
Abhishek Amburec0069162019-10-01 14:10:23 +05304373 for (i = 0; i < wma_handle->max_bssid; i++)
Dustin Brownec2c92e2017-07-26 11:13:49 -07004374 wma_vdev_deinit(&wma_handle->interfaces[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004375
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304376 qdf_mem_free(wma_handle->interfaces);
Dustin Brownec2c92e2017-07-26 11:13:49 -07004377
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004378 /* free the wma_handle */
Jeff Johnsonadb3b1c2017-09-13 10:42:36 -07004379 cds_free_context(QDF_MODULE_ID_WMA, wma_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004380
hangtiane52fa912018-11-26 15:44:38 +08004381 if (((struct cds_context *)cds_ctx)->cfg_ctx)
4382 qdf_mem_free(((struct cds_context *)cds_ctx)->cfg_ctx);
Rajeev Kumarfe6e62f2018-10-22 16:18:41 -07004383 ((struct cds_context *)cds_ctx)->cfg_ctx = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004384 WMA_LOGD("%s: Exit", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304385 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004386}
4387
Xun Luoa858a472015-11-10 08:24:45 -08004388/**
4389 * wma_wmi_work_close() - close the work queue items associated with WMI
Xun Luoa858a472015-11-10 08:24:45 -08004390 *
4391 * This function closes work queue items associated with WMI, but not fully
4392 * closes WMI service.
4393 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304394 * Return: QDF_STATUS_SUCCESS if work close is successful. Otherwise
Xun Luoa858a472015-11-10 08:24:45 -08004395 * proper error codes.
4396 */
Jeff Johnson6b8473d2017-09-13 09:20:53 -07004397QDF_STATUS wma_wmi_work_close(void)
Xun Luoa858a472015-11-10 08:24:45 -08004398{
4399 tp_wma_handle wma_handle;
4400
4401 WMA_LOGD("%s: Enter", __func__);
4402
Anurag Chouhan6d760662016-02-20 16:05:43 +05304403 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Xun Luoa858a472015-11-10 08:24:45 -08004404
4405 /* validate the wma_handle */
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07004406 if (!wma_handle) {
Xun Luoa858a472015-11-10 08:24:45 -08004407 WMA_LOGE("%s: Invalid wma handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304408 return QDF_STATUS_E_INVAL;
Xun Luoa858a472015-11-10 08:24:45 -08004409 }
4410
4411 /* validate the wmi handle */
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07004412 if (!wma_handle->wmi_handle) {
Xun Luoa858a472015-11-10 08:24:45 -08004413 WMA_LOGE("%s: Invalid wmi handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304414 return QDF_STATUS_E_INVAL;
Xun Luoa858a472015-11-10 08:24:45 -08004415 }
4416
4417 /* remove the wmi work */
4418 WMA_LOGD("calling wmi_unified_remove_work");
4419 wmi_unified_remove_work(wma_handle->wmi_handle);
4420
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304421 return QDF_STATUS_SUCCESS;
Xun Luoa858a472015-11-10 08:24:45 -08004422}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004423
Krunal Soni2e48d012016-05-02 16:55:26 -07004424/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004425 * wma_close() - wma close function.
4426 * cleanup resources attached with wma.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004427 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05304428 * Return: 0 on success, QDF Error on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004429 */
Jeff Johnson542da352017-09-13 09:17:28 -07004430QDF_STATUS wma_close(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004431{
4432 tp_wma_handle wma_handle;
hangtian351b7c92019-01-17 16:52:45 +08004433 struct target_psoc_info *tgt_psoc_info;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304434 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004435
4436 WMA_LOGD("%s: Enter", __func__);
4437
Anurag Chouhan6d760662016-02-20 16:05:43 +05304438 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004439
4440 /* validate the wma_handle */
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07004441 if (!wma_handle) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004442 WMA_LOGE("%s: Invalid wma handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304443 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004444 }
4445
4446 /* validate the wmi handle */
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07004447 if (!wma_handle->wmi_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004448 WMA_LOGE("%s: Invalid wmi handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304449 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004450 }
4451
4452 /* Free DBS list */
4453 if (wma_handle->hw_mode.hw_mode_list) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304454 qdf_mem_free(wma_handle->hw_mode.hw_mode_list);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004455 wma_handle->hw_mode.hw_mode_list = NULL;
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004456 WMA_LOGD("%s: DBS list is freed", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004457 }
Arunk Khandavalli10af7282018-02-05 16:55:48 +05304458
Anurag Chouhan6d760662016-02-20 16:05:43 +05304459 if (cds_get_conparam() != QDF_GLOBAL_FTM_MODE) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004460#ifdef FEATURE_WLAN_EXTSCAN
Anurag Chouhana37b5b72016-02-21 14:53:42 +05304461 qdf_wake_lock_destroy(&wma_handle->extscan_wake_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004462#endif /* FEATURE_WLAN_EXTSCAN */
Anurag Chouhana37b5b72016-02-21 14:53:42 +05304463 qdf_wake_lock_destroy(&wma_handle->wow_wake_lock);
Mukul Sharmae44d0542017-05-23 21:50:56 +05304464 qdf_wake_lock_destroy(&wma_handle->wow_auth_req_wl);
4465 qdf_wake_lock_destroy(&wma_handle->wow_assoc_req_wl);
4466 qdf_wake_lock_destroy(&wma_handle->wow_deauth_rec_wl);
4467 qdf_wake_lock_destroy(&wma_handle->wow_disassoc_rec_wl);
4468 qdf_wake_lock_destroy(&wma_handle->wow_ap_assoc_lost_wl);
4469 qdf_wake_lock_destroy(&wma_handle->wow_auto_shutdown_wl);
4470 qdf_wake_lock_destroy(&wma_handle->roam_ho_wl);
Pragaspathi Thilagaraj0c4489f2019-08-05 20:50:23 +05304471 qdf_wake_lock_destroy(&wma_handle->roam_preauth_wl);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004472 }
4473
4474 /* unregister Firmware debug log */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304475 qdf_status = dbglog_deinit(wma_handle->wmi_handle);
4476 if (qdf_status != QDF_STATUS_SUCCESS)
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004477 WMA_LOGE("%s: dbglog_deinit failed", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004478
Anurag Chouhan210db072016-02-22 18:42:15 +05304479 qdf_status = qdf_mc_timer_destroy(&wma_handle->service_ready_ext_timer);
Anurag Chouhandf2b2682016-02-29 14:15:27 +05304480 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004481 WMA_LOGE("%s: Failed to destroy service ready ext event timer",
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05304482 __func__);
4483
Anurag Chouhandf2b2682016-02-29 14:15:27 +05304484 qdf_event_destroy(&wma_handle->target_suspend);
Anurag Chouhandf2b2682016-02-29 14:15:27 +05304485 qdf_event_destroy(&wma_handle->runtime_suspend);
4486 qdf_event_destroy(&wma_handle->recovery_event);
Kai Liu27f20372016-09-28 23:52:36 +08004487 qdf_event_destroy(&wma_handle->tx_frm_download_comp_event);
4488 qdf_event_destroy(&wma_handle->tx_queue_empty_event);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004489 wma_cleanup_hold_req(wma_handle);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05304490 qdf_wake_lock_destroy(&wma_handle->wmi_cmd_rsp_wake_lock);
Rajeev Kumarc58f7c22019-05-10 11:07:38 -07004491 qdf_runtime_lock_deinit(&wma_handle->sap_prevent_runtime_pm_lock);
Prashanth Bhatta87b6dc02017-01-19 15:17:58 -08004492 qdf_runtime_lock_deinit(&wma_handle->wmi_cmd_rsp_runtime_lock);
Poddar, Siddarth2fb98072017-07-19 14:58:30 +05304493 qdf_spinlock_destroy(&wma_handle->wma_hold_req_q_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004494
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07004495 if (wma_handle->pGetRssiReq) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304496 qdf_mem_free(wma_handle->pGetRssiReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004497 wma_handle->pGetRssiReq = NULL;
4498 }
Deepak Dhamdherebf1f9b12016-05-27 14:49:41 -07004499
yeshwanth sriram guntuka584c2332017-07-29 12:50:25 +05304500 wma_unified_radio_tx_mem_free(wma_handle);
Srinivas Girigowdaad874a82016-10-25 14:08:00 -07004501
Kiran Kumar Lokeref089a3a2017-04-20 21:39:26 -07004502 if (wma_handle->pdev) {
4503 wlan_objmgr_pdev_release_ref(wma_handle->pdev,
4504 WLAN_LEGACY_WMA_ID);
4505 wma_handle->pdev = NULL;
4506 }
Frank Liu00d73fe2017-05-19 22:11:28 +08004507
Nachiket Kukade37b4e6d2018-06-01 18:44:42 +05304508 pmo_unregister_get_beacon_interval_callback(wma_handle->psoc);
4509 pmo_unregister_get_dtim_period_callback(wma_handle->psoc);
Mukul Sharma44746042018-05-24 17:30:52 +05304510 pmo_unregister_is_device_in_low_pwr_mode(wma_handle->psoc);
4511 pmo_unregister_get_pause_bitmap(wma_handle->psoc);
4512 pmo_unregister_pause_bitmap_notifier(wma_handle->psoc);
Mukul Sharma6411bb82017-03-01 15:57:07 +05304513
hangtian351b7c92019-01-17 16:52:45 +08004514 tgt_psoc_info = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
4515 init_deinit_free_num_units(wma_handle->psoc, tgt_psoc_info);
Arunk Khandavallia6305a32018-01-25 11:19:18 +05304516 target_if_free_psoc_tgt_info(wma_handle->psoc);
4517
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +05304518 wlan_objmgr_psoc_release_ref(wma_handle->psoc, WLAN_LEGACY_WMA_ID);
4519 wma_handle->psoc = NULL;
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +05304520 wma_target_if_close(wma_handle);
Mukul Sharma6411bb82017-03-01 15:57:07 +05304521
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004522 WMA_LOGD("%s: Exit", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304523 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004524}
4525
4526/**
4527 * wma_update_fw_config() - update fw configuration
Dustin Brownb9987af2018-03-01 17:15:11 -08004528 * @psoc: psoc to query configuration from
4529 * @tgt_hdl: target capability info
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004530 *
4531 * Return: none
4532 */
Dustin Brownb9987af2018-03-01 17:15:11 -08004533static void wma_update_fw_config(struct wlan_objmgr_psoc *psoc,
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304534 struct target_psoc_info *tgt_hdl)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004535{
Dustin Brownb9987af2018-03-01 17:15:11 -08004536 target_resource_config *cfg = &tgt_hdl->info.wlan_res_cfg;
4537
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004538 /* Override the no. of max fragments as per platform configuration */
Dustin Brownb9987af2018-03-01 17:15:11 -08004539 cfg->max_frag_entries = QDF_MIN(QCA_OL_11AC_TX_MAX_FRAGS,
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304540 target_if_get_max_frag_entry(tgt_hdl));
Dustin Brownb9987af2018-03-01 17:15:11 -08004541 target_if_set_max_frag_entry(tgt_hdl, cfg->max_frag_entries);
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304542
Dustin Brownb9987af2018-03-01 17:15:11 -08004543 cfg->num_wow_filters = ucfg_pmo_get_num_wow_filters(psoc);
Nachiket Kukadee547a482018-05-22 16:43:30 +05304544 cfg->apf_instruction_size = ucfg_pmo_get_apf_instruction_size(psoc);
Dustin Brown67d69eb2018-03-02 11:11:34 -08004545 cfg->num_packet_filters = ucfg_pmo_get_num_packet_filters(psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004546}
4547
4548/**
Yun Parkb4f591d2017-03-29 15:51:01 -07004549 * wma_set_tx_partition_base() - set TX MSDU ID partition base for IPA
4550 * @value: TX MSDU ID partition base
4551 *
4552 * Return: none
4553 */
4554#ifdef IPA_OFFLOAD
4555static void wma_set_tx_partition_base(uint32_t value)
4556{
4557 cdp_ipa_set_uc_tx_partition_base(
4558 cds_get_context(QDF_MODULE_ID_SOC),
4559 (struct cdp_cfg *)cds_get_context(QDF_MODULE_ID_CFG),
4560 value);
4561 WMA_LOGD("%s: TX_MSDU_ID_PARTITION=%d", __func__,
4562 value);
4563}
4564#else
4565static void wma_set_tx_partition_base(uint32_t value)
4566{
4567}
4568#endif
4569
4570/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004571 * wma_update_target_services() - update target services from wma handle
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304572 * @wmi_handle: Unified wmi handle
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004573 * @cfg: target services
4574 *
4575 * Return: none
4576 */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304577static inline void wma_update_target_services(struct wmi_unified *wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004578 struct wma_tgt_services *cfg)
4579{
4580 /* STA power save */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304581 cfg->sta_power_save = wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304582 wmi_service_sta_pwrsave);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004583
4584 /* Enable UAPSD */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304585 cfg->uapsd = wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304586 wmi_service_ap_uapsd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004587
4588 /* Update AP DFS service */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304589 cfg->ap_dfs = wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304590 wmi_service_ap_dfs);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004591
4592 /* Enable 11AC */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304593 cfg->en_11ac = wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304594 wmi_service_11ac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004595 if (cfg->en_11ac)
4596 g_fw_wlan_feat_caps |= (1 << DOT11AC);
4597
4598 /* Proactive ARP response */
4599 g_fw_wlan_feat_caps |= (1 << WLAN_PERIODIC_TX_PTRN);
4600
4601 /* Enable WOW */
4602 g_fw_wlan_feat_caps |= (1 << WOW);
4603
4604 /* ARP offload */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304605 cfg->arp_offload = wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304606 wmi_service_arpns_offload);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004607
4608 /* Adaptive early-rx */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304609 cfg->early_rx = wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304610 wmi_service_early_rx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004611#ifdef FEATURE_WLAN_SCAN_PNO
4612 /* PNO offload */
Rajeev Kumar617aadd2018-05-31 16:36:13 -07004613 if (wmi_service_enabled(wmi_handle, wmi_service_nlo)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004614 cfg->pno_offload = true;
Rajeev Kumar617aadd2018-05-31 16:36:13 -07004615 g_fw_wlan_feat_caps |= (1 << PNO);
4616 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004617#endif /* FEATURE_WLAN_SCAN_PNO */
4618
4619#ifdef FEATURE_WLAN_EXTSCAN
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304620 if (wmi_service_enabled(wmi_handle, wmi_service_extscan))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004621 g_fw_wlan_feat_caps |= (1 << EXTENDED_SCAN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004622#endif /* FEATURE_WLAN_EXTSCAN */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304623 cfg->lte_coex_ant_share = wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304624 wmi_service_lte_ant_share_support);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004625#ifdef FEATURE_WLAN_TDLS
4626 /* Enable TDLS */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304627 if (wmi_service_enabled(wmi_handle, wmi_service_tdls)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004628 cfg->en_tdls = 1;
4629 g_fw_wlan_feat_caps |= (1 << TDLS);
4630 }
4631 /* Enable advanced TDLS features */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304632 if (wmi_service_enabled(wmi_handle, wmi_service_tdls_offchan)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004633 cfg->en_tdls_offchan = 1;
4634 g_fw_wlan_feat_caps |= (1 << TDLS_OFF_CHANNEL);
4635 }
4636
4637 cfg->en_tdls_uapsd_buf_sta =
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304638 wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304639 wmi_service_tdls_uapsd_buffer_sta);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004640 cfg->en_tdls_uapsd_sleep_sta =
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304641 wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304642 wmi_service_tdls_uapsd_sleep_sta);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004643#endif /* FEATURE_WLAN_TDLS */
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304644 if (wmi_service_enabled
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304645 (wmi_handle, wmi_service_beacon_offload))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004646 cfg->beacon_offload = true;
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304647 if (wmi_service_enabled
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304648 (wmi_handle, wmi_service_sta_pmf_offload))
mukul sharma72c8b222015-09-04 17:02:01 +05304649 cfg->pmf_offload = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004650#ifdef WLAN_FEATURE_ROAM_OFFLOAD
4651 /* Enable Roam Offload */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304652 cfg->en_roam_offload = wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304653 wmi_service_roam_ho_offload);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004654#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
4655#ifdef WLAN_FEATURE_NAN
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304656 if (wmi_service_enabled(wmi_handle, wmi_service_nan))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004657 g_fw_wlan_feat_caps |= (1 << NAN);
4658#endif /* WLAN_FEATURE_NAN */
4659
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304660 if (wmi_service_enabled(wmi_handle, wmi_service_rtt))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004661 g_fw_wlan_feat_caps |= (1 << RTT);
Yun Park4d968df2016-10-11 11:44:15 -07004662
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304663 if (wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304664 wmi_service_tx_msdu_id_new_partition_support)) {
Yun Parkb4f591d2017-03-29 15:51:01 -07004665 wma_set_tx_partition_base(HTT_TX_IPA_NEW_MSDU_ID_SPACE_BEGIN);
Yun Park4d968df2016-10-11 11:44:15 -07004666 } else {
Yun Parkb4f591d2017-03-29 15:51:01 -07004667 wma_set_tx_partition_base(HTT_TX_IPA_MSDU_ID_SPACE_BEGIN);
Yun Park4d968df2016-10-11 11:44:15 -07004668 }
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07004669
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304670 wma_he_update_tgt_services(wmi_handle, cfg);
Will Huang496b36c2017-07-11 16:38:50 +08004671
4672 cfg->get_peer_info_enabled =
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304673 wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304674 wmi_service_peer_stats_info);
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304675 if (wmi_service_enabled(wmi_handle, wmi_service_fils_support))
Vignesh Viswanathan731186f2017-09-18 13:47:37 +05304676 cfg->is_fils_roaming_supported = true;
Varun Reddy Yeturu62c32652017-10-26 15:32:35 -07004677
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304678 if (wmi_service_enabled(wmi_handle, wmi_service_mawc_support))
Varun Reddy Yeturu62c32652017-10-26 15:32:35 -07004679 cfg->is_fw_mawc_capable = true;
4680
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304681 if (wmi_service_enabled(wmi_handle,
4682 wmi_service_11k_neighbour_report_support))
Vignesh Viswanathan694e28e2018-01-18 20:53:57 +05304683 cfg->is_11k_offload_supported = true;
Varun Reddy Yeturu4b54ec82018-05-30 16:00:38 -07004684
4685 if (wmi_service_enabled(wmi_handle, wmi_service_twt_requestor))
4686 cfg->twt_requestor = true;
4687 if (wmi_service_enabled(wmi_handle, wmi_service_twt_responder))
4688 cfg->twt_responder = true;
Liangwei Dong0da14262018-07-03 03:30:23 -04004689 if (wmi_service_enabled(wmi_handle, wmi_service_obss_scan))
4690 cfg->obss_scan_offload = true;
Arunk Khandavallica56d4b2018-11-29 15:46:00 +05304691 if (wmi_service_enabled(wmi_handle, wmi_service_beacon_reception_stats))
4692 cfg->bcn_reception_stats = true;
Sourav Mohapatrac457ae62018-12-06 15:19:41 +05304693
4694 if (wmi_service_enabled(wmi_handle, wmi_service_vdev_latency_config))
4695 g_fw_wlan_feat_caps |= (1 << VDEV_LATENCY_CONFIG);
Abhishek Ambure5e9b6a42020-02-12 21:32:35 +05304696 if (wmi_service_enabled(wmi_handle,
4697 wmi_roam_scan_chan_list_to_host_support))
4698 cfg->is_roam_scan_ch_to_host = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004699}
4700
4701/**
4702 * wma_update_target_ht_cap() - update ht capabality from wma handle
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304703 * @tgt_hdl: pointer to structure target_psoc_info
4704 * @cfg: ht capability
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004705 *
4706 * Return: none
4707 */
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304708static inline void
4709wma_update_target_ht_cap(struct target_psoc_info *tgt_hdl,
4710 struct wma_tgt_ht_cap *cfg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004711{
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304712 int ht_cap_info;
4713
4714 ht_cap_info = target_if_get_ht_cap_info(tgt_hdl);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004715 /* RX STBC */
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304716 cfg->ht_rx_stbc = !!(ht_cap_info & WMI_HT_CAP_RX_STBC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004717
4718 /* TX STBC */
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304719 cfg->ht_tx_stbc = !!(ht_cap_info & WMI_HT_CAP_TX_STBC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004720
4721 /* MPDU density */
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304722 cfg->mpdu_density = ht_cap_info & WMI_HT_CAP_MPDU_DENSITY;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004723
4724 /* HT RX LDPC */
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304725 cfg->ht_rx_ldpc = !!(ht_cap_info & WMI_HT_CAP_LDPC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004726
4727 /* HT SGI */
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304728 cfg->ht_sgi_20 = !!(ht_cap_info & WMI_HT_CAP_HT20_SGI);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004729
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304730 cfg->ht_sgi_40 = !!(ht_cap_info & WMI_HT_CAP_HT40_SGI);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004731
4732 /* RF chains */
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304733 cfg->num_rf_chains = target_if_get_num_rf_chains(tgt_hdl);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004734
Jeff Johnson3fd21822016-11-08 11:30:37 -08004735 WMA_LOGD("%s: ht_cap_info - %x ht_rx_stbc - %d, ht_tx_stbc - %d\n"
4736 "mpdu_density - %d ht_rx_ldpc - %d ht_sgi_20 - %d\n"
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304737 "ht_sgi_40 - %d num_rf_chains - %d", __func__,
4738 ht_cap_info,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004739 cfg->ht_rx_stbc, cfg->ht_tx_stbc, cfg->mpdu_density,
4740 cfg->ht_rx_ldpc, cfg->ht_sgi_20, cfg->ht_sgi_40,
4741 cfg->num_rf_chains);
4742
4743}
4744
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004745/**
4746 * wma_update_target_vht_cap() - update vht capabality from wma handle
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304747 * @tgt_hdl: pointer to structure target_psoc_info
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004748 * @cfg: vht capabality
4749 *
4750 * Return: none
4751 */
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304752static inline void
4753wma_update_target_vht_cap(struct target_psoc_info *tgt_hdl,
4754 struct wma_tgt_vht_cap *cfg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004755{
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304756 int vht_cap_info = target_if_get_vht_cap_info(tgt_hdl);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004757
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304758 if (vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_11454)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004759 cfg->vht_max_mpdu = WMI_VHT_CAP_MAX_MPDU_LEN_11454;
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304760 else if (vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_7935)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004761 cfg->vht_max_mpdu = WMI_VHT_CAP_MAX_MPDU_LEN_7935;
4762 else
4763 cfg->vht_max_mpdu = 0;
4764
4765
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304766 if (vht_cap_info & WMI_VHT_CAP_CH_WIDTH_80P80_160MHZ) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004767 cfg->supp_chan_width = 1 << eHT_CHANNEL_WIDTH_80P80MHZ;
4768 cfg->supp_chan_width |= 1 << eHT_CHANNEL_WIDTH_160MHZ;
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304769 } else if (vht_cap_info & WMI_VHT_CAP_CH_WIDTH_160MHZ) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004770 cfg->supp_chan_width = 1 << eHT_CHANNEL_WIDTH_160MHZ;
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304771 } else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004772 cfg->supp_chan_width = 1 << eHT_CHANNEL_WIDTH_80MHZ;
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304773 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004774
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304775 cfg->vht_rx_ldpc = vht_cap_info & WMI_VHT_CAP_RX_LDPC;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004776
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304777 cfg->vht_short_gi_80 = vht_cap_info & WMI_VHT_CAP_SGI_80MHZ;
4778 cfg->vht_short_gi_160 = vht_cap_info & WMI_VHT_CAP_SGI_160MHZ;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004779
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304780 cfg->vht_tx_stbc = vht_cap_info & WMI_VHT_CAP_TX_STBC;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004781
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304782 cfg->vht_rx_stbc =
4783 (vht_cap_info & WMI_VHT_CAP_RX_STBC_1SS) |
4784 (vht_cap_info & WMI_VHT_CAP_RX_STBC_2SS) |
4785 (vht_cap_info & WMI_VHT_CAP_RX_STBC_3SS);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004786
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304787 cfg->vht_max_ampdu_len_exp = (vht_cap_info &
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004788 WMI_VHT_CAP_MAX_AMPDU_LEN_EXP)
4789 >> WMI_VHT_CAP_MAX_AMPDU_LEN_EXP_SHIFT;
4790
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304791 cfg->vht_su_bformer = vht_cap_info & WMI_VHT_CAP_SU_BFORMER;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004792
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304793 cfg->vht_su_bformee = vht_cap_info & WMI_VHT_CAP_SU_BFORMEE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004794
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304795 cfg->vht_mu_bformer = vht_cap_info & WMI_VHT_CAP_MU_BFORMER;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004796
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304797 cfg->vht_mu_bformee = vht_cap_info & WMI_VHT_CAP_MU_BFORMEE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004798
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304799 cfg->vht_txop_ps = vht_cap_info & WMI_VHT_CAP_TXOP_PS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004800
Jeff Johnson3fd21822016-11-08 11:30:37 -08004801 WMA_LOGD("%s: max_mpdu %d supp_chan_width %x rx_ldpc %x\n"
4802 "short_gi_80 %x tx_stbc %x rx_stbc %x txop_ps %x\n"
4803 "su_bformee %x mu_bformee %x max_ampdu_len_exp %d", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004804 cfg->vht_max_mpdu, cfg->supp_chan_width, cfg->vht_rx_ldpc,
4805 cfg->vht_short_gi_80, cfg->vht_tx_stbc, cfg->vht_rx_stbc,
4806 cfg->vht_txop_ps, cfg->vht_su_bformee, cfg->vht_mu_bformee,
4807 cfg->vht_max_ampdu_len_exp);
4808}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004809
4810/**
Krunal Sonica50b452017-08-04 22:24:59 -07004811 * wma_update_supported_bands() - update supported bands from service ready ext
Krunal Sonica50b452017-08-04 22:24:59 -07004812 * @supported_bands: Supported band given by FW through service ready ext params
4813 * @new_supported_bands: New supported band which needs to be updated by
4814 * this API which WMA layer understands
4815 *
4816 * This API will convert FW given supported band to enum which WMA layer
4817 * understands
4818 *
4819 * Return: QDF_STATUS
4820 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05304821static QDF_STATUS wma_update_supported_bands(
Krunal Sonica50b452017-08-04 22:24:59 -07004822 WLAN_BAND_CAPABILITY supported_bands,
4823 WMI_PHY_CAPABILITY *new_supported_bands)
4824{
4825 QDF_STATUS status = QDF_STATUS_SUCCESS;
4826
Krunal Sonica50b452017-08-04 22:24:59 -07004827 if (!new_supported_bands) {
4828 WMA_LOGE("%s: NULL new supported band variable", __func__);
4829 return QDF_STATUS_E_FAILURE;
4830 }
4831 switch (supported_bands) {
4832 case WLAN_2G_CAPABILITY:
4833 *new_supported_bands |= WMI_11G_CAPABILITY;
4834 break;
4835 case WLAN_5G_CAPABILITY:
4836 *new_supported_bands |= WMI_11A_CAPABILITY;
4837 break;
4838 default:
4839 WMA_LOGE("%s: wrong supported band", __func__);
4840 status = QDF_STATUS_E_FAILURE;
4841 break;
4842 }
4843 return status;
4844}
4845
4846/**
Krunal Soniaa664da2016-06-15 23:46:40 -07004847 * wma_derive_ext_ht_cap() - Derive HT caps based on given value
Krunal Soniaa664da2016-06-15 23:46:40 -07004848 * @ht_cap: given pointer to HT caps which needs to be updated
4849 * @tx_chain: given tx chainmask value
4850 * @rx_chain: given rx chainmask value
4851 * @value: new HT cap info provided in form of bitmask
4852 *
4853 * This function takes the value provided in form of bitmask and decodes
4854 * it. After decoding, what ever value it gets, it takes the union(max) or
4855 * intersection(min) with previously derived values.
4856 *
4857 * Return: none
4858 *
4859 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05304860static void wma_derive_ext_ht_cap(
Krunal Soniaa664da2016-06-15 23:46:40 -07004861 struct wma_tgt_ht_cap *ht_cap, uint32_t value,
4862 uint32_t tx_chain, uint32_t rx_chain)
4863{
4864 struct wma_tgt_ht_cap tmp = {0};
4865
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07004866 if (!ht_cap)
Krunal Soniaa664da2016-06-15 23:46:40 -07004867 return;
4868
Ankit Guptaa5076012016-09-14 11:32:19 -07004869 if (!qdf_mem_cmp(ht_cap, &tmp, sizeof(struct wma_tgt_ht_cap))) {
Krunal Soniaa664da2016-06-15 23:46:40 -07004870 ht_cap->ht_rx_stbc = (!!(value & WMI_HT_CAP_RX_STBC));
4871 ht_cap->ht_tx_stbc = (!!(value & WMI_HT_CAP_TX_STBC));
4872 ht_cap->mpdu_density = (!!(value & WMI_HT_CAP_MPDU_DENSITY));
4873 ht_cap->ht_rx_ldpc = (!!(value & WMI_HT_CAP_RX_LDPC));
4874 ht_cap->ht_sgi_20 = (!!(value & WMI_HT_CAP_HT20_SGI));
4875 ht_cap->ht_sgi_40 = (!!(value & WMI_HT_CAP_HT40_SGI));
4876 ht_cap->num_rf_chains =
4877 QDF_MAX(wma_get_num_of_setbits_from_bitmask(tx_chain),
4878 wma_get_num_of_setbits_from_bitmask(rx_chain));
4879 } else {
4880 ht_cap->ht_rx_stbc = QDF_MIN(ht_cap->ht_rx_stbc,
4881 (!!(value & WMI_HT_CAP_RX_STBC)));
4882 ht_cap->ht_tx_stbc = QDF_MAX(ht_cap->ht_tx_stbc,
4883 (!!(value & WMI_HT_CAP_TX_STBC)));
4884 ht_cap->mpdu_density = QDF_MIN(ht_cap->mpdu_density,
4885 (!!(value & WMI_HT_CAP_MPDU_DENSITY)));
4886 ht_cap->ht_rx_ldpc = QDF_MIN(ht_cap->ht_rx_ldpc,
4887 (!!(value & WMI_HT_CAP_RX_LDPC)));
4888 ht_cap->ht_sgi_20 = QDF_MIN(ht_cap->ht_sgi_20,
4889 (!!(value & WMI_HT_CAP_HT20_SGI)));
4890 ht_cap->ht_sgi_40 = QDF_MIN(ht_cap->ht_sgi_40,
4891 (!!(value & WMI_HT_CAP_HT40_SGI)));
4892 ht_cap->num_rf_chains =
4893 QDF_MAX(ht_cap->num_rf_chains,
4894 QDF_MAX(wma_get_num_of_setbits_from_bitmask(
4895 tx_chain),
4896 wma_get_num_of_setbits_from_bitmask(
4897 rx_chain)));
4898 }
4899}
4900
4901/**
4902 * wma_update_target_ext_ht_cap() - Update HT caps with given extended cap
Arunk Khandavalli10af7282018-02-05 16:55:48 +05304903 * @tgt_hdl - target psoc information
Krunal Soniaa664da2016-06-15 23:46:40 -07004904 * @ht_cap: HT cap structure to be filled
4905 *
4906 * This function loop through each hardware mode and for each hardware mode
4907 * again it loop through each MAC/PHY and pull the caps 2G and 5G specific
4908 * HT caps and derives the final cap.
4909 *
4910 * Return: none
4911 *
4912 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05304913static void wma_update_target_ext_ht_cap(struct target_psoc_info *tgt_hdl,
4914 struct wma_tgt_ht_cap *ht_cap)
Krunal Soniaa664da2016-06-15 23:46:40 -07004915{
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08004916 int i, total_mac_phy_cnt;
Krunal Soniaa664da2016-06-15 23:46:40 -07004917 uint32_t ht_2g, ht_5g;
4918 struct wma_tgt_ht_cap tmp_ht_cap = {0}, tmp_cap = {0};
Arunk Khandavalli10af7282018-02-05 16:55:48 +05304919 struct wlan_psoc_host_mac_phy_caps *mac_phy_cap;
4920 int num_hw_modes;
Krunal Soniaa664da2016-06-15 23:46:40 -07004921
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08004922 total_mac_phy_cnt = target_psoc_get_total_mac_phy_cnt(tgt_hdl);
Arunk Khandavalli10af7282018-02-05 16:55:48 +05304923 num_hw_modes = target_psoc_get_num_hw_modes(tgt_hdl);
4924 mac_phy_cap = target_psoc_get_mac_phy_cap(tgt_hdl);
Bapiraju Alla698e6112020-04-22 17:54:08 +05304925
4926 if (!mac_phy_cap) {
4927 WMA_LOGE("Invalid MAC PHY capabilities handle");
4928 return;
4929 }
4930
Krunal Soniaa664da2016-06-15 23:46:40 -07004931 /*
4932 * for legacy device extended cap might not even come, so in that case
4933 * don't overwrite legacy values
4934 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05304935 if (!num_hw_modes) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004936 WMA_LOGD("%s: No extended HT cap for current SOC", __func__);
Krunal Soniaa664da2016-06-15 23:46:40 -07004937 return;
4938 }
4939
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08004940 for (i = 0; i < total_mac_phy_cnt; i++) {
4941 ht_2g = mac_phy_cap[i].ht_cap_info_2G;
4942 ht_5g = mac_phy_cap[i].ht_cap_info_5G;
4943 if (ht_2g)
4944 wma_derive_ext_ht_cap(&tmp_ht_cap,
4945 ht_2g,
4946 mac_phy_cap[i].tx_chain_mask_2G,
4947 mac_phy_cap[i].rx_chain_mask_2G);
4948 if (ht_5g)
4949 wma_derive_ext_ht_cap(&tmp_ht_cap,
4950 ht_5g,
4951 mac_phy_cap[i].tx_chain_mask_5G,
4952 mac_phy_cap[i].rx_chain_mask_5G);
Krunal Soniaa664da2016-06-15 23:46:40 -07004953 }
4954
Ankit Guptaa5076012016-09-14 11:32:19 -07004955 if (qdf_mem_cmp(&tmp_cap, &tmp_ht_cap,
Krunal Soniaa664da2016-06-15 23:46:40 -07004956 sizeof(struct wma_tgt_ht_cap))) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004957 qdf_mem_copy(ht_cap, &tmp_ht_cap,
4958 sizeof(struct wma_tgt_ht_cap));
Krunal Soniaa664da2016-06-15 23:46:40 -07004959 }
4960
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004961 WMA_LOGD("%s: [ext ht cap] ht_rx_stbc - %d, ht_tx_stbc - %d\n"
Jeff Johnson3fd21822016-11-08 11:30:37 -08004962 "mpdu_density - %d ht_rx_ldpc - %d ht_sgi_20 - %d\n"
4963 "ht_sgi_40 - %d num_rf_chains - %d", __func__,
Krunal Soniaa664da2016-06-15 23:46:40 -07004964 ht_cap->ht_rx_stbc, ht_cap->ht_tx_stbc,
4965 ht_cap->mpdu_density, ht_cap->ht_rx_ldpc,
4966 ht_cap->ht_sgi_20, ht_cap->ht_sgi_40,
4967 ht_cap->num_rf_chains);
4968}
4969
4970/**
4971 * wma_derive_ext_vht_cap() - Derive VHT caps based on given value
Krunal Soniaa664da2016-06-15 23:46:40 -07004972 * @vht_cap: pointer to given VHT caps to be filled
4973 * @value: new VHT cap info provided in form of bitmask
4974 *
4975 * This function takes the value provided in form of bitmask and decodes
4976 * it. After decoding, what ever value it gets, it takes the union(max) or
4977 * intersection(min) with previously derived values.
4978 *
4979 * Return: none
4980 *
4981 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05304982static void wma_derive_ext_vht_cap(
Krunal Soniaa664da2016-06-15 23:46:40 -07004983 struct wma_tgt_vht_cap *vht_cap, uint32_t value)
4984{
4985 struct wma_tgt_vht_cap tmp_cap = {0};
4986 uint32_t tmp = 0;
4987
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07004988 if (!vht_cap)
Krunal Soniaa664da2016-06-15 23:46:40 -07004989 return;
4990
Ankit Guptaa5076012016-09-14 11:32:19 -07004991 if (!qdf_mem_cmp(vht_cap, &tmp_cap,
Krunal Soniaa664da2016-06-15 23:46:40 -07004992 sizeof(struct wma_tgt_vht_cap))) {
4993 if (value & WMI_VHT_CAP_MAX_MPDU_LEN_11454)
4994 vht_cap->vht_max_mpdu = WMI_VHT_CAP_MAX_MPDU_LEN_11454;
4995 else if (value & WMI_VHT_CAP_MAX_MPDU_LEN_7935)
4996 vht_cap->vht_max_mpdu = WMI_VHT_CAP_MAX_MPDU_LEN_7935;
4997 else
4998 vht_cap->vht_max_mpdu = 0;
4999
5000 if (value & WMI_VHT_CAP_CH_WIDTH_80P80_160MHZ) {
5001 vht_cap->supp_chan_width =
5002 1 << eHT_CHANNEL_WIDTH_80P80MHZ;
5003 vht_cap->supp_chan_width |=
5004 1 << eHT_CHANNEL_WIDTH_160MHZ;
5005 } else if (value & WMI_VHT_CAP_CH_WIDTH_160MHZ) {
5006 vht_cap->supp_chan_width =
5007 1 << eHT_CHANNEL_WIDTH_160MHZ;
5008 } else {
5009 vht_cap->supp_chan_width = 1 << eHT_CHANNEL_WIDTH_80MHZ;
5010 }
5011 vht_cap->vht_rx_ldpc = value & WMI_VHT_CAP_RX_LDPC;
5012 vht_cap->vht_short_gi_80 = value & WMI_VHT_CAP_SGI_80MHZ;
5013 vht_cap->vht_short_gi_160 = value & WMI_VHT_CAP_SGI_160MHZ;
5014 vht_cap->vht_tx_stbc = value & WMI_VHT_CAP_TX_STBC;
5015 vht_cap->vht_rx_stbc =
5016 (value & WMI_VHT_CAP_RX_STBC_1SS) |
5017 (value & WMI_VHT_CAP_RX_STBC_2SS) |
5018 (value & WMI_VHT_CAP_RX_STBC_3SS);
5019 vht_cap->vht_max_ampdu_len_exp =
5020 (value & WMI_VHT_CAP_MAX_AMPDU_LEN_EXP) >>
5021 WMI_VHT_CAP_MAX_AMPDU_LEN_EXP_SHIFT;
5022 vht_cap->vht_su_bformer = value & WMI_VHT_CAP_SU_BFORMER;
5023 vht_cap->vht_su_bformee = value & WMI_VHT_CAP_SU_BFORMEE;
5024 vht_cap->vht_mu_bformer = value & WMI_VHT_CAP_MU_BFORMER;
5025 vht_cap->vht_mu_bformee = value & WMI_VHT_CAP_MU_BFORMEE;
5026 vht_cap->vht_txop_ps = value & WMI_VHT_CAP_TXOP_PS;
5027 } else {
5028 if (value & WMI_VHT_CAP_MAX_MPDU_LEN_11454)
5029 tmp = WMI_VHT_CAP_MAX_MPDU_LEN_11454;
5030 else if (value & WMI_VHT_CAP_MAX_MPDU_LEN_7935)
5031 tmp = WMI_VHT_CAP_MAX_MPDU_LEN_7935;
5032 else
5033 tmp = 0;
5034 vht_cap->vht_max_mpdu = QDF_MIN(vht_cap->vht_max_mpdu, tmp);
5035
5036 if ((value & WMI_VHT_CAP_CH_WIDTH_80P80_160MHZ)) {
5037 tmp = (1 << eHT_CHANNEL_WIDTH_80P80MHZ) |
5038 (1 << eHT_CHANNEL_WIDTH_160MHZ);
5039 } else if (value & WMI_VHT_CAP_CH_WIDTH_160MHZ) {
5040 tmp = 1 << eHT_CHANNEL_WIDTH_160MHZ;
5041 } else {
5042 tmp = 1 << eHT_CHANNEL_WIDTH_80MHZ;
5043 }
5044 vht_cap->supp_chan_width =
5045 QDF_MAX(vht_cap->supp_chan_width, tmp);
5046 vht_cap->vht_rx_ldpc = QDF_MIN(vht_cap->vht_rx_ldpc,
5047 value & WMI_VHT_CAP_RX_LDPC);
5048 vht_cap->vht_short_gi_80 = QDF_MAX(vht_cap->vht_short_gi_80,
5049 value & WMI_VHT_CAP_SGI_80MHZ);
5050 vht_cap->vht_short_gi_160 = QDF_MAX(vht_cap->vht_short_gi_160,
5051 value & WMI_VHT_CAP_SGI_160MHZ);
5052 vht_cap->vht_tx_stbc = QDF_MAX(vht_cap->vht_tx_stbc,
5053 value & WMI_VHT_CAP_TX_STBC);
5054 vht_cap->vht_rx_stbc = QDF_MIN(vht_cap->vht_rx_stbc,
5055 (value & WMI_VHT_CAP_RX_STBC_1SS) |
5056 (value & WMI_VHT_CAP_RX_STBC_2SS) |
5057 (value & WMI_VHT_CAP_RX_STBC_3SS));
5058 vht_cap->vht_max_ampdu_len_exp =
5059 QDF_MIN(vht_cap->vht_max_ampdu_len_exp,
5060 (value & WMI_VHT_CAP_MAX_AMPDU_LEN_EXP) >>
5061 WMI_VHT_CAP_MAX_AMPDU_LEN_EXP_SHIFT);
5062 vht_cap->vht_su_bformer = QDF_MAX(vht_cap->vht_su_bformer,
5063 value & WMI_VHT_CAP_SU_BFORMER);
5064 vht_cap->vht_su_bformee = QDF_MAX(vht_cap->vht_su_bformee,
5065 value & WMI_VHT_CAP_SU_BFORMEE);
5066 vht_cap->vht_mu_bformer = QDF_MAX(vht_cap->vht_mu_bformer,
5067 value & WMI_VHT_CAP_MU_BFORMER);
5068 vht_cap->vht_mu_bformee = QDF_MAX(vht_cap->vht_mu_bformee,
5069 value & WMI_VHT_CAP_MU_BFORMEE);
5070 vht_cap->vht_txop_ps = QDF_MIN(vht_cap->vht_txop_ps,
5071 value & WMI_VHT_CAP_TXOP_PS);
5072 }
5073}
5074
5075/**
5076 * wma_update_target_ext_vht_cap() - Update VHT caps with given extended cap
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305077 * @tgt_hdl - target psoc information
Krunal Soniaa664da2016-06-15 23:46:40 -07005078 * @vht_cap: VHT cap structure to be filled
5079 *
5080 * This function loop through each hardware mode and for each hardware mode
5081 * again it loop through each MAC/PHY and pull the caps 2G and 5G specific
5082 * VHT caps and derives the final cap.
5083 *
5084 * Return: none
5085 *
5086 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305087static void wma_update_target_ext_vht_cap(struct target_psoc_info *tgt_hdl,
5088 struct wma_tgt_vht_cap *vht_cap)
Krunal Soniaa664da2016-06-15 23:46:40 -07005089{
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08005090 int i, num_hw_modes, total_mac_phy_cnt;
Krunal Soniaa664da2016-06-15 23:46:40 -07005091 uint32_t vht_cap_info_2g, vht_cap_info_5g;
5092 struct wma_tgt_vht_cap tmp_vht_cap = {0}, tmp_cap = {0};
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305093 struct wlan_psoc_host_mac_phy_caps *mac_phy_cap;
Kiran Kumar Lokere89f01f02019-08-06 18:22:39 -07005094 uint32_t vht_mcs_10_11_supp = 0;
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305095
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08005096 total_mac_phy_cnt = target_psoc_get_total_mac_phy_cnt(tgt_hdl);
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305097 num_hw_modes = target_psoc_get_num_hw_modes(tgt_hdl);
Bapiraju Alla698e6112020-04-22 17:54:08 +05305098
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305099 mac_phy_cap = target_psoc_get_mac_phy_cap(tgt_hdl);
Bapiraju Alla698e6112020-04-22 17:54:08 +05305100 if (!mac_phy_cap) {
5101 WMA_LOGE("Invalid MAC PHY capabilities handle");
5102 return;
5103 }
Krunal Soniaa664da2016-06-15 23:46:40 -07005104
5105 /*
5106 * for legacy device extended cap might not even come, so in that case
5107 * don't overwrite legacy values
5108 */
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08005109 if (!num_hw_modes) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07005110 WMA_LOGD("%s: No extended VHT cap for current SOC", __func__);
Krunal Soniaa664da2016-06-15 23:46:40 -07005111 return;
5112 }
5113
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08005114 for (i = 0; i < total_mac_phy_cnt; i++) {
5115 vht_cap_info_2g = mac_phy_cap[i].vht_cap_info_2G;
5116 vht_cap_info_5g = mac_phy_cap[i].vht_cap_info_5G;
5117 if (vht_cap_info_2g)
5118 wma_derive_ext_vht_cap(&tmp_vht_cap,
5119 vht_cap_info_2g);
5120 if (vht_cap_info_5g)
5121 wma_derive_ext_vht_cap(&tmp_vht_cap,
5122 vht_cap_info_5g);
Kiran Kumar Lokere89f01f02019-08-06 18:22:39 -07005123 if (WMI_GET_BITS(mac_phy_cap[i].vht_supp_mcs_5G, 16, 2) &&
5124 WMI_VHT_MCS_NOTIFY_EXT_SS_GET(mac_phy_cap[i].
5125 vht_supp_mcs_5G))
5126 vht_mcs_10_11_supp = 1;
5127 if (WMI_GET_BITS(mac_phy_cap[i].vht_supp_mcs_2G, 16, 2) &&
5128 WMI_VHT_MCS_NOTIFY_EXT_SS_GET(mac_phy_cap[i].
5129 vht_supp_mcs_2G))
5130 vht_mcs_10_11_supp = 1;
Krunal Soniaa664da2016-06-15 23:46:40 -07005131 }
5132
Ankit Guptaa5076012016-09-14 11:32:19 -07005133 if (qdf_mem_cmp(&tmp_cap, &tmp_vht_cap,
Krunal Soniaa664da2016-06-15 23:46:40 -07005134 sizeof(struct wma_tgt_vht_cap))) {
5135 qdf_mem_copy(vht_cap, &tmp_vht_cap,
5136 sizeof(struct wma_tgt_vht_cap));
5137 }
Kiran Kumar Lokere89f01f02019-08-06 18:22:39 -07005138 vht_cap->vht_mcs_10_11_supp = vht_mcs_10_11_supp;
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07005139 WMA_LOGD("%s: [ext vhtcap] max_mpdu %d supp_chan_width %x rx_ldpc %x\n"
Jeff Johnson3fd21822016-11-08 11:30:37 -08005140 "short_gi_80 %x tx_stbc %x rx_stbc %x txop_ps %x\n"
Kiran Kumar Lokere89f01f02019-08-06 18:22:39 -07005141 "su_bformee %x mu_bformee %x max_ampdu_len_exp %d\n"
5142 "vht_mcs_10_11_supp %d", __func__,
Krunal Soniaa664da2016-06-15 23:46:40 -07005143 vht_cap->vht_max_mpdu, vht_cap->supp_chan_width,
5144 vht_cap->vht_rx_ldpc, vht_cap->vht_short_gi_80,
5145 vht_cap->vht_tx_stbc, vht_cap->vht_rx_stbc,
5146 vht_cap->vht_txop_ps, vht_cap->vht_su_bformee,
Kiran Kumar Lokere89f01f02019-08-06 18:22:39 -07005147 vht_cap->vht_mu_bformee, vht_cap->vht_max_ampdu_len_exp,
5148 vht_cap->vht_mcs_10_11_supp);
Krunal Soniaa664da2016-06-15 23:46:40 -07005149}
5150
Jeff Johnson0918f242018-07-17 18:52:17 -07005151static void
5152wma_update_sar_version(struct wlan_psoc_host_service_ext_param *param,
5153 struct wma_tgt_cfg *cfg)
5154{
5155 cfg->sar_version = param ? param->sar_version : SAR_VERSION_1;
5156}
5157
Anurag Chouhan04dbf6d2016-09-08 15:32:52 +05305158/**
Krunal Sonica50b452017-08-04 22:24:59 -07005159 * wma_update_hdd_band_cap() - update band cap which hdd understands
5160 * @supported_band: supported band which has been given by FW
5161 * @tgt_cfg: target configuration to be updated
5162 *
5163 * Convert WMA given supported band to enum which HDD understands
5164 *
5165 * Return: None
5166 */
5167static void wma_update_hdd_band_cap(WMI_PHY_CAPABILITY supported_band,
5168 struct wma_tgt_cfg *tgt_cfg)
5169{
5170 switch (supported_band) {
5171 case WMI_11G_CAPABILITY:
5172 case WMI_11NG_CAPABILITY:
Varun Reddy Yeturua48bc412017-11-17 15:33:35 -08005173 tgt_cfg->band_cap = BAND_2G;
Krunal Sonica50b452017-08-04 22:24:59 -07005174 break;
5175 case WMI_11A_CAPABILITY:
5176 case WMI_11NA_CAPABILITY:
5177 case WMI_11AC_CAPABILITY:
Varun Reddy Yeturua48bc412017-11-17 15:33:35 -08005178 tgt_cfg->band_cap = BAND_5G;
Krunal Sonica50b452017-08-04 22:24:59 -07005179 break;
5180 case WMI_11AG_CAPABILITY:
5181 case WMI_11NAG_CAPABILITY:
5182 default:
Varun Reddy Yeturua48bc412017-11-17 15:33:35 -08005183 tgt_cfg->band_cap = BAND_ALL;
Krunal Sonica50b452017-08-04 22:24:59 -07005184 }
5185}
5186
5187/**
Arif Hussainee10f902017-12-27 16:30:17 -08005188 * wma_update_obss_detection_support() - update obss detection offload support
5189 * @wh: wma handle
5190 * @tgt_cfg: target configuration to be updated
5191 *
5192 * Update obss detection offload support based on service bit.
5193 *
5194 * Return: None
5195 */
5196static void wma_update_obss_detection_support(tp_wma_handle wh,
5197 struct wma_tgt_cfg *tgt_cfg)
5198{
Arif Hussain05fb4872018-01-03 16:02:55 -08005199 if (wmi_service_enabled(wh->wmi_handle,
5200 wmi_service_ap_obss_detection_offload))
Arif Hussainee10f902017-12-27 16:30:17 -08005201 tgt_cfg->obss_detection_offloaded = true;
5202 else
5203 tgt_cfg->obss_detection_offloaded = false;
5204}
5205
5206/**
Arif Hussain50689082019-03-26 12:07:58 -07005207 * wma_update_bcast_twt_support() - update bcost twt support
5208 * @wh: wma handle
5209 * @tgt_cfg: target configuration to be updated
5210 *
5211 * Update braodcast twt support based on service bit.
5212 *
5213 * Return: None
5214 */
5215static void wma_update_bcast_twt_support(tp_wma_handle wh,
5216 struct wma_tgt_cfg *tgt_cfg)
5217{
5218 if (wmi_service_enabled(wh->wmi_handle,
5219 wmi_service_bcast_twt_support))
5220 tgt_cfg->bcast_twt_support = true;
5221 else
5222 tgt_cfg->bcast_twt_support = false;
5223}
5224
5225/**
Arif Hussain05fb4872018-01-03 16:02:55 -08005226 * wma_update_obss_color_collision_support() - update obss color collision
5227 * offload support
5228 * @wh: wma handle
5229 * @tgt_cfg: target configuration to be updated
5230 *
5231 * Update obss color collision offload support based on service bit.
5232 *
5233 * Return: None
5234 */
5235static void wma_update_obss_color_collision_support(tp_wma_handle wh,
5236 struct wma_tgt_cfg *tgt_cfg)
5237{
5238 if (wmi_service_enabled(wh->wmi_handle, wmi_service_bss_color_offload))
5239 tgt_cfg->obss_color_collision_offloaded = true;
5240 else
5241 tgt_cfg->obss_color_collision_offloaded = false;
5242}
5243
Kiran Kumar Lokere571f0d32019-11-19 19:38:31 -08005244/**
5245 * wma_update_restricted_80p80_bw_support() - update restricted 80+80 supprot
5246 * @wh: wma handle
5247 * @tgt_cfg: target configuration to be updated
5248 *
5249 * Update restricted 80+80MHz (165MHz) BW support based on service bit.
5250 *
5251 * Return: None
5252 */
5253static void wma_update_restricted_80p80_bw_support(tp_wma_handle wh,
5254 struct wma_tgt_cfg *tgt_cfg)
5255{
5256 if (wmi_service_enabled(wh->wmi_handle,
5257 wmi_service_bw_165mhz_support))
5258 tgt_cfg->restricted_80p80_bw_supp = true;
5259 else
5260 tgt_cfg->restricted_80p80_bw_supp = false;
5261}
5262
Jeff Johnson6ec742c2018-03-31 15:21:08 -07005263#ifdef WLAN_SUPPORT_GREEN_AP
5264static void wma_green_ap_register_handlers(tp_wma_handle wma_handle)
5265{
5266 if (WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
5267 WMI_SERVICE_EGAP))
5268 target_if_green_ap_register_egap_event_handler(
5269 wma_handle->pdev);
5270
5271}
5272#else
5273static void wma_green_ap_register_handlers(tp_wma_handle wma_handle)
5274{
5275}
5276#endif
5277
Nachiket Kukade85aa3782018-11-02 20:12:34 +05305278#ifdef WLAN_FEATURE_NAN
5279static void wma_update_nan_target_caps(tp_wma_handle wma_handle,
5280 struct wma_tgt_cfg *tgt_cfg)
5281{
5282 if (wmi_service_enabled(wma_handle->wmi_handle,
5283 wmi_service_nan_disable_support))
5284 tgt_cfg->nan_caps.nan_disable_supported = 1;
5285
5286 if (wmi_service_enabled(wma_handle->wmi_handle,
5287 wmi_service_nan_dbs_support))
5288 tgt_cfg->nan_caps.nan_dbs_supported = 1;
5289
5290 if (wmi_service_enabled(wma_handle->wmi_handle,
5291 wmi_service_ndi_dbs_support))
5292 tgt_cfg->nan_caps.ndi_dbs_supported = 1;
5293
5294 if (wmi_service_enabled(wma_handle->wmi_handle,
5295 wmi_service_nan_sap_support))
5296 tgt_cfg->nan_caps.nan_sap_supported = 1;
5297
5298 if (wmi_service_enabled(wma_handle->wmi_handle,
5299 wmi_service_ndi_sap_support))
5300 tgt_cfg->nan_caps.ndi_sap_supported = 1;
Srinivas Dasari4c501192019-12-22 20:31:43 +05305301
5302 if (wmi_service_enabled(wma_handle->wmi_handle, wmi_service_nan_vdev))
5303 tgt_cfg->nan_caps.nan_vdev_allowed = 1;
gaurank kathpalia7fd92d92020-02-27 00:02:54 +05305304
5305 if (wmi_service_enabled(wma_handle->wmi_handle,
5306 wmi_service_sta_nan_ndi_four_port))
5307 tgt_cfg->nan_caps.sta_nan_ndi_ndi_allowed = 1;
Nachiket Kukade85aa3782018-11-02 20:12:34 +05305308}
5309#else
5310static void wma_update_nan_target_caps(tp_wma_handle wma_handle,
5311 struct wma_tgt_cfg *tgt_cfg)
5312{
5313}
5314#endif
5315
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05305316static uint8_t
5317wma_convert_chainmask_to_chain(uint8_t chainmask)
5318{
5319 uint8_t num_chains = 0;
5320
5321 while (chainmask) {
5322 chainmask &= (chainmask - 1);
5323 num_chains++;
5324 }
5325
5326 return num_chains;
5327}
5328
5329static void
5330wma_fill_chain_cfg(struct target_psoc_info *tgt_hdl,
5331 uint8_t phy)
5332{
5333 struct mac_context *mac_ctx;
5334 uint8_t num_chain;
5335 struct wlan_psoc_host_mac_phy_caps *mac_phy_cap =
5336 tgt_hdl->info.mac_phy_cap;
5337
5338 mac_ctx = cds_get_context(QDF_MODULE_ID_PE);
5339 if (!mac_ctx) {
5340 WMA_LOGE("fill chain cfg failed as mac_ctx is NULL");
5341 return;
5342 }
5343
5344 num_chain = wma_convert_chainmask_to_chain(mac_phy_cap[phy].
5345 tx_chain_mask_2G);
5346
5347 if (num_chain > mac_ctx->fw_chain_cfg.max_tx_chains_2g)
5348 mac_ctx->fw_chain_cfg.max_tx_chains_2g = num_chain;
5349
5350 num_chain = wma_convert_chainmask_to_chain(mac_phy_cap[phy].
5351 tx_chain_mask_5G);
5352
5353 if (num_chain > mac_ctx->fw_chain_cfg.max_tx_chains_5g)
5354 mac_ctx->fw_chain_cfg.max_tx_chains_5g = num_chain;
5355
5356 num_chain = wma_convert_chainmask_to_chain(mac_phy_cap[phy].
5357 rx_chain_mask_2G);
5358
5359 if (num_chain > mac_ctx->fw_chain_cfg.max_rx_chains_2g)
5360 mac_ctx->fw_chain_cfg.max_rx_chains_2g = num_chain;
5361
5362 num_chain = wma_convert_chainmask_to_chain(mac_phy_cap[phy].
5363 rx_chain_mask_5G);
5364
5365 if (num_chain > mac_ctx->fw_chain_cfg.max_rx_chains_5g)
5366 mac_ctx->fw_chain_cfg.max_rx_chains_5g = num_chain;
5367}
5368
gaurank kathpalia7ef72182019-05-29 19:41:25 +05305369static void wma_update_mlme_related_tgt_caps(struct wlan_objmgr_psoc *psoc,
5370 struct wmi_unified *wmi_handle)
5371{
5372 struct mlme_tgt_caps mlme_tgt_cfg;
5373
5374 mlme_tgt_cfg.data_stall_recovery_fw_support =
5375 wmi_service_enabled(wmi_handle,
5376 wmi_service_data_stall_recovery_support);
5377
Pragaspathi Thilagaraje11d42a2020-03-18 12:23:46 +05305378 mlme_tgt_cfg.stop_all_host_scan_support =
5379 wmi_service_enabled(wmi_handle,
5380 wmi_service_host_scan_stop_vdev_all);
5381
gaurank kathpalia7ef72182019-05-29 19:41:25 +05305382 /* Call this at last only after filling all the tgt caps */
5383 wlan_mlme_update_cfg_with_tgt_caps(psoc, &mlme_tgt_cfg);
5384}
5385
gaurank kathpaliae3140292019-11-12 16:44:31 +05305386static bool
5387wma_is_dbs_mandatory(struct wlan_objmgr_psoc *psoc,
5388 struct target_psoc_info *tgt_hdl)
5389{
5390 uint8_t i, total_mac_phy_cnt;
5391 struct wlan_psoc_host_mac_phy_caps *mac_cap, *mac_phy_cap;
5392 uint8_t supported_band = 0;
5393
5394 if (!policy_mgr_find_if_fw_supports_dbs(psoc) ||
Amruta Kulkarni447a3262020-02-05 14:57:04 -08005395 !policy_mgr_find_if_hwlist_has_dbs(psoc)) {
5396 wma_debug("DBS is not mandatory");
gaurank kathpaliae3140292019-11-12 16:44:31 +05305397 return false;
Amruta Kulkarni447a3262020-02-05 14:57:04 -08005398 }
gaurank kathpaliae3140292019-11-12 16:44:31 +05305399
5400 total_mac_phy_cnt = target_psoc_get_total_mac_phy_cnt(tgt_hdl);
5401 mac_phy_cap = target_psoc_get_mac_phy_cap(tgt_hdl);
Bapiraju Alla698e6112020-04-22 17:54:08 +05305402 if (!mac_phy_cap) {
5403 WMA_LOGE("Invalid MAC PHY capabilities handle");
5404 return false;
5405 }
5406
gaurank kathpaliae3140292019-11-12 16:44:31 +05305407
5408 for (i = 0; i < total_mac_phy_cnt; i++) {
5409 mac_cap = &mac_phy_cap[i];
Bapiraju Alla698e6112020-04-22 17:54:08 +05305410 if (mac_cap && (mac_cap->phy_id == 0))
gaurank kathpaliae3140292019-11-12 16:44:31 +05305411 supported_band |= mac_cap->supported_bands;
5412 }
5413
5414 /* If Mac0 supports both the bands then DBS is not mandatory */
5415 if (supported_band & WLAN_2G_CAPABILITY &&
5416 supported_band & WLAN_5G_CAPABILITY) {
5417 wma_debug("Mac0 supports both bands DBS is optional");
5418 return false;
5419 }
5420
5421 wma_info("MAC0 does not support both bands %d DBS is mandatory",
5422 supported_band);
5423
5424 return true;
5425}
5426
Arif Hussain05fb4872018-01-03 16:02:55 -08005427/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005428 * wma_update_hdd_cfg() - update HDD config
5429 * @wma_handle: wma handle
5430 *
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05305431 * Return: Zero on success err number on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005432 */
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05305433static int wma_update_hdd_cfg(tp_wma_handle wma_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005434{
5435 struct wma_tgt_cfg tgt_cfg;
Anurag Chouhan6d760662016-02-20 16:05:43 +05305436 void *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305437 target_resource_config *wlan_res_cfg;
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305438 struct wlan_psoc_host_service_ext_param *service_ext_param;
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05305439 struct target_psoc_info *tgt_hdl;
5440 struct wmi_unified *wmi_handle;
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05305441 uint8_t i;
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05305442 int ret;
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305443
5444 WMA_LOGD("%s: Enter", __func__);
5445
5446 tgt_hdl = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
5447 if (!tgt_hdl) {
5448 WMA_LOGE("%s: target psoc info is NULL", __func__);
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05305449 return -EINVAL;
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305450 }
5451
5452 wlan_res_cfg = target_psoc_get_wlan_res_cfg(tgt_hdl);
Arif Hussaind15902c2018-03-02 00:08:29 -08005453 if (!wlan_res_cfg) {
5454 WMA_LOGE("%s: wlan_res_cfg is null", __func__);
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05305455 return -EINVAL;
Arif Hussaind15902c2018-03-02 00:08:29 -08005456 }
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05305457
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305458 service_ext_param =
5459 target_psoc_get_service_ext_param(tgt_hdl);
Sourav Mohapatracf632572018-04-02 11:01:35 +05305460 wmi_handle = get_wmi_unified_hdl_from_psoc(wma_handle->psoc);
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05305461 if (!wmi_handle) {
5462 WMA_LOGE("%s: wmi handle is NULL", __func__);
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05305463 return -EINVAL;
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05305464 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005465
gaurank kathpalia7ef72182019-05-29 19:41:25 +05305466 wma_update_mlme_related_tgt_caps(wma_handle->psoc, wmi_handle);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305467 qdf_mem_zero(&tgt_cfg, sizeof(struct wma_tgt_cfg));
Naveen Rawat64e477e2016-05-20 10:34:56 -07005468
5469 tgt_cfg.sub_20_support = wma_handle->sub_20_support;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005470 tgt_cfg.reg_domain = wma_handle->reg_cap.eeprom_rd;
5471 tgt_cfg.eeprom_rd_ext = wma_handle->reg_cap.eeprom_rd_ext;
5472
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305473 tgt_cfg.max_intf_count = wlan_res_cfg->num_vdevs;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005474
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305475 qdf_mem_copy(tgt_cfg.hw_macaddr.bytes, wma_handle->hwaddr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005476 ATH_MAC_LEN);
5477
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05305478 wma_update_target_services(wmi_handle, &tgt_cfg.services);
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305479 wma_update_target_ht_cap(tgt_hdl, &tgt_cfg.ht_cap);
5480 wma_update_target_vht_cap(tgt_hdl, &tgt_cfg.vht_cap);
Krunal Soniaa664da2016-06-15 23:46:40 -07005481 /*
5482 * This will overwrite the structure filled by wma_update_target_ht_cap
5483 * and wma_update_target_vht_cap APIs.
5484 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305485 wma_update_target_ext_ht_cap(tgt_hdl, &tgt_cfg.ht_cap);
5486 wma_update_target_ext_vht_cap(tgt_hdl, &tgt_cfg.vht_cap);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005487
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305488 wma_update_target_ext_he_cap(tgt_hdl, &tgt_cfg);
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07005489
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305490 tgt_cfg.target_fw_version = target_if_get_fw_version(tgt_hdl);
5491 if (service_ext_param)
5492 tgt_cfg.target_fw_vers_ext =
5493 service_ext_param->fw_build_vers_ext;
5494
Ryan Hsuc6918552018-05-16 13:29:59 -07005495 tgt_cfg.hw_bd_id = wma_handle->hw_bd_id;
5496 tgt_cfg.hw_bd_info.bdf_version = wma_handle->hw_bd_info[BDF_VERSION];
5497 tgt_cfg.hw_bd_info.ref_design_id =
5498 wma_handle->hw_bd_info[REF_DESIGN_ID];
5499 tgt_cfg.hw_bd_info.customer_id = wma_handle->hw_bd_info[CUSTOMER_ID];
5500 tgt_cfg.hw_bd_info.project_id = wma_handle->hw_bd_info[PROJECT_ID];
5501 tgt_cfg.hw_bd_info.board_data_rev =
5502 wma_handle->hw_bd_info[BOARD_DATA_REV];
5503
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005504#ifdef WLAN_FEATURE_LPSS
5505 tgt_cfg.lpss_support = wma_handle->lpss_support;
5506#endif /* WLAN_FEATURE_LPSS */
5507 tgt_cfg.ap_arpns_support = wma_handle->ap_arpns_support;
Arif Hussaind54b62c2018-03-01 13:31:37 -08005508 tgt_cfg.dfs_cac_offload = wma_handle->is_dfs_offloaded;
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +05305509 tgt_cfg.rcpi_enabled = wma_handle->rcpi_enabled;
Arunk Khandavalli80a61352018-01-25 12:19:37 +05305510 wma_update_hdd_band_cap(target_if_get_phy_capability(tgt_hdl),
5511 &tgt_cfg);
Jeff Johnson0918f242018-07-17 18:52:17 -07005512 wma_update_sar_version(service_ext_param, &tgt_cfg);
Krishna Kumaar Natarajan1ae49112015-11-24 21:43:22 -08005513 tgt_cfg.fine_time_measurement_cap =
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305514 target_if_get_wmi_fw_sub_feat_caps(tgt_hdl);
Rajeev Kumar Sirasanagandla47873002016-09-09 13:46:09 +05305515 tgt_cfg.wmi_max_len = wmi_get_max_msg_len(wma_handle->wmi_handle)
5516 - WMI_TLV_HEADROOM;
Nachiket Kukade8b4bfd82017-05-25 18:34:48 +05305517 tgt_cfg.tx_bfee_8ss_enabled = wma_handle->tx_bfee_8ss_enabled;
gaurank kathpalia5fcefa92018-10-24 15:03:15 +05305518 tgt_cfg.dynamic_nss_chains_support =
5519 wma_handle->dynamic_nss_chains_support;
Arif Hussainee10f902017-12-27 16:30:17 -08005520 wma_update_obss_detection_support(wma_handle, &tgt_cfg);
Arif Hussain05fb4872018-01-03 16:02:55 -08005521 wma_update_obss_color_collision_support(wma_handle, &tgt_cfg);
Deepak Dhamdhere13230d32016-05-26 00:46:53 -07005522 wma_update_hdd_cfg_ndp(wma_handle, &tgt_cfg);
Nachiket Kukade85aa3782018-11-02 20:12:34 +05305523 wma_update_nan_target_caps(wma_handle, &tgt_cfg);
Arif Hussain50689082019-03-26 12:07:58 -07005524 wma_update_bcast_twt_support(wma_handle, &tgt_cfg);
Kiran Kumar Lokere571f0d32019-11-19 19:38:31 -08005525 wma_update_restricted_80p80_bw_support(wma_handle, &tgt_cfg);
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05305526 /* Take the max of chains supported by FW, which will limit nss */
5527 for (i = 0; i < tgt_hdl->info.total_mac_phy_cnt; i++)
5528 wma_fill_chain_cfg(tgt_hdl, i);
5529
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05305530 ret = wma_handle->tgt_cfg_update_cb(hdd_ctx, &tgt_cfg);
5531 if (ret)
5532 return -EINVAL;
Wu Gao3a65cc12016-08-14 09:38:34 +08005533
Jeff Johnson6ec742c2018-03-31 15:21:08 -07005534 wma_green_ap_register_handlers(wma_handle);
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05305535
5536 return ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005537}
5538
5539/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005540 * wma_dump_dbs_hw_mode() - Print the DBS HW modes
5541 * @wma_handle: WMA handle
5542 *
5543 * Prints the DBS HW modes sent by the FW as part
5544 * of WMI ready event
5545 *
5546 * Return: None
5547 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07005548static void wma_dump_dbs_hw_mode(tp_wma_handle wma_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005549{
5550 uint32_t i, param;
5551
5552 if (!wma_handle) {
5553 WMA_LOGE("%s: Invalid WMA handle", __func__);
5554 return;
5555 }
5556
5557 for (i = 0; i < wma_handle->num_dbs_hw_modes; i++) {
5558 param = wma_handle->hw_mode.hw_mode_list[i];
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08005559 WMA_LOGD("%s:[%d]-MAC0: tx_ss:%d rx_ss:%d bw_idx:%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005560 __func__, i,
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305561 WMA_HW_MODE_MAC0_TX_STREAMS_GET(param),
5562 WMA_HW_MODE_MAC0_RX_STREAMS_GET(param),
5563 WMA_HW_MODE_MAC0_BANDWIDTH_GET(param));
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08005564 WMA_LOGD("%s:[%d]-MAC1: tx_ss:%d rx_ss:%d bw_idx:%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005565 __func__, i,
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305566 WMA_HW_MODE_MAC1_TX_STREAMS_GET(param),
5567 WMA_HW_MODE_MAC1_RX_STREAMS_GET(param),
5568 WMA_HW_MODE_MAC1_BANDWIDTH_GET(param));
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08005569 WMA_LOGD("%s:[%d] DBS:%d SBS:%d", __func__, i,
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305570 WMA_HW_MODE_DBS_MODE_GET(param),
5571 WMA_HW_MODE_SBS_MODE_GET(param));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005572 }
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07005573 policy_mgr_dump_dbs_hw_mode(wma_handle->psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005574}
5575
5576/**
5577 * wma_init_scan_fw_mode_config() - Initialize scan/fw mode config
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305578 * @psoc: Object manager psoc
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05305579 * @scan_config: Scam mode configuration
5580 * @fw_config: FW mode configuration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005581 *
5582 * Enables all the valid bits of concurrent_scan_config_bits and
5583 * fw_mode_config_bits.
5584 *
5585 * Return: None
5586 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305587static void wma_init_scan_fw_mode_config(struct wlan_objmgr_psoc *psoc,
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07005588 uint32_t scan_config,
5589 uint32_t fw_config)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005590{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005591 WMA_LOGD("%s: Enter", __func__);
5592
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305593 if (!psoc) {
5594 WMA_LOGE("%s: obj psoc is NULL", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005595 return;
5596 }
5597
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305598 policy_mgr_init_dbs_config(psoc, scan_config, fw_config);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005599}
5600
Dustin Brown06259e52018-02-28 16:00:02 -08005601static void wma_set_pmo_caps(struct wlan_objmgr_psoc *psoc)
5602{
5603 QDF_STATUS status;
Sourav Mohapatra5daec822018-07-10 14:40:06 +05305604 tp_wma_handle wma;
Dustin Brown06259e52018-02-28 16:00:02 -08005605 struct pmo_device_caps caps;
5606
Sourav Mohapatra5daec822018-07-10 14:40:06 +05305607 wma = cds_get_context(QDF_MODULE_ID_WMA);
Arif Hussaineec28b52018-08-21 17:21:28 -07005608 if (!wma) {
5609 WMA_LOGE("%s: wma handler is null", __func__);
5610 return;
5611 }
5612
Dustin Brown06259e52018-02-28 16:00:02 -08005613 caps.arp_ns_offload =
Sourav Mohapatra5daec822018-07-10 14:40:06 +05305614 wmi_service_enabled(wma->wmi_handle, wmi_service_arpns_offload);
Dustin Brown06259e52018-02-28 16:00:02 -08005615 caps.apf =
Sourav Mohapatra5daec822018-07-10 14:40:06 +05305616 wmi_service_enabled(wma->wmi_handle, wmi_service_apf_offload);
Dustin Brown06259e52018-02-28 16:00:02 -08005617 caps.packet_filter =
Sourav Mohapatra5daec822018-07-10 14:40:06 +05305618 wmi_service_enabled(wma->wmi_handle,
5619 wmi_service_packet_filter_offload);
Dustin Brown06259e52018-02-28 16:00:02 -08005620 caps.unified_wow =
Sourav Mohapatra5daec822018-07-10 14:40:06 +05305621 wmi_service_enabled(wma->wmi_handle,
5622 wmi_service_unified_wow_capability);
Nachiket Kukade4b7c8e02018-06-01 22:53:06 +05305623 caps.li_offload =
Sourav Mohapatra5daec822018-07-10 14:40:06 +05305624 wmi_service_enabled(wma->wmi_handle,
5625 wmi_service_listen_interval_offload_support
5626 );
Dustin Brown06259e52018-02-28 16:00:02 -08005627
5628 status = ucfg_pmo_psoc_set_caps(psoc, &caps);
5629 if (QDF_IS_STATUS_ERROR(status))
5630 WMA_LOGE("Failed to set PMO capabilities; status:%d", status);
5631}
5632
Pragaspathi Thilagaraj1f3f99f2019-04-24 23:48:47 +05305633/**
5634 * wma_set_mlme_caps() - Populate the MLME related target capabilities to the
5635 * mlme component
5636 * @psoc: Pointer to psoc object
5637 *
5638 * Return: None
5639 */
5640static void wma_set_mlme_caps(struct wlan_objmgr_psoc *psoc)
5641{
5642 tp_wma_handle wma;
5643 bool tgt_cap;
Pragaspathi Thilagarajba42a982019-07-17 00:16:15 +05305644 uint32_t akm_bitmap = 0;
Pragaspathi Thilagaraj1f3f99f2019-04-24 23:48:47 +05305645 QDF_STATUS status;
5646
5647 wma = cds_get_context(QDF_MODULE_ID_WMA);
5648 if (!wma) {
5649 WMA_LOGE("%s: wma handler is null", __func__);
5650 return;
5651 }
5652
5653 tgt_cap = wmi_service_enabled(wma->wmi_handle,
5654 wmi_service_adaptive_11r_support);
5655
5656 status = ucfg_mlme_set_tgt_adaptive_11r_cap(psoc, tgt_cap);
5657 if (QDF_IS_STATUS_ERROR(status))
5658 WMA_LOGE("Failed to set adaptive 11r cap");
Pragaspathi Thilagarajba42a982019-07-17 00:16:15 +05305659
5660 tgt_cap = wmi_service_enabled(wma->wmi_handle,
5661 wmi_service_wpa3_ft_sae_support);
5662 if (tgt_cap)
5663 akm_bitmap |= (1 << AKM_FT_SAE);
5664
5665 tgt_cap = wmi_service_enabled(wma->wmi_handle,
5666 wmi_service_wpa3_ft_suite_b_support);
5667 if (tgt_cap)
5668 akm_bitmap |= (1 << AKM_FT_SUITEB_SHA384);
5669
5670 tgt_cap = wmi_service_enabled(wma->wmi_handle,
5671 wmi_service_ft_fils);
5672 if (tgt_cap)
5673 akm_bitmap |= (1 << AKM_FT_FILS);
5674
5675 tgt_cap = wmi_service_enabled(wma->wmi_handle,
5676 wmi_service_owe_roam_support);
5677 if (tgt_cap)
5678 akm_bitmap |= (1 << AKM_OWE);
5679
5680 tgt_cap = wmi_service_enabled(wma->wmi_handle,
5681 wmi_service_sae_roam_support);
5682 if (tgt_cap)
5683 akm_bitmap |= (1 << AKM_SAE);
5684
5685
5686 status = mlme_set_tgt_wpa3_roam_cap(psoc, akm_bitmap);
5687 if (QDF_IS_STATUS_ERROR(status))
5688 WMA_LOGE("Failed to set sae roam support");
Pragaspathi Thilagaraj1f3f99f2019-04-24 23:48:47 +05305689}
5690
Dustin Brown06259e52018-02-28 16:00:02 -08005691static void wma_set_component_caps(struct wlan_objmgr_psoc *psoc)
5692{
5693 wma_set_pmo_caps(psoc);
Pragaspathi Thilagaraj1f3f99f2019-04-24 23:48:47 +05305694 wma_set_mlme_caps(psoc);
Dustin Brown06259e52018-02-28 16:00:02 -08005695}
5696
Mukul Sharma44746042018-05-24 17:30:52 +05305697#if defined(WLAN_FEATURE_GTK_OFFLOAD) && defined(WLAN_POWER_MANAGEMENT_OFFLOAD)
5698static QDF_STATUS wma_register_gtk_offload_event(tp_wma_handle wma_handle)
5699{
5700 QDF_STATUS status = QDF_STATUS_E_FAILURE;
5701
5702 if (!wma_handle) {
5703 WMA_LOGE("%s: wma_handle passed is NULL", __func__);
5704 return QDF_STATUS_E_FAILURE;
5705 }
5706
5707 if (wmi_service_enabled(wma_handle->wmi_handle,
5708 wmi_service_gtk_offload)) {
5709 status = wmi_unified_register_event_handler(
5710 wma_handle->wmi_handle,
5711 wmi_gtk_offload_status_event_id,
5712 target_if_pmo_gtk_offload_status_event,
5713 WMA_RX_WORK_CTX);
5714 }
5715 return status;
5716}
5717#else
5718static QDF_STATUS wma_register_gtk_offload_event(tp_wma_handle wma_handle)
5719{
5720 return QDF_STATUS_SUCCESS;
5721}
5722#endif /* WLAN_FEATURE_GTK_OFFLOAD && WLAN_POWER_MANAGEMENT_OFFLOAD */
5723
Anurag Chouhan04dbf6d2016-09-08 15:32:52 +05305724/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005725 * wma_rx_service_ready_event() - event handler to process
5726 * wmi rx sevice ready event.
5727 * @handle: wma handle
5728 * @cmd_param_info: command params info
5729 *
5730 * Return: none
5731 */
Govind Singhd76a5b02016-03-08 15:12:14 +05305732int wma_rx_service_ready_event(void *handle, uint8_t *cmd_param_info,
Dustin Brown7678b6c2018-03-07 13:00:52 -08005733 uint32_t length)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005734{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005735 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005736 WMI_SERVICE_READY_EVENTID_param_tlvs *param_buf;
5737 wmi_service_ready_event_fixed_param *ev;
Dustin Brown7678b6c2018-03-07 13:00:52 -08005738 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005739 uint32_t *ev_wlan_dbs_hw_mode_list;
Leo Chang96464902016-10-28 11:10:54 -07005740 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Arunk Khandavallia6305a32018-01-25 11:19:18 +05305741 struct target_psoc_info *tgt_hdl;
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305742 struct wlan_psoc_target_capability_info *tgt_cap_info;
5743 target_resource_config *wlan_res_cfg;
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05305744 struct wmi_unified *wmi_handle;
5745 uint32_t *service_bitmap;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005746
5747 WMA_LOGD("%s: Enter", __func__);
5748
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05305749 if (!handle) {
5750 WMA_LOGE("%s: wma_handle passed is NULL", __func__);
5751 return -EINVAL;
5752 }
5753
Arunk Khandavallia6305a32018-01-25 11:19:18 +05305754 tgt_hdl = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
5755 if (!tgt_hdl) {
5756 WMA_LOGE("%s: target psoc info is NULL", __func__);
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305757 return -EINVAL;
Arunk Khandavallia6305a32018-01-25 11:19:18 +05305758 }
5759
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305760 wlan_res_cfg = target_psoc_get_wlan_res_cfg(tgt_hdl);
5761 tgt_cap_info = target_psoc_get_target_caps(tgt_hdl);
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05305762 service_bitmap = target_psoc_get_service_bitmap(tgt_hdl);
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305763
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005764 param_buf = (WMI_SERVICE_READY_EVENTID_param_tlvs *) cmd_param_info;
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05305765 if (!param_buf) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07005766 WMA_LOGE("%s: Invalid arguments", __func__);
Govind Singhd76a5b02016-03-08 15:12:14 +05305767 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005768 }
5769
5770 ev = param_buf->fixed_param;
5771 if (!ev) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07005772 WMA_LOGE("%s: Invalid buffer", __func__);
Govind Singhd76a5b02016-03-08 15:12:14 +05305773 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005774 }
5775
Sourav Mohapatracf632572018-04-02 11:01:35 +05305776 wmi_handle = get_wmi_unified_hdl_from_psoc(wma_handle->psoc);
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05305777 if (!wmi_handle) {
5778 WMA_LOGE("%s: wmi handle is NULL", __func__);
5779 return -EINVAL;
5780 }
5781
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08005782 WMA_LOGD("WMA <-- WMI_SERVICE_READY_EVENTID");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005783
Amar Singhal7b038ca2017-10-04 13:38:39 -07005784 if (ev->num_dbs_hw_modes > param_buf->num_wlan_dbs_hw_mode_list) {
5785 WMA_LOGE("FW dbs_hw_mode entry %d more than value %d in TLV hdr",
5786 ev->num_dbs_hw_modes,
5787 param_buf->num_wlan_dbs_hw_mode_list);
5788 return -EINVAL;
5789 }
5790
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005791 wma_handle->num_dbs_hw_modes = ev->num_dbs_hw_modes;
5792 ev_wlan_dbs_hw_mode_list = param_buf->wlan_dbs_hw_mode_list;
Arif Hussain157263f2018-10-03 13:07:15 -07005793
5794 /* Continuing with the rest of the processing,
5795 * even if memory allocation fails
5796 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005797 wma_handle->hw_mode.hw_mode_list =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305798 qdf_mem_malloc(sizeof(*wma_handle->hw_mode.hw_mode_list) *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005799 wma_handle->num_dbs_hw_modes);
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305800
5801 if (wma_handle->hw_mode.hw_mode_list)
5802 qdf_mem_copy(wma_handle->hw_mode.hw_mode_list,
5803 ev_wlan_dbs_hw_mode_list,
5804 (sizeof(*wma_handle->hw_mode.hw_mode_list) *
5805 wma_handle->num_dbs_hw_modes));
5806
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07005807 policy_mgr_init_dbs_hw_mode(wma_handle->psoc,
5808 ev->num_dbs_hw_modes, ev_wlan_dbs_hw_mode_list);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005809 wma_dump_dbs_hw_mode(wma_handle);
5810
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05305811 /* Initializes the fw_mode and scan_config to zero.
5812 * If ext service ready event is present it will set
5813 * the actual values of these two params.
5814 * This is to ensure that no garbage values would be
5815 * present in the absence of ext service ready event.
5816 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305817 wma_init_scan_fw_mode_config(wma_handle->psoc, 0, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005818
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305819 qdf_mem_copy(&wma_handle->reg_cap, param_buf->hal_reg_capabilities,
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305820 sizeof(HAL_REG_CAPABILITIES));
5821
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005822 wma_handle->vht_supp_mcs = ev->vht_supp_mcs;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005823
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305824 wma_handle->new_hw_mode_index = tgt_cap_info->default_dbs_hw_mode_index;
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07005825 policy_mgr_update_new_hw_mode_index(wma_handle->psoc,
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305826 tgt_cap_info->default_dbs_hw_mode_index);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005827
5828 WMA_LOGD("%s: Firmware default hw mode index : %d",
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305829 __func__, tgt_cap_info->default_dbs_hw_mode_index);
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08005830 WMA_LOGI("%s: Firmware build version : %08x",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005831 __func__, ev->fw_build_vers);
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305832 WMA_LOGD("FW fine time meas cap: 0x%x",
5833 tgt_cap_info->wmi_fw_sub_feat_caps);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005834
Ryan Hsuc6918552018-05-16 13:29:59 -07005835 wma_handle->hw_bd_id = ev->hw_bd_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005836
Ryan Hsuc6918552018-05-16 13:29:59 -07005837 wma_handle->hw_bd_info[BDF_VERSION] =
5838 WMI_GET_BDF_VERSION(ev->hw_bd_info);
5839 wma_handle->hw_bd_info[REF_DESIGN_ID] =
5840 WMI_GET_REF_DESIGN(ev->hw_bd_info);
5841 wma_handle->hw_bd_info[CUSTOMER_ID] =
5842 WMI_GET_CUSTOMER_ID(ev->hw_bd_info);
5843 wma_handle->hw_bd_info[PROJECT_ID] =
5844 WMI_GET_PROJECT_ID(ev->hw_bd_info);
5845 wma_handle->hw_bd_info[BOARD_DATA_REV] =
5846 WMI_GET_BOARD_DATA_REV(ev->hw_bd_info);
5847
5848 WMA_LOGI("%s: Board id: %x, Board version: %x %x %x %x %x",
5849 __func__, wma_handle->hw_bd_id,
5850 wma_handle->hw_bd_info[BDF_VERSION],
5851 wma_handle->hw_bd_info[REF_DESIGN_ID],
5852 wma_handle->hw_bd_info[CUSTOMER_ID],
5853 wma_handle->hw_bd_info[PROJECT_ID],
5854 wma_handle->hw_bd_info[BOARD_DATA_REV]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005855
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005856 /* wmi service is ready */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305857 qdf_mem_copy(wma_handle->wmi_service_bitmap,
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05305858 service_bitmap,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005859 sizeof(wma_handle->wmi_service_bitmap));
Nirav Shah22bf44d2015-12-10 15:39:48 +05305860
Leo Chang96464902016-10-28 11:10:54 -07005861 cdp_cfg_tx_set_is_mgmt_over_wmi_enabled(soc,
Dustin Brown7678b6c2018-03-07 13:00:52 -08005862 wmi_service_enabled(wmi_handle, wmi_service_mgmt_tx_wmi));
Leo Chang96464902016-10-28 11:10:54 -07005863 cdp_set_desc_global_pool_size(soc, ev->num_msdu_desc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005864 /* SWBA event handler for beacon transmission */
Harprit Chhabada98225f62018-12-11 15:29:55 -08005865 status = wma_register_swba_events(wma_handle->wmi_handle);
5866
Dustin Brown7678b6c2018-03-07 13:00:52 -08005867 if (QDF_IS_STATUS_ERROR(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005868 WMA_LOGE("Failed to register swba beacon event cb");
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305869 goto free_hw_mode_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005870 }
5871#ifdef WLAN_FEATURE_LPSS
5872 wma_handle->lpss_support =
Dustin Brown7678b6c2018-03-07 13:00:52 -08005873 wmi_service_enabled(wmi_handle, wmi_service_lpass);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005874#endif /* WLAN_FEATURE_LPSS */
5875
5876 /*
5877 * This Service bit is added to check for ARP/NS Offload
5878 * support for LL/HL targets
5879 */
5880 wma_handle->ap_arpns_support =
Dustin Brown7678b6c2018-03-07 13:00:52 -08005881 wmi_service_enabled(wmi_handle, wmi_service_ap_arpns_offload);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005882
Dustin Brown7678b6c2018-03-07 13:00:52 -08005883 if (wmi_service_enabled(wmi_handle, wmi_service_csa_offload)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005884 WMA_LOGD("%s: FW support CSA offload capability", __func__);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07005885 status = wmi_unified_register_event_handler(
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05305886 wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05305887 wmi_csa_handling_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05305888 wma_csa_offload_handler,
5889 WMA_RX_SERIALIZER_CTX);
Dustin Brown7678b6c2018-03-07 13:00:52 -08005890 if (QDF_IS_STATUS_ERROR(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005891 WMA_LOGE("Failed to register CSA offload event cb");
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305892 goto free_hw_mode_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005893 }
5894 }
5895
Dustin Brown7678b6c2018-03-07 13:00:52 -08005896 if (wmi_service_enabled(wmi_handle, wmi_service_mgmt_tx_wmi)) {
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08005897 WMA_LOGD("Firmware supports management TX over WMI,use WMI interface instead of HTT for management Tx");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005898 /*
5899 * Register Tx completion event handler for MGMT Tx over WMI
5900 * case
5901 */
5902 status = wmi_unified_register_event_handler(
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05305903 wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05305904 wmi_mgmt_tx_completion_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05305905 wma_mgmt_tx_completion_handler,
5906 WMA_RX_SERIALIZER_CTX);
Dustin Brown7678b6c2018-03-07 13:00:52 -08005907 if (QDF_IS_STATUS_ERROR(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005908 WMA_LOGE("Failed to register MGMT over WMI completion handler");
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305909 goto free_hw_mode_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005910 }
5911
Nirav Shah20489972016-06-16 19:20:28 +05305912 status = wmi_unified_register_event_handler(
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05305913 wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05305914 wmi_mgmt_tx_bundle_completion_event_id,
Nirav Shah20489972016-06-16 19:20:28 +05305915 wma_mgmt_tx_bundle_completion_handler,
5916 WMA_RX_SERIALIZER_CTX);
Dustin Brown7678b6c2018-03-07 13:00:52 -08005917 if (QDF_IS_STATUS_ERROR(status)) {
Nirav Shah20489972016-06-16 19:20:28 +05305918 WMA_LOGE("Failed to register MGMT over WMI completion handler");
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305919 goto free_hw_mode_list;
Nirav Shah20489972016-06-16 19:20:28 +05305920 }
5921
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005922 } else {
5923 WMA_LOGE("FW doesnot support WMI_SERVICE_MGMT_TX_WMI, Use HTT interface for Management Tx");
5924 }
Dustin Brown7678b6c2018-03-07 13:00:52 -08005925
Mukul Sharma44746042018-05-24 17:30:52 +05305926 status = wma_register_gtk_offload_event(wma_handle);
5927 if (QDF_IS_STATUS_ERROR(status)) {
5928 WMA_LOGE("Failed to register GTK offload event cb");
5929 goto free_hw_mode_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005930 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005931
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05305932 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05305933 wmi_tbttoffset_update_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05305934 wma_tbttoffset_update_event_handler,
5935 WMA_RX_SERIALIZER_CTX);
Dustin Brown7678b6c2018-03-07 13:00:52 -08005936 if (QDF_IS_STATUS_ERROR(status)) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07005937 WMA_LOGE("Failed to register WMI_TBTTOFFSET_UPDATE_EVENTID callback");
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305938 goto free_hw_mode_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005939 }
5940
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05305941 if (wmi_service_enabled(wma_handle->wmi_handle,
5942 wmi_service_rcpi_support)) {
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +05305943 /* register for rcpi response event */
5944 status = wmi_unified_register_event_handler(
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05305945 wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05305946 wmi_update_rcpi_event_id,
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +05305947 wma_rcpi_event_handler,
5948 WMA_RX_SERIALIZER_CTX);
Dustin Brown7678b6c2018-03-07 13:00:52 -08005949 if (QDF_IS_STATUS_ERROR(status)) {
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +05305950 WMA_LOGE("Failed to register RCPI event handler");
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305951 goto free_hw_mode_list;
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +05305952 }
5953 wma_handle->rcpi_enabled = true;
5954 }
5955
Govind Singhefc5ccd2016-04-25 11:11:55 +05305956 /* mac_id is replaced with pdev_id in converged firmware to have
5957 * multi-radio support. In order to maintain backward compatibility
5958 * with old fw, host needs to check WMI_SERVICE_DEPRECATED_REPLACE
5959 * in service bitmap from FW and host needs to set use_pdev_id in
5960 * wmi_resource_config to true. If WMI_SERVICE_DEPRECATED_REPLACE
5961 * service is not set, then host shall not expect MAC ID from FW in
5962 * VDEV START RESPONSE event and host shall use PDEV ID.
5963 */
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05305964 if (wmi_service_enabled(wmi_handle, wmi_service_deprecated_replace))
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305965 wlan_res_cfg->use_pdev_id = true;
Govind Singhefc5ccd2016-04-25 11:11:55 +05305966 else
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305967 wlan_res_cfg->use_pdev_id = false;
Govind Singhefc5ccd2016-04-25 11:11:55 +05305968
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305969 wlan_res_cfg->max_num_dbs_scan_duty_cycle = CDS_DBS_SCAN_CLIENTS_MAX;
Nitesh Shahf9a09ff2017-05-22 15:46:25 +05305970
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005971 /* Initialize the log supported event handler */
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05305972 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05305973 wmi_diag_event_id_log_supported_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05305974 wma_log_supported_evt_handler,
5975 WMA_RX_SERIALIZER_CTX);
Dustin Brown7678b6c2018-03-07 13:00:52 -08005976 if (QDF_IS_STATUS_ERROR(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005977 WMA_LOGE("Failed to register log supported event cb");
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305978 goto free_hw_mode_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005979 }
5980
Rakesh Pillai6a36b0a2019-09-06 16:30:05 +05305981 cdp_mark_first_wakeup_packet(
5982 soc, OL_TXRX_PDEV_ID,
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05305983 wmi_service_enabled(wmi_handle,
Visweswara Tanuku025f5862019-01-08 17:35:33 +05305984 wmi_service_mark_first_wakeup_packet));
Arif Hussaind54b62c2018-03-01 13:31:37 -08005985 wma_handle->is_dfs_offloaded =
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05305986 wmi_service_enabled(wmi_handle,
Visweswara Tanuku025f5862019-01-08 17:35:33 +05305987 wmi_service_dfs_phyerr_offload);
Arif Hussaindb6e4e92018-06-01 16:39:15 -07005988
Deepak Dhamdhere13230d32016-05-26 00:46:53 -07005989 wma_handle->nan_datapath_enabled =
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05305990 wmi_service_enabled(wma_handle->wmi_handle,
Visweswara Tanuku025f5862019-01-08 17:35:33 +05305991 wmi_service_nan_data);
5992
5993 wma_handle->fw_therm_throt_support =
5994 wmi_service_enabled(wma_handle->wmi_handle,
5995 wmi_service_tt);
Dustin Brown06259e52018-02-28 16:00:02 -08005996
5997 wma_set_component_caps(wma_handle->psoc);
5998
Dustin Brownb9987af2018-03-01 17:15:11 -08005999 wma_update_fw_config(wma_handle->psoc, tgt_hdl);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006000
Dustin Brown7678b6c2018-03-07 13:00:52 -08006001 status = wmi_unified_save_fw_version_cmd(wmi_handle, param_buf);
6002 if (QDF_IS_STATUS_ERROR(status)) {
Govind Singhf25a0f12016-03-08 16:09:48 +05306003 WMA_LOGE("Failed to send WMI_INIT_CMDID command");
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306004 goto free_hw_mode_list;
Govind Singhf25a0f12016-03-08 16:09:48 +05306005 }
6006
Zhu Jianmin2d87a1c2018-05-31 11:22:23 +08006007 if (wmi_service_enabled(wmi_handle, wmi_service_ext_msg)) {
6008 status = qdf_mc_timer_start(
6009 &wma_handle->service_ready_ext_timer,
6010 WMA_SERVICE_READY_EXT_TIMEOUT);
6011 if (QDF_IS_STATUS_ERROR(status))
6012 WMA_LOGE("Failed to start the service ready ext timer");
6013 }
Dustin Brown7678b6c2018-03-07 13:00:52 -08006014 wma_handle->tx_bfee_8ss_enabled =
6015 wmi_service_enabled(wmi_handle, wmi_service_8ss_tx_bfee);
Nachiket Kukade8b4bfd82017-05-25 18:34:48 +05306016
gaurank kathpalia5fcefa92018-10-24 15:03:15 +05306017 wma_handle->dynamic_nss_chains_support = wmi_service_enabled(wmi_handle,
6018 wmi_service_per_vdev_chain_support);
Arunk Khandavallia6305a32018-01-25 11:19:18 +05306019 target_psoc_set_num_radios(tgt_hdl, 1);
6020
Govind Singhd76a5b02016-03-08 15:12:14 +05306021 return 0;
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306022
6023free_hw_mode_list:
6024 if (wma_handle->hw_mode.hw_mode_list) {
6025 qdf_mem_free(wma_handle->hw_mode.hw_mode_list);
6026 wma_handle->hw_mode.hw_mode_list = NULL;
6027 WMA_LOGD("%s: DBS list is freed", __func__);
6028 }
6029
6030 return -EINVAL;
6031
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006032}
6033
6034/**
Krunal Soni0193b6f2016-08-15 15:53:43 -07006035 * wma_get_caps_for_phyidx_hwmode() - to fetch caps for given hw mode and band
6036 * @caps_per_phy: Pointer to capabilities structure which needs to be filled
6037 * @hw_mode: Provided hardware mode
6038 * @band: Provide band i.e. 2G or 5G
6039 *
6040 * This API finds cap which suitable for provided hw mode and band. If user
6041 * is provides some invalid hw mode then it will automatically falls back to
6042 * default hw mode
6043 *
6044 * Return: QDF_STATUS
6045 */
6046QDF_STATUS wma_get_caps_for_phyidx_hwmode(struct wma_caps_per_phy *caps_per_phy,
6047 enum hw_mode_dbs_capab hw_mode, enum cds_band_type band)
6048{
6049 t_wma_handle *wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Arunk Khandavalli2462f462018-01-25 14:41:02 +05306050 struct target_psoc_info *tgt_hdl;
6051 int ht_cap_info, vht_cap_info;
Liangwei Dongd4a91a62019-11-21 17:30:35 +08006052 uint8_t our_hw_mode = hw_mode, num_hw_modes;
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306053 struct wlan_psoc_host_mac_phy_caps *mac_phy_cap;
Liangwei Dong4d479e32019-06-25 05:53:43 -04006054 struct wlan_psoc_target_capability_info *tgt_cap_info;
Liangwei Dongd4a91a62019-11-21 17:30:35 +08006055 uint8_t total_mac_phy_cnt, i;
Krunal Soni0193b6f2016-08-15 15:53:43 -07006056
6057 if (!wma_handle) {
6058 WMA_LOGE("Invalid wma handle");
6059 return QDF_STATUS_E_FAILURE;
6060 }
6061
Arunk Khandavalli2462f462018-01-25 14:41:02 +05306062 tgt_hdl = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
6063 if (!tgt_hdl) {
6064 WMA_LOGE("%s: target psoc info is NULL", __func__);
6065 return -EINVAL;
6066 }
Liangwei Dongd4a91a62019-11-21 17:30:35 +08006067 if (!caps_per_phy) {
6068 WMA_LOGE("Invalid caps pointer");
6069 return QDF_STATUS_E_FAILURE;
6070 }
Arunk Khandavalli2462f462018-01-25 14:41:02 +05306071
6072 ht_cap_info = target_if_get_ht_cap_info(tgt_hdl);
6073 vht_cap_info = target_if_get_vht_cap_info(tgt_hdl);
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306074 num_hw_modes = target_psoc_get_num_hw_modes(tgt_hdl);
6075 mac_phy_cap = target_psoc_get_mac_phy_cap(tgt_hdl);
Liangwei Dong4d479e32019-06-25 05:53:43 -04006076 tgt_cap_info = target_psoc_get_target_caps(tgt_hdl);
Arunk Khandavalli2462f462018-01-25 14:41:02 +05306077
Bapiraju Alla698e6112020-04-22 17:54:08 +05306078 if (!mac_phy_cap) {
6079 WMA_LOGE("Invalid MAC PHY capabilities handle");
6080 return QDF_STATUS_E_FAILURE;
6081 }
6082
6083 if (!tgt_cap_info) {
6084 WMA_LOGE("Invalid target capabilities handle");
6085 return QDF_STATUS_E_FAILURE;
6086 }
6087
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306088 if (!num_hw_modes) {
jiad080abce2017-08-08 15:17:39 +08006089 WMA_LOGD("Invalid number of hw modes, use legacy HT/VHT caps");
Arunk Khandavalli2462f462018-01-25 14:41:02 +05306090 caps_per_phy->ht_2g = ht_cap_info;
6091 caps_per_phy->ht_5g = ht_cap_info;
6092 caps_per_phy->vht_2g = vht_cap_info;
6093 caps_per_phy->vht_5g = vht_cap_info;
jiad080abce2017-08-08 15:17:39 +08006094 /* legacy platform doesn't support HE IE */
Kiran Kumar Lokere1f96b4a2018-08-22 14:47:11 -07006095 caps_per_phy->he_2g[0] = 0;
6096 caps_per_phy->he_2g[1] = 0;
6097 caps_per_phy->he_5g[0] = 0;
6098 caps_per_phy->he_5g[1] = 0;
Liangwei Dong4d479e32019-06-25 05:53:43 -04006099 caps_per_phy->tx_chain_mask_2G =
6100 EXTRACT_TX_CHAIN_MASK_2G(tgt_cap_info->txrx_chainmask);
6101 caps_per_phy->rx_chain_mask_2G =
6102 EXTRACT_RX_CHAIN_MASK_2G(tgt_cap_info->txrx_chainmask);
6103 caps_per_phy->tx_chain_mask_5G =
6104 EXTRACT_TX_CHAIN_MASK_5G(tgt_cap_info->txrx_chainmask);
6105 caps_per_phy->rx_chain_mask_5G =
6106 EXTRACT_RX_CHAIN_MASK_5G(tgt_cap_info->txrx_chainmask);
jiad080abce2017-08-08 15:17:39 +08006107
6108 return QDF_STATUS_SUCCESS;
Krunal Soni0193b6f2016-08-15 15:53:43 -07006109 }
6110
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07006111 if (!policy_mgr_is_dbs_enable(wma_handle->psoc))
Krunal Soni0193b6f2016-08-15 15:53:43 -07006112 our_hw_mode = HW_MODE_DBS_NONE;
6113
Liangwei Dongd4a91a62019-11-21 17:30:35 +08006114 total_mac_phy_cnt = target_psoc_get_total_mac_phy_cnt(tgt_hdl);
6115 for (i = 0; i < total_mac_phy_cnt; i++) {
6116 if (our_hw_mode == HW_MODE_DBS &&
6117 mac_phy_cap[i].hw_mode_config_type != WMI_HW_MODE_DBS)
6118 continue;
6119
6120 if ((band == CDS_BAND_2GHZ || band == CDS_BAND_ALL) &&
6121 (WLAN_2G_CAPABILITY & mac_phy_cap[i].supported_bands) &&
6122 !caps_per_phy->tx_chain_mask_2G) {
6123 caps_per_phy->ht_2g = mac_phy_cap[i].ht_cap_info_2G;
6124 caps_per_phy->vht_2g = mac_phy_cap[i].vht_cap_info_2G;
6125 qdf_mem_copy(caps_per_phy->he_2g,
6126 mac_phy_cap[i].he_cap_info_2G,
6127 sizeof(caps_per_phy->he_2g));
6128
6129 caps_per_phy->tx_chain_mask_2G =
6130 mac_phy_cap[i].tx_chain_mask_2G;
6131 caps_per_phy->rx_chain_mask_2G =
6132 mac_phy_cap[i].rx_chain_mask_2G;
6133
6134 WMA_LOGD("Select 2G capable phyid[%d] chain %d %d ht 0x%x vht 0x%x",
6135 i,
6136 caps_per_phy->tx_chain_mask_2G,
6137 caps_per_phy->rx_chain_mask_2G,
6138 caps_per_phy->ht_2g,
6139 caps_per_phy->vht_2g);
6140 }
6141 if ((band == CDS_BAND_5GHZ || band == CDS_BAND_ALL) &&
6142 (WLAN_5G_CAPABILITY & mac_phy_cap[i].supported_bands) &&
6143 !caps_per_phy->tx_chain_mask_5G) {
6144 caps_per_phy->ht_5g = mac_phy_cap[i].ht_cap_info_5G;
6145 caps_per_phy->vht_5g = mac_phy_cap[i].vht_cap_info_5G;
6146 qdf_mem_copy(caps_per_phy->he_5g,
6147 mac_phy_cap[i].he_cap_info_5G,
6148 sizeof(caps_per_phy->he_5g));
6149
6150 caps_per_phy->tx_chain_mask_5G =
6151 mac_phy_cap[i].tx_chain_mask_5G;
6152 caps_per_phy->rx_chain_mask_5G =
6153 mac_phy_cap[i].rx_chain_mask_5G;
6154
6155 WMA_LOGD("Select 5G capable phyid[%d] chain %d %d ht 0x%x vht 0x%x",
6156 i,
6157 caps_per_phy->tx_chain_mask_5G,
6158 caps_per_phy->rx_chain_mask_5G,
6159 caps_per_phy->ht_5g,
6160 caps_per_phy->vht_5g);
6161 }
Krunal Soni0193b6f2016-08-15 15:53:43 -07006162 }
6163
Krunal Soni0193b6f2016-08-15 15:53:43 -07006164 return QDF_STATUS_SUCCESS;
6165}
6166
6167/**
6168 * wma_is_rx_ldpc_supported_for_channel() - to find out if ldpc is supported
6169 *
Manikandan Mohan0ba7e552019-10-23 17:38:35 -07006170 * @ch_freq: Channel freq for which it needs to check if rx ldpc is enabled
Krunal Soni0193b6f2016-08-15 15:53:43 -07006171 *
6172 * This API takes channel number as argument and takes default hw mode as DBS
6173 * to check if rx LDPC support is enabled for that channel or no
6174 */
Manikandan Mohan0ba7e552019-10-23 17:38:35 -07006175bool wma_is_rx_ldpc_supported_for_channel(uint32_t ch_freq)
Krunal Soni0193b6f2016-08-15 15:53:43 -07006176{
jiad080abce2017-08-08 15:17:39 +08006177 t_wma_handle *wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306178 struct target_psoc_info *tgt_hdl;
Krunal Soni0193b6f2016-08-15 15:53:43 -07006179 struct wma_caps_per_phy caps_per_phy = {0};
6180 enum cds_band_type band;
6181 bool status;
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306182 uint8_t num_hw_modes;
Krunal Soni0193b6f2016-08-15 15:53:43 -07006183
Amar Singhal4c3fbb42018-01-02 13:20:28 -08006184 if (!wma_handle) {
6185 WMA_LOGE("Invalid wma handle");
6186 return false;
6187 }
6188
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306189 tgt_hdl = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
6190 if (!tgt_hdl) {
6191 WMA_LOGE("Target handle is NULL");
6192 return QDF_STATUS_E_FAILURE;
6193 }
6194
6195 num_hw_modes = target_psoc_get_num_hw_modes(tgt_hdl);
6196
Manikandan Mohan0ba7e552019-10-23 17:38:35 -07006197 if (!WLAN_REG_IS_24GHZ_CH_FREQ(ch_freq))
Krunal Soni0193b6f2016-08-15 15:53:43 -07006198 band = CDS_BAND_5GHZ;
6199 else
6200 band = CDS_BAND_2GHZ;
6201
6202 if (QDF_STATUS_SUCCESS != wma_get_caps_for_phyidx_hwmode(
6203 &caps_per_phy,
6204 HW_MODE_DBS, band)) {
6205 return false;
6206 }
jiad080abce2017-08-08 15:17:39 +08006207
6208 /*
6209 * Legacy platforms like Rome set WMI_HT_CAP_LDPC to specify RX LDPC
6210 * capability. But new platforms like Helium set WMI_HT_CAP_RX_LDPC
6211 * instead.
6212 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306213 if (0 == num_hw_modes) {
jiad080abce2017-08-08 15:17:39 +08006214 status = (!!(caps_per_phy.ht_2g & WMI_HT_CAP_LDPC));
6215 } else {
Manikandan Mohan0ba7e552019-10-23 17:38:35 -07006216 if (WLAN_REG_IS_24GHZ_CH_FREQ(ch_freq))
jiad080abce2017-08-08 15:17:39 +08006217 status = (!!(caps_per_phy.ht_2g & WMI_HT_CAP_RX_LDPC));
6218 else
6219 status = (!!(caps_per_phy.ht_5g & WMI_HT_CAP_RX_LDPC));
6220 }
Krunal Soni0193b6f2016-08-15 15:53:43 -07006221
6222 return status;
6223}
6224
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07006225/**
6226 * wma_print_mac_phy_capabilities() - Prints MAC PHY capabilities
6227 * @cap: pointer to WMI_MAC_PHY_CAPABILITIES
6228 * @index: MAC_PHY index
6229 *
6230 * Return: none
6231 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306232static void wma_print_mac_phy_capabilities(struct wlan_psoc_host_mac_phy_caps
6233 *cap, int index)
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07006234{
Kiran Kumar Lokere1f96b4a2018-08-22 14:47:11 -07006235 uint32_t mac_2G[PSOC_HOST_MAX_MAC_SIZE];
6236 uint32_t mac_5G[PSOC_HOST_MAX_MAC_SIZE];
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07006237 uint32_t phy_2G[WMI_MAX_HECAP_PHY_SIZE];
6238 uint32_t phy_5G[WMI_MAX_HECAP_PHY_SIZE];
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306239 struct wlan_psoc_host_ppe_threshold ppet_2G, ppet_5G;
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07006240
Dustin Brown576eea42018-06-21 12:38:21 -07006241 WMA_LOGD("\t: index [%d]", index);
6242 WMA_LOGD("\t: cap for hw_mode_id[%d]", cap->hw_mode_id);
6243 WMA_LOGD("\t: pdev_id[%d]", cap->pdev_id);
6244 WMA_LOGD("\t: phy_id[%d]", cap->phy_id);
Rachit Kankane4b6fdd12019-01-10 20:51:16 +05306245 WMA_LOGD("\t: hw_mode_config_type[%d]", cap->hw_mode_config_type);
Dustin Brown576eea42018-06-21 12:38:21 -07006246 WMA_LOGD("\t: supports_11b[%d]", cap->supports_11b);
6247 WMA_LOGD("\t: supports_11g[%d]", cap->supports_11g);
6248 WMA_LOGD("\t: supports_11a[%d]", cap->supports_11a);
6249 WMA_LOGD("\t: supports_11n[%d]", cap->supports_11n);
6250 WMA_LOGD("\t: supports_11ac[%d]", cap->supports_11ac);
6251 WMA_LOGD("\t: supports_11ax[%d]", cap->supports_11ax);
6252 WMA_LOGD("\t: supported_bands[%d]", cap->supported_bands);
6253 WMA_LOGD("\t: ampdu_density[%d]", cap->ampdu_density);
6254 WMA_LOGD("\t: max_bw_supported_2G[%d]", cap->max_bw_supported_2G);
6255 WMA_LOGD("\t: ht_cap_info_2G[%d]", cap->ht_cap_info_2G);
Kiran Kumar Lokere89f01f02019-08-06 18:22:39 -07006256 WMA_LOGD("\t: vht_cap_info_2G[0x%0X]", cap->vht_cap_info_2G);
6257 WMA_LOGD("\t: vht_supp_mcs_2G[0x%0X]", cap->vht_supp_mcs_2G);
Dustin Brown576eea42018-06-21 12:38:21 -07006258 WMA_LOGD("\t: tx_chain_mask_2G[%d]", cap->tx_chain_mask_2G);
6259 WMA_LOGD("\t: rx_chain_mask_2G[%d]", cap->rx_chain_mask_2G);
6260 WMA_LOGD("\t: max_bw_supported_5G[%d]", cap->max_bw_supported_5G);
6261 WMA_LOGD("\t: ht_cap_info_5G[%d]", cap->ht_cap_info_5G);
Kiran Kumar Lokere89f01f02019-08-06 18:22:39 -07006262 WMA_LOGD("\t: vht_cap_info_5G[0x%0X]", cap->vht_cap_info_5G);
6263 WMA_LOGD("\t: vht_supp_mcs_5G[0x%0X]", cap->vht_supp_mcs_5G);
Dustin Brown576eea42018-06-21 12:38:21 -07006264 WMA_LOGD("\t: tx_chain_mask_5G[%d]", cap->tx_chain_mask_5G);
6265 WMA_LOGD("\t: rx_chain_mask_5G[%d]", cap->rx_chain_mask_5G);
Kiran Kumar Lokere1f96b4a2018-08-22 14:47:11 -07006266 WMA_LOGD("\t: he_cap_info_2G[0][%08x]", cap->he_cap_info_2G[0]);
6267 WMA_LOGD("\t: he_cap_info_2G[1][%08x]", cap->he_cap_info_2G[1]);
Dustin Brown576eea42018-06-21 12:38:21 -07006268 WMA_LOGD("\t: he_supp_mcs_2G[%08x]", cap->he_supp_mcs_2G);
Kiran Kumar Lokere1f96b4a2018-08-22 14:47:11 -07006269 WMA_LOGD("\t: he_cap_info_5G[0][%08x]", cap->he_cap_info_5G[0]);
6270 WMA_LOGD("\t: he_cap_info_5G[1][%08x]", cap->he_cap_info_5G[1]);
Dustin Brown576eea42018-06-21 12:38:21 -07006271 WMA_LOGD("\t: he_supp_mcs_5G[%08x]", cap->he_supp_mcs_5G);
Kiran Kumar Lokere1f96b4a2018-08-22 14:47:11 -07006272 qdf_mem_copy(mac_2G, cap->he_cap_info_2G, sizeof(mac_2G));
6273 qdf_mem_copy(mac_5G, cap->he_cap_info_5G, sizeof(mac_5G));
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07006274 qdf_mem_copy(phy_2G, cap->he_cap_phy_info_2G,
6275 WMI_MAX_HECAP_PHY_SIZE * 4);
6276 qdf_mem_copy(phy_5G, cap->he_cap_phy_info_5G,
6277 WMI_MAX_HECAP_PHY_SIZE * 4);
6278 ppet_2G = cap->he_ppet2G;
6279 ppet_5G = cap->he_ppet5G;
6280
Kiran Kumar Lokere1f96b4a2018-08-22 14:47:11 -07006281 wma_print_he_mac_cap_w1(mac_2G[0]);
6282 wma_print_he_mac_cap_w2(mac_2G[1]);
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07006283 wma_print_he_phy_cap(phy_2G);
6284 wma_print_he_ppet(&ppet_2G);
Kiran Kumar Lokere1f96b4a2018-08-22 14:47:11 -07006285 wma_print_he_mac_cap_w1(mac_5G[0]);
6286 wma_print_he_mac_cap_w1(mac_5G[1]);
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07006287 wma_print_he_phy_cap(phy_5G);
6288 wma_print_he_ppet(&ppet_5G);
6289}
Krunal Soni0193b6f2016-08-15 15:53:43 -07006290
6291/**
Krunal Soni2e48d012016-05-02 16:55:26 -07006292 * wma_print_populate_soc_caps() - Prints all the caps populated per hw mode
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306293 * @tgt_info: target related info
Krunal Soni2e48d012016-05-02 16:55:26 -07006294 *
6295 * This function prints all the caps populater per hw mode and per PHY
6296 *
6297 * Return: none
6298 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306299static void wma_print_populate_soc_caps(struct target_psoc_info *tgt_hdl)
Krunal Soni2e48d012016-05-02 16:55:26 -07006300{
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08006301 int i, num_hw_modes, total_mac_phy_cnt;
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306302 struct wlan_psoc_host_mac_phy_caps *mac_phy_cap, *tmp;
6303
6304 num_hw_modes = target_psoc_get_num_hw_modes(tgt_hdl);
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08006305 total_mac_phy_cnt = target_psoc_get_total_mac_phy_cnt(tgt_hdl);
Krunal Soni2e48d012016-05-02 16:55:26 -07006306
6307 /* print number of hw modes */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306308 WMA_LOGD("%s: num of hw modes [%d]", __func__, num_hw_modes);
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08006309 WMA_LOGD("%s: num mac_phy_cnt [%d]", __func__, total_mac_phy_cnt);
Bapiraju Alla698e6112020-04-22 17:54:08 +05306310
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306311 mac_phy_cap = target_psoc_get_mac_phy_cap(tgt_hdl);
Bapiraju Alla698e6112020-04-22 17:54:08 +05306312 if (!mac_phy_cap) {
6313 WMA_LOGE("Invalid MAC PHY capabilities handle");
6314 return;
6315 }
6316
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006317 WMA_LOGD("%s: <====== HW mode cap printing starts ======>", __func__);
Krunal Soni2e48d012016-05-02 16:55:26 -07006318 /* print cap of each hw mode */
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08006319 for (i = 0; i < total_mac_phy_cnt; i++) {
Bapiraju Alla698e6112020-04-22 17:54:08 +05306320 if (&mac_phy_cap[i]) {
6321 WMA_LOGD("====>: hw mode id[%d], phy id[%d]",
6322 mac_phy_cap[i].hw_mode_id,
6323 mac_phy_cap[i].phy_id);
6324 tmp = &mac_phy_cap[i];
6325 wma_print_mac_phy_capabilities(tmp, i);
6326 }
Krunal Soni2e48d012016-05-02 16:55:26 -07006327 }
Dustin Brown576eea42018-06-21 12:38:21 -07006328 WMA_LOGD("%s: <====== HW mode cap printing ends ======>\n", __func__);
Krunal Soni2e48d012016-05-02 16:55:26 -07006329}
6330
6331/**
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306332 * wma_map_wmi_channel_width_to_hw_mode_bw() - returns bandwidth
6333 * in terms of hw_mode_bandwidth
6334 * @width: bandwidth in terms of wmi_channel_width
6335 *
6336 * This function returns the bandwidth in terms of hw_mode_bandwidth.
6337 *
6338 * Return: BW in terms of hw_mode_bandwidth.
6339 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07006340static enum hw_mode_bandwidth wma_map_wmi_channel_width_to_hw_mode_bw(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306341 wmi_channel_width width)
6342{
6343 switch (width) {
6344 case WMI_CHAN_WIDTH_20:
6345 return HW_MODE_20_MHZ;
6346 case WMI_CHAN_WIDTH_40:
6347 return HW_MODE_40_MHZ;
6348 case WMI_CHAN_WIDTH_80:
6349 return HW_MODE_80_MHZ;
6350 case WMI_CHAN_WIDTH_160:
6351 return HW_MODE_160_MHZ;
6352 case WMI_CHAN_WIDTH_80P80:
6353 return HW_MODE_80_PLUS_80_MHZ;
6354 case WMI_CHAN_WIDTH_5:
6355 return HW_MODE_5_MHZ;
6356 case WMI_CHAN_WIDTH_10:
6357 return HW_MODE_10_MHZ;
6358 default:
6359 return HW_MODE_BW_NONE;
6360 }
6361
6362 return HW_MODE_BW_NONE;
6363}
6364
6365/**
6366 * wma_get_hw_mode_params() - get TX-RX stream and bandwidth
6367 * supported from the capabilities.
6368 * @caps: PHY capability
6369 * @info: param to store TX-RX stream and BW information
6370 *
6371 * This function will calculate TX-RX stream and bandwidth supported
6372 * as per the PHY capability, and assign to mac_ss_bw_info.
6373 *
6374 * Return: none
6375 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306376static void wma_get_hw_mode_params(struct wlan_psoc_host_mac_phy_caps *caps,
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306377 struct mac_ss_bw_info *info)
6378{
6379 if (!caps) {
6380 WMA_LOGE("%s: Invalid capabilities", __func__);
6381 return;
6382 }
6383
6384 info->mac_tx_stream = wma_get_num_of_setbits_from_bitmask(
6385 QDF_MAX(caps->tx_chain_mask_2G,
6386 caps->tx_chain_mask_5G));
6387 info->mac_rx_stream = wma_get_num_of_setbits_from_bitmask(
6388 QDF_MAX(caps->rx_chain_mask_2G,
6389 caps->rx_chain_mask_5G));
6390 info->mac_bw = wma_map_wmi_channel_width_to_hw_mode_bw(
6391 QDF_MAX(caps->max_bw_supported_2G,
6392 caps->max_bw_supported_5G));
6393}
6394
6395/**
6396 * wma_set_hw_mode_params() - sets TX-RX stream, bandwidth and
6397 * DBS in hw_mode_list
6398 * @wma_handle: pointer to wma global structure
6399 * @mac0_ss_bw_info: TX-RX streams, BW for MAC0
6400 * @mac1_ss_bw_info: TX-RX streams, BW for MAC1
6401 * @pos: refers to hw_mode_index
6402 * @dbs_mode: dbs_mode for the dbs_hw_mode
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306403 * @sbs_mode: sbs_mode for the sbs_hw_mode
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306404 *
6405 * This function sets TX-RX stream, bandwidth and DBS mode in
6406 * hw_mode_list.
6407 *
6408 * Return: none
6409 */
6410static void wma_set_hw_mode_params(t_wma_handle *wma_handle,
6411 struct mac_ss_bw_info mac0_ss_bw_info,
6412 struct mac_ss_bw_info mac1_ss_bw_info,
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306413 uint32_t pos, uint32_t dbs_mode,
6414 uint32_t sbs_mode)
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306415{
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306416 WMA_HW_MODE_MAC0_TX_STREAMS_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306417 wma_handle->hw_mode.hw_mode_list[pos],
6418 mac0_ss_bw_info.mac_tx_stream);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306419 WMA_HW_MODE_MAC0_RX_STREAMS_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306420 wma_handle->hw_mode.hw_mode_list[pos],
6421 mac0_ss_bw_info.mac_rx_stream);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306422 WMA_HW_MODE_MAC0_BANDWIDTH_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306423 wma_handle->hw_mode.hw_mode_list[pos],
6424 mac0_ss_bw_info.mac_bw);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306425 WMA_HW_MODE_MAC1_TX_STREAMS_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306426 wma_handle->hw_mode.hw_mode_list[pos],
6427 mac1_ss_bw_info.mac_tx_stream);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306428 WMA_HW_MODE_MAC1_RX_STREAMS_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306429 wma_handle->hw_mode.hw_mode_list[pos],
6430 mac1_ss_bw_info.mac_rx_stream);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306431 WMA_HW_MODE_MAC1_BANDWIDTH_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306432 wma_handle->hw_mode.hw_mode_list[pos],
6433 mac1_ss_bw_info.mac_bw);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306434 WMA_HW_MODE_DBS_MODE_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306435 wma_handle->hw_mode.hw_mode_list[pos],
6436 dbs_mode);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306437 WMA_HW_MODE_AGILE_DFS_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306438 wma_handle->hw_mode.hw_mode_list[pos],
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306439 HW_MODE_AGILE_DFS_NONE);
6440 WMA_HW_MODE_SBS_MODE_SET(
6441 wma_handle->hw_mode.hw_mode_list[pos],
6442 sbs_mode);
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306443}
6444
6445/**
6446 * wma_update_hw_mode_list() - updates hw_mode_list
6447 * @wma_handle: pointer to wma global structure
Arunk Khandavalli80a61352018-01-25 12:19:37 +05306448 * @tgt_hdl - target psoc information
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306449 *
6450 * This function updates hw_mode_list with tx_streams, rx_streams,
6451 * bandwidth, dbs and agile dfs for each hw_mode.
6452 *
6453 * Returns: 0 for success else failure.
6454 */
Arunk Khandavalli80a61352018-01-25 12:19:37 +05306455static QDF_STATUS wma_update_hw_mode_list(t_wma_handle *wma_handle,
6456 struct target_psoc_info *tgt_hdl)
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306457{
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306458 struct wlan_psoc_host_mac_phy_caps *tmp, *mac_phy_cap;
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306459 uint32_t i, hw_config_type, j = 0;
6460 uint32_t dbs_mode, sbs_mode;
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306461 struct mac_ss_bw_info mac0_ss_bw_info = {0};
6462 struct mac_ss_bw_info mac1_ss_bw_info = {0};
Krunal Sonica50b452017-08-04 22:24:59 -07006463 WMI_PHY_CAPABILITY new_supported_band = 0;
6464 bool supported_band_update_failure = false;
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306465 struct wlan_psoc_target_capability_info *tgt_cap_info;
6466 int num_hw_modes;
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306467
6468 if (!wma_handle) {
6469 WMA_LOGE("%s: Invalid wma handle", __func__);
6470 return QDF_STATUS_E_FAILURE;
6471 }
6472
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306473 num_hw_modes = target_psoc_get_num_hw_modes(tgt_hdl);
6474 mac_phy_cap = target_psoc_get_mac_phy_cap(tgt_hdl);
6475 tgt_cap_info = target_psoc_get_target_caps(tgt_hdl);
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306476 /*
6477 * This list was updated as part of service ready event. Re-populate
6478 * HW mode list from the device capabilities.
6479 */
6480 if (wma_handle->hw_mode.hw_mode_list) {
6481 qdf_mem_free(wma_handle->hw_mode.hw_mode_list);
6482 wma_handle->hw_mode.hw_mode_list = NULL;
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006483 WMA_LOGD("%s: DBS list is freed", __func__);
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306484 }
6485
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306486 wma_handle->hw_mode.hw_mode_list =
6487 qdf_mem_malloc(sizeof(*wma_handle->hw_mode.hw_mode_list) *
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306488 num_hw_modes);
Wu Gaoe4c142d2018-11-06 11:54:32 +08006489 if (!wma_handle->hw_mode.hw_mode_list) {
6490 wma_handle->num_dbs_hw_modes = 0;
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306491 return QDF_STATUS_E_FAILURE;
Wu Gaoe4c142d2018-11-06 11:54:32 +08006492 }
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306493
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08006494 WMA_LOGD("%s: Updated HW mode list: Num modes:%d",
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306495 __func__, num_hw_modes);
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306496
Wu Gaoe4c142d2018-11-06 11:54:32 +08006497 wma_handle->num_dbs_hw_modes = num_hw_modes;
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306498 for (i = 0; i < num_hw_modes; i++) {
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306499 /* Update for MAC0 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306500 tmp = &mac_phy_cap[j++];
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306501 wma_get_hw_mode_params(tmp, &mac0_ss_bw_info);
Rachit Kankane4b6fdd12019-01-10 20:51:16 +05306502 hw_config_type = tmp->hw_mode_config_type;
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306503 dbs_mode = HW_MODE_DBS_NONE;
6504 sbs_mode = HW_MODE_SBS_NONE;
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306505 mac1_ss_bw_info.mac_tx_stream = 0;
6506 mac1_ss_bw_info.mac_rx_stream = 0;
6507 mac1_ss_bw_info.mac_bw = 0;
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306508 if (wma_update_supported_bands(tmp->supported_bands,
6509 &new_supported_band)
6510 != QDF_STATUS_SUCCESS)
Krunal Sonica50b452017-08-04 22:24:59 -07006511 supported_band_update_failure = true;
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306512
6513 /* SBS and DBS have dual MAC. Upto 2 MACs are considered. */
6514 if ((hw_config_type == WMI_HW_MODE_DBS) ||
6515 (hw_config_type == WMI_HW_MODE_SBS_PASSIVE) ||
6516 (hw_config_type == WMI_HW_MODE_SBS)) {
6517 /* Update for MAC1 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306518 tmp = &mac_phy_cap[j++];
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306519 wma_get_hw_mode_params(tmp, &mac1_ss_bw_info);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306520 if (hw_config_type == WMI_HW_MODE_DBS)
6521 dbs_mode = HW_MODE_DBS;
6522 if ((hw_config_type == WMI_HW_MODE_SBS_PASSIVE) ||
6523 (hw_config_type == WMI_HW_MODE_SBS))
6524 sbs_mode = HW_MODE_SBS;
Krunal Sonica50b452017-08-04 22:24:59 -07006525 if (QDF_STATUS_SUCCESS !=
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306526 wma_update_supported_bands(tmp->supported_bands,
Krunal Sonica50b452017-08-04 22:24:59 -07006527 &new_supported_band))
6528 supported_band_update_failure = true;
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306529 }
6530
6531 /* Updating HW mode list */
6532 wma_set_hw_mode_params(wma_handle, mac0_ss_bw_info,
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306533 mac1_ss_bw_info, i, dbs_mode,
6534 sbs_mode);
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306535 }
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07006536
Krunal Sonica50b452017-08-04 22:24:59 -07006537 /* overwrite phy_capability which we got from service ready event */
6538 if (!supported_band_update_failure) {
6539 WMA_LOGD("%s: updating supported band from old[%d] to new[%d]",
Arunk Khandavalli80a61352018-01-25 12:19:37 +05306540 __func__, target_if_get_phy_capability(tgt_hdl),
Krunal Sonica50b452017-08-04 22:24:59 -07006541 new_supported_band);
Arunk Khandavalli80a61352018-01-25 12:19:37 +05306542 target_if_set_phy_capability(tgt_hdl, new_supported_band);
Krunal Sonica50b452017-08-04 22:24:59 -07006543 }
6544
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07006545 if (QDF_STATUS_SUCCESS !=
Krunal Sonica50b452017-08-04 22:24:59 -07006546 policy_mgr_update_hw_mode_list(wma_handle->psoc,
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306547 tgt_hdl))
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07006548 WMA_LOGE("%s: failed to update policy manager", __func__);
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306549 wma_dump_dbs_hw_mode(wma_handle);
6550 return QDF_STATUS_SUCCESS;
6551}
6552
Naveen Rawat4efe41b2017-04-29 16:23:14 -07006553static void wma_init_wifi_pos_dma_rings(t_wma_handle *wma_handle,
6554 uint8_t num_mac, void *buf)
6555{
hqu28f68df2019-07-02 23:10:08 +08006556 struct hif_opaque_softc *hif_ctx = cds_get_context(QDF_MODULE_ID_HIF);
Amar Singhal4c3fbb42018-01-02 13:20:28 -08006557 void *hal_soc;
6558
6559 if (!hif_ctx) {
6560 WMA_LOGE("invalid hif context");
6561 return;
6562 }
6563
6564 hal_soc = hif_get_hal_handle(hif_ctx);
Naveen Rawat4efe41b2017-04-29 16:23:14 -07006565
6566 wifi_pos_init_cir_cfr_rings(wma_handle->psoc, hal_soc, num_mac, buf);
6567}
6568
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306569/**
Krunal Soni2e48d012016-05-02 16:55:26 -07006570 * wma_populate_soc_caps() - populate entire SOC's capabilities
6571 * @wma_handle: pointer to wma global structure
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306572 * @tgt_hdl: target psoc information
Krunal Soni2e48d012016-05-02 16:55:26 -07006573 * @param_buf: pointer to param of service ready extension event from fw
6574 *
6575 * This API populates all capabilities of entire SOC. For example,
6576 * how many number of hw modes are supported by this SOC, what are the
6577 * capabilities of each phy per hw mode, what are HAL reg capabilities per
6578 * phy.
6579 *
6580 * Return: none
6581 */
6582static void wma_populate_soc_caps(t_wma_handle *wma_handle,
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306583 struct target_psoc_info *tgt_hdl,
Krunal Soni2e48d012016-05-02 16:55:26 -07006584 WMI_SERVICE_READY_EXT_EVENTID_param_tlvs *param_buf)
6585{
Krunal Soni2e48d012016-05-02 16:55:26 -07006586
6587 WMA_LOGD("%s: Enter", __func__);
6588
Naveen Rawat4efe41b2017-04-29 16:23:14 -07006589 wma_init_wifi_pos_dma_rings(wma_handle,
6590 param_buf->num_oem_dma_ring_caps,
6591 param_buf->oem_dma_ring_caps);
6592
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306593 wma_print_populate_soc_caps(tgt_hdl);
Krunal Soni2e48d012016-05-02 16:55:26 -07006594}
6595
6596/**
Wu Gao492f1ad2019-06-03 21:25:50 +08006597 * wma_init_dbr_params() - init dbr params
6598 * @wma_handle: pointer to wma global structure
6599 *
6600 * This API initializes params of direct buffer rx component.
6601 *
6602 * Return: none
6603 */
6604#ifdef DIRECT_BUF_RX_ENABLE
6605static void wma_init_dbr_params(t_wma_handle *wma_handle)
6606{
Wu Gao6c5a45b2019-08-07 17:50:21 +08006607 struct hif_opaque_softc *hif_ctx = cds_get_context(QDF_MODULE_ID_HIF);
Wu Gao492f1ad2019-06-03 21:25:50 +08006608 void *hal_soc;
6609
6610 if (!hif_ctx) {
6611 WMA_LOGE("invalid hif context");
6612 return;
6613 }
6614
6615 hal_soc = hif_get_hal_handle(hif_ctx);
6616 direct_buf_rx_target_attach(wma_handle->psoc, hal_soc,
6617 wma_handle->qdf_dev);
6618}
6619#else
6620static inline void wma_init_dbr_params(t_wma_handle *wma_handle)
6621{
6622}
6623#endif
6624
6625/**
guangde963710d2019-07-02 15:51:15 +08006626 * wma_set_coex_res_cfg() - Set target COEX resource configuration.
6627 * @wma_handle: pointer to wma global structure
6628 * @wlan_res_cfg: Pointer to target resource configuration
6629 *
6630 * Return: none
6631 */
6632#ifdef FEATURE_COEX_CONFIG
6633static void wma_set_coex_res_cfg(t_wma_handle *wma_handle,
6634 struct wmi_unified *wmi_handle,
6635 target_resource_config *wlan_res_cfg)
6636{
6637 if (cfg_get(wma_handle->psoc, CFG_THREE_WAY_COEX_CONFIG_LEGACY) &&
6638 wmi_service_enabled(wmi_handle,
6639 wmi_service_three_way_coex_config_legacy)) {
6640 wlan_res_cfg->three_way_coex_config_legacy_en = true;
6641 } else {
6642 wlan_res_cfg->three_way_coex_config_legacy_en = false;
6643 }
6644}
6645#else
6646static void wma_set_coex_res_cfg(t_wma_handle *wma_handle,
6647 struct wmi_unified *wmi_handle,
6648 target_resource_config *wlan_res_cfg)
6649{
6650}
6651#endif
6652
6653/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006654 * wma_rx_service_ready_ext_event() - evt handler for sevice ready ext event.
6655 * @handle: wma handle
6656 * @event: params of the service ready extended event
Govind Singhd76a5b02016-03-08 15:12:14 +05306657 * @length: param length
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006658 *
6659 * Return: none
6660 */
Govind Singhd76a5b02016-03-08 15:12:14 +05306661int wma_rx_service_ready_ext_event(void *handle, uint8_t *event,
6662 uint32_t length)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006663{
6664 tp_wma_handle wma_handle = (tp_wma_handle) handle;
6665 WMI_SERVICE_READY_EXT_EVENTID_param_tlvs *param_buf;
6666 wmi_service_ready_ext_event_fixed_param *ev;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306667 QDF_STATUS ret;
Arunk Khandavallia6305a32018-01-25 11:19:18 +05306668 struct target_psoc_info *tgt_hdl;
Arunk Khandavalli2462f462018-01-25 14:41:02 +05306669 uint32_t conc_scan_config_bits, fw_config_bits;
jitiphilebf3a922018-11-05 14:25:00 +05306670 struct wmi_unified *wmi_handle;
6671 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
6672 target_resource_config *wlan_res_cfg;
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306673
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006674 WMA_LOGD("%s: Enter", __func__);
6675
6676 if (!wma_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006677 WMA_LOGE("%s: Invalid WMA handle", __func__);
Govind Singhd76a5b02016-03-08 15:12:14 +05306678 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006679 }
6680
jitiphilebf3a922018-11-05 14:25:00 +05306681 wmi_handle = get_wmi_unified_hdl_from_psoc(wma_handle->psoc);
6682
Arunk Khandavallia6305a32018-01-25 11:19:18 +05306683 tgt_hdl = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
6684 if (!tgt_hdl) {
6685 WMA_LOGE("%s: target psoc info is NULL", __func__);
6686 return -EINVAL;
6687 }
6688
jitiphilebf3a922018-11-05 14:25:00 +05306689 wlan_res_cfg = target_psoc_get_wlan_res_cfg(tgt_hdl);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006690 param_buf = (WMI_SERVICE_READY_EXT_EVENTID_param_tlvs *) event;
6691 if (!param_buf) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006692 WMA_LOGE("%s: Invalid event", __func__);
Govind Singhd76a5b02016-03-08 15:12:14 +05306693 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006694 }
6695
6696 ev = param_buf->fixed_param;
6697 if (!ev) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006698 WMA_LOGE("%s: Invalid buffer", __func__);
Govind Singhd76a5b02016-03-08 15:12:14 +05306699 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006700 }
6701
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08006702 WMA_LOGD("WMA <-- WMI_SERVICE_READY_EXT_EVENTID");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006703
Arunk Khandavalli2462f462018-01-25 14:41:02 +05306704 fw_config_bits = target_if_get_fw_config_bits(tgt_hdl);
6705 conc_scan_config_bits = target_if_get_conc_scan_config_bits(tgt_hdl);
6706
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08006707 WMA_LOGD("%s: Defaults: scan config:%x FW mode config:%x",
Arunk Khandavalli2462f462018-01-25 14:41:02 +05306708 __func__, conc_scan_config_bits, fw_config_bits);
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05306709
Anurag Chouhan210db072016-02-22 18:42:15 +05306710 ret = qdf_mc_timer_stop(&wma_handle->service_ready_ext_timer);
Anurag Chouhandf2b2682016-02-29 14:15:27 +05306711 if (!QDF_IS_STATUS_SUCCESS(ret)) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006712 WMA_LOGE("Failed to stop the service ready ext timer");
Govind Singhd76a5b02016-03-08 15:12:14 +05306713 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006714 }
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306715 wma_populate_soc_caps(wma_handle, tgt_hdl, param_buf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006716
Arunk Khandavalli80a61352018-01-25 12:19:37 +05306717 ret = wma_update_hw_mode_list(wma_handle, tgt_hdl);
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306718 if (QDF_IS_STATUS_ERROR(ret)) {
6719 WMA_LOGE("Failed to update hw mode list");
6720 return -EINVAL;
6721 }
6722
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08006723 WMA_LOGD("WMA --> WMI_INIT_CMDID");
Mukul Sharmab10c8c72017-11-02 17:25:59 +05306724
gaurank kathpaliae3140292019-11-12 16:44:31 +05306725 if (wma_is_dbs_mandatory(wma_handle->psoc, tgt_hdl) &&
gaurank kathpalia34fe0b62019-11-13 11:08:26 +05306726 (policy_mgr_is_dual_mac_disabled_in_ini(wma_handle->psoc))) {
gaurank kathpaliae3140292019-11-12 16:44:31 +05306727 policy_mgr_set_dual_mac_feature(wma_handle->psoc,
6728 ENABLE_DBS_CXN_AND_DISABLE_SIMULTANEOUS_SCAN);
gaurank kathpalia34fe0b62019-11-13 11:08:26 +05306729 policy_mgr_set_ch_select_plcy(wma_handle->psoc,
6730 POLICY_MGR_CH_SELECT_POLICY_DEF);
6731 }
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306732 wma_init_scan_fw_mode_config(wma_handle->psoc, conc_scan_config_bits,
Arunk Khandavalli2462f462018-01-25 14:41:02 +05306733 fw_config_bits);
Arunk Khandavallia6305a32018-01-25 11:19:18 +05306734
6735 target_psoc_set_num_radios(tgt_hdl, 1);
jitiphilebf3a922018-11-05 14:25:00 +05306736
6737 if (wmi_service_enabled(wmi_handle,
6738 wmi_service_new_htt_msg_format)) {
6739 cdp_cfg_set_new_htt_msg_format(soc, 1);
6740 wlan_res_cfg->new_htt_msg_format = true;
6741 } else {
6742 cdp_cfg_set_new_htt_msg_format(soc, 0);
6743 wlan_res_cfg->new_htt_msg_format = false;
6744 }
6745
Alok Kumara73938f2020-01-22 20:56:59 +05306746 if (QDF_GLOBAL_FTM_MODE != cds_get_conparam() &&
6747 ucfg_mlme_get_peer_unmap_conf(wma_handle->psoc) &&
Alok Kumar02301292018-11-28 18:10:34 +05306748 wmi_service_enabled(wmi_handle,
6749 wmi_service_peer_unmap_cnf_support)) {
6750 wlan_res_cfg->peer_unmap_conf_support = true;
6751 cdp_cfg_set_peer_unmap_conf_support(soc, true);
6752 } else {
6753 wlan_res_cfg->peer_unmap_conf_support = false;
6754 cdp_cfg_set_peer_unmap_conf_support(soc, false);
6755 }
6756
Jiani Liu6d3b6a12019-05-08 15:15:06 +08006757 if (wma_handle->enable_tx_compl_tsf64 &&
6758 wmi_service_enabled(wmi_handle,
6759 wmi_service_tx_compl_tsf64)) {
6760 wlan_res_cfg->tstamp64_en = true;
6761 cdp_cfg_set_tx_compl_tsf64(soc, true);
6762 } else {
6763 wlan_res_cfg->tstamp64_en = false;
6764 cdp_cfg_set_tx_compl_tsf64(soc, false);
6765 }
6766
Srinivas Dasarib18fef42020-04-23 10:55:22 +05306767 if (wmi_service_enabled(wma_handle->wmi_handle, wmi_service_nan_vdev))
6768 ucfg_nan_set_vdev_creation_supp_by_fw(wma_handle->psoc, true);
6769
Srinivas Dasari79a1e172020-04-06 17:34:03 +05306770 /*
6771 * Firmware can accommodate maximum 4 vdevs and the ini gNumVdevs
6772 * indicates the same.
6773 * If host driver is going to create vdev for NAN, it indicates
6774 * the total no.of vdevs supported to firmware which includes the
6775 * NAN vdev.
6776 * If firmware is going to create NAN discovery vdev, host should
6777 * indicate 3 vdevs and firmware shall add 1 vdev for NAN. So decrement
6778 * the num_vdevs by 1.
6779 */
6780 if (ucfg_nan_is_vdev_creation_allowed(wma_handle->psoc)) {
Abhishek Ambure3ba96d52020-03-15 19:28:05 +05306781 wlan_res_cfg->nan_separate_iface_support = true;
Srinivas Dasari79a1e172020-04-06 17:34:03 +05306782 } else {
6783 wlan_res_cfg->num_vdevs--;
6784 wma_update_num_peers_tids(wma_handle, wlan_res_cfg);
6785 }
6786
6787 WMA_LOGD("%s: num_vdevs: %u", __func__, wlan_res_cfg->num_vdevs);
Abhishek Ambure3ba96d52020-03-15 19:28:05 +05306788
Wu Gao492f1ad2019-06-03 21:25:50 +08006789 wma_init_dbr_params(wma_handle);
6790
guangde963710d2019-07-02 15:51:15 +08006791 wma_set_coex_res_cfg(wma_handle, wmi_handle, wlan_res_cfg);
6792
Govind Singhd76a5b02016-03-08 15:12:14 +05306793 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006794}
6795
6796/**
6797 * wma_rx_ready_event() - event handler to process
6798 * wmi rx ready event.
6799 * @handle: wma handle
6800 * @cmd_param_info: command params info
Govind Singhd76a5b02016-03-08 15:12:14 +05306801 * @length: param length
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006802 *
6803 * Return: none
6804 */
Govind Singhd76a5b02016-03-08 15:12:14 +05306805int wma_rx_ready_event(void *handle, uint8_t *cmd_param_info,
6806 uint32_t length)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006807{
6808 tp_wma_handle wma_handle = (tp_wma_handle) handle;
6809 WMI_READY_EVENTID_param_tlvs *param_buf = NULL;
6810 wmi_ready_event_fixed_param *ev = NULL;
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05306811 int ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006812
6813 WMA_LOGD("%s: Enter", __func__);
6814
6815 param_buf = (WMI_READY_EVENTID_param_tlvs *) cmd_param_info;
6816 if (!(wma_handle && param_buf)) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006817 WMA_LOGE("%s: Invalid arguments", __func__);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306818 QDF_ASSERT(0);
Govind Singhd76a5b02016-03-08 15:12:14 +05306819 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006820 }
6821
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08006822 WMA_LOGD("WMA <-- WMI_READY_EVENTID");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006823
6824 ev = param_buf->fixed_param;
6825 /* Indicate to the waiting thread that the ready
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07006826 * event was received
6827 */
Naveen Rawat64e477e2016-05-20 10:34:56 -07006828 wma_handle->sub_20_support =
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05306829 wmi_service_enabled(wma_handle->wmi_handle,
6830 wmi_service_half_rate_quarter_rate_support);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006831 wma_handle->wmi_ready = true;
6832 wma_handle->wlan_init_status = ev->status;
6833
Arif Hussainbaf28b82018-06-27 15:27:44 -07006834 if (wma_handle->is_dfs_offloaded)
6835 wmi_unified_dfs_phyerr_offload_en_cmd(
6836 wma_handle->wmi_handle, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006837 /* copy the mac addr */
6838 WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->mac_addr, wma_handle->myaddr);
6839 WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->mac_addr, wma_handle->hwaddr);
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05306840 ret = wma_update_hdd_cfg(wma_handle);
6841 if (ret)
6842 return ret;
6843
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006844 WMA_LOGD("Exit");
Govind Singhd76a5b02016-03-08 15:12:14 +05306845
6846 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006847}
6848
6849/**
6850 * wma_setneedshutdown() - setting wma needshutdown flag
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006851 *
6852 * Return: none
6853 */
Jeff Johnson1f8d0a02017-09-13 08:09:05 -07006854void wma_setneedshutdown(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006855{
6856 tp_wma_handle wma_handle;
6857
6858 WMA_LOGD("%s: Enter", __func__);
6859
Anurag Chouhan6d760662016-02-20 16:05:43 +05306860 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006861
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07006862 if (!wma_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006863 WMA_LOGE("%s: Invalid arguments", __func__);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306864 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006865 return;
6866 }
6867
6868 wma_handle->needShutdown = true;
6869 WMA_LOGD("%s: Exit", __func__);
6870}
6871
6872/**
6873 * wma_needshutdown() - Is wma needs shutdown?
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006874 *
6875 * Return: returns true/false
6876 */
Jeff Johnson1b5404e2017-09-13 08:04:46 -07006877bool wma_needshutdown(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006878{
6879 tp_wma_handle wma_handle;
6880
6881 WMA_LOGD("%s: Enter", __func__);
6882
Anurag Chouhan6d760662016-02-20 16:05:43 +05306883 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006884
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07006885 if (!wma_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006886 WMA_LOGE("%s: Invalid arguments", __func__);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306887 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006888 return false;
6889 }
6890
6891 WMA_LOGD("%s: Exit", __func__);
6892 return wma_handle->needShutdown;
6893}
6894
6895/**
6896 * wma_wait_for_ready_event() - wait for wma ready event
6897 * @handle: wma handle
6898 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05306899 * Return: 0 for success or QDF error
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006900 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306901QDF_STATUS wma_wait_for_ready_event(WMA_HANDLE handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006902{
Dustin Brown19048bd2018-07-09 10:53:18 -07006903 tp_wma_handle wma_handle = (tp_wma_handle)handle;
6904 QDF_STATUS status;
Arunk Khandavallia6305a32018-01-25 11:19:18 +05306905 struct target_psoc_info *tgt_hdl;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006906
Arunk Khandavallia6305a32018-01-25 11:19:18 +05306907 tgt_hdl = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
6908 if (!tgt_hdl) {
Dustin Brown19048bd2018-07-09 10:53:18 -07006909 wma_err("target psoc info is NULL");
Arunk Khandavallia6305a32018-01-25 11:19:18 +05306910 return QDF_STATUS_E_INVAL;
6911 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006912
Dustin Brown19048bd2018-07-09 10:53:18 -07006913 status = qdf_wait_for_event_completion(&tgt_hdl->info.event,
6914 WMA_READY_EVENTID_TIMEOUT);
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05306915 if (!tgt_hdl->info.wmi_ready) {
6916 wma_err("Error in pdev creation");
6917 return QDF_STATUS_E_INVAL;
6918 }
6919
Dustin Brown19048bd2018-07-09 10:53:18 -07006920 if (status == QDF_STATUS_E_TIMEOUT)
6921 wma_err("Timeout waiting for FW ready event");
6922 else if (QDF_IS_STATUS_ERROR(status))
6923 wma_err("Failed to wait for FW ready event; status:%u", status);
6924 else
6925 wma_info("FW ready event received");
Arunk Khandavallia6305a32018-01-25 11:19:18 +05306926
Dustin Brown19048bd2018-07-09 10:53:18 -07006927 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006928}
6929
6930/**
6931 * wma_set_ppsconfig() - set pps config in fw
6932 * @vdev_id: vdev id
6933 * @pps_param: pps params
6934 * @val : param value
6935 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05306936 * Return: 0 for success or QDF error
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006937 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306938QDF_STATUS wma_set_ppsconfig(uint8_t vdev_id, uint16_t pps_param,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006939 int val)
6940{
Anurag Chouhan6d760662016-02-20 16:05:43 +05306941 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006942 int ret = -EIO;
6943 uint32_t pps_val;
6944
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07006945 if (!wma) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006946 WMA_LOGE("%s: Failed to get wma", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306947 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006948 }
6949
6950 switch (pps_param) {
6951 case WMA_VHT_PPS_PAID_MATCH:
6952 pps_val = ((val << 31) & 0xffff0000) |
6953 (PKT_PWR_SAVE_PAID_MATCH & 0xffff);
6954 goto pkt_pwr_save_config;
6955 case WMA_VHT_PPS_GID_MATCH:
6956 pps_val = ((val << 31) & 0xffff0000) |
6957 (PKT_PWR_SAVE_GID_MATCH & 0xffff);
6958 goto pkt_pwr_save_config;
6959 case WMA_VHT_PPS_DELIM_CRC_FAIL:
6960 pps_val = ((val << 31) & 0xffff0000) |
6961 (PKT_PWR_SAVE_DELIM_CRC_FAIL & 0xffff);
6962 goto pkt_pwr_save_config;
6963
6964 /* Enable the code below as and when the functionality
6965 * is supported/added in host.
6966 */
6967#ifdef NOT_YET
6968 case WMA_VHT_PPS_EARLY_TIM_CLEAR:
6969 pps_val = ((val << 31) & 0xffff0000) |
6970 (PKT_PWR_SAVE_EARLY_TIM_CLEAR & 0xffff);
6971 goto pkt_pwr_save_config;
6972 case WMA_VHT_PPS_EARLY_DTIM_CLEAR:
6973 pps_val = ((val << 31) & 0xffff0000) |
6974 (PKT_PWR_SAVE_EARLY_DTIM_CLEAR & 0xffff);
6975 goto pkt_pwr_save_config;
6976 case WMA_VHT_PPS_EOF_PAD_DELIM:
6977 pps_val = ((val << 31) & 0xffff0000) |
6978 (PKT_PWR_SAVE_EOF_PAD_DELIM & 0xffff);
6979 goto pkt_pwr_save_config;
6980 case WMA_VHT_PPS_MACADDR_MISMATCH:
6981 pps_val = ((val << 31) & 0xffff0000) |
6982 (PKT_PWR_SAVE_MACADDR_MISMATCH & 0xffff);
6983 goto pkt_pwr_save_config;
6984 case WMA_VHT_PPS_GID_NSTS_ZERO:
6985 pps_val = ((val << 31) & 0xffff0000) |
6986 (PKT_PWR_SAVE_GID_NSTS_ZERO & 0xffff);
6987 goto pkt_pwr_save_config;
6988 case WMA_VHT_PPS_RSSI_CHECK:
6989 pps_val = ((val << 31) & 0xffff0000) |
6990 (PKT_PWR_SAVE_RSSI_CHECK & 0xffff);
6991 goto pkt_pwr_save_config;
6992#endif /* NOT_YET */
6993pkt_pwr_save_config:
6994 WMA_LOGD("vdev_id:%d val:0x%x pps_val:0x%x", vdev_id,
6995 val, pps_val);
Govind Singhd76a5b02016-03-08 15:12:14 +05306996 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07006997 WMI_VDEV_PARAM_PACKET_POWERSAVE,
6998 pps_val);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006999 break;
7000 default:
7001 WMA_LOGE("%s:INVALID PPS CONFIG", __func__);
7002 }
7003
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307004 return (ret) ? QDF_STATUS_E_FAILURE : QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007005}
7006
7007/**
7008 * wma_process_set_mas() - Function to enable/disable MAS
7009 * @wma: Pointer to WMA handle
7010 * @mas_val: 1-Enable MAS, 0-Disable MAS
7011 *
7012 * This function enables/disables the MAS value
7013 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05307014 * Return: QDF_SUCCESS for success otherwise failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007015 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07007016static QDF_STATUS wma_process_set_mas(tp_wma_handle wma,
7017 uint32_t *mas_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007018{
7019 uint32_t val;
7020
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07007021 if (!wma || !mas_val) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007022 WMA_LOGE("%s: Invalid input to enable/disable MAS", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307023 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007024 }
7025
7026 val = (*mas_val);
7027
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307028 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007029 wma_set_enable_disable_mcc_adaptive_scheduler(val)) {
7030 WMA_LOGE("%s: Unable to enable/disable MAS", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307031 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007032 }
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07007033 WMA_LOGE("%s: Value is %d", __func__, val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307034 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007035}
7036
7037/**
7038 * wma_process_set_miracast() - Function to set miracast value in WMA
7039 * @wma: Pointer to WMA handle
7040 * @miracast_val: 0-Disabled,1-Source,2-Sink
7041 *
7042 * This function stores the miracast value in WMA
7043 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05307044 * Return: QDF_SUCCESS for success otherwise failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007045 *
7046 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07007047static QDF_STATUS wma_process_set_miracast(tp_wma_handle wma,
7048 uint32_t *miracast_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007049{
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07007050 if (!wma || !miracast_val) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007051 WMA_LOGE("%s: Invalid input to store miracast value", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307052 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007053 }
7054
7055 wma->miracast_value = *miracast_val;
7056 WMA_LOGE("%s: Miracast value is %d", __func__, wma->miracast_value);
7057
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307058 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007059}
7060
7061/**
7062 * wma_config_stats_factor() - Function to configure stats avg. factor
7063 * @wma: pointer to WMA handle
7064 * @avg_factor: stats. avg. factor passed down by userspace
7065 *
7066 * This function configures the avg. stats value in firmware
7067 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307068 * Return: QDF_STATUS_SUCCESS for success otherwise failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007069 *
7070 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307071static QDF_STATUS wma_config_stats_factor(tp_wma_handle wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007072 struct sir_stats_avg_factor *avg_factor)
7073{
Govind Singhd76a5b02016-03-08 15:12:14 +05307074 QDF_STATUS ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007075
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07007076 if (!wma || !avg_factor) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007077 WMA_LOGE("%s: Invalid input of stats avg factor", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307078 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007079 }
7080
Govind Singhd76a5b02016-03-08 15:12:14 +05307081 ret = wma_vdev_set_param(wma->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007082 avg_factor->vdev_id,
7083 WMI_VDEV_PARAM_STATS_AVG_FACTOR,
7084 avg_factor->stats_avg_factor);
Govind Singhd76a5b02016-03-08 15:12:14 +05307085 if (QDF_IS_STATUS_ERROR(ret)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007086 WMA_LOGE(" failed to set avg_factor for vdev_id %d",
7087 avg_factor->vdev_id);
7088 }
7089
7090 WMA_LOGD("%s: Set stats_avg_factor %d for vdev_id %d", __func__,
7091 avg_factor->stats_avg_factor, avg_factor->vdev_id);
7092
7093 return ret;
7094}
7095
7096/**
7097 * wma_config_guard_time() - Function to set guard time in firmware
7098 * @wma: pointer to WMA handle
7099 * @guard_time: guard time passed down by userspace
7100 *
7101 * This function configures the guard time in firmware
7102 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307103 * Return: QDF_STATUS_SUCCESS for success otherwise failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007104 *
7105 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307106static QDF_STATUS wma_config_guard_time(tp_wma_handle wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007107 struct sir_guard_time_request *guard_time)
7108{
Govind Singhd76a5b02016-03-08 15:12:14 +05307109 QDF_STATUS ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007110
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07007111 if (!wma || !guard_time) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007112 WMA_LOGE("%s: Invalid input of guard time", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307113 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007114 }
7115
Govind Singhd76a5b02016-03-08 15:12:14 +05307116 ret = wma_vdev_set_param(wma->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007117 guard_time->vdev_id,
7118 WMI_VDEV_PARAM_RX_LEAK_WINDOW,
7119 guard_time->guard_time);
Govind Singhd76a5b02016-03-08 15:12:14 +05307120 if (QDF_IS_STATUS_ERROR(ret)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007121 WMA_LOGE(" failed to set guard time for vdev_id %d",
7122 guard_time->vdev_id);
7123 }
7124
7125 WMA_LOGD("Set guard time %d for vdev_id %d",
7126 guard_time->guard_time, guard_time->vdev_id);
7127
7128 return ret;
7129}
7130
7131/**
7132 * wma_enable_specific_fw_logs() - Start/Stop logging of diag event/log id
7133 * @wma_handle: WMA handle
7134 * @start_log: Start logging related parameters
7135 *
7136 * Send the command to the FW based on which specific logging of diag
7137 * event/log id can be started/stopped
7138 *
7139 * Return: None
7140 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07007141static void wma_enable_specific_fw_logs(tp_wma_handle wma_handle,
7142 struct sir_wifi_start_log *start_log)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007143{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007144
7145 if (!start_log) {
7146 WMA_LOGE("%s: start_log pointer is NULL", __func__);
7147 return;
7148 }
7149 if (!wma_handle) {
7150 WMA_LOGE("%s: Invalid wma handle", __func__);
7151 return;
7152 }
7153
7154 if (!((start_log->ring_id == RING_ID_CONNECTIVITY) ||
7155 (start_log->ring_id == RING_ID_FIRMWARE_DEBUG))) {
7156 WMA_LOGD("%s: Not connectivity or fw debug ring: %d",
7157 __func__, start_log->ring_id);
7158 return;
7159 }
7160
Govind Singhf25a0f12016-03-08 16:09:48 +05307161 wmi_unified_enable_specific_fw_logs_cmd(wma_handle->wmi_handle,
7162 (struct wmi_wifi_start_log *)start_log);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007163}
7164
Poddar, Siddarth176c4362016-10-03 12:25:00 +05307165#define MEGABYTE (1024 * 1024)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007166/**
7167 * wma_set_wifi_start_packet_stats() - Start/stop packet stats
7168 * @wma_handle: WMA handle
7169 * @start_log: Struture containing the start wifi logger params
7170 *
7171 * This function is used to send the WMA commands to start/stop logging
7172 * of per packet statistics
7173 *
7174 * Return: None
7175 *
7176 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07007177#ifdef REMOVE_PKT_LOG
7178static void wma_set_wifi_start_packet_stats(void *wma_handle,
7179 struct sir_wifi_start_log *start_log)
7180{
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07007181}
Venkata Sharath Chandra Manchala1240fc72017-10-26 17:32:29 -07007182
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07007183#else
7184static void wma_set_wifi_start_packet_stats(void *wma_handle,
7185 struct sir_wifi_start_log *start_log)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007186{
Komal Seelam3d202862016-02-24 18:43:24 +05307187 struct hif_opaque_softc *scn;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007188 uint32_t log_state;
7189
7190 if (!start_log) {
7191 WMA_LOGE("%s: start_log pointer is NULL", __func__);
7192 return;
7193 }
7194 if (!wma_handle) {
7195 WMA_LOGE("%s: Invalid wma handle", __func__);
7196 return;
7197 }
7198
7199 /* No need to register for ring IDs other than packet stats */
7200 if (start_log->ring_id != RING_ID_PER_PACKET_STATS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07007201 WMA_LOGD("%s: Ring id is not for per packet stats: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007202 __func__, start_log->ring_id);
7203 return;
7204 }
7205
Anurag Chouhan6d760662016-02-20 16:05:43 +05307206 scn = cds_get_context(QDF_MODULE_ID_HIF);
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07007207 if (!scn) {
Naveen Rawatb2109f62016-07-21 14:18:15 -07007208 WMA_LOGE("%s: Invalid HIF handle", __func__);
7209 return;
7210 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007211
Venkata Sharath Chandra Manchala1240fc72017-10-26 17:32:29 -07007212#ifdef HELIUMPLUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007213 log_state = ATH_PKTLOG_ANI | ATH_PKTLOG_RCUPDATE | ATH_PKTLOG_RCFIND |
Nirav Shahdcc4c872016-07-28 11:35:26 +05307214 ATH_PKTLOG_RX | ATH_PKTLOG_TX |
Venkata Sharath Chandra Manchala29965172018-01-18 14:17:29 -08007215 ATH_PKTLOG_TEXT | ATH_PKTLOG_SW_EVENT;
Alok Kumar2107a962020-01-13 15:35:29 +05307216#elif defined(QCA_WIFI_QCA6390) || defined(QCA_WIFI_QCA6490) || \
7217 defined(QCA_WIFI_QCA6750)
Venkata Sharath Chandra Manchalacd660982018-10-28 21:04:28 -07007218 log_state = ATH_PKTLOG_RCFIND | ATH_PKTLOG_RCUPDATE |
Venkata Sharath Chandra Manchala27e44902019-01-28 11:29:18 -08007219 ATH_PKTLOG_TX | ATH_PKTLOG_LITE_T2H |
7220 ATH_PKTLOG_SW_EVENT | ATH_PKTLOG_RX;
Venkata Sharath Chandra Manchalacd660982018-10-28 21:04:28 -07007221#elif defined(QCA_WIFI_QCA6290)
7222 log_state = ATH_PKTLOG_LITE_RX | ATH_PKTLOG_LITE_T2H;
Venkata Sharath Chandra Manchala1240fc72017-10-26 17:32:29 -07007223#else
Venkata Sharath Chandra Manchalacd660982018-10-28 21:04:28 -07007224 WMA_LOGD("%s: Packet log Not supported", __func__);
7225 log_state = 0;
Venkata Sharath Chandra Manchala1240fc72017-10-26 17:32:29 -07007226#endif
Poddar, Siddarth176c4362016-10-03 12:25:00 +05307227 if (start_log->size != 0) {
7228 pktlog_setsize(scn, start_log->size * MEGABYTE);
7229 return;
Poddar, Siddarthab99a272017-04-10 12:53:26 +05307230 } else if (start_log->is_pktlog_buff_clear == true) {
7231 pktlog_clearbuff(scn, start_log->is_pktlog_buff_clear);
7232 return;
Poddar, Siddarth176c4362016-10-03 12:25:00 +05307233 }
7234
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007235 if (start_log->verbose_level == WLAN_LOG_LEVEL_ACTIVE) {
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -08007236 pktlog_enable(scn, log_state, start_log->ini_triggered,
Poddar, Siddartheefe3482016-09-21 18:12:59 +05307237 start_log->user_triggered,
7238 start_log->is_iwpriv_command);
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08007239 WMA_LOGD("%s: Enabling per packet stats", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007240 } else {
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -08007241 pktlog_enable(scn, 0, start_log->ini_triggered,
Poddar, Siddartheefe3482016-09-21 18:12:59 +05307242 start_log->user_triggered,
7243 start_log->is_iwpriv_command);
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08007244 WMA_LOGD("%s: Disabling per packet stats", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007245 }
7246}
7247#endif
7248
7249/**
7250 * wma_send_flush_logs_to_fw() - Send log flush command to FW
7251 * @wma_handle: WMI handle
7252 *
7253 * This function is used to send the flush command to the FW,
7254 * that will flush the fw logs that are residue in the FW
7255 *
7256 * Return: None
7257 */
7258void wma_send_flush_logs_to_fw(tp_wma_handle wma_handle)
7259{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307260 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007261
Dustin Brownfd578602019-02-22 13:52:24 -08007262 status = wmi_unified_flush_logs_to_fw_cmd(wma_handle->wmi_handle);
7263 if (QDF_IS_STATUS_ERROR(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007264 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007265
Anurag Chouhan210db072016-02-22 18:42:15 +05307266 status = qdf_mc_timer_start(&wma_handle->log_completion_timer,
Dustin Brownfd578602019-02-22 13:52:24 -08007267 WMA_LOG_COMPLETION_TIMER);
7268 if (QDF_IS_STATUS_ERROR(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007269 WMA_LOGE("Failed to start the log completion timer");
7270}
7271
7272/**
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05307273 * wma_update_wep_default_key - To update default key id
7274 * @wma: pointer to wma handler
7275 * @update_def_key: pointer to wep_update_default_key_idx
7276 *
7277 * This function makes a copy of default key index to txrx node
7278 *
7279 * Return: Success
7280 */
7281static QDF_STATUS wma_update_wep_default_key(tp_wma_handle wma,
7282 struct wep_update_default_key_idx *update_def_key)
7283{
7284 struct wma_txrx_node *iface =
7285 &wma->interfaces[update_def_key->session_id];
7286 iface->wep_default_key_idx = update_def_key->default_idx;
7287
7288 return QDF_STATUS_SUCCESS;
7289}
7290
Agrawal, Ashish35b251d2016-09-08 19:21:03 +05307291/**
7292 * wma_update_tx_fail_cnt_th() - Set threshold for TX pkt fail
7293 * @wma_handle: WMA handle
7294 * @tx_fail_cnt_th: sme_tx_fail_cnt_threshold parameter
7295 *
7296 * This function is used to set Tx pkt fail count threshold,
7297 * FW will do disconnect with station once this threshold is reached.
7298 *
Dustin Brown6ca9b022019-02-21 16:47:11 -08007299 * Return: QDF_STATUS
Agrawal, Ashish35b251d2016-09-08 19:21:03 +05307300 */
7301static QDF_STATUS wma_update_tx_fail_cnt_th(tp_wma_handle wma,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07007302 struct sme_tx_fail_cnt_threshold *tx_fail_cnt_th)
Agrawal, Ashish35b251d2016-09-08 19:21:03 +05307303{
7304 u_int8_t vdev_id;
7305 u_int32_t tx_fail_disconn_th;
7306 int ret = -EIO;
7307
7308 if (!wma || !wma->wmi_handle) {
7309 WMA_LOGE(FL("WMA is closed, can not issue Tx pkt fail count threshold"));
7310 return QDF_STATUS_E_INVAL;
7311 }
7312 vdev_id = tx_fail_cnt_th->session_id;
7313 tx_fail_disconn_th = tx_fail_cnt_th->tx_fail_cnt_threshold;
7314 WMA_LOGD("Set TX pkt fail count threshold vdevId %d count %d",
7315 vdev_id, tx_fail_disconn_th);
7316
7317
7318 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
7319 WMI_VDEV_PARAM_DISCONNECT_TH,
7320 tx_fail_disconn_th);
7321
7322 if (ret) {
7323 WMA_LOGE(FL("Failed to send TX pkt fail count threshold command"));
7324 return QDF_STATUS_E_FAILURE;
7325 }
7326
7327 return QDF_STATUS_SUCCESS;
7328}
7329
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05307330/**
Agrawal Ashishda3e9502016-09-21 17:43:51 +05307331 * wma_update_short_retry_limit() - Set retry limit for short frames
7332 * @wma_handle: WMA handle
7333 * @short_retry_limit_th: retry limir count for Short frames.
7334 *
7335 * This function is used to configure the transmission retry limit at which
7336 * short frames needs to be retry.
7337 *
Dustin Brown6ca9b022019-02-21 16:47:11 -08007338 * Return: QDF_STATUS
Agrawal Ashishda3e9502016-09-21 17:43:51 +05307339 */
7340static QDF_STATUS wma_update_short_retry_limit(tp_wma_handle wma,
7341 struct sme_short_retry_limit *short_retry_limit_th)
7342{
7343 uint8_t vdev_id;
7344 uint32_t short_retry_limit;
7345 int ret;
7346
7347 if (!wma || !wma->wmi_handle) {
7348 WMA_LOGE("WMA is closed, can not issue short retry limit threshold");
7349 return QDF_STATUS_E_INVAL;
7350 }
7351 vdev_id = short_retry_limit_th->session_id;
7352 short_retry_limit = short_retry_limit_th->short_retry_limit;
7353 WMA_LOGD("Set short retry limit threshold vdevId %d count %d",
7354 vdev_id, short_retry_limit);
7355
7356 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
7357 WMI_VDEV_PARAM_NON_AGG_SW_RETRY_TH,
7358 short_retry_limit);
7359
7360 if (ret) {
7361 WMA_LOGE("Failed to send short limit threshold command");
7362 return QDF_STATUS_E_FAILURE;
7363 }
7364 return QDF_STATUS_SUCCESS;
7365}
7366
7367/**
7368 * wma_update_long_retry_limit() - Set retry limit for long frames
7369 * @wma_handle: WMA handle
7370 * @long_retry_limit_th: retry limir count for long frames
7371 *
7372 * This function is used to configure the transmission retry limit at which
7373 * long frames needs to be retry
7374 *
Dustin Brown6ca9b022019-02-21 16:47:11 -08007375 * Return: QDF_STATUS
Agrawal Ashishda3e9502016-09-21 17:43:51 +05307376 */
7377static QDF_STATUS wma_update_long_retry_limit(tp_wma_handle wma,
7378 struct sme_long_retry_limit *long_retry_limit_th)
7379{
7380 uint8_t vdev_id;
7381 uint32_t long_retry_limit;
7382 int ret;
7383
7384 if (!wma || !wma->wmi_handle) {
7385 WMA_LOGE("WMA is closed, can not issue long retry limit threshold");
7386 return QDF_STATUS_E_INVAL;
7387 }
7388 vdev_id = long_retry_limit_th->session_id;
7389 long_retry_limit = long_retry_limit_th->long_retry_limit;
7390 WMA_LOGD("Set TX pkt fail count threshold vdevId %d count %d",
7391 vdev_id, long_retry_limit);
7392
7393 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
7394 WMI_VDEV_PARAM_AGG_SW_RETRY_TH,
7395 long_retry_limit);
7396
7397 if (ret) {
7398 WMA_LOGE("Failed to send long limit threshold command");
7399 return QDF_STATUS_E_FAILURE;
7400 }
7401
7402 return QDF_STATUS_SUCCESS;
7403}
7404
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05307405/*
7406 * wma_update_sta_inactivity_timeout() - Set sta_inactivity_timeout to fw
7407 * @wma_handle: WMA handle
7408 * @sta_inactivity_timer: sme_sta_inactivity_timeout
7409 *
7410 * This function is used to set sta_inactivity_timeout.
7411 * If a station does not send anything in sta_inactivity_timeout seconds, an
7412 * empty data frame is sent to it in order to verify whether it is
7413 * still in range. If this frame is not ACKed, the station will be
7414 * disassociated and then deauthenticated.
7415 *
7416 * Return: None
7417 */
7418void wma_update_sta_inactivity_timeout(tp_wma_handle wma,
7419 struct sme_sta_inactivity_timeout *sta_inactivity_timer)
7420{
7421 uint8_t vdev_id;
7422 uint32_t max_unresponsive_time;
7423 uint32_t min_inactive_time, max_inactive_time;
7424
7425 if (!wma || !wma->wmi_handle) {
7426 WMA_LOGE("WMA is closed, can not issue sta_inactivity_timeout");
7427 return;
7428 }
7429 vdev_id = sta_inactivity_timer->session_id;
7430 max_unresponsive_time = sta_inactivity_timer->sta_inactivity_timeout;
7431 max_inactive_time = max_unresponsive_time * TWO_THIRD;
7432 min_inactive_time = max_unresponsive_time - max_inactive_time;
7433
7434 if (wma_vdev_set_param(wma->wmi_handle, vdev_id,
7435 WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS,
7436 min_inactive_time))
7437 WMA_LOGE("Failed to Set AP MIN IDLE INACTIVE TIME");
7438
7439 if (wma_vdev_set_param(wma->wmi_handle, vdev_id,
7440 WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS,
7441 max_inactive_time))
7442 WMA_LOGE("Failed to Set AP MAX IDLE INACTIVE TIME");
7443
7444 if (wma_vdev_set_param(wma->wmi_handle, vdev_id,
7445 WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS,
7446 max_unresponsive_time))
7447 WMA_LOGE("Failed to Set MAX UNRESPONSIVE TIME");
7448
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07007449 WMA_LOGD("%s:vdev_id:%d min_inactive_time: %u max_inactive_time: %u max_unresponsive_time: %u",
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05307450 __func__, vdev_id,
7451 min_inactive_time, max_inactive_time,
7452 max_unresponsive_time);
7453}
7454
Yingying Tang95409972016-10-20 15:16:15 +08007455#ifdef WLAN_FEATURE_WOW_PULSE
7456
7457
7458#define WMI_WOW_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM \
7459WMI_WOW_HOSTWAKEUP_GPIO_PIN_PATTERN_CONFIG_CMD_fixed_param
7460
7461
7462#define WMITLV_TAG_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM \
7463WMITLV_TAG_STRUC_wmi_wow_hostwakeup_gpio_pin_pattern_config_cmd_fixed_param
7464
7465/**
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07007466 * wma_send_wow_pulse_cmd() - send wmi cmd of wow pulse cmd
7467 * information to fw.
7468 * @wma_handle: wma handler
7469 * @udp_response: wow_pulse_mode pointer
7470 *
7471 * Return: Return QDF_STATUS
7472 */
Yingying Tang95409972016-10-20 15:16:15 +08007473static QDF_STATUS wma_send_wow_pulse_cmd(tp_wma_handle wma_handle,
7474 struct wow_pulse_mode *wow_pulse_cmd)
7475{
7476 QDF_STATUS status = QDF_STATUS_SUCCESS;
7477 wmi_buf_t buf;
7478 WMI_WOW_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM *cmd;
7479 u_int16_t len;
7480
7481 len = sizeof(*cmd);
7482 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07007483 if (!buf)
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07007484 return QDF_STATUS_E_NOMEM;
Yingying Tang95409972016-10-20 15:16:15 +08007485
7486 cmd = (WMI_WOW_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM *)wmi_buf_data(buf);
7487 qdf_mem_zero(cmd, len);
7488
7489 WMITLV_SET_HDR(&cmd->tlv_header,
7490 WMITLV_TAG_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM,
7491 WMITLV_GET_STRUCT_TLVLEN(
7492 WMI_WOW_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM));
7493
7494 cmd->enable = wow_pulse_cmd->wow_pulse_enable;
7495 cmd->pin = wow_pulse_cmd->wow_pulse_pin;
7496 cmd->interval_low = wow_pulse_cmd->wow_pulse_interval_low;
7497 cmd->interval_high = wow_pulse_cmd->wow_pulse_interval_high;
7498 cmd->repeat_cnt = WMI_WOW_PULSE_REPEAT_CNT;
7499
7500 if (wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
7501 WMI_WOW_HOSTWAKEUP_GPIO_PIN_PATTERN_CONFIG_CMDID)) {
Yingying Tang95409972016-10-20 15:16:15 +08007502 wmi_buf_free(buf);
7503 status = QDF_STATUS_E_FAILURE;
7504 }
7505
7506 WMA_LOGD("%s: Exit", __func__);
7507 return status;
7508}
7509
7510#undef WMI_WOW_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM
7511#undef WMITLV_TAG_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM
7512#undef WMI_WOW_PULSE_REPEAT_CNT
7513
7514#else
7515static inline QDF_STATUS wma_send_wow_pulse_cmd(tp_wma_handle wma_handle,
7516 struct wow_pulse_mode *wow_pulse_cmd)
7517{
7518 return QDF_STATUS_E_FAILURE;
7519}
7520#endif
7521
7522
Agrawal Ashishda3e9502016-09-21 17:43:51 +05307523/**
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05307524 * wma_process_power_debug_stats_req() - Process the Chip Power stats collect
7525 * request and pass the Power stats request to Fw
7526 * @wma_handle: WMA handle
7527 *
7528 * Return: QDF_STATUS
7529 */
Aditya Kodukula0a590372020-04-15 13:30:14 -07007530#ifdef WLAN_POWER_DEBUG
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05307531static QDF_STATUS wma_process_power_debug_stats_req(tp_wma_handle wma_handle)
7532{
7533 wmi_pdev_get_chip_power_stats_cmd_fixed_param *cmd;
7534 int32_t len;
7535 wmi_buf_t buf;
7536 uint8_t *buf_ptr;
7537 int ret;
7538
7539 if (!wma_handle) {
7540 WMA_LOGE("%s: input pointer is NULL", __func__);
7541 return QDF_STATUS_E_FAILURE;
7542 }
7543
7544 len = sizeof(*cmd);
7545 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07007546 if (!buf)
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05307547 return QDF_STATUS_E_NOMEM;
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05307548
7549 buf_ptr = (u_int8_t *) wmi_buf_data(buf);
7550 cmd = (wmi_pdev_get_chip_power_stats_cmd_fixed_param *) buf_ptr;
7551
7552 WMITLV_SET_HDR(&cmd->tlv_header,
7553 WMITLV_TAG_STRUC_wmi_get_chip_power_stats_cmd_fixed_param,
7554 WMITLV_GET_STRUCT_TLVLEN(
7555 wmi_pdev_get_chip_power_stats_cmd_fixed_param));
7556 cmd->pdev_id = 0;
7557
7558 WMA_LOGD("POWER_DEBUG_STATS - Get Request Params; Pdev id - %d",
7559 cmd->pdev_id);
7560 ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
7561 WMI_PDEV_GET_CHIP_POWER_STATS_CMDID);
7562 if (ret) {
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05307563 wmi_buf_free(buf);
7564 return QDF_STATUS_E_FAILURE;
7565 }
7566 return QDF_STATUS_SUCCESS;
7567}
Aditya Kodukula0a590372020-04-15 13:30:14 -07007568#else
7569static QDF_STATUS wma_process_power_debug_stats_req(tp_wma_handle wma_handle)
7570{
7571 return QDF_STATUS_SUCCESS;
7572}
7573#endif
Arunk Khandavallica56d4b2018-11-29 15:46:00 +05307574#ifdef WLAN_FEATURE_BEACON_RECEPTION_STATS
7575static QDF_STATUS wma_process_beacon_debug_stats_req(tp_wma_handle wma_handle,
7576 uint32_t *vdev_id)
7577{
7578 wmi_vdev_get_bcn_recv_stats_cmd_fixed_param *cmd;
7579 int32_t len;
7580 wmi_buf_t buf;
7581 uint8_t *buf_ptr;
7582 int ret;
7583
7584 WMA_LOGD("%s: Enter", __func__);
7585 if (!wma_handle) {
7586 WMA_LOGE("%s: input pointer is NULL", __func__);
7587 return QDF_STATUS_E_FAILURE;
7588 }
7589
7590 len = sizeof(*cmd);
7591 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
7592 if (!buf)
7593 return QDF_STATUS_E_NOMEM;
7594
7595 buf_ptr = (u_int8_t *)wmi_buf_data(buf);
7596 cmd = (wmi_vdev_get_bcn_recv_stats_cmd_fixed_param *)buf_ptr;
7597
7598 WMITLV_SET_HDR(&cmd->tlv_header,
7599 WMITLV_TAG_STRUC_wmi_get_bcn_recv_stats_fixed_param,
7600 WMITLV_GET_STRUCT_TLVLEN(
7601 wmi_vdev_get_bcn_recv_stats_cmd_fixed_param));
7602 cmd->vdev_id = *vdev_id;
7603
7604 WMA_LOGD("BEACON_DEBUG_STATS - Get Request Params; vdev id - %d",
7605 cmd->vdev_id);
7606 ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
7607 WMI_VDEV_GET_BCN_RECEPTION_STATS_CMDID);
7608 if (ret) {
7609 wmi_buf_free(buf);
7610 return QDF_STATUS_E_FAILURE;
7611 }
7612
7613 WMA_LOGD("%s: Exit", __func__);
7614 return QDF_STATUS_SUCCESS;
7615}
7616#else
7617static QDF_STATUS wma_process_beacon_debug_stats_req(tp_wma_handle wma_handle,
7618 uint32_t *vdev_id)
7619{
7620 return QDF_STATUS_SUCCESS;
7621}
7622#endif
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05307623
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05307624/**
7625 * wma_set_arp_req_stats() - process set arp stats request command to fw
7626 * @wma_handle: WMA handle
7627 * @req_buf: set srp stats request buffer
7628 *
7629 * Return: None
7630 */
7631static void wma_set_arp_req_stats(WMA_HANDLE handle,
7632 struct set_arp_stats_params *req_buf)
7633{
Dustin Brownfd578602019-02-22 13:52:24 -08007634 QDF_STATUS status;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05307635 struct set_arp_stats *arp_stats;
7636 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Alan Chen756d1bf2020-02-13 11:54:35 -08007637 struct wlan_objmgr_vdev *vdev;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05307638
7639 if (!wma_handle || !wma_handle->wmi_handle) {
7640 WMA_LOGE("%s: WMA is closed, cannot send per roam config",
7641 __func__);
7642 return;
7643 }
Alan Chen756d1bf2020-02-13 11:54:35 -08007644
Yeshwanth Sriram Guntukad5aae7f2017-11-27 14:33:51 +05307645 if (!wma_is_vdev_valid(req_buf->vdev_id)) {
Pragaspathi Thilagarajd5cb9e82019-02-04 14:13:52 +05307646 WMA_LOGE("vdev id:%d is not active", req_buf->vdev_id);
Yeshwanth Sriram Guntukad5aae7f2017-11-27 14:33:51 +05307647 return;
7648 }
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05307649
Alan Chen756d1bf2020-02-13 11:54:35 -08007650 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(wma_handle->psoc,
7651 req_buf->vdev_id,
7652 WLAN_LEGACY_WMA_ID);
Alan Chenb69c4062020-03-27 12:44:51 -07007653 if (!vdev) {
7654 WMA_LOGE("Can't get vdev by vdev_id:%d", req_buf->vdev_id);
7655 return;
7656 }
7657
7658 if (!wma_is_vdev_up(req_buf->vdev_id)) {
Alan Chen756d1bf2020-02-13 11:54:35 -08007659 WMA_LOGD("vdev id:%d is not started", req_buf->vdev_id);
7660 goto release_ref;
7661 }
7662
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05307663 arp_stats = (struct set_arp_stats *)req_buf;
7664 status = wmi_unified_set_arp_stats_req(wma_handle->wmi_handle,
7665 arp_stats);
Dustin Brownfd578602019-02-22 13:52:24 -08007666 if (QDF_IS_STATUS_ERROR(status))
7667 wma_err("failed to set arp stats to FW");
Alan Chen756d1bf2020-02-13 11:54:35 -08007668
7669release_ref:
7670 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID);
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05307671}
7672
7673/**
7674 * wma_get_arp_req_stats() - process get arp stats request command to fw
7675 * @wma_handle: WMA handle
7676 * @req_buf: get srp stats request buffer
7677 *
7678 * Return: None
7679 */
7680static void wma_get_arp_req_stats(WMA_HANDLE handle,
7681 struct get_arp_stats_params *req_buf)
7682{
Dustin Brownfd578602019-02-22 13:52:24 -08007683 QDF_STATUS status;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05307684 struct get_arp_stats *arp_stats;
7685 tp_wma_handle wma_handle = (tp_wma_handle) handle;
7686
7687 if (!wma_handle || !wma_handle->wmi_handle) {
7688 WMA_LOGE("%s: WMA is closed, cannot send per roam config",
7689 __func__);
7690 return;
7691 }
Yeshwanth Sriram Guntuka3e4d96f2017-12-19 14:09:04 +05307692 if (!wma_is_vdev_valid(req_buf->vdev_id)) {
Pragaspathi Thilagarajd5cb9e82019-02-04 14:13:52 +05307693 WMA_LOGE("vdev id:%d is not active", req_buf->vdev_id);
Yeshwanth Sriram Guntuka3e4d96f2017-12-19 14:09:04 +05307694 return;
7695 }
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05307696
7697 arp_stats = (struct get_arp_stats *)req_buf;
7698 status = wmi_unified_get_arp_stats_req(wma_handle->wmi_handle,
7699 arp_stats);
Dustin Brownfd578602019-02-22 13:52:24 -08007700 if (QDF_IS_STATUS_ERROR(status))
7701 wma_err("failed to send get arp stats to FW");
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05307702}
7703
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05307704/**
7705 * wma_set_del_pmkid_cache() - API to set/delete PMKID cache entry in fw
7706 * @handle: WMA handle
7707 * @pmk_cache: PMK cache entry
7708 *
7709 * Return: None
7710 */
7711static void wma_set_del_pmkid_cache(WMA_HANDLE handle,
7712 struct wmi_unified_pmk_cache *pmk_cache)
7713{
Dustin Brownfd578602019-02-22 13:52:24 -08007714 QDF_STATUS status;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05307715 tp_wma_handle wma_handle = (tp_wma_handle) handle;
7716
7717 if (!wma_handle || !wma_handle->wmi_handle) {
7718 WMA_LOGE("WMA is closed, cannot send set del pmkid");
7719 return;
7720 }
7721
7722 status = wmi_unified_set_del_pmkid_cache(wma_handle->wmi_handle,
7723 pmk_cache);
Dustin Brownfd578602019-02-22 13:52:24 -08007724 if (QDF_IS_STATUS_ERROR(status))
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05307725 WMA_LOGE("failed to send set/del pmkid cmd to fw");
7726}
7727
Vignesh Viswanathan694e28e2018-01-18 20:53:57 +05307728/**
Vignesh Viswanathan694e28e2018-01-18 20:53:57 +05307729 * wma_send_invoke_neighbor_report() - API to send invoke neighbor report
7730 * command to fw
7731 *
7732 * @handle: WMA handle
7733 * @params: Pointer to invoke neighbor report params
7734 *
7735 * Return: None
7736 */
7737static
7738void wma_send_invoke_neighbor_report(WMA_HANDLE handle,
7739 struct wmi_invoke_neighbor_report_params *params)
7740{
7741 QDF_STATUS status;
7742 tp_wma_handle wma_handle = (tp_wma_handle) handle;
7743
7744 if (!wma_handle || !wma_handle->wmi_handle) {
7745 WMA_LOGE("WMA is closed, cannot send invoke neighbor report");
7746 return;
7747 }
7748
7749 status = wmi_unified_invoke_neighbor_report_cmd(wma_handle->wmi_handle,
7750 params);
7751
7752 if (status != QDF_STATUS_SUCCESS)
7753 WMA_LOGE("failed to send invoke neighbor report command");
7754}
7755
lifeng66831662017-05-19 16:01:35 +08007756QDF_STATUS wma_set_rx_reorder_timeout_val(tp_wma_handle wma_handle,
7757 struct sir_set_rx_reorder_timeout_val *reorder_timeout)
7758{
7759 wmi_pdev_set_reorder_timeout_val_cmd_fixed_param *cmd;
7760 uint32_t len;
7761 wmi_buf_t buf;
7762 int ret;
7763
7764 if (!reorder_timeout) {
7765 WMA_LOGE(FL("invalid pointer"));
7766 return QDF_STATUS_E_INVAL;
7767 }
7768
7769 if (!wma_handle) {
7770 WMA_LOGE(FL("WMA context is invald!"));
7771 return QDF_STATUS_E_INVAL;
7772 }
7773 len = sizeof(*cmd);
7774 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07007775 if (!buf)
lifeng66831662017-05-19 16:01:35 +08007776 return QDF_STATUS_E_NOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07007777
lifeng66831662017-05-19 16:01:35 +08007778 cmd = (wmi_pdev_set_reorder_timeout_val_cmd_fixed_param *)
7779 wmi_buf_data(buf);
7780
7781 WMITLV_SET_HDR(&cmd->tlv_header,
7782 WMITLV_TAG_STRUC_wmi_pdev_set_reorder_timeout_val_cmd_fixed_param,
7783 WMITLV_GET_STRUCT_TLVLEN(wmi_pdev_set_reorder_timeout_val_cmd_fixed_param));
7784
7785 memcpy(cmd->rx_timeout_pri, reorder_timeout->rx_timeout_pri,
7786 sizeof(reorder_timeout->rx_timeout_pri));
7787
7788 WMA_LOGD("rx aggr record timeout: VO: %d, VI: %d, BE: %d, BK: %d",
7789 cmd->rx_timeout_pri[0], cmd->rx_timeout_pri[1],
7790 cmd->rx_timeout_pri[2], cmd->rx_timeout_pri[3]);
7791
7792 ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
7793 WMI_PDEV_SET_REORDER_TIMEOUT_VAL_CMDID);
7794 if (ret) {
lifeng66831662017-05-19 16:01:35 +08007795 wmi_buf_free(buf);
7796 return QDF_STATUS_E_FAILURE;
7797 }
7798
7799 return QDF_STATUS_SUCCESS;
7800}
7801
7802QDF_STATUS wma_set_rx_blocksize(tp_wma_handle wma_handle,
7803 struct sir_peer_set_rx_blocksize *peer_rx_blocksize)
7804{
7805 wmi_peer_set_rx_blocksize_cmd_fixed_param *cmd;
7806 int32_t len;
7807 wmi_buf_t buf;
7808 u_int8_t *buf_ptr;
7809 int ret;
7810
7811 if (!peer_rx_blocksize) {
7812 WMA_LOGE(FL("invalid pointer"));
7813 return QDF_STATUS_E_INVAL;
7814 }
7815
7816 if (!wma_handle) {
7817 WMA_LOGE(FL(" WMA context is invald!"));
7818 return QDF_STATUS_E_INVAL;
7819 }
7820
7821 len = sizeof(*cmd);
7822 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07007823 if (!buf)
lifeng66831662017-05-19 16:01:35 +08007824 return QDF_STATUS_E_NOMEM;
lifeng66831662017-05-19 16:01:35 +08007825
7826 buf_ptr = (u_int8_t *) wmi_buf_data(buf);
7827 cmd = (wmi_peer_set_rx_blocksize_cmd_fixed_param *) buf_ptr;
7828
7829 WMITLV_SET_HDR(&cmd->tlv_header,
7830 WMITLV_TAG_STRUC_wmi_peer_set_rx_blocksize_cmd_fixed_param,
7831 WMITLV_GET_STRUCT_TLVLEN(wmi_peer_set_rx_blocksize_cmd_fixed_param));
7832
7833 cmd->vdev_id = peer_rx_blocksize->vdev_id;
7834 cmd->rx_block_ack_win_limit =
7835 peer_rx_blocksize->rx_block_ack_win_limit;
7836 WMI_CHAR_ARRAY_TO_MAC_ADDR(peer_rx_blocksize->peer_macaddr.bytes,
7837 &cmd->peer_macaddr);
7838
7839 WMA_LOGD("rx aggr blocksize: %d", cmd->rx_block_ack_win_limit);
7840
7841 ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
7842 WMI_PEER_SET_RX_BLOCKSIZE_CMDID);
7843 if (ret) {
lifeng66831662017-05-19 16:01:35 +08007844 wmi_buf_free(buf);
7845 return QDF_STATUS_E_FAILURE;
7846 }
7847
7848 return QDF_STATUS_SUCCESS;
7849}
7850
lifengd217d192017-05-09 19:44:16 +08007851QDF_STATUS wma_get_chain_rssi(tp_wma_handle wma_handle,
7852 struct get_chain_rssi_req_params *req_params)
7853{
lifengfe6c3e22018-04-03 12:10:04 +08007854 wmi_pdev_div_get_rssi_antid_fixed_param *cmd;
lifengd217d192017-05-09 19:44:16 +08007855 wmi_buf_t wmi_buf;
lifengfe6c3e22018-04-03 12:10:04 +08007856 uint32_t len = sizeof(wmi_pdev_div_get_rssi_antid_fixed_param);
lifengd217d192017-05-09 19:44:16 +08007857 u_int8_t *buf_ptr;
7858
7859 if (!wma_handle) {
7860 WMA_LOGE(FL("WMA is closed, can not issue cmd"));
7861 return QDF_STATUS_E_INVAL;
7862 }
7863
7864 wmi_buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07007865 if (!wmi_buf)
lifengd217d192017-05-09 19:44:16 +08007866 return QDF_STATUS_E_NOMEM;
lifengd217d192017-05-09 19:44:16 +08007867
7868 buf_ptr = (u_int8_t *)wmi_buf_data(wmi_buf);
7869
lifengfe6c3e22018-04-03 12:10:04 +08007870 cmd = (wmi_pdev_div_get_rssi_antid_fixed_param *)buf_ptr;
lifengd217d192017-05-09 19:44:16 +08007871 WMITLV_SET_HDR(&cmd->tlv_header,
lifengfe6c3e22018-04-03 12:10:04 +08007872 WMITLV_TAG_STRUC_wmi_pdev_div_get_rssi_antid_fixed_param,
lifengd217d192017-05-09 19:44:16 +08007873 WMITLV_GET_STRUCT_TLVLEN(
lifengfe6c3e22018-04-03 12:10:04 +08007874 wmi_pdev_div_get_rssi_antid_fixed_param));
7875 cmd->pdev_id = 0;
lifengd217d192017-05-09 19:44:16 +08007876 WMI_CHAR_ARRAY_TO_MAC_ADDR(req_params->peer_macaddr.bytes,
lifengfe6c3e22018-04-03 12:10:04 +08007877 &cmd->macaddr);
lifengd217d192017-05-09 19:44:16 +08007878
7879 if (wmi_unified_cmd_send(wma_handle->wmi_handle, wmi_buf, len,
lifengfe6c3e22018-04-03 12:10:04 +08007880 WMI_PDEV_DIV_GET_RSSI_ANTID_CMDID)) {
lifengd217d192017-05-09 19:44:16 +08007881 wmi_buf_free(wmi_buf);
7882 return QDF_STATUS_E_FAILURE;
7883 }
7884
7885 return QDF_STATUS_SUCCESS;
7886}
7887
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05307888#if defined(WLAN_FEATURE_FILS_SK)
7889/**
7890 * wma_roam_scan_send_hlp() - API to send HLP IE info to fw
7891 * @wma_handle: WMA handle
7892 * @req: HLP params
7893 *
7894 * Return: QDF_STATUS
7895 */
7896static QDF_STATUS wma_roam_scan_send_hlp(tp_wma_handle wma_handle,
7897 struct hlp_params *req)
7898{
7899 struct hlp_params *params;
7900 QDF_STATUS status;
7901
7902 params = qdf_mem_malloc(sizeof(*params));
Arif Hussain157263f2018-10-03 13:07:15 -07007903 if (!params)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05307904 return QDF_STATUS_E_NOMEM;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05307905
7906 params->vdev_id = req->vdev_id;
7907 params->hlp_ie_len = req->hlp_ie_len;
7908 qdf_mem_copy(params->hlp_ie, req->hlp_ie, req->hlp_ie_len);
7909 status = wmi_unified_roam_send_hlp_cmd(wma_handle->wmi_handle, params);
7910
7911 WMA_LOGD("Send HLP status %d vdev id %d", status, params->vdev_id);
7912 qdf_trace_hex_dump(QDF_MODULE_ID_WMI, QDF_TRACE_LEVEL_DEBUG,
7913 params->hlp_ie, 10);
7914
7915 qdf_mem_free(params);
7916 return status;
7917}
7918#else
7919static QDF_STATUS wma_roam_scan_send_hlp(tp_wma_handle wma_handle,
7920 struct hlp_params *req)
7921{
7922 return QDF_STATUS_SUCCESS;
7923}
7924#endif
7925
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05307926/**
Ganesh Kondabattini35739572017-06-21 16:26:39 +05307927 * wma_process_set_limit_off_chan() - set limit off chanel parameters
7928 * @wma_handle: pointer to wma handle
7929 * @param: pointer to sir_limit_off_chan
7930 *
7931 * Return: QDF_STATUS_SUCCESS for success or error code.
7932 */
7933static QDF_STATUS wma_process_limit_off_chan(tp_wma_handle wma_handle,
7934 struct sir_limit_off_chan *param)
7935{
7936 int32_t err;
7937 struct wmi_limit_off_chan_param limit_off_chan_param;
7938
Rajeev Kumar752d64e2017-10-05 16:32:58 -07007939 if (param->vdev_id >= wma_handle->max_bssid) {
7940 WMA_LOGE(FL("Invalid vdev_id: %d"), param->vdev_id);
7941 return QDF_STATUS_E_INVAL;
7942 }
7943 if (!wma_is_vdev_up(param->vdev_id)) {
Yeshwanth Sriram Guntukacbe61442018-08-23 18:08:44 +05307944 WMA_LOGD("vdev %d is not up skipping limit_off_chan_param",
7945 param->vdev_id);
Rajeev Kumar752d64e2017-10-05 16:32:58 -07007946 return QDF_STATUS_E_INVAL;
7947 }
7948
Ganesh Kondabattini35739572017-06-21 16:26:39 +05307949 limit_off_chan_param.vdev_id = param->vdev_id;
7950 limit_off_chan_param.status = param->is_tos_active;
7951 limit_off_chan_param.max_offchan_time = param->max_off_chan_time;
7952 limit_off_chan_param.rest_time = param->rest_time;
7953 limit_off_chan_param.skip_dfs_chans = param->skip_dfs_chans;
7954
7955 err = wmi_unified_send_limit_off_chan_cmd(wma_handle->wmi_handle,
7956 &limit_off_chan_param);
7957 if (err) {
7958 WMA_LOGE("\n failed to set limit off chan cmd");
7959 return QDF_STATUS_E_FAILURE;
7960 }
7961
7962 return QDF_STATUS_SUCCESS;
7963}
7964
Arif Hussain05fb4872018-01-03 16:02:55 -08007965static QDF_STATUS wma_process_obss_color_collision_req(tp_wma_handle wma_handle,
7966 struct wmi_obss_color_collision_cfg_param *cfg)
7967{
7968 QDF_STATUS status;
7969
7970 if (cfg->vdev_id >= wma_handle->max_bssid) {
7971 WMA_LOGE(FL("Invalid vdev_id: %d"), cfg->vdev_id);
7972 return QDF_STATUS_E_INVAL;
7973 }
7974 if (!wma_is_vdev_up(cfg->vdev_id)) {
7975 WMA_LOGE("vdev %d is not up skipping obss color collision req",
7976 cfg->vdev_id);
7977 return QDF_STATUS_E_INVAL;
7978 }
7979
7980 status = wmi_unified_send_obss_color_collision_cfg_cmd(wma_handle->
7981 wmi_handle, cfg);
7982 if (QDF_IS_STATUS_ERROR(status))
7983 WMA_LOGE("Failed to send obss color collision cfg");
7984
7985 return status;
7986}
7987
Ganesh Kondabattini35739572017-06-21 16:26:39 +05307988/**
Arif Hussainee10f902017-12-27 16:30:17 -08007989 * wma_send_obss_detection_cfg() - send obss detection cfg to firmware
7990 * @wma_handle: pointer to wma handle
7991 * @cfg: obss detection configuration
7992 *
7993 * Send obss detection configuration to firmware.
7994 *
7995 * Return: None
7996 */
7997static void wma_send_obss_detection_cfg(tp_wma_handle wma_handle,
7998 struct wmi_obss_detection_cfg_param
7999 *cfg)
8000{
8001 QDF_STATUS status;
8002
8003 if (cfg->vdev_id >= wma_handle->max_bssid) {
8004 WMA_LOGE(FL("Invalid vdev_id: %d"), cfg->vdev_id);
8005 return;
8006 }
8007 if (!wma_is_vdev_up(cfg->vdev_id)) {
8008 WMA_LOGE("vdev %d is not up skipping obss detection req",
8009 cfg->vdev_id);
8010 return;
8011 }
8012
8013 status = wmi_unified_send_obss_detection_cfg_cmd(wma_handle->wmi_handle,
8014 cfg);
8015 if (QDF_IS_STATUS_ERROR(status))
8016 WMA_LOGE("Failed to send obss detection cfg");
8017
8018 return;
8019}
8020
Visweswara Tanuku633976b2019-01-07 16:13:12 +05308021#ifdef WLAN_FEATURE_MOTION_DETECTION
8022/**
8023 * wma_motion_det_host_event_handler - motion detection event handler
8024 * @handle: WMA global handle
8025 * @event: motion detection event
8026 * @len: Length of cmd
8027 *
8028 * Call motion detection event callback handler
8029 *
8030 * Return: 0 on success, else error on failure
8031 */
8032int wma_motion_det_host_event_handler(void *handle, uint8_t *event,
8033 uint32_t len)
8034{
8035 wmi_motion_det_event *motion_det_event_hdr;
8036 WMI_MOTION_DET_HOST_EVENTID_param_tlvs *param_buf =
8037 (WMI_MOTION_DET_HOST_EVENTID_param_tlvs *)event;
8038 struct sir_md_evt *md_event;
8039 struct mac_context *pmac = (struct mac_context *)cds_get_context(
8040 QDF_MODULE_ID_PE);
8041
8042 if (!param_buf) {
8043 WMA_LOGE("Invalid motion det host event buffer");
8044 return -EINVAL;
8045 }
8046
Harprit Chhabadac67478f2019-04-09 11:39:22 -07008047 if (!pmac || !pmac->sme.md_host_evt_cb) {
8048 WMA_LOGE("Invalid motion detect callback");
8049 return -EINVAL;
8050 }
8051
Visweswara Tanuku633976b2019-01-07 16:13:12 +05308052 motion_det_event_hdr = param_buf->fixed_param;
8053 WMA_LOGA("motion detect host event received, vdev_id=%d, status=%d",
8054 motion_det_event_hdr->vdev_id, motion_det_event_hdr->status);
8055
8056 md_event = qdf_mem_malloc(sizeof(*md_event));
Visweswara Tanuku41d21c02019-10-25 14:51:59 +05308057 if (!md_event)
Visweswara Tanuku633976b2019-01-07 16:13:12 +05308058 return -ENOMEM;
8059
8060 md_event->vdev_id = motion_det_event_hdr->vdev_id;
8061 md_event->status = motion_det_event_hdr->status;
8062
8063 pmac->sme.md_host_evt_cb(pmac->sme.md_ctx, md_event);
8064
8065 qdf_mem_free(md_event);
8066 return 0;
8067}
8068
8069/**
8070 * wma_motion_det_base_line_host_event_handler - md baselining event handler
8071 * @handle: WMA global handle
8072 * @event: motion detection baselining event
8073 * @len: Length of cmd
8074 *
8075 * Return: 0 on success, else error on failure
8076 */
8077int wma_motion_det_base_line_host_event_handler(void *handle,
8078 uint8_t *event, uint32_t len)
8079{
8080 wmi_motion_det_base_line_event *motion_det_base_line_event_hdr;
8081 WMI_MOTION_DET_BASE_LINE_HOST_EVENTID_param_tlvs *param_buf =
8082 (WMI_MOTION_DET_BASE_LINE_HOST_EVENTID_param_tlvs *)event;
Visweswara Tanuku41d21c02019-10-25 14:51:59 +05308083 struct sir_md_bl_evt *md_bl_event;
8084 struct mac_context *pmac = (struct mac_context *)cds_get_context(
8085 QDF_MODULE_ID_PE);
Visweswara Tanuku633976b2019-01-07 16:13:12 +05308086
8087 if (!param_buf) {
Visweswara Tanuku41d21c02019-10-25 14:51:59 +05308088 WMA_LOGE("Invalid motion detection base line event buffer");
8089 return -EINVAL;
8090 }
8091
8092 if (!pmac || !pmac->sme.md_bl_evt_cb) {
8093 WMA_LOGE("Invalid motion detection base line callback");
Visweswara Tanuku633976b2019-01-07 16:13:12 +05308094 return -EINVAL;
8095 }
8096
8097 motion_det_base_line_event_hdr = param_buf->fixed_param;
Visweswara Tanuku41d21c02019-10-25 14:51:59 +05308098 WMA_LOGA("motion detection base line event received, vdev_id=%d",
Visweswara Tanuku633976b2019-01-07 16:13:12 +05308099 motion_det_base_line_event_hdr->vdev_id);
8100 WMA_LOGA("baseline_value=%d bl_max_corr_resv=%d bl_min_corr_resv=%d",
8101 motion_det_base_line_event_hdr->bl_baseline_value,
8102 motion_det_base_line_event_hdr->bl_max_corr_reserved,
8103 motion_det_base_line_event_hdr->bl_min_corr_reserved);
8104
Visweswara Tanuku41d21c02019-10-25 14:51:59 +05308105 md_bl_event = qdf_mem_malloc(sizeof(*md_bl_event));
8106 if (!md_bl_event)
8107 return -ENOMEM;
8108
8109 md_bl_event->vdev_id = motion_det_base_line_event_hdr->vdev_id;
8110 md_bl_event->bl_baseline_value =
8111 motion_det_base_line_event_hdr->bl_baseline_value;
8112 md_bl_event->bl_max_corr_reserved =
8113 motion_det_base_line_event_hdr->bl_max_corr_reserved;
8114 md_bl_event->bl_min_corr_reserved =
8115 motion_det_base_line_event_hdr->bl_min_corr_reserved;
8116
8117 pmac->sme.md_bl_evt_cb(pmac->sme.md_ctx, md_bl_event);
8118
8119 qdf_mem_free(md_bl_event);
Visweswara Tanuku633976b2019-01-07 16:13:12 +05308120 return 0;
8121}
8122
8123/**
8124 * wma_set_motion_det_config - Sends motion detection configuration wmi cmd
8125 * @wma_handle: WMA global handle
8126 * @motion_det_cfg: motion detection configuration
8127 *
8128 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_ERROR on error
8129 */
8130static QDF_STATUS wma_set_motion_det_config(
8131 tp_wma_handle wma_handle,
8132 struct sme_motion_det_cfg *motion_det_cfg)
8133{
8134 wmi_motion_det_config_params_cmd_fixed_param *cmd;
8135 wmi_buf_t buf;
8136 int err;
8137
8138 buf = wmi_buf_alloc(wma_handle->wmi_handle, sizeof(*cmd));
8139 if (!buf)
8140 return QDF_STATUS_E_NOMEM;
8141
8142 cmd = (wmi_motion_det_config_params_cmd_fixed_param *)wmi_buf_data(buf);
8143 qdf_mem_zero(cmd, sizeof(*cmd));
8144
8145 WMITLV_SET_HDR(
8146 &cmd->tlv_header,
8147 WMITLV_TAG_STRUC_wmi_motion_det_config_params_cmd_fixed_param,
8148 WMITLV_GET_STRUCT_TLVLEN(
8149 wmi_motion_det_config_params_cmd_fixed_param));
8150 cmd->vdev_id = motion_det_cfg->vdev_id;
8151 cmd->time_t1 = motion_det_cfg->time_t1;
8152 cmd->time_t2 = motion_det_cfg->time_t2;
8153 cmd->n1 = motion_det_cfg->n1;
8154 cmd->n2 = motion_det_cfg->n2;
8155 cmd->time_t1_gap = motion_det_cfg->time_t1_gap;
8156 cmd->time_t2_gap = motion_det_cfg->time_t2_gap;
8157 cmd->coarse_K = motion_det_cfg->coarse_K;
8158 cmd->fine_K = motion_det_cfg->fine_K;
8159 cmd->coarse_Q = motion_det_cfg->coarse_Q;
8160 cmd->fine_Q = motion_det_cfg->fine_Q;
8161 cmd->md_coarse_thr_high = motion_det_cfg->md_coarse_thr_high;
8162 cmd->md_fine_thr_high = motion_det_cfg->md_fine_thr_high;
8163 cmd->md_coarse_thr_low = motion_det_cfg->md_coarse_thr_low;
8164 cmd->md_fine_thr_low = motion_det_cfg->md_fine_thr_low;
8165
8166 err = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, sizeof(*cmd),
8167 WMI_MOTION_DET_CONFIG_PARAM_CMDID);
8168 if (err) {
8169 wmi_buf_free(buf);
8170 return QDF_STATUS_E_FAILURE;
8171 }
8172 WMA_LOGA("Set motion_det_config to vdevId %d\n"
8173 "time_t1 %d\n"
8174 "time_t2 %d\n"
8175 "n1 %d\n"
8176 "n2 %d\n"
8177 "time_t1_gap %d\n"
8178 "time_t2_gap %d\n"
8179 "coarse_K %d\n"
8180 "fine_K %d\n"
8181 "coarse_Q %d\n"
8182 "fine_Q %d\n"
8183 "md_coarse_thr_high %d\n"
8184 "md_fine_thr_high %d\n"
8185 "md_coarse_thr_low %d\n"
8186 "md_fine_thr_low %d\n",
8187 motion_det_cfg->vdev_id,
8188 motion_det_cfg->time_t1,
8189 motion_det_cfg->time_t2,
8190 motion_det_cfg->n1,
8191 motion_det_cfg->n2,
8192 motion_det_cfg->time_t1_gap,
8193 motion_det_cfg->time_t2_gap,
8194 motion_det_cfg->coarse_K,
8195 motion_det_cfg->fine_K,
8196 motion_det_cfg->coarse_Q,
8197 motion_det_cfg->fine_Q,
8198 motion_det_cfg->md_coarse_thr_high,
8199 motion_det_cfg->md_fine_thr_high,
8200 motion_det_cfg->md_coarse_thr_low,
8201 motion_det_cfg->md_fine_thr_low);
8202 return QDF_STATUS_SUCCESS;
8203}
8204
8205/**
8206 * wma_set_motion_det_enable - Sends motion detection start/stop wmi cmd
8207 * @wma_handle: WMA global handle
8208 * @md_en: motion detection start/stop
8209 *
8210 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_ERROR on error
8211 */
8212static QDF_STATUS wma_set_motion_det_enable(tp_wma_handle wma_handle,
8213 struct sme_motion_det_en *md_en)
8214{
8215 wmi_motion_det_start_stop_cmd_fixed_param *cmd;
8216 wmi_buf_t buf;
8217 int err;
8218
8219 buf = wmi_buf_alloc(wma_handle->wmi_handle, sizeof(*cmd));
8220 if (!buf)
8221 return QDF_STATUS_E_NOMEM;
8222
8223 cmd = (wmi_motion_det_start_stop_cmd_fixed_param *)wmi_buf_data(buf);
8224 qdf_mem_zero(cmd, sizeof(*cmd));
8225
8226 WMITLV_SET_HDR(
8227 &cmd->tlv_header,
8228 WMITLV_TAG_STRUC_wmi_motion_det_start_stop_cmd_fixed_param,
8229 WMITLV_GET_STRUCT_TLVLEN(
8230 wmi_motion_det_start_stop_cmd_fixed_param));
8231 cmd->vdev_id = md_en->vdev_id;
8232 cmd->enable = md_en->enable;
8233
8234 err = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, sizeof(*cmd),
8235 WMI_MOTION_DET_START_STOP_CMDID);
8236 if (err) {
8237 wmi_buf_free(buf);
8238 return QDF_STATUS_E_FAILURE;
8239 }
8240 WMA_LOGA("Set motion_det_enable to vdevId %d %d", md_en->vdev_id,
8241 md_en->enable);
8242 return QDF_STATUS_SUCCESS;
8243}
8244
8245/**
8246 * wma_set_motion_det_base_line_config - Sends md baselining cfg wmi cmd
8247 * @wma_handle: WMA global handle
8248 * @md_base_line_cfg: md baselining configuration
8249 *
8250 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_ERROR on error
8251 */
8252static QDF_STATUS wma_set_motion_det_base_line_config(
8253 tp_wma_handle wma_handle,
8254 struct sme_motion_det_base_line_cfg *md_base_line_cfg)
8255{
8256 wmi_motion_det_base_line_config_params_cmd_fixed_param *cmd;
8257 wmi_buf_t buf;
8258 int err;
8259
8260 buf = wmi_buf_alloc(wma_handle->wmi_handle, sizeof(*cmd));
8261 if (!buf)
8262 return QDF_STATUS_E_NOMEM;
8263
8264 cmd = (wmi_motion_det_base_line_config_params_cmd_fixed_param *)
8265 wmi_buf_data(buf);
8266 qdf_mem_zero(cmd, sizeof(*cmd));
8267
8268 WMITLV_SET_HDR(
8269 &cmd->tlv_header,
8270 WMITLV_TAG_STRUC_wmi_motion_det_base_line_config_params_cmd_fixed_param,
8271 WMITLV_GET_STRUCT_TLVLEN(
8272 wmi_motion_det_base_line_config_params_cmd_fixed_param));
8273
8274 cmd->vdev_id = md_base_line_cfg->vdev_id;
8275 cmd->bl_time_t = md_base_line_cfg->bl_time_t;
8276 cmd->bl_packet_gap = md_base_line_cfg->bl_packet_gap;
8277 cmd->bl_n = md_base_line_cfg->bl_n;
8278 cmd->bl_num_meas = md_base_line_cfg->bl_num_meas;
8279
8280 err = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, sizeof(*cmd),
8281 WMI_MOTION_DET_BASE_LINE_CONFIG_PARAM_CMDID);
8282 if (err) {
8283 wmi_buf_free(buf);
8284 return QDF_STATUS_E_FAILURE;
8285 }
8286 WMA_LOGA("Set motion_det_baseline_config to vdevId %d\n"
8287 "bl_time_t %d\n"
8288 "bl_packet_gap %d\n"
8289 "bl_n %d\n"
8290 "bl_num_meas %d\n",
8291 md_base_line_cfg->vdev_id,
8292 md_base_line_cfg->bl_time_t,
8293 md_base_line_cfg->bl_packet_gap,
8294 md_base_line_cfg->bl_n,
8295 md_base_line_cfg->bl_num_meas);
8296 return QDF_STATUS_SUCCESS;
8297}
8298
8299/**
8300 * wma_set_motion_det_base_line_enable - Sends md baselining start/stop wmi cmd
8301 * @wma_handle: WMA global handle
8302 * @md_base_line_en: motion detection baselining start/stop
8303 *
8304 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_ERROR on error
8305 */
8306static QDF_STATUS wma_set_motion_det_base_line_enable(
8307 tp_wma_handle wma_handle,
8308 struct sme_motion_det_base_line_en *md_base_line_en)
8309{
8310 wmi_motion_det_base_line_start_stop_cmd_fixed_param *cmd;
8311 wmi_buf_t buf;
8312 int err;
8313
8314 buf = wmi_buf_alloc(wma_handle->wmi_handle, sizeof(*cmd));
8315 if (!buf)
8316 return QDF_STATUS_E_NOMEM;
8317
8318 cmd = (wmi_motion_det_base_line_start_stop_cmd_fixed_param *)
8319 wmi_buf_data(buf);
8320 qdf_mem_zero(cmd, sizeof(*cmd));
8321
8322 WMITLV_SET_HDR(
Visweswara Tanuku6488a1c2019-02-13 14:15:26 +05308323 &cmd->tlv_header,
Visweswara Tanuku633976b2019-01-07 16:13:12 +05308324 WMITLV_TAG_STRUC_wmi_motion_det_base_line_start_stop_cmd_fixed_param,
8325 WMITLV_GET_STRUCT_TLVLEN(
8326 wmi_motion_det_base_line_start_stop_cmd_fixed_param));
8327
8328 cmd->vdev_id = md_base_line_en->vdev_id;
8329 cmd->enable = md_base_line_en->enable;
8330
8331 err = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, sizeof(*cmd),
8332 WMI_MOTION_DET_BASE_LINE_START_STOP_CMDID);
8333 if (err) {
8334 wmi_buf_free(buf);
8335 return QDF_STATUS_E_FAILURE;
8336 }
8337 WMA_LOGA("Set motion_det_base_line_enable to vdevId %d enable %d",
8338 md_base_line_en->vdev_id, md_base_line_en->enable);
8339 return QDF_STATUS_SUCCESS;
8340}
8341#endif /* WLAN_FEATURE_MOTION_DETECTION */
8342
Arif Hussainee10f902017-12-27 16:30:17 -08008343/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008344 * wma_mc_process_msg() - process wma messages and call appropriate function.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008345 * @msg: message
8346 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05308347 * Return: QDF_SUCCESS for success otherwise failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008348 */
Jeff Johnson5be42ab2017-09-13 09:10:39 -07008349static QDF_STATUS wma_mc_process_msg(struct scheduler_msg *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008350{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308351 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008352 tp_wma_handle wma_handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008353
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07008354 if (!msg) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008355 WMA_LOGE("msg is NULL");
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308356 QDF_ASSERT(0);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308357 qdf_status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008358 goto end;
8359 }
8360
8361 WMA_LOGD("msg->type = %x %s", msg->type,
8362 mac_trace_get_wma_msg_string(msg->type));
8363
Anurag Chouhan6d760662016-02-20 16:05:43 +05308364 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008365
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07008366 if (!wma_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07008367 WMA_LOGE("%s: wma_handle is NULL", __func__);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308368 QDF_ASSERT(0);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308369 qdf_mem_free(msg->bodyptr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308370 qdf_status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008371 goto end;
8372 }
8373
8374 switch (msg->type) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008375#ifdef FEATURE_WLAN_ESE
8376 case WMA_TSM_STATS_REQ:
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08008377 WMA_LOGD("McThread: WMA_TSM_STATS_REQ");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008378 wma_process_tsm_stats_req(wma_handle, (void *)msg->bodyptr);
8379 break;
8380#endif /* FEATURE_WLAN_ESE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008381 case WMA_UPDATE_CHAN_LIST_REQ:
8382 wma_update_channel_list(wma_handle,
8383 (tSirUpdateChanList *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308384 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008385 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008386 case WMA_ADD_STA_REQ:
8387 wma_add_sta(wma_handle, (tpAddStaParams) msg->bodyptr);
8388 break;
Rakshith Suresh Patkar5f9efa32019-02-04 13:26:56 +05308389 case WMA_SEND_PEER_UNMAP_CONF:
8390 wma_peer_unmap_conf_send(
8391 wma_handle,
8392 (struct send_peer_unmap_conf_params *)msg->bodyptr);
8393 qdf_mem_free(msg->bodyptr);
8394 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008395 case WMA_DELETE_STA_REQ:
8396 wma_delete_sta(wma_handle, (tpDeleteStaParams) msg->bodyptr);
8397 break;
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07008398 case WMA_DELETE_BSS_HO_FAIL_REQ:
Abhishek Ambure968f1512019-08-28 18:33:57 +05308399 wma_delete_bss_ho_fail(wma_handle, msg->bodyval);
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07008400 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008401 case WMA_DELETE_BSS_REQ:
Abhishek Ambure968f1512019-08-28 18:33:57 +05308402 wma_delete_bss(wma_handle, msg->bodyval);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008403 break;
8404 case WMA_UPDATE_EDCA_PROFILE_IND:
8405 wma_process_update_edca_param_req(wma_handle,
8406 (tEdcaParams *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308407 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008408 break;
8409 case WMA_SEND_BEACON_REQ:
8410 wma_send_beacon(wma_handle, (tpSendbeaconParams) msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008411 break;
Abhishek Singh3d30a3b2018-09-12 15:49:18 +05308412 case WMA_SEND_AP_VDEV_UP:
8413 wma_set_ap_vdev_up(wma_handle, msg->bodyval);
8414 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008415 case WMA_SEND_PROBE_RSP_TMPL:
8416 wma_send_probe_rsp_tmpl(wma_handle,
8417 (tpSendProbeRespParams) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308418 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008419 break;
8420 case WMA_CLI_SET_CMD:
8421 wma_process_cli_set_cmd(wma_handle,
8422 (wma_cli_set_cmd_t *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308423 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008424 break;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07008425 case WMA_SET_PDEV_IE_REQ:
8426 wma_process_set_pdev_ie_req(wma_handle,
8427 (struct set_ie_param *)msg->bodyptr);
8428 qdf_mem_free(msg->bodyptr);
8429 break;
Vevek Venkatesan988a1392019-06-19 00:54:11 +05308430#if !defined(REMOVE_PKT_LOG) && defined(FEATURE_PKTLOG)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008431 case WMA_PKTLOG_ENABLE_REQ:
8432 wma_pktlog_wmi_send_cmd(wma_handle,
8433 (struct ath_pktlog_wmi_params *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308434 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008435 break;
8436#endif /* REMOVE_PKT_LOG */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008437 case WMA_ENABLE_UAPSD_REQ:
8438 wma_enable_uapsd_mode(wma_handle,
8439 (tpEnableUapsdParams) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308440 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008441 break;
8442 case WMA_DISABLE_UAPSD_REQ:
8443 wma_disable_uapsd_mode(wma_handle,
8444 (tpDisableUapsdParams) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308445 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008446 break;
Kiran Kumar Lokere6d3a30d2018-01-15 18:18:29 -08008447 case WMA_SET_DTIM_PERIOD:
8448 wma_set_dtim_period(wma_handle,
8449 (struct set_dtim_params *)msg->bodyptr);
8450 qdf_mem_free(msg->bodyptr);
8451 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008452 case WMA_SET_TX_POWER_REQ:
8453 wma_set_tx_power(wma_handle, (tpMaxTxPowerParams) msg->bodyptr);
8454 break;
8455 case WMA_SET_MAX_TX_POWER_REQ:
8456 wma_set_max_tx_power(wma_handle,
8457 (tpMaxTxPowerParams) msg->bodyptr);
8458 break;
Abhishek Amburebf230ab2020-04-17 11:16:36 +05308459 case WMA_SEND_MAX_TX_POWER:
8460 wma_send_max_tx_pwrlmt(wma_handle, msg->bodyval);
8461 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008462 case WMA_SET_KEEP_ALIVE:
Jeff Johnson562ccad2019-02-06 22:10:24 -08008463 wma_set_keepalive_req(wma_handle, msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008464 break;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08008465#ifdef FEATURE_WLAN_ESE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008466 case WMA_SET_PLM_REQ:
Jeff Johnsonb120a822019-02-02 22:15:55 -08008467 wma_config_plm(wma_handle, msg->bodyptr);
8468 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008469 break;
8470#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008471
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008472 case WMA_UPDATE_OP_MODE:
8473 wma_process_update_opmode(wma_handle,
8474 (tUpdateVHTOpMode *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308475 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008476 break;
8477 case WMA_UPDATE_RX_NSS:
8478 wma_process_update_rx_nss(wma_handle,
8479 (tUpdateRxNss *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308480 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008481 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008482 case WMA_UPDATE_MEMBERSHIP:
8483 wma_process_update_membership(wma_handle,
8484 (tUpdateMembership *) msg->bodyptr);
8485 break;
8486 case WMA_UPDATE_USERPOS:
8487 wma_process_update_userpos(wma_handle,
8488 (tUpdateUserPos *) msg->bodyptr);
8489 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008490 case WMA_UPDATE_BEACON_IND:
8491 wma_process_update_beacon_params(wma_handle,
8492 (tUpdateBeaconParams *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308493 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008494 break;
8495
8496 case WMA_ADD_TS_REQ:
Jeff Johnson9851fcc2018-12-22 17:29:58 -08008497 wma_add_ts_req(wma_handle, msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008498 break;
8499
8500 case WMA_DEL_TS_REQ:
Jeff Johnson256002f2018-12-22 17:53:19 -08008501 wma_del_ts_req(wma_handle, msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008502 break;
8503
8504 case WMA_AGGR_QOS_REQ:
Jeff Johnson54024412018-12-22 12:07:06 -08008505 wma_aggr_qos_req(wma_handle, msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008506 break;
8507
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008508 case WMA_8023_MULTICAST_LIST_REQ:
8509 wma_process_mcbc_set_filter_req(wma_handle,
8510 (tpSirRcvFltMcAddrList) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308511 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008512 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008513 case WMA_ROAM_SCAN_OFFLOAD_REQ:
Jeff Johnsone6da4b02019-02-06 22:22:04 -08008514 wma_process_roaming_config(wma_handle, msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008515 break;
8516
Pragaspathi Thilagaraja97d4982019-07-18 01:18:44 +05308517 case WMA_ROAM_PRE_AUTH_STATUS:
8518 wma_send_roam_preauth_status(wma_handle, msg->bodyptr);
8519 qdf_mem_free(msg->bodyptr);
8520 break;
8521
Abhinav Kumar18285932019-08-08 16:50:06 +05308522 case WMA_ROAM_SYNC_TIMEOUT:
8523 wma_handle_roam_sync_timeout(wma_handle, msg->bodyptr);
8524 qdf_mem_free(msg->bodyptr);
8525 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008526 case WMA_RATE_UPDATE_IND:
8527 wma_process_rate_update_indicate(wma_handle,
8528 (tSirRateUpdateInd *) msg->bodyptr);
8529 break;
8530
8531#ifdef FEATURE_WLAN_TDLS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008532 case WMA_UPDATE_TDLS_PEER_STATE:
Jeff Johnson517ee492019-02-07 11:59:04 -08008533 wma_update_tdls_peer_state(wma_handle, msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008534 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008535#endif /* FEATURE_WLAN_TDLS */
8536 case WMA_ADD_PERIODIC_TX_PTRN_IND:
8537 wma_process_add_periodic_tx_ptrn_ind(wma_handle,
8538 (tSirAddPeriodicTxPtrn *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308539 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008540 break;
8541 case WMA_DEL_PERIODIC_TX_PTRN_IND:
8542 wma_process_del_periodic_tx_ptrn_ind(wma_handle,
8543 (tSirDelPeriodicTxPtrn *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308544 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008545 break;
8546 case WMA_TX_POWER_LIMIT:
Jeff Johnson19ce8d02019-02-08 22:56:23 -08008547 wma_process_tx_power_limits(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308548 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008549 break;
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008550 case WMA_SEND_ADDBA_REQ:
8551 wma_process_send_addba_req(wma_handle,
8552 (struct send_add_ba_req *)msg->bodyptr);
8553 break;
8554
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008555#ifdef FEATURE_WLAN_CH_AVOID
8556 case WMA_CH_AVOID_UPDATE_REQ:
8557 wma_process_ch_avoid_update_req(wma_handle,
8558 (tSirChAvoidUpdateReq *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308559 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008560 break;
8561#endif /* FEATURE_WLAN_CH_AVOID */
8562#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
8563 case WMA_SET_AUTO_SHUTDOWN_TIMER_REQ:
8564 wma_set_auto_shutdown_timer_req(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308565 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008566 break;
8567#endif /* FEATURE_WLAN_AUTO_SHUTDOWN */
8568 case WMA_DHCP_START_IND:
8569 case WMA_DHCP_STOP_IND:
8570 wma_process_dhcp_ind(wma_handle, (tAniDHCPInd *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308571 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008572 break;
8573
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008574 case WMA_IBSS_CESIUM_ENABLE_IND:
8575 wma_process_cesium_enable_ind(wma_handle);
8576 break;
8577 case WMA_GET_IBSS_PEER_INFO_REQ:
8578 wma_process_get_peer_info_req(wma_handle,
8579 (tSirIbssGetPeerInfoReqParams *)
8580 msg->bodyptr);
8581 qdf_mem_free(msg->bodyptr);
8582 break;
8583 case WMA_TX_FAIL_MONITOR_IND:
8584 wma_process_tx_fail_monitor_ind(wma_handle,
8585 (tAniTXFailMonitorInd *) msg->bodyptr);
8586 qdf_mem_free(msg->bodyptr);
8587 break;
8588
8589 case WMA_RMC_ENABLE_IND:
8590 wma_process_rmc_enable_ind(wma_handle);
8591 break;
8592 case WMA_RMC_DISABLE_IND:
8593 wma_process_rmc_disable_ind(wma_handle);
8594 break;
8595 case WMA_RMC_ACTION_PERIOD_IND:
8596 wma_process_rmc_action_period_ind(wma_handle);
8597 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008598 case WMA_INIT_THERMAL_INFO_CMD:
8599 wma_process_init_thermal_info(wma_handle,
8600 (t_thermal_mgmt *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308601 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008602 break;
8603
8604 case WMA_SET_THERMAL_LEVEL:
8605 wma_process_set_thermal_level(wma_handle, msg->bodyval);
8606 break;
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05308607#ifdef CONFIG_HL_SUPPORT
8608 case WMA_INIT_BAD_PEER_TX_CTL_INFO_CMD:
8609 wma_process_init_bad_peer_tx_ctl_info(
8610 wma_handle,
8611 (struct t_bad_peer_txtcl_config *)msg->bodyptr);
8612 qdf_mem_free(msg->bodyptr);
8613 break;
8614#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008615 case WMA_SET_MIMOPS_REQ:
8616 wma_process_set_mimops_req(wma_handle,
8617 (tSetMIMOPS *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308618 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008619 break;
8620 case WMA_SET_SAP_INTRABSS_DIS:
8621 wma_set_vdev_intrabss_fwd(wma_handle,
8622 (tDisableIntraBssFwd *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308623 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008624 break;
Will Huanga9814592017-05-24 15:47:58 +08008625 case WMA_GET_PEER_INFO_EXT:
8626 wma_get_peer_info_ext(wma_handle, msg->bodyptr);
8627 qdf_mem_free(msg->bodyptr);
8628 break;
guangde4853c402019-05-06 15:54:04 +08008629 case WMA_GET_ISOLATION:
8630 wma_get_isolation(wma_handle);
8631 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008632 case WMA_MODEM_POWER_STATE_IND:
8633 wma_notify_modem_power_state(wma_handle,
8634 (tSirModemPowerStateInd *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308635 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008636 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008637#ifdef WLAN_FEATURE_STATS_EXT
8638 case WMA_STATS_EXT_REQUEST:
8639 wma_stats_ext_req(wma_handle,
8640 (tpStatsExtRequest) (msg->bodyptr));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308641 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008642 break;
8643#endif /* WLAN_FEATURE_STATS_EXT */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008644#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
8645 case WMA_WLAN_EXT_WOW:
8646 wma_enable_ext_wow(wma_handle,
8647 (tSirExtWoWParams *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308648 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008649 break;
8650 case WMA_WLAN_SET_APP_TYPE1_PARAMS:
8651 wma_set_app_type1_params_in_fw(wma_handle,
8652 (tSirAppType1Params *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308653 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008654 break;
8655 case WMA_WLAN_SET_APP_TYPE2_PARAMS:
8656 wma_set_app_type2_params_in_fw(wma_handle,
8657 (tSirAppType2Params *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308658 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008659 break;
8660#endif /* WLAN_FEATURE_EXTWOW_SUPPORT */
8661#ifdef FEATURE_WLAN_EXTSCAN
8662 case WMA_EXTSCAN_START_REQ:
Jeff Johnsondab58602018-07-14 15:30:24 -07008663 wma_start_extscan(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308664 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008665 break;
8666 case WMA_EXTSCAN_STOP_REQ:
Jeff Johnson7272ea72018-07-15 17:22:27 -07008667 wma_stop_extscan(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308668 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008669 break;
8670 case WMA_EXTSCAN_SET_BSSID_HOTLIST_REQ:
Jeff Johnson1148cb02018-07-13 23:14:32 -07008671 wma_extscan_start_hotlist_monitor(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308672 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008673 break;
8674 case WMA_EXTSCAN_RESET_BSSID_HOTLIST_REQ:
Jeff Johnson9743eb72018-07-14 10:30:04 -07008675 wma_extscan_stop_hotlist_monitor(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308676 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008677 break;
8678 case WMA_EXTSCAN_SET_SIGNF_CHANGE_REQ:
Jeff Johnsonb43ed032018-07-16 06:59:21 -07008679 wma_extscan_start_change_monitor(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308680 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008681 break;
8682 case WMA_EXTSCAN_RESET_SIGNF_CHANGE_REQ:
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07008683 wma_extscan_stop_change_monitor(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308684 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008685 break;
8686 case WMA_EXTSCAN_GET_CACHED_RESULTS_REQ:
Jeff Johnson2ba60092018-07-17 08:19:37 -07008687 wma_extscan_get_cached_results(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308688 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008689 break;
8690 case WMA_EXTSCAN_GET_CAPABILITIES_REQ:
Jeff Johnsonfed9a732018-07-18 12:18:03 -07008691 wma_extscan_get_capabilities(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308692 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008693 break;
8694 case WMA_SET_EPNO_LIST_REQ:
Jeff Johnson360135b2018-07-18 20:51:47 -07008695 wma_set_epno_network_list(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308696 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008697 break;
8698 case WMA_SET_PASSPOINT_LIST_REQ:
8699 /* Issue reset passpoint network list first and clear
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07008700 * the entries
8701 */
Jeff Johnson2a7f1012018-07-19 07:21:06 -07008702 wma_reset_passpoint_network_list(wma_handle, msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008703
Jeff Johnson2a7f1012018-07-19 07:21:06 -07008704 wma_set_passpoint_network_list(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308705 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008706 break;
8707 case WMA_RESET_PASSPOINT_LIST_REQ:
Jeff Johnson2a7f1012018-07-19 07:21:06 -07008708 wma_reset_passpoint_network_list(wma_handle, msg->bodyptr);
Pragaspathi Thilagarajf65cffe2018-06-15 14:20:26 +05308709 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008710 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008711#endif /* FEATURE_WLAN_EXTSCAN */
sheenam monga11cf8362019-10-22 20:57:43 +05308712 case WMA_SET_PER_ROAM_CONFIG_CMD:
8713 wma_update_per_roam_config(wma_handle,
8714 (struct wmi_per_roam_config_req *)msg->bodyptr);
8715 qdf_mem_free(msg->bodyptr);
8716 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008717 case WMA_SET_SCAN_MAC_OUI_REQ:
8718 wma_scan_probe_setoui(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308719 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008720 break;
8721#ifdef WLAN_FEATURE_LINK_LAYER_STATS
8722 case WMA_LINK_LAYER_STATS_CLEAR_REQ:
8723 wma_process_ll_stats_clear_req(wma_handle,
8724 (tpSirLLStatsClearReq) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308725 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008726 break;
8727 case WMA_LINK_LAYER_STATS_SET_REQ:
8728 wma_process_ll_stats_set_req(wma_handle,
8729 (tpSirLLStatsSetReq) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308730 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008731 break;
8732 case WMA_LINK_LAYER_STATS_GET_REQ:
8733 wma_process_ll_stats_get_req(wma_handle,
8734 (tpSirLLStatsGetReq) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308735 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008736 break;
Zhang Qian73c348a2017-03-13 16:15:55 +08008737 case WDA_LINK_LAYER_STATS_SET_THRESHOLD:
8738 wma_config_stats_ext_threshold(wma_handle,
8739 (struct sir_ll_ext_stats_threshold *)msg->bodyptr);
8740 qdf_mem_free(msg->bodyptr);
8741 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008742#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008743#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008744 case WMA_ROAM_OFFLOAD_SYNCH_FAIL:
8745 wma_process_roam_synch_fail(wma_handle,
8746 (struct roam_offload_synch_fail *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308747 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008748 break;
8749 case SIR_HAL_ROAM_INVOKE:
8750 wma_process_roam_invoke(wma_handle,
8751 (struct wma_roam_invoke_cmd *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308752 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008753 break;
8754#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008755 case SIR_HAL_SET_BASE_MACADDR_IND:
8756 wma_set_base_macaddr_indicate(wma_handle,
8757 (tSirMacAddr *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308758 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008759 break;
8760 case WMA_LINK_STATUS_GET_REQ:
8761 wma_process_link_status_req(wma_handle,
8762 (tAniGetLinkStatus *) msg->bodyptr);
8763 break;
8764 case WMA_GET_TEMPERATURE_REQ:
8765 wma_get_temperature(wma_handle);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308766 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008767 break;
Manikandan Mohan976e7562016-03-15 16:33:31 -07008768 case WMA_TSF_GPIO_PIN:
8769 wma_set_tsf_gpio_pin(wma_handle, msg->bodyval);
8770 break;
8771
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008772#ifdef DHCP_SERVER_OFFLOAD
8773 case WMA_SET_DHCP_SERVER_OFFLOAD_CMD:
Jeff Johnsone77641e2019-02-15 09:00:41 -08008774 wma_process_dhcpserver_offload(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308775 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008776 break;
8777#endif /* DHCP_SERVER_OFFLOAD */
8778#ifdef WLAN_FEATURE_GPIO_LED_FLASHING
8779 case WMA_LED_FLASHING_REQ:
Jeff Johnson5a6b6602017-10-04 14:44:30 -07008780 wma_set_led_flashing(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308781 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008782 break;
8783#endif /* WLAN_FEATURE_GPIO_LED_FLASHING */
8784 case SIR_HAL_SET_MAS:
8785 wma_process_set_mas(wma_handle,
8786 (uint32_t *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308787 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008788 break;
8789 case SIR_HAL_SET_MIRACAST:
8790 wma_process_set_miracast(wma_handle,
8791 (uint32_t *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308792 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008793 break;
8794 case SIR_HAL_CONFIG_STATS_FACTOR:
8795 wma_config_stats_factor(wma_handle,
8796 (struct sir_stats_avg_factor *)
8797 msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308798 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008799 break;
8800 case SIR_HAL_CONFIG_GUARD_TIME:
8801 wma_config_guard_time(wma_handle,
8802 (struct sir_guard_time_request *)
8803 msg->bodyptr);
Vignesh Viswanathan9fa8fef2017-12-12 14:45:38 +05308804 qdf_mem_free(msg->bodyptr);
8805 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008806 case SIR_HAL_START_STOP_LOGGING:
8807 wma_set_wifi_start_packet_stats(wma_handle,
8808 (struct sir_wifi_start_log *)msg->bodyptr);
8809 wma_enable_specific_fw_logs(wma_handle,
8810 (struct sir_wifi_start_log *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308811 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008812 break;
8813 case SIR_HAL_FLUSH_LOG_TO_FW:
8814 wma_send_flush_logs_to_fw(wma_handle);
8815 /* Body ptr is NULL here */
8816 break;
8817 case WMA_SET_RSSI_MONITOR_REQ:
Jeff Johnson4c6d40f2019-02-22 20:49:56 -08008818 wma_set_rssi_monitoring(wma_handle, msg->bodyptr);
Prakash Dhavali87ddca32016-11-29 17:02:11 -08008819 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008820 break;
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05308821 case SIR_HAL_PDEV_SET_PCL_TO_FW:
8822 wma_send_pdev_set_pcl_cmd(wma_handle,
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -07008823 (struct set_pcl_req *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308824 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008825 break;
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05308826 case SIR_HAL_PDEV_SET_HW_MODE:
8827 wma_send_pdev_set_hw_mode_cmd(wma_handle,
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07008828 (struct policy_mgr_hw_mode *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308829 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008830 break;
Manikandan Mohan80dea792016-04-28 16:36:48 -07008831 case WMA_SET_WISA_PARAMS:
8832 wma_set_wisa_params(wma_handle,
8833 (struct sir_wisa_params *)msg->bodyptr);
8834 qdf_mem_free(msg->bodyptr);
8835 break;
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05308836 case SIR_HAL_PDEV_DUAL_MAC_CFG_REQ:
8837 wma_send_pdev_set_dual_mac_config(wma_handle,
Srinivas Girigowdaeb6ecf32018-02-15 17:04:22 -08008838 (struct policy_mgr_dual_mac_config *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308839 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008840 break;
8841 case WMA_SET_IE_INFO:
8842 wma_process_set_ie_info(wma_handle,
8843 (struct vdev_ie_info *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308844 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008845 break;
Kiran Kumar Lokereee205772018-09-27 00:27:27 -07008846 case WMA_CFG_VENDOR_ACTION_TB_PPDU:
8847 wma_process_cfg_action_frm_tb_ppdu(wma_handle, msg->bodyptr);
8848 qdf_mem_free(msg->bodyptr);
8849 break;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08008850 case SIR_HAL_SOC_ANTENNA_MODE_REQ:
8851 wma_send_pdev_set_antenna_mode(wma_handle,
8852 (struct sir_antenna_mode_param *)msg->bodyptr);
8853 qdf_mem_free(msg->bodyptr);
8854 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008855 case WMA_LRO_CONFIG_CMD:
8856 wma_lro_config_cmd(wma_handle,
Dhanashri Atre09828f12016-11-13 10:36:58 -08008857 (struct cdp_lro_hash_config *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308858 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008859 break;
Ravi Joshi9e891ba2015-11-09 19:03:46 -08008860 case WMA_GW_PARAM_UPDATE_REQ:
Jeff Johnson38d0ce62019-02-22 17:05:14 -08008861 wma_set_gateway_params(wma_handle, msg->bodyptr);
Archana Ramachandran28ab4122016-03-08 16:17:14 -08008862 qdf_mem_free(msg->bodyptr);
Ryan Hsu3c8f79f2015-12-02 16:45:09 -08008863 break;
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +05308864 case WMA_SET_ADAPT_DWELLTIME_CONF_PARAMS:
8865 wma_send_adapt_dwelltime_params(wma_handle,
8866 (struct adaptive_dwelltime_params *)msg->bodyptr);
8867 qdf_mem_free(msg->bodyptr);
8868 break;
Sandeep Puligillae0875662016-02-12 16:09:21 -08008869 case WMA_HT40_OBSS_SCAN_IND:
8870 wma_send_ht40_obss_scanind(wma_handle,
8871 (struct obss_ht40_scanind *)msg->bodyptr);
8872 qdf_mem_free(msg->bodyptr);
8873 break;
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -07008874 case WMA_ADD_BCN_FILTER_CMDID:
8875 wma_add_beacon_filter(wma_handle, msg->bodyptr);
8876 qdf_mem_free(msg->bodyptr);
8877 break;
8878 case WMA_REMOVE_BCN_FILTER_CMDID:
8879 wma_remove_beacon_filter(wma_handle, msg->bodyptr);
8880 qdf_mem_free(msg->bodyptr);
8881 break;
Nachiket Kukadee547a482018-05-22 16:43:30 +05308882 case WDA_APF_GET_CAPABILITIES_REQ:
8883 wma_get_apf_capabilities(wma_handle);
Arun Khandavalli2476ef52016-04-26 20:19:43 +05308884 break;
Manjeet Singhf82ed072016-07-08 11:40:00 +05308885 case SIR_HAL_POWER_DBG_CMD:
8886 wma_process_hal_pwr_dbg_cmd(wma_handle,
8887 msg->bodyptr);
8888 qdf_mem_free(msg->bodyptr);
8889 break;
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05308890 case WMA_UPDATE_WEP_DEFAULT_KEY:
8891 wma_update_wep_default_key(wma_handle,
8892 (struct wep_update_default_key_idx *)msg->bodyptr);
8893 qdf_mem_free(msg->bodyptr);
8894 break;
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +05308895 case WMA_SEND_FREQ_RANGE_CONTROL_IND:
8896 wma_enable_disable_caevent_ind(wma_handle, msg->bodyval);
8897 break;
Agrawal, Ashish35b251d2016-09-08 19:21:03 +05308898 case SIR_HAL_UPDATE_TX_FAIL_CNT_TH:
8899 wma_update_tx_fail_cnt_th(wma_handle, msg->bodyptr);
8900 qdf_mem_free(msg->bodyptr);
8901 break;
Agrawal Ashishda3e9502016-09-21 17:43:51 +05308902 case SIR_HAL_LONG_RETRY_LIMIT_CNT:
8903 wma_update_long_retry_limit(wma_handle, msg->bodyptr);
8904 qdf_mem_free(msg->bodyptr);
8905 break;
8906 case SIR_HAL_SHORT_RETRY_LIMIT_CNT:
8907 wma_update_short_retry_limit(wma_handle, msg->bodyptr);
8908 qdf_mem_free(msg->bodyptr);
8909 break;
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05308910 case SIR_HAL_POWER_DEBUG_STATS_REQ:
8911 wma_process_power_debug_stats_req(wma_handle);
8912 break;
Arunk Khandavallica56d4b2018-11-29 15:46:00 +05308913 case WMA_BEACON_DEBUG_STATS_REQ:
8914 wma_process_beacon_debug_stats_req(wma_handle, msg->bodyptr);
8915 qdf_mem_free(msg->bodyptr);
8916 break;
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +05308917 case WMA_GET_RCPI_REQ:
8918 wma_get_rcpi_req(wma_handle,
8919 (struct sme_rcpi_req *)msg->bodyptr);
8920 qdf_mem_free(msg->bodyptr);
8921 break;
Yingying Tang95409972016-10-20 15:16:15 +08008922 case WMA_SET_WOW_PULSE_CMD:
8923 wma_send_wow_pulse_cmd(wma_handle,
8924 (struct wow_pulse_mode *)msg->bodyptr);
8925 qdf_mem_free(msg->bodyptr);
8926 break;
Nitesh Shahf9a09ff2017-05-22 15:46:25 +05308927 case WMA_SET_DBS_SCAN_SEL_CONF_PARAMS:
8928 wma_send_dbs_scan_selection_params(wma_handle,
8929 (struct wmi_dbs_scan_sel_params *)msg->bodyptr);
8930 qdf_mem_free(msg->bodyptr);
8931 break;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05308932 case WMA_SET_ARP_STATS_REQ:
8933 wma_set_arp_req_stats(wma_handle,
8934 (struct set_arp_stats_params *)msg->bodyptr);
8935 qdf_mem_free(msg->bodyptr);
8936 break;
8937 case WMA_GET_ARP_STATS_REQ:
8938 wma_get_arp_req_stats(wma_handle,
8939 (struct get_arp_stats_params *)msg->bodyptr);
8940 qdf_mem_free(msg->bodyptr);
8941 break;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05308942 case SIR_HAL_SET_DEL_PMKID_CACHE:
Jeff Johnson622aad62018-12-07 15:05:37 -08008943 wma_set_del_pmkid_cache(wma_handle, msg->bodyptr);
Ashish Kumar Dhanotiya36510832019-02-20 22:13:25 +05308944 if (msg->bodyptr) {
8945 qdf_mem_zero(msg->bodyptr,
8946 sizeof(struct wmi_unified_pmk_cache));
8947 qdf_mem_free(msg->bodyptr);
8948 }
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05308949 break;
8950 case SIR_HAL_HLP_IE_INFO:
8951 wma_roam_scan_send_hlp(wma_handle,
8952 (struct hlp_params *)msg->bodyptr);
8953 qdf_mem_free(msg->bodyptr);
8954 break;
Ganesh Kondabattini35739572017-06-21 16:26:39 +05308955 case WMA_SET_LIMIT_OFF_CHAN:
8956 wma_process_limit_off_chan(wma_handle, msg->bodyptr);
8957 qdf_mem_free(msg->bodyptr);
8958 break;
Arif Hussainee10f902017-12-27 16:30:17 -08008959 case WMA_OBSS_DETECTION_REQ:
8960 wma_send_obss_detection_cfg(wma_handle, msg->bodyptr);
8961 qdf_mem_free(msg->bodyptr);
8962 break;
Vignesh Viswanathan694e28e2018-01-18 20:53:57 +05308963 case WMA_INVOKE_NEIGHBOR_REPORT:
8964 wma_send_invoke_neighbor_report(wma_handle, msg->bodyptr);
8965 qdf_mem_free(msg->bodyptr);
8966 break;
Arif Hussain05fb4872018-01-03 16:02:55 -08008967 case WMA_OBSS_COLOR_COLLISION_REQ:
8968 wma_process_obss_color_collision_req(wma_handle, msg->bodyptr);
8969 qdf_mem_free(msg->bodyptr);
8970 break;
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +05308971 case WMA_GET_ROAM_SCAN_STATS:
8972 wma_get_roam_scan_stats(wma_handle, msg->bodyptr);
8973 qdf_mem_free(msg->bodyptr);
8974 break;
Visweswara Tanuku633976b2019-01-07 16:13:12 +05308975#ifdef WLAN_FEATURE_MOTION_DETECTION
8976 case WMA_SET_MOTION_DET_CONFIG:
8977 wma_set_motion_det_config(
8978 wma_handle,
8979 (struct sme_motion_det_cfg *)msg->bodyptr);
8980 qdf_mem_free(msg->bodyptr);
8981 break;
8982 case WMA_SET_MOTION_DET_ENABLE:
8983 wma_set_motion_det_enable(
8984 wma_handle,
8985 (struct sme_motion_det_en *)msg->bodyptr);
8986 qdf_mem_free(msg->bodyptr);
8987 break;
8988 case WMA_SET_MOTION_DET_BASE_LINE_CONFIG:
8989 wma_set_motion_det_base_line_config(
8990 wma_handle,
8991 (struct sme_motion_det_base_line_cfg *)msg->bodyptr);
8992 qdf_mem_free(msg->bodyptr);
8993 break;
8994 case WMA_SET_MOTION_DET_BASE_LINE_ENABLE:
8995 wma_set_motion_det_base_line_enable(
8996 wma_handle,
8997 (struct sme_motion_det_base_line_en *)msg->bodyptr);
8998 qdf_mem_free(msg->bodyptr);
8999 break;
9000#endif /* WLAN_FEATURE_MOTION_DETECTION */
Visweswara Tanuku025f5862019-01-08 17:35:33 +05309001#ifdef FW_THERMAL_THROTTLE_SUPPORT
9002 case WMA_SET_THERMAL_THROTTLE_CFG:
9003 if (!wma_handle->thermal_mgmt_info.thermalMgmtEnabled)
9004 wmi_unified_thermal_mitigation_param_cmd_send(
9005 wma_handle->wmi_handle, msg->bodyptr);
9006 else
9007 qdf_status = QDF_STATUS_E_INVAL;
9008 qdf_mem_free(msg->bodyptr);
9009 break;
9010 case WMA_SET_THERMAL_MGMT:
9011 if (!wma_handle->thermal_mgmt_info.thermalMgmtEnabled)
9012 wma_set_thermal_mgmt(
9013 wma_handle,
9014 *((t_thermal_cmd_params *)msg->bodyptr));
9015 else
9016 qdf_status = QDF_STATUS_E_INVAL;
9017 qdf_mem_free(msg->bodyptr);
9018 break;
9019#endif /* FW_THERMAL_THROTTLE_SUPPORT */
Arun Kumar Khandavallideda5a82019-03-11 15:32:19 +05309020#ifdef WLAN_MWS_INFO_DEBUGFS
9021 case WMA_GET_MWS_COEX_INFO_REQ:
9022 wma_get_mws_coex_info_req(wma_handle, msg->bodyptr);
9023 qdf_mem_free(msg->bodyptr);
9024 break;
9025#endif
Srinivas Dasarif4e1b122019-08-22 03:39:48 +05309026 case WMA_SET_ROAM_TRIGGERS:
9027 wma_set_roam_triggers(wma_handle, msg->bodyptr);
9028 qdf_mem_free(msg->bodyptr);
9029 break;
Yeshwanth Sriram Guntuka1669fc02019-09-04 16:03:44 +05309030 case WMA_ROAM_INIT_PARAM:
9031 wma_update_roam_offload_flag(wma_handle, msg->bodyptr);
9032 qdf_mem_free(msg->bodyptr);
9033 break;
Abhishek Ambure5e9b6a42020-02-12 21:32:35 +05309034 case WMA_ROAM_SCAN_CH_REQ:
9035 wma_get_roam_scan_ch(wma_handle->wmi_handle, msg->bodyval);
9036 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009037 default:
Sandeep Puligilla1f1e4002018-08-18 12:15:01 -07009038 WMA_LOGD("Unhandled WMA message of type %d", msg->type);
Dustin Brown86534fb2017-01-24 14:28:20 -08009039 if (msg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309040 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009041 }
9042end:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309043 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009044}
9045
Krunal Sonid32c6bc2016-10-18 18:00:21 -07009046QDF_STATUS wma_mc_process_handler(struct scheduler_msg *msg)
9047{
Jeff Johnson5be42ab2017-09-13 09:10:39 -07009048 return wma_mc_process_msg(msg);
Krunal Sonid32c6bc2016-10-18 18:00:21 -07009049}
Krunal Sonid32c6bc2016-10-18 18:00:21 -07009050
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009051/**
9052 * wma_log_completion_timeout() - Log completion timeout
9053 * @data: Timeout handler data
9054 *
9055 * This function is called when log completion timer expires
9056 *
9057 * Return: None
9058 */
9059void wma_log_completion_timeout(void *data)
9060{
9061 tp_wma_handle wma_handle;
9062
Yeshwanth Sriram Guntukacbe61442018-08-23 18:08:44 +05309063 WMA_LOGD("%s: Timeout occurred for log completion command", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009064
9065 wma_handle = (tp_wma_handle) data;
9066 if (!wma_handle)
9067 WMA_LOGE("%s: Invalid WMA handle", __func__);
9068
9069 /* Though we did not receive any event from FW,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07009070 * we can flush whatever logs we have with us
9071 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009072 cds_logging_set_fw_flush_complete();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009073}
9074
9075/**
Manishekar Chandrasekaranb82554d2016-08-04 17:46:46 +05309076 * wma_map_pcl_weights() - Map PCL weights
9077 * @pcl_weight: Internal PCL weights
9078 *
9079 * Maps the internal weights of PCL to the weights needed by FW
9080 *
9081 * Return: Mapped channel weight of type wmi_pcl_chan_weight
9082 */
9083static wmi_pcl_chan_weight wma_map_pcl_weights(uint32_t pcl_weight)
9084{
9085 switch (pcl_weight) {
9086 case WEIGHT_OF_GROUP1_PCL_CHANNELS:
9087 return WMI_PCL_WEIGHT_VERY_HIGH;
9088 case WEIGHT_OF_GROUP2_PCL_CHANNELS:
9089 return WMI_PCL_WEIGHT_HIGH;
9090 case WEIGHT_OF_GROUP3_PCL_CHANNELS:
9091 return WMI_PCL_WEIGHT_MEDIUM;
9092 case WEIGHT_OF_NON_PCL_CHANNELS:
9093 return WMI_PCL_WEIGHT_LOW;
9094 default:
9095 return WMI_PCL_WEIGHT_DISALLOW;
9096 }
9097}
9098
9099/**
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05309100 * wma_send_pdev_set_pcl_cmd() - Send WMI_SOC_SET_PCL_CMDID to FW
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009101 * @wma_handle: WMA handle
9102 * @msg: PCL structure containing the PCL and the number of channels
9103 *
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05309104 * WMI_PDEV_SET_PCL_CMDID provides a Preferred Channel List (PCL) to the WLAN
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009105 * firmware. The DBS Manager is the consumer of this information in the WLAN
9106 * firmware. The channel list will be used when a Virtual DEVice (VDEV) needs
9107 * to migrate to a new channel without host driver involvement. An example of
9108 * this behavior is Legacy Fast Roaming (LFR 3.0). Generally, the host will
9109 * manage the channel selection without firmware involvement.
9110 *
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05309111 * WMI_PDEV_SET_PCL_CMDID will carry only the weight list and not the actual
9112 * channel list. The weights corresponds to the channels sent in
9113 * WMI_SCAN_CHAN_LIST_CMDID. The channels from PCL would be having a higher
9114 * weightage compared to the non PCL channels.
9115 *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009116 * Return: Success if the cmd is sent successfully to the firmware
9117 */
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05309118QDF_STATUS wma_send_pdev_set_pcl_cmd(tp_wma_handle wma_handle,
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -07009119 struct set_pcl_req *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009120{
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05309121 uint32_t i;
9122 QDF_STATUS status;
9123
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009124 if (!wma_handle) {
9125 WMA_LOGE("%s: WMA handle is NULL. Cannot issue command",
9126 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309127 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009128 }
9129
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05309130 for (i = 0; i < wma_handle->saved_chan.num_channels; i++) {
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -07009131 msg->chan_weights.saved_chan_list[i] =
Wu Gao882a1c92019-10-29 13:52:29 +08009132 wma_handle->saved_chan.ch_freq_list[i];
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05309133 }
9134
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -07009135 msg->chan_weights.saved_num_chan = wma_handle->saved_chan.num_channels;
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07009136 status = policy_mgr_get_valid_chan_weights(wma_handle->psoc,
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -07009137 (struct policy_mgr_pcl_chan_weights *)&msg->chan_weights);
Manishekar Chandrasekaranb82554d2016-08-04 17:46:46 +05309138
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -07009139 for (i = 0; i < msg->chan_weights.saved_num_chan; i++) {
9140 msg->chan_weights.weighed_valid_list[i] =
9141 wma_map_pcl_weights(
9142 msg->chan_weights.weighed_valid_list[i]);
Sandeep Puligilla819d94f2017-10-10 18:33:56 -07009143 /* Dont allow roaming on 2G when 5G_ONLY configured */
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -07009144 if (((wma_handle->bandcapability == BAND_5G) ||
bings2e8c62b2019-10-29 18:57:33 +08009145 (msg->band_mask == BIT(REG_BAND_5G))) &&
Manikandan Mohan932c11e2019-08-14 14:09:08 -07009146 (WLAN_REG_IS_24GHZ_CH_FREQ(
9147 msg->chan_weights.saved_chan_list[i]))) {
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -07009148 msg->chan_weights.weighed_valid_list[i] =
Sandeep Puligilla819d94f2017-10-10 18:33:56 -07009149 WEIGHT_OF_DISALLOWED_CHANNELS;
9150 }
bings2e8c62b2019-10-29 18:57:33 +08009151 if (msg->band_mask == BIT(REG_BAND_2G) &&
wadesong88378bd2020-03-24 13:25:21 +08009152 !WLAN_REG_IS_24GHZ_CH_FREQ(
Manikandan Mohan932c11e2019-08-14 14:09:08 -07009153 msg->chan_weights.saved_chan_list[i]))
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -07009154 msg->chan_weights.weighed_valid_list[i] =
9155 WEIGHT_OF_DISALLOWED_CHANNELS;
Manishekar Chandrasekaranb82554d2016-08-04 17:46:46 +05309156 }
9157
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05309158 if (!QDF_IS_STATUS_SUCCESS(status)) {
9159 WMA_LOGE("%s: Error in creating weighed pcl", __func__);
9160 return status;
9161 }
Amruta Kulkarni447a3262020-02-05 14:57:04 -08009162 wma_debug("Dump channel list send to wmi");
9163 policy_mgr_dump_channel_list(msg->chan_weights.saved_num_chan,
9164 msg->chan_weights.saved_chan_list,
9165 msg->chan_weights.weighed_valid_list);
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05309166
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -07009167 if (wmi_unified_pdev_set_pcl_cmd(wma_handle->wmi_handle,
9168 &msg->chan_weights))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309169 return QDF_STATUS_E_FAILURE;
Govind Singhf25a0f12016-03-08 16:09:48 +05309170
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309171 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009172}
9173
9174/**
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05309175 * wma_send_pdev_set_hw_mode_cmd() - Send WMI_PDEV_SET_HW_MODE_CMDID to FW
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009176 * @wma_handle: WMA handle
9177 * @msg: Structure containing the following parameters
9178 *
9179 * - hw_mode_index: The HW_Mode field is a enumerated type that is selected
9180 * from the HW_Mode table, which is returned in the WMI_SERVICE_READY_EVENTID.
9181 *
9182 * Provides notification to the WLAN firmware that host driver is requesting a
9183 * HardWare (HW) Mode change. This command is needed to support iHelium in the
9184 * configurations that include the Dual Band Simultaneous (DBS) feature.
9185 *
9186 * Return: Success if the cmd is sent successfully to the firmware
9187 */
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05309188QDF_STATUS wma_send_pdev_set_hw_mode_cmd(tp_wma_handle wma_handle,
Dustin Brownec2c92e2017-07-26 11:13:49 -07009189 struct policy_mgr_hw_mode *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009190{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009191 struct sir_set_hw_mode_resp *param;
Tushnim Bhattacharyya86294892017-10-25 16:29:11 -07009192 struct wma_target_req *timeout_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009193
9194 if (!wma_handle) {
9195 WMA_LOGE("%s: WMA handle is NULL. Cannot issue command",
9196 __func__);
9197 /* Handle is NULL. Will not be able to send failure
9198 * response as well
9199 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309200 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009201 }
9202
9203 if (!msg) {
9204 WMA_LOGE("%s: Set HW mode param is NULL", __func__);
9205 /* Lets try to free the active command list */
9206 goto fail;
9207 }
9208
Dustin Brownec2c92e2017-07-26 11:13:49 -07009209 wma_acquire_wakelock(&wma_handle->wmi_cmd_rsp_wake_lock,
9210 WMA_VDEV_HW_MODE_REQUEST_TIMEOUT);
Govind Singhf25a0f12016-03-08 16:09:48 +05309211 if (wmi_unified_soc_set_hw_mode_cmd(wma_handle->wmi_handle,
Dustin Brownec2c92e2017-07-26 11:13:49 -07009212 msg->hw_mode_index)) {
9213 wma_release_wakelock(&wma_handle->wmi_cmd_rsp_wake_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009214 goto fail;
Krunal Sonicebcc292017-06-14 19:59:20 -07009215 }
Tushnim Bhattacharyya86294892017-10-25 16:29:11 -07009216 timeout_msg = wma_fill_hold_req(wma_handle, 0,
9217 SIR_HAL_PDEV_SET_HW_MODE,
9218 WMA_PDEV_SET_HW_MODE_RESP, NULL,
9219 WMA_VDEV_HW_MODE_REQUEST_TIMEOUT - 1);
9220 if (!timeout_msg) {
9221 WMA_LOGE("Failed to allocate request for SIR_HAL_PDEV_SET_HW_MODE");
9222 wma_remove_req(wma_handle, 0, WMA_PDEV_SET_HW_MODE_RESP);
9223 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009224
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309225 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009226fail:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309227 param = qdf_mem_malloc(sizeof(*param));
Arif Hussain157263f2018-10-03 13:07:15 -07009228 if (!param)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309229 return QDF_STATUS_E_NULL_VALUE;
Arif Hussain157263f2018-10-03 13:07:15 -07009230
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009231 param->status = SET_HW_MODE_STATUS_ECANCELED;
9232 param->cfgd_hw_mode_index = 0;
9233 param->num_vdev_mac_entries = 0;
9234 WMA_LOGE("%s: Sending HW mode fail response to LIM", __func__);
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05309235 wma_send_msg(wma_handle, SIR_HAL_PDEV_SET_HW_MODE_RESP,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009236 (void *) param, 0);
Abhishek Singhd93a0b22018-10-30 17:04:56 +05309237 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009238}
9239
9240/**
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05309241 * wma_send_pdev_set_dual_mac_config() - Set dual mac config to FW
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009242 * @wma_handle: WMA handle
9243 * @msg: Dual MAC config parameters
9244 *
9245 * Configures WLAN firmware with the dual MAC features
9246 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309247 * Return: QDF_STATUS. 0 on success.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009248 */
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05309249QDF_STATUS wma_send_pdev_set_dual_mac_config(tp_wma_handle wma_handle,
Srinivas Girigowdaeb6ecf32018-02-15 17:04:22 -08009250 struct policy_mgr_dual_mac_config *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009251{
Manishekar Chandrasekaran91152df2016-04-25 14:29:27 +05309252 QDF_STATUS status;
Abhishek Singhd93a0b22018-10-30 17:04:56 +05309253 struct wma_target_req *req_msg;
9254 struct sir_dual_mac_config_resp *resp;
Manishekar Chandrasekaran91152df2016-04-25 14:29:27 +05309255
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009256 if (!wma_handle) {
9257 WMA_LOGE("%s: WMA handle is NULL. Cannot issue command",
9258 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309259 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009260 }
9261
9262 if (!msg) {
9263 WMA_LOGE("%s: Set dual mode config is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309264 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009265 }
9266
Krunal Sonia5ccb802017-07-03 12:59:40 -07009267 /*
9268 * aquire the wake lock here and release it in response handler function
9269 * In error condition, release the wake lock right away
9270 */
9271 wma_acquire_wakelock(&wma_handle->wmi_cmd_rsp_wake_lock,
Abhishek Singhd1f21c72019-01-21 15:16:34 +05309272 WMA_VDEV_PLCY_MGR_WAKE_LOCK_TIMEOUT);
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05309273 status = wmi_unified_pdev_set_dual_mac_config_cmd(
9274 wma_handle->wmi_handle,
Srinivas Girigowdaeb6ecf32018-02-15 17:04:22 -08009275 (struct policy_mgr_dual_mac_config *)msg);
Manishekar Chandrasekaran91152df2016-04-25 14:29:27 +05309276 if (QDF_IS_STATUS_ERROR(status)) {
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05309277 WMA_LOGE("%s: Failed to send WMI_PDEV_SET_DUAL_MAC_CONFIG_CMDID: %d",
Manishekar Chandrasekaran91152df2016-04-25 14:29:27 +05309278 __func__, status);
Krunal Sonia5ccb802017-07-03 12:59:40 -07009279 wma_release_wakelock(&wma_handle->wmi_cmd_rsp_wake_lock);
Abhishek Singhd93a0b22018-10-30 17:04:56 +05309280 goto fail;
Manishekar Chandrasekaran91152df2016-04-25 14:29:27 +05309281 }
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07009282 policy_mgr_update_dbs_req_config(wma_handle->psoc,
9283 msg->scan_config, msg->fw_mode_config);
Govind Singhf25a0f12016-03-08 16:09:48 +05309284
Abhishek Singhd93a0b22018-10-30 17:04:56 +05309285 req_msg = wma_fill_hold_req(wma_handle, 0,
9286 SIR_HAL_PDEV_DUAL_MAC_CFG_REQ,
9287 WMA_PDEV_MAC_CFG_RESP, NULL,
9288 WMA_VDEV_DUAL_MAC_CFG_TIMEOUT);
9289 if (!req_msg) {
9290 WMA_LOGE("Failed to allocate request for SIR_HAL_PDEV_DUAL_MAC_CFG_REQ");
9291 wma_remove_req(wma_handle, 0, WMA_PDEV_MAC_CFG_RESP);
9292 }
9293
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309294 return QDF_STATUS_SUCCESS;
Abhishek Singhd93a0b22018-10-30 17:04:56 +05309295
9296fail:
9297 resp = qdf_mem_malloc(sizeof(*resp));
9298 if (!resp)
9299 return QDF_STATUS_E_NULL_VALUE;
9300
9301 resp->status = SET_HW_MODE_STATUS_ECANCELED;
9302 WMA_LOGE("%s: Sending failure response to LIM", __func__);
9303 wma_send_msg(wma_handle, SIR_HAL_PDEV_MAC_CFG_RESP, (void *) resp, 0);
9304 return QDF_STATUS_E_FAILURE;
9305
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009306}
9307
9308/**
Archana Ramachandrana20ef812015-11-13 16:12:13 -08009309 * wma_send_pdev_set_antenna_mode() - Set antenna mode to FW
9310 * @wma_handle: WMA handle
9311 * @msg: Antenna mode parameters
9312 *
9313 * Send WMI_PDEV_SET_ANTENNA_MODE_CMDID to FW requesting to
9314 * modify the number of TX/RX chains from host
9315 *
9316 * Return: QDF_STATUS. 0 on success.
9317 */
9318QDF_STATUS wma_send_pdev_set_antenna_mode(tp_wma_handle wma_handle,
9319 struct sir_antenna_mode_param *msg)
9320{
9321 wmi_pdev_set_antenna_mode_cmd_fixed_param *cmd;
9322 wmi_buf_t buf;
9323 uint32_t len;
9324 QDF_STATUS status = QDF_STATUS_SUCCESS;
9325 struct sir_antenna_mode_resp *param;
9326
9327 if (!wma_handle) {
9328 WMA_LOGE("%s: WMA handle is NULL. Cannot issue command",
9329 __func__);
9330 return QDF_STATUS_E_NULL_VALUE;
9331 }
9332
9333 if (!msg) {
9334 WMA_LOGE("%s: Set antenna mode param is NULL", __func__);
9335 return QDF_STATUS_E_NULL_VALUE;
9336 }
9337
9338 len = sizeof(*cmd);
9339
9340 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
9341 if (!buf) {
Archana Ramachandrana20ef812015-11-13 16:12:13 -08009342 status = QDF_STATUS_E_NOMEM;
9343 goto resp;
9344 }
9345
9346 cmd = (wmi_pdev_set_antenna_mode_cmd_fixed_param *) wmi_buf_data(buf);
9347 WMITLV_SET_HDR(&cmd->tlv_header,
9348 WMITLV_TAG_STRUC_wmi_pdev_set_antenna_mode_cmd_fixed_param,
9349 WMITLV_GET_STRUCT_TLVLEN(
9350 wmi_pdev_set_antenna_mode_cmd_fixed_param));
9351
Rakesh Pillai6a36b0a2019-09-06 16:30:05 +05309352 cmd->pdev_id = OL_TXRX_PDEV_ID;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08009353 /* Bits 0-15 is num of RX chains 16-31 is num of TX chains */
9354 cmd->num_txrx_chains = msg->num_rx_chains;
9355 cmd->num_txrx_chains |= (msg->num_tx_chains << 16);
9356
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07009357 WMA_LOGD("%s: Num of chains TX: %d RX: %d txrx_chains: 0x%x",
Archana Ramachandrana20ef812015-11-13 16:12:13 -08009358 __func__, msg->num_tx_chains,
9359 msg->num_rx_chains, cmd->num_txrx_chains);
9360
9361 if (wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
9362 WMI_PDEV_SET_ANTENNA_MODE_CMDID)) {
Archana Ramachandrana20ef812015-11-13 16:12:13 -08009363 wmi_buf_free(buf);
9364 status = QDF_STATUS_E_FAILURE;
9365 goto resp;
9366 }
9367 status = QDF_STATUS_SUCCESS;
9368
9369resp:
9370 param = qdf_mem_malloc(sizeof(*param));
Arif Hussain157263f2018-10-03 13:07:15 -07009371 if (!param)
Archana Ramachandrana20ef812015-11-13 16:12:13 -08009372 return QDF_STATUS_E_NOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07009373
Archana Ramachandrana20ef812015-11-13 16:12:13 -08009374 param->status = (status) ?
9375 SET_ANTENNA_MODE_STATUS_ECANCELED :
9376 SET_ANTENNA_MODE_STATUS_OK;
9377 WMA_LOGE("%s: Send antenna mode resp to LIM status: %d",
9378 __func__, param->status);
9379 wma_send_msg(wma_handle, SIR_HAL_SOC_ANTENNA_MODE_RESP,
9380 (void *) param, 0);
9381 return status;
9382}
9383
9384/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009385 * wma_crash_inject() - sends command to FW to simulate crash
9386 * @wma_handle: pointer of WMA context
9387 * @type: subtype of the command
9388 * @delay_time_ms: time in milliseconds for FW to delay the crash
9389 *
9390 * This function will send a command to FW in order to simulate different
9391 * kinds of FW crashes.
9392 *
Govind Singhd76a5b02016-03-08 15:12:14 +05309393 * Return: QDF_STATUS_SUCCESS for success or error code
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009394 */
Yu Wang46082dc2017-09-19 12:25:38 +08009395QDF_STATUS wma_crash_inject(WMA_HANDLE wma_handle, uint32_t type,
9396 uint32_t delay_time_ms)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009397{
Govind Singhd76a5b02016-03-08 15:12:14 +05309398 struct crash_inject param;
Yu Wang46082dc2017-09-19 12:25:38 +08009399 tp_wma_handle wma = (tp_wma_handle)wma_handle;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07009400
Govind Singhd76a5b02016-03-08 15:12:14 +05309401 param.type = type;
9402 param.delay_time_ms = delay_time_ms;
Yu Wang46082dc2017-09-19 12:25:38 +08009403 return wmi_crash_inject(wma->wmi_handle, &param);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009404}
Govind Singhd76a5b02016-03-08 15:12:14 +05309405
Manjunathappa Prakash7b0ad462018-04-15 00:37:16 -07009406#ifdef RECEIVE_OFFLOAD
Dhanashri Atre09828f12016-11-13 10:36:58 -08009407int wma_lro_init(struct cdp_lro_hash_config *lro_config)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009408{
Rajeev Kumarb60abe42017-01-21 15:39:31 -08009409 struct scheduler_msg msg = {0};
Dhanashri Atre09828f12016-11-13 10:36:58 -08009410 struct cdp_lro_hash_config *iwcmd;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009411
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309412 iwcmd = qdf_mem_malloc(sizeof(*iwcmd));
Arif Hussain157263f2018-10-03 13:07:15 -07009413 if (!iwcmd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009414 return -ENOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009415
9416 *iwcmd = *lro_config;
9417
9418 msg.type = WMA_LRO_CONFIG_CMD;
9419 msg.reserved = 0;
9420 msg.bodyptr = iwcmd;
9421
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309422 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia00861f02018-08-28 19:16:12 +05309423 scheduler_post_message(QDF_MODULE_ID_WMA,
9424 QDF_MODULE_ID_WMA,
9425 QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309426 qdf_mem_free(iwcmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009427 return -EAGAIN;
9428 }
9429
9430 WMA_LOGD("sending the LRO configuration to the fw");
9431 return 0;
9432}
9433#endif
Leo Chang96464902016-10-28 11:10:54 -07009434
Ashish Kumar Dhanotiyab28338c2017-07-21 20:12:34 +05309435QDF_STATUS wma_configure_smps_params(uint32_t vdev_id, uint32_t param_id,
9436 uint32_t param_val)
9437{
9438 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
9439 int smps_cmd_value;
9440 int status = QDF_STATUS_E_INVAL;
9441
9442 if (!wma) {
9443 WMA_LOGE("%s: Failed to get wma", __func__);
9444 return status;
9445 }
9446
9447 smps_cmd_value = param_id << WMI_SMPS_PARAM_VALUE_S;
9448 smps_cmd_value = smps_cmd_value | param_val;
9449
9450 status = wma_set_smps_params(wma, vdev_id, smps_cmd_value);
9451 if (status)
9452 WMA_LOGE("Failed to set SMPS Param");
9453
9454 return status;
9455}
9456
Leo Chang96464902016-10-28 11:10:54 -07009457
Nachiket Kukadeaaf8a712017-07-27 19:15:36 +05309458/**
9459 * wma_config_bmiss_bcnt_params() - set bmiss config parameters
9460 * @vdev_id: virtual device for the command
9461 * @first_cnt: bmiss first value
9462 * @final_cnt: bmiss final value
9463 *
9464 * Return: QDF_STATUS_SUCCESS or non-zero on failure
9465 */
9466QDF_STATUS wma_config_bmiss_bcnt_params(uint32_t vdev_id, uint32_t first_cnt,
9467 uint32_t final_cnt)
9468{
9469 tp_wma_handle wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
9470 int status = QDF_STATUS_E_INVAL;
9471
9472 if (!wma_handle) {
9473 WMA_LOGE("%s: Failed to get wma", __func__);
9474 return status;
9475 }
9476
9477 status = wma_roam_scan_bmiss_cnt(wma_handle, first_cnt, final_cnt,
9478 vdev_id);
9479
9480 if (status)
9481 WMA_LOGE("Failed to set Bmiss Param");
9482
9483 return status;
9484}
9485
Wu Gaoaa3ab362019-09-02 17:54:41 +08009486QDF_STATUS wma_get_rx_chainmask(uint8_t pdev_id, uint32_t *chainmask_2g,
9487 uint32_t *chainmask_5g)
9488{
9489 struct wlan_psoc_host_mac_phy_caps *mac_phy_cap;
Wu Gao20215482019-11-26 15:19:24 +08009490 uint8_t total_mac_phy_cnt, idx;
Wu Gaoaa3ab362019-09-02 17:54:41 +08009491 struct target_psoc_info *tgt_hdl;
Wu Gao20215482019-11-26 15:19:24 +08009492 uint32_t hw_mode_idx = 0, num_hw_modes = 0;
Amruta Kulkarniaccea6e2019-09-30 14:11:02 -07009493
Wu Gaoaa3ab362019-09-02 17:54:41 +08009494 tp_wma_handle wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Amruta Kulkarniaccea6e2019-09-30 14:11:02 -07009495 if (!wma_handle) {
9496 wma_err("wma_handle is NULL");
9497 return QDF_STATUS_E_INVAL;
9498 }
Wu Gaoaa3ab362019-09-02 17:54:41 +08009499
9500 tgt_hdl = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
9501 if (!tgt_hdl) {
9502 WMA_LOGE("%s: target psoc info is NULL", __func__);
9503 return QDF_STATUS_E_INVAL;
9504 }
9505
9506 total_mac_phy_cnt = target_psoc_get_total_mac_phy_cnt(tgt_hdl);
Wu Gao20215482019-11-26 15:19:24 +08009507 num_hw_modes = target_psoc_get_num_hw_modes(tgt_hdl);
Wu Gaoaa3ab362019-09-02 17:54:41 +08009508 if (total_mac_phy_cnt <= pdev_id) {
9509 WMA_LOGE("%s: mac phy cnt %d, pdev id %d", __func__,
9510 total_mac_phy_cnt, pdev_id);
9511 return QDF_STATUS_E_FAILURE;
9512 }
9513
Wu Gao20215482019-11-26 15:19:24 +08009514 if ((wma_handle->new_hw_mode_index != WMA_DEFAULT_HW_MODE_INDEX) &&
9515 (num_hw_modes > 0) &&
9516 (wma_handle->new_hw_mode_index < num_hw_modes))
9517 hw_mode_idx = wma_handle->new_hw_mode_index;
Wu Gaoaa3ab362019-09-02 17:54:41 +08009518 mac_phy_cap = target_psoc_get_mac_phy_cap(tgt_hdl);
Bapiraju Alla698e6112020-04-22 17:54:08 +05309519 if (!mac_phy_cap) {
9520 WMA_LOGE("Invalid MAC PHY capabilities handle");
9521 return QDF_STATUS_E_FAILURE;
9522 }
Wu Gao20215482019-11-26 15:19:24 +08009523 for (idx = 0; idx < total_mac_phy_cnt; idx++) {
9524 if (mac_phy_cap[idx].hw_mode_id != hw_mode_idx)
9525 continue;
9526 if (mac_phy_cap[idx].supported_bands & WLAN_2G_CAPABILITY)
9527 *chainmask_2g = mac_phy_cap[idx].rx_chain_mask_2G;
9528 if (mac_phy_cap[idx].supported_bands & WLAN_5G_CAPABILITY)
9529 *chainmask_5g = mac_phy_cap[idx].rx_chain_mask_5G;
9530 }
9531 WMA_LOGD("%s, pdev id: %d, hw_mode_idx: %d, rx chainmask 2g:%d, 5g:%d",
9532 __func__, pdev_id, hw_mode_idx, *chainmask_2g, *chainmask_5g);
Wu Gaoaa3ab362019-09-02 17:54:41 +08009533
9534 return QDF_STATUS_SUCCESS;
9535}
Sourav Mohapatra2a67b0e2019-10-15 17:59:59 +05309536
9537#ifdef FEATURE_ANI_LEVEL_REQUEST
9538QDF_STATUS wma_send_ani_level_request(tp_wma_handle wma_handle,
9539 uint32_t *freqs, uint8_t num_freqs)
9540{
9541 return wmi_unified_ani_level_cmd_send(wma_handle->wmi_handle, freqs,
9542 num_freqs);
9543}
9544#endif