blob: 82a0bbb3b69198634c810bd804dd965add8c440b [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
Harprit Chhabada98225f62018-12-11 15:29:55 -08002 * Copyright (c) 2013-2019 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"
Tushnim Bhattacharyya45ed04f2017-03-15 10:15:05 -0700100
Agrawal Ashishb0aa0752017-04-21 19:31:10 +0530101#define WMA_LOG_COMPLETION_TIMER 3000 /* 3 seconds */
Rajeev Kumar Sirasanagandla47873002016-09-09 13:46:09 +0530102#define WMI_TLV_HEADROOM 128
gaurank kathpalia85f8a612018-02-21 18:55:24 +0530103
104#define WMA_FW_TIME_SYNC_TIMER 60000 /* 1 min */
105
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700106uint8_t *mac_trace_get_wma_msg_string(uint16_t wmaMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800107static uint32_t g_fw_wlan_feat_caps;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800108/**
109 * wma_get_fw_wlan_feat_caps() - get fw feature capablity
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -0700110 * @feature: feature enum value
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800111 *
112 * Return: true/false
113 */
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -0700114bool wma_get_fw_wlan_feat_caps(enum cap_bitmap feature)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800115{
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -0700116 return (g_fw_wlan_feat_caps & (1 << feature)) ? true : false;
117}
118
119/**
120 * wma_set_fw_wlan_feat_caps() - set fw feature capablity
121 * @feature: feature enum value
122 *
123 * Return: None
124 */
125void wma_set_fw_wlan_feat_caps(enum cap_bitmap feature)
126{
127 g_fw_wlan_feat_caps |= (1 << feature);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800128}
129
130/**
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +0530131 * wma_service_ready_ext_evt_timeout() - Service ready extended event timeout
132 * @data: Timeout handler data
133 *
134 * This function is called when the FW fails to send WMI_SERVICE_READY_EXT_EVENT
135 * message
136 *
137 * Return: None
138 */
139static void wma_service_ready_ext_evt_timeout(void *data)
140{
141 tp_wma_handle wma_handle;
142
143 WMA_LOGA("%s: Timeout waiting for WMI_SERVICE_READY_EXT_EVENT",
144 __func__);
145
146 wma_handle = (tp_wma_handle) data;
147
148 if (!wma_handle) {
149 WMA_LOGE("%s: Invalid WMA handle", __func__);
150 goto end;
151 }
152
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +0530153end:
Naveen Rawatac39a102016-10-07 10:58:29 -0700154 /* Assert here. Panic is being called in insmod thread */
155 QDF_ASSERT(0);
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +0530156}
157
158/**
Komal Seelam02d09342016-02-23 18:03:19 +0530159 * wma_get_ini_handle() - API to get WMA ini info handle
160 * @wma: WMA Handle
161 *
162 * Returns the pointer to WMA ini structure.
163 * Return: struct wma_ini_config
164 */
165struct wma_ini_config *wma_get_ini_handle(tp_wma_handle wma)
166{
167 if (!wma) {
168 WMA_LOGE("%s: Invalid WMA context\n", __func__);
169 return NULL;
170 }
171
172 return &wma->ini_config;
173}
174
175#define MAX_SUPPORTED_PEERS_REV1_1 14
176#define MAX_SUPPORTED_PEERS_REV1_3 32
177#define MIN_NO_OF_PEERS 1
178
179/**
180 * wma_get_number_of_peers_supported - API to query for number of peers
181 * supported
182 * @wma: WMA Handle
183 *
184 * Return: Max Number of Peers Supported
185 */
186static uint8_t wma_get_number_of_peers_supported(tp_wma_handle wma)
187{
Komal Seelam02d09342016-02-23 18:03:19 +0530188 struct wma_ini_config *cfg = wma_get_ini_handle(wma);
189 uint8_t max_no_of_peers = cfg ? cfg->max_no_of_peers : MIN_NO_OF_PEERS;
Komal Seelam02d09342016-02-23 18:03:19 +0530190
191 return max_no_of_peers;
192}
193
194/**
bings6b3614e2017-02-21 10:18:36 +0800195 * wma_get_number_of_tids_supported - API to query for number of tids supported
196 * @no_of_peers_supported: Number of peer supported
197 *
198 * Return: Max number of tids supported
199 */
200#if defined(CONFIG_HL_SUPPORT)
Rachit Kankane0106e382018-05-16 18:59:28 +0530201static uint32_t wma_get_number_of_tids_supported(uint8_t no_of_peers_supported,
202 uint8_t num_vdevs)
bings6b3614e2017-02-21 10:18:36 +0800203{
204 return 4 * no_of_peers_supported;
205}
206#else
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{
Rachit Kankane0106e382018-05-16 18:59:28 +0530210 return 2 * (no_of_peers_supported + num_vdevs + 2);
bings6b3614e2017-02-21 10:18:36 +0800211}
212#endif
213
Rachit Kankane0106e382018-05-16 18:59:28 +0530214#ifndef NUM_OF_ADDITIONAL_FW_PEERS
215#define NUM_OF_ADDITIONAL_FW_PEERS 2
216#endif
bings6b3614e2017-02-21 10:18:36 +0800217/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800218 * wma_set_default_tgt_config() - set default tgt config
219 * @wma_handle: wma handle
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530220 * @tgt_cfg: Resource config given to target
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800221 *
222 * Return: none
223 */
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530224static void wma_set_default_tgt_config(tp_wma_handle wma_handle,
Rachit Kankane0106e382018-05-16 18:59:28 +0530225 target_resource_config *tgt_cfg,
226 struct cds_config_info *cds_cfg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800227{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800228 uint8_t no_of_peers_supported;
Mukul Sharmab10c8c72017-11-02 17:25:59 +0530229
Rachit Kankane0106e382018-05-16 18:59:28 +0530230 no_of_peers_supported = wma_get_number_of_peers_supported(wma_handle);
231
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530232 qdf_mem_zero(tgt_cfg, sizeof(target_resource_config));
Rachit Kankane0106e382018-05-16 18:59:28 +0530233 tgt_cfg->num_vdevs = cds_cfg->num_vdevs;
234 tgt_cfg->num_peers = no_of_peers_supported +
235 cds_cfg->num_vdevs +
236 NUM_OF_ADDITIONAL_FW_PEERS;
237 /* The current firmware implementation requires the number of
238 * offload peers should be (number of vdevs + 1).
239 */
240 tgt_cfg->num_offload_peers = cds_cfg->ap_maxoffload_peers + 1;
241 tgt_cfg->num_offload_reorder_buffs =
242 cds_cfg->ap_maxoffload_reorderbuffs + 1;
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530243 tgt_cfg->num_peer_keys = CFG_TGT_NUM_PEER_KEYS;
Rachit Kankane0106e382018-05-16 18:59:28 +0530244 tgt_cfg->num_tids = wma_get_number_of_tids_supported(
245 no_of_peers_supported, cds_cfg->num_vdevs);
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530246 tgt_cfg->ast_skid_limit = CFG_TGT_AST_SKID_LIMIT;
247 tgt_cfg->tx_chain_mask = CFG_TGT_DEFAULT_TX_CHAIN_MASK;
248 tgt_cfg->rx_chain_mask = CFG_TGT_DEFAULT_RX_CHAIN_MASK;
249 tgt_cfg->rx_timeout_pri[0] = CFG_TGT_RX_TIMEOUT_LO_PRI;
250 tgt_cfg->rx_timeout_pri[1] = CFG_TGT_RX_TIMEOUT_LO_PRI;
251 tgt_cfg->rx_timeout_pri[2] = CFG_TGT_RX_TIMEOUT_LO_PRI;
252 tgt_cfg->rx_timeout_pri[3] = CFG_TGT_RX_TIMEOUT_HI_PRI;
253 tgt_cfg->rx_decap_mode = CFG_TGT_RX_DECAP_MODE;
Harprit Chhabada31e3e162019-01-16 16:48:14 -0800254 tgt_cfg->scan_max_pending_req = WLAN_MAX_ACTIVE_SCANS_ALLOWED;
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530255 tgt_cfg->bmiss_offload_max_vdev =
256 CFG_TGT_DEFAULT_BMISS_OFFLOAD_MAX_VDEV;
257 tgt_cfg->roam_offload_max_vdev = CFG_TGT_DEFAULT_ROAM_OFFLOAD_MAX_VDEV;
258 tgt_cfg->roam_offload_max_ap_profiles =
Mukul Sharmab10c8c72017-11-02 17:25:59 +0530259 CFG_TGT_DEFAULT_ROAM_OFFLOAD_MAX_PROFILES;
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530260 tgt_cfg->num_mcast_groups = CFG_TGT_DEFAULT_NUM_MCAST_GROUPS;
261 tgt_cfg->num_mcast_table_elems = CFG_TGT_DEFAULT_NUM_MCAST_TABLE_ELEMS;
262 tgt_cfg->mcast2ucast_mode = CFG_TGT_DEFAULT_MCAST2UCAST_MODE;
263 tgt_cfg->tx_dbg_log_size = CFG_TGT_DEFAULT_TX_DBG_LOG_SIZE;
264 tgt_cfg->num_wds_entries = CFG_TGT_WDS_ENTRIES;
265 tgt_cfg->dma_burst_size = CFG_TGT_DEFAULT_DMA_BURST_SIZE;
266 tgt_cfg->mac_aggr_delim = CFG_TGT_DEFAULT_MAC_AGGR_DELIM;
267 tgt_cfg->rx_skip_defrag_timeout_dup_detection_check =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800268 CFG_TGT_DEFAULT_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK,
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530269 tgt_cfg->vow_config = CFG_TGT_DEFAULT_VOW_CONFIG;
270 tgt_cfg->gtk_offload_max_vdev = CFG_TGT_DEFAULT_GTK_OFFLOAD_MAX_VDEV;
271 tgt_cfg->num_msdu_desc = CFG_TGT_NUM_MSDU_DESC;
272 tgt_cfg->max_frag_entries = CFG_TGT_MAX_FRAG_TABLE_ENTRIES;
273 tgt_cfg->num_tdls_vdevs = CFG_TGT_NUM_TDLS_VDEVS;
274 tgt_cfg->num_tdls_conn_table_entries =
Mukul Sharmab10c8c72017-11-02 17:25:59 +0530275 CFG_TGT_NUM_TDLS_CONN_TABLE_ENTRIES;
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530276 tgt_cfg->beacon_tx_offload_max_vdev =
Mukul Sharmab10c8c72017-11-02 17:25:59 +0530277 CFG_TGT_DEFAULT_BEACON_TX_OFFLOAD_MAX_VDEV;
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530278 tgt_cfg->num_multicast_filter_entries =
Mukul Sharmab10c8c72017-11-02 17:25:59 +0530279 CFG_TGT_MAX_MULTICAST_FILTER_ENTRIES;
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530280 tgt_cfg->num_wow_filters = 0;
Rachit Kankane0106e382018-05-16 18:59:28 +0530281 tgt_cfg->num_keep_alive_pattern = WMA_MAXNUM_PERIODIC_TX_PTRNS;
jsreekumac44b922018-06-12 20:18:39 +0530282 tgt_cfg->num_max_sta_vdevs = CFG_TGT_DEFAULT_MAX_STA_VDEVS;
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530283 tgt_cfg->keep_alive_pattern_size = 0;
284 tgt_cfg->max_tdls_concurrent_sleep_sta =
Mukul Sharmab10c8c72017-11-02 17:25:59 +0530285 CFG_TGT_NUM_TDLS_CONC_SLEEP_STAS;
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530286 tgt_cfg->max_tdls_concurrent_buffer_sta =
Mukul Sharmab10c8c72017-11-02 17:25:59 +0530287 CFG_TGT_NUM_TDLS_CONC_BUFFER_STAS;
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530288 tgt_cfg->wmi_send_separate = 0;
289 tgt_cfg->num_ocb_vdevs = CFG_TGT_NUM_OCB_VDEVS;
290 tgt_cfg->num_ocb_channels = CFG_TGT_NUM_OCB_CHANNELS;
291 tgt_cfg->num_ocb_schedules = CFG_TGT_NUM_OCB_SCHEDULES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800292
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800293
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530294 tgt_cfg->mgmt_comp_evt_bundle_support = true;
295 tgt_cfg->tx_msdu_new_partition_id_support = true;
Nirav Shah20489972016-06-16 19:20:28 +0530296
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530297 if (cds_get_conparam() == QDF_GLOBAL_MONITOR_MODE)
298 tgt_cfg->rx_decap_mode = CFG_TGT_RX_DECAP_MODE_RAW;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800299}
300
301/**
302 * wma_cli_get_command() - WMA "get" command processor
303 * @vdev_id: virtual device for the command
304 * @param_id: parameter id
305 * @vpdev: parameter category
306 *
307 * Return: parameter value on success, -EINVAL on failure
308 */
309int wma_cli_get_command(int vdev_id, int param_id, int vpdev)
310{
311 int ret = 0;
312 tp_wma_handle wma;
313 struct wma_txrx_node *intr = NULL;
314
Anurag Chouhan6d760662016-02-20 16:05:43 +0530315 wma = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800316
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -0700317 if (!wma) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800318 WMA_LOGE("%s: Invalid wma handle", __func__);
319 return -EINVAL;
320 }
321
322 intr = wma->interfaces;
323
324 if (VDEV_CMD == vpdev) {
325 switch (param_id) {
326 case WMI_VDEV_PARAM_NSS:
327 ret = intr[vdev_id].config.nss;
328 break;
329#ifdef QCA_SUPPORT_GTX
330 case WMI_VDEV_PARAM_GTX_HT_MCS:
331 ret = intr[vdev_id].config.gtx_info.gtxRTMask[0];
332 break;
333 case WMI_VDEV_PARAM_GTX_VHT_MCS:
334 ret = intr[vdev_id].config.gtx_info.gtxRTMask[1];
335 break;
336 case WMI_VDEV_PARAM_GTX_USR_CFG:
337 ret = intr[vdev_id].config.gtx_info.gtxUsrcfg;
338 break;
339 case WMI_VDEV_PARAM_GTX_THRE:
340 ret = intr[vdev_id].config.gtx_info.gtxPERThreshold;
341 break;
342 case WMI_VDEV_PARAM_GTX_MARGIN:
343 ret = intr[vdev_id].config.gtx_info.gtxPERMargin;
344 break;
345 case WMI_VDEV_PARAM_GTX_STEP:
346 ret = intr[vdev_id].config.gtx_info.gtxTPCstep;
347 break;
348 case WMI_VDEV_PARAM_GTX_MINTPC:
349 ret = intr[vdev_id].config.gtx_info.gtxTPCMin;
350 break;
351 case WMI_VDEV_PARAM_GTX_BW_MASK:
352 ret = intr[vdev_id].config.gtx_info.gtxBWMask;
353 break;
354#endif /* QCA_SUPPORT_GTX */
355 case WMI_VDEV_PARAM_LDPC:
356 ret = intr[vdev_id].config.ldpc;
357 break;
358 case WMI_VDEV_PARAM_TX_STBC:
359 ret = intr[vdev_id].config.tx_stbc;
360 break;
361 case WMI_VDEV_PARAM_RX_STBC:
362 ret = intr[vdev_id].config.rx_stbc;
363 break;
364 case WMI_VDEV_PARAM_SGI:
365 ret = intr[vdev_id].config.shortgi;
366 break;
367 case WMI_VDEV_PARAM_ENABLE_RTSCTS:
368 ret = intr[vdev_id].config.rtscts_en;
369 break;
370 case WMI_VDEV_PARAM_CHWIDTH:
371 ret = intr[vdev_id].config.chwidth;
372 break;
373 case WMI_VDEV_PARAM_FIXED_RATE:
374 ret = intr[vdev_id].config.tx_rate;
375 break;
Krishna Kumaar Natarajan1a71ec72017-03-23 12:26:31 -0700376 case WMI_VDEV_PARAM_HE_DCM:
Krishna Kumaar Natarajan150cd012017-03-23 12:29:10 -0700377 case WMI_VDEV_PARAM_HE_RANGE_EXT:
Krishna Kumaar Natarajan1a71ec72017-03-23 12:26:31 -0700378 ret = wma_get_he_vdev_param(&intr[vdev_id], param_id);
379 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800380 default:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700381 WMA_LOGE("Invalid cli_get vdev command/Not yet implemented 0x%x",
382 param_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800383 return -EINVAL;
384 }
385 } else if (PDEV_CMD == vpdev) {
386 switch (param_id) {
387 case WMI_PDEV_PARAM_ANI_ENABLE:
388 ret = wma->pdevconfig.ani_enable;
389 break;
390 case WMI_PDEV_PARAM_ANI_POLL_PERIOD:
391 ret = wma->pdevconfig.ani_poll_len;
392 break;
393 case WMI_PDEV_PARAM_ANI_LISTEN_PERIOD:
394 ret = wma->pdevconfig.ani_listen_len;
395 break;
396 case WMI_PDEV_PARAM_ANI_OFDM_LEVEL:
397 ret = wma->pdevconfig.ani_ofdm_level;
398 break;
399 case WMI_PDEV_PARAM_ANI_CCK_LEVEL:
400 ret = wma->pdevconfig.ani_cck_level;
401 break;
402 case WMI_PDEV_PARAM_DYNAMIC_BW:
403 ret = wma->pdevconfig.cwmenable;
404 break;
405 case WMI_PDEV_PARAM_CTS_CBW:
406 ret = wma->pdevconfig.cts_cbw;
407 break;
408 case WMI_PDEV_PARAM_TX_CHAIN_MASK:
409 ret = wma->pdevconfig.txchainmask;
410 break;
411 case WMI_PDEV_PARAM_RX_CHAIN_MASK:
412 ret = wma->pdevconfig.rxchainmask;
413 break;
414 case WMI_PDEV_PARAM_TXPOWER_LIMIT2G:
415 ret = wma->pdevconfig.txpow2g;
416 break;
417 case WMI_PDEV_PARAM_TXPOWER_LIMIT5G:
418 ret = wma->pdevconfig.txpow5g;
419 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800420 default:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700421 WMA_LOGE("Invalid cli_get pdev command/Not yet implemented 0x%x",
422 param_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800423 return -EINVAL;
424 }
425 } else if (GEN_CMD == vpdev) {
426 switch (param_id) {
427 case GEN_VDEV_PARAM_AMPDU:
428 ret = intr[vdev_id].config.ampdu;
429 break;
430 case GEN_VDEV_PARAM_AMSDU:
431 ret = intr[vdev_id].config.amsdu;
432 break;
Varun Reddy Yeturu5ab47462016-05-08 18:08:11 -0700433 case GEN_VDEV_ROAM_SYNCH_DELAY:
434 ret = intr[vdev_id].roam_synch_delay;
435 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800436 default:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700437 WMA_LOGE("Invalid generic vdev command/Not yet implemented 0x%x",
438 param_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800439 return -EINVAL;
440 }
441 } else if (PPS_CMD == vpdev) {
442 switch (param_id) {
443 case WMI_VDEV_PPS_PAID_MATCH:
444 ret = intr[vdev_id].config.pps_params.paid_match_enable;
445 break;
446 case WMI_VDEV_PPS_GID_MATCH:
447 ret = intr[vdev_id].config.pps_params.gid_match_enable;
448 break;
449 case WMI_VDEV_PPS_EARLY_TIM_CLEAR:
450 ret = intr[vdev_id].config.pps_params.tim_clear;
451 break;
452 case WMI_VDEV_PPS_EARLY_DTIM_CLEAR:
453 ret = intr[vdev_id].config.pps_params.dtim_clear;
454 break;
455 case WMI_VDEV_PPS_EOF_PAD_DELIM:
456 ret = intr[vdev_id].config.pps_params.eof_delim;
457 break;
458 case WMI_VDEV_PPS_MACADDR_MISMATCH:
459 ret = intr[vdev_id].config.pps_params.mac_match;
460 break;
461 case WMI_VDEV_PPS_DELIM_CRC_FAIL:
462 ret = intr[vdev_id].config.pps_params.delim_fail;
463 break;
464 case WMI_VDEV_PPS_GID_NSTS_ZERO:
465 ret = intr[vdev_id].config.pps_params.nsts_zero;
466 break;
467 case WMI_VDEV_PPS_RSSI_CHECK:
468 ret = intr[vdev_id].config.pps_params.rssi_chk;
469 break;
470 default:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700471 WMA_LOGE("Invalid pps vdev command/Not yet implemented 0x%x",
472 param_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800473 return -EINVAL;
474 }
475 } else if (QPOWER_CMD == vpdev) {
476 switch (param_id) {
477 case WMI_STA_PS_PARAM_QPOWER_PSPOLL_COUNT:
478 ret = intr[vdev_id].config.qpower_params.
479 max_ps_poll_cnt;
480 break;
481 case WMI_STA_PS_PARAM_QPOWER_MAX_TX_BEFORE_WAKE:
482 ret = intr[vdev_id].config.qpower_params.
483 max_tx_before_wake;
484 break;
485 case WMI_STA_PS_PARAM_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL:
486 ret = intr[vdev_id].config.qpower_params.
487 spec_ps_poll_wake_interval;
488 break;
489 case WMI_STA_PS_PARAM_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL:
490 ret = intr[vdev_id].config.qpower_params.
491 max_spec_nodata_ps_poll;
492 break;
493 default:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700494 WMA_LOGE("Invalid generic vdev command/Not yet implemented 0x%x",
495 param_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800496 return -EINVAL;
497 }
498 } else if (GTX_CMD == vpdev) {
499 switch (param_id) {
500 case WMI_VDEV_PARAM_GTX_HT_MCS:
501 ret = intr[vdev_id].config.gtx_info.gtxRTMask[0];
502 break;
503 case WMI_VDEV_PARAM_GTX_VHT_MCS:
504 ret = intr[vdev_id].config.gtx_info.gtxRTMask[1];
505 break;
506 case WMI_VDEV_PARAM_GTX_USR_CFG:
507 ret = intr[vdev_id].config.gtx_info.gtxUsrcfg;
508 break;
509 case WMI_VDEV_PARAM_GTX_THRE:
510 ret = intr[vdev_id].config.gtx_info.gtxPERThreshold;
511 break;
512 case WMI_VDEV_PARAM_GTX_MARGIN:
513 ret = intr[vdev_id].config.gtx_info.gtxPERMargin;
514 break;
515 case WMI_VDEV_PARAM_GTX_STEP:
516 ret = intr[vdev_id].config.gtx_info.gtxTPCstep;
517 break;
518 case WMI_VDEV_PARAM_GTX_MINTPC:
519 ret = intr[vdev_id].config.gtx_info.gtxTPCMin;
520 break;
521 case WMI_VDEV_PARAM_GTX_BW_MASK:
522 ret = intr[vdev_id].config.gtx_info.gtxBWMask;
523 break;
524 default:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700525 WMA_LOGE("Invalid generic vdev command/Not yet implemented 0x%x",
526 param_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800527 return -EINVAL;
528 }
529 }
530 return ret;
531}
532
533/**
534 * wma_cli_set2_command() - WMA "set 2 params" command processor
535 * @vdev_id: virtual device for the command
536 * @param_id: parameter id
537 * @sval1: first parameter value
538 * @sval2: second parameter value
539 * @vpdev: parameter category
540 *
541 * Command handler for set operations which require 2 parameters
542 *
543 * Return: 0 on success, errno on failure
544 */
545int wma_cli_set2_command(int vdev_id, int param_id, int sval1,
546 int sval2, int vpdev)
547{
Rajeev Kumarb60abe42017-01-21 15:39:31 -0800548 struct scheduler_msg msg = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800549 wma_cli_set_cmd_t *iwcmd;
550
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530551 iwcmd = qdf_mem_malloc(sizeof(*iwcmd));
Arif Hussain157263f2018-10-03 13:07:15 -0700552 if (!iwcmd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800553 return -ENOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800554
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530555 qdf_mem_zero(iwcmd, sizeof(*iwcmd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800556 iwcmd->param_value = sval1;
557 iwcmd->param_sec_value = sval2;
558 iwcmd->param_vdev_id = vdev_id;
559 iwcmd->param_id = param_id;
560 iwcmd->param_vp_dev = vpdev;
561 msg.type = WMA_CLI_SET_CMD;
562 msg.reserved = 0;
563 msg.bodyptr = iwcmd;
564
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530565 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia00861f02018-08-28 19:16:12 +0530566 scheduler_post_message(QDF_MODULE_ID_WMA,
567 QDF_MODULE_ID_WMA,
568 QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530569 qdf_mem_free(iwcmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800570 return -EIO;
571 }
572 return 0;
573}
574
575/**
576 * wma_cli_set_command() - WMA "set" command processor
577 * @vdev_id: virtual device for the command
578 * @param_id: parameter id
579 * @sval: parameter value
580 * @vpdev: parameter category
581 *
582 * Command handler for set operations
583 *
584 * Return: 0 on success, errno on failure
585 */
586int wma_cli_set_command(int vdev_id, int param_id, int sval, int vpdev)
587{
588 return wma_cli_set2_command(vdev_id, param_id, sval, 0, vpdev);
589
590}
591
Krunal Soniaadaa272017-10-04 16:42:55 -0700592QDF_STATUS wma_form_unit_test_cmd_and_send(uint32_t vdev_id,
593 uint32_t module_id, uint32_t arg_count, uint32_t *arg)
594{
595 struct wmi_unit_test_cmd *unit_test_args;
596 tp_wma_handle wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
597 uint32_t i;
598 QDF_STATUS status;
599
600 WMA_LOGD(FL("enter"));
Sourav Mohapatraea7210b2018-11-16 16:58:52 +0530601 if (arg_count > WMA_MAX_NUM_ARGS) {
Krunal Soniaadaa272017-10-04 16:42:55 -0700602 WMA_LOGE(FL("arg_count is crossed the boundary"));
603 return QDF_STATUS_E_FAILURE;
604 }
605 if (!wma_handle || !wma_handle->wmi_handle) {
606 WMA_LOGE(FL("Invalid WMA/WMI handle"));
607 return QDF_STATUS_E_FAILURE;
608 }
609 unit_test_args = qdf_mem_malloc(sizeof(*unit_test_args));
Arif Hussain157263f2018-10-03 13:07:15 -0700610 if (!unit_test_args)
Krunal Soniaadaa272017-10-04 16:42:55 -0700611 return QDF_STATUS_E_NOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -0700612
Krunal Soniaadaa272017-10-04 16:42:55 -0700613 unit_test_args->vdev_id = vdev_id;
614 unit_test_args->module_id = module_id;
615 unit_test_args->num_args = arg_count;
616 for (i = 0; i < arg_count; i++)
617 unit_test_args->args[i] = arg[i];
618
619 status = wmi_unified_unit_test_cmd(wma_handle->wmi_handle,
620 unit_test_args);
621 qdf_mem_free(unit_test_args);
622 WMA_LOGD(FL("exit"));
623
624 return status;
625}
626
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -0800627static void wma_process_send_addba_req(tp_wma_handle wma_handle,
628 struct send_add_ba_req *send_addba)
629{
630 QDF_STATUS status;
631
632 if (!wma_handle || !wma_handle->wmi_handle) {
633 WMA_LOGE(FL("Invalid WMA/WMI handle"));
634 qdf_mem_free(send_addba);
635 return;
636 }
637
638 status = wmi_unified_addba_send_cmd_send(wma_handle->wmi_handle,
639 send_addba->mac_addr,
640 &send_addba->param);
641 if (QDF_STATUS_SUCCESS != status) {
642 WMA_LOGE(FL("Failed to process WMA_SEND_ADDBA_REQ"));
643 }
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -0700644 wma_debug("sent ADDBA req to" QDF_MAC_ADDR_STR "tid %d buff_size %d",
Srinivas Girigowda34fbba02019-04-08 12:07:44 -0700645 QDF_MAC_ADDR_ARRAY(send_addba->mac_addr),
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -0800646 send_addba->param.tidno,
647 send_addba->param.buffersize);
648
649 qdf_mem_free(send_addba);
650}
651
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800652/**
Yun Parkb4f591d2017-03-29 15:51:01 -0700653 * wma_ipa_get_stat() - get IPA data path stats from FW
654 *
655 * Return: 0 on success, errno on failure
656 */
657#ifdef IPA_OFFLOAD
658static int wma_ipa_get_stat(void)
659{
660 struct cdp_pdev *pdev;
661
662 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
663 if (!pdev) {
664 WMA_LOGE("pdev NULL for uc stat");
665 return -EINVAL;
666 }
667 cdp_ipa_get_stat(cds_get_context(QDF_MODULE_ID_SOC), pdev);
668
669 return 0;
670}
671#else
672static int wma_ipa_get_stat(void)
673{
674 return 0;
675}
676#endif
677
678/**
679 * wma_ipa_uc_get_share_stats() - get Tx/Rx byte stats from FW
680 * @privcmd: private command
681 *
682 * Return: 0 on success, errno on failure
683 */
684#if defined(IPA_OFFLOAD) && defined(FEATURE_METERING)
685static int wma_ipa_uc_get_share_stats(wma_cli_set_cmd_t *privcmd)
686{
687 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
688 struct cdp_pdev *pdev;
689 uint8_t reset_stats = privcmd->param_value;
690
691 WMA_LOGD("%s: reset_stats=%d",
692 "WMA_VDEV_TXRX_GET_IPA_UC_SHARING_STATS_CMDID",
693 reset_stats);
694 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
695 if (!pdev) {
696 WMA_LOGE("pdev NULL for uc get share stats");
697 return -EINVAL;
698 }
699 cdp_ipa_uc_get_share_stats(soc, pdev, reset_stats);
700
701 return 0;
702}
703#else
704static int wma_ipa_uc_get_share_stats(wma_cli_set_cmd_t *privcmd)
705{
706 return 0;
707}
708#endif
709
710/**
711 * wma_ipa_uc_set_quota() - set quota limit to FW
712 * @privcmd: private command
713 *
714 * Return: 0 on success, errno on failure
715 */
716#if defined(IPA_OFFLOAD) && defined(FEATURE_METERING)
717static int wma_ipa_uc_set_quota(wma_cli_set_cmd_t *privcmd)
718{
719 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
720 struct cdp_pdev *pdev;
721 uint64_t quota_bytes = privcmd->param_sec_value;
722
723 quota_bytes <<= 32;
724 quota_bytes |= privcmd->param_value;
725
726 WMA_LOGD("%s: quota_bytes=%llu",
727 "WMA_VDEV_TXRX_SET_IPA_UC_QUOTA_CMDID",
728 quota_bytes);
729 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
730 if (!pdev) {
731 WMA_LOGE("pdev NULL for uc set quota");
732 return -EINVAL;
733 }
734 cdp_ipa_uc_set_quota(soc, pdev, quota_bytes);
735
736 return 0;
737}
738#else
739static int wma_ipa_uc_set_quota(wma_cli_set_cmd_t *privcmd)
740{
741 return 0;
742}
743#endif
744
745/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800746 * wma_set_priv_cfg() - set private config parameters
747 * @wma_handle: wma handle
748 * @privcmd: private command
749 *
750 * Return: 0 for success or error code
751 */
752static int32_t wma_set_priv_cfg(tp_wma_handle wma_handle,
753 wma_cli_set_cmd_t *privcmd)
754{
755 int32_t ret = 0;
756
757 switch (privcmd->param_id) {
758 case WMA_VDEV_TXRX_FWSTATS_ENABLE_CMDID:
759 ret = wma_set_txrx_fw_stats_level(wma_handle,
760 privcmd->param_vdev_id,
761 privcmd->param_value);
762 break;
763 case WMA_VDEV_TXRX_FWSTATS_RESET_CMDID:
764 ret = wma_txrx_fw_stats_reset(wma_handle,
765 privcmd->param_vdev_id,
766 privcmd->param_value);
767 break;
768 case WMI_STA_SMPS_FORCE_MODE_CMDID:
Archana Ramachandran20d2e232016-02-11 16:58:40 -0800769 ret = wma_set_mimops(wma_handle,
770 privcmd->param_vdev_id,
771 privcmd->param_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800772 break;
773 case WMI_STA_SMPS_PARAM_CMDID:
774 wma_set_smps_params(wma_handle, privcmd->param_vdev_id,
775 privcmd->param_value);
776 break;
777 case WMA_VDEV_MCC_SET_TIME_LATENCY:
778 {
779 /* Extract first MCC adapter/vdev channel number and latency */
780 uint8_t mcc_channel = privcmd->param_value & 0x000000FF;
781 uint8_t mcc_channel_latency =
782 (privcmd->param_value & 0x0000FF00) >> 8;
783 int ret = -1;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700784
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800785 WMA_LOGD("%s: Parsed input: Channel #1:%d, latency:%dms",
786 __func__, mcc_channel, mcc_channel_latency);
787 ret = wma_set_mcc_channel_time_latency(wma_handle,
788 mcc_channel,
789 mcc_channel_latency);
790 }
791 break;
792 case WMA_VDEV_MCC_SET_TIME_QUOTA:
793 {
794 /* Extract the MCC 2 adapters/vdevs channel numbers and time
795 * quota value for the first adapter only (which is specified
796 * in iwpriv command.
797 */
798 uint8_t adapter_2_chan_number =
799 privcmd->param_value & 0x000000FF;
800 uint8_t adapter_1_chan_number =
801 (privcmd->param_value & 0x0000FF00) >> 8;
802 uint8_t adapter_1_quota =
803 (privcmd->param_value & 0x00FF0000) >> 16;
804 int ret = -1;
805
806 WMA_LOGD("%s: Parsed input: Channel #1:%d, Channel #2:%d, quota 1:%dms",
807 __func__, adapter_1_chan_number,
808 adapter_2_chan_number, adapter_1_quota);
809
810 ret = wma_set_mcc_channel_time_quota(wma_handle,
811 adapter_1_chan_number,
812 adapter_1_quota,
813 adapter_2_chan_number);
814 }
815 break;
816 case WMA_VDEV_IBSS_SET_ATIM_WINDOW_SIZE:
817 {
818 wma_handle->wma_ibss_power_save_params.atimWindowLength =
819 privcmd->param_value;
820 WMA_LOGD("%s: IBSS power save ATIM Window = %d",
821 __func__, wma_handle->wma_ibss_power_save_params.
822 atimWindowLength);
823 }
824 break;
825 case WMA_VDEV_IBSS_SET_POWER_SAVE_ALLOWED:
826 {
827 wma_handle->wma_ibss_power_save_params.isPowerSaveAllowed =
828 privcmd->param_value;
829 WMA_LOGD("%s: IBSS is Power Save Allowed = %d",
830 __func__, wma_handle->wma_ibss_power_save_params.
831 isPowerSaveAllowed);
832 }
833 break;
834 case WMA_VDEV_IBSS_SET_POWER_COLLAPSE_ALLOWED:
835 {
836 wma_handle->wma_ibss_power_save_params. isPowerCollapseAllowed =
837 privcmd->param_value;
838 WMA_LOGD("%s: IBSS is Power Collapse Allowed = %d",
839 __func__, wma_handle->wma_ibss_power_save_params.
840 isPowerCollapseAllowed);
841 }
842 break;
843 case WMA_VDEV_IBSS_SET_AWAKE_ON_TX_RX:
844 {
845 wma_handle->wma_ibss_power_save_params.isAwakeonTxRxEnabled =
846 privcmd->param_value;
847 WMA_LOGD("%s: IBSS Power Save Awake on Tx/Rx Enabled = %d",
848 __func__, wma_handle->wma_ibss_power_save_params.
849 isAwakeonTxRxEnabled);
850 }
851 break;
852 case WMA_VDEV_IBSS_SET_INACTIVITY_TIME:
853 {
854 wma_handle->wma_ibss_power_save_params.inactivityCount =
855 privcmd->param_value;
856 WMA_LOGD("%s: IBSS Power Save Data Inactivity Count = %d",
857 __func__, wma_handle->wma_ibss_power_save_params.
858 inactivityCount);
859 }
860 break;
861 case WMA_VDEV_IBSS_SET_TXSP_END_INACTIVITY_TIME:
862 {
863 wma_handle->wma_ibss_power_save_params.txSPEndInactivityTime =
864 privcmd->param_value;
865 WMA_LOGD("%s: IBSS Power Save Transmit EOSP inactivity time out = %d",
866 __func__, wma_handle->wma_ibss_power_save_params.
867 txSPEndInactivityTime);
868 }
869 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800870 case WMA_VDEV_IBSS_PS_SET_WARMUP_TIME_SECS:
871 {
872 wma_handle->wma_ibss_power_save_params.ibssPsWarmupTime =
873 privcmd->param_value;
874 WMA_LOGD("%s: IBSS Power Save Warm Up Time in Seconds = %d",
875 __func__, wma_handle->wma_ibss_power_save_params.
876 ibssPsWarmupTime);
877 }
878 break;
879 case WMA_VDEV_IBSS_PS_SET_1RX_CHAIN_IN_ATIM_WINDOW:
880 {
881 wma_handle->wma_ibss_power_save_params.ibssPs1RxChainInAtimEnable
882 = privcmd->param_value;
883 WMA_LOGD("%s: IBSS Power Save single RX Chain Enable In ATIM = %d",
884 __func__, wma_handle->wma_ibss_power_save_params.
885 ibssPs1RxChainInAtimEnable);
886 }
887 break;
888
889 case WMA_VDEV_TXRX_GET_IPA_UC_FW_STATS_CMDID:
890 {
Yun Parkb4f591d2017-03-29 15:51:01 -0700891 wma_ipa_get_stat();
Yun Park637d6482016-10-05 10:51:33 -0700892 }
893 break;
894
895 case WMA_VDEV_TXRX_GET_IPA_UC_SHARING_STATS_CMDID:
896 {
Yun Parkb4f591d2017-03-29 15:51:01 -0700897 wma_ipa_uc_get_share_stats(privcmd);
Yun Park637d6482016-10-05 10:51:33 -0700898 }
899 break;
900
901 case WMA_VDEV_TXRX_SET_IPA_UC_QUOTA_CMDID:
902 {
Yun Parkb4f591d2017-03-29 15:51:01 -0700903 wma_ipa_uc_set_quota(privcmd);
Yun Park327e7812017-02-14 15:18:10 -0800904
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800905 }
906 break;
907
908 default:
909 WMA_LOGE("Invalid wma config command id:%d", privcmd->param_id);
910 ret = -EINVAL;
911 }
912 return ret;
913}
914
915/**
Kiran Kumar Lokere6d3a30d2018-01-15 18:18:29 -0800916 * wma_set_dtim_period() - set dtim period to FW
917 * @wma: wma handle
918 * @dtim_params: dtim params
919 *
920 * Return: none
921 */
922static void wma_set_dtim_period(tp_wma_handle wma,
923 struct set_dtim_params *dtim_params)
924{
925 struct wma_txrx_node *iface =
926 &wma->interfaces[dtim_params->session_id];
927 if (!wma_is_vdev_valid(dtim_params->session_id)) {
928 WMA_LOGE("%s: invalid VDEV", __func__);
929 return;
930 }
931 WMA_LOGD("%s: set dtim_period %d", __func__,
932 dtim_params->dtim_period);
933 iface->dtimPeriod = dtim_params->dtim_period;
934
935}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800936
937/**
938 * wma_process_cli_set_cmd() - set parameters to fw
939 * @wma: wma handle
940 * @privcmd: command
941 *
942 * Return: none
943 */
944static void wma_process_cli_set_cmd(tp_wma_handle wma,
945 wma_cli_set_cmd_t *privcmd)
946{
Govind Singhd76a5b02016-03-08 15:12:14 +0530947 int vid = privcmd->param_vdev_id, pps_val = 0;
948 QDF_STATUS ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800949 struct wma_txrx_node *intr = wma->interfaces;
Jeff Johnson9f18aa72018-12-02 12:05:12 -0800950 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800951 struct qpower_params *qparams = &intr[vid].config.qpower_params;
Govind Singhd76a5b02016-03-08 15:12:14 +0530952 struct pdev_params pdev_param;
Leo Chang96464902016-10-28 11:10:54 -0700953 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Arunk Khandavalli2462f462018-01-25 14:41:02 +0530954 struct target_psoc_info *tgt_hdl;
Kiran Kumar Lokere9f881ae2018-03-07 18:59:30 -0800955 struct sir_set_tx_rx_aggregation_size aggr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800956
Jeff Johnsonadba3962017-09-18 08:12:35 -0700957 WMA_LOGD("wmihandle %pK", wma->wmi_handle);
Arif Hussain0e246802018-05-01 18:13:44 -0700958 qdf_mem_zero(&aggr, sizeof(aggr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800959
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -0700960 if (!mac) {
Jeff Johnsonfe8dc692018-11-22 08:45:13 -0800961 WMA_LOGE("%s: Failed to get mac", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800962 return;
963 }
964
Arunk Khandavalli2462f462018-01-25 14:41:02 +0530965 tgt_hdl = wlan_psoc_get_tgt_if_handle(wma->psoc);
966 if (!tgt_hdl) {
967 WMA_LOGE("%s: target psoc info is NULL", __func__);
968 return;
969 }
970
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800971 if (privcmd->param_id >= WMI_CMDID_MAX) {
972 /*
973 * This configuration setting is not done using any wmi
974 * command, call appropriate handler.
975 */
976 if (wma_set_priv_cfg(wma, privcmd))
977 WMA_LOGE("Failed to set wma priv congiuration");
978 return;
979 }
980
981 switch (privcmd->param_vp_dev) {
982 case VDEV_CMD:
Pragaspathi Thilagarajf81a8f02018-08-15 21:44:07 +0530983 if (!wma_is_vdev_valid(privcmd->param_vdev_id)) {
Bhargav Shaha89d3b42016-04-20 13:04:56 +0530984 WMA_LOGE("%s Vdev id is not valid", __func__);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700985 return;
Bhargav Shaha89d3b42016-04-20 13:04:56 +0530986 }
987
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800988 WMA_LOGD("vdev id %d pid %d pval %d", privcmd->param_vdev_id,
989 privcmd->param_id, privcmd->param_value);
Govind Singhd76a5b02016-03-08 15:12:14 +0530990 ret = wma_vdev_set_param(wma->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800991 privcmd->param_vdev_id,
992 privcmd->param_id,
993 privcmd->param_value);
Govind Singhd76a5b02016-03-08 15:12:14 +0530994 if (QDF_IS_STATUS_ERROR(ret)) {
995 WMA_LOGE("wma_vdev_set_param failed ret %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800996 ret);
997 return;
998 }
999 break;
1000 case PDEV_CMD:
1001 WMA_LOGD("pdev pid %d pval %d", privcmd->param_id,
1002 privcmd->param_value);
1003 if ((privcmd->param_id == WMI_PDEV_PARAM_RX_CHAIN_MASK) ||
1004 (privcmd->param_id == WMI_PDEV_PARAM_TX_CHAIN_MASK)) {
Jiachao Wu08719b02017-07-05 13:05:34 +08001005 if (QDF_STATUS_SUCCESS !=
1006 wma_check_txrx_chainmask(
Arunk Khandavalli2462f462018-01-25 14:41:02 +05301007 target_if_get_num_rf_chains(tgt_hdl),
Jiachao Wu08719b02017-07-05 13:05:34 +08001008 privcmd->param_value)) {
1009 WMA_LOGD("Chainmask value is invalid");
1010 return;
1011 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001012 }
Govind Singhd76a5b02016-03-08 15:12:14 +05301013 pdev_param.param_id = privcmd->param_id;
1014 pdev_param.param_value = privcmd->param_value;
1015 ret = wmi_unified_pdev_param_send(wma->wmi_handle,
1016 &pdev_param,
1017 WMA_WILDCARD_PDEV_ID);
1018 if (QDF_IS_STATUS_ERROR(ret)) {
1019 WMA_LOGE("wma_vdev_set_param failed ret %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001020 ret);
1021 return;
1022 }
1023 break;
1024 case GEN_CMD:
1025 {
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08001026 struct cdp_vdev *vdev = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001027 struct wma_txrx_node *intr = wma->interfaces;
1028
1029 vdev = wma_find_vdev_by_id(wma, privcmd->param_vdev_id);
1030 if (!vdev) {
1031 WMA_LOGE("%s:Invalid vdev handle", __func__);
1032 return;
1033 }
1034
1035 WMA_LOGD("gen pid %d pval %d", privcmd->param_id,
1036 privcmd->param_value);
1037
1038 switch (privcmd->param_id) {
Arif Hussain0e246802018-05-01 18:13:44 -07001039 case GEN_VDEV_PARAM_AMSDU:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001040 case GEN_VDEV_PARAM_AMPDU:
Lin Baic1351142018-05-17 11:50:01 +08001041 if (!soc) {
1042 WMA_LOGE("%s:SOC context is NULL", __func__);
1043 return;
1044 }
1045
1046 if (privcmd->param_id == GEN_VDEV_PARAM_AMPDU) {
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05301047 ret = cdp_aggr_cfg(soc, vdev,
1048 privcmd->param_value, 0);
1049 if (ret)
1050 WMA_LOGE("cdp_aggr_cfg set ampdu failed ret %d",
1051 ret);
1052 else
1053 intr[privcmd->param_vdev_id].config.
1054 ampdu = privcmd->param_value;
Arif Hussain0e246802018-05-01 18:13:44 -07001055
Lin Baic1351142018-05-17 11:50:01 +08001056 aggr.aggr_type =
1057 WMI_VDEV_CUSTOM_AGGR_TYPE_AMPDU;
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05301058 } else {
Lin Baic1351142018-05-17 11:50:01 +08001059 aggr.aggr_type =
1060 WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU;
1061 }
1062
1063 aggr.vdev_id = vid;
1064 aggr.tx_aggregation_size = privcmd->param_value;
1065 aggr.rx_aggregation_size = privcmd->param_value;
1066
1067 ret = wma_set_tx_rx_aggregation_size(&aggr);
1068 if (QDF_IS_STATUS_ERROR(ret)) {
1069 WMA_LOGE("set_aggr_size failed ret %d", ret);
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05301070 return;
1071 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001072 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001073 case GEN_PARAM_CRASH_INJECT:
Rajeev Kumar0a9901b2015-12-15 15:59:19 -08001074 if (QDF_GLOBAL_FTM_MODE == cds_get_conparam())
1075 WMA_LOGE("Crash inject not allowed in FTM mode");
1076 else
1077 ret = wma_crash_inject(wma,
1078 privcmd->param_value,
1079 privcmd->param_sec_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001080 break;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07001081 case GEN_PARAM_CAPTURE_TSF:
1082 ret = wma_capture_tsf(wma, privcmd->param_value);
1083 break;
1084 case GEN_PARAM_RESET_TSF_GPIO:
1085 ret = wma_reset_tsf_gpio(wma, privcmd->param_value);
1086 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001087 default:
1088 WMA_LOGE("Invalid param id 0x%x",
1089 privcmd->param_id);
1090 break;
1091 }
1092 break;
1093 }
1094 case DBG_CMD:
1095 WMA_LOGD("dbg pid %d pval %d", privcmd->param_id,
1096 privcmd->param_value);
1097 switch (privcmd->param_id) {
1098 case WMI_DBGLOG_LOG_LEVEL:
1099 ret = dbglog_set_log_lvl(wma->wmi_handle,
1100 privcmd->param_value);
1101 if (ret)
1102 WMA_LOGE("dbglog_set_log_lvl failed ret %d",
1103 ret);
1104 break;
1105 case WMI_DBGLOG_VAP_ENABLE:
1106 ret = dbglog_vap_log_enable(wma->wmi_handle,
1107 privcmd->param_value, true);
1108 if (ret)
1109 WMA_LOGE("dbglog_vap_log_enable failed ret %d",
1110 ret);
1111 break;
1112 case WMI_DBGLOG_VAP_DISABLE:
1113 ret = dbglog_vap_log_enable(wma->wmi_handle,
1114 privcmd->param_value, false);
1115 if (ret)
1116 WMA_LOGE("dbglog_vap_log_enable failed ret %d",
1117 ret);
1118 break;
1119 case WMI_DBGLOG_MODULE_ENABLE:
1120 ret = dbglog_module_log_enable(wma->wmi_handle,
1121 privcmd->param_value, true);
1122 if (ret)
1123 WMA_LOGE("dbglog_module_log_enable failed ret %d",
1124 ret);
1125 break;
1126 case WMI_DBGLOG_MODULE_DISABLE:
1127 ret = dbglog_module_log_enable(wma->wmi_handle,
1128 privcmd->param_value, false);
1129 if (ret)
1130 WMA_LOGE("dbglog_module_log_enable failed ret %d",
1131 ret);
1132 break;
1133 case WMI_DBGLOG_MOD_LOG_LEVEL:
1134 ret = dbglog_set_mod_log_lvl(wma->wmi_handle,
1135 privcmd->param_value);
1136 if (ret)
1137 WMA_LOGE("dbglog_module_log_enable failed ret %d",
1138 ret);
1139 break;
1140 case WMI_DBGLOG_TYPE:
1141 ret = dbglog_parser_type_init(wma->wmi_handle,
1142 privcmd->param_value);
1143 if (ret)
1144 WMA_LOGE("dbglog_parser_type_init failed ret %d",
1145 ret);
1146 break;
1147 case WMI_DBGLOG_REPORT_ENABLE:
1148 ret = dbglog_report_enable(wma->wmi_handle,
1149 privcmd->param_value);
1150 if (ret)
1151 WMA_LOGE("dbglog_report_enable failed ret %d",
1152 ret);
1153 break;
Govind Singha471e5e2015-10-12 17:11:14 +05301154 case WMI_WLAN_PROFILE_TRIGGER_CMDID:
Govind Singhf25a0f12016-03-08 16:09:48 +05301155 ret = wma_unified_fw_profiling_cmd(wma->wmi_handle,
Govind Singha471e5e2015-10-12 17:11:14 +05301156 WMI_WLAN_PROFILE_TRIGGER_CMDID,
1157 privcmd->param_value, 0);
1158 if (ret)
1159 WMA_LOGE("Profile cmd failed for %d ret %d",
1160 WMI_WLAN_PROFILE_TRIGGER_CMDID, ret);
1161 break;
1162 case WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID:
Govind Singhf25a0f12016-03-08 16:09:48 +05301163 ret = wma_unified_fw_profiling_cmd(wma->wmi_handle,
Govind Singha471e5e2015-10-12 17:11:14 +05301164 WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
1165 privcmd->param_value,
1166 privcmd->param_sec_value);
1167 if (ret)
1168 WMA_LOGE("Profile cmd failed for %d ret %d",
1169 WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
1170 ret);
1171 break;
1172 case WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID:
Govind Singhf25a0f12016-03-08 16:09:48 +05301173 ret = wma_unified_fw_profiling_cmd(wma->wmi_handle,
Govind Singha471e5e2015-10-12 17:11:14 +05301174 WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
1175 privcmd->param_value,
1176 privcmd->param_sec_value);
1177 if (ret)
1178 WMA_LOGE("Profile cmd failed for %d ret %d",
1179 WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
1180 ret);
1181 break;
1182 case WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID:
Govind Singhf25a0f12016-03-08 16:09:48 +05301183 ret = wma_unified_fw_profiling_cmd(wma->wmi_handle,
Govind Singha471e5e2015-10-12 17:11:14 +05301184 WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
1185 0, 0);
1186 if (ret)
1187 WMA_LOGE("Profile cmd failed for %d ret %d",
1188 WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
1189 ret);
1190 break;
1191 case WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID:
Govind Singhf25a0f12016-03-08 16:09:48 +05301192 ret = wma_unified_fw_profiling_cmd(wma->wmi_handle,
Govind Singha471e5e2015-10-12 17:11:14 +05301193 WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
1194 0, 0);
1195 if (ret)
1196 WMA_LOGE("Profile cmd failed for %d ret %d",
1197 WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
1198 ret);
1199 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001200 case WMI_PDEV_GREEN_AP_PS_ENABLE_CMDID:
1201 /* Set the Green AP */
Govind Singhd76a5b02016-03-08 15:12:14 +05301202 ret = wmi_unified_green_ap_ps_send
1203 (wma->wmi_handle, privcmd->param_value,
1204 WMA_WILDCARD_PDEV_ID);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001205 if (ret) {
1206 WMA_LOGE("Set GreenAP Failed val %d",
1207 privcmd->param_value);
1208 }
1209 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001210
1211 default:
1212 WMA_LOGE("Invalid param id 0x%x", privcmd->param_id);
1213 break;
1214 }
1215 break;
1216 case PPS_CMD:
1217 WMA_LOGD("dbg pid %d pval %d", privcmd->param_id,
1218 privcmd->param_value);
1219 switch (privcmd->param_id) {
1220
1221 case WMI_VDEV_PPS_PAID_MATCH:
1222 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1223 (PKT_PWR_SAVE_PAID_MATCH & 0xffff);
1224 intr[vid].config.pps_params.paid_match_enable =
1225 privcmd->param_value;
1226 break;
1227 case WMI_VDEV_PPS_GID_MATCH:
1228 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1229 (PKT_PWR_SAVE_GID_MATCH & 0xffff);
1230 intr[vid].config.pps_params.gid_match_enable =
1231 privcmd->param_value;
1232 break;
1233 case WMI_VDEV_PPS_EARLY_TIM_CLEAR:
1234 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1235 (PKT_PWR_SAVE_EARLY_TIM_CLEAR & 0xffff);
1236 intr[vid].config.pps_params.tim_clear =
1237 privcmd->param_value;
1238 break;
1239 case WMI_VDEV_PPS_EARLY_DTIM_CLEAR:
1240 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1241 (PKT_PWR_SAVE_EARLY_DTIM_CLEAR & 0xffff);
1242 intr[vid].config.pps_params.dtim_clear =
1243 privcmd->param_value;
1244 break;
1245 case WMI_VDEV_PPS_EOF_PAD_DELIM:
1246 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1247 (PKT_PWR_SAVE_EOF_PAD_DELIM & 0xffff);
1248 intr[vid].config.pps_params.eof_delim =
1249 privcmd->param_value;
1250 break;
1251 case WMI_VDEV_PPS_MACADDR_MISMATCH:
1252 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1253 (PKT_PWR_SAVE_MACADDR_MISMATCH & 0xffff);
1254 intr[vid].config.pps_params.mac_match =
1255 privcmd->param_value;
1256 break;
1257 case WMI_VDEV_PPS_DELIM_CRC_FAIL:
1258 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1259 (PKT_PWR_SAVE_DELIM_CRC_FAIL & 0xffff);
1260 intr[vid].config.pps_params.delim_fail =
1261 privcmd->param_value;
1262 break;
1263 case WMI_VDEV_PPS_GID_NSTS_ZERO:
1264 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1265 (PKT_PWR_SAVE_GID_NSTS_ZERO & 0xffff);
1266 intr[vid].config.pps_params.nsts_zero =
1267 privcmd->param_value;
1268 break;
1269 case WMI_VDEV_PPS_RSSI_CHECK:
1270 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1271 (PKT_PWR_SAVE_RSSI_CHECK & 0xffff);
1272 intr[vid].config.pps_params.rssi_chk =
1273 privcmd->param_value;
1274 break;
1275 case WMI_VDEV_PPS_5G_EBT:
1276 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1277 (PKT_PWR_SAVE_5G_EBT & 0xffff);
1278 intr[vid].config.pps_params.ebt_5g =
1279 privcmd->param_value;
1280 break;
1281 default:
1282 WMA_LOGE("Invalid param id 0x%x", privcmd->param_id);
1283 break;
1284 }
1285 break;
1286
1287 case QPOWER_CMD:
1288 WMA_LOGD("QPOWER CLI CMD pid %d pval %d", privcmd->param_id,
1289 privcmd->param_value);
1290 switch (privcmd->param_id) {
1291 case WMI_STA_PS_PARAM_QPOWER_PSPOLL_COUNT:
1292 WMA_LOGD("QPOWER CLI CMD:Ps Poll Cnt val %d",
1293 privcmd->param_value);
1294 /* Set the QPower Ps Poll Count */
Govind Singhd76a5b02016-03-08 15:12:14 +05301295 ret = wma_unified_set_sta_ps_param(wma->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001296 vid, WMI_STA_PS_PARAM_QPOWER_PSPOLL_COUNT,
1297 privcmd->param_value);
1298 if (ret) {
1299 WMA_LOGE("Set Q-PsPollCnt Failed vdevId %d val %d",
1300 vid, privcmd->param_value);
1301 } else {
1302 qparams->max_ps_poll_cnt = privcmd->param_value;
1303 }
1304 break;
1305 case WMI_STA_PS_PARAM_QPOWER_MAX_TX_BEFORE_WAKE:
1306 WMA_LOGD("QPOWER CLI CMD:Max Tx Before wake val %d",
1307 privcmd->param_value);
1308 /* Set the QPower Max Tx Before Wake */
Govind Singhd76a5b02016-03-08 15:12:14 +05301309 ret = wma_unified_set_sta_ps_param(wma->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001310 vid, WMI_STA_PS_PARAM_QPOWER_MAX_TX_BEFORE_WAKE,
1311 privcmd->param_value);
1312 if (ret) {
1313 WMA_LOGE("Set Q-MaxTxBefWake Failed vId %d val %d",
1314 vid, privcmd->param_value);
1315 } else {
1316 qparams->max_tx_before_wake =
1317 privcmd->param_value;
1318 }
1319 break;
1320 case WMI_STA_PS_PARAM_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL:
1321 WMA_LOGD("QPOWER CLI CMD:Ps Poll Wake Inv val %d",
1322 privcmd->param_value);
1323 /* Set the QPower Spec Ps Poll Wake Inv */
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001324 ret = wma_unified_set_sta_ps_param(wma->wmi_handle, vid,
1325 WMI_STA_PS_PARAM_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001326 privcmd->param_value);
1327 if (ret) {
1328 WMA_LOGE("Set Q-PsPoll WakeIntv Failed vId %d val %d",
1329 vid, privcmd->param_value);
1330 } else {
1331 qparams->spec_ps_poll_wake_interval =
1332 privcmd->param_value;
1333 }
1334 break;
1335 case WMI_STA_PS_PARAM_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL:
1336 WMA_LOGD("QPOWER CLI CMD:Spec NoData Ps Poll val %d",
1337 privcmd->param_value);
1338 /* Set the QPower Spec NoData PsPoll */
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001339 ret = wma_unified_set_sta_ps_param(wma->wmi_handle, vid,
1340 WMI_STA_PS_PARAM_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001341 privcmd->param_value);
1342 if (ret) {
1343 WMA_LOGE("Set Q-SpecNoDataPsPoll Failed vId %d val %d",
1344 vid, privcmd->param_value);
1345 } else {
1346 qparams->max_spec_nodata_ps_poll =
1347 privcmd->param_value;
1348 }
1349 break;
1350
1351 default:
1352 WMA_LOGE("Invalid param id 0x%x", privcmd->param_id);
1353 break;
1354 }
1355 break;
1356 case GTX_CMD:
1357 WMA_LOGD("vdev id %d pid %d pval %d", privcmd->param_vdev_id,
1358 privcmd->param_id, privcmd->param_value);
1359 switch (privcmd->param_id) {
1360 case WMI_VDEV_PARAM_GTX_HT_MCS:
1361 intr[vid].config.gtx_info.gtxRTMask[0] =
1362 privcmd->param_value;
1363 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1364 privcmd->param_vdev_id,
1365 &intr[vid].config.gtx_info);
1366 break;
1367 case WMI_VDEV_PARAM_GTX_VHT_MCS:
1368 intr[vid].config.gtx_info.gtxRTMask[1] =
1369 privcmd->param_value;
1370 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1371 privcmd->param_vdev_id,
1372 &intr[vid].config.gtx_info);
1373 break;
1374
1375 case WMI_VDEV_PARAM_GTX_USR_CFG:
1376 intr[vid].config.gtx_info.gtxUsrcfg =
1377 privcmd->param_value;
1378 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1379 privcmd->param_vdev_id,
1380 &intr[vid].config.gtx_info);
1381 break;
1382
1383 case WMI_VDEV_PARAM_GTX_THRE:
1384 intr[vid].config.gtx_info.gtxPERThreshold =
1385 privcmd->param_value;
1386 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1387 privcmd->param_vdev_id,
1388 &intr[vid].config.gtx_info);
1389 break;
1390
1391 case WMI_VDEV_PARAM_GTX_MARGIN:
1392 intr[vid].config.gtx_info.gtxPERMargin =
1393 privcmd->param_value;
1394 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1395 privcmd->param_vdev_id,
1396 &intr[vid].config.gtx_info);
1397 break;
1398
1399 case WMI_VDEV_PARAM_GTX_STEP:
1400 intr[vid].config.gtx_info.gtxTPCstep =
1401 privcmd->param_value;
1402 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1403 privcmd->param_vdev_id,
1404 &intr[vid].config.gtx_info);
1405 break;
1406
1407 case WMI_VDEV_PARAM_GTX_MINTPC:
1408 intr[vid].config.gtx_info.gtxTPCMin =
1409 privcmd->param_value;
1410 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1411 privcmd->param_vdev_id,
1412 &intr[vid].config.gtx_info);
1413 break;
1414
1415 case WMI_VDEV_PARAM_GTX_BW_MASK:
1416 intr[vid].config.gtx_info.gtxBWMask =
1417 privcmd->param_value;
1418 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1419 privcmd->param_vdev_id,
1420 &intr[vid].config.gtx_info);
1421 if (ret) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001422 WMA_LOGE("wma_vdev_set_param failed ret %d",
1423 ret);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001424 return;
1425 }
1426 break;
1427 default:
1428 break;
1429 }
1430 break;
1431
1432 default:
1433 WMA_LOGE("Invalid vpdev command id");
1434 }
1435 if (1 == privcmd->param_vp_dev) {
1436 switch (privcmd->param_id) {
1437 case WMI_VDEV_PARAM_NSS:
1438 intr[vid].config.nss = privcmd->param_value;
1439 break;
1440 case WMI_VDEV_PARAM_LDPC:
1441 intr[vid].config.ldpc = privcmd->param_value;
1442 break;
1443 case WMI_VDEV_PARAM_TX_STBC:
1444 intr[vid].config.tx_stbc = privcmd->param_value;
1445 break;
1446 case WMI_VDEV_PARAM_RX_STBC:
1447 intr[vid].config.rx_stbc = privcmd->param_value;
1448 break;
1449 case WMI_VDEV_PARAM_SGI:
1450 intr[vid].config.shortgi = privcmd->param_value;
1451 break;
1452 case WMI_VDEV_PARAM_ENABLE_RTSCTS:
1453 intr[vid].config.rtscts_en = privcmd->param_value;
1454 break;
1455 case WMI_VDEV_PARAM_CHWIDTH:
1456 intr[vid].config.chwidth = privcmd->param_value;
1457 break;
1458 case WMI_VDEV_PARAM_FIXED_RATE:
1459 intr[vid].config.tx_rate = privcmd->param_value;
1460 break;
1461 case WMI_VDEV_PARAM_EARLY_RX_ADJUST_ENABLE:
1462 intr[vid].config.erx_adjust = privcmd->param_value;
1463 break;
1464 case WMI_VDEV_PARAM_EARLY_RX_TGT_BMISS_NUM:
1465 intr[vid].config.erx_bmiss_num = privcmd->param_value;
1466 break;
1467 case WMI_VDEV_PARAM_EARLY_RX_BMISS_SAMPLE_CYCLE:
1468 intr[vid].config.erx_bmiss_cycle = privcmd->param_value;
1469 break;
1470 case WMI_VDEV_PARAM_EARLY_RX_SLOP_STEP:
1471 intr[vid].config.erx_slop_step = privcmd->param_value;
1472 break;
1473 case WMI_VDEV_PARAM_EARLY_RX_INIT_SLOP:
1474 intr[vid].config.erx_init_slop = privcmd->param_value;
1475 break;
1476 case WMI_VDEV_PARAM_EARLY_RX_ADJUST_PAUSE:
1477 intr[vid].config.erx_adj_pause = privcmd->param_value;
1478 break;
1479 case WMI_VDEV_PARAM_EARLY_RX_DRIFT_SAMPLE:
1480 intr[vid].config.erx_dri_sample = privcmd->param_value;
1481 break;
Krishna Kumaar Natarajan1a71ec72017-03-23 12:26:31 -07001482 case WMI_VDEV_PARAM_HE_DCM:
Krishna Kumaar Natarajan150cd012017-03-23 12:29:10 -07001483 case WMI_VDEV_PARAM_HE_RANGE_EXT:
Krishna Kumaar Natarajan1a71ec72017-03-23 12:26:31 -07001484 wma_set_he_vdev_param(&intr[vid], privcmd->param_id,
1485 privcmd->param_value);
1486 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001487 default:
Yeshwanth Sriram Guntukacbe61442018-08-23 18:08:44 +05301488 WMA_LOGD("Invalid wma_cli_set vdev command/Not yet implemented 0x%x",
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001489 privcmd->param_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001490 break;
1491 }
1492 } else if (2 == privcmd->param_vp_dev) {
1493 switch (privcmd->param_id) {
1494 case WMI_PDEV_PARAM_ANI_ENABLE:
1495 wma->pdevconfig.ani_enable = privcmd->param_value;
1496 break;
1497 case WMI_PDEV_PARAM_ANI_POLL_PERIOD:
1498 wma->pdevconfig.ani_poll_len = privcmd->param_value;
1499 break;
1500 case WMI_PDEV_PARAM_ANI_LISTEN_PERIOD:
1501 wma->pdevconfig.ani_listen_len = privcmd->param_value;
1502 break;
1503 case WMI_PDEV_PARAM_ANI_OFDM_LEVEL:
1504 wma->pdevconfig.ani_ofdm_level = privcmd->param_value;
1505 break;
1506 case WMI_PDEV_PARAM_ANI_CCK_LEVEL:
1507 wma->pdevconfig.ani_cck_level = privcmd->param_value;
1508 break;
1509 case WMI_PDEV_PARAM_DYNAMIC_BW:
1510 wma->pdevconfig.cwmenable = privcmd->param_value;
1511 break;
1512 case WMI_PDEV_PARAM_CTS_CBW:
1513 wma->pdevconfig.cts_cbw = privcmd->param_value;
1514 break;
1515 case WMI_PDEV_PARAM_TX_CHAIN_MASK:
1516 wma->pdevconfig.txchainmask = privcmd->param_value;
1517 break;
1518 case WMI_PDEV_PARAM_RX_CHAIN_MASK:
1519 wma->pdevconfig.rxchainmask = privcmd->param_value;
1520 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001521 case WMI_PDEV_PARAM_TXPOWER_LIMIT2G:
1522 wma->pdevconfig.txpow2g = privcmd->param_value;
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08001523 if ((mac->mlme_cfg->gen.band_capability ==
Varun Reddy Yeturua48bc412017-11-17 15:33:35 -08001524 BAND_ALL) ||
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08001525 (mac->mlme_cfg->gen.band_capability ==
Wu Gao5f764082019-01-04 15:54:38 +08001526 BAND_2G))
1527 mac->mlme_cfg->power.current_tx_power_level =
1528 (uint8_t)privcmd->param_value;
1529 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001530 WMA_LOGE("Current band is not 2G");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001531 break;
1532 case WMI_PDEV_PARAM_TXPOWER_LIMIT5G:
1533 wma->pdevconfig.txpow5g = privcmd->param_value;
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08001534 if ((mac->mlme_cfg->gen.band_capability ==
Varun Reddy Yeturua48bc412017-11-17 15:33:35 -08001535 BAND_ALL) ||
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08001536 (mac->mlme_cfg->gen.band_capability ==
Wu Gao5f764082019-01-04 15:54:38 +08001537 BAND_5G))
1538 mac->mlme_cfg->power.current_tx_power_level =
1539 (uint8_t)privcmd->param_value;
1540 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001541 WMA_LOGE("Current band is not 5G");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001542 break;
1543 default:
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07001544 WMA_LOGD("Invalid wma_cli_set pdev command/Not yet implemented 0x%x",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001545 privcmd->param_id);
1546 break;
1547 }
1548 } else if (5 == privcmd->param_vp_dev) {
Govind Singhd76a5b02016-03-08 15:12:14 +05301549 ret = wma_vdev_set_param(wma->wmi_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001550 privcmd->param_vdev_id,
1551 WMI_VDEV_PARAM_PACKET_POWERSAVE,
1552 pps_val);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001553 if (ret)
1554 WMA_LOGE("Failed to send wmi packet power save cmd");
1555 else
1556 WMA_LOGD("Sent packet power save cmd %d value %x to target",
1557 privcmd->param_id, pps_val);
1558 }
1559}
1560
Dustin Brown05557182017-10-12 14:44:49 -07001561uint32_t wma_critical_events_in_flight(void)
1562{
1563 t_wma_handle *wma;
1564
1565 wma = cds_get_context(QDF_MODULE_ID_WMA);
1566 if (!wma)
1567 return 0;
1568
1569 return qdf_atomic_read(&wma->critical_events_in_flight);
1570}
1571
1572static bool wma_event_is_critical(uint32_t event_id)
1573{
1574 switch (event_id) {
1575 case WMI_ROAM_SYNCH_EVENTID:
1576 return true;
1577 default:
1578 return false;
1579 }
1580}
1581
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001582/**
1583 * wma_process_fw_event() - process any fw event
1584 * @wma: wma handle
1585 * @buf: fw event buffer
1586 *
1587 * This function process any fw event to serialize it through mc thread.
1588 *
1589 * Return: none
1590 */
1591static int wma_process_fw_event(tp_wma_handle wma,
1592 wma_process_fw_event_params *buf)
1593{
1594 struct wmi_unified *wmi_handle = (struct wmi_unified *)buf->wmi_handle;
Dustin Brown05557182017-10-12 14:44:49 -07001595 uint32_t event_id = WMI_GET_FIELD(qdf_nbuf_data(buf->evt_buf),
1596 WMI_CMD_HDR, COMMANDID);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001597
1598 wmi_process_fw_event(wmi_handle, buf->evt_buf);
Dustin Brown05557182017-10-12 14:44:49 -07001599
1600 if (wma_event_is_critical(event_id))
1601 qdf_atomic_dec(&wma->critical_events_in_flight);
1602
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001603 return 0;
1604}
1605
1606/**
Govind Singhd76a5b02016-03-08 15:12:14 +05301607 * wmi_process_fw_event_tasklet_ctx() - process in tasklet context
1608 * @ctx: handle to wmi
1609 * @ev: wmi event buffer
1610 *
1611 * Event process by below function will be in tasket context,
1612 * need to use this method only for time sensitive functions.
1613 *
1614 * Return: none
1615 */
1616static int wma_process_fw_event_tasklet_ctx(void *ctx, void *ev)
1617{
1618 wmi_process_fw_event(ctx, ev);
1619
1620 return 0;
1621}
1622
1623/**
Manjeet Singhf82ed072016-07-08 11:40:00 +05301624 * wma_process_hal_pwr_dbg_cmd() - send hal pwr dbg cmd to fw.
1625 * @handle: wma handle
1626 * @sir_pwr_dbg_params: unit test command
1627 *
1628 * This function send unit test command to fw.
1629 *
1630 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_** on error
1631 */
1632QDF_STATUS wma_process_hal_pwr_dbg_cmd(WMA_HANDLE handle,
1633 struct sir_mac_pwr_dbg_cmd *
1634 sir_pwr_dbg_params)
1635{
1636 tp_wma_handle wma_handle = (tp_wma_handle)handle;
1637 int i;
1638 struct wmi_power_dbg_params wmi_pwr_dbg_params;
1639 QDF_STATUS status;
1640
1641 if (!sir_pwr_dbg_params) {
1642 WMA_LOGE("%s: sir_pwr_dbg_params is null", __func__);
1643 return QDF_STATUS_E_INVAL;
1644 }
1645 wmi_pwr_dbg_params.module_id = sir_pwr_dbg_params->module_id;
1646 wmi_pwr_dbg_params.pdev_id = sir_pwr_dbg_params->pdev_id;
1647 wmi_pwr_dbg_params.num_args = sir_pwr_dbg_params->num_args;
1648
1649 for (i = 0; i < wmi_pwr_dbg_params.num_args; i++)
1650 wmi_pwr_dbg_params.args[i] = sir_pwr_dbg_params->args[i];
1651
1652 status = wmi_unified_send_power_dbg_cmd(wma_handle->wmi_handle,
1653 &wmi_pwr_dbg_params);
1654
1655 return status;
1656}
1657
Houston Hoffmanb6084f12017-05-30 19:24:07 -07001658static void wma_discard_fw_event(struct scheduler_msg *msg)
1659{
Will Huang9323e852018-02-02 17:55:15 +08001660 if (!msg->bodyptr)
1661 return;
1662
Houston Hoffmanb6084f12017-05-30 19:24:07 -07001663 switch (msg->type) {
1664 case WMA_PROCESS_FW_EVENT:
1665 qdf_nbuf_free(((wma_process_fw_event_params *)msg->bodyptr)
1666 ->evt_buf);
1667 break;
Abhishek Singhcaf6a652017-07-06 17:35:42 +05301668 case WMA_SET_LINK_STATE:
1669 qdf_mem_free(((tpLinkStateParams) msg->bodyptr)->callbackArg);
1670 break;
Houston Hoffmanb6084f12017-05-30 19:24:07 -07001671 }
Will Huang9323e852018-02-02 17:55:15 +08001672
1673 qdf_mem_free(msg->bodyptr);
Houston Hoffmanb6084f12017-05-30 19:24:07 -07001674 msg->bodyptr = NULL;
1675 msg->bodyval = 0;
1676 msg->type = 0;
1677}
1678
gaurank kathpalia748c7272018-10-24 22:05:15 +05301679QDF_STATUS
1680wma_vdev_nss_chain_params_send(uint8_t vdev_id,
1681 struct wlan_mlme_nss_chains *user_cfg)
1682{
1683 tp_wma_handle wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
gaurank kathpalia2fc3b892018-11-14 13:48:44 +05301684 struct vdev_nss_chains vdev_user_cfg;
gaurank kathpalia748c7272018-10-24 22:05:15 +05301685 if (!wma_handle) {
1686 WMA_LOGE("%s: wma_handle is NULL", __func__);
1687 return QDF_STATUS_E_FAILURE;
1688 }
1689
gaurank kathpalia2fc3b892018-11-14 13:48:44 +05301690 vdev_user_cfg.disable_rx_mrc[NSS_CHAINS_BAND_2GHZ] =
1691 user_cfg->disable_rx_mrc[NSS_CHAINS_BAND_2GHZ];
1692 vdev_user_cfg.disable_tx_mrc[NSS_CHAINS_BAND_2GHZ] =
1693 user_cfg->disable_tx_mrc[NSS_CHAINS_BAND_2GHZ];
1694 vdev_user_cfg.disable_rx_mrc[NSS_CHAINS_BAND_5GHZ] =
1695 user_cfg->disable_rx_mrc[NSS_CHAINS_BAND_5GHZ];
1696 vdev_user_cfg.disable_tx_mrc[NSS_CHAINS_BAND_5GHZ] =
1697 user_cfg->disable_tx_mrc[NSS_CHAINS_BAND_5GHZ];
1698
1699 vdev_user_cfg.num_rx_chains[NSS_CHAINS_BAND_2GHZ]
1700 = user_cfg->num_rx_chains[NSS_CHAINS_BAND_2GHZ];
1701 vdev_user_cfg.num_tx_chains[NSS_CHAINS_BAND_2GHZ]
1702 = user_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ];
1703 vdev_user_cfg.num_rx_chains[NSS_CHAINS_BAND_5GHZ] =
1704 user_cfg->num_rx_chains[NSS_CHAINS_BAND_5GHZ];
1705 vdev_user_cfg.num_tx_chains[NSS_CHAINS_BAND_5GHZ] =
1706 user_cfg->num_tx_chains[NSS_CHAINS_BAND_5GHZ];
1707
1708 vdev_user_cfg.rx_nss[NSS_CHAINS_BAND_2GHZ] =
1709 user_cfg->rx_nss[NSS_CHAINS_BAND_2GHZ];
1710 vdev_user_cfg.tx_nss[NSS_CHAINS_BAND_2GHZ] =
1711 user_cfg->tx_nss[NSS_CHAINS_BAND_2GHZ];
1712 vdev_user_cfg.rx_nss[NSS_CHAINS_BAND_5GHZ] =
1713 user_cfg->rx_nss[NSS_CHAINS_BAND_5GHZ];
1714 vdev_user_cfg.tx_nss[NSS_CHAINS_BAND_5GHZ] =
1715 user_cfg->tx_nss[NSS_CHAINS_BAND_5GHZ];
1716
1717 vdev_user_cfg.num_tx_chains_11a = user_cfg->num_tx_chains_11a;
1718 vdev_user_cfg.num_tx_chains_11b = user_cfg->num_tx_chains_11b;
1719 vdev_user_cfg.num_tx_chains_11g = user_cfg->num_tx_chains_11g;
1720
gaurank kathpalia748c7272018-10-24 22:05:15 +05301721 return wmi_unified_vdev_nss_chain_params_send(wma_handle->wmi_handle,
1722 vdev_id,
gaurank kathpalia2fc3b892018-11-14 13:48:44 +05301723 &vdev_user_cfg);
gaurank kathpalia748c7272018-10-24 22:05:15 +05301724}
1725
Manjeet Singhf82ed072016-07-08 11:40:00 +05301726/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001727 * wma_process_fw_event_handler() - common event handler to serialize
1728 * event processing through mc_thread
Govind Singhd76a5b02016-03-08 15:12:14 +05301729 * @ctx: wmi context
1730 * @ev: event buffer
1731 * @rx_ctx: rx execution context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001732 *
1733 * Return: 0 on success, errno on failure
1734 */
Govind Singhd76a5b02016-03-08 15:12:14 +05301735static int wma_process_fw_event_mc_thread_ctx(void *ctx, void *ev)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001736{
1737 wma_process_fw_event_params *params_buf;
Rajeev Kumarb60abe42017-01-21 15:39:31 -08001738 struct scheduler_msg cds_msg = { 0 };
Dustin Brown05557182017-10-12 14:44:49 -07001739 tp_wma_handle wma;
1740 uint32_t event_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001741
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301742 params_buf = qdf_mem_malloc(sizeof(wma_process_fw_event_params));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001743 if (!params_buf) {
Govind Singhd76a5b02016-03-08 15:12:14 +05301744 qdf_nbuf_free(ev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001745 return -ENOMEM;
1746 }
1747
Govind Singhd76a5b02016-03-08 15:12:14 +05301748 params_buf->wmi_handle = (struct wmi_unified *)ctx;
Amar Singhal0cb9a5c2018-07-18 12:31:06 -07001749 params_buf->evt_buf = ev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001750
Dustin Brown05557182017-10-12 14:44:49 -07001751 wma = cds_get_context(QDF_MODULE_ID_WMA);
1752 event_id = WMI_GET_FIELD(qdf_nbuf_data(params_buf->evt_buf),
1753 WMI_CMD_HDR, COMMANDID);
1754 if (wma && wma_event_is_critical(event_id))
1755 qdf_atomic_inc(&wma->critical_events_in_flight);
1756
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001757 cds_msg.type = WMA_PROCESS_FW_EVENT;
1758 cds_msg.bodyptr = params_buf;
1759 cds_msg.bodyval = 0;
Houston Hoffmanb6084f12017-05-30 19:24:07 -07001760 cds_msg.flush_callback = wma_discard_fw_event;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001761
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301762 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia00861f02018-08-28 19:16:12 +05301763 scheduler_post_message(QDF_MODULE_ID_WMA,
1764 QDF_MODULE_ID_WMA,
1765 QDF_MODULE_ID_WMA, &cds_msg)) {
Govind Singhd76a5b02016-03-08 15:12:14 +05301766 qdf_nbuf_free(ev);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301767 qdf_mem_free(params_buf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001768 return -EFAULT;
1769 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001770 return 0;
1771
1772}
1773
Harprit Chhabada3f4c0582018-12-26 12:24:53 -08001774int wma_process_fw_event_handler(ol_scn_t scn_handle, void *evt_buf,
1775 uint8_t rx_ctx)
Govind Singhd76a5b02016-03-08 15:12:14 +05301776{
1777 int err = 0;
Harprit Chhabada3f4c0582018-12-26 12:24:53 -08001778 struct wmi_unified *wmi_handle;
Amar Singhal4228c392018-06-26 15:09:58 -07001779 struct wlan_objmgr_psoc *psoc;
1780 struct target_psoc_info *tgt_hdl;
Amar Singhal4228c392018-06-26 15:09:58 -07001781 bool is_wmi_ready = false;
1782
Amar Singhal4228c392018-06-26 15:09:58 -07001783 psoc = target_if_get_psoc_from_scn_hdl(scn_handle);
1784 if (!psoc) {
1785 WMA_LOGE("psoc is null");
1786 return err;
1787 }
1788
Harprit Chhabada3f4c0582018-12-26 12:24:53 -08001789 wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
1790 if (!wmi_handle) {
1791 WMA_LOGE("wmi_handle is null");
1792 return err;
1793 }
1794
Amar Singhal0cb9a5c2018-07-18 12:31:06 -07001795 tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
Amar Singhal4228c392018-06-26 15:09:58 -07001796 if (!tgt_hdl) {
1797 WMA_LOGE("target_psoc_info is null");
1798 return err;
1799 }
1800
1801 is_wmi_ready = target_psoc_get_wmi_ready(tgt_hdl);
1802 if (!is_wmi_ready) {
Amar Singhal0cb9a5c2018-07-18 12:31:06 -07001803 WMA_LOGD("fw event recvd before ready event processed");
1804 WMA_LOGD("therefore use worker thread");
Harprit Chhabada3f4c0582018-12-26 12:24:53 -08001805 wmi_process_fw_event_worker_thread_ctx(wmi_handle, evt_buf);
Amar Singhal4228c392018-06-26 15:09:58 -07001806 return err;
1807 }
Govind Singhd76a5b02016-03-08 15:12:14 +05301808
1809 if (rx_ctx == WMA_RX_SERIALIZER_CTX) {
Harprit Chhabada3f4c0582018-12-26 12:24:53 -08001810 err = wma_process_fw_event_mc_thread_ctx(wmi_handle, evt_buf);
Govind Singhd76a5b02016-03-08 15:12:14 +05301811 } else if (rx_ctx == WMA_RX_TASKLET_CTX) {
Harprit Chhabada3f4c0582018-12-26 12:24:53 -08001812 wma_process_fw_event_tasklet_ctx(wmi_handle, evt_buf);
Govind Singhd76a5b02016-03-08 15:12:14 +05301813 } else {
1814 WMA_LOGE("%s: invalid wmi event execution context", __func__);
Amar Singhal4228c392018-06-26 15:09:58 -07001815 qdf_nbuf_free(evt_buf);
Govind Singhd76a5b02016-03-08 15:12:14 +05301816 }
1817
1818 return err;
1819}
1820
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001821/**
guangde4853c402019-05-06 15:54:04 +08001822 * wma_antenna_isolation_event_handler() - antenna isolation event handler
1823 * @handle: wma handle
1824 * @param: event data
1825 * @len: length
1826 *
1827 * Return: 0 for success or error code
1828 */
1829static int wma_antenna_isolation_event_handler(void *handle,
1830 u8 *param,
1831 u32 len)
1832{
1833 struct scheduler_msg cds_msg = {0};
1834 wmi_coex_report_isolation_event_fixed_param *event;
1835 WMI_COEX_REPORT_ANTENNA_ISOLATION_EVENTID_param_tlvs *param_buf;
1836 struct sir_isolation_resp *pisolation;
1837 struct mac_context *mac = NULL;
1838
1839 WMA_LOGD("%s: handle %pK param %pK len %d", __func__,
1840 handle, param, len);
1841
1842 mac = (struct mac_context *)cds_get_context(QDF_MODULE_ID_PE);
1843 if (!mac) {
1844 WMA_LOGE("%s: Invalid mac context", __func__);
1845 return -EINVAL;
1846 }
1847
1848 pisolation = qdf_mem_malloc(sizeof(*pisolation));
1849 if (!pisolation)
1850 return 0;
1851
1852 param_buf =
1853 (WMI_COEX_REPORT_ANTENNA_ISOLATION_EVENTID_param_tlvs *)param;
1854 if (!param_buf) {
1855 WMA_LOGE("%s: Invalid isolation event", __func__);
1856 return -EINVAL;
1857 }
1858 event = param_buf->fixed_param;
1859 pisolation->isolation_chain0 = event->isolation_chain0;
1860 pisolation->isolation_chain1 = event->isolation_chain1;
1861 pisolation->isolation_chain2 = event->isolation_chain2;
1862 pisolation->isolation_chain3 = event->isolation_chain3;
1863
1864 WMA_LOGD("%s: chain1 %d chain2 %d chain3 %d chain4 %d", __func__,
1865 pisolation->isolation_chain0, pisolation->isolation_chain1,
1866 pisolation->isolation_chain2, pisolation->isolation_chain3);
1867
1868 cds_msg.type = eWNI_SME_ANTENNA_ISOLATION_RSP;
1869 cds_msg.bodyptr = pisolation;
1870 cds_msg.bodyval = 0;
1871 if (QDF_STATUS_SUCCESS !=
1872 scheduler_post_message(QDF_MODULE_ID_WMA,
1873 QDF_MODULE_ID_SME,
1874 QDF_MODULE_ID_SME, &cds_msg)) {
1875 WMA_LOGE("%s: could not post peer info rsp msg to SME",
1876 __func__);
1877 /* free the mem and return */
1878 qdf_mem_free(pisolation);
1879 }
1880
1881 return 0;
1882}
1883
1884/**
Komal Seelam02d09342016-02-23 18:03:19 +05301885 * wma_init_max_no_of_peers - API to initialize wma configuration params
1886 * @wma_handle: WMA Handle
1887 * @max_peers: Max Peers supported
1888 *
1889 * Return: void
1890 */
Rachit Kankane0106e382018-05-16 18:59:28 +05301891static uint8_t wma_init_max_no_of_peers(tp_wma_handle wma_handle,
Komal Seelam02d09342016-02-23 18:03:19 +05301892 uint16_t max_peers)
1893{
1894 struct wma_ini_config *cfg = wma_get_ini_handle(wma_handle);
Rachit Kankane0106e382018-05-16 18:59:28 +05301895 struct hif_opaque_softc *scn = cds_get_context(QDF_MODULE_ID_HIF);
1896 uint32_t tgt_version = hif_get_target_info_handle(scn)->target_version;
1897 uint8_t max_no_of_peers;
1898 uint8_t max_supported_peers = (tgt_version == AR6320_REV1_1_VERSION) ?
1899 MAX_SUPPORTED_PEERS_REV1_1 : MAX_SUPPORTED_PEERS_REV1_3;
Komal Seelam02d09342016-02-23 18:03:19 +05301900
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07001901 if (!cfg) {
Naveen Rawat35804772016-06-27 15:40:28 -07001902 WMA_LOGE("%s: NULL WMA ini handle", __func__);
Rachit Kankane0106e382018-05-16 18:59:28 +05301903 return 0;
Naveen Rawat35804772016-06-27 15:40:28 -07001904 }
1905
Rachit Kankane0106e382018-05-16 18:59:28 +05301906 max_no_of_peers = (max_peers > max_supported_peers) ?
1907 max_supported_peers : max_peers;
1908 cfg->max_no_of_peers = max_no_of_peers;
1909 return max_no_of_peers;
Komal Seelam02d09342016-02-23 18:03:19 +05301910}
1911
Prashanth Bhattae675ca72016-10-20 18:42:37 -07001912/**
Manikandan Mohanb0932ab2017-02-12 16:30:55 -08001913 * wma_cleanup_vdev_resp_queue() - cleanup vdev response queue
1914 * @wma: wma handle
1915 *
1916 * Return: none
1917 */
1918static void wma_cleanup_vdev_resp_queue(tp_wma_handle wma)
1919{
1920 struct wma_target_req *req_msg = NULL;
1921 qdf_list_node_t *node1 = NULL;
Manikandan Mohanb0932ab2017-02-12 16:30:55 -08001922
1923 qdf_spin_lock_bh(&wma->vdev_respq_lock);
1924 if (!qdf_list_size(&wma->vdev_resp_queue)) {
1925 qdf_spin_unlock_bh(&wma->vdev_respq_lock);
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08001926 WMA_LOGD(FL("request queue maybe empty"));
Manikandan Mohanb0932ab2017-02-12 16:30:55 -08001927 return;
1928 }
1929
Sandeep Puligilla5ac6bd22017-10-17 12:33:56 -07001930 WMA_LOGD(FL("Cleaning up vdev resp queue"));
1931
Wu Gao30f65eb2017-08-09 19:56:10 +08001932 /* peek front, and then cleanup it in wma_vdev_resp_timer */
1933 while (qdf_list_peek_front(&wma->vdev_resp_queue, &node1) ==
Manikandan Mohanb0932ab2017-02-12 16:30:55 -08001934 QDF_STATUS_SUCCESS) {
1935 req_msg = qdf_container_of(node1, struct wma_target_req, node);
Manikandan Mohanb0932ab2017-02-12 16:30:55 -08001936 qdf_spin_unlock_bh(&wma->vdev_respq_lock);
Abhishek Singhc614ec42017-04-25 16:17:34 +05301937 qdf_mc_timer_stop(&req_msg->event_timeout);
1938 wma_vdev_resp_timer(req_msg);
Manikandan Mohanb0932ab2017-02-12 16:30:55 -08001939 qdf_spin_lock_bh(&wma->vdev_respq_lock);
1940 }
1941 qdf_spin_unlock_bh(&wma->vdev_respq_lock);
1942}
1943
1944/**
Abhishek Singhc614ec42017-04-25 16:17:34 +05301945 * wma_cleanup_hold_req() - cleanup hold request queue
1946 * @wma: wma handle
1947 *
1948 * Return: none
1949 */
1950static void wma_cleanup_hold_req(tp_wma_handle wma)
1951{
1952 struct wma_target_req *req_msg = NULL;
1953 qdf_list_node_t *node1 = NULL;
1954
1955 qdf_spin_lock_bh(&wma->wma_hold_req_q_lock);
1956 if (!qdf_list_size(&wma->wma_hold_req_queue)) {
1957 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
1958 WMA_LOGD(FL("request queue is empty"));
1959 return;
1960 }
1961
Wu Gao30f65eb2017-08-09 19:56:10 +08001962 /* peek front, and then cleanup it in wma_hold_req_timer */
Abhishek Singhc614ec42017-04-25 16:17:34 +05301963 while (QDF_STATUS_SUCCESS ==
Wu Gao30f65eb2017-08-09 19:56:10 +08001964 qdf_list_peek_front(&wma->wma_hold_req_queue, &node1)) {
Abhishek Singhc614ec42017-04-25 16:17:34 +05301965 req_msg = qdf_container_of(node1, struct wma_target_req, node);
1966 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
1967 /* Cleanup timeout handler */
1968 qdf_mc_timer_stop(&req_msg->event_timeout);
Abhishek Singhc614ec42017-04-25 16:17:34 +05301969 wma_hold_req_timer(req_msg);
1970 qdf_spin_lock_bh(&wma->wma_hold_req_q_lock);
1971 }
1972 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
1973}
1974
1975/**
Abhishek Singh0ac37442018-05-02 21:07:57 +05301976 * wma_cleanup_vdev_resp_and_hold_req() - cleaunup the vdev resp and hold req
1977 * queue
1978 * @msg :scheduler msg
1979 *
1980 * Return: QDF_STATUS
1981 */
1982static QDF_STATUS
1983wma_cleanup_vdev_resp_and_hold_req(struct scheduler_msg *msg)
1984{
1985 if (!msg || !msg->bodyptr) {
1986 WMA_LOGE(FL("msg or body pointer is NULL"));
1987 return QDF_STATUS_E_INVAL;
1988 }
1989
1990 wma_cleanup_vdev_resp_queue(msg->bodyptr);
1991 wma_cleanup_hold_req(msg->bodyptr);
1992
1993 return QDF_STATUS_SUCCESS;
1994}
1995
1996/**
Prashanth Bhattae675ca72016-10-20 18:42:37 -07001997 * wma_shutdown_notifier_cb - Shutdown notifer call back
1998 * @priv : WMA handle
1999 *
2000 * During recovery, WMA may wait for resume to complete if the crash happens
2001 * while in suspend. This may cause delays in completing the recovery. This call
2002 * back would be called during recovery and the event is completed so that if
2003 * the resume is waiting on FW to respond then it can get out of the wait so
2004 * that recovery thread can start bringing down all the modules.
2005 *
2006 * Return: None
2007 */
2008static void wma_shutdown_notifier_cb(void *priv)
2009{
2010 tp_wma_handle wma_handle = priv;
Abhishek Singh0ac37442018-05-02 21:07:57 +05302011 struct scheduler_msg msg = { 0 };
2012 QDF_STATUS status;
Prashanth Bhattae675ca72016-10-20 18:42:37 -07002013
Wu Gaod7dd6e42018-10-16 17:22:56 +08002014 ucfg_pmo_psoc_wakeup_host_event_received(wma_handle->psoc);
Rajeev Kumar64beb9f2018-10-10 11:23:51 -07002015 wmi_stop(wma_handle->wmi_handle);
Abhishek Singh0ac37442018-05-02 21:07:57 +05302016
2017 msg.bodyptr = priv;
2018 msg.callback = wma_cleanup_vdev_resp_and_hold_req;
gaurank kathpalia00861f02018-08-28 19:16:12 +05302019 status = scheduler_post_message(QDF_MODULE_ID_WMA,
2020 QDF_MODULE_ID_WMA,
2021 QDF_MODULE_ID_TARGET_IF, &msg);
Prashanth Bhattae675ca72016-10-20 18:42:37 -07002022}
2023
Mukul Sharma5ff3c582016-09-12 15:23:35 +05302024struct wma_version_info g_wmi_version_info;
2025
Wen Gong3f003382018-05-14 14:26:37 +08002026#ifdef WLAN_FEATURE_MEMDUMP_ENABLE
Komal Seelam02d09342016-02-23 18:03:19 +05302027/**
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05302028 * wma_state_info_dump() - prints state information of wma layer
2029 * @buf: buffer pointer
2030 * @size: size of buffer to be filled
2031 *
2032 * This function is used to dump state information of wma layer
2033 *
2034 * Return: None
2035 */
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002036#ifdef QCA_SUPPORT_CP_STATS
2037static void wma_state_info_dump(char **buf_ptr, uint16_t *size)
2038{
2039 uint8_t vdev_id;
2040 uint16_t len = 0;
2041 t_wma_handle *wma;
2042 char *buf = *buf_ptr;
2043 struct wma_txrx_node *iface;
2044 struct wake_lock_stats stats;
2045 struct wlan_objmgr_vdev *vdev;
2046
2047 wma = cds_get_context(QDF_MODULE_ID_WMA);
2048 if (!wma) {
2049 WMA_LOGE("%s: WMA context is invald!", __func__);
2050 return;
2051 }
2052
Yeshwanth Sriram Guntukacbe61442018-08-23 18:08:44 +05302053 WMA_LOGD("%s: size of buffer: %d", __func__, *size);
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002054
2055 for (vdev_id = 0; vdev_id < wma->max_bssid; vdev_id++) {
2056 iface = &wma->interfaces[vdev_id];
2057 if (!iface->handle)
2058 continue;
2059
2060 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(wma->psoc,
2061 vdev_id, WLAN_LEGACY_WMA_ID);
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07002062 if (!vdev)
Yeshwanth Sriram Guntuka0e6f4462018-05-07 17:33:43 +05302063 continue;
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002064 ucfg_mc_cp_stats_get_vdev_wake_lock_stats(vdev, &stats);
2065 len += qdf_scnprintf(buf + len, *size - len,
2066 "\n"
2067 "vdev_id %d\n"
2068 "WoW Stats\n"
2069 "\tpno_match %u\n"
2070 "\tpno_complete %u\n"
2071 "\tgscan %u\n"
2072 "\tlow_rssi %u\n"
2073 "\trssi_breach %u\n"
2074 "\tucast %u\n"
2075 "\tbcast %u\n"
2076 "\ticmpv4 %u\n"
2077 "\ticmpv6 %u\n"
2078 "\tipv4_mcast %u\n"
2079 "\tipv6_mcast %u\n"
2080 "\tipv6_mcast_ra %u\n"
2081 "\tipv6_mcast_ns %u\n"
2082 "\tipv6_mcast_na %u\n"
2083 "\toem_response %u\n"
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002084 "dtimPeriod %d\n"
2085 "chanmode %d\n"
2086 "vht_capable %d\n"
2087 "ht_capable %d\n"
2088 "chan_width %d\n"
2089 "vdev_active %d\n"
2090 "vdev_up %d\n"
2091 "aid %d\n"
2092 "rate_flags %d\n"
2093 "nss %d\n"
2094 "tx_power %d\n"
2095 "max_tx_power %d\n"
2096 "nwType %d\n"
2097 "tx_streams %d\n"
2098 "rx_streams %d\n"
Arif Hussain99465632019-04-05 09:52:33 -07002099 "chain_mask %d",
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002100 vdev_id,
2101 stats.pno_match_wake_up_count,
2102 stats.pno_complete_wake_up_count,
2103 stats.gscan_wake_up_count,
2104 stats.low_rssi_wake_up_count,
2105 stats.rssi_breach_wake_up_count,
2106 stats.ucast_wake_up_count,
2107 stats.bcast_wake_up_count,
2108 stats.icmpv4_count,
2109 stats.icmpv6_count,
2110 stats.ipv4_mcast_wake_up_count,
2111 stats.ipv6_mcast_wake_up_count,
2112 stats.ipv6_mcast_ra_stats,
2113 stats.ipv6_mcast_ns_stats,
2114 stats.ipv6_mcast_na_stats,
2115 stats.oem_response_wake_up_count,
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002116 iface->dtimPeriod,
2117 iface->chanmode,
2118 iface->vht_capable,
2119 iface->ht_capable,
2120 iface->chan_width,
2121 iface->vdev_active,
2122 wma_is_vdev_up(vdev_id),
2123 iface->aid,
2124 iface->rate_flags,
2125 iface->nss,
2126 iface->tx_power,
2127 iface->max_tx_power,
2128 iface->nwType,
2129 iface->tx_streams,
2130 iface->rx_streams,
Arif Hussain53937342019-03-08 14:14:06 -08002131 iface->chain_mask);
Yeshwanth Sriram Guntuka0e6f4462018-05-07 17:33:43 +05302132 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID);
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002133 }
2134
2135 *size -= len;
2136 *buf_ptr += len;
2137}
2138#else /* QCA_SUPPORT_CP_STATS */
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05302139static void wma_state_info_dump(char **buf_ptr, uint16_t *size)
2140{
Dustin Brown9d797d62017-01-11 16:39:12 -08002141 t_wma_handle *wma;
2142 struct sir_vdev_wow_stats *stats;
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05302143 uint16_t len = 0;
2144 char *buf = *buf_ptr;
2145 struct wma_txrx_node *iface;
2146 uint8_t vdev_id;
2147
Dustin Brown9d797d62017-01-11 16:39:12 -08002148 wma = cds_get_context(QDF_MODULE_ID_WMA);
2149 if (!wma) {
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05302150 WMA_LOGE("%s: WMA context is invald!", __func__);
2151 return;
2152 }
2153
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07002154 WMA_LOGE("%s: size of buffer: %d", __func__, *size);
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05302155
Dustin Brown9d797d62017-01-11 16:39:12 -08002156 for (vdev_id = 0; vdev_id < wma->max_bssid; vdev_id++) {
2157 iface = &wma->interfaces[vdev_id];
2158 if (!iface->handle)
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05302159 continue;
2160
Dustin Brown9d797d62017-01-11 16:39:12 -08002161 stats = &iface->wow_stats;
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05302162 len += qdf_scnprintf(buf + len, *size - len,
Dustin Brown9d797d62017-01-11 16:39:12 -08002163 "\n"
2164 "vdev_id %d\n"
2165 "WoW Stats\n"
2166 "\tpno_match %u\n"
2167 "\tpno_complete %u\n"
2168 "\tgscan %u\n"
2169 "\tlow_rssi %u\n"
2170 "\trssi_breach %u\n"
2171 "\tucast %u\n"
2172 "\tbcast %u\n"
2173 "\ticmpv4 %u\n"
2174 "\ticmpv6 %u\n"
2175 "\tipv4_mcast %u\n"
2176 "\tipv6_mcast %u\n"
2177 "\tipv6_mcast_ra %u\n"
2178 "\tipv6_mcast_ns %u\n"
2179 "\tipv6_mcast_na %u\n"
2180 "\toem_response %u\n"
Dustin Brown9d797d62017-01-11 16:39:12 -08002181 "dtimPeriod %d\n"
2182 "chanmode %d\n"
2183 "vht_capable %d\n"
2184 "ht_capable %d\n"
2185 "chan_width %d\n"
2186 "vdev_active %d\n"
2187 "vdev_up %d\n"
2188 "aid %d\n"
2189 "rate_flags %d\n"
2190 "nss %d\n"
2191 "tx_power %d\n"
2192 "max_tx_power %d\n"
2193 "nwType %d\n"
2194 "tx_streams %d\n"
2195 "rx_streams %d\n"
Arif Hussain99465632019-04-05 09:52:33 -07002196 "chain_mask %d",
Dustin Brown9d797d62017-01-11 16:39:12 -08002197 vdev_id,
2198 stats->pno_match,
2199 stats->pno_complete,
2200 stats->gscan,
2201 stats->low_rssi,
2202 stats->rssi_breach,
2203 stats->ucast,
2204 stats->bcast,
2205 stats->icmpv4,
2206 stats->icmpv6,
2207 stats->ipv4_mcast,
2208 stats->ipv6_mcast,
2209 stats->ipv6_mcast_ra,
2210 stats->ipv6_mcast_ns,
2211 stats->ipv6_mcast_na,
2212 stats->oem_response,
Dustin Brown9d797d62017-01-11 16:39:12 -08002213 iface->dtimPeriod,
2214 iface->chanmode,
2215 iface->vht_capable,
2216 iface->ht_capable,
2217 iface->chan_width,
2218 iface->vdev_active,
Mukul Sharmaf9047232017-03-02 16:58:56 +05302219 wma_is_vdev_up(vdev_id),
Dustin Brown9d797d62017-01-11 16:39:12 -08002220 iface->aid,
2221 iface->rate_flags,
2222 iface->nss,
2223 iface->tx_power,
2224 iface->max_tx_power,
2225 iface->nwType,
2226 iface->tx_streams,
2227 iface->rx_streams,
Arif Hussain99465632019-04-05 09:52:33 -07002228 iface->chain_mask);
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05302229 }
2230
2231 *size -= len;
2232 *buf_ptr += len;
2233}
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002234#endif /* QCA_SUPPORT_CP_STATS */
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05302235
2236/**
2237 * wma_register_debug_callback() - registration function for wma layer
2238 * to print wma state information
2239 */
2240static void wma_register_debug_callback(void)
2241{
2242 qdf_register_debug_callback(QDF_MODULE_ID_WMA, &wma_state_info_dump);
2243}
Wen Gong3f003382018-05-14 14:26:37 +08002244#else /* WLAN_FEATURE_MEMDUMP_ENABLE */
Wen Gongaa6d55d2018-04-26 16:33:21 +08002245static void wma_register_debug_callback(void)
2246{
2247}
Wen Gong3f003382018-05-14 14:26:37 +08002248#endif /* WLAN_FEATURE_MEMDUMP_ENABLE */
Frank Liu65b17d92016-11-23 15:58:44 +08002249/**
2250 * wma_register_tx_ops_handler() - register tx_ops of southbound
2251 * @tx_ops: tx_ops pointer in southbound
2252 *
2253 * Return: 0 on success, errno on failure
2254 */
2255static QDF_STATUS
2256wma_register_tx_ops_handler(struct wlan_lmac_if_tx_ops *tx_ops)
2257{
2258 /*
2259 * Assign tx_ops, it's up to UMAC modules to declare and define these
2260 * functions which are used to send wmi command to target.
2261 */
2262
Himanshu Agarwalce716f82016-12-21 19:07:54 +05302263 if (!tx_ops) {
2264 WMA_LOGE("%s: pointer to lmac if tx ops is NULL", __func__);
2265 return QDF_STATUS_E_INVAL;
2266 }
2267
2268 /* mgmt_txrx component's tx ops */
2269 tx_ops->mgmt_txrx_tx_ops.mgmt_tx_send = wma_mgmt_unified_cmd_send;
2270
Sravan Kumar Kairam0fbaefe2018-09-10 16:57:50 +05302271 /* mgmt txrx component nbuf op for nbuf dma unmap */
2272 tx_ops->mgmt_txrx_tx_ops.tx_drain_nbuf_op = wma_mgmt_nbuf_unmap_cb;
2273
Frank Liu65b17d92016-11-23 15:58:44 +08002274 return QDF_STATUS_SUCCESS;
2275}
2276
2277/**
2278 * wma_target_if_open() - Attach UMAC modules' interface with wmi layer
2279 * @wma_handle: wma handle
2280 *
2281 * Separate module defines below functions:
2282 * 1. tgt_wmi_<module>_<action> api sends wmi command, assigned to south bound
2283 * tx_ops function pointers;
2284 * 2. module's south dispatcher handles information from lower layer, assigned
2285 * to south bound rx_ops function pointers;
2286 * 3. wmi event handler deals with wmi event, extracts umac needed information,
2287 * and call rx_ops(module's dispatcher). It executes in tasklet context and
2288 * is up to dispatcher to decide the context to reside in tasklet or in
2289 * thread context.
2290 *
2291 * Return: None
2292 */
2293static void wma_target_if_open(tp_wma_handle wma_handle)
2294{
Selvaraj, Sridhar0672a122016-12-29 16:11:48 +05302295 struct wlan_objmgr_psoc *psoc = wma_handle->psoc;
Frank Liu65b17d92016-11-23 15:58:44 +08002296
2297 if (!psoc)
2298 return;
2299
Mukul Sharmadad267e2017-02-04 13:25:34 +05302300 wlan_global_lmac_if_set_txops_registration_cb(WLAN_DEV_OL,
2301 target_if_register_tx_ops);
2302 wlan_lmac_if_set_umac_txops_registration_cb(
2303 wma_register_tx_ops_handler);
2304 wlan_global_lmac_if_open(psoc);
Frank Liu65b17d92016-11-23 15:58:44 +08002305
Frank Liu65b17d92016-11-23 15:58:44 +08002306}
2307
2308/**
2309 * wma_target_if_close() - Detach UMAC modules' interface with wmi layer
2310 * @wma_handle: wma handle
2311 *
2312 * Return: None
2313 */
2314static void wma_target_if_close(tp_wma_handle wma_handle)
2315{
Selvaraj, Sridhar0672a122016-12-29 16:11:48 +05302316 struct wlan_objmgr_psoc *psoc = wma_handle->psoc;
Frank Liu65b17d92016-11-23 15:58:44 +08002317
2318 if (!psoc)
2319 return;
2320
Mukul Sharmadad267e2017-02-04 13:25:34 +05302321 wlan_global_lmac_if_close(psoc);
Frank Liu65b17d92016-11-23 15:58:44 +08002322}
Frank Liu65b17d92016-11-23 15:58:44 +08002323
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05302324/**
Himanshu Agarwal2228e072018-01-24 17:42:17 +05302325 * wma_get_pdev_from_scn_handle() - API to get pdev from scn handle
2326 * @scn_handle: opaque wma handle
2327 *
2328 * API to get pdev from scn handle
2329 *
2330 * Return: None
2331 */
2332static struct wlan_objmgr_pdev *wma_get_pdev_from_scn_handle(void *scn_handle)
2333{
2334 tp_wma_handle wma_handle;
2335
2336 if (!scn_handle) {
2337 WMA_LOGE("invalid scn handle");
2338 return NULL;
2339 }
2340 wma_handle = (tp_wma_handle)scn_handle;
2341
2342 return wma_handle->pdev;
2343}
2344
Rajeev Kumarda2444c2017-01-10 22:42:07 -08002345/**
2346 * wma_legacy_service_ready_event_handler() - legacy (ext)service ready handler
2347 * @event_id: event_id
2348 * @handle: wma handle
2349 * @event_data: event data
2350 * @length: event length
2351 *
2352 * Return: 0 for success, negative error code for failure
2353 */
2354static int wma_legacy_service_ready_event_handler(uint32_t event_id,
2355 void *handle,
2356 uint8_t *event_data,
2357 uint32_t length)
2358{
Arunk Khandavallia6305a32018-01-25 11:19:18 +05302359 switch (event_id) {
2360 case wmi_service_ready_event_id:
Rajeev Kumarda2444c2017-01-10 22:42:07 -08002361 return wma_rx_service_ready_event(handle, event_data, length);
Arunk Khandavallia6305a32018-01-25 11:19:18 +05302362 case wmi_service_ready_ext_event_id:
Rajeev Kumarda2444c2017-01-10 22:42:07 -08002363 return wma_rx_service_ready_ext_event(handle, event_data,
2364 length);
Arunk Khandavallia6305a32018-01-25 11:19:18 +05302365 case wmi_ready_event_id:
2366 return wma_rx_ready_event(handle, event_data, length);
2367 default:
2368 WMA_LOGE("Legacy callback invoked with invalid event_id:%d",
2369 event_id);
Rajeev Kumarda2444c2017-01-10 22:42:07 -08002370 QDF_BUG(0);
Arunk Khandavallia6305a32018-01-25 11:19:18 +05302371 }
Rajeev Kumarda2444c2017-01-10 22:42:07 -08002372
2373 return 0;
2374}
Mukul Sharmac3e7a782017-02-03 12:16:11 +05302375
2376/**
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002377 * wma_flush_complete_evt_handler() - FW log flush complete event handler
2378 * @handle: WMI handle
2379 * @event: Event recevied from FW
2380 * @len: Length of the event
2381 *
2382 */
2383static int wma_flush_complete_evt_handler(void *handle,
2384 u_int8_t *event,
2385 u_int32_t len)
2386{
2387 QDF_STATUS status;
2388 tp_wma_handle wma = (tp_wma_handle) handle;
2389
2390 WMI_DEBUG_MESG_FLUSH_COMPLETE_EVENTID_param_tlvs *param_buf;
2391 wmi_debug_mesg_flush_complete_fixed_param *wmi_event;
Poddar, Siddarthc2c08142017-09-13 17:49:56 +05302392 wmi_debug_mesg_fw_data_stall_param *data_stall_event;
2393 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
2394 uint8_t *buf_ptr;
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002395 uint32_t reason_code;
2396
2397 param_buf = (WMI_DEBUG_MESG_FLUSH_COMPLETE_EVENTID_param_tlvs *) event;
2398 if (!param_buf) {
2399 WMA_LOGE("Invalid log flush complete event buffer");
2400 return QDF_STATUS_E_FAILURE;
2401 }
2402
2403 wmi_event = param_buf->fixed_param;
2404 reason_code = wmi_event->reserved0;
Rajeev Kumardcce8092018-05-02 15:48:17 -07002405 WMA_LOGD("Received reason code %d from FW", reason_code);
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002406
Poddar, Siddarthc2c08142017-09-13 17:49:56 +05302407 buf_ptr = (uint8_t *)wmi_event;
2408 buf_ptr = buf_ptr + sizeof(wmi_debug_mesg_flush_complete_fixed_param) +
2409 WMI_TLV_HDR_SIZE;
2410 data_stall_event = (wmi_debug_mesg_fw_data_stall_param *) buf_ptr;
2411
2412 if (((data_stall_event->tlv_header & 0xFFFF0000) >> 16 ==
2413 WMITLV_TAG_STRUC_wmi_debug_mesg_fw_data_stall_param)) {
2414 /**
2415 * Log data stall info received from FW:
2416 *
2417 * Possible data stall recovery types:
2418 * WLAN_DBG_DATA_STALL_RECOVERY_CONNECT_DISCONNECT
2419 * WLAN_DBG_DATA_STALL_RECOVERY_CONNECT_MAC_PHY_RESET
2420 * WLAN_DBG_DATA_STALL_RECOVERY_CONNECT_PDR
2421 *
2422 * Possible data stall event types:
2423 * WLAN_DBG_DATA_STALL_VDEV_PAUSE
2424 * WLAN_DBG_DATA_STALL_HWSCHED_CMD_FILTER
2425 * WLAN_DBG_DATA_STALL_HWSCHED_CMD_FLUSH
2426 * WLAN_DBG_DATA_STALL_RX_REFILL_FAILED
2427 * WLAN_DBG_DATA_STALL_RX_FCS_LEN_ERROR
2428 *
2429 * reason_code1:
2430 * The information stored in reason_code1 varies based on the
2431 * data stall type values:
2432 *
2433 * data_stall_type | reason_code1
2434 * -----------------------------------------------------
2435 * HWSCHED_CMD_FLUSH | flush req reason (0-40)
2436 * RX_REFILL_FAILED | ring_id (0-7)
2437 * RX_FCS_LEN_ERROR | exact error type
2438 *
2439 * reasone_code2:
2440 * on which tid/hwq stall happened
2441 *
2442 */
2443 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG,
2444 "Data Stall event:");
2445 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG,
2446 "data_stall_type: %x vdev_id_bitmap: %x reason_code1: %x reason_code2: %x recovery_type: %x ",
2447 data_stall_event->data_stall_type,
2448 data_stall_event->vdev_id_bitmap,
2449 data_stall_event->reason_code1,
2450 data_stall_event->reason_code2,
2451 data_stall_event->recovery_type);
2452
2453 cdp_post_data_stall_event(soc,
2454 DATA_STALL_LOG_INDICATOR_FIRMWARE,
2455 data_stall_event->data_stall_type,
2456 0XFF,
2457 data_stall_event->vdev_id_bitmap,
2458 data_stall_event->recovery_type);
2459 }
2460
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002461 /*
2462 * reason_code = 0; Flush event in response to flush command
2463 * reason_code = other value; Asynchronous flush event for fatal events
2464 */
2465 if (!reason_code && (cds_is_log_report_in_progress() == false)) {
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08002466 WMA_LOGD("Received WMI flush event without sending CMD");
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002467 return -EINVAL;
2468 } else if (!reason_code && cds_is_log_report_in_progress() == true) {
2469 /* Flush event in response to flush command */
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08002470 WMA_LOGD("Received WMI flush event in response to flush CMD");
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002471 status = qdf_mc_timer_stop(&wma->log_completion_timer);
2472 if (status != QDF_STATUS_SUCCESS)
2473 WMA_LOGE("Failed to stop the log completion timeout");
2474 cds_logging_set_fw_flush_complete();
Zhu Jianminb639e9b2017-10-26 19:09:12 +08002475 return QDF_STATUS_SUCCESS;
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002476 } else if (reason_code && cds_is_log_report_in_progress() == false) {
2477 /* Asynchronous flush event for fatal events */
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002478 status = cds_set_log_completion(WLAN_LOG_TYPE_FATAL,
2479 WLAN_LOG_INDICATOR_FIRMWARE,
2480 reason_code, false);
2481 if (QDF_STATUS_SUCCESS != status) {
2482 WMA_LOGE("%s: Failed to set log trigger params",
2483 __func__);
2484 return QDF_STATUS_E_FAILURE;
2485 }
2486 cds_logging_set_fw_flush_complete();
2487 return status;
2488 } else {
2489 /* Asynchronous flush event for fatal event,
2490 * but, report in progress already
2491 */
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08002492 WMA_LOGD("%s: Bug report already in progress - dropping! type:%d, indicator=%d reason_code=%d",
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002493 __func__, WLAN_LOG_TYPE_FATAL,
2494 WLAN_LOG_INDICATOR_FIRMWARE, reason_code);
2495 return QDF_STATUS_E_FAILURE;
2496 }
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002497 /* Asynchronous flush event for fatal event,
2498 * but, report in progress already
2499 */
2500 WMA_LOGW("%s: Bug report already in progress - dropping! type:%d, indicator=%d reason_code=%d",
2501 __func__, WLAN_LOG_TYPE_FATAL,
2502 WLAN_LOG_INDICATOR_FIRMWARE, reason_code);
2503 return QDF_STATUS_E_FAILURE;
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002504}
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07002505
2506#ifdef WLAN_CONV_SPECTRAL_ENABLE
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002507/**
2508 * wma_extract_single_phyerr_spectral() - extract single phy error from event
2509 * @handle: wma handle
2510 * @param evt_buf: pointer to event buffer
2511 * @param datalen: data length of event buffer
2512 * @param buf_offset: Pointer to hold value of current event buffer offset
2513 * post extraction
2514 * @param phyerr: Pointer to hold phyerr
2515 *
2516 * Return: QDF_STATUS
2517 */
2518static QDF_STATUS wma_extract_single_phyerr_spectral(void *handle,
2519 void *evt_buf,
2520 uint16_t datalen, uint16_t *buf_offset,
2521 wmi_host_phyerr_t *phyerr)
2522{
2523 wmi_single_phyerr_rx_event *ev;
2524 int n = *buf_offset;
2525
2526 ev = (wmi_single_phyerr_rx_event *)((uint8_t *)evt_buf + n);
2527
2528 if (n < datalen) {
2529 /* ensure there's at least space for the header */
2530 if ((datalen - n) < sizeof(ev->hdr)) {
2531 WMA_LOGE("%s: not enough space? (datalen=%d, n=%d, hdr=%zu bytes",
2532 __func__, datalen, n, sizeof(ev->hdr));
2533 return QDF_STATUS_E_FAILURE;
2534 }
2535
2536 phyerr->bufp = ev->bufp;
2537 phyerr->buf_len = ev->hdr.buf_len;
2538
2539 /*
2540 * Sanity check the buffer length of the event against
2541 * what we currently have.
2542 *
2543 * Since buf_len is 32 bits, we check if it overflows
2544 * a large 32 bit value. It's not 0x7fffffff because
2545 * we increase n by (buf_len + sizeof(hdr)), which would
2546 * in itself cause n to overflow.
2547 *
2548 * If "int" is 64 bits then this becomes a moot point.
2549 */
2550 if (ev->hdr.buf_len > 0x7f000000) {
2551 WMA_LOGE("%s: buf_len is garbage? (0x%x)",
2552 __func__, ev->hdr.buf_len);
2553 return QDF_STATUS_E_FAILURE;
2554 }
2555 if (n + ev->hdr.buf_len > datalen) {
2556 WMA_LOGE("%s: buf_len exceeds available space n=%d, buf_len=%d, datalen=%d",
2557 __func__, n, ev->hdr.buf_len, datalen);
2558 return QDF_STATUS_E_FAILURE;
2559 }
2560
2561 phyerr->phy_err_code = WMI_UNIFIED_PHYERRCODE_GET(&ev->hdr);
2562 phyerr->tsf_timestamp = ev->hdr.tsf_timestamp;
2563
2564#ifdef DEBUG_SPECTRAL_SCAN
2565 WMA_LOGD("%s: len=%d, tsf=0x%08x, rssi = 0x%x/0x%x/0x%x/0x%x, comb rssi = 0x%x, phycode=%d",
2566 __func__,
2567 ev->hdr.buf_len,
2568 ev->hdr.tsf_timestamp,
2569 ev->hdr.rssi_chain0,
2570 ev->hdr.rssi_chain1,
2571 ev->hdr.rssi_chain2,
2572 ev->hdr.rssi_chain3,
2573 WMI_UNIFIED_RSSI_COMB_GET(&ev->hdr),
2574 phyerr->phy_err_code);
2575
2576 /*
2577 * For now, unroll this loop - the chain 'value' field isn't
2578 * a variable but glued together into a macro field definition.
2579 * Grr. :-)
2580 */
2581 WMA_LOGD("%s: chain 0: raw=0x%08x; pri20=%d sec20=%d sec40=%d sec80=%d",
2582 __func__,
2583 ev->hdr.rssi_chain0,
2584 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 0, PRI20),
2585 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 0, SEC20),
2586 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 0, SEC40),
2587 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 0, SEC80));
2588
2589 WMA_LOGD("%s: chain 1: raw=0x%08x: pri20=%d sec20=%d sec40=%d sec80=%d",
2590 __func__,
2591 ev->hdr.rssi_chain1,
2592 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 1, PRI20),
2593 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 1, SEC20),
2594 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 1, SEC40),
2595 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 1, SEC80));
2596
2597 WMA_LOGD("%s: chain 2: raw=0x%08x: pri20=%d sec20=%d sec40=%d sec80=%d",
2598 __func__,
2599 ev->hdr.rssi_chain2,
2600 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 2, PRI20),
2601 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 2, SEC20),
2602 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 2, SEC40),
2603 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 2, SEC80));
2604
2605 WMA_LOGD("%s: chain 3: raw=0x%08x: pri20=%d sec20=%d sec40=%d sec80=%d",
2606 __func__,
2607 ev->hdr.rssi_chain3,
2608 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 3, PRI20),
2609 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 3, SEC20),
2610 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 3, SEC40),
2611 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 3, SEC80));
2612
2613
2614 WMA_LOGD("%s: freq_info_1=0x%08x, freq_info_2=0x%08x",
2615 __func__, ev->hdr.freq_info_1, ev->hdr.freq_info_2);
2616
2617 /*
2618 * The NF chain values are signed and are negative - hence
2619 * the cast evilness.
2620 */
2621 WMA_LOGD("%s: nfval[1]=0x%08x, nfval[2]=0x%08x, nf=%d/%d/%d/%d, freq1=%d, freq2=%d, cw=%d",
2622 __func__,
2623 ev->hdr.nf_list_1,
2624 ev->hdr.nf_list_2,
2625 (int) WMI_UNIFIED_NF_CHAIN_GET(&ev->hdr, 0),
2626 (int) WMI_UNIFIED_NF_CHAIN_GET(&ev->hdr, 1),
2627 (int) WMI_UNIFIED_NF_CHAIN_GET(&ev->hdr, 2),
2628 (int) WMI_UNIFIED_NF_CHAIN_GET(&ev->hdr, 3),
2629 WMI_UNIFIED_FREQ_INFO_GET(&ev->hdr, 1),
2630 WMI_UNIFIED_FREQ_INFO_GET(&ev->hdr, 2),
2631 WMI_UNIFIED_CHWIDTH_GET(&ev->hdr));
2632#endif
2633
2634 /*
2635 * If required, pass spectral events to the spectral module
2636 */
2637 if (ev->hdr.buf_len > 0) {
2638
2639 /* Initialize the NF values to Zero. */
2640 phyerr->rf_info.noise_floor[0] =
2641 WMI_UNIFIED_NF_CHAIN_GET(&ev->hdr, 0);
2642 phyerr->rf_info.noise_floor[1] =
2643 WMI_UNIFIED_NF_CHAIN_GET(&ev->hdr, 1);
2644 phyerr->rf_info.noise_floor[2] =
2645 WMI_UNIFIED_NF_CHAIN_GET(&ev->hdr, 2);
2646 phyerr->rf_info.noise_floor[3] =
2647 WMI_UNIFIED_NF_CHAIN_GET(&ev->hdr, 3);
2648
2649 /* populate the rf info */
2650 phyerr->rf_info.rssi_comb =
2651 WMI_UNIFIED_RSSI_COMB_GET(&ev->hdr);
2652
2653 /* Need to unroll loop due to macro
2654 * constraints chain 0
2655 */
2656 phyerr->rf_info.pc_rssi_info[0].rssi_pri20 =
2657 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 0, PRI20);
2658 phyerr->rf_info.pc_rssi_info[0].rssi_sec20 =
2659 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 0, SEC20);
2660 phyerr->rf_info.pc_rssi_info[0].rssi_sec40 =
2661 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 0, SEC40);
2662 phyerr->rf_info.pc_rssi_info[0].rssi_sec80 =
2663 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 0, SEC80);
2664
2665 /* chain 1 */
2666 phyerr->rf_info.pc_rssi_info[1].rssi_pri20 =
2667 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 1, PRI20);
2668 phyerr->rf_info.pc_rssi_info[1].rssi_sec20 =
2669 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 1, SEC20);
2670 phyerr->rf_info.pc_rssi_info[1].rssi_sec40 =
2671 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 1, SEC40);
2672 phyerr->rf_info.pc_rssi_info[1].rssi_sec80 =
2673 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 1, SEC80);
2674
2675 /* chain 2 */
2676 phyerr->rf_info.pc_rssi_info[2].rssi_pri20 =
2677 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 2, PRI20);
2678 phyerr->rf_info.pc_rssi_info[2].rssi_sec20 =
2679 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 2, SEC20);
2680 phyerr->rf_info.pc_rssi_info[2].rssi_sec40 =
2681 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 2, SEC40);
2682 phyerr->rf_info.pc_rssi_info[2].rssi_sec80 =
2683 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 2, SEC80);
2684
2685 /* chain 3 */
2686 phyerr->rf_info.pc_rssi_info[3].rssi_pri20 =
2687 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 3, PRI20);
2688 phyerr->rf_info.pc_rssi_info[3].rssi_sec20 =
2689 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 3, SEC20);
2690 phyerr->rf_info.pc_rssi_info[3].rssi_sec40 =
2691 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 3, SEC40);
2692 phyerr->rf_info.pc_rssi_info[3].rssi_sec80 =
2693 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 3, SEC80);
2694
2695 phyerr->chan_info.center_freq1 =
2696 WMI_UNIFIED_FREQ_INFO_GET(&ev->hdr, 1);
2697 phyerr->chan_info.center_freq2 =
2698 WMI_UNIFIED_FREQ_INFO_GET(&ev->hdr, 2);
2699
2700 }
2701
2702 /*
2703 * Advance the buffer pointer to the next PHY error.
2704 * buflen is the length of this payload, so we need to
2705 * advance past the current header _AND_ the payload.
2706 */
2707 n += sizeof(*ev) + ev->hdr.buf_len;
2708 }
2709 *buf_offset += n;
2710
2711 return QDF_STATUS_SUCCESS;
2712}
2713
2714/**
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002715 * spectral_phyerr_event_handler() - spectral phyerr event handler
2716 * @handle: wma handle
2717 * @data: data buffer
2718 * @datalen: buffer length
2719 *
2720 * Return: QDF_STATUS
2721 */
2722static QDF_STATUS spectral_phyerr_event_handler(void *handle,
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07002723 uint8_t *data,
2724 uint32_t datalen)
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002725{
2726 tp_wma_handle wma = (tp_wma_handle) handle;
2727 QDF_STATUS status = QDF_STATUS_SUCCESS;
2728 uint16_t buf_offset, event_buf_len = 0;
2729 wmi_single_phyerr_rx_event *ev;
2730 wmi_host_phyerr_t phyerr;
2731 struct target_if_spectral_rfqual_info rfqual_info;
2732 struct target_if_spectral_chan_info chan_info;
2733 struct target_if_spectral_acs_stats acs_stats;
2734
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07002735 if (!wma) {
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002736 WMA_LOGE("%s:wma handle is NULL", __func__);
2737 return QDF_STATUS_E_FAILURE;
2738 }
2739
2740 memset(&phyerr, 0, sizeof(wmi_host_phyerr_t));
Arif Hussaind54b62c2018-03-01 13:31:37 -08002741 status = wmi_extract_comb_phyerr(wma->wmi_handle, data, datalen,
2742 &buf_offset, &phyerr);
2743 if (QDF_IS_STATUS_ERROR(status)) {
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002744 WMA_LOGE("%s: extract comb phyerr failed", __func__);
2745 return QDF_STATUS_E_FAILURE;
2746 }
2747
2748 ev = (wmi_single_phyerr_rx_event *)phyerr.bufp;
2749 event_buf_len = phyerr.buf_len;
2750 /* Loop over the bufp, extracting out phyerrors */
2751 buf_offset = 0;
2752 while (buf_offset < event_buf_len) {
2753 if (wma_extract_single_phyerr_spectral(handle, ev,
2754 event_buf_len, &buf_offset, &phyerr)) {
2755 WMA_LOGE("%s: extract single phy err failed", __func__);
2756 return QDF_STATUS_E_FAILURE;
2757 }
2758
2759 if (phyerr.buf_len > 0) {
2760 if (sizeof(phyerr.rf_info) > sizeof(rfqual_info))
2761 qdf_mem_copy(&rfqual_info, &phyerr.rf_info,
2762 sizeof(rfqual_info));
2763 else
2764 qdf_mem_copy(&rfqual_info, &phyerr.rf_info,
2765 sizeof(phyerr.rf_info));
2766
2767 if (sizeof(phyerr.chan_info) > sizeof(chan_info))
2768 qdf_mem_copy(&chan_info, &phyerr.chan_info,
2769 sizeof(chan_info));
2770 else
2771 qdf_mem_copy(&chan_info, &phyerr.chan_info,
2772 sizeof(phyerr.chan_info));
2773
2774 target_if_spectral_process_phyerr(wma->pdev, phyerr.bufp,
2775 phyerr.buf_len,
2776 &rfqual_info,
2777 &chan_info,
2778 phyerr.tsf64,
2779 &acs_stats);
2780 }
2781 }
2782
2783 return status;
2784}
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07002785#else
Chaoli Zhou5d6bad12018-06-13 14:29:33 +08002786static QDF_STATUS
2787wma_extract_single_phyerr_spectral(void *handle, void *evt_buf,
2788 uint16_t datalen,
2789 uint16_t *buf_offset,
2790 wmi_host_phyerr_t *phyerr)
2791{
2792 return QDF_STATUS_SUCCESS;
2793}
2794
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07002795static QDF_STATUS spectral_phyerr_event_handler(void *handle,
2796 uint8_t *data, uint32_t datalen)
2797{
2798 return QDF_STATUS_SUCCESS;
2799}
2800#endif
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002801
Arif Hussainf63f7a32017-08-22 12:49:42 -07002802/**
Arif Hussaind54b62c2018-03-01 13:31:37 -08002803 * dfs_phyerr_event_handler() - dfs phyerr event handler
2804 * @handle: wma handle
2805 * @data: data buffer
2806 * @datalen: buffer length
2807 * @fulltsf: 64 bit event TSF
2808 *
2809 * Function to process DFS phy errors.
2810 *
2811 * Return: QDF_STATUS
2812 */
2813static QDF_STATUS dfs_phyerr_event_handler(tp_wma_handle handle,
2814 uint8_t *data,
2815 uint32_t datalen,
2816 uint64_t fulltsf)
2817{
2818 QDF_STATUS status = QDF_STATUS_SUCCESS;
2819 struct wlan_lmac_if_dfs_rx_ops *dfs_rx_ops;
2820 wmi_host_phyerr_t phyerr;
2821 int8_t rssi_comb;
2822 uint16_t buf_offset;
2823
2824 if (!handle->psoc) {
2825 WMA_LOGE("%s: psoc is null", __func__);
2826 return QDF_STATUS_E_INVAL;
2827 }
2828
2829 dfs_rx_ops = wlan_lmac_if_get_dfs_rx_ops(handle->psoc);
2830 if (!dfs_rx_ops) {
2831 WMA_LOGE("%s: dfs_rx_ops is null", __func__);
2832 return QDF_STATUS_E_INVAL;
2833 }
2834
2835 if (!dfs_rx_ops->dfs_process_phyerr) {
2836 WMA_LOGE("%s: dfs_process_phyerr handler is null", __func__);
2837 return QDF_STATUS_E_INVAL;
2838 }
2839
2840 if (!handle->pdev) {
2841 WMA_LOGE("%s: pdev is null", __func__);
2842 return -EINVAL;
2843 }
2844
2845 buf_offset = 0;
2846 while (buf_offset < datalen) {
2847 status = wmi_extract_single_phyerr(handle->wmi_handle, data, datalen,
2848 &buf_offset, &phyerr);
2849 if (QDF_IS_STATUS_ERROR(status)) {
2850 /* wmi_extract_single_phyerr has logs */
2851 return status;
2852 }
2853
2854 rssi_comb = phyerr.rf_info.rssi_comb & 0xFF;
2855 if (phyerr.buf_len > 0)
2856 dfs_rx_ops->dfs_process_phyerr(handle->pdev,
2857 &phyerr.bufp[0],
2858 phyerr.buf_len,
2859 rssi_comb,
2860 rssi_comb,
2861 phyerr.tsf_timestamp,
2862 fulltsf);
2863 }
2864
2865 return QDF_STATUS_SUCCESS;
2866}
2867
2868/**
Arif Hussainf63f7a32017-08-22 12:49:42 -07002869 * wma_unified_phyerr_rx_event_handler() - phyerr event handler
2870 * @handle: wma handle
2871 * @data: data buffer
2872 * @datalen: buffer length
2873 *
2874 * WMI Handler for WMI_PHYERR_EVENTID event from firmware.
2875 * This handler is currently handling DFS and spectral scan
2876 * phy errors.
2877 *
2878 * Return: 0 for success, other value for failure
2879 */
2880static int wma_unified_phyerr_rx_event_handler(void *handle,
Arif Hussaind54b62c2018-03-01 13:31:37 -08002881 uint8_t *data,
2882 uint32_t datalen)
2883{
Arif Hussainf63f7a32017-08-22 12:49:42 -07002884 /* phyerr handling is moved to cmn project
2885 * As WIN still uses handler registration in non-cmn code.
2886 * need complete testing of non offloaded DFS code before we enable
2887 * it in cmn code.
2888 **/
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002889 tp_wma_handle wma = (tp_wma_handle) handle;
2890 QDF_STATUS status = QDF_STATUS_SUCCESS;
2891 wmi_host_phyerr_t phyerr;
2892 uint16_t buf_offset = 0;
Chaoli Zhou5d6bad12018-06-13 14:29:33 +08002893 wmi_single_phyerr_rx_event *ev;
2894 uint16_t event_buf_len = 0;
2895 wmi_host_phyerr_t phyerr2;
2896 bool spectralscan = false;
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002897
Arif Hussaind54b62c2018-03-01 13:31:37 -08002898 if (!wma) {
2899 WMA_LOGE("%s: wma handle is null", __func__);
2900 return -EINVAL;
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002901 }
2902
2903 /* sanity check on data length */
Arif Hussaind54b62c2018-03-01 13:31:37 -08002904 status = wmi_extract_comb_phyerr(wma->wmi_handle, data, datalen,
2905 &buf_offset, &phyerr);
2906 if (QDF_IS_STATUS_ERROR(status)) {
2907 WMA_LOGE("%s: extract phyerr failed: %d", __func__, status);
2908 return qdf_status_to_os_return(status);
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002909 }
Chaoli Zhou5d6bad12018-06-13 14:29:33 +08002910 ev = (wmi_single_phyerr_rx_event *)phyerr.bufp;
2911 event_buf_len = phyerr.buf_len;
2912 /* Loop over the bufp, extracting out phyerrors */
2913 buf_offset = 0;
2914 while (ev && (buf_offset < event_buf_len)) {
2915 if (wma_extract_single_phyerr_spectral(handle, ev,
2916 event_buf_len,
2917 &buf_offset,
2918 &phyerr2)) {
2919 WMA_LOGE("%s: extract single phy err failed", __func__);
2920 return qdf_status_to_os_return(QDF_STATUS_E_FAILURE);
2921 }
2922 if ((buf_offset != 0) && (phyerr2.phy_err_code == 0x26 ||
2923 phyerr2.phy_err_code == 0x24)) {
2924 spectralscan = true;
2925 } else {
2926 break;
2927 }
2928 }
2929 if (spectralscan) {
2930 status = spectral_phyerr_event_handler(wma, data, datalen);
2931 return qdf_status_to_os_return(status);
2932 }
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002933 /* handle different PHY Error conditions */
2934 if (((phyerr.phy_err_mask0 & (WMI_PHY_ERROR_MASK0_RADAR |
Arif Hussaind54b62c2018-03-01 13:31:37 -08002935 WMI_PHY_ERROR_MASK0_FALSE_RADAR_EXT |
2936 WMI_PHY_ERROR_MASK0_SPECTRAL_SCAN)) == 0)) {
2937 WMA_LOGD("%s: Unknown phy error event", __func__);
2938 return -EINVAL;
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002939 }
2940
2941 /* Handle Spectral or DFS PHY Error */
2942 if (phyerr.phy_err_mask0 & (WMI_PHY_ERROR_MASK0_RADAR |
Arif Hussaind54b62c2018-03-01 13:31:37 -08002943 WMI_PHY_ERROR_MASK0_FALSE_RADAR_EXT)) {
2944 if (wma->is_dfs_offloaded) {
2945 WMA_LOGD("%s: Unexpected phy error, dfs offloaded",
2946 __func__);
2947 return -EINVAL;
2948 }
2949 status = dfs_phyerr_event_handler(wma,
2950 phyerr.bufp,
2951 phyerr.buf_len,
2952 phyerr.tsf64);
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002953 } else if (phyerr.phy_err_mask0 & (WMI_PHY_ERROR_MASK0_SPECTRAL_SCAN |
Arif Hussaind54b62c2018-03-01 13:31:37 -08002954 WMI_PHY_ERROR_MASK0_FALSE_RADAR_EXT)) {
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002955 status = spectral_phyerr_event_handler(wma, data, datalen);
2956 }
Arif Hussaind54b62c2018-03-01 13:31:37 -08002957
2958 return qdf_status_to_os_return(status);
Arif Hussainf63f7a32017-08-22 12:49:42 -07002959}
2960
Dustin Brownec2c92e2017-07-26 11:13:49 -07002961void wma_vdev_init(struct wma_txrx_node *vdev)
2962{
2963 qdf_wake_lock_create(&vdev->vdev_start_wakelock, "vdev_start");
2964 qdf_wake_lock_create(&vdev->vdev_stop_wakelock, "vdev_stop");
Rajeev Kumar155a3e42017-10-10 15:31:17 -07002965 qdf_wake_lock_create(&vdev->vdev_set_key_wakelock, "vdev_set_key");
Naveen Rawatd7734142017-10-27 10:02:40 -07002966 vdev->is_waiting_for_key = false;
Dustin Brownec2c92e2017-07-26 11:13:49 -07002967}
2968
2969void wma_vdev_deinit(struct wma_txrx_node *vdev)
2970{
Abhinav Kumar0a846132018-08-09 11:49:46 +05302971 struct beacon_info *bcn;
2972 tp_wma_handle wma_handle;
2973
2974 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
2975 /* validate the wma_handle */
2976 if (!wma_handle) {
2977 WMA_LOGE("%s: Invalid wma handle", __func__);
2978 return;
2979 }
2980
2981 bcn = vdev->beacon;
2982 if (bcn) {
2983 if (bcn->dma_mapped)
2984 qdf_nbuf_unmap_single(wma_handle->qdf_dev,
2985 bcn->buf, QDF_DMA_TO_DEVICE);
2986 qdf_nbuf_free(bcn->buf);
2987 qdf_mem_free(bcn);
2988 vdev->beacon = NULL;
2989 }
2990
2991 if (vdev->handle) {
2992 qdf_mem_free(vdev->handle);
2993 vdev->handle = NULL;
2994 }
2995
2996 if (vdev->addBssStaContext) {
2997 qdf_mem_free(vdev->addBssStaContext);
2998 vdev->addBssStaContext = NULL;
2999 }
3000
3001 if (vdev->staKeyParams) {
3002 qdf_mem_free(vdev->staKeyParams);
3003 vdev->staKeyParams = NULL;
3004 }
3005
3006 if (vdev->del_staself_req) {
3007 qdf_mem_free(vdev->del_staself_req);
3008 vdev->del_staself_req = NULL;
3009 }
3010
3011 if (vdev->stats_rsp) {
3012 qdf_mem_free(vdev->stats_rsp);
3013 vdev->stats_rsp = NULL;
3014 }
3015
3016 if (vdev->psnr_req) {
3017 qdf_mem_free(vdev->psnr_req);
3018 vdev->psnr_req = NULL;
3019 }
3020
3021 if (vdev->rcpi_req) {
3022 qdf_mem_free(vdev->rcpi_req);
3023 vdev->rcpi_req = NULL;
3024 }
3025
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +05303026 if (vdev->roam_scan_stats_req) {
3027 struct sir_roam_scan_stats *req;
3028
3029 req = vdev->roam_scan_stats_req;
3030 vdev->roam_scan_stats_req = NULL;
3031 qdf_mem_free(req);
3032 }
3033
Abhinav Kumar0a846132018-08-09 11:49:46 +05303034 if (vdev->roam_synch_frame_ind.bcn_probe_rsp) {
3035 qdf_mem_free(vdev->roam_synch_frame_ind.bcn_probe_rsp);
3036 vdev->roam_synch_frame_ind.bcn_probe_rsp = NULL;
3037 }
3038
3039 if (vdev->roam_synch_frame_ind.reassoc_req) {
3040 qdf_mem_free(vdev->roam_synch_frame_ind.reassoc_req);
3041 vdev->roam_synch_frame_ind.reassoc_req = NULL;
3042 }
3043
3044 if (vdev->roam_synch_frame_ind.reassoc_rsp) {
3045 qdf_mem_free(vdev->roam_synch_frame_ind.reassoc_rsp);
3046 vdev->roam_synch_frame_ind.reassoc_rsp = NULL;
3047 }
3048
Dustin Brownec2c92e2017-07-26 11:13:49 -07003049 qdf_wake_lock_destroy(&vdev->vdev_start_wakelock);
3050 qdf_wake_lock_destroy(&vdev->vdev_stop_wakelock);
Rajeev Kumar155a3e42017-10-10 15:31:17 -07003051 qdf_wake_lock_destroy(&vdev->vdev_set_key_wakelock);
Naveen Rawatd7734142017-10-27 10:02:40 -07003052 vdev->is_waiting_for_key = false;
Dustin Brownec2c92e2017-07-26 11:13:49 -07003053}
3054
Kabilan Kannanfc3a8c02018-02-21 13:36:29 -08003055/**
3056 * wma_wmi_stop() - generic function to block WMI commands
3057 * @return: None
3058 */
3059void wma_wmi_stop(void)
3060{
3061 tp_wma_handle wma_handle;
3062
3063 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Pragaspathi Thilagarajbc5a34b2018-10-09 18:35:45 +05303064 if ((!wma_handle) || (!wma_handle->wmi_handle)) {
Kabilan Kannanfc3a8c02018-02-21 13:36:29 -08003065 QDF_TRACE(QDF_MODULE_ID_WMI, QDF_TRACE_LEVEL_INFO,
Pragaspathi Thilagarajbc5a34b2018-10-09 18:35:45 +05303066 "wma_handle or wmi_handle is NULL\n");
Kabilan Kannanfc3a8c02018-02-21 13:36:29 -08003067 return;
3068 }
3069 wmi_stop(wma_handle->wmi_handle);
3070}
3071
Naveen Rawate8b1b822018-01-30 09:46:16 -08003072#ifdef QCA_SUPPORT_CP_STATS
3073static void wma_register_stats_events(wmi_unified_t wmi_handle) {}
3074#else
3075static void wma_register_stats_events(wmi_unified_t wmi_handle)
3076{
3077 wmi_unified_register_event_handler(wmi_handle,
3078 wmi_update_stats_event_id,
3079 wma_stats_event_handler,
3080 WMA_RX_SERIALIZER_CTX);
3081}
3082#endif
3083
Harprit Chhabada98225f62018-12-11 15:29:55 -08003084#ifdef CONFIG_WMI_BCN_OFFLOAD
3085static QDF_STATUS
3086wma_register_swba_events(wmi_unified_t wmi_handle)
3087{
3088 QDF_STATUS status;
3089
3090 status = wmi_unified_register_event_handler(wmi_handle,
3091 wmi_host_swba_event_id,
3092 wma_beacon_swba_handler,
3093 WMA_RX_SERIALIZER_CTX);
3094
3095 return status;
3096}
3097#else
3098static QDF_STATUS wma_register_swba_events(wmi_unified_t wmi_handle)
3099{
3100 return QDF_STATUS_SUCCESS;
3101}
3102#endif
3103
Nachiket Kukade177b5b02018-05-22 20:52:17 +05303104#ifdef FEATURE_WLAN_APF
3105static void wma_register_apf_events(tp_wma_handle wma_handle)
3106{
3107 if (!wma_handle) {
3108 QDF_TRACE(QDF_MODULE_ID_WMI, QDF_TRACE_LEVEL_INFO,
3109 "wma_handle is NULL\n");
3110 return;
3111 }
3112
3113 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3114 wmi_apf_capability_info_event_id,
3115 wma_get_apf_caps_event_handler,
3116 WMA_RX_SERIALIZER_CTX);
3117 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3118 wmi_apf_get_vdev_work_memory_resp_event_id,
3119 wma_apf_read_work_memory_event_handler,
3120 WMA_RX_SERIALIZER_CTX);
3121}
3122#else /* FEATURE_WLAN_APF */
3123static void wma_register_apf_events(tp_wma_handle wma_handle)
3124{
3125}
3126#endif /* FEATURE_WLAN_APF */
3127
Visweswara Tanuku633976b2019-01-07 16:13:12 +05303128#ifdef WLAN_FEATURE_MOTION_DETECTION
3129/**
3130 * wma_register_md_events - Register motion detection event handlers
3131 * @wma_handle: wma handle
3132 * Return: None
3133 */
3134static void wma_register_md_events(tp_wma_handle wma_handle)
3135{
3136 if (!wma_handle) {
3137 QDF_TRACE(QDF_MODULE_ID_WMI, QDF_TRACE_LEVEL_INFO,
3138 "wma_handle is NULL\n");
3139 return;
3140 }
3141
3142 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3143 WMI_MOTION_DET_HOST_EVENTID,
3144 wma_motion_det_host_event_handler,
3145 WMA_RX_SERIALIZER_CTX);
3146
3147 wmi_unified_register_event_handler(
3148 wma_handle->wmi_handle,
3149 WMI_MOTION_DET_BASE_LINE_HOST_EVENTID,
3150 wma_motion_det_base_line_host_event_handler,
3151 WMA_RX_SERIALIZER_CTX);
3152}
3153#else /* WLAN_FEATURE_MOTION_DETECTION */
3154/**
3155 * wma_register_md_events - Register motion detection event handlers
3156 * @wma_handle: wma handle
3157 * Return: None
3158 */
3159static void wma_register_md_events(tp_wma_handle wma_handle)
3160{
3161}
3162#endif /* WLAN_FEATURE_MOTION_DETECTION */
3163
Krunal Sonif9ba53d2019-01-03 21:44:41 -08003164#ifdef FEATURE_WLM_STATS
3165static void wma_register_wlm_stats_events(tp_wma_handle wma_handle)
3166{
3167 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3168 wmi_wlm_stats_event_id,
3169 wma_wlm_stats_rsp,
3170 WMA_RX_SERIALIZER_CTX);
3171}
3172#else /* FEATURE_WLM_STATS */
3173static void wma_register_wlm_stats_events(tp_wma_handle wma_handle)
3174{
3175}
3176#endif /* FEATURE_WLM_STATS */
3177
Arif Hussain49698112018-07-31 00:32:50 -07003178struct wlan_objmgr_psoc *wma_get_psoc_from_scn_handle(void *scn_handle)
3179{
3180 tp_wma_handle wma_handle;
3181
3182 if (!scn_handle) {
3183 WMA_LOGE("invalid scn handle");
3184 return NULL;
3185 }
3186 wma_handle = (tp_wma_handle)scn_handle;
3187
3188 return wma_handle->psoc;
3189}
3190
Pragaspathi Thilagaraj8b12fbe2019-01-22 15:59:28 +05303191void wma_get_phy_mode_cb(uint8_t chan, uint32_t chan_width, uint32_t *phy_mode)
Ashish Kumar Dhanotiyacd311c82018-09-14 10:55:10 +05303192{
3193 uint32_t dot11_mode;
Jeff Johnson009c40f2018-11-05 09:54:37 -08003194 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
Ashish Kumar Dhanotiyacd311c82018-09-14 10:55:10 +05303195
3196 if (!mac) {
3197 wma_err("MAC context is NULL");
3198 *phy_mode = MODE_UNKNOWN;
3199 return;
3200 }
3201
gaurank kathpalia1be77fa2019-01-04 13:32:09 +05303202 dot11_mode = mac->mlme_cfg->dot11_mode.dot11_mode;
Ashish Kumar Dhanotiyacd311c82018-09-14 10:55:10 +05303203 *phy_mode = wma_chan_phy_mode(chan, chan_width, dot11_mode);
3204}
3205
Nachiket Kukade15bd4f72019-02-19 17:30:50 +05303206#ifdef WLAN_FEATURE_NAN
3207static void
3208wma_register_nan_callbacks(tp_wma_handle wma_handle)
3209{
3210 struct nan_callbacks cb_obj = {0};
3211
3212 cb_obj.update_ndi_conn = wma_ndi_update_connection_info;
3213
3214 ucfg_nan_register_wma_callbacks(wma_handle->psoc, &cb_obj);
3215}
3216#else
3217static void wma_register_nan_callbacks(tp_wma_handle wma_handle)
3218{
3219}
3220#endif
3221
Ashish Kumar Dhanotiyacd311c82018-09-14 10:55:10 +05303222/**
Kabilan Kannanfc3a8c02018-02-21 13:36:29 -08003223 * wma_open() - Allocate wma context and initialize it.
3224 * @cds_context: cds context
3225 * @wma_tgt_cfg_cb: tgt config callback fun
3226 * @radar_ind_cb: dfs radar indication callback
3227 * @cds_cfg: mac parameters
3228 *
3229 * Return: 0 on success, errno on failure
3230 */
Jeff Johnsonff6addf2017-09-13 10:06:03 -07003231QDF_STATUS wma_open(struct wlan_objmgr_psoc *psoc,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003232 wma_tgt_cfg_cb tgt_cfg_cb,
bings482bae22018-01-17 16:25:31 +08003233 struct cds_config_info *cds_cfg,
3234 uint32_t target_type)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003235{
3236 tp_wma_handle wma_handle;
3237 HTC_HANDLE htc_handle;
Anurag Chouhan6d760662016-02-20 16:05:43 +05303238 qdf_device_t qdf_dev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003239 void *wmi_handle;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303240 QDF_STATUS qdf_status;
Lin Bai04f603e2018-03-19 11:01:06 +08003241 struct wmi_unified_attach_params *params;
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07003242 struct policy_mgr_wma_cbacks wma_cbacks;
Frank Liu00d73fe2017-05-19 22:11:28 +08003243 struct target_psoc_info *tgt_psoc_info;
Dustin Brownec2c92e2017-07-26 11:13:49 -07003244 int i;
Pragaspathi Thilagaraj00bd8bc2018-08-18 01:23:01 +05303245 bool val = 0;
Jeff Johnsonff6addf2017-09-13 10:06:03 -07003246 void *cds_context;
Arunk Khandavallicfde2712018-01-25 11:27:42 +05303247 target_resource_config *wlan_res_cfg;
Wu Gao51a63562018-11-08 16:29:10 +08003248 uint8_t delay_before_vdev_stop;
lifeng0b46ae52018-12-13 09:42:27 +08003249 uint32_t self_gen_frm_pwr = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003250
3251 WMA_LOGD("%s: Enter", __func__);
3252
Jeff Johnsonff6addf2017-09-13 10:06:03 -07003253 cds_context = cds_get_global_context();
3254 if (!cds_context) {
3255 WMA_LOGE("%s: Invalid CDS context", __func__);
3256 return QDF_STATUS_E_INVAL;
3257 }
3258
Mukul Sharma5ff3c582016-09-12 15:23:35 +05303259 g_wmi_version_info.major = __WMI_VER_MAJOR_;
3260 g_wmi_version_info.minor = __WMI_VER_MINOR_;
3261 g_wmi_version_info.revision = __WMI_REVISION_;
3262
Anurag Chouhan6d760662016-02-20 16:05:43 +05303263 qdf_dev = cds_get_context(QDF_MODULE_ID_QDF_DEVICE);
3264 htc_handle = cds_get_context(QDF_MODULE_ID_HTC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003265
3266 if (!htc_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003267 WMA_LOGE("%s: Invalid HTC handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303268 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003269 }
3270
3271 /* Alloc memory for WMA Context */
Jeff Johnsonadb3b1c2017-09-13 10:42:36 -07003272 qdf_status = cds_alloc_context(QDF_MODULE_ID_WMA,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003273 (void **)&wma_handle,
Jeff Johnsonadb3b1c2017-09-13 10:42:36 -07003274 sizeof(*wma_handle));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003275
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303276 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003277 WMA_LOGE("%s: Memory allocation failed for wma_handle",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003278 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303279 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003280 }
3281
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303282 qdf_mem_zero(wma_handle, sizeof(t_wma_handle));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003283
Arunk Khandavallia6305a32018-01-25 11:19:18 +05303284 if (target_if_alloc_psoc_tgt_info(psoc)) {
3285 WMA_LOGE("%s target psoc info allocation failed", __func__);
3286 qdf_status = QDF_STATUS_E_NOMEM;
3287 goto err_free_wma_handle;
Frank Liu00d73fe2017-05-19 22:11:28 +08003288 }
3289
Anurag Chouhan6d760662016-02-20 16:05:43 +05303290 if (cds_get_conparam() != QDF_GLOBAL_FTM_MODE) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003291#ifdef FEATURE_WLAN_EXTSCAN
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303292 qdf_wake_lock_create(&wma_handle->extscan_wake_lock,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003293 "wlan_extscan_wl");
3294#endif /* FEATURE_WLAN_EXTSCAN */
Mukul Sharmae44d0542017-05-23 21:50:56 +05303295 qdf_wake_lock_create(&wma_handle->wow_wake_lock,
3296 "wlan_wow_wl");
3297 qdf_wake_lock_create(&wma_handle->wow_auth_req_wl,
3298 "wlan_auth_req_wl");
3299 qdf_wake_lock_create(&wma_handle->wow_assoc_req_wl,
3300 "wlan_assoc_req_wl");
3301 qdf_wake_lock_create(&wma_handle->wow_deauth_rec_wl,
3302 "wlan_deauth_rec_wl");
3303 qdf_wake_lock_create(&wma_handle->wow_disassoc_rec_wl,
3304 "wlan_disassoc_rec_wl");
3305 qdf_wake_lock_create(&wma_handle->wow_ap_assoc_lost_wl,
3306 "wlan_ap_assoc_lost_wl");
3307 qdf_wake_lock_create(&wma_handle->wow_auto_shutdown_wl,
3308 "wlan_auto_shutdown_wl");
3309 qdf_wake_lock_create(&wma_handle->roam_ho_wl,
3310 "wlan_roam_ho_wl");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003311 }
3312
Selvaraj, Sridhar3a1823f2017-02-01 17:32:21 +05303313 qdf_status = wlan_objmgr_psoc_try_get_ref(psoc, WLAN_LEGACY_WMA_ID);
3314 if (QDF_IS_STATUS_ERROR(qdf_status)) {
3315 WMA_LOGE("%s: PSOC get_ref fails", __func__);
Zhu Jianminf9e2e2d2018-05-30 16:20:24 +08003316 goto err_get_psoc_ref;
Selvaraj, Sridhar3a1823f2017-02-01 17:32:21 +05303317 }
Selvaraj, Sridhar0672a122016-12-29 16:11:48 +05303318 wma_handle->psoc = psoc;
3319
Rajeev Kumarda2444c2017-01-10 22:42:07 -08003320 wma_target_if_open(wma_handle);
Rajeev Kumarda2444c2017-01-10 22:42:07 -08003321
Lin Bai04f603e2018-03-19 11:01:06 +08003322 /*
3323 * Allocate locally used params with its rx_ops member,
3324 * and free it immediately after used.
3325 */
3326 params = qdf_mem_malloc(sizeof(*params) + sizeof(struct wmi_rx_ops));
3327 if (!params) {
Lin Bai04f603e2018-03-19 11:01:06 +08003328 qdf_status = QDF_STATUS_E_NOMEM;
3329 goto err_wma_handle;
3330 }
3331
3332 params->rx_ops = (struct wmi_rx_ops *)(params + 1);
3333 params->osdev = NULL;
3334 params->target_type = WMI_TLV_TARGET;
3335 params->use_cookie = false;
3336 params->psoc = psoc;
3337 params->max_commands = WMI_MAX_CMDS;
Govind Singhd76a5b02016-03-08 15:12:14 +05303338 /* Attach mc_thread context processing function */
Lin Bai04f603e2018-03-19 11:01:06 +08003339 params->rx_ops->wma_process_fw_event_handler_cbk =
3340 wma_process_fw_event_handler;
Surabhi Vishnoi75b1a812018-02-09 12:07:16 +05303341
Himanshu Agarwal88b16a42018-02-06 15:10:59 +05303342 /* initialize tlv attach */
3343 wmi_tlv_init();
Surabhi Vishnoi75b1a812018-02-09 12:07:16 +05303344
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003345 /* attach the wmi */
Lin Bai04f603e2018-03-19 11:01:06 +08003346 wmi_handle = wmi_unified_attach(wma_handle, params);
3347 qdf_mem_free(params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003348 if (!wmi_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003349 WMA_LOGE("%s: failed to attach WMI", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303350 qdf_status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003351 goto err_wma_handle;
3352 }
3353
Rajeev Kumarda2444c2017-01-10 22:42:07 -08003354 target_if_register_legacy_service_ready_cb(
3355 wma_legacy_service_ready_event_handler);
3356
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003357 WMA_LOGA("WMA --> wmi_unified_attach - success");
Mukul Sharmacc1f3f92017-01-30 19:56:24 +05303358
Frank Liu00d73fe2017-05-19 22:11:28 +08003359 /* store the wmi handle in tgt_if_handle */
Arunk Khandavallia6305a32018-01-25 11:19:18 +05303360 tgt_psoc_info = wlan_psoc_get_tgt_if_handle(psoc);
Mukul Sharmacc1f3f92017-01-30 19:56:24 +05303361
bings6b413662018-02-06 17:51:36 +08003362 target_psoc_set_target_type(tgt_psoc_info, target_type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003363 /* Save the WMI & HTC handle */
Arunk Khandavallia6305a32018-01-25 11:19:18 +05303364 target_psoc_set_wmi_hdl(tgt_psoc_info, wmi_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003365 wma_handle->wmi_handle = wmi_handle;
Arunk Khandavallia6305a32018-01-25 11:19:18 +05303366 target_psoc_set_htc_hdl(tgt_psoc_info, htc_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003367 wma_handle->cds_context = cds_context;
Anurag Chouhan6d760662016-02-20 16:05:43 +05303368 wma_handle->qdf_dev = qdf_dev;
Jiani Liu6d3b6a12019-05-08 15:15:06 +08003369 wma_handle->enable_tx_compl_tsf64 =
3370 cds_cfg->enable_tx_compl_tsf64;
3371
Arunk Khandavallia6305a32018-01-25 11:19:18 +05303372 /* Register Converged Event handlers */
3373 init_deinit_register_tgt_psoc_ev_handlers(psoc);
3374
Manishekar Chandrasekaranebcab882016-05-04 12:55:14 +05303375 /* Initialize max_no_of_peers for wma_get_number_of_peers_supported() */
Rachit Kankane0106e382018-05-16 18:59:28 +05303376 cds_cfg->max_station = wma_init_max_no_of_peers(wma_handle,
3377 cds_cfg->max_station);
Manishekar Chandrasekaranebcab882016-05-04 12:55:14 +05303378
Tushnim Bhattacharyya80e9e3b2019-06-11 13:01:00 -07003379 wlan_mlme_set_assoc_sta_limit(psoc, cds_cfg->max_station);
3380
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003381 /* initialize default target config */
Arunk Khandavallicfde2712018-01-25 11:27:42 +05303382 wlan_res_cfg = target_psoc_get_wlan_res_cfg(tgt_psoc_info);
Arif Hussaind15902c2018-03-02 00:08:29 -08003383 if (!wlan_res_cfg) {
3384 WMA_LOGE("%s: wlan_res_cfg is null", __func__);
3385 qdf_status = QDF_STATUS_E_NOMEM;
3386 goto err_wma_handle;
3387 }
Arunk Khandavallicfde2712018-01-25 11:27:42 +05303388
Rachit Kankane0106e382018-05-16 18:59:28 +05303389 wma_set_default_tgt_config(wma_handle, wlan_res_cfg, cds_cfg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003390
Pragaspathi Thilagaraj00bd8bc2018-08-18 01:23:01 +05303391 qdf_status = wlan_mlme_get_tx_chainmask_cck(psoc, &val);
3392 if (qdf_status != QDF_STATUS_SUCCESS) {
3393 WMA_LOGE("%s: Failed to get tx_chainmask_cck", __func__);
3394 qdf_status = QDF_STATUS_E_FAILURE;
3395 goto err_wma_handle;
3396 }
3397 wma_handle->tx_chain_mask_cck = val;
lifeng0b46ae52018-12-13 09:42:27 +08003398
3399 qdf_status = wlan_mlme_get_self_gen_frm_pwr(psoc, &self_gen_frm_pwr);
3400 if (qdf_status != QDF_STATUS_SUCCESS)
3401 WMA_LOGE("%s: Failed to get self_gen_frm_pwr", __func__);
3402 wma_handle->self_gen_frm_pwr = self_gen_frm_pwr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003403
Dustin Browne8d91fc2019-02-04 14:49:04 -08003404 cds_cfg->max_bssid = WLAN_MAX_VDEVS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003405
Arun Khandavallic811dcc2016-06-26 07:37:21 +05303406 wma_handle->max_station = cds_cfg->max_station;
3407 wma_handle->max_bssid = cds_cfg->max_bssid;
Wu Gao66454f12018-09-26 19:55:41 +08003408 wma_handle->enable_mc_list =
3409 ucfg_pmo_is_mc_addr_list_enabled(wma_handle->psoc);
Wu Gao9d117fb2019-01-10 21:52:31 +08003410 wma_handle->active_uc_apf_mode =
3411 ucfg_pmo_get_active_uc_apf_mode(wma_handle->psoc);
3412 wma_handle->active_mc_bc_apf_mode =
3413 ucfg_pmo_get_active_mc_bc_apf_mode(wma_handle->psoc);
Srinivas Girigowda57b450e2016-10-27 21:00:46 -07003414 wma_handle->link_stats_results = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003415#ifdef WLAN_FEATURE_LPSS
Arun Khandavallic811dcc2016-06-26 07:37:21 +05303416 wma_handle->is_lpass_enabled = cds_cfg->is_lpass_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003417#endif
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303418 wma_handle->interfaces = qdf_mem_malloc(sizeof(struct wma_txrx_node) *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003419 wma_handle->max_bssid);
3420 if (!wma_handle->interfaces) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303421 qdf_status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003422 goto err_scn_context;
3423 }
Dustin Brownec2c92e2017-07-26 11:13:49 -07003424
Zhu Jianmina2f8e8d2018-02-11 16:37:10 +08003425 for (i = 0; i < wma_handle->max_bssid; ++i) {
Dustin Brownec2c92e2017-07-26 11:13:49 -07003426 wma_vdev_init(&wma_handle->interfaces[i]);
Wu Gao51a63562018-11-08 16:29:10 +08003427 ucfg_mlme_get_delay_before_vdev_stop(wma_handle->psoc,
3428 &delay_before_vdev_stop);
Zhu Jianmina2f8e8d2018-02-11 16:37:10 +08003429 wma_handle->interfaces[i].delay_before_vdev_stop =
Wu Gao51a63562018-11-08 16:29:10 +08003430 delay_before_vdev_stop;
Zhu Jianmina2f8e8d2018-02-11 16:37:10 +08003431 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003432 /* Register the debug print event handler */
3433 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303434 wmi_debug_print_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303435 wma_unified_debug_print_event_handler,
3436 WMA_RX_SERIALIZER_CTX);
Govind Singha471e5e2015-10-12 17:11:14 +05303437 /* Register profiling event Handler */
3438 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303439 wmi_wlan_profile_data_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303440 wma_profile_data_report_event_handler,
3441 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003442
3443 wma_handle->tgt_cfg_update_cb = tgt_cfg_cb;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003444 wma_handle->old_hw_mode_index = WMA_DEFAULT_HW_MODE_INDEX;
3445 wma_handle->new_hw_mode_index = WMA_DEFAULT_HW_MODE_INDEX;
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05303446 wma_handle->saved_chan.num_channels = 0;
Sandeep Puligillaafa52892016-10-26 19:03:16 -07003447 wma_handle->fw_timeout_crash = cds_cfg->fw_timeout_crash;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003448
Anurag Chouhan210db072016-02-22 18:42:15 +05303449 qdf_status = qdf_mc_timer_init(&wma_handle->service_ready_ext_timer,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303450 QDF_TIMER_TYPE_SW,
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05303451 wma_service_ready_ext_evt_timeout,
3452 wma_handle);
Anurag Chouhandf2b2682016-02-29 14:15:27 +05303453 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05303454 WMA_LOGE("Failed to initialize service ready ext timeout");
3455 goto err_event_init;
3456 }
3457
Anurag Chouhandf2b2682016-02-29 14:15:27 +05303458 qdf_status = qdf_event_create(&wma_handle->target_suspend);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303459 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003460 WMA_LOGE("%s: target suspend event initialization failed",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003461 __func__);
3462 goto err_event_init;
3463 }
3464
3465 /* Init Tx Frame Complete event */
Anurag Chouhandf2b2682016-02-29 14:15:27 +05303466 qdf_status = qdf_event_create(&wma_handle->tx_frm_download_comp_event);
3467 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003468 WMA_LOGE("%s: failed to init tx_frm_download_comp_event",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003469 __func__);
3470 goto err_event_init;
3471 }
3472
3473 /* Init tx queue empty check event */
Anurag Chouhandf2b2682016-02-29 14:15:27 +05303474 qdf_status = qdf_event_create(&wma_handle->tx_queue_empty_event);
3475 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003476 WMA_LOGE("%s: failed to init tx_queue_empty_event", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003477 goto err_event_init;
3478 }
3479
Prashanth Bhattae675ca72016-10-20 18:42:37 -07003480 qdf_status = cds_shutdown_notifier_register(wma_shutdown_notifier_cb,
3481 wma_handle);
3482 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003483 WMA_LOGE("%s: Shutdown notifier register failed: %d",
Prashanth Bhattae675ca72016-10-20 18:42:37 -07003484 __func__, qdf_status);
3485 goto err_event_init;
3486 }
3487
Anurag Chouhandf2b2682016-02-29 14:15:27 +05303488 qdf_status = qdf_event_create(&wma_handle->runtime_suspend);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303489 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003490 WMA_LOGE("%s: runtime_suspend event initialization failed",
Houston Hoffmana76591b2015-11-10 16:52:05 -08003491 __func__);
3492 goto err_event_init;
3493 }
3494
Anurag Chouhandf2b2682016-02-29 14:15:27 +05303495 qdf_status = qdf_event_create(&wma_handle->recovery_event);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303496 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003497 WMA_LOGE("%s: recovery event initialization failed", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003498 goto err_event_init;
3499 }
3500
Anurag Chouhanffb21542016-02-17 14:33:03 +05303501 qdf_list_create(&wma_handle->vdev_resp_queue,
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -07003502 MAX_ENTRY_VDEV_RESP_QUEUE);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303503 qdf_spinlock_create(&wma_handle->vdev_respq_lock);
Anurag Chouhanffb21542016-02-17 14:33:03 +05303504 qdf_list_create(&wma_handle->wma_hold_req_queue,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003505 MAX_ENTRY_HOLD_REQ_QUEUE);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303506 qdf_spinlock_create(&wma_handle->wma_hold_req_q_lock);
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05303507 qdf_atomic_init(&wma_handle->is_wow_bus_suspended);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003508
3509 /* Register vdev start response event handler */
3510 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303511 wmi_vdev_start_resp_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303512 wma_vdev_start_resp_handler,
3513 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003514
3515 /* Register vdev stop response event handler */
3516 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303517 wmi_vdev_stopped_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303518 wma_vdev_stop_resp_handler,
3519 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003520
3521 /* register for STA kickout function */
3522 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303523 wmi_peer_sta_kickout_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303524 wma_peer_sta_kickout_event_handler,
3525 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003526
Naveen Rawate8b1b822018-01-30 09:46:16 -08003527 /* register for stats event */
3528 wma_register_stats_events(wma_handle->wmi_handle);
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05303529
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05303530 /* register for stats response event */
3531 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303532 wmi_get_arp_stats_req_id,
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05303533 wma_get_arp_stats_handler,
3534 WMA_RX_SERIALIZER_CTX);
3535
Qun Zhangef655622019-02-25 10:48:10 +08003536 /* register for fw state response event */
3537 wma_register_fw_state_events(wma_handle->wmi_handle);
3538
Will Huanga9814592017-05-24 15:47:58 +08003539 /* register for peer info response event */
3540 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303541 wmi_peer_stats_info_event_id,
Will Huanga9814592017-05-24 15:47:58 +08003542 wma_peer_info_event_handler,
3543 WMA_RX_SERIALIZER_CTX);
3544
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05303545#ifdef WLAN_POWER_DEBUGFS
3546 /* register for Chip Power stats event */
3547 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303548 wmi_pdev_chip_power_stats_event_id,
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05303549 wma_unified_power_debug_stats_event_handler,
3550 WMA_RX_SERIALIZER_CTX);
3551#endif
Arunk Khandavallica56d4b2018-11-29 15:46:00 +05303552#ifdef WLAN_FEATURE_BEACON_RECEPTION_STATS
3553 /* register for beacon stats event */
3554 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3555 wmi_vdev_bcn_reception_stats_event_id,
3556 wma_unified_beacon_debug_stats_event_handler,
3557 WMA_RX_SERIALIZER_CTX);
3558#endif
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05303559
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003560 /* register for linkspeed response event */
3561 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303562 wmi_peer_estimated_linkspeed_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303563 wma_link_speed_event_handler,
3564 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003565
3566#ifdef FEATURE_OEM_DATA_SUPPORT
3567 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303568 wmi_oem_response_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303569 wma_oem_data_response_handler,
3570 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003571#endif /* FEATURE_OEM_DATA_SUPPORT */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003572
3573 /* Register peer change event handler */
3574 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303575 wmi_peer_state_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303576 wma_peer_state_change_event_handler,
3577 WMA_RX_WORK_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003578
3579 /* Register beacon tx complete event id. The event is required
3580 * for sending channel switch announcement frames
3581 */
3582 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303583 wmi_offload_bcn_tx_status_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303584 wma_unified_bcntx_status_event_handler,
3585 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003586
3587 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303588 wmi_update_vdev_rate_stats_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303589 wma_link_status_event_handler,
3590 WMA_RX_SERIALIZER_CTX);
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +05303591
3592 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3593 wmi_roam_scan_stats_event_id,
3594 wma_roam_scan_stats_event_handler,
3595 WMA_RX_SERIALIZER_CTX);
3596
Yeshwanth Sriram Guntukafa9f3792019-02-28 18:24:58 +05303597 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3598 wmi_pdev_cold_boot_cal_event_id,
3599 wma_cold_boot_cal_event_handler,
3600 WMA_RX_WORK_CTX);
3601
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003602#ifdef WLAN_FEATURE_LINK_LAYER_STATS
3603 /* Register event handler for processing Link Layer Stats
3604 * response from the FW
3605 */
3606 wma_register_ll_stats_event_handler(wma_handle);
3607
3608#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
3609
SaidiReddy Yenugacc733af2016-11-09 17:45:42 +05303610 wmi_set_tgt_assert(wma_handle->wmi_handle,
3611 cds_cfg->force_target_assert_enabled);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003612 /* Firmware debug log */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303613 qdf_status = dbglog_init(wma_handle->wmi_handle);
3614 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003615 WMA_LOGE("%s: Firmware Dbglog initialization failed", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003616 goto err_dbglog_init;
3617 }
3618
3619 /*
3620 * Update Powersave mode
3621 * 1 - Legacy Powersave + Deepsleep Disabled
3622 * 2 - QPower + Deepsleep Disabled
3623 * 3 - Legacy Powersave + Deepsleep Enabled
3624 * 4 - QPower + Deepsleep Enabled
3625 */
Wu Gao66454f12018-09-26 19:55:41 +08003626 wma_handle->powersave_mode =
3627 ucfg_pmo_power_save_offload_enabled(wma_handle->psoc);
Arun Khandavallic811dcc2016-06-26 07:37:21 +05303628 wma_handle->staMaxLIModDtim = cds_cfg->sta_maxlimod_dtim;
Wu Gao66454f12018-09-26 19:55:41 +08003629 wma_handle->staModDtim = ucfg_pmo_get_sta_mod_dtim(wma_handle->psoc);
3630 wma_handle->staDynamicDtim =
3631 ucfg_pmo_get_sta_dynamic_dtim(wma_handle->psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003632
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003633 /* register for install key completion event */
3634 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303635 wmi_vdev_install_key_complete_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303636 wma_vdev_install_key_complete_event_handler,
3637 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003638
3639#ifdef WLAN_FEATURE_STATS_EXT
3640 /* register for extended stats event */
3641 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303642 wmi_stats_ext_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303643 wma_stats_ext_event_handler,
3644 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003645#endif /* WLAN_FEATURE_STATS_EXT */
3646#ifdef FEATURE_WLAN_EXTSCAN
3647 wma_register_extscan_event_handler(wma_handle);
3648#endif /* WLAN_FEATURE_STATS_EXT */
3649
3650 WMA_LOGD("%s: Exit", __func__);
3651
3652#ifdef WLAN_FEATURE_ROAM_OFFLOAD
3653 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303654 wmi_roam_synch_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303655 wma_roam_synch_event_handler,
3656 WMA_RX_SERIALIZER_CTX);
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05303657 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303658 wmi_roam_synch_frame_event_id,
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05303659 wma_roam_synch_frame_event_handler,
3660 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003661#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
3662 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303663 wmi_rssi_breach_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303664 wma_rssi_breached_event_handler,
3665 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003666
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303667 qdf_wake_lock_create(&wma_handle->wmi_cmd_rsp_wake_lock,
Govind Singhd76a5b02016-03-08 15:12:14 +05303668 "wlan_fw_rsp_wakelock");
Prashanth Bhatta87b6dc02017-01-19 15:17:58 -08003669 qdf_runtime_lock_init(&wma_handle->wmi_cmd_rsp_runtime_lock);
Rajeev Kumarc58f7c22019-05-10 11:07:38 -07003670 qdf_runtime_lock_init(&wma_handle->sap_prevent_runtime_pm_lock);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003671
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003672 /* Register peer assoc conf event handler */
3673 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303674 wmi_peer_assoc_conf_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303675 wma_peer_assoc_conf_handler,
3676 WMA_RX_SERIALIZER_CTX);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003677 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303678 wmi_vdev_delete_resp_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303679 wma_vdev_delete_handler,
3680 WMA_RX_SERIALIZER_CTX);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003681 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303682 wmi_peer_delete_response_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303683 wma_peer_delete_handler,
3684 WMA_RX_SERIALIZER_CTX);
Arun Khandavalli2476ef52016-04-26 20:19:43 +05303685 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303686 wmi_chan_info_event_id,
Kapil Gupta4f0c0c12017-02-07 15:21:15 +05303687 wma_chan_info_event_handler,
3688 WMA_RX_SERIALIZER_CTX);
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08003689 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303690 wmi_dbg_mesg_flush_complete_event_id,
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08003691 wma_flush_complete_evt_handler,
Rajeev Kumarc3032b82017-02-14 15:56:01 -08003692 WMA_RX_WORK_CTX);
lifeng66831662017-05-19 16:01:35 +08003693 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303694 wmi_report_rx_aggr_failure_event_id,
lifeng66831662017-05-19 16:01:35 +08003695 wma_rx_aggr_failure_event_handler,
3696 WMA_RX_SERIALIZER_CTX);
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08003697
guangde4853c402019-05-06 15:54:04 +08003698 wmi_unified_register_event_handler(
3699 wma_handle->wmi_handle,
3700 wmi_coex_report_antenna_isolation_event_id,
3701 wma_antenna_isolation_event_handler,
3702 WMA_RX_SERIALIZER_CTX);
3703
Ashish Kumar Dhanotiya9335d812017-06-30 16:57:20 +05303704 wma_handle->ito_repeat_count = cds_cfg->ito_repeat_count;
Sandeep Puligilla819d94f2017-10-10 18:33:56 -07003705 wma_handle->bandcapability = cds_cfg->bandcapability;
Ashish Kumar Dhanotiya9335d812017-06-30 16:57:20 +05303706
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +05303707 /* Register PWR_SAVE_FAIL event only in case of recovery(1) */
Wu Gao66454f12018-09-26 19:55:41 +08003708 if (ucfg_pmo_get_auto_power_fail_mode(wma_handle->psoc) ==
Hanumanth Reddy Pothulaab395952017-09-05 19:12:26 +05303709 PMO_FW_TO_SEND_WOW_IND_ON_PWR_FAILURE) {
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +05303710 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303711 wmi_pdev_chip_pwr_save_failure_detect_event_id,
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +05303712 wma_chip_power_save_failure_detected_handler,
3713 WMA_RX_WORK_CTX);
3714 }
3715
lifengd217d192017-05-09 19:44:16 +08003716 wmi_unified_register_event_handler(wma_handle->wmi_handle,
lifengfe6c3e22018-04-03 12:10:04 +08003717 wmi_pdev_div_rssi_antid_event_id,
3718 wma_pdev_div_info_evt_handler,
lifengd217d192017-05-09 19:44:16 +08003719 WMA_RX_WORK_CTX);
3720
Frank Liu65b17d92016-11-23 15:58:44 +08003721
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05303722 wma_register_debug_callback();
Ashish Kumar Dhanotiyacd311c82018-09-14 10:55:10 +05303723 wifi_pos_register_get_phy_mode_cb(wma_handle->psoc,
3724 wma_get_phy_mode_cb);
3725
Mukul Sharma6411bb82017-03-01 15:57:07 +05303726 /* Register callback with PMO so PMO can update the vdev pause bitmap*/
3727 pmo_register_pause_bitmap_notifier(wma_handle->psoc,
3728 wma_vdev_update_pause_bitmap);
3729 pmo_register_get_pause_bitmap(wma_handle->psoc,
3730 wma_vdev_get_pause_bitmap);
Will Huangad015772018-06-15 11:27:50 +08003731 pmo_register_get_vdev_dp_handle(wma_handle->psoc,
3732 wma_vdev_get_vdev_dp_handle);
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +05303733 pmo_register_is_device_in_low_pwr_mode(wma_handle->psoc,
3734 wma_vdev_is_device_in_low_pwr_mode);
Nachiket Kukade37b4e6d2018-06-01 18:44:42 +05303735 pmo_register_get_dtim_period_callback(wma_handle->psoc,
3736 wma_vdev_get_dtim_period);
3737 pmo_register_get_beacon_interval_callback(wma_handle->psoc,
3738 wma_vdev_get_beacon_interval);
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07003739 wma_cbacks.wma_get_connection_info = wma_get_connection_info;
Nachiket Kukade15bd4f72019-02-19 17:30:50 +05303740 wma_register_nan_callbacks(wma_handle);
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07003741 qdf_status = policy_mgr_register_wma_cb(wma_handle->psoc, &wma_cbacks);
3742 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
3743 WMA_LOGE("Failed to register wma cb with Policy Manager");
3744 }
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05303745
Arif Hussainf63f7a32017-08-22 12:49:42 -07003746 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303747 wmi_phyerr_event_id,
Arif Hussainf63f7a32017-08-22 12:49:42 -07003748 wma_unified_phyerr_rx_event_handler,
3749 WMA_RX_WORK_CTX);
3750
Arif Hussainee10f902017-12-27 16:30:17 -08003751 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3752 wmi_sap_obss_detection_report_event_id,
3753 wma_vdev_obss_detection_info_handler,
3754 WMA_RX_SERIALIZER_CTX);
3755
Arif Hussain05fb4872018-01-03 16:02:55 -08003756 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3757 wmi_obss_color_collision_report_event_id,
3758 wma_vdev_bss_color_collision_info_handler,
3759 WMA_RX_WORK_CTX);
3760
Varun Reddy Yeturud33033f2018-06-11 10:58:30 -07003761#ifdef WLAN_SUPPORT_TWT
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -07003762 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3763 wmi_twt_enable_complete_event_id,
3764 wma_twt_en_complete_event_handler,
3765 WMA_RX_SERIALIZER_CTX);
3766#endif
3767
Nachiket Kukade177b5b02018-05-22 20:52:17 +05303768 wma_register_apf_events(wma_handle);
Visweswara Tanuku633976b2019-01-07 16:13:12 +05303769 wma_register_md_events(wma_handle);
Krunal Sonif9ba53d2019-01-03 21:44:41 -08003770 wma_register_wlm_stats_events(wma_handle);
Arun Kumar Khandavallideda5a82019-03-11 15:32:19 +05303771 wma_register_mws_coex_events(wma_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303772 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003773
3774err_dbglog_init:
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303775 qdf_wake_lock_destroy(&wma_handle->wmi_cmd_rsp_wake_lock);
Rajeev Kumarc58f7c22019-05-10 11:07:38 -07003776 qdf_runtime_lock_deinit(&wma_handle->sap_prevent_runtime_pm_lock);
Prashanth Bhatta87b6dc02017-01-19 15:17:58 -08003777 qdf_runtime_lock_deinit(&wma_handle->wmi_cmd_rsp_runtime_lock);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303778 qdf_spinlock_destroy(&wma_handle->vdev_respq_lock);
3779 qdf_spinlock_destroy(&wma_handle->wma_hold_req_q_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003780err_event_init:
3781 wmi_unified_unregister_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303782 wmi_debug_print_event_id);
Dustin Brownec2c92e2017-07-26 11:13:49 -07003783
3784 for (i = 0; i < wma_handle->max_bssid; ++i)
3785 wma_vdev_deinit(&wma_handle->interfaces[i]);
3786
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303787 qdf_mem_free(wma_handle->interfaces);
Dustin Brownec2c92e2017-07-26 11:13:49 -07003788
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003789err_scn_context:
Jeff Johnson2b6982c2018-05-29 14:56:11 -07003790 qdf_mem_free(((struct cds_context *) cds_context)->cfg_ctx);
Rajeev Kumarfe6e62f2018-10-22 16:18:41 -07003791 ((struct cds_context *)cds_context)->cfg_ctx = NULL;
Dustin Brown96310112019-02-21 16:42:58 -08003792 qdf_mem_free(wmi_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003793
3794err_wma_handle:
Zhu Jianminf9e2e2d2018-05-30 16:20:24 +08003795 wlan_objmgr_psoc_release_ref(psoc, WLAN_LEGACY_WMA_ID);
3796err_get_psoc_ref:
Arunk Khandavallia6305a32018-01-25 11:19:18 +05303797 target_if_free_psoc_tgt_info(psoc);
Anurag Chouhan6d760662016-02-20 16:05:43 +05303798 if (cds_get_conparam() != QDF_GLOBAL_FTM_MODE) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003799#ifdef FEATURE_WLAN_EXTSCAN
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303800 qdf_wake_lock_destroy(&wma_handle->extscan_wake_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003801#endif /* FEATURE_WLAN_EXTSCAN */
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303802 qdf_wake_lock_destroy(&wma_handle->wow_wake_lock);
Mukul Sharmae44d0542017-05-23 21:50:56 +05303803 qdf_wake_lock_destroy(&wma_handle->wow_auth_req_wl);
3804 qdf_wake_lock_destroy(&wma_handle->wow_assoc_req_wl);
3805 qdf_wake_lock_destroy(&wma_handle->wow_deauth_rec_wl);
3806 qdf_wake_lock_destroy(&wma_handle->wow_disassoc_rec_wl);
3807 qdf_wake_lock_destroy(&wma_handle->wow_ap_assoc_lost_wl);
3808 qdf_wake_lock_destroy(&wma_handle->wow_auto_shutdown_wl);
3809 qdf_wake_lock_destroy(&wma_handle->roam_ho_wl);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003810 }
Arunk Khandavallia6305a32018-01-25 11:19:18 +05303811err_free_wma_handle:
Jeff Johnsonadb3b1c2017-09-13 10:42:36 -07003812 cds_free_context(QDF_MODULE_ID_WMA, wma_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003813
3814 WMA_LOGD("%s: Exit", __func__);
3815
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303816 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003817}
3818
3819/**
3820 * wma_pre_start() - wma pre start
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003821 *
3822 * Return: 0 on success, errno on failure
3823 */
Jeff Johnson8ad89c62017-09-13 08:55:55 -07003824QDF_STATUS wma_pre_start(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003825{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303826 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003827 tp_wma_handle wma_handle;
Arunk Khandavallia6305a32018-01-25 11:19:18 +05303828 void *htc_handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003829
3830 WMA_LOGD("%s: Enter", __func__);
3831
Anurag Chouhan6d760662016-02-20 16:05:43 +05303832 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003833
3834 /* Validate the wma_handle */
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07003835 if (!wma_handle) {
Arunk Khandavallia6305a32018-01-25 11:19:18 +05303836 WMA_LOGE("%s: invalid wma handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303837 qdf_status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003838 goto end;
3839 }
Nachiket Kukade8003d252017-03-30 15:55:58 +05303840
Sourav Mohapatracf632572018-04-02 11:01:35 +05303841 htc_handle = lmac_get_htc_hdl(wma_handle->psoc);
Arunk Khandavallia6305a32018-01-25 11:19:18 +05303842 if (!htc_handle) {
3843 WMA_LOGE("%s: invalid htc handle", __func__);
3844 qdf_status = QDF_STATUS_E_INVAL;
3845 goto end;
3846 }
3847
3848 /* Open endpoint for ctrl path - WMI <--> HTC */
3849 qdf_status = wmi_unified_connect_htc_service(wma_handle->wmi_handle,
3850 htc_handle);
3851 if (qdf_status != QDF_STATUS_SUCCESS) {
3852 WMA_LOGE("%s: wmi_unified_connect_htc_service", __func__);
Nachiket Kukade8003d252017-03-30 15:55:58 +05303853 if (!cds_is_fw_down())
3854 QDF_BUG(0);
3855
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303856 qdf_status = QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003857 goto end;
3858 }
3859
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08003860 WMA_LOGD("WMA --> wmi_unified_connect_htc_service - success");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003861
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003862end:
3863 WMA_LOGD("%s: Exit", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303864 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003865}
3866
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303867void wma_send_msg_by_priority(tp_wma_handle wma_handle, uint16_t msg_type,
3868 void *body_ptr, uint32_t body_val, bool is_high_priority)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003869{
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303870 struct scheduler_msg msg = {0};
3871 QDF_STATUS status;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003872
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003873 msg.type = msg_type;
3874 msg.bodyval = body_val;
3875 msg.bodyptr = body_ptr;
Will Huang9323e852018-02-02 17:55:15 +08003876 msg.flush_callback = wma_discard_fw_event;
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303877
3878 status = scheduler_post_msg_by_priority(QDF_MODULE_ID_PE,
3879 &msg, is_high_priority);
3880 if (!QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303881 if (body_ptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303882 qdf_mem_free(body_ptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003883 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003884}
3885
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303886
3887void wma_send_msg(tp_wma_handle wma_handle, uint16_t msg_type,
3888 void *body_ptr, uint32_t body_val)
3889{
3890 wma_send_msg_by_priority(wma_handle, msg_type,
3891 body_ptr, body_val, false);
3892}
3893
3894void wma_send_msg_high_priority(tp_wma_handle wma_handle, uint16_t msg_type,
3895 void *body_ptr, uint32_t body_val)
3896{
3897 wma_send_msg_by_priority(wma_handle, msg_type,
3898 body_ptr, body_val, true);
3899}
3900
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003901/**
3902 * wma_set_base_macaddr_indicate() - set base mac address in fw
3903 * @wma_handle: wma handle
3904 * @customAddr: base mac address
3905 *
3906 * Return: 0 for success or error code
3907 */
3908static int wma_set_base_macaddr_indicate(tp_wma_handle wma_handle,
3909 tSirMacAddr *customAddr)
3910{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003911 int err;
3912
Govind Singhf25a0f12016-03-08 16:09:48 +05303913 err = wmi_unified_set_base_macaddr_indicate_cmd(wma_handle->wmi_handle,
3914 (uint8_t *)customAddr);
3915 if (err)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003916 return -EIO;
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -07003917 wma_debug("Base MAC Addr: " QDF_MAC_ADDR_STR,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -07003918 QDF_MAC_ADDR_ARRAY((*customAddr)));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003919
3920 return 0;
3921}
3922
3923/**
3924 * wma_log_supported_evt_handler() - Enable/Disable FW diag/log events
3925 * @handle: WMA handle
3926 * @event: Event received from FW
3927 * @len: Length of the event
3928 *
3929 * Enables the low frequency events and disables the high frequency
3930 * events. Bit 17 indicates if the event if low/high frequency.
3931 * 1 - high frequency, 0 - low frequency
3932 *
3933 * Return: 0 on successfully enabling/disabling the events
3934 */
3935static int wma_log_supported_evt_handler(void *handle,
3936 uint8_t *event,
3937 uint32_t len)
3938{
3939 tp_wma_handle wma = (tp_wma_handle) handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003940
Govind Singhf25a0f12016-03-08 16:09:48 +05303941 if (wmi_unified_log_supported_evt_cmd(wma->wmi_handle,
3942 event, len))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003943 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003944
3945 return 0;
3946}
3947
3948/**
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303949 * wma_pdev_set_hw_mode_resp_evt_handler() - Set HW mode resp evt handler
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003950 * @handle: WMI handle
3951 * @event: Event recevied from FW
3952 * @len: Length of the event
3953 *
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303954 * Event handler for WMI_PDEV_SET_HW_MODE_RESP_EVENTID that is sent to host
3955 * driver in response to a WMI_PDEV_SET_HW_MODE_CMDID being sent to WLAN
3956 * firmware
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003957 *
Dustin Brownec2c92e2017-07-26 11:13:49 -07003958 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003959 */
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303960static int wma_pdev_set_hw_mode_resp_evt_handler(void *handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003961 uint8_t *event,
3962 uint32_t len)
3963{
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303964 WMI_PDEV_SET_HW_MODE_RESP_EVENTID_param_tlvs *param_buf;
3965 wmi_pdev_set_hw_mode_response_event_fixed_param *wmi_event;
3966 wmi_pdev_set_hw_mode_response_vdev_mac_entry *vdev_mac_entry;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003967 uint32_t i;
3968 struct sir_set_hw_mode_resp *hw_mode_resp;
3969 tp_wma_handle wma = (tp_wma_handle) handle;
3970
3971 if (!wma) {
3972 WMA_LOGE("%s: Invalid WMA handle", __func__);
3973 /* Since WMA handle itself is NULL, we cannot send fail
3974 * response back to LIM here
3975 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303976 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003977 }
Dustin Brownec2c92e2017-07-26 11:13:49 -07003978
3979 wma_release_wakelock(&wma->wmi_cmd_rsp_wake_lock);
Tushnim Bhattacharyya4a03db82017-11-10 17:58:28 -08003980 wma_remove_req(wma, 0, WMA_PDEV_SET_HW_MODE_RESP);
Dustin Brownec2c92e2017-07-26 11:13:49 -07003981
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303982 hw_mode_resp = qdf_mem_malloc(sizeof(*hw_mode_resp));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003983 if (!hw_mode_resp) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003984 /* Since this memory allocation itself failed, we cannot
3985 * send fail response back to LIM here
3986 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303987 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003988 }
3989
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303990 param_buf = (WMI_PDEV_SET_HW_MODE_RESP_EVENTID_param_tlvs *) event;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003991 if (!param_buf) {
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303992 WMA_LOGE("Invalid WMI_PDEV_SET_HW_MODE_RESP_EVENTID event");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003993 /* Need to send response back to upper layer to free
3994 * active command list
3995 */
3996 goto fail;
3997 }
Krunal Soni50a05542017-10-03 19:39:48 -07003998 if (param_buf->fixed_param->num_vdev_mac_entries >=
3999 MAX_VDEV_SUPPORTED) {
4000 WMA_LOGE("num_vdev_mac_entries crossed max value");
4001 goto fail;
4002 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004003
4004 wmi_event = param_buf->fixed_param;
Abhinav Kumara03659c2017-12-28 15:18:07 +05304005 if (wmi_event->num_vdev_mac_entries >
4006 param_buf->num_wmi_pdev_set_hw_mode_response_vdev_mac_mapping) {
4007 WMA_LOGE("Invalid num_vdev_mac_entries: %d",
4008 wmi_event->num_vdev_mac_entries);
4009 goto fail;
4010 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004011 hw_mode_resp->status = wmi_event->status;
4012 hw_mode_resp->cfgd_hw_mode_index = wmi_event->cfgd_hw_mode_index;
4013 hw_mode_resp->num_vdev_mac_entries = wmi_event->num_vdev_mac_entries;
4014
Kiran Kumar Lokere1d411bb2017-11-29 15:24:05 -08004015 WMA_LOGD("%s: status:%d cfgd_hw_mode_index:%d num_vdev_mac_entries:%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004016 __func__, wmi_event->status,
4017 wmi_event->cfgd_hw_mode_index,
4018 wmi_event->num_vdev_mac_entries);
4019 vdev_mac_entry =
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05304020 param_buf->wmi_pdev_set_hw_mode_response_vdev_mac_mapping;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004021
4022 /* Store the vdev-mac map in WMA and prepare to send to PE */
4023 for (i = 0; i < wmi_event->num_vdev_mac_entries; i++) {
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05304024 uint32_t vdev_id, mac_id, pdev_id;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004025
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004026 vdev_id = vdev_mac_entry[i].vdev_id;
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05304027 pdev_id = vdev_mac_entry[i].pdev_id;
4028 if (pdev_id == WMI_PDEV_ID_SOC) {
4029 WMA_LOGE("%s: soc level id received for mac id)",
Tushnim Bhattacharyyac23d56c2018-10-05 14:11:43 -07004030 __func__);
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05304031 goto fail;
4032 }
Pragaspathi Thilagaraj0092b672018-05-23 17:08:45 +05304033 if (vdev_id >= wma->max_bssid) {
4034 WMA_LOGE("%s: vdev_id: %d is invalid, max_bssid: %d",
4035 __func__, vdev_id, wma->max_bssid);
4036 goto fail;
4037 }
4038
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05304039 mac_id = WMA_PDEV_TO_MAC_MAP(vdev_mac_entry[i].pdev_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004040
Kiran Kumar Lokere1d411bb2017-11-29 15:24:05 -08004041 WMA_LOGD("%s: vdev_id:%d mac_id:%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004042 __func__, vdev_id, mac_id);
4043
4044 hw_mode_resp->vdev_mac_map[i].vdev_id = vdev_id;
4045 hw_mode_resp->vdev_mac_map[i].mac_id = mac_id;
4046 wma_update_intf_hw_mode_params(vdev_id, mac_id,
4047 wmi_event->cfgd_hw_mode_index);
4048 }
4049
4050 if (hw_mode_resp->status == SET_HW_MODE_STATUS_OK) {
4051 if (WMA_DEFAULT_HW_MODE_INDEX == wma->new_hw_mode_index) {
4052 wma->new_hw_mode_index = wmi_event->cfgd_hw_mode_index;
4053 } else {
4054 wma->old_hw_mode_index = wma->new_hw_mode_index;
4055 wma->new_hw_mode_index = wmi_event->cfgd_hw_mode_index;
4056 }
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07004057 policy_mgr_update_hw_mode_index(wma->psoc,
4058 wmi_event->cfgd_hw_mode_index);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004059 }
4060
Kiran Kumar Lokere1d411bb2017-11-29 15:24:05 -08004061 WMA_LOGD("%s: Updated: old_hw_mode_index:%d new_hw_mode_index:%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004062 __func__, wma->old_hw_mode_index, wma->new_hw_mode_index);
4063
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05304064 wma_send_msg(wma, SIR_HAL_PDEV_SET_HW_MODE_RESP,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004065 (void *) hw_mode_resp, 0);
4066
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304067 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004068
4069fail:
4070 WMA_LOGE("%s: Sending fail response to LIM", __func__);
4071 hw_mode_resp->status = SET_HW_MODE_STATUS_ECANCELED;
4072 hw_mode_resp->cfgd_hw_mode_index = 0;
4073 hw_mode_resp->num_vdev_mac_entries = 0;
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05304074 wma_send_msg(wma, SIR_HAL_PDEV_SET_HW_MODE_RESP,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004075 (void *) hw_mode_resp, 0);
4076
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304077 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004078}
4079
4080/**
Naveen Rawat8cc23b02016-07-14 12:22:56 -07004081 * wma_process_pdev_hw_mode_trans_ind() - Process HW mode transition info
4082 *
4083 * @handle: WMA handle
4084 * @fixed_param: Event fixed parameters
4085 * @vdev_mac_entry - vdev mac entry
4086 * @hw_mode_trans_ind - Buffer to store parsed information
4087 *
4088 * Parses fixed_param, vdev_mac_entry and fills in the information into
4089 * hw_mode_trans_ind and wma
4090 *
4091 * Return: None
4092 */
4093void wma_process_pdev_hw_mode_trans_ind(void *handle,
4094 wmi_pdev_hw_mode_transition_event_fixed_param *fixed_param,
4095 wmi_pdev_set_hw_mode_response_vdev_mac_entry *vdev_mac_entry,
4096 struct sir_hw_mode_trans_ind *hw_mode_trans_ind)
4097{
4098 uint32_t i;
4099 tp_wma_handle wma = (tp_wma_handle) handle;
Harprit Chhabada3cfca962018-12-04 13:41:31 -08004100
gaurank kathpaliad2967a72018-05-01 12:35:14 +05304101 if (fixed_param->num_vdev_mac_entries > MAX_VDEV_SUPPORTED) {
4102 WMA_LOGE("Number of Vdev mac entries %d exceeded"
4103 " max vdev supported %d",
4104 fixed_param->num_vdev_mac_entries,
4105 MAX_VDEV_SUPPORTED);
4106 return;
4107 }
Naveen Rawat8cc23b02016-07-14 12:22:56 -07004108 hw_mode_trans_ind->old_hw_mode_index = fixed_param->old_hw_mode_index;
4109 hw_mode_trans_ind->new_hw_mode_index = fixed_param->new_hw_mode_index;
4110 hw_mode_trans_ind->num_vdev_mac_entries =
4111 fixed_param->num_vdev_mac_entries;
Kiran Kumar Lokere1d411bb2017-11-29 15:24:05 -08004112 WMA_LOGD("%s: old_hw_mode_index:%d new_hw_mode_index:%d entries=%d",
Naveen Rawat8cc23b02016-07-14 12:22:56 -07004113 __func__, fixed_param->old_hw_mode_index,
4114 fixed_param->new_hw_mode_index,
4115 fixed_param->num_vdev_mac_entries);
4116
Harprit Chhabada3cfca962018-12-04 13:41:31 -08004117 if (!vdev_mac_entry) {
4118 WMA_LOGE("Invalid vdev_mac_entry");
4119 return;
4120 }
4121
Naveen Rawat8cc23b02016-07-14 12:22:56 -07004122 /* Store the vdev-mac map in WMA and send to policy manager */
4123 for (i = 0; i < fixed_param->num_vdev_mac_entries; i++) {
4124 uint32_t vdev_id, mac_id, pdev_id;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004125
Naveen Rawat8cc23b02016-07-14 12:22:56 -07004126 vdev_id = vdev_mac_entry[i].vdev_id;
4127 pdev_id = vdev_mac_entry[i].pdev_id;
4128
4129 if (pdev_id == WMI_PDEV_ID_SOC) {
4130 WMA_LOGE("%s: soc level id received for mac id)",
Tushnim Bhattacharyyac23d56c2018-10-05 14:11:43 -07004131 __func__);
Naveen Rawat8cc23b02016-07-14 12:22:56 -07004132 return;
4133 }
Pragaspathi Thilagaraj0092b672018-05-23 17:08:45 +05304134 if (vdev_id >= wma->max_bssid) {
4135 WMA_LOGE("%s: vdev_id: %d is invalid, max_bssid: %d",
4136 __func__, vdev_id, wma->max_bssid);
4137 return;
4138 }
Naveen Rawat8cc23b02016-07-14 12:22:56 -07004139
4140 mac_id = WMA_PDEV_TO_MAC_MAP(vdev_mac_entry[i].pdev_id);
4141
Jianmin Zhucc6b3d02019-03-07 14:19:34 +08004142 wma_debug("vdev_id:%d mac_id:%d", vdev_id, mac_id);
Naveen Rawat8cc23b02016-07-14 12:22:56 -07004143
4144 hw_mode_trans_ind->vdev_mac_map[i].vdev_id = vdev_id;
4145 hw_mode_trans_ind->vdev_mac_map[i].mac_id = mac_id;
4146 wma_update_intf_hw_mode_params(vdev_id, mac_id,
4147 fixed_param->new_hw_mode_index);
4148 }
4149 wma->old_hw_mode_index = fixed_param->old_hw_mode_index;
4150 wma->new_hw_mode_index = fixed_param->new_hw_mode_index;
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07004151 policy_mgr_update_new_hw_mode_index(wma->psoc,
4152 fixed_param->new_hw_mode_index);
4153 policy_mgr_update_old_hw_mode_index(wma->psoc,
4154 fixed_param->old_hw_mode_index);
Naveen Rawat8cc23b02016-07-14 12:22:56 -07004155
Kiran Kumar Lokere1d411bb2017-11-29 15:24:05 -08004156 WMA_LOGD("%s: Updated: old_hw_mode_index:%d new_hw_mode_index:%d",
Naveen Rawat8cc23b02016-07-14 12:22:56 -07004157 __func__, wma->old_hw_mode_index, wma->new_hw_mode_index);
4158}
4159
4160/**
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05304161 * wma_pdev_hw_mode_transition_evt_handler() - HW mode transition evt handler
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004162 * @handle: WMI handle
4163 * @event: Event recevied from FW
4164 * @len: Length of the event
4165 *
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05304166 * Event handler for WMI_PDEV_HW_MODE_TRANSITION_EVENTID that indicates an
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004167 * asynchronous hardware mode transition. This event notifies the host driver
4168 * that firmware independently changed the hardware mode for some reason, such
4169 * as Coex, LFR 3.0, etc
4170 *
4171 * Return: Success on receiving valid params from FW
4172 */
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05304173static int wma_pdev_hw_mode_transition_evt_handler(void *handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004174 uint8_t *event,
4175 uint32_t len)
4176{
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05304177 WMI_PDEV_HW_MODE_TRANSITION_EVENTID_param_tlvs *param_buf;
4178 wmi_pdev_hw_mode_transition_event_fixed_param *wmi_event;
4179 wmi_pdev_set_hw_mode_response_vdev_mac_entry *vdev_mac_entry;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004180 struct sir_hw_mode_trans_ind *hw_mode_trans_ind;
4181 tp_wma_handle wma = (tp_wma_handle) handle;
4182
4183 if (!wma) {
4184 /* This is an async event. So, not sending any event to LIM */
4185 WMA_LOGE("Invalid WMA handle");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304186 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004187 }
4188
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05304189 param_buf = (WMI_PDEV_HW_MODE_TRANSITION_EVENTID_param_tlvs *) event;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004190 if (!param_buf) {
4191 /* This is an async event. So, not sending any event to LIM */
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05304192 WMA_LOGE("Invalid WMI_PDEV_HW_MODE_TRANSITION_EVENTID event");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304193 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004194 }
4195
Arif Hussain34f72062017-10-04 17:25:24 -07004196 if (param_buf->fixed_param->num_vdev_mac_entries > MAX_VDEV_SUPPORTED) {
4197 WMA_LOGE("num_vdev_mac_entries: %d crossed max value: %d",
4198 param_buf->fixed_param->num_vdev_mac_entries,
4199 MAX_VDEV_SUPPORTED);
4200 return QDF_STATUS_E_FAILURE;
4201 }
4202
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304203 hw_mode_trans_ind = qdf_mem_malloc(sizeof(*hw_mode_trans_ind));
Arif Hussain157263f2018-10-03 13:07:15 -07004204 if (!hw_mode_trans_ind)
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004205 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004206
4207 wmi_event = param_buf->fixed_param;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004208 vdev_mac_entry =
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05304209 param_buf->wmi_pdev_set_hw_mode_response_vdev_mac_mapping;
Abhinav Kumara03659c2017-12-28 15:18:07 +05304210 if (wmi_event->num_vdev_mac_entries >
4211 param_buf->num_wmi_pdev_set_hw_mode_response_vdev_mac_mapping) {
4212 WMA_LOGE("Invalid num_vdev_mac_entries: %d",
4213 wmi_event->num_vdev_mac_entries);
4214 qdf_mem_free(hw_mode_trans_ind);
4215 return -EINVAL;
4216 }
Naveen Rawat8cc23b02016-07-14 12:22:56 -07004217 wma_process_pdev_hw_mode_trans_ind(wma, wmi_event, vdev_mac_entry,
4218 hw_mode_trans_ind);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004219 /* Pass the message to PE */
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05304220 wma_send_msg(wma, SIR_HAL_PDEV_HW_MODE_TRANS_IND,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004221 (void *) hw_mode_trans_ind, 0);
4222
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304223 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004224}
4225
4226/**
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05304227 * wma_pdev_set_dual_mode_config_resp_evt_handler() - Dual mode evt handler
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004228 * @handle: WMI handle
4229 * @event: Event received from FW
4230 * @len: Length of the event
4231 *
4232 * Notifies the host driver of the completion or failure of a
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05304233 * WMI_PDEV_SET_MAC_CONFIG_CMDID command. This event would be returned to
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004234 * the host driver once the firmware has completed a reconfiguration of the Scan
4235 * and FW mode configuration. This changes could include entering or leaving a
4236 * dual mac configuration for either scan and/or more permanent firmware mode.
4237 *
4238 * Return: Success on receiving valid params from FW
4239 */
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05304240static int wma_pdev_set_dual_mode_config_resp_evt_handler(void *handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004241 uint8_t *event,
4242 uint32_t len)
4243{
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05304244 WMI_PDEV_SET_MAC_CONFIG_RESP_EVENTID_param_tlvs *param_buf;
4245 wmi_pdev_set_mac_config_response_event_fixed_param *wmi_event;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004246 tp_wma_handle wma = (tp_wma_handle) handle;
4247 struct sir_dual_mac_config_resp *dual_mac_cfg_resp;
4248
4249 if (!wma) {
4250 WMA_LOGE("%s: Invalid WMA handle", __func__);
4251 /* Since the WMA handle is NULL, we cannot send resp to LIM.
4252 * So, returning from here.
4253 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304254 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004255 }
Krunal Sonia5ccb802017-07-03 12:59:40 -07004256 wma_release_wakelock(&wma->wmi_cmd_rsp_wake_lock);
Abhishek Singhd93a0b22018-10-30 17:04:56 +05304257 wma_remove_req(wma, 0, WMA_PDEV_MAC_CFG_RESP);
4258
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304259 dual_mac_cfg_resp = qdf_mem_malloc(sizeof(*dual_mac_cfg_resp));
Arif Hussain157263f2018-10-03 13:07:15 -07004260 if (!dual_mac_cfg_resp)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004261 /* Since the mem alloc failed, we cannot send resp to LIM.
4262 * So, returning from here.
4263 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304264 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004265
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05304266 param_buf = (WMI_PDEV_SET_MAC_CONFIG_RESP_EVENTID_param_tlvs *)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004267 event;
4268 if (!param_buf) {
4269 WMA_LOGE("%s: Invalid event", __func__);
4270 goto fail;
4271 }
4272
4273 wmi_event = param_buf->fixed_param;
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004274 WMA_LOGD("%s: status:%d", __func__, wmi_event->status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004275 dual_mac_cfg_resp->status = wmi_event->status;
4276
4277 if (SET_HW_MODE_STATUS_OK == dual_mac_cfg_resp->status) {
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07004278 policy_mgr_update_dbs_scan_config(wma->psoc);
4279 policy_mgr_update_dbs_fw_config(wma->psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004280 }
4281
4282 /* Pass the message to PE */
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05304283 wma_send_msg(wma, SIR_HAL_PDEV_MAC_CFG_RESP,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004284 (void *) dual_mac_cfg_resp, 0);
4285
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304286 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004287
4288fail:
4289 WMA_LOGE("%s: Sending fail response to LIM", __func__);
4290 dual_mac_cfg_resp->status = SET_HW_MODE_STATUS_ECANCELED;
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05304291 wma_send_msg(wma, SIR_HAL_PDEV_MAC_CFG_RESP,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004292 (void *) dual_mac_cfg_resp, 0);
4293
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304294 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004295
4296}
4297
4298/**
gaurank kathpalia85f8a612018-02-21 18:55:24 +05304299 * wma_send_time_stamp_sync_cmd() - timer callback send timestamp to
4300 * firmware to sync with host.
4301 * @wma_handle: wma handle
4302 *
4303 * Return: void
4304 */
4305static void wma_send_time_stamp_sync_cmd(void *data)
4306{
4307 tp_wma_handle wma_handle;
4308 QDF_STATUS qdf_status;
4309
4310 wma_handle = (tp_wma_handle) data;
4311
4312 wmi_send_time_stamp_sync_cmd_tlv(wma_handle->wmi_handle);
4313
4314 /* Start/Restart the timer */
4315 qdf_status = qdf_mc_timer_start(&wma_handle->wma_fw_time_sync_timer,
4316 WMA_FW_TIME_SYNC_TIMER);
4317 if (QDF_IS_STATUS_ERROR(qdf_status))
4318 WMA_LOGE("Failed to start the firmware time sync timer");
4319}
4320
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07004321#ifdef WLAN_CONV_SPECTRAL_ENABLE
4322static void wma_register_spectral_cmds(tp_wma_handle wma_handle)
4323{
4324 struct wmi_spectral_cmd_ops cmd_ops;
4325
4326 cmd_ops.wmi_spectral_configure_cmd_send =
4327 wmi_unified_vdev_spectral_configure_cmd_send;
4328 cmd_ops.wmi_spectral_enable_cmd_send =
4329 wmi_unified_vdev_spectral_enable_cmd_send;
4330 wlan_register_wmi_spectral_cmd_ops(wma_handle->pdev, &cmd_ops);
4331}
4332#else
4333static void wma_register_spectral_cmds(tp_wma_handle wma_handle)
4334{
4335}
4336#endif
gaurank kathpalia85f8a612018-02-21 18:55:24 +05304337/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004338 * wma_start() - wma start function.
Jeff Johnsonc97816c2018-05-12 17:13:23 -07004339 * Initialize event handlers and timers.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004340 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05304341 * Return: 0 on success, QDF Error on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004342 */
Jeff Johnsond4892552017-09-13 08:41:31 -07004343QDF_STATUS wma_start(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004344{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304345 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004346 tp_wma_handle wma_handle;
4347 int status;
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304348 struct wmi_unified *wmi_handle;
Ke Huangae49ad02018-11-27 10:53:11 +08004349 struct mac_context *mac = NULL;
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07004350
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004351 WMA_LOGD("%s: Enter", __func__);
4352
Anurag Chouhan6d760662016-02-20 16:05:43 +05304353 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004354 /* validate the wma_handle */
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07004355 if (!wma_handle) {
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304356 WMA_LOGE("%s: Invalid wma handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304357 qdf_status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004358 goto end;
4359 }
Sandeep Puligillad698bf52017-09-15 16:07:02 -07004360
Sourav Mohapatracf632572018-04-02 11:01:35 +05304361 wmi_handle = get_wmi_unified_hdl_from_psoc(wma_handle->psoc);
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304362 if (!wmi_handle) {
4363 WMA_LOGE("%s: Invalid wmi handle", __func__);
4364 qdf_status = QDF_STATUS_E_INVAL;
4365 goto end;
4366 }
4367
Ke Huangae49ad02018-11-27 10:53:11 +08004368 mac = cds_get_context(QDF_MODULE_ID_PE);
4369 if (!mac) {
4370 WMA_LOGE("%s: Invalid mac context", __func__);
4371 goto end;
4372 }
4373
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304374 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304375 wmi_roam_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05304376 wma_roam_event_callback,
Padma, Santhosh Kumar18169ce2017-03-02 18:04:02 +05304377 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004378 if (0 != status) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004379 WMA_LOGE("%s: Failed to register Roam callback", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304380 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004381 goto end;
4382 }
4383
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304384 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304385 wmi_wow_wakeup_host_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05304386 wma_wow_wakeup_host_event,
4387 WMA_RX_TASKLET_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004388 if (status) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004389 WMA_LOGE("%s: Failed to register wow wakeup host event handler",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004390 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304391 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004392 goto end;
4393 }
4394
Will Huang3cd2b7c2017-11-17 13:16:56 +08004395 if (wma_d0_wow_is_supported()) {
4396 status = wmi_unified_register_event_handler(
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304397 wmi_handle,
Will Huang9adefff2017-12-15 14:50:03 +08004398 wmi_d0_wow_disable_ack_event_id,
Will Huang3cd2b7c2017-11-17 13:16:56 +08004399 wma_d0_wow_disable_ack_event,
4400 WMA_RX_TASKLET_CTX);
4401 if (status) {
4402 WMA_LOGE("%s: Failed to register d0wow disable ack"
4403 " event handler", __func__);
4404 qdf_status = QDF_STATUS_E_FAILURE;
4405 goto end;
4406 }
4407 }
4408
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304409 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304410 wmi_pdev_resume_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05304411 wma_pdev_resume_event_handler,
4412 WMA_RX_TASKLET_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004413 if (status) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004414 WMA_LOGE("%s: Failed to register PDEV resume event handler",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004415 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304416 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004417 goto end;
4418 }
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05304419#if defined(QCA_LL_LEGACY_TX_FLOW_CONTROL) || \
4420 defined(QCA_LL_TX_FLOW_CONTROL_V2) || defined(CONFIG_HL_SUPPORT)
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08004421 WMA_LOGD("MCC TX Pause Event Handler register");
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304422 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304423 wmi_tx_pause_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05304424 wma_mcc_vdev_tx_pause_evt_handler,
4425 WMA_RX_TASKLET_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004426#endif /* QCA_LL_LEGACY_TX_FLOW_CONTROL */
4427
Kabilan Kannancaa85502018-04-13 18:04:58 -07004428 WMA_LOGD("Registering SAR2 response handler");
4429 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
4430 wmi_wlan_sar2_result_event_id,
4431 wma_sar_rsp_evt_handler,
4432 WMA_RX_SERIALIZER_CTX);
4433 if (status) {
4434 WMA_LOGE("Failed to register sar response event cb");
4435 qdf_status = QDF_STATUS_E_FAILURE;
4436 goto end;
4437 }
4438
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004439#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
4440 WMA_LOGD("Registering auto shutdown handler");
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304441 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304442 wmi_host_auto_shutdown_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05304443 wma_auto_shutdown_event_handler,
4444 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004445 if (status) {
4446 WMA_LOGE("Failed to register WMI Auto shutdown event handler");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304447 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004448 goto end;
4449 }
4450#endif /* FEATURE_WLAN_AUTO_SHUTDOWN */
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304451 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304452 wmi_thermal_mgmt_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05304453 wma_thermal_mgmt_evt_handler,
4454 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004455 if (status) {
4456 WMA_LOGE("Failed to register thermal mitigation event cb");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304457 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004458 goto end;
4459 }
4460
Zhang Qian47e22ce2018-01-04 15:38:38 +08004461 status = wma_ocb_register_callbacks(wma_handle);
4462 if (!QDF_IS_STATUS_SUCCESS(status)) {
4463 WMA_LOGE("Failed to register OCB callbacks");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304464 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004465 goto end;
4466 }
4467
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304468 qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004469
4470#ifdef QCA_WIFI_FTM
4471 /*
4472 * Tx mgmt attach requires TXRX context which is not created
4473 * in FTM mode. So skip the TX mgmt attach.
4474 */
Anurag Chouhan6d760662016-02-20 16:05:43 +05304475 if (cds_get_conparam() == QDF_GLOBAL_FTM_MODE)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004476 goto end;
4477#endif /* QCA_WIFI_FTM */
4478
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304479 if (wmi_service_enabled(wmi_handle, wmi_service_rmc)) {
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08004480
4481 WMA_LOGD("FW supports cesium network, registering event handlers");
4482
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004483 status = wmi_unified_register_event_handler(
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304484 wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304485 wmi_peer_info_event_id,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004486 wma_ibss_peer_info_event_handler,
4487 WMA_RX_SERIALIZER_CTX);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08004488 if (status) {
4489 WMA_LOGE("Failed to register ibss peer info event cb");
4490 qdf_status = QDF_STATUS_E_FAILURE;
4491 goto end;
4492 }
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004493 status = wmi_unified_register_event_handler(
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304494 wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304495 wmi_peer_tx_fail_cnt_thr_event_id,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004496 wma_fast_tx_fail_event_handler,
4497 WMA_RX_SERIALIZER_CTX);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08004498 if (status) {
4499 WMA_LOGE("Failed to register peer fast tx failure event cb");
4500 qdf_status = QDF_STATUS_E_FAILURE;
4501 goto end;
4502 }
4503 } else {
4504 WMA_LOGE("Target does not support cesium network");
4505 }
4506
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304507 qdf_status = wma_tx_attach(wma_handle);
4508 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004509 WMA_LOGE("%s: Failed to register tx management", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004510 goto end;
4511 }
4512
Wu Gaof3cbeaf2019-01-15 18:26:25 +08004513 if (!mac->mlme_cfg->gen.enable_remove_time_stamp_sync_cmd &&
4514 cds_get_conparam() != QDF_GLOBAL_FTM_MODE) {
4515 /* Initialize firmware time stamp sync timer */
4516 qdf_status = qdf_mc_timer_init(
Ke Huangae49ad02018-11-27 10:53:11 +08004517 &wma_handle->wma_fw_time_sync_timer,
4518 QDF_TIMER_TYPE_SW,
4519 wma_send_time_stamp_sync_cmd,
4520 wma_handle);
Wu Gaof3cbeaf2019-01-15 18:26:25 +08004521 if (QDF_IS_STATUS_ERROR(qdf_status)) {
4522 WMA_LOGE("Failed to init fw time sync timer");
4523 goto end;
Lin Bai5dc8ddb2018-08-23 17:46:34 +08004524 }
Wu Gaof3cbeaf2019-01-15 18:26:25 +08004525
4526 /* Start firmware time stamp sync timer */
4527 wma_send_time_stamp_sync_cmd(wma_handle);
gaurank kathpalia85f8a612018-02-21 18:55:24 +05304528 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004529 /* Initialize log completion timeout */
Anurag Chouhan210db072016-02-22 18:42:15 +05304530 qdf_status = qdf_mc_timer_init(&wma_handle->log_completion_timer,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304531 QDF_TIMER_TYPE_SW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004532 wma_log_completion_timeout,
4533 wma_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304534 if (qdf_status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004535 WMA_LOGE("Failed to initialize log completion timeout");
4536 goto end;
4537 }
4538
Jeff Johnson6136fb92017-03-30 15:21:49 -07004539 status = wma_fips_register_event_handlers(wma_handle);
4540 if (!QDF_IS_STATUS_SUCCESS(status)) {
4541 WMA_LOGE("Failed to register FIPS event handler");
4542 qdf_status = QDF_STATUS_E_FAILURE;
4543 goto end;
4544 }
4545
Jeff Johnsonf0e54b02017-12-18 15:22:25 -08004546 status = wma_sar_register_event_handlers(wma_handle);
4547 if (!QDF_IS_STATUS_SUCCESS(status)) {
4548 WMA_LOGE("Failed to register SAR event handlers");
4549 qdf_status = QDF_STATUS_E_FAILURE;
4550 goto end;
4551 }
4552
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004553 /* Initialize the get temperature event handler */
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304554 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304555 wmi_pdev_temperature_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05304556 wma_pdev_temperature_evt_handler,
4557 WMA_RX_SERIALIZER_CTX);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304558 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004559 WMA_LOGE("Failed to register get_temperature event cb");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304560 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004561 goto end;
4562 }
4563
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304564 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304565 wmi_vdev_tsf_report_event_id,
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07004566 wma_vdev_tsf_handler,
4567 WMA_RX_SERIALIZER_CTX);
4568 if (0 != status) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004569 WMA_LOGE("%s: Failed to register tsf callback", __func__);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07004570 qdf_status = QDF_STATUS_E_FAILURE;
4571 goto end;
4572 }
4573
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05304574 /* Initialize the wma_pdev_set_hw_mode_resp_evt_handler event handler */
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304575 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304576 wmi_pdev_set_hw_mode_rsp_event_id,
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05304577 wma_pdev_set_hw_mode_resp_evt_handler,
Govind Singhd76a5b02016-03-08 15:12:14 +05304578 WMA_RX_SERIALIZER_CTX);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304579 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004580 WMA_LOGE("Failed to register set hw mode resp event cb");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304581 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004582 goto end;
4583 }
4584
4585 /* Initialize the WMI_SOC_HW_MODE_TRANSITION_EVENTID event handler */
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304586 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304587 wmi_pdev_hw_mode_transition_event_id,
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05304588 wma_pdev_hw_mode_transition_evt_handler,
Govind Singhd76a5b02016-03-08 15:12:14 +05304589 WMA_RX_SERIALIZER_CTX);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304590 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004591 WMA_LOGE("Failed to register hw mode transition event cb");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304592 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004593 goto end;
4594 }
4595
4596 /* Initialize the set dual mac configuration event handler */
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304597 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304598 wmi_pdev_set_mac_config_resp_event_id,
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05304599 wma_pdev_set_dual_mode_config_resp_evt_handler,
Govind Singhd76a5b02016-03-08 15:12:14 +05304600 WMA_RX_SERIALIZER_CTX);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304601 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004602 WMA_LOGE("Failed to register hw mode transition event cb");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304603 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004604 goto end;
4605 }
4606
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304607 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304608 wmi_coex_bt_activity_event_id,
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05304609 wma_wlan_bt_activity_evt_handler,
4610 WMA_RX_SERIALIZER_CTX);
4611 if (!QDF_IS_STATUS_SUCCESS(status)) {
4612 WMA_LOGE("Failed to register coex bt activity event handler");
4613 qdf_status = QDF_STATUS_E_FAILURE;
4614 goto end;
4615 }
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07004616 wma_register_spectral_cmds(wma_handle);
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05304617
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004618end:
4619 WMA_LOGD("%s: Exit", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304620 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004621}
4622
Jeff Johnson62cd6802018-07-20 12:38:25 -07004623QDF_STATUS wma_stop(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004624{
4625 tp_wma_handle wma_handle;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304626 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Govind Singhede435f2015-12-01 16:16:36 +05304627 int i;
Ke Huangae49ad02018-11-27 10:53:11 +08004628 struct mac_context *mac = NULL;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004629
Anurag Chouhan6d760662016-02-20 16:05:43 +05304630 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004631 WMA_LOGD("%s: Enter", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004632 /* validate the wma_handle */
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07004633 if (!wma_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004634 WMA_LOGE("%s: Invalid handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304635 qdf_status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004636 goto end;
4637 }
Ke Huangae49ad02018-11-27 10:53:11 +08004638 mac = cds_get_context(QDF_MODULE_ID_PE);
4639 if (!mac) {
4640 WMA_LOGE("%s: Invalid mac context", __func__);
4641 goto end;
4642 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004643#ifdef QCA_WIFI_FTM
4644 /*
4645 * Tx mgmt detach requires TXRX context which is not created
4646 * in FTM mode. So skip the TX mgmt detach.
4647 */
Anurag Chouhan6d760662016-02-20 16:05:43 +05304648 if (cds_get_conparam() == QDF_GLOBAL_FTM_MODE) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304649 qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004650 goto end;
4651 }
4652#endif /* QCA_WIFI_FTM */
4653
4654 if (wma_handle->ack_work_ctx) {
4655 cds_flush_work(&wma_handle->ack_work_ctx->ack_cmp_work);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304656 qdf_mem_free(wma_handle->ack_work_ctx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004657 wma_handle->ack_work_ctx = NULL;
4658 }
4659
4660 /* Destroy the timer for log completion */
Anurag Chouhan210db072016-02-22 18:42:15 +05304661 qdf_status = qdf_mc_timer_destroy(&wma_handle->log_completion_timer);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004662 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004663 WMA_LOGE("Failed to destroy the log completion timer");
Govind Singhede435f2015-12-01 16:16:36 +05304664 /* clean up ll-queue for all vdev */
4665 for (i = 0; i < wma_handle->max_bssid; i++) {
4666 if (wma_handle->interfaces[i].handle &&
Mukul Sharmaf9047232017-03-02 16:58:56 +05304667 wma_is_vdev_up(i)) {
Leo Chang96464902016-10-28 11:10:54 -07004668 cdp_fc_vdev_flush(
4669 cds_get_context(QDF_MODULE_ID_SOC),
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004670 wma_handle->
4671 interfaces[i].handle);
Govind Singhede435f2015-12-01 16:16:36 +05304672 }
4673 }
gaurank kathpalia85f8a612018-02-21 18:55:24 +05304674
Wu Gaof3cbeaf2019-01-15 18:26:25 +08004675 if (!mac->mlme_cfg->gen.enable_remove_time_stamp_sync_cmd &&
4676 cds_get_conparam() != QDF_GLOBAL_FTM_MODE) {
4677 /* Destroy firmware time stamp sync timer */
4678 qdf_status = qdf_mc_timer_destroy(
4679 &wma_handle->wma_fw_time_sync_timer);
4680 if (QDF_IS_STATUS_ERROR(qdf_status))
4681 WMA_LOGE("Failed to destroy fw sync timer");
gaurank kathpalia85f8a612018-02-21 18:55:24 +05304682 }
4683
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304684 qdf_status = wma_tx_detach(wma_handle);
4685 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004686 WMA_LOGE("%s: Failed to deregister tx management", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004687 goto end;
4688 }
4689
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004690end:
4691 WMA_LOGD("%s: Exit", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304692 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004693}
4694
4695/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004696 * wma_wmi_service_close() - close wma wmi service interface.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004697 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05304698 * Return: 0 on success, QDF Error on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004699 */
Jeff Johnson7b3ddc22017-09-13 09:42:44 -07004700QDF_STATUS wma_wmi_service_close(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004701{
Jeff Johnson7b3ddc22017-09-13 09:42:44 -07004702 void *cds_ctx;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004703 tp_wma_handle wma_handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004704 int i;
4705
4706 WMA_LOGD("%s: Enter", __func__);
4707
Jeff Johnson7b3ddc22017-09-13 09:42:44 -07004708 cds_ctx = cds_get_global_context();
4709 if (!cds_ctx) {
4710 WMA_LOGE("%s: Invalid CDS context", __func__);
4711 return QDF_STATUS_E_INVAL;
4712 }
4713
Anurag Chouhan6d760662016-02-20 16:05:43 +05304714 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004715
4716 /* validate the wma_handle */
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07004717 if (!wma_handle) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004718 WMA_LOGE("%s: Invalid wma handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304719 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004720 }
4721
4722 /* validate the wmi handle */
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07004723 if (!wma_handle->wmi_handle) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004724 WMA_LOGE("%s: Invalid wmi handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304725 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004726 }
4727
4728 /* dettach the wmi serice */
4729 WMA_LOGD("calling wmi_unified_detach");
4730 wmi_unified_detach(wma_handle->wmi_handle);
4731 wma_handle->wmi_handle = NULL;
4732
4733 for (i = 0; i < wma_handle->max_bssid; i++) {
Abhishek Singhbb9deb42019-05-24 10:11:24 +05304734 /* Release peer and vdev ref hold by wma if not already done */
4735 wma_release_vdev_and_peer_ref(wma_handle,
4736 &wma_handle->interfaces[i]);
Dustin Brownec2c92e2017-07-26 11:13:49 -07004737 wma_vdev_deinit(&wma_handle->interfaces[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004738 }
4739
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304740 qdf_mem_free(wma_handle->interfaces);
Dustin Brownec2c92e2017-07-26 11:13:49 -07004741
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004742 /* free the wma_handle */
Jeff Johnsonadb3b1c2017-09-13 10:42:36 -07004743 cds_free_context(QDF_MODULE_ID_WMA, wma_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004744
hangtiane52fa912018-11-26 15:44:38 +08004745 if (((struct cds_context *)cds_ctx)->cfg_ctx)
4746 qdf_mem_free(((struct cds_context *)cds_ctx)->cfg_ctx);
Rajeev Kumarfe6e62f2018-10-22 16:18:41 -07004747 ((struct cds_context *)cds_ctx)->cfg_ctx = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004748 WMA_LOGD("%s: Exit", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304749 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004750}
4751
Xun Luoa858a472015-11-10 08:24:45 -08004752/**
4753 * wma_wmi_work_close() - close the work queue items associated with WMI
Xun Luoa858a472015-11-10 08:24:45 -08004754 *
4755 * This function closes work queue items associated with WMI, but not fully
4756 * closes WMI service.
4757 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304758 * Return: QDF_STATUS_SUCCESS if work close is successful. Otherwise
Xun Luoa858a472015-11-10 08:24:45 -08004759 * proper error codes.
4760 */
Jeff Johnson6b8473d2017-09-13 09:20:53 -07004761QDF_STATUS wma_wmi_work_close(void)
Xun Luoa858a472015-11-10 08:24:45 -08004762{
4763 tp_wma_handle wma_handle;
4764
4765 WMA_LOGD("%s: Enter", __func__);
4766
Anurag Chouhan6d760662016-02-20 16:05:43 +05304767 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Xun Luoa858a472015-11-10 08:24:45 -08004768
4769 /* validate the wma_handle */
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07004770 if (!wma_handle) {
Xun Luoa858a472015-11-10 08:24:45 -08004771 WMA_LOGE("%s: Invalid wma handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304772 return QDF_STATUS_E_INVAL;
Xun Luoa858a472015-11-10 08:24:45 -08004773 }
4774
4775 /* validate the wmi handle */
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07004776 if (!wma_handle->wmi_handle) {
Xun Luoa858a472015-11-10 08:24:45 -08004777 WMA_LOGE("%s: Invalid wmi handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304778 return QDF_STATUS_E_INVAL;
Xun Luoa858a472015-11-10 08:24:45 -08004779 }
4780
4781 /* remove the wmi work */
4782 WMA_LOGD("calling wmi_unified_remove_work");
4783 wmi_unified_remove_work(wma_handle->wmi_handle);
4784
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304785 return QDF_STATUS_SUCCESS;
Xun Luoa858a472015-11-10 08:24:45 -08004786}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004787
Krunal Soni2e48d012016-05-02 16:55:26 -07004788/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004789 * wma_close() - wma close function.
4790 * cleanup resources attached with wma.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004791 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05304792 * Return: 0 on success, QDF Error on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004793 */
Jeff Johnson542da352017-09-13 09:17:28 -07004794QDF_STATUS wma_close(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004795{
4796 tp_wma_handle wma_handle;
hangtian351b7c92019-01-17 16:52:45 +08004797 struct target_psoc_info *tgt_psoc_info;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304798 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004799
4800 WMA_LOGD("%s: Enter", __func__);
4801
Anurag Chouhan6d760662016-02-20 16:05:43 +05304802 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004803
4804 /* validate the wma_handle */
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07004805 if (!wma_handle) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004806 WMA_LOGE("%s: Invalid wma handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304807 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004808 }
4809
4810 /* validate the wmi handle */
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07004811 if (!wma_handle->wmi_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004812 WMA_LOGE("%s: Invalid wmi handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304813 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004814 }
4815
4816 /* Free DBS list */
4817 if (wma_handle->hw_mode.hw_mode_list) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304818 qdf_mem_free(wma_handle->hw_mode.hw_mode_list);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004819 wma_handle->hw_mode.hw_mode_list = NULL;
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004820 WMA_LOGD("%s: DBS list is freed", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004821 }
Arunk Khandavalli10af7282018-02-05 16:55:48 +05304822
Anurag Chouhan6d760662016-02-20 16:05:43 +05304823 if (cds_get_conparam() != QDF_GLOBAL_FTM_MODE) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004824#ifdef FEATURE_WLAN_EXTSCAN
Anurag Chouhana37b5b72016-02-21 14:53:42 +05304825 qdf_wake_lock_destroy(&wma_handle->extscan_wake_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004826#endif /* FEATURE_WLAN_EXTSCAN */
Anurag Chouhana37b5b72016-02-21 14:53:42 +05304827 qdf_wake_lock_destroy(&wma_handle->wow_wake_lock);
Mukul Sharmae44d0542017-05-23 21:50:56 +05304828 qdf_wake_lock_destroy(&wma_handle->wow_auth_req_wl);
4829 qdf_wake_lock_destroy(&wma_handle->wow_assoc_req_wl);
4830 qdf_wake_lock_destroy(&wma_handle->wow_deauth_rec_wl);
4831 qdf_wake_lock_destroy(&wma_handle->wow_disassoc_rec_wl);
4832 qdf_wake_lock_destroy(&wma_handle->wow_ap_assoc_lost_wl);
4833 qdf_wake_lock_destroy(&wma_handle->wow_auto_shutdown_wl);
4834 qdf_wake_lock_destroy(&wma_handle->roam_ho_wl);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004835 }
4836
4837 /* unregister Firmware debug log */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304838 qdf_status = dbglog_deinit(wma_handle->wmi_handle);
4839 if (qdf_status != QDF_STATUS_SUCCESS)
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004840 WMA_LOGE("%s: dbglog_deinit failed", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004841
Anurag Chouhan210db072016-02-22 18:42:15 +05304842 qdf_status = qdf_mc_timer_destroy(&wma_handle->service_ready_ext_timer);
Anurag Chouhandf2b2682016-02-29 14:15:27 +05304843 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004844 WMA_LOGE("%s: Failed to destroy service ready ext event timer",
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05304845 __func__);
4846
Anurag Chouhandf2b2682016-02-29 14:15:27 +05304847 qdf_event_destroy(&wma_handle->target_suspend);
Anurag Chouhandf2b2682016-02-29 14:15:27 +05304848 qdf_event_destroy(&wma_handle->runtime_suspend);
4849 qdf_event_destroy(&wma_handle->recovery_event);
Kai Liu27f20372016-09-28 23:52:36 +08004850 qdf_event_destroy(&wma_handle->tx_frm_download_comp_event);
4851 qdf_event_destroy(&wma_handle->tx_queue_empty_event);
Manikandan Mohanb0932ab2017-02-12 16:30:55 -08004852 wma_cleanup_vdev_resp_queue(wma_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004853 wma_cleanup_hold_req(wma_handle);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05304854 qdf_wake_lock_destroy(&wma_handle->wmi_cmd_rsp_wake_lock);
Rajeev Kumarc58f7c22019-05-10 11:07:38 -07004855 qdf_runtime_lock_deinit(&wma_handle->sap_prevent_runtime_pm_lock);
Prashanth Bhatta87b6dc02017-01-19 15:17:58 -08004856 qdf_runtime_lock_deinit(&wma_handle->wmi_cmd_rsp_runtime_lock);
Poddar, Siddarth2fb98072017-07-19 14:58:30 +05304857 qdf_spinlock_destroy(&wma_handle->vdev_respq_lock);
4858 qdf_spinlock_destroy(&wma_handle->wma_hold_req_q_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004859
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07004860 if (wma_handle->pGetRssiReq) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304861 qdf_mem_free(wma_handle->pGetRssiReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004862 wma_handle->pGetRssiReq = NULL;
4863 }
Deepak Dhamdherebf1f9b12016-05-27 14:49:41 -07004864
yeshwanth sriram guntuka584c2332017-07-29 12:50:25 +05304865 wma_unified_radio_tx_mem_free(wma_handle);
Srinivas Girigowdaad874a82016-10-25 14:08:00 -07004866
Kiran Kumar Lokeref089a3a2017-04-20 21:39:26 -07004867 if (wma_handle->pdev) {
4868 wlan_objmgr_pdev_release_ref(wma_handle->pdev,
4869 WLAN_LEGACY_WMA_ID);
4870 wma_handle->pdev = NULL;
4871 }
Frank Liu00d73fe2017-05-19 22:11:28 +08004872
Nachiket Kukade37b4e6d2018-06-01 18:44:42 +05304873 pmo_unregister_get_beacon_interval_callback(wma_handle->psoc);
4874 pmo_unregister_get_dtim_period_callback(wma_handle->psoc);
Mukul Sharma44746042018-05-24 17:30:52 +05304875 pmo_unregister_is_device_in_low_pwr_mode(wma_handle->psoc);
4876 pmo_unregister_get_pause_bitmap(wma_handle->psoc);
4877 pmo_unregister_pause_bitmap_notifier(wma_handle->psoc);
Will Huangad015772018-06-15 11:27:50 +08004878 pmo_unregister_get_vdev_dp_handle(wma_handle->psoc);
Mukul Sharma6411bb82017-03-01 15:57:07 +05304879
hangtian351b7c92019-01-17 16:52:45 +08004880 tgt_psoc_info = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
4881 init_deinit_free_num_units(wma_handle->psoc, tgt_psoc_info);
Arunk Khandavallia6305a32018-01-25 11:19:18 +05304882 target_if_free_psoc_tgt_info(wma_handle->psoc);
4883
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +05304884 wlan_objmgr_psoc_release_ref(wma_handle->psoc, WLAN_LEGACY_WMA_ID);
4885 wma_handle->psoc = NULL;
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +05304886 wma_target_if_close(wma_handle);
Mukul Sharma6411bb82017-03-01 15:57:07 +05304887
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004888 WMA_LOGD("%s: Exit", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304889 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004890}
4891
4892/**
4893 * wma_update_fw_config() - update fw configuration
Dustin Brownb9987af2018-03-01 17:15:11 -08004894 * @psoc: psoc to query configuration from
4895 * @tgt_hdl: target capability info
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004896 *
4897 * Return: none
4898 */
Dustin Brownb9987af2018-03-01 17:15:11 -08004899static void wma_update_fw_config(struct wlan_objmgr_psoc *psoc,
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304900 struct target_psoc_info *tgt_hdl)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004901{
Dustin Brownb9987af2018-03-01 17:15:11 -08004902 target_resource_config *cfg = &tgt_hdl->info.wlan_res_cfg;
4903
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004904 /* Override the no. of max fragments as per platform configuration */
Dustin Brownb9987af2018-03-01 17:15:11 -08004905 cfg->max_frag_entries = QDF_MIN(QCA_OL_11AC_TX_MAX_FRAGS,
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304906 target_if_get_max_frag_entry(tgt_hdl));
Dustin Brownb9987af2018-03-01 17:15:11 -08004907 target_if_set_max_frag_entry(tgt_hdl, cfg->max_frag_entries);
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304908
Dustin Brownb9987af2018-03-01 17:15:11 -08004909 cfg->num_wow_filters = ucfg_pmo_get_num_wow_filters(psoc);
Nachiket Kukadee547a482018-05-22 16:43:30 +05304910 cfg->apf_instruction_size = ucfg_pmo_get_apf_instruction_size(psoc);
Dustin Brown67d69eb2018-03-02 11:11:34 -08004911 cfg->num_packet_filters = ucfg_pmo_get_num_packet_filters(psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004912}
4913
4914/**
Yun Parkb4f591d2017-03-29 15:51:01 -07004915 * wma_set_tx_partition_base() - set TX MSDU ID partition base for IPA
4916 * @value: TX MSDU ID partition base
4917 *
4918 * Return: none
4919 */
4920#ifdef IPA_OFFLOAD
4921static void wma_set_tx_partition_base(uint32_t value)
4922{
4923 cdp_ipa_set_uc_tx_partition_base(
4924 cds_get_context(QDF_MODULE_ID_SOC),
4925 (struct cdp_cfg *)cds_get_context(QDF_MODULE_ID_CFG),
4926 value);
4927 WMA_LOGD("%s: TX_MSDU_ID_PARTITION=%d", __func__,
4928 value);
4929}
4930#else
4931static void wma_set_tx_partition_base(uint32_t value)
4932{
4933}
4934#endif
4935
4936/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004937 * wma_update_target_services() - update target services from wma handle
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304938 * @wmi_handle: Unified wmi handle
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004939 * @cfg: target services
4940 *
4941 * Return: none
4942 */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304943static inline void wma_update_target_services(struct wmi_unified *wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004944 struct wma_tgt_services *cfg)
4945{
4946 /* STA power save */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304947 cfg->sta_power_save = wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304948 wmi_service_sta_pwrsave);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004949
4950 /* Enable UAPSD */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304951 cfg->uapsd = wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304952 wmi_service_ap_uapsd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004953
4954 /* Update AP DFS service */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304955 cfg->ap_dfs = wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304956 wmi_service_ap_dfs);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004957
4958 /* Enable 11AC */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304959 cfg->en_11ac = wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304960 wmi_service_11ac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004961 if (cfg->en_11ac)
4962 g_fw_wlan_feat_caps |= (1 << DOT11AC);
4963
4964 /* Proactive ARP response */
4965 g_fw_wlan_feat_caps |= (1 << WLAN_PERIODIC_TX_PTRN);
4966
4967 /* Enable WOW */
4968 g_fw_wlan_feat_caps |= (1 << WOW);
4969
4970 /* ARP offload */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304971 cfg->arp_offload = wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304972 wmi_service_arpns_offload);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004973
4974 /* Adaptive early-rx */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304975 cfg->early_rx = wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304976 wmi_service_early_rx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004977#ifdef FEATURE_WLAN_SCAN_PNO
4978 /* PNO offload */
Rajeev Kumar617aadd2018-05-31 16:36:13 -07004979 if (wmi_service_enabled(wmi_handle, wmi_service_nlo)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004980 cfg->pno_offload = true;
Rajeev Kumar617aadd2018-05-31 16:36:13 -07004981 g_fw_wlan_feat_caps |= (1 << PNO);
4982 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004983#endif /* FEATURE_WLAN_SCAN_PNO */
4984
4985#ifdef FEATURE_WLAN_EXTSCAN
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304986 if (wmi_service_enabled(wmi_handle, wmi_service_extscan))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004987 g_fw_wlan_feat_caps |= (1 << EXTENDED_SCAN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004988#endif /* FEATURE_WLAN_EXTSCAN */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304989 cfg->lte_coex_ant_share = wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304990 wmi_service_lte_ant_share_support);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004991#ifdef FEATURE_WLAN_TDLS
4992 /* Enable TDLS */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304993 if (wmi_service_enabled(wmi_handle, wmi_service_tdls)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004994 cfg->en_tdls = 1;
4995 g_fw_wlan_feat_caps |= (1 << TDLS);
4996 }
4997 /* Enable advanced TDLS features */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304998 if (wmi_service_enabled(wmi_handle, wmi_service_tdls_offchan)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004999 cfg->en_tdls_offchan = 1;
5000 g_fw_wlan_feat_caps |= (1 << TDLS_OFF_CHANNEL);
5001 }
5002
5003 cfg->en_tdls_uapsd_buf_sta =
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05305004 wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05305005 wmi_service_tdls_uapsd_buffer_sta);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005006 cfg->en_tdls_uapsd_sleep_sta =
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05305007 wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05305008 wmi_service_tdls_uapsd_sleep_sta);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005009#endif /* FEATURE_WLAN_TDLS */
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05305010 if (wmi_service_enabled
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05305011 (wmi_handle, wmi_service_beacon_offload))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005012 cfg->beacon_offload = true;
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05305013 if (wmi_service_enabled
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05305014 (wmi_handle, wmi_service_sta_pmf_offload))
mukul sharma72c8b222015-09-04 17:02:01 +05305015 cfg->pmf_offload = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005016#ifdef WLAN_FEATURE_ROAM_OFFLOAD
5017 /* Enable Roam Offload */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05305018 cfg->en_roam_offload = wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05305019 wmi_service_roam_ho_offload);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005020#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
5021#ifdef WLAN_FEATURE_NAN
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05305022 if (wmi_service_enabled(wmi_handle, wmi_service_nan))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005023 g_fw_wlan_feat_caps |= (1 << NAN);
5024#endif /* WLAN_FEATURE_NAN */
5025
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05305026 if (wmi_service_enabled(wmi_handle, wmi_service_rtt))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005027 g_fw_wlan_feat_caps |= (1 << RTT);
Yun Park4d968df2016-10-11 11:44:15 -07005028
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05305029 if (wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05305030 wmi_service_tx_msdu_id_new_partition_support)) {
Yun Parkb4f591d2017-03-29 15:51:01 -07005031 wma_set_tx_partition_base(HTT_TX_IPA_NEW_MSDU_ID_SPACE_BEGIN);
Yun Park4d968df2016-10-11 11:44:15 -07005032 } else {
Yun Parkb4f591d2017-03-29 15:51:01 -07005033 wma_set_tx_partition_base(HTT_TX_IPA_MSDU_ID_SPACE_BEGIN);
Yun Park4d968df2016-10-11 11:44:15 -07005034 }
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07005035
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05305036 wma_he_update_tgt_services(wmi_handle, cfg);
Will Huang496b36c2017-07-11 16:38:50 +08005037
5038 cfg->get_peer_info_enabled =
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05305039 wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05305040 wmi_service_peer_stats_info);
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05305041 if (wmi_service_enabled(wmi_handle, wmi_service_fils_support))
Vignesh Viswanathan731186f2017-09-18 13:47:37 +05305042 cfg->is_fils_roaming_supported = true;
Varun Reddy Yeturu62c32652017-10-26 15:32:35 -07005043
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05305044 if (wmi_service_enabled(wmi_handle, wmi_service_mawc_support))
Varun Reddy Yeturu62c32652017-10-26 15:32:35 -07005045 cfg->is_fw_mawc_capable = true;
5046
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05305047 if (wmi_service_enabled(wmi_handle,
5048 wmi_service_11k_neighbour_report_support))
Vignesh Viswanathan694e28e2018-01-18 20:53:57 +05305049 cfg->is_11k_offload_supported = true;
Varun Reddy Yeturu4b54ec82018-05-30 16:00:38 -07005050
5051 if (wmi_service_enabled(wmi_handle, wmi_service_twt_requestor))
5052 cfg->twt_requestor = true;
5053 if (wmi_service_enabled(wmi_handle, wmi_service_twt_responder))
5054 cfg->twt_responder = true;
Liangwei Dong0da14262018-07-03 03:30:23 -04005055 if (wmi_service_enabled(wmi_handle, wmi_service_obss_scan))
5056 cfg->obss_scan_offload = true;
Arunk Khandavallica56d4b2018-11-29 15:46:00 +05305057 if (wmi_service_enabled(wmi_handle, wmi_service_beacon_reception_stats))
5058 cfg->bcn_reception_stats = true;
Sourav Mohapatrac457ae62018-12-06 15:19:41 +05305059
5060 if (wmi_service_enabled(wmi_handle, wmi_service_vdev_latency_config))
5061 g_fw_wlan_feat_caps |= (1 << VDEV_LATENCY_CONFIG);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005062}
5063
5064/**
5065 * wma_update_target_ht_cap() - update ht capabality from wma handle
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305066 * @tgt_hdl: pointer to structure target_psoc_info
5067 * @cfg: ht capability
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005068 *
5069 * Return: none
5070 */
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305071static inline void
5072wma_update_target_ht_cap(struct target_psoc_info *tgt_hdl,
5073 struct wma_tgt_ht_cap *cfg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005074{
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305075 int ht_cap_info;
5076
5077 ht_cap_info = target_if_get_ht_cap_info(tgt_hdl);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005078 /* RX STBC */
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305079 cfg->ht_rx_stbc = !!(ht_cap_info & WMI_HT_CAP_RX_STBC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005080
5081 /* TX STBC */
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305082 cfg->ht_tx_stbc = !!(ht_cap_info & WMI_HT_CAP_TX_STBC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005083
5084 /* MPDU density */
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305085 cfg->mpdu_density = ht_cap_info & WMI_HT_CAP_MPDU_DENSITY;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005086
5087 /* HT RX LDPC */
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305088 cfg->ht_rx_ldpc = !!(ht_cap_info & WMI_HT_CAP_LDPC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005089
5090 /* HT SGI */
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305091 cfg->ht_sgi_20 = !!(ht_cap_info & WMI_HT_CAP_HT20_SGI);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005092
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305093 cfg->ht_sgi_40 = !!(ht_cap_info & WMI_HT_CAP_HT40_SGI);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005094
5095 /* RF chains */
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305096 cfg->num_rf_chains = target_if_get_num_rf_chains(tgt_hdl);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005097
Jeff Johnson3fd21822016-11-08 11:30:37 -08005098 WMA_LOGD("%s: ht_cap_info - %x ht_rx_stbc - %d, ht_tx_stbc - %d\n"
5099 "mpdu_density - %d ht_rx_ldpc - %d ht_sgi_20 - %d\n"
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305100 "ht_sgi_40 - %d num_rf_chains - %d", __func__,
5101 ht_cap_info,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005102 cfg->ht_rx_stbc, cfg->ht_tx_stbc, cfg->mpdu_density,
5103 cfg->ht_rx_ldpc, cfg->ht_sgi_20, cfg->ht_sgi_40,
5104 cfg->num_rf_chains);
5105
5106}
5107
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005108/**
5109 * wma_update_target_vht_cap() - update vht capabality from wma handle
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305110 * @tgt_hdl: pointer to structure target_psoc_info
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005111 * @cfg: vht capabality
5112 *
5113 * Return: none
5114 */
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305115static inline void
5116wma_update_target_vht_cap(struct target_psoc_info *tgt_hdl,
5117 struct wma_tgt_vht_cap *cfg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005118{
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305119 int vht_cap_info = target_if_get_vht_cap_info(tgt_hdl);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005120
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305121 if (vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_11454)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005122 cfg->vht_max_mpdu = WMI_VHT_CAP_MAX_MPDU_LEN_11454;
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305123 else if (vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_7935)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005124 cfg->vht_max_mpdu = WMI_VHT_CAP_MAX_MPDU_LEN_7935;
5125 else
5126 cfg->vht_max_mpdu = 0;
5127
5128
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305129 if (vht_cap_info & WMI_VHT_CAP_CH_WIDTH_80P80_160MHZ) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005130 cfg->supp_chan_width = 1 << eHT_CHANNEL_WIDTH_80P80MHZ;
5131 cfg->supp_chan_width |= 1 << eHT_CHANNEL_WIDTH_160MHZ;
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305132 } else if (vht_cap_info & WMI_VHT_CAP_CH_WIDTH_160MHZ) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005133 cfg->supp_chan_width = 1 << eHT_CHANNEL_WIDTH_160MHZ;
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305134 } else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005135 cfg->supp_chan_width = 1 << eHT_CHANNEL_WIDTH_80MHZ;
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305136 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005137
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305138 cfg->vht_rx_ldpc = vht_cap_info & WMI_VHT_CAP_RX_LDPC;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005139
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305140 cfg->vht_short_gi_80 = vht_cap_info & WMI_VHT_CAP_SGI_80MHZ;
5141 cfg->vht_short_gi_160 = vht_cap_info & WMI_VHT_CAP_SGI_160MHZ;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005142
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305143 cfg->vht_tx_stbc = vht_cap_info & WMI_VHT_CAP_TX_STBC;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005144
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305145 cfg->vht_rx_stbc =
5146 (vht_cap_info & WMI_VHT_CAP_RX_STBC_1SS) |
5147 (vht_cap_info & WMI_VHT_CAP_RX_STBC_2SS) |
5148 (vht_cap_info & WMI_VHT_CAP_RX_STBC_3SS);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005149
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305150 cfg->vht_max_ampdu_len_exp = (vht_cap_info &
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005151 WMI_VHT_CAP_MAX_AMPDU_LEN_EXP)
5152 >> WMI_VHT_CAP_MAX_AMPDU_LEN_EXP_SHIFT;
5153
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305154 cfg->vht_su_bformer = vht_cap_info & WMI_VHT_CAP_SU_BFORMER;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005155
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305156 cfg->vht_su_bformee = vht_cap_info & WMI_VHT_CAP_SU_BFORMEE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005157
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305158 cfg->vht_mu_bformer = vht_cap_info & WMI_VHT_CAP_MU_BFORMER;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005159
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305160 cfg->vht_mu_bformee = vht_cap_info & WMI_VHT_CAP_MU_BFORMEE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005161
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305162 cfg->vht_txop_ps = vht_cap_info & WMI_VHT_CAP_TXOP_PS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005163
Jeff Johnson3fd21822016-11-08 11:30:37 -08005164 WMA_LOGD("%s: max_mpdu %d supp_chan_width %x rx_ldpc %x\n"
5165 "short_gi_80 %x tx_stbc %x rx_stbc %x txop_ps %x\n"
5166 "su_bformee %x mu_bformee %x max_ampdu_len_exp %d", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005167 cfg->vht_max_mpdu, cfg->supp_chan_width, cfg->vht_rx_ldpc,
5168 cfg->vht_short_gi_80, cfg->vht_tx_stbc, cfg->vht_rx_stbc,
5169 cfg->vht_txop_ps, cfg->vht_su_bformee, cfg->vht_mu_bformee,
5170 cfg->vht_max_ampdu_len_exp);
5171}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005172
5173/**
Krunal Sonica50b452017-08-04 22:24:59 -07005174 * wma_update_supported_bands() - update supported bands from service ready ext
Krunal Sonica50b452017-08-04 22:24:59 -07005175 * @supported_bands: Supported band given by FW through service ready ext params
5176 * @new_supported_bands: New supported band which needs to be updated by
5177 * this API which WMA layer understands
5178 *
5179 * This API will convert FW given supported band to enum which WMA layer
5180 * understands
5181 *
5182 * Return: QDF_STATUS
5183 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305184static QDF_STATUS wma_update_supported_bands(
Krunal Sonica50b452017-08-04 22:24:59 -07005185 WLAN_BAND_CAPABILITY supported_bands,
5186 WMI_PHY_CAPABILITY *new_supported_bands)
5187{
5188 QDF_STATUS status = QDF_STATUS_SUCCESS;
5189
Krunal Sonica50b452017-08-04 22:24:59 -07005190 if (!new_supported_bands) {
5191 WMA_LOGE("%s: NULL new supported band variable", __func__);
5192 return QDF_STATUS_E_FAILURE;
5193 }
5194 switch (supported_bands) {
5195 case WLAN_2G_CAPABILITY:
5196 *new_supported_bands |= WMI_11G_CAPABILITY;
5197 break;
5198 case WLAN_5G_CAPABILITY:
5199 *new_supported_bands |= WMI_11A_CAPABILITY;
5200 break;
5201 default:
5202 WMA_LOGE("%s: wrong supported band", __func__);
5203 status = QDF_STATUS_E_FAILURE;
5204 break;
5205 }
5206 return status;
5207}
5208
5209/**
Krunal Soniaa664da2016-06-15 23:46:40 -07005210 * wma_derive_ext_ht_cap() - Derive HT caps based on given value
Krunal Soniaa664da2016-06-15 23:46:40 -07005211 * @ht_cap: given pointer to HT caps which needs to be updated
5212 * @tx_chain: given tx chainmask value
5213 * @rx_chain: given rx chainmask value
5214 * @value: new HT cap info provided in form of bitmask
5215 *
5216 * This function takes the value provided in form of bitmask and decodes
5217 * it. After decoding, what ever value it gets, it takes the union(max) or
5218 * intersection(min) with previously derived values.
5219 *
5220 * Return: none
5221 *
5222 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305223static void wma_derive_ext_ht_cap(
Krunal Soniaa664da2016-06-15 23:46:40 -07005224 struct wma_tgt_ht_cap *ht_cap, uint32_t value,
5225 uint32_t tx_chain, uint32_t rx_chain)
5226{
5227 struct wma_tgt_ht_cap tmp = {0};
5228
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07005229 if (!ht_cap)
Krunal Soniaa664da2016-06-15 23:46:40 -07005230 return;
5231
Ankit Guptaa5076012016-09-14 11:32:19 -07005232 if (!qdf_mem_cmp(ht_cap, &tmp, sizeof(struct wma_tgt_ht_cap))) {
Krunal Soniaa664da2016-06-15 23:46:40 -07005233 ht_cap->ht_rx_stbc = (!!(value & WMI_HT_CAP_RX_STBC));
5234 ht_cap->ht_tx_stbc = (!!(value & WMI_HT_CAP_TX_STBC));
5235 ht_cap->mpdu_density = (!!(value & WMI_HT_CAP_MPDU_DENSITY));
5236 ht_cap->ht_rx_ldpc = (!!(value & WMI_HT_CAP_RX_LDPC));
5237 ht_cap->ht_sgi_20 = (!!(value & WMI_HT_CAP_HT20_SGI));
5238 ht_cap->ht_sgi_40 = (!!(value & WMI_HT_CAP_HT40_SGI));
5239 ht_cap->num_rf_chains =
5240 QDF_MAX(wma_get_num_of_setbits_from_bitmask(tx_chain),
5241 wma_get_num_of_setbits_from_bitmask(rx_chain));
5242 } else {
5243 ht_cap->ht_rx_stbc = QDF_MIN(ht_cap->ht_rx_stbc,
5244 (!!(value & WMI_HT_CAP_RX_STBC)));
5245 ht_cap->ht_tx_stbc = QDF_MAX(ht_cap->ht_tx_stbc,
5246 (!!(value & WMI_HT_CAP_TX_STBC)));
5247 ht_cap->mpdu_density = QDF_MIN(ht_cap->mpdu_density,
5248 (!!(value & WMI_HT_CAP_MPDU_DENSITY)));
5249 ht_cap->ht_rx_ldpc = QDF_MIN(ht_cap->ht_rx_ldpc,
5250 (!!(value & WMI_HT_CAP_RX_LDPC)));
5251 ht_cap->ht_sgi_20 = QDF_MIN(ht_cap->ht_sgi_20,
5252 (!!(value & WMI_HT_CAP_HT20_SGI)));
5253 ht_cap->ht_sgi_40 = QDF_MIN(ht_cap->ht_sgi_40,
5254 (!!(value & WMI_HT_CAP_HT40_SGI)));
5255 ht_cap->num_rf_chains =
5256 QDF_MAX(ht_cap->num_rf_chains,
5257 QDF_MAX(wma_get_num_of_setbits_from_bitmask(
5258 tx_chain),
5259 wma_get_num_of_setbits_from_bitmask(
5260 rx_chain)));
5261 }
5262}
5263
5264/**
5265 * wma_update_target_ext_ht_cap() - Update HT caps with given extended cap
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305266 * @tgt_hdl - target psoc information
Krunal Soniaa664da2016-06-15 23:46:40 -07005267 * @ht_cap: HT cap structure to be filled
5268 *
5269 * This function loop through each hardware mode and for each hardware mode
5270 * again it loop through each MAC/PHY and pull the caps 2G and 5G specific
5271 * HT caps and derives the final cap.
5272 *
5273 * Return: none
5274 *
5275 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305276static void wma_update_target_ext_ht_cap(struct target_psoc_info *tgt_hdl,
5277 struct wma_tgt_ht_cap *ht_cap)
Krunal Soniaa664da2016-06-15 23:46:40 -07005278{
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08005279 int i, total_mac_phy_cnt;
Krunal Soniaa664da2016-06-15 23:46:40 -07005280 uint32_t ht_2g, ht_5g;
5281 struct wma_tgt_ht_cap tmp_ht_cap = {0}, tmp_cap = {0};
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305282 struct wlan_psoc_host_mac_phy_caps *mac_phy_cap;
5283 int num_hw_modes;
Krunal Soniaa664da2016-06-15 23:46:40 -07005284
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08005285 total_mac_phy_cnt = target_psoc_get_total_mac_phy_cnt(tgt_hdl);
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305286 num_hw_modes = target_psoc_get_num_hw_modes(tgt_hdl);
5287 mac_phy_cap = target_psoc_get_mac_phy_cap(tgt_hdl);
Krunal Soniaa664da2016-06-15 23:46:40 -07005288 /*
5289 * for legacy device extended cap might not even come, so in that case
5290 * don't overwrite legacy values
5291 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305292 if (!num_hw_modes) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07005293 WMA_LOGD("%s: No extended HT cap for current SOC", __func__);
Krunal Soniaa664da2016-06-15 23:46:40 -07005294 return;
5295 }
5296
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08005297 for (i = 0; i < total_mac_phy_cnt; i++) {
5298 ht_2g = mac_phy_cap[i].ht_cap_info_2G;
5299 ht_5g = mac_phy_cap[i].ht_cap_info_5G;
5300 if (ht_2g)
5301 wma_derive_ext_ht_cap(&tmp_ht_cap,
5302 ht_2g,
5303 mac_phy_cap[i].tx_chain_mask_2G,
5304 mac_phy_cap[i].rx_chain_mask_2G);
5305 if (ht_5g)
5306 wma_derive_ext_ht_cap(&tmp_ht_cap,
5307 ht_5g,
5308 mac_phy_cap[i].tx_chain_mask_5G,
5309 mac_phy_cap[i].rx_chain_mask_5G);
Krunal Soniaa664da2016-06-15 23:46:40 -07005310 }
5311
Ankit Guptaa5076012016-09-14 11:32:19 -07005312 if (qdf_mem_cmp(&tmp_cap, &tmp_ht_cap,
Krunal Soniaa664da2016-06-15 23:46:40 -07005313 sizeof(struct wma_tgt_ht_cap))) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07005314 qdf_mem_copy(ht_cap, &tmp_ht_cap,
5315 sizeof(struct wma_tgt_ht_cap));
Krunal Soniaa664da2016-06-15 23:46:40 -07005316 }
5317
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07005318 WMA_LOGD("%s: [ext ht cap] ht_rx_stbc - %d, ht_tx_stbc - %d\n"
Jeff Johnson3fd21822016-11-08 11:30:37 -08005319 "mpdu_density - %d ht_rx_ldpc - %d ht_sgi_20 - %d\n"
5320 "ht_sgi_40 - %d num_rf_chains - %d", __func__,
Krunal Soniaa664da2016-06-15 23:46:40 -07005321 ht_cap->ht_rx_stbc, ht_cap->ht_tx_stbc,
5322 ht_cap->mpdu_density, ht_cap->ht_rx_ldpc,
5323 ht_cap->ht_sgi_20, ht_cap->ht_sgi_40,
5324 ht_cap->num_rf_chains);
5325}
5326
5327/**
5328 * wma_derive_ext_vht_cap() - Derive VHT caps based on given value
Krunal Soniaa664da2016-06-15 23:46:40 -07005329 * @vht_cap: pointer to given VHT caps to be filled
5330 * @value: new VHT cap info provided in form of bitmask
5331 *
5332 * This function takes the value provided in form of bitmask and decodes
5333 * it. After decoding, what ever value it gets, it takes the union(max) or
5334 * intersection(min) with previously derived values.
5335 *
5336 * Return: none
5337 *
5338 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305339static void wma_derive_ext_vht_cap(
Krunal Soniaa664da2016-06-15 23:46:40 -07005340 struct wma_tgt_vht_cap *vht_cap, uint32_t value)
5341{
5342 struct wma_tgt_vht_cap tmp_cap = {0};
5343 uint32_t tmp = 0;
5344
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07005345 if (!vht_cap)
Krunal Soniaa664da2016-06-15 23:46:40 -07005346 return;
5347
Ankit Guptaa5076012016-09-14 11:32:19 -07005348 if (!qdf_mem_cmp(vht_cap, &tmp_cap,
Krunal Soniaa664da2016-06-15 23:46:40 -07005349 sizeof(struct wma_tgt_vht_cap))) {
5350 if (value & WMI_VHT_CAP_MAX_MPDU_LEN_11454)
5351 vht_cap->vht_max_mpdu = WMI_VHT_CAP_MAX_MPDU_LEN_11454;
5352 else if (value & WMI_VHT_CAP_MAX_MPDU_LEN_7935)
5353 vht_cap->vht_max_mpdu = WMI_VHT_CAP_MAX_MPDU_LEN_7935;
5354 else
5355 vht_cap->vht_max_mpdu = 0;
5356
5357 if (value & WMI_VHT_CAP_CH_WIDTH_80P80_160MHZ) {
5358 vht_cap->supp_chan_width =
5359 1 << eHT_CHANNEL_WIDTH_80P80MHZ;
5360 vht_cap->supp_chan_width |=
5361 1 << eHT_CHANNEL_WIDTH_160MHZ;
5362 } else if (value & WMI_VHT_CAP_CH_WIDTH_160MHZ) {
5363 vht_cap->supp_chan_width =
5364 1 << eHT_CHANNEL_WIDTH_160MHZ;
5365 } else {
5366 vht_cap->supp_chan_width = 1 << eHT_CHANNEL_WIDTH_80MHZ;
5367 }
5368 vht_cap->vht_rx_ldpc = value & WMI_VHT_CAP_RX_LDPC;
5369 vht_cap->vht_short_gi_80 = value & WMI_VHT_CAP_SGI_80MHZ;
5370 vht_cap->vht_short_gi_160 = value & WMI_VHT_CAP_SGI_160MHZ;
5371 vht_cap->vht_tx_stbc = value & WMI_VHT_CAP_TX_STBC;
5372 vht_cap->vht_rx_stbc =
5373 (value & WMI_VHT_CAP_RX_STBC_1SS) |
5374 (value & WMI_VHT_CAP_RX_STBC_2SS) |
5375 (value & WMI_VHT_CAP_RX_STBC_3SS);
5376 vht_cap->vht_max_ampdu_len_exp =
5377 (value & WMI_VHT_CAP_MAX_AMPDU_LEN_EXP) >>
5378 WMI_VHT_CAP_MAX_AMPDU_LEN_EXP_SHIFT;
5379 vht_cap->vht_su_bformer = value & WMI_VHT_CAP_SU_BFORMER;
5380 vht_cap->vht_su_bformee = value & WMI_VHT_CAP_SU_BFORMEE;
5381 vht_cap->vht_mu_bformer = value & WMI_VHT_CAP_MU_BFORMER;
5382 vht_cap->vht_mu_bformee = value & WMI_VHT_CAP_MU_BFORMEE;
5383 vht_cap->vht_txop_ps = value & WMI_VHT_CAP_TXOP_PS;
5384 } else {
5385 if (value & WMI_VHT_CAP_MAX_MPDU_LEN_11454)
5386 tmp = WMI_VHT_CAP_MAX_MPDU_LEN_11454;
5387 else if (value & WMI_VHT_CAP_MAX_MPDU_LEN_7935)
5388 tmp = WMI_VHT_CAP_MAX_MPDU_LEN_7935;
5389 else
5390 tmp = 0;
5391 vht_cap->vht_max_mpdu = QDF_MIN(vht_cap->vht_max_mpdu, tmp);
5392
5393 if ((value & WMI_VHT_CAP_CH_WIDTH_80P80_160MHZ)) {
5394 tmp = (1 << eHT_CHANNEL_WIDTH_80P80MHZ) |
5395 (1 << eHT_CHANNEL_WIDTH_160MHZ);
5396 } else if (value & WMI_VHT_CAP_CH_WIDTH_160MHZ) {
5397 tmp = 1 << eHT_CHANNEL_WIDTH_160MHZ;
5398 } else {
5399 tmp = 1 << eHT_CHANNEL_WIDTH_80MHZ;
5400 }
5401 vht_cap->supp_chan_width =
5402 QDF_MAX(vht_cap->supp_chan_width, tmp);
5403 vht_cap->vht_rx_ldpc = QDF_MIN(vht_cap->vht_rx_ldpc,
5404 value & WMI_VHT_CAP_RX_LDPC);
5405 vht_cap->vht_short_gi_80 = QDF_MAX(vht_cap->vht_short_gi_80,
5406 value & WMI_VHT_CAP_SGI_80MHZ);
5407 vht_cap->vht_short_gi_160 = QDF_MAX(vht_cap->vht_short_gi_160,
5408 value & WMI_VHT_CAP_SGI_160MHZ);
5409 vht_cap->vht_tx_stbc = QDF_MAX(vht_cap->vht_tx_stbc,
5410 value & WMI_VHT_CAP_TX_STBC);
5411 vht_cap->vht_rx_stbc = QDF_MIN(vht_cap->vht_rx_stbc,
5412 (value & WMI_VHT_CAP_RX_STBC_1SS) |
5413 (value & WMI_VHT_CAP_RX_STBC_2SS) |
5414 (value & WMI_VHT_CAP_RX_STBC_3SS));
5415 vht_cap->vht_max_ampdu_len_exp =
5416 QDF_MIN(vht_cap->vht_max_ampdu_len_exp,
5417 (value & WMI_VHT_CAP_MAX_AMPDU_LEN_EXP) >>
5418 WMI_VHT_CAP_MAX_AMPDU_LEN_EXP_SHIFT);
5419 vht_cap->vht_su_bformer = QDF_MAX(vht_cap->vht_su_bformer,
5420 value & WMI_VHT_CAP_SU_BFORMER);
5421 vht_cap->vht_su_bformee = QDF_MAX(vht_cap->vht_su_bformee,
5422 value & WMI_VHT_CAP_SU_BFORMEE);
5423 vht_cap->vht_mu_bformer = QDF_MAX(vht_cap->vht_mu_bformer,
5424 value & WMI_VHT_CAP_MU_BFORMER);
5425 vht_cap->vht_mu_bformee = QDF_MAX(vht_cap->vht_mu_bformee,
5426 value & WMI_VHT_CAP_MU_BFORMEE);
5427 vht_cap->vht_txop_ps = QDF_MIN(vht_cap->vht_txop_ps,
5428 value & WMI_VHT_CAP_TXOP_PS);
5429 }
5430}
5431
5432/**
5433 * wma_update_target_ext_vht_cap() - Update VHT caps with given extended cap
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305434 * @tgt_hdl - target psoc information
Krunal Soniaa664da2016-06-15 23:46:40 -07005435 * @vht_cap: VHT cap structure to be filled
5436 *
5437 * This function loop through each hardware mode and for each hardware mode
5438 * again it loop through each MAC/PHY and pull the caps 2G and 5G specific
5439 * VHT caps and derives the final cap.
5440 *
5441 * Return: none
5442 *
5443 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305444static void wma_update_target_ext_vht_cap(struct target_psoc_info *tgt_hdl,
5445 struct wma_tgt_vht_cap *vht_cap)
Krunal Soniaa664da2016-06-15 23:46:40 -07005446{
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08005447 int i, num_hw_modes, total_mac_phy_cnt;
Krunal Soniaa664da2016-06-15 23:46:40 -07005448 uint32_t vht_cap_info_2g, vht_cap_info_5g;
5449 struct wma_tgt_vht_cap tmp_vht_cap = {0}, tmp_cap = {0};
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305450 struct wlan_psoc_host_mac_phy_caps *mac_phy_cap;
5451
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08005452 total_mac_phy_cnt = target_psoc_get_total_mac_phy_cnt(tgt_hdl);
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305453 num_hw_modes = target_psoc_get_num_hw_modes(tgt_hdl);
5454 mac_phy_cap = target_psoc_get_mac_phy_cap(tgt_hdl);
Krunal Soniaa664da2016-06-15 23:46:40 -07005455
5456 /*
5457 * for legacy device extended cap might not even come, so in that case
5458 * don't overwrite legacy values
5459 */
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08005460 if (!num_hw_modes) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07005461 WMA_LOGD("%s: No extended VHT cap for current SOC", __func__);
Krunal Soniaa664da2016-06-15 23:46:40 -07005462 return;
5463 }
5464
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08005465 for (i = 0; i < total_mac_phy_cnt; i++) {
5466 vht_cap_info_2g = mac_phy_cap[i].vht_cap_info_2G;
5467 vht_cap_info_5g = mac_phy_cap[i].vht_cap_info_5G;
5468 if (vht_cap_info_2g)
5469 wma_derive_ext_vht_cap(&tmp_vht_cap,
5470 vht_cap_info_2g);
5471 if (vht_cap_info_5g)
5472 wma_derive_ext_vht_cap(&tmp_vht_cap,
5473 vht_cap_info_5g);
Krunal Soniaa664da2016-06-15 23:46:40 -07005474 }
5475
Ankit Guptaa5076012016-09-14 11:32:19 -07005476 if (qdf_mem_cmp(&tmp_cap, &tmp_vht_cap,
Krunal Soniaa664da2016-06-15 23:46:40 -07005477 sizeof(struct wma_tgt_vht_cap))) {
5478 qdf_mem_copy(vht_cap, &tmp_vht_cap,
5479 sizeof(struct wma_tgt_vht_cap));
5480 }
5481
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07005482 WMA_LOGD("%s: [ext vhtcap] max_mpdu %d supp_chan_width %x rx_ldpc %x\n"
Jeff Johnson3fd21822016-11-08 11:30:37 -08005483 "short_gi_80 %x tx_stbc %x rx_stbc %x txop_ps %x\n"
5484 "su_bformee %x mu_bformee %x max_ampdu_len_exp %d", __func__,
Krunal Soniaa664da2016-06-15 23:46:40 -07005485 vht_cap->vht_max_mpdu, vht_cap->supp_chan_width,
5486 vht_cap->vht_rx_ldpc, vht_cap->vht_short_gi_80,
5487 vht_cap->vht_tx_stbc, vht_cap->vht_rx_stbc,
5488 vht_cap->vht_txop_ps, vht_cap->vht_su_bformee,
5489 vht_cap->vht_mu_bformee, vht_cap->vht_max_ampdu_len_exp);
5490}
5491
Jeff Johnson0918f242018-07-17 18:52:17 -07005492static void
5493wma_update_sar_version(struct wlan_psoc_host_service_ext_param *param,
5494 struct wma_tgt_cfg *cfg)
5495{
5496 cfg->sar_version = param ? param->sar_version : SAR_VERSION_1;
5497}
5498
Anurag Chouhan04dbf6d2016-09-08 15:32:52 +05305499/**
Krunal Sonica50b452017-08-04 22:24:59 -07005500 * wma_update_hdd_band_cap() - update band cap which hdd understands
5501 * @supported_band: supported band which has been given by FW
5502 * @tgt_cfg: target configuration to be updated
5503 *
5504 * Convert WMA given supported band to enum which HDD understands
5505 *
5506 * Return: None
5507 */
5508static void wma_update_hdd_band_cap(WMI_PHY_CAPABILITY supported_band,
5509 struct wma_tgt_cfg *tgt_cfg)
5510{
5511 switch (supported_band) {
5512 case WMI_11G_CAPABILITY:
5513 case WMI_11NG_CAPABILITY:
Varun Reddy Yeturua48bc412017-11-17 15:33:35 -08005514 tgt_cfg->band_cap = BAND_2G;
Krunal Sonica50b452017-08-04 22:24:59 -07005515 break;
5516 case WMI_11A_CAPABILITY:
5517 case WMI_11NA_CAPABILITY:
5518 case WMI_11AC_CAPABILITY:
Varun Reddy Yeturua48bc412017-11-17 15:33:35 -08005519 tgt_cfg->band_cap = BAND_5G;
Krunal Sonica50b452017-08-04 22:24:59 -07005520 break;
5521 case WMI_11AG_CAPABILITY:
5522 case WMI_11NAG_CAPABILITY:
5523 default:
Varun Reddy Yeturua48bc412017-11-17 15:33:35 -08005524 tgt_cfg->band_cap = BAND_ALL;
Krunal Sonica50b452017-08-04 22:24:59 -07005525 }
5526}
5527
5528/**
Arif Hussainee10f902017-12-27 16:30:17 -08005529 * wma_update_obss_detection_support() - update obss detection offload support
5530 * @wh: wma handle
5531 * @tgt_cfg: target configuration to be updated
5532 *
5533 * Update obss detection offload support based on service bit.
5534 *
5535 * Return: None
5536 */
5537static void wma_update_obss_detection_support(tp_wma_handle wh,
5538 struct wma_tgt_cfg *tgt_cfg)
5539{
Arif Hussain05fb4872018-01-03 16:02:55 -08005540 if (wmi_service_enabled(wh->wmi_handle,
5541 wmi_service_ap_obss_detection_offload))
Arif Hussainee10f902017-12-27 16:30:17 -08005542 tgt_cfg->obss_detection_offloaded = true;
5543 else
5544 tgt_cfg->obss_detection_offloaded = false;
5545}
5546
5547/**
Arif Hussain50689082019-03-26 12:07:58 -07005548 * wma_update_bcast_twt_support() - update bcost twt support
5549 * @wh: wma handle
5550 * @tgt_cfg: target configuration to be updated
5551 *
5552 * Update braodcast twt support based on service bit.
5553 *
5554 * Return: None
5555 */
5556static void wma_update_bcast_twt_support(tp_wma_handle wh,
5557 struct wma_tgt_cfg *tgt_cfg)
5558{
5559 if (wmi_service_enabled(wh->wmi_handle,
5560 wmi_service_bcast_twt_support))
5561 tgt_cfg->bcast_twt_support = true;
5562 else
5563 tgt_cfg->bcast_twt_support = false;
5564}
5565
5566/**
Arif Hussain05fb4872018-01-03 16:02:55 -08005567 * wma_update_obss_color_collision_support() - update obss color collision
5568 * offload support
5569 * @wh: wma handle
5570 * @tgt_cfg: target configuration to be updated
5571 *
5572 * Update obss color collision offload support based on service bit.
5573 *
5574 * Return: None
5575 */
5576static void wma_update_obss_color_collision_support(tp_wma_handle wh,
5577 struct wma_tgt_cfg *tgt_cfg)
5578{
5579 if (wmi_service_enabled(wh->wmi_handle, wmi_service_bss_color_offload))
5580 tgt_cfg->obss_color_collision_offloaded = true;
5581 else
5582 tgt_cfg->obss_color_collision_offloaded = false;
5583}
5584
Jeff Johnson6ec742c2018-03-31 15:21:08 -07005585#ifdef WLAN_SUPPORT_GREEN_AP
5586static void wma_green_ap_register_handlers(tp_wma_handle wma_handle)
5587{
5588 if (WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
5589 WMI_SERVICE_EGAP))
5590 target_if_green_ap_register_egap_event_handler(
5591 wma_handle->pdev);
5592
5593}
5594#else
5595static void wma_green_ap_register_handlers(tp_wma_handle wma_handle)
5596{
5597}
5598#endif
5599
Nachiket Kukade85aa3782018-11-02 20:12:34 +05305600#ifdef WLAN_FEATURE_NAN
5601static void wma_update_nan_target_caps(tp_wma_handle wma_handle,
5602 struct wma_tgt_cfg *tgt_cfg)
5603{
5604 if (wmi_service_enabled(wma_handle->wmi_handle,
5605 wmi_service_nan_disable_support))
5606 tgt_cfg->nan_caps.nan_disable_supported = 1;
5607
5608 if (wmi_service_enabled(wma_handle->wmi_handle,
5609 wmi_service_nan_dbs_support))
5610 tgt_cfg->nan_caps.nan_dbs_supported = 1;
5611
5612 if (wmi_service_enabled(wma_handle->wmi_handle,
5613 wmi_service_ndi_dbs_support))
5614 tgt_cfg->nan_caps.ndi_dbs_supported = 1;
5615
5616 if (wmi_service_enabled(wma_handle->wmi_handle,
5617 wmi_service_nan_sap_support))
5618 tgt_cfg->nan_caps.nan_sap_supported = 1;
5619
5620 if (wmi_service_enabled(wma_handle->wmi_handle,
5621 wmi_service_ndi_sap_support))
5622 tgt_cfg->nan_caps.ndi_sap_supported = 1;
5623}
5624#else
5625static void wma_update_nan_target_caps(tp_wma_handle wma_handle,
5626 struct wma_tgt_cfg *tgt_cfg)
5627{
5628}
5629#endif
5630
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05305631static uint8_t
5632wma_convert_chainmask_to_chain(uint8_t chainmask)
5633{
5634 uint8_t num_chains = 0;
5635
5636 while (chainmask) {
5637 chainmask &= (chainmask - 1);
5638 num_chains++;
5639 }
5640
5641 return num_chains;
5642}
5643
5644static void
5645wma_fill_chain_cfg(struct target_psoc_info *tgt_hdl,
5646 uint8_t phy)
5647{
5648 struct mac_context *mac_ctx;
5649 uint8_t num_chain;
5650 struct wlan_psoc_host_mac_phy_caps *mac_phy_cap =
5651 tgt_hdl->info.mac_phy_cap;
5652
5653 mac_ctx = cds_get_context(QDF_MODULE_ID_PE);
5654 if (!mac_ctx) {
5655 WMA_LOGE("fill chain cfg failed as mac_ctx is NULL");
5656 return;
5657 }
5658
5659 num_chain = wma_convert_chainmask_to_chain(mac_phy_cap[phy].
5660 tx_chain_mask_2G);
5661
5662 if (num_chain > mac_ctx->fw_chain_cfg.max_tx_chains_2g)
5663 mac_ctx->fw_chain_cfg.max_tx_chains_2g = num_chain;
5664
5665 num_chain = wma_convert_chainmask_to_chain(mac_phy_cap[phy].
5666 tx_chain_mask_5G);
5667
5668 if (num_chain > mac_ctx->fw_chain_cfg.max_tx_chains_5g)
5669 mac_ctx->fw_chain_cfg.max_tx_chains_5g = num_chain;
5670
5671 num_chain = wma_convert_chainmask_to_chain(mac_phy_cap[phy].
5672 rx_chain_mask_2G);
5673
5674 if (num_chain > mac_ctx->fw_chain_cfg.max_rx_chains_2g)
5675 mac_ctx->fw_chain_cfg.max_rx_chains_2g = num_chain;
5676
5677 num_chain = wma_convert_chainmask_to_chain(mac_phy_cap[phy].
5678 rx_chain_mask_5G);
5679
5680 if (num_chain > mac_ctx->fw_chain_cfg.max_rx_chains_5g)
5681 mac_ctx->fw_chain_cfg.max_rx_chains_5g = num_chain;
5682}
5683
gaurank kathpalia7ef72182019-05-29 19:41:25 +05305684static void wma_update_mlme_related_tgt_caps(struct wlan_objmgr_psoc *psoc,
5685 struct wmi_unified *wmi_handle)
5686{
5687 struct mlme_tgt_caps mlme_tgt_cfg;
5688
5689 mlme_tgt_cfg.data_stall_recovery_fw_support =
5690 wmi_service_enabled(wmi_handle,
5691 wmi_service_data_stall_recovery_support);
5692
5693 /* Call this at last only after filling all the tgt caps */
5694 wlan_mlme_update_cfg_with_tgt_caps(psoc, &mlme_tgt_cfg);
5695}
5696
Arif Hussain05fb4872018-01-03 16:02:55 -08005697/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005698 * wma_update_hdd_cfg() - update HDD config
5699 * @wma_handle: wma handle
5700 *
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05305701 * Return: Zero on success err number on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005702 */
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05305703static int wma_update_hdd_cfg(tp_wma_handle wma_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005704{
5705 struct wma_tgt_cfg tgt_cfg;
Anurag Chouhan6d760662016-02-20 16:05:43 +05305706 void *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305707 target_resource_config *wlan_res_cfg;
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305708 struct wlan_psoc_host_service_ext_param *service_ext_param;
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05305709 struct target_psoc_info *tgt_hdl;
5710 struct wmi_unified *wmi_handle;
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05305711 uint8_t i;
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05305712 int ret;
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305713
5714 WMA_LOGD("%s: Enter", __func__);
5715
5716 tgt_hdl = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
5717 if (!tgt_hdl) {
5718 WMA_LOGE("%s: target psoc info is NULL", __func__);
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05305719 return -EINVAL;
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305720 }
5721
5722 wlan_res_cfg = target_psoc_get_wlan_res_cfg(tgt_hdl);
Arif Hussaind15902c2018-03-02 00:08:29 -08005723 if (!wlan_res_cfg) {
5724 WMA_LOGE("%s: wlan_res_cfg is null", __func__);
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05305725 return -EINVAL;
Arif Hussaind15902c2018-03-02 00:08:29 -08005726 }
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05305727
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305728 service_ext_param =
5729 target_psoc_get_service_ext_param(tgt_hdl);
Sourav Mohapatracf632572018-04-02 11:01:35 +05305730 wmi_handle = get_wmi_unified_hdl_from_psoc(wma_handle->psoc);
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05305731 if (!wmi_handle) {
5732 WMA_LOGE("%s: wmi handle is NULL", __func__);
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05305733 return -EINVAL;
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05305734 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005735
gaurank kathpalia7ef72182019-05-29 19:41:25 +05305736 wma_update_mlme_related_tgt_caps(wma_handle->psoc, wmi_handle);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305737 qdf_mem_zero(&tgt_cfg, sizeof(struct wma_tgt_cfg));
Naveen Rawat64e477e2016-05-20 10:34:56 -07005738
5739 tgt_cfg.sub_20_support = wma_handle->sub_20_support;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005740 tgt_cfg.reg_domain = wma_handle->reg_cap.eeprom_rd;
5741 tgt_cfg.eeprom_rd_ext = wma_handle->reg_cap.eeprom_rd_ext;
5742
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305743 tgt_cfg.max_intf_count = wlan_res_cfg->num_vdevs;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005744
Pragaspathi Thilagarajeb367282019-02-19 00:42:28 +05305745 if (wmi_service_enabled(wmi_handle, wmi_service_wpa3_ft_sae_support))
5746 tgt_cfg.ft_akm_service_bitmap |= (1 << AKM_FT_SAE);
5747
5748 if (wmi_service_enabled(wmi_handle,
5749 wmi_service_wpa3_ft_suite_b_support))
5750 tgt_cfg.ft_akm_service_bitmap |= (1 << AKM_FT_SUITEB_SHA384);
5751
5752 if (wmi_service_enabled(wmi_handle, wmi_service_ft_fils))
5753 tgt_cfg.ft_akm_service_bitmap |= (1 << AKM_FT_FILS);
5754
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305755 qdf_mem_copy(tgt_cfg.hw_macaddr.bytes, wma_handle->hwaddr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005756 ATH_MAC_LEN);
5757
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05305758 wma_update_target_services(wmi_handle, &tgt_cfg.services);
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305759 wma_update_target_ht_cap(tgt_hdl, &tgt_cfg.ht_cap);
5760 wma_update_target_vht_cap(tgt_hdl, &tgt_cfg.vht_cap);
Krunal Soniaa664da2016-06-15 23:46:40 -07005761 /*
5762 * This will overwrite the structure filled by wma_update_target_ht_cap
5763 * and wma_update_target_vht_cap APIs.
5764 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305765 wma_update_target_ext_ht_cap(tgt_hdl, &tgt_cfg.ht_cap);
5766 wma_update_target_ext_vht_cap(tgt_hdl, &tgt_cfg.vht_cap);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005767
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305768 wma_update_target_ext_he_cap(tgt_hdl, &tgt_cfg);
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07005769
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305770 tgt_cfg.target_fw_version = target_if_get_fw_version(tgt_hdl);
5771 if (service_ext_param)
5772 tgt_cfg.target_fw_vers_ext =
5773 service_ext_param->fw_build_vers_ext;
5774
Ryan Hsuc6918552018-05-16 13:29:59 -07005775 tgt_cfg.hw_bd_id = wma_handle->hw_bd_id;
5776 tgt_cfg.hw_bd_info.bdf_version = wma_handle->hw_bd_info[BDF_VERSION];
5777 tgt_cfg.hw_bd_info.ref_design_id =
5778 wma_handle->hw_bd_info[REF_DESIGN_ID];
5779 tgt_cfg.hw_bd_info.customer_id = wma_handle->hw_bd_info[CUSTOMER_ID];
5780 tgt_cfg.hw_bd_info.project_id = wma_handle->hw_bd_info[PROJECT_ID];
5781 tgt_cfg.hw_bd_info.board_data_rev =
5782 wma_handle->hw_bd_info[BOARD_DATA_REV];
5783
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005784#ifdef WLAN_FEATURE_LPSS
5785 tgt_cfg.lpss_support = wma_handle->lpss_support;
5786#endif /* WLAN_FEATURE_LPSS */
5787 tgt_cfg.ap_arpns_support = wma_handle->ap_arpns_support;
Arif Hussaind54b62c2018-03-01 13:31:37 -08005788 tgt_cfg.dfs_cac_offload = wma_handle->is_dfs_offloaded;
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +05305789 tgt_cfg.rcpi_enabled = wma_handle->rcpi_enabled;
Arunk Khandavalli80a61352018-01-25 12:19:37 +05305790 wma_update_hdd_band_cap(target_if_get_phy_capability(tgt_hdl),
5791 &tgt_cfg);
Jeff Johnson0918f242018-07-17 18:52:17 -07005792 wma_update_sar_version(service_ext_param, &tgt_cfg);
Krishna Kumaar Natarajan1ae49112015-11-24 21:43:22 -08005793 tgt_cfg.fine_time_measurement_cap =
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305794 target_if_get_wmi_fw_sub_feat_caps(tgt_hdl);
Rajeev Kumar Sirasanagandla47873002016-09-09 13:46:09 +05305795 tgt_cfg.wmi_max_len = wmi_get_max_msg_len(wma_handle->wmi_handle)
5796 - WMI_TLV_HEADROOM;
Nachiket Kukade8b4bfd82017-05-25 18:34:48 +05305797 tgt_cfg.tx_bfee_8ss_enabled = wma_handle->tx_bfee_8ss_enabled;
gaurank kathpalia5fcefa92018-10-24 15:03:15 +05305798 tgt_cfg.dynamic_nss_chains_support =
5799 wma_handle->dynamic_nss_chains_support;
Arif Hussainee10f902017-12-27 16:30:17 -08005800 wma_update_obss_detection_support(wma_handle, &tgt_cfg);
Arif Hussain05fb4872018-01-03 16:02:55 -08005801 wma_update_obss_color_collision_support(wma_handle, &tgt_cfg);
Deepak Dhamdhere13230d32016-05-26 00:46:53 -07005802 wma_update_hdd_cfg_ndp(wma_handle, &tgt_cfg);
Nachiket Kukade85aa3782018-11-02 20:12:34 +05305803 wma_update_nan_target_caps(wma_handle, &tgt_cfg);
Arif Hussain50689082019-03-26 12:07:58 -07005804 wma_update_bcast_twt_support(wma_handle, &tgt_cfg);
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05305805
5806 /* Take the max of chains supported by FW, which will limit nss */
5807 for (i = 0; i < tgt_hdl->info.total_mac_phy_cnt; i++)
5808 wma_fill_chain_cfg(tgt_hdl, i);
5809
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05305810 ret = wma_handle->tgt_cfg_update_cb(hdd_ctx, &tgt_cfg);
5811 if (ret)
5812 return -EINVAL;
Himanshu Agarwal2228e072018-01-24 17:42:17 +05305813 target_if_store_pdev_target_if_ctx(wma_get_pdev_from_scn_handle);
Nachiket Kukade7dda8c22018-03-12 19:59:43 +05305814 target_pdev_set_wmi_handle(wma_handle->pdev->tgt_if_handle,
5815 wma_handle->wmi_handle);
Jeff Johnson6ec742c2018-03-31 15:21:08 -07005816 wma_green_ap_register_handlers(wma_handle);
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05305817
5818 return ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005819}
5820
5821/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005822 * wma_dump_dbs_hw_mode() - Print the DBS HW modes
5823 * @wma_handle: WMA handle
5824 *
5825 * Prints the DBS HW modes sent by the FW as part
5826 * of WMI ready event
5827 *
5828 * Return: None
5829 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07005830static void wma_dump_dbs_hw_mode(tp_wma_handle wma_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005831{
5832 uint32_t i, param;
5833
5834 if (!wma_handle) {
5835 WMA_LOGE("%s: Invalid WMA handle", __func__);
5836 return;
5837 }
5838
5839 for (i = 0; i < wma_handle->num_dbs_hw_modes; i++) {
5840 param = wma_handle->hw_mode.hw_mode_list[i];
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08005841 WMA_LOGD("%s:[%d]-MAC0: tx_ss:%d rx_ss:%d bw_idx:%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005842 __func__, i,
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305843 WMA_HW_MODE_MAC0_TX_STREAMS_GET(param),
5844 WMA_HW_MODE_MAC0_RX_STREAMS_GET(param),
5845 WMA_HW_MODE_MAC0_BANDWIDTH_GET(param));
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08005846 WMA_LOGD("%s:[%d]-MAC1: tx_ss:%d rx_ss:%d bw_idx:%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005847 __func__, i,
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305848 WMA_HW_MODE_MAC1_TX_STREAMS_GET(param),
5849 WMA_HW_MODE_MAC1_RX_STREAMS_GET(param),
5850 WMA_HW_MODE_MAC1_BANDWIDTH_GET(param));
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08005851 WMA_LOGD("%s:[%d] DBS:%d SBS:%d", __func__, i,
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305852 WMA_HW_MODE_DBS_MODE_GET(param),
5853 WMA_HW_MODE_SBS_MODE_GET(param));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005854 }
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07005855 policy_mgr_dump_dbs_hw_mode(wma_handle->psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005856}
5857
5858/**
5859 * wma_init_scan_fw_mode_config() - Initialize scan/fw mode config
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305860 * @psoc: Object manager psoc
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05305861 * @scan_config: Scam mode configuration
5862 * @fw_config: FW mode configuration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005863 *
5864 * Enables all the valid bits of concurrent_scan_config_bits and
5865 * fw_mode_config_bits.
5866 *
5867 * Return: None
5868 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305869static void wma_init_scan_fw_mode_config(struct wlan_objmgr_psoc *psoc,
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07005870 uint32_t scan_config,
5871 uint32_t fw_config)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005872{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005873 WMA_LOGD("%s: Enter", __func__);
5874
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305875 if (!psoc) {
5876 WMA_LOGE("%s: obj psoc is NULL", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005877 return;
5878 }
5879
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305880 policy_mgr_init_dbs_config(psoc, scan_config, fw_config);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005881}
5882
Dustin Brown06259e52018-02-28 16:00:02 -08005883static void wma_set_pmo_caps(struct wlan_objmgr_psoc *psoc)
5884{
5885 QDF_STATUS status;
Sourav Mohapatra5daec822018-07-10 14:40:06 +05305886 tp_wma_handle wma;
Dustin Brown06259e52018-02-28 16:00:02 -08005887 struct pmo_device_caps caps;
5888
Sourav Mohapatra5daec822018-07-10 14:40:06 +05305889 wma = cds_get_context(QDF_MODULE_ID_WMA);
Arif Hussaineec28b52018-08-21 17:21:28 -07005890 if (!wma) {
5891 WMA_LOGE("%s: wma handler is null", __func__);
5892 return;
5893 }
5894
Dustin Brown06259e52018-02-28 16:00:02 -08005895 caps.arp_ns_offload =
Sourav Mohapatra5daec822018-07-10 14:40:06 +05305896 wmi_service_enabled(wma->wmi_handle, wmi_service_arpns_offload);
Dustin Brown06259e52018-02-28 16:00:02 -08005897 caps.apf =
Sourav Mohapatra5daec822018-07-10 14:40:06 +05305898 wmi_service_enabled(wma->wmi_handle, wmi_service_apf_offload);
Dustin Brown06259e52018-02-28 16:00:02 -08005899 caps.packet_filter =
Sourav Mohapatra5daec822018-07-10 14:40:06 +05305900 wmi_service_enabled(wma->wmi_handle,
5901 wmi_service_packet_filter_offload);
Dustin Brown06259e52018-02-28 16:00:02 -08005902 caps.unified_wow =
Sourav Mohapatra5daec822018-07-10 14:40:06 +05305903 wmi_service_enabled(wma->wmi_handle,
5904 wmi_service_unified_wow_capability);
Nachiket Kukade4b7c8e02018-06-01 22:53:06 +05305905 caps.li_offload =
Sourav Mohapatra5daec822018-07-10 14:40:06 +05305906 wmi_service_enabled(wma->wmi_handle,
5907 wmi_service_listen_interval_offload_support
5908 );
Dustin Brown06259e52018-02-28 16:00:02 -08005909
5910 status = ucfg_pmo_psoc_set_caps(psoc, &caps);
5911 if (QDF_IS_STATUS_ERROR(status))
5912 WMA_LOGE("Failed to set PMO capabilities; status:%d", status);
5913}
5914
Pragaspathi Thilagaraj1f3f99f2019-04-24 23:48:47 +05305915/**
5916 * wma_set_mlme_caps() - Populate the MLME related target capabilities to the
5917 * mlme component
5918 * @psoc: Pointer to psoc object
5919 *
5920 * Return: None
5921 */
5922static void wma_set_mlme_caps(struct wlan_objmgr_psoc *psoc)
5923{
5924 tp_wma_handle wma;
5925 bool tgt_cap;
5926 QDF_STATUS status;
5927
5928 wma = cds_get_context(QDF_MODULE_ID_WMA);
5929 if (!wma) {
5930 WMA_LOGE("%s: wma handler is null", __func__);
5931 return;
5932 }
5933
5934 tgt_cap = wmi_service_enabled(wma->wmi_handle,
5935 wmi_service_adaptive_11r_support);
5936
5937 status = ucfg_mlme_set_tgt_adaptive_11r_cap(psoc, tgt_cap);
5938 if (QDF_IS_STATUS_ERROR(status))
5939 WMA_LOGE("Failed to set adaptive 11r cap");
5940}
5941
Dustin Brown06259e52018-02-28 16:00:02 -08005942static void wma_set_component_caps(struct wlan_objmgr_psoc *psoc)
5943{
5944 wma_set_pmo_caps(psoc);
Pragaspathi Thilagaraj1f3f99f2019-04-24 23:48:47 +05305945 wma_set_mlme_caps(psoc);
Dustin Brown06259e52018-02-28 16:00:02 -08005946}
5947
Mukul Sharma44746042018-05-24 17:30:52 +05305948#if defined(WLAN_FEATURE_GTK_OFFLOAD) && defined(WLAN_POWER_MANAGEMENT_OFFLOAD)
5949static QDF_STATUS wma_register_gtk_offload_event(tp_wma_handle wma_handle)
5950{
5951 QDF_STATUS status = QDF_STATUS_E_FAILURE;
5952
5953 if (!wma_handle) {
5954 WMA_LOGE("%s: wma_handle passed is NULL", __func__);
5955 return QDF_STATUS_E_FAILURE;
5956 }
5957
5958 if (wmi_service_enabled(wma_handle->wmi_handle,
5959 wmi_service_gtk_offload)) {
5960 status = wmi_unified_register_event_handler(
5961 wma_handle->wmi_handle,
5962 wmi_gtk_offload_status_event_id,
5963 target_if_pmo_gtk_offload_status_event,
5964 WMA_RX_WORK_CTX);
5965 }
5966 return status;
5967}
5968#else
5969static QDF_STATUS wma_register_gtk_offload_event(tp_wma_handle wma_handle)
5970{
5971 return QDF_STATUS_SUCCESS;
5972}
5973#endif /* WLAN_FEATURE_GTK_OFFLOAD && WLAN_POWER_MANAGEMENT_OFFLOAD */
5974
Anurag Chouhan04dbf6d2016-09-08 15:32:52 +05305975/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005976 * wma_rx_service_ready_event() - event handler to process
5977 * wmi rx sevice ready event.
5978 * @handle: wma handle
5979 * @cmd_param_info: command params info
5980 *
5981 * Return: none
5982 */
Govind Singhd76a5b02016-03-08 15:12:14 +05305983int wma_rx_service_ready_event(void *handle, uint8_t *cmd_param_info,
Dustin Brown7678b6c2018-03-07 13:00:52 -08005984 uint32_t length)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005985{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005986 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005987 WMI_SERVICE_READY_EVENTID_param_tlvs *param_buf;
5988 wmi_service_ready_event_fixed_param *ev;
Dustin Brown7678b6c2018-03-07 13:00:52 -08005989 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005990 uint32_t *ev_wlan_dbs_hw_mode_list;
Leo Chang96464902016-10-28 11:10:54 -07005991 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Arunk Khandavallia6305a32018-01-25 11:19:18 +05305992 struct target_psoc_info *tgt_hdl;
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305993 struct wlan_psoc_target_capability_info *tgt_cap_info;
5994 target_resource_config *wlan_res_cfg;
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05305995 struct wmi_unified *wmi_handle;
5996 uint32_t *service_bitmap;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005997
5998 WMA_LOGD("%s: Enter", __func__);
5999
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05306000 if (!handle) {
6001 WMA_LOGE("%s: wma_handle passed is NULL", __func__);
6002 return -EINVAL;
6003 }
6004
Arunk Khandavallia6305a32018-01-25 11:19:18 +05306005 tgt_hdl = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
6006 if (!tgt_hdl) {
6007 WMA_LOGE("%s: target psoc info is NULL", __func__);
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306008 return -EINVAL;
Arunk Khandavallia6305a32018-01-25 11:19:18 +05306009 }
6010
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306011 wlan_res_cfg = target_psoc_get_wlan_res_cfg(tgt_hdl);
6012 tgt_cap_info = target_psoc_get_target_caps(tgt_hdl);
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05306013 service_bitmap = target_psoc_get_service_bitmap(tgt_hdl);
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306014
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006015 param_buf = (WMI_SERVICE_READY_EVENTID_param_tlvs *) cmd_param_info;
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05306016 if (!param_buf) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006017 WMA_LOGE("%s: Invalid arguments", __func__);
Govind Singhd76a5b02016-03-08 15:12:14 +05306018 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006019 }
6020
6021 ev = param_buf->fixed_param;
6022 if (!ev) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006023 WMA_LOGE("%s: Invalid buffer", __func__);
Govind Singhd76a5b02016-03-08 15:12:14 +05306024 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006025 }
6026
Sourav Mohapatracf632572018-04-02 11:01:35 +05306027 wmi_handle = get_wmi_unified_hdl_from_psoc(wma_handle->psoc);
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05306028 if (!wmi_handle) {
6029 WMA_LOGE("%s: wmi handle is NULL", __func__);
6030 return -EINVAL;
6031 }
6032
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08006033 WMA_LOGD("WMA <-- WMI_SERVICE_READY_EVENTID");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006034
Amar Singhal7b038ca2017-10-04 13:38:39 -07006035 if (ev->num_dbs_hw_modes > param_buf->num_wlan_dbs_hw_mode_list) {
6036 WMA_LOGE("FW dbs_hw_mode entry %d more than value %d in TLV hdr",
6037 ev->num_dbs_hw_modes,
6038 param_buf->num_wlan_dbs_hw_mode_list);
6039 return -EINVAL;
6040 }
6041
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006042 wma_handle->num_dbs_hw_modes = ev->num_dbs_hw_modes;
6043 ev_wlan_dbs_hw_mode_list = param_buf->wlan_dbs_hw_mode_list;
Arif Hussain157263f2018-10-03 13:07:15 -07006044
6045 /* Continuing with the rest of the processing,
6046 * even if memory allocation fails
6047 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006048 wma_handle->hw_mode.hw_mode_list =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306049 qdf_mem_malloc(sizeof(*wma_handle->hw_mode.hw_mode_list) *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006050 wma_handle->num_dbs_hw_modes);
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306051
6052 if (wma_handle->hw_mode.hw_mode_list)
6053 qdf_mem_copy(wma_handle->hw_mode.hw_mode_list,
6054 ev_wlan_dbs_hw_mode_list,
6055 (sizeof(*wma_handle->hw_mode.hw_mode_list) *
6056 wma_handle->num_dbs_hw_modes));
6057
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07006058 policy_mgr_init_dbs_hw_mode(wma_handle->psoc,
6059 ev->num_dbs_hw_modes, ev_wlan_dbs_hw_mode_list);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006060 wma_dump_dbs_hw_mode(wma_handle);
6061
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05306062 /* Initializes the fw_mode and scan_config to zero.
6063 * If ext service ready event is present it will set
6064 * the actual values of these two params.
6065 * This is to ensure that no garbage values would be
6066 * present in the absence of ext service ready event.
6067 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306068 wma_init_scan_fw_mode_config(wma_handle->psoc, 0, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006069
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306070 qdf_mem_copy(&wma_handle->reg_cap, param_buf->hal_reg_capabilities,
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306071 sizeof(HAL_REG_CAPABILITIES));
6072
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006073 wma_handle->vht_supp_mcs = ev->vht_supp_mcs;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006074
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306075 wma_handle->new_hw_mode_index = tgt_cap_info->default_dbs_hw_mode_index;
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07006076 policy_mgr_update_new_hw_mode_index(wma_handle->psoc,
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306077 tgt_cap_info->default_dbs_hw_mode_index);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006078
6079 WMA_LOGD("%s: Firmware default hw mode index : %d",
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306080 __func__, tgt_cap_info->default_dbs_hw_mode_index);
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08006081 WMA_LOGI("%s: Firmware build version : %08x",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006082 __func__, ev->fw_build_vers);
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306083 WMA_LOGD("FW fine time meas cap: 0x%x",
6084 tgt_cap_info->wmi_fw_sub_feat_caps);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006085
Ryan Hsuc6918552018-05-16 13:29:59 -07006086 wma_handle->hw_bd_id = ev->hw_bd_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006087
Ryan Hsuc6918552018-05-16 13:29:59 -07006088 wma_handle->hw_bd_info[BDF_VERSION] =
6089 WMI_GET_BDF_VERSION(ev->hw_bd_info);
6090 wma_handle->hw_bd_info[REF_DESIGN_ID] =
6091 WMI_GET_REF_DESIGN(ev->hw_bd_info);
6092 wma_handle->hw_bd_info[CUSTOMER_ID] =
6093 WMI_GET_CUSTOMER_ID(ev->hw_bd_info);
6094 wma_handle->hw_bd_info[PROJECT_ID] =
6095 WMI_GET_PROJECT_ID(ev->hw_bd_info);
6096 wma_handle->hw_bd_info[BOARD_DATA_REV] =
6097 WMI_GET_BOARD_DATA_REV(ev->hw_bd_info);
6098
6099 WMA_LOGI("%s: Board id: %x, Board version: %x %x %x %x %x",
6100 __func__, wma_handle->hw_bd_id,
6101 wma_handle->hw_bd_info[BDF_VERSION],
6102 wma_handle->hw_bd_info[REF_DESIGN_ID],
6103 wma_handle->hw_bd_info[CUSTOMER_ID],
6104 wma_handle->hw_bd_info[PROJECT_ID],
6105 wma_handle->hw_bd_info[BOARD_DATA_REV]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006106
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006107 /* wmi service is ready */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306108 qdf_mem_copy(wma_handle->wmi_service_bitmap,
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05306109 service_bitmap,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006110 sizeof(wma_handle->wmi_service_bitmap));
Nirav Shah22bf44d2015-12-10 15:39:48 +05306111
Leo Chang96464902016-10-28 11:10:54 -07006112 cdp_cfg_tx_set_is_mgmt_over_wmi_enabled(soc,
Dustin Brown7678b6c2018-03-07 13:00:52 -08006113 wmi_service_enabled(wmi_handle, wmi_service_mgmt_tx_wmi));
Leo Chang96464902016-10-28 11:10:54 -07006114 cdp_set_desc_global_pool_size(soc, ev->num_msdu_desc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006115 /* SWBA event handler for beacon transmission */
Harprit Chhabada98225f62018-12-11 15:29:55 -08006116 status = wma_register_swba_events(wma_handle->wmi_handle);
6117
Dustin Brown7678b6c2018-03-07 13:00:52 -08006118 if (QDF_IS_STATUS_ERROR(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006119 WMA_LOGE("Failed to register swba beacon event cb");
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306120 goto free_hw_mode_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006121 }
6122#ifdef WLAN_FEATURE_LPSS
6123 wma_handle->lpss_support =
Dustin Brown7678b6c2018-03-07 13:00:52 -08006124 wmi_service_enabled(wmi_handle, wmi_service_lpass);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006125#endif /* WLAN_FEATURE_LPSS */
6126
6127 /*
6128 * This Service bit is added to check for ARP/NS Offload
6129 * support for LL/HL targets
6130 */
6131 wma_handle->ap_arpns_support =
Dustin Brown7678b6c2018-03-07 13:00:52 -08006132 wmi_service_enabled(wmi_handle, wmi_service_ap_arpns_offload);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006133
Dustin Brown7678b6c2018-03-07 13:00:52 -08006134 if (wmi_service_enabled(wmi_handle, wmi_service_csa_offload)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006135 WMA_LOGD("%s: FW support CSA offload capability", __func__);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07006136 status = wmi_unified_register_event_handler(
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05306137 wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05306138 wmi_csa_handling_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05306139 wma_csa_offload_handler,
6140 WMA_RX_SERIALIZER_CTX);
Dustin Brown7678b6c2018-03-07 13:00:52 -08006141 if (QDF_IS_STATUS_ERROR(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006142 WMA_LOGE("Failed to register CSA offload event cb");
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306143 goto free_hw_mode_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006144 }
6145 }
6146
Dustin Brown7678b6c2018-03-07 13:00:52 -08006147 if (wmi_service_enabled(wmi_handle, wmi_service_mgmt_tx_wmi)) {
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08006148 WMA_LOGD("Firmware supports management TX over WMI,use WMI interface instead of HTT for management Tx");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006149 /*
6150 * Register Tx completion event handler for MGMT Tx over WMI
6151 * case
6152 */
6153 status = wmi_unified_register_event_handler(
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05306154 wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05306155 wmi_mgmt_tx_completion_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05306156 wma_mgmt_tx_completion_handler,
6157 WMA_RX_SERIALIZER_CTX);
Dustin Brown7678b6c2018-03-07 13:00:52 -08006158 if (QDF_IS_STATUS_ERROR(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006159 WMA_LOGE("Failed to register MGMT over WMI completion handler");
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306160 goto free_hw_mode_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006161 }
6162
Nirav Shah20489972016-06-16 19:20:28 +05306163 status = wmi_unified_register_event_handler(
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05306164 wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05306165 wmi_mgmt_tx_bundle_completion_event_id,
Nirav Shah20489972016-06-16 19:20:28 +05306166 wma_mgmt_tx_bundle_completion_handler,
6167 WMA_RX_SERIALIZER_CTX);
Dustin Brown7678b6c2018-03-07 13:00:52 -08006168 if (QDF_IS_STATUS_ERROR(status)) {
Nirav Shah20489972016-06-16 19:20:28 +05306169 WMA_LOGE("Failed to register MGMT over WMI completion handler");
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306170 goto free_hw_mode_list;
Nirav Shah20489972016-06-16 19:20:28 +05306171 }
6172
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006173 } else {
6174 WMA_LOGE("FW doesnot support WMI_SERVICE_MGMT_TX_WMI, Use HTT interface for Management Tx");
6175 }
Dustin Brown7678b6c2018-03-07 13:00:52 -08006176
Mukul Sharma44746042018-05-24 17:30:52 +05306177 status = wma_register_gtk_offload_event(wma_handle);
6178 if (QDF_IS_STATUS_ERROR(status)) {
6179 WMA_LOGE("Failed to register GTK offload event cb");
6180 goto free_hw_mode_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006181 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006182
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05306183 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05306184 wmi_tbttoffset_update_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05306185 wma_tbttoffset_update_event_handler,
6186 WMA_RX_SERIALIZER_CTX);
Dustin Brown7678b6c2018-03-07 13:00:52 -08006187 if (QDF_IS_STATUS_ERROR(status)) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07006188 WMA_LOGE("Failed to register WMI_TBTTOFFSET_UPDATE_EVENTID callback");
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306189 goto free_hw_mode_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006190 }
6191
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05306192 if (wmi_service_enabled(wma_handle->wmi_handle,
6193 wmi_service_rcpi_support)) {
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +05306194 /* register for rcpi response event */
6195 status = wmi_unified_register_event_handler(
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05306196 wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05306197 wmi_update_rcpi_event_id,
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +05306198 wma_rcpi_event_handler,
6199 WMA_RX_SERIALIZER_CTX);
Dustin Brown7678b6c2018-03-07 13:00:52 -08006200 if (QDF_IS_STATUS_ERROR(status)) {
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +05306201 WMA_LOGE("Failed to register RCPI event handler");
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306202 goto free_hw_mode_list;
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +05306203 }
6204 wma_handle->rcpi_enabled = true;
6205 }
6206
Govind Singhefc5ccd2016-04-25 11:11:55 +05306207 /* mac_id is replaced with pdev_id in converged firmware to have
6208 * multi-radio support. In order to maintain backward compatibility
6209 * with old fw, host needs to check WMI_SERVICE_DEPRECATED_REPLACE
6210 * in service bitmap from FW and host needs to set use_pdev_id in
6211 * wmi_resource_config to true. If WMI_SERVICE_DEPRECATED_REPLACE
6212 * service is not set, then host shall not expect MAC ID from FW in
6213 * VDEV START RESPONSE event and host shall use PDEV ID.
6214 */
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05306215 if (wmi_service_enabled(wmi_handle, wmi_service_deprecated_replace))
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306216 wlan_res_cfg->use_pdev_id = true;
Govind Singhefc5ccd2016-04-25 11:11:55 +05306217 else
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306218 wlan_res_cfg->use_pdev_id = false;
Govind Singhefc5ccd2016-04-25 11:11:55 +05306219
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306220 wlan_res_cfg->max_num_dbs_scan_duty_cycle = CDS_DBS_SCAN_CLIENTS_MAX;
Nitesh Shahf9a09ff2017-05-22 15:46:25 +05306221
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006222 /* Initialize the log supported event handler */
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05306223 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05306224 wmi_diag_event_id_log_supported_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05306225 wma_log_supported_evt_handler,
6226 WMA_RX_SERIALIZER_CTX);
Dustin Brown7678b6c2018-03-07 13:00:52 -08006227 if (QDF_IS_STATUS_ERROR(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006228 WMA_LOGE("Failed to register log supported event cb");
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306229 goto free_hw_mode_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006230 }
6231
Leo Chang96464902016-10-28 11:10:54 -07006232 cdp_mark_first_wakeup_packet(soc,
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05306233 wmi_service_enabled(wmi_handle,
Visweswara Tanuku025f5862019-01-08 17:35:33 +05306234 wmi_service_mark_first_wakeup_packet));
Arif Hussaind54b62c2018-03-01 13:31:37 -08006235 wma_handle->is_dfs_offloaded =
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05306236 wmi_service_enabled(wmi_handle,
Visweswara Tanuku025f5862019-01-08 17:35:33 +05306237 wmi_service_dfs_phyerr_offload);
Arif Hussaindb6e4e92018-06-01 16:39:15 -07006238
Deepak Dhamdhere13230d32016-05-26 00:46:53 -07006239 wma_handle->nan_datapath_enabled =
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05306240 wmi_service_enabled(wma_handle->wmi_handle,
Visweswara Tanuku025f5862019-01-08 17:35:33 +05306241 wmi_service_nan_data);
6242
6243 wma_handle->fw_therm_throt_support =
6244 wmi_service_enabled(wma_handle->wmi_handle,
6245 wmi_service_tt);
Dustin Brown06259e52018-02-28 16:00:02 -08006246
6247 wma_set_component_caps(wma_handle->psoc);
6248
Dustin Brownb9987af2018-03-01 17:15:11 -08006249 wma_update_fw_config(wma_handle->psoc, tgt_hdl);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006250
Dustin Brown7678b6c2018-03-07 13:00:52 -08006251 status = wmi_unified_save_fw_version_cmd(wmi_handle, param_buf);
6252 if (QDF_IS_STATUS_ERROR(status)) {
Govind Singhf25a0f12016-03-08 16:09:48 +05306253 WMA_LOGE("Failed to send WMI_INIT_CMDID command");
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306254 goto free_hw_mode_list;
Govind Singhf25a0f12016-03-08 16:09:48 +05306255 }
6256
Zhu Jianmin2d87a1c2018-05-31 11:22:23 +08006257 if (wmi_service_enabled(wmi_handle, wmi_service_ext_msg)) {
6258 status = qdf_mc_timer_start(
6259 &wma_handle->service_ready_ext_timer,
6260 WMA_SERVICE_READY_EXT_TIMEOUT);
6261 if (QDF_IS_STATUS_ERROR(status))
6262 WMA_LOGE("Failed to start the service ready ext timer");
6263 }
Dustin Brown7678b6c2018-03-07 13:00:52 -08006264 wma_handle->tx_bfee_8ss_enabled =
6265 wmi_service_enabled(wmi_handle, wmi_service_8ss_tx_bfee);
Nachiket Kukade8b4bfd82017-05-25 18:34:48 +05306266
gaurank kathpalia5fcefa92018-10-24 15:03:15 +05306267 wma_handle->dynamic_nss_chains_support = wmi_service_enabled(wmi_handle,
6268 wmi_service_per_vdev_chain_support);
Arunk Khandavallia6305a32018-01-25 11:19:18 +05306269 target_psoc_set_num_radios(tgt_hdl, 1);
6270
Govind Singhd76a5b02016-03-08 15:12:14 +05306271 return 0;
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306272
6273free_hw_mode_list:
6274 if (wma_handle->hw_mode.hw_mode_list) {
6275 qdf_mem_free(wma_handle->hw_mode.hw_mode_list);
6276 wma_handle->hw_mode.hw_mode_list = NULL;
6277 WMA_LOGD("%s: DBS list is freed", __func__);
6278 }
6279
6280 return -EINVAL;
6281
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006282}
6283
6284/**
Krunal Soni0193b6f2016-08-15 15:53:43 -07006285 * wma_get_phyid_for_given_band() - to get phyid for band
6286 *
6287 * @wma_handle: Pointer to wma handle
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306288* @tgt_hdl: target psoc information
Krunal Soni0193b6f2016-08-15 15:53:43 -07006289 * @band: enum value of for 2G or 5G band
6290 * @phyid: Pointer to phyid which needs to be filled
6291 *
6292 * This API looks in to the map to find out which particular phy supports
6293 * provided band and return the idx (also called phyid) of that phy. Caller
6294 * use this phyid to fetch various caps of that phy
6295 *
6296 * Return: QDF_STATUS
6297 */
6298static QDF_STATUS wma_get_phyid_for_given_band(
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07006299 tp_wma_handle wma_handle,
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306300 struct target_psoc_info *tgt_hdl,
Krunal Soni0193b6f2016-08-15 15:53:43 -07006301 enum cds_band_type band, uint8_t *phyid)
6302{
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306303 uint8_t idx, i, num_radios;
6304 struct wlan_psoc_host_mac_phy_caps *mac_phy_cap;
Krunal Soni0193b6f2016-08-15 15:53:43 -07006305
6306 if (!wma_handle) {
6307 WMA_LOGE("Invalid wma handle");
6308 return QDF_STATUS_E_FAILURE;
6309 }
6310
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306311 idx = 0;
Krunal Soni0193b6f2016-08-15 15:53:43 -07006312 *phyid = idx;
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306313 num_radios = target_psoc_get_num_radios(tgt_hdl);
6314 mac_phy_cap = target_psoc_get_mac_phy_cap(tgt_hdl);
Krunal Soni0193b6f2016-08-15 15:53:43 -07006315
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306316 for (i = 0; i < num_radios; i++) {
Krunal Soni0193b6f2016-08-15 15:53:43 -07006317 if ((band == CDS_BAND_2GHZ) &&
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306318 (WLAN_2G_CAPABILITY == mac_phy_cap[idx + i].supported_bands)) {
Krunal Soni0193b6f2016-08-15 15:53:43 -07006319 *phyid = idx + i;
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006320 WMA_LOGD("Select 2G capable phyid[%d]", *phyid);
Krunal Soni0193b6f2016-08-15 15:53:43 -07006321 return QDF_STATUS_SUCCESS;
6322 } else if ((band == CDS_BAND_5GHZ) &&
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306323 (WLAN_5G_CAPABILITY == mac_phy_cap[idx + i].supported_bands)) {
Krunal Soni0193b6f2016-08-15 15:53:43 -07006324 *phyid = idx + i;
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006325 WMA_LOGD("Select 5G capable phyid[%d]", *phyid);
Krunal Soni0193b6f2016-08-15 15:53:43 -07006326 return QDF_STATUS_SUCCESS;
6327 }
6328 }
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006329 WMA_LOGD("Using default single hw mode phyid[%d]", *phyid);
Krunal Soni0193b6f2016-08-15 15:53:43 -07006330 return QDF_STATUS_SUCCESS;
6331}
6332
6333/**
6334 * wma_get_caps_for_phyidx_hwmode() - to fetch caps for given hw mode and band
6335 * @caps_per_phy: Pointer to capabilities structure which needs to be filled
6336 * @hw_mode: Provided hardware mode
6337 * @band: Provide band i.e. 2G or 5G
6338 *
6339 * This API finds cap which suitable for provided hw mode and band. If user
6340 * is provides some invalid hw mode then it will automatically falls back to
6341 * default hw mode
6342 *
6343 * Return: QDF_STATUS
6344 */
6345QDF_STATUS wma_get_caps_for_phyidx_hwmode(struct wma_caps_per_phy *caps_per_phy,
6346 enum hw_mode_dbs_capab hw_mode, enum cds_band_type band)
6347{
6348 t_wma_handle *wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Arunk Khandavalli2462f462018-01-25 14:41:02 +05306349 struct target_psoc_info *tgt_hdl;
6350 int ht_cap_info, vht_cap_info;
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306351 uint8_t phyid, our_hw_mode = hw_mode, num_hw_modes;
6352 struct wlan_psoc_host_mac_phy_caps *mac_phy_cap;
Krunal Soni0193b6f2016-08-15 15:53:43 -07006353
6354 if (!wma_handle) {
6355 WMA_LOGE("Invalid wma handle");
6356 return QDF_STATUS_E_FAILURE;
6357 }
6358
Arunk Khandavalli2462f462018-01-25 14:41:02 +05306359 tgt_hdl = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
6360 if (!tgt_hdl) {
6361 WMA_LOGE("%s: target psoc info is NULL", __func__);
6362 return -EINVAL;
6363 }
6364
6365 ht_cap_info = target_if_get_ht_cap_info(tgt_hdl);
6366 vht_cap_info = target_if_get_vht_cap_info(tgt_hdl);
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306367 num_hw_modes = target_psoc_get_num_hw_modes(tgt_hdl);
6368 mac_phy_cap = target_psoc_get_mac_phy_cap(tgt_hdl);
Arunk Khandavalli2462f462018-01-25 14:41:02 +05306369
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306370 if (!num_hw_modes) {
jiad080abce2017-08-08 15:17:39 +08006371 WMA_LOGD("Invalid number of hw modes, use legacy HT/VHT caps");
Arunk Khandavalli2462f462018-01-25 14:41:02 +05306372 caps_per_phy->ht_2g = ht_cap_info;
6373 caps_per_phy->ht_5g = ht_cap_info;
6374 caps_per_phy->vht_2g = vht_cap_info;
6375 caps_per_phy->vht_5g = vht_cap_info;
jiad080abce2017-08-08 15:17:39 +08006376 /* legacy platform doesn't support HE IE */
Kiran Kumar Lokere1f96b4a2018-08-22 14:47:11 -07006377 caps_per_phy->he_2g[0] = 0;
6378 caps_per_phy->he_2g[1] = 0;
6379 caps_per_phy->he_5g[0] = 0;
6380 caps_per_phy->he_5g[1] = 0;
jiad080abce2017-08-08 15:17:39 +08006381
6382 return QDF_STATUS_SUCCESS;
Krunal Soni0193b6f2016-08-15 15:53:43 -07006383 }
6384
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07006385 if (!policy_mgr_is_dbs_enable(wma_handle->psoc))
Krunal Soni0193b6f2016-08-15 15:53:43 -07006386 our_hw_mode = HW_MODE_DBS_NONE;
6387
6388 if (!caps_per_phy) {
6389 WMA_LOGE("Invalid caps pointer");
6390 return QDF_STATUS_E_FAILURE;
6391 }
6392
Krunal Soni0193b6f2016-08-15 15:53:43 -07006393 if (QDF_STATUS_SUCCESS !=
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306394 wma_get_phyid_for_given_band(wma_handle, tgt_hdl, band, &phyid)) {
Krunal Soni0193b6f2016-08-15 15:53:43 -07006395 WMA_LOGE("Invalid phyid");
6396 return QDF_STATUS_E_FAILURE;
6397 }
Krunal Soni0193b6f2016-08-15 15:53:43 -07006398
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306399 caps_per_phy->ht_2g = mac_phy_cap[phyid].ht_cap_info_2G;
6400 caps_per_phy->ht_5g = mac_phy_cap[phyid].ht_cap_info_5G;
6401 caps_per_phy->vht_2g = mac_phy_cap[phyid].vht_cap_info_2G;
6402 caps_per_phy->vht_5g = mac_phy_cap[phyid].vht_cap_info_5G;
Kiran Kumar Lokere1f96b4a2018-08-22 14:47:11 -07006403 qdf_mem_copy(caps_per_phy->he_2g, mac_phy_cap[phyid].he_cap_info_2G,
6404 sizeof(caps_per_phy->he_2g));
6405 qdf_mem_copy(caps_per_phy->he_5g, mac_phy_cap[phyid].he_cap_info_5G,
6406 sizeof(caps_per_phy->he_5g));
Krunal Soni0193b6f2016-08-15 15:53:43 -07006407
Naveen Rawat98322472018-03-06 10:29:42 -08006408 caps_per_phy->tx_chain_mask_2G = mac_phy_cap->tx_chain_mask_2G;
6409 caps_per_phy->rx_chain_mask_2G = mac_phy_cap->rx_chain_mask_2G;
6410 caps_per_phy->tx_chain_mask_5G = mac_phy_cap->tx_chain_mask_5G;
6411 caps_per_phy->rx_chain_mask_5G = mac_phy_cap->rx_chain_mask_5G;
6412
Krunal Soni0193b6f2016-08-15 15:53:43 -07006413 return QDF_STATUS_SUCCESS;
6414}
6415
6416/**
6417 * wma_is_rx_ldpc_supported_for_channel() - to find out if ldpc is supported
6418 *
6419 * @channel: Channel number for which it needs to check if rx ldpc is enabled
6420 *
6421 * This API takes channel number as argument and takes default hw mode as DBS
6422 * to check if rx LDPC support is enabled for that channel or no
6423 */
6424bool wma_is_rx_ldpc_supported_for_channel(uint32_t channel)
6425{
jiad080abce2017-08-08 15:17:39 +08006426 t_wma_handle *wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306427 struct target_psoc_info *tgt_hdl;
Krunal Soni0193b6f2016-08-15 15:53:43 -07006428 struct wma_caps_per_phy caps_per_phy = {0};
6429 enum cds_band_type band;
6430 bool status;
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306431 uint8_t num_hw_modes;
Krunal Soni0193b6f2016-08-15 15:53:43 -07006432
Amar Singhal4c3fbb42018-01-02 13:20:28 -08006433 if (!wma_handle) {
6434 WMA_LOGE("Invalid wma handle");
6435 return false;
6436 }
6437
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306438 tgt_hdl = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
6439 if (!tgt_hdl) {
6440 WMA_LOGE("Target handle is NULL");
6441 return QDF_STATUS_E_FAILURE;
6442 }
6443
6444 num_hw_modes = target_psoc_get_num_hw_modes(tgt_hdl);
6445
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07006446 if (!WLAN_REG_IS_24GHZ_CH(channel))
Krunal Soni0193b6f2016-08-15 15:53:43 -07006447 band = CDS_BAND_5GHZ;
6448 else
6449 band = CDS_BAND_2GHZ;
6450
6451 if (QDF_STATUS_SUCCESS != wma_get_caps_for_phyidx_hwmode(
6452 &caps_per_phy,
6453 HW_MODE_DBS, band)) {
6454 return false;
6455 }
jiad080abce2017-08-08 15:17:39 +08006456
6457 /*
6458 * Legacy platforms like Rome set WMI_HT_CAP_LDPC to specify RX LDPC
6459 * capability. But new platforms like Helium set WMI_HT_CAP_RX_LDPC
6460 * instead.
6461 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306462 if (0 == num_hw_modes) {
jiad080abce2017-08-08 15:17:39 +08006463 status = (!!(caps_per_phy.ht_2g & WMI_HT_CAP_LDPC));
6464 } else {
6465 if (WLAN_REG_IS_24GHZ_CH(channel))
6466 status = (!!(caps_per_phy.ht_2g & WMI_HT_CAP_RX_LDPC));
6467 else
6468 status = (!!(caps_per_phy.ht_5g & WMI_HT_CAP_RX_LDPC));
6469 }
Krunal Soni0193b6f2016-08-15 15:53:43 -07006470
6471 return status;
6472}
6473
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07006474/**
6475 * wma_print_mac_phy_capabilities() - Prints MAC PHY capabilities
6476 * @cap: pointer to WMI_MAC_PHY_CAPABILITIES
6477 * @index: MAC_PHY index
6478 *
6479 * Return: none
6480 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306481static void wma_print_mac_phy_capabilities(struct wlan_psoc_host_mac_phy_caps
6482 *cap, int index)
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07006483{
Kiran Kumar Lokere1f96b4a2018-08-22 14:47:11 -07006484 uint32_t mac_2G[PSOC_HOST_MAX_MAC_SIZE];
6485 uint32_t mac_5G[PSOC_HOST_MAX_MAC_SIZE];
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07006486 uint32_t phy_2G[WMI_MAX_HECAP_PHY_SIZE];
6487 uint32_t phy_5G[WMI_MAX_HECAP_PHY_SIZE];
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306488 struct wlan_psoc_host_ppe_threshold ppet_2G, ppet_5G;
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07006489
Dustin Brown576eea42018-06-21 12:38:21 -07006490 WMA_LOGD("\t: index [%d]", index);
6491 WMA_LOGD("\t: cap for hw_mode_id[%d]", cap->hw_mode_id);
6492 WMA_LOGD("\t: pdev_id[%d]", cap->pdev_id);
6493 WMA_LOGD("\t: phy_id[%d]", cap->phy_id);
Rachit Kankane4b6fdd12019-01-10 20:51:16 +05306494 WMA_LOGD("\t: hw_mode_config_type[%d]", cap->hw_mode_config_type);
Dustin Brown576eea42018-06-21 12:38:21 -07006495 WMA_LOGD("\t: supports_11b[%d]", cap->supports_11b);
6496 WMA_LOGD("\t: supports_11g[%d]", cap->supports_11g);
6497 WMA_LOGD("\t: supports_11a[%d]", cap->supports_11a);
6498 WMA_LOGD("\t: supports_11n[%d]", cap->supports_11n);
6499 WMA_LOGD("\t: supports_11ac[%d]", cap->supports_11ac);
6500 WMA_LOGD("\t: supports_11ax[%d]", cap->supports_11ax);
6501 WMA_LOGD("\t: supported_bands[%d]", cap->supported_bands);
6502 WMA_LOGD("\t: ampdu_density[%d]", cap->ampdu_density);
6503 WMA_LOGD("\t: max_bw_supported_2G[%d]", cap->max_bw_supported_2G);
6504 WMA_LOGD("\t: ht_cap_info_2G[%d]", cap->ht_cap_info_2G);
6505 WMA_LOGD("\t: vht_cap_info_2G[%d]", cap->vht_cap_info_2G);
6506 WMA_LOGD("\t: vht_supp_mcs_2G[%d]", cap->vht_supp_mcs_2G);
6507 WMA_LOGD("\t: tx_chain_mask_2G[%d]", cap->tx_chain_mask_2G);
6508 WMA_LOGD("\t: rx_chain_mask_2G[%d]", cap->rx_chain_mask_2G);
6509 WMA_LOGD("\t: max_bw_supported_5G[%d]", cap->max_bw_supported_5G);
6510 WMA_LOGD("\t: ht_cap_info_5G[%d]", cap->ht_cap_info_5G);
6511 WMA_LOGD("\t: vht_cap_info_5G[%d]", cap->vht_cap_info_5G);
6512 WMA_LOGD("\t: vht_supp_mcs_5G[%d]", cap->vht_supp_mcs_5G);
6513 WMA_LOGD("\t: tx_chain_mask_5G[%d]", cap->tx_chain_mask_5G);
6514 WMA_LOGD("\t: rx_chain_mask_5G[%d]", cap->rx_chain_mask_5G);
Kiran Kumar Lokere1f96b4a2018-08-22 14:47:11 -07006515 WMA_LOGD("\t: he_cap_info_2G[0][%08x]", cap->he_cap_info_2G[0]);
6516 WMA_LOGD("\t: he_cap_info_2G[1][%08x]", cap->he_cap_info_2G[1]);
Dustin Brown576eea42018-06-21 12:38:21 -07006517 WMA_LOGD("\t: he_supp_mcs_2G[%08x]", cap->he_supp_mcs_2G);
Kiran Kumar Lokere1f96b4a2018-08-22 14:47:11 -07006518 WMA_LOGD("\t: he_cap_info_5G[0][%08x]", cap->he_cap_info_5G[0]);
6519 WMA_LOGD("\t: he_cap_info_5G[1][%08x]", cap->he_cap_info_5G[1]);
Dustin Brown576eea42018-06-21 12:38:21 -07006520 WMA_LOGD("\t: he_supp_mcs_5G[%08x]", cap->he_supp_mcs_5G);
Kiran Kumar Lokere1f96b4a2018-08-22 14:47:11 -07006521 qdf_mem_copy(mac_2G, cap->he_cap_info_2G, sizeof(mac_2G));
6522 qdf_mem_copy(mac_5G, cap->he_cap_info_5G, sizeof(mac_5G));
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07006523 qdf_mem_copy(phy_2G, cap->he_cap_phy_info_2G,
6524 WMI_MAX_HECAP_PHY_SIZE * 4);
6525 qdf_mem_copy(phy_5G, cap->he_cap_phy_info_5G,
6526 WMI_MAX_HECAP_PHY_SIZE * 4);
6527 ppet_2G = cap->he_ppet2G;
6528 ppet_5G = cap->he_ppet5G;
6529
Kiran Kumar Lokere1f96b4a2018-08-22 14:47:11 -07006530 wma_print_he_mac_cap_w1(mac_2G[0]);
6531 wma_print_he_mac_cap_w2(mac_2G[1]);
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07006532 wma_print_he_phy_cap(phy_2G);
6533 wma_print_he_ppet(&ppet_2G);
Kiran Kumar Lokere1f96b4a2018-08-22 14:47:11 -07006534 wma_print_he_mac_cap_w1(mac_5G[0]);
6535 wma_print_he_mac_cap_w1(mac_5G[1]);
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07006536 wma_print_he_phy_cap(phy_5G);
6537 wma_print_he_ppet(&ppet_5G);
6538}
Krunal Soni0193b6f2016-08-15 15:53:43 -07006539
6540/**
Krunal Soni2e48d012016-05-02 16:55:26 -07006541 * wma_print_populate_soc_caps() - Prints all the caps populated per hw mode
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306542 * @tgt_info: target related info
Krunal Soni2e48d012016-05-02 16:55:26 -07006543 *
6544 * This function prints all the caps populater per hw mode and per PHY
6545 *
6546 * Return: none
6547 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306548static void wma_print_populate_soc_caps(struct target_psoc_info *tgt_hdl)
Krunal Soni2e48d012016-05-02 16:55:26 -07006549{
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08006550 int i, num_hw_modes, total_mac_phy_cnt;
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306551 struct wlan_psoc_host_mac_phy_caps *mac_phy_cap, *tmp;
6552
6553 num_hw_modes = target_psoc_get_num_hw_modes(tgt_hdl);
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08006554 total_mac_phy_cnt = target_psoc_get_total_mac_phy_cnt(tgt_hdl);
Krunal Soni2e48d012016-05-02 16:55:26 -07006555
6556 /* print number of hw modes */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306557 WMA_LOGD("%s: num of hw modes [%d]", __func__, num_hw_modes);
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08006558 WMA_LOGD("%s: num mac_phy_cnt [%d]", __func__, total_mac_phy_cnt);
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306559 mac_phy_cap = target_psoc_get_mac_phy_cap(tgt_hdl);
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006560 WMA_LOGD("%s: <====== HW mode cap printing starts ======>", __func__);
Krunal Soni2e48d012016-05-02 16:55:26 -07006561 /* print cap of each hw mode */
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08006562 for (i = 0; i < total_mac_phy_cnt; i++) {
Lin Bai772fbaf2018-07-04 14:20:55 +08006563 WMA_LOGD("====>: hw mode id[%d], phy id[%d]",
6564 mac_phy_cap[i].hw_mode_id,
6565 mac_phy_cap[i].phy_id);
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08006566 tmp = &mac_phy_cap[i];
6567 wma_print_mac_phy_capabilities(tmp, i);
Krunal Soni2e48d012016-05-02 16:55:26 -07006568 }
Dustin Brown576eea42018-06-21 12:38:21 -07006569 WMA_LOGD("%s: <====== HW mode cap printing ends ======>\n", __func__);
Krunal Soni2e48d012016-05-02 16:55:26 -07006570}
6571
6572/**
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306573 * wma_map_wmi_channel_width_to_hw_mode_bw() - returns bandwidth
6574 * in terms of hw_mode_bandwidth
6575 * @width: bandwidth in terms of wmi_channel_width
6576 *
6577 * This function returns the bandwidth in terms of hw_mode_bandwidth.
6578 *
6579 * Return: BW in terms of hw_mode_bandwidth.
6580 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07006581static enum hw_mode_bandwidth wma_map_wmi_channel_width_to_hw_mode_bw(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306582 wmi_channel_width width)
6583{
6584 switch (width) {
6585 case WMI_CHAN_WIDTH_20:
6586 return HW_MODE_20_MHZ;
6587 case WMI_CHAN_WIDTH_40:
6588 return HW_MODE_40_MHZ;
6589 case WMI_CHAN_WIDTH_80:
6590 return HW_MODE_80_MHZ;
6591 case WMI_CHAN_WIDTH_160:
6592 return HW_MODE_160_MHZ;
6593 case WMI_CHAN_WIDTH_80P80:
6594 return HW_MODE_80_PLUS_80_MHZ;
6595 case WMI_CHAN_WIDTH_5:
6596 return HW_MODE_5_MHZ;
6597 case WMI_CHAN_WIDTH_10:
6598 return HW_MODE_10_MHZ;
6599 default:
6600 return HW_MODE_BW_NONE;
6601 }
6602
6603 return HW_MODE_BW_NONE;
6604}
6605
6606/**
6607 * wma_get_hw_mode_params() - get TX-RX stream and bandwidth
6608 * supported from the capabilities.
6609 * @caps: PHY capability
6610 * @info: param to store TX-RX stream and BW information
6611 *
6612 * This function will calculate TX-RX stream and bandwidth supported
6613 * as per the PHY capability, and assign to mac_ss_bw_info.
6614 *
6615 * Return: none
6616 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306617static void wma_get_hw_mode_params(struct wlan_psoc_host_mac_phy_caps *caps,
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306618 struct mac_ss_bw_info *info)
6619{
6620 if (!caps) {
6621 WMA_LOGE("%s: Invalid capabilities", __func__);
6622 return;
6623 }
6624
6625 info->mac_tx_stream = wma_get_num_of_setbits_from_bitmask(
6626 QDF_MAX(caps->tx_chain_mask_2G,
6627 caps->tx_chain_mask_5G));
6628 info->mac_rx_stream = wma_get_num_of_setbits_from_bitmask(
6629 QDF_MAX(caps->rx_chain_mask_2G,
6630 caps->rx_chain_mask_5G));
6631 info->mac_bw = wma_map_wmi_channel_width_to_hw_mode_bw(
6632 QDF_MAX(caps->max_bw_supported_2G,
6633 caps->max_bw_supported_5G));
6634}
6635
6636/**
6637 * wma_set_hw_mode_params() - sets TX-RX stream, bandwidth and
6638 * DBS in hw_mode_list
6639 * @wma_handle: pointer to wma global structure
6640 * @mac0_ss_bw_info: TX-RX streams, BW for MAC0
6641 * @mac1_ss_bw_info: TX-RX streams, BW for MAC1
6642 * @pos: refers to hw_mode_index
6643 * @dbs_mode: dbs_mode for the dbs_hw_mode
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306644 * @sbs_mode: sbs_mode for the sbs_hw_mode
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306645 *
6646 * This function sets TX-RX stream, bandwidth and DBS mode in
6647 * hw_mode_list.
6648 *
6649 * Return: none
6650 */
6651static void wma_set_hw_mode_params(t_wma_handle *wma_handle,
6652 struct mac_ss_bw_info mac0_ss_bw_info,
6653 struct mac_ss_bw_info mac1_ss_bw_info,
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306654 uint32_t pos, uint32_t dbs_mode,
6655 uint32_t sbs_mode)
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306656{
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306657 WMA_HW_MODE_MAC0_TX_STREAMS_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306658 wma_handle->hw_mode.hw_mode_list[pos],
6659 mac0_ss_bw_info.mac_tx_stream);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306660 WMA_HW_MODE_MAC0_RX_STREAMS_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306661 wma_handle->hw_mode.hw_mode_list[pos],
6662 mac0_ss_bw_info.mac_rx_stream);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306663 WMA_HW_MODE_MAC0_BANDWIDTH_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306664 wma_handle->hw_mode.hw_mode_list[pos],
6665 mac0_ss_bw_info.mac_bw);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306666 WMA_HW_MODE_MAC1_TX_STREAMS_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306667 wma_handle->hw_mode.hw_mode_list[pos],
6668 mac1_ss_bw_info.mac_tx_stream);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306669 WMA_HW_MODE_MAC1_RX_STREAMS_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306670 wma_handle->hw_mode.hw_mode_list[pos],
6671 mac1_ss_bw_info.mac_rx_stream);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306672 WMA_HW_MODE_MAC1_BANDWIDTH_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306673 wma_handle->hw_mode.hw_mode_list[pos],
6674 mac1_ss_bw_info.mac_bw);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306675 WMA_HW_MODE_DBS_MODE_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306676 wma_handle->hw_mode.hw_mode_list[pos],
6677 dbs_mode);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306678 WMA_HW_MODE_AGILE_DFS_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306679 wma_handle->hw_mode.hw_mode_list[pos],
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306680 HW_MODE_AGILE_DFS_NONE);
6681 WMA_HW_MODE_SBS_MODE_SET(
6682 wma_handle->hw_mode.hw_mode_list[pos],
6683 sbs_mode);
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306684}
6685
6686/**
6687 * wma_update_hw_mode_list() - updates hw_mode_list
6688 * @wma_handle: pointer to wma global structure
Arunk Khandavalli80a61352018-01-25 12:19:37 +05306689 * @tgt_hdl - target psoc information
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306690 *
6691 * This function updates hw_mode_list with tx_streams, rx_streams,
6692 * bandwidth, dbs and agile dfs for each hw_mode.
6693 *
6694 * Returns: 0 for success else failure.
6695 */
Arunk Khandavalli80a61352018-01-25 12:19:37 +05306696static QDF_STATUS wma_update_hw_mode_list(t_wma_handle *wma_handle,
6697 struct target_psoc_info *tgt_hdl)
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306698{
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306699 struct wlan_psoc_host_mac_phy_caps *tmp, *mac_phy_cap;
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306700 uint32_t i, hw_config_type, j = 0;
6701 uint32_t dbs_mode, sbs_mode;
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306702 struct mac_ss_bw_info mac0_ss_bw_info = {0};
6703 struct mac_ss_bw_info mac1_ss_bw_info = {0};
Krunal Sonica50b452017-08-04 22:24:59 -07006704 WMI_PHY_CAPABILITY new_supported_band = 0;
6705 bool supported_band_update_failure = false;
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306706 struct wlan_psoc_target_capability_info *tgt_cap_info;
6707 int num_hw_modes;
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306708
6709 if (!wma_handle) {
6710 WMA_LOGE("%s: Invalid wma handle", __func__);
6711 return QDF_STATUS_E_FAILURE;
6712 }
6713
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306714 num_hw_modes = target_psoc_get_num_hw_modes(tgt_hdl);
6715 mac_phy_cap = target_psoc_get_mac_phy_cap(tgt_hdl);
6716 tgt_cap_info = target_psoc_get_target_caps(tgt_hdl);
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306717 /*
6718 * This list was updated as part of service ready event. Re-populate
6719 * HW mode list from the device capabilities.
6720 */
6721 if (wma_handle->hw_mode.hw_mode_list) {
6722 qdf_mem_free(wma_handle->hw_mode.hw_mode_list);
6723 wma_handle->hw_mode.hw_mode_list = NULL;
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006724 WMA_LOGD("%s: DBS list is freed", __func__);
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306725 }
6726
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306727 wma_handle->hw_mode.hw_mode_list =
6728 qdf_mem_malloc(sizeof(*wma_handle->hw_mode.hw_mode_list) *
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306729 num_hw_modes);
Wu Gaoe4c142d2018-11-06 11:54:32 +08006730 if (!wma_handle->hw_mode.hw_mode_list) {
6731 wma_handle->num_dbs_hw_modes = 0;
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306732 return QDF_STATUS_E_FAILURE;
Wu Gaoe4c142d2018-11-06 11:54:32 +08006733 }
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306734
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08006735 WMA_LOGD("%s: Updated HW mode list: Num modes:%d",
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306736 __func__, num_hw_modes);
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306737
Wu Gaoe4c142d2018-11-06 11:54:32 +08006738 wma_handle->num_dbs_hw_modes = num_hw_modes;
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306739 for (i = 0; i < num_hw_modes; i++) {
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306740 /* Update for MAC0 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306741 tmp = &mac_phy_cap[j++];
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306742 wma_get_hw_mode_params(tmp, &mac0_ss_bw_info);
Rachit Kankane4b6fdd12019-01-10 20:51:16 +05306743 hw_config_type = tmp->hw_mode_config_type;
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306744 dbs_mode = HW_MODE_DBS_NONE;
6745 sbs_mode = HW_MODE_SBS_NONE;
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306746 mac1_ss_bw_info.mac_tx_stream = 0;
6747 mac1_ss_bw_info.mac_rx_stream = 0;
6748 mac1_ss_bw_info.mac_bw = 0;
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306749 if (wma_update_supported_bands(tmp->supported_bands,
6750 &new_supported_band)
6751 != QDF_STATUS_SUCCESS)
Krunal Sonica50b452017-08-04 22:24:59 -07006752 supported_band_update_failure = true;
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306753
6754 /* SBS and DBS have dual MAC. Upto 2 MACs are considered. */
6755 if ((hw_config_type == WMI_HW_MODE_DBS) ||
6756 (hw_config_type == WMI_HW_MODE_SBS_PASSIVE) ||
6757 (hw_config_type == WMI_HW_MODE_SBS)) {
6758 /* Update for MAC1 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306759 tmp = &mac_phy_cap[j++];
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306760 wma_get_hw_mode_params(tmp, &mac1_ss_bw_info);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306761 if (hw_config_type == WMI_HW_MODE_DBS)
6762 dbs_mode = HW_MODE_DBS;
6763 if ((hw_config_type == WMI_HW_MODE_SBS_PASSIVE) ||
6764 (hw_config_type == WMI_HW_MODE_SBS))
6765 sbs_mode = HW_MODE_SBS;
Krunal Sonica50b452017-08-04 22:24:59 -07006766 if (QDF_STATUS_SUCCESS !=
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306767 wma_update_supported_bands(tmp->supported_bands,
Krunal Sonica50b452017-08-04 22:24:59 -07006768 &new_supported_band))
6769 supported_band_update_failure = true;
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306770 }
6771
6772 /* Updating HW mode list */
6773 wma_set_hw_mode_params(wma_handle, mac0_ss_bw_info,
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306774 mac1_ss_bw_info, i, dbs_mode,
6775 sbs_mode);
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306776 }
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07006777
Krunal Sonica50b452017-08-04 22:24:59 -07006778 /* overwrite phy_capability which we got from service ready event */
6779 if (!supported_band_update_failure) {
6780 WMA_LOGD("%s: updating supported band from old[%d] to new[%d]",
Arunk Khandavalli80a61352018-01-25 12:19:37 +05306781 __func__, target_if_get_phy_capability(tgt_hdl),
Krunal Sonica50b452017-08-04 22:24:59 -07006782 new_supported_band);
Arunk Khandavalli80a61352018-01-25 12:19:37 +05306783 target_if_set_phy_capability(tgt_hdl, new_supported_band);
Krunal Sonica50b452017-08-04 22:24:59 -07006784 }
6785
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07006786 if (QDF_STATUS_SUCCESS !=
Krunal Sonica50b452017-08-04 22:24:59 -07006787 policy_mgr_update_hw_mode_list(wma_handle->psoc,
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306788 tgt_hdl))
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07006789 WMA_LOGE("%s: failed to update policy manager", __func__);
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306790 wma_dump_dbs_hw_mode(wma_handle);
6791 return QDF_STATUS_SUCCESS;
6792}
6793
Naveen Rawat4efe41b2017-04-29 16:23:14 -07006794static void wma_init_wifi_pos_dma_rings(t_wma_handle *wma_handle,
6795 uint8_t num_mac, void *buf)
6796{
6797 struct hif_softc *hif_ctx = cds_get_context(QDF_MODULE_ID_HIF);
Amar Singhal4c3fbb42018-01-02 13:20:28 -08006798 void *hal_soc;
6799
6800 if (!hif_ctx) {
6801 WMA_LOGE("invalid hif context");
6802 return;
6803 }
6804
6805 hal_soc = hif_get_hal_handle(hif_ctx);
Naveen Rawat4efe41b2017-04-29 16:23:14 -07006806
6807 wifi_pos_init_cir_cfr_rings(wma_handle->psoc, hal_soc, num_mac, buf);
6808}
6809
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306810/**
Krunal Soni2e48d012016-05-02 16:55:26 -07006811 * wma_populate_soc_caps() - populate entire SOC's capabilities
6812 * @wma_handle: pointer to wma global structure
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306813 * @tgt_hdl: target psoc information
Krunal Soni2e48d012016-05-02 16:55:26 -07006814 * @param_buf: pointer to param of service ready extension event from fw
6815 *
6816 * This API populates all capabilities of entire SOC. For example,
6817 * how many number of hw modes are supported by this SOC, what are the
6818 * capabilities of each phy per hw mode, what are HAL reg capabilities per
6819 * phy.
6820 *
6821 * Return: none
6822 */
6823static void wma_populate_soc_caps(t_wma_handle *wma_handle,
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306824 struct target_psoc_info *tgt_hdl,
Krunal Soni2e48d012016-05-02 16:55:26 -07006825 WMI_SERVICE_READY_EXT_EVENTID_param_tlvs *param_buf)
6826{
Krunal Soni2e48d012016-05-02 16:55:26 -07006827
6828 WMA_LOGD("%s: Enter", __func__);
6829
Naveen Rawat4efe41b2017-04-29 16:23:14 -07006830 wma_init_wifi_pos_dma_rings(wma_handle,
6831 param_buf->num_oem_dma_ring_caps,
6832 param_buf->oem_dma_ring_caps);
6833
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306834 wma_print_populate_soc_caps(tgt_hdl);
Krunal Soni2e48d012016-05-02 16:55:26 -07006835}
6836
6837/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006838 * wma_rx_service_ready_ext_event() - evt handler for sevice ready ext event.
6839 * @handle: wma handle
6840 * @event: params of the service ready extended event
Govind Singhd76a5b02016-03-08 15:12:14 +05306841 * @length: param length
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006842 *
6843 * Return: none
6844 */
Govind Singhd76a5b02016-03-08 15:12:14 +05306845int wma_rx_service_ready_ext_event(void *handle, uint8_t *event,
6846 uint32_t length)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006847{
6848 tp_wma_handle wma_handle = (tp_wma_handle) handle;
6849 WMI_SERVICE_READY_EXT_EVENTID_param_tlvs *param_buf;
6850 wmi_service_ready_ext_event_fixed_param *ev;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306851 QDF_STATUS ret;
Arunk Khandavallia6305a32018-01-25 11:19:18 +05306852 struct target_psoc_info *tgt_hdl;
Arunk Khandavalli2462f462018-01-25 14:41:02 +05306853 uint32_t conc_scan_config_bits, fw_config_bits;
jitiphilebf3a922018-11-05 14:25:00 +05306854 struct wmi_unified *wmi_handle;
6855 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
6856 target_resource_config *wlan_res_cfg;
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306857
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006858 WMA_LOGD("%s: Enter", __func__);
6859
6860 if (!wma_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006861 WMA_LOGE("%s: Invalid WMA handle", __func__);
Govind Singhd76a5b02016-03-08 15:12:14 +05306862 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006863 }
6864
jitiphilebf3a922018-11-05 14:25:00 +05306865 wmi_handle = get_wmi_unified_hdl_from_psoc(wma_handle->psoc);
6866
Arunk Khandavallia6305a32018-01-25 11:19:18 +05306867 tgt_hdl = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
6868 if (!tgt_hdl) {
6869 WMA_LOGE("%s: target psoc info is NULL", __func__);
6870 return -EINVAL;
6871 }
6872
jitiphilebf3a922018-11-05 14:25:00 +05306873 wlan_res_cfg = target_psoc_get_wlan_res_cfg(tgt_hdl);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006874 param_buf = (WMI_SERVICE_READY_EXT_EVENTID_param_tlvs *) event;
6875 if (!param_buf) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006876 WMA_LOGE("%s: Invalid event", __func__);
Govind Singhd76a5b02016-03-08 15:12:14 +05306877 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006878 }
6879
6880 ev = param_buf->fixed_param;
6881 if (!ev) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006882 WMA_LOGE("%s: Invalid buffer", __func__);
Govind Singhd76a5b02016-03-08 15:12:14 +05306883 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006884 }
6885
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08006886 WMA_LOGD("WMA <-- WMI_SERVICE_READY_EXT_EVENTID");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006887
Arunk Khandavalli2462f462018-01-25 14:41:02 +05306888 fw_config_bits = target_if_get_fw_config_bits(tgt_hdl);
6889 conc_scan_config_bits = target_if_get_conc_scan_config_bits(tgt_hdl);
6890
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08006891 WMA_LOGD("%s: Defaults: scan config:%x FW mode config:%x",
Arunk Khandavalli2462f462018-01-25 14:41:02 +05306892 __func__, conc_scan_config_bits, fw_config_bits);
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05306893
Anurag Chouhan210db072016-02-22 18:42:15 +05306894 ret = qdf_mc_timer_stop(&wma_handle->service_ready_ext_timer);
Anurag Chouhandf2b2682016-02-29 14:15:27 +05306895 if (!QDF_IS_STATUS_SUCCESS(ret)) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006896 WMA_LOGE("Failed to stop the service ready ext timer");
Govind Singhd76a5b02016-03-08 15:12:14 +05306897 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006898 }
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306899 wma_populate_soc_caps(wma_handle, tgt_hdl, param_buf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006900
Arunk Khandavalli80a61352018-01-25 12:19:37 +05306901 ret = wma_update_hw_mode_list(wma_handle, tgt_hdl);
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306902 if (QDF_IS_STATUS_ERROR(ret)) {
6903 WMA_LOGE("Failed to update hw mode list");
6904 return -EINVAL;
6905 }
6906
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08006907 WMA_LOGD("WMA --> WMI_INIT_CMDID");
Mukul Sharmab10c8c72017-11-02 17:25:59 +05306908
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306909 wma_init_scan_fw_mode_config(wma_handle->psoc, conc_scan_config_bits,
Arunk Khandavalli2462f462018-01-25 14:41:02 +05306910 fw_config_bits);
Arunk Khandavallia6305a32018-01-25 11:19:18 +05306911
6912 target_psoc_set_num_radios(tgt_hdl, 1);
jitiphilebf3a922018-11-05 14:25:00 +05306913
6914 if (wmi_service_enabled(wmi_handle,
6915 wmi_service_new_htt_msg_format)) {
6916 cdp_cfg_set_new_htt_msg_format(soc, 1);
6917 wlan_res_cfg->new_htt_msg_format = true;
6918 } else {
6919 cdp_cfg_set_new_htt_msg_format(soc, 0);
6920 wlan_res_cfg->new_htt_msg_format = false;
6921 }
6922
Alok Kumar02301292018-11-28 18:10:34 +05306923 if (cfg_get(wma_handle->psoc, CFG_DP_ENABLE_PEER_UMAP_CONF_SUPPORT) &&
6924 wmi_service_enabled(wmi_handle,
6925 wmi_service_peer_unmap_cnf_support)) {
6926 wlan_res_cfg->peer_unmap_conf_support = true;
6927 cdp_cfg_set_peer_unmap_conf_support(soc, true);
6928 } else {
6929 wlan_res_cfg->peer_unmap_conf_support = false;
6930 cdp_cfg_set_peer_unmap_conf_support(soc, false);
6931 }
6932
Jiani Liu6d3b6a12019-05-08 15:15:06 +08006933 if (wma_handle->enable_tx_compl_tsf64 &&
6934 wmi_service_enabled(wmi_handle,
6935 wmi_service_tx_compl_tsf64)) {
6936 wlan_res_cfg->tstamp64_en = true;
6937 cdp_cfg_set_tx_compl_tsf64(soc, true);
6938 } else {
6939 wlan_res_cfg->tstamp64_en = false;
6940 cdp_cfg_set_tx_compl_tsf64(soc, false);
6941 }
6942
Govind Singhd76a5b02016-03-08 15:12:14 +05306943 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006944}
6945
6946/**
6947 * wma_rx_ready_event() - event handler to process
6948 * wmi rx ready event.
6949 * @handle: wma handle
6950 * @cmd_param_info: command params info
Govind Singhd76a5b02016-03-08 15:12:14 +05306951 * @length: param length
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006952 *
6953 * Return: none
6954 */
Govind Singhd76a5b02016-03-08 15:12:14 +05306955int wma_rx_ready_event(void *handle, uint8_t *cmd_param_info,
6956 uint32_t length)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006957{
6958 tp_wma_handle wma_handle = (tp_wma_handle) handle;
6959 WMI_READY_EVENTID_param_tlvs *param_buf = NULL;
6960 wmi_ready_event_fixed_param *ev = NULL;
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05306961 int ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006962
6963 WMA_LOGD("%s: Enter", __func__);
6964
6965 param_buf = (WMI_READY_EVENTID_param_tlvs *) cmd_param_info;
6966 if (!(wma_handle && param_buf)) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006967 WMA_LOGE("%s: Invalid arguments", __func__);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306968 QDF_ASSERT(0);
Govind Singhd76a5b02016-03-08 15:12:14 +05306969 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006970 }
6971
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08006972 WMA_LOGD("WMA <-- WMI_READY_EVENTID");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006973
6974 ev = param_buf->fixed_param;
6975 /* Indicate to the waiting thread that the ready
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07006976 * event was received
6977 */
Naveen Rawat64e477e2016-05-20 10:34:56 -07006978 wma_handle->sub_20_support =
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05306979 wmi_service_enabled(wma_handle->wmi_handle,
6980 wmi_service_half_rate_quarter_rate_support);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006981 wma_handle->wmi_ready = true;
6982 wma_handle->wlan_init_status = ev->status;
6983
Arif Hussainbaf28b82018-06-27 15:27:44 -07006984 if (wma_handle->is_dfs_offloaded)
6985 wmi_unified_dfs_phyerr_offload_en_cmd(
6986 wma_handle->wmi_handle, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006987 /* copy the mac addr */
6988 WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->mac_addr, wma_handle->myaddr);
6989 WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->mac_addr, wma_handle->hwaddr);
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05306990 ret = wma_update_hdd_cfg(wma_handle);
6991 if (ret)
6992 return ret;
6993
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006994 WMA_LOGD("Exit");
Govind Singhd76a5b02016-03-08 15:12:14 +05306995
6996 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006997}
6998
6999/**
7000 * wma_setneedshutdown() - setting wma needshutdown flag
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007001 *
7002 * Return: none
7003 */
Jeff Johnson1f8d0a02017-09-13 08:09:05 -07007004void wma_setneedshutdown(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007005{
7006 tp_wma_handle wma_handle;
7007
7008 WMA_LOGD("%s: Enter", __func__);
7009
Anurag Chouhan6d760662016-02-20 16:05:43 +05307010 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007011
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07007012 if (!wma_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07007013 WMA_LOGE("%s: Invalid arguments", __func__);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307014 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007015 return;
7016 }
7017
7018 wma_handle->needShutdown = true;
7019 WMA_LOGD("%s: Exit", __func__);
7020}
7021
7022/**
7023 * wma_needshutdown() - Is wma needs shutdown?
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007024 *
7025 * Return: returns true/false
7026 */
Jeff Johnson1b5404e2017-09-13 08:04:46 -07007027bool wma_needshutdown(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007028{
7029 tp_wma_handle wma_handle;
7030
7031 WMA_LOGD("%s: Enter", __func__);
7032
Anurag Chouhan6d760662016-02-20 16:05:43 +05307033 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007034
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07007035 if (!wma_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07007036 WMA_LOGE("%s: Invalid arguments", __func__);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307037 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007038 return false;
7039 }
7040
7041 WMA_LOGD("%s: Exit", __func__);
7042 return wma_handle->needShutdown;
7043}
7044
7045/**
7046 * wma_wait_for_ready_event() - wait for wma ready event
7047 * @handle: wma handle
7048 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05307049 * Return: 0 for success or QDF error
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007050 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307051QDF_STATUS wma_wait_for_ready_event(WMA_HANDLE handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007052{
Dustin Brown19048bd2018-07-09 10:53:18 -07007053 tp_wma_handle wma_handle = (tp_wma_handle)handle;
7054 QDF_STATUS status;
Arunk Khandavallia6305a32018-01-25 11:19:18 +05307055 struct target_psoc_info *tgt_hdl;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007056
Arunk Khandavallia6305a32018-01-25 11:19:18 +05307057 tgt_hdl = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
7058 if (!tgt_hdl) {
Dustin Brown19048bd2018-07-09 10:53:18 -07007059 wma_err("target psoc info is NULL");
Arunk Khandavallia6305a32018-01-25 11:19:18 +05307060 return QDF_STATUS_E_INVAL;
7061 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007062
Dustin Brown19048bd2018-07-09 10:53:18 -07007063 status = qdf_wait_for_event_completion(&tgt_hdl->info.event,
7064 WMA_READY_EVENTID_TIMEOUT);
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05307065 if (!tgt_hdl->info.wmi_ready) {
7066 wma_err("Error in pdev creation");
7067 return QDF_STATUS_E_INVAL;
7068 }
7069
Dustin Brown19048bd2018-07-09 10:53:18 -07007070 if (status == QDF_STATUS_E_TIMEOUT)
7071 wma_err("Timeout waiting for FW ready event");
7072 else if (QDF_IS_STATUS_ERROR(status))
7073 wma_err("Failed to wait for FW ready event; status:%u", status);
7074 else
7075 wma_info("FW ready event received");
Arunk Khandavallia6305a32018-01-25 11:19:18 +05307076
Dustin Brown19048bd2018-07-09 10:53:18 -07007077 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007078}
7079
7080/**
7081 * wma_set_ppsconfig() - set pps config in fw
7082 * @vdev_id: vdev id
7083 * @pps_param: pps params
7084 * @val : param value
7085 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05307086 * Return: 0 for success or QDF error
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007087 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307088QDF_STATUS wma_set_ppsconfig(uint8_t vdev_id, uint16_t pps_param,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007089 int val)
7090{
Anurag Chouhan6d760662016-02-20 16:05:43 +05307091 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007092 int ret = -EIO;
7093 uint32_t pps_val;
7094
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07007095 if (!wma) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007096 WMA_LOGE("%s: Failed to get wma", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307097 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007098 }
7099
7100 switch (pps_param) {
7101 case WMA_VHT_PPS_PAID_MATCH:
7102 pps_val = ((val << 31) & 0xffff0000) |
7103 (PKT_PWR_SAVE_PAID_MATCH & 0xffff);
7104 goto pkt_pwr_save_config;
7105 case WMA_VHT_PPS_GID_MATCH:
7106 pps_val = ((val << 31) & 0xffff0000) |
7107 (PKT_PWR_SAVE_GID_MATCH & 0xffff);
7108 goto pkt_pwr_save_config;
7109 case WMA_VHT_PPS_DELIM_CRC_FAIL:
7110 pps_val = ((val << 31) & 0xffff0000) |
7111 (PKT_PWR_SAVE_DELIM_CRC_FAIL & 0xffff);
7112 goto pkt_pwr_save_config;
7113
7114 /* Enable the code below as and when the functionality
7115 * is supported/added in host.
7116 */
7117#ifdef NOT_YET
7118 case WMA_VHT_PPS_EARLY_TIM_CLEAR:
7119 pps_val = ((val << 31) & 0xffff0000) |
7120 (PKT_PWR_SAVE_EARLY_TIM_CLEAR & 0xffff);
7121 goto pkt_pwr_save_config;
7122 case WMA_VHT_PPS_EARLY_DTIM_CLEAR:
7123 pps_val = ((val << 31) & 0xffff0000) |
7124 (PKT_PWR_SAVE_EARLY_DTIM_CLEAR & 0xffff);
7125 goto pkt_pwr_save_config;
7126 case WMA_VHT_PPS_EOF_PAD_DELIM:
7127 pps_val = ((val << 31) & 0xffff0000) |
7128 (PKT_PWR_SAVE_EOF_PAD_DELIM & 0xffff);
7129 goto pkt_pwr_save_config;
7130 case WMA_VHT_PPS_MACADDR_MISMATCH:
7131 pps_val = ((val << 31) & 0xffff0000) |
7132 (PKT_PWR_SAVE_MACADDR_MISMATCH & 0xffff);
7133 goto pkt_pwr_save_config;
7134 case WMA_VHT_PPS_GID_NSTS_ZERO:
7135 pps_val = ((val << 31) & 0xffff0000) |
7136 (PKT_PWR_SAVE_GID_NSTS_ZERO & 0xffff);
7137 goto pkt_pwr_save_config;
7138 case WMA_VHT_PPS_RSSI_CHECK:
7139 pps_val = ((val << 31) & 0xffff0000) |
7140 (PKT_PWR_SAVE_RSSI_CHECK & 0xffff);
7141 goto pkt_pwr_save_config;
7142#endif /* NOT_YET */
7143pkt_pwr_save_config:
7144 WMA_LOGD("vdev_id:%d val:0x%x pps_val:0x%x", vdev_id,
7145 val, pps_val);
Govind Singhd76a5b02016-03-08 15:12:14 +05307146 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07007147 WMI_VDEV_PARAM_PACKET_POWERSAVE,
7148 pps_val);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007149 break;
7150 default:
7151 WMA_LOGE("%s:INVALID PPS CONFIG", __func__);
7152 }
7153
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307154 return (ret) ? QDF_STATUS_E_FAILURE : QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007155}
7156
7157/**
7158 * wma_process_set_mas() - Function to enable/disable MAS
7159 * @wma: Pointer to WMA handle
7160 * @mas_val: 1-Enable MAS, 0-Disable MAS
7161 *
7162 * This function enables/disables the MAS value
7163 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05307164 * Return: QDF_SUCCESS for success otherwise failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007165 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07007166static QDF_STATUS wma_process_set_mas(tp_wma_handle wma,
7167 uint32_t *mas_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007168{
7169 uint32_t val;
7170
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07007171 if (!wma || !mas_val) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007172 WMA_LOGE("%s: Invalid input to enable/disable MAS", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307173 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007174 }
7175
7176 val = (*mas_val);
7177
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307178 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007179 wma_set_enable_disable_mcc_adaptive_scheduler(val)) {
7180 WMA_LOGE("%s: Unable to enable/disable MAS", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307181 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007182 }
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07007183 WMA_LOGE("%s: Value is %d", __func__, val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307184 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007185}
7186
7187/**
7188 * wma_process_set_miracast() - Function to set miracast value in WMA
7189 * @wma: Pointer to WMA handle
7190 * @miracast_val: 0-Disabled,1-Source,2-Sink
7191 *
7192 * This function stores the miracast value in WMA
7193 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05307194 * Return: QDF_SUCCESS for success otherwise failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007195 *
7196 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07007197static QDF_STATUS wma_process_set_miracast(tp_wma_handle wma,
7198 uint32_t *miracast_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007199{
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07007200 if (!wma || !miracast_val) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007201 WMA_LOGE("%s: Invalid input to store miracast value", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307202 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007203 }
7204
7205 wma->miracast_value = *miracast_val;
7206 WMA_LOGE("%s: Miracast value is %d", __func__, wma->miracast_value);
7207
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307208 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007209}
7210
7211/**
7212 * wma_config_stats_factor() - Function to configure stats avg. factor
7213 * @wma: pointer to WMA handle
7214 * @avg_factor: stats. avg. factor passed down by userspace
7215 *
7216 * This function configures the avg. stats value in firmware
7217 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307218 * Return: QDF_STATUS_SUCCESS for success otherwise failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007219 *
7220 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307221static QDF_STATUS wma_config_stats_factor(tp_wma_handle wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007222 struct sir_stats_avg_factor *avg_factor)
7223{
Govind Singhd76a5b02016-03-08 15:12:14 +05307224 QDF_STATUS ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007225
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07007226 if (!wma || !avg_factor) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007227 WMA_LOGE("%s: Invalid input of stats avg factor", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307228 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007229 }
7230
Govind Singhd76a5b02016-03-08 15:12:14 +05307231 ret = wma_vdev_set_param(wma->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007232 avg_factor->vdev_id,
7233 WMI_VDEV_PARAM_STATS_AVG_FACTOR,
7234 avg_factor->stats_avg_factor);
Govind Singhd76a5b02016-03-08 15:12:14 +05307235 if (QDF_IS_STATUS_ERROR(ret)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007236 WMA_LOGE(" failed to set avg_factor for vdev_id %d",
7237 avg_factor->vdev_id);
7238 }
7239
7240 WMA_LOGD("%s: Set stats_avg_factor %d for vdev_id %d", __func__,
7241 avg_factor->stats_avg_factor, avg_factor->vdev_id);
7242
7243 return ret;
7244}
7245
7246/**
7247 * wma_config_guard_time() - Function to set guard time in firmware
7248 * @wma: pointer to WMA handle
7249 * @guard_time: guard time passed down by userspace
7250 *
7251 * This function configures the guard time in firmware
7252 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307253 * Return: QDF_STATUS_SUCCESS for success otherwise failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007254 *
7255 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307256static QDF_STATUS wma_config_guard_time(tp_wma_handle wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007257 struct sir_guard_time_request *guard_time)
7258{
Govind Singhd76a5b02016-03-08 15:12:14 +05307259 QDF_STATUS ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007260
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07007261 if (!wma || !guard_time) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007262 WMA_LOGE("%s: Invalid input of guard time", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307263 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007264 }
7265
Govind Singhd76a5b02016-03-08 15:12:14 +05307266 ret = wma_vdev_set_param(wma->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007267 guard_time->vdev_id,
7268 WMI_VDEV_PARAM_RX_LEAK_WINDOW,
7269 guard_time->guard_time);
Govind Singhd76a5b02016-03-08 15:12:14 +05307270 if (QDF_IS_STATUS_ERROR(ret)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007271 WMA_LOGE(" failed to set guard time for vdev_id %d",
7272 guard_time->vdev_id);
7273 }
7274
7275 WMA_LOGD("Set guard time %d for vdev_id %d",
7276 guard_time->guard_time, guard_time->vdev_id);
7277
7278 return ret;
7279}
7280
7281/**
7282 * wma_enable_specific_fw_logs() - Start/Stop logging of diag event/log id
7283 * @wma_handle: WMA handle
7284 * @start_log: Start logging related parameters
7285 *
7286 * Send the command to the FW based on which specific logging of diag
7287 * event/log id can be started/stopped
7288 *
7289 * Return: None
7290 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07007291static void wma_enable_specific_fw_logs(tp_wma_handle wma_handle,
7292 struct sir_wifi_start_log *start_log)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007293{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007294
7295 if (!start_log) {
7296 WMA_LOGE("%s: start_log pointer is NULL", __func__);
7297 return;
7298 }
7299 if (!wma_handle) {
7300 WMA_LOGE("%s: Invalid wma handle", __func__);
7301 return;
7302 }
7303
7304 if (!((start_log->ring_id == RING_ID_CONNECTIVITY) ||
7305 (start_log->ring_id == RING_ID_FIRMWARE_DEBUG))) {
7306 WMA_LOGD("%s: Not connectivity or fw debug ring: %d",
7307 __func__, start_log->ring_id);
7308 return;
7309 }
7310
Govind Singhf25a0f12016-03-08 16:09:48 +05307311 wmi_unified_enable_specific_fw_logs_cmd(wma_handle->wmi_handle,
7312 (struct wmi_wifi_start_log *)start_log);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007313}
7314
Poddar, Siddarth176c4362016-10-03 12:25:00 +05307315#define MEGABYTE (1024 * 1024)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007316/**
7317 * wma_set_wifi_start_packet_stats() - Start/stop packet stats
7318 * @wma_handle: WMA handle
7319 * @start_log: Struture containing the start wifi logger params
7320 *
7321 * This function is used to send the WMA commands to start/stop logging
7322 * of per packet statistics
7323 *
7324 * Return: None
7325 *
7326 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07007327#ifdef REMOVE_PKT_LOG
7328static void wma_set_wifi_start_packet_stats(void *wma_handle,
7329 struct sir_wifi_start_log *start_log)
7330{
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07007331}
Venkata Sharath Chandra Manchala1240fc72017-10-26 17:32:29 -07007332
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07007333#else
7334static void wma_set_wifi_start_packet_stats(void *wma_handle,
7335 struct sir_wifi_start_log *start_log)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007336{
Komal Seelam3d202862016-02-24 18:43:24 +05307337 struct hif_opaque_softc *scn;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007338 uint32_t log_state;
7339
7340 if (!start_log) {
7341 WMA_LOGE("%s: start_log pointer is NULL", __func__);
7342 return;
7343 }
7344 if (!wma_handle) {
7345 WMA_LOGE("%s: Invalid wma handle", __func__);
7346 return;
7347 }
7348
7349 /* No need to register for ring IDs other than packet stats */
7350 if (start_log->ring_id != RING_ID_PER_PACKET_STATS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07007351 WMA_LOGD("%s: Ring id is not for per packet stats: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007352 __func__, start_log->ring_id);
7353 return;
7354 }
7355
Anurag Chouhan6d760662016-02-20 16:05:43 +05307356 scn = cds_get_context(QDF_MODULE_ID_HIF);
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07007357 if (!scn) {
Naveen Rawatb2109f62016-07-21 14:18:15 -07007358 WMA_LOGE("%s: Invalid HIF handle", __func__);
7359 return;
7360 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007361
Venkata Sharath Chandra Manchala1240fc72017-10-26 17:32:29 -07007362#ifdef HELIUMPLUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007363 log_state = ATH_PKTLOG_ANI | ATH_PKTLOG_RCUPDATE | ATH_PKTLOG_RCFIND |
Nirav Shahdcc4c872016-07-28 11:35:26 +05307364 ATH_PKTLOG_RX | ATH_PKTLOG_TX |
Venkata Sharath Chandra Manchala29965172018-01-18 14:17:29 -08007365 ATH_PKTLOG_TEXT | ATH_PKTLOG_SW_EVENT;
Venkata Sharath Chandra Manchalacd660982018-10-28 21:04:28 -07007366#elif defined(QCA_WIFI_QCA6390)
7367 log_state = ATH_PKTLOG_RCFIND | ATH_PKTLOG_RCUPDATE |
Venkata Sharath Chandra Manchala27e44902019-01-28 11:29:18 -08007368 ATH_PKTLOG_TX | ATH_PKTLOG_LITE_T2H |
7369 ATH_PKTLOG_SW_EVENT | ATH_PKTLOG_RX;
Venkata Sharath Chandra Manchalacd660982018-10-28 21:04:28 -07007370#elif defined(QCA_WIFI_QCA6290)
7371 log_state = ATH_PKTLOG_LITE_RX | ATH_PKTLOG_LITE_T2H;
Venkata Sharath Chandra Manchala1240fc72017-10-26 17:32:29 -07007372#else
Venkata Sharath Chandra Manchalacd660982018-10-28 21:04:28 -07007373 WMA_LOGD("%s: Packet log Not supported", __func__);
7374 log_state = 0;
Venkata Sharath Chandra Manchala1240fc72017-10-26 17:32:29 -07007375#endif
Poddar, Siddarth176c4362016-10-03 12:25:00 +05307376 if (start_log->size != 0) {
7377 pktlog_setsize(scn, start_log->size * MEGABYTE);
7378 return;
Poddar, Siddarthab99a272017-04-10 12:53:26 +05307379 } else if (start_log->is_pktlog_buff_clear == true) {
7380 pktlog_clearbuff(scn, start_log->is_pktlog_buff_clear);
7381 return;
Poddar, Siddarth176c4362016-10-03 12:25:00 +05307382 }
7383
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007384 if (start_log->verbose_level == WLAN_LOG_LEVEL_ACTIVE) {
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -08007385 pktlog_enable(scn, log_state, start_log->ini_triggered,
Poddar, Siddartheefe3482016-09-21 18:12:59 +05307386 start_log->user_triggered,
7387 start_log->is_iwpriv_command);
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08007388 WMA_LOGD("%s: Enabling per packet stats", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007389 } else {
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -08007390 pktlog_enable(scn, 0, start_log->ini_triggered,
Poddar, Siddartheefe3482016-09-21 18:12:59 +05307391 start_log->user_triggered,
7392 start_log->is_iwpriv_command);
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08007393 WMA_LOGD("%s: Disabling per packet stats", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007394 }
7395}
7396#endif
7397
7398/**
7399 * wma_send_flush_logs_to_fw() - Send log flush command to FW
7400 * @wma_handle: WMI handle
7401 *
7402 * This function is used to send the flush command to the FW,
7403 * that will flush the fw logs that are residue in the FW
7404 *
7405 * Return: None
7406 */
7407void wma_send_flush_logs_to_fw(tp_wma_handle wma_handle)
7408{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307409 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007410
Dustin Brownfd578602019-02-22 13:52:24 -08007411 status = wmi_unified_flush_logs_to_fw_cmd(wma_handle->wmi_handle);
7412 if (QDF_IS_STATUS_ERROR(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007413 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007414
Anurag Chouhan210db072016-02-22 18:42:15 +05307415 status = qdf_mc_timer_start(&wma_handle->log_completion_timer,
Dustin Brownfd578602019-02-22 13:52:24 -08007416 WMA_LOG_COMPLETION_TIMER);
7417 if (QDF_IS_STATUS_ERROR(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007418 WMA_LOGE("Failed to start the log completion timer");
7419}
7420
7421/**
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05307422 * wma_update_wep_default_key - To update default key id
7423 * @wma: pointer to wma handler
7424 * @update_def_key: pointer to wep_update_default_key_idx
7425 *
7426 * This function makes a copy of default key index to txrx node
7427 *
7428 * Return: Success
7429 */
7430static QDF_STATUS wma_update_wep_default_key(tp_wma_handle wma,
7431 struct wep_update_default_key_idx *update_def_key)
7432{
7433 struct wma_txrx_node *iface =
7434 &wma->interfaces[update_def_key->session_id];
7435 iface->wep_default_key_idx = update_def_key->default_idx;
7436
7437 return QDF_STATUS_SUCCESS;
7438}
7439
Agrawal, Ashish35b251d2016-09-08 19:21:03 +05307440/**
7441 * wma_update_tx_fail_cnt_th() - Set threshold for TX pkt fail
7442 * @wma_handle: WMA handle
7443 * @tx_fail_cnt_th: sme_tx_fail_cnt_threshold parameter
7444 *
7445 * This function is used to set Tx pkt fail count threshold,
7446 * FW will do disconnect with station once this threshold is reached.
7447 *
Dustin Brown6ca9b022019-02-21 16:47:11 -08007448 * Return: QDF_STATUS
Agrawal, Ashish35b251d2016-09-08 19:21:03 +05307449 */
7450static QDF_STATUS wma_update_tx_fail_cnt_th(tp_wma_handle wma,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07007451 struct sme_tx_fail_cnt_threshold *tx_fail_cnt_th)
Agrawal, Ashish35b251d2016-09-08 19:21:03 +05307452{
7453 u_int8_t vdev_id;
7454 u_int32_t tx_fail_disconn_th;
7455 int ret = -EIO;
7456
7457 if (!wma || !wma->wmi_handle) {
7458 WMA_LOGE(FL("WMA is closed, can not issue Tx pkt fail count threshold"));
7459 return QDF_STATUS_E_INVAL;
7460 }
7461 vdev_id = tx_fail_cnt_th->session_id;
7462 tx_fail_disconn_th = tx_fail_cnt_th->tx_fail_cnt_threshold;
7463 WMA_LOGD("Set TX pkt fail count threshold vdevId %d count %d",
7464 vdev_id, tx_fail_disconn_th);
7465
7466
7467 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
7468 WMI_VDEV_PARAM_DISCONNECT_TH,
7469 tx_fail_disconn_th);
7470
7471 if (ret) {
7472 WMA_LOGE(FL("Failed to send TX pkt fail count threshold command"));
7473 return QDF_STATUS_E_FAILURE;
7474 }
7475
7476 return QDF_STATUS_SUCCESS;
7477}
7478
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05307479/**
Agrawal Ashishda3e9502016-09-21 17:43:51 +05307480 * wma_update_short_retry_limit() - Set retry limit for short frames
7481 * @wma_handle: WMA handle
7482 * @short_retry_limit_th: retry limir count for Short frames.
7483 *
7484 * This function is used to configure the transmission retry limit at which
7485 * short frames needs to be retry.
7486 *
Dustin Brown6ca9b022019-02-21 16:47:11 -08007487 * Return: QDF_STATUS
Agrawal Ashishda3e9502016-09-21 17:43:51 +05307488 */
7489static QDF_STATUS wma_update_short_retry_limit(tp_wma_handle wma,
7490 struct sme_short_retry_limit *short_retry_limit_th)
7491{
7492 uint8_t vdev_id;
7493 uint32_t short_retry_limit;
7494 int ret;
7495
7496 if (!wma || !wma->wmi_handle) {
7497 WMA_LOGE("WMA is closed, can not issue short retry limit threshold");
7498 return QDF_STATUS_E_INVAL;
7499 }
7500 vdev_id = short_retry_limit_th->session_id;
7501 short_retry_limit = short_retry_limit_th->short_retry_limit;
7502 WMA_LOGD("Set short retry limit threshold vdevId %d count %d",
7503 vdev_id, short_retry_limit);
7504
7505 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
7506 WMI_VDEV_PARAM_NON_AGG_SW_RETRY_TH,
7507 short_retry_limit);
7508
7509 if (ret) {
7510 WMA_LOGE("Failed to send short limit threshold command");
7511 return QDF_STATUS_E_FAILURE;
7512 }
7513 return QDF_STATUS_SUCCESS;
7514}
7515
7516/**
7517 * wma_update_long_retry_limit() - Set retry limit for long frames
7518 * @wma_handle: WMA handle
7519 * @long_retry_limit_th: retry limir count for long frames
7520 *
7521 * This function is used to configure the transmission retry limit at which
7522 * long frames needs to be retry
7523 *
Dustin Brown6ca9b022019-02-21 16:47:11 -08007524 * Return: QDF_STATUS
Agrawal Ashishda3e9502016-09-21 17:43:51 +05307525 */
7526static QDF_STATUS wma_update_long_retry_limit(tp_wma_handle wma,
7527 struct sme_long_retry_limit *long_retry_limit_th)
7528{
7529 uint8_t vdev_id;
7530 uint32_t long_retry_limit;
7531 int ret;
7532
7533 if (!wma || !wma->wmi_handle) {
7534 WMA_LOGE("WMA is closed, can not issue long retry limit threshold");
7535 return QDF_STATUS_E_INVAL;
7536 }
7537 vdev_id = long_retry_limit_th->session_id;
7538 long_retry_limit = long_retry_limit_th->long_retry_limit;
7539 WMA_LOGD("Set TX pkt fail count threshold vdevId %d count %d",
7540 vdev_id, long_retry_limit);
7541
7542 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
7543 WMI_VDEV_PARAM_AGG_SW_RETRY_TH,
7544 long_retry_limit);
7545
7546 if (ret) {
7547 WMA_LOGE("Failed to send long limit threshold command");
7548 return QDF_STATUS_E_FAILURE;
7549 }
7550
7551 return QDF_STATUS_SUCCESS;
7552}
7553
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05307554/*
7555 * wma_update_sta_inactivity_timeout() - Set sta_inactivity_timeout to fw
7556 * @wma_handle: WMA handle
7557 * @sta_inactivity_timer: sme_sta_inactivity_timeout
7558 *
7559 * This function is used to set sta_inactivity_timeout.
7560 * If a station does not send anything in sta_inactivity_timeout seconds, an
7561 * empty data frame is sent to it in order to verify whether it is
7562 * still in range. If this frame is not ACKed, the station will be
7563 * disassociated and then deauthenticated.
7564 *
7565 * Return: None
7566 */
7567void wma_update_sta_inactivity_timeout(tp_wma_handle wma,
7568 struct sme_sta_inactivity_timeout *sta_inactivity_timer)
7569{
7570 uint8_t vdev_id;
7571 uint32_t max_unresponsive_time;
7572 uint32_t min_inactive_time, max_inactive_time;
7573
7574 if (!wma || !wma->wmi_handle) {
7575 WMA_LOGE("WMA is closed, can not issue sta_inactivity_timeout");
7576 return;
7577 }
7578 vdev_id = sta_inactivity_timer->session_id;
7579 max_unresponsive_time = sta_inactivity_timer->sta_inactivity_timeout;
7580 max_inactive_time = max_unresponsive_time * TWO_THIRD;
7581 min_inactive_time = max_unresponsive_time - max_inactive_time;
7582
7583 if (wma_vdev_set_param(wma->wmi_handle, vdev_id,
7584 WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS,
7585 min_inactive_time))
7586 WMA_LOGE("Failed to Set AP MIN IDLE INACTIVE TIME");
7587
7588 if (wma_vdev_set_param(wma->wmi_handle, vdev_id,
7589 WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS,
7590 max_inactive_time))
7591 WMA_LOGE("Failed to Set AP MAX IDLE INACTIVE TIME");
7592
7593 if (wma_vdev_set_param(wma->wmi_handle, vdev_id,
7594 WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS,
7595 max_unresponsive_time))
7596 WMA_LOGE("Failed to Set MAX UNRESPONSIVE TIME");
7597
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07007598 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 +05307599 __func__, vdev_id,
7600 min_inactive_time, max_inactive_time,
7601 max_unresponsive_time);
7602}
7603
Yingying Tang95409972016-10-20 15:16:15 +08007604#ifdef WLAN_FEATURE_WOW_PULSE
7605
7606
7607#define WMI_WOW_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM \
7608WMI_WOW_HOSTWAKEUP_GPIO_PIN_PATTERN_CONFIG_CMD_fixed_param
7609
7610
7611#define WMITLV_TAG_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM \
7612WMITLV_TAG_STRUC_wmi_wow_hostwakeup_gpio_pin_pattern_config_cmd_fixed_param
7613
7614/**
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07007615 * wma_send_wow_pulse_cmd() - send wmi cmd of wow pulse cmd
7616 * information to fw.
7617 * @wma_handle: wma handler
7618 * @udp_response: wow_pulse_mode pointer
7619 *
7620 * Return: Return QDF_STATUS
7621 */
Yingying Tang95409972016-10-20 15:16:15 +08007622static QDF_STATUS wma_send_wow_pulse_cmd(tp_wma_handle wma_handle,
7623 struct wow_pulse_mode *wow_pulse_cmd)
7624{
7625 QDF_STATUS status = QDF_STATUS_SUCCESS;
7626 wmi_buf_t buf;
7627 WMI_WOW_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM *cmd;
7628 u_int16_t len;
7629
7630 len = sizeof(*cmd);
7631 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07007632 if (!buf)
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07007633 return QDF_STATUS_E_NOMEM;
Yingying Tang95409972016-10-20 15:16:15 +08007634
7635 cmd = (WMI_WOW_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM *)wmi_buf_data(buf);
7636 qdf_mem_zero(cmd, len);
7637
7638 WMITLV_SET_HDR(&cmd->tlv_header,
7639 WMITLV_TAG_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM,
7640 WMITLV_GET_STRUCT_TLVLEN(
7641 WMI_WOW_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM));
7642
7643 cmd->enable = wow_pulse_cmd->wow_pulse_enable;
7644 cmd->pin = wow_pulse_cmd->wow_pulse_pin;
7645 cmd->interval_low = wow_pulse_cmd->wow_pulse_interval_low;
7646 cmd->interval_high = wow_pulse_cmd->wow_pulse_interval_high;
7647 cmd->repeat_cnt = WMI_WOW_PULSE_REPEAT_CNT;
7648
7649 if (wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
7650 WMI_WOW_HOSTWAKEUP_GPIO_PIN_PATTERN_CONFIG_CMDID)) {
Yingying Tang95409972016-10-20 15:16:15 +08007651 wmi_buf_free(buf);
7652 status = QDF_STATUS_E_FAILURE;
7653 }
7654
7655 WMA_LOGD("%s: Exit", __func__);
7656 return status;
7657}
7658
7659#undef WMI_WOW_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM
7660#undef WMITLV_TAG_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM
7661#undef WMI_WOW_PULSE_REPEAT_CNT
7662
7663#else
7664static inline QDF_STATUS wma_send_wow_pulse_cmd(tp_wma_handle wma_handle,
7665 struct wow_pulse_mode *wow_pulse_cmd)
7666{
7667 return QDF_STATUS_E_FAILURE;
7668}
7669#endif
7670
7671
Agrawal Ashishda3e9502016-09-21 17:43:51 +05307672/**
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05307673 * wma_process_power_debug_stats_req() - Process the Chip Power stats collect
7674 * request and pass the Power stats request to Fw
7675 * @wma_handle: WMA handle
7676 *
7677 * Return: QDF_STATUS
7678 */
7679#ifdef WLAN_POWER_DEBUGFS
7680static QDF_STATUS wma_process_power_debug_stats_req(tp_wma_handle wma_handle)
7681{
7682 wmi_pdev_get_chip_power_stats_cmd_fixed_param *cmd;
7683 int32_t len;
7684 wmi_buf_t buf;
7685 uint8_t *buf_ptr;
7686 int ret;
7687
7688 if (!wma_handle) {
7689 WMA_LOGE("%s: input pointer is NULL", __func__);
7690 return QDF_STATUS_E_FAILURE;
7691 }
7692
7693 len = sizeof(*cmd);
7694 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07007695 if (!buf)
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05307696 return QDF_STATUS_E_NOMEM;
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05307697
7698 buf_ptr = (u_int8_t *) wmi_buf_data(buf);
7699 cmd = (wmi_pdev_get_chip_power_stats_cmd_fixed_param *) buf_ptr;
7700
7701 WMITLV_SET_HDR(&cmd->tlv_header,
7702 WMITLV_TAG_STRUC_wmi_get_chip_power_stats_cmd_fixed_param,
7703 WMITLV_GET_STRUCT_TLVLEN(
7704 wmi_pdev_get_chip_power_stats_cmd_fixed_param));
7705 cmd->pdev_id = 0;
7706
7707 WMA_LOGD("POWER_DEBUG_STATS - Get Request Params; Pdev id - %d",
7708 cmd->pdev_id);
7709 ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
7710 WMI_PDEV_GET_CHIP_POWER_STATS_CMDID);
7711 if (ret) {
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05307712 wmi_buf_free(buf);
7713 return QDF_STATUS_E_FAILURE;
7714 }
7715 return QDF_STATUS_SUCCESS;
7716}
7717#else
7718static QDF_STATUS wma_process_power_debug_stats_req(tp_wma_handle wma_handle)
7719{
7720 return QDF_STATUS_SUCCESS;
7721}
7722#endif
Arunk Khandavallica56d4b2018-11-29 15:46:00 +05307723#ifdef WLAN_FEATURE_BEACON_RECEPTION_STATS
7724static QDF_STATUS wma_process_beacon_debug_stats_req(tp_wma_handle wma_handle,
7725 uint32_t *vdev_id)
7726{
7727 wmi_vdev_get_bcn_recv_stats_cmd_fixed_param *cmd;
7728 int32_t len;
7729 wmi_buf_t buf;
7730 uint8_t *buf_ptr;
7731 int ret;
7732
7733 WMA_LOGD("%s: Enter", __func__);
7734 if (!wma_handle) {
7735 WMA_LOGE("%s: input pointer is NULL", __func__);
7736 return QDF_STATUS_E_FAILURE;
7737 }
7738
7739 len = sizeof(*cmd);
7740 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
7741 if (!buf)
7742 return QDF_STATUS_E_NOMEM;
7743
7744 buf_ptr = (u_int8_t *)wmi_buf_data(buf);
7745 cmd = (wmi_vdev_get_bcn_recv_stats_cmd_fixed_param *)buf_ptr;
7746
7747 WMITLV_SET_HDR(&cmd->tlv_header,
7748 WMITLV_TAG_STRUC_wmi_get_bcn_recv_stats_fixed_param,
7749 WMITLV_GET_STRUCT_TLVLEN(
7750 wmi_vdev_get_bcn_recv_stats_cmd_fixed_param));
7751 cmd->vdev_id = *vdev_id;
7752
7753 WMA_LOGD("BEACON_DEBUG_STATS - Get Request Params; vdev id - %d",
7754 cmd->vdev_id);
7755 ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
7756 WMI_VDEV_GET_BCN_RECEPTION_STATS_CMDID);
7757 if (ret) {
7758 wmi_buf_free(buf);
7759 return QDF_STATUS_E_FAILURE;
7760 }
7761
7762 WMA_LOGD("%s: Exit", __func__);
7763 return QDF_STATUS_SUCCESS;
7764}
7765#else
7766static QDF_STATUS wma_process_beacon_debug_stats_req(tp_wma_handle wma_handle,
7767 uint32_t *vdev_id)
7768{
7769 return QDF_STATUS_SUCCESS;
7770}
7771#endif
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05307772
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05307773/**
7774 * wma_set_arp_req_stats() - process set arp stats request command to fw
7775 * @wma_handle: WMA handle
7776 * @req_buf: set srp stats request buffer
7777 *
7778 * Return: None
7779 */
7780static void wma_set_arp_req_stats(WMA_HANDLE handle,
7781 struct set_arp_stats_params *req_buf)
7782{
Dustin Brownfd578602019-02-22 13:52:24 -08007783 QDF_STATUS status;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05307784 struct set_arp_stats *arp_stats;
7785 tp_wma_handle wma_handle = (tp_wma_handle) handle;
7786
7787 if (!wma_handle || !wma_handle->wmi_handle) {
7788 WMA_LOGE("%s: WMA is closed, cannot send per roam config",
7789 __func__);
7790 return;
7791 }
Yeshwanth Sriram Guntukad5aae7f2017-11-27 14:33:51 +05307792 if (!wma_is_vdev_valid(req_buf->vdev_id)) {
Pragaspathi Thilagarajd5cb9e82019-02-04 14:13:52 +05307793 WMA_LOGE("vdev id:%d is not active", req_buf->vdev_id);
Yeshwanth Sriram Guntukad5aae7f2017-11-27 14:33:51 +05307794 return;
7795 }
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05307796
7797 arp_stats = (struct set_arp_stats *)req_buf;
7798 status = wmi_unified_set_arp_stats_req(wma_handle->wmi_handle,
7799 arp_stats);
Dustin Brownfd578602019-02-22 13:52:24 -08007800 if (QDF_IS_STATUS_ERROR(status))
7801 wma_err("failed to set arp stats to FW");
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05307802}
7803
7804/**
7805 * wma_get_arp_req_stats() - process get arp stats request command to fw
7806 * @wma_handle: WMA handle
7807 * @req_buf: get srp stats request buffer
7808 *
7809 * Return: None
7810 */
7811static void wma_get_arp_req_stats(WMA_HANDLE handle,
7812 struct get_arp_stats_params *req_buf)
7813{
Dustin Brownfd578602019-02-22 13:52:24 -08007814 QDF_STATUS status;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05307815 struct get_arp_stats *arp_stats;
7816 tp_wma_handle wma_handle = (tp_wma_handle) handle;
7817
7818 if (!wma_handle || !wma_handle->wmi_handle) {
7819 WMA_LOGE("%s: WMA is closed, cannot send per roam config",
7820 __func__);
7821 return;
7822 }
Yeshwanth Sriram Guntuka3e4d96f2017-12-19 14:09:04 +05307823 if (!wma_is_vdev_valid(req_buf->vdev_id)) {
Pragaspathi Thilagarajd5cb9e82019-02-04 14:13:52 +05307824 WMA_LOGE("vdev id:%d is not active", req_buf->vdev_id);
Yeshwanth Sriram Guntuka3e4d96f2017-12-19 14:09:04 +05307825 return;
7826 }
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05307827
7828 arp_stats = (struct get_arp_stats *)req_buf;
7829 status = wmi_unified_get_arp_stats_req(wma_handle->wmi_handle,
7830 arp_stats);
Dustin Brownfd578602019-02-22 13:52:24 -08007831 if (QDF_IS_STATUS_ERROR(status))
7832 wma_err("failed to send get arp stats to FW");
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05307833}
7834
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05307835/**
7836 * wma_set_del_pmkid_cache() - API to set/delete PMKID cache entry in fw
7837 * @handle: WMA handle
7838 * @pmk_cache: PMK cache entry
7839 *
7840 * Return: None
7841 */
7842static void wma_set_del_pmkid_cache(WMA_HANDLE handle,
7843 struct wmi_unified_pmk_cache *pmk_cache)
7844{
Dustin Brownfd578602019-02-22 13:52:24 -08007845 QDF_STATUS status;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05307846 tp_wma_handle wma_handle = (tp_wma_handle) handle;
7847
7848 if (!wma_handle || !wma_handle->wmi_handle) {
7849 WMA_LOGE("WMA is closed, cannot send set del pmkid");
7850 return;
7851 }
7852
7853 status = wmi_unified_set_del_pmkid_cache(wma_handle->wmi_handle,
7854 pmk_cache);
Dustin Brownfd578602019-02-22 13:52:24 -08007855 if (QDF_IS_STATUS_ERROR(status))
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05307856 WMA_LOGE("failed to send set/del pmkid cmd to fw");
7857}
7858
Vignesh Viswanathan694e28e2018-01-18 20:53:57 +05307859/**
Vignesh Viswanathan694e28e2018-01-18 20:53:57 +05307860 * wma_send_invoke_neighbor_report() - API to send invoke neighbor report
7861 * command to fw
7862 *
7863 * @handle: WMA handle
7864 * @params: Pointer to invoke neighbor report params
7865 *
7866 * Return: None
7867 */
7868static
7869void wma_send_invoke_neighbor_report(WMA_HANDLE handle,
7870 struct wmi_invoke_neighbor_report_params *params)
7871{
7872 QDF_STATUS status;
7873 tp_wma_handle wma_handle = (tp_wma_handle) handle;
7874
7875 if (!wma_handle || !wma_handle->wmi_handle) {
7876 WMA_LOGE("WMA is closed, cannot send invoke neighbor report");
7877 return;
7878 }
7879
7880 status = wmi_unified_invoke_neighbor_report_cmd(wma_handle->wmi_handle,
7881 params);
7882
7883 if (status != QDF_STATUS_SUCCESS)
7884 WMA_LOGE("failed to send invoke neighbor report command");
7885}
7886
lifeng66831662017-05-19 16:01:35 +08007887QDF_STATUS wma_set_rx_reorder_timeout_val(tp_wma_handle wma_handle,
7888 struct sir_set_rx_reorder_timeout_val *reorder_timeout)
7889{
7890 wmi_pdev_set_reorder_timeout_val_cmd_fixed_param *cmd;
7891 uint32_t len;
7892 wmi_buf_t buf;
7893 int ret;
7894
7895 if (!reorder_timeout) {
7896 WMA_LOGE(FL("invalid pointer"));
7897 return QDF_STATUS_E_INVAL;
7898 }
7899
7900 if (!wma_handle) {
7901 WMA_LOGE(FL("WMA context is invald!"));
7902 return QDF_STATUS_E_INVAL;
7903 }
7904 len = sizeof(*cmd);
7905 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07007906 if (!buf)
lifeng66831662017-05-19 16:01:35 +08007907 return QDF_STATUS_E_NOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07007908
lifeng66831662017-05-19 16:01:35 +08007909 cmd = (wmi_pdev_set_reorder_timeout_val_cmd_fixed_param *)
7910 wmi_buf_data(buf);
7911
7912 WMITLV_SET_HDR(&cmd->tlv_header,
7913 WMITLV_TAG_STRUC_wmi_pdev_set_reorder_timeout_val_cmd_fixed_param,
7914 WMITLV_GET_STRUCT_TLVLEN(wmi_pdev_set_reorder_timeout_val_cmd_fixed_param));
7915
7916 memcpy(cmd->rx_timeout_pri, reorder_timeout->rx_timeout_pri,
7917 sizeof(reorder_timeout->rx_timeout_pri));
7918
7919 WMA_LOGD("rx aggr record timeout: VO: %d, VI: %d, BE: %d, BK: %d",
7920 cmd->rx_timeout_pri[0], cmd->rx_timeout_pri[1],
7921 cmd->rx_timeout_pri[2], cmd->rx_timeout_pri[3]);
7922
7923 ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
7924 WMI_PDEV_SET_REORDER_TIMEOUT_VAL_CMDID);
7925 if (ret) {
lifeng66831662017-05-19 16:01:35 +08007926 wmi_buf_free(buf);
7927 return QDF_STATUS_E_FAILURE;
7928 }
7929
7930 return QDF_STATUS_SUCCESS;
7931}
7932
7933QDF_STATUS wma_set_rx_blocksize(tp_wma_handle wma_handle,
7934 struct sir_peer_set_rx_blocksize *peer_rx_blocksize)
7935{
7936 wmi_peer_set_rx_blocksize_cmd_fixed_param *cmd;
7937 int32_t len;
7938 wmi_buf_t buf;
7939 u_int8_t *buf_ptr;
7940 int ret;
7941
7942 if (!peer_rx_blocksize) {
7943 WMA_LOGE(FL("invalid pointer"));
7944 return QDF_STATUS_E_INVAL;
7945 }
7946
7947 if (!wma_handle) {
7948 WMA_LOGE(FL(" WMA context is invald!"));
7949 return QDF_STATUS_E_INVAL;
7950 }
7951
7952 len = sizeof(*cmd);
7953 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07007954 if (!buf)
lifeng66831662017-05-19 16:01:35 +08007955 return QDF_STATUS_E_NOMEM;
lifeng66831662017-05-19 16:01:35 +08007956
7957 buf_ptr = (u_int8_t *) wmi_buf_data(buf);
7958 cmd = (wmi_peer_set_rx_blocksize_cmd_fixed_param *) buf_ptr;
7959
7960 WMITLV_SET_HDR(&cmd->tlv_header,
7961 WMITLV_TAG_STRUC_wmi_peer_set_rx_blocksize_cmd_fixed_param,
7962 WMITLV_GET_STRUCT_TLVLEN(wmi_peer_set_rx_blocksize_cmd_fixed_param));
7963
7964 cmd->vdev_id = peer_rx_blocksize->vdev_id;
7965 cmd->rx_block_ack_win_limit =
7966 peer_rx_blocksize->rx_block_ack_win_limit;
7967 WMI_CHAR_ARRAY_TO_MAC_ADDR(peer_rx_blocksize->peer_macaddr.bytes,
7968 &cmd->peer_macaddr);
7969
7970 WMA_LOGD("rx aggr blocksize: %d", cmd->rx_block_ack_win_limit);
7971
7972 ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
7973 WMI_PEER_SET_RX_BLOCKSIZE_CMDID);
7974 if (ret) {
lifeng66831662017-05-19 16:01:35 +08007975 wmi_buf_free(buf);
7976 return QDF_STATUS_E_FAILURE;
7977 }
7978
7979 return QDF_STATUS_SUCCESS;
7980}
7981
lifengd217d192017-05-09 19:44:16 +08007982QDF_STATUS wma_get_chain_rssi(tp_wma_handle wma_handle,
7983 struct get_chain_rssi_req_params *req_params)
7984{
lifengfe6c3e22018-04-03 12:10:04 +08007985 wmi_pdev_div_get_rssi_antid_fixed_param *cmd;
lifengd217d192017-05-09 19:44:16 +08007986 wmi_buf_t wmi_buf;
lifengfe6c3e22018-04-03 12:10:04 +08007987 uint32_t len = sizeof(wmi_pdev_div_get_rssi_antid_fixed_param);
lifengd217d192017-05-09 19:44:16 +08007988 u_int8_t *buf_ptr;
7989
7990 if (!wma_handle) {
7991 WMA_LOGE(FL("WMA is closed, can not issue cmd"));
7992 return QDF_STATUS_E_INVAL;
7993 }
7994
7995 wmi_buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07007996 if (!wmi_buf)
lifengd217d192017-05-09 19:44:16 +08007997 return QDF_STATUS_E_NOMEM;
lifengd217d192017-05-09 19:44:16 +08007998
7999 buf_ptr = (u_int8_t *)wmi_buf_data(wmi_buf);
8000
lifengfe6c3e22018-04-03 12:10:04 +08008001 cmd = (wmi_pdev_div_get_rssi_antid_fixed_param *)buf_ptr;
lifengd217d192017-05-09 19:44:16 +08008002 WMITLV_SET_HDR(&cmd->tlv_header,
lifengfe6c3e22018-04-03 12:10:04 +08008003 WMITLV_TAG_STRUC_wmi_pdev_div_get_rssi_antid_fixed_param,
lifengd217d192017-05-09 19:44:16 +08008004 WMITLV_GET_STRUCT_TLVLEN(
lifengfe6c3e22018-04-03 12:10:04 +08008005 wmi_pdev_div_get_rssi_antid_fixed_param));
8006 cmd->pdev_id = 0;
lifengd217d192017-05-09 19:44:16 +08008007 WMI_CHAR_ARRAY_TO_MAC_ADDR(req_params->peer_macaddr.bytes,
lifengfe6c3e22018-04-03 12:10:04 +08008008 &cmd->macaddr);
lifengd217d192017-05-09 19:44:16 +08008009
8010 if (wmi_unified_cmd_send(wma_handle->wmi_handle, wmi_buf, len,
lifengfe6c3e22018-04-03 12:10:04 +08008011 WMI_PDEV_DIV_GET_RSSI_ANTID_CMDID)) {
lifengd217d192017-05-09 19:44:16 +08008012 wmi_buf_free(wmi_buf);
8013 return QDF_STATUS_E_FAILURE;
8014 }
8015
8016 return QDF_STATUS_SUCCESS;
8017}
8018
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05308019#if defined(WLAN_FEATURE_FILS_SK)
8020/**
8021 * wma_roam_scan_send_hlp() - API to send HLP IE info to fw
8022 * @wma_handle: WMA handle
8023 * @req: HLP params
8024 *
8025 * Return: QDF_STATUS
8026 */
8027static QDF_STATUS wma_roam_scan_send_hlp(tp_wma_handle wma_handle,
8028 struct hlp_params *req)
8029{
8030 struct hlp_params *params;
8031 QDF_STATUS status;
8032
8033 params = qdf_mem_malloc(sizeof(*params));
Arif Hussain157263f2018-10-03 13:07:15 -07008034 if (!params)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05308035 return QDF_STATUS_E_NOMEM;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05308036
8037 params->vdev_id = req->vdev_id;
8038 params->hlp_ie_len = req->hlp_ie_len;
8039 qdf_mem_copy(params->hlp_ie, req->hlp_ie, req->hlp_ie_len);
8040 status = wmi_unified_roam_send_hlp_cmd(wma_handle->wmi_handle, params);
8041
8042 WMA_LOGD("Send HLP status %d vdev id %d", status, params->vdev_id);
8043 qdf_trace_hex_dump(QDF_MODULE_ID_WMI, QDF_TRACE_LEVEL_DEBUG,
8044 params->hlp_ie, 10);
8045
8046 qdf_mem_free(params);
8047 return status;
8048}
8049#else
8050static QDF_STATUS wma_roam_scan_send_hlp(tp_wma_handle wma_handle,
8051 struct hlp_params *req)
8052{
8053 return QDF_STATUS_SUCCESS;
8054}
8055#endif
8056
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05308057/**
Ganesh Kondabattini35739572017-06-21 16:26:39 +05308058 * wma_process_set_limit_off_chan() - set limit off chanel parameters
8059 * @wma_handle: pointer to wma handle
8060 * @param: pointer to sir_limit_off_chan
8061 *
8062 * Return: QDF_STATUS_SUCCESS for success or error code.
8063 */
8064static QDF_STATUS wma_process_limit_off_chan(tp_wma_handle wma_handle,
8065 struct sir_limit_off_chan *param)
8066{
8067 int32_t err;
8068 struct wmi_limit_off_chan_param limit_off_chan_param;
8069
Rajeev Kumar752d64e2017-10-05 16:32:58 -07008070 if (param->vdev_id >= wma_handle->max_bssid) {
8071 WMA_LOGE(FL("Invalid vdev_id: %d"), param->vdev_id);
8072 return QDF_STATUS_E_INVAL;
8073 }
8074 if (!wma_is_vdev_up(param->vdev_id)) {
Yeshwanth Sriram Guntukacbe61442018-08-23 18:08:44 +05308075 WMA_LOGD("vdev %d is not up skipping limit_off_chan_param",
8076 param->vdev_id);
Rajeev Kumar752d64e2017-10-05 16:32:58 -07008077 return QDF_STATUS_E_INVAL;
8078 }
8079
Ganesh Kondabattini35739572017-06-21 16:26:39 +05308080 limit_off_chan_param.vdev_id = param->vdev_id;
8081 limit_off_chan_param.status = param->is_tos_active;
8082 limit_off_chan_param.max_offchan_time = param->max_off_chan_time;
8083 limit_off_chan_param.rest_time = param->rest_time;
8084 limit_off_chan_param.skip_dfs_chans = param->skip_dfs_chans;
8085
8086 err = wmi_unified_send_limit_off_chan_cmd(wma_handle->wmi_handle,
8087 &limit_off_chan_param);
8088 if (err) {
8089 WMA_LOGE("\n failed to set limit off chan cmd");
8090 return QDF_STATUS_E_FAILURE;
8091 }
8092
8093 return QDF_STATUS_SUCCESS;
8094}
8095
Arif Hussain05fb4872018-01-03 16:02:55 -08008096static QDF_STATUS wma_process_obss_color_collision_req(tp_wma_handle wma_handle,
8097 struct wmi_obss_color_collision_cfg_param *cfg)
8098{
8099 QDF_STATUS status;
8100
8101 if (cfg->vdev_id >= wma_handle->max_bssid) {
8102 WMA_LOGE(FL("Invalid vdev_id: %d"), cfg->vdev_id);
8103 return QDF_STATUS_E_INVAL;
8104 }
8105 if (!wma_is_vdev_up(cfg->vdev_id)) {
8106 WMA_LOGE("vdev %d is not up skipping obss color collision req",
8107 cfg->vdev_id);
8108 return QDF_STATUS_E_INVAL;
8109 }
8110
8111 status = wmi_unified_send_obss_color_collision_cfg_cmd(wma_handle->
8112 wmi_handle, cfg);
8113 if (QDF_IS_STATUS_ERROR(status))
8114 WMA_LOGE("Failed to send obss color collision cfg");
8115
8116 return status;
8117}
8118
Ganesh Kondabattini35739572017-06-21 16:26:39 +05308119/**
Arif Hussainee10f902017-12-27 16:30:17 -08008120 * wma_send_obss_detection_cfg() - send obss detection cfg to firmware
8121 * @wma_handle: pointer to wma handle
8122 * @cfg: obss detection configuration
8123 *
8124 * Send obss detection configuration to firmware.
8125 *
8126 * Return: None
8127 */
8128static void wma_send_obss_detection_cfg(tp_wma_handle wma_handle,
8129 struct wmi_obss_detection_cfg_param
8130 *cfg)
8131{
8132 QDF_STATUS status;
8133
8134 if (cfg->vdev_id >= wma_handle->max_bssid) {
8135 WMA_LOGE(FL("Invalid vdev_id: %d"), cfg->vdev_id);
8136 return;
8137 }
8138 if (!wma_is_vdev_up(cfg->vdev_id)) {
8139 WMA_LOGE("vdev %d is not up skipping obss detection req",
8140 cfg->vdev_id);
8141 return;
8142 }
8143
8144 status = wmi_unified_send_obss_detection_cfg_cmd(wma_handle->wmi_handle,
8145 cfg);
8146 if (QDF_IS_STATUS_ERROR(status))
8147 WMA_LOGE("Failed to send obss detection cfg");
8148
8149 return;
8150}
8151
Visweswara Tanuku633976b2019-01-07 16:13:12 +05308152#ifdef WLAN_FEATURE_MOTION_DETECTION
8153/**
8154 * wma_motion_det_host_event_handler - motion detection event handler
8155 * @handle: WMA global handle
8156 * @event: motion detection event
8157 * @len: Length of cmd
8158 *
8159 * Call motion detection event callback handler
8160 *
8161 * Return: 0 on success, else error on failure
8162 */
8163int wma_motion_det_host_event_handler(void *handle, uint8_t *event,
8164 uint32_t len)
8165{
8166 wmi_motion_det_event *motion_det_event_hdr;
8167 WMI_MOTION_DET_HOST_EVENTID_param_tlvs *param_buf =
8168 (WMI_MOTION_DET_HOST_EVENTID_param_tlvs *)event;
8169 struct sir_md_evt *md_event;
8170 struct mac_context *pmac = (struct mac_context *)cds_get_context(
8171 QDF_MODULE_ID_PE);
8172
8173 if (!param_buf) {
8174 WMA_LOGE("Invalid motion det host event buffer");
8175 return -EINVAL;
8176 }
8177
Harprit Chhabadac67478f2019-04-09 11:39:22 -07008178 if (!pmac || !pmac->sme.md_host_evt_cb) {
8179 WMA_LOGE("Invalid motion detect callback");
8180 return -EINVAL;
8181 }
8182
Visweswara Tanuku633976b2019-01-07 16:13:12 +05308183 motion_det_event_hdr = param_buf->fixed_param;
8184 WMA_LOGA("motion detect host event received, vdev_id=%d, status=%d",
8185 motion_det_event_hdr->vdev_id, motion_det_event_hdr->status);
8186
8187 md_event = qdf_mem_malloc(sizeof(*md_event));
8188 if (!event)
8189 return -ENOMEM;
8190
8191 md_event->vdev_id = motion_det_event_hdr->vdev_id;
8192 md_event->status = motion_det_event_hdr->status;
8193
8194 pmac->sme.md_host_evt_cb(pmac->sme.md_ctx, md_event);
8195
8196 qdf_mem_free(md_event);
8197 return 0;
8198}
8199
8200/**
8201 * wma_motion_det_base_line_host_event_handler - md baselining event handler
8202 * @handle: WMA global handle
8203 * @event: motion detection baselining event
8204 * @len: Length of cmd
8205 *
8206 * Return: 0 on success, else error on failure
8207 */
8208int wma_motion_det_base_line_host_event_handler(void *handle,
8209 uint8_t *event, uint32_t len)
8210{
8211 wmi_motion_det_base_line_event *motion_det_base_line_event_hdr;
8212 WMI_MOTION_DET_BASE_LINE_HOST_EVENTID_param_tlvs *param_buf =
8213 (WMI_MOTION_DET_BASE_LINE_HOST_EVENTID_param_tlvs *)event;
8214
8215 if (!param_buf) {
8216 WMA_LOGE("Invalid motion det base line event buffer");
8217 return -EINVAL;
8218 }
8219
8220 motion_det_base_line_event_hdr = param_buf->fixed_param;
8221 WMA_LOGA("motion host detect base line event received, vdev_id=%d",
8222 motion_det_base_line_event_hdr->vdev_id);
8223 WMA_LOGA("baseline_value=%d bl_max_corr_resv=%d bl_min_corr_resv=%d",
8224 motion_det_base_line_event_hdr->bl_baseline_value,
8225 motion_det_base_line_event_hdr->bl_max_corr_reserved,
8226 motion_det_base_line_event_hdr->bl_min_corr_reserved);
8227
8228 return 0;
8229}
8230
8231/**
8232 * wma_set_motion_det_config - Sends motion detection configuration wmi cmd
8233 * @wma_handle: WMA global handle
8234 * @motion_det_cfg: motion detection configuration
8235 *
8236 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_ERROR on error
8237 */
8238static QDF_STATUS wma_set_motion_det_config(
8239 tp_wma_handle wma_handle,
8240 struct sme_motion_det_cfg *motion_det_cfg)
8241{
8242 wmi_motion_det_config_params_cmd_fixed_param *cmd;
8243 wmi_buf_t buf;
8244 int err;
8245
8246 buf = wmi_buf_alloc(wma_handle->wmi_handle, sizeof(*cmd));
8247 if (!buf)
8248 return QDF_STATUS_E_NOMEM;
8249
8250 cmd = (wmi_motion_det_config_params_cmd_fixed_param *)wmi_buf_data(buf);
8251 qdf_mem_zero(cmd, sizeof(*cmd));
8252
8253 WMITLV_SET_HDR(
8254 &cmd->tlv_header,
8255 WMITLV_TAG_STRUC_wmi_motion_det_config_params_cmd_fixed_param,
8256 WMITLV_GET_STRUCT_TLVLEN(
8257 wmi_motion_det_config_params_cmd_fixed_param));
8258 cmd->vdev_id = motion_det_cfg->vdev_id;
8259 cmd->time_t1 = motion_det_cfg->time_t1;
8260 cmd->time_t2 = motion_det_cfg->time_t2;
8261 cmd->n1 = motion_det_cfg->n1;
8262 cmd->n2 = motion_det_cfg->n2;
8263 cmd->time_t1_gap = motion_det_cfg->time_t1_gap;
8264 cmd->time_t2_gap = motion_det_cfg->time_t2_gap;
8265 cmd->coarse_K = motion_det_cfg->coarse_K;
8266 cmd->fine_K = motion_det_cfg->fine_K;
8267 cmd->coarse_Q = motion_det_cfg->coarse_Q;
8268 cmd->fine_Q = motion_det_cfg->fine_Q;
8269 cmd->md_coarse_thr_high = motion_det_cfg->md_coarse_thr_high;
8270 cmd->md_fine_thr_high = motion_det_cfg->md_fine_thr_high;
8271 cmd->md_coarse_thr_low = motion_det_cfg->md_coarse_thr_low;
8272 cmd->md_fine_thr_low = motion_det_cfg->md_fine_thr_low;
8273
8274 err = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, sizeof(*cmd),
8275 WMI_MOTION_DET_CONFIG_PARAM_CMDID);
8276 if (err) {
8277 wmi_buf_free(buf);
8278 return QDF_STATUS_E_FAILURE;
8279 }
8280 WMA_LOGA("Set motion_det_config to vdevId %d\n"
8281 "time_t1 %d\n"
8282 "time_t2 %d\n"
8283 "n1 %d\n"
8284 "n2 %d\n"
8285 "time_t1_gap %d\n"
8286 "time_t2_gap %d\n"
8287 "coarse_K %d\n"
8288 "fine_K %d\n"
8289 "coarse_Q %d\n"
8290 "fine_Q %d\n"
8291 "md_coarse_thr_high %d\n"
8292 "md_fine_thr_high %d\n"
8293 "md_coarse_thr_low %d\n"
8294 "md_fine_thr_low %d\n",
8295 motion_det_cfg->vdev_id,
8296 motion_det_cfg->time_t1,
8297 motion_det_cfg->time_t2,
8298 motion_det_cfg->n1,
8299 motion_det_cfg->n2,
8300 motion_det_cfg->time_t1_gap,
8301 motion_det_cfg->time_t2_gap,
8302 motion_det_cfg->coarse_K,
8303 motion_det_cfg->fine_K,
8304 motion_det_cfg->coarse_Q,
8305 motion_det_cfg->fine_Q,
8306 motion_det_cfg->md_coarse_thr_high,
8307 motion_det_cfg->md_fine_thr_high,
8308 motion_det_cfg->md_coarse_thr_low,
8309 motion_det_cfg->md_fine_thr_low);
8310 return QDF_STATUS_SUCCESS;
8311}
8312
8313/**
8314 * wma_set_motion_det_enable - Sends motion detection start/stop wmi cmd
8315 * @wma_handle: WMA global handle
8316 * @md_en: motion detection start/stop
8317 *
8318 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_ERROR on error
8319 */
8320static QDF_STATUS wma_set_motion_det_enable(tp_wma_handle wma_handle,
8321 struct sme_motion_det_en *md_en)
8322{
8323 wmi_motion_det_start_stop_cmd_fixed_param *cmd;
8324 wmi_buf_t buf;
8325 int err;
8326
8327 buf = wmi_buf_alloc(wma_handle->wmi_handle, sizeof(*cmd));
8328 if (!buf)
8329 return QDF_STATUS_E_NOMEM;
8330
8331 cmd = (wmi_motion_det_start_stop_cmd_fixed_param *)wmi_buf_data(buf);
8332 qdf_mem_zero(cmd, sizeof(*cmd));
8333
8334 WMITLV_SET_HDR(
8335 &cmd->tlv_header,
8336 WMITLV_TAG_STRUC_wmi_motion_det_start_stop_cmd_fixed_param,
8337 WMITLV_GET_STRUCT_TLVLEN(
8338 wmi_motion_det_start_stop_cmd_fixed_param));
8339 cmd->vdev_id = md_en->vdev_id;
8340 cmd->enable = md_en->enable;
8341
8342 err = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, sizeof(*cmd),
8343 WMI_MOTION_DET_START_STOP_CMDID);
8344 if (err) {
8345 wmi_buf_free(buf);
8346 return QDF_STATUS_E_FAILURE;
8347 }
8348 WMA_LOGA("Set motion_det_enable to vdevId %d %d", md_en->vdev_id,
8349 md_en->enable);
8350 return QDF_STATUS_SUCCESS;
8351}
8352
8353/**
8354 * wma_set_motion_det_base_line_config - Sends md baselining cfg wmi cmd
8355 * @wma_handle: WMA global handle
8356 * @md_base_line_cfg: md baselining configuration
8357 *
8358 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_ERROR on error
8359 */
8360static QDF_STATUS wma_set_motion_det_base_line_config(
8361 tp_wma_handle wma_handle,
8362 struct sme_motion_det_base_line_cfg *md_base_line_cfg)
8363{
8364 wmi_motion_det_base_line_config_params_cmd_fixed_param *cmd;
8365 wmi_buf_t buf;
8366 int err;
8367
8368 buf = wmi_buf_alloc(wma_handle->wmi_handle, sizeof(*cmd));
8369 if (!buf)
8370 return QDF_STATUS_E_NOMEM;
8371
8372 cmd = (wmi_motion_det_base_line_config_params_cmd_fixed_param *)
8373 wmi_buf_data(buf);
8374 qdf_mem_zero(cmd, sizeof(*cmd));
8375
8376 WMITLV_SET_HDR(
8377 &cmd->tlv_header,
8378 WMITLV_TAG_STRUC_wmi_motion_det_base_line_config_params_cmd_fixed_param,
8379 WMITLV_GET_STRUCT_TLVLEN(
8380 wmi_motion_det_base_line_config_params_cmd_fixed_param));
8381
8382 cmd->vdev_id = md_base_line_cfg->vdev_id;
8383 cmd->bl_time_t = md_base_line_cfg->bl_time_t;
8384 cmd->bl_packet_gap = md_base_line_cfg->bl_packet_gap;
8385 cmd->bl_n = md_base_line_cfg->bl_n;
8386 cmd->bl_num_meas = md_base_line_cfg->bl_num_meas;
8387
8388 err = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, sizeof(*cmd),
8389 WMI_MOTION_DET_BASE_LINE_CONFIG_PARAM_CMDID);
8390 if (err) {
8391 wmi_buf_free(buf);
8392 return QDF_STATUS_E_FAILURE;
8393 }
8394 WMA_LOGA("Set motion_det_baseline_config to vdevId %d\n"
8395 "bl_time_t %d\n"
8396 "bl_packet_gap %d\n"
8397 "bl_n %d\n"
8398 "bl_num_meas %d\n",
8399 md_base_line_cfg->vdev_id,
8400 md_base_line_cfg->bl_time_t,
8401 md_base_line_cfg->bl_packet_gap,
8402 md_base_line_cfg->bl_n,
8403 md_base_line_cfg->bl_num_meas);
8404 return QDF_STATUS_SUCCESS;
8405}
8406
8407/**
8408 * wma_set_motion_det_base_line_enable - Sends md baselining start/stop wmi cmd
8409 * @wma_handle: WMA global handle
8410 * @md_base_line_en: motion detection baselining start/stop
8411 *
8412 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_ERROR on error
8413 */
8414static QDF_STATUS wma_set_motion_det_base_line_enable(
8415 tp_wma_handle wma_handle,
8416 struct sme_motion_det_base_line_en *md_base_line_en)
8417{
8418 wmi_motion_det_base_line_start_stop_cmd_fixed_param *cmd;
8419 wmi_buf_t buf;
8420 int err;
8421
8422 buf = wmi_buf_alloc(wma_handle->wmi_handle, sizeof(*cmd));
8423 if (!buf)
8424 return QDF_STATUS_E_NOMEM;
8425
8426 cmd = (wmi_motion_det_base_line_start_stop_cmd_fixed_param *)
8427 wmi_buf_data(buf);
8428 qdf_mem_zero(cmd, sizeof(*cmd));
8429
8430 WMITLV_SET_HDR(
Visweswara Tanuku6488a1c2019-02-13 14:15:26 +05308431 &cmd->tlv_header,
Visweswara Tanuku633976b2019-01-07 16:13:12 +05308432 WMITLV_TAG_STRUC_wmi_motion_det_base_line_start_stop_cmd_fixed_param,
8433 WMITLV_GET_STRUCT_TLVLEN(
8434 wmi_motion_det_base_line_start_stop_cmd_fixed_param));
8435
8436 cmd->vdev_id = md_base_line_en->vdev_id;
8437 cmd->enable = md_base_line_en->enable;
8438
8439 err = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, sizeof(*cmd),
8440 WMI_MOTION_DET_BASE_LINE_START_STOP_CMDID);
8441 if (err) {
8442 wmi_buf_free(buf);
8443 return QDF_STATUS_E_FAILURE;
8444 }
8445 WMA_LOGA("Set motion_det_base_line_enable to vdevId %d enable %d",
8446 md_base_line_en->vdev_id, md_base_line_en->enable);
8447 return QDF_STATUS_SUCCESS;
8448}
8449#endif /* WLAN_FEATURE_MOTION_DETECTION */
8450
Arif Hussainee10f902017-12-27 16:30:17 -08008451/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008452 * wma_mc_process_msg() - process wma messages and call appropriate function.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008453 * @msg: message
8454 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05308455 * Return: QDF_SUCCESS for success otherwise failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008456 */
Jeff Johnson5be42ab2017-09-13 09:10:39 -07008457static QDF_STATUS wma_mc_process_msg(struct scheduler_msg *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008458{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308459 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008460 tp_wma_handle wma_handle;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08008461 struct cdp_vdev *txrx_vdev_handle = NULL;
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -07008462
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008463 extern uint8_t *mac_trace_get_wma_msg_string(uint16_t wmaMsg);
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05308464 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008465
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07008466 if (!msg) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008467 WMA_LOGE("msg is NULL");
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308468 QDF_ASSERT(0);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308469 qdf_status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008470 goto end;
8471 }
8472
8473 WMA_LOGD("msg->type = %x %s", msg->type,
8474 mac_trace_get_wma_msg_string(msg->type));
8475
Anurag Chouhan6d760662016-02-20 16:05:43 +05308476 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008477
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07008478 if (!wma_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07008479 WMA_LOGE("%s: wma_handle is NULL", __func__);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308480 QDF_ASSERT(0);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308481 qdf_mem_free(msg->bodyptr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308482 qdf_status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008483 goto end;
8484 }
8485
8486 switch (msg->type) {
8487
8488 /* Message posted by wmi for all control path related
8489 * FW events to serialize through mc_thread.
8490 */
8491 case WMA_PROCESS_FW_EVENT:
8492 wma_process_fw_event(wma_handle,
8493 (wma_process_fw_event_params *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308494 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008495 break;
8496
8497#ifdef FEATURE_WLAN_ESE
8498 case WMA_TSM_STATS_REQ:
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08008499 WMA_LOGD("McThread: WMA_TSM_STATS_REQ");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008500 wma_process_tsm_stats_req(wma_handle, (void *)msg->bodyptr);
8501 break;
8502#endif /* FEATURE_WLAN_ESE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008503 case WMA_ADD_STA_SELF_REQ:
8504 txrx_vdev_handle =
8505 wma_vdev_attach(wma_handle,
8506 (struct add_sta_self_params *) msg->
8507 bodyptr, 1);
8508 if (!txrx_vdev_handle) {
8509 WMA_LOGE("Failed to attach vdev");
8510 } else {
8511 /* Register with TxRx Module for Data Ack Complete Cb */
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05308512 if (soc) {
8513 cdp_data_tx_cb_set(soc, txrx_vdev_handle,
8514 wma_data_tx_ack_comp_hdlr,
8515 wma_handle);
8516 } else {
8517 WMA_LOGE("%s: SOC context is NULL", __func__);
8518 qdf_status = QDF_STATUS_E_FAILURE;
8519 goto end;
8520 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008521 }
8522 break;
8523 case WMA_DEL_STA_SELF_REQ:
8524 wma_vdev_detach(wma_handle,
8525 (struct del_sta_self_params *) msg->bodyptr, 1);
8526 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008527 case WMA_UPDATE_CHAN_LIST_REQ:
8528 wma_update_channel_list(wma_handle,
8529 (tSirUpdateChanList *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308530 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008531 break;
8532 case WMA_SET_LINK_STATE:
8533 wma_set_linkstate(wma_handle, (tpLinkStateParams) msg->bodyptr);
8534 break;
8535 case WMA_CHNL_SWITCH_REQ:
8536 wma_set_channel(wma_handle,
8537 (tpSwitchChannelParams) msg->bodyptr);
8538 break;
8539 case WMA_ADD_BSS_REQ:
8540 wma_add_bss(wma_handle, (tpAddBssParams) msg->bodyptr);
8541 break;
8542 case WMA_ADD_STA_REQ:
8543 wma_add_sta(wma_handle, (tpAddStaParams) msg->bodyptr);
8544 break;
Rakshith Suresh Patkar5f9efa32019-02-04 13:26:56 +05308545 case WMA_SEND_PEER_UNMAP_CONF:
8546 wma_peer_unmap_conf_send(
8547 wma_handle,
8548 (struct send_peer_unmap_conf_params *)msg->bodyptr);
8549 qdf_mem_free(msg->bodyptr);
8550 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008551 case WMA_SET_BSSKEY_REQ:
8552 wma_set_bsskey(wma_handle, (tpSetBssKeyParams) msg->bodyptr);
8553 break;
8554 case WMA_SET_STAKEY_REQ:
8555 wma_set_stakey(wma_handle, (tpSetStaKeyParams) msg->bodyptr);
8556 break;
8557 case WMA_DELETE_STA_REQ:
8558 wma_delete_sta(wma_handle, (tpDeleteStaParams) msg->bodyptr);
8559 break;
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07008560 case WMA_DELETE_BSS_HO_FAIL_REQ:
8561 wma_delete_bss_ho_fail(wma_handle,
8562 (tpDeleteBssParams) msg->bodyptr);
8563 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008564 case WMA_DELETE_BSS_REQ:
8565 wma_delete_bss(wma_handle, (tpDeleteBssParams) msg->bodyptr);
8566 break;
8567 case WMA_UPDATE_EDCA_PROFILE_IND:
8568 wma_process_update_edca_param_req(wma_handle,
8569 (tEdcaParams *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308570 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008571 break;
8572 case WMA_SEND_BEACON_REQ:
8573 wma_send_beacon(wma_handle, (tpSendbeaconParams) msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008574 break;
Abhishek Singh3d30a3b2018-09-12 15:49:18 +05308575 case WMA_SEND_AP_VDEV_UP:
8576 wma_set_ap_vdev_up(wma_handle, msg->bodyval);
8577 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008578 case WMA_SEND_PROBE_RSP_TMPL:
8579 wma_send_probe_rsp_tmpl(wma_handle,
8580 (tpSendProbeRespParams) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308581 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008582 break;
8583 case WMA_CLI_SET_CMD:
8584 wma_process_cli_set_cmd(wma_handle,
8585 (wma_cli_set_cmd_t *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308586 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008587 break;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07008588 case WMA_SET_PDEV_IE_REQ:
8589 wma_process_set_pdev_ie_req(wma_handle,
8590 (struct set_ie_param *)msg->bodyptr);
8591 qdf_mem_free(msg->bodyptr);
8592 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008593#if !defined(REMOVE_PKT_LOG)
8594 case WMA_PKTLOG_ENABLE_REQ:
8595 wma_pktlog_wmi_send_cmd(wma_handle,
8596 (struct ath_pktlog_wmi_params *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308597 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008598 break;
8599#endif /* REMOVE_PKT_LOG */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008600 case WMA_ENTER_PS_REQ:
8601 wma_enable_sta_ps_mode(wma_handle,
8602 (tpEnablePsParams) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308603 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008604 break;
8605 case WMA_EXIT_PS_REQ:
8606 wma_disable_sta_ps_mode(wma_handle,
8607 (tpDisablePsParams) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308608 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008609 break;
8610 case WMA_ENABLE_UAPSD_REQ:
8611 wma_enable_uapsd_mode(wma_handle,
8612 (tpEnableUapsdParams) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308613 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008614 break;
8615 case WMA_DISABLE_UAPSD_REQ:
8616 wma_disable_uapsd_mode(wma_handle,
8617 (tpDisableUapsdParams) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308618 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008619 break;
Kiran Kumar Lokere6d3a30d2018-01-15 18:18:29 -08008620 case WMA_SET_DTIM_PERIOD:
8621 wma_set_dtim_period(wma_handle,
8622 (struct set_dtim_params *)msg->bodyptr);
8623 qdf_mem_free(msg->bodyptr);
8624 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008625 case WMA_SET_TX_POWER_REQ:
8626 wma_set_tx_power(wma_handle, (tpMaxTxPowerParams) msg->bodyptr);
8627 break;
8628 case WMA_SET_MAX_TX_POWER_REQ:
8629 wma_set_max_tx_power(wma_handle,
8630 (tpMaxTxPowerParams) msg->bodyptr);
8631 break;
8632 case WMA_SET_KEEP_ALIVE:
Jeff Johnson562ccad2019-02-06 22:10:24 -08008633 wma_set_keepalive_req(wma_handle, msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008634 break;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08008635#ifdef FEATURE_WLAN_ESE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008636 case WMA_SET_PLM_REQ:
Jeff Johnsonb120a822019-02-02 22:15:55 -08008637 wma_config_plm(wma_handle, msg->bodyptr);
8638 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008639 break;
8640#endif
8641 case WMA_GET_STATISTICS_REQ:
8642 wma_get_stats_req(wma_handle,
8643 (tAniGetPEStatsReq *) msg->bodyptr);
8644 break;
8645
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008646 case WMA_UPDATE_OP_MODE:
8647 wma_process_update_opmode(wma_handle,
8648 (tUpdateVHTOpMode *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308649 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008650 break;
8651 case WMA_UPDATE_RX_NSS:
8652 wma_process_update_rx_nss(wma_handle,
8653 (tUpdateRxNss *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308654 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008655 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008656 case WMA_UPDATE_MEMBERSHIP:
8657 wma_process_update_membership(wma_handle,
8658 (tUpdateMembership *) msg->bodyptr);
8659 break;
8660 case WMA_UPDATE_USERPOS:
8661 wma_process_update_userpos(wma_handle,
8662 (tUpdateUserPos *) msg->bodyptr);
8663 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008664 case WMA_UPDATE_BEACON_IND:
8665 wma_process_update_beacon_params(wma_handle,
8666 (tUpdateBeaconParams *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308667 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008668 break;
8669
8670 case WMA_ADD_TS_REQ:
Jeff Johnson9851fcc2018-12-22 17:29:58 -08008671 wma_add_ts_req(wma_handle, msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008672 break;
8673
8674 case WMA_DEL_TS_REQ:
Jeff Johnson256002f2018-12-22 17:53:19 -08008675 wma_del_ts_req(wma_handle, msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008676 break;
8677
8678 case WMA_AGGR_QOS_REQ:
Jeff Johnson54024412018-12-22 12:07:06 -08008679 wma_aggr_qos_req(wma_handle, msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008680 break;
8681
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008682 case WMA_8023_MULTICAST_LIST_REQ:
8683 wma_process_mcbc_set_filter_req(wma_handle,
8684 (tpSirRcvFltMcAddrList) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308685 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008686 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008687 case WMA_ROAM_SCAN_OFFLOAD_REQ:
Jeff Johnsone6da4b02019-02-06 22:22:04 -08008688 wma_process_roaming_config(wma_handle, msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008689 break;
8690
8691 case WMA_RATE_UPDATE_IND:
8692 wma_process_rate_update_indicate(wma_handle,
8693 (tSirRateUpdateInd *) msg->bodyptr);
8694 break;
8695
8696#ifdef FEATURE_WLAN_TDLS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008697 case WMA_UPDATE_TDLS_PEER_STATE:
Jeff Johnson517ee492019-02-07 11:59:04 -08008698 wma_update_tdls_peer_state(wma_handle, msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008699 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008700#endif /* FEATURE_WLAN_TDLS */
8701 case WMA_ADD_PERIODIC_TX_PTRN_IND:
8702 wma_process_add_periodic_tx_ptrn_ind(wma_handle,
8703 (tSirAddPeriodicTxPtrn *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308704 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008705 break;
8706 case WMA_DEL_PERIODIC_TX_PTRN_IND:
8707 wma_process_del_periodic_tx_ptrn_ind(wma_handle,
8708 (tSirDelPeriodicTxPtrn *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308709 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008710 break;
8711 case WMA_TX_POWER_LIMIT:
Jeff Johnson19ce8d02019-02-08 22:56:23 -08008712 wma_process_tx_power_limits(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308713 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008714 break;
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008715 case WMA_SEND_ADDBA_REQ:
8716 wma_process_send_addba_req(wma_handle,
8717 (struct send_add_ba_req *)msg->bodyptr);
8718 break;
8719
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008720#ifdef FEATURE_WLAN_CH_AVOID
8721 case WMA_CH_AVOID_UPDATE_REQ:
8722 wma_process_ch_avoid_update_req(wma_handle,
8723 (tSirChAvoidUpdateReq *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308724 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008725 break;
8726#endif /* FEATURE_WLAN_CH_AVOID */
8727#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
8728 case WMA_SET_AUTO_SHUTDOWN_TIMER_REQ:
8729 wma_set_auto_shutdown_timer_req(wma_handle, 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#endif /* FEATURE_WLAN_AUTO_SHUTDOWN */
8733 case WMA_DHCP_START_IND:
8734 case WMA_DHCP_STOP_IND:
8735 wma_process_dhcp_ind(wma_handle, (tAniDHCPInd *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308736 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008737 break;
8738
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008739 case WMA_IBSS_CESIUM_ENABLE_IND:
8740 wma_process_cesium_enable_ind(wma_handle);
8741 break;
8742 case WMA_GET_IBSS_PEER_INFO_REQ:
8743 wma_process_get_peer_info_req(wma_handle,
8744 (tSirIbssGetPeerInfoReqParams *)
8745 msg->bodyptr);
8746 qdf_mem_free(msg->bodyptr);
8747 break;
8748 case WMA_TX_FAIL_MONITOR_IND:
8749 wma_process_tx_fail_monitor_ind(wma_handle,
8750 (tAniTXFailMonitorInd *) msg->bodyptr);
8751 qdf_mem_free(msg->bodyptr);
8752 break;
8753
8754 case WMA_RMC_ENABLE_IND:
8755 wma_process_rmc_enable_ind(wma_handle);
8756 break;
8757 case WMA_RMC_DISABLE_IND:
8758 wma_process_rmc_disable_ind(wma_handle);
8759 break;
8760 case WMA_RMC_ACTION_PERIOD_IND:
8761 wma_process_rmc_action_period_ind(wma_handle);
8762 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008763 case WMA_INIT_THERMAL_INFO_CMD:
8764 wma_process_init_thermal_info(wma_handle,
8765 (t_thermal_mgmt *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308766 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008767 break;
8768
8769 case WMA_SET_THERMAL_LEVEL:
8770 wma_process_set_thermal_level(wma_handle, msg->bodyval);
8771 break;
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05308772#ifdef CONFIG_HL_SUPPORT
8773 case WMA_INIT_BAD_PEER_TX_CTL_INFO_CMD:
8774 wma_process_init_bad_peer_tx_ctl_info(
8775 wma_handle,
8776 (struct t_bad_peer_txtcl_config *)msg->bodyptr);
8777 qdf_mem_free(msg->bodyptr);
8778 break;
8779#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008780 case WMA_SET_MIMOPS_REQ:
8781 wma_process_set_mimops_req(wma_handle,
8782 (tSetMIMOPS *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308783 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008784 break;
8785 case WMA_SET_SAP_INTRABSS_DIS:
8786 wma_set_vdev_intrabss_fwd(wma_handle,
8787 (tDisableIntraBssFwd *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308788 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008789 break;
Will Huanga9814592017-05-24 15:47:58 +08008790 case WMA_GET_PEER_INFO:
8791 wma_get_peer_info(wma_handle, msg->bodyptr);
8792 qdf_mem_free(msg->bodyptr);
8793 break;
8794 case WMA_GET_PEER_INFO_EXT:
8795 wma_get_peer_info_ext(wma_handle, msg->bodyptr);
8796 qdf_mem_free(msg->bodyptr);
8797 break;
guangde4853c402019-05-06 15:54:04 +08008798 case WMA_GET_ISOLATION:
8799 wma_get_isolation(wma_handle);
8800 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008801 case WMA_MODEM_POWER_STATE_IND:
8802 wma_notify_modem_power_state(wma_handle,
8803 (tSirModemPowerStateInd *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308804 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008805 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008806#ifdef WLAN_FEATURE_STATS_EXT
8807 case WMA_STATS_EXT_REQUEST:
8808 wma_stats_ext_req(wma_handle,
8809 (tpStatsExtRequest) (msg->bodyptr));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308810 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008811 break;
8812#endif /* WLAN_FEATURE_STATS_EXT */
8813 case WMA_HIDDEN_SSID_VDEV_RESTART:
8814 wma_hidden_ssid_vdev_restart(wma_handle,
8815 (tHalHiddenSsidVdevRestart *) msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008816 break;
8817#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
8818 case WMA_WLAN_EXT_WOW:
8819 wma_enable_ext_wow(wma_handle,
8820 (tSirExtWoWParams *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308821 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008822 break;
8823 case WMA_WLAN_SET_APP_TYPE1_PARAMS:
8824 wma_set_app_type1_params_in_fw(wma_handle,
8825 (tSirAppType1Params *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308826 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008827 break;
8828 case WMA_WLAN_SET_APP_TYPE2_PARAMS:
8829 wma_set_app_type2_params_in_fw(wma_handle,
8830 (tSirAppType2Params *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308831 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008832 break;
8833#endif /* WLAN_FEATURE_EXTWOW_SUPPORT */
8834#ifdef FEATURE_WLAN_EXTSCAN
8835 case WMA_EXTSCAN_START_REQ:
Jeff Johnsondab58602018-07-14 15:30:24 -07008836 wma_start_extscan(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308837 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008838 break;
8839 case WMA_EXTSCAN_STOP_REQ:
Jeff Johnson7272ea72018-07-15 17:22:27 -07008840 wma_stop_extscan(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308841 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008842 break;
8843 case WMA_EXTSCAN_SET_BSSID_HOTLIST_REQ:
Jeff Johnson1148cb02018-07-13 23:14:32 -07008844 wma_extscan_start_hotlist_monitor(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308845 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008846 break;
8847 case WMA_EXTSCAN_RESET_BSSID_HOTLIST_REQ:
Jeff Johnson9743eb72018-07-14 10:30:04 -07008848 wma_extscan_stop_hotlist_monitor(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308849 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008850 break;
8851 case WMA_EXTSCAN_SET_SIGNF_CHANGE_REQ:
Jeff Johnsonb43ed032018-07-16 06:59:21 -07008852 wma_extscan_start_change_monitor(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308853 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008854 break;
8855 case WMA_EXTSCAN_RESET_SIGNF_CHANGE_REQ:
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07008856 wma_extscan_stop_change_monitor(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308857 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008858 break;
8859 case WMA_EXTSCAN_GET_CACHED_RESULTS_REQ:
Jeff Johnson2ba60092018-07-17 08:19:37 -07008860 wma_extscan_get_cached_results(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308861 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008862 break;
8863 case WMA_EXTSCAN_GET_CAPABILITIES_REQ:
Jeff Johnsonfed9a732018-07-18 12:18:03 -07008864 wma_extscan_get_capabilities(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308865 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008866 break;
8867 case WMA_SET_EPNO_LIST_REQ:
Jeff Johnson360135b2018-07-18 20:51:47 -07008868 wma_set_epno_network_list(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308869 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008870 break;
Kapil Gupta5cda2252016-12-29 18:44:26 +05308871 case WMA_SET_PER_ROAM_CONFIG_CMD:
8872 wma_update_per_roam_config(wma_handle,
8873 (struct wmi_per_roam_config_req *)msg->bodyptr);
8874 qdf_mem_free(msg->bodyptr);
8875 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008876 case WMA_SET_PASSPOINT_LIST_REQ:
8877 /* Issue reset passpoint network list first and clear
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07008878 * the entries
8879 */
Jeff Johnson2a7f1012018-07-19 07:21:06 -07008880 wma_reset_passpoint_network_list(wma_handle, msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008881
Jeff Johnson2a7f1012018-07-19 07:21:06 -07008882 wma_set_passpoint_network_list(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308883 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008884 break;
8885 case WMA_RESET_PASSPOINT_LIST_REQ:
Jeff Johnson2a7f1012018-07-19 07:21:06 -07008886 wma_reset_passpoint_network_list(wma_handle, msg->bodyptr);
Pragaspathi Thilagarajf65cffe2018-06-15 14:20:26 +05308887 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008888 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008889#endif /* FEATURE_WLAN_EXTSCAN */
8890 case WMA_SET_SCAN_MAC_OUI_REQ:
8891 wma_scan_probe_setoui(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308892 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008893 break;
8894#ifdef WLAN_FEATURE_LINK_LAYER_STATS
8895 case WMA_LINK_LAYER_STATS_CLEAR_REQ:
8896 wma_process_ll_stats_clear_req(wma_handle,
8897 (tpSirLLStatsClearReq) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308898 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008899 break;
8900 case WMA_LINK_LAYER_STATS_SET_REQ:
8901 wma_process_ll_stats_set_req(wma_handle,
8902 (tpSirLLStatsSetReq) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308903 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008904 break;
8905 case WMA_LINK_LAYER_STATS_GET_REQ:
8906 wma_process_ll_stats_get_req(wma_handle,
8907 (tpSirLLStatsGetReq) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308908 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008909 break;
Zhang Qian73c348a2017-03-13 16:15:55 +08008910 case WDA_LINK_LAYER_STATS_SET_THRESHOLD:
8911 wma_config_stats_ext_threshold(wma_handle,
8912 (struct sir_ll_ext_stats_threshold *)msg->bodyptr);
8913 qdf_mem_free(msg->bodyptr);
8914 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008915#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008916#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008917 case WMA_ROAM_OFFLOAD_SYNCH_FAIL:
8918 wma_process_roam_synch_fail(wma_handle,
8919 (struct roam_offload_synch_fail *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308920 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008921 break;
8922 case SIR_HAL_ROAM_INVOKE:
8923 wma_process_roam_invoke(wma_handle,
8924 (struct wma_roam_invoke_cmd *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308925 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008926 break;
8927#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008928 case SIR_HAL_SET_BASE_MACADDR_IND:
8929 wma_set_base_macaddr_indicate(wma_handle,
8930 (tSirMacAddr *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308931 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008932 break;
8933 case WMA_LINK_STATUS_GET_REQ:
8934 wma_process_link_status_req(wma_handle,
8935 (tAniGetLinkStatus *) msg->bodyptr);
8936 break;
8937 case WMA_GET_TEMPERATURE_REQ:
8938 wma_get_temperature(wma_handle);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308939 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008940 break;
Manikandan Mohan976e7562016-03-15 16:33:31 -07008941 case WMA_TSF_GPIO_PIN:
8942 wma_set_tsf_gpio_pin(wma_handle, msg->bodyval);
8943 break;
8944
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008945#ifdef DHCP_SERVER_OFFLOAD
8946 case WMA_SET_DHCP_SERVER_OFFLOAD_CMD:
Jeff Johnsone77641e2019-02-15 09:00:41 -08008947 wma_process_dhcpserver_offload(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308948 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008949 break;
8950#endif /* DHCP_SERVER_OFFLOAD */
8951#ifdef WLAN_FEATURE_GPIO_LED_FLASHING
8952 case WMA_LED_FLASHING_REQ:
Jeff Johnson5a6b6602017-10-04 14:44:30 -07008953 wma_set_led_flashing(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308954 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008955 break;
8956#endif /* WLAN_FEATURE_GPIO_LED_FLASHING */
8957 case SIR_HAL_SET_MAS:
8958 wma_process_set_mas(wma_handle,
8959 (uint32_t *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308960 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008961 break;
8962 case SIR_HAL_SET_MIRACAST:
8963 wma_process_set_miracast(wma_handle,
8964 (uint32_t *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308965 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008966 break;
8967 case SIR_HAL_CONFIG_STATS_FACTOR:
8968 wma_config_stats_factor(wma_handle,
8969 (struct sir_stats_avg_factor *)
8970 msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308971 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008972 break;
8973 case SIR_HAL_CONFIG_GUARD_TIME:
8974 wma_config_guard_time(wma_handle,
8975 (struct sir_guard_time_request *)
8976 msg->bodyptr);
Vignesh Viswanathan9fa8fef2017-12-12 14:45:38 +05308977 qdf_mem_free(msg->bodyptr);
8978 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008979 case SIR_HAL_START_STOP_LOGGING:
8980 wma_set_wifi_start_packet_stats(wma_handle,
8981 (struct sir_wifi_start_log *)msg->bodyptr);
8982 wma_enable_specific_fw_logs(wma_handle,
8983 (struct sir_wifi_start_log *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308984 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008985 break;
8986 case SIR_HAL_FLUSH_LOG_TO_FW:
8987 wma_send_flush_logs_to_fw(wma_handle);
8988 /* Body ptr is NULL here */
8989 break;
8990 case WMA_SET_RSSI_MONITOR_REQ:
Jeff Johnson4c6d40f2019-02-22 20:49:56 -08008991 wma_set_rssi_monitoring(wma_handle, msg->bodyptr);
Prakash Dhavali87ddca32016-11-29 17:02:11 -08008992 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008993 break;
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05308994 case SIR_HAL_PDEV_SET_PCL_TO_FW:
8995 wma_send_pdev_set_pcl_cmd(wma_handle,
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -07008996 (struct set_pcl_req *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308997 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008998 break;
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05308999 case SIR_HAL_PDEV_SET_HW_MODE:
9000 wma_send_pdev_set_hw_mode_cmd(wma_handle,
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07009001 (struct policy_mgr_hw_mode *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309002 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009003 break;
Manikandan Mohan80dea792016-04-28 16:36:48 -07009004 case WMA_SET_WISA_PARAMS:
9005 wma_set_wisa_params(wma_handle,
9006 (struct sir_wisa_params *)msg->bodyptr);
9007 qdf_mem_free(msg->bodyptr);
9008 break;
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05309009 case SIR_HAL_PDEV_DUAL_MAC_CFG_REQ:
9010 wma_send_pdev_set_dual_mac_config(wma_handle,
Srinivas Girigowdaeb6ecf32018-02-15 17:04:22 -08009011 (struct policy_mgr_dual_mac_config *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309012 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009013 break;
9014 case WMA_SET_IE_INFO:
9015 wma_process_set_ie_info(wma_handle,
9016 (struct vdev_ie_info *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309017 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009018 break;
Kiran Kumar Lokereee205772018-09-27 00:27:27 -07009019 case WMA_CFG_VENDOR_ACTION_TB_PPDU:
9020 wma_process_cfg_action_frm_tb_ppdu(wma_handle, msg->bodyptr);
9021 qdf_mem_free(msg->bodyptr);
9022 break;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08009023 case SIR_HAL_SOC_ANTENNA_MODE_REQ:
9024 wma_send_pdev_set_antenna_mode(wma_handle,
9025 (struct sir_antenna_mode_param *)msg->bodyptr);
9026 qdf_mem_free(msg->bodyptr);
9027 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009028 case WMA_LRO_CONFIG_CMD:
9029 wma_lro_config_cmd(wma_handle,
Dhanashri Atre09828f12016-11-13 10:36:58 -08009030 (struct cdp_lro_hash_config *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309031 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009032 break;
Ravi Joshi9e891ba2015-11-09 19:03:46 -08009033 case WMA_GW_PARAM_UPDATE_REQ:
Jeff Johnson38d0ce62019-02-22 17:05:14 -08009034 wma_set_gateway_params(wma_handle, msg->bodyptr);
Archana Ramachandran28ab4122016-03-08 16:17:14 -08009035 qdf_mem_free(msg->bodyptr);
Ryan Hsu3c8f79f2015-12-02 16:45:09 -08009036 break;
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +05309037 case WMA_SET_ADAPT_DWELLTIME_CONF_PARAMS:
9038 wma_send_adapt_dwelltime_params(wma_handle,
9039 (struct adaptive_dwelltime_params *)msg->bodyptr);
9040 qdf_mem_free(msg->bodyptr);
9041 break;
Sandeep Puligillae0875662016-02-12 16:09:21 -08009042 case WMA_HT40_OBSS_SCAN_IND:
9043 wma_send_ht40_obss_scanind(wma_handle,
9044 (struct obss_ht40_scanind *)msg->bodyptr);
9045 qdf_mem_free(msg->bodyptr);
9046 break;
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -07009047 case WMA_ADD_BCN_FILTER_CMDID:
9048 wma_add_beacon_filter(wma_handle, msg->bodyptr);
9049 qdf_mem_free(msg->bodyptr);
9050 break;
9051 case WMA_REMOVE_BCN_FILTER_CMDID:
9052 wma_remove_beacon_filter(wma_handle, msg->bodyptr);
9053 qdf_mem_free(msg->bodyptr);
9054 break;
Nachiket Kukadee547a482018-05-22 16:43:30 +05309055 case WDA_APF_GET_CAPABILITIES_REQ:
9056 wma_get_apf_capabilities(wma_handle);
Arun Khandavalli2476ef52016-04-26 20:19:43 +05309057 break;
Manjeet Singhf82ed072016-07-08 11:40:00 +05309058 case SIR_HAL_POWER_DBG_CMD:
9059 wma_process_hal_pwr_dbg_cmd(wma_handle,
9060 msg->bodyptr);
9061 qdf_mem_free(msg->bodyptr);
9062 break;
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05309063 case WMA_UPDATE_WEP_DEFAULT_KEY:
9064 wma_update_wep_default_key(wma_handle,
9065 (struct wep_update_default_key_idx *)msg->bodyptr);
9066 qdf_mem_free(msg->bodyptr);
9067 break;
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +05309068 case WMA_SEND_FREQ_RANGE_CONTROL_IND:
9069 wma_enable_disable_caevent_ind(wma_handle, msg->bodyval);
9070 break;
Agrawal, Ashish35b251d2016-09-08 19:21:03 +05309071 case SIR_HAL_UPDATE_TX_FAIL_CNT_TH:
9072 wma_update_tx_fail_cnt_th(wma_handle, msg->bodyptr);
9073 qdf_mem_free(msg->bodyptr);
9074 break;
Agrawal Ashishda3e9502016-09-21 17:43:51 +05309075 case SIR_HAL_LONG_RETRY_LIMIT_CNT:
9076 wma_update_long_retry_limit(wma_handle, msg->bodyptr);
9077 qdf_mem_free(msg->bodyptr);
9078 break;
9079 case SIR_HAL_SHORT_RETRY_LIMIT_CNT:
9080 wma_update_short_retry_limit(wma_handle, msg->bodyptr);
9081 qdf_mem_free(msg->bodyptr);
9082 break;
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05309083 case SIR_HAL_POWER_DEBUG_STATS_REQ:
9084 wma_process_power_debug_stats_req(wma_handle);
9085 break;
Arunk Khandavallica56d4b2018-11-29 15:46:00 +05309086 case WMA_BEACON_DEBUG_STATS_REQ:
9087 wma_process_beacon_debug_stats_req(wma_handle, msg->bodyptr);
9088 qdf_mem_free(msg->bodyptr);
9089 break;
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +05309090 case WMA_GET_RCPI_REQ:
9091 wma_get_rcpi_req(wma_handle,
9092 (struct sme_rcpi_req *)msg->bodyptr);
9093 qdf_mem_free(msg->bodyptr);
9094 break;
Yingying Tang95409972016-10-20 15:16:15 +08009095 case WMA_SET_WOW_PULSE_CMD:
9096 wma_send_wow_pulse_cmd(wma_handle,
9097 (struct wow_pulse_mode *)msg->bodyptr);
9098 qdf_mem_free(msg->bodyptr);
9099 break;
Nitesh Shahf9a09ff2017-05-22 15:46:25 +05309100 case WMA_SET_DBS_SCAN_SEL_CONF_PARAMS:
9101 wma_send_dbs_scan_selection_params(wma_handle,
9102 (struct wmi_dbs_scan_sel_params *)msg->bodyptr);
9103 qdf_mem_free(msg->bodyptr);
9104 break;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05309105 case WMA_SET_ARP_STATS_REQ:
9106 wma_set_arp_req_stats(wma_handle,
9107 (struct set_arp_stats_params *)msg->bodyptr);
9108 qdf_mem_free(msg->bodyptr);
9109 break;
9110 case WMA_GET_ARP_STATS_REQ:
9111 wma_get_arp_req_stats(wma_handle,
9112 (struct get_arp_stats_params *)msg->bodyptr);
9113 qdf_mem_free(msg->bodyptr);
9114 break;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05309115 case SIR_HAL_SET_DEL_PMKID_CACHE:
Jeff Johnson622aad62018-12-07 15:05:37 -08009116 wma_set_del_pmkid_cache(wma_handle, msg->bodyptr);
Ashish Kumar Dhanotiya36510832019-02-20 22:13:25 +05309117 if (msg->bodyptr) {
9118 qdf_mem_zero(msg->bodyptr,
9119 sizeof(struct wmi_unified_pmk_cache));
9120 qdf_mem_free(msg->bodyptr);
9121 }
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05309122 break;
9123 case SIR_HAL_HLP_IE_INFO:
9124 wma_roam_scan_send_hlp(wma_handle,
9125 (struct hlp_params *)msg->bodyptr);
9126 qdf_mem_free(msg->bodyptr);
9127 break;
Ganesh Kondabattini35739572017-06-21 16:26:39 +05309128 case WMA_SET_LIMIT_OFF_CHAN:
9129 wma_process_limit_off_chan(wma_handle, msg->bodyptr);
9130 qdf_mem_free(msg->bodyptr);
9131 break;
Arif Hussainee10f902017-12-27 16:30:17 -08009132 case WMA_OBSS_DETECTION_REQ:
9133 wma_send_obss_detection_cfg(wma_handle, msg->bodyptr);
9134 qdf_mem_free(msg->bodyptr);
9135 break;
Vignesh Viswanathan694e28e2018-01-18 20:53:57 +05309136 case WMA_INVOKE_NEIGHBOR_REPORT:
9137 wma_send_invoke_neighbor_report(wma_handle, msg->bodyptr);
9138 qdf_mem_free(msg->bodyptr);
9139 break;
Arif Hussain05fb4872018-01-03 16:02:55 -08009140 case WMA_OBSS_COLOR_COLLISION_REQ:
9141 wma_process_obss_color_collision_req(wma_handle, msg->bodyptr);
9142 qdf_mem_free(msg->bodyptr);
9143 break;
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +05309144 case WMA_GET_ROAM_SCAN_STATS:
9145 wma_get_roam_scan_stats(wma_handle, msg->bodyptr);
9146 qdf_mem_free(msg->bodyptr);
9147 break;
Visweswara Tanuku633976b2019-01-07 16:13:12 +05309148#ifdef WLAN_FEATURE_MOTION_DETECTION
9149 case WMA_SET_MOTION_DET_CONFIG:
9150 wma_set_motion_det_config(
9151 wma_handle,
9152 (struct sme_motion_det_cfg *)msg->bodyptr);
9153 qdf_mem_free(msg->bodyptr);
9154 break;
9155 case WMA_SET_MOTION_DET_ENABLE:
9156 wma_set_motion_det_enable(
9157 wma_handle,
9158 (struct sme_motion_det_en *)msg->bodyptr);
9159 qdf_mem_free(msg->bodyptr);
9160 break;
9161 case WMA_SET_MOTION_DET_BASE_LINE_CONFIG:
9162 wma_set_motion_det_base_line_config(
9163 wma_handle,
9164 (struct sme_motion_det_base_line_cfg *)msg->bodyptr);
9165 qdf_mem_free(msg->bodyptr);
9166 break;
9167 case WMA_SET_MOTION_DET_BASE_LINE_ENABLE:
9168 wma_set_motion_det_base_line_enable(
9169 wma_handle,
9170 (struct sme_motion_det_base_line_en *)msg->bodyptr);
9171 qdf_mem_free(msg->bodyptr);
9172 break;
9173#endif /* WLAN_FEATURE_MOTION_DETECTION */
Visweswara Tanuku025f5862019-01-08 17:35:33 +05309174#ifdef FW_THERMAL_THROTTLE_SUPPORT
9175 case WMA_SET_THERMAL_THROTTLE_CFG:
9176 if (!wma_handle->thermal_mgmt_info.thermalMgmtEnabled)
9177 wmi_unified_thermal_mitigation_param_cmd_send(
9178 wma_handle->wmi_handle, msg->bodyptr);
9179 else
9180 qdf_status = QDF_STATUS_E_INVAL;
9181 qdf_mem_free(msg->bodyptr);
9182 break;
9183 case WMA_SET_THERMAL_MGMT:
9184 if (!wma_handle->thermal_mgmt_info.thermalMgmtEnabled)
9185 wma_set_thermal_mgmt(
9186 wma_handle,
9187 *((t_thermal_cmd_params *)msg->bodyptr));
9188 else
9189 qdf_status = QDF_STATUS_E_INVAL;
9190 qdf_mem_free(msg->bodyptr);
9191 break;
9192#endif /* FW_THERMAL_THROTTLE_SUPPORT */
Arun Kumar Khandavallideda5a82019-03-11 15:32:19 +05309193#ifdef WLAN_MWS_INFO_DEBUGFS
9194 case WMA_GET_MWS_COEX_INFO_REQ:
9195 wma_get_mws_coex_info_req(wma_handle, msg->bodyptr);
9196 qdf_mem_free(msg->bodyptr);
9197 break;
9198#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009199 default:
Sandeep Puligilla1f1e4002018-08-18 12:15:01 -07009200 WMA_LOGD("Unhandled WMA message of type %d", msg->type);
Dustin Brown86534fb2017-01-24 14:28:20 -08009201 if (msg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309202 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009203 }
9204end:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309205 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009206}
9207
Krunal Sonid32c6bc2016-10-18 18:00:21 -07009208QDF_STATUS wma_mc_process_handler(struct scheduler_msg *msg)
9209{
Jeff Johnson5be42ab2017-09-13 09:10:39 -07009210 return wma_mc_process_msg(msg);
Krunal Sonid32c6bc2016-10-18 18:00:21 -07009211}
Krunal Sonid32c6bc2016-10-18 18:00:21 -07009212
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009213/**
9214 * wma_log_completion_timeout() - Log completion timeout
9215 * @data: Timeout handler data
9216 *
9217 * This function is called when log completion timer expires
9218 *
9219 * Return: None
9220 */
9221void wma_log_completion_timeout(void *data)
9222{
9223 tp_wma_handle wma_handle;
9224
Yeshwanth Sriram Guntukacbe61442018-08-23 18:08:44 +05309225 WMA_LOGD("%s: Timeout occurred for log completion command", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009226
9227 wma_handle = (tp_wma_handle) data;
9228 if (!wma_handle)
9229 WMA_LOGE("%s: Invalid WMA handle", __func__);
9230
9231 /* Though we did not receive any event from FW,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07009232 * we can flush whatever logs we have with us
9233 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009234 cds_logging_set_fw_flush_complete();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009235}
9236
9237/**
Manishekar Chandrasekaranb82554d2016-08-04 17:46:46 +05309238 * wma_map_pcl_weights() - Map PCL weights
9239 * @pcl_weight: Internal PCL weights
9240 *
9241 * Maps the internal weights of PCL to the weights needed by FW
9242 *
9243 * Return: Mapped channel weight of type wmi_pcl_chan_weight
9244 */
9245static wmi_pcl_chan_weight wma_map_pcl_weights(uint32_t pcl_weight)
9246{
9247 switch (pcl_weight) {
9248 case WEIGHT_OF_GROUP1_PCL_CHANNELS:
9249 return WMI_PCL_WEIGHT_VERY_HIGH;
9250 case WEIGHT_OF_GROUP2_PCL_CHANNELS:
9251 return WMI_PCL_WEIGHT_HIGH;
9252 case WEIGHT_OF_GROUP3_PCL_CHANNELS:
9253 return WMI_PCL_WEIGHT_MEDIUM;
9254 case WEIGHT_OF_NON_PCL_CHANNELS:
9255 return WMI_PCL_WEIGHT_LOW;
9256 default:
9257 return WMI_PCL_WEIGHT_DISALLOW;
9258 }
9259}
9260
9261/**
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05309262 * wma_send_pdev_set_pcl_cmd() - Send WMI_SOC_SET_PCL_CMDID to FW
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009263 * @wma_handle: WMA handle
9264 * @msg: PCL structure containing the PCL and the number of channels
9265 *
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05309266 * WMI_PDEV_SET_PCL_CMDID provides a Preferred Channel List (PCL) to the WLAN
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009267 * firmware. The DBS Manager is the consumer of this information in the WLAN
9268 * firmware. The channel list will be used when a Virtual DEVice (VDEV) needs
9269 * to migrate to a new channel without host driver involvement. An example of
9270 * this behavior is Legacy Fast Roaming (LFR 3.0). Generally, the host will
9271 * manage the channel selection without firmware involvement.
9272 *
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05309273 * WMI_PDEV_SET_PCL_CMDID will carry only the weight list and not the actual
9274 * channel list. The weights corresponds to the channels sent in
9275 * WMI_SCAN_CHAN_LIST_CMDID. The channels from PCL would be having a higher
9276 * weightage compared to the non PCL channels.
9277 *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009278 * Return: Success if the cmd is sent successfully to the firmware
9279 */
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05309280QDF_STATUS wma_send_pdev_set_pcl_cmd(tp_wma_handle wma_handle,
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -07009281 struct set_pcl_req *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009282{
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05309283 uint32_t i;
9284 QDF_STATUS status;
9285
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009286 if (!wma_handle) {
9287 WMA_LOGE("%s: WMA handle is NULL. Cannot issue command",
9288 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309289 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009290 }
9291
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05309292 for (i = 0; i < wma_handle->saved_chan.num_channels; i++) {
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -07009293 msg->chan_weights.saved_chan_list[i] =
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05309294 wma_handle->saved_chan.channel_list[i];
9295 }
9296
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -07009297 msg->chan_weights.saved_num_chan = wma_handle->saved_chan.num_channels;
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07009298 status = policy_mgr_get_valid_chan_weights(wma_handle->psoc,
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -07009299 (struct policy_mgr_pcl_chan_weights *)&msg->chan_weights);
Manishekar Chandrasekaranb82554d2016-08-04 17:46:46 +05309300
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -07009301 for (i = 0; i < msg->chan_weights.saved_num_chan; i++) {
9302 msg->chan_weights.weighed_valid_list[i] =
9303 wma_map_pcl_weights(
9304 msg->chan_weights.weighed_valid_list[i]);
Sandeep Puligilla819d94f2017-10-10 18:33:56 -07009305 /* Dont allow roaming on 2G when 5G_ONLY configured */
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -07009306 if (((wma_handle->bandcapability == BAND_5G) ||
9307 (msg->band == BAND_5G)) &&
9308 (WLAN_REG_IS_24GHZ_CH(
9309 msg->chan_weights.saved_chan_list[i]))) {
9310 msg->chan_weights.weighed_valid_list[i] =
Sandeep Puligilla819d94f2017-10-10 18:33:56 -07009311 WEIGHT_OF_DISALLOWED_CHANNELS;
9312 }
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -07009313 if ((msg->band == BAND_2G) &&
9314 WLAN_REG_IS_5GHZ_CH(msg->chan_weights.saved_chan_list[i]))
9315 msg->chan_weights.weighed_valid_list[i] =
9316 WEIGHT_OF_DISALLOWED_CHANNELS;
Manishekar Chandrasekaranb82554d2016-08-04 17:46:46 +05309317 WMA_LOGD("%s: chan:%d weight[%d]=%d", __func__,
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -07009318 msg->chan_weights.saved_chan_list[i], i,
9319 msg->chan_weights.weighed_valid_list[i]);
Manishekar Chandrasekaranb82554d2016-08-04 17:46:46 +05309320 }
9321
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05309322 if (!QDF_IS_STATUS_SUCCESS(status)) {
9323 WMA_LOGE("%s: Error in creating weighed pcl", __func__);
9324 return status;
9325 }
9326
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -07009327 if (wmi_unified_pdev_set_pcl_cmd(wma_handle->wmi_handle,
9328 &msg->chan_weights))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309329 return QDF_STATUS_E_FAILURE;
Govind Singhf25a0f12016-03-08 16:09:48 +05309330
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309331 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009332}
9333
9334/**
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05309335 * wma_send_pdev_set_hw_mode_cmd() - Send WMI_PDEV_SET_HW_MODE_CMDID to FW
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009336 * @wma_handle: WMA handle
9337 * @msg: Structure containing the following parameters
9338 *
9339 * - hw_mode_index: The HW_Mode field is a enumerated type that is selected
9340 * from the HW_Mode table, which is returned in the WMI_SERVICE_READY_EVENTID.
9341 *
9342 * Provides notification to the WLAN firmware that host driver is requesting a
9343 * HardWare (HW) Mode change. This command is needed to support iHelium in the
9344 * configurations that include the Dual Band Simultaneous (DBS) feature.
9345 *
9346 * Return: Success if the cmd is sent successfully to the firmware
9347 */
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05309348QDF_STATUS wma_send_pdev_set_hw_mode_cmd(tp_wma_handle wma_handle,
Dustin Brownec2c92e2017-07-26 11:13:49 -07009349 struct policy_mgr_hw_mode *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009350{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009351 struct sir_set_hw_mode_resp *param;
Tushnim Bhattacharyya86294892017-10-25 16:29:11 -07009352 struct wma_target_req *timeout_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009353
9354 if (!wma_handle) {
9355 WMA_LOGE("%s: WMA handle is NULL. Cannot issue command",
9356 __func__);
9357 /* Handle is NULL. Will not be able to send failure
9358 * response as well
9359 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309360 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009361 }
9362
9363 if (!msg) {
9364 WMA_LOGE("%s: Set HW mode param is NULL", __func__);
9365 /* Lets try to free the active command list */
9366 goto fail;
9367 }
9368
Dustin Brownec2c92e2017-07-26 11:13:49 -07009369 wma_acquire_wakelock(&wma_handle->wmi_cmd_rsp_wake_lock,
9370 WMA_VDEV_HW_MODE_REQUEST_TIMEOUT);
Govind Singhf25a0f12016-03-08 16:09:48 +05309371 if (wmi_unified_soc_set_hw_mode_cmd(wma_handle->wmi_handle,
Dustin Brownec2c92e2017-07-26 11:13:49 -07009372 msg->hw_mode_index)) {
9373 wma_release_wakelock(&wma_handle->wmi_cmd_rsp_wake_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009374 goto fail;
Krunal Sonicebcc292017-06-14 19:59:20 -07009375 }
Tushnim Bhattacharyya86294892017-10-25 16:29:11 -07009376 timeout_msg = wma_fill_hold_req(wma_handle, 0,
9377 SIR_HAL_PDEV_SET_HW_MODE,
9378 WMA_PDEV_SET_HW_MODE_RESP, NULL,
9379 WMA_VDEV_HW_MODE_REQUEST_TIMEOUT - 1);
9380 if (!timeout_msg) {
9381 WMA_LOGE("Failed to allocate request for SIR_HAL_PDEV_SET_HW_MODE");
9382 wma_remove_req(wma_handle, 0, WMA_PDEV_SET_HW_MODE_RESP);
9383 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009384
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309385 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009386fail:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309387 param = qdf_mem_malloc(sizeof(*param));
Arif Hussain157263f2018-10-03 13:07:15 -07009388 if (!param)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309389 return QDF_STATUS_E_NULL_VALUE;
Arif Hussain157263f2018-10-03 13:07:15 -07009390
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009391 param->status = SET_HW_MODE_STATUS_ECANCELED;
9392 param->cfgd_hw_mode_index = 0;
9393 param->num_vdev_mac_entries = 0;
9394 WMA_LOGE("%s: Sending HW mode fail response to LIM", __func__);
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05309395 wma_send_msg(wma_handle, SIR_HAL_PDEV_SET_HW_MODE_RESP,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009396 (void *) param, 0);
Abhishek Singhd93a0b22018-10-30 17:04:56 +05309397 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009398}
9399
9400/**
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05309401 * wma_send_pdev_set_dual_mac_config() - Set dual mac config to FW
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009402 * @wma_handle: WMA handle
9403 * @msg: Dual MAC config parameters
9404 *
9405 * Configures WLAN firmware with the dual MAC features
9406 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309407 * Return: QDF_STATUS. 0 on success.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009408 */
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05309409QDF_STATUS wma_send_pdev_set_dual_mac_config(tp_wma_handle wma_handle,
Srinivas Girigowdaeb6ecf32018-02-15 17:04:22 -08009410 struct policy_mgr_dual_mac_config *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009411{
Manishekar Chandrasekaran91152df2016-04-25 14:29:27 +05309412 QDF_STATUS status;
Abhishek Singhd93a0b22018-10-30 17:04:56 +05309413 struct wma_target_req *req_msg;
9414 struct sir_dual_mac_config_resp *resp;
Manishekar Chandrasekaran91152df2016-04-25 14:29:27 +05309415
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009416 if (!wma_handle) {
9417 WMA_LOGE("%s: WMA handle is NULL. Cannot issue command",
9418 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309419 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009420 }
9421
9422 if (!msg) {
9423 WMA_LOGE("%s: Set dual mode config is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309424 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009425 }
9426
Krunal Sonia5ccb802017-07-03 12:59:40 -07009427 /*
9428 * aquire the wake lock here and release it in response handler function
9429 * In error condition, release the wake lock right away
9430 */
9431 wma_acquire_wakelock(&wma_handle->wmi_cmd_rsp_wake_lock,
Abhishek Singhd1f21c72019-01-21 15:16:34 +05309432 WMA_VDEV_PLCY_MGR_WAKE_LOCK_TIMEOUT);
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05309433 status = wmi_unified_pdev_set_dual_mac_config_cmd(
9434 wma_handle->wmi_handle,
Srinivas Girigowdaeb6ecf32018-02-15 17:04:22 -08009435 (struct policy_mgr_dual_mac_config *)msg);
Manishekar Chandrasekaran91152df2016-04-25 14:29:27 +05309436 if (QDF_IS_STATUS_ERROR(status)) {
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05309437 WMA_LOGE("%s: Failed to send WMI_PDEV_SET_DUAL_MAC_CONFIG_CMDID: %d",
Manishekar Chandrasekaran91152df2016-04-25 14:29:27 +05309438 __func__, status);
Krunal Sonia5ccb802017-07-03 12:59:40 -07009439 wma_release_wakelock(&wma_handle->wmi_cmd_rsp_wake_lock);
Abhishek Singhd93a0b22018-10-30 17:04:56 +05309440 goto fail;
Manishekar Chandrasekaran91152df2016-04-25 14:29:27 +05309441 }
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07009442 policy_mgr_update_dbs_req_config(wma_handle->psoc,
9443 msg->scan_config, msg->fw_mode_config);
Govind Singhf25a0f12016-03-08 16:09:48 +05309444
Abhishek Singhd93a0b22018-10-30 17:04:56 +05309445 req_msg = wma_fill_hold_req(wma_handle, 0,
9446 SIR_HAL_PDEV_DUAL_MAC_CFG_REQ,
9447 WMA_PDEV_MAC_CFG_RESP, NULL,
9448 WMA_VDEV_DUAL_MAC_CFG_TIMEOUT);
9449 if (!req_msg) {
9450 WMA_LOGE("Failed to allocate request for SIR_HAL_PDEV_DUAL_MAC_CFG_REQ");
9451 wma_remove_req(wma_handle, 0, WMA_PDEV_MAC_CFG_RESP);
9452 }
9453
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309454 return QDF_STATUS_SUCCESS;
Abhishek Singhd93a0b22018-10-30 17:04:56 +05309455
9456fail:
9457 resp = qdf_mem_malloc(sizeof(*resp));
9458 if (!resp)
9459 return QDF_STATUS_E_NULL_VALUE;
9460
9461 resp->status = SET_HW_MODE_STATUS_ECANCELED;
9462 WMA_LOGE("%s: Sending failure response to LIM", __func__);
9463 wma_send_msg(wma_handle, SIR_HAL_PDEV_MAC_CFG_RESP, (void *) resp, 0);
9464 return QDF_STATUS_E_FAILURE;
9465
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009466}
9467
9468/**
Archana Ramachandrana20ef812015-11-13 16:12:13 -08009469 * wma_send_pdev_set_antenna_mode() - Set antenna mode to FW
9470 * @wma_handle: WMA handle
9471 * @msg: Antenna mode parameters
9472 *
9473 * Send WMI_PDEV_SET_ANTENNA_MODE_CMDID to FW requesting to
9474 * modify the number of TX/RX chains from host
9475 *
9476 * Return: QDF_STATUS. 0 on success.
9477 */
9478QDF_STATUS wma_send_pdev_set_antenna_mode(tp_wma_handle wma_handle,
9479 struct sir_antenna_mode_param *msg)
9480{
9481 wmi_pdev_set_antenna_mode_cmd_fixed_param *cmd;
9482 wmi_buf_t buf;
9483 uint32_t len;
9484 QDF_STATUS status = QDF_STATUS_SUCCESS;
9485 struct sir_antenna_mode_resp *param;
9486
9487 if (!wma_handle) {
9488 WMA_LOGE("%s: WMA handle is NULL. Cannot issue command",
9489 __func__);
9490 return QDF_STATUS_E_NULL_VALUE;
9491 }
9492
9493 if (!msg) {
9494 WMA_LOGE("%s: Set antenna mode param is NULL", __func__);
9495 return QDF_STATUS_E_NULL_VALUE;
9496 }
9497
9498 len = sizeof(*cmd);
9499
9500 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
9501 if (!buf) {
Archana Ramachandrana20ef812015-11-13 16:12:13 -08009502 status = QDF_STATUS_E_NOMEM;
9503 goto resp;
9504 }
9505
9506 cmd = (wmi_pdev_set_antenna_mode_cmd_fixed_param *) wmi_buf_data(buf);
9507 WMITLV_SET_HDR(&cmd->tlv_header,
9508 WMITLV_TAG_STRUC_wmi_pdev_set_antenna_mode_cmd_fixed_param,
9509 WMITLV_GET_STRUCT_TLVLEN(
9510 wmi_pdev_set_antenna_mode_cmd_fixed_param));
9511
9512 cmd->pdev_id = WMI_PDEV_ID_SOC;
9513 /* Bits 0-15 is num of RX chains 16-31 is num of TX chains */
9514 cmd->num_txrx_chains = msg->num_rx_chains;
9515 cmd->num_txrx_chains |= (msg->num_tx_chains << 16);
9516
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07009517 WMA_LOGD("%s: Num of chains TX: %d RX: %d txrx_chains: 0x%x",
Archana Ramachandrana20ef812015-11-13 16:12:13 -08009518 __func__, msg->num_tx_chains,
9519 msg->num_rx_chains, cmd->num_txrx_chains);
9520
9521 if (wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
9522 WMI_PDEV_SET_ANTENNA_MODE_CMDID)) {
Archana Ramachandrana20ef812015-11-13 16:12:13 -08009523 wmi_buf_free(buf);
9524 status = QDF_STATUS_E_FAILURE;
9525 goto resp;
9526 }
9527 status = QDF_STATUS_SUCCESS;
9528
9529resp:
9530 param = qdf_mem_malloc(sizeof(*param));
Arif Hussain157263f2018-10-03 13:07:15 -07009531 if (!param)
Archana Ramachandrana20ef812015-11-13 16:12:13 -08009532 return QDF_STATUS_E_NOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07009533
Archana Ramachandrana20ef812015-11-13 16:12:13 -08009534 param->status = (status) ?
9535 SET_ANTENNA_MODE_STATUS_ECANCELED :
9536 SET_ANTENNA_MODE_STATUS_OK;
9537 WMA_LOGE("%s: Send antenna mode resp to LIM status: %d",
9538 __func__, param->status);
9539 wma_send_msg(wma_handle, SIR_HAL_SOC_ANTENNA_MODE_RESP,
9540 (void *) param, 0);
9541 return status;
9542}
9543
9544/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009545 * wma_crash_inject() - sends command to FW to simulate crash
9546 * @wma_handle: pointer of WMA context
9547 * @type: subtype of the command
9548 * @delay_time_ms: time in milliseconds for FW to delay the crash
9549 *
9550 * This function will send a command to FW in order to simulate different
9551 * kinds of FW crashes.
9552 *
Govind Singhd76a5b02016-03-08 15:12:14 +05309553 * Return: QDF_STATUS_SUCCESS for success or error code
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009554 */
Yu Wang46082dc2017-09-19 12:25:38 +08009555QDF_STATUS wma_crash_inject(WMA_HANDLE wma_handle, uint32_t type,
9556 uint32_t delay_time_ms)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009557{
Govind Singhd76a5b02016-03-08 15:12:14 +05309558 struct crash_inject param;
Yu Wang46082dc2017-09-19 12:25:38 +08009559 tp_wma_handle wma = (tp_wma_handle)wma_handle;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07009560
Govind Singhd76a5b02016-03-08 15:12:14 +05309561 param.type = type;
9562 param.delay_time_ms = delay_time_ms;
Yu Wang46082dc2017-09-19 12:25:38 +08009563 return wmi_crash_inject(wma->wmi_handle, &param);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009564}
Govind Singhd76a5b02016-03-08 15:12:14 +05309565
Manjunathappa Prakash7b0ad462018-04-15 00:37:16 -07009566#ifdef RECEIVE_OFFLOAD
Dhanashri Atre09828f12016-11-13 10:36:58 -08009567int wma_lro_init(struct cdp_lro_hash_config *lro_config)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009568{
Rajeev Kumarb60abe42017-01-21 15:39:31 -08009569 struct scheduler_msg msg = {0};
Dhanashri Atre09828f12016-11-13 10:36:58 -08009570 struct cdp_lro_hash_config *iwcmd;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009571
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309572 iwcmd = qdf_mem_malloc(sizeof(*iwcmd));
Arif Hussain157263f2018-10-03 13:07:15 -07009573 if (!iwcmd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009574 return -ENOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009575
9576 *iwcmd = *lro_config;
9577
9578 msg.type = WMA_LRO_CONFIG_CMD;
9579 msg.reserved = 0;
9580 msg.bodyptr = iwcmd;
9581
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309582 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia00861f02018-08-28 19:16:12 +05309583 scheduler_post_message(QDF_MODULE_ID_WMA,
9584 QDF_MODULE_ID_WMA,
9585 QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309586 qdf_mem_free(iwcmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009587 return -EAGAIN;
9588 }
9589
9590 WMA_LOGD("sending the LRO configuration to the fw");
9591 return 0;
9592}
9593#endif
Leo Chang96464902016-10-28 11:10:54 -07009594
Ashish Kumar Dhanotiyab28338c2017-07-21 20:12:34 +05309595QDF_STATUS wma_configure_smps_params(uint32_t vdev_id, uint32_t param_id,
9596 uint32_t param_val)
9597{
9598 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
9599 int smps_cmd_value;
9600 int status = QDF_STATUS_E_INVAL;
9601
9602 if (!wma) {
9603 WMA_LOGE("%s: Failed to get wma", __func__);
9604 return status;
9605 }
9606
9607 smps_cmd_value = param_id << WMI_SMPS_PARAM_VALUE_S;
9608 smps_cmd_value = smps_cmd_value | param_val;
9609
9610 status = wma_set_smps_params(wma, vdev_id, smps_cmd_value);
9611 if (status)
9612 WMA_LOGE("Failed to set SMPS Param");
9613
9614 return status;
9615}
9616
Leo Chang96464902016-10-28 11:10:54 -07009617
Nachiket Kukadeaaf8a712017-07-27 19:15:36 +05309618/**
9619 * wma_config_bmiss_bcnt_params() - set bmiss config parameters
9620 * @vdev_id: virtual device for the command
9621 * @first_cnt: bmiss first value
9622 * @final_cnt: bmiss final value
9623 *
9624 * Return: QDF_STATUS_SUCCESS or non-zero on failure
9625 */
9626QDF_STATUS wma_config_bmiss_bcnt_params(uint32_t vdev_id, uint32_t first_cnt,
9627 uint32_t final_cnt)
9628{
9629 tp_wma_handle wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
9630 int status = QDF_STATUS_E_INVAL;
9631
9632 if (!wma_handle) {
9633 WMA_LOGE("%s: Failed to get wma", __func__);
9634 return status;
9635 }
9636
9637 status = wma_roam_scan_bmiss_cnt(wma_handle, first_cnt, final_cnt,
9638 vdev_id);
9639
9640 if (status)
9641 WMA_LOGE("Failed to set Bmiss Param");
9642
9643 return status;
9644}
9645