blob: a9c6e83ce3f4a00e261dd08ec37bb69dba38ee77 [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
Jeff Johnson199e7012016-12-16 14:55:42 -08002 * Copyright (c) 2013-2017 The Linux Foundation. All rights reserved.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
20 */
21
22/*
23 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
28/**
29 * DOC: wma_main.c
30 *
31 * This file contains wma initialization and FW exchange
32 * related functions.
33 */
34
35/* Header files */
36
37#include "wma.h"
38#include "wma_api.h"
39#include "cds_api.h"
40#include "wmi_unified_api.h"
41#include "wlan_qct_sys.h"
42#include "wni_api.h"
43#include "ani_global.h"
44#include "wmi_unified.h"
Rajeev Kumarda2444c2017-01-10 22:42:07 -080045#include "service_ready_event_handler.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080046#include "wni_cfg.h"
47#include "cfg_api.h"
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +053048#if defined(CONFIG_HL_SUPPORT)
49#include "wlan_tgt_def_config_hl.h"
50#else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080051#include "wlan_tgt_def_config.h"
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +053052#endif
Nirav Shahcbc6d722016-03-01 16:24:53 +053053#include "qdf_nbuf.h"
Anurag Chouhan6d760662016-02-20 16:05:43 +053054#include "qdf_types.h"
Anurag Chouhan600c3a02016-03-01 10:33:54 +053055#include "qdf_mem.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080056#include "wma_types.h"
57#include "lim_api.h"
58#include "lim_session_utils.h"
59
60#include "cds_utils.h"
61
62#if !defined(REMOVE_PKT_LOG)
63#include "pktlog_ac.h"
64#endif /* REMOVE_PKT_LOG */
65
66#include "dbglog_host.h"
Govind Singhd76a5b02016-03-08 15:12:14 +053067#include "wmi_version_whitelist.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080068#include "csr_api.h"
69#include "ol_fw.h"
70
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080071#include "wma_internal.h"
72
73#include "wma_ocb.h"
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -070074#include "wlan_policy_mgr_api.h"
Dhanashri Atreb08959a2016-03-01 17:28:03 -080075#include "cdp_txrx_cfg.h"
76#include "cdp_txrx_flow_ctrl_legacy.h"
77#include "cdp_txrx_flow_ctrl_v2.h"
78#include "cdp_txrx_ipa.h"
Leo Chang96464902016-10-28 11:10:54 -070079#include "cdp_txrx_misc.h"
Jeff Johnson6136fb92017-03-30 15:21:49 -070080#include "wma_fips_api.h"
Deepak Dhamdhere13230d32016-05-26 00:46:53 -070081#include "wma_nan_datapath.h"
Frank Liu65b17d92016-11-23 15:58:44 +080082#include "wlan_lmac_if_def.h"
83#include "wlan_lmac_if_api.h"
Mukul Sharmac3e7a782017-02-03 12:16:11 +053084#include "target_if.h"
Mukul Sharmadad267e2017-02-04 13:25:34 +053085#include "wlan_global_lmac_if_api.h"
Mukul Sharma3d36c392017-01-18 18:39:12 +053086#include "target_if_pmo.h"
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -070087#include "wma_he.h"
Mukul Sharma6411bb82017-03-01 15:57:07 +053088#include "wlan_pmo_obj_mgmt_api.h"
Frank Liu65b17d92016-11-23 15:58:44 +080089
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070090#include "wlan_reg_tgt_api.h"
91#include "wlan_reg_services_api.h"
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -080092#include <cdp_txrx_handle.h>
Tushnim Bhattacharyya45ed04f2017-03-15 10:15:05 -070093#include <wlan_pmo_ucfg_api.h>
Naveen Rawat4efe41b2017-04-29 16:23:14 -070094#include "wifi_pos_api.h"
95#include "hif_main.h"
Tushnim Bhattacharyya45ed04f2017-03-15 10:15:05 -070096
Agrawal Ashishb0aa0752017-04-21 19:31:10 +053097#define WMA_LOG_COMPLETION_TIMER 3000 /* 3 seconds */
Rajeev Kumar Sirasanagandla47873002016-09-09 13:46:09 +053098#define WMI_TLV_HEADROOM 128
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -070099uint8_t *mac_trace_get_wma_msg_string(uint16_t wmaMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800100static uint32_t g_fw_wlan_feat_caps;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800101/**
102 * wma_get_fw_wlan_feat_caps() - get fw feature capablity
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -0700103 * @feature: feature enum value
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800104 *
105 * Return: true/false
106 */
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -0700107bool wma_get_fw_wlan_feat_caps(enum cap_bitmap feature)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800108{
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -0700109 return (g_fw_wlan_feat_caps & (1 << feature)) ? true : false;
110}
111
112/**
113 * wma_set_fw_wlan_feat_caps() - set fw feature capablity
114 * @feature: feature enum value
115 *
116 * Return: None
117 */
118void wma_set_fw_wlan_feat_caps(enum cap_bitmap feature)
119{
120 g_fw_wlan_feat_caps |= (1 << feature);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800121}
122
123/**
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +0530124 * wma_service_ready_ext_evt_timeout() - Service ready extended event timeout
125 * @data: Timeout handler data
126 *
127 * This function is called when the FW fails to send WMI_SERVICE_READY_EXT_EVENT
128 * message
129 *
130 * Return: None
131 */
132static void wma_service_ready_ext_evt_timeout(void *data)
133{
134 tp_wma_handle wma_handle;
135
136 WMA_LOGA("%s: Timeout waiting for WMI_SERVICE_READY_EXT_EVENT",
137 __func__);
138
139 wma_handle = (tp_wma_handle) data;
140
141 if (!wma_handle) {
142 WMA_LOGE("%s: Invalid WMA handle", __func__);
143 goto end;
144 }
145
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +0530146end:
Naveen Rawatac39a102016-10-07 10:58:29 -0700147 /* Assert here. Panic is being called in insmod thread */
148 QDF_ASSERT(0);
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +0530149}
150
151/**
Komal Seelam02d09342016-02-23 18:03:19 +0530152 * wma_get_ini_handle() - API to get WMA ini info handle
153 * @wma: WMA Handle
154 *
155 * Returns the pointer to WMA ini structure.
156 * Return: struct wma_ini_config
157 */
158struct wma_ini_config *wma_get_ini_handle(tp_wma_handle wma)
159{
160 if (!wma) {
161 WMA_LOGE("%s: Invalid WMA context\n", __func__);
162 return NULL;
163 }
164
165 return &wma->ini_config;
166}
167
168#define MAX_SUPPORTED_PEERS_REV1_1 14
169#define MAX_SUPPORTED_PEERS_REV1_3 32
170#define MIN_NO_OF_PEERS 1
171
172/**
173 * wma_get_number_of_peers_supported - API to query for number of peers
174 * supported
175 * @wma: WMA Handle
176 *
177 * Return: Max Number of Peers Supported
178 */
179static uint8_t wma_get_number_of_peers_supported(tp_wma_handle wma)
180{
181 struct hif_target_info *tgt_info;
182 struct wma_ini_config *cfg = wma_get_ini_handle(wma);
183 uint8_t max_no_of_peers = cfg ? cfg->max_no_of_peers : MIN_NO_OF_PEERS;
Anurag Chouhan6d760662016-02-20 16:05:43 +0530184 struct hif_opaque_softc *scn = cds_get_context(QDF_MODULE_ID_HIF);
Komal Seelam02d09342016-02-23 18:03:19 +0530185
186 if (!scn) {
187 WMA_LOGE("%s: Invalid wma handle", __func__);
188 return 0;
189 }
190
191 tgt_info = hif_get_target_info_handle(scn);
192
193 switch (tgt_info->target_version) {
194 case AR6320_REV1_1_VERSION:
195 if (max_no_of_peers > MAX_SUPPORTED_PEERS_REV1_1)
196 max_no_of_peers = MAX_SUPPORTED_PEERS_REV1_1;
197 break;
198 default:
199 if (max_no_of_peers > MAX_SUPPORTED_PEERS_REV1_3)
200 max_no_of_peers = MAX_SUPPORTED_PEERS_REV1_3;
201 break;
202 }
203
204 return max_no_of_peers;
205}
206
207/**
bings6b3614e2017-02-21 10:18:36 +0800208 * wma_get_number_of_tids_supported - API to query for number of tids supported
209 * @no_of_peers_supported: Number of peer supported
210 *
211 * Return: Max number of tids supported
212 */
213#if defined(CONFIG_HL_SUPPORT)
214static uint32_t wma_get_number_of_tids_supported(uint8_t no_of_peers_supported)
215{
216 return 4 * no_of_peers_supported;
217}
218#else
219static uint32_t wma_get_number_of_tids_supported(uint8_t no_of_peers_supported)
220{
221 return 2 * (no_of_peers_supported + CFG_TGT_NUM_VDEV + 2);
222}
223#endif
224
225/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800226 * wma_set_default_tgt_config() - set default tgt config
227 * @wma_handle: wma handle
228 *
229 * Return: none
230 */
231static void wma_set_default_tgt_config(tp_wma_handle wma_handle)
232{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800233 uint8_t no_of_peers_supported;
Mukul Sharmab10c8c72017-11-02 17:25:59 +0530234 target_resource_config tgt_cfg;
235
236 qdf_mem_zero(&tgt_cfg, sizeof(tgt_cfg));
237 tgt_cfg.num_vdevs = CFG_TGT_NUM_VDEV;
238 tgt_cfg.num_peers = CFG_TGT_NUM_PEERS + CFG_TGT_NUM_VDEV + 2;
239 tgt_cfg.num_offload_peers = CFG_TGT_NUM_OFFLOAD_PEERS;
240 tgt_cfg.num_offload_reorder_buffs = CFG_TGT_NUM_OFFLOAD_REORDER_BUFFS;
241 tgt_cfg.num_peer_keys = CFG_TGT_NUM_PEER_KEYS;
242 tgt_cfg.num_tids = CFG_TGT_NUM_TIDS;
243 tgt_cfg.ast_skid_limit = CFG_TGT_AST_SKID_LIMIT;
244 tgt_cfg.tx_chain_mask = CFG_TGT_DEFAULT_TX_CHAIN_MASK;
245 tgt_cfg.rx_chain_mask = CFG_TGT_DEFAULT_RX_CHAIN_MASK;
246 tgt_cfg.rx_timeout_pri[0] = CFG_TGT_RX_TIMEOUT_LO_PRI;
247 tgt_cfg.rx_timeout_pri[1] = CFG_TGT_RX_TIMEOUT_LO_PRI;
248 tgt_cfg.rx_timeout_pri[2] = CFG_TGT_RX_TIMEOUT_LO_PRI;
249 tgt_cfg.rx_timeout_pri[3] = CFG_TGT_RX_TIMEOUT_HI_PRI;
250 tgt_cfg.rx_decap_mode = CFG_TGT_RX_DECAP_MODE;
251 tgt_cfg.scan_max_pending_req = CFG_TGT_DEFAULT_SCAN_MAX_REQS;
252 tgt_cfg.bmiss_offload_max_vdev = CFG_TGT_DEFAULT_BMISS_OFFLOAD_MAX_VDEV;
253 tgt_cfg.roam_offload_max_vdev = CFG_TGT_DEFAULT_ROAM_OFFLOAD_MAX_VDEV;
254 tgt_cfg.roam_offload_max_ap_profiles =
255 CFG_TGT_DEFAULT_ROAM_OFFLOAD_MAX_PROFILES;
256 tgt_cfg.num_mcast_groups = CFG_TGT_DEFAULT_NUM_MCAST_GROUPS;
257 tgt_cfg.num_mcast_table_elems = CFG_TGT_DEFAULT_NUM_MCAST_TABLE_ELEMS;
258 tgt_cfg.mcast2ucast_mode = CFG_TGT_DEFAULT_MCAST2UCAST_MODE;
259 tgt_cfg.tx_dbg_log_size = CFG_TGT_DEFAULT_TX_DBG_LOG_SIZE;
260 tgt_cfg.num_wds_entries = CFG_TGT_WDS_ENTRIES;
261 tgt_cfg.dma_burst_size = CFG_TGT_DEFAULT_DMA_BURST_SIZE;
262 tgt_cfg.mac_aggr_delim = CFG_TGT_DEFAULT_MAC_AGGR_DELIM;
263 tgt_cfg.rx_skip_defrag_timeout_dup_detection_check =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800264 CFG_TGT_DEFAULT_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK,
Mukul Sharmab10c8c72017-11-02 17:25:59 +0530265 tgt_cfg.vow_config = CFG_TGT_DEFAULT_VOW_CONFIG;
266 tgt_cfg.gtk_offload_max_vdev = CFG_TGT_DEFAULT_GTK_OFFLOAD_MAX_VDEV;
267 tgt_cfg.num_msdu_desc = CFG_TGT_NUM_MSDU_DESC;
268 tgt_cfg.max_frag_entries = CFG_TGT_MAX_FRAG_TABLE_ENTRIES;
269 tgt_cfg.num_tdls_vdevs = CFG_TGT_NUM_TDLS_VDEVS;
270 tgt_cfg.num_tdls_conn_table_entries =
271 CFG_TGT_NUM_TDLS_CONN_TABLE_ENTRIES;
272 tgt_cfg.beacon_tx_offload_max_vdev =
273 CFG_TGT_DEFAULT_BEACON_TX_OFFLOAD_MAX_VDEV;
274 tgt_cfg.num_multicast_filter_entries =
275 CFG_TGT_MAX_MULTICAST_FILTER_ENTRIES;
276 tgt_cfg.num_wow_filters = 0;
277 tgt_cfg.num_keep_alive_pattern = 0;
278 tgt_cfg.keep_alive_pattern_size = 0;
279 tgt_cfg.max_tdls_concurrent_sleep_sta =
280 CFG_TGT_NUM_TDLS_CONC_SLEEP_STAS;
281 tgt_cfg.max_tdls_concurrent_buffer_sta =
282 CFG_TGT_NUM_TDLS_CONC_BUFFER_STAS;
283 tgt_cfg.wmi_send_separate = 0;
284 tgt_cfg.num_ocb_vdevs = CFG_TGT_NUM_OCB_VDEVS;
285 tgt_cfg.num_ocb_channels = CFG_TGT_NUM_OCB_CHANNELS;
286 tgt_cfg.num_ocb_schedules = CFG_TGT_NUM_OCB_SCHEDULES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800287
Komal Seelam02d09342016-02-23 18:03:19 +0530288 no_of_peers_supported = wma_get_number_of_peers_supported(wma_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800289 tgt_cfg.num_peers = no_of_peers_supported + CFG_TGT_NUM_VDEV + 2;
bings6b3614e2017-02-21 10:18:36 +0800290 tgt_cfg.num_tids = wma_get_number_of_tids_supported(
291 no_of_peers_supported);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800292 tgt_cfg.scan_max_pending_req = wma_handle->max_scan;
293
Mukul Sharmab10c8c72017-11-02 17:25:59 +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
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800297 /* reduce the peer/vdev if CFG_TGT_NUM_MSDU_DESC exceeds 1000 */
298#ifdef PERE_IP_HDR_ALIGNMENT_WAR
299 if (scn->host_80211_enable) {
300 /*
301 * To make the IP header begins at dword aligned address,
302 * we make the decapsulation mode as Native Wifi.
303 */
304 tgt_cfg.rx_decap_mode = CFG_TGT_RX_DECAP_MODE_NWIFI;
305 }
306#endif /* PERE_IP_HDR_ALIGNMENT_WAR */
Manjunathappa Prakash0e6e6b52016-04-21 11:48:48 -0700307 if (QDF_GLOBAL_MONITOR_MODE == cds_get_conparam())
308 tgt_cfg.rx_decap_mode = CFG_TGT_RX_DECAP_MODE_RAW;
309
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800310 wma_handle->wlan_resource_config = tgt_cfg;
311}
312
313/**
314 * wma_cli_get_command() - WMA "get" command processor
315 * @vdev_id: virtual device for the command
316 * @param_id: parameter id
317 * @vpdev: parameter category
318 *
319 * Return: parameter value on success, -EINVAL on failure
320 */
321int wma_cli_get_command(int vdev_id, int param_id, int vpdev)
322{
323 int ret = 0;
324 tp_wma_handle wma;
325 struct wma_txrx_node *intr = NULL;
326
Anurag Chouhan6d760662016-02-20 16:05:43 +0530327 wma = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800328
329 if (NULL == wma) {
330 WMA_LOGE("%s: Invalid wma handle", __func__);
331 return -EINVAL;
332 }
333
334 intr = wma->interfaces;
335
336 if (VDEV_CMD == vpdev) {
337 switch (param_id) {
338 case WMI_VDEV_PARAM_NSS:
339 ret = intr[vdev_id].config.nss;
340 break;
341#ifdef QCA_SUPPORT_GTX
342 case WMI_VDEV_PARAM_GTX_HT_MCS:
343 ret = intr[vdev_id].config.gtx_info.gtxRTMask[0];
344 break;
345 case WMI_VDEV_PARAM_GTX_VHT_MCS:
346 ret = intr[vdev_id].config.gtx_info.gtxRTMask[1];
347 break;
348 case WMI_VDEV_PARAM_GTX_USR_CFG:
349 ret = intr[vdev_id].config.gtx_info.gtxUsrcfg;
350 break;
351 case WMI_VDEV_PARAM_GTX_THRE:
352 ret = intr[vdev_id].config.gtx_info.gtxPERThreshold;
353 break;
354 case WMI_VDEV_PARAM_GTX_MARGIN:
355 ret = intr[vdev_id].config.gtx_info.gtxPERMargin;
356 break;
357 case WMI_VDEV_PARAM_GTX_STEP:
358 ret = intr[vdev_id].config.gtx_info.gtxTPCstep;
359 break;
360 case WMI_VDEV_PARAM_GTX_MINTPC:
361 ret = intr[vdev_id].config.gtx_info.gtxTPCMin;
362 break;
363 case WMI_VDEV_PARAM_GTX_BW_MASK:
364 ret = intr[vdev_id].config.gtx_info.gtxBWMask;
365 break;
366#endif /* QCA_SUPPORT_GTX */
367 case WMI_VDEV_PARAM_LDPC:
368 ret = intr[vdev_id].config.ldpc;
369 break;
370 case WMI_VDEV_PARAM_TX_STBC:
371 ret = intr[vdev_id].config.tx_stbc;
372 break;
373 case WMI_VDEV_PARAM_RX_STBC:
374 ret = intr[vdev_id].config.rx_stbc;
375 break;
376 case WMI_VDEV_PARAM_SGI:
377 ret = intr[vdev_id].config.shortgi;
378 break;
379 case WMI_VDEV_PARAM_ENABLE_RTSCTS:
380 ret = intr[vdev_id].config.rtscts_en;
381 break;
382 case WMI_VDEV_PARAM_CHWIDTH:
383 ret = intr[vdev_id].config.chwidth;
384 break;
385 case WMI_VDEV_PARAM_FIXED_RATE:
386 ret = intr[vdev_id].config.tx_rate;
387 break;
Krishna Kumaar Natarajan1a71ec72017-03-23 12:26:31 -0700388 case WMI_VDEV_PARAM_HE_DCM:
Krishna Kumaar Natarajan150cd012017-03-23 12:29:10 -0700389 case WMI_VDEV_PARAM_HE_RANGE_EXT:
Krishna Kumaar Natarajan1a71ec72017-03-23 12:26:31 -0700390 ret = wma_get_he_vdev_param(&intr[vdev_id], param_id);
391 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800392 default:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700393 WMA_LOGE("Invalid cli_get vdev command/Not yet implemented 0x%x",
394 param_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800395 return -EINVAL;
396 }
397 } else if (PDEV_CMD == vpdev) {
398 switch (param_id) {
399 case WMI_PDEV_PARAM_ANI_ENABLE:
400 ret = wma->pdevconfig.ani_enable;
401 break;
402 case WMI_PDEV_PARAM_ANI_POLL_PERIOD:
403 ret = wma->pdevconfig.ani_poll_len;
404 break;
405 case WMI_PDEV_PARAM_ANI_LISTEN_PERIOD:
406 ret = wma->pdevconfig.ani_listen_len;
407 break;
408 case WMI_PDEV_PARAM_ANI_OFDM_LEVEL:
409 ret = wma->pdevconfig.ani_ofdm_level;
410 break;
411 case WMI_PDEV_PARAM_ANI_CCK_LEVEL:
412 ret = wma->pdevconfig.ani_cck_level;
413 break;
414 case WMI_PDEV_PARAM_DYNAMIC_BW:
415 ret = wma->pdevconfig.cwmenable;
416 break;
417 case WMI_PDEV_PARAM_CTS_CBW:
418 ret = wma->pdevconfig.cts_cbw;
419 break;
420 case WMI_PDEV_PARAM_TX_CHAIN_MASK:
421 ret = wma->pdevconfig.txchainmask;
422 break;
423 case WMI_PDEV_PARAM_RX_CHAIN_MASK:
424 ret = wma->pdevconfig.rxchainmask;
425 break;
426 case WMI_PDEV_PARAM_TXPOWER_LIMIT2G:
427 ret = wma->pdevconfig.txpow2g;
428 break;
429 case WMI_PDEV_PARAM_TXPOWER_LIMIT5G:
430 ret = wma->pdevconfig.txpow5g;
431 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800432 case WMI_PDEV_PARAM_BURST_ENABLE:
433 ret = wma->pdevconfig.burst_enable;
434 break;
435 case WMI_PDEV_PARAM_BURST_DUR:
436 ret = wma->pdevconfig.burst_dur;
437 break;
438 default:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700439 WMA_LOGE("Invalid cli_get pdev command/Not yet implemented 0x%x",
440 param_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800441 return -EINVAL;
442 }
443 } else if (GEN_CMD == vpdev) {
444 switch (param_id) {
445 case GEN_VDEV_PARAM_AMPDU:
446 ret = intr[vdev_id].config.ampdu;
447 break;
448 case GEN_VDEV_PARAM_AMSDU:
449 ret = intr[vdev_id].config.amsdu;
450 break;
Varun Reddy Yeturu5ab47462016-05-08 18:08:11 -0700451 case GEN_VDEV_ROAM_SYNCH_DELAY:
452 ret = intr[vdev_id].roam_synch_delay;
453 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800454 default:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700455 WMA_LOGE("Invalid generic vdev command/Not yet implemented 0x%x",
456 param_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800457 return -EINVAL;
458 }
459 } else if (PPS_CMD == vpdev) {
460 switch (param_id) {
461 case WMI_VDEV_PPS_PAID_MATCH:
462 ret = intr[vdev_id].config.pps_params.paid_match_enable;
463 break;
464 case WMI_VDEV_PPS_GID_MATCH:
465 ret = intr[vdev_id].config.pps_params.gid_match_enable;
466 break;
467 case WMI_VDEV_PPS_EARLY_TIM_CLEAR:
468 ret = intr[vdev_id].config.pps_params.tim_clear;
469 break;
470 case WMI_VDEV_PPS_EARLY_DTIM_CLEAR:
471 ret = intr[vdev_id].config.pps_params.dtim_clear;
472 break;
473 case WMI_VDEV_PPS_EOF_PAD_DELIM:
474 ret = intr[vdev_id].config.pps_params.eof_delim;
475 break;
476 case WMI_VDEV_PPS_MACADDR_MISMATCH:
477 ret = intr[vdev_id].config.pps_params.mac_match;
478 break;
479 case WMI_VDEV_PPS_DELIM_CRC_FAIL:
480 ret = intr[vdev_id].config.pps_params.delim_fail;
481 break;
482 case WMI_VDEV_PPS_GID_NSTS_ZERO:
483 ret = intr[vdev_id].config.pps_params.nsts_zero;
484 break;
485 case WMI_VDEV_PPS_RSSI_CHECK:
486 ret = intr[vdev_id].config.pps_params.rssi_chk;
487 break;
488 default:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700489 WMA_LOGE("Invalid pps vdev command/Not yet implemented 0x%x",
490 param_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800491 return -EINVAL;
492 }
493 } else if (QPOWER_CMD == vpdev) {
494 switch (param_id) {
495 case WMI_STA_PS_PARAM_QPOWER_PSPOLL_COUNT:
496 ret = intr[vdev_id].config.qpower_params.
497 max_ps_poll_cnt;
498 break;
499 case WMI_STA_PS_PARAM_QPOWER_MAX_TX_BEFORE_WAKE:
500 ret = intr[vdev_id].config.qpower_params.
501 max_tx_before_wake;
502 break;
503 case WMI_STA_PS_PARAM_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL:
504 ret = intr[vdev_id].config.qpower_params.
505 spec_ps_poll_wake_interval;
506 break;
507 case WMI_STA_PS_PARAM_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL:
508 ret = intr[vdev_id].config.qpower_params.
509 max_spec_nodata_ps_poll;
510 break;
511 default:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700512 WMA_LOGE("Invalid generic vdev command/Not yet implemented 0x%x",
513 param_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800514 return -EINVAL;
515 }
516 } else if (GTX_CMD == vpdev) {
517 switch (param_id) {
518 case WMI_VDEV_PARAM_GTX_HT_MCS:
519 ret = intr[vdev_id].config.gtx_info.gtxRTMask[0];
520 break;
521 case WMI_VDEV_PARAM_GTX_VHT_MCS:
522 ret = intr[vdev_id].config.gtx_info.gtxRTMask[1];
523 break;
524 case WMI_VDEV_PARAM_GTX_USR_CFG:
525 ret = intr[vdev_id].config.gtx_info.gtxUsrcfg;
526 break;
527 case WMI_VDEV_PARAM_GTX_THRE:
528 ret = intr[vdev_id].config.gtx_info.gtxPERThreshold;
529 break;
530 case WMI_VDEV_PARAM_GTX_MARGIN:
531 ret = intr[vdev_id].config.gtx_info.gtxPERMargin;
532 break;
533 case WMI_VDEV_PARAM_GTX_STEP:
534 ret = intr[vdev_id].config.gtx_info.gtxTPCstep;
535 break;
536 case WMI_VDEV_PARAM_GTX_MINTPC:
537 ret = intr[vdev_id].config.gtx_info.gtxTPCMin;
538 break;
539 case WMI_VDEV_PARAM_GTX_BW_MASK:
540 ret = intr[vdev_id].config.gtx_info.gtxBWMask;
541 break;
542 default:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700543 WMA_LOGE("Invalid generic vdev command/Not yet implemented 0x%x",
544 param_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800545 return -EINVAL;
546 }
547 }
548 return ret;
549}
550
551/**
552 * wma_cli_set2_command() - WMA "set 2 params" command processor
553 * @vdev_id: virtual device for the command
554 * @param_id: parameter id
555 * @sval1: first parameter value
556 * @sval2: second parameter value
557 * @vpdev: parameter category
558 *
559 * Command handler for set operations which require 2 parameters
560 *
561 * Return: 0 on success, errno on failure
562 */
563int wma_cli_set2_command(int vdev_id, int param_id, int sval1,
564 int sval2, int vpdev)
565{
Rajeev Kumarb60abe42017-01-21 15:39:31 -0800566 struct scheduler_msg msg = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800567 wma_cli_set_cmd_t *iwcmd;
568
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530569 iwcmd = qdf_mem_malloc(sizeof(*iwcmd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800570 if (!iwcmd) {
571 WMA_LOGE("%s: Failed alloc memory for iwcmd", __func__);
572 return -ENOMEM;
573 }
574
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530575 qdf_mem_zero(iwcmd, sizeof(*iwcmd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800576 iwcmd->param_value = sval1;
577 iwcmd->param_sec_value = sval2;
578 iwcmd->param_vdev_id = vdev_id;
579 iwcmd->param_id = param_id;
580 iwcmd->param_vp_dev = vpdev;
581 msg.type = WMA_CLI_SET_CMD;
582 msg.reserved = 0;
583 msg.bodyptr = iwcmd;
584
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530585 if (QDF_STATUS_SUCCESS !=
Rajeev Kumarb60abe42017-01-21 15:39:31 -0800586 scheduler_post_msg(QDF_MODULE_ID_WMA, &msg)) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -0700587 WMA_LOGE("%s: Failed to post WMA_CLI_SET_CMD msg",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800588 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530589 qdf_mem_free(iwcmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800590 return -EIO;
591 }
592 return 0;
593}
594
595/**
596 * wma_cli_set_command() - WMA "set" command processor
597 * @vdev_id: virtual device for the command
598 * @param_id: parameter id
599 * @sval: parameter value
600 * @vpdev: parameter category
601 *
602 * Command handler for set operations
603 *
604 * Return: 0 on success, errno on failure
605 */
606int wma_cli_set_command(int vdev_id, int param_id, int sval, int vpdev)
607{
608 return wma_cli_set2_command(vdev_id, param_id, sval, 0, vpdev);
609
610}
611
Krunal Soniaadaa272017-10-04 16:42:55 -0700612QDF_STATUS wma_form_unit_test_cmd_and_send(uint32_t vdev_id,
613 uint32_t module_id, uint32_t arg_count, uint32_t *arg)
614{
615 struct wmi_unit_test_cmd *unit_test_args;
616 tp_wma_handle wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
617 uint32_t i;
618 QDF_STATUS status;
619
620 WMA_LOGD(FL("enter"));
621 if (arg_count >= WMA_MAX_NUM_ARGS) {
622 WMA_LOGE(FL("arg_count is crossed the boundary"));
623 return QDF_STATUS_E_FAILURE;
624 }
625 if (!wma_handle || !wma_handle->wmi_handle) {
626 WMA_LOGE(FL("Invalid WMA/WMI handle"));
627 return QDF_STATUS_E_FAILURE;
628 }
629 unit_test_args = qdf_mem_malloc(sizeof(*unit_test_args));
630 if (NULL == unit_test_args) {
631 WMA_LOGE(FL("qdf_mem_malloc failed for unit_test_args"));
632 return QDF_STATUS_E_NOMEM;
633 }
634 unit_test_args->vdev_id = vdev_id;
635 unit_test_args->module_id = module_id;
636 unit_test_args->num_args = arg_count;
637 for (i = 0; i < arg_count; i++)
638 unit_test_args->args[i] = arg[i];
639
640 status = wmi_unified_unit_test_cmd(wma_handle->wmi_handle,
641 unit_test_args);
642 qdf_mem_free(unit_test_args);
643 WMA_LOGD(FL("exit"));
644
645 return status;
646}
647
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800648/**
Yun Parkb4f591d2017-03-29 15:51:01 -0700649 * wma_ipa_get_stat() - get IPA data path stats from FW
650 *
651 * Return: 0 on success, errno on failure
652 */
653#ifdef IPA_OFFLOAD
654static int wma_ipa_get_stat(void)
655{
656 struct cdp_pdev *pdev;
657
658 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
659 if (!pdev) {
660 WMA_LOGE("pdev NULL for uc stat");
661 return -EINVAL;
662 }
663 cdp_ipa_get_stat(cds_get_context(QDF_MODULE_ID_SOC), pdev);
664
665 return 0;
666}
667#else
668static int wma_ipa_get_stat(void)
669{
670 return 0;
671}
672#endif
673
674/**
675 * wma_ipa_uc_get_share_stats() - get Tx/Rx byte stats from FW
676 * @privcmd: private command
677 *
678 * Return: 0 on success, errno on failure
679 */
680#if defined(IPA_OFFLOAD) && defined(FEATURE_METERING)
681static int wma_ipa_uc_get_share_stats(wma_cli_set_cmd_t *privcmd)
682{
683 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
684 struct cdp_pdev *pdev;
685 uint8_t reset_stats = privcmd->param_value;
686
687 WMA_LOGD("%s: reset_stats=%d",
688 "WMA_VDEV_TXRX_GET_IPA_UC_SHARING_STATS_CMDID",
689 reset_stats);
690 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
691 if (!pdev) {
692 WMA_LOGE("pdev NULL for uc get share stats");
693 return -EINVAL;
694 }
695 cdp_ipa_uc_get_share_stats(soc, pdev, reset_stats);
696
697 return 0;
698}
699#else
700static int wma_ipa_uc_get_share_stats(wma_cli_set_cmd_t *privcmd)
701{
702 return 0;
703}
704#endif
705
706/**
707 * wma_ipa_uc_set_quota() - set quota limit to FW
708 * @privcmd: private command
709 *
710 * Return: 0 on success, errno on failure
711 */
712#if defined(IPA_OFFLOAD) && defined(FEATURE_METERING)
713static int wma_ipa_uc_set_quota(wma_cli_set_cmd_t *privcmd)
714{
715 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
716 struct cdp_pdev *pdev;
717 uint64_t quota_bytes = privcmd->param_sec_value;
718
719 quota_bytes <<= 32;
720 quota_bytes |= privcmd->param_value;
721
722 WMA_LOGD("%s: quota_bytes=%llu",
723 "WMA_VDEV_TXRX_SET_IPA_UC_QUOTA_CMDID",
724 quota_bytes);
725 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
726 if (!pdev) {
727 WMA_LOGE("pdev NULL for uc set quota");
728 return -EINVAL;
729 }
730 cdp_ipa_uc_set_quota(soc, pdev, quota_bytes);
731
732 return 0;
733}
734#else
735static int wma_ipa_uc_set_quota(wma_cli_set_cmd_t *privcmd)
736{
737 return 0;
738}
739#endif
740
741/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800742 * wma_set_priv_cfg() - set private config parameters
743 * @wma_handle: wma handle
744 * @privcmd: private command
745 *
746 * Return: 0 for success or error code
747 */
748static int32_t wma_set_priv_cfg(tp_wma_handle wma_handle,
749 wma_cli_set_cmd_t *privcmd)
750{
751 int32_t ret = 0;
752
753 switch (privcmd->param_id) {
754 case WMA_VDEV_TXRX_FWSTATS_ENABLE_CMDID:
755 ret = wma_set_txrx_fw_stats_level(wma_handle,
756 privcmd->param_vdev_id,
757 privcmd->param_value);
758 break;
759 case WMA_VDEV_TXRX_FWSTATS_RESET_CMDID:
760 ret = wma_txrx_fw_stats_reset(wma_handle,
761 privcmd->param_vdev_id,
762 privcmd->param_value);
763 break;
764 case WMI_STA_SMPS_FORCE_MODE_CMDID:
Archana Ramachandran20d2e232016-02-11 16:58:40 -0800765 ret = wma_set_mimops(wma_handle,
766 privcmd->param_vdev_id,
767 privcmd->param_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800768 break;
769 case WMI_STA_SMPS_PARAM_CMDID:
770 wma_set_smps_params(wma_handle, privcmd->param_vdev_id,
771 privcmd->param_value);
772 break;
773 case WMA_VDEV_MCC_SET_TIME_LATENCY:
774 {
775 /* Extract first MCC adapter/vdev channel number and latency */
776 uint8_t mcc_channel = privcmd->param_value & 0x000000FF;
777 uint8_t mcc_channel_latency =
778 (privcmd->param_value & 0x0000FF00) >> 8;
779 int ret = -1;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700780
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800781 WMA_LOGD("%s: Parsed input: Channel #1:%d, latency:%dms",
782 __func__, mcc_channel, mcc_channel_latency);
783 ret = wma_set_mcc_channel_time_latency(wma_handle,
784 mcc_channel,
785 mcc_channel_latency);
786 }
787 break;
788 case WMA_VDEV_MCC_SET_TIME_QUOTA:
789 {
790 /* Extract the MCC 2 adapters/vdevs channel numbers and time
791 * quota value for the first adapter only (which is specified
792 * in iwpriv command.
793 */
794 uint8_t adapter_2_chan_number =
795 privcmd->param_value & 0x000000FF;
796 uint8_t adapter_1_chan_number =
797 (privcmd->param_value & 0x0000FF00) >> 8;
798 uint8_t adapter_1_quota =
799 (privcmd->param_value & 0x00FF0000) >> 16;
800 int ret = -1;
801
802 WMA_LOGD("%s: Parsed input: Channel #1:%d, Channel #2:%d, quota 1:%dms",
803 __func__, adapter_1_chan_number,
804 adapter_2_chan_number, adapter_1_quota);
805
806 ret = wma_set_mcc_channel_time_quota(wma_handle,
807 adapter_1_chan_number,
808 adapter_1_quota,
809 adapter_2_chan_number);
810 }
811 break;
812 case WMA_VDEV_IBSS_SET_ATIM_WINDOW_SIZE:
813 {
814 wma_handle->wma_ibss_power_save_params.atimWindowLength =
815 privcmd->param_value;
816 WMA_LOGD("%s: IBSS power save ATIM Window = %d",
817 __func__, wma_handle->wma_ibss_power_save_params.
818 atimWindowLength);
819 }
820 break;
821 case WMA_VDEV_IBSS_SET_POWER_SAVE_ALLOWED:
822 {
823 wma_handle->wma_ibss_power_save_params.isPowerSaveAllowed =
824 privcmd->param_value;
825 WMA_LOGD("%s: IBSS is Power Save Allowed = %d",
826 __func__, wma_handle->wma_ibss_power_save_params.
827 isPowerSaveAllowed);
828 }
829 break;
830 case WMA_VDEV_IBSS_SET_POWER_COLLAPSE_ALLOWED:
831 {
832 wma_handle->wma_ibss_power_save_params. isPowerCollapseAllowed =
833 privcmd->param_value;
834 WMA_LOGD("%s: IBSS is Power Collapse Allowed = %d",
835 __func__, wma_handle->wma_ibss_power_save_params.
836 isPowerCollapseAllowed);
837 }
838 break;
839 case WMA_VDEV_IBSS_SET_AWAKE_ON_TX_RX:
840 {
841 wma_handle->wma_ibss_power_save_params.isAwakeonTxRxEnabled =
842 privcmd->param_value;
843 WMA_LOGD("%s: IBSS Power Save Awake on Tx/Rx Enabled = %d",
844 __func__, wma_handle->wma_ibss_power_save_params.
845 isAwakeonTxRxEnabled);
846 }
847 break;
848 case WMA_VDEV_IBSS_SET_INACTIVITY_TIME:
849 {
850 wma_handle->wma_ibss_power_save_params.inactivityCount =
851 privcmd->param_value;
852 WMA_LOGD("%s: IBSS Power Save Data Inactivity Count = %d",
853 __func__, wma_handle->wma_ibss_power_save_params.
854 inactivityCount);
855 }
856 break;
857 case WMA_VDEV_IBSS_SET_TXSP_END_INACTIVITY_TIME:
858 {
859 wma_handle->wma_ibss_power_save_params.txSPEndInactivityTime =
860 privcmd->param_value;
861 WMA_LOGD("%s: IBSS Power Save Transmit EOSP inactivity time out = %d",
862 __func__, wma_handle->wma_ibss_power_save_params.
863 txSPEndInactivityTime);
864 }
865 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800866 case WMA_VDEV_IBSS_PS_SET_WARMUP_TIME_SECS:
867 {
868 wma_handle->wma_ibss_power_save_params.ibssPsWarmupTime =
869 privcmd->param_value;
870 WMA_LOGD("%s: IBSS Power Save Warm Up Time in Seconds = %d",
871 __func__, wma_handle->wma_ibss_power_save_params.
872 ibssPsWarmupTime);
873 }
874 break;
875 case WMA_VDEV_IBSS_PS_SET_1RX_CHAIN_IN_ATIM_WINDOW:
876 {
877 wma_handle->wma_ibss_power_save_params.ibssPs1RxChainInAtimEnable
878 = privcmd->param_value;
879 WMA_LOGD("%s: IBSS Power Save single RX Chain Enable In ATIM = %d",
880 __func__, wma_handle->wma_ibss_power_save_params.
881 ibssPs1RxChainInAtimEnable);
882 }
883 break;
884
885 case WMA_VDEV_TXRX_GET_IPA_UC_FW_STATS_CMDID:
886 {
Yun Parkb4f591d2017-03-29 15:51:01 -0700887 wma_ipa_get_stat();
Yun Park637d6482016-10-05 10:51:33 -0700888 }
889 break;
890
891 case WMA_VDEV_TXRX_GET_IPA_UC_SHARING_STATS_CMDID:
892 {
Yun Parkb4f591d2017-03-29 15:51:01 -0700893 wma_ipa_uc_get_share_stats(privcmd);
Yun Park637d6482016-10-05 10:51:33 -0700894 }
895 break;
896
897 case WMA_VDEV_TXRX_SET_IPA_UC_QUOTA_CMDID:
898 {
Yun Parkb4f591d2017-03-29 15:51:01 -0700899 wma_ipa_uc_set_quota(privcmd);
Yun Park327e7812017-02-14 15:18:10 -0800900
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800901 }
902 break;
903
904 default:
905 WMA_LOGE("Invalid wma config command id:%d", privcmd->param_id);
906 ret = -EINVAL;
907 }
908 return ret;
909}
910
911/**
Kiran Kumar Lokere92fe7592016-09-14 20:15:45 -0700912 * wma_set_dtim_period() - set dtim period to FW
913 * @wma: wma handle
914 * @dtim_params: dtim params
915 *
916 * Return: none
917 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -0700918static void wma_set_dtim_period(tp_wma_handle wma,
919 struct set_dtim_params *dtim_params)
Kiran Kumar Lokere92fe7592016-09-14 20:15:45 -0700920{
921 QDF_STATUS ret;
922 uint8_t vdev_id = dtim_params->session_id;
923 struct wma_txrx_node *iface =
924 &wma->interfaces[vdev_id];
925
Srinivas Girigowdaf1472122017-03-09 15:44:12 -0800926 WMA_LOGD("%s: set dtim_period %d", __func__,
Kiran Kumar Lokere92fe7592016-09-14 20:15:45 -0700927 dtim_params->dtim_period);
928 iface->dtimPeriod = dtim_params->dtim_period;
929 ret = wma_vdev_set_param(wma->wmi_handle,
930 vdev_id,
931 WMI_VDEV_PARAM_LISTEN_INTERVAL,
932 dtim_params->dtim_period);
933 if (QDF_IS_STATUS_ERROR(ret))
934 WMA_LOGW("Failed to set listen interval");
935
936}
937/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800938 * wma_set_modulated_dtim() - function to configure modulated dtim
939 * @wma: wma handle
940 * @privcmd: structure containing parameters
941 *
942 * This function configures the modulated dtim in firmware
943 *
944 * Return: none
945 */
946static void wma_set_modulated_dtim(tp_wma_handle wma,
947 wma_cli_set_cmd_t *privcmd)
948{
949 uint8_t vdev_id = privcmd->param_vdev_id;
950 struct wma_txrx_node *iface =
951 &wma->interfaces[vdev_id];
952 bool prev_dtim_enabled;
953 uint32_t listen_interval;
Govind Singhd76a5b02016-03-08 15:12:14 +0530954 QDF_STATUS ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800955
956 iface->alt_modulated_dtim = privcmd->param_value;
957
958 prev_dtim_enabled = iface->alt_modulated_dtim_enabled;
959
960 if (1 != privcmd->param_value)
961 iface->alt_modulated_dtim_enabled = true;
962 else
963 iface->alt_modulated_dtim_enabled = false;
964
965 if ((true == iface->alt_modulated_dtim_enabled) ||
966 (true == prev_dtim_enabled)) {
967
968 listen_interval = iface->alt_modulated_dtim
969 * iface->dtimPeriod;
970
Govind Singhd76a5b02016-03-08 15:12:14 +0530971 ret = wma_vdev_set_param(wma->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800972 privcmd->param_vdev_id,
973 WMI_VDEV_PARAM_LISTEN_INTERVAL,
974 listen_interval);
Govind Singhd76a5b02016-03-08 15:12:14 +0530975 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800976 /* Even if it fails, continue */
977 WMA_LOGW("Failed to set listen interval %d",
978 listen_interval);
979
Govind Singhd76a5b02016-03-08 15:12:14 +0530980 ret = wma_vdev_set_param(wma->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800981 privcmd->param_vdev_id,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700982 WMI_VDEV_PARAM_DTIM_POLICY,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800983 NORMAL_DTIM);
Govind Singhd76a5b02016-03-08 15:12:14 +0530984 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800985 WMA_LOGE("Failed to Set to Normal DTIM policy");
986 }
987}
988
Mukul Sharma6398b252017-05-01 17:58:12 +0530989/**
990 * wma_override_listen_interval() - function to override static/ini based LI
991 * @wma: wma handle
992 * @privcmd: structure containing parameters
993 *
994 * This function override static/ini based LI in firmware
995 *
996 * Return: none
997 */
998static void wma_override_listen_interval(tp_wma_handle wma,
999 wma_cli_set_cmd_t *privcmd)
1000{
1001 uint8_t vdev_id = privcmd->param_vdev_id;
1002 struct wma_txrx_node *iface =
1003 &wma->interfaces[vdev_id];
1004 u32 old_override_li, new_override_li, listen_interval;
1005 struct sAniSirGlobal *mac;
1006 QDF_STATUS ret;
1007
1008 mac = cds_get_context(QDF_MODULE_ID_PE);
1009 if (!mac) {
1010 WMA_LOGE(FL("Failed to get mac context"));
1011 return;
1012 }
1013
1014 old_override_li = iface->override_li;
1015 new_override_li = privcmd->param_value;
1016 iface->override_li = new_override_li;
1017
1018 if (new_override_li &&
1019 (new_override_li != old_override_li)) {
1020 listen_interval = new_override_li;
1021 } else if (!new_override_li &&
1022 (new_override_li != old_override_li)) {
1023 /* Configure default LI as we do on resume */
1024 if ((wlan_cfg_get_int(mac, WNI_CFG_LISTEN_INTERVAL,
1025 &listen_interval) != eSIR_SUCCESS)) {
1026 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR,
1027 "Failed to get value for listen interval");
1028 listen_interval = POWERSAVE_DEFAULT_LISTEN_INTERVAL;
1029 }
1030 } else {
1031 return;
1032 }
1033
1034 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
1035 WMI_VDEV_PARAM_LISTEN_INTERVAL,
1036 listen_interval);
1037 if (QDF_IS_STATUS_ERROR(ret)) {
1038 /* Even it fails continue Fw will take default LI */
1039 WMA_LOGE("Failed to Set Listen Interval vdevId %d",
1040 vdev_id);
1041 }
1042 WMA_LOGD("%s: Set Listen Interval vdevId %d Listen Intv %d",
1043 __func__, vdev_id, listen_interval);
1044 ret = wma_vdev_set_param(wma->wmi_handle,
1045 privcmd->param_vdev_id,
1046 WMI_VDEV_PARAM_DTIM_POLICY,
1047 NORMAL_DTIM);
1048 if (QDF_IS_STATUS_ERROR(ret))
1049 WMA_LOGE("Failed to Set to Normal DTIM policy");
1050
1051}
1052
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001053
1054/**
1055 * wma_process_cli_set_cmd() - set parameters to fw
1056 * @wma: wma handle
1057 * @privcmd: command
1058 *
1059 * Return: none
1060 */
1061static void wma_process_cli_set_cmd(tp_wma_handle wma,
1062 wma_cli_set_cmd_t *privcmd)
1063{
Govind Singhd76a5b02016-03-08 15:12:14 +05301064 int vid = privcmd->param_vdev_id, pps_val = 0;
1065 QDF_STATUS ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001066 struct wma_txrx_node *intr = wma->interfaces;
Anurag Chouhan6d760662016-02-20 16:05:43 +05301067 tpAniSirGlobal pMac = cds_get_context(QDF_MODULE_ID_PE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001068 struct qpower_params *qparams = &intr[vid].config.qpower_params;
Govind Singhd76a5b02016-03-08 15:12:14 +05301069 struct pdev_params pdev_param;
Leo Chang96464902016-10-28 11:10:54 -07001070 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001071
Jeff Johnsonadba3962017-09-18 08:12:35 -07001072 WMA_LOGD("wmihandle %pK", wma->wmi_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001073
1074 if (NULL == pMac) {
1075 WMA_LOGE("%s: Failed to get pMac", __func__);
1076 return;
1077 }
1078
1079 if (privcmd->param_id >= WMI_CMDID_MAX) {
1080 /*
1081 * This configuration setting is not done using any wmi
1082 * command, call appropriate handler.
1083 */
1084 if (wma_set_priv_cfg(wma, privcmd))
1085 WMA_LOGE("Failed to set wma priv congiuration");
1086 return;
1087 }
1088
1089 switch (privcmd->param_vp_dev) {
1090 case VDEV_CMD:
Bhargav Shaha89d3b42016-04-20 13:04:56 +05301091 if (!wma->interfaces[privcmd->param_vdev_id].is_vdev_valid) {
1092 WMA_LOGE("%s Vdev id is not valid", __func__);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001093 return;
Bhargav Shaha89d3b42016-04-20 13:04:56 +05301094 }
1095
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001096 WMA_LOGD("vdev id %d pid %d pval %d", privcmd->param_vdev_id,
1097 privcmd->param_id, privcmd->param_value);
Govind Singhd76a5b02016-03-08 15:12:14 +05301098 ret = wma_vdev_set_param(wma->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001099 privcmd->param_vdev_id,
1100 privcmd->param_id,
1101 privcmd->param_value);
Govind Singhd76a5b02016-03-08 15:12:14 +05301102 if (QDF_IS_STATUS_ERROR(ret)) {
1103 WMA_LOGE("wma_vdev_set_param failed ret %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001104 ret);
1105 return;
1106 }
1107 break;
1108 case PDEV_CMD:
1109 WMA_LOGD("pdev pid %d pval %d", privcmd->param_id,
1110 privcmd->param_value);
1111 if ((privcmd->param_id == WMI_PDEV_PARAM_RX_CHAIN_MASK) ||
1112 (privcmd->param_id == WMI_PDEV_PARAM_TX_CHAIN_MASK)) {
Jiachao Wu08719b02017-07-05 13:05:34 +08001113 if (QDF_STATUS_SUCCESS !=
1114 wma_check_txrx_chainmask(
1115 wma->num_rf_chains,
1116 privcmd->param_value)) {
1117 WMA_LOGD("Chainmask value is invalid");
1118 return;
1119 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001120 }
Govind Singhd76a5b02016-03-08 15:12:14 +05301121 pdev_param.param_id = privcmd->param_id;
1122 pdev_param.param_value = privcmd->param_value;
1123 ret = wmi_unified_pdev_param_send(wma->wmi_handle,
1124 &pdev_param,
1125 WMA_WILDCARD_PDEV_ID);
1126 if (QDF_IS_STATUS_ERROR(ret)) {
1127 WMA_LOGE("wma_vdev_set_param failed ret %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001128 ret);
1129 return;
1130 }
1131 break;
1132 case GEN_CMD:
1133 {
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08001134 struct cdp_vdev *vdev = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001135 struct wma_txrx_node *intr = wma->interfaces;
1136
1137 vdev = wma_find_vdev_by_id(wma, privcmd->param_vdev_id);
1138 if (!vdev) {
1139 WMA_LOGE("%s:Invalid vdev handle", __func__);
1140 return;
1141 }
1142
1143 WMA_LOGD("gen pid %d pval %d", privcmd->param_id,
1144 privcmd->param_value);
1145
1146 switch (privcmd->param_id) {
1147 case GEN_VDEV_PARAM_AMPDU:
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05301148 if (soc) {
1149 ret = cdp_aggr_cfg(soc, vdev,
1150 privcmd->param_value, 0);
1151 if (ret)
1152 WMA_LOGE("cdp_aggr_cfg set ampdu failed ret %d",
1153 ret);
1154 else
1155 intr[privcmd->param_vdev_id].config.
1156 ampdu = privcmd->param_value;
1157 } else {
1158 WMA_LOGE("%s:SOC context is NULL", __func__);
1159 return;
1160 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001161 break;
1162 case GEN_VDEV_PARAM_AMSDU:
Deepak Dhamdhere612392c2016-08-28 02:56:51 -07001163 /*
1164 * Firmware currently does not support set operation
1165 * for AMSDU. It may cause crash if the configuration
1166 * is sent to firmware.
1167 * Firmware enhancement will advertise a service bit
1168 * to enable AMSDU configuration through WMI. Then
1169 * add the WMI command to configure AMSDU parameter.
1170 * For the older chipset that does not advertise the
1171 * service bit, enable the following legacy code:
1172 * ol_txrx_aggr_cfg(vdev, 0, privcmd->param_value);
1173 * intr[privcmd->param_vdev_id].config.amsdu =
1174 * privcmd->param_value;
1175 */
1176 WMA_LOGE("SET GEN_VDEV_PARAM_AMSDU command is currently not supported");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001177 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001178 case GEN_PARAM_CRASH_INJECT:
Rajeev Kumar0a9901b2015-12-15 15:59:19 -08001179 if (QDF_GLOBAL_FTM_MODE == cds_get_conparam())
1180 WMA_LOGE("Crash inject not allowed in FTM mode");
1181 else
1182 ret = wma_crash_inject(wma,
1183 privcmd->param_value,
1184 privcmd->param_sec_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001185 break;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07001186 case GEN_PARAM_CAPTURE_TSF:
1187 ret = wma_capture_tsf(wma, privcmd->param_value);
1188 break;
1189 case GEN_PARAM_RESET_TSF_GPIO:
1190 ret = wma_reset_tsf_gpio(wma, privcmd->param_value);
1191 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001192 case GEN_PARAM_MODULATED_DTIM:
1193 wma_set_modulated_dtim(wma, privcmd);
1194 break;
Mukul Sharma6398b252017-05-01 17:58:12 +05301195 case GEN_PARAM_LISTEN_INTERVAL:
1196 wma_override_listen_interval(wma, privcmd);
1197 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001198 default:
1199 WMA_LOGE("Invalid param id 0x%x",
1200 privcmd->param_id);
1201 break;
1202 }
1203 break;
1204 }
1205 case DBG_CMD:
1206 WMA_LOGD("dbg pid %d pval %d", privcmd->param_id,
1207 privcmd->param_value);
1208 switch (privcmd->param_id) {
1209 case WMI_DBGLOG_LOG_LEVEL:
1210 ret = dbglog_set_log_lvl(wma->wmi_handle,
1211 privcmd->param_value);
1212 if (ret)
1213 WMA_LOGE("dbglog_set_log_lvl failed ret %d",
1214 ret);
1215 break;
1216 case WMI_DBGLOG_VAP_ENABLE:
1217 ret = dbglog_vap_log_enable(wma->wmi_handle,
1218 privcmd->param_value, true);
1219 if (ret)
1220 WMA_LOGE("dbglog_vap_log_enable failed ret %d",
1221 ret);
1222 break;
1223 case WMI_DBGLOG_VAP_DISABLE:
1224 ret = dbglog_vap_log_enable(wma->wmi_handle,
1225 privcmd->param_value, false);
1226 if (ret)
1227 WMA_LOGE("dbglog_vap_log_enable failed ret %d",
1228 ret);
1229 break;
1230 case WMI_DBGLOG_MODULE_ENABLE:
1231 ret = dbglog_module_log_enable(wma->wmi_handle,
1232 privcmd->param_value, true);
1233 if (ret)
1234 WMA_LOGE("dbglog_module_log_enable failed ret %d",
1235 ret);
1236 break;
1237 case WMI_DBGLOG_MODULE_DISABLE:
1238 ret = dbglog_module_log_enable(wma->wmi_handle,
1239 privcmd->param_value, false);
1240 if (ret)
1241 WMA_LOGE("dbglog_module_log_enable failed ret %d",
1242 ret);
1243 break;
1244 case WMI_DBGLOG_MOD_LOG_LEVEL:
1245 ret = dbglog_set_mod_log_lvl(wma->wmi_handle,
1246 privcmd->param_value);
1247 if (ret)
1248 WMA_LOGE("dbglog_module_log_enable failed ret %d",
1249 ret);
1250 break;
1251 case WMI_DBGLOG_TYPE:
1252 ret = dbglog_parser_type_init(wma->wmi_handle,
1253 privcmd->param_value);
1254 if (ret)
1255 WMA_LOGE("dbglog_parser_type_init failed ret %d",
1256 ret);
1257 break;
1258 case WMI_DBGLOG_REPORT_ENABLE:
1259 ret = dbglog_report_enable(wma->wmi_handle,
1260 privcmd->param_value);
1261 if (ret)
1262 WMA_LOGE("dbglog_report_enable failed ret %d",
1263 ret);
1264 break;
Govind Singha471e5e2015-10-12 17:11:14 +05301265 case WMI_WLAN_PROFILE_TRIGGER_CMDID:
Govind Singhf25a0f12016-03-08 16:09:48 +05301266 ret = wma_unified_fw_profiling_cmd(wma->wmi_handle,
Govind Singha471e5e2015-10-12 17:11:14 +05301267 WMI_WLAN_PROFILE_TRIGGER_CMDID,
1268 privcmd->param_value, 0);
1269 if (ret)
1270 WMA_LOGE("Profile cmd failed for %d ret %d",
1271 WMI_WLAN_PROFILE_TRIGGER_CMDID, ret);
1272 break;
1273 case WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID:
Govind Singhf25a0f12016-03-08 16:09:48 +05301274 ret = wma_unified_fw_profiling_cmd(wma->wmi_handle,
Govind Singha471e5e2015-10-12 17:11:14 +05301275 WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
1276 privcmd->param_value,
1277 privcmd->param_sec_value);
1278 if (ret)
1279 WMA_LOGE("Profile cmd failed for %d ret %d",
1280 WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
1281 ret);
1282 break;
1283 case WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID:
Govind Singhf25a0f12016-03-08 16:09:48 +05301284 ret = wma_unified_fw_profiling_cmd(wma->wmi_handle,
Govind Singha471e5e2015-10-12 17:11:14 +05301285 WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
1286 privcmd->param_value,
1287 privcmd->param_sec_value);
1288 if (ret)
1289 WMA_LOGE("Profile cmd failed for %d ret %d",
1290 WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
1291 ret);
1292 break;
1293 case WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID:
Govind Singhf25a0f12016-03-08 16:09:48 +05301294 ret = wma_unified_fw_profiling_cmd(wma->wmi_handle,
Govind Singha471e5e2015-10-12 17:11:14 +05301295 WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
1296 0, 0);
1297 if (ret)
1298 WMA_LOGE("Profile cmd failed for %d ret %d",
1299 WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
1300 ret);
1301 break;
1302 case WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID:
Govind Singhf25a0f12016-03-08 16:09:48 +05301303 ret = wma_unified_fw_profiling_cmd(wma->wmi_handle,
Govind Singha471e5e2015-10-12 17:11:14 +05301304 WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
1305 0, 0);
1306 if (ret)
1307 WMA_LOGE("Profile cmd failed for %d ret %d",
1308 WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
1309 ret);
1310 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001311 case WMI_PDEV_GREEN_AP_PS_ENABLE_CMDID:
1312 /* Set the Green AP */
Govind Singhd76a5b02016-03-08 15:12:14 +05301313 ret = wmi_unified_green_ap_ps_send
1314 (wma->wmi_handle, privcmd->param_value,
1315 WMA_WILDCARD_PDEV_ID);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001316 if (ret) {
1317 WMA_LOGE("Set GreenAP Failed val %d",
1318 privcmd->param_value);
1319 }
1320 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001321
1322 default:
1323 WMA_LOGE("Invalid param id 0x%x", privcmd->param_id);
1324 break;
1325 }
1326 break;
1327 case PPS_CMD:
1328 WMA_LOGD("dbg pid %d pval %d", privcmd->param_id,
1329 privcmd->param_value);
1330 switch (privcmd->param_id) {
1331
1332 case WMI_VDEV_PPS_PAID_MATCH:
1333 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1334 (PKT_PWR_SAVE_PAID_MATCH & 0xffff);
1335 intr[vid].config.pps_params.paid_match_enable =
1336 privcmd->param_value;
1337 break;
1338 case WMI_VDEV_PPS_GID_MATCH:
1339 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1340 (PKT_PWR_SAVE_GID_MATCH & 0xffff);
1341 intr[vid].config.pps_params.gid_match_enable =
1342 privcmd->param_value;
1343 break;
1344 case WMI_VDEV_PPS_EARLY_TIM_CLEAR:
1345 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1346 (PKT_PWR_SAVE_EARLY_TIM_CLEAR & 0xffff);
1347 intr[vid].config.pps_params.tim_clear =
1348 privcmd->param_value;
1349 break;
1350 case WMI_VDEV_PPS_EARLY_DTIM_CLEAR:
1351 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1352 (PKT_PWR_SAVE_EARLY_DTIM_CLEAR & 0xffff);
1353 intr[vid].config.pps_params.dtim_clear =
1354 privcmd->param_value;
1355 break;
1356 case WMI_VDEV_PPS_EOF_PAD_DELIM:
1357 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1358 (PKT_PWR_SAVE_EOF_PAD_DELIM & 0xffff);
1359 intr[vid].config.pps_params.eof_delim =
1360 privcmd->param_value;
1361 break;
1362 case WMI_VDEV_PPS_MACADDR_MISMATCH:
1363 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1364 (PKT_PWR_SAVE_MACADDR_MISMATCH & 0xffff);
1365 intr[vid].config.pps_params.mac_match =
1366 privcmd->param_value;
1367 break;
1368 case WMI_VDEV_PPS_DELIM_CRC_FAIL:
1369 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1370 (PKT_PWR_SAVE_DELIM_CRC_FAIL & 0xffff);
1371 intr[vid].config.pps_params.delim_fail =
1372 privcmd->param_value;
1373 break;
1374 case WMI_VDEV_PPS_GID_NSTS_ZERO:
1375 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1376 (PKT_PWR_SAVE_GID_NSTS_ZERO & 0xffff);
1377 intr[vid].config.pps_params.nsts_zero =
1378 privcmd->param_value;
1379 break;
1380 case WMI_VDEV_PPS_RSSI_CHECK:
1381 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1382 (PKT_PWR_SAVE_RSSI_CHECK & 0xffff);
1383 intr[vid].config.pps_params.rssi_chk =
1384 privcmd->param_value;
1385 break;
1386 case WMI_VDEV_PPS_5G_EBT:
1387 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1388 (PKT_PWR_SAVE_5G_EBT & 0xffff);
1389 intr[vid].config.pps_params.ebt_5g =
1390 privcmd->param_value;
1391 break;
1392 default:
1393 WMA_LOGE("Invalid param id 0x%x", privcmd->param_id);
1394 break;
1395 }
1396 break;
1397
1398 case QPOWER_CMD:
1399 WMA_LOGD("QPOWER CLI CMD pid %d pval %d", privcmd->param_id,
1400 privcmd->param_value);
1401 switch (privcmd->param_id) {
1402 case WMI_STA_PS_PARAM_QPOWER_PSPOLL_COUNT:
1403 WMA_LOGD("QPOWER CLI CMD:Ps Poll Cnt val %d",
1404 privcmd->param_value);
1405 /* Set the QPower Ps Poll Count */
Govind Singhd76a5b02016-03-08 15:12:14 +05301406 ret = wma_unified_set_sta_ps_param(wma->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001407 vid, WMI_STA_PS_PARAM_QPOWER_PSPOLL_COUNT,
1408 privcmd->param_value);
1409 if (ret) {
1410 WMA_LOGE("Set Q-PsPollCnt Failed vdevId %d val %d",
1411 vid, privcmd->param_value);
1412 } else {
1413 qparams->max_ps_poll_cnt = privcmd->param_value;
1414 }
1415 break;
1416 case WMI_STA_PS_PARAM_QPOWER_MAX_TX_BEFORE_WAKE:
1417 WMA_LOGD("QPOWER CLI CMD:Max Tx Before wake val %d",
1418 privcmd->param_value);
1419 /* Set the QPower Max Tx Before Wake */
Govind Singhd76a5b02016-03-08 15:12:14 +05301420 ret = wma_unified_set_sta_ps_param(wma->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001421 vid, WMI_STA_PS_PARAM_QPOWER_MAX_TX_BEFORE_WAKE,
1422 privcmd->param_value);
1423 if (ret) {
1424 WMA_LOGE("Set Q-MaxTxBefWake Failed vId %d val %d",
1425 vid, privcmd->param_value);
1426 } else {
1427 qparams->max_tx_before_wake =
1428 privcmd->param_value;
1429 }
1430 break;
1431 case WMI_STA_PS_PARAM_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL:
1432 WMA_LOGD("QPOWER CLI CMD:Ps Poll Wake Inv val %d",
1433 privcmd->param_value);
1434 /* Set the QPower Spec Ps Poll Wake Inv */
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001435 ret = wma_unified_set_sta_ps_param(wma->wmi_handle, vid,
1436 WMI_STA_PS_PARAM_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001437 privcmd->param_value);
1438 if (ret) {
1439 WMA_LOGE("Set Q-PsPoll WakeIntv Failed vId %d val %d",
1440 vid, privcmd->param_value);
1441 } else {
1442 qparams->spec_ps_poll_wake_interval =
1443 privcmd->param_value;
1444 }
1445 break;
1446 case WMI_STA_PS_PARAM_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL:
1447 WMA_LOGD("QPOWER CLI CMD:Spec NoData Ps Poll val %d",
1448 privcmd->param_value);
1449 /* Set the QPower Spec NoData PsPoll */
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001450 ret = wma_unified_set_sta_ps_param(wma->wmi_handle, vid,
1451 WMI_STA_PS_PARAM_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001452 privcmd->param_value);
1453 if (ret) {
1454 WMA_LOGE("Set Q-SpecNoDataPsPoll Failed vId %d val %d",
1455 vid, privcmd->param_value);
1456 } else {
1457 qparams->max_spec_nodata_ps_poll =
1458 privcmd->param_value;
1459 }
1460 break;
1461
1462 default:
1463 WMA_LOGE("Invalid param id 0x%x", privcmd->param_id);
1464 break;
1465 }
1466 break;
1467 case GTX_CMD:
1468 WMA_LOGD("vdev id %d pid %d pval %d", privcmd->param_vdev_id,
1469 privcmd->param_id, privcmd->param_value);
1470 switch (privcmd->param_id) {
1471 case WMI_VDEV_PARAM_GTX_HT_MCS:
1472 intr[vid].config.gtx_info.gtxRTMask[0] =
1473 privcmd->param_value;
1474 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1475 privcmd->param_vdev_id,
1476 &intr[vid].config.gtx_info);
1477 break;
1478 case WMI_VDEV_PARAM_GTX_VHT_MCS:
1479 intr[vid].config.gtx_info.gtxRTMask[1] =
1480 privcmd->param_value;
1481 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1482 privcmd->param_vdev_id,
1483 &intr[vid].config.gtx_info);
1484 break;
1485
1486 case WMI_VDEV_PARAM_GTX_USR_CFG:
1487 intr[vid].config.gtx_info.gtxUsrcfg =
1488 privcmd->param_value;
1489 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1490 privcmd->param_vdev_id,
1491 &intr[vid].config.gtx_info);
1492 break;
1493
1494 case WMI_VDEV_PARAM_GTX_THRE:
1495 intr[vid].config.gtx_info.gtxPERThreshold =
1496 privcmd->param_value;
1497 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1498 privcmd->param_vdev_id,
1499 &intr[vid].config.gtx_info);
1500 break;
1501
1502 case WMI_VDEV_PARAM_GTX_MARGIN:
1503 intr[vid].config.gtx_info.gtxPERMargin =
1504 privcmd->param_value;
1505 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1506 privcmd->param_vdev_id,
1507 &intr[vid].config.gtx_info);
1508 break;
1509
1510 case WMI_VDEV_PARAM_GTX_STEP:
1511 intr[vid].config.gtx_info.gtxTPCstep =
1512 privcmd->param_value;
1513 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1514 privcmd->param_vdev_id,
1515 &intr[vid].config.gtx_info);
1516 break;
1517
1518 case WMI_VDEV_PARAM_GTX_MINTPC:
1519 intr[vid].config.gtx_info.gtxTPCMin =
1520 privcmd->param_value;
1521 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1522 privcmd->param_vdev_id,
1523 &intr[vid].config.gtx_info);
1524 break;
1525
1526 case WMI_VDEV_PARAM_GTX_BW_MASK:
1527 intr[vid].config.gtx_info.gtxBWMask =
1528 privcmd->param_value;
1529 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1530 privcmd->param_vdev_id,
1531 &intr[vid].config.gtx_info);
1532 if (ret) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001533 WMA_LOGE("wma_vdev_set_param failed ret %d",
1534 ret);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001535 return;
1536 }
1537 break;
1538 default:
1539 break;
1540 }
1541 break;
1542
1543 default:
1544 WMA_LOGE("Invalid vpdev command id");
1545 }
1546 if (1 == privcmd->param_vp_dev) {
1547 switch (privcmd->param_id) {
1548 case WMI_VDEV_PARAM_NSS:
1549 intr[vid].config.nss = privcmd->param_value;
1550 break;
1551 case WMI_VDEV_PARAM_LDPC:
1552 intr[vid].config.ldpc = privcmd->param_value;
1553 break;
1554 case WMI_VDEV_PARAM_TX_STBC:
1555 intr[vid].config.tx_stbc = privcmd->param_value;
1556 break;
1557 case WMI_VDEV_PARAM_RX_STBC:
1558 intr[vid].config.rx_stbc = privcmd->param_value;
1559 break;
1560 case WMI_VDEV_PARAM_SGI:
1561 intr[vid].config.shortgi = privcmd->param_value;
1562 break;
1563 case WMI_VDEV_PARAM_ENABLE_RTSCTS:
1564 intr[vid].config.rtscts_en = privcmd->param_value;
1565 break;
1566 case WMI_VDEV_PARAM_CHWIDTH:
1567 intr[vid].config.chwidth = privcmd->param_value;
1568 break;
1569 case WMI_VDEV_PARAM_FIXED_RATE:
1570 intr[vid].config.tx_rate = privcmd->param_value;
1571 break;
1572 case WMI_VDEV_PARAM_EARLY_RX_ADJUST_ENABLE:
1573 intr[vid].config.erx_adjust = privcmd->param_value;
1574 break;
1575 case WMI_VDEV_PARAM_EARLY_RX_TGT_BMISS_NUM:
1576 intr[vid].config.erx_bmiss_num = privcmd->param_value;
1577 break;
1578 case WMI_VDEV_PARAM_EARLY_RX_BMISS_SAMPLE_CYCLE:
1579 intr[vid].config.erx_bmiss_cycle = privcmd->param_value;
1580 break;
1581 case WMI_VDEV_PARAM_EARLY_RX_SLOP_STEP:
1582 intr[vid].config.erx_slop_step = privcmd->param_value;
1583 break;
1584 case WMI_VDEV_PARAM_EARLY_RX_INIT_SLOP:
1585 intr[vid].config.erx_init_slop = privcmd->param_value;
1586 break;
1587 case WMI_VDEV_PARAM_EARLY_RX_ADJUST_PAUSE:
1588 intr[vid].config.erx_adj_pause = privcmd->param_value;
1589 break;
1590 case WMI_VDEV_PARAM_EARLY_RX_DRIFT_SAMPLE:
1591 intr[vid].config.erx_dri_sample = privcmd->param_value;
1592 break;
Krishna Kumaar Natarajan1a71ec72017-03-23 12:26:31 -07001593 case WMI_VDEV_PARAM_HE_DCM:
Krishna Kumaar Natarajan150cd012017-03-23 12:29:10 -07001594 case WMI_VDEV_PARAM_HE_RANGE_EXT:
Krishna Kumaar Natarajan1a71ec72017-03-23 12:26:31 -07001595 wma_set_he_vdev_param(&intr[vid], privcmd->param_id,
1596 privcmd->param_value);
1597 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001598 default:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001599 WMA_LOGE("Invalid wma_cli_set vdev command/Not yet implemented 0x%x",
1600 privcmd->param_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001601 break;
1602 }
1603 } else if (2 == privcmd->param_vp_dev) {
1604 switch (privcmd->param_id) {
1605 case WMI_PDEV_PARAM_ANI_ENABLE:
1606 wma->pdevconfig.ani_enable = privcmd->param_value;
1607 break;
1608 case WMI_PDEV_PARAM_ANI_POLL_PERIOD:
1609 wma->pdevconfig.ani_poll_len = privcmd->param_value;
1610 break;
1611 case WMI_PDEV_PARAM_ANI_LISTEN_PERIOD:
1612 wma->pdevconfig.ani_listen_len = privcmd->param_value;
1613 break;
1614 case WMI_PDEV_PARAM_ANI_OFDM_LEVEL:
1615 wma->pdevconfig.ani_ofdm_level = privcmd->param_value;
1616 break;
1617 case WMI_PDEV_PARAM_ANI_CCK_LEVEL:
1618 wma->pdevconfig.ani_cck_level = privcmd->param_value;
1619 break;
1620 case WMI_PDEV_PARAM_DYNAMIC_BW:
1621 wma->pdevconfig.cwmenable = privcmd->param_value;
1622 break;
1623 case WMI_PDEV_PARAM_CTS_CBW:
1624 wma->pdevconfig.cts_cbw = privcmd->param_value;
1625 break;
1626 case WMI_PDEV_PARAM_TX_CHAIN_MASK:
1627 wma->pdevconfig.txchainmask = privcmd->param_value;
1628 break;
1629 case WMI_PDEV_PARAM_RX_CHAIN_MASK:
1630 wma->pdevconfig.rxchainmask = privcmd->param_value;
1631 break;
1632 case WMI_PDEV_PARAM_BURST_ENABLE:
1633 wma->pdevconfig.burst_enable = privcmd->param_value;
1634 if ((wma->pdevconfig.burst_enable == 1) &&
1635 (wma->pdevconfig.burst_dur == 0))
1636 wma->pdevconfig.burst_dur =
1637 WMA_DEFAULT_SIFS_BURST_DURATION;
1638 else if (wma->pdevconfig.burst_enable == 0)
1639 wma->pdevconfig.burst_dur = 0;
1640 break;
1641 case WMI_PDEV_PARAM_BURST_DUR:
1642 wma->pdevconfig.burst_dur = privcmd->param_value;
1643 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001644 case WMI_PDEV_PARAM_TXPOWER_LIMIT2G:
1645 wma->pdevconfig.txpow2g = privcmd->param_value;
1646 if ((pMac->roam.configParam.bandCapability ==
1647 eCSR_BAND_ALL) ||
1648 (pMac->roam.configParam.bandCapability ==
1649 eCSR_BAND_24)) {
1650 if (cfg_set_int(pMac,
1651 WNI_CFG_CURRENT_TX_POWER_LEVEL,
1652 privcmd->param_value) !=
Anurag Chouhanffb21542016-02-17 14:33:03 +05301653 eSIR_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001654 WMA_LOGE("could not set WNI_CFG_CURRENT_TX_POWER_LEVEL");
1655
1656 } else {
1657 WMA_LOGE("Current band is not 2G");
1658 }
1659 break;
1660 case WMI_PDEV_PARAM_TXPOWER_LIMIT5G:
1661 wma->pdevconfig.txpow5g = privcmd->param_value;
1662 if ((pMac->roam.configParam.bandCapability ==
1663 eCSR_BAND_ALL) ||
1664 (pMac->roam.configParam.bandCapability ==
1665 eCSR_BAND_5G)) {
1666 if (cfg_set_int(pMac,
1667 WNI_CFG_CURRENT_TX_POWER_LEVEL,
1668 privcmd->param_value) !=
Anurag Chouhanffb21542016-02-17 14:33:03 +05301669 eSIR_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001670 WMA_LOGE("could not set WNI_CFG_CURRENT_TX_POWER_LEVEL");
1671
1672 } else {
1673 WMA_LOGE("Current band is not 5G");
1674 }
1675 break;
1676 default:
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07001677 WMA_LOGD("Invalid wma_cli_set pdev command/Not yet implemented 0x%x",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001678 privcmd->param_id);
1679 break;
1680 }
1681 } else if (5 == privcmd->param_vp_dev) {
Govind Singhd76a5b02016-03-08 15:12:14 +05301682 ret = wma_vdev_set_param(wma->wmi_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001683 privcmd->param_vdev_id,
1684 WMI_VDEV_PARAM_PACKET_POWERSAVE,
1685 pps_val);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001686 if (ret)
1687 WMA_LOGE("Failed to send wmi packet power save cmd");
1688 else
1689 WMA_LOGD("Sent packet power save cmd %d value %x to target",
1690 privcmd->param_id, pps_val);
1691 }
1692}
1693
Dustin Brown05557182017-10-12 14:44:49 -07001694uint32_t wma_critical_events_in_flight(void)
1695{
1696 t_wma_handle *wma;
1697
1698 wma = cds_get_context(QDF_MODULE_ID_WMA);
1699 if (!wma)
1700 return 0;
1701
1702 return qdf_atomic_read(&wma->critical_events_in_flight);
1703}
1704
1705static bool wma_event_is_critical(uint32_t event_id)
1706{
1707 switch (event_id) {
1708 case WMI_ROAM_SYNCH_EVENTID:
1709 return true;
1710 default:
1711 return false;
1712 }
1713}
1714
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001715/**
1716 * wma_process_fw_event() - process any fw event
1717 * @wma: wma handle
1718 * @buf: fw event buffer
1719 *
1720 * This function process any fw event to serialize it through mc thread.
1721 *
1722 * Return: none
1723 */
1724static int wma_process_fw_event(tp_wma_handle wma,
1725 wma_process_fw_event_params *buf)
1726{
1727 struct wmi_unified *wmi_handle = (struct wmi_unified *)buf->wmi_handle;
Dustin Brown05557182017-10-12 14:44:49 -07001728 uint32_t event_id = WMI_GET_FIELD(qdf_nbuf_data(buf->evt_buf),
1729 WMI_CMD_HDR, COMMANDID);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001730
1731 wmi_process_fw_event(wmi_handle, buf->evt_buf);
Dustin Brown05557182017-10-12 14:44:49 -07001732
1733 if (wma_event_is_critical(event_id))
1734 qdf_atomic_dec(&wma->critical_events_in_flight);
1735
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001736 return 0;
1737}
1738
1739/**
Govind Singhd76a5b02016-03-08 15:12:14 +05301740 * wmi_process_fw_event_tasklet_ctx() - process in tasklet context
1741 * @ctx: handle to wmi
1742 * @ev: wmi event buffer
1743 *
1744 * Event process by below function will be in tasket context,
1745 * need to use this method only for time sensitive functions.
1746 *
1747 * Return: none
1748 */
1749static int wma_process_fw_event_tasklet_ctx(void *ctx, void *ev)
1750{
1751 wmi_process_fw_event(ctx, ev);
1752
1753 return 0;
1754}
1755
1756/**
Manjeet Singhf82ed072016-07-08 11:40:00 +05301757 * wma_process_hal_pwr_dbg_cmd() - send hal pwr dbg cmd to fw.
1758 * @handle: wma handle
1759 * @sir_pwr_dbg_params: unit test command
1760 *
1761 * This function send unit test command to fw.
1762 *
1763 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_** on error
1764 */
1765QDF_STATUS wma_process_hal_pwr_dbg_cmd(WMA_HANDLE handle,
1766 struct sir_mac_pwr_dbg_cmd *
1767 sir_pwr_dbg_params)
1768{
1769 tp_wma_handle wma_handle = (tp_wma_handle)handle;
1770 int i;
1771 struct wmi_power_dbg_params wmi_pwr_dbg_params;
1772 QDF_STATUS status;
1773
1774 if (!sir_pwr_dbg_params) {
1775 WMA_LOGE("%s: sir_pwr_dbg_params is null", __func__);
1776 return QDF_STATUS_E_INVAL;
1777 }
1778 wmi_pwr_dbg_params.module_id = sir_pwr_dbg_params->module_id;
1779 wmi_pwr_dbg_params.pdev_id = sir_pwr_dbg_params->pdev_id;
1780 wmi_pwr_dbg_params.num_args = sir_pwr_dbg_params->num_args;
1781
1782 for (i = 0; i < wmi_pwr_dbg_params.num_args; i++)
1783 wmi_pwr_dbg_params.args[i] = sir_pwr_dbg_params->args[i];
1784
1785 status = wmi_unified_send_power_dbg_cmd(wma_handle->wmi_handle,
1786 &wmi_pwr_dbg_params);
1787
1788 return status;
1789}
1790
Houston Hoffmanb6084f12017-05-30 19:24:07 -07001791static void wma_discard_fw_event(struct scheduler_msg *msg)
1792{
1793 switch (msg->type) {
1794 case WMA_PROCESS_FW_EVENT:
1795 qdf_nbuf_free(((wma_process_fw_event_params *)msg->bodyptr)
1796 ->evt_buf);
1797 break;
Abhishek Singhcaf6a652017-07-06 17:35:42 +05301798 case WMA_SET_LINK_STATE:
1799 qdf_mem_free(((tpLinkStateParams) msg->bodyptr)->callbackArg);
1800 break;
Houston Hoffmanb6084f12017-05-30 19:24:07 -07001801 }
1802 if (msg->bodyptr)
1803 qdf_mem_free(msg->bodyptr);
1804 msg->bodyptr = NULL;
1805 msg->bodyval = 0;
1806 msg->type = 0;
1807}
1808
Manjeet Singhf82ed072016-07-08 11:40:00 +05301809/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001810 * wma_process_fw_event_handler() - common event handler to serialize
1811 * event processing through mc_thread
Govind Singhd76a5b02016-03-08 15:12:14 +05301812 * @ctx: wmi context
1813 * @ev: event buffer
1814 * @rx_ctx: rx execution context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001815 *
1816 * Return: 0 on success, errno on failure
1817 */
Govind Singhd76a5b02016-03-08 15:12:14 +05301818static int wma_process_fw_event_mc_thread_ctx(void *ctx, void *ev)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001819{
1820 wma_process_fw_event_params *params_buf;
Rajeev Kumarb60abe42017-01-21 15:39:31 -08001821 struct scheduler_msg cds_msg = { 0 };
Dustin Brown05557182017-10-12 14:44:49 -07001822 tp_wma_handle wma;
1823 uint32_t event_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001824
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301825 params_buf = qdf_mem_malloc(sizeof(wma_process_fw_event_params));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001826 if (!params_buf) {
1827 WMA_LOGE("%s: Failed alloc memory for params_buf", __func__);
Govind Singhd76a5b02016-03-08 15:12:14 +05301828 qdf_nbuf_free(ev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001829 return -ENOMEM;
1830 }
1831
Govind Singhd76a5b02016-03-08 15:12:14 +05301832 params_buf->wmi_handle = (struct wmi_unified *)ctx;
1833 params_buf->evt_buf = (wmi_buf_t *)ev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001834
Dustin Brown05557182017-10-12 14:44:49 -07001835 wma = cds_get_context(QDF_MODULE_ID_WMA);
1836 event_id = WMI_GET_FIELD(qdf_nbuf_data(params_buf->evt_buf),
1837 WMI_CMD_HDR, COMMANDID);
1838 if (wma && wma_event_is_critical(event_id))
1839 qdf_atomic_inc(&wma->critical_events_in_flight);
1840
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001841 cds_msg.type = WMA_PROCESS_FW_EVENT;
1842 cds_msg.bodyptr = params_buf;
1843 cds_msg.bodyval = 0;
Houston Hoffmanb6084f12017-05-30 19:24:07 -07001844 cds_msg.flush_callback = wma_discard_fw_event;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001845
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301846 if (QDF_STATUS_SUCCESS !=
Rajeev Kumarb60abe42017-01-21 15:39:31 -08001847 scheduler_post_msg(QDF_MODULE_ID_WMA, &cds_msg)) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07001848 WMA_LOGE("%s: Failed to post WMA_PROCESS_FW_EVENT msg",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001849 __func__);
Govind Singhd76a5b02016-03-08 15:12:14 +05301850 qdf_nbuf_free(ev);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301851 qdf_mem_free(params_buf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001852 return -EFAULT;
1853 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001854 return 0;
1855
1856}
1857
Govind Singhd76a5b02016-03-08 15:12:14 +05301858/**
1859 * wma_process_fw_event_handler() - common event handler to serialize
1860 * event processing through mc_thread
1861 * @ctx: wmi context
1862 * @ev: event buffer
1863 * @rx_ctx: rx execution context
1864 *
1865 * Return: 0 on success, errno on failure
1866 */
1867int wma_process_fw_event_handler(void *ctx, void *ev, uint8_t rx_ctx)
1868{
1869 int err = 0;
1870
1871 if (rx_ctx == WMA_RX_SERIALIZER_CTX) {
1872 err = wma_process_fw_event_mc_thread_ctx(ctx, ev);
1873 } else if (rx_ctx == WMA_RX_TASKLET_CTX) {
1874 wma_process_fw_event_tasklet_ctx(ctx, ev);
1875 } else {
1876 WMA_LOGE("%s: invalid wmi event execution context", __func__);
1877 qdf_nbuf_free(ev);
1878 }
1879
1880 return err;
1881}
1882
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001883#ifdef WLAN_FEATURE_NAN
1884/**
1885 * wma_set_nan_enable() - set nan enable flag in WMA handle
1886 * @wma_handle: Pointer to wma handle
Arun Khandavallic811dcc2016-06-26 07:37:21 +05301887 * @cds_cfg: Pointer to CDS Configuration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001888 *
1889 * Return: none
1890 */
1891static void wma_set_nan_enable(tp_wma_handle wma_handle,
Arun Khandavallic811dcc2016-06-26 07:37:21 +05301892 struct cds_config_info *cds_cfg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001893{
Arun Khandavallic811dcc2016-06-26 07:37:21 +05301894 wma_handle->is_nan_enabled = cds_cfg->is_nan_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001895}
1896#else
1897static void wma_set_nan_enable(tp_wma_handle wma_handle,
Arun Khandavallic811dcc2016-06-26 07:37:21 +05301898 struct cds_config_info *cds_cfg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001899{
1900}
1901#endif
1902
1903/**
Komal Seelam02d09342016-02-23 18:03:19 +05301904 * wma_init_max_no_of_peers - API to initialize wma configuration params
1905 * @wma_handle: WMA Handle
1906 * @max_peers: Max Peers supported
1907 *
1908 * Return: void
1909 */
1910static void wma_init_max_no_of_peers(tp_wma_handle wma_handle,
1911 uint16_t max_peers)
1912{
1913 struct wma_ini_config *cfg = wma_get_ini_handle(wma_handle);
1914
Naveen Rawat35804772016-06-27 15:40:28 -07001915 if (cfg == NULL) {
1916 WMA_LOGE("%s: NULL WMA ini handle", __func__);
1917 return;
1918 }
1919
Komal Seelam02d09342016-02-23 18:03:19 +05301920 cfg->max_no_of_peers = max_peers;
1921}
1922
Prashanth Bhattae675ca72016-10-20 18:42:37 -07001923/**
Manikandan Mohanb0932ab2017-02-12 16:30:55 -08001924 * wma_cleanup_vdev_resp_queue() - cleanup vdev response queue
1925 * @wma: wma handle
1926 *
1927 * Return: none
1928 */
1929static void wma_cleanup_vdev_resp_queue(tp_wma_handle wma)
1930{
1931 struct wma_target_req *req_msg = NULL;
1932 qdf_list_node_t *node1 = NULL;
Manikandan Mohanb0932ab2017-02-12 16:30:55 -08001933
1934 qdf_spin_lock_bh(&wma->vdev_respq_lock);
1935 if (!qdf_list_size(&wma->vdev_resp_queue)) {
1936 qdf_spin_unlock_bh(&wma->vdev_respq_lock);
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08001937 WMA_LOGD(FL("request queue maybe empty"));
Manikandan Mohanb0932ab2017-02-12 16:30:55 -08001938 return;
1939 }
1940
Sandeep Puligilla5ac6bd22017-10-17 12:33:56 -07001941 WMA_LOGD(FL("Cleaning up vdev resp queue"));
1942
Wu Gao30f65eb2017-08-09 19:56:10 +08001943 /* peek front, and then cleanup it in wma_vdev_resp_timer */
1944 while (qdf_list_peek_front(&wma->vdev_resp_queue, &node1) ==
Manikandan Mohanb0932ab2017-02-12 16:30:55 -08001945 QDF_STATUS_SUCCESS) {
1946 req_msg = qdf_container_of(node1, struct wma_target_req, node);
Manikandan Mohanb0932ab2017-02-12 16:30:55 -08001947 qdf_spin_unlock_bh(&wma->vdev_respq_lock);
Abhishek Singhc614ec42017-04-25 16:17:34 +05301948 qdf_mc_timer_stop(&req_msg->event_timeout);
1949 wma_vdev_resp_timer(req_msg);
Manikandan Mohanb0932ab2017-02-12 16:30:55 -08001950 qdf_spin_lock_bh(&wma->vdev_respq_lock);
1951 }
1952 qdf_spin_unlock_bh(&wma->vdev_respq_lock);
1953}
1954
1955/**
Abhishek Singhc614ec42017-04-25 16:17:34 +05301956 * wma_cleanup_hold_req() - cleanup hold request queue
1957 * @wma: wma handle
1958 *
1959 * Return: none
1960 */
1961static void wma_cleanup_hold_req(tp_wma_handle wma)
1962{
1963 struct wma_target_req *req_msg = NULL;
1964 qdf_list_node_t *node1 = NULL;
1965
1966 qdf_spin_lock_bh(&wma->wma_hold_req_q_lock);
1967 if (!qdf_list_size(&wma->wma_hold_req_queue)) {
1968 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
1969 WMA_LOGD(FL("request queue is empty"));
1970 return;
1971 }
1972
Wu Gao30f65eb2017-08-09 19:56:10 +08001973 /* peek front, and then cleanup it in wma_hold_req_timer */
Abhishek Singhc614ec42017-04-25 16:17:34 +05301974 while (QDF_STATUS_SUCCESS ==
Wu Gao30f65eb2017-08-09 19:56:10 +08001975 qdf_list_peek_front(&wma->wma_hold_req_queue, &node1)) {
Abhishek Singhc614ec42017-04-25 16:17:34 +05301976 req_msg = qdf_container_of(node1, struct wma_target_req, node);
1977 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
1978 /* Cleanup timeout handler */
1979 qdf_mc_timer_stop(&req_msg->event_timeout);
Abhishek Singhc614ec42017-04-25 16:17:34 +05301980 wma_hold_req_timer(req_msg);
1981 qdf_spin_lock_bh(&wma->wma_hold_req_q_lock);
1982 }
1983 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
1984}
1985
1986/**
Prashanth Bhattae675ca72016-10-20 18:42:37 -07001987 * wma_shutdown_notifier_cb - Shutdown notifer call back
1988 * @priv : WMA handle
1989 *
1990 * During recovery, WMA may wait for resume to complete if the crash happens
1991 * while in suspend. This may cause delays in completing the recovery. This call
1992 * back would be called during recovery and the event is completed so that if
1993 * the resume is waiting on FW to respond then it can get out of the wait so
1994 * that recovery thread can start bringing down all the modules.
1995 *
1996 * Return: None
1997 */
1998static void wma_shutdown_notifier_cb(void *priv)
1999{
2000 tp_wma_handle wma_handle = priv;
2001
2002 qdf_event_set(&wma_handle->wma_resume_event);
Manikandan Mohanb0932ab2017-02-12 16:30:55 -08002003 wma_cleanup_vdev_resp_queue(wma_handle);
Abhishek Singhc614ec42017-04-25 16:17:34 +05302004 wma_cleanup_hold_req(wma_handle);
Mukul Sharma4c60a7e2017-03-06 19:42:18 +05302005 pmo_ucfg_psoc_wakeup_host_event_received(wma_handle->psoc);
Prashanth Bhattae675ca72016-10-20 18:42:37 -07002006}
2007
Mukul Sharma5ff3c582016-09-12 15:23:35 +05302008struct wma_version_info g_wmi_version_info;
2009
Komal Seelam02d09342016-02-23 18:03:19 +05302010/**
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05302011 * wma_state_info_dump() - prints state information of wma layer
2012 * @buf: buffer pointer
2013 * @size: size of buffer to be filled
2014 *
2015 * This function is used to dump state information of wma layer
2016 *
2017 * Return: None
2018 */
2019static void wma_state_info_dump(char **buf_ptr, uint16_t *size)
2020{
Dustin Brown9d797d62017-01-11 16:39:12 -08002021 t_wma_handle *wma;
2022 struct sir_vdev_wow_stats *stats;
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05302023 uint16_t len = 0;
2024 char *buf = *buf_ptr;
2025 struct wma_txrx_node *iface;
2026 uint8_t vdev_id;
2027
Dustin Brown9d797d62017-01-11 16:39:12 -08002028 wma = cds_get_context(QDF_MODULE_ID_WMA);
2029 if (!wma) {
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05302030 WMA_LOGE("%s: WMA context is invald!", __func__);
2031 return;
2032 }
2033
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07002034 WMA_LOGE("%s: size of buffer: %d", __func__, *size);
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05302035
Dustin Brown9d797d62017-01-11 16:39:12 -08002036 for (vdev_id = 0; vdev_id < wma->max_bssid; vdev_id++) {
2037 iface = &wma->interfaces[vdev_id];
2038 if (!iface->handle)
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05302039 continue;
2040
Dustin Brown9d797d62017-01-11 16:39:12 -08002041 stats = &iface->wow_stats;
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05302042 len += qdf_scnprintf(buf + len, *size - len,
Dustin Brown9d797d62017-01-11 16:39:12 -08002043 "\n"
2044 "vdev_id %d\n"
2045 "WoW Stats\n"
2046 "\tpno_match %u\n"
2047 "\tpno_complete %u\n"
2048 "\tgscan %u\n"
2049 "\tlow_rssi %u\n"
2050 "\trssi_breach %u\n"
2051 "\tucast %u\n"
2052 "\tbcast %u\n"
2053 "\ticmpv4 %u\n"
2054 "\ticmpv6 %u\n"
2055 "\tipv4_mcast %u\n"
2056 "\tipv6_mcast %u\n"
2057 "\tipv6_mcast_ra %u\n"
2058 "\tipv6_mcast_ns %u\n"
2059 "\tipv6_mcast_na %u\n"
2060 "\toem_response %u\n"
2061 "conn_state %d\n"
2062 "dtimPeriod %d\n"
2063 "chanmode %d\n"
2064 "vht_capable %d\n"
2065 "ht_capable %d\n"
2066 "chan_width %d\n"
2067 "vdev_active %d\n"
2068 "vdev_up %d\n"
2069 "aid %d\n"
2070 "rate_flags %d\n"
2071 "nss %d\n"
2072 "tx_power %d\n"
2073 "max_tx_power %d\n"
2074 "nwType %d\n"
2075 "tx_streams %d\n"
2076 "rx_streams %d\n"
2077 "chain_mask %d\n"
2078 "nss_2g %d\n"
2079 "nss_5g %d",
2080 vdev_id,
2081 stats->pno_match,
2082 stats->pno_complete,
2083 stats->gscan,
2084 stats->low_rssi,
2085 stats->rssi_breach,
2086 stats->ucast,
2087 stats->bcast,
2088 stats->icmpv4,
2089 stats->icmpv6,
2090 stats->ipv4_mcast,
2091 stats->ipv6_mcast,
2092 stats->ipv6_mcast_ra,
2093 stats->ipv6_mcast_ns,
2094 stats->ipv6_mcast_na,
2095 stats->oem_response,
2096 iface->conn_state,
2097 iface->dtimPeriod,
2098 iface->chanmode,
2099 iface->vht_capable,
2100 iface->ht_capable,
2101 iface->chan_width,
2102 iface->vdev_active,
Mukul Sharmaf9047232017-03-02 16:58:56 +05302103 wma_is_vdev_up(vdev_id),
Dustin Brown9d797d62017-01-11 16:39:12 -08002104 iface->aid,
2105 iface->rate_flags,
2106 iface->nss,
2107 iface->tx_power,
2108 iface->max_tx_power,
2109 iface->nwType,
2110 iface->tx_streams,
2111 iface->rx_streams,
2112 iface->chain_mask,
2113 iface->nss_2g,
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05302114 iface->nss_5g);
2115 }
2116
2117 *size -= len;
2118 *buf_ptr += len;
2119}
2120
2121/**
2122 * wma_register_debug_callback() - registration function for wma layer
2123 * to print wma state information
2124 */
2125static void wma_register_debug_callback(void)
2126{
2127 qdf_register_debug_callback(QDF_MODULE_ID_WMA, &wma_state_info_dump);
2128}
2129
Frank Liu65b17d92016-11-23 15:58:44 +08002130/**
2131 * wma_register_tx_ops_handler() - register tx_ops of southbound
2132 * @tx_ops: tx_ops pointer in southbound
2133 *
2134 * Return: 0 on success, errno on failure
2135 */
2136static QDF_STATUS
2137wma_register_tx_ops_handler(struct wlan_lmac_if_tx_ops *tx_ops)
2138{
2139 /*
2140 * Assign tx_ops, it's up to UMAC modules to declare and define these
2141 * functions which are used to send wmi command to target.
2142 */
2143
Himanshu Agarwalce716f82016-12-21 19:07:54 +05302144 if (!tx_ops) {
2145 WMA_LOGE("%s: pointer to lmac if tx ops is NULL", __func__);
2146 return QDF_STATUS_E_INVAL;
2147 }
2148
2149 /* mgmt_txrx component's tx ops */
2150 tx_ops->mgmt_txrx_tx_ops.mgmt_tx_send = wma_mgmt_unified_cmd_send;
2151
Frank Liu65b17d92016-11-23 15:58:44 +08002152 return QDF_STATUS_SUCCESS;
2153}
2154
2155/**
2156 * wma_target_if_open() - Attach UMAC modules' interface with wmi layer
2157 * @wma_handle: wma handle
2158 *
2159 * Separate module defines below functions:
2160 * 1. tgt_wmi_<module>_<action> api sends wmi command, assigned to south bound
2161 * tx_ops function pointers;
2162 * 2. module's south dispatcher handles information from lower layer, assigned
2163 * to south bound rx_ops function pointers;
2164 * 3. wmi event handler deals with wmi event, extracts umac needed information,
2165 * and call rx_ops(module's dispatcher). It executes in tasklet context and
2166 * is up to dispatcher to decide the context to reside in tasklet or in
2167 * thread context.
2168 *
2169 * Return: None
2170 */
2171static void wma_target_if_open(tp_wma_handle wma_handle)
2172{
Selvaraj, Sridhar0672a122016-12-29 16:11:48 +05302173 struct wlan_objmgr_psoc *psoc = wma_handle->psoc;
Frank Liu65b17d92016-11-23 15:58:44 +08002174
2175 if (!psoc)
2176 return;
2177
Mukul Sharmadad267e2017-02-04 13:25:34 +05302178 wlan_global_lmac_if_set_txops_registration_cb(WLAN_DEV_OL,
2179 target_if_register_tx_ops);
2180 wlan_lmac_if_set_umac_txops_registration_cb(
2181 wma_register_tx_ops_handler);
2182 wlan_global_lmac_if_open(psoc);
Frank Liu65b17d92016-11-23 15:58:44 +08002183
Frank Liu65b17d92016-11-23 15:58:44 +08002184}
2185
2186/**
2187 * wma_target_if_close() - Detach UMAC modules' interface with wmi layer
2188 * @wma_handle: wma handle
2189 *
2190 * Return: None
2191 */
2192static void wma_target_if_close(tp_wma_handle wma_handle)
2193{
Selvaraj, Sridhar0672a122016-12-29 16:11:48 +05302194 struct wlan_objmgr_psoc *psoc = wma_handle->psoc;
Frank Liu65b17d92016-11-23 15:58:44 +08002195
2196 if (!psoc)
2197 return;
2198
Mukul Sharmadad267e2017-02-04 13:25:34 +05302199 wlan_global_lmac_if_close(psoc);
Frank Liu65b17d92016-11-23 15:58:44 +08002200}
Frank Liu65b17d92016-11-23 15:58:44 +08002201
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05302202/**
Mukul Sharmac3e7a782017-02-03 12:16:11 +05302203 * wma_get_psoc_from_scn_handle() - API to get psoc from scn handle
2204 * @scn_handle: opaque wma handle
2205 *
2206 * API to get psoc from scn handle
2207 *
2208 * Return: None
2209 */
2210static struct wlan_objmgr_psoc *wma_get_psoc_from_scn_handle(void *scn_handle)
2211{
2212 tp_wma_handle wma_handle;
2213
2214 if (!scn_handle) {
2215 WMA_LOGE("invalid scn handle");
2216 return NULL;
2217 }
2218 wma_handle = (tp_wma_handle)scn_handle;
2219
2220 return wma_handle->psoc;
2221}
Rajeev Kumarda2444c2017-01-10 22:42:07 -08002222/**
2223 * wma_legacy_service_ready_event_handler() - legacy (ext)service ready handler
2224 * @event_id: event_id
2225 * @handle: wma handle
2226 * @event_data: event data
2227 * @length: event length
2228 *
2229 * Return: 0 for success, negative error code for failure
2230 */
2231static int wma_legacy_service_ready_event_handler(uint32_t event_id,
2232 void *handle,
2233 uint8_t *event_data,
2234 uint32_t length)
2235{
2236 if (wmi_service_ready_event_id == event_id)
2237 return wma_rx_service_ready_event(handle, event_data, length);
2238 else if (wmi_service_ready_ext_event_id == event_id)
2239 return wma_rx_service_ready_ext_event(handle, event_data,
2240 length);
2241 else
2242 QDF_BUG(0);
2243
2244 return 0;
2245}
Mukul Sharmac3e7a782017-02-03 12:16:11 +05302246
2247/**
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002248 * wma_flush_complete_evt_handler() - FW log flush complete event handler
2249 * @handle: WMI handle
2250 * @event: Event recevied from FW
2251 * @len: Length of the event
2252 *
2253 */
2254static int wma_flush_complete_evt_handler(void *handle,
2255 u_int8_t *event,
2256 u_int32_t len)
2257{
2258 QDF_STATUS status;
2259 tp_wma_handle wma = (tp_wma_handle) handle;
2260
2261 WMI_DEBUG_MESG_FLUSH_COMPLETE_EVENTID_param_tlvs *param_buf;
2262 wmi_debug_mesg_flush_complete_fixed_param *wmi_event;
Poddar, Siddarthc2c08142017-09-13 17:49:56 +05302263 wmi_debug_mesg_fw_data_stall_param *data_stall_event;
2264 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
2265 uint8_t *buf_ptr;
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002266 uint32_t reason_code;
2267
2268 param_buf = (WMI_DEBUG_MESG_FLUSH_COMPLETE_EVENTID_param_tlvs *) event;
2269 if (!param_buf) {
2270 WMA_LOGE("Invalid log flush complete event buffer");
2271 return QDF_STATUS_E_FAILURE;
2272 }
2273
2274 wmi_event = param_buf->fixed_param;
2275 reason_code = wmi_event->reserved0;
2276
Poddar, Siddarthc2c08142017-09-13 17:49:56 +05302277 buf_ptr = (uint8_t *)wmi_event;
2278 buf_ptr = buf_ptr + sizeof(wmi_debug_mesg_flush_complete_fixed_param) +
2279 WMI_TLV_HDR_SIZE;
2280 data_stall_event = (wmi_debug_mesg_fw_data_stall_param *) buf_ptr;
2281
2282 if (((data_stall_event->tlv_header & 0xFFFF0000) >> 16 ==
2283 WMITLV_TAG_STRUC_wmi_debug_mesg_fw_data_stall_param)) {
2284 /**
2285 * Log data stall info received from FW:
2286 *
2287 * Possible data stall recovery types:
2288 * WLAN_DBG_DATA_STALL_RECOVERY_CONNECT_DISCONNECT
2289 * WLAN_DBG_DATA_STALL_RECOVERY_CONNECT_MAC_PHY_RESET
2290 * WLAN_DBG_DATA_STALL_RECOVERY_CONNECT_PDR
2291 *
2292 * Possible data stall event types:
2293 * WLAN_DBG_DATA_STALL_VDEV_PAUSE
2294 * WLAN_DBG_DATA_STALL_HWSCHED_CMD_FILTER
2295 * WLAN_DBG_DATA_STALL_HWSCHED_CMD_FLUSH
2296 * WLAN_DBG_DATA_STALL_RX_REFILL_FAILED
2297 * WLAN_DBG_DATA_STALL_RX_FCS_LEN_ERROR
2298 *
2299 * reason_code1:
2300 * The information stored in reason_code1 varies based on the
2301 * data stall type values:
2302 *
2303 * data_stall_type | reason_code1
2304 * -----------------------------------------------------
2305 * HWSCHED_CMD_FLUSH | flush req reason (0-40)
2306 * RX_REFILL_FAILED | ring_id (0-7)
2307 * RX_FCS_LEN_ERROR | exact error type
2308 *
2309 * reasone_code2:
2310 * on which tid/hwq stall happened
2311 *
2312 */
2313 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG,
2314 "Data Stall event:");
2315 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG,
2316 "data_stall_type: %x vdev_id_bitmap: %x reason_code1: %x reason_code2: %x recovery_type: %x ",
2317 data_stall_event->data_stall_type,
2318 data_stall_event->vdev_id_bitmap,
2319 data_stall_event->reason_code1,
2320 data_stall_event->reason_code2,
2321 data_stall_event->recovery_type);
2322
2323 cdp_post_data_stall_event(soc,
2324 DATA_STALL_LOG_INDICATOR_FIRMWARE,
2325 data_stall_event->data_stall_type,
2326 0XFF,
2327 data_stall_event->vdev_id_bitmap,
2328 data_stall_event->recovery_type);
2329 }
2330
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002331 /*
2332 * reason_code = 0; Flush event in response to flush command
2333 * reason_code = other value; Asynchronous flush event for fatal events
2334 */
2335 if (!reason_code && (cds_is_log_report_in_progress() == false)) {
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08002336 WMA_LOGD("Received WMI flush event without sending CMD");
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002337 return -EINVAL;
2338 } else if (!reason_code && cds_is_log_report_in_progress() == true) {
2339 /* Flush event in response to flush command */
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08002340 WMA_LOGD("Received WMI flush event in response to flush CMD");
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002341 status = qdf_mc_timer_stop(&wma->log_completion_timer);
2342 if (status != QDF_STATUS_SUCCESS)
2343 WMA_LOGE("Failed to stop the log completion timeout");
2344 cds_logging_set_fw_flush_complete();
Zhu Jianminb639e9b2017-10-26 19:09:12 +08002345 return QDF_STATUS_SUCCESS;
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002346 } else if (reason_code && cds_is_log_report_in_progress() == false) {
2347 /* Asynchronous flush event for fatal events */
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002348 status = cds_set_log_completion(WLAN_LOG_TYPE_FATAL,
2349 WLAN_LOG_INDICATOR_FIRMWARE,
2350 reason_code, false);
2351 if (QDF_STATUS_SUCCESS != status) {
2352 WMA_LOGE("%s: Failed to set log trigger params",
2353 __func__);
2354 return QDF_STATUS_E_FAILURE;
2355 }
2356 cds_logging_set_fw_flush_complete();
2357 return status;
2358 } else {
2359 /* Asynchronous flush event for fatal event,
2360 * but, report in progress already
2361 */
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08002362 WMA_LOGD("%s: Bug report already in progress - dropping! type:%d, indicator=%d reason_code=%d",
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002363 __func__, WLAN_LOG_TYPE_FATAL,
2364 WLAN_LOG_INDICATOR_FIRMWARE, reason_code);
2365 return QDF_STATUS_E_FAILURE;
2366 }
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002367 /* Asynchronous flush event for fatal event,
2368 * but, report in progress already
2369 */
2370 WMA_LOGW("%s: Bug report already in progress - dropping! type:%d, indicator=%d reason_code=%d",
2371 __func__, WLAN_LOG_TYPE_FATAL,
2372 WLAN_LOG_INDICATOR_FIRMWARE, reason_code);
2373 return QDF_STATUS_E_FAILURE;
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002374}
2375
Arif Hussainf63f7a32017-08-22 12:49:42 -07002376/**
2377 * wma_unified_phyerr_rx_event_handler() - phyerr event handler
2378 * @handle: wma handle
2379 * @data: data buffer
2380 * @datalen: buffer length
2381 *
2382 * WMI Handler for WMI_PHYERR_EVENTID event from firmware.
2383 * This handler is currently handling DFS and spectral scan
2384 * phy errors.
2385 *
2386 * Return: 0 for success, other value for failure
2387 */
2388static int wma_unified_phyerr_rx_event_handler(void *handle,
2389 uint8_t *data, uint32_t datalen) {
2390 /* phyerr handling is moved to cmn project
2391 * As WIN still uses handler registration in non-cmn code.
2392 * need complete testing of non offloaded DFS code before we enable
2393 * it in cmn code.
2394 **/
2395 return QDF_STATUS_SUCCESS;
2396}
2397
Dustin Brownec2c92e2017-07-26 11:13:49 -07002398void wma_vdev_init(struct wma_txrx_node *vdev)
2399{
2400 qdf_wake_lock_create(&vdev->vdev_start_wakelock, "vdev_start");
2401 qdf_wake_lock_create(&vdev->vdev_stop_wakelock, "vdev_stop");
Rajeev Kumar155a3e42017-10-10 15:31:17 -07002402 qdf_wake_lock_create(&vdev->vdev_set_key_wakelock, "vdev_set_key");
Dustin Brownec2c92e2017-07-26 11:13:49 -07002403}
2404
2405void wma_vdev_deinit(struct wma_txrx_node *vdev)
2406{
2407 qdf_wake_lock_destroy(&vdev->vdev_start_wakelock);
2408 qdf_wake_lock_destroy(&vdev->vdev_stop_wakelock);
Rajeev Kumar155a3e42017-10-10 15:31:17 -07002409 qdf_wake_lock_destroy(&vdev->vdev_set_key_wakelock);
Dustin Brownec2c92e2017-07-26 11:13:49 -07002410}
2411
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002412/**
Vignesh Viswanathan731186f2017-09-18 13:47:37 +05302413 * wma_rx_service_available_event() - service available event handler
2414 * @handle: pointer to wma handle
2415 * @cmd_param_info: Pointer to service available event TLVs
2416 * @length: length of the event buffer received
2417 *
2418 * Return: zero on success, error code on failure
2419 */
2420static int wma_rx_service_available_event(void *handle, uint8_t *cmd_param_info,
2421 uint32_t length)
2422{
2423 tp_wma_handle wma_handle = (tp_wma_handle) handle;
2424 WMI_SERVICE_AVAILABLE_EVENTID_param_tlvs *param_buf;
2425 wmi_service_available_event_fixed_param *ev;
2426
2427 param_buf = (WMI_SERVICE_AVAILABLE_EVENTID_param_tlvs *) cmd_param_info;
2428 if (!(handle && param_buf)) {
2429 WMA_LOGE("%s: Invalid arguments", __func__);
2430 return -EINVAL;
2431 }
2432
2433 ev = param_buf->fixed_param;
2434 if (!ev) {
2435 WMA_LOGE("%s: Invalid buffer", __func__);
2436 return -EINVAL;
2437 }
2438
2439 WMA_LOGD("WMA <-- WMI_SERVICE_AVAILABLE_EVENTID");
2440
2441 wma_handle->wmi_service_ext_offset = ev->wmi_service_segment_offset;
2442 qdf_mem_copy(wma_handle->wmi_service_ext_bitmap,
2443 &ev->wmi_service_segment_bitmap[0],
2444 WMI_SERVICE_EXT_BM_SIZE32);
2445
2446 return 0;
2447}
2448
2449/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002450 * wma_open() - Allocate wma context and initialize it.
Selvaraj, Sridhar0672a122016-12-29 16:11:48 +05302451 * @psoc: Psoc pointer
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002452 * @wma_tgt_cfg_cb: tgt config callback fun
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302453 * @cds_cfg: mac parameters
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002454 *
2455 * Return: 0 on success, errno on failure
2456 */
Jeff Johnsonff6addf2017-09-13 10:06:03 -07002457QDF_STATUS wma_open(struct wlan_objmgr_psoc *psoc,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002458 wma_tgt_cfg_cb tgt_cfg_cb,
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302459 struct cds_config_info *cds_cfg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002460{
2461 tp_wma_handle wma_handle;
2462 HTC_HANDLE htc_handle;
Anurag Chouhan6d760662016-02-20 16:05:43 +05302463 qdf_device_t qdf_dev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002464 void *wmi_handle;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302465 QDF_STATUS qdf_status;
Govind Singhd76a5b02016-03-08 15:12:14 +05302466 struct wmi_rx_ops ops;
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07002467 struct policy_mgr_wma_cbacks wma_cbacks;
Frank Liu00d73fe2017-05-19 22:11:28 +08002468 struct target_psoc_info *tgt_psoc_info;
Govind Singhd76a5b02016-03-08 15:12:14 +05302469 bool use_cookie = false;
Dustin Brownec2c92e2017-07-26 11:13:49 -07002470 int i;
Jeff Johnsonff6addf2017-09-13 10:06:03 -07002471 void *cds_context;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002472
2473 WMA_LOGD("%s: Enter", __func__);
2474
Jeff Johnsonff6addf2017-09-13 10:06:03 -07002475 cds_context = cds_get_global_context();
2476 if (!cds_context) {
2477 WMA_LOGE("%s: Invalid CDS context", __func__);
2478 return QDF_STATUS_E_INVAL;
2479 }
2480
Mukul Sharma5ff3c582016-09-12 15:23:35 +05302481 g_wmi_version_info.major = __WMI_VER_MAJOR_;
2482 g_wmi_version_info.minor = __WMI_VER_MINOR_;
2483 g_wmi_version_info.revision = __WMI_REVISION_;
2484
Anurag Chouhan6d760662016-02-20 16:05:43 +05302485 qdf_dev = cds_get_context(QDF_MODULE_ID_QDF_DEVICE);
2486 htc_handle = cds_get_context(QDF_MODULE_ID_HTC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002487
2488 if (!htc_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07002489 WMA_LOGE("%s: Invalid HTC handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302490 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002491 }
2492
2493 /* Alloc memory for WMA Context */
Jeff Johnsonadb3b1c2017-09-13 10:42:36 -07002494 qdf_status = cds_alloc_context(QDF_MODULE_ID_WMA,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002495 (void **)&wma_handle,
Jeff Johnsonadb3b1c2017-09-13 10:42:36 -07002496 sizeof(*wma_handle));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002497
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302498 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07002499 WMA_LOGE("%s: Memory allocation failed for wma_handle",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002500 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302501 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002502 }
2503
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302504 qdf_mem_zero(wma_handle, sizeof(t_wma_handle));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002505
Frank Liu00d73fe2017-05-19 22:11:28 +08002506 tgt_psoc_info = qdf_mem_malloc(sizeof(*tgt_psoc_info));
2507 if (!tgt_psoc_info) {
2508 WMA_LOGE("%s: failed to allocate mem for tgt info", __func__);
2509 return QDF_STATUS_E_NOMEM;
2510 }
2511
Anurag Chouhan6d760662016-02-20 16:05:43 +05302512 if (cds_get_conparam() != QDF_GLOBAL_FTM_MODE) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002513#ifdef FEATURE_WLAN_EXTSCAN
Anurag Chouhana37b5b72016-02-21 14:53:42 +05302514 qdf_wake_lock_create(&wma_handle->extscan_wake_lock,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002515 "wlan_extscan_wl");
2516#endif /* FEATURE_WLAN_EXTSCAN */
Mukul Sharmae44d0542017-05-23 21:50:56 +05302517 qdf_wake_lock_create(&wma_handle->wow_wake_lock,
2518 "wlan_wow_wl");
2519 qdf_wake_lock_create(&wma_handle->wow_auth_req_wl,
2520 "wlan_auth_req_wl");
2521 qdf_wake_lock_create(&wma_handle->wow_assoc_req_wl,
2522 "wlan_assoc_req_wl");
2523 qdf_wake_lock_create(&wma_handle->wow_deauth_rec_wl,
2524 "wlan_deauth_rec_wl");
2525 qdf_wake_lock_create(&wma_handle->wow_disassoc_rec_wl,
2526 "wlan_disassoc_rec_wl");
2527 qdf_wake_lock_create(&wma_handle->wow_ap_assoc_lost_wl,
2528 "wlan_ap_assoc_lost_wl");
2529 qdf_wake_lock_create(&wma_handle->wow_auto_shutdown_wl,
2530 "wlan_auto_shutdown_wl");
2531 qdf_wake_lock_create(&wma_handle->roam_ho_wl,
2532 "wlan_roam_ho_wl");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002533 }
2534
Selvaraj, Sridhar3a1823f2017-02-01 17:32:21 +05302535 qdf_status = wlan_objmgr_psoc_try_get_ref(psoc, WLAN_LEGACY_WMA_ID);
2536 if (QDF_IS_STATUS_ERROR(qdf_status)) {
2537 WMA_LOGE("%s: PSOC get_ref fails", __func__);
Frank Liu00d73fe2017-05-19 22:11:28 +08002538 qdf_mem_free(tgt_psoc_info);
Selvaraj, Sridhar3a1823f2017-02-01 17:32:21 +05302539 return qdf_status;
2540 }
Selvaraj, Sridhar0672a122016-12-29 16:11:48 +05302541 wma_handle->psoc = psoc;
2542
Rajeev Kumarda2444c2017-01-10 22:42:07 -08002543 /* Open target_if layer and register wma callback */
2544 wma_target_if_open(wma_handle);
2545 target_if_open(wma_get_psoc_from_scn_handle);
2546
Govind Singhd76a5b02016-03-08 15:12:14 +05302547 /* Attach mc_thread context processing function */
2548 ops.wma_process_fw_event_handler_cbk = wma_process_fw_event_handler;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002549 /* attach the wmi */
Govind Singhd76a5b02016-03-08 15:12:14 +05302550 wmi_handle = wmi_unified_attach(wma_handle, NULL,
Mukul Sharmacc1f3f92017-01-30 19:56:24 +05302551 WMI_TLV_TARGET, use_cookie, &ops, psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002552 if (!wmi_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07002553 WMA_LOGE("%s: failed to attach WMI", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302554 qdf_status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002555 goto err_wma_handle;
2556 }
2557
Rajeev Kumarda2444c2017-01-10 22:42:07 -08002558 target_if_register_legacy_service_ready_cb(
2559 wma_legacy_service_ready_event_handler);
2560
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002561 WMA_LOGA("WMA --> wmi_unified_attach - success");
Mukul Sharmacc1f3f92017-01-30 19:56:24 +05302562
Frank Liu00d73fe2017-05-19 22:11:28 +08002563 /* store the wmi handle in tgt_if_handle */
2564 tgt_psoc_info->wmi_handle = wmi_handle;
2565
Mukul Sharmacc1f3f92017-01-30 19:56:24 +05302566 wlan_psoc_obj_lock(psoc);
Frank Liu00d73fe2017-05-19 22:11:28 +08002567 wlan_psoc_set_tgt_if_handle(psoc, tgt_psoc_info);
Mukul Sharmacc1f3f92017-01-30 19:56:24 +05302568 wlan_psoc_obj_unlock(psoc);
2569
Govind Singhd76a5b02016-03-08 15:12:14 +05302570 wmi_unified_register_event_handler(wmi_handle,
Vignesh Viswanathan731186f2017-09-18 13:47:37 +05302571 WMI_SERVICE_AVAILABLE_EVENTID,
2572 wma_rx_service_available_event,
2573 WMA_RX_SERIALIZER_CTX);
2574 wmi_unified_register_event_handler(wmi_handle,
Govind Singhd76a5b02016-03-08 15:12:14 +05302575 WMI_SERVICE_READY_EVENTID,
Rajeev Kumarda2444c2017-01-10 22:42:07 -08002576 init_deinit_service_ready_event_handler,
Govind Singhd76a5b02016-03-08 15:12:14 +05302577 WMA_RX_SERIALIZER_CTX);
2578 wmi_unified_register_event_handler(wmi_handle,
2579 WMI_SERVICE_READY_EXT_EVENTID,
Rajeev Kumarda2444c2017-01-10 22:42:07 -08002580 init_deinit_service_ext_ready_event_handler,
Govind Singhd76a5b02016-03-08 15:12:14 +05302581 WMA_RX_SERIALIZER_CTX);
2582 wmi_unified_register_event_handler(wmi_handle,
2583 WMI_READY_EVENTID,
2584 wma_rx_ready_event,
2585 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002586 /* Save the WMI & HTC handle */
2587 wma_handle->wmi_handle = wmi_handle;
2588 wma_handle->htc_handle = htc_handle;
2589 wma_handle->cds_context = cds_context;
Anurag Chouhan6d760662016-02-20 16:05:43 +05302590 wma_handle->qdf_dev = qdf_dev;
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302591 wma_handle->max_scan = cds_cfg->max_scan;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002592
Manishekar Chandrasekaranebcab882016-05-04 12:55:14 +05302593 /* Initialize max_no_of_peers for wma_get_number_of_peers_supported() */
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302594 wma_init_max_no_of_peers(wma_handle, cds_cfg->max_station);
Manishekar Chandrasekaranebcab882016-05-04 12:55:14 +05302595 /* Cap maxStation based on the target version */
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302596 cds_cfg->max_station = wma_get_number_of_peers_supported(wma_handle);
Manishekar Chandrasekaranebcab882016-05-04 12:55:14 +05302597 /* Reinitialize max_no_of_peers based on the capped maxStation value */
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302598 wma_init_max_no_of_peers(wma_handle, cds_cfg->max_station);
Manishekar Chandrasekaranebcab882016-05-04 12:55:14 +05302599
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002600 /* initialize default target config */
2601 wma_set_default_tgt_config(wma_handle);
2602
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302603 wma_handle->tx_chain_mask_cck = cds_cfg->tx_chain_mask_cck;
2604 wma_handle->self_gen_frm_pwr = cds_cfg->self_gen_frm_pwr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002605
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002606#if defined(QCA_WIFI_FTM)
Anurag Chouhan6d760662016-02-20 16:05:43 +05302607 if (cds_get_conparam() == QDF_GLOBAL_FTM_MODE)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002608 wma_utf_attach(wma_handle);
2609#endif /* QCA_WIFI_FTM */
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302610 wma_init_max_no_of_peers(wma_handle, cds_cfg->max_station);
2611 cds_cfg->max_station = wma_get_number_of_peers_supported(wma_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002612
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302613 cds_cfg->max_bssid = WMA_MAX_SUPPORTED_BSS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002614
2615 wma_handle->wlan_resource_config.num_wow_filters =
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302616 cds_cfg->max_wow_filters;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002617 wma_handle->wlan_resource_config.num_keep_alive_pattern =
2618 WMA_MAXNUM_PERIODIC_TX_PTRNS;
2619
2620 /* The current firmware implementation requires the number of
Anurag Chouhanffb21542016-02-17 14:33:03 +05302621 * offload peers should be (number of vdevs + 1).
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002622 */
2623 wma_handle->wlan_resource_config.num_offload_peers =
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302624 cds_cfg->ap_maxoffload_peers + 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002625
2626 wma_handle->wlan_resource_config.num_offload_reorder_buffs =
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302627 cds_cfg->ap_maxoffload_reorderbuffs + 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002628
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302629 wma_handle->ol_ini_info = cds_cfg->ol_ini_info;
2630 wma_handle->max_station = cds_cfg->max_station;
2631 wma_handle->max_bssid = cds_cfg->max_bssid;
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302632 wma_handle->driver_type = cds_cfg->driver_type;
2633 wma_handle->ssdp = cds_cfg->ssdp;
2634 wma_handle->enable_mc_list = cds_cfg->enable_mc_list;
Anurag Chouhan04dbf6d2016-09-08 15:32:52 +05302635 wma_handle->bpf_packet_filter_enable =
2636 cds_cfg->bpf_packet_filter_enable;
Hanumanth Reddy Pothulae87621b2017-04-12 20:53:35 +05302637 wma_handle->active_uc_bpf_mode = cds_cfg->active_uc_bpf_mode;
2638 wma_handle->active_mc_bc_bpf_mode = cds_cfg->active_mc_bc_bpf_mode;
Srinivas Girigowda57b450e2016-10-27 21:00:46 -07002639 wma_handle->link_stats_results = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002640#ifdef FEATURE_WLAN_RA_FILTERING
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302641 wma_handle->IsRArateLimitEnabled = cds_cfg->is_ra_ratelimit_enabled;
2642 wma_handle->RArateLimitInterval = cds_cfg->ra_ratelimit_interval;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002643#endif /* FEATURE_WLAN_RA_FILTERING */
2644#ifdef WLAN_FEATURE_LPSS
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302645 wma_handle->is_lpass_enabled = cds_cfg->is_lpass_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002646#endif
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302647 wma_set_nan_enable(wma_handle, cds_cfg);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302648 wma_handle->interfaces = qdf_mem_malloc(sizeof(struct wma_txrx_node) *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002649 wma_handle->max_bssid);
2650 if (!wma_handle->interfaces) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07002651 WMA_LOGE("%s: failed to allocate interface table", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302652 qdf_status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002653 goto err_scn_context;
2654 }
Dustin Brownec2c92e2017-07-26 11:13:49 -07002655
2656 for (i = 0; i < wma_handle->max_bssid; ++i)
2657 wma_vdev_init(&wma_handle->interfaces[i]);
2658
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002659 /* Register the debug print event handler */
2660 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Govind Singhd76a5b02016-03-08 15:12:14 +05302661 WMI_DEBUG_PRINT_EVENTID,
2662 wma_unified_debug_print_event_handler,
2663 WMA_RX_SERIALIZER_CTX);
Govind Singha471e5e2015-10-12 17:11:14 +05302664 /* Register profiling event Handler */
2665 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2666 WMI_WLAN_PROFILE_DATA_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302667 wma_profile_data_report_event_handler,
2668 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002669
2670 wma_handle->tgt_cfg_update_cb = tgt_cfg_cb;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002671 wma_handle->old_hw_mode_index = WMA_DEFAULT_HW_MODE_INDEX;
2672 wma_handle->new_hw_mode_index = WMA_DEFAULT_HW_MODE_INDEX;
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05302673 wma_handle->saved_chan.num_channels = 0;
Sandeep Puligillaafa52892016-10-26 19:03:16 -07002674 wma_handle->fw_timeout_crash = cds_cfg->fw_timeout_crash;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002675
Anurag Chouhandf2b2682016-02-29 14:15:27 +05302676 qdf_status = qdf_event_create(&wma_handle->wma_ready_event);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302677 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07002678 WMA_LOGE("%s: wma_ready_event initialization failed", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002679 goto err_event_init;
2680 }
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05302681
Anurag Chouhan210db072016-02-22 18:42:15 +05302682 qdf_status = qdf_mc_timer_init(&wma_handle->service_ready_ext_timer,
Anurag Chouhan6d760662016-02-20 16:05:43 +05302683 QDF_TIMER_TYPE_SW,
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05302684 wma_service_ready_ext_evt_timeout,
2685 wma_handle);
Anurag Chouhandf2b2682016-02-29 14:15:27 +05302686 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05302687 WMA_LOGE("Failed to initialize service ready ext timeout");
2688 goto err_event_init;
2689 }
2690
Anurag Chouhandf2b2682016-02-29 14:15:27 +05302691 qdf_status = qdf_event_create(&wma_handle->target_suspend);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302692 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07002693 WMA_LOGE("%s: target suspend event initialization failed",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002694 __func__);
2695 goto err_event_init;
2696 }
2697
2698 /* Init Tx Frame Complete event */
Anurag Chouhandf2b2682016-02-29 14:15:27 +05302699 qdf_status = qdf_event_create(&wma_handle->tx_frm_download_comp_event);
2700 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07002701 WMA_LOGE("%s: failed to init tx_frm_download_comp_event",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002702 __func__);
2703 goto err_event_init;
2704 }
2705
2706 /* Init tx queue empty check event */
Anurag Chouhandf2b2682016-02-29 14:15:27 +05302707 qdf_status = qdf_event_create(&wma_handle->tx_queue_empty_event);
2708 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07002709 WMA_LOGE("%s: failed to init tx_queue_empty_event", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002710 goto err_event_init;
2711 }
2712
Anurag Chouhandf2b2682016-02-29 14:15:27 +05302713 qdf_status = qdf_event_create(&wma_handle->wma_resume_event);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302714 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07002715 WMA_LOGE("%s: wma_resume_event initialization failed",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002716 __func__);
2717 goto err_event_init;
2718 }
2719
Prashanth Bhattae675ca72016-10-20 18:42:37 -07002720 qdf_status = cds_shutdown_notifier_register(wma_shutdown_notifier_cb,
2721 wma_handle);
2722 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07002723 WMA_LOGE("%s: Shutdown notifier register failed: %d",
Prashanth Bhattae675ca72016-10-20 18:42:37 -07002724 __func__, qdf_status);
2725 goto err_event_init;
2726 }
2727
Anurag Chouhandf2b2682016-02-29 14:15:27 +05302728 qdf_status = qdf_event_create(&wma_handle->runtime_suspend);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302729 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07002730 WMA_LOGE("%s: runtime_suspend event initialization failed",
Houston Hoffmana76591b2015-11-10 16:52:05 -08002731 __func__);
2732 goto err_event_init;
2733 }
2734
Anurag Chouhandf2b2682016-02-29 14:15:27 +05302735 qdf_status = qdf_event_create(&wma_handle->recovery_event);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302736 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07002737 WMA_LOGE("%s: recovery event initialization failed", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002738 goto err_event_init;
2739 }
2740
Anurag Chouhanffb21542016-02-17 14:33:03 +05302741 qdf_list_create(&wma_handle->vdev_resp_queue,
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -07002742 MAX_ENTRY_VDEV_RESP_QUEUE);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05302743 qdf_spinlock_create(&wma_handle->vdev_respq_lock);
Anurag Chouhanffb21542016-02-17 14:33:03 +05302744 qdf_list_create(&wma_handle->wma_hold_req_queue,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002745 MAX_ENTRY_HOLD_REQ_QUEUE);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05302746 qdf_spinlock_create(&wma_handle->wma_hold_req_q_lock);
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05302747 qdf_atomic_init(&wma_handle->is_wow_bus_suspended);
2748 qdf_atomic_init(&wma_handle->scan_id_counter);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002749
2750 /* Register vdev start response event handler */
2751 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2752 WMI_VDEV_START_RESP_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302753 wma_vdev_start_resp_handler,
2754 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002755
2756 /* Register vdev stop response event handler */
2757 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2758 WMI_VDEV_STOPPED_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302759 wma_vdev_stop_resp_handler,
2760 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002761
2762 /* register for STA kickout function */
2763 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2764 WMI_PEER_STA_KICKOUT_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302765 wma_peer_sta_kickout_event_handler,
2766 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002767
2768 /* register for stats response event */
2769 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2770 WMI_UPDATE_STATS_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302771 wma_stats_event_handler,
2772 WMA_RX_SERIALIZER_CTX);
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05302773
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05302774 /* register for stats response event */
2775 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2776 WMI_VDEV_GET_ARP_STAT_EVENTID,
2777 wma_get_arp_stats_handler,
2778 WMA_RX_SERIALIZER_CTX);
2779
Will Huanga9814592017-05-24 15:47:58 +08002780 /* register for peer info response event */
2781 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2782 WMI_PEER_STATS_INFO_EVENTID,
2783 wma_peer_info_event_handler,
2784 WMA_RX_SERIALIZER_CTX);
2785
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05302786#ifdef WLAN_POWER_DEBUGFS
2787 /* register for Chip Power stats event */
2788 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2789 WMI_PDEV_CHIP_POWER_STATS_EVENTID,
2790 wma_unified_power_debug_stats_event_handler,
2791 WMA_RX_SERIALIZER_CTX);
2792#endif
2793
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002794 /* register for linkspeed response event */
2795 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2796 WMI_PEER_ESTIMATED_LINKSPEED_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302797 wma_link_speed_event_handler,
2798 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002799
2800#ifdef FEATURE_OEM_DATA_SUPPORT
2801 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08002802 WMI_OEM_RESPONSE_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302803 wma_oem_data_response_handler,
2804 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002805#endif /* FEATURE_OEM_DATA_SUPPORT */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002806
2807 /* Register peer change event handler */
2808 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2809 WMI_PEER_STATE_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302810 wma_peer_state_change_event_handler,
2811 WMA_RX_WORK_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002812
2813 /* Register beacon tx complete event id. The event is required
2814 * for sending channel switch announcement frames
2815 */
2816 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Govind Singhd76a5b02016-03-08 15:12:14 +05302817 WMI_OFFLOAD_BCN_TX_STATUS_EVENTID,
2818 wma_unified_bcntx_status_event_handler,
2819 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002820
2821 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2822 WMI_UPDATE_VDEV_RATE_STATS_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302823 wma_link_status_event_handler,
2824 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002825#ifdef WLAN_FEATURE_LINK_LAYER_STATS
2826 /* Register event handler for processing Link Layer Stats
2827 * response from the FW
2828 */
2829 wma_register_ll_stats_event_handler(wma_handle);
2830
2831#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
2832
2833 /*
2834 * Register event handler to receive firmware mem dump
2835 * copy complete indication
2836 */
2837 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2838 WMI_UPDATE_FW_MEM_DUMP_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302839 wma_fw_mem_dump_event_handler,
2840 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002841
SaidiReddy Yenugacc733af2016-11-09 17:45:42 +05302842 wmi_set_tgt_assert(wma_handle->wmi_handle,
2843 cds_cfg->force_target_assert_enabled);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002844 /* Firmware debug log */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302845 qdf_status = dbglog_init(wma_handle->wmi_handle);
2846 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07002847 WMA_LOGE("%s: Firmware Dbglog initialization failed", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002848 goto err_dbglog_init;
2849 }
2850
2851 /*
2852 * Update Powersave mode
2853 * 1 - Legacy Powersave + Deepsleep Disabled
2854 * 2 - QPower + Deepsleep Disabled
2855 * 3 - Legacy Powersave + Deepsleep Enabled
2856 * 4 - QPower + Deepsleep Enabled
2857 */
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302858 wma_handle->powersave_mode = cds_cfg->powersave_offload_enabled;
2859 wma_handle->staMaxLIModDtim = cds_cfg->sta_maxlimod_dtim;
2860 wma_handle->staModDtim = cds_cfg->sta_mod_dtim;
2861 wma_handle->staDynamicDtim = cds_cfg->sta_dynamic_dtim;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002862
2863 /*
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302864 * Value of cds_cfg->wow_enable can be,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002865 * 0 - Disable both magic pattern match and pattern byte match.
2866 * 1 - Enable magic pattern match on all interfaces.
2867 * 2 - Enable pattern byte match on all interfaces.
2868 * 3 - Enable both magic patter and pattern byte match on
2869 * all interfaces.
2870 */
2871 wma_handle->wow.magic_ptrn_enable =
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302872 (cds_cfg->wow_enable & 0x01) ? true : false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002873 wma_handle->ptrn_match_enable_all_vdev =
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302874 (cds_cfg->wow_enable & 0x02) ? true : false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002875
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002876 /* register for install key completion event */
2877 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Govind Singhd76a5b02016-03-08 15:12:14 +05302878 WMI_VDEV_INSTALL_KEY_COMPLETE_EVENTID,
2879 wma_vdev_install_key_complete_event_handler,
2880 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002881#ifdef WLAN_FEATURE_NAN
2882 /* register for nan response event */
2883 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2884 WMI_NAN_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302885 wma_nan_rsp_event_handler,
2886 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002887#endif /* WLAN_FEATURE_NAN */
2888
2889#ifdef WLAN_FEATURE_STATS_EXT
2890 /* register for extended stats event */
2891 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2892 WMI_STATS_EXT_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302893 wma_stats_ext_event_handler,
2894 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002895#endif /* WLAN_FEATURE_STATS_EXT */
2896#ifdef FEATURE_WLAN_EXTSCAN
2897 wma_register_extscan_event_handler(wma_handle);
2898#endif /* WLAN_FEATURE_STATS_EXT */
2899
2900 WMA_LOGD("%s: Exit", __func__);
2901
2902#ifdef WLAN_FEATURE_ROAM_OFFLOAD
2903 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2904 WMI_ROAM_SYNCH_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302905 wma_roam_synch_event_handler,
2906 WMA_RX_SERIALIZER_CTX);
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302907 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2908 WMI_ROAM_SYNCH_FRAME_EVENTID,
2909 wma_roam_synch_frame_event_handler,
2910 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002911#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
2912 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2913 WMI_RSSI_BREACH_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302914 wma_rssi_breached_event_handler,
2915 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002916
Anurag Chouhana37b5b72016-02-21 14:53:42 +05302917 qdf_wake_lock_create(&wma_handle->wmi_cmd_rsp_wake_lock,
Govind Singhd76a5b02016-03-08 15:12:14 +05302918 "wlan_fw_rsp_wakelock");
Prashanth Bhatta87b6dc02017-01-19 15:17:58 -08002919 qdf_runtime_lock_init(&wma_handle->wmi_cmd_rsp_runtime_lock);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002920
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002921 /* Register peer assoc conf event handler */
2922 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2923 WMI_PEER_ASSOC_CONF_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302924 wma_peer_assoc_conf_handler,
2925 WMA_RX_SERIALIZER_CTX);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002926 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2927 WMI_VDEV_DELETE_RESP_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302928 wma_vdev_delete_handler,
2929 WMA_RX_SERIALIZER_CTX);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002930 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2931 WMI_PEER_DELETE_RESP_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302932 wma_peer_delete_handler,
2933 WMA_RX_SERIALIZER_CTX);
Arun Khandavalli2476ef52016-04-26 20:19:43 +05302934 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2935 WMI_BPF_CAPABILIY_INFO_EVENTID,
2936 wma_get_bpf_caps_event_handler,
2937 WMA_RX_SERIALIZER_CTX);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +05302938 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2939 WMI_VDEV_ENCRYPT_DECRYPT_DATA_RESP_EVENTID,
2940 wma_encrypt_decrypt_msg_handler,
2941 WMA_RX_SERIALIZER_CTX);
Kapil Gupta4f0c0c12017-02-07 15:21:15 +05302942 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2943 WMI_CHAN_INFO_EVENTID,
2944 wma_chan_info_event_handler,
2945 WMA_RX_SERIALIZER_CTX);
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002946 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2947 WMI_DEBUG_MESG_FLUSH_COMPLETE_EVENTID,
2948 wma_flush_complete_evt_handler,
Rajeev Kumarc3032b82017-02-14 15:56:01 -08002949 WMA_RX_WORK_CTX);
lifeng66831662017-05-19 16:01:35 +08002950 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2951 WMI_REPORT_RX_AGGR_FAILURE_EVENTID,
2952 wma_rx_aggr_failure_event_handler,
2953 WMA_RX_SERIALIZER_CTX);
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002954
Ashish Kumar Dhanotiya9335d812017-06-30 16:57:20 +05302955 wma_handle->ito_repeat_count = cds_cfg->ito_repeat_count;
Sandeep Puligilla819d94f2017-10-10 18:33:56 -07002956 wma_handle->bandcapability = cds_cfg->bandcapability;
Ashish Kumar Dhanotiya9335d812017-06-30 16:57:20 +05302957
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +05302958 /* Register PWR_SAVE_FAIL event only in case of recovery(1) */
Hanumanth Reddy Pothulaab395952017-09-05 19:12:26 +05302959 if (cds_cfg->auto_power_save_fail_mode ==
2960 PMO_FW_TO_SEND_WOW_IND_ON_PWR_FAILURE) {
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +05302961 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2962 WMI_PDEV_CHIP_POWER_SAVE_FAILURE_DETECTED_EVENTID,
2963 wma_chip_power_save_failure_detected_handler,
2964 WMA_RX_WORK_CTX);
2965 }
2966
Deepak Dhamdherebf1f9b12016-05-27 14:49:41 -07002967 wma_ndp_register_all_event_handlers(wma_handle);
lifengd217d192017-05-09 19:44:16 +08002968 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2969 WMI_PEER_ANTDIV_INFO_EVENTID,
2970 wma_peer_ant_info_evt_handler,
2971 WMA_RX_WORK_CTX);
2972
Frank Liu65b17d92016-11-23 15:58:44 +08002973
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05302974 wma_register_debug_callback();
Mukul Sharma6411bb82017-03-01 15:57:07 +05302975 /* Register callback with PMO so PMO can update the vdev pause bitmap*/
2976 pmo_register_pause_bitmap_notifier(wma_handle->psoc,
2977 wma_vdev_update_pause_bitmap);
2978 pmo_register_get_pause_bitmap(wma_handle->psoc,
2979 wma_vdev_get_pause_bitmap);
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +05302980 pmo_register_is_device_in_low_pwr_mode(wma_handle->psoc,
2981 wma_vdev_is_device_in_low_pwr_mode);
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07002982 wma_cbacks.wma_get_connection_info = wma_get_connection_info;
2983 wma_cbacks.wma_is_service_enabled = wma_is_service_enabled;
2984 qdf_status = policy_mgr_register_wma_cb(wma_handle->psoc, &wma_cbacks);
2985 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
2986 WMA_LOGE("Failed to register wma cb with Policy Manager");
2987 }
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05302988
Arif Hussainf63f7a32017-08-22 12:49:42 -07002989 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2990 WMI_PHYERR_EVENTID,
2991 wma_unified_phyerr_rx_event_handler,
2992 WMA_RX_WORK_CTX);
2993
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302994 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002995
2996err_dbglog_init:
Anurag Chouhana37b5b72016-02-21 14:53:42 +05302997 qdf_wake_lock_destroy(&wma_handle->wmi_cmd_rsp_wake_lock);
Prashanth Bhatta87b6dc02017-01-19 15:17:58 -08002998 qdf_runtime_lock_deinit(&wma_handle->wmi_cmd_rsp_runtime_lock);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05302999 qdf_spinlock_destroy(&wma_handle->vdev_respq_lock);
3000 qdf_spinlock_destroy(&wma_handle->wma_hold_req_q_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003001err_event_init:
3002 wmi_unified_unregister_event_handler(wma_handle->wmi_handle,
3003 WMI_DEBUG_PRINT_EVENTID);
Dustin Brownec2c92e2017-07-26 11:13:49 -07003004
3005 for (i = 0; i < wma_handle->max_bssid; ++i)
3006 wma_vdev_deinit(&wma_handle->interfaces[i]);
3007
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303008 qdf_mem_free(wma_handle->interfaces);
Dustin Brownec2c92e2017-07-26 11:13:49 -07003009
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003010err_scn_context:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003011#if defined(QCA_WIFI_FTM)
3012 wma_utf_detach(wma_handle);
3013#endif /* QCA_WIFI_FTM */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303014 qdf_mem_free(((p_cds_contextType) cds_context)->cfg_ctx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003015 OS_FREE(wmi_handle);
3016
3017err_wma_handle:
Frank Liu00d73fe2017-05-19 22:11:28 +08003018 qdf_mem_free(tgt_psoc_info);
Anurag Chouhan6d760662016-02-20 16:05:43 +05303019 if (cds_get_conparam() != QDF_GLOBAL_FTM_MODE) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003020#ifdef FEATURE_WLAN_EXTSCAN
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303021 qdf_wake_lock_destroy(&wma_handle->extscan_wake_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003022#endif /* FEATURE_WLAN_EXTSCAN */
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303023 qdf_wake_lock_destroy(&wma_handle->wow_wake_lock);
Mukul Sharmae44d0542017-05-23 21:50:56 +05303024 qdf_wake_lock_destroy(&wma_handle->wow_auth_req_wl);
3025 qdf_wake_lock_destroy(&wma_handle->wow_assoc_req_wl);
3026 qdf_wake_lock_destroy(&wma_handle->wow_deauth_rec_wl);
3027 qdf_wake_lock_destroy(&wma_handle->wow_disassoc_rec_wl);
3028 qdf_wake_lock_destroy(&wma_handle->wow_ap_assoc_lost_wl);
3029 qdf_wake_lock_destroy(&wma_handle->wow_auto_shutdown_wl);
3030 qdf_wake_lock_destroy(&wma_handle->roam_ho_wl);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003031 }
Houston Hoffmanc45db892015-11-13 19:59:25 -08003032
Jeff Johnsonadb3b1c2017-09-13 10:42:36 -07003033 cds_free_context(QDF_MODULE_ID_WMA, wma_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003034
3035 WMA_LOGD("%s: Exit", __func__);
3036
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303037 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003038}
3039
3040/**
3041 * wma_pre_start() - wma pre start
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003042 *
3043 * Return: 0 on success, errno on failure
3044 */
Jeff Johnson8ad89c62017-09-13 08:55:55 -07003045QDF_STATUS wma_pre_start(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003046{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303047 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003048 A_STATUS status = A_OK;
3049 tp_wma_handle wma_handle;
Rajeev Kumarb60abe42017-01-21 15:39:31 -08003050 struct scheduler_msg wma_msg = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003051
3052 WMA_LOGD("%s: Enter", __func__);
3053
Anurag Chouhan6d760662016-02-20 16:05:43 +05303054 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003055
3056 /* Validate the wma_handle */
3057 if (NULL == wma_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003058 WMA_LOGE("%s: invalid argument", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303059 qdf_status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003060 goto end;
3061 }
3062 /* Open endpoint for ctrl path - WMI <--> HTC */
3063 status = wmi_unified_connect_htc_service(wma_handle->wmi_handle,
3064 wma_handle->htc_handle);
3065 if (A_OK != status) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003066 WMA_LOGE("%s: wmi_unified_connect_htc_service", __func__);
Nachiket Kukade8003d252017-03-30 15:55:58 +05303067
3068 if (!cds_is_fw_down())
3069 QDF_BUG(0);
3070
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303071 qdf_status = QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003072 goto end;
3073 }
3074
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08003075 WMA_LOGD("WMA --> wmi_unified_connect_htc_service - success");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003076
3077 /* Trigger the CFG DOWNLOAD */
3078 wma_msg.type = WNI_CFG_DNLD_REQ;
3079 wma_msg.bodyptr = NULL;
3080 wma_msg.bodyval = 0;
3081
Rajeev Kumarb60abe42017-01-21 15:39:31 -08003082 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA, &wma_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303083 if (QDF_STATUS_SUCCESS != qdf_status) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003084 WMA_LOGE("%s: Failed to post WNI_CFG_DNLD_REQ msg", __func__);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303085 QDF_ASSERT(0);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303086 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003087 }
3088end:
3089 WMA_LOGD("%s: Exit", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303090 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003091}
3092
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303093void wma_send_msg_by_priority(tp_wma_handle wma_handle, uint16_t msg_type,
3094 void *body_ptr, uint32_t body_val, bool is_high_priority)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003095{
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303096 struct scheduler_msg msg = {0};
3097 QDF_STATUS status;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003098
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003099 msg.type = msg_type;
3100 msg.bodyval = body_val;
3101 msg.bodyptr = body_ptr;
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303102
3103 status = scheduler_post_msg_by_priority(QDF_MODULE_ID_PE,
3104 &msg, is_high_priority);
3105 if (!QDF_IS_STATUS_SUCCESS(status)) {
3106 WMA_LOGE("Failed to post msg %d to PE", msg_type);
3107 if (body_ptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303108 qdf_mem_free(body_ptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003109 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003110}
3111
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303112
3113void wma_send_msg(tp_wma_handle wma_handle, uint16_t msg_type,
3114 void *body_ptr, uint32_t body_val)
3115{
3116 wma_send_msg_by_priority(wma_handle, msg_type,
3117 body_ptr, body_val, false);
3118}
3119
3120void wma_send_msg_high_priority(tp_wma_handle wma_handle, uint16_t msg_type,
3121 void *body_ptr, uint32_t body_val)
3122{
3123 wma_send_msg_by_priority(wma_handle, msg_type,
3124 body_ptr, body_val, true);
3125}
3126
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003127/**
3128 * wma_set_base_macaddr_indicate() - set base mac address in fw
3129 * @wma_handle: wma handle
3130 * @customAddr: base mac address
3131 *
3132 * Return: 0 for success or error code
3133 */
3134static int wma_set_base_macaddr_indicate(tp_wma_handle wma_handle,
3135 tSirMacAddr *customAddr)
3136{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003137 int err;
3138
Govind Singhf25a0f12016-03-08 16:09:48 +05303139 err = wmi_unified_set_base_macaddr_indicate_cmd(wma_handle->wmi_handle,
3140 (uint8_t *)customAddr);
3141 if (err)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003142 return -EIO;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003143 WMA_LOGD("Base MAC Addr: " MAC_ADDRESS_STR,
3144 MAC_ADDR_ARRAY((*customAddr)));
3145
3146 return 0;
3147}
3148
3149/**
3150 * wma_log_supported_evt_handler() - Enable/Disable FW diag/log events
3151 * @handle: WMA handle
3152 * @event: Event received from FW
3153 * @len: Length of the event
3154 *
3155 * Enables the low frequency events and disables the high frequency
3156 * events. Bit 17 indicates if the event if low/high frequency.
3157 * 1 - high frequency, 0 - low frequency
3158 *
3159 * Return: 0 on successfully enabling/disabling the events
3160 */
3161static int wma_log_supported_evt_handler(void *handle,
3162 uint8_t *event,
3163 uint32_t len)
3164{
3165 tp_wma_handle wma = (tp_wma_handle) handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003166
Govind Singhf25a0f12016-03-08 16:09:48 +05303167 if (wmi_unified_log_supported_evt_cmd(wma->wmi_handle,
3168 event, len))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003169 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003170
3171 return 0;
3172}
3173
3174/**
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303175 * wma_pdev_set_hw_mode_resp_evt_handler() - Set HW mode resp evt handler
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003176 * @handle: WMI handle
3177 * @event: Event recevied from FW
3178 * @len: Length of the event
3179 *
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303180 * Event handler for WMI_PDEV_SET_HW_MODE_RESP_EVENTID that is sent to host
3181 * driver in response to a WMI_PDEV_SET_HW_MODE_CMDID being sent to WLAN
3182 * firmware
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003183 *
Dustin Brownec2c92e2017-07-26 11:13:49 -07003184 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003185 */
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303186static int wma_pdev_set_hw_mode_resp_evt_handler(void *handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003187 uint8_t *event,
3188 uint32_t len)
3189{
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303190 WMI_PDEV_SET_HW_MODE_RESP_EVENTID_param_tlvs *param_buf;
3191 wmi_pdev_set_hw_mode_response_event_fixed_param *wmi_event;
3192 wmi_pdev_set_hw_mode_response_vdev_mac_entry *vdev_mac_entry;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003193 uint32_t i;
3194 struct sir_set_hw_mode_resp *hw_mode_resp;
3195 tp_wma_handle wma = (tp_wma_handle) handle;
3196
3197 if (!wma) {
3198 WMA_LOGE("%s: Invalid WMA handle", __func__);
3199 /* Since WMA handle itself is NULL, we cannot send fail
3200 * response back to LIM here
3201 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303202 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003203 }
Dustin Brownec2c92e2017-07-26 11:13:49 -07003204
3205 wma_release_wakelock(&wma->wmi_cmd_rsp_wake_lock);
Tushnim Bhattacharyya4a03db82017-11-10 17:58:28 -08003206 wma_remove_req(wma, 0, WMA_PDEV_SET_HW_MODE_RESP);
Dustin Brownec2c92e2017-07-26 11:13:49 -07003207
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303208 hw_mode_resp = qdf_mem_malloc(sizeof(*hw_mode_resp));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003209 if (!hw_mode_resp) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003210 WMA_LOGE("%s: Memory allocation failed", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003211 /* Since this memory allocation itself failed, we cannot
3212 * send fail response back to LIM here
3213 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303214 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003215 }
3216
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303217 param_buf = (WMI_PDEV_SET_HW_MODE_RESP_EVENTID_param_tlvs *) event;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003218 if (!param_buf) {
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303219 WMA_LOGE("Invalid WMI_PDEV_SET_HW_MODE_RESP_EVENTID event");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003220 /* Need to send response back to upper layer to free
3221 * active command list
3222 */
3223 goto fail;
3224 }
Krunal Soni50a05542017-10-03 19:39:48 -07003225 if (param_buf->fixed_param->num_vdev_mac_entries >=
3226 MAX_VDEV_SUPPORTED) {
3227 WMA_LOGE("num_vdev_mac_entries crossed max value");
3228 goto fail;
3229 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003230
3231 wmi_event = param_buf->fixed_param;
3232 hw_mode_resp->status = wmi_event->status;
3233 hw_mode_resp->cfgd_hw_mode_index = wmi_event->cfgd_hw_mode_index;
3234 hw_mode_resp->num_vdev_mac_entries = wmi_event->num_vdev_mac_entries;
3235
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003236 WMA_LOGE("%s: status:%d cfgd_hw_mode_index:%d num_vdev_mac_entries:%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003237 __func__, wmi_event->status,
3238 wmi_event->cfgd_hw_mode_index,
3239 wmi_event->num_vdev_mac_entries);
3240 vdev_mac_entry =
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303241 param_buf->wmi_pdev_set_hw_mode_response_vdev_mac_mapping;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003242
3243 /* Store the vdev-mac map in WMA and prepare to send to PE */
3244 for (i = 0; i < wmi_event->num_vdev_mac_entries; i++) {
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303245 uint32_t vdev_id, mac_id, pdev_id;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003246
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003247 vdev_id = vdev_mac_entry[i].vdev_id;
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303248 pdev_id = vdev_mac_entry[i].pdev_id;
3249 if (pdev_id == WMI_PDEV_ID_SOC) {
3250 WMA_LOGE("%s: soc level id received for mac id)",
3251 __func__);
3252 QDF_BUG(0);
3253 goto fail;
3254 }
3255 mac_id = WMA_PDEV_TO_MAC_MAP(vdev_mac_entry[i].pdev_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003256
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003257 WMA_LOGE("%s: vdev_id:%d mac_id:%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003258 __func__, vdev_id, mac_id);
3259
3260 hw_mode_resp->vdev_mac_map[i].vdev_id = vdev_id;
3261 hw_mode_resp->vdev_mac_map[i].mac_id = mac_id;
3262 wma_update_intf_hw_mode_params(vdev_id, mac_id,
3263 wmi_event->cfgd_hw_mode_index);
3264 }
3265
3266 if (hw_mode_resp->status == SET_HW_MODE_STATUS_OK) {
3267 if (WMA_DEFAULT_HW_MODE_INDEX == wma->new_hw_mode_index) {
3268 wma->new_hw_mode_index = wmi_event->cfgd_hw_mode_index;
3269 } else {
3270 wma->old_hw_mode_index = wma->new_hw_mode_index;
3271 wma->new_hw_mode_index = wmi_event->cfgd_hw_mode_index;
3272 }
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003273 policy_mgr_update_hw_mode_index(wma->psoc,
3274 wmi_event->cfgd_hw_mode_index);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003275 }
3276
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003277 WMA_LOGE("%s: Updated: old_hw_mode_index:%d new_hw_mode_index:%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003278 __func__, wma->old_hw_mode_index, wma->new_hw_mode_index);
3279
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303280 wma_send_msg(wma, SIR_HAL_PDEV_SET_HW_MODE_RESP,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003281 (void *) hw_mode_resp, 0);
3282
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303283 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003284
3285fail:
3286 WMA_LOGE("%s: Sending fail response to LIM", __func__);
3287 hw_mode_resp->status = SET_HW_MODE_STATUS_ECANCELED;
3288 hw_mode_resp->cfgd_hw_mode_index = 0;
3289 hw_mode_resp->num_vdev_mac_entries = 0;
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303290 wma_send_msg(wma, SIR_HAL_PDEV_SET_HW_MODE_RESP,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003291 (void *) hw_mode_resp, 0);
3292
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303293 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003294}
3295
3296/**
Naveen Rawat8cc23b02016-07-14 12:22:56 -07003297 * wma_process_pdev_hw_mode_trans_ind() - Process HW mode transition info
3298 *
3299 * @handle: WMA handle
3300 * @fixed_param: Event fixed parameters
3301 * @vdev_mac_entry - vdev mac entry
3302 * @hw_mode_trans_ind - Buffer to store parsed information
3303 *
3304 * Parses fixed_param, vdev_mac_entry and fills in the information into
3305 * hw_mode_trans_ind and wma
3306 *
3307 * Return: None
3308 */
3309void wma_process_pdev_hw_mode_trans_ind(void *handle,
3310 wmi_pdev_hw_mode_transition_event_fixed_param *fixed_param,
3311 wmi_pdev_set_hw_mode_response_vdev_mac_entry *vdev_mac_entry,
3312 struct sir_hw_mode_trans_ind *hw_mode_trans_ind)
3313{
3314 uint32_t i;
3315 tp_wma_handle wma = (tp_wma_handle) handle;
3316
3317 hw_mode_trans_ind->old_hw_mode_index = fixed_param->old_hw_mode_index;
3318 hw_mode_trans_ind->new_hw_mode_index = fixed_param->new_hw_mode_index;
3319 hw_mode_trans_ind->num_vdev_mac_entries =
3320 fixed_param->num_vdev_mac_entries;
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003321 WMA_LOGE("%s: old_hw_mode_index:%d new_hw_mode_index:%d entries=%d",
Naveen Rawat8cc23b02016-07-14 12:22:56 -07003322 __func__, fixed_param->old_hw_mode_index,
3323 fixed_param->new_hw_mode_index,
3324 fixed_param->num_vdev_mac_entries);
3325
3326 /* Store the vdev-mac map in WMA and send to policy manager */
3327 for (i = 0; i < fixed_param->num_vdev_mac_entries; i++) {
3328 uint32_t vdev_id, mac_id, pdev_id;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003329
Naveen Rawat8cc23b02016-07-14 12:22:56 -07003330 vdev_id = vdev_mac_entry[i].vdev_id;
3331 pdev_id = vdev_mac_entry[i].pdev_id;
3332
3333 if (pdev_id == WMI_PDEV_ID_SOC) {
3334 WMA_LOGE("%s: soc level id received for mac id)",
3335 __func__);
3336 QDF_BUG(0);
3337 return;
3338 }
3339
3340 mac_id = WMA_PDEV_TO_MAC_MAP(vdev_mac_entry[i].pdev_id);
3341
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003342 WMA_LOGE("%s: vdev_id:%d mac_id:%d",
Naveen Rawat8cc23b02016-07-14 12:22:56 -07003343 __func__, vdev_id, mac_id);
3344
3345 hw_mode_trans_ind->vdev_mac_map[i].vdev_id = vdev_id;
3346 hw_mode_trans_ind->vdev_mac_map[i].mac_id = mac_id;
3347 wma_update_intf_hw_mode_params(vdev_id, mac_id,
3348 fixed_param->new_hw_mode_index);
3349 }
3350 wma->old_hw_mode_index = fixed_param->old_hw_mode_index;
3351 wma->new_hw_mode_index = fixed_param->new_hw_mode_index;
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003352 policy_mgr_update_new_hw_mode_index(wma->psoc,
3353 fixed_param->new_hw_mode_index);
3354 policy_mgr_update_old_hw_mode_index(wma->psoc,
3355 fixed_param->old_hw_mode_index);
Naveen Rawat8cc23b02016-07-14 12:22:56 -07003356
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003357 WMA_LOGE("%s: Updated: old_hw_mode_index:%d new_hw_mode_index:%d",
Naveen Rawat8cc23b02016-07-14 12:22:56 -07003358 __func__, wma->old_hw_mode_index, wma->new_hw_mode_index);
3359}
3360
3361/**
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05303362 * wma_pdev_hw_mode_transition_evt_handler() - HW mode transition evt handler
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003363 * @handle: WMI handle
3364 * @event: Event recevied from FW
3365 * @len: Length of the event
3366 *
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05303367 * Event handler for WMI_PDEV_HW_MODE_TRANSITION_EVENTID that indicates an
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003368 * asynchronous hardware mode transition. This event notifies the host driver
3369 * that firmware independently changed the hardware mode for some reason, such
3370 * as Coex, LFR 3.0, etc
3371 *
3372 * Return: Success on receiving valid params from FW
3373 */
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05303374static int wma_pdev_hw_mode_transition_evt_handler(void *handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003375 uint8_t *event,
3376 uint32_t len)
3377{
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05303378 WMI_PDEV_HW_MODE_TRANSITION_EVENTID_param_tlvs *param_buf;
3379 wmi_pdev_hw_mode_transition_event_fixed_param *wmi_event;
3380 wmi_pdev_set_hw_mode_response_vdev_mac_entry *vdev_mac_entry;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003381 struct sir_hw_mode_trans_ind *hw_mode_trans_ind;
3382 tp_wma_handle wma = (tp_wma_handle) handle;
3383
3384 if (!wma) {
3385 /* This is an async event. So, not sending any event to LIM */
3386 WMA_LOGE("Invalid WMA handle");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303387 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003388 }
3389
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05303390 param_buf = (WMI_PDEV_HW_MODE_TRANSITION_EVENTID_param_tlvs *) event;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003391 if (!param_buf) {
3392 /* This is an async event. So, not sending any event to LIM */
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05303393 WMA_LOGE("Invalid WMI_PDEV_HW_MODE_TRANSITION_EVENTID event");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303394 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003395 }
3396
Arif Hussain34f72062017-10-04 17:25:24 -07003397 if (param_buf->fixed_param->num_vdev_mac_entries > MAX_VDEV_SUPPORTED) {
3398 WMA_LOGE("num_vdev_mac_entries: %d crossed max value: %d",
3399 param_buf->fixed_param->num_vdev_mac_entries,
3400 MAX_VDEV_SUPPORTED);
3401 return QDF_STATUS_E_FAILURE;
3402 }
3403
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303404 hw_mode_trans_ind = qdf_mem_malloc(sizeof(*hw_mode_trans_ind));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003405 if (!hw_mode_trans_ind) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003406 WMA_LOGE("%s: Memory allocation failed", __func__);
3407 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003408 }
3409
3410 wmi_event = param_buf->fixed_param;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003411 vdev_mac_entry =
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05303412 param_buf->wmi_pdev_set_hw_mode_response_vdev_mac_mapping;
Naveen Rawat8cc23b02016-07-14 12:22:56 -07003413 wma_process_pdev_hw_mode_trans_ind(wma, wmi_event, vdev_mac_entry,
3414 hw_mode_trans_ind);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003415 /* Pass the message to PE */
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05303416 wma_send_msg(wma, SIR_HAL_PDEV_HW_MODE_TRANS_IND,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003417 (void *) hw_mode_trans_ind, 0);
3418
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303419 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003420}
3421
3422/**
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05303423 * wma_pdev_set_dual_mode_config_resp_evt_handler() - Dual mode evt handler
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003424 * @handle: WMI handle
3425 * @event: Event received from FW
3426 * @len: Length of the event
3427 *
3428 * Notifies the host driver of the completion or failure of a
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05303429 * WMI_PDEV_SET_MAC_CONFIG_CMDID command. This event would be returned to
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003430 * the host driver once the firmware has completed a reconfiguration of the Scan
3431 * and FW mode configuration. This changes could include entering or leaving a
3432 * dual mac configuration for either scan and/or more permanent firmware mode.
3433 *
3434 * Return: Success on receiving valid params from FW
3435 */
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05303436static int wma_pdev_set_dual_mode_config_resp_evt_handler(void *handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003437 uint8_t *event,
3438 uint32_t len)
3439{
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05303440 WMI_PDEV_SET_MAC_CONFIG_RESP_EVENTID_param_tlvs *param_buf;
3441 wmi_pdev_set_mac_config_response_event_fixed_param *wmi_event;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003442 tp_wma_handle wma = (tp_wma_handle) handle;
3443 struct sir_dual_mac_config_resp *dual_mac_cfg_resp;
3444
3445 if (!wma) {
3446 WMA_LOGE("%s: Invalid WMA handle", __func__);
3447 /* Since the WMA handle is NULL, we cannot send resp to LIM.
3448 * So, returning from here.
3449 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303450 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003451 }
Krunal Sonia5ccb802017-07-03 12:59:40 -07003452 wma_release_wakelock(&wma->wmi_cmd_rsp_wake_lock);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303453 dual_mac_cfg_resp = qdf_mem_malloc(sizeof(*dual_mac_cfg_resp));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003454 if (!dual_mac_cfg_resp) {
3455 WMA_LOGE("%s: Memory allocation failed", __func__);
3456 /* Since the mem alloc failed, we cannot send resp to LIM.
3457 * So, returning from here.
3458 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303459 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003460 }
3461
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05303462 param_buf = (WMI_PDEV_SET_MAC_CONFIG_RESP_EVENTID_param_tlvs *)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003463 event;
3464 if (!param_buf) {
3465 WMA_LOGE("%s: Invalid event", __func__);
3466 goto fail;
3467 }
3468
3469 wmi_event = param_buf->fixed_param;
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003470 WMA_LOGD("%s: status:%d", __func__, wmi_event->status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003471 dual_mac_cfg_resp->status = wmi_event->status;
3472
3473 if (SET_HW_MODE_STATUS_OK == dual_mac_cfg_resp->status) {
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003474 policy_mgr_update_dbs_scan_config(wma->psoc);
3475 policy_mgr_update_dbs_fw_config(wma->psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003476 }
3477
3478 /* Pass the message to PE */
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05303479 wma_send_msg(wma, SIR_HAL_PDEV_MAC_CFG_RESP,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003480 (void *) dual_mac_cfg_resp, 0);
3481
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303482 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003483
3484fail:
3485 WMA_LOGE("%s: Sending fail response to LIM", __func__);
3486 dual_mac_cfg_resp->status = SET_HW_MODE_STATUS_ECANCELED;
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05303487 wma_send_msg(wma, SIR_HAL_PDEV_MAC_CFG_RESP,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003488 (void *) dual_mac_cfg_resp, 0);
3489
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303490 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003491
3492}
3493
3494/**
3495 * wma_start() - wma start function.
3496 * Intialize event handlers and timers.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003497 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303498 * Return: 0 on success, QDF Error on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003499 */
Jeff Johnsond4892552017-09-13 08:41:31 -07003500QDF_STATUS wma_start(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003501{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303502 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003503 tp_wma_handle wma_handle;
3504 int status;
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07003505
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003506 WMA_LOGD("%s: Enter", __func__);
3507
Anurag Chouhan6d760662016-02-20 16:05:43 +05303508 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003509 /* validate the wma_handle */
3510 if (NULL == wma_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003511 WMA_LOGE("%s: Invalid handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303512 qdf_status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003513 goto end;
3514 }
Sandeep Puligillad698bf52017-09-15 16:07:02 -07003515
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003516 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
3517 WMI_ROAM_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05303518 wma_roam_event_callback,
Padma, Santhosh Kumar18169ce2017-03-02 18:04:02 +05303519 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003520 if (0 != status) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003521 WMA_LOGE("%s: Failed to register Roam callback", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303522 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003523 goto end;
3524 }
3525
3526 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
3527 WMI_WOW_WAKEUP_HOST_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05303528 wma_wow_wakeup_host_event,
3529 WMA_RX_TASKLET_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003530 if (status) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003531 WMA_LOGE("%s: Failed to register wow wakeup host event handler",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003532 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303533 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003534 goto end;
3535 }
3536
Will Huang3cd2b7c2017-11-17 13:16:56 +08003537 if (wma_d0_wow_is_supported()) {
3538 status = wmi_unified_register_event_handler(
3539 wma_handle->wmi_handle,
3540 WMI_D0_WOW_DISABLE_ACK_EVENTID,
3541 wma_d0_wow_disable_ack_event,
3542 WMA_RX_TASKLET_CTX);
3543 if (status) {
3544 WMA_LOGE("%s: Failed to register d0wow disable ack"
3545 " event handler", __func__);
3546 qdf_status = QDF_STATUS_E_FAILURE;
3547 goto end;
3548 }
3549 }
3550
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003551 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
3552 WMI_PDEV_RESUME_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05303553 wma_pdev_resume_event_handler,
3554 WMA_RX_TASKLET_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003555 if (status) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003556 WMA_LOGE("%s: Failed to register PDEV resume event handler",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003557 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303558 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003559 goto end;
3560 }
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05303561#if defined(QCA_LL_LEGACY_TX_FLOW_CONTROL) || \
3562 defined(QCA_LL_TX_FLOW_CONTROL_V2) || defined(CONFIG_HL_SUPPORT)
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08003563 WMA_LOGD("MCC TX Pause Event Handler register");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003564 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
Govind Singhd76a5b02016-03-08 15:12:14 +05303565 WMI_TX_PAUSE_EVENTID,
3566 wma_mcc_vdev_tx_pause_evt_handler,
3567 WMA_RX_TASKLET_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003568#endif /* QCA_LL_LEGACY_TX_FLOW_CONTROL */
3569
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003570#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
3571 WMA_LOGD("Registering auto shutdown handler");
3572 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
Govind Singhd76a5b02016-03-08 15:12:14 +05303573 WMI_HOST_AUTO_SHUTDOWN_EVENTID,
3574 wma_auto_shutdown_event_handler,
3575 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003576 if (status) {
3577 WMA_LOGE("Failed to register WMI Auto shutdown event handler");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303578 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003579 goto end;
3580 }
3581#endif /* FEATURE_WLAN_AUTO_SHUTDOWN */
3582 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
Govind Singhd76a5b02016-03-08 15:12:14 +05303583 WMI_THERMAL_MGMT_EVENTID,
3584 wma_thermal_mgmt_evt_handler,
3585 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003586 if (status) {
3587 WMA_LOGE("Failed to register thermal mitigation event cb");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303588 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003589 goto end;
3590 }
3591
3592 status = wma_ocb_register_event_handlers(wma_handle);
3593 if (status) {
3594 WMA_LOGE("Failed to register ocb event handlers");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303595 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003596 goto end;
3597 }
3598
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303599 qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003600
3601#ifdef QCA_WIFI_FTM
3602 /*
3603 * Tx mgmt attach requires TXRX context which is not created
3604 * in FTM mode. So skip the TX mgmt attach.
3605 */
Anurag Chouhan6d760662016-02-20 16:05:43 +05303606 if (cds_get_conparam() == QDF_GLOBAL_FTM_MODE)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003607 goto end;
3608#endif /* QCA_WIFI_FTM */
3609
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003610 if (WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
3611 WMI_SERVICE_RMC)) {
3612
3613 WMA_LOGD("FW supports cesium network, registering event handlers");
3614
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003615 status = wmi_unified_register_event_handler(
3616 wma_handle->wmi_handle,
3617 WMI_PEER_INFO_EVENTID,
3618 wma_ibss_peer_info_event_handler,
3619 WMA_RX_SERIALIZER_CTX);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003620 if (status) {
3621 WMA_LOGE("Failed to register ibss peer info event cb");
3622 qdf_status = QDF_STATUS_E_FAILURE;
3623 goto end;
3624 }
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003625 status = wmi_unified_register_event_handler(
3626 wma_handle->wmi_handle,
3627 WMI_PEER_TX_FAIL_CNT_THR_EVENTID,
3628 wma_fast_tx_fail_event_handler,
3629 WMA_RX_SERIALIZER_CTX);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003630 if (status) {
3631 WMA_LOGE("Failed to register peer fast tx failure event cb");
3632 qdf_status = QDF_STATUS_E_FAILURE;
3633 goto end;
3634 }
3635 } else {
3636 WMA_LOGE("Target does not support cesium network");
3637 }
3638
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303639 qdf_status = wma_tx_attach(wma_handle);
3640 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003641 WMA_LOGE("%s: Failed to register tx management", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003642 goto end;
3643 }
3644
3645 /* Initialize log completion timeout */
Anurag Chouhan210db072016-02-22 18:42:15 +05303646 qdf_status = qdf_mc_timer_init(&wma_handle->log_completion_timer,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303647 QDF_TIMER_TYPE_SW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003648 wma_log_completion_timeout,
3649 wma_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303650 if (qdf_status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003651 WMA_LOGE("Failed to initialize log completion timeout");
3652 goto end;
3653 }
3654
Jeff Johnson6136fb92017-03-30 15:21:49 -07003655 status = wma_fips_register_event_handlers(wma_handle);
3656 if (!QDF_IS_STATUS_SUCCESS(status)) {
3657 WMA_LOGE("Failed to register FIPS event handler");
3658 qdf_status = QDF_STATUS_E_FAILURE;
3659 goto end;
3660 }
3661
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003662 /* Initialize the get temperature event handler */
3663 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
Govind Singhd76a5b02016-03-08 15:12:14 +05303664 WMI_PDEV_TEMPERATURE_EVENTID,
3665 wma_pdev_temperature_evt_handler,
3666 WMA_RX_SERIALIZER_CTX);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303667 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003668 WMA_LOGE("Failed to register get_temperature event cb");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303669 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003670 goto end;
3671 }
3672
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07003673 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
3674 WMI_VDEV_TSF_REPORT_EVENTID,
3675 wma_vdev_tsf_handler,
3676 WMA_RX_SERIALIZER_CTX);
3677 if (0 != status) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003678 WMA_LOGE("%s: Failed to register tsf callback", __func__);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07003679 qdf_status = QDF_STATUS_E_FAILURE;
3680 goto end;
3681 }
3682
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303683 /* Initialize the wma_pdev_set_hw_mode_resp_evt_handler event handler */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003684 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303685 WMI_PDEV_SET_HW_MODE_RESP_EVENTID,
3686 wma_pdev_set_hw_mode_resp_evt_handler,
Govind Singhd76a5b02016-03-08 15:12:14 +05303687 WMA_RX_SERIALIZER_CTX);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303688 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003689 WMA_LOGE("Failed to register set hw mode resp event cb");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303690 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003691 goto end;
3692 }
3693
3694 /* Initialize the WMI_SOC_HW_MODE_TRANSITION_EVENTID event handler */
3695 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05303696 WMI_PDEV_HW_MODE_TRANSITION_EVENTID,
3697 wma_pdev_hw_mode_transition_evt_handler,
Govind Singhd76a5b02016-03-08 15:12:14 +05303698 WMA_RX_SERIALIZER_CTX);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303699 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003700 WMA_LOGE("Failed to register hw mode transition event cb");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303701 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003702 goto end;
3703 }
3704
3705 /* Initialize the set dual mac configuration event handler */
3706 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05303707 WMI_PDEV_SET_MAC_CONFIG_RESP_EVENTID,
3708 wma_pdev_set_dual_mode_config_resp_evt_handler,
Govind Singhd76a5b02016-03-08 15:12:14 +05303709 WMA_RX_SERIALIZER_CTX);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303710 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003711 WMA_LOGE("Failed to register hw mode transition event cb");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303712 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003713 goto end;
3714 }
3715
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05303716 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
3717 WMI_WLAN_COEX_BT_ACTIVITY_EVENTID,
3718 wma_wlan_bt_activity_evt_handler,
3719 WMA_RX_SERIALIZER_CTX);
3720 if (!QDF_IS_STATUS_SUCCESS(status)) {
3721 WMA_LOGE("Failed to register coex bt activity event handler");
3722 qdf_status = QDF_STATUS_E_FAILURE;
3723 goto end;
3724 }
3725
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003726end:
3727 WMA_LOGD("%s: Exit", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303728 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003729}
3730
3731/**
3732 * wma_stop() - wma stop function.
3733 * cleanup timers and suspend target.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003734 * @reason: reason for wma_stop.
3735 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303736 * Return: 0 on success, QDF Error on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003737 */
Jeff Johnsonacc1cc72017-09-13 08:47:49 -07003738QDF_STATUS wma_stop(uint8_t reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003739{
3740 tp_wma_handle wma_handle;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303741 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Govind Singhede435f2015-12-01 16:16:36 +05303742 int i;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003743
Anurag Chouhan6d760662016-02-20 16:05:43 +05303744 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003745 WMA_LOGD("%s: Enter", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003746 /* validate the wma_handle */
3747 if (NULL == wma_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003748 WMA_LOGE("%s: Invalid handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303749 qdf_status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003750 goto end;
3751 }
3752#ifdef QCA_WIFI_FTM
3753 /*
3754 * Tx mgmt detach requires TXRX context which is not created
3755 * in FTM mode. So skip the TX mgmt detach.
3756 */
Anurag Chouhan6d760662016-02-20 16:05:43 +05303757 if (cds_get_conparam() == QDF_GLOBAL_FTM_MODE) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303758 qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003759 goto end;
3760 }
3761#endif /* QCA_WIFI_FTM */
3762
3763 if (wma_handle->ack_work_ctx) {
3764 cds_flush_work(&wma_handle->ack_work_ctx->ack_cmp_work);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303765 qdf_mem_free(wma_handle->ack_work_ctx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003766 wma_handle->ack_work_ctx = NULL;
3767 }
3768
3769 /* Destroy the timer for log completion */
Anurag Chouhan210db072016-02-22 18:42:15 +05303770 qdf_status = qdf_mc_timer_destroy(&wma_handle->log_completion_timer);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003771 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003772 WMA_LOGE("Failed to destroy the log completion timer");
Govind Singhede435f2015-12-01 16:16:36 +05303773 /* clean up ll-queue for all vdev */
3774 for (i = 0; i < wma_handle->max_bssid; i++) {
3775 if (wma_handle->interfaces[i].handle &&
Mukul Sharmaf9047232017-03-02 16:58:56 +05303776 wma_is_vdev_up(i)) {
Leo Chang96464902016-10-28 11:10:54 -07003777 cdp_fc_vdev_flush(
3778 cds_get_context(QDF_MODULE_ID_SOC),
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003779 wma_handle->
3780 interfaces[i].handle);
Govind Singhede435f2015-12-01 16:16:36 +05303781 }
3782 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303783 qdf_status = wma_tx_detach(wma_handle);
3784 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003785 WMA_LOGE("%s: Failed to deregister tx management", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003786 goto end;
3787 }
3788
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003789end:
3790 WMA_LOGD("%s: Exit", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303791 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003792}
3793
3794/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003795 * wma_wmi_service_close() - close wma wmi service interface.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003796 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303797 * Return: 0 on success, QDF Error on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003798 */
Jeff Johnson7b3ddc22017-09-13 09:42:44 -07003799QDF_STATUS wma_wmi_service_close(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003800{
Jeff Johnson7b3ddc22017-09-13 09:42:44 -07003801 void *cds_ctx;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003802 tp_wma_handle wma_handle;
3803 struct beacon_info *bcn;
3804 int i;
3805
3806 WMA_LOGD("%s: Enter", __func__);
3807
Jeff Johnson7b3ddc22017-09-13 09:42:44 -07003808 cds_ctx = cds_get_global_context();
3809 if (!cds_ctx) {
3810 WMA_LOGE("%s: Invalid CDS context", __func__);
3811 return QDF_STATUS_E_INVAL;
3812 }
3813
Anurag Chouhan6d760662016-02-20 16:05:43 +05303814 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003815
3816 /* validate the wma_handle */
3817 if (NULL == wma_handle) {
3818 WMA_LOGE("%s: Invalid wma handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303819 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003820 }
3821
3822 /* validate the wmi handle */
3823 if (NULL == wma_handle->wmi_handle) {
3824 WMA_LOGE("%s: Invalid wmi handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303825 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003826 }
3827
3828 /* dettach the wmi serice */
3829 WMA_LOGD("calling wmi_unified_detach");
3830 wmi_unified_detach(wma_handle->wmi_handle);
3831 wma_handle->wmi_handle = NULL;
3832
3833 for (i = 0; i < wma_handle->max_bssid; i++) {
3834 bcn = wma_handle->interfaces[i].beacon;
3835
3836 if (bcn) {
3837 if (bcn->dma_mapped)
Nirav Shahcbc6d722016-03-01 16:24:53 +05303838 qdf_nbuf_unmap_single(wma_handle->qdf_dev,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303839 bcn->buf, QDF_DMA_TO_DEVICE);
Nirav Shahcbc6d722016-03-01 16:24:53 +05303840 qdf_nbuf_free(bcn->buf);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303841 qdf_mem_free(bcn);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003842 wma_handle->interfaces[i].beacon = NULL;
3843 }
3844
3845 if (wma_handle->interfaces[i].handle) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303846 qdf_mem_free(wma_handle->interfaces[i].handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003847 wma_handle->interfaces[i].handle = NULL;
3848 }
Yue Ma664effc2016-01-12 18:43:54 -08003849
3850 if (wma_handle->interfaces[i].addBssStaContext) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303851 qdf_mem_free(wma_handle->
Yue Ma664effc2016-01-12 18:43:54 -08003852 interfaces[i].addBssStaContext);
3853 wma_handle->interfaces[i].addBssStaContext = NULL;
3854 }
3855
3856 if (wma_handle->interfaces[i].del_staself_req) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303857 qdf_mem_free(wma_handle->interfaces[i].del_staself_req);
Yue Ma664effc2016-01-12 18:43:54 -08003858 wma_handle->interfaces[i].del_staself_req = NULL;
3859 }
yeshwanth sriram guntuka8dd80382017-01-30 17:04:58 +05303860
3861 if (wma_handle->interfaces[i].stats_rsp) {
3862 qdf_mem_free(wma_handle->interfaces[i].stats_rsp);
3863 wma_handle->interfaces[i].stats_rsp = NULL;
3864 }
Abhishek Singh7e5e9342017-04-12 18:22:07 +05303865
3866 if (wma_handle->interfaces[i].psnr_req) {
3867 qdf_mem_free(wma_handle->
3868 interfaces[i].psnr_req);
3869 wma_handle->interfaces[i].psnr_req = NULL;
3870 }
Dustin Brownec2c92e2017-07-26 11:13:49 -07003871
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +05303872 if (wma_handle->interfaces[i].rcpi_req) {
3873 qdf_mem_free(wma_handle->
3874 interfaces[i].rcpi_req);
3875 wma_handle->interfaces[i].rcpi_req = NULL;
3876 }
3877
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05303878 if (wma_handle->interfaces[i].roam_synch_frame_ind.
3879 bcn_probe_rsp) {
3880 qdf_mem_free(wma_handle->interfaces[i].
3881 roam_synch_frame_ind.bcn_probe_rsp);
3882 wma_handle->interfaces[i].roam_synch_frame_ind.
3883 bcn_probe_rsp = NULL;
3884 }
3885
3886 if (wma_handle->interfaces[i].roam_synch_frame_ind.
3887 reassoc_req) {
3888 qdf_mem_free(wma_handle->interfaces[i].
3889 roam_synch_frame_ind.reassoc_req);
3890 wma_handle->interfaces[i].roam_synch_frame_ind.
3891 reassoc_req = NULL;
3892 }
3893
3894 if (wma_handle->interfaces[i].roam_synch_frame_ind.
3895 reassoc_rsp) {
3896 qdf_mem_free(wma_handle->interfaces[i].
3897 roam_synch_frame_ind.reassoc_rsp);
3898 wma_handle->interfaces[i].roam_synch_frame_ind.
3899 reassoc_rsp = NULL;
3900 }
3901
Dustin Brownec2c92e2017-07-26 11:13:49 -07003902 wma_vdev_deinit(&wma_handle->interfaces[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003903 }
3904
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303905 qdf_mem_free(wma_handle->interfaces);
Dustin Brownec2c92e2017-07-26 11:13:49 -07003906
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003907 /* free the wma_handle */
Jeff Johnsonadb3b1c2017-09-13 10:42:36 -07003908 cds_free_context(QDF_MODULE_ID_WMA, wma_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003909
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303910 qdf_mem_free(((p_cds_contextType) cds_ctx)->cfg_ctx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003911 WMA_LOGD("%s: Exit", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303912 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003913}
3914
Xun Luoa858a472015-11-10 08:24:45 -08003915/**
3916 * wma_wmi_work_close() - close the work queue items associated with WMI
Xun Luoa858a472015-11-10 08:24:45 -08003917 *
3918 * This function closes work queue items associated with WMI, but not fully
3919 * closes WMI service.
3920 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303921 * Return: QDF_STATUS_SUCCESS if work close is successful. Otherwise
Xun Luoa858a472015-11-10 08:24:45 -08003922 * proper error codes.
3923 */
Jeff Johnson6b8473d2017-09-13 09:20:53 -07003924QDF_STATUS wma_wmi_work_close(void)
Xun Luoa858a472015-11-10 08:24:45 -08003925{
3926 tp_wma_handle wma_handle;
3927
3928 WMA_LOGD("%s: Enter", __func__);
3929
Anurag Chouhan6d760662016-02-20 16:05:43 +05303930 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Xun Luoa858a472015-11-10 08:24:45 -08003931
3932 /* validate the wma_handle */
3933 if (NULL == wma_handle) {
3934 WMA_LOGE("%s: Invalid wma handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303935 return QDF_STATUS_E_INVAL;
Xun Luoa858a472015-11-10 08:24:45 -08003936 }
3937
3938 /* validate the wmi handle */
3939 if (NULL == wma_handle->wmi_handle) {
3940 WMA_LOGE("%s: Invalid wmi handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303941 return QDF_STATUS_E_INVAL;
Xun Luoa858a472015-11-10 08:24:45 -08003942 }
3943
3944 /* remove the wmi work */
3945 WMA_LOGD("calling wmi_unified_remove_work");
3946 wmi_unified_remove_work(wma_handle->wmi_handle);
3947
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303948 return QDF_STATUS_SUCCESS;
Xun Luoa858a472015-11-10 08:24:45 -08003949}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003950
Krunal Soni2e48d012016-05-02 16:55:26 -07003951/**
3952 * wma_cleanup_dbs_phy_caps() - release memory allocated for holding ext cap
3953 * @wma_handle: pointer to wma handle
3954 *
3955 * This function releases all the memory created for holding extended
3956 * capabilities per hardware mode and per PHY
3957 *
3958 * Return: void
3959 */
3960static void wma_cleanup_dbs_phy_caps(t_wma_handle *wma_handle)
3961{
3962 if (NULL == wma_handle) {
3963 WMA_LOGE("%s: Invalid wma handle", __func__);
3964 return;
3965 }
3966
3967 if (wma_handle->phy_caps.hw_mode_to_mac_cap_map) {
3968 qdf_mem_free(wma_handle->phy_caps.hw_mode_to_mac_cap_map);
3969 wma_handle->phy_caps.hw_mode_to_mac_cap_map = NULL;
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003970 WMA_LOGD("%s: hw_mode_to_mac_cap_map freed", __func__);
Krunal Soni2e48d012016-05-02 16:55:26 -07003971 }
3972
3973 if (wma_handle->phy_caps.each_hw_mode_cap) {
3974 qdf_mem_free(wma_handle->phy_caps.each_hw_mode_cap);
3975 wma_handle->phy_caps.each_hw_mode_cap = NULL;
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003976 WMA_LOGD("%s: each_hw_mode_cap freed", __func__);
Krunal Soni2e48d012016-05-02 16:55:26 -07003977 }
3978
3979 if (wma_handle->phy_caps.each_phy_cap_per_hwmode) {
3980 qdf_mem_free(wma_handle->phy_caps.each_phy_cap_per_hwmode);
3981 wma_handle->phy_caps.each_phy_cap_per_hwmode = NULL;
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003982 WMA_LOGD("%s: each_phy_cap_per_hwmode freed", __func__);
Krunal Soni2e48d012016-05-02 16:55:26 -07003983 }
3984
3985 if (wma_handle->phy_caps.each_phy_hal_reg_cap) {
3986 qdf_mem_free(wma_handle->phy_caps.each_phy_hal_reg_cap);
3987 wma_handle->phy_caps.each_phy_hal_reg_cap = NULL;
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003988 WMA_LOGD("%s: each_phy_hal_reg_cap freed", __func__);
Krunal Soni2e48d012016-05-02 16:55:26 -07003989 }
3990}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003991
3992/**
3993 * wma_close() - wma close function.
3994 * cleanup resources attached with wma.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003995 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303996 * Return: 0 on success, QDF Error on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003997 */
Jeff Johnson542da352017-09-13 09:17:28 -07003998QDF_STATUS wma_close(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003999{
4000 tp_wma_handle wma_handle;
4001 uint32_t idx;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304002 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Frank Liu00d73fe2017-05-19 22:11:28 +08004003 struct target_psoc_info *tgt_psoc_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004004
4005 WMA_LOGD("%s: Enter", __func__);
4006
Anurag Chouhan6d760662016-02-20 16:05:43 +05304007 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004008
4009 /* validate the wma_handle */
4010 if (NULL == wma_handle) {
4011 WMA_LOGE("%s: Invalid wma handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304012 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004013 }
4014
4015 /* validate the wmi handle */
4016 if (NULL == wma_handle->wmi_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004017 WMA_LOGE("%s: Invalid wmi handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304018 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004019 }
4020
4021 /* Free DBS list */
4022 if (wma_handle->hw_mode.hw_mode_list) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304023 qdf_mem_free(wma_handle->hw_mode.hw_mode_list);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004024 wma_handle->hw_mode.hw_mode_list = NULL;
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004025 WMA_LOGD("%s: DBS list is freed", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004026 }
Krunal Soni2e48d012016-05-02 16:55:26 -07004027 wma_cleanup_dbs_phy_caps(wma_handle);
Anurag Chouhan6d760662016-02-20 16:05:43 +05304028 if (cds_get_conparam() != QDF_GLOBAL_FTM_MODE) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004029#ifdef FEATURE_WLAN_EXTSCAN
Anurag Chouhana37b5b72016-02-21 14:53:42 +05304030 qdf_wake_lock_destroy(&wma_handle->extscan_wake_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004031#endif /* FEATURE_WLAN_EXTSCAN */
Anurag Chouhana37b5b72016-02-21 14:53:42 +05304032 qdf_wake_lock_destroy(&wma_handle->wow_wake_lock);
Mukul Sharmae44d0542017-05-23 21:50:56 +05304033 qdf_wake_lock_destroy(&wma_handle->wow_auth_req_wl);
4034 qdf_wake_lock_destroy(&wma_handle->wow_assoc_req_wl);
4035 qdf_wake_lock_destroy(&wma_handle->wow_deauth_rec_wl);
4036 qdf_wake_lock_destroy(&wma_handle->wow_disassoc_rec_wl);
4037 qdf_wake_lock_destroy(&wma_handle->wow_ap_assoc_lost_wl);
4038 qdf_wake_lock_destroy(&wma_handle->wow_auto_shutdown_wl);
4039 qdf_wake_lock_destroy(&wma_handle->roam_ho_wl);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004040 }
4041
4042 /* unregister Firmware debug log */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304043 qdf_status = dbglog_deinit(wma_handle->wmi_handle);
4044 if (qdf_status != QDF_STATUS_SUCCESS)
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004045 WMA_LOGE("%s: dbglog_deinit failed", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004046
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05304047 /* close the qdf events */
Anurag Chouhandf2b2682016-02-29 14:15:27 +05304048 qdf_event_destroy(&wma_handle->wma_ready_event);
Anurag Chouhan210db072016-02-22 18:42:15 +05304049 qdf_status = qdf_mc_timer_destroy(&wma_handle->service_ready_ext_timer);
Anurag Chouhandf2b2682016-02-29 14:15:27 +05304050 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004051 WMA_LOGE("%s: Failed to destroy service ready ext event timer",
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05304052 __func__);
4053
Anurag Chouhandf2b2682016-02-29 14:15:27 +05304054 qdf_event_destroy(&wma_handle->target_suspend);
4055 qdf_event_destroy(&wma_handle->wma_resume_event);
4056 qdf_event_destroy(&wma_handle->runtime_suspend);
4057 qdf_event_destroy(&wma_handle->recovery_event);
Kai Liu27f20372016-09-28 23:52:36 +08004058 qdf_event_destroy(&wma_handle->tx_frm_download_comp_event);
4059 qdf_event_destroy(&wma_handle->tx_queue_empty_event);
Manikandan Mohanb0932ab2017-02-12 16:30:55 -08004060 wma_cleanup_vdev_resp_queue(wma_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004061 wma_cleanup_hold_req(wma_handle);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05304062 qdf_wake_lock_destroy(&wma_handle->wmi_cmd_rsp_wake_lock);
Prashanth Bhatta87b6dc02017-01-19 15:17:58 -08004063 qdf_runtime_lock_deinit(&wma_handle->wmi_cmd_rsp_runtime_lock);
Poddar, Siddarth2fb98072017-07-19 14:58:30 +05304064 qdf_spinlock_destroy(&wma_handle->vdev_respq_lock);
4065 qdf_spinlock_destroy(&wma_handle->wma_hold_req_q_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004066 for (idx = 0; idx < wma_handle->num_mem_chunks; ++idx) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304067 qdf_mem_free_consistent(wma_handle->qdf_dev,
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05304068 wma_handle->qdf_dev->dev,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004069 wma_handle->mem_chunks[idx].len,
4070 wma_handle->mem_chunks[idx].vaddr,
4071 wma_handle->mem_chunks[idx].paddr,
4072 qdf_get_dma_mem_context(
4073 (&(wma_handle->mem_chunks[idx])),
4074 memctx));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004075 }
4076
4077#if defined(QCA_WIFI_FTM)
4078 /* Detach UTF and unregister the handler */
Anurag Chouhan6d760662016-02-20 16:05:43 +05304079 if (cds_get_conparam() == QDF_GLOBAL_FTM_MODE)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004080 wma_utf_detach(wma_handle);
4081#endif /* QCA_WIFI_FTM */
4082
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004083 if (NULL != wma_handle->pGetRssiReq) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304084 qdf_mem_free(wma_handle->pGetRssiReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004085 wma_handle->pGetRssiReq = NULL;
4086 }
Deepak Dhamdherebf1f9b12016-05-27 14:49:41 -07004087
yeshwanth sriram guntuka584c2332017-07-29 12:50:25 +05304088 wma_unified_radio_tx_mem_free(wma_handle);
Srinivas Girigowdaad874a82016-10-25 14:08:00 -07004089
Deepak Dhamdherebf1f9b12016-05-27 14:49:41 -07004090 wma_ndp_unregister_all_event_handlers(wma_handle);
Kiran Kumar Lokeref089a3a2017-04-20 21:39:26 -07004091 if (wma_handle->pdev) {
4092 wlan_objmgr_pdev_release_ref(wma_handle->pdev,
4093 WLAN_LEGACY_WMA_ID);
4094 wma_handle->pdev = NULL;
4095 }
Frank Liu00d73fe2017-05-19 22:11:28 +08004096
4097 tgt_psoc_info = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
4098 if (tgt_psoc_info) {
4099 qdf_mem_free(tgt_psoc_info);
4100 wlan_psoc_set_tgt_if_handle(wma_handle->psoc, NULL);
4101 }
4102
Mukul Sharma6411bb82017-03-01 15:57:07 +05304103 pmo_unregister_pause_bitmap_notifier(wma_handle->psoc,
4104 wma_vdev_update_pause_bitmap);
4105 pmo_unregister_get_pause_bitmap(wma_handle->psoc,
4106 wma_vdev_get_pause_bitmap);
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +05304107 pmo_unregister_is_device_in_low_pwr_mode(wma_handle->psoc,
4108 wma_vdev_is_device_in_low_pwr_mode);
Mukul Sharma6411bb82017-03-01 15:57:07 +05304109
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +05304110 wlan_objmgr_psoc_release_ref(wma_handle->psoc, WLAN_LEGACY_WMA_ID);
4111 wma_handle->psoc = NULL;
4112 target_if_close();
4113 wma_target_if_close(wma_handle);
Mukul Sharma6411bb82017-03-01 15:57:07 +05304114
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004115 WMA_LOGD("%s: Exit", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304116 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004117}
4118
4119/**
4120 * wma_update_fw_config() - update fw configuration
4121 * @wma_handle: wma handle
4122 * @tgt_cap: target capabality
4123 *
4124 * Return: none
4125 */
4126static void wma_update_fw_config(tp_wma_handle wma_handle,
4127 struct wma_target_cap *tgt_cap)
4128{
4129 /*
4130 * tgt_cap contains default target resource configuration
4131 * which can be modified here, if required
4132 */
4133 /* Override the no. of max fragments as per platform configuration */
4134 tgt_cap->wlan_resource_config.max_frag_entries =
Anurag Chouhan6d760662016-02-20 16:05:43 +05304135 QDF_MIN(QCA_OL_11AC_TX_MAX_FRAGS,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004136 wma_handle->max_frag_entry);
4137 wma_handle->max_frag_entry =
4138 tgt_cap->wlan_resource_config.max_frag_entries;
Arun Khandavalli3dd06de2016-08-17 10:20:29 +05304139
4140 /* Update no. of maxWoWFilters depending on BPF service */
4141 if (WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
4142 WMI_SERVICE_BPF_OFFLOAD))
4143 tgt_cap->wlan_resource_config.num_wow_filters =
Arun Khandavallid454d422016-08-17 12:47:05 +05304144 WMA_STA_WOW_DEFAULT_PTRN_MAX;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004145}
4146
4147/**
4148 * wma_alloc_host_mem_chunk() - allocate host memory
4149 * @wma_handle: wma handle
4150 * @req_id: request id
4151 * @idx: index
4152 * @num_units: number of units
4153 * @unit_len: unit length
4154 *
4155 * allocate a chunk of memory at the index indicated and
4156 * if allocation fail allocate smallest size possiblr and
4157 * return number of units allocated.
4158 *
4159 * Return: number of units or 0 for error.
4160 */
4161static uint32_t wma_alloc_host_mem_chunk(tp_wma_handle wma_handle,
4162 uint32_t req_id, uint32_t idx,
4163 uint32_t num_units, uint32_t unit_len)
4164{
Anurag Chouhan6d760662016-02-20 16:05:43 +05304165 qdf_dma_addr_t paddr;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004166
4167 if (!num_units || !unit_len)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004168 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004169 wma_handle->mem_chunks[idx].vaddr = NULL;
4170 /** reduce the requested allocation by half until allocation succeeds */
4171 while (wma_handle->mem_chunks[idx].vaddr == NULL && num_units) {
4172 wma_handle->mem_chunks[idx].vaddr =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304173 qdf_mem_alloc_consistent(wma_handle->qdf_dev,
4174 wma_handle->qdf_dev->dev,
4175 num_units * unit_len,
4176 &paddr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004177 if (wma_handle->mem_chunks[idx].vaddr == NULL) {
4178 num_units = (num_units >> 1);/* reduce length by half */
4179 } else {
4180 wma_handle->mem_chunks[idx].paddr = paddr;
4181 wma_handle->mem_chunks[idx].len = num_units * unit_len;
4182 wma_handle->mem_chunks[idx].req_id = req_id;
4183 }
4184 }
4185 return num_units;
4186}
4187
4188#define HOST_MEM_SIZE_UNIT 4
4189/**
4190 * wma_alloc_host_mem() - allocate amount of memory requested by FW.
4191 * @wma_handle: wma handle
4192 * @req_id: request id
4193 * @num_units: number of units
4194 * @unit_len: unit length
4195 *
4196 * Return: none
4197 */
4198static void wma_alloc_host_mem(tp_wma_handle wma_handle, uint32_t req_id,
4199 uint32_t num_units, uint32_t unit_len)
4200{
4201 uint32_t remaining_units, allocated_units, idx;
4202
4203 /* adjust the length to nearest multiple of unit size */
4204 unit_len = (unit_len + (HOST_MEM_SIZE_UNIT - 1)) &
4205 (~(HOST_MEM_SIZE_UNIT - 1));
4206 idx = wma_handle->num_mem_chunks;
4207 remaining_units = num_units;
4208 while (remaining_units) {
4209 allocated_units = wma_alloc_host_mem_chunk(wma_handle, req_id,
4210 idx, remaining_units,
4211 unit_len);
4212 if (allocated_units == 0) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004213 WMA_LOGE("FAILED TO ALLOCATED memory unit len %d units requested %d units allocated %d ",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004214 unit_len, num_units,
4215 (num_units - remaining_units));
4216 wma_handle->num_mem_chunks = idx;
4217 break;
4218 }
4219 remaining_units -= allocated_units;
4220 ++idx;
4221 if (idx == MAX_MEM_CHUNKS) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004222 WMA_LOGE("RWACHED MAX CHUNK LIMIT for memory units %d unit len %d requested by FW, only allocated %d ",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004223 num_units, unit_len,
4224 (num_units - remaining_units));
4225 wma_handle->num_mem_chunks = idx;
4226 break;
4227 }
4228 }
4229 wma_handle->num_mem_chunks = idx;
4230}
4231
4232/**
Yun Parkb4f591d2017-03-29 15:51:01 -07004233 * wma_set_tx_partition_base() - set TX MSDU ID partition base for IPA
4234 * @value: TX MSDU ID partition base
4235 *
4236 * Return: none
4237 */
4238#ifdef IPA_OFFLOAD
4239static void wma_set_tx_partition_base(uint32_t value)
4240{
4241 cdp_ipa_set_uc_tx_partition_base(
4242 cds_get_context(QDF_MODULE_ID_SOC),
4243 (struct cdp_cfg *)cds_get_context(QDF_MODULE_ID_CFG),
4244 value);
4245 WMA_LOGD("%s: TX_MSDU_ID_PARTITION=%d", __func__,
4246 value);
4247}
4248#else
4249static void wma_set_tx_partition_base(uint32_t value)
4250{
4251}
4252#endif
4253
4254/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004255 * wma_update_target_services() - update target services from wma handle
4256 * @wh: wma handle
4257 * @cfg: target services
4258 *
4259 * Return: none
4260 */
4261static inline void wma_update_target_services(tp_wma_handle wh,
4262 struct wma_tgt_services *cfg)
4263{
4264 /* STA power save */
4265 cfg->sta_power_save = WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap,
4266 WMI_SERVICE_STA_PWRSAVE);
4267
4268 /* Enable UAPSD */
4269 cfg->uapsd = WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap,
4270 WMI_SERVICE_AP_UAPSD);
4271
4272 /* Update AP DFS service */
4273 cfg->ap_dfs = WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap,
4274 WMI_SERVICE_AP_DFS);
4275
4276 /* Enable 11AC */
4277 cfg->en_11ac = WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap,
4278 WMI_SERVICE_11AC);
4279 if (cfg->en_11ac)
4280 g_fw_wlan_feat_caps |= (1 << DOT11AC);
4281
4282 /* Proactive ARP response */
4283 g_fw_wlan_feat_caps |= (1 << WLAN_PERIODIC_TX_PTRN);
4284
4285 /* Enable WOW */
4286 g_fw_wlan_feat_caps |= (1 << WOW);
4287
4288 /* ARP offload */
4289 cfg->arp_offload = WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap,
4290 WMI_SERVICE_ARPNS_OFFLOAD);
4291
4292 /* Adaptive early-rx */
4293 cfg->early_rx = WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap,
4294 WMI_SERVICE_EARLY_RX);
4295#ifdef FEATURE_WLAN_SCAN_PNO
4296 /* PNO offload */
4297 if (WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap, WMI_SERVICE_NLO))
4298 cfg->pno_offload = true;
4299#endif /* FEATURE_WLAN_SCAN_PNO */
4300
4301#ifdef FEATURE_WLAN_EXTSCAN
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004302 if (WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap, WMI_SERVICE_EXTSCAN))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004303 g_fw_wlan_feat_caps |= (1 << EXTENDED_SCAN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004304#endif /* FEATURE_WLAN_EXTSCAN */
Krunal Sonie6a1cda2017-09-27 15:23:02 -07004305 cfg->lte_coex_ant_share = WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap,
4306 WMI_SERVICE_LTE_ANT_SHARE_SUPPORT);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004307#ifdef FEATURE_WLAN_TDLS
4308 /* Enable TDLS */
4309 if (WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap, WMI_SERVICE_TDLS)) {
4310 cfg->en_tdls = 1;
4311 g_fw_wlan_feat_caps |= (1 << TDLS);
4312 }
4313 /* Enable advanced TDLS features */
4314 if (WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap,
4315 WMI_SERVICE_TDLS_OFFCHAN)) {
4316 cfg->en_tdls_offchan = 1;
4317 g_fw_wlan_feat_caps |= (1 << TDLS_OFF_CHANNEL);
4318 }
4319
4320 cfg->en_tdls_uapsd_buf_sta =
4321 WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap,
4322 WMI_SERVICE_TDLS_UAPSD_BUFFER_STA);
4323 cfg->en_tdls_uapsd_sleep_sta =
4324 WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap,
4325 WMI_SERVICE_TDLS_UAPSD_SLEEP_STA);
4326#endif /* FEATURE_WLAN_TDLS */
4327 if (WMI_SERVICE_IS_ENABLED
4328 (wh->wmi_service_bitmap, WMI_SERVICE_BEACON_OFFLOAD))
4329 cfg->beacon_offload = true;
mukul sharma72c8b222015-09-04 17:02:01 +05304330 if (WMI_SERVICE_IS_ENABLED
4331 (wh->wmi_service_bitmap, WMI_SERVICE_STA_PMF_OFFLOAD))
4332 cfg->pmf_offload = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004333#ifdef WLAN_FEATURE_ROAM_OFFLOAD
4334 /* Enable Roam Offload */
4335 cfg->en_roam_offload = WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004336 WMI_SERVICE_ROAM_HO_OFFLOAD);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004337#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
4338#ifdef WLAN_FEATURE_NAN
4339 if (WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap, WMI_SERVICE_NAN))
4340 g_fw_wlan_feat_caps |= (1 << NAN);
4341#endif /* WLAN_FEATURE_NAN */
4342
4343 if (WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap, WMI_SERVICE_RTT))
4344 g_fw_wlan_feat_caps |= (1 << RTT);
Yun Park4d968df2016-10-11 11:44:15 -07004345
4346 if (WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap,
4347 WMI_SERVICE_TX_MSDU_ID_NEW_PARTITION_SUPPORT)) {
Yun Parkb4f591d2017-03-29 15:51:01 -07004348 wma_set_tx_partition_base(HTT_TX_IPA_NEW_MSDU_ID_SPACE_BEGIN);
Yun Park4d968df2016-10-11 11:44:15 -07004349 } else {
Yun Parkb4f591d2017-03-29 15:51:01 -07004350 wma_set_tx_partition_base(HTT_TX_IPA_MSDU_ID_SPACE_BEGIN);
Yun Park4d968df2016-10-11 11:44:15 -07004351 }
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07004352
4353 wma_he_update_tgt_services(wh, cfg);
Will Huang496b36c2017-07-11 16:38:50 +08004354
4355 cfg->get_peer_info_enabled =
4356 WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap,
4357 WMI_SERVICE_PEER_STATS_INFO);
Vignesh Viswanathan731186f2017-09-18 13:47:37 +05304358 if (WMI_SERVICE_EXT_IS_ENABLED(wh->wmi_service_bitmap,
4359 wh->wmi_service_ext_bitmap,
4360 WMI_SERVICE_FILS_SUPPORT))
4361 cfg->is_fils_roaming_supported = true;
Varun Reddy Yeturu62c32652017-10-26 15:32:35 -07004362
4363 if (WMI_SERVICE_EXT_IS_ENABLED(wh->wmi_service_bitmap,
4364 wh->wmi_service_ext_bitmap,
4365 WMI_SERVICE_MAWC_SUPPORT))
4366 cfg->is_fw_mawc_capable = true;
4367
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004368}
4369
4370/**
4371 * wma_update_target_ht_cap() - update ht capabality from wma handle
4372 * @wh: wma handle
4373 * @cfg: ht capabality
4374 *
4375 * Return: none
4376 */
4377static inline void wma_update_target_ht_cap(tp_wma_handle wh,
4378 struct wma_tgt_ht_cap *cfg)
4379{
4380 /* RX STBC */
4381 cfg->ht_rx_stbc = !!(wh->ht_cap_info & WMI_HT_CAP_RX_STBC);
4382
4383 /* TX STBC */
4384 cfg->ht_tx_stbc = !!(wh->ht_cap_info & WMI_HT_CAP_TX_STBC);
4385
4386 /* MPDU density */
4387 cfg->mpdu_density = wh->ht_cap_info & WMI_HT_CAP_MPDU_DENSITY;
4388
4389 /* HT RX LDPC */
4390 cfg->ht_rx_ldpc = !!(wh->ht_cap_info & WMI_HT_CAP_LDPC);
4391
4392 /* HT SGI */
4393 cfg->ht_sgi_20 = !!(wh->ht_cap_info & WMI_HT_CAP_HT20_SGI);
4394
4395 cfg->ht_sgi_40 = !!(wh->ht_cap_info & WMI_HT_CAP_HT40_SGI);
4396
4397 /* RF chains */
4398 cfg->num_rf_chains = wh->num_rf_chains;
4399
Jeff Johnson3fd21822016-11-08 11:30:37 -08004400 WMA_LOGD("%s: ht_cap_info - %x ht_rx_stbc - %d, ht_tx_stbc - %d\n"
4401 "mpdu_density - %d ht_rx_ldpc - %d ht_sgi_20 - %d\n"
4402 "ht_sgi_40 - %d num_rf_chains - %d", __func__, wh->ht_cap_info,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004403 cfg->ht_rx_stbc, cfg->ht_tx_stbc, cfg->mpdu_density,
4404 cfg->ht_rx_ldpc, cfg->ht_sgi_20, cfg->ht_sgi_40,
4405 cfg->num_rf_chains);
4406
4407}
4408
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004409/**
4410 * wma_update_target_vht_cap() - update vht capabality from wma handle
4411 * @wh: wma handle
4412 * @cfg: vht capabality
4413 *
4414 * Return: none
4415 */
4416static inline void wma_update_target_vht_cap(tp_wma_handle wh,
4417 struct wma_tgt_vht_cap *cfg)
4418{
4419
4420 if (wh->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_11454)
4421 cfg->vht_max_mpdu = WMI_VHT_CAP_MAX_MPDU_LEN_11454;
4422 else if (wh->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_7935)
4423 cfg->vht_max_mpdu = WMI_VHT_CAP_MAX_MPDU_LEN_7935;
4424 else
4425 cfg->vht_max_mpdu = 0;
4426
4427
4428 if (wh->vht_cap_info & WMI_VHT_CAP_CH_WIDTH_80P80_160MHZ) {
4429 cfg->supp_chan_width = 1 << eHT_CHANNEL_WIDTH_80P80MHZ;
4430 cfg->supp_chan_width |= 1 << eHT_CHANNEL_WIDTH_160MHZ;
4431 } else if (wh->vht_cap_info & WMI_VHT_CAP_CH_WIDTH_160MHZ)
4432 cfg->supp_chan_width = 1 << eHT_CHANNEL_WIDTH_160MHZ;
4433 else
4434 cfg->supp_chan_width = 1 << eHT_CHANNEL_WIDTH_80MHZ;
4435
4436 cfg->vht_rx_ldpc = wh->vht_cap_info & WMI_VHT_CAP_RX_LDPC;
4437
4438 cfg->vht_short_gi_80 = wh->vht_cap_info & WMI_VHT_CAP_SGI_80MHZ;
4439 cfg->vht_short_gi_160 = wh->vht_cap_info & WMI_VHT_CAP_SGI_160MHZ;
4440
4441 cfg->vht_tx_stbc = wh->vht_cap_info & WMI_VHT_CAP_TX_STBC;
4442
4443 cfg->vht_rx_stbc = (wh->vht_cap_info & WMI_VHT_CAP_RX_STBC_1SS) |
4444 (wh->vht_cap_info & WMI_VHT_CAP_RX_STBC_2SS) |
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004445 (wh->vht_cap_info & WMI_VHT_CAP_RX_STBC_3SS);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004446
4447 cfg->vht_max_ampdu_len_exp = (wh->vht_cap_info &
4448 WMI_VHT_CAP_MAX_AMPDU_LEN_EXP)
4449 >> WMI_VHT_CAP_MAX_AMPDU_LEN_EXP_SHIFT;
4450
4451 cfg->vht_su_bformer = wh->vht_cap_info & WMI_VHT_CAP_SU_BFORMER;
4452
4453 cfg->vht_su_bformee = wh->vht_cap_info & WMI_VHT_CAP_SU_BFORMEE;
4454
4455 cfg->vht_mu_bformer = wh->vht_cap_info & WMI_VHT_CAP_MU_BFORMER;
4456
4457 cfg->vht_mu_bformee = wh->vht_cap_info & WMI_VHT_CAP_MU_BFORMEE;
4458
4459 cfg->vht_txop_ps = wh->vht_cap_info & WMI_VHT_CAP_TXOP_PS;
4460
Jeff Johnson3fd21822016-11-08 11:30:37 -08004461 WMA_LOGD("%s: max_mpdu %d supp_chan_width %x rx_ldpc %x\n"
4462 "short_gi_80 %x tx_stbc %x rx_stbc %x txop_ps %x\n"
4463 "su_bformee %x mu_bformee %x max_ampdu_len_exp %d", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004464 cfg->vht_max_mpdu, cfg->supp_chan_width, cfg->vht_rx_ldpc,
4465 cfg->vht_short_gi_80, cfg->vht_tx_stbc, cfg->vht_rx_stbc,
4466 cfg->vht_txop_ps, cfg->vht_su_bformee, cfg->vht_mu_bformee,
4467 cfg->vht_max_ampdu_len_exp);
4468}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004469
4470/**
Krunal Sonica50b452017-08-04 22:24:59 -07004471 * wma_update_supported_bands() - update supported bands from service ready ext
4472 * @wma_handle: pointer to wma handle
4473 * @supported_bands: Supported band given by FW through service ready ext params
4474 * @new_supported_bands: New supported band which needs to be updated by
4475 * this API which WMA layer understands
4476 *
4477 * This API will convert FW given supported band to enum which WMA layer
4478 * understands
4479 *
4480 * Return: QDF_STATUS
4481 */
4482static QDF_STATUS wma_update_supported_bands(t_wma_handle *wma_handle,
4483 WLAN_BAND_CAPABILITY supported_bands,
4484 WMI_PHY_CAPABILITY *new_supported_bands)
4485{
4486 QDF_STATUS status = QDF_STATUS_SUCCESS;
4487
4488 if (!wma_handle) {
4489 WMA_LOGE("%s: NULL wma_handle", __func__);
4490 return QDF_STATUS_E_FAILURE;
4491 }
4492 if (!new_supported_bands) {
4493 WMA_LOGE("%s: NULL new supported band variable", __func__);
4494 return QDF_STATUS_E_FAILURE;
4495 }
4496 switch (supported_bands) {
4497 case WLAN_2G_CAPABILITY:
4498 *new_supported_bands |= WMI_11G_CAPABILITY;
4499 break;
4500 case WLAN_5G_CAPABILITY:
4501 *new_supported_bands |= WMI_11A_CAPABILITY;
4502 break;
4503 default:
4504 WMA_LOGE("%s: wrong supported band", __func__);
4505 status = QDF_STATUS_E_FAILURE;
4506 break;
4507 }
4508 return status;
4509}
4510
4511/**
Krunal Soniaa664da2016-06-15 23:46:40 -07004512 * wma_derive_ext_ht_cap() - Derive HT caps based on given value
4513 * @wma_handle: pointer to wma_handle
4514 * @ht_cap: given pointer to HT caps which needs to be updated
4515 * @tx_chain: given tx chainmask value
4516 * @rx_chain: given rx chainmask value
4517 * @value: new HT cap info provided in form of bitmask
4518 *
4519 * This function takes the value provided in form of bitmask and decodes
4520 * it. After decoding, what ever value it gets, it takes the union(max) or
4521 * intersection(min) with previously derived values.
4522 *
4523 * Return: none
4524 *
4525 */
4526static void wma_derive_ext_ht_cap(tp_wma_handle wma_handle,
4527 struct wma_tgt_ht_cap *ht_cap, uint32_t value,
4528 uint32_t tx_chain, uint32_t rx_chain)
4529{
4530 struct wma_tgt_ht_cap tmp = {0};
4531
4532 if (NULL == wma_handle || NULL == ht_cap)
4533 return;
4534
Ankit Guptaa5076012016-09-14 11:32:19 -07004535 if (!qdf_mem_cmp(ht_cap, &tmp, sizeof(struct wma_tgt_ht_cap))) {
Krunal Soniaa664da2016-06-15 23:46:40 -07004536 ht_cap->ht_rx_stbc = (!!(value & WMI_HT_CAP_RX_STBC));
4537 ht_cap->ht_tx_stbc = (!!(value & WMI_HT_CAP_TX_STBC));
4538 ht_cap->mpdu_density = (!!(value & WMI_HT_CAP_MPDU_DENSITY));
4539 ht_cap->ht_rx_ldpc = (!!(value & WMI_HT_CAP_RX_LDPC));
4540 ht_cap->ht_sgi_20 = (!!(value & WMI_HT_CAP_HT20_SGI));
4541 ht_cap->ht_sgi_40 = (!!(value & WMI_HT_CAP_HT40_SGI));
4542 ht_cap->num_rf_chains =
4543 QDF_MAX(wma_get_num_of_setbits_from_bitmask(tx_chain),
4544 wma_get_num_of_setbits_from_bitmask(rx_chain));
4545 } else {
4546 ht_cap->ht_rx_stbc = QDF_MIN(ht_cap->ht_rx_stbc,
4547 (!!(value & WMI_HT_CAP_RX_STBC)));
4548 ht_cap->ht_tx_stbc = QDF_MAX(ht_cap->ht_tx_stbc,
4549 (!!(value & WMI_HT_CAP_TX_STBC)));
4550 ht_cap->mpdu_density = QDF_MIN(ht_cap->mpdu_density,
4551 (!!(value & WMI_HT_CAP_MPDU_DENSITY)));
4552 ht_cap->ht_rx_ldpc = QDF_MIN(ht_cap->ht_rx_ldpc,
4553 (!!(value & WMI_HT_CAP_RX_LDPC)));
4554 ht_cap->ht_sgi_20 = QDF_MIN(ht_cap->ht_sgi_20,
4555 (!!(value & WMI_HT_CAP_HT20_SGI)));
4556 ht_cap->ht_sgi_40 = QDF_MIN(ht_cap->ht_sgi_40,
4557 (!!(value & WMI_HT_CAP_HT40_SGI)));
4558 ht_cap->num_rf_chains =
4559 QDF_MAX(ht_cap->num_rf_chains,
4560 QDF_MAX(wma_get_num_of_setbits_from_bitmask(
4561 tx_chain),
4562 wma_get_num_of_setbits_from_bitmask(
4563 rx_chain)));
4564 }
4565}
4566
4567/**
4568 * wma_update_target_ext_ht_cap() - Update HT caps with given extended cap
4569 * @wma_handle: pointer to wma_handle
4570 * @ht_cap: HT cap structure to be filled
4571 *
4572 * This function loop through each hardware mode and for each hardware mode
4573 * again it loop through each MAC/PHY and pull the caps 2G and 5G specific
4574 * HT caps and derives the final cap.
4575 *
4576 * Return: none
4577 *
4578 */
4579static void wma_update_target_ext_ht_cap(tp_wma_handle wma_handle,
4580 struct wma_tgt_ht_cap *ht_cap)
4581{
4582 int i, j = 0, max_mac;
4583 uint32_t ht_2g, ht_5g;
4584 struct wma_tgt_ht_cap tmp_ht_cap = {0}, tmp_cap = {0};
4585 struct extended_caps *phy_caps;
4586 WMI_MAC_PHY_CAPABILITIES *mac_cap;
4587
4588 /*
4589 * for legacy device extended cap might not even come, so in that case
4590 * don't overwrite legacy values
4591 */
4592 if (!wma_handle ||
4593 (0 == wma_handle->phy_caps.num_hw_modes.num_hw_modes)) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004594 WMA_LOGD("%s: No extended HT cap for current SOC", __func__);
Krunal Soniaa664da2016-06-15 23:46:40 -07004595 return;
4596 }
4597
4598 phy_caps = &wma_handle->phy_caps;
4599 for (i = 0; i < phy_caps->num_hw_modes.num_hw_modes; i++) {
4600 if (phy_caps->each_hw_mode_cap[i].phy_id_map == PHY1_PHY2)
4601 max_mac = j + 2;
4602 else
4603 max_mac = j + 1;
4604 for ( ; j < max_mac; j++) {
4605 mac_cap = &phy_caps->each_phy_cap_per_hwmode[j];
4606 ht_2g = mac_cap->ht_cap_info_2G;
4607 ht_5g = mac_cap->ht_cap_info_5G;
4608 if (ht_2g)
4609 wma_derive_ext_ht_cap(wma_handle, &tmp_ht_cap,
4610 ht_2g, mac_cap->tx_chain_mask_2G,
4611 mac_cap->rx_chain_mask_2G);
4612 if (ht_5g)
4613 wma_derive_ext_ht_cap(wma_handle, &tmp_ht_cap,
4614 ht_5g, mac_cap->tx_chain_mask_5G,
4615 mac_cap->rx_chain_mask_5G);
4616 }
4617 }
4618
Ankit Guptaa5076012016-09-14 11:32:19 -07004619 if (qdf_mem_cmp(&tmp_cap, &tmp_ht_cap,
Krunal Soniaa664da2016-06-15 23:46:40 -07004620 sizeof(struct wma_tgt_ht_cap))) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004621 qdf_mem_copy(ht_cap, &tmp_ht_cap,
4622 sizeof(struct wma_tgt_ht_cap));
Krunal Soniaa664da2016-06-15 23:46:40 -07004623 }
4624
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004625 WMA_LOGD("%s: [ext ht cap] ht_rx_stbc - %d, ht_tx_stbc - %d\n"
Jeff Johnson3fd21822016-11-08 11:30:37 -08004626 "mpdu_density - %d ht_rx_ldpc - %d ht_sgi_20 - %d\n"
4627 "ht_sgi_40 - %d num_rf_chains - %d", __func__,
Krunal Soniaa664da2016-06-15 23:46:40 -07004628 ht_cap->ht_rx_stbc, ht_cap->ht_tx_stbc,
4629 ht_cap->mpdu_density, ht_cap->ht_rx_ldpc,
4630 ht_cap->ht_sgi_20, ht_cap->ht_sgi_40,
4631 ht_cap->num_rf_chains);
4632}
4633
4634/**
4635 * wma_derive_ext_vht_cap() - Derive VHT caps based on given value
4636 * @wma_handle: pointer to wma_handle
4637 * @vht_cap: pointer to given VHT caps to be filled
4638 * @value: new VHT cap info provided in form of bitmask
4639 *
4640 * This function takes the value provided in form of bitmask and decodes
4641 * it. After decoding, what ever value it gets, it takes the union(max) or
4642 * intersection(min) with previously derived values.
4643 *
4644 * Return: none
4645 *
4646 */
4647static void wma_derive_ext_vht_cap(t_wma_handle *wma_handle,
4648 struct wma_tgt_vht_cap *vht_cap, uint32_t value)
4649{
4650 struct wma_tgt_vht_cap tmp_cap = {0};
4651 uint32_t tmp = 0;
4652
4653 if (NULL == wma_handle || NULL == vht_cap)
4654 return;
4655
Ankit Guptaa5076012016-09-14 11:32:19 -07004656 if (!qdf_mem_cmp(vht_cap, &tmp_cap,
Krunal Soniaa664da2016-06-15 23:46:40 -07004657 sizeof(struct wma_tgt_vht_cap))) {
4658 if (value & WMI_VHT_CAP_MAX_MPDU_LEN_11454)
4659 vht_cap->vht_max_mpdu = WMI_VHT_CAP_MAX_MPDU_LEN_11454;
4660 else if (value & WMI_VHT_CAP_MAX_MPDU_LEN_7935)
4661 vht_cap->vht_max_mpdu = WMI_VHT_CAP_MAX_MPDU_LEN_7935;
4662 else
4663 vht_cap->vht_max_mpdu = 0;
4664
4665 if (value & WMI_VHT_CAP_CH_WIDTH_80P80_160MHZ) {
4666 vht_cap->supp_chan_width =
4667 1 << eHT_CHANNEL_WIDTH_80P80MHZ;
4668 vht_cap->supp_chan_width |=
4669 1 << eHT_CHANNEL_WIDTH_160MHZ;
4670 } else if (value & WMI_VHT_CAP_CH_WIDTH_160MHZ) {
4671 vht_cap->supp_chan_width =
4672 1 << eHT_CHANNEL_WIDTH_160MHZ;
4673 } else {
4674 vht_cap->supp_chan_width = 1 << eHT_CHANNEL_WIDTH_80MHZ;
4675 }
4676 vht_cap->vht_rx_ldpc = value & WMI_VHT_CAP_RX_LDPC;
4677 vht_cap->vht_short_gi_80 = value & WMI_VHT_CAP_SGI_80MHZ;
4678 vht_cap->vht_short_gi_160 = value & WMI_VHT_CAP_SGI_160MHZ;
4679 vht_cap->vht_tx_stbc = value & WMI_VHT_CAP_TX_STBC;
4680 vht_cap->vht_rx_stbc =
4681 (value & WMI_VHT_CAP_RX_STBC_1SS) |
4682 (value & WMI_VHT_CAP_RX_STBC_2SS) |
4683 (value & WMI_VHT_CAP_RX_STBC_3SS);
4684 vht_cap->vht_max_ampdu_len_exp =
4685 (value & WMI_VHT_CAP_MAX_AMPDU_LEN_EXP) >>
4686 WMI_VHT_CAP_MAX_AMPDU_LEN_EXP_SHIFT;
4687 vht_cap->vht_su_bformer = value & WMI_VHT_CAP_SU_BFORMER;
4688 vht_cap->vht_su_bformee = value & WMI_VHT_CAP_SU_BFORMEE;
4689 vht_cap->vht_mu_bformer = value & WMI_VHT_CAP_MU_BFORMER;
4690 vht_cap->vht_mu_bformee = value & WMI_VHT_CAP_MU_BFORMEE;
4691 vht_cap->vht_txop_ps = value & WMI_VHT_CAP_TXOP_PS;
4692 } else {
4693 if (value & WMI_VHT_CAP_MAX_MPDU_LEN_11454)
4694 tmp = WMI_VHT_CAP_MAX_MPDU_LEN_11454;
4695 else if (value & WMI_VHT_CAP_MAX_MPDU_LEN_7935)
4696 tmp = WMI_VHT_CAP_MAX_MPDU_LEN_7935;
4697 else
4698 tmp = 0;
4699 vht_cap->vht_max_mpdu = QDF_MIN(vht_cap->vht_max_mpdu, tmp);
4700
4701 if ((value & WMI_VHT_CAP_CH_WIDTH_80P80_160MHZ)) {
4702 tmp = (1 << eHT_CHANNEL_WIDTH_80P80MHZ) |
4703 (1 << eHT_CHANNEL_WIDTH_160MHZ);
4704 } else if (value & WMI_VHT_CAP_CH_WIDTH_160MHZ) {
4705 tmp = 1 << eHT_CHANNEL_WIDTH_160MHZ;
4706 } else {
4707 tmp = 1 << eHT_CHANNEL_WIDTH_80MHZ;
4708 }
4709 vht_cap->supp_chan_width =
4710 QDF_MAX(vht_cap->supp_chan_width, tmp);
4711 vht_cap->vht_rx_ldpc = QDF_MIN(vht_cap->vht_rx_ldpc,
4712 value & WMI_VHT_CAP_RX_LDPC);
4713 vht_cap->vht_short_gi_80 = QDF_MAX(vht_cap->vht_short_gi_80,
4714 value & WMI_VHT_CAP_SGI_80MHZ);
4715 vht_cap->vht_short_gi_160 = QDF_MAX(vht_cap->vht_short_gi_160,
4716 value & WMI_VHT_CAP_SGI_160MHZ);
4717 vht_cap->vht_tx_stbc = QDF_MAX(vht_cap->vht_tx_stbc,
4718 value & WMI_VHT_CAP_TX_STBC);
4719 vht_cap->vht_rx_stbc = QDF_MIN(vht_cap->vht_rx_stbc,
4720 (value & WMI_VHT_CAP_RX_STBC_1SS) |
4721 (value & WMI_VHT_CAP_RX_STBC_2SS) |
4722 (value & WMI_VHT_CAP_RX_STBC_3SS));
4723 vht_cap->vht_max_ampdu_len_exp =
4724 QDF_MIN(vht_cap->vht_max_ampdu_len_exp,
4725 (value & WMI_VHT_CAP_MAX_AMPDU_LEN_EXP) >>
4726 WMI_VHT_CAP_MAX_AMPDU_LEN_EXP_SHIFT);
4727 vht_cap->vht_su_bformer = QDF_MAX(vht_cap->vht_su_bformer,
4728 value & WMI_VHT_CAP_SU_BFORMER);
4729 vht_cap->vht_su_bformee = QDF_MAX(vht_cap->vht_su_bformee,
4730 value & WMI_VHT_CAP_SU_BFORMEE);
4731 vht_cap->vht_mu_bformer = QDF_MAX(vht_cap->vht_mu_bformer,
4732 value & WMI_VHT_CAP_MU_BFORMER);
4733 vht_cap->vht_mu_bformee = QDF_MAX(vht_cap->vht_mu_bformee,
4734 value & WMI_VHT_CAP_MU_BFORMEE);
4735 vht_cap->vht_txop_ps = QDF_MIN(vht_cap->vht_txop_ps,
4736 value & WMI_VHT_CAP_TXOP_PS);
4737 }
4738}
4739
4740/**
4741 * wma_update_target_ext_vht_cap() - Update VHT caps with given extended cap
4742 * @wma_handle: pointer to wma_handle
4743 * @vht_cap: VHT cap structure to be filled
4744 *
4745 * This function loop through each hardware mode and for each hardware mode
4746 * again it loop through each MAC/PHY and pull the caps 2G and 5G specific
4747 * VHT caps and derives the final cap.
4748 *
4749 * Return: none
4750 *
4751 */
4752static void wma_update_target_ext_vht_cap(t_wma_handle *wma_handle,
4753 struct wma_tgt_vht_cap *vht_cap)
4754{
4755 int i, j = 0, max_mac;
4756 uint32_t vht_cap_info_2g, vht_cap_info_5g;
4757 struct wma_tgt_vht_cap tmp_vht_cap = {0}, tmp_cap = {0};
4758 struct extended_caps *phy_caps;
4759 WMI_MAC_PHY_CAPABILITIES *mac_cap;
4760
4761 /*
4762 * for legacy device extended cap might not even come, so in that case
4763 * don't overwrite legacy values
4764 */
4765 if (!wma_handle ||
4766 (0 == wma_handle->phy_caps.num_hw_modes.num_hw_modes)) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004767 WMA_LOGD("%s: No extended VHT cap for current SOC", __func__);
Krunal Soniaa664da2016-06-15 23:46:40 -07004768 return;
4769 }
4770
4771 phy_caps = &wma_handle->phy_caps;
4772 for (i = 0; i < phy_caps->num_hw_modes.num_hw_modes; i++) {
4773 if (phy_caps->each_hw_mode_cap[i].phy_id_map == PHY1_PHY2)
4774 max_mac = j + 2;
4775 else
4776 max_mac = j + 1;
4777 for ( ; j < max_mac; j++) {
4778 mac_cap = &phy_caps->each_phy_cap_per_hwmode[j];
4779 vht_cap_info_2g = mac_cap->vht_cap_info_2G;
4780 vht_cap_info_5g = mac_cap->vht_cap_info_5G;
4781 if (vht_cap_info_2g)
4782 wma_derive_ext_vht_cap(wma_handle, &tmp_vht_cap,
4783 vht_cap_info_2g);
4784 if (vht_cap_info_5g)
4785 wma_derive_ext_vht_cap(wma_handle, &tmp_vht_cap,
4786 vht_cap_info_5g);
4787 }
4788 }
4789
Ankit Guptaa5076012016-09-14 11:32:19 -07004790 if (qdf_mem_cmp(&tmp_cap, &tmp_vht_cap,
Krunal Soniaa664da2016-06-15 23:46:40 -07004791 sizeof(struct wma_tgt_vht_cap))) {
4792 qdf_mem_copy(vht_cap, &tmp_vht_cap,
4793 sizeof(struct wma_tgt_vht_cap));
4794 }
4795
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004796 WMA_LOGD("%s: [ext vhtcap] max_mpdu %d supp_chan_width %x rx_ldpc %x\n"
Jeff Johnson3fd21822016-11-08 11:30:37 -08004797 "short_gi_80 %x tx_stbc %x rx_stbc %x txop_ps %x\n"
4798 "su_bformee %x mu_bformee %x max_ampdu_len_exp %d", __func__,
Krunal Soniaa664da2016-06-15 23:46:40 -07004799 vht_cap->vht_max_mpdu, vht_cap->supp_chan_width,
4800 vht_cap->vht_rx_ldpc, vht_cap->vht_short_gi_80,
4801 vht_cap->vht_tx_stbc, vht_cap->vht_rx_stbc,
4802 vht_cap->vht_txop_ps, vht_cap->vht_su_bformee,
4803 vht_cap->vht_mu_bformee, vht_cap->vht_max_ampdu_len_exp);
4804}
4805
4806/**
Anurag Chouhan04dbf6d2016-09-08 15:32:52 +05304807 * wma_update_ra_rate_limit() - update wma config
4808 * @wma_handle: wma handle
4809 * @cfg: target config
4810 *
4811 * Return: none
4812 */
4813#ifdef FEATURE_WLAN_RA_FILTERING
4814static void wma_update_ra_rate_limit(tp_wma_handle wma_handle,
4815 struct wma_tgt_cfg *cfg)
4816{
4817 cfg->is_ra_rate_limit_enabled = wma_handle->IsRArateLimitEnabled;
4818}
4819#else
4820static void wma_update_ra_rate_limit(tp_wma_handle wma_handle,
4821 struct wma_tgt_cfg *cfg)
4822{
4823}
4824#endif
4825
4826/**
Krunal Sonica50b452017-08-04 22:24:59 -07004827 * wma_update_hdd_band_cap() - update band cap which hdd understands
4828 * @supported_band: supported band which has been given by FW
4829 * @tgt_cfg: target configuration to be updated
4830 *
4831 * Convert WMA given supported band to enum which HDD understands
4832 *
4833 * Return: None
4834 */
4835static void wma_update_hdd_band_cap(WMI_PHY_CAPABILITY supported_band,
4836 struct wma_tgt_cfg *tgt_cfg)
4837{
4838 switch (supported_band) {
4839 case WMI_11G_CAPABILITY:
4840 case WMI_11NG_CAPABILITY:
4841 tgt_cfg->band_cap = eCSR_BAND_24;
4842 break;
4843 case WMI_11A_CAPABILITY:
4844 case WMI_11NA_CAPABILITY:
4845 case WMI_11AC_CAPABILITY:
4846 tgt_cfg->band_cap = eCSR_BAND_5G;
4847 break;
4848 case WMI_11AG_CAPABILITY:
4849 case WMI_11NAG_CAPABILITY:
4850 default:
4851 tgt_cfg->band_cap = eCSR_BAND_ALL;
4852 }
4853}
4854
4855/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004856 * wma_update_hdd_cfg() - update HDD config
4857 * @wma_handle: wma handle
4858 *
4859 * Return: none
4860 */
4861static void wma_update_hdd_cfg(tp_wma_handle wma_handle)
4862{
4863 struct wma_tgt_cfg tgt_cfg;
Anurag Chouhan6d760662016-02-20 16:05:43 +05304864 void *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004865
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304866 qdf_mem_zero(&tgt_cfg, sizeof(struct wma_tgt_cfg));
Naveen Rawat64e477e2016-05-20 10:34:56 -07004867
4868 tgt_cfg.sub_20_support = wma_handle->sub_20_support;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004869 tgt_cfg.reg_domain = wma_handle->reg_cap.eeprom_rd;
4870 tgt_cfg.eeprom_rd_ext = wma_handle->reg_cap.eeprom_rd_ext;
4871
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004872 tgt_cfg.max_intf_count = wma_handle->wlan_resource_config.num_vdevs;
4873
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304874 qdf_mem_copy(tgt_cfg.hw_macaddr.bytes, wma_handle->hwaddr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004875 ATH_MAC_LEN);
4876
4877 wma_update_target_services(wma_handle, &tgt_cfg.services);
4878 wma_update_target_ht_cap(wma_handle, &tgt_cfg.ht_cap);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004879 wma_update_target_vht_cap(wma_handle, &tgt_cfg.vht_cap);
Krunal Soniaa664da2016-06-15 23:46:40 -07004880 /*
4881 * This will overwrite the structure filled by wma_update_target_ht_cap
4882 * and wma_update_target_vht_cap APIs.
4883 */
4884 wma_update_target_ext_ht_cap(wma_handle, &tgt_cfg.ht_cap);
4885 wma_update_target_ext_vht_cap(wma_handle, &tgt_cfg.vht_cap);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004886
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07004887 wma_update_target_ext_he_cap(wma_handle, &tgt_cfg);
4888
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004889 tgt_cfg.target_fw_version = wma_handle->target_fw_version;
Sandeep Puligilla3d6a8e22016-10-11 18:57:14 -07004890 tgt_cfg.target_fw_vers_ext = wma_handle->target_fw_vers_ext;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004891#ifdef WLAN_FEATURE_LPSS
4892 tgt_cfg.lpss_support = wma_handle->lpss_support;
4893#endif /* WLAN_FEATURE_LPSS */
4894 tgt_cfg.ap_arpns_support = wma_handle->ap_arpns_support;
Rajeev Kumare5a16822016-07-27 13:11:42 -07004895 tgt_cfg.bpf_enabled = wma_handle->bpf_enabled;
Arif Hussain759a0232017-03-20 13:17:18 -07004896 tgt_cfg.dfs_cac_offload = wma_handle->dfs_cac_offload;
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +05304897 tgt_cfg.rcpi_enabled = wma_handle->rcpi_enabled;
Anurag Chouhan04dbf6d2016-09-08 15:32:52 +05304898 wma_update_ra_rate_limit(wma_handle, &tgt_cfg);
Krunal Sonica50b452017-08-04 22:24:59 -07004899 wma_update_hdd_band_cap(wma_handle->phy_capability, &tgt_cfg);
Krishna Kumaar Natarajan1ae49112015-11-24 21:43:22 -08004900 tgt_cfg.fine_time_measurement_cap =
4901 wma_handle->fine_time_measurement_cap;
Rajeev Kumar Sirasanagandla47873002016-09-09 13:46:09 +05304902 tgt_cfg.wmi_max_len = wmi_get_max_msg_len(wma_handle->wmi_handle)
4903 - WMI_TLV_HEADROOM;
Ryan Hsu3c8f79f2015-12-02 16:45:09 -08004904 wma_setup_egap_support(&tgt_cfg, wma_handle);
Nachiket Kukade8b4bfd82017-05-25 18:34:48 +05304905 tgt_cfg.tx_bfee_8ss_enabled = wma_handle->tx_bfee_8ss_enabled;
Manjeet Singh70d3d932016-12-20 20:41:10 +05304906 tgt_cfg.fw_mem_dump_enabled = wma_handle->fw_mem_dump_enabled;
Deepak Dhamdhere13230d32016-05-26 00:46:53 -07004907 wma_update_hdd_cfg_ndp(wma_handle, &tgt_cfg);
Naveen Rawatcb186cf2016-07-11 13:47:19 -07004908 wma_handle->tgt_cfg_update_cb(hdd_ctx, &tgt_cfg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004909}
4910
4911/**
4912 * wma_setup_wmi_init_msg() - fill wmi init message buffer
4913 * @wma_handle: wma handle
4914 * @ev: ready event fixed params
4915 * @param_buf: redy event TLVs
4916 * @len: buffer length
4917 *
4918 * Return: wmi buffer or NULL for error
4919 */
Govind Singhf25a0f12016-03-08 16:09:48 +05304920static int wma_setup_wmi_init_msg(tp_wma_handle wma_handle,
4921 wmi_service_ready_event_fixed_param *ev,
4922 WMI_SERVICE_READY_EVENTID_param_tlvs *param_buf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004923{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004924 wlan_host_mem_req *ev_mem_reqs;
4925 wmi_abi_version my_vers;
Govind Singhf25a0f12016-03-08 16:09:48 +05304926 wmi_abi_version host_abi_vers;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004927 int num_whitelist;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004928 uint16_t idx;
4929 uint32_t num_units;
4930
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004931 ev_mem_reqs = param_buf->mem_reqs;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004932
4933 /* allocate memory requested by FW */
4934 if (ev->num_mem_reqs > WMI_MAX_MEM_REQS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304935 QDF_ASSERT(0);
Govind Singhf25a0f12016-03-08 16:09:48 +05304936 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004937 }
4938
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004939 for (idx = 0; idx < ev->num_mem_reqs; ++idx) {
4940 num_units = ev_mem_reqs[idx].num_units;
4941 if (ev_mem_reqs[idx].num_unit_info & NUM_UNITS_IS_NUM_PEERS) {
4942 /*
4943 * number of units to allocate is number
4944 * of peers, 1 extra for self peer on
4945 * target. this needs to be fied, host
4946 * and target can get out of sync
4947 */
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004948 num_units = wma_handle->wlan_resource_config.num_peers +
4949 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004950 }
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004951 WMA_LOGD("idx %d req %d num_units %d num_unit_info %d unit size %d actual units %d ",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004952 idx, ev_mem_reqs[idx].req_id,
4953 ev_mem_reqs[idx].num_units,
4954 ev_mem_reqs[idx].num_unit_info,
4955 ev_mem_reqs[idx].unit_size, num_units);
4956 wma_alloc_host_mem(wma_handle, ev_mem_reqs[idx].req_id,
4957 num_units, ev_mem_reqs[idx].unit_size);
4958 }
Govind Singhf25a0f12016-03-08 16:09:48 +05304959
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304960 qdf_mem_copy(&wma_handle->target_abi_vers,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004961 &param_buf->fixed_param->fw_abi_vers,
4962 sizeof(wmi_abi_version));
4963 num_whitelist = sizeof(version_whitelist) /
4964 sizeof(wmi_whitelist_version_info);
4965 my_vers.abi_version_0 = WMI_ABI_VERSION_0;
4966 my_vers.abi_version_1 = WMI_ABI_VERSION_1;
4967 my_vers.abi_version_ns_0 = WMI_ABI_VERSION_NS_0;
4968 my_vers.abi_version_ns_1 = WMI_ABI_VERSION_NS_1;
4969 my_vers.abi_version_ns_2 = WMI_ABI_VERSION_NS_2;
4970 my_vers.abi_version_ns_3 = WMI_ABI_VERSION_NS_3;
4971
4972 wmi_cmp_and_set_abi_version(num_whitelist, version_whitelist,
4973 &my_vers,
4974 &param_buf->fixed_param->fw_abi_vers,
Govind Singhf25a0f12016-03-08 16:09:48 +05304975 &host_abi_vers);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004976
Govind Singhf25a0f12016-03-08 16:09:48 +05304977 qdf_mem_copy(&wma_handle->final_abi_vers, &host_abi_vers,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004978 sizeof(wmi_abi_version));
Govind Singhf25a0f12016-03-08 16:09:48 +05304979
4980 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004981}
4982
4983/**
4984 * wma_dump_dbs_hw_mode() - Print the DBS HW modes
4985 * @wma_handle: WMA handle
4986 *
4987 * Prints the DBS HW modes sent by the FW as part
4988 * of WMI ready event
4989 *
4990 * Return: None
4991 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07004992static void wma_dump_dbs_hw_mode(tp_wma_handle wma_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004993{
4994 uint32_t i, param;
4995
4996 if (!wma_handle) {
4997 WMA_LOGE("%s: Invalid WMA handle", __func__);
4998 return;
4999 }
5000
5001 for (i = 0; i < wma_handle->num_dbs_hw_modes; i++) {
5002 param = wma_handle->hw_mode.hw_mode_list[i];
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08005003 WMA_LOGD("%s:[%d]-MAC0: tx_ss:%d rx_ss:%d bw_idx:%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005004 __func__, i,
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305005 WMA_HW_MODE_MAC0_TX_STREAMS_GET(param),
5006 WMA_HW_MODE_MAC0_RX_STREAMS_GET(param),
5007 WMA_HW_MODE_MAC0_BANDWIDTH_GET(param));
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08005008 WMA_LOGD("%s:[%d]-MAC1: tx_ss:%d rx_ss:%d bw_idx:%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005009 __func__, i,
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305010 WMA_HW_MODE_MAC1_TX_STREAMS_GET(param),
5011 WMA_HW_MODE_MAC1_RX_STREAMS_GET(param),
5012 WMA_HW_MODE_MAC1_BANDWIDTH_GET(param));
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08005013 WMA_LOGD("%s:[%d] DBS:%d SBS:%d", __func__, i,
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305014 WMA_HW_MODE_DBS_MODE_GET(param),
5015 WMA_HW_MODE_SBS_MODE_GET(param));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005016 }
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07005017 policy_mgr_dump_dbs_hw_mode(wma_handle->psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005018}
5019
5020/**
5021 * wma_init_scan_fw_mode_config() - Initialize scan/fw mode config
5022 * @wma_handle: WMA handle
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05305023 * @scan_config: Scam mode configuration
5024 * @fw_config: FW mode configuration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005025 *
5026 * Enables all the valid bits of concurrent_scan_config_bits and
5027 * fw_mode_config_bits.
5028 *
5029 * Return: None
5030 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07005031static void wma_init_scan_fw_mode_config(tp_wma_handle wma_handle,
5032 uint32_t scan_config,
5033 uint32_t fw_config)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005034{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005035 WMA_LOGD("%s: Enter", __func__);
5036
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005037 if (!wma_handle) {
5038 WMA_LOGE("%s: Invalid WMA handle", __func__);
5039 return;
5040 }
5041
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07005042 policy_mgr_init_dbs_config(wma_handle->psoc, scan_config, fw_config);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005043}
5044
5045/**
Anurag Chouhan04dbf6d2016-09-08 15:32:52 +05305046 * wma_update_ra_limit() - update ra limit based on bpf filter
5047 * enabled or not
5048 * @handle: wma handle
5049 *
5050 * Return: none
5051 */
5052#ifdef FEATURE_WLAN_RA_FILTERING
5053static void wma_update_ra_limit(tp_wma_handle wma_handle)
5054{
5055 if (wma_handle->bpf_enabled)
5056 wma_handle->IsRArateLimitEnabled = false;
5057}
5058#else
5059static void wma_update_ra__limit(tp_wma_handle handle)
5060{
5061}
5062#endif
5063
5064/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005065 * wma_rx_service_ready_event() - event handler to process
5066 * wmi rx sevice ready event.
5067 * @handle: wma handle
5068 * @cmd_param_info: command params info
5069 *
5070 * Return: none
5071 */
Govind Singhd76a5b02016-03-08 15:12:14 +05305072int wma_rx_service_ready_event(void *handle, uint8_t *cmd_param_info,
5073 uint32_t length)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005074{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005075 tp_wma_handle wma_handle = (tp_wma_handle) handle;
5076 struct wma_target_cap target_cap;
5077 WMI_SERVICE_READY_EVENTID_param_tlvs *param_buf;
5078 wmi_service_ready_event_fixed_param *ev;
5079 int status;
5080 uint32_t *ev_wlan_dbs_hw_mode_list;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305081 QDF_STATUS ret;
Leo Chang96464902016-10-28 11:10:54 -07005082 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005083
5084 WMA_LOGD("%s: Enter", __func__);
5085
5086 param_buf = (WMI_SERVICE_READY_EVENTID_param_tlvs *) cmd_param_info;
5087 if (!(handle && param_buf)) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07005088 WMA_LOGE("%s: Invalid arguments", __func__);
Govind Singhd76a5b02016-03-08 15:12:14 +05305089 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005090 }
5091
5092 ev = param_buf->fixed_param;
5093 if (!ev) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07005094 WMA_LOGE("%s: Invalid buffer", __func__);
Govind Singhd76a5b02016-03-08 15:12:14 +05305095 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005096 }
5097
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08005098 WMA_LOGD("WMA <-- WMI_SERVICE_READY_EVENTID");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005099
Amar Singhal7b038ca2017-10-04 13:38:39 -07005100 if (ev->num_dbs_hw_modes > param_buf->num_wlan_dbs_hw_mode_list) {
5101 WMA_LOGE("FW dbs_hw_mode entry %d more than value %d in TLV hdr",
5102 ev->num_dbs_hw_modes,
5103 param_buf->num_wlan_dbs_hw_mode_list);
5104 return -EINVAL;
5105 }
5106
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005107 wma_handle->num_dbs_hw_modes = ev->num_dbs_hw_modes;
5108 ev_wlan_dbs_hw_mode_list = param_buf->wlan_dbs_hw_mode_list;
5109 wma_handle->hw_mode.hw_mode_list =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305110 qdf_mem_malloc(sizeof(*wma_handle->hw_mode.hw_mode_list) *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005111 wma_handle->num_dbs_hw_modes);
5112 if (!wma_handle->hw_mode.hw_mode_list) {
5113 WMA_LOGE("%s: Memory allocation failed for DBS", __func__);
5114 /* Continuing with the rest of the processing */
5115 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305116 qdf_mem_copy(wma_handle->hw_mode.hw_mode_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005117 ev_wlan_dbs_hw_mode_list,
5118 (sizeof(*wma_handle->hw_mode.hw_mode_list) *
5119 wma_handle->num_dbs_hw_modes));
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07005120 policy_mgr_init_dbs_hw_mode(wma_handle->psoc,
5121 ev->num_dbs_hw_modes, ev_wlan_dbs_hw_mode_list);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005122 wma_dump_dbs_hw_mode(wma_handle);
5123
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05305124 /* Initializes the fw_mode and scan_config to zero.
5125 * If ext service ready event is present it will set
5126 * the actual values of these two params.
5127 * This is to ensure that no garbage values would be
5128 * present in the absence of ext service ready event.
5129 */
5130 wma_init_scan_fw_mode_config(wma_handle, 0, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005131
5132 wma_handle->phy_capability = ev->phy_capability;
5133 wma_handle->max_frag_entry = ev->max_frag_entry;
5134 wma_handle->num_rf_chains = ev->num_rf_chains;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305135 qdf_mem_copy(&wma_handle->reg_cap, param_buf->hal_reg_capabilities,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005136 sizeof(HAL_REG_CAPABILITIES));
5137 wma_handle->ht_cap_info = ev->ht_cap_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005138 wma_handle->vht_cap_info = ev->vht_cap_info;
5139 wma_handle->vht_supp_mcs = ev->vht_supp_mcs;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005140 wma_handle->num_rf_chains = ev->num_rf_chains;
5141
5142 wma_handle->target_fw_version = ev->fw_build_vers;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005143 wma_handle->new_hw_mode_index = ev->default_dbs_hw_mode_index;
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07005144 policy_mgr_update_new_hw_mode_index(wma_handle->psoc,
5145 ev->default_dbs_hw_mode_index);
Krishna Kumaar Natarajan1ae49112015-11-24 21:43:22 -08005146 wma_handle->fine_time_measurement_cap = ev->wmi_fw_sub_feat_caps;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005147
5148 WMA_LOGD("%s: Firmware default hw mode index : %d",
5149 __func__, ev->default_dbs_hw_mode_index);
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08005150 WMA_LOGI("%s: Firmware build version : %08x",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005151 __func__, ev->fw_build_vers);
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08005152 WMA_LOGD("FW fine time meas cap: 0x%x", ev->wmi_fw_sub_feat_caps);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005153
5154 if (ev->hw_bd_id) {
5155 wma_handle->hw_bd_id = ev->hw_bd_id;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305156 qdf_mem_copy(wma_handle->hw_bd_info,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005157 ev->hw_bd_info, sizeof(ev->hw_bd_info));
5158
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08005159 WMA_LOGI("%s: Board version: %x.%x",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005160 __func__,
5161 wma_handle->hw_bd_info[0], wma_handle->hw_bd_info[1]);
5162 } else {
5163 wma_handle->hw_bd_id = 0;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305164 qdf_mem_zero(wma_handle->hw_bd_info,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005165 sizeof(wma_handle->hw_bd_info));
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08005166 WMA_LOGW("%s: Board version is unknown!", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005167 }
5168
5169 /* TODO: Recheck below line to dump service ready event */
5170 /* dbg_print_wmi_service_11ac(ev); */
5171
5172 /* wmi service is ready */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305173 qdf_mem_copy(wma_handle->wmi_service_bitmap,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005174 param_buf->wmi_service_bitmap,
5175 sizeof(wma_handle->wmi_service_bitmap));
Nirav Shah22bf44d2015-12-10 15:39:48 +05305176
Leo Chang96464902016-10-28 11:10:54 -07005177 cdp_cfg_tx_set_is_mgmt_over_wmi_enabled(soc,
Nirav Shah22bf44d2015-12-10 15:39:48 +05305178 WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
5179 WMI_SERVICE_MGMT_TX_WMI));
Leo Chang96464902016-10-28 11:10:54 -07005180 cdp_set_desc_global_pool_size(soc, ev->num_msdu_desc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005181 /* SWBA event handler for beacon transmission */
5182 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
5183 WMI_HOST_SWBA_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05305184 wma_beacon_swba_handler,
5185 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005186 if (status) {
5187 WMA_LOGE("Failed to register swba beacon event cb");
Govind Singhd76a5b02016-03-08 15:12:14 +05305188 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005189 }
5190#ifdef WLAN_FEATURE_LPSS
5191 wma_handle->lpss_support =
5192 WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
5193 WMI_SERVICE_LPASS);
5194#endif /* WLAN_FEATURE_LPSS */
5195
5196 /*
5197 * This Service bit is added to check for ARP/NS Offload
5198 * support for LL/HL targets
5199 */
5200 wma_handle->ap_arpns_support =
5201 WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
5202 WMI_SERVICE_AP_ARPNS_OFFLOAD);
5203
Anurag Chouhan04dbf6d2016-09-08 15:32:52 +05305204 wma_handle->bpf_enabled = (wma_handle->bpf_packet_filter_enable &&
Rajeev Kumare5a16822016-07-27 13:11:42 -07005205 WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
Anurag Chouhan04dbf6d2016-09-08 15:32:52 +05305206 WMI_SERVICE_BPF_OFFLOAD));
5207 wma_update_ra_limit(wma_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005208 if (WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
5209 WMI_SERVICE_CSA_OFFLOAD)) {
5210 WMA_LOGD("%s: FW support CSA offload capability", __func__);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07005211 status = wmi_unified_register_event_handler(
5212 wma_handle->wmi_handle,
Govind Singhd76a5b02016-03-08 15:12:14 +05305213 WMI_CSA_HANDLING_EVENTID,
5214 wma_csa_offload_handler,
5215 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005216 if (status) {
5217 WMA_LOGE("Failed to register CSA offload event cb");
Govind Singhd76a5b02016-03-08 15:12:14 +05305218 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005219 }
5220 }
5221
5222 if (WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
5223 WMI_SERVICE_MGMT_TX_WMI)) {
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08005224 WMA_LOGD("Firmware supports management TX over WMI,use WMI interface instead of HTT for management Tx");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005225 /*
5226 * Register Tx completion event handler for MGMT Tx over WMI
5227 * case
5228 */
5229 status = wmi_unified_register_event_handler(
5230 wma_handle->wmi_handle,
5231 WMI_MGMT_TX_COMPLETION_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05305232 wma_mgmt_tx_completion_handler,
5233 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005234 if (status) {
5235 WMA_LOGE("Failed to register MGMT over WMI completion handler");
Govind Singhd76a5b02016-03-08 15:12:14 +05305236 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005237 }
5238
Nirav Shah20489972016-06-16 19:20:28 +05305239 status = wmi_unified_register_event_handler(
5240 wma_handle->wmi_handle,
5241 WMI_MGMT_TX_BUNDLE_COMPLETION_EVENTID,
5242 wma_mgmt_tx_bundle_completion_handler,
5243 WMA_RX_SERIALIZER_CTX);
5244 if (status) {
5245 WMA_LOGE("Failed to register MGMT over WMI completion handler");
5246 return -EINVAL;
5247 }
5248
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005249 } else {
5250 WMA_LOGE("FW doesnot support WMI_SERVICE_MGMT_TX_WMI, Use HTT interface for Management Tx");
5251 }
5252#ifdef WLAN_FEATURE_GTK_OFFLOAD
5253 if (WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
5254 WMI_SERVICE_GTK_OFFLOAD)) {
5255 status =
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07005256 wmi_unified_register_event_handler(
5257 wma_handle->wmi_handle,
Mukul Sharma3d36c392017-01-18 18:39:12 +05305258 WMI_GTK_OFFLOAD_STATUS_EVENTID,
5259 target_if_pmo_gtk_offload_status_event,
5260 WMA_RX_WORK_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005261 if (status) {
5262 WMA_LOGE("Failed to register GTK offload event cb");
Govind Singhd76a5b02016-03-08 15:12:14 +05305263 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005264 }
5265 }
5266#endif /* WLAN_FEATURE_GTK_OFFLOAD */
5267
Manjeet Singh70d3d932016-12-20 20:41:10 +05305268 if (WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
5269 WMI_SERVICE_FW_MEM_DUMP_SUPPORT))
5270 wma_handle->fw_mem_dump_enabled = true;
5271 else
5272 wma_handle->fw_mem_dump_enabled = false;
5273
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005274 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
Govind Singhd76a5b02016-03-08 15:12:14 +05305275 WMI_TBTTOFFSET_UPDATE_EVENTID,
5276 wma_tbttoffset_update_event_handler,
5277 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005278 if (status) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07005279 WMA_LOGE("Failed to register WMI_TBTTOFFSET_UPDATE_EVENTID callback");
Govind Singhd76a5b02016-03-08 15:12:14 +05305280 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005281 }
5282
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +05305283 if (WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
5284 WMI_SERVICE_RCPI_SUPPORT)) {
5285 /* register for rcpi response event */
5286 status = wmi_unified_register_event_handler(
5287 wma_handle->wmi_handle,
5288 WMI_UPDATE_RCPI_EVENTID,
5289 wma_rcpi_event_handler,
5290 WMA_RX_SERIALIZER_CTX);
5291 if (status) {
5292 WMA_LOGE("Failed to register RCPI event handler");
5293 return -EINVAL;
5294 }
5295 wma_handle->rcpi_enabled = true;
5296 }
5297
Govind Singhefc5ccd2016-04-25 11:11:55 +05305298 /* mac_id is replaced with pdev_id in converged firmware to have
5299 * multi-radio support. In order to maintain backward compatibility
5300 * with old fw, host needs to check WMI_SERVICE_DEPRECATED_REPLACE
5301 * in service bitmap from FW and host needs to set use_pdev_id in
5302 * wmi_resource_config to true. If WMI_SERVICE_DEPRECATED_REPLACE
5303 * service is not set, then host shall not expect MAC ID from FW in
5304 * VDEV START RESPONSE event and host shall use PDEV ID.
5305 */
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07005306 if (WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
Govind Singhefc5ccd2016-04-25 11:11:55 +05305307 WMI_SERVICE_DEPRECATED_REPLACE))
5308 wma_handle->wlan_resource_config.use_pdev_id = true;
5309 else
5310 wma_handle->wlan_resource_config.use_pdev_id = false;
5311
Nitesh Shahf9a09ff2017-05-22 15:46:25 +05305312 wma_handle->wlan_resource_config.max_num_dbs_scan_duty_cycle =
5313 CDS_DBS_SCAN_CLIENTS_MAX;
5314
Ryan Hsu3c8f79f2015-12-02 16:45:09 -08005315 /* register the Enhanced Green AP event handler */
5316 wma_register_egap_event_handle(wma_handle);
5317
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005318 /* Initialize the log supported event handler */
5319 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
5320 WMI_DIAG_EVENT_LOG_SUPPORTED_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05305321 wma_log_supported_evt_handler,
5322 WMA_RX_SERIALIZER_CTX);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305323 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005324 WMA_LOGE("Failed to register log supported event cb");
Govind Singhd76a5b02016-03-08 15:12:14 +05305325 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005326 }
5327
Leo Chang96464902016-10-28 11:10:54 -07005328 cdp_mark_first_wakeup_packet(soc,
Himanshu Agarwal19141bb2016-07-20 20:15:48 +05305329 WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
5330 WMI_SERVICE_MARK_FIRST_WAKEUP_PACKET));
Arif Hussain759a0232017-03-20 13:17:18 -07005331 wma_handle->dfs_cac_offload =
5332 WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
5333 WMI_SERVICE_DFS_PHYERR_OFFLOAD);
Deepak Dhamdhere13230d32016-05-26 00:46:53 -07005334 wma_handle->nan_datapath_enabled =
5335 WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
5336 WMI_SERVICE_NAN_DATA);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305337 qdf_mem_copy(target_cap.wmi_service_bitmap,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005338 param_buf->wmi_service_bitmap,
5339 sizeof(wma_handle->wmi_service_bitmap));
5340 target_cap.wlan_resource_config = wma_handle->wlan_resource_config;
5341 wma_update_fw_config(wma_handle, &target_cap);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305342 qdf_mem_copy(wma_handle->wmi_service_bitmap,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005343 target_cap.wmi_service_bitmap,
5344 sizeof(wma_handle->wmi_service_bitmap));
5345 wma_handle->wlan_resource_config = target_cap.wlan_resource_config;
5346
Govind Singhf25a0f12016-03-08 16:09:48 +05305347 status = wmi_unified_save_fw_version_cmd(wma_handle->wmi_handle,
5348 param_buf);
5349 if (status != EOK) {
5350 WMA_LOGE("Failed to send WMI_INIT_CMDID command");
5351 return -EINVAL;
5352 }
5353
5354 status = wma_setup_wmi_init_msg(wma_handle, ev, param_buf);
5355 if (status != EOK) {
5356 WMA_LOGE("Failed to setup for wma init command");
Govind Singhd76a5b02016-03-08 15:12:14 +05305357 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005358 }
5359
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05305360 /* A host, which supports WMI_SERVICE_READY_EXT_EVENTID, would need to
5361 * check the WMI_SERVICE_READY message for an "extension" flag, and if
5362 * this flag is set, then hold off on sending the WMI_INIT message until
5363 * WMI_SERVICE_READY_EXT_EVENTID is received.
5364 */
5365 if (!WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
5366 WMI_SERVICE_EXT_MSG)) {
5367 /* No service extended message support.
5368 * Send INIT command immediately
5369 */
Mukul Sharmab10c8c72017-11-02 17:25:59 +05305370 struct wmi_init_cmd_param init_param = {0};
5371 init_param.res_cfg = &wma_handle->wlan_resource_config;
5372 init_param.num_mem_chunks = wma_handle->num_mem_chunks;
5373 init_param.mem_chunks = wma_handle->mem_chunks;
5374 init_param.hw_mode_id = WMI_HOST_HW_MODE_MAX;
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05305375 WMA_LOGA("WMA --> WMI_INIT_CMDID");
Mukul Sharmab10c8c72017-11-02 17:25:59 +05305376 status = wmi_unified_init_cmd_send(wma_handle->wmi_handle,
5377 &init_param);
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05305378 if (status != EOK) {
5379 WMA_LOGE("Failed to send WMI_INIT_CMDID command");
Govind Singhd76a5b02016-03-08 15:12:14 +05305380 return -EINVAL;
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05305381 }
5382 } else {
Anurag Chouhan210db072016-02-22 18:42:15 +05305383 ret = qdf_mc_timer_start(&wma_handle->service_ready_ext_timer,
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05305384 WMA_SERVICE_READY_EXT_TIMEOUT);
Anurag Chouhandf2b2682016-02-29 14:15:27 +05305385 if (!QDF_IS_STATUS_SUCCESS(ret))
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07005386 WMA_LOGE("Failed to start the service ready ext timer");
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05305387
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08005388 WMA_LOGD("%s: WMA waiting for WMI_SERVICE_READY_EXT_EVENTID",
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05305389 __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005390 }
Govind Singhd76a5b02016-03-08 15:12:14 +05305391
Nachiket Kukade8b4bfd82017-05-25 18:34:48 +05305392 if (WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
5393 WMI_SERVICE_8SS_TX_BFEE))
5394 wma_handle->tx_bfee_8ss_enabled = true;
5395 else
5396 wma_handle->tx_bfee_8ss_enabled = false;
5397
Govind Singhd76a5b02016-03-08 15:12:14 +05305398 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005399}
5400
5401/**
Krunal Soni0193b6f2016-08-15 15:53:43 -07005402 * wma_get_phyid_for_given_band() - to get phyid for band
5403 *
5404 * @wma_handle: Pointer to wma handle
5405 * @map: Pointer to map which is derived from hw mode & has mapping between
5406 * hw mode and available PHYs for that hw mode.
5407 * @band: enum value of for 2G or 5G band
5408 * @phyid: Pointer to phyid which needs to be filled
5409 *
5410 * This API looks in to the map to find out which particular phy supports
5411 * provided band and return the idx (also called phyid) of that phy. Caller
5412 * use this phyid to fetch various caps of that phy
5413 *
5414 * Return: QDF_STATUS
5415 */
5416static QDF_STATUS wma_get_phyid_for_given_band(
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07005417 tp_wma_handle wma_handle,
Krunal Soni0193b6f2016-08-15 15:53:43 -07005418 struct hw_mode_idx_to_mac_cap_idx *map,
5419 enum cds_band_type band, uint8_t *phyid)
5420{
5421 uint8_t idx, i;
5422 WMI_MAC_PHY_CAPABILITIES *cap;
5423
5424 if (!wma_handle) {
5425 WMA_LOGE("Invalid wma handle");
5426 return QDF_STATUS_E_FAILURE;
5427 }
5428
5429 if (!map) {
5430 WMA_LOGE("Invalid given map");
5431 return QDF_STATUS_E_FAILURE;
5432 }
5433 idx = map->mac_cap_idx;
5434 *phyid = idx;
5435
5436 for (i = 0; i < map->num_of_macs; i++) {
5437 cap = &wma_handle->phy_caps.each_phy_cap_per_hwmode[idx + i];
5438 if ((band == CDS_BAND_2GHZ) &&
5439 (WLAN_2G_CAPABILITY == cap->supported_bands)) {
5440 *phyid = idx + i;
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07005441 WMA_LOGD("Select 2G capable phyid[%d]", *phyid);
Krunal Soni0193b6f2016-08-15 15:53:43 -07005442 return QDF_STATUS_SUCCESS;
5443 } else if ((band == CDS_BAND_5GHZ) &&
5444 (WLAN_5G_CAPABILITY == cap->supported_bands)) {
5445 *phyid = idx + i;
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07005446 WMA_LOGD("Select 5G capable phyid[%d]", *phyid);
Krunal Soni0193b6f2016-08-15 15:53:43 -07005447 return QDF_STATUS_SUCCESS;
5448 }
5449 }
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07005450 WMA_LOGD("Using default single hw mode phyid[%d]", *phyid);
Krunal Soni0193b6f2016-08-15 15:53:43 -07005451 return QDF_STATUS_SUCCESS;
5452}
5453
5454/**
5455 * wma_get_caps_for_phyidx_hwmode() - to fetch caps for given hw mode and band
5456 * @caps_per_phy: Pointer to capabilities structure which needs to be filled
5457 * @hw_mode: Provided hardware mode
5458 * @band: Provide band i.e. 2G or 5G
5459 *
5460 * This API finds cap which suitable for provided hw mode and band. If user
5461 * is provides some invalid hw mode then it will automatically falls back to
5462 * default hw mode
5463 *
5464 * Return: QDF_STATUS
5465 */
5466QDF_STATUS wma_get_caps_for_phyidx_hwmode(struct wma_caps_per_phy *caps_per_phy,
5467 enum hw_mode_dbs_capab hw_mode, enum cds_band_type band)
5468{
5469 t_wma_handle *wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
5470 struct hw_mode_idx_to_mac_cap_idx *map;
5471 WMI_MAC_PHY_CAPABILITIES *phy_cap;
5472 uint8_t phyid, our_hw_mode = hw_mode;
5473
5474 if (!wma_handle) {
5475 WMA_LOGE("Invalid wma handle");
5476 return QDF_STATUS_E_FAILURE;
5477 }
5478
5479 if (0 == wma_handle->phy_caps.num_hw_modes.num_hw_modes) {
jiad080abce2017-08-08 15:17:39 +08005480 WMA_LOGD("Invalid number of hw modes, use legacy HT/VHT caps");
5481 caps_per_phy->ht_2g = wma_handle->ht_cap_info;
5482 caps_per_phy->ht_5g = wma_handle->ht_cap_info;
5483 caps_per_phy->vht_2g = wma_handle->vht_cap_info;
5484 caps_per_phy->vht_5g = wma_handle->vht_cap_info;
5485 /* legacy platform doesn't support HE IE */
5486 caps_per_phy->he_2g = 0;
5487 caps_per_phy->he_5g = 0;
5488
5489 return QDF_STATUS_SUCCESS;
Krunal Soni0193b6f2016-08-15 15:53:43 -07005490 }
5491
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07005492 if (!policy_mgr_is_dbs_enable(wma_handle->psoc))
Krunal Soni0193b6f2016-08-15 15:53:43 -07005493 our_hw_mode = HW_MODE_DBS_NONE;
5494
5495 if (!caps_per_phy) {
5496 WMA_LOGE("Invalid caps pointer");
5497 return QDF_STATUS_E_FAILURE;
5498 }
5499
5500 map = &wma_handle->phy_caps.hw_mode_to_mac_cap_map[our_hw_mode];
5501
5502 if (QDF_STATUS_SUCCESS !=
5503 wma_get_phyid_for_given_band(wma_handle, map, band, &phyid)) {
5504 WMA_LOGE("Invalid phyid");
5505 return QDF_STATUS_E_FAILURE;
5506 }
5507 phy_cap = &wma_handle->phy_caps.each_phy_cap_per_hwmode[phyid];
5508
5509 caps_per_phy->ht_2g = phy_cap->ht_cap_info_2G;
5510 caps_per_phy->ht_5g = phy_cap->ht_cap_info_5G;
5511 caps_per_phy->vht_2g = phy_cap->vht_cap_info_2G;
5512 caps_per_phy->vht_5g = phy_cap->vht_cap_info_5G;
5513 caps_per_phy->he_2g = phy_cap->he_cap_info_2G;
5514 caps_per_phy->he_5g = phy_cap->he_cap_info_5G;
5515
5516 return QDF_STATUS_SUCCESS;
5517}
5518
5519/**
5520 * wma_is_rx_ldpc_supported_for_channel() - to find out if ldpc is supported
5521 *
5522 * @channel: Channel number for which it needs to check if rx ldpc is enabled
5523 *
5524 * This API takes channel number as argument and takes default hw mode as DBS
5525 * to check if rx LDPC support is enabled for that channel or no
5526 */
5527bool wma_is_rx_ldpc_supported_for_channel(uint32_t channel)
5528{
jiad080abce2017-08-08 15:17:39 +08005529 t_wma_handle *wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Krunal Soni0193b6f2016-08-15 15:53:43 -07005530 struct wma_caps_per_phy caps_per_phy = {0};
5531 enum cds_band_type band;
5532 bool status;
5533
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07005534 if (!WLAN_REG_IS_24GHZ_CH(channel))
Krunal Soni0193b6f2016-08-15 15:53:43 -07005535 band = CDS_BAND_5GHZ;
5536 else
5537 band = CDS_BAND_2GHZ;
5538
5539 if (QDF_STATUS_SUCCESS != wma_get_caps_for_phyidx_hwmode(
5540 &caps_per_phy,
5541 HW_MODE_DBS, band)) {
5542 return false;
5543 }
jiad080abce2017-08-08 15:17:39 +08005544
5545 /*
5546 * Legacy platforms like Rome set WMI_HT_CAP_LDPC to specify RX LDPC
5547 * capability. But new platforms like Helium set WMI_HT_CAP_RX_LDPC
5548 * instead.
5549 */
5550 if (wma_handle->phy_caps.num_hw_modes.num_hw_modes == 0) {
5551 status = (!!(caps_per_phy.ht_2g & WMI_HT_CAP_LDPC));
5552 } else {
5553 if (WLAN_REG_IS_24GHZ_CH(channel))
5554 status = (!!(caps_per_phy.ht_2g & WMI_HT_CAP_RX_LDPC));
5555 else
5556 status = (!!(caps_per_phy.ht_5g & WMI_HT_CAP_RX_LDPC));
5557 }
Krunal Soni0193b6f2016-08-15 15:53:43 -07005558
5559 return status;
5560}
5561
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07005562/**
5563 * wma_print_mac_phy_capabilities() - Prints MAC PHY capabilities
5564 * @cap: pointer to WMI_MAC_PHY_CAPABILITIES
5565 * @index: MAC_PHY index
5566 *
5567 * Return: none
5568 */
5569static void wma_print_mac_phy_capabilities(WMI_MAC_PHY_CAPABILITIES *cap,
5570 int index)
5571{
5572 uint32_t mac_2G, mac_5G;
5573 uint32_t phy_2G[WMI_MAX_HECAP_PHY_SIZE];
5574 uint32_t phy_5G[WMI_MAX_HECAP_PHY_SIZE];
5575 wmi_ppe_threshold ppet_2G, ppet_5G;
5576
5577 WMA_LOGI("\t: index [%d]", index);
5578 WMA_LOGI("\t: cap for hw_mode_id[%d]", cap->hw_mode_id);
5579 WMA_LOGI("\t: pdev_id[%d]", cap->pdev_id);
5580 WMA_LOGI("\t: phy_id[%d]", cap->phy_id);
5581 WMA_LOGI("\t: supports_11b[%d]",
5582 WMI_SUPPORT_11B_GET(cap->supported_flags));
5583 WMA_LOGI("\t: supports_11g[%d]",
5584 WMI_SUPPORT_11G_GET(cap->supported_flags));
5585 WMA_LOGI("\t: supports_11a[%d]",
5586 WMI_SUPPORT_11A_GET(cap->supported_flags));
5587 WMA_LOGI("\t: supports_11n[%d]",
5588 WMI_SUPPORT_11N_GET(cap->supported_flags));
5589 WMA_LOGI("\t: supports_11ac[%d]",
5590 WMI_SUPPORT_11AC_GET(cap->supported_flags));
5591 WMA_LOGI("\t: supports_11ax[%d]",
5592 WMI_SUPPORT_11AX_GET(cap->supported_flags));
5593 WMA_LOGI("\t: supported_flags[%d]", cap->supported_flags);
5594 WMA_LOGI("\t: supported_bands[%d]", cap->supported_bands);
5595 WMA_LOGI("\t: ampdu_density[%d]", cap->ampdu_density);
5596 WMA_LOGI("\t: max_bw_supported_2G[%d]", cap->max_bw_supported_2G);
5597 WMA_LOGI("\t: ht_cap_info_2G[%d]", cap->ht_cap_info_2G);
5598 WMA_LOGI("\t: vht_cap_info_2G[%d]", cap->vht_cap_info_2G);
5599 WMA_LOGI("\t: vht_supp_mcs_2G[%d]", cap->vht_supp_mcs_2G);
5600 WMA_LOGI("\t: tx_chain_mask_2G[%d]", cap->tx_chain_mask_2G);
5601 WMA_LOGI("\t: rx_chain_mask_2G[%d]", cap->rx_chain_mask_2G);
5602 WMA_LOGI("\t: max_bw_supported_5G[%d]", cap->max_bw_supported_5G);
5603 WMA_LOGI("\t: ht_cap_info_5G[%d]", cap->ht_cap_info_5G);
5604 WMA_LOGI("\t: vht_cap_info_5G[%d]", cap->vht_cap_info_5G);
5605 WMA_LOGI("\t: vht_supp_mcs_5G[%d]", cap->vht_supp_mcs_5G);
5606 WMA_LOGI("\t: tx_chain_mask_5G[%d]", cap->tx_chain_mask_5G);
5607 WMA_LOGI("\t: rx_chain_mask_5G[%d]", cap->rx_chain_mask_5G);
5608 WMA_LOGI("\t: he_cap_info_2G[%08x]", cap->he_cap_info_2G);
5609 WMA_LOGI("\t: he_supp_mcs_2G[%08x]", cap->he_supp_mcs_2G);
5610 WMA_LOGI("\t: he_cap_info_5G[%08x]", cap->he_cap_info_5G);
5611 WMA_LOGI("\t: he_supp_mcs_5G[%08x]", cap->he_supp_mcs_5G);
5612 mac_2G = cap->he_cap_info_2G;
5613 mac_5G = cap->he_cap_info_5G;
5614 qdf_mem_copy(phy_2G, cap->he_cap_phy_info_2G,
5615 WMI_MAX_HECAP_PHY_SIZE * 4);
5616 qdf_mem_copy(phy_5G, cap->he_cap_phy_info_5G,
5617 WMI_MAX_HECAP_PHY_SIZE * 4);
5618 ppet_2G = cap->he_ppet2G;
5619 ppet_5G = cap->he_ppet5G;
5620
5621 wma_print_he_mac_cap(mac_2G);
5622 wma_print_he_phy_cap(phy_2G);
5623 wma_print_he_ppet(&ppet_2G);
5624 wma_print_he_mac_cap(mac_5G);
5625 wma_print_he_phy_cap(phy_5G);
5626 wma_print_he_ppet(&ppet_5G);
5627}
Krunal Soni0193b6f2016-08-15 15:53:43 -07005628
5629/**
Krunal Soni2e48d012016-05-02 16:55:26 -07005630 * wma_print_populate_soc_caps() - Prints all the caps populated per hw mode
5631 * @wma_handle: pointer to wma_handle
5632 *
5633 * This function prints all the caps populater per hw mode and per PHY
5634 *
5635 * Return: none
5636 */
5637static void wma_print_populate_soc_caps(t_wma_handle *wma_handle)
5638{
5639 int i, j = 0, max_mac;
5640 WMI_MAC_PHY_CAPABILITIES *tmp;
5641
5642 /* print number of hw modes */
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07005643 WMA_LOGD("%s: num of hw modes [%d]", __func__,
Krunal Soni2e48d012016-05-02 16:55:26 -07005644 wma_handle->phy_caps.num_hw_modes.num_hw_modes);
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07005645 WMA_LOGD("%s: <====== HW mode cap printing starts ======>", __func__);
Krunal Soni2e48d012016-05-02 16:55:26 -07005646 /* print cap of each hw mode */
5647 for (i = 0; i < wma_handle->phy_caps.num_hw_modes.num_hw_modes; i++) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07005648 WMA_LOGD("====>: hw mode id[%d], phy_id map[%d]",
Krunal Soni2e48d012016-05-02 16:55:26 -07005649 wma_handle->phy_caps.each_hw_mode_cap[i].hw_mode_id,
5650 wma_handle->phy_caps.each_hw_mode_cap[i].phy_id_map);
5651 if (wma_handle->phy_caps.each_hw_mode_cap[i].phy_id_map ==
5652 PHY1_PHY2)
5653 max_mac = j + 2;
5654 else
5655 max_mac = j + 1;
5656
5657 for ( ; j < max_mac; j++) {
5658 tmp = &wma_handle->phy_caps.each_phy_cap_per_hwmode[j];
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07005659 wma_print_mac_phy_capabilities(tmp, j);
Krunal Soni2e48d012016-05-02 16:55:26 -07005660 }
5661 }
5662 WMA_LOGI("%s: <====== HW mode cap printing ends ======>\n", __func__);
5663}
5664
5665/**
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305666 * wma_map_wmi_channel_width_to_hw_mode_bw() - returns bandwidth
5667 * in terms of hw_mode_bandwidth
5668 * @width: bandwidth in terms of wmi_channel_width
5669 *
5670 * This function returns the bandwidth in terms of hw_mode_bandwidth.
5671 *
5672 * Return: BW in terms of hw_mode_bandwidth.
5673 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07005674static enum hw_mode_bandwidth wma_map_wmi_channel_width_to_hw_mode_bw(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305675 wmi_channel_width width)
5676{
5677 switch (width) {
5678 case WMI_CHAN_WIDTH_20:
5679 return HW_MODE_20_MHZ;
5680 case WMI_CHAN_WIDTH_40:
5681 return HW_MODE_40_MHZ;
5682 case WMI_CHAN_WIDTH_80:
5683 return HW_MODE_80_MHZ;
5684 case WMI_CHAN_WIDTH_160:
5685 return HW_MODE_160_MHZ;
5686 case WMI_CHAN_WIDTH_80P80:
5687 return HW_MODE_80_PLUS_80_MHZ;
5688 case WMI_CHAN_WIDTH_5:
5689 return HW_MODE_5_MHZ;
5690 case WMI_CHAN_WIDTH_10:
5691 return HW_MODE_10_MHZ;
5692 default:
5693 return HW_MODE_BW_NONE;
5694 }
5695
5696 return HW_MODE_BW_NONE;
5697}
5698
5699/**
5700 * wma_get_hw_mode_params() - get TX-RX stream and bandwidth
5701 * supported from the capabilities.
5702 * @caps: PHY capability
5703 * @info: param to store TX-RX stream and BW information
5704 *
5705 * This function will calculate TX-RX stream and bandwidth supported
5706 * as per the PHY capability, and assign to mac_ss_bw_info.
5707 *
5708 * Return: none
5709 */
5710static void wma_get_hw_mode_params(WMI_MAC_PHY_CAPABILITIES *caps,
5711 struct mac_ss_bw_info *info)
5712{
5713 if (!caps) {
5714 WMA_LOGE("%s: Invalid capabilities", __func__);
5715 return;
5716 }
5717
5718 info->mac_tx_stream = wma_get_num_of_setbits_from_bitmask(
5719 QDF_MAX(caps->tx_chain_mask_2G,
5720 caps->tx_chain_mask_5G));
5721 info->mac_rx_stream = wma_get_num_of_setbits_from_bitmask(
5722 QDF_MAX(caps->rx_chain_mask_2G,
5723 caps->rx_chain_mask_5G));
5724 info->mac_bw = wma_map_wmi_channel_width_to_hw_mode_bw(
5725 QDF_MAX(caps->max_bw_supported_2G,
5726 caps->max_bw_supported_5G));
5727}
5728
5729/**
5730 * wma_set_hw_mode_params() - sets TX-RX stream, bandwidth and
5731 * DBS in hw_mode_list
5732 * @wma_handle: pointer to wma global structure
5733 * @mac0_ss_bw_info: TX-RX streams, BW for MAC0
5734 * @mac1_ss_bw_info: TX-RX streams, BW for MAC1
5735 * @pos: refers to hw_mode_index
5736 * @dbs_mode: dbs_mode for the dbs_hw_mode
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305737 * @sbs_mode: sbs_mode for the sbs_hw_mode
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305738 *
5739 * This function sets TX-RX stream, bandwidth and DBS mode in
5740 * hw_mode_list.
5741 *
5742 * Return: none
5743 */
5744static void wma_set_hw_mode_params(t_wma_handle *wma_handle,
5745 struct mac_ss_bw_info mac0_ss_bw_info,
5746 struct mac_ss_bw_info mac1_ss_bw_info,
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305747 uint32_t pos, uint32_t dbs_mode,
5748 uint32_t sbs_mode)
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305749{
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305750 WMA_HW_MODE_MAC0_TX_STREAMS_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305751 wma_handle->hw_mode.hw_mode_list[pos],
5752 mac0_ss_bw_info.mac_tx_stream);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305753 WMA_HW_MODE_MAC0_RX_STREAMS_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305754 wma_handle->hw_mode.hw_mode_list[pos],
5755 mac0_ss_bw_info.mac_rx_stream);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305756 WMA_HW_MODE_MAC0_BANDWIDTH_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305757 wma_handle->hw_mode.hw_mode_list[pos],
5758 mac0_ss_bw_info.mac_bw);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305759 WMA_HW_MODE_MAC1_TX_STREAMS_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305760 wma_handle->hw_mode.hw_mode_list[pos],
5761 mac1_ss_bw_info.mac_tx_stream);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305762 WMA_HW_MODE_MAC1_RX_STREAMS_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305763 wma_handle->hw_mode.hw_mode_list[pos],
5764 mac1_ss_bw_info.mac_rx_stream);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305765 WMA_HW_MODE_MAC1_BANDWIDTH_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305766 wma_handle->hw_mode.hw_mode_list[pos],
5767 mac1_ss_bw_info.mac_bw);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305768 WMA_HW_MODE_DBS_MODE_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305769 wma_handle->hw_mode.hw_mode_list[pos],
5770 dbs_mode);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305771 WMA_HW_MODE_AGILE_DFS_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305772 wma_handle->hw_mode.hw_mode_list[pos],
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305773 HW_MODE_AGILE_DFS_NONE);
5774 WMA_HW_MODE_SBS_MODE_SET(
5775 wma_handle->hw_mode.hw_mode_list[pos],
5776 sbs_mode);
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305777}
5778
5779/**
5780 * wma_update_hw_mode_list() - updates hw_mode_list
5781 * @wma_handle: pointer to wma global structure
5782 *
5783 * This function updates hw_mode_list with tx_streams, rx_streams,
5784 * bandwidth, dbs and agile dfs for each hw_mode.
5785 *
5786 * Returns: 0 for success else failure.
5787 */
5788static QDF_STATUS wma_update_hw_mode_list(t_wma_handle *wma_handle)
5789{
5790 struct extended_caps *phy_caps;
5791 WMI_MAC_PHY_CAPABILITIES *tmp;
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305792 uint32_t i, hw_config_type, j = 0;
5793 uint32_t dbs_mode, sbs_mode;
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305794 struct mac_ss_bw_info mac0_ss_bw_info = {0};
5795 struct mac_ss_bw_info mac1_ss_bw_info = {0};
Krunal Sonica50b452017-08-04 22:24:59 -07005796 WMI_PHY_CAPABILITY new_supported_band = 0;
5797 bool supported_band_update_failure = false;
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305798
5799 if (!wma_handle) {
5800 WMA_LOGE("%s: Invalid wma handle", __func__);
5801 return QDF_STATUS_E_FAILURE;
5802 }
5803
5804 phy_caps = &wma_handle->phy_caps;
5805 if (!phy_caps) {
5806 WMA_LOGE("%s: Invalid phy capabilities", __func__);
5807 return QDF_STATUS_SUCCESS;
5808 }
5809
5810 if (!phy_caps->num_hw_modes.num_hw_modes) {
5811 WMA_LOGE("%s: Number of HW modes: %d",
5812 __func__, phy_caps->num_hw_modes.num_hw_modes);
5813 return QDF_STATUS_SUCCESS;
5814 }
5815
5816 /*
5817 * This list was updated as part of service ready event. Re-populate
5818 * HW mode list from the device capabilities.
5819 */
5820 if (wma_handle->hw_mode.hw_mode_list) {
5821 qdf_mem_free(wma_handle->hw_mode.hw_mode_list);
5822 wma_handle->hw_mode.hw_mode_list = NULL;
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07005823 WMA_LOGD("%s: DBS list is freed", __func__);
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305824 }
5825
5826 wma_handle->num_dbs_hw_modes = phy_caps->num_hw_modes.num_hw_modes;
5827 wma_handle->hw_mode.hw_mode_list =
5828 qdf_mem_malloc(sizeof(*wma_handle->hw_mode.hw_mode_list) *
5829 wma_handle->num_dbs_hw_modes);
5830 if (!wma_handle->hw_mode.hw_mode_list) {
5831 WMA_LOGE("%s: Memory allocation failed for DBS", __func__);
5832 return QDF_STATUS_E_FAILURE;
5833 }
5834
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08005835 WMA_LOGD("%s: Updated HW mode list: Num modes:%d",
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305836 __func__, wma_handle->num_dbs_hw_modes);
5837
5838 for (i = 0; i < wma_handle->num_dbs_hw_modes; i++) {
5839 /* Update for MAC0 */
5840 tmp = &phy_caps->each_phy_cap_per_hwmode[j++];
5841 wma_get_hw_mode_params(tmp, &mac0_ss_bw_info);
5842 hw_config_type =
5843 phy_caps->each_hw_mode_cap[i].hw_mode_config_type;
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305844 dbs_mode = HW_MODE_DBS_NONE;
5845 sbs_mode = HW_MODE_SBS_NONE;
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305846 mac1_ss_bw_info.mac_tx_stream = 0;
5847 mac1_ss_bw_info.mac_rx_stream = 0;
5848 mac1_ss_bw_info.mac_bw = 0;
Krunal Sonica50b452017-08-04 22:24:59 -07005849 if (QDF_STATUS_SUCCESS != wma_update_supported_bands(wma_handle,
5850 tmp->supported_bands,
5851 &new_supported_band))
5852 supported_band_update_failure = true;
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305853
5854 /* SBS and DBS have dual MAC. Upto 2 MACs are considered. */
5855 if ((hw_config_type == WMI_HW_MODE_DBS) ||
5856 (hw_config_type == WMI_HW_MODE_SBS_PASSIVE) ||
5857 (hw_config_type == WMI_HW_MODE_SBS)) {
5858 /* Update for MAC1 */
5859 tmp = &phy_caps->each_phy_cap_per_hwmode[j++];
5860 wma_get_hw_mode_params(tmp, &mac1_ss_bw_info);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305861 if (hw_config_type == WMI_HW_MODE_DBS)
5862 dbs_mode = HW_MODE_DBS;
5863 if ((hw_config_type == WMI_HW_MODE_SBS_PASSIVE) ||
5864 (hw_config_type == WMI_HW_MODE_SBS))
5865 sbs_mode = HW_MODE_SBS;
Krunal Sonica50b452017-08-04 22:24:59 -07005866 if (QDF_STATUS_SUCCESS !=
5867 wma_update_supported_bands(wma_handle,
5868 tmp->supported_bands,
5869 &new_supported_band))
5870 supported_band_update_failure = true;
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305871 }
5872
5873 /* Updating HW mode list */
5874 wma_set_hw_mode_params(wma_handle, mac0_ss_bw_info,
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305875 mac1_ss_bw_info, i, dbs_mode,
5876 sbs_mode);
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305877 }
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07005878
Krunal Sonica50b452017-08-04 22:24:59 -07005879 /* overwrite phy_capability which we got from service ready event */
5880 if (!supported_band_update_failure) {
5881 WMA_LOGD("%s: updating supported band from old[%d] to new[%d]",
5882 __func__, wma_handle->phy_capability,
5883 new_supported_band);
5884 wma_handle->phy_capability = new_supported_band;
5885 }
5886
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07005887 if (QDF_STATUS_SUCCESS !=
Krunal Sonica50b452017-08-04 22:24:59 -07005888 policy_mgr_update_hw_mode_list(wma_handle->psoc,
5889 phy_caps))
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07005890 WMA_LOGE("%s: failed to update policy manager", __func__);
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305891 wma_dump_dbs_hw_mode(wma_handle);
5892 return QDF_STATUS_SUCCESS;
5893}
5894
Naveen Rawat4efe41b2017-04-29 16:23:14 -07005895static void wma_init_wifi_pos_dma_rings(t_wma_handle *wma_handle,
5896 uint8_t num_mac, void *buf)
5897{
5898 struct hif_softc *hif_ctx = cds_get_context(QDF_MODULE_ID_HIF);
5899 void *hal_soc = hif_get_hal_handle(hif_ctx);
5900
5901 wifi_pos_init_cir_cfr_rings(wma_handle->psoc, hal_soc, num_mac, buf);
5902}
5903
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305904/**
Krunal Soni2e48d012016-05-02 16:55:26 -07005905 * wma_populate_soc_caps() - populate entire SOC's capabilities
5906 * @wma_handle: pointer to wma global structure
5907 * @param_buf: pointer to param of service ready extension event from fw
5908 *
5909 * This API populates all capabilities of entire SOC. For example,
5910 * how many number of hw modes are supported by this SOC, what are the
5911 * capabilities of each phy per hw mode, what are HAL reg capabilities per
5912 * phy.
5913 *
5914 * Return: none
5915 */
5916static void wma_populate_soc_caps(t_wma_handle *wma_handle,
5917 WMI_SERVICE_READY_EXT_EVENTID_param_tlvs *param_buf)
5918{
5919 int i, num_of_mac_caps = 0, tmp = 0;
5920 struct extended_caps *phy_caps;
5921 struct hw_mode_idx_to_mac_cap_idx *map;
5922
5923 WMA_LOGD("%s: Enter", __func__);
5924
5925 if (!wma_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07005926 WMA_LOGE("%s: Invalid WMA handle", __func__);
Krunal Soni2e48d012016-05-02 16:55:26 -07005927 return;
5928 }
5929
5930 if (!param_buf) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07005931 WMA_LOGE("%s: Invalid event", __func__);
Krunal Soni2e48d012016-05-02 16:55:26 -07005932 return;
5933 }
5934 phy_caps = &wma_handle->phy_caps;
5935
5936 /*
5937 * first thing to do is to get how many number of hw modes are
5938 * supported and populate in wma_handle global structure
5939 */
Krunal Sonifd85ba62016-07-11 08:18:53 -07005940 if (NULL == param_buf->soc_hw_mode_caps) {
5941 WMA_LOGE("%s: Invalid number of hw modes", __func__);
5942 return;
5943 }
5944
Himanshu Agarwala1539d32017-10-11 18:08:56 +05305945 if (param_buf->soc_hw_mode_caps->num_hw_modes >
5946 MAX_NUM_HW_MODE) {
5947 WMA_LOGE("Invalid num_hw_modes %u received from firmware",
5948 param_buf->soc_hw_mode_caps->num_hw_modes);
5949 return;
5950 }
5951
Krunal Soni2e48d012016-05-02 16:55:26 -07005952 qdf_mem_copy(&phy_caps->num_hw_modes,
5953 param_buf->soc_hw_mode_caps,
5954 sizeof(WMI_SOC_MAC_PHY_HW_MODE_CAPS));
5955 if (0 == phy_caps->num_hw_modes.num_hw_modes) {
Krunal Sonifd85ba62016-07-11 08:18:53 -07005956 WMA_LOGE("%s: Number of hw modes is zero", __func__);
Krunal Soni2e48d012016-05-02 16:55:26 -07005957 return;
Krunal Soni2e48d012016-05-02 16:55:26 -07005958 }
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07005959 WMA_LOGD("%s: Given number of hw modes[%d]",
Krunal Sonifd85ba62016-07-11 08:18:53 -07005960 __func__, phy_caps->num_hw_modes.num_hw_modes);
Krunal Soni2e48d012016-05-02 16:55:26 -07005961
5962 /*
5963 * next thing is to allocate the memory to map hw mode to phy/mac caps
5964 */
5965 phy_caps->hw_mode_to_mac_cap_map =
5966 qdf_mem_malloc(phy_caps->num_hw_modes.num_hw_modes *
5967 sizeof(struct hw_mode_idx_to_mac_cap_idx));
5968 if (!phy_caps->hw_mode_to_mac_cap_map) {
5969 WMA_LOGE("%s: Memory allocation failed", __func__);
5970 return;
5971 }
5972
5973 /*
5974 * next thing is to allocate the memory for per hw caps
5975 */
5976 phy_caps->each_hw_mode_cap =
5977 qdf_mem_malloc(phy_caps->num_hw_modes.num_hw_modes *
5978 sizeof(WMI_HW_MODE_CAPABILITIES));
5979 if (!phy_caps->each_hw_mode_cap) {
5980 WMA_LOGE("%s: Memory allocation failed", __func__);
5981 wma_cleanup_dbs_phy_caps(wma_handle);
5982 return;
5983 }
5984 qdf_mem_copy(phy_caps->each_hw_mode_cap,
5985 param_buf->hw_mode_caps,
5986 phy_caps->num_hw_modes.num_hw_modes *
5987 sizeof(WMI_HW_MODE_CAPABILITIES));
5988 /*
5989 * next thing is to count the number of mac cap to populate per
5990 * hw mode and generate map, so that our search can be done
5991 * efficiently which is O(1)
5992 */
5993 for (i = 0; i < phy_caps->num_hw_modes.num_hw_modes; i++) {
5994 map = &phy_caps->hw_mode_to_mac_cap_map[i];
5995 if (phy_caps->each_hw_mode_cap[i].phy_id_map == PHY1_PHY2) {
5996 tmp = num_of_mac_caps;
5997 num_of_mac_caps = num_of_mac_caps + 2;
5998 map->num_of_macs = 2;
5999 } else {
6000 tmp = num_of_mac_caps;
6001 num_of_mac_caps = num_of_mac_caps + 1;
6002 map->num_of_macs = 1;
6003 }
6004 map->mac_cap_idx = tmp;
6005 map->hw_mode_id = phy_caps->each_hw_mode_cap[i].hw_mode_id;
6006 }
6007
6008 /*
6009 * next thing is to populate each phy caps per hw mode
6010 */
6011 phy_caps->each_phy_cap_per_hwmode =
6012 qdf_mem_malloc(num_of_mac_caps *
6013 sizeof(WMI_MAC_PHY_CAPABILITIES));
6014 if (!phy_caps->each_phy_cap_per_hwmode) {
6015 WMA_LOGE("%s: Memory allocation failed", __func__);
6016 wma_cleanup_dbs_phy_caps(wma_handle);
6017 return;
6018 }
6019 qdf_mem_copy(phy_caps->each_phy_cap_per_hwmode,
6020 param_buf->mac_phy_caps,
6021 num_of_mac_caps * sizeof(WMI_MAC_PHY_CAPABILITIES));
6022
6023 /*
6024 * next thing is to populate reg caps per phy
6025 */
Himanshu Agarwala1539d32017-10-11 18:08:56 +05306026
6027 if (param_buf->soc_hal_reg_caps->num_phy >
6028 MAX_NUM_PHY) {
6029 WMA_LOGE("Invalid num_phy %u received from firmware",
6030 param_buf->soc_hal_reg_caps->num_phy);
6031 return;
6032 }
6033
Krunal Soni2e48d012016-05-02 16:55:26 -07006034 qdf_mem_copy(&phy_caps->num_phy_for_hal_reg_cap,
6035 param_buf->soc_hal_reg_caps,
6036 sizeof(WMI_SOC_HAL_REG_CAPABILITIES));
6037 if (phy_caps->num_phy_for_hal_reg_cap.num_phy == 0) {
6038 WMA_LOGE("%s: incorrect number of phys", __func__);
6039 wma_cleanup_dbs_phy_caps(wma_handle);
6040 return;
6041 }
6042 phy_caps->each_phy_hal_reg_cap =
6043 qdf_mem_malloc(phy_caps->num_phy_for_hal_reg_cap.num_phy *
6044 sizeof(WMI_HAL_REG_CAPABILITIES_EXT));
6045 if (!phy_caps->each_phy_hal_reg_cap) {
6046 WMA_LOGE("%s: Memory allocation failed", __func__);
6047 wma_cleanup_dbs_phy_caps(wma_handle);
6048 return;
6049 }
6050 qdf_mem_copy(phy_caps->each_phy_hal_reg_cap,
6051 param_buf->hal_reg_caps,
6052 phy_caps->num_phy_for_hal_reg_cap.num_phy *
6053 sizeof(WMI_HAL_REG_CAPABILITIES_EXT));
Naveen Rawat4efe41b2017-04-29 16:23:14 -07006054
6055 wma_init_wifi_pos_dma_rings(wma_handle,
6056 param_buf->num_oem_dma_ring_caps,
6057 param_buf->oem_dma_ring_caps);
6058
Krunal Soni2e48d012016-05-02 16:55:26 -07006059 wma_print_populate_soc_caps(wma_handle);
Krunal Soni2e48d012016-05-02 16:55:26 -07006060}
6061
6062/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006063 * wma_rx_service_ready_ext_event() - evt handler for sevice ready ext event.
6064 * @handle: wma handle
6065 * @event: params of the service ready extended event
Govind Singhd76a5b02016-03-08 15:12:14 +05306066 * @length: param length
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006067 *
6068 * Return: none
6069 */
Govind Singhd76a5b02016-03-08 15:12:14 +05306070int wma_rx_service_ready_ext_event(void *handle, uint8_t *event,
6071 uint32_t length)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006072{
6073 tp_wma_handle wma_handle = (tp_wma_handle) handle;
6074 WMI_SERVICE_READY_EXT_EVENTID_param_tlvs *param_buf;
6075 wmi_service_ready_ext_event_fixed_param *ev;
6076 int status;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306077 QDF_STATUS ret;
Mukul Sharmab10c8c72017-11-02 17:25:59 +05306078 struct wmi_init_cmd_param init_param = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006079
6080 WMA_LOGD("%s: Enter", __func__);
6081
6082 if (!wma_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006083 WMA_LOGE("%s: Invalid WMA handle", __func__);
Govind Singhd76a5b02016-03-08 15:12:14 +05306084 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006085 }
6086
6087 param_buf = (WMI_SERVICE_READY_EXT_EVENTID_param_tlvs *) event;
6088 if (!param_buf) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006089 WMA_LOGE("%s: Invalid event", __func__);
Govind Singhd76a5b02016-03-08 15:12:14 +05306090 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006091 }
6092
6093 ev = param_buf->fixed_param;
6094 if (!ev) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006095 WMA_LOGE("%s: Invalid buffer", __func__);
Govind Singhd76a5b02016-03-08 15:12:14 +05306096 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006097 }
6098
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08006099 WMA_LOGD("WMA <-- WMI_SERVICE_READY_EXT_EVENTID");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006100
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08006101 WMA_LOGD("%s: Defaults: scan config:%x FW mode config:%x",
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05306102 __func__, ev->default_conc_scan_config_bits,
6103 ev->default_fw_config_bits);
6104
Anurag Chouhan210db072016-02-22 18:42:15 +05306105 ret = qdf_mc_timer_stop(&wma_handle->service_ready_ext_timer);
Anurag Chouhandf2b2682016-02-29 14:15:27 +05306106 if (!QDF_IS_STATUS_SUCCESS(ret)) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006107 WMA_LOGE("Failed to stop the service ready ext timer");
Govind Singhd76a5b02016-03-08 15:12:14 +05306108 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006109 }
Krunal Soni2e48d012016-05-02 16:55:26 -07006110 wma_populate_soc_caps(wma_handle, param_buf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006111
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306112 ret = wma_update_hw_mode_list(wma_handle);
6113 if (QDF_IS_STATUS_ERROR(ret)) {
6114 WMA_LOGE("Failed to update hw mode list");
6115 return -EINVAL;
6116 }
6117
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08006118 WMA_LOGD("WMA --> WMI_INIT_CMDID");
Mukul Sharmab10c8c72017-11-02 17:25:59 +05306119
6120 init_param.res_cfg = &wma_handle->wlan_resource_config;
6121 init_param.num_mem_chunks = wma_handle->num_mem_chunks;
6122 init_param.mem_chunks = wma_handle->mem_chunks;
6123 init_param.hw_mode_id = WMI_HOST_HW_MODE_MAX;
6124 status = wmi_unified_init_cmd_send(wma_handle->wmi_handle, &init_param);
Govind Singhf25a0f12016-03-08 16:09:48 +05306125 if (status != EOK)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006126 /* In success case, WMI layer will free after getting copy
6127 * engine TX complete interrupt
6128 */
6129 WMA_LOGE("Failed to send WMI_INIT_CMDID command");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006130
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05306131 wma_init_scan_fw_mode_config(wma_handle,
6132 ev->default_conc_scan_config_bits,
6133 ev->default_fw_config_bits);
Sandeep Puligilla3d6a8e22016-10-11 18:57:14 -07006134 wma_handle->target_fw_vers_ext = ev->fw_build_vers_ext;
Govind Singhd76a5b02016-03-08 15:12:14 +05306135 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006136}
6137
6138/**
6139 * wma_rx_ready_event() - event handler to process
6140 * wmi rx ready event.
6141 * @handle: wma handle
6142 * @cmd_param_info: command params info
Govind Singhd76a5b02016-03-08 15:12:14 +05306143 * @length: param length
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006144 *
6145 * Return: none
6146 */
Govind Singhd76a5b02016-03-08 15:12:14 +05306147int wma_rx_ready_event(void *handle, uint8_t *cmd_param_info,
6148 uint32_t length)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006149{
6150 tp_wma_handle wma_handle = (tp_wma_handle) handle;
6151 WMI_READY_EVENTID_param_tlvs *param_buf = NULL;
6152 wmi_ready_event_fixed_param *ev = NULL;
6153
6154 WMA_LOGD("%s: Enter", __func__);
6155
6156 param_buf = (WMI_READY_EVENTID_param_tlvs *) cmd_param_info;
6157 if (!(wma_handle && param_buf)) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006158 WMA_LOGE("%s: Invalid arguments", __func__);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306159 QDF_ASSERT(0);
Govind Singhd76a5b02016-03-08 15:12:14 +05306160 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006161 }
6162
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08006163 WMA_LOGD("WMA <-- WMI_READY_EVENTID");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006164
6165 ev = param_buf->fixed_param;
6166 /* Indicate to the waiting thread that the ready
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07006167 * event was received
6168 */
Naveen Rawat64e477e2016-05-20 10:34:56 -07006169 wma_handle->sub_20_support =
6170 WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
6171 WMI_SERVICE_HALF_RATE_QUARTER_RATE_SUPPORT);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006172 wma_handle->wmi_ready = true;
6173 wma_handle->wlan_init_status = ev->status;
6174
6175 /*
6176 * We need to check the WMI versions and make sure both
6177 * host and fw are compatible.
6178 */
6179 if (!wmi_versions_are_compatible(&wma_handle->final_abi_vers,
6180 &ev->fw_abi_vers)) {
6181 /*
6182 * Error: Our host version and the given firmware version
6183 * are incompatible.
6184 */
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07006185 WMA_LOGE("%s: Error: Incompatible WMI version.", __func__);
6186 WMA_LOGE("%s: Host: %d,%d,0x%x 0x%x 0x%x 0x%x, FW: %d,%d,0x%x 0x%x 0x%x 0x%x",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006187 __func__,
6188 WMI_VER_GET_MAJOR(wma_handle->final_abi_vers.
6189 abi_version_0),
6190 WMI_VER_GET_MINOR(wma_handle->final_abi_vers.
6191 abi_version_0),
6192 wma_handle->final_abi_vers.abi_version_ns_0,
6193 wma_handle->final_abi_vers.abi_version_ns_1,
6194 wma_handle->final_abi_vers.abi_version_ns_2,
6195 wma_handle->final_abi_vers.abi_version_ns_3,
6196 WMI_VER_GET_MAJOR(ev->fw_abi_vers.abi_version_0),
6197 WMI_VER_GET_MINOR(ev->fw_abi_vers.abi_version_0),
6198 ev->fw_abi_vers.abi_version_ns_0,
6199 ev->fw_abi_vers.abi_version_ns_1,
6200 ev->fw_abi_vers.abi_version_ns_2,
6201 ev->fw_abi_vers.abi_version_ns_3);
6202 if (wma_handle->wlan_init_status == WLAN_INIT_STATUS_SUCCESS) {
6203 /* Failed this connection to FW */
6204 wma_handle->wlan_init_status =
6205 WLAN_INIT_STATUS_GEN_FAILED;
6206 }
6207 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306208 qdf_mem_copy(&wma_handle->final_abi_vers, &ev->fw_abi_vers,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006209 sizeof(wmi_abi_version));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306210 qdf_mem_copy(&wma_handle->target_abi_vers, &ev->fw_abi_vers,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006211 sizeof(wmi_abi_version));
6212
6213 /* copy the mac addr */
6214 WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->mac_addr, wma_handle->myaddr);
6215 WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->mac_addr, wma_handle->hwaddr);
6216
6217 wma_update_hdd_cfg(wma_handle);
6218
Anurag Chouhandf2b2682016-02-29 14:15:27 +05306219 qdf_event_set(&wma_handle->wma_ready_event);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006220
6221 WMA_LOGD("Exit");
Govind Singhd76a5b02016-03-08 15:12:14 +05306222
6223 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006224}
6225
6226/**
6227 * wma_setneedshutdown() - setting wma needshutdown flag
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006228 *
6229 * Return: none
6230 */
Jeff Johnson1f8d0a02017-09-13 08:09:05 -07006231void wma_setneedshutdown(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006232{
6233 tp_wma_handle wma_handle;
6234
6235 WMA_LOGD("%s: Enter", __func__);
6236
Anurag Chouhan6d760662016-02-20 16:05:43 +05306237 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006238
6239 if (NULL == wma_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006240 WMA_LOGE("%s: Invalid arguments", __func__);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306241 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006242 return;
6243 }
6244
6245 wma_handle->needShutdown = true;
6246 WMA_LOGD("%s: Exit", __func__);
6247}
6248
6249/**
6250 * wma_needshutdown() - Is wma needs shutdown?
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006251 *
6252 * Return: returns true/false
6253 */
Jeff Johnson1b5404e2017-09-13 08:04:46 -07006254bool wma_needshutdown(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006255{
6256 tp_wma_handle wma_handle;
6257
6258 WMA_LOGD("%s: Enter", __func__);
6259
Anurag Chouhan6d760662016-02-20 16:05:43 +05306260 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006261
6262 if (NULL == wma_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006263 WMA_LOGE("%s: Invalid arguments", __func__);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306264 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006265 return false;
6266 }
6267
6268 WMA_LOGD("%s: Exit", __func__);
6269 return wma_handle->needShutdown;
6270}
6271
6272/**
6273 * wma_wait_for_ready_event() - wait for wma ready event
6274 * @handle: wma handle
6275 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05306276 * Return: 0 for success or QDF error
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006277 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306278QDF_STATUS wma_wait_for_ready_event(WMA_HANDLE handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006279{
6280 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306281 QDF_STATUS qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006282
6283 /* wait until WMI_READY_EVENTID received from FW */
Nachiket Kukade0396b732017-11-14 16:35:16 +05306284 qdf_status = qdf_wait_for_event_completion(
6285 &wma_handle->wma_ready_event,
6286 WMA_READY_EVENTID_TIMEOUT);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006287
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306288 if (QDF_STATUS_SUCCESS != qdf_status) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006289 WMA_LOGE("%s: Timeout waiting for ready event from FW",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006290 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306291 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006292 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306293 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006294}
6295
6296/**
6297 * wma_set_ppsconfig() - set pps config in fw
6298 * @vdev_id: vdev id
6299 * @pps_param: pps params
6300 * @val : param value
6301 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05306302 * Return: 0 for success or QDF error
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006303 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306304QDF_STATUS wma_set_ppsconfig(uint8_t vdev_id, uint16_t pps_param,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006305 int val)
6306{
Anurag Chouhan6d760662016-02-20 16:05:43 +05306307 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006308 int ret = -EIO;
6309 uint32_t pps_val;
6310
6311 if (NULL == wma) {
6312 WMA_LOGE("%s: Failed to get wma", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306313 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006314 }
6315
6316 switch (pps_param) {
6317 case WMA_VHT_PPS_PAID_MATCH:
6318 pps_val = ((val << 31) & 0xffff0000) |
6319 (PKT_PWR_SAVE_PAID_MATCH & 0xffff);
6320 goto pkt_pwr_save_config;
6321 case WMA_VHT_PPS_GID_MATCH:
6322 pps_val = ((val << 31) & 0xffff0000) |
6323 (PKT_PWR_SAVE_GID_MATCH & 0xffff);
6324 goto pkt_pwr_save_config;
6325 case WMA_VHT_PPS_DELIM_CRC_FAIL:
6326 pps_val = ((val << 31) & 0xffff0000) |
6327 (PKT_PWR_SAVE_DELIM_CRC_FAIL & 0xffff);
6328 goto pkt_pwr_save_config;
6329
6330 /* Enable the code below as and when the functionality
6331 * is supported/added in host.
6332 */
6333#ifdef NOT_YET
6334 case WMA_VHT_PPS_EARLY_TIM_CLEAR:
6335 pps_val = ((val << 31) & 0xffff0000) |
6336 (PKT_PWR_SAVE_EARLY_TIM_CLEAR & 0xffff);
6337 goto pkt_pwr_save_config;
6338 case WMA_VHT_PPS_EARLY_DTIM_CLEAR:
6339 pps_val = ((val << 31) & 0xffff0000) |
6340 (PKT_PWR_SAVE_EARLY_DTIM_CLEAR & 0xffff);
6341 goto pkt_pwr_save_config;
6342 case WMA_VHT_PPS_EOF_PAD_DELIM:
6343 pps_val = ((val << 31) & 0xffff0000) |
6344 (PKT_PWR_SAVE_EOF_PAD_DELIM & 0xffff);
6345 goto pkt_pwr_save_config;
6346 case WMA_VHT_PPS_MACADDR_MISMATCH:
6347 pps_val = ((val << 31) & 0xffff0000) |
6348 (PKT_PWR_SAVE_MACADDR_MISMATCH & 0xffff);
6349 goto pkt_pwr_save_config;
6350 case WMA_VHT_PPS_GID_NSTS_ZERO:
6351 pps_val = ((val << 31) & 0xffff0000) |
6352 (PKT_PWR_SAVE_GID_NSTS_ZERO & 0xffff);
6353 goto pkt_pwr_save_config;
6354 case WMA_VHT_PPS_RSSI_CHECK:
6355 pps_val = ((val << 31) & 0xffff0000) |
6356 (PKT_PWR_SAVE_RSSI_CHECK & 0xffff);
6357 goto pkt_pwr_save_config;
6358#endif /* NOT_YET */
6359pkt_pwr_save_config:
6360 WMA_LOGD("vdev_id:%d val:0x%x pps_val:0x%x", vdev_id,
6361 val, pps_val);
Govind Singhd76a5b02016-03-08 15:12:14 +05306362 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07006363 WMI_VDEV_PARAM_PACKET_POWERSAVE,
6364 pps_val);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006365 break;
6366 default:
6367 WMA_LOGE("%s:INVALID PPS CONFIG", __func__);
6368 }
6369
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306370 return (ret) ? QDF_STATUS_E_FAILURE : QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006371}
6372
6373/**
6374 * wma_process_set_mas() - Function to enable/disable MAS
6375 * @wma: Pointer to WMA handle
6376 * @mas_val: 1-Enable MAS, 0-Disable MAS
6377 *
6378 * This function enables/disables the MAS value
6379 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05306380 * Return: QDF_SUCCESS for success otherwise failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006381 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07006382static QDF_STATUS wma_process_set_mas(tp_wma_handle wma,
6383 uint32_t *mas_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006384{
6385 uint32_t val;
6386
6387 if (NULL == wma || NULL == mas_val) {
6388 WMA_LOGE("%s: Invalid input to enable/disable MAS", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306389 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006390 }
6391
6392 val = (*mas_val);
6393
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306394 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006395 wma_set_enable_disable_mcc_adaptive_scheduler(val)) {
6396 WMA_LOGE("%s: Unable to enable/disable MAS", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306397 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006398 }
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07006399 WMA_LOGE("%s: Value is %d", __func__, val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306400 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006401}
6402
6403/**
6404 * wma_process_set_miracast() - Function to set miracast value in WMA
6405 * @wma: Pointer to WMA handle
6406 * @miracast_val: 0-Disabled,1-Source,2-Sink
6407 *
6408 * This function stores the miracast value in WMA
6409 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05306410 * Return: QDF_SUCCESS for success otherwise failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006411 *
6412 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07006413static QDF_STATUS wma_process_set_miracast(tp_wma_handle wma,
6414 uint32_t *miracast_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006415{
6416 if (NULL == wma || NULL == miracast_val) {
6417 WMA_LOGE("%s: Invalid input to store miracast value", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306418 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006419 }
6420
6421 wma->miracast_value = *miracast_val;
6422 WMA_LOGE("%s: Miracast value is %d", __func__, wma->miracast_value);
6423
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306424 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006425}
6426
6427/**
6428 * wma_config_stats_factor() - Function to configure stats avg. factor
6429 * @wma: pointer to WMA handle
6430 * @avg_factor: stats. avg. factor passed down by userspace
6431 *
6432 * This function configures the avg. stats value in firmware
6433 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306434 * Return: QDF_STATUS_SUCCESS for success otherwise failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006435 *
6436 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306437static QDF_STATUS wma_config_stats_factor(tp_wma_handle wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006438 struct sir_stats_avg_factor *avg_factor)
6439{
Govind Singhd76a5b02016-03-08 15:12:14 +05306440 QDF_STATUS ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006441
6442 if (NULL == wma || NULL == avg_factor) {
6443 WMA_LOGE("%s: Invalid input of stats avg factor", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306444 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006445 }
6446
Govind Singhd76a5b02016-03-08 15:12:14 +05306447 ret = wma_vdev_set_param(wma->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006448 avg_factor->vdev_id,
6449 WMI_VDEV_PARAM_STATS_AVG_FACTOR,
6450 avg_factor->stats_avg_factor);
Govind Singhd76a5b02016-03-08 15:12:14 +05306451 if (QDF_IS_STATUS_ERROR(ret)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006452 WMA_LOGE(" failed to set avg_factor for vdev_id %d",
6453 avg_factor->vdev_id);
6454 }
6455
6456 WMA_LOGD("%s: Set stats_avg_factor %d for vdev_id %d", __func__,
6457 avg_factor->stats_avg_factor, avg_factor->vdev_id);
6458
6459 return ret;
6460}
6461
6462/**
6463 * wma_config_guard_time() - Function to set guard time in firmware
6464 * @wma: pointer to WMA handle
6465 * @guard_time: guard time passed down by userspace
6466 *
6467 * This function configures the guard time in firmware
6468 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306469 * Return: QDF_STATUS_SUCCESS for success otherwise failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006470 *
6471 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306472static QDF_STATUS wma_config_guard_time(tp_wma_handle wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006473 struct sir_guard_time_request *guard_time)
6474{
Govind Singhd76a5b02016-03-08 15:12:14 +05306475 QDF_STATUS ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006476
6477 if (NULL == wma || NULL == guard_time) {
6478 WMA_LOGE("%s: Invalid input of guard time", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306479 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006480 }
6481
Govind Singhd76a5b02016-03-08 15:12:14 +05306482 ret = wma_vdev_set_param(wma->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006483 guard_time->vdev_id,
6484 WMI_VDEV_PARAM_RX_LEAK_WINDOW,
6485 guard_time->guard_time);
Govind Singhd76a5b02016-03-08 15:12:14 +05306486 if (QDF_IS_STATUS_ERROR(ret)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006487 WMA_LOGE(" failed to set guard time for vdev_id %d",
6488 guard_time->vdev_id);
6489 }
6490
6491 WMA_LOGD("Set guard time %d for vdev_id %d",
6492 guard_time->guard_time, guard_time->vdev_id);
6493
6494 return ret;
6495}
6496
6497/**
6498 * wma_enable_specific_fw_logs() - Start/Stop logging of diag event/log id
6499 * @wma_handle: WMA handle
6500 * @start_log: Start logging related parameters
6501 *
6502 * Send the command to the FW based on which specific logging of diag
6503 * event/log id can be started/stopped
6504 *
6505 * Return: None
6506 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07006507static void wma_enable_specific_fw_logs(tp_wma_handle wma_handle,
6508 struct sir_wifi_start_log *start_log)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006509{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006510
6511 if (!start_log) {
6512 WMA_LOGE("%s: start_log pointer is NULL", __func__);
6513 return;
6514 }
6515 if (!wma_handle) {
6516 WMA_LOGE("%s: Invalid wma handle", __func__);
6517 return;
6518 }
6519
6520 if (!((start_log->ring_id == RING_ID_CONNECTIVITY) ||
6521 (start_log->ring_id == RING_ID_FIRMWARE_DEBUG))) {
6522 WMA_LOGD("%s: Not connectivity or fw debug ring: %d",
6523 __func__, start_log->ring_id);
6524 return;
6525 }
6526
Govind Singhf25a0f12016-03-08 16:09:48 +05306527 wmi_unified_enable_specific_fw_logs_cmd(wma_handle->wmi_handle,
6528 (struct wmi_wifi_start_log *)start_log);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006529}
6530
Poddar, Siddarth176c4362016-10-03 12:25:00 +05306531#define MEGABYTE (1024 * 1024)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006532/**
6533 * wma_set_wifi_start_packet_stats() - Start/stop packet stats
6534 * @wma_handle: WMA handle
6535 * @start_log: Struture containing the start wifi logger params
6536 *
6537 * This function is used to send the WMA commands to start/stop logging
6538 * of per packet statistics
6539 *
6540 * Return: None
6541 *
6542 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07006543#ifdef REMOVE_PKT_LOG
6544static void wma_set_wifi_start_packet_stats(void *wma_handle,
6545 struct sir_wifi_start_log *start_log)
6546{
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07006547}
6548#else
6549static void wma_set_wifi_start_packet_stats(void *wma_handle,
6550 struct sir_wifi_start_log *start_log)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006551{
Komal Seelam3d202862016-02-24 18:43:24 +05306552 struct hif_opaque_softc *scn;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006553 uint32_t log_state;
6554
6555 if (!start_log) {
6556 WMA_LOGE("%s: start_log pointer is NULL", __func__);
6557 return;
6558 }
6559 if (!wma_handle) {
6560 WMA_LOGE("%s: Invalid wma handle", __func__);
6561 return;
6562 }
6563
6564 /* No need to register for ring IDs other than packet stats */
6565 if (start_log->ring_id != RING_ID_PER_PACKET_STATS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006566 WMA_LOGD("%s: Ring id is not for per packet stats: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006567 __func__, start_log->ring_id);
6568 return;
6569 }
6570
Anurag Chouhan6d760662016-02-20 16:05:43 +05306571 scn = cds_get_context(QDF_MODULE_ID_HIF);
Naveen Rawatb2109f62016-07-21 14:18:15 -07006572 if (scn == NULL) {
6573 WMA_LOGE("%s: Invalid HIF handle", __func__);
6574 return;
6575 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006576
6577 log_state = ATH_PKTLOG_ANI | ATH_PKTLOG_RCUPDATE | ATH_PKTLOG_RCFIND |
Nirav Shahdcc4c872016-07-28 11:35:26 +05306578 ATH_PKTLOG_RX | ATH_PKTLOG_TX |
6579 ATH_PKTLOG_TEXT | ATH_PKTLOG_SW_EVENT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006580
Poddar, Siddarth176c4362016-10-03 12:25:00 +05306581 if (start_log->size != 0) {
6582 pktlog_setsize(scn, start_log->size * MEGABYTE);
6583 return;
Poddar, Siddarthab99a272017-04-10 12:53:26 +05306584 } else if (start_log->is_pktlog_buff_clear == true) {
6585 pktlog_clearbuff(scn, start_log->is_pktlog_buff_clear);
6586 return;
Poddar, Siddarth176c4362016-10-03 12:25:00 +05306587 }
6588
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006589 if (start_log->verbose_level == WLAN_LOG_LEVEL_ACTIVE) {
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -08006590 pktlog_enable(scn, log_state, start_log->ini_triggered,
Poddar, Siddartheefe3482016-09-21 18:12:59 +05306591 start_log->user_triggered,
6592 start_log->is_iwpriv_command);
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08006593 WMA_LOGD("%s: Enabling per packet stats", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006594 } else {
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -08006595 pktlog_enable(scn, 0, start_log->ini_triggered,
Poddar, Siddartheefe3482016-09-21 18:12:59 +05306596 start_log->user_triggered,
6597 start_log->is_iwpriv_command);
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08006598 WMA_LOGD("%s: Disabling per packet stats", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006599 }
6600}
6601#endif
6602
6603/**
6604 * wma_send_flush_logs_to_fw() - Send log flush command to FW
6605 * @wma_handle: WMI handle
6606 *
6607 * This function is used to send the flush command to the FW,
6608 * that will flush the fw logs that are residue in the FW
6609 *
6610 * Return: None
6611 */
6612void wma_send_flush_logs_to_fw(tp_wma_handle wma_handle)
6613{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306614 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006615 int ret;
6616
Govind Singhf25a0f12016-03-08 16:09:48 +05306617 ret = wmi_unified_flush_logs_to_fw_cmd(wma_handle->wmi_handle);
6618 if (ret != EOK)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006619 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006620
Anurag Chouhan210db072016-02-22 18:42:15 +05306621 status = qdf_mc_timer_start(&wma_handle->log_completion_timer,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006622 WMA_LOG_COMPLETION_TIMER);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306623 if (status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006624 WMA_LOGE("Failed to start the log completion timer");
6625}
6626
6627/**
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05306628 * wma_update_wep_default_key - To update default key id
6629 * @wma: pointer to wma handler
6630 * @update_def_key: pointer to wep_update_default_key_idx
6631 *
6632 * This function makes a copy of default key index to txrx node
6633 *
6634 * Return: Success
6635 */
6636static QDF_STATUS wma_update_wep_default_key(tp_wma_handle wma,
6637 struct wep_update_default_key_idx *update_def_key)
6638{
6639 struct wma_txrx_node *iface =
6640 &wma->interfaces[update_def_key->session_id];
6641 iface->wep_default_key_idx = update_def_key->default_idx;
6642
6643 return QDF_STATUS_SUCCESS;
6644}
6645
Agrawal, Ashish35b251d2016-09-08 19:21:03 +05306646/**
6647 * wma_update_tx_fail_cnt_th() - Set threshold for TX pkt fail
6648 * @wma_handle: WMA handle
6649 * @tx_fail_cnt_th: sme_tx_fail_cnt_threshold parameter
6650 *
6651 * This function is used to set Tx pkt fail count threshold,
6652 * FW will do disconnect with station once this threshold is reached.
6653 *
6654 * Return: VOS_STATUS_SUCCESS on success, error number otherwise
6655 */
6656static QDF_STATUS wma_update_tx_fail_cnt_th(tp_wma_handle wma,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07006657 struct sme_tx_fail_cnt_threshold *tx_fail_cnt_th)
Agrawal, Ashish35b251d2016-09-08 19:21:03 +05306658{
6659 u_int8_t vdev_id;
6660 u_int32_t tx_fail_disconn_th;
6661 int ret = -EIO;
6662
6663 if (!wma || !wma->wmi_handle) {
6664 WMA_LOGE(FL("WMA is closed, can not issue Tx pkt fail count threshold"));
6665 return QDF_STATUS_E_INVAL;
6666 }
6667 vdev_id = tx_fail_cnt_th->session_id;
6668 tx_fail_disconn_th = tx_fail_cnt_th->tx_fail_cnt_threshold;
6669 WMA_LOGD("Set TX pkt fail count threshold vdevId %d count %d",
6670 vdev_id, tx_fail_disconn_th);
6671
6672
6673 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
6674 WMI_VDEV_PARAM_DISCONNECT_TH,
6675 tx_fail_disconn_th);
6676
6677 if (ret) {
6678 WMA_LOGE(FL("Failed to send TX pkt fail count threshold command"));
6679 return QDF_STATUS_E_FAILURE;
6680 }
6681
6682 return QDF_STATUS_SUCCESS;
6683}
6684
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05306685/**
Agrawal Ashishda3e9502016-09-21 17:43:51 +05306686 * wma_update_short_retry_limit() - Set retry limit for short frames
6687 * @wma_handle: WMA handle
6688 * @short_retry_limit_th: retry limir count for Short frames.
6689 *
6690 * This function is used to configure the transmission retry limit at which
6691 * short frames needs to be retry.
6692 *
6693 * Return: VOS_STATUS_SUCCESS on success, error number otherwise
6694 */
6695static QDF_STATUS wma_update_short_retry_limit(tp_wma_handle wma,
6696 struct sme_short_retry_limit *short_retry_limit_th)
6697{
6698 uint8_t vdev_id;
6699 uint32_t short_retry_limit;
6700 int ret;
6701
6702 if (!wma || !wma->wmi_handle) {
6703 WMA_LOGE("WMA is closed, can not issue short retry limit threshold");
6704 return QDF_STATUS_E_INVAL;
6705 }
6706 vdev_id = short_retry_limit_th->session_id;
6707 short_retry_limit = short_retry_limit_th->short_retry_limit;
6708 WMA_LOGD("Set short retry limit threshold vdevId %d count %d",
6709 vdev_id, short_retry_limit);
6710
6711 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
6712 WMI_VDEV_PARAM_NON_AGG_SW_RETRY_TH,
6713 short_retry_limit);
6714
6715 if (ret) {
6716 WMA_LOGE("Failed to send short limit threshold command");
6717 return QDF_STATUS_E_FAILURE;
6718 }
6719 return QDF_STATUS_SUCCESS;
6720}
6721
6722/**
6723 * wma_update_long_retry_limit() - Set retry limit for long frames
6724 * @wma_handle: WMA handle
6725 * @long_retry_limit_th: retry limir count for long frames
6726 *
6727 * This function is used to configure the transmission retry limit at which
6728 * long frames needs to be retry
6729 *
6730 * Return: VOS_STATUS_SUCCESS on success, error number otherwise
6731 */
6732static QDF_STATUS wma_update_long_retry_limit(tp_wma_handle wma,
6733 struct sme_long_retry_limit *long_retry_limit_th)
6734{
6735 uint8_t vdev_id;
6736 uint32_t long_retry_limit;
6737 int ret;
6738
6739 if (!wma || !wma->wmi_handle) {
6740 WMA_LOGE("WMA is closed, can not issue long retry limit threshold");
6741 return QDF_STATUS_E_INVAL;
6742 }
6743 vdev_id = long_retry_limit_th->session_id;
6744 long_retry_limit = long_retry_limit_th->long_retry_limit;
6745 WMA_LOGD("Set TX pkt fail count threshold vdevId %d count %d",
6746 vdev_id, long_retry_limit);
6747
6748 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
6749 WMI_VDEV_PARAM_AGG_SW_RETRY_TH,
6750 long_retry_limit);
6751
6752 if (ret) {
6753 WMA_LOGE("Failed to send long limit threshold command");
6754 return QDF_STATUS_E_FAILURE;
6755 }
6756
6757 return QDF_STATUS_SUCCESS;
6758}
6759
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05306760/*
6761 * wma_update_sta_inactivity_timeout() - Set sta_inactivity_timeout to fw
6762 * @wma_handle: WMA handle
6763 * @sta_inactivity_timer: sme_sta_inactivity_timeout
6764 *
6765 * This function is used to set sta_inactivity_timeout.
6766 * If a station does not send anything in sta_inactivity_timeout seconds, an
6767 * empty data frame is sent to it in order to verify whether it is
6768 * still in range. If this frame is not ACKed, the station will be
6769 * disassociated and then deauthenticated.
6770 *
6771 * Return: None
6772 */
6773void wma_update_sta_inactivity_timeout(tp_wma_handle wma,
6774 struct sme_sta_inactivity_timeout *sta_inactivity_timer)
6775{
6776 uint8_t vdev_id;
6777 uint32_t max_unresponsive_time;
6778 uint32_t min_inactive_time, max_inactive_time;
6779
6780 if (!wma || !wma->wmi_handle) {
6781 WMA_LOGE("WMA is closed, can not issue sta_inactivity_timeout");
6782 return;
6783 }
6784 vdev_id = sta_inactivity_timer->session_id;
6785 max_unresponsive_time = sta_inactivity_timer->sta_inactivity_timeout;
6786 max_inactive_time = max_unresponsive_time * TWO_THIRD;
6787 min_inactive_time = max_unresponsive_time - max_inactive_time;
6788
6789 if (wma_vdev_set_param(wma->wmi_handle, vdev_id,
6790 WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS,
6791 min_inactive_time))
6792 WMA_LOGE("Failed to Set AP MIN IDLE INACTIVE TIME");
6793
6794 if (wma_vdev_set_param(wma->wmi_handle, vdev_id,
6795 WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS,
6796 max_inactive_time))
6797 WMA_LOGE("Failed to Set AP MAX IDLE INACTIVE TIME");
6798
6799 if (wma_vdev_set_param(wma->wmi_handle, vdev_id,
6800 WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS,
6801 max_unresponsive_time))
6802 WMA_LOGE("Failed to Set MAX UNRESPONSIVE TIME");
6803
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006804 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 +05306805 __func__, vdev_id,
6806 min_inactive_time, max_inactive_time,
6807 max_unresponsive_time);
6808}
6809
Yingying Tang95409972016-10-20 15:16:15 +08006810#ifdef WLAN_FEATURE_WOW_PULSE
6811
6812
6813#define WMI_WOW_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM \
6814WMI_WOW_HOSTWAKEUP_GPIO_PIN_PATTERN_CONFIG_CMD_fixed_param
6815
6816
6817#define WMITLV_TAG_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM \
6818WMITLV_TAG_STRUC_wmi_wow_hostwakeup_gpio_pin_pattern_config_cmd_fixed_param
6819
6820/**
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07006821 * wma_send_wow_pulse_cmd() - send wmi cmd of wow pulse cmd
6822 * information to fw.
6823 * @wma_handle: wma handler
6824 * @udp_response: wow_pulse_mode pointer
6825 *
6826 * Return: Return QDF_STATUS
6827 */
Yingying Tang95409972016-10-20 15:16:15 +08006828static QDF_STATUS wma_send_wow_pulse_cmd(tp_wma_handle wma_handle,
6829 struct wow_pulse_mode *wow_pulse_cmd)
6830{
6831 QDF_STATUS status = QDF_STATUS_SUCCESS;
6832 wmi_buf_t buf;
6833 WMI_WOW_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM *cmd;
6834 u_int16_t len;
6835
6836 len = sizeof(*cmd);
6837 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
6838 if (!buf) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07006839 WMA_LOGE("wmi_buf_alloc failed");
6840 return QDF_STATUS_E_NOMEM;
Yingying Tang95409972016-10-20 15:16:15 +08006841 }
6842
6843 cmd = (WMI_WOW_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM *)wmi_buf_data(buf);
6844 qdf_mem_zero(cmd, len);
6845
6846 WMITLV_SET_HDR(&cmd->tlv_header,
6847 WMITLV_TAG_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM,
6848 WMITLV_GET_STRUCT_TLVLEN(
6849 WMI_WOW_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM));
6850
6851 cmd->enable = wow_pulse_cmd->wow_pulse_enable;
6852 cmd->pin = wow_pulse_cmd->wow_pulse_pin;
6853 cmd->interval_low = wow_pulse_cmd->wow_pulse_interval_low;
6854 cmd->interval_high = wow_pulse_cmd->wow_pulse_interval_high;
6855 cmd->repeat_cnt = WMI_WOW_PULSE_REPEAT_CNT;
6856
6857 if (wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
6858 WMI_WOW_HOSTWAKEUP_GPIO_PIN_PATTERN_CONFIG_CMDID)) {
6859 WMA_LOGE("Failed to send send wow pulse");
6860 wmi_buf_free(buf);
6861 status = QDF_STATUS_E_FAILURE;
6862 }
6863
6864 WMA_LOGD("%s: Exit", __func__);
6865 return status;
6866}
6867
6868#undef WMI_WOW_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM
6869#undef WMITLV_TAG_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM
6870#undef WMI_WOW_PULSE_REPEAT_CNT
6871
6872#else
6873static inline QDF_STATUS wma_send_wow_pulse_cmd(tp_wma_handle wma_handle,
6874 struct wow_pulse_mode *wow_pulse_cmd)
6875{
6876 return QDF_STATUS_E_FAILURE;
6877}
6878#endif
6879
6880
Agrawal Ashishda3e9502016-09-21 17:43:51 +05306881/**
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05306882 * wma_process_power_debug_stats_req() - Process the Chip Power stats collect
6883 * request and pass the Power stats request to Fw
6884 * @wma_handle: WMA handle
6885 *
6886 * Return: QDF_STATUS
6887 */
6888#ifdef WLAN_POWER_DEBUGFS
6889static QDF_STATUS wma_process_power_debug_stats_req(tp_wma_handle wma_handle)
6890{
6891 wmi_pdev_get_chip_power_stats_cmd_fixed_param *cmd;
6892 int32_t len;
6893 wmi_buf_t buf;
6894 uint8_t *buf_ptr;
6895 int ret;
6896
6897 if (!wma_handle) {
6898 WMA_LOGE("%s: input pointer is NULL", __func__);
6899 return QDF_STATUS_E_FAILURE;
6900 }
6901
6902 len = sizeof(*cmd);
6903 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
6904 if (!buf) {
6905 WMA_LOGE("%s: Failed allocate wmi buffer", __func__);
6906 return QDF_STATUS_E_NOMEM;
6907 }
6908
6909 buf_ptr = (u_int8_t *) wmi_buf_data(buf);
6910 cmd = (wmi_pdev_get_chip_power_stats_cmd_fixed_param *) buf_ptr;
6911
6912 WMITLV_SET_HDR(&cmd->tlv_header,
6913 WMITLV_TAG_STRUC_wmi_get_chip_power_stats_cmd_fixed_param,
6914 WMITLV_GET_STRUCT_TLVLEN(
6915 wmi_pdev_get_chip_power_stats_cmd_fixed_param));
6916 cmd->pdev_id = 0;
6917
6918 WMA_LOGD("POWER_DEBUG_STATS - Get Request Params; Pdev id - %d",
6919 cmd->pdev_id);
6920 ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
6921 WMI_PDEV_GET_CHIP_POWER_STATS_CMDID);
6922 if (ret) {
6923 WMA_LOGE("%s: Failed to send power debug stats request",
6924 __func__);
6925 wmi_buf_free(buf);
6926 return QDF_STATUS_E_FAILURE;
6927 }
6928 return QDF_STATUS_SUCCESS;
6929}
6930#else
6931static QDF_STATUS wma_process_power_debug_stats_req(tp_wma_handle wma_handle)
6932{
6933 return QDF_STATUS_SUCCESS;
6934}
6935#endif
6936
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05306937/**
6938 * wma_set_arp_req_stats() - process set arp stats request command to fw
6939 * @wma_handle: WMA handle
6940 * @req_buf: set srp stats request buffer
6941 *
6942 * Return: None
6943 */
6944static void wma_set_arp_req_stats(WMA_HANDLE handle,
6945 struct set_arp_stats_params *req_buf)
6946{
6947 int status;
6948 struct set_arp_stats *arp_stats;
6949 tp_wma_handle wma_handle = (tp_wma_handle) handle;
6950
6951 if (!wma_handle || !wma_handle->wmi_handle) {
6952 WMA_LOGE("%s: WMA is closed, cannot send per roam config",
6953 __func__);
6954 return;
6955 }
6956
6957 arp_stats = (struct set_arp_stats *)req_buf;
6958 status = wmi_unified_set_arp_stats_req(wma_handle->wmi_handle,
6959 arp_stats);
6960 if (status != EOK)
6961 WMA_LOGE("%s: failed to set arp stats to FW",
6962 __func__);
6963}
6964
6965/**
6966 * wma_get_arp_req_stats() - process get arp stats request command to fw
6967 * @wma_handle: WMA handle
6968 * @req_buf: get srp stats request buffer
6969 *
6970 * Return: None
6971 */
6972static void wma_get_arp_req_stats(WMA_HANDLE handle,
6973 struct get_arp_stats_params *req_buf)
6974{
6975 int status;
6976 struct get_arp_stats *arp_stats;
6977 tp_wma_handle wma_handle = (tp_wma_handle) handle;
6978
6979 if (!wma_handle || !wma_handle->wmi_handle) {
6980 WMA_LOGE("%s: WMA is closed, cannot send per roam config",
6981 __func__);
6982 return;
6983 }
6984
6985 arp_stats = (struct get_arp_stats *)req_buf;
6986 status = wmi_unified_get_arp_stats_req(wma_handle->wmi_handle,
6987 arp_stats);
6988 if (status != EOK)
6989 WMA_LOGE("%s: failed to send get arp stats to FW",
6990 __func__);
6991}
6992
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306993/**
6994 * wma_set_del_pmkid_cache() - API to set/delete PMKID cache entry in fw
6995 * @handle: WMA handle
6996 * @pmk_cache: PMK cache entry
6997 *
6998 * Return: None
6999 */
7000static void wma_set_del_pmkid_cache(WMA_HANDLE handle,
7001 struct wmi_unified_pmk_cache *pmk_cache)
7002{
7003 int status;
7004 tp_wma_handle wma_handle = (tp_wma_handle) handle;
7005
7006 if (!wma_handle || !wma_handle->wmi_handle) {
7007 WMA_LOGE("WMA is closed, cannot send set del pmkid");
7008 return;
7009 }
7010
7011 status = wmi_unified_set_del_pmkid_cache(wma_handle->wmi_handle,
7012 pmk_cache);
7013 if (status != EOK)
7014 WMA_LOGE("failed to send set/del pmkid cmd to fw");
7015}
7016
lifeng66831662017-05-19 16:01:35 +08007017QDF_STATUS wma_set_rx_reorder_timeout_val(tp_wma_handle wma_handle,
7018 struct sir_set_rx_reorder_timeout_val *reorder_timeout)
7019{
7020 wmi_pdev_set_reorder_timeout_val_cmd_fixed_param *cmd;
7021 uint32_t len;
7022 wmi_buf_t buf;
7023 int ret;
7024
7025 if (!reorder_timeout) {
7026 WMA_LOGE(FL("invalid pointer"));
7027 return QDF_STATUS_E_INVAL;
7028 }
7029
7030 if (!wma_handle) {
7031 WMA_LOGE(FL("WMA context is invald!"));
7032 return QDF_STATUS_E_INVAL;
7033 }
7034 len = sizeof(*cmd);
7035 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
7036
7037 if (!buf) {
7038 WMA_LOGE(FL("Failed allocate wmi buffer"));
7039 return QDF_STATUS_E_NOMEM;
7040 }
7041 cmd = (wmi_pdev_set_reorder_timeout_val_cmd_fixed_param *)
7042 wmi_buf_data(buf);
7043
7044 WMITLV_SET_HDR(&cmd->tlv_header,
7045 WMITLV_TAG_STRUC_wmi_pdev_set_reorder_timeout_val_cmd_fixed_param,
7046 WMITLV_GET_STRUCT_TLVLEN(wmi_pdev_set_reorder_timeout_val_cmd_fixed_param));
7047
7048 memcpy(cmd->rx_timeout_pri, reorder_timeout->rx_timeout_pri,
7049 sizeof(reorder_timeout->rx_timeout_pri));
7050
7051 WMA_LOGD("rx aggr record timeout: VO: %d, VI: %d, BE: %d, BK: %d",
7052 cmd->rx_timeout_pri[0], cmd->rx_timeout_pri[1],
7053 cmd->rx_timeout_pri[2], cmd->rx_timeout_pri[3]);
7054
7055 ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
7056 WMI_PDEV_SET_REORDER_TIMEOUT_VAL_CMDID);
7057 if (ret) {
7058 WMA_LOGE(FL("Failed to send aggregation timeout"));
7059 wmi_buf_free(buf);
7060 return QDF_STATUS_E_FAILURE;
7061 }
7062
7063 return QDF_STATUS_SUCCESS;
7064}
7065
7066QDF_STATUS wma_set_rx_blocksize(tp_wma_handle wma_handle,
7067 struct sir_peer_set_rx_blocksize *peer_rx_blocksize)
7068{
7069 wmi_peer_set_rx_blocksize_cmd_fixed_param *cmd;
7070 int32_t len;
7071 wmi_buf_t buf;
7072 u_int8_t *buf_ptr;
7073 int ret;
7074
7075 if (!peer_rx_blocksize) {
7076 WMA_LOGE(FL("invalid pointer"));
7077 return QDF_STATUS_E_INVAL;
7078 }
7079
7080 if (!wma_handle) {
7081 WMA_LOGE(FL(" WMA context is invald!"));
7082 return QDF_STATUS_E_INVAL;
7083 }
7084
7085 len = sizeof(*cmd);
7086 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
7087
7088 if (!buf) {
7089 WMA_LOGE(FL("Failed allocate wmi buffer"));
7090 return QDF_STATUS_E_NOMEM;
7091 }
7092
7093 buf_ptr = (u_int8_t *) wmi_buf_data(buf);
7094 cmd = (wmi_peer_set_rx_blocksize_cmd_fixed_param *) buf_ptr;
7095
7096 WMITLV_SET_HDR(&cmd->tlv_header,
7097 WMITLV_TAG_STRUC_wmi_peer_set_rx_blocksize_cmd_fixed_param,
7098 WMITLV_GET_STRUCT_TLVLEN(wmi_peer_set_rx_blocksize_cmd_fixed_param));
7099
7100 cmd->vdev_id = peer_rx_blocksize->vdev_id;
7101 cmd->rx_block_ack_win_limit =
7102 peer_rx_blocksize->rx_block_ack_win_limit;
7103 WMI_CHAR_ARRAY_TO_MAC_ADDR(peer_rx_blocksize->peer_macaddr.bytes,
7104 &cmd->peer_macaddr);
7105
7106 WMA_LOGD("rx aggr blocksize: %d", cmd->rx_block_ack_win_limit);
7107
7108 ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
7109 WMI_PEER_SET_RX_BLOCKSIZE_CMDID);
7110 if (ret) {
7111 WMA_LOGE(FL("Failed to send aggregation size command"));
7112 wmi_buf_free(buf);
7113 return QDF_STATUS_E_FAILURE;
7114 }
7115
7116 return QDF_STATUS_SUCCESS;
7117}
7118
lifengd217d192017-05-09 19:44:16 +08007119QDF_STATUS wma_get_chain_rssi(tp_wma_handle wma_handle,
7120 struct get_chain_rssi_req_params *req_params)
7121{
7122 wmi_peer_antdiv_info_req_cmd_fixed_param *cmd;
7123 wmi_buf_t wmi_buf;
7124 uint32_t len = sizeof(wmi_peer_antdiv_info_req_cmd_fixed_param);
7125 u_int8_t *buf_ptr;
7126
7127 if (!wma_handle) {
7128 WMA_LOGE(FL("WMA is closed, can not issue cmd"));
7129 return QDF_STATUS_E_INVAL;
7130 }
7131
7132 wmi_buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
7133 if (!wmi_buf) {
7134 WMA_LOGE(FL("wmi_buf_alloc failed"));
7135 return QDF_STATUS_E_NOMEM;
7136 }
7137
7138 buf_ptr = (u_int8_t *)wmi_buf_data(wmi_buf);
7139
7140 cmd = (wmi_peer_antdiv_info_req_cmd_fixed_param *)buf_ptr;
7141 WMITLV_SET_HDR(&cmd->tlv_header,
7142 WMITLV_TAG_STRUC_wmi_peer_antdiv_info_req_cmd_fixed_param,
7143 WMITLV_GET_STRUCT_TLVLEN(
7144 wmi_peer_antdiv_info_req_cmd_fixed_param));
7145 cmd->vdev_id = req_params->session_id;
7146 WMI_CHAR_ARRAY_TO_MAC_ADDR(req_params->peer_macaddr.bytes,
7147 &cmd->peer_mac_address);
7148
7149 if (wmi_unified_cmd_send(wma_handle->wmi_handle, wmi_buf, len,
7150 WMI_PEER_ANTDIV_INFO_REQ_CMDID)) {
7151 WMA_LOGE(FL("failed to send get chain rssi command"));
7152 wmi_buf_free(wmi_buf);
7153 return QDF_STATUS_E_FAILURE;
7154 }
7155
7156 return QDF_STATUS_SUCCESS;
7157}
7158
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05307159#if defined(WLAN_FEATURE_FILS_SK)
7160/**
7161 * wma_roam_scan_send_hlp() - API to send HLP IE info to fw
7162 * @wma_handle: WMA handle
7163 * @req: HLP params
7164 *
7165 * Return: QDF_STATUS
7166 */
7167static QDF_STATUS wma_roam_scan_send_hlp(tp_wma_handle wma_handle,
7168 struct hlp_params *req)
7169{
7170 struct hlp_params *params;
7171 QDF_STATUS status;
7172
7173 params = qdf_mem_malloc(sizeof(*params));
7174 if (!params) {
7175 WMA_LOGE("%s : Memory allocation failed", __func__);
7176 return QDF_STATUS_E_NOMEM;
7177 }
7178
7179 params->vdev_id = req->vdev_id;
7180 params->hlp_ie_len = req->hlp_ie_len;
7181 qdf_mem_copy(params->hlp_ie, req->hlp_ie, req->hlp_ie_len);
7182 status = wmi_unified_roam_send_hlp_cmd(wma_handle->wmi_handle, params);
7183
7184 WMA_LOGD("Send HLP status %d vdev id %d", status, params->vdev_id);
7185 qdf_trace_hex_dump(QDF_MODULE_ID_WMI, QDF_TRACE_LEVEL_DEBUG,
7186 params->hlp_ie, 10);
7187
7188 qdf_mem_free(params);
7189 return status;
7190}
7191#else
7192static QDF_STATUS wma_roam_scan_send_hlp(tp_wma_handle wma_handle,
7193 struct hlp_params *req)
7194{
7195 return QDF_STATUS_SUCCESS;
7196}
7197#endif
7198
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05307199/**
Ganesh Kondabattini35739572017-06-21 16:26:39 +05307200 * wma_process_set_limit_off_chan() - set limit off chanel parameters
7201 * @wma_handle: pointer to wma handle
7202 * @param: pointer to sir_limit_off_chan
7203 *
7204 * Return: QDF_STATUS_SUCCESS for success or error code.
7205 */
7206static QDF_STATUS wma_process_limit_off_chan(tp_wma_handle wma_handle,
7207 struct sir_limit_off_chan *param)
7208{
7209 int32_t err;
7210 struct wmi_limit_off_chan_param limit_off_chan_param;
7211
Rajeev Kumar752d64e2017-10-05 16:32:58 -07007212 if (param->vdev_id >= wma_handle->max_bssid) {
7213 WMA_LOGE(FL("Invalid vdev_id: %d"), param->vdev_id);
7214 return QDF_STATUS_E_INVAL;
7215 }
7216 if (!wma_is_vdev_up(param->vdev_id)) {
7217 WMA_LOGE("vdev %d is not up skipping limit_off_chan_param",
7218 param->vdev_id);
7219 return QDF_STATUS_E_INVAL;
7220 }
7221
Ganesh Kondabattini35739572017-06-21 16:26:39 +05307222 limit_off_chan_param.vdev_id = param->vdev_id;
7223 limit_off_chan_param.status = param->is_tos_active;
7224 limit_off_chan_param.max_offchan_time = param->max_off_chan_time;
7225 limit_off_chan_param.rest_time = param->rest_time;
7226 limit_off_chan_param.skip_dfs_chans = param->skip_dfs_chans;
7227
7228 err = wmi_unified_send_limit_off_chan_cmd(wma_handle->wmi_handle,
7229 &limit_off_chan_param);
7230 if (err) {
7231 WMA_LOGE("\n failed to set limit off chan cmd");
7232 return QDF_STATUS_E_FAILURE;
7233 }
7234
7235 return QDF_STATUS_SUCCESS;
7236}
7237
7238/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007239 * wma_mc_process_msg() - process wma messages and call appropriate function.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007240 * @msg: message
7241 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05307242 * Return: QDF_SUCCESS for success otherwise failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007243 */
Jeff Johnson5be42ab2017-09-13 09:10:39 -07007244static QDF_STATUS wma_mc_process_msg(struct scheduler_msg *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007245{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307246 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007247 tp_wma_handle wma_handle;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08007248 struct cdp_vdev *txrx_vdev_handle = NULL;
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -07007249
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007250 extern uint8_t *mac_trace_get_wma_msg_string(uint16_t wmaMsg);
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05307251 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007252
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007253 if (NULL == msg) {
7254 WMA_LOGE("msg is NULL");
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307255 QDF_ASSERT(0);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307256 qdf_status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007257 goto end;
7258 }
7259
7260 WMA_LOGD("msg->type = %x %s", msg->type,
7261 mac_trace_get_wma_msg_string(msg->type));
7262
Anurag Chouhan6d760662016-02-20 16:05:43 +05307263 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007264
7265 if (NULL == wma_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07007266 WMA_LOGE("%s: wma_handle is NULL", __func__);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307267 QDF_ASSERT(0);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307268 qdf_mem_free(msg->bodyptr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307269 qdf_status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007270 goto end;
7271 }
7272
7273 switch (msg->type) {
7274
7275 /* Message posted by wmi for all control path related
7276 * FW events to serialize through mc_thread.
7277 */
7278 case WMA_PROCESS_FW_EVENT:
7279 wma_process_fw_event(wma_handle,
7280 (wma_process_fw_event_params *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307281 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007282 break;
7283
7284#ifdef FEATURE_WLAN_ESE
7285 case WMA_TSM_STATS_REQ:
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08007286 WMA_LOGD("McThread: WMA_TSM_STATS_REQ");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007287 wma_process_tsm_stats_req(wma_handle, (void *)msg->bodyptr);
7288 break;
7289#endif /* FEATURE_WLAN_ESE */
7290 case WNI_CFG_DNLD_REQ:
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08007291 WMA_LOGD("McThread: WNI_CFG_DNLD_REQ");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307292 qdf_status = wma_wni_cfg_dnld(wma_handle);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07007293 if (QDF_IS_STATUS_SUCCESS(qdf_status))
Jeff Johnsonf7ab8142017-09-13 09:04:23 -07007294 cds_wma_complete_cback();
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07007295 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007296 WMA_LOGD("config download failure");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007297 break;
7298 case WMA_ADD_STA_SELF_REQ:
7299 txrx_vdev_handle =
7300 wma_vdev_attach(wma_handle,
7301 (struct add_sta_self_params *) msg->
7302 bodyptr, 1);
7303 if (!txrx_vdev_handle) {
7304 WMA_LOGE("Failed to attach vdev");
7305 } else {
7306 /* Register with TxRx Module for Data Ack Complete Cb */
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05307307 if (soc) {
7308 cdp_data_tx_cb_set(soc, txrx_vdev_handle,
7309 wma_data_tx_ack_comp_hdlr,
7310 wma_handle);
7311 } else {
7312 WMA_LOGE("%s: SOC context is NULL", __func__);
7313 qdf_status = QDF_STATUS_E_FAILURE;
7314 goto end;
7315 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007316 }
7317 break;
7318 case WMA_DEL_STA_SELF_REQ:
7319 wma_vdev_detach(wma_handle,
7320 (struct del_sta_self_params *) msg->bodyptr, 1);
7321 break;
7322 case WMA_START_SCAN_OFFLOAD_REQ:
7323 wma_start_scan(wma_handle, msg->bodyptr, msg->type);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307324 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007325 break;
7326 case WMA_STOP_SCAN_OFFLOAD_REQ:
7327 wma_stop_scan(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307328 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007329 break;
7330 case WMA_UPDATE_CHAN_LIST_REQ:
7331 wma_update_channel_list(wma_handle,
7332 (tSirUpdateChanList *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307333 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007334 break;
7335 case WMA_SET_LINK_STATE:
7336 wma_set_linkstate(wma_handle, (tpLinkStateParams) msg->bodyptr);
7337 break;
7338 case WMA_CHNL_SWITCH_REQ:
7339 wma_set_channel(wma_handle,
7340 (tpSwitchChannelParams) msg->bodyptr);
7341 break;
7342 case WMA_ADD_BSS_REQ:
7343 wma_add_bss(wma_handle, (tpAddBssParams) msg->bodyptr);
7344 break;
7345 case WMA_ADD_STA_REQ:
7346 wma_add_sta(wma_handle, (tpAddStaParams) msg->bodyptr);
7347 break;
7348 case WMA_SET_BSSKEY_REQ:
7349 wma_set_bsskey(wma_handle, (tpSetBssKeyParams) msg->bodyptr);
7350 break;
7351 case WMA_SET_STAKEY_REQ:
7352 wma_set_stakey(wma_handle, (tpSetStaKeyParams) msg->bodyptr);
7353 break;
7354 case WMA_DELETE_STA_REQ:
7355 wma_delete_sta(wma_handle, (tpDeleteStaParams) msg->bodyptr);
7356 break;
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07007357 case WMA_DELETE_BSS_HO_FAIL_REQ:
7358 wma_delete_bss_ho_fail(wma_handle,
7359 (tpDeleteBssParams) msg->bodyptr);
7360 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007361 case WMA_DELETE_BSS_REQ:
7362 wma_delete_bss(wma_handle, (tpDeleteBssParams) msg->bodyptr);
7363 break;
7364 case WMA_UPDATE_EDCA_PROFILE_IND:
7365 wma_process_update_edca_param_req(wma_handle,
7366 (tEdcaParams *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307367 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007368 break;
7369 case WMA_SEND_BEACON_REQ:
7370 wma_send_beacon(wma_handle, (tpSendbeaconParams) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307371 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007372 break;
7373 case WMA_SEND_PROBE_RSP_TMPL:
7374 wma_send_probe_rsp_tmpl(wma_handle,
7375 (tpSendProbeRespParams) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307376 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007377 break;
7378 case WMA_CLI_SET_CMD:
7379 wma_process_cli_set_cmd(wma_handle,
7380 (wma_cli_set_cmd_t *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307381 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007382 break;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07007383 case WMA_SET_PDEV_IE_REQ:
7384 wma_process_set_pdev_ie_req(wma_handle,
7385 (struct set_ie_param *)msg->bodyptr);
7386 qdf_mem_free(msg->bodyptr);
7387 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007388#if !defined(REMOVE_PKT_LOG)
7389 case WMA_PKTLOG_ENABLE_REQ:
7390 wma_pktlog_wmi_send_cmd(wma_handle,
7391 (struct ath_pktlog_wmi_params *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307392 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007393 break;
7394#endif /* REMOVE_PKT_LOG */
7395#if defined(QCA_WIFI_FTM)
7396 case WMA_FTM_CMD_REQ:
7397 wma_process_ftm_command(wma_handle,
7398 (struct ar6k_testmode_cmd_data *)msg->bodyptr);
7399 break;
7400#endif /* QCA_WIFI_FTM */
7401 case WMA_ENTER_PS_REQ:
7402 wma_enable_sta_ps_mode(wma_handle,
7403 (tpEnablePsParams) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307404 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007405 break;
7406 case WMA_EXIT_PS_REQ:
7407 wma_disable_sta_ps_mode(wma_handle,
7408 (tpDisablePsParams) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307409 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007410 break;
7411 case WMA_ENABLE_UAPSD_REQ:
7412 wma_enable_uapsd_mode(wma_handle,
7413 (tpEnableUapsdParams) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307414 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007415 break;
7416 case WMA_DISABLE_UAPSD_REQ:
7417 wma_disable_uapsd_mode(wma_handle,
7418 (tpDisableUapsdParams) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307419 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007420 break;
Kiran Kumar Lokere92fe7592016-09-14 20:15:45 -07007421 case WMA_SET_DTIM_PERIOD:
7422 wma_set_dtim_period(wma_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07007423 (struct set_dtim_params *)msg->bodyptr);
Kiran Kumar Lokere92fe7592016-09-14 20:15:45 -07007424 qdf_mem_free(msg->bodyptr);
7425 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007426 case WMA_SET_TX_POWER_REQ:
7427 wma_set_tx_power(wma_handle, (tpMaxTxPowerParams) msg->bodyptr);
7428 break;
7429 case WMA_SET_MAX_TX_POWER_REQ:
7430 wma_set_max_tx_power(wma_handle,
7431 (tpMaxTxPowerParams) msg->bodyptr);
7432 break;
7433 case WMA_SET_KEEP_ALIVE:
7434 wma_set_keepalive_req(wma_handle,
7435 (tSirKeepAliveReq *) msg->bodyptr);
7436 break;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08007437#ifdef FEATURE_WLAN_ESE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007438 case WMA_SET_PLM_REQ:
7439 wma_config_plm(wma_handle, (tpSirPlmReq) msg->bodyptr);
7440 break;
7441#endif
7442 case WMA_GET_STATISTICS_REQ:
7443 wma_get_stats_req(wma_handle,
7444 (tAniGetPEStatsReq *) msg->bodyptr);
7445 break;
7446
7447 case WMA_CONFIG_PARAM_UPDATE_REQ:
Rajeev Kumar156188e2017-01-21 17:23:52 -08007448 wma_update_cfg_params(wma_handle, msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007449 break;
7450
7451 case WMA_UPDATE_OP_MODE:
7452 wma_process_update_opmode(wma_handle,
7453 (tUpdateVHTOpMode *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307454 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007455 break;
7456 case WMA_UPDATE_RX_NSS:
7457 wma_process_update_rx_nss(wma_handle,
7458 (tUpdateRxNss *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307459 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007460 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007461 case WMA_UPDATE_MEMBERSHIP:
7462 wma_process_update_membership(wma_handle,
7463 (tUpdateMembership *) msg->bodyptr);
7464 break;
7465 case WMA_UPDATE_USERPOS:
7466 wma_process_update_userpos(wma_handle,
7467 (tUpdateUserPos *) msg->bodyptr);
7468 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007469 case WMA_UPDATE_BEACON_IND:
7470 wma_process_update_beacon_params(wma_handle,
7471 (tUpdateBeaconParams *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307472 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007473 break;
7474
7475 case WMA_ADD_TS_REQ:
7476 wma_add_ts_req(wma_handle, (tAddTsParams *) msg->bodyptr);
7477 break;
7478
7479 case WMA_DEL_TS_REQ:
7480 wma_del_ts_req(wma_handle, (tDelTsParams *) msg->bodyptr);
7481 break;
7482
7483 case WMA_AGGR_QOS_REQ:
7484 wma_aggr_qos_req(wma_handle, (tAggrAddTsParams *) msg->bodyptr);
7485 break;
7486
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007487 case WMA_WOWL_ENTER_REQ:
7488 wma_wow_enter(wma_handle,
7489 (tpSirHalWowlEnterParams) msg->bodyptr);
7490 break;
7491 case WMA_WOWL_EXIT_REQ:
7492 wma_wow_exit(wma_handle, (tpSirHalWowlExitParams) msg->bodyptr);
7493 break;
Houston Hoffmana76591b2015-11-10 16:52:05 -08007494
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007495 case WMA_8023_MULTICAST_LIST_REQ:
7496 wma_process_mcbc_set_filter_req(wma_handle,
7497 (tpSirRcvFltMcAddrList) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307498 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007499 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007500 case WMA_ROAM_SCAN_OFFLOAD_REQ:
7501 /*
7502 * Main entry point or roaming directives from CSR.
7503 */
Varun Reddy Yeturu30bc42c2016-02-04 10:07:30 -08007504 wma_process_roaming_config(wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007505 (tSirRoamOffloadScanReq *) msg->bodyptr);
7506 break;
7507
7508 case WMA_RATE_UPDATE_IND:
7509 wma_process_rate_update_indicate(wma_handle,
7510 (tSirRateUpdateInd *) msg->bodyptr);
7511 break;
7512
7513#ifdef FEATURE_WLAN_TDLS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007514 case WMA_UPDATE_TDLS_PEER_STATE:
7515 wma_update_tdls_peer_state(wma_handle,
7516 (tTdlsPeerStateParams *) msg->bodyptr);
7517 break;
7518 case WMA_TDLS_SET_OFFCHAN_MODE:
7519 wma_set_tdls_offchan_mode(wma_handle,
7520 (tdls_chan_switch_params *)msg->bodyptr);
7521 break;
7522#endif /* FEATURE_WLAN_TDLS */
7523 case WMA_ADD_PERIODIC_TX_PTRN_IND:
7524 wma_process_add_periodic_tx_ptrn_ind(wma_handle,
7525 (tSirAddPeriodicTxPtrn *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307526 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007527 break;
7528 case WMA_DEL_PERIODIC_TX_PTRN_IND:
7529 wma_process_del_periodic_tx_ptrn_ind(wma_handle,
7530 (tSirDelPeriodicTxPtrn *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307531 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007532 break;
7533 case WMA_TX_POWER_LIMIT:
7534 wma_process_tx_power_limits(wma_handle,
7535 (tSirTxPowerLimit *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307536 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007537 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007538#ifdef FEATURE_WLAN_CH_AVOID
7539 case WMA_CH_AVOID_UPDATE_REQ:
7540 wma_process_ch_avoid_update_req(wma_handle,
7541 (tSirChAvoidUpdateReq *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307542 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007543 break;
7544#endif /* FEATURE_WLAN_CH_AVOID */
7545#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
7546 case WMA_SET_AUTO_SHUTDOWN_TIMER_REQ:
7547 wma_set_auto_shutdown_timer_req(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307548 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007549 break;
7550#endif /* FEATURE_WLAN_AUTO_SHUTDOWN */
7551 case WMA_DHCP_START_IND:
7552 case WMA_DHCP_STOP_IND:
7553 wma_process_dhcp_ind(wma_handle, (tAniDHCPInd *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307554 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007555 break;
7556
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007557 case WMA_IBSS_CESIUM_ENABLE_IND:
7558 wma_process_cesium_enable_ind(wma_handle);
7559 break;
7560 case WMA_GET_IBSS_PEER_INFO_REQ:
7561 wma_process_get_peer_info_req(wma_handle,
7562 (tSirIbssGetPeerInfoReqParams *)
7563 msg->bodyptr);
7564 qdf_mem_free(msg->bodyptr);
7565 break;
7566 case WMA_TX_FAIL_MONITOR_IND:
7567 wma_process_tx_fail_monitor_ind(wma_handle,
7568 (tAniTXFailMonitorInd *) msg->bodyptr);
7569 qdf_mem_free(msg->bodyptr);
7570 break;
7571
7572 case WMA_RMC_ENABLE_IND:
7573 wma_process_rmc_enable_ind(wma_handle);
7574 break;
7575 case WMA_RMC_DISABLE_IND:
7576 wma_process_rmc_disable_ind(wma_handle);
7577 break;
7578 case WMA_RMC_ACTION_PERIOD_IND:
7579 wma_process_rmc_action_period_ind(wma_handle);
7580 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007581 case WMA_INIT_THERMAL_INFO_CMD:
7582 wma_process_init_thermal_info(wma_handle,
7583 (t_thermal_mgmt *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307584 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007585 break;
7586
7587 case WMA_SET_THERMAL_LEVEL:
7588 wma_process_set_thermal_level(wma_handle, msg->bodyval);
7589 break;
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05307590#ifdef CONFIG_HL_SUPPORT
7591 case WMA_INIT_BAD_PEER_TX_CTL_INFO_CMD:
7592 wma_process_init_bad_peer_tx_ctl_info(
7593 wma_handle,
7594 (struct t_bad_peer_txtcl_config *)msg->bodyptr);
7595 qdf_mem_free(msg->bodyptr);
7596 break;
7597#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007598 case WMA_SET_MIMOPS_REQ:
7599 wma_process_set_mimops_req(wma_handle,
7600 (tSetMIMOPS *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307601 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007602 break;
7603 case WMA_SET_SAP_INTRABSS_DIS:
7604 wma_set_vdev_intrabss_fwd(wma_handle,
7605 (tDisableIntraBssFwd *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307606 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007607 break;
Will Huanga9814592017-05-24 15:47:58 +08007608 case WMA_GET_PEER_INFO:
7609 wma_get_peer_info(wma_handle, msg->bodyptr);
7610 qdf_mem_free(msg->bodyptr);
7611 break;
7612 case WMA_GET_PEER_INFO_EXT:
7613 wma_get_peer_info_ext(wma_handle, msg->bodyptr);
7614 qdf_mem_free(msg->bodyptr);
7615 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007616 case WMA_MODEM_POWER_STATE_IND:
7617 wma_notify_modem_power_state(wma_handle,
7618 (tSirModemPowerStateInd *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307619 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007620 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007621#ifdef WLAN_FEATURE_STATS_EXT
7622 case WMA_STATS_EXT_REQUEST:
7623 wma_stats_ext_req(wma_handle,
7624 (tpStatsExtRequest) (msg->bodyptr));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307625 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007626 break;
7627#endif /* WLAN_FEATURE_STATS_EXT */
7628 case WMA_HIDDEN_SSID_VDEV_RESTART:
7629 wma_hidden_ssid_vdev_restart(wma_handle,
7630 (tHalHiddenSsidVdevRestart *) msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007631 break;
7632#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
7633 case WMA_WLAN_EXT_WOW:
7634 wma_enable_ext_wow(wma_handle,
7635 (tSirExtWoWParams *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307636 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007637 break;
7638 case WMA_WLAN_SET_APP_TYPE1_PARAMS:
7639 wma_set_app_type1_params_in_fw(wma_handle,
7640 (tSirAppType1Params *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307641 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007642 break;
7643 case WMA_WLAN_SET_APP_TYPE2_PARAMS:
7644 wma_set_app_type2_params_in_fw(wma_handle,
7645 (tSirAppType2Params *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307646 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007647 break;
7648#endif /* WLAN_FEATURE_EXTWOW_SUPPORT */
7649#ifdef FEATURE_WLAN_EXTSCAN
7650 case WMA_EXTSCAN_START_REQ:
7651 wma_start_extscan(wma_handle,
7652 (tSirWifiScanCmdReqParams *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307653 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007654 break;
7655 case WMA_EXTSCAN_STOP_REQ:
7656 wma_stop_extscan(wma_handle,
7657 (tSirExtScanStopReqParams *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307658 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007659 break;
7660 case WMA_EXTSCAN_SET_BSSID_HOTLIST_REQ:
7661 wma_extscan_start_hotlist_monitor(wma_handle,
7662 (tSirExtScanSetBssidHotListReqParams *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307663 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007664 break;
7665 case WMA_EXTSCAN_RESET_BSSID_HOTLIST_REQ:
7666 wma_extscan_stop_hotlist_monitor(wma_handle,
7667 (tSirExtScanResetBssidHotlistReqParams *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307668 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007669 break;
7670 case WMA_EXTSCAN_SET_SIGNF_CHANGE_REQ:
7671 wma_extscan_start_change_monitor(wma_handle,
7672 (tSirExtScanSetSigChangeReqParams *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307673 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007674 break;
7675 case WMA_EXTSCAN_RESET_SIGNF_CHANGE_REQ:
7676 wma_extscan_stop_change_monitor(wma_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07007677 (tSirExtScanResetSignificantChangeReqParams *)
7678 msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307679 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007680 break;
7681 case WMA_EXTSCAN_GET_CACHED_RESULTS_REQ:
7682 wma_extscan_get_cached_results(wma_handle,
7683 (tSirExtScanGetCachedResultsReqParams *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307684 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007685 break;
7686 case WMA_EXTSCAN_GET_CAPABILITIES_REQ:
7687 wma_extscan_get_capabilities(wma_handle,
7688 (tSirGetExtScanCapabilitiesReqParams *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307689 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007690 break;
7691 case WMA_SET_EPNO_LIST_REQ:
7692 wma_set_epno_network_list(wma_handle,
7693 (struct wifi_epno_params *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307694 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007695 break;
Kapil Gupta5cda2252016-12-29 18:44:26 +05307696 case WMA_SET_PER_ROAM_CONFIG_CMD:
7697 wma_update_per_roam_config(wma_handle,
7698 (struct wmi_per_roam_config_req *)msg->bodyptr);
7699 qdf_mem_free(msg->bodyptr);
7700 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007701 case WMA_SET_PASSPOINT_LIST_REQ:
7702 /* Issue reset passpoint network list first and clear
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07007703 * the entries
7704 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007705 wma_reset_passpoint_network_list(wma_handle,
7706 (struct wifi_passpoint_req *)msg->bodyptr);
7707
7708 wma_set_passpoint_network_list(wma_handle,
7709 (struct wifi_passpoint_req *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307710 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007711 break;
7712 case WMA_RESET_PASSPOINT_LIST_REQ:
7713 wma_reset_passpoint_network_list(wma_handle,
7714 (struct wifi_passpoint_req *)msg->bodyptr);
7715 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007716#endif /* FEATURE_WLAN_EXTSCAN */
7717 case WMA_SET_SCAN_MAC_OUI_REQ:
7718 wma_scan_probe_setoui(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307719 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007720 break;
7721#ifdef WLAN_FEATURE_LINK_LAYER_STATS
7722 case WMA_LINK_LAYER_STATS_CLEAR_REQ:
7723 wma_process_ll_stats_clear_req(wma_handle,
7724 (tpSirLLStatsClearReq) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307725 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007726 break;
7727 case WMA_LINK_LAYER_STATS_SET_REQ:
7728 wma_process_ll_stats_set_req(wma_handle,
7729 (tpSirLLStatsSetReq) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307730 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007731 break;
7732 case WMA_LINK_LAYER_STATS_GET_REQ:
7733 wma_process_ll_stats_get_req(wma_handle,
7734 (tpSirLLStatsGetReq) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307735 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007736 break;
Zhang Qian73c348a2017-03-13 16:15:55 +08007737 case WDA_LINK_LAYER_STATS_SET_THRESHOLD:
7738 wma_config_stats_ext_threshold(wma_handle,
7739 (struct sir_ll_ext_stats_threshold *)msg->bodyptr);
7740 qdf_mem_free(msg->bodyptr);
7741 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007742#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007743#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007744 case WMA_ROAM_OFFLOAD_SYNCH_FAIL:
7745 wma_process_roam_synch_fail(wma_handle,
7746 (struct roam_offload_synch_fail *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307747 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007748 break;
7749 case SIR_HAL_ROAM_INVOKE:
7750 wma_process_roam_invoke(wma_handle,
7751 (struct wma_roam_invoke_cmd *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307752 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007753 break;
7754#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
7755#ifdef WLAN_FEATURE_NAN
7756 case WMA_NAN_REQUEST:
7757 wma_nan_req(wma_handle, (tNanRequest *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307758 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007759 break;
7760#endif /* WLAN_FEATURE_NAN */
7761 case SIR_HAL_SET_BASE_MACADDR_IND:
7762 wma_set_base_macaddr_indicate(wma_handle,
7763 (tSirMacAddr *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307764 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007765 break;
7766 case WMA_LINK_STATUS_GET_REQ:
7767 wma_process_link_status_req(wma_handle,
7768 (tAniGetLinkStatus *) msg->bodyptr);
7769 break;
7770 case WMA_GET_TEMPERATURE_REQ:
7771 wma_get_temperature(wma_handle);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307772 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007773 break;
Manikandan Mohan976e7562016-03-15 16:33:31 -07007774 case WMA_TSF_GPIO_PIN:
7775 wma_set_tsf_gpio_pin(wma_handle, msg->bodyval);
7776 break;
7777
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007778#ifdef DHCP_SERVER_OFFLOAD
7779 case WMA_SET_DHCP_SERVER_OFFLOAD_CMD:
7780 wma_process_dhcpserver_offload(wma_handle,
7781 (tSirDhcpSrvOffloadInfo *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307782 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007783 break;
7784#endif /* DHCP_SERVER_OFFLOAD */
7785#ifdef WLAN_FEATURE_GPIO_LED_FLASHING
7786 case WMA_LED_FLASHING_REQ:
Jeff Johnson5a6b6602017-10-04 14:44:30 -07007787 wma_set_led_flashing(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307788 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007789 break;
7790#endif /* WLAN_FEATURE_GPIO_LED_FLASHING */
7791 case SIR_HAL_SET_MAS:
7792 wma_process_set_mas(wma_handle,
7793 (uint32_t *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307794 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007795 break;
7796 case SIR_HAL_SET_MIRACAST:
7797 wma_process_set_miracast(wma_handle,
7798 (uint32_t *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307799 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007800 break;
7801 case SIR_HAL_CONFIG_STATS_FACTOR:
7802 wma_config_stats_factor(wma_handle,
7803 (struct sir_stats_avg_factor *)
7804 msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307805 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007806 break;
7807 case SIR_HAL_CONFIG_GUARD_TIME:
7808 wma_config_guard_time(wma_handle,
7809 (struct sir_guard_time_request *)
7810 msg->bodyptr);
7811 case WMA_IPA_OFFLOAD_ENABLE_DISABLE:
7812 wma_ipa_offload_enable_disable(wma_handle,
7813 (struct sir_ipa_offload_enable_disable *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307814 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007815 break;
7816 case SIR_HAL_START_STOP_LOGGING:
7817 wma_set_wifi_start_packet_stats(wma_handle,
7818 (struct sir_wifi_start_log *)msg->bodyptr);
7819 wma_enable_specific_fw_logs(wma_handle,
7820 (struct sir_wifi_start_log *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307821 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007822 break;
7823 case SIR_HAL_FLUSH_LOG_TO_FW:
7824 wma_send_flush_logs_to_fw(wma_handle);
7825 /* Body ptr is NULL here */
7826 break;
7827 case WMA_SET_RSSI_MONITOR_REQ:
7828 wma_set_rssi_monitoring(wma_handle,
7829 (struct rssi_monitor_req *)msg->bodyptr);
Prakash Dhavali87ddca32016-11-29 17:02:11 -08007830 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007831 break;
7832 case WMA_FW_MEM_DUMP_REQ:
7833 wma_process_fw_mem_dump_req(wma_handle,
7834 (struct fw_dump_req *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307835 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007836 break;
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05307837 case SIR_HAL_PDEV_SET_PCL_TO_FW:
7838 wma_send_pdev_set_pcl_cmd(wma_handle,
7839 (struct wmi_pcl_chan_weights *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307840 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007841 break;
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05307842 case SIR_HAL_PDEV_SET_HW_MODE:
7843 wma_send_pdev_set_hw_mode_cmd(wma_handle,
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07007844 (struct policy_mgr_hw_mode *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307845 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007846 break;
7847 case WMA_OCB_SET_CONFIG_CMD:
7848 wma_ocb_set_config_req(wma_handle,
7849 (struct sir_ocb_config *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307850 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007851 break;
7852 case WMA_OCB_SET_UTC_TIME_CMD:
7853 wma_ocb_set_utc_time(wma_handle,
7854 (struct sir_ocb_utc *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307855 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007856 break;
7857 case WMA_OCB_START_TIMING_ADVERT_CMD:
7858 wma_ocb_start_timing_advert(wma_handle,
7859 (struct sir_ocb_timing_advert *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307860 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007861 break;
7862 case WMA_OCB_STOP_TIMING_ADVERT_CMD:
7863 wma_ocb_stop_timing_advert(wma_handle,
7864 (struct sir_ocb_timing_advert *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307865 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007866 break;
7867 case WMA_DCC_CLEAR_STATS_CMD:
7868 wma_dcc_clear_stats(wma_handle,
7869 (struct sir_dcc_clear_stats *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307870 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007871 break;
7872 case WMA_OCB_GET_TSF_TIMER_CMD:
7873 wma_ocb_get_tsf_timer(wma_handle,
7874 (struct sir_ocb_get_tsf_timer *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307875 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007876 break;
Manikandan Mohan80dea792016-04-28 16:36:48 -07007877 case WMA_SET_WISA_PARAMS:
7878 wma_set_wisa_params(wma_handle,
7879 (struct sir_wisa_params *)msg->bodyptr);
7880 qdf_mem_free(msg->bodyptr);
7881 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007882 case WMA_DCC_GET_STATS_CMD:
7883 wma_dcc_get_stats(wma_handle,
7884 (struct sir_dcc_get_stats *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307885 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007886 break;
7887 case WMA_DCC_UPDATE_NDL_CMD:
7888 wma_dcc_update_ndl(wma_handle,
7889 (struct sir_dcc_update_ndl *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307890 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007891 break;
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05307892 case SIR_HAL_PDEV_DUAL_MAC_CFG_REQ:
7893 wma_send_pdev_set_dual_mac_config(wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007894 (struct sir_dual_mac_config *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307895 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007896 break;
7897 case WMA_SET_IE_INFO:
7898 wma_process_set_ie_info(wma_handle,
7899 (struct vdev_ie_info *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307900 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007901 break;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08007902 case SIR_HAL_SOC_ANTENNA_MODE_REQ:
7903 wma_send_pdev_set_antenna_mode(wma_handle,
7904 (struct sir_antenna_mode_param *)msg->bodyptr);
7905 qdf_mem_free(msg->bodyptr);
7906 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007907 case WMA_LRO_CONFIG_CMD:
7908 wma_lro_config_cmd(wma_handle,
Dhanashri Atre09828f12016-11-13 10:36:58 -08007909 (struct cdp_lro_hash_config *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307910 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007911 break;
Ravi Joshi9e891ba2015-11-09 19:03:46 -08007912 case WMA_GW_PARAM_UPDATE_REQ:
7913 wma_set_gateway_params(wma_handle,
7914 (struct gateway_param_update_req *)msg->bodyptr);
Archana Ramachandran28ab4122016-03-08 16:17:14 -08007915 qdf_mem_free(msg->bodyptr);
Ryan Hsu3c8f79f2015-12-02 16:45:09 -08007916 break;
7917 case WMA_SET_EGAP_CONF_PARAMS:
7918 wma_send_egap_conf_params(wma_handle,
7919 (struct egap_conf_params *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307920 qdf_mem_free(msg->bodyptr);
Ravi Joshi9e891ba2015-11-09 19:03:46 -08007921 break;
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +05307922 case WMA_SET_ADAPT_DWELLTIME_CONF_PARAMS:
7923 wma_send_adapt_dwelltime_params(wma_handle,
7924 (struct adaptive_dwelltime_params *)msg->bodyptr);
7925 qdf_mem_free(msg->bodyptr);
7926 break;
Sandeep Puligillae0875662016-02-12 16:09:21 -08007927 case WMA_HT40_OBSS_SCAN_IND:
7928 wma_send_ht40_obss_scanind(wma_handle,
7929 (struct obss_ht40_scanind *)msg->bodyptr);
7930 qdf_mem_free(msg->bodyptr);
7931 break;
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -07007932 case WMA_ADD_BCN_FILTER_CMDID:
7933 wma_add_beacon_filter(wma_handle, msg->bodyptr);
7934 qdf_mem_free(msg->bodyptr);
7935 break;
7936 case WMA_REMOVE_BCN_FILTER_CMDID:
7937 wma_remove_beacon_filter(wma_handle, msg->bodyptr);
7938 qdf_mem_free(msg->bodyptr);
7939 break;
Arun Khandavalli2476ef52016-04-26 20:19:43 +05307940 case WDA_BPF_GET_CAPABILITIES_REQ:
7941 wma_get_bpf_capabilities(wma_handle);
7942 break;
7943 case WDA_BPF_SET_INSTRUCTIONS_REQ:
7944 wma_set_bpf_instructions(wma_handle, msg->bodyptr);
7945 qdf_mem_free(msg->bodyptr);
7946 break;
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -07007947 case SIR_HAL_NDP_INITIATOR_REQ:
7948 wma_handle_ndp_initiator_req(wma_handle, msg->bodyptr);
7949 qdf_mem_free(msg->bodyptr);
7950 break;
Naveen Rawatf28315c2016-06-29 18:06:02 -07007951
Abhishek Singh4fef7472016-06-06 11:36:03 -07007952 case SIR_HAL_NDP_RESPONDER_REQ:
7953 wma_handle_ndp_responder_req(wma_handle, msg->bodyptr);
Naveen Rawatf28315c2016-06-29 18:06:02 -07007954 break;
7955
7956 case SIR_HAL_NDP_END_REQ:
7957 wma_handle_ndp_end_req(wma_handle, msg->bodyptr);
Abhishek Singh4fef7472016-06-06 11:36:03 -07007958 qdf_mem_free(msg->bodyptr);
7959 break;
Manjeet Singhf82ed072016-07-08 11:40:00 +05307960 case SIR_HAL_POWER_DBG_CMD:
7961 wma_process_hal_pwr_dbg_cmd(wma_handle,
7962 msg->bodyptr);
7963 qdf_mem_free(msg->bodyptr);
7964 break;
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05307965 case WMA_UPDATE_WEP_DEFAULT_KEY:
7966 wma_update_wep_default_key(wma_handle,
7967 (struct wep_update_default_key_idx *)msg->bodyptr);
7968 qdf_mem_free(msg->bodyptr);
7969 break;
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +05307970 case WMA_SEND_FREQ_RANGE_CONTROL_IND:
7971 wma_enable_disable_caevent_ind(wma_handle, msg->bodyval);
7972 break;
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +05307973 case WMA_ENCRYPT_DECRYPT_MSG:
7974 wma_encrypt_decrypt_msg(wma_handle, msg->bodyptr);
7975 qdf_mem_free(msg->bodyptr);
7976 break;
Agrawal, Ashish35b251d2016-09-08 19:21:03 +05307977 case SIR_HAL_UPDATE_TX_FAIL_CNT_TH:
7978 wma_update_tx_fail_cnt_th(wma_handle, msg->bodyptr);
7979 qdf_mem_free(msg->bodyptr);
7980 break;
Agrawal Ashishda3e9502016-09-21 17:43:51 +05307981 case SIR_HAL_LONG_RETRY_LIMIT_CNT:
7982 wma_update_long_retry_limit(wma_handle, msg->bodyptr);
7983 qdf_mem_free(msg->bodyptr);
7984 break;
7985 case SIR_HAL_SHORT_RETRY_LIMIT_CNT:
7986 wma_update_short_retry_limit(wma_handle, msg->bodyptr);
7987 qdf_mem_free(msg->bodyptr);
7988 break;
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05307989 case SIR_HAL_POWER_DEBUG_STATS_REQ:
7990 wma_process_power_debug_stats_req(wma_handle);
7991 break;
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +05307992 case WMA_GET_RCPI_REQ:
7993 wma_get_rcpi_req(wma_handle,
7994 (struct sme_rcpi_req *)msg->bodyptr);
7995 qdf_mem_free(msg->bodyptr);
7996 break;
Yingying Tang95409972016-10-20 15:16:15 +08007997 case WMA_SET_WOW_PULSE_CMD:
7998 wma_send_wow_pulse_cmd(wma_handle,
7999 (struct wow_pulse_mode *)msg->bodyptr);
8000 qdf_mem_free(msg->bodyptr);
8001 break;
Nitesh Shahf9a09ff2017-05-22 15:46:25 +05308002 case WMA_SET_DBS_SCAN_SEL_CONF_PARAMS:
8003 wma_send_dbs_scan_selection_params(wma_handle,
8004 (struct wmi_dbs_scan_sel_params *)msg->bodyptr);
8005 qdf_mem_free(msg->bodyptr);
8006 break;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05308007 case WMA_SET_ARP_STATS_REQ:
8008 wma_set_arp_req_stats(wma_handle,
8009 (struct set_arp_stats_params *)msg->bodyptr);
8010 qdf_mem_free(msg->bodyptr);
8011 break;
8012 case WMA_GET_ARP_STATS_REQ:
8013 wma_get_arp_req_stats(wma_handle,
8014 (struct get_arp_stats_params *)msg->bodyptr);
8015 qdf_mem_free(msg->bodyptr);
8016 break;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05308017 case SIR_HAL_SET_DEL_PMKID_CACHE:
8018 wma_set_del_pmkid_cache(wma_handle,
8019 (struct wmi_unified_pmk_cache *) msg->bodyptr);
8020 qdf_mem_free(msg->bodyptr);
8021 break;
8022 case SIR_HAL_HLP_IE_INFO:
8023 wma_roam_scan_send_hlp(wma_handle,
8024 (struct hlp_params *)msg->bodyptr);
8025 qdf_mem_free(msg->bodyptr);
8026 break;
Ganesh Kondabattini35739572017-06-21 16:26:39 +05308027 case WMA_SET_LIMIT_OFF_CHAN:
8028 wma_process_limit_off_chan(wma_handle, msg->bodyptr);
8029 qdf_mem_free(msg->bodyptr);
8030 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008031 default:
Dustin Brown86534fb2017-01-24 14:28:20 -08008032 WMA_LOGE("Unhandled WMA message of type %d", msg->type);
8033 if (msg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308034 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008035 }
8036end:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308037 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008038}
8039
Krunal Sonid32c6bc2016-10-18 18:00:21 -07008040QDF_STATUS wma_mc_process_handler(struct scheduler_msg *msg)
8041{
Jeff Johnson5be42ab2017-09-13 09:10:39 -07008042 return wma_mc_process_msg(msg);
Krunal Sonid32c6bc2016-10-18 18:00:21 -07008043}
Krunal Sonid32c6bc2016-10-18 18:00:21 -07008044
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008045/**
8046 * wma_log_completion_timeout() - Log completion timeout
8047 * @data: Timeout handler data
8048 *
8049 * This function is called when log completion timer expires
8050 *
8051 * Return: None
8052 */
8053void wma_log_completion_timeout(void *data)
8054{
8055 tp_wma_handle wma_handle;
8056
8057 WMA_LOGE("%s: Timeout occured for log completion command", __func__);
8058
8059 wma_handle = (tp_wma_handle) data;
8060 if (!wma_handle)
8061 WMA_LOGE("%s: Invalid WMA handle", __func__);
8062
8063 /* Though we did not receive any event from FW,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07008064 * we can flush whatever logs we have with us
8065 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008066 cds_logging_set_fw_flush_complete();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008067}
8068
8069/**
Manishekar Chandrasekaranb82554d2016-08-04 17:46:46 +05308070 * wma_map_pcl_weights() - Map PCL weights
8071 * @pcl_weight: Internal PCL weights
8072 *
8073 * Maps the internal weights of PCL to the weights needed by FW
8074 *
8075 * Return: Mapped channel weight of type wmi_pcl_chan_weight
8076 */
8077static wmi_pcl_chan_weight wma_map_pcl_weights(uint32_t pcl_weight)
8078{
8079 switch (pcl_weight) {
8080 case WEIGHT_OF_GROUP1_PCL_CHANNELS:
8081 return WMI_PCL_WEIGHT_VERY_HIGH;
8082 case WEIGHT_OF_GROUP2_PCL_CHANNELS:
8083 return WMI_PCL_WEIGHT_HIGH;
8084 case WEIGHT_OF_GROUP3_PCL_CHANNELS:
8085 return WMI_PCL_WEIGHT_MEDIUM;
8086 case WEIGHT_OF_NON_PCL_CHANNELS:
8087 return WMI_PCL_WEIGHT_LOW;
8088 default:
8089 return WMI_PCL_WEIGHT_DISALLOW;
8090 }
8091}
8092
8093/**
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05308094 * wma_send_pdev_set_pcl_cmd() - Send WMI_SOC_SET_PCL_CMDID to FW
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008095 * @wma_handle: WMA handle
8096 * @msg: PCL structure containing the PCL and the number of channels
8097 *
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05308098 * WMI_PDEV_SET_PCL_CMDID provides a Preferred Channel List (PCL) to the WLAN
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008099 * firmware. The DBS Manager is the consumer of this information in the WLAN
8100 * firmware. The channel list will be used when a Virtual DEVice (VDEV) needs
8101 * to migrate to a new channel without host driver involvement. An example of
8102 * this behavior is Legacy Fast Roaming (LFR 3.0). Generally, the host will
8103 * manage the channel selection without firmware involvement.
8104 *
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05308105 * WMI_PDEV_SET_PCL_CMDID will carry only the weight list and not the actual
8106 * channel list. The weights corresponds to the channels sent in
8107 * WMI_SCAN_CHAN_LIST_CMDID. The channels from PCL would be having a higher
8108 * weightage compared to the non PCL channels.
8109 *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008110 * Return: Success if the cmd is sent successfully to the firmware
8111 */
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05308112QDF_STATUS wma_send_pdev_set_pcl_cmd(tp_wma_handle wma_handle,
8113 struct wmi_pcl_chan_weights *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008114{
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05308115 uint32_t i;
8116 QDF_STATUS status;
8117
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008118 if (!wma_handle) {
8119 WMA_LOGE("%s: WMA handle is NULL. Cannot issue command",
8120 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308121 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008122 }
8123
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05308124 for (i = 0; i < wma_handle->saved_chan.num_channels; i++) {
8125 msg->saved_chan_list[i] =
8126 wma_handle->saved_chan.channel_list[i];
8127 }
8128
8129 msg->saved_num_chan = wma_handle->saved_chan.num_channels;
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07008130 status = policy_mgr_get_valid_chan_weights(wma_handle->psoc,
8131 (struct policy_mgr_pcl_chan_weights *)msg);
Manishekar Chandrasekaranb82554d2016-08-04 17:46:46 +05308132
8133 for (i = 0; i < msg->saved_num_chan; i++) {
8134 msg->weighed_valid_list[i] =
8135 wma_map_pcl_weights(msg->weighed_valid_list[i]);
Sandeep Puligilla819d94f2017-10-10 18:33:56 -07008136 /* Dont allow roaming on 2G when 5G_ONLY configured */
8137 if ((wma_handle->bandcapability == eCSR_BAND_5G) &&
8138 (msg->saved_chan_list[i] <= MAX_24GHZ_CHANNEL)) {
8139 msg->weighed_valid_list[i] =
8140 WEIGHT_OF_DISALLOWED_CHANNELS;
8141 }
Manishekar Chandrasekaranb82554d2016-08-04 17:46:46 +05308142 WMA_LOGD("%s: chan:%d weight[%d]=%d", __func__,
8143 msg->saved_chan_list[i], i,
8144 msg->weighed_valid_list[i]);
8145 }
8146
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05308147 if (!QDF_IS_STATUS_SUCCESS(status)) {
8148 WMA_LOGE("%s: Error in creating weighed pcl", __func__);
8149 return status;
8150 }
8151
8152 if (wmi_unified_pdev_set_pcl_cmd(wma_handle->wmi_handle, msg))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308153 return QDF_STATUS_E_FAILURE;
Govind Singhf25a0f12016-03-08 16:09:48 +05308154
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308155 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008156}
8157
8158/**
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05308159 * wma_send_pdev_set_hw_mode_cmd() - Send WMI_PDEV_SET_HW_MODE_CMDID to FW
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008160 * @wma_handle: WMA handle
8161 * @msg: Structure containing the following parameters
8162 *
8163 * - hw_mode_index: The HW_Mode field is a enumerated type that is selected
8164 * from the HW_Mode table, which is returned in the WMI_SERVICE_READY_EVENTID.
8165 *
8166 * Provides notification to the WLAN firmware that host driver is requesting a
8167 * HardWare (HW) Mode change. This command is needed to support iHelium in the
8168 * configurations that include the Dual Band Simultaneous (DBS) feature.
8169 *
8170 * Return: Success if the cmd is sent successfully to the firmware
8171 */
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05308172QDF_STATUS wma_send_pdev_set_hw_mode_cmd(tp_wma_handle wma_handle,
Dustin Brownec2c92e2017-07-26 11:13:49 -07008173 struct policy_mgr_hw_mode *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008174{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008175 struct sir_set_hw_mode_resp *param;
Tushnim Bhattacharyya86294892017-10-25 16:29:11 -07008176 struct wma_target_req *timeout_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008177
8178 if (!wma_handle) {
8179 WMA_LOGE("%s: WMA handle is NULL. Cannot issue command",
8180 __func__);
8181 /* Handle is NULL. Will not be able to send failure
8182 * response as well
8183 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308184 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008185 }
8186
8187 if (!msg) {
8188 WMA_LOGE("%s: Set HW mode param is NULL", __func__);
8189 /* Lets try to free the active command list */
8190 goto fail;
8191 }
8192
Dustin Brownec2c92e2017-07-26 11:13:49 -07008193 wma_acquire_wakelock(&wma_handle->wmi_cmd_rsp_wake_lock,
8194 WMA_VDEV_HW_MODE_REQUEST_TIMEOUT);
Govind Singhf25a0f12016-03-08 16:09:48 +05308195 if (wmi_unified_soc_set_hw_mode_cmd(wma_handle->wmi_handle,
Dustin Brownec2c92e2017-07-26 11:13:49 -07008196 msg->hw_mode_index)) {
8197 wma_release_wakelock(&wma_handle->wmi_cmd_rsp_wake_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008198 goto fail;
Krunal Sonicebcc292017-06-14 19:59:20 -07008199 }
Tushnim Bhattacharyya86294892017-10-25 16:29:11 -07008200 timeout_msg = wma_fill_hold_req(wma_handle, 0,
8201 SIR_HAL_PDEV_SET_HW_MODE,
8202 WMA_PDEV_SET_HW_MODE_RESP, NULL,
8203 WMA_VDEV_HW_MODE_REQUEST_TIMEOUT - 1);
8204 if (!timeout_msg) {
8205 WMA_LOGE("Failed to allocate request for SIR_HAL_PDEV_SET_HW_MODE");
8206 wma_remove_req(wma_handle, 0, WMA_PDEV_SET_HW_MODE_RESP);
8207 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008208
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308209 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008210fail:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308211 param = qdf_mem_malloc(sizeof(*param));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008212 if (!param) {
8213 WMA_LOGE("%s: Memory allocation failed", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308214 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008215 }
8216 param->status = SET_HW_MODE_STATUS_ECANCELED;
8217 param->cfgd_hw_mode_index = 0;
8218 param->num_vdev_mac_entries = 0;
8219 WMA_LOGE("%s: Sending HW mode fail response to LIM", __func__);
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05308220 wma_send_msg(wma_handle, SIR_HAL_PDEV_SET_HW_MODE_RESP,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008221 (void *) param, 0);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308222 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008223}
8224
8225/**
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05308226 * wma_send_pdev_set_dual_mac_config() - Set dual mac config to FW
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008227 * @wma_handle: WMA handle
8228 * @msg: Dual MAC config parameters
8229 *
8230 * Configures WLAN firmware with the dual MAC features
8231 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308232 * Return: QDF_STATUS. 0 on success.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008233 */
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05308234QDF_STATUS wma_send_pdev_set_dual_mac_config(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008235 struct sir_dual_mac_config *msg)
8236{
Manishekar Chandrasekaran91152df2016-04-25 14:29:27 +05308237 QDF_STATUS status;
8238
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008239 if (!wma_handle) {
8240 WMA_LOGE("%s: WMA handle is NULL. Cannot issue command",
8241 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308242 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008243 }
8244
8245 if (!msg) {
8246 WMA_LOGE("%s: Set dual mode config is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308247 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008248 }
8249
Krunal Sonia5ccb802017-07-03 12:59:40 -07008250 /*
8251 * aquire the wake lock here and release it in response handler function
8252 * In error condition, release the wake lock right away
8253 */
8254 wma_acquire_wakelock(&wma_handle->wmi_cmd_rsp_wake_lock,
8255 WMA_VDEV_PLCY_MGR_CMD_TIMEOUT);
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05308256 status = wmi_unified_pdev_set_dual_mac_config_cmd(
8257 wma_handle->wmi_handle,
Manishekar Chandrasekaran91152df2016-04-25 14:29:27 +05308258 (struct wmi_dual_mac_config *)msg);
8259 if (QDF_IS_STATUS_ERROR(status)) {
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05308260 WMA_LOGE("%s: Failed to send WMI_PDEV_SET_DUAL_MAC_CONFIG_CMDID: %d",
Manishekar Chandrasekaran91152df2016-04-25 14:29:27 +05308261 __func__, status);
Krunal Sonia5ccb802017-07-03 12:59:40 -07008262 wma_release_wakelock(&wma_handle->wmi_cmd_rsp_wake_lock);
Manishekar Chandrasekaran91152df2016-04-25 14:29:27 +05308263 return status;
8264 }
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07008265 policy_mgr_update_dbs_req_config(wma_handle->psoc,
8266 msg->scan_config, msg->fw_mode_config);
Govind Singhf25a0f12016-03-08 16:09:48 +05308267
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308268 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008269}
8270
8271/**
Archana Ramachandrana20ef812015-11-13 16:12:13 -08008272 * wma_send_pdev_set_antenna_mode() - Set antenna mode to FW
8273 * @wma_handle: WMA handle
8274 * @msg: Antenna mode parameters
8275 *
8276 * Send WMI_PDEV_SET_ANTENNA_MODE_CMDID to FW requesting to
8277 * modify the number of TX/RX chains from host
8278 *
8279 * Return: QDF_STATUS. 0 on success.
8280 */
8281QDF_STATUS wma_send_pdev_set_antenna_mode(tp_wma_handle wma_handle,
8282 struct sir_antenna_mode_param *msg)
8283{
8284 wmi_pdev_set_antenna_mode_cmd_fixed_param *cmd;
8285 wmi_buf_t buf;
8286 uint32_t len;
8287 QDF_STATUS status = QDF_STATUS_SUCCESS;
8288 struct sir_antenna_mode_resp *param;
8289
8290 if (!wma_handle) {
8291 WMA_LOGE("%s: WMA handle is NULL. Cannot issue command",
8292 __func__);
8293 return QDF_STATUS_E_NULL_VALUE;
8294 }
8295
8296 if (!msg) {
8297 WMA_LOGE("%s: Set antenna mode param is NULL", __func__);
8298 return QDF_STATUS_E_NULL_VALUE;
8299 }
8300
8301 len = sizeof(*cmd);
8302
8303 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
8304 if (!buf) {
8305 WMA_LOGE("%s: wmi_buf_alloc failed", __func__);
8306 status = QDF_STATUS_E_NOMEM;
8307 goto resp;
8308 }
8309
8310 cmd = (wmi_pdev_set_antenna_mode_cmd_fixed_param *) wmi_buf_data(buf);
8311 WMITLV_SET_HDR(&cmd->tlv_header,
8312 WMITLV_TAG_STRUC_wmi_pdev_set_antenna_mode_cmd_fixed_param,
8313 WMITLV_GET_STRUCT_TLVLEN(
8314 wmi_pdev_set_antenna_mode_cmd_fixed_param));
8315
8316 cmd->pdev_id = WMI_PDEV_ID_SOC;
8317 /* Bits 0-15 is num of RX chains 16-31 is num of TX chains */
8318 cmd->num_txrx_chains = msg->num_rx_chains;
8319 cmd->num_txrx_chains |= (msg->num_tx_chains << 16);
8320
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07008321 WMA_LOGD("%s: Num of chains TX: %d RX: %d txrx_chains: 0x%x",
Archana Ramachandrana20ef812015-11-13 16:12:13 -08008322 __func__, msg->num_tx_chains,
8323 msg->num_rx_chains, cmd->num_txrx_chains);
8324
8325 if (wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
8326 WMI_PDEV_SET_ANTENNA_MODE_CMDID)) {
8327 WMA_LOGE("%s: Failed to send WMI_PDEV_SET_ANTENNA_MODE_CMDID",
8328 __func__);
8329 wmi_buf_free(buf);
8330 status = QDF_STATUS_E_FAILURE;
8331 goto resp;
8332 }
8333 status = QDF_STATUS_SUCCESS;
8334
8335resp:
8336 param = qdf_mem_malloc(sizeof(*param));
8337 if (!param) {
8338 WMA_LOGE("%s: Memory allocation failed", __func__);
8339 return QDF_STATUS_E_NOMEM;
8340 }
8341 param->status = (status) ?
8342 SET_ANTENNA_MODE_STATUS_ECANCELED :
8343 SET_ANTENNA_MODE_STATUS_OK;
8344 WMA_LOGE("%s: Send antenna mode resp to LIM status: %d",
8345 __func__, param->status);
8346 wma_send_msg(wma_handle, SIR_HAL_SOC_ANTENNA_MODE_RESP,
8347 (void *) param, 0);
8348 return status;
8349}
8350
8351/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008352 * wma_crash_inject() - sends command to FW to simulate crash
8353 * @wma_handle: pointer of WMA context
8354 * @type: subtype of the command
8355 * @delay_time_ms: time in milliseconds for FW to delay the crash
8356 *
8357 * This function will send a command to FW in order to simulate different
8358 * kinds of FW crashes.
8359 *
Govind Singhd76a5b02016-03-08 15:12:14 +05308360 * Return: QDF_STATUS_SUCCESS for success or error code
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008361 */
Yu Wang46082dc2017-09-19 12:25:38 +08008362QDF_STATUS wma_crash_inject(WMA_HANDLE wma_handle, uint32_t type,
8363 uint32_t delay_time_ms)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008364{
Govind Singhd76a5b02016-03-08 15:12:14 +05308365 struct crash_inject param;
Yu Wang46082dc2017-09-19 12:25:38 +08008366 tp_wma_handle wma = (tp_wma_handle)wma_handle;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07008367
Govind Singhd76a5b02016-03-08 15:12:14 +05308368 param.type = type;
8369 param.delay_time_ms = delay_time_ms;
Yu Wang46082dc2017-09-19 12:25:38 +08008370 return wmi_crash_inject(wma->wmi_handle, &param);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008371}
Govind Singhd76a5b02016-03-08 15:12:14 +05308372
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008373#if defined(FEATURE_LRO)
8374/**
8375 * wma_lro_init() - sends LRO configuration to FW
8376 * @lro_config: pointer to the config parameters
8377 *
8378 * This function ends LRO configuration to FW.
8379 *
8380 * Return: 0 for success or reasons for failure
8381 */
Dhanashri Atre09828f12016-11-13 10:36:58 -08008382int wma_lro_init(struct cdp_lro_hash_config *lro_config)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008383{
Rajeev Kumarb60abe42017-01-21 15:39:31 -08008384 struct scheduler_msg msg = {0};
Dhanashri Atre09828f12016-11-13 10:36:58 -08008385 struct cdp_lro_hash_config *iwcmd;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008386
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308387 iwcmd = qdf_mem_malloc(sizeof(*iwcmd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008388 if (!iwcmd) {
8389 WMA_LOGE("memory allocation for WMA_LRO_CONFIG_CMD failed!");
8390 return -ENOMEM;
8391 }
8392
8393 *iwcmd = *lro_config;
8394
8395 msg.type = WMA_LRO_CONFIG_CMD;
8396 msg.reserved = 0;
8397 msg.bodyptr = iwcmd;
8398
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308399 if (QDF_STATUS_SUCCESS !=
Rajeev Kumarb60abe42017-01-21 15:39:31 -08008400 scheduler_post_msg(QDF_MODULE_ID_WMA, &msg)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008401 WMA_LOGE("Failed to post WMA_LRO_CONFIG_CMD msg!");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308402 qdf_mem_free(iwcmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008403 return -EAGAIN;
8404 }
8405
8406 WMA_LOGD("sending the LRO configuration to the fw");
8407 return 0;
8408}
8409#endif
Leo Chang96464902016-10-28 11:10:54 -07008410
8411void wma_peer_set_default_routing(void *scn_handle, uint8_t *peer_macaddr,
8412 uint8_t vdev_id, bool hash_based, uint8_t ring_num)
8413{
8414 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
8415 struct peer_set_params param;
8416
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05308417 if (!wma) {
8418 WMA_LOGE("%s:wma_handle is NULL", __func__);
8419 return;
8420 }
Leo Chang96464902016-10-28 11:10:54 -07008421
8422 /* TODO: Need bit definitions for ring number and hash based routing
8423 * fields in common wmi header file
8424 */
8425 param.param_id = WMI_HOST_PEER_SET_DEFAULT_ROUTING;
8426 param.vdev_id = vdev_id;
8427 param.param_value = ((hash_based) ? 1 : 0) | (ring_num << 1);
Jeff Johnsonf7ca9642017-10-10 16:11:49 -07008428 WMA_LOGD("%s: param_value 0x%x", __func__, param.param_value);
Leo Chang96464902016-10-28 11:10:54 -07008429 wmi_set_peer_param_send(wma->wmi_handle, peer_macaddr, &param);
Leo Chang96464902016-10-28 11:10:54 -07008430}
8431
8432int wma_peer_rx_reorder_queue_setup(void *scn_handle,
8433 uint8_t vdev_id, uint8_t *peer_macaddr, qdf_dma_addr_t hw_qdesc,
8434 int tid, uint16_t queue_no)
8435{
8436 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
8437 struct rx_reorder_queue_setup_params param;
8438
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05308439 if (!wma) {
8440 WMA_LOGE("%s:wma_handle is NULL", __func__);
8441 return QDF_STATUS_E_FAILURE;
8442 }
8443
Leo Chang96464902016-10-28 11:10:54 -07008444 param.tid = tid;
8445 param.vdev_id = vdev_id;
8446 param.peer_macaddr = peer_macaddr;
8447 param.hw_qdesc_paddr_lo = hw_qdesc & 0xffffffff;
8448 param.hw_qdesc_paddr_hi = (uint64_t)hw_qdesc >> 32;
8449 param.queue_no = queue_no;
8450
8451 return wmi_unified_peer_rx_reorder_queue_setup_send(wma->wmi_handle,
8452 &param);
8453}
8454
8455int wma_peer_rx_reorder_queue_remove(void *scn_handle,
8456 uint8_t vdev_id, uint8_t *peer_macaddr, uint32_t peer_tid_bitmap)
8457{
8458 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
8459 struct rx_reorder_queue_remove_params param;
8460
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05308461 if (!wma) {
8462 WMA_LOGE("%s:wma_handle is NULL", __func__);
8463 return QDF_STATUS_E_FAILURE;
8464 }
8465
Leo Chang96464902016-10-28 11:10:54 -07008466 param.vdev_id = vdev_id;
8467 param.peer_macaddr = peer_macaddr;
8468 param.peer_tid_bitmap = peer_tid_bitmap;
8469
8470 return wmi_unified_peer_rx_reorder_queue_remove_send(wma->wmi_handle,
8471 &param);
8472}
8473
Ashish Kumar Dhanotiyab28338c2017-07-21 20:12:34 +05308474QDF_STATUS wma_configure_smps_params(uint32_t vdev_id, uint32_t param_id,
8475 uint32_t param_val)
8476{
8477 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
8478 int smps_cmd_value;
8479 int status = QDF_STATUS_E_INVAL;
8480
8481 if (!wma) {
8482 WMA_LOGE("%s: Failed to get wma", __func__);
8483 return status;
8484 }
8485
8486 smps_cmd_value = param_id << WMI_SMPS_PARAM_VALUE_S;
8487 smps_cmd_value = smps_cmd_value | param_val;
8488
8489 status = wma_set_smps_params(wma, vdev_id, smps_cmd_value);
8490 if (status)
8491 WMA_LOGE("Failed to set SMPS Param");
8492
8493 return status;
8494}
8495
Leo Chang96464902016-10-28 11:10:54 -07008496
Sandeep Puligillaf587adf2017-04-27 19:53:21 -07008497void wma_ipa_uc_stat_request(wma_cli_set_cmd_t *privcmd)
8498{
8499 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
8500
Sreelakshmi Konamki7a574082017-05-15 16:53:45 +05308501 if (!wma) {
8502 WMA_LOGE("%s: Failed to get wma", __func__);
8503 return;
8504 }
8505
Sandeep Puligillaf587adf2017-04-27 19:53:21 -07008506 if (wma_set_priv_cfg(wma, privcmd))
8507 WMA_LOGE("Failed to set wma priv congiuration");
8508}
Nachiket Kukadeaaf8a712017-07-27 19:15:36 +05308509
8510/**
8511 * wma_config_bmiss_bcnt_params() - set bmiss config parameters
8512 * @vdev_id: virtual device for the command
8513 * @first_cnt: bmiss first value
8514 * @final_cnt: bmiss final value
8515 *
8516 * Return: QDF_STATUS_SUCCESS or non-zero on failure
8517 */
8518QDF_STATUS wma_config_bmiss_bcnt_params(uint32_t vdev_id, uint32_t first_cnt,
8519 uint32_t final_cnt)
8520{
8521 tp_wma_handle wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
8522 int status = QDF_STATUS_E_INVAL;
8523
8524 if (!wma_handle) {
8525 WMA_LOGE("%s: Failed to get wma", __func__);
8526 return status;
8527 }
8528
8529 status = wma_roam_scan_bmiss_cnt(wma_handle, first_cnt, final_cnt,
8530 vdev_id);
8531
8532 if (status)
8533 WMA_LOGE("Failed to set Bmiss Param");
8534
8535 return status;
8536}
8537