blob: 94c1767200caa2263145e2c778dcfca3addf1016 [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
57#include "wma_types.h"
58#include "lim_api.h"
59#include "lim_session_utils.h"
60
61#include "cds_utils.h"
62
63#if !defined(REMOVE_PKT_LOG)
64#include "pktlog_ac.h"
65#endif /* REMOVE_PKT_LOG */
66
67#include "dbglog_host.h"
Govind Singhd76a5b02016-03-08 15:12:14 +053068#include "wmi_version_whitelist.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080069#include "csr_api.h"
70#include "ol_fw.h"
71
72#include "dfs.h"
73#include "wma_internal.h"
74
75#include "wma_ocb.h"
Chandrasekaran, Manishekar0d814c72015-11-05 10:42:48 +053076#include "cds_concurrency.h"
Dhanashri Atreb08959a2016-03-01 17:28:03 -080077#include "cdp_txrx_cfg.h"
78#include "cdp_txrx_flow_ctrl_legacy.h"
79#include "cdp_txrx_flow_ctrl_v2.h"
80#include "cdp_txrx_ipa.h"
Leo Chang96464902016-10-28 11:10:54 -070081#include "cdp_txrx_misc.h"
Deepak Dhamdhere13230d32016-05-26 00:46:53 -070082#include "wma_nan_datapath.h"
Frank Liu65b17d92016-11-23 15:58:44 +080083#include "wlan_lmac_if_def.h"
84#include "wlan_lmac_if_api.h"
Mukul Sharmac3e7a782017-02-03 12:16:11 +053085#include "target_if.h"
Mukul Sharmadad267e2017-02-04 13:25:34 +053086#include "wlan_global_lmac_if_api.h"
Mukul Sharma3d36c392017-01-18 18:39:12 +053087#include "target_if_pmo.h"
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -070088#include "wma_he.h"
Frank Liu65b17d92016-11-23 15:58:44 +080089
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -080090#include <cdp_txrx_handle.h>
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080091#define WMA_LOG_COMPLETION_TIMER 10000 /* 10 seconds */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080092
Rajeev Kumar Sirasanagandla47873002016-09-09 13:46:09 +053093#define WMI_TLV_HEADROOM 128
94
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080095static uint32_t g_fw_wlan_feat_caps;
96
97/**
98 * wma_get_fw_wlan_feat_caps() - get fw feature capablity
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -070099 * @feature: feature enum value
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800100 *
101 * Return: true/false
102 */
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -0700103bool wma_get_fw_wlan_feat_caps(enum cap_bitmap feature)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800104{
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -0700105 return (g_fw_wlan_feat_caps & (1 << feature)) ? true : false;
106}
107
108/**
109 * wma_set_fw_wlan_feat_caps() - set fw feature capablity
110 * @feature: feature enum value
111 *
112 * Return: None
113 */
114void wma_set_fw_wlan_feat_caps(enum cap_bitmap feature)
115{
116 g_fw_wlan_feat_caps |= (1 << feature);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800117}
118
119/**
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +0530120 * wma_service_ready_ext_evt_timeout() - Service ready extended event timeout
121 * @data: Timeout handler data
122 *
123 * This function is called when the FW fails to send WMI_SERVICE_READY_EXT_EVENT
124 * message
125 *
126 * Return: None
127 */
128static void wma_service_ready_ext_evt_timeout(void *data)
129{
130 tp_wma_handle wma_handle;
131
132 WMA_LOGA("%s: Timeout waiting for WMI_SERVICE_READY_EXT_EVENT",
133 __func__);
134
135 wma_handle = (tp_wma_handle) data;
136
137 if (!wma_handle) {
138 WMA_LOGE("%s: Invalid WMA handle", __func__);
139 goto end;
140 }
141
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +0530142end:
Naveen Rawatac39a102016-10-07 10:58:29 -0700143 /* Assert here. Panic is being called in insmod thread */
144 QDF_ASSERT(0);
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +0530145}
146
147/**
Komal Seelam02d09342016-02-23 18:03:19 +0530148 * wma_get_ini_handle() - API to get WMA ini info handle
149 * @wma: WMA Handle
150 *
151 * Returns the pointer to WMA ini structure.
152 * Return: struct wma_ini_config
153 */
154struct wma_ini_config *wma_get_ini_handle(tp_wma_handle wma)
155{
156 if (!wma) {
157 WMA_LOGE("%s: Invalid WMA context\n", __func__);
158 return NULL;
159 }
160
161 return &wma->ini_config;
162}
163
164#define MAX_SUPPORTED_PEERS_REV1_1 14
165#define MAX_SUPPORTED_PEERS_REV1_3 32
166#define MIN_NO_OF_PEERS 1
167
168/**
169 * wma_get_number_of_peers_supported - API to query for number of peers
170 * supported
171 * @wma: WMA Handle
172 *
173 * Return: Max Number of Peers Supported
174 */
175static uint8_t wma_get_number_of_peers_supported(tp_wma_handle wma)
176{
177 struct hif_target_info *tgt_info;
178 struct wma_ini_config *cfg = wma_get_ini_handle(wma);
179 uint8_t max_no_of_peers = cfg ? cfg->max_no_of_peers : MIN_NO_OF_PEERS;
Anurag Chouhan6d760662016-02-20 16:05:43 +0530180 struct hif_opaque_softc *scn = cds_get_context(QDF_MODULE_ID_HIF);
Komal Seelam02d09342016-02-23 18:03:19 +0530181
182 if (!scn) {
183 WMA_LOGE("%s: Invalid wma handle", __func__);
184 return 0;
185 }
186
187 tgt_info = hif_get_target_info_handle(scn);
188
189 switch (tgt_info->target_version) {
190 case AR6320_REV1_1_VERSION:
191 if (max_no_of_peers > MAX_SUPPORTED_PEERS_REV1_1)
192 max_no_of_peers = MAX_SUPPORTED_PEERS_REV1_1;
193 break;
194 default:
195 if (max_no_of_peers > MAX_SUPPORTED_PEERS_REV1_3)
196 max_no_of_peers = MAX_SUPPORTED_PEERS_REV1_3;
197 break;
198 }
199
200 return max_no_of_peers;
201}
202
203/**
bings6b3614e2017-02-21 10:18:36 +0800204 * wma_get_number_of_tids_supported - API to query for number of tids supported
205 * @no_of_peers_supported: Number of peer supported
206 *
207 * Return: Max number of tids supported
208 */
209#if defined(CONFIG_HL_SUPPORT)
210static uint32_t wma_get_number_of_tids_supported(uint8_t no_of_peers_supported)
211{
212 return 4 * no_of_peers_supported;
213}
214#else
215static uint32_t wma_get_number_of_tids_supported(uint8_t no_of_peers_supported)
216{
217 return 2 * (no_of_peers_supported + CFG_TGT_NUM_VDEV + 2);
218}
219#endif
220
221/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800222 * wma_set_default_tgt_config() - set default tgt config
223 * @wma_handle: wma handle
224 *
225 * Return: none
226 */
227static void wma_set_default_tgt_config(tp_wma_handle wma_handle)
228{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800229 uint8_t no_of_peers_supported;
230 wmi_resource_config tgt_cfg = {
231 0, /* Filling zero for TLV Tag and Length fields */
232 CFG_TGT_NUM_VDEV,
233 CFG_TGT_NUM_PEERS + CFG_TGT_NUM_VDEV + 2,
234 CFG_TGT_NUM_OFFLOAD_PEERS,
235 CFG_TGT_NUM_OFFLOAD_REORDER_BUFFS,
236 CFG_TGT_NUM_PEER_KEYS,
237 CFG_TGT_NUM_TIDS,
238 CFG_TGT_AST_SKID_LIMIT,
239 CFG_TGT_DEFAULT_TX_CHAIN_MASK,
240 CFG_TGT_DEFAULT_RX_CHAIN_MASK,
241 {CFG_TGT_RX_TIMEOUT_LO_PRI, CFG_TGT_RX_TIMEOUT_LO_PRI,
242 CFG_TGT_RX_TIMEOUT_LO_PRI, CFG_TGT_RX_TIMEOUT_HI_PRI},
243 CFG_TGT_RX_DECAP_MODE,
244 CFG_TGT_DEFAULT_SCAN_MAX_REQS,
245 CFG_TGT_DEFAULT_BMISS_OFFLOAD_MAX_VDEV,
246 CFG_TGT_DEFAULT_ROAM_OFFLOAD_MAX_VDEV,
247 CFG_TGT_DEFAULT_ROAM_OFFLOAD_MAX_PROFILES,
248 CFG_TGT_DEFAULT_NUM_MCAST_GROUPS,
249 CFG_TGT_DEFAULT_NUM_MCAST_TABLE_ELEMS,
250 CFG_TGT_DEFAULT_MCAST2UCAST_MODE,
251 CFG_TGT_DEFAULT_TX_DBG_LOG_SIZE,
252 CFG_TGT_WDS_ENTRIES,
253 CFG_TGT_DEFAULT_DMA_BURST_SIZE,
254 CFG_TGT_DEFAULT_MAC_AGGR_DELIM,
255 CFG_TGT_DEFAULT_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK,
256 CFG_TGT_DEFAULT_VOW_CONFIG,
257 CFG_TGT_DEFAULT_GTK_OFFLOAD_MAX_VDEV,
258 CFG_TGT_NUM_MSDU_DESC,
259 CFG_TGT_MAX_FRAG_TABLE_ENTRIES,
260 CFG_TGT_NUM_TDLS_VDEVS,
261 CFG_TGT_NUM_TDLS_CONN_TABLE_ENTRIES,
262 CFG_TGT_DEFAULT_BEACON_TX_OFFLOAD_MAX_VDEV,
263 CFG_TGT_MAX_MULTICAST_FILTER_ENTRIES,
264 0,
265 0,
266 0,
267 CFG_TGT_NUM_TDLS_CONC_SLEEP_STAS,
268 CFG_TGT_NUM_TDLS_CONC_BUFFER_STAS,
269 0,
270 CFG_TGT_NUM_OCB_VDEVS,
271 CFG_TGT_NUM_OCB_CHANNELS,
272 CFG_TGT_NUM_OCB_SCHEDULES,
273 };
274
Komal Seelam02d09342016-02-23 18:03:19 +0530275 no_of_peers_supported = wma_get_number_of_peers_supported(wma_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800276 tgt_cfg.num_peers = no_of_peers_supported + CFG_TGT_NUM_VDEV + 2;
bings6b3614e2017-02-21 10:18:36 +0800277 tgt_cfg.num_tids = wma_get_number_of_tids_supported(
278 no_of_peers_supported);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800279 tgt_cfg.scan_max_pending_req = wma_handle->max_scan;
280
Nirav Shah20489972016-06-16 19:20:28 +0530281 WMI_RSRC_CFG_FLAG_MGMT_COMP_EVT_BUNDLE_SUPPORT_SET(tgt_cfg.flag1, 1);
Yun Park4d968df2016-10-11 11:44:15 -0700282 WMI_RSRC_CFG_FLAG_TX_MSDU_ID_NEW_PARTITION_SUPPORT_SET(tgt_cfg.flag1,
283 1);
Nirav Shah20489972016-06-16 19:20:28 +0530284
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800285 WMITLV_SET_HDR(&tgt_cfg.tlv_header,
286 WMITLV_TAG_STRUC_wmi_resource_config,
287 WMITLV_GET_STRUCT_TLVLEN(wmi_resource_config));
288 /* reduce the peer/vdev if CFG_TGT_NUM_MSDU_DESC exceeds 1000 */
289#ifdef PERE_IP_HDR_ALIGNMENT_WAR
290 if (scn->host_80211_enable) {
291 /*
292 * To make the IP header begins at dword aligned address,
293 * we make the decapsulation mode as Native Wifi.
294 */
295 tgt_cfg.rx_decap_mode = CFG_TGT_RX_DECAP_MODE_NWIFI;
296 }
297#endif /* PERE_IP_HDR_ALIGNMENT_WAR */
Manjunathappa Prakash0e6e6b52016-04-21 11:48:48 -0700298 if (QDF_GLOBAL_MONITOR_MODE == cds_get_conparam())
299 tgt_cfg.rx_decap_mode = CFG_TGT_RX_DECAP_MODE_RAW;
300
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800301 wma_handle->wlan_resource_config = tgt_cfg;
302}
303
304/**
305 * wma_cli_get_command() - WMA "get" command processor
306 * @vdev_id: virtual device for the command
307 * @param_id: parameter id
308 * @vpdev: parameter category
309 *
310 * Return: parameter value on success, -EINVAL on failure
311 */
312int wma_cli_get_command(int vdev_id, int param_id, int vpdev)
313{
314 int ret = 0;
315 tp_wma_handle wma;
316 struct wma_txrx_node *intr = NULL;
317
Anurag Chouhan6d760662016-02-20 16:05:43 +0530318 wma = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800319
320 if (NULL == wma) {
321 WMA_LOGE("%s: Invalid wma handle", __func__);
322 return -EINVAL;
323 }
324
325 intr = wma->interfaces;
326
327 if (VDEV_CMD == vpdev) {
328 switch (param_id) {
329 case WMI_VDEV_PARAM_NSS:
330 ret = intr[vdev_id].config.nss;
331 break;
332#ifdef QCA_SUPPORT_GTX
333 case WMI_VDEV_PARAM_GTX_HT_MCS:
334 ret = intr[vdev_id].config.gtx_info.gtxRTMask[0];
335 break;
336 case WMI_VDEV_PARAM_GTX_VHT_MCS:
337 ret = intr[vdev_id].config.gtx_info.gtxRTMask[1];
338 break;
339 case WMI_VDEV_PARAM_GTX_USR_CFG:
340 ret = intr[vdev_id].config.gtx_info.gtxUsrcfg;
341 break;
342 case WMI_VDEV_PARAM_GTX_THRE:
343 ret = intr[vdev_id].config.gtx_info.gtxPERThreshold;
344 break;
345 case WMI_VDEV_PARAM_GTX_MARGIN:
346 ret = intr[vdev_id].config.gtx_info.gtxPERMargin;
347 break;
348 case WMI_VDEV_PARAM_GTX_STEP:
349 ret = intr[vdev_id].config.gtx_info.gtxTPCstep;
350 break;
351 case WMI_VDEV_PARAM_GTX_MINTPC:
352 ret = intr[vdev_id].config.gtx_info.gtxTPCMin;
353 break;
354 case WMI_VDEV_PARAM_GTX_BW_MASK:
355 ret = intr[vdev_id].config.gtx_info.gtxBWMask;
356 break;
357#endif /* QCA_SUPPORT_GTX */
358 case WMI_VDEV_PARAM_LDPC:
359 ret = intr[vdev_id].config.ldpc;
360 break;
361 case WMI_VDEV_PARAM_TX_STBC:
362 ret = intr[vdev_id].config.tx_stbc;
363 break;
364 case WMI_VDEV_PARAM_RX_STBC:
365 ret = intr[vdev_id].config.rx_stbc;
366 break;
367 case WMI_VDEV_PARAM_SGI:
368 ret = intr[vdev_id].config.shortgi;
369 break;
370 case WMI_VDEV_PARAM_ENABLE_RTSCTS:
371 ret = intr[vdev_id].config.rtscts_en;
372 break;
373 case WMI_VDEV_PARAM_CHWIDTH:
374 ret = intr[vdev_id].config.chwidth;
375 break;
376 case WMI_VDEV_PARAM_FIXED_RATE:
377 ret = intr[vdev_id].config.tx_rate;
378 break;
379 default:
380 WMA_LOGE("Invalid cli_get vdev command/Not"
381 " yet implemented 0x%x", param_id);
382 return -EINVAL;
383 }
384 } else if (PDEV_CMD == vpdev) {
385 switch (param_id) {
386 case WMI_PDEV_PARAM_ANI_ENABLE:
387 ret = wma->pdevconfig.ani_enable;
388 break;
389 case WMI_PDEV_PARAM_ANI_POLL_PERIOD:
390 ret = wma->pdevconfig.ani_poll_len;
391 break;
392 case WMI_PDEV_PARAM_ANI_LISTEN_PERIOD:
393 ret = wma->pdevconfig.ani_listen_len;
394 break;
395 case WMI_PDEV_PARAM_ANI_OFDM_LEVEL:
396 ret = wma->pdevconfig.ani_ofdm_level;
397 break;
398 case WMI_PDEV_PARAM_ANI_CCK_LEVEL:
399 ret = wma->pdevconfig.ani_cck_level;
400 break;
401 case WMI_PDEV_PARAM_DYNAMIC_BW:
402 ret = wma->pdevconfig.cwmenable;
403 break;
404 case WMI_PDEV_PARAM_CTS_CBW:
405 ret = wma->pdevconfig.cts_cbw;
406 break;
407 case WMI_PDEV_PARAM_TX_CHAIN_MASK:
408 ret = wma->pdevconfig.txchainmask;
409 break;
410 case WMI_PDEV_PARAM_RX_CHAIN_MASK:
411 ret = wma->pdevconfig.rxchainmask;
412 break;
413 case WMI_PDEV_PARAM_TXPOWER_LIMIT2G:
414 ret = wma->pdevconfig.txpow2g;
415 break;
416 case WMI_PDEV_PARAM_TXPOWER_LIMIT5G:
417 ret = wma->pdevconfig.txpow5g;
418 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800419 case WMI_PDEV_PARAM_BURST_ENABLE:
420 ret = wma->pdevconfig.burst_enable;
421 break;
422 case WMI_PDEV_PARAM_BURST_DUR:
423 ret = wma->pdevconfig.burst_dur;
424 break;
425 default:
426 WMA_LOGE("Invalid cli_get pdev command/Not"
427 " yet implemented 0x%x", param_id);
428 return -EINVAL;
429 }
430 } else if (GEN_CMD == vpdev) {
431 switch (param_id) {
432 case GEN_VDEV_PARAM_AMPDU:
433 ret = intr[vdev_id].config.ampdu;
434 break;
435 case GEN_VDEV_PARAM_AMSDU:
436 ret = intr[vdev_id].config.amsdu;
437 break;
Varun Reddy Yeturu5ab47462016-05-08 18:08:11 -0700438 case GEN_VDEV_ROAM_SYNCH_DELAY:
439 ret = intr[vdev_id].roam_synch_delay;
440 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800441 default:
442 WMA_LOGE("Invalid generic vdev command/Not"
443 " yet implemented 0x%x", param_id);
444 return -EINVAL;
445 }
446 } else if (PPS_CMD == vpdev) {
447 switch (param_id) {
448 case WMI_VDEV_PPS_PAID_MATCH:
449 ret = intr[vdev_id].config.pps_params.paid_match_enable;
450 break;
451 case WMI_VDEV_PPS_GID_MATCH:
452 ret = intr[vdev_id].config.pps_params.gid_match_enable;
453 break;
454 case WMI_VDEV_PPS_EARLY_TIM_CLEAR:
455 ret = intr[vdev_id].config.pps_params.tim_clear;
456 break;
457 case WMI_VDEV_PPS_EARLY_DTIM_CLEAR:
458 ret = intr[vdev_id].config.pps_params.dtim_clear;
459 break;
460 case WMI_VDEV_PPS_EOF_PAD_DELIM:
461 ret = intr[vdev_id].config.pps_params.eof_delim;
462 break;
463 case WMI_VDEV_PPS_MACADDR_MISMATCH:
464 ret = intr[vdev_id].config.pps_params.mac_match;
465 break;
466 case WMI_VDEV_PPS_DELIM_CRC_FAIL:
467 ret = intr[vdev_id].config.pps_params.delim_fail;
468 break;
469 case WMI_VDEV_PPS_GID_NSTS_ZERO:
470 ret = intr[vdev_id].config.pps_params.nsts_zero;
471 break;
472 case WMI_VDEV_PPS_RSSI_CHECK:
473 ret = intr[vdev_id].config.pps_params.rssi_chk;
474 break;
475 default:
476 WMA_LOGE("Invalid pps vdev command/Not"
477 " yet implemented 0x%x", param_id);
478 return -EINVAL;
479 }
480 } else if (QPOWER_CMD == vpdev) {
481 switch (param_id) {
482 case WMI_STA_PS_PARAM_QPOWER_PSPOLL_COUNT:
483 ret = intr[vdev_id].config.qpower_params.
484 max_ps_poll_cnt;
485 break;
486 case WMI_STA_PS_PARAM_QPOWER_MAX_TX_BEFORE_WAKE:
487 ret = intr[vdev_id].config.qpower_params.
488 max_tx_before_wake;
489 break;
490 case WMI_STA_PS_PARAM_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL:
491 ret = intr[vdev_id].config.qpower_params.
492 spec_ps_poll_wake_interval;
493 break;
494 case WMI_STA_PS_PARAM_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL:
495 ret = intr[vdev_id].config.qpower_params.
496 max_spec_nodata_ps_poll;
497 break;
498 default:
499 WMA_LOGE("Invalid generic vdev command/Not"
500 " yet implemented 0x%x", param_id);
501 return -EINVAL;
502 }
503 } else if (GTX_CMD == vpdev) {
504 switch (param_id) {
505 case WMI_VDEV_PARAM_GTX_HT_MCS:
506 ret = intr[vdev_id].config.gtx_info.gtxRTMask[0];
507 break;
508 case WMI_VDEV_PARAM_GTX_VHT_MCS:
509 ret = intr[vdev_id].config.gtx_info.gtxRTMask[1];
510 break;
511 case WMI_VDEV_PARAM_GTX_USR_CFG:
512 ret = intr[vdev_id].config.gtx_info.gtxUsrcfg;
513 break;
514 case WMI_VDEV_PARAM_GTX_THRE:
515 ret = intr[vdev_id].config.gtx_info.gtxPERThreshold;
516 break;
517 case WMI_VDEV_PARAM_GTX_MARGIN:
518 ret = intr[vdev_id].config.gtx_info.gtxPERMargin;
519 break;
520 case WMI_VDEV_PARAM_GTX_STEP:
521 ret = intr[vdev_id].config.gtx_info.gtxTPCstep;
522 break;
523 case WMI_VDEV_PARAM_GTX_MINTPC:
524 ret = intr[vdev_id].config.gtx_info.gtxTPCMin;
525 break;
526 case WMI_VDEV_PARAM_GTX_BW_MASK:
527 ret = intr[vdev_id].config.gtx_info.gtxBWMask;
528 break;
529 default:
530 WMA_LOGE("Invalid generic vdev command/Not"
531 " yet implemented 0x%x", param_id);
532 return -EINVAL;
533 }
534 }
535 return ret;
536}
537
538/**
539 * wma_cli_set2_command() - WMA "set 2 params" command processor
540 * @vdev_id: virtual device for the command
541 * @param_id: parameter id
542 * @sval1: first parameter value
543 * @sval2: second parameter value
544 * @vpdev: parameter category
545 *
546 * Command handler for set operations which require 2 parameters
547 *
548 * Return: 0 on success, errno on failure
549 */
550int wma_cli_set2_command(int vdev_id, int param_id, int sval1,
551 int sval2, int vpdev)
552{
Rajeev Kumarb60abe42017-01-21 15:39:31 -0800553 struct scheduler_msg msg = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800554 wma_cli_set_cmd_t *iwcmd;
555
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530556 iwcmd = qdf_mem_malloc(sizeof(*iwcmd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800557 if (!iwcmd) {
558 WMA_LOGE("%s: Failed alloc memory for iwcmd", __func__);
559 return -ENOMEM;
560 }
561
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530562 qdf_mem_zero(iwcmd, sizeof(*iwcmd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800563 iwcmd->param_value = sval1;
564 iwcmd->param_sec_value = sval2;
565 iwcmd->param_vdev_id = vdev_id;
566 iwcmd->param_id = param_id;
567 iwcmd->param_vp_dev = vpdev;
568 msg.type = WMA_CLI_SET_CMD;
569 msg.reserved = 0;
570 msg.bodyptr = iwcmd;
571
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530572 if (QDF_STATUS_SUCCESS !=
Rajeev Kumarb60abe42017-01-21 15:39:31 -0800573 scheduler_post_msg(QDF_MODULE_ID_WMA, &msg)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800574 WMA_LOGP("%s: Failed to post WMA_CLI_SET_CMD msg",
575 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530576 qdf_mem_free(iwcmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800577 return -EIO;
578 }
579 return 0;
580}
581
582/**
583 * wma_cli_set_command() - WMA "set" command processor
584 * @vdev_id: virtual device for the command
585 * @param_id: parameter id
586 * @sval: parameter value
587 * @vpdev: parameter category
588 *
589 * Command handler for set operations
590 *
591 * Return: 0 on success, errno on failure
592 */
593int wma_cli_set_command(int vdev_id, int param_id, int sval, int vpdev)
594{
595 return wma_cli_set2_command(vdev_id, param_id, sval, 0, vpdev);
596
597}
598
599/**
600 * wma_set_priv_cfg() - set private config parameters
601 * @wma_handle: wma handle
602 * @privcmd: private command
603 *
604 * Return: 0 for success or error code
605 */
606static int32_t wma_set_priv_cfg(tp_wma_handle wma_handle,
607 wma_cli_set_cmd_t *privcmd)
608{
609 int32_t ret = 0;
610
611 switch (privcmd->param_id) {
612 case WMA_VDEV_TXRX_FWSTATS_ENABLE_CMDID:
613 ret = wma_set_txrx_fw_stats_level(wma_handle,
614 privcmd->param_vdev_id,
615 privcmd->param_value);
616 break;
617 case WMA_VDEV_TXRX_FWSTATS_RESET_CMDID:
618 ret = wma_txrx_fw_stats_reset(wma_handle,
619 privcmd->param_vdev_id,
620 privcmd->param_value);
621 break;
622 case WMI_STA_SMPS_FORCE_MODE_CMDID:
Archana Ramachandran20d2e232016-02-11 16:58:40 -0800623 ret = wma_set_mimops(wma_handle,
624 privcmd->param_vdev_id,
625 privcmd->param_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800626 break;
627 case WMI_STA_SMPS_PARAM_CMDID:
628 wma_set_smps_params(wma_handle, privcmd->param_vdev_id,
629 privcmd->param_value);
630 break;
631 case WMA_VDEV_MCC_SET_TIME_LATENCY:
632 {
633 /* Extract first MCC adapter/vdev channel number and latency */
634 uint8_t mcc_channel = privcmd->param_value & 0x000000FF;
635 uint8_t mcc_channel_latency =
636 (privcmd->param_value & 0x0000FF00) >> 8;
637 int ret = -1;
638 WMA_LOGD("%s: Parsed input: Channel #1:%d, latency:%dms",
639 __func__, mcc_channel, mcc_channel_latency);
640 ret = wma_set_mcc_channel_time_latency(wma_handle,
641 mcc_channel,
642 mcc_channel_latency);
643 }
644 break;
645 case WMA_VDEV_MCC_SET_TIME_QUOTA:
646 {
647 /* Extract the MCC 2 adapters/vdevs channel numbers and time
648 * quota value for the first adapter only (which is specified
649 * in iwpriv command.
650 */
651 uint8_t adapter_2_chan_number =
652 privcmd->param_value & 0x000000FF;
653 uint8_t adapter_1_chan_number =
654 (privcmd->param_value & 0x0000FF00) >> 8;
655 uint8_t adapter_1_quota =
656 (privcmd->param_value & 0x00FF0000) >> 16;
657 int ret = -1;
658
659 WMA_LOGD("%s: Parsed input: Channel #1:%d, Channel #2:%d, quota 1:%dms",
660 __func__, adapter_1_chan_number,
661 adapter_2_chan_number, adapter_1_quota);
662
663 ret = wma_set_mcc_channel_time_quota(wma_handle,
664 adapter_1_chan_number,
665 adapter_1_quota,
666 adapter_2_chan_number);
667 }
668 break;
669 case WMA_VDEV_IBSS_SET_ATIM_WINDOW_SIZE:
670 {
671 wma_handle->wma_ibss_power_save_params.atimWindowLength =
672 privcmd->param_value;
673 WMA_LOGD("%s: IBSS power save ATIM Window = %d",
674 __func__, wma_handle->wma_ibss_power_save_params.
675 atimWindowLength);
676 }
677 break;
678 case WMA_VDEV_IBSS_SET_POWER_SAVE_ALLOWED:
679 {
680 wma_handle->wma_ibss_power_save_params.isPowerSaveAllowed =
681 privcmd->param_value;
682 WMA_LOGD("%s: IBSS is Power Save Allowed = %d",
683 __func__, wma_handle->wma_ibss_power_save_params.
684 isPowerSaveAllowed);
685 }
686 break;
687 case WMA_VDEV_IBSS_SET_POWER_COLLAPSE_ALLOWED:
688 {
689 wma_handle->wma_ibss_power_save_params. isPowerCollapseAllowed =
690 privcmd->param_value;
691 WMA_LOGD("%s: IBSS is Power Collapse Allowed = %d",
692 __func__, wma_handle->wma_ibss_power_save_params.
693 isPowerCollapseAllowed);
694 }
695 break;
696 case WMA_VDEV_IBSS_SET_AWAKE_ON_TX_RX:
697 {
698 wma_handle->wma_ibss_power_save_params.isAwakeonTxRxEnabled =
699 privcmd->param_value;
700 WMA_LOGD("%s: IBSS Power Save Awake on Tx/Rx Enabled = %d",
701 __func__, wma_handle->wma_ibss_power_save_params.
702 isAwakeonTxRxEnabled);
703 }
704 break;
705 case WMA_VDEV_IBSS_SET_INACTIVITY_TIME:
706 {
707 wma_handle->wma_ibss_power_save_params.inactivityCount =
708 privcmd->param_value;
709 WMA_LOGD("%s: IBSS Power Save Data Inactivity Count = %d",
710 __func__, wma_handle->wma_ibss_power_save_params.
711 inactivityCount);
712 }
713 break;
714 case WMA_VDEV_IBSS_SET_TXSP_END_INACTIVITY_TIME:
715 {
716 wma_handle->wma_ibss_power_save_params.txSPEndInactivityTime =
717 privcmd->param_value;
718 WMA_LOGD("%s: IBSS Power Save Transmit EOSP inactivity time out = %d",
719 __func__, wma_handle->wma_ibss_power_save_params.
720 txSPEndInactivityTime);
721 }
722 break;
723 case WMA_VDEV_DFS_CONTROL_CMDID:
724 {
725 struct ieee80211com *dfs_ic = wma_handle->dfs_ic;
726 struct ath_dfs *dfs;
727
728 if (!dfs_ic) {
729 ret = -ENOENT;
730 } else {
731 if (dfs_ic->ic_curchan) {
732 WMA_LOGD("%s: Debug cmd: %s received on ch: %d",
733 __func__, "WMA_VDEV_DFS_CONTROL_CMDID",
734 dfs_ic->ic_curchan->ic_ieee);
735
736 if (dfs_ic->ic_curchan->ic_flagext &
737 IEEE80211_CHAN_DFS) {
738 dfs = (struct ath_dfs *)dfs_ic->ic_dfs;
739 dfs->dfs_bangradar = 1;
740 dfs->ath_radar_tasksched = 1;
741 OS_SET_TIMER(&dfs->ath_dfs_task_timer,
742 0);
743 } else {
744 ret = -ENOENT;
745 }
746 } else {
747 ret = -ENOENT;
748 }
749 }
750
751 if (ret == -ENOENT) {
752 WMA_LOGE("%s: Operating channel is not DFS capable,ignoring %s",
753 __func__, "WMA_VDEV_DFS_CONTROL_CMDID");
754 } else if (ret) {
755 WMA_LOGE("%s: Sending command %s failed with %d\n",
756 __func__, "WMA_VDEV_DFS_CONTROL_CMDID",
757 ret);
758 }
759 }
760 break;
761 case WMA_VDEV_IBSS_PS_SET_WARMUP_TIME_SECS:
762 {
763 wma_handle->wma_ibss_power_save_params.ibssPsWarmupTime =
764 privcmd->param_value;
765 WMA_LOGD("%s: IBSS Power Save Warm Up Time in Seconds = %d",
766 __func__, wma_handle->wma_ibss_power_save_params.
767 ibssPsWarmupTime);
768 }
769 break;
770 case WMA_VDEV_IBSS_PS_SET_1RX_CHAIN_IN_ATIM_WINDOW:
771 {
772 wma_handle->wma_ibss_power_save_params.ibssPs1RxChainInAtimEnable
773 = privcmd->param_value;
774 WMA_LOGD("%s: IBSS Power Save single RX Chain Enable In ATIM = %d",
775 __func__, wma_handle->wma_ibss_power_save_params.
776 ibssPs1RxChainInAtimEnable);
777 }
778 break;
779
780 case WMA_VDEV_TXRX_GET_IPA_UC_FW_STATS_CMDID:
781 {
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -0800782 struct cdp_pdev *pdev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800783
Anurag Chouhan6d760662016-02-20 16:05:43 +0530784 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800785 if (!pdev) {
786 WMA_LOGE("pdev NULL for uc stat");
787 return -EINVAL;
788 }
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -0800789 cdp_ipa_get_stat(cds_get_context(QDF_MODULE_ID_SOC),
790 pdev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800791 }
792 break;
793
794 default:
795 WMA_LOGE("Invalid wma config command id:%d", privcmd->param_id);
796 ret = -EINVAL;
797 }
798 return ret;
799}
800
801/**
Kiran Kumar Lokere92fe7592016-09-14 20:15:45 -0700802 * wma_set_dtim_period() - set dtim period to FW
803 * @wma: wma handle
804 * @dtim_params: dtim params
805 *
806 * Return: none
807 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -0700808static void wma_set_dtim_period(tp_wma_handle wma,
809 struct set_dtim_params *dtim_params)
Kiran Kumar Lokere92fe7592016-09-14 20:15:45 -0700810{
811 QDF_STATUS ret;
812 uint8_t vdev_id = dtim_params->session_id;
813 struct wma_txrx_node *iface =
814 &wma->interfaces[vdev_id];
815
816 WMA_LOGI("%s: set dtim_period %d", __func__,
817 dtim_params->dtim_period);
818 iface->dtimPeriod = dtim_params->dtim_period;
819 ret = wma_vdev_set_param(wma->wmi_handle,
820 vdev_id,
821 WMI_VDEV_PARAM_LISTEN_INTERVAL,
822 dtim_params->dtim_period);
823 if (QDF_IS_STATUS_ERROR(ret))
824 WMA_LOGW("Failed to set listen interval");
825
826}
827/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800828 * wma_set_modulated_dtim() - function to configure modulated dtim
829 * @wma: wma handle
830 * @privcmd: structure containing parameters
831 *
832 * This function configures the modulated dtim in firmware
833 *
834 * Return: none
835 */
836static void wma_set_modulated_dtim(tp_wma_handle wma,
837 wma_cli_set_cmd_t *privcmd)
838{
839 uint8_t vdev_id = privcmd->param_vdev_id;
840 struct wma_txrx_node *iface =
841 &wma->interfaces[vdev_id];
842 bool prev_dtim_enabled;
843 uint32_t listen_interval;
Govind Singhd76a5b02016-03-08 15:12:14 +0530844 QDF_STATUS ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800845
846 iface->alt_modulated_dtim = privcmd->param_value;
847
848 prev_dtim_enabled = iface->alt_modulated_dtim_enabled;
849
850 if (1 != privcmd->param_value)
851 iface->alt_modulated_dtim_enabled = true;
852 else
853 iface->alt_modulated_dtim_enabled = false;
854
855 if ((true == iface->alt_modulated_dtim_enabled) ||
856 (true == prev_dtim_enabled)) {
857
858 listen_interval = iface->alt_modulated_dtim
859 * iface->dtimPeriod;
860
Govind Singhd76a5b02016-03-08 15:12:14 +0530861 ret = wma_vdev_set_param(wma->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800862 privcmd->param_vdev_id,
863 WMI_VDEV_PARAM_LISTEN_INTERVAL,
864 listen_interval);
Govind Singhd76a5b02016-03-08 15:12:14 +0530865 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800866 /* Even if it fails, continue */
867 WMA_LOGW("Failed to set listen interval %d",
868 listen_interval);
869
Govind Singhd76a5b02016-03-08 15:12:14 +0530870 ret = wma_vdev_set_param(wma->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800871 privcmd->param_vdev_id,
872 WMI_VDEV_PARAM_DTIM_POLICY ,
873 NORMAL_DTIM);
Govind Singhd76a5b02016-03-08 15:12:14 +0530874 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800875 WMA_LOGE("Failed to Set to Normal DTIM policy");
876 }
877}
878
879
880/**
881 * wma_process_cli_set_cmd() - set parameters to fw
882 * @wma: wma handle
883 * @privcmd: command
884 *
885 * Return: none
886 */
887static void wma_process_cli_set_cmd(tp_wma_handle wma,
888 wma_cli_set_cmd_t *privcmd)
889{
Govind Singhd76a5b02016-03-08 15:12:14 +0530890 int vid = privcmd->param_vdev_id, pps_val = 0;
891 QDF_STATUS ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800892 struct wma_txrx_node *intr = wma->interfaces;
Anurag Chouhan6d760662016-02-20 16:05:43 +0530893 tpAniSirGlobal pMac = cds_get_context(QDF_MODULE_ID_PE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800894 struct qpower_params *qparams = &intr[vid].config.qpower_params;
Govind Singhd76a5b02016-03-08 15:12:14 +0530895 struct pdev_params pdev_param;
Leo Chang96464902016-10-28 11:10:54 -0700896 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800897
898 WMA_LOGD("wmihandle %p", wma->wmi_handle);
899
900 if (NULL == pMac) {
901 WMA_LOGE("%s: Failed to get pMac", __func__);
902 return;
903 }
904
905 if (privcmd->param_id >= WMI_CMDID_MAX) {
906 /*
907 * This configuration setting is not done using any wmi
908 * command, call appropriate handler.
909 */
910 if (wma_set_priv_cfg(wma, privcmd))
911 WMA_LOGE("Failed to set wma priv congiuration");
912 return;
913 }
914
915 switch (privcmd->param_vp_dev) {
916 case VDEV_CMD:
Bhargav Shaha89d3b42016-04-20 13:04:56 +0530917 if (!wma->interfaces[privcmd->param_vdev_id].is_vdev_valid) {
918 WMA_LOGE("%s Vdev id is not valid", __func__);
919 return ;
920 }
921
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800922 WMA_LOGD("vdev id %d pid %d pval %d", privcmd->param_vdev_id,
923 privcmd->param_id, privcmd->param_value);
Govind Singhd76a5b02016-03-08 15:12:14 +0530924 ret = wma_vdev_set_param(wma->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800925 privcmd->param_vdev_id,
926 privcmd->param_id,
927 privcmd->param_value);
Govind Singhd76a5b02016-03-08 15:12:14 +0530928 if (QDF_IS_STATUS_ERROR(ret)) {
929 WMA_LOGE("wma_vdev_set_param failed ret %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800930 ret);
931 return;
932 }
933 break;
934 case PDEV_CMD:
935 WMA_LOGD("pdev pid %d pval %d", privcmd->param_id,
936 privcmd->param_value);
937 if ((privcmd->param_id == WMI_PDEV_PARAM_RX_CHAIN_MASK) ||
938 (privcmd->param_id == WMI_PDEV_PARAM_TX_CHAIN_MASK)) {
939 wma_update_txrx_chainmask(wma->num_rf_chains,
940 &privcmd->param_value);
941 }
Govind Singhd76a5b02016-03-08 15:12:14 +0530942 pdev_param.param_id = privcmd->param_id;
943 pdev_param.param_value = privcmd->param_value;
944 ret = wmi_unified_pdev_param_send(wma->wmi_handle,
945 &pdev_param,
946 WMA_WILDCARD_PDEV_ID);
947 if (QDF_IS_STATUS_ERROR(ret)) {
948 WMA_LOGE("wma_vdev_set_param failed ret %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800949 ret);
950 return;
951 }
952 break;
953 case GEN_CMD:
954 {
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -0800955 struct cdp_vdev *vdev = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800956 struct wma_txrx_node *intr = wma->interfaces;
957
958 vdev = wma_find_vdev_by_id(wma, privcmd->param_vdev_id);
959 if (!vdev) {
960 WMA_LOGE("%s:Invalid vdev handle", __func__);
961 return;
962 }
963
964 WMA_LOGD("gen pid %d pval %d", privcmd->param_id,
965 privcmd->param_value);
966
967 switch (privcmd->param_id) {
968 case GEN_VDEV_PARAM_AMPDU:
Nishank Aggarwala13b61d2016-12-01 12:53:58 +0530969 if (soc) {
970 ret = cdp_aggr_cfg(soc, vdev,
971 privcmd->param_value, 0);
972 if (ret)
973 WMA_LOGE("cdp_aggr_cfg set ampdu failed ret %d",
974 ret);
975 else
976 intr[privcmd->param_vdev_id].config.
977 ampdu = privcmd->param_value;
978 } else {
979 WMA_LOGE("%s:SOC context is NULL", __func__);
980 return;
981 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800982 break;
983 case GEN_VDEV_PARAM_AMSDU:
Nishank Aggarwala13b61d2016-12-01 12:53:58 +0530984 if (soc) {
985 ret = cdp_aggr_cfg(soc, vdev, 0,
986 privcmd->param_value);
987 if (ret)
988 WMA_LOGE("cdp_aggr_cfg set amsdu failed ret %d",
989 ret);
990 else
991 intr[privcmd->param_vdev_id].config.
992 amsdu = privcmd->param_value;
993 } else {
994 WMA_LOGE("%s:SOC context is NULL", __func__);
995 return;
996 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800997 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800998 case GEN_PARAM_CRASH_INJECT:
Rajeev Kumar0a9901b2015-12-15 15:59:19 -0800999 if (QDF_GLOBAL_FTM_MODE == cds_get_conparam())
1000 WMA_LOGE("Crash inject not allowed in FTM mode");
1001 else
1002 ret = wma_crash_inject(wma,
1003 privcmd->param_value,
1004 privcmd->param_sec_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001005 break;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07001006 case GEN_PARAM_CAPTURE_TSF:
1007 ret = wma_capture_tsf(wma, privcmd->param_value);
1008 break;
1009 case GEN_PARAM_RESET_TSF_GPIO:
1010 ret = wma_reset_tsf_gpio(wma, privcmd->param_value);
1011 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001012 case GEN_PARAM_MODULATED_DTIM:
1013 wma_set_modulated_dtim(wma, privcmd);
1014 break;
1015 default:
1016 WMA_LOGE("Invalid param id 0x%x",
1017 privcmd->param_id);
1018 break;
1019 }
1020 break;
1021 }
1022 case DBG_CMD:
1023 WMA_LOGD("dbg pid %d pval %d", privcmd->param_id,
1024 privcmd->param_value);
1025 switch (privcmd->param_id) {
1026 case WMI_DBGLOG_LOG_LEVEL:
1027 ret = dbglog_set_log_lvl(wma->wmi_handle,
1028 privcmd->param_value);
1029 if (ret)
1030 WMA_LOGE("dbglog_set_log_lvl failed ret %d",
1031 ret);
1032 break;
1033 case WMI_DBGLOG_VAP_ENABLE:
1034 ret = dbglog_vap_log_enable(wma->wmi_handle,
1035 privcmd->param_value, true);
1036 if (ret)
1037 WMA_LOGE("dbglog_vap_log_enable failed ret %d",
1038 ret);
1039 break;
1040 case WMI_DBGLOG_VAP_DISABLE:
1041 ret = dbglog_vap_log_enable(wma->wmi_handle,
1042 privcmd->param_value, false);
1043 if (ret)
1044 WMA_LOGE("dbglog_vap_log_enable failed ret %d",
1045 ret);
1046 break;
1047 case WMI_DBGLOG_MODULE_ENABLE:
1048 ret = dbglog_module_log_enable(wma->wmi_handle,
1049 privcmd->param_value, true);
1050 if (ret)
1051 WMA_LOGE("dbglog_module_log_enable failed ret %d",
1052 ret);
1053 break;
1054 case WMI_DBGLOG_MODULE_DISABLE:
1055 ret = dbglog_module_log_enable(wma->wmi_handle,
1056 privcmd->param_value, false);
1057 if (ret)
1058 WMA_LOGE("dbglog_module_log_enable failed ret %d",
1059 ret);
1060 break;
1061 case WMI_DBGLOG_MOD_LOG_LEVEL:
1062 ret = dbglog_set_mod_log_lvl(wma->wmi_handle,
1063 privcmd->param_value);
1064 if (ret)
1065 WMA_LOGE("dbglog_module_log_enable failed ret %d",
1066 ret);
1067 break;
1068 case WMI_DBGLOG_TYPE:
1069 ret = dbglog_parser_type_init(wma->wmi_handle,
1070 privcmd->param_value);
1071 if (ret)
1072 WMA_LOGE("dbglog_parser_type_init failed ret %d",
1073 ret);
1074 break;
1075 case WMI_DBGLOG_REPORT_ENABLE:
1076 ret = dbglog_report_enable(wma->wmi_handle,
1077 privcmd->param_value);
1078 if (ret)
1079 WMA_LOGE("dbglog_report_enable failed ret %d",
1080 ret);
1081 break;
Govind Singha471e5e2015-10-12 17:11:14 +05301082 case WMI_WLAN_PROFILE_TRIGGER_CMDID:
Govind Singhf25a0f12016-03-08 16:09:48 +05301083 ret = wma_unified_fw_profiling_cmd(wma->wmi_handle,
Govind Singha471e5e2015-10-12 17:11:14 +05301084 WMI_WLAN_PROFILE_TRIGGER_CMDID,
1085 privcmd->param_value, 0);
1086 if (ret)
1087 WMA_LOGE("Profile cmd failed for %d ret %d",
1088 WMI_WLAN_PROFILE_TRIGGER_CMDID, ret);
1089 break;
1090 case WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID:
Govind Singhf25a0f12016-03-08 16:09:48 +05301091 ret = wma_unified_fw_profiling_cmd(wma->wmi_handle,
Govind Singha471e5e2015-10-12 17:11:14 +05301092 WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
1093 privcmd->param_value,
1094 privcmd->param_sec_value);
1095 if (ret)
1096 WMA_LOGE("Profile cmd failed for %d ret %d",
1097 WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
1098 ret);
1099 break;
1100 case WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID:
Govind Singhf25a0f12016-03-08 16:09:48 +05301101 ret = wma_unified_fw_profiling_cmd(wma->wmi_handle,
Govind Singha471e5e2015-10-12 17:11:14 +05301102 WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
1103 privcmd->param_value,
1104 privcmd->param_sec_value);
1105 if (ret)
1106 WMA_LOGE("Profile cmd failed for %d ret %d",
1107 WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
1108 ret);
1109 break;
1110 case WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID:
Govind Singhf25a0f12016-03-08 16:09:48 +05301111 ret = wma_unified_fw_profiling_cmd(wma->wmi_handle,
Govind Singha471e5e2015-10-12 17:11:14 +05301112 WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
1113 0, 0);
1114 if (ret)
1115 WMA_LOGE("Profile cmd failed for %d ret %d",
1116 WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
1117 ret);
1118 break;
1119 case WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID:
Govind Singhf25a0f12016-03-08 16:09:48 +05301120 ret = wma_unified_fw_profiling_cmd(wma->wmi_handle,
Govind Singha471e5e2015-10-12 17:11:14 +05301121 WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
1122 0, 0);
1123 if (ret)
1124 WMA_LOGE("Profile cmd failed for %d ret %d",
1125 WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
1126 ret);
1127 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001128 case WMI_PDEV_GREEN_AP_PS_ENABLE_CMDID:
1129 /* Set the Green AP */
Govind Singhd76a5b02016-03-08 15:12:14 +05301130 ret = wmi_unified_green_ap_ps_send
1131 (wma->wmi_handle, privcmd->param_value,
1132 WMA_WILDCARD_PDEV_ID);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001133 if (ret) {
1134 WMA_LOGE("Set GreenAP Failed val %d",
1135 privcmd->param_value);
1136 }
1137 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001138
1139 default:
1140 WMA_LOGE("Invalid param id 0x%x", privcmd->param_id);
1141 break;
1142 }
1143 break;
1144 case PPS_CMD:
1145 WMA_LOGD("dbg pid %d pval %d", privcmd->param_id,
1146 privcmd->param_value);
1147 switch (privcmd->param_id) {
1148
1149 case WMI_VDEV_PPS_PAID_MATCH:
1150 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1151 (PKT_PWR_SAVE_PAID_MATCH & 0xffff);
1152 intr[vid].config.pps_params.paid_match_enable =
1153 privcmd->param_value;
1154 break;
1155 case WMI_VDEV_PPS_GID_MATCH:
1156 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1157 (PKT_PWR_SAVE_GID_MATCH & 0xffff);
1158 intr[vid].config.pps_params.gid_match_enable =
1159 privcmd->param_value;
1160 break;
1161 case WMI_VDEV_PPS_EARLY_TIM_CLEAR:
1162 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1163 (PKT_PWR_SAVE_EARLY_TIM_CLEAR & 0xffff);
1164 intr[vid].config.pps_params.tim_clear =
1165 privcmd->param_value;
1166 break;
1167 case WMI_VDEV_PPS_EARLY_DTIM_CLEAR:
1168 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1169 (PKT_PWR_SAVE_EARLY_DTIM_CLEAR & 0xffff);
1170 intr[vid].config.pps_params.dtim_clear =
1171 privcmd->param_value;
1172 break;
1173 case WMI_VDEV_PPS_EOF_PAD_DELIM:
1174 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1175 (PKT_PWR_SAVE_EOF_PAD_DELIM & 0xffff);
1176 intr[vid].config.pps_params.eof_delim =
1177 privcmd->param_value;
1178 break;
1179 case WMI_VDEV_PPS_MACADDR_MISMATCH:
1180 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1181 (PKT_PWR_SAVE_MACADDR_MISMATCH & 0xffff);
1182 intr[vid].config.pps_params.mac_match =
1183 privcmd->param_value;
1184 break;
1185 case WMI_VDEV_PPS_DELIM_CRC_FAIL:
1186 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1187 (PKT_PWR_SAVE_DELIM_CRC_FAIL & 0xffff);
1188 intr[vid].config.pps_params.delim_fail =
1189 privcmd->param_value;
1190 break;
1191 case WMI_VDEV_PPS_GID_NSTS_ZERO:
1192 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1193 (PKT_PWR_SAVE_GID_NSTS_ZERO & 0xffff);
1194 intr[vid].config.pps_params.nsts_zero =
1195 privcmd->param_value;
1196 break;
1197 case WMI_VDEV_PPS_RSSI_CHECK:
1198 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1199 (PKT_PWR_SAVE_RSSI_CHECK & 0xffff);
1200 intr[vid].config.pps_params.rssi_chk =
1201 privcmd->param_value;
1202 break;
1203 case WMI_VDEV_PPS_5G_EBT:
1204 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1205 (PKT_PWR_SAVE_5G_EBT & 0xffff);
1206 intr[vid].config.pps_params.ebt_5g =
1207 privcmd->param_value;
1208 break;
1209 default:
1210 WMA_LOGE("Invalid param id 0x%x", privcmd->param_id);
1211 break;
1212 }
1213 break;
1214
1215 case QPOWER_CMD:
1216 WMA_LOGD("QPOWER CLI CMD pid %d pval %d", privcmd->param_id,
1217 privcmd->param_value);
1218 switch (privcmd->param_id) {
1219 case WMI_STA_PS_PARAM_QPOWER_PSPOLL_COUNT:
1220 WMA_LOGD("QPOWER CLI CMD:Ps Poll Cnt val %d",
1221 privcmd->param_value);
1222 /* Set the QPower Ps Poll Count */
Govind Singhd76a5b02016-03-08 15:12:14 +05301223 ret = wma_unified_set_sta_ps_param(wma->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001224 vid, WMI_STA_PS_PARAM_QPOWER_PSPOLL_COUNT,
1225 privcmd->param_value);
1226 if (ret) {
1227 WMA_LOGE("Set Q-PsPollCnt Failed vdevId %d val %d",
1228 vid, privcmd->param_value);
1229 } else {
1230 qparams->max_ps_poll_cnt = privcmd->param_value;
1231 }
1232 break;
1233 case WMI_STA_PS_PARAM_QPOWER_MAX_TX_BEFORE_WAKE:
1234 WMA_LOGD("QPOWER CLI CMD:Max Tx Before wake val %d",
1235 privcmd->param_value);
1236 /* Set the QPower Max Tx Before Wake */
Govind Singhd76a5b02016-03-08 15:12:14 +05301237 ret = wma_unified_set_sta_ps_param(wma->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001238 vid, WMI_STA_PS_PARAM_QPOWER_MAX_TX_BEFORE_WAKE,
1239 privcmd->param_value);
1240 if (ret) {
1241 WMA_LOGE("Set Q-MaxTxBefWake Failed vId %d val %d",
1242 vid, privcmd->param_value);
1243 } else {
1244 qparams->max_tx_before_wake =
1245 privcmd->param_value;
1246 }
1247 break;
1248 case WMI_STA_PS_PARAM_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL:
1249 WMA_LOGD("QPOWER CLI CMD:Ps Poll Wake Inv val %d",
1250 privcmd->param_value);
1251 /* Set the QPower Spec Ps Poll Wake Inv */
Govind Singhd76a5b02016-03-08 15:12:14 +05301252 ret = wma_unified_set_sta_ps_param(wma->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001253 vid, WMI_STA_PS_PARAM_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL,
1254 privcmd->param_value);
1255 if (ret) {
1256 WMA_LOGE("Set Q-PsPoll WakeIntv Failed vId %d val %d",
1257 vid, privcmd->param_value);
1258 } else {
1259 qparams->spec_ps_poll_wake_interval =
1260 privcmd->param_value;
1261 }
1262 break;
1263 case WMI_STA_PS_PARAM_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL:
1264 WMA_LOGD("QPOWER CLI CMD:Spec NoData Ps Poll val %d",
1265 privcmd->param_value);
1266 /* Set the QPower Spec NoData PsPoll */
Govind Singhd76a5b02016-03-08 15:12:14 +05301267 ret = wma_unified_set_sta_ps_param(wma->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001268 vid, WMI_STA_PS_PARAM_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL,
1269 privcmd->param_value);
1270 if (ret) {
1271 WMA_LOGE("Set Q-SpecNoDataPsPoll Failed vId %d val %d",
1272 vid, privcmd->param_value);
1273 } else {
1274 qparams->max_spec_nodata_ps_poll =
1275 privcmd->param_value;
1276 }
1277 break;
1278
1279 default:
1280 WMA_LOGE("Invalid param id 0x%x", privcmd->param_id);
1281 break;
1282 }
1283 break;
1284 case GTX_CMD:
1285 WMA_LOGD("vdev id %d pid %d pval %d", privcmd->param_vdev_id,
1286 privcmd->param_id, privcmd->param_value);
1287 switch (privcmd->param_id) {
1288 case WMI_VDEV_PARAM_GTX_HT_MCS:
1289 intr[vid].config.gtx_info.gtxRTMask[0] =
1290 privcmd->param_value;
1291 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1292 privcmd->param_vdev_id,
1293 &intr[vid].config.gtx_info);
1294 break;
1295 case WMI_VDEV_PARAM_GTX_VHT_MCS:
1296 intr[vid].config.gtx_info.gtxRTMask[1] =
1297 privcmd->param_value;
1298 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1299 privcmd->param_vdev_id,
1300 &intr[vid].config.gtx_info);
1301 break;
1302
1303 case WMI_VDEV_PARAM_GTX_USR_CFG:
1304 intr[vid].config.gtx_info.gtxUsrcfg =
1305 privcmd->param_value;
1306 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1307 privcmd->param_vdev_id,
1308 &intr[vid].config.gtx_info);
1309 break;
1310
1311 case WMI_VDEV_PARAM_GTX_THRE:
1312 intr[vid].config.gtx_info.gtxPERThreshold =
1313 privcmd->param_value;
1314 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1315 privcmd->param_vdev_id,
1316 &intr[vid].config.gtx_info);
1317 break;
1318
1319 case WMI_VDEV_PARAM_GTX_MARGIN:
1320 intr[vid].config.gtx_info.gtxPERMargin =
1321 privcmd->param_value;
1322 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1323 privcmd->param_vdev_id,
1324 &intr[vid].config.gtx_info);
1325 break;
1326
1327 case WMI_VDEV_PARAM_GTX_STEP:
1328 intr[vid].config.gtx_info.gtxTPCstep =
1329 privcmd->param_value;
1330 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1331 privcmd->param_vdev_id,
1332 &intr[vid].config.gtx_info);
1333 break;
1334
1335 case WMI_VDEV_PARAM_GTX_MINTPC:
1336 intr[vid].config.gtx_info.gtxTPCMin =
1337 privcmd->param_value;
1338 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1339 privcmd->param_vdev_id,
1340 &intr[vid].config.gtx_info);
1341 break;
1342
1343 case WMI_VDEV_PARAM_GTX_BW_MASK:
1344 intr[vid].config.gtx_info.gtxBWMask =
1345 privcmd->param_value;
1346 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1347 privcmd->param_vdev_id,
1348 &intr[vid].config.gtx_info);
1349 if (ret) {
Govind Singhd76a5b02016-03-08 15:12:14 +05301350 WMA_LOGE("wma_vdev_set_param"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001351 " failed ret %d", ret);
1352 return;
1353 }
1354 break;
1355 default:
1356 break;
1357 }
1358 break;
1359
1360 default:
1361 WMA_LOGE("Invalid vpdev command id");
1362 }
1363 if (1 == privcmd->param_vp_dev) {
1364 switch (privcmd->param_id) {
1365 case WMI_VDEV_PARAM_NSS:
1366 intr[vid].config.nss = privcmd->param_value;
1367 break;
1368 case WMI_VDEV_PARAM_LDPC:
1369 intr[vid].config.ldpc = privcmd->param_value;
1370 break;
1371 case WMI_VDEV_PARAM_TX_STBC:
1372 intr[vid].config.tx_stbc = privcmd->param_value;
1373 break;
1374 case WMI_VDEV_PARAM_RX_STBC:
1375 intr[vid].config.rx_stbc = privcmd->param_value;
1376 break;
1377 case WMI_VDEV_PARAM_SGI:
1378 intr[vid].config.shortgi = privcmd->param_value;
1379 break;
1380 case WMI_VDEV_PARAM_ENABLE_RTSCTS:
1381 intr[vid].config.rtscts_en = privcmd->param_value;
1382 break;
1383 case WMI_VDEV_PARAM_CHWIDTH:
1384 intr[vid].config.chwidth = privcmd->param_value;
1385 break;
1386 case WMI_VDEV_PARAM_FIXED_RATE:
1387 intr[vid].config.tx_rate = privcmd->param_value;
1388 break;
1389 case WMI_VDEV_PARAM_EARLY_RX_ADJUST_ENABLE:
1390 intr[vid].config.erx_adjust = privcmd->param_value;
1391 break;
1392 case WMI_VDEV_PARAM_EARLY_RX_TGT_BMISS_NUM:
1393 intr[vid].config.erx_bmiss_num = privcmd->param_value;
1394 break;
1395 case WMI_VDEV_PARAM_EARLY_RX_BMISS_SAMPLE_CYCLE:
1396 intr[vid].config.erx_bmiss_cycle = privcmd->param_value;
1397 break;
1398 case WMI_VDEV_PARAM_EARLY_RX_SLOP_STEP:
1399 intr[vid].config.erx_slop_step = privcmd->param_value;
1400 break;
1401 case WMI_VDEV_PARAM_EARLY_RX_INIT_SLOP:
1402 intr[vid].config.erx_init_slop = privcmd->param_value;
1403 break;
1404 case WMI_VDEV_PARAM_EARLY_RX_ADJUST_PAUSE:
1405 intr[vid].config.erx_adj_pause = privcmd->param_value;
1406 break;
1407 case WMI_VDEV_PARAM_EARLY_RX_DRIFT_SAMPLE:
1408 intr[vid].config.erx_dri_sample = privcmd->param_value;
1409 break;
1410 default:
1411 WMA_LOGE("Invalid wma_cli_set vdev command/Not"
1412 " yet implemented 0x%x", privcmd->param_id);
1413 break;
1414 }
1415 } else if (2 == privcmd->param_vp_dev) {
1416 switch (privcmd->param_id) {
1417 case WMI_PDEV_PARAM_ANI_ENABLE:
1418 wma->pdevconfig.ani_enable = privcmd->param_value;
1419 break;
1420 case WMI_PDEV_PARAM_ANI_POLL_PERIOD:
1421 wma->pdevconfig.ani_poll_len = privcmd->param_value;
1422 break;
1423 case WMI_PDEV_PARAM_ANI_LISTEN_PERIOD:
1424 wma->pdevconfig.ani_listen_len = privcmd->param_value;
1425 break;
1426 case WMI_PDEV_PARAM_ANI_OFDM_LEVEL:
1427 wma->pdevconfig.ani_ofdm_level = privcmd->param_value;
1428 break;
1429 case WMI_PDEV_PARAM_ANI_CCK_LEVEL:
1430 wma->pdevconfig.ani_cck_level = privcmd->param_value;
1431 break;
1432 case WMI_PDEV_PARAM_DYNAMIC_BW:
1433 wma->pdevconfig.cwmenable = privcmd->param_value;
1434 break;
1435 case WMI_PDEV_PARAM_CTS_CBW:
1436 wma->pdevconfig.cts_cbw = privcmd->param_value;
1437 break;
1438 case WMI_PDEV_PARAM_TX_CHAIN_MASK:
1439 wma->pdevconfig.txchainmask = privcmd->param_value;
1440 break;
1441 case WMI_PDEV_PARAM_RX_CHAIN_MASK:
1442 wma->pdevconfig.rxchainmask = privcmd->param_value;
1443 break;
1444 case WMI_PDEV_PARAM_BURST_ENABLE:
1445 wma->pdevconfig.burst_enable = privcmd->param_value;
1446 if ((wma->pdevconfig.burst_enable == 1) &&
1447 (wma->pdevconfig.burst_dur == 0))
1448 wma->pdevconfig.burst_dur =
1449 WMA_DEFAULT_SIFS_BURST_DURATION;
1450 else if (wma->pdevconfig.burst_enable == 0)
1451 wma->pdevconfig.burst_dur = 0;
1452 break;
1453 case WMI_PDEV_PARAM_BURST_DUR:
1454 wma->pdevconfig.burst_dur = privcmd->param_value;
1455 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001456 case WMI_PDEV_PARAM_TXPOWER_LIMIT2G:
1457 wma->pdevconfig.txpow2g = privcmd->param_value;
1458 if ((pMac->roam.configParam.bandCapability ==
1459 eCSR_BAND_ALL) ||
1460 (pMac->roam.configParam.bandCapability ==
1461 eCSR_BAND_24)) {
1462 if (cfg_set_int(pMac,
1463 WNI_CFG_CURRENT_TX_POWER_LEVEL,
1464 privcmd->param_value) !=
Anurag Chouhanffb21542016-02-17 14:33:03 +05301465 eSIR_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001466 WMA_LOGE("could not set WNI_CFG_CURRENT_TX_POWER_LEVEL");
1467
1468 } else {
1469 WMA_LOGE("Current band is not 2G");
1470 }
1471 break;
1472 case WMI_PDEV_PARAM_TXPOWER_LIMIT5G:
1473 wma->pdevconfig.txpow5g = privcmd->param_value;
1474 if ((pMac->roam.configParam.bandCapability ==
1475 eCSR_BAND_ALL) ||
1476 (pMac->roam.configParam.bandCapability ==
1477 eCSR_BAND_5G)) {
1478 if (cfg_set_int(pMac,
1479 WNI_CFG_CURRENT_TX_POWER_LEVEL,
1480 privcmd->param_value) !=
Anurag Chouhanffb21542016-02-17 14:33:03 +05301481 eSIR_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001482 WMA_LOGE("could not set WNI_CFG_CURRENT_TX_POWER_LEVEL");
1483
1484 } else {
1485 WMA_LOGE("Current band is not 5G");
1486 }
1487 break;
1488 default:
1489 WMA_LOGE("Invalid wma_cli_set pdev command/Not yet implemented 0x%x",
1490 privcmd->param_id);
1491 break;
1492 }
1493 } else if (5 == privcmd->param_vp_dev) {
Govind Singhd76a5b02016-03-08 15:12:14 +05301494 ret = wma_vdev_set_param(wma->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001495 privcmd->param_vdev_id,
1496 WMI_VDEV_PARAM_PACKET_POWERSAVE,
1497 pps_val);
1498 if (ret)
1499 WMA_LOGE("Failed to send wmi packet power save cmd");
1500 else
1501 WMA_LOGD("Sent packet power save cmd %d value %x to target",
1502 privcmd->param_id, pps_val);
1503 }
1504}
1505
1506/**
1507 * wma_process_fw_event() - process any fw event
1508 * @wma: wma handle
1509 * @buf: fw event buffer
1510 *
1511 * This function process any fw event to serialize it through mc thread.
1512 *
1513 * Return: none
1514 */
1515static int wma_process_fw_event(tp_wma_handle wma,
1516 wma_process_fw_event_params *buf)
1517{
1518 struct wmi_unified *wmi_handle = (struct wmi_unified *)buf->wmi_handle;
1519
1520 wmi_process_fw_event(wmi_handle, buf->evt_buf);
1521 return 0;
1522}
1523
1524/**
Govind Singhd76a5b02016-03-08 15:12:14 +05301525 * wmi_process_fw_event_tasklet_ctx() - process in tasklet context
1526 * @ctx: handle to wmi
1527 * @ev: wmi event buffer
1528 *
1529 * Event process by below function will be in tasket context,
1530 * need to use this method only for time sensitive functions.
1531 *
1532 * Return: none
1533 */
1534static int wma_process_fw_event_tasklet_ctx(void *ctx, void *ev)
1535{
1536 wmi_process_fw_event(ctx, ev);
1537
1538 return 0;
1539}
1540
1541/**
Manjeet Singhf82ed072016-07-08 11:40:00 +05301542 * wma_process_hal_pwr_dbg_cmd() - send hal pwr dbg cmd to fw.
1543 * @handle: wma handle
1544 * @sir_pwr_dbg_params: unit test command
1545 *
1546 * This function send unit test command to fw.
1547 *
1548 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_** on error
1549 */
1550QDF_STATUS wma_process_hal_pwr_dbg_cmd(WMA_HANDLE handle,
1551 struct sir_mac_pwr_dbg_cmd *
1552 sir_pwr_dbg_params)
1553{
1554 tp_wma_handle wma_handle = (tp_wma_handle)handle;
1555 int i;
1556 struct wmi_power_dbg_params wmi_pwr_dbg_params;
1557 QDF_STATUS status;
1558
1559 if (!sir_pwr_dbg_params) {
1560 WMA_LOGE("%s: sir_pwr_dbg_params is null", __func__);
1561 return QDF_STATUS_E_INVAL;
1562 }
1563 wmi_pwr_dbg_params.module_id = sir_pwr_dbg_params->module_id;
1564 wmi_pwr_dbg_params.pdev_id = sir_pwr_dbg_params->pdev_id;
1565 wmi_pwr_dbg_params.num_args = sir_pwr_dbg_params->num_args;
1566
1567 for (i = 0; i < wmi_pwr_dbg_params.num_args; i++)
1568 wmi_pwr_dbg_params.args[i] = sir_pwr_dbg_params->args[i];
1569
1570 status = wmi_unified_send_power_dbg_cmd(wma_handle->wmi_handle,
1571 &wmi_pwr_dbg_params);
1572
1573 return status;
1574}
1575
1576/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001577 * wma_process_fw_event_handler() - common event handler to serialize
1578 * event processing through mc_thread
Govind Singhd76a5b02016-03-08 15:12:14 +05301579 * @ctx: wmi context
1580 * @ev: event buffer
1581 * @rx_ctx: rx execution context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001582 *
1583 * Return: 0 on success, errno on failure
1584 */
Govind Singhd76a5b02016-03-08 15:12:14 +05301585static int wma_process_fw_event_mc_thread_ctx(void *ctx, void *ev)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001586{
1587 wma_process_fw_event_params *params_buf;
Rajeev Kumarb60abe42017-01-21 15:39:31 -08001588 struct scheduler_msg cds_msg = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001589
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301590 params_buf = qdf_mem_malloc(sizeof(wma_process_fw_event_params));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001591 if (!params_buf) {
1592 WMA_LOGE("%s: Failed alloc memory for params_buf", __func__);
Govind Singhd76a5b02016-03-08 15:12:14 +05301593 qdf_nbuf_free(ev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001594 return -ENOMEM;
1595 }
1596
Govind Singhd76a5b02016-03-08 15:12:14 +05301597 params_buf->wmi_handle = (struct wmi_unified *)ctx;
1598 params_buf->evt_buf = (wmi_buf_t *)ev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001599
1600 cds_msg.type = WMA_PROCESS_FW_EVENT;
1601 cds_msg.bodyptr = params_buf;
1602 cds_msg.bodyval = 0;
1603
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301604 if (QDF_STATUS_SUCCESS !=
Rajeev Kumarb60abe42017-01-21 15:39:31 -08001605 scheduler_post_msg(QDF_MODULE_ID_WMA, &cds_msg)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001606 WMA_LOGP("%s: Failed to post WMA_PROCESS_FW_EVENT msg",
1607 __func__);
Govind Singhd76a5b02016-03-08 15:12:14 +05301608 qdf_nbuf_free(ev);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301609 qdf_mem_free(params_buf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001610 return -EFAULT;
1611 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001612 return 0;
1613
1614}
1615
Govind Singhd76a5b02016-03-08 15:12:14 +05301616/**
1617 * wma_process_fw_event_handler() - common event handler to serialize
1618 * event processing through mc_thread
1619 * @ctx: wmi context
1620 * @ev: event buffer
1621 * @rx_ctx: rx execution context
1622 *
1623 * Return: 0 on success, errno on failure
1624 */
1625int wma_process_fw_event_handler(void *ctx, void *ev, uint8_t rx_ctx)
1626{
1627 int err = 0;
1628
1629 if (rx_ctx == WMA_RX_SERIALIZER_CTX) {
1630 err = wma_process_fw_event_mc_thread_ctx(ctx, ev);
1631 } else if (rx_ctx == WMA_RX_TASKLET_CTX) {
1632 wma_process_fw_event_tasklet_ctx(ctx, ev);
1633 } else {
1634 WMA_LOGE("%s: invalid wmi event execution context", __func__);
1635 qdf_nbuf_free(ev);
1636 }
1637
1638 return err;
1639}
1640
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001641#ifdef WLAN_FEATURE_NAN
1642/**
1643 * wma_set_nan_enable() - set nan enable flag in WMA handle
1644 * @wma_handle: Pointer to wma handle
Arun Khandavallic811dcc2016-06-26 07:37:21 +05301645 * @cds_cfg: Pointer to CDS Configuration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001646 *
1647 * Return: none
1648 */
1649static void wma_set_nan_enable(tp_wma_handle wma_handle,
Arun Khandavallic811dcc2016-06-26 07:37:21 +05301650 struct cds_config_info *cds_cfg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001651{
Arun Khandavallic811dcc2016-06-26 07:37:21 +05301652 wma_handle->is_nan_enabled = cds_cfg->is_nan_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001653}
1654#else
1655static void wma_set_nan_enable(tp_wma_handle wma_handle,
Arun Khandavallic811dcc2016-06-26 07:37:21 +05301656 struct cds_config_info *cds_cfg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001657{
1658}
1659#endif
1660
1661/**
Komal Seelam02d09342016-02-23 18:03:19 +05301662 * wma_init_max_no_of_peers - API to initialize wma configuration params
1663 * @wma_handle: WMA Handle
1664 * @max_peers: Max Peers supported
1665 *
1666 * Return: void
1667 */
1668static void wma_init_max_no_of_peers(tp_wma_handle wma_handle,
1669 uint16_t max_peers)
1670{
1671 struct wma_ini_config *cfg = wma_get_ini_handle(wma_handle);
1672
Naveen Rawat35804772016-06-27 15:40:28 -07001673 if (cfg == NULL) {
1674 WMA_LOGE("%s: NULL WMA ini handle", __func__);
1675 return;
1676 }
1677
Komal Seelam02d09342016-02-23 18:03:19 +05301678 cfg->max_no_of_peers = max_peers;
1679}
1680
Prashanth Bhattae675ca72016-10-20 18:42:37 -07001681/**
Manikandan Mohanb0932ab2017-02-12 16:30:55 -08001682 * wma_cleanup_vdev_resp_queue() - cleanup vdev response queue
1683 * @wma: wma handle
1684 *
1685 * Return: none
1686 */
1687static void wma_cleanup_vdev_resp_queue(tp_wma_handle wma)
1688{
1689 struct wma_target_req *req_msg = NULL;
1690 qdf_list_node_t *node1 = NULL;
1691 QDF_STATUS status;
1692
1693 qdf_spin_lock_bh(&wma->vdev_respq_lock);
1694 if (!qdf_list_size(&wma->vdev_resp_queue)) {
1695 qdf_spin_unlock_bh(&wma->vdev_respq_lock);
1696 WMA_LOGI(FL("request queue maybe empty"));
1697 return;
1698 }
1699
1700 while (qdf_list_peek_front(&wma->vdev_resp_queue, &node1) !=
1701 QDF_STATUS_SUCCESS) {
1702 req_msg = qdf_container_of(node1, struct wma_target_req, node);
1703 status = qdf_list_remove_node(&wma->vdev_resp_queue, node1);
1704 qdf_spin_unlock_bh(&wma->vdev_respq_lock);
1705 if (status != QDF_STATUS_SUCCESS) {
1706 WMA_LOGE(FL("Failed to remove req vdev_id %d type %d"),
1707 req_msg->vdev_id, req_msg->type);
1708 return;
1709 }
1710 qdf_mc_timer_destroy(&req_msg->event_timeout);
1711 qdf_mem_free(req_msg);
1712 qdf_spin_lock_bh(&wma->vdev_respq_lock);
1713 }
1714 qdf_spin_unlock_bh(&wma->vdev_respq_lock);
1715}
1716
1717/**
Prashanth Bhattae675ca72016-10-20 18:42:37 -07001718 * wma_shutdown_notifier_cb - Shutdown notifer call back
1719 * @priv : WMA handle
1720 *
1721 * During recovery, WMA may wait for resume to complete if the crash happens
1722 * while in suspend. This may cause delays in completing the recovery. This call
1723 * back would be called during recovery and the event is completed so that if
1724 * the resume is waiting on FW to respond then it can get out of the wait so
1725 * that recovery thread can start bringing down all the modules.
1726 *
1727 * Return: None
1728 */
1729static void wma_shutdown_notifier_cb(void *priv)
1730{
1731 tp_wma_handle wma_handle = priv;
1732
1733 qdf_event_set(&wma_handle->wma_resume_event);
Manikandan Mohanb0932ab2017-02-12 16:30:55 -08001734 wma_cleanup_vdev_resp_queue(wma_handle);
Mukul Sharma4c60a7e2017-03-06 19:42:18 +05301735 pmo_ucfg_psoc_wakeup_host_event_received(wma_handle->psoc);
Prashanth Bhattae675ca72016-10-20 18:42:37 -07001736}
1737
Mukul Sharma5ff3c582016-09-12 15:23:35 +05301738struct wma_version_info g_wmi_version_info;
1739
Komal Seelam02d09342016-02-23 18:03:19 +05301740/**
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05301741 * wma_state_info_dump() - prints state information of wma layer
1742 * @buf: buffer pointer
1743 * @size: size of buffer to be filled
1744 *
1745 * This function is used to dump state information of wma layer
1746 *
1747 * Return: None
1748 */
1749static void wma_state_info_dump(char **buf_ptr, uint16_t *size)
1750{
Dustin Brown9d797d62017-01-11 16:39:12 -08001751 t_wma_handle *wma;
1752 struct sir_vdev_wow_stats *stats;
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05301753 uint16_t len = 0;
1754 char *buf = *buf_ptr;
1755 struct wma_txrx_node *iface;
1756 uint8_t vdev_id;
1757
Dustin Brown9d797d62017-01-11 16:39:12 -08001758 wma = cds_get_context(QDF_MODULE_ID_WMA);
1759 if (!wma) {
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05301760 WMA_LOGE("%s: WMA context is invald!", __func__);
1761 return;
1762 }
1763
1764 WMA_LOGI("%s: size of buffer: %d", __func__, *size);
1765
Dustin Brown9d797d62017-01-11 16:39:12 -08001766 for (vdev_id = 0; vdev_id < wma->max_bssid; vdev_id++) {
1767 iface = &wma->interfaces[vdev_id];
1768 if (!iface->handle)
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05301769 continue;
1770
Dustin Brown9d797d62017-01-11 16:39:12 -08001771 stats = &iface->wow_stats;
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05301772 len += qdf_scnprintf(buf + len, *size - len,
Dustin Brown9d797d62017-01-11 16:39:12 -08001773 "\n"
1774 "vdev_id %d\n"
1775 "WoW Stats\n"
1776 "\tpno_match %u\n"
1777 "\tpno_complete %u\n"
1778 "\tgscan %u\n"
1779 "\tlow_rssi %u\n"
1780 "\trssi_breach %u\n"
1781 "\tucast %u\n"
1782 "\tbcast %u\n"
1783 "\ticmpv4 %u\n"
1784 "\ticmpv6 %u\n"
1785 "\tipv4_mcast %u\n"
1786 "\tipv6_mcast %u\n"
1787 "\tipv6_mcast_ra %u\n"
1788 "\tipv6_mcast_ns %u\n"
1789 "\tipv6_mcast_na %u\n"
1790 "\toem_response %u\n"
1791 "conn_state %d\n"
1792 "dtimPeriod %d\n"
1793 "chanmode %d\n"
1794 "vht_capable %d\n"
1795 "ht_capable %d\n"
1796 "chan_width %d\n"
1797 "vdev_active %d\n"
1798 "vdev_up %d\n"
1799 "aid %d\n"
1800 "rate_flags %d\n"
1801 "nss %d\n"
1802 "tx_power %d\n"
1803 "max_tx_power %d\n"
1804 "nwType %d\n"
1805 "tx_streams %d\n"
1806 "rx_streams %d\n"
1807 "chain_mask %d\n"
1808 "nss_2g %d\n"
1809 "nss_5g %d",
1810 vdev_id,
1811 stats->pno_match,
1812 stats->pno_complete,
1813 stats->gscan,
1814 stats->low_rssi,
1815 stats->rssi_breach,
1816 stats->ucast,
1817 stats->bcast,
1818 stats->icmpv4,
1819 stats->icmpv6,
1820 stats->ipv4_mcast,
1821 stats->ipv6_mcast,
1822 stats->ipv6_mcast_ra,
1823 stats->ipv6_mcast_ns,
1824 stats->ipv6_mcast_na,
1825 stats->oem_response,
1826 iface->conn_state,
1827 iface->dtimPeriod,
1828 iface->chanmode,
1829 iface->vht_capable,
1830 iface->ht_capable,
1831 iface->chan_width,
1832 iface->vdev_active,
Mukul Sharmaf9047232017-03-02 16:58:56 +05301833 wma_is_vdev_up(vdev_id),
Dustin Brown9d797d62017-01-11 16:39:12 -08001834 iface->aid,
1835 iface->rate_flags,
1836 iface->nss,
1837 iface->tx_power,
1838 iface->max_tx_power,
1839 iface->nwType,
1840 iface->tx_streams,
1841 iface->rx_streams,
1842 iface->chain_mask,
1843 iface->nss_2g,
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05301844 iface->nss_5g);
1845 }
1846
1847 *size -= len;
1848 *buf_ptr += len;
1849}
1850
1851/**
1852 * wma_register_debug_callback() - registration function for wma layer
1853 * to print wma state information
1854 */
1855static void wma_register_debug_callback(void)
1856{
1857 qdf_register_debug_callback(QDF_MODULE_ID_WMA, &wma_state_info_dump);
1858}
1859
Frank Liu65b17d92016-11-23 15:58:44 +08001860/**
1861 * wma_register_tx_ops_handler() - register tx_ops of southbound
1862 * @tx_ops: tx_ops pointer in southbound
1863 *
1864 * Return: 0 on success, errno on failure
1865 */
1866static QDF_STATUS
1867wma_register_tx_ops_handler(struct wlan_lmac_if_tx_ops *tx_ops)
1868{
1869 /*
1870 * Assign tx_ops, it's up to UMAC modules to declare and define these
1871 * functions which are used to send wmi command to target.
1872 */
1873
Himanshu Agarwalce716f82016-12-21 19:07:54 +05301874 if (!tx_ops) {
1875 WMA_LOGE("%s: pointer to lmac if tx ops is NULL", __func__);
1876 return QDF_STATUS_E_INVAL;
1877 }
1878
1879 /* mgmt_txrx component's tx ops */
1880 tx_ops->mgmt_txrx_tx_ops.mgmt_tx_send = wma_mgmt_unified_cmd_send;
1881
Frank Liu65b17d92016-11-23 15:58:44 +08001882 return QDF_STATUS_SUCCESS;
1883}
1884
1885/**
1886 * wma_target_if_open() - Attach UMAC modules' interface with wmi layer
1887 * @wma_handle: wma handle
1888 *
1889 * Separate module defines below functions:
1890 * 1. tgt_wmi_<module>_<action> api sends wmi command, assigned to south bound
1891 * tx_ops function pointers;
1892 * 2. module's south dispatcher handles information from lower layer, assigned
1893 * to south bound rx_ops function pointers;
1894 * 3. wmi event handler deals with wmi event, extracts umac needed information,
1895 * and call rx_ops(module's dispatcher). It executes in tasklet context and
1896 * is up to dispatcher to decide the context to reside in tasklet or in
1897 * thread context.
1898 *
1899 * Return: None
1900 */
1901static void wma_target_if_open(tp_wma_handle wma_handle)
1902{
Selvaraj, Sridhar0672a122016-12-29 16:11:48 +05301903 struct wlan_objmgr_psoc *psoc = wma_handle->psoc;
Frank Liu65b17d92016-11-23 15:58:44 +08001904
1905 if (!psoc)
1906 return;
1907
Mukul Sharmadad267e2017-02-04 13:25:34 +05301908 wlan_global_lmac_if_set_txops_registration_cb(WLAN_DEV_OL,
1909 target_if_register_tx_ops);
1910 wlan_lmac_if_set_umac_txops_registration_cb(
1911 wma_register_tx_ops_handler);
1912 wlan_global_lmac_if_open(psoc);
Frank Liu65b17d92016-11-23 15:58:44 +08001913
Frank Liu65b17d92016-11-23 15:58:44 +08001914}
1915
1916/**
1917 * wma_target_if_close() - Detach UMAC modules' interface with wmi layer
1918 * @wma_handle: wma handle
1919 *
1920 * Return: None
1921 */
1922static void wma_target_if_close(tp_wma_handle wma_handle)
1923{
Selvaraj, Sridhar0672a122016-12-29 16:11:48 +05301924 struct wlan_objmgr_psoc *psoc = wma_handle->psoc;
Frank Liu65b17d92016-11-23 15:58:44 +08001925
1926 if (!psoc)
1927 return;
1928
Mukul Sharmadad267e2017-02-04 13:25:34 +05301929 wlan_global_lmac_if_close(psoc);
Frank Liu65b17d92016-11-23 15:58:44 +08001930}
Frank Liu65b17d92016-11-23 15:58:44 +08001931
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05301932/**
Mukul Sharmac3e7a782017-02-03 12:16:11 +05301933 * wma_get_psoc_from_scn_handle() - API to get psoc from scn handle
1934 * @scn_handle: opaque wma handle
1935 *
1936 * API to get psoc from scn handle
1937 *
1938 * Return: None
1939 */
1940static struct wlan_objmgr_psoc *wma_get_psoc_from_scn_handle(void *scn_handle)
1941{
1942 tp_wma_handle wma_handle;
1943
1944 if (!scn_handle) {
1945 WMA_LOGE("invalid scn handle");
1946 return NULL;
1947 }
1948 wma_handle = (tp_wma_handle)scn_handle;
1949
1950 return wma_handle->psoc;
1951}
Rajeev Kumarda2444c2017-01-10 22:42:07 -08001952/**
1953 * wma_legacy_service_ready_event_handler() - legacy (ext)service ready handler
1954 * @event_id: event_id
1955 * @handle: wma handle
1956 * @event_data: event data
1957 * @length: event length
1958 *
1959 * Return: 0 for success, negative error code for failure
1960 */
1961static int wma_legacy_service_ready_event_handler(uint32_t event_id,
1962 void *handle,
1963 uint8_t *event_data,
1964 uint32_t length)
1965{
1966 if (wmi_service_ready_event_id == event_id)
1967 return wma_rx_service_ready_event(handle, event_data, length);
1968 else if (wmi_service_ready_ext_event_id == event_id)
1969 return wma_rx_service_ready_ext_event(handle, event_data,
1970 length);
1971 else
1972 QDF_BUG(0);
1973
1974 return 0;
1975}
Mukul Sharmac3e7a782017-02-03 12:16:11 +05301976
1977/**
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08001978 * wma_flush_complete_evt_handler() - FW log flush complete event handler
1979 * @handle: WMI handle
1980 * @event: Event recevied from FW
1981 * @len: Length of the event
1982 *
1983 */
1984static int wma_flush_complete_evt_handler(void *handle,
1985 u_int8_t *event,
1986 u_int32_t len)
1987{
1988 QDF_STATUS status;
1989 tp_wma_handle wma = (tp_wma_handle) handle;
1990
1991 WMI_DEBUG_MESG_FLUSH_COMPLETE_EVENTID_param_tlvs *param_buf;
1992 wmi_debug_mesg_flush_complete_fixed_param *wmi_event;
1993 uint32_t reason_code;
1994
1995 param_buf = (WMI_DEBUG_MESG_FLUSH_COMPLETE_EVENTID_param_tlvs *) event;
1996 if (!param_buf) {
1997 WMA_LOGE("Invalid log flush complete event buffer");
1998 return QDF_STATUS_E_FAILURE;
1999 }
2000
2001 wmi_event = param_buf->fixed_param;
2002 reason_code = wmi_event->reserved0;
2003
2004 /*
2005 * reason_code = 0; Flush event in response to flush command
2006 * reason_code = other value; Asynchronous flush event for fatal events
2007 */
2008 if (!reason_code && (cds_is_log_report_in_progress() == false)) {
2009 WMA_LOGE("Received WMI flush event without sending CMD");
2010 return -EINVAL;
2011 } else if (!reason_code && cds_is_log_report_in_progress() == true) {
2012 /* Flush event in response to flush command */
2013 WMA_LOGI("Received WMI flush event in response to flush CMD");
2014 status = qdf_mc_timer_stop(&wma->log_completion_timer);
2015 if (status != QDF_STATUS_SUCCESS)
2016 WMA_LOGE("Failed to stop the log completion timeout");
2017 cds_logging_set_fw_flush_complete();
2018 } else if (reason_code && cds_is_log_report_in_progress() == false) {
2019 /* Asynchronous flush event for fatal events */
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002020 status = cds_set_log_completion(WLAN_LOG_TYPE_FATAL,
2021 WLAN_LOG_INDICATOR_FIRMWARE,
2022 reason_code, false);
2023 if (QDF_STATUS_SUCCESS != status) {
2024 WMA_LOGE("%s: Failed to set log trigger params",
2025 __func__);
2026 return QDF_STATUS_E_FAILURE;
2027 }
2028 cds_logging_set_fw_flush_complete();
2029 return status;
2030 } else {
2031 /* Asynchronous flush event for fatal event,
2032 * but, report in progress already
2033 */
2034 WMA_LOGI("%s: Bug report already in progress - dropping! type:%d, indicator=%d reason_code=%d",
2035 __func__, WLAN_LOG_TYPE_FATAL,
2036 WLAN_LOG_INDICATOR_FIRMWARE, reason_code);
2037 return QDF_STATUS_E_FAILURE;
2038 }
2039 return 0;
2040}
2041
2042/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002043 * wma_open() - Allocate wma context and initialize it.
Selvaraj, Sridhar0672a122016-12-29 16:11:48 +05302044 * @psoc: Psoc pointer
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002045 * @cds_context: cds context
2046 * @wma_tgt_cfg_cb: tgt config callback fun
2047 * @radar_ind_cb: dfs radar indication callback
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302048 * @cds_cfg: mac parameters
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002049 *
2050 * Return: 0 on success, errno on failure
2051 */
Selvaraj, Sridhar0672a122016-12-29 16:11:48 +05302052QDF_STATUS wma_open(struct wlan_objmgr_psoc *psoc, void *cds_context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002053 wma_tgt_cfg_cb tgt_cfg_cb,
2054 wma_dfs_radar_indication_cb radar_ind_cb,
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302055 struct cds_config_info *cds_cfg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002056{
2057 tp_wma_handle wma_handle;
2058 HTC_HANDLE htc_handle;
Anurag Chouhan6d760662016-02-20 16:05:43 +05302059 qdf_device_t qdf_dev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002060 void *wmi_handle;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302061 QDF_STATUS qdf_status;
Govind Singhd76a5b02016-03-08 15:12:14 +05302062 struct wmi_rx_ops ops;
2063
2064 bool use_cookie = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002065
2066 WMA_LOGD("%s: Enter", __func__);
2067
Mukul Sharma5ff3c582016-09-12 15:23:35 +05302068 g_wmi_version_info.major = __WMI_VER_MAJOR_;
2069 g_wmi_version_info.minor = __WMI_VER_MINOR_;
2070 g_wmi_version_info.revision = __WMI_REVISION_;
2071
Anurag Chouhan6d760662016-02-20 16:05:43 +05302072 qdf_dev = cds_get_context(QDF_MODULE_ID_QDF_DEVICE);
2073 htc_handle = cds_get_context(QDF_MODULE_ID_HTC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002074
2075 if (!htc_handle) {
2076 WMA_LOGP("%s: Invalid HTC handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302077 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002078 }
2079
2080 /* Alloc memory for WMA Context */
Anurag Chouhan6d760662016-02-20 16:05:43 +05302081 qdf_status = cds_alloc_context(cds_context, QDF_MODULE_ID_WMA,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002082 (void **)&wma_handle,
2083 sizeof(t_wma_handle));
2084
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302085 if (qdf_status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002086 WMA_LOGP("%s: Memory allocation failed for wma_handle",
2087 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302088 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002089 }
2090
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302091 qdf_mem_zero(wma_handle, sizeof(t_wma_handle));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002092
Anurag Chouhan6d760662016-02-20 16:05:43 +05302093 if (cds_get_conparam() != QDF_GLOBAL_FTM_MODE) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002094#ifdef FEATURE_WLAN_SCAN_PNO
Anurag Chouhana37b5b72016-02-21 14:53:42 +05302095 qdf_wake_lock_create(&wma_handle->pno_wake_lock, "wlan_pno_wl");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002096#endif /* FEATURE_WLAN_SCAN_PNO */
2097#ifdef FEATURE_WLAN_EXTSCAN
Anurag Chouhana37b5b72016-02-21 14:53:42 +05302098 qdf_wake_lock_create(&wma_handle->extscan_wake_lock,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002099 "wlan_extscan_wl");
2100#endif /* FEATURE_WLAN_EXTSCAN */
Anurag Chouhana37b5b72016-02-21 14:53:42 +05302101 qdf_wake_lock_create(&wma_handle->wow_wake_lock, "wlan_wow_wl");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002102 }
2103
Selvaraj, Sridhar3a1823f2017-02-01 17:32:21 +05302104 qdf_status = wlan_objmgr_psoc_try_get_ref(psoc, WLAN_LEGACY_WMA_ID);
2105 if (QDF_IS_STATUS_ERROR(qdf_status)) {
2106 WMA_LOGE("%s: PSOC get_ref fails", __func__);
2107 return qdf_status;
2108 }
Selvaraj, Sridhar0672a122016-12-29 16:11:48 +05302109 wma_handle->psoc = psoc;
2110
Rajeev Kumarda2444c2017-01-10 22:42:07 -08002111 /* Open target_if layer and register wma callback */
2112 wma_target_if_open(wma_handle);
2113 target_if_open(wma_get_psoc_from_scn_handle);
2114
Govind Singhd76a5b02016-03-08 15:12:14 +05302115 /* Attach mc_thread context processing function */
2116 ops.wma_process_fw_event_handler_cbk = wma_process_fw_event_handler;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002117 /* attach the wmi */
Govind Singhd76a5b02016-03-08 15:12:14 +05302118 wmi_handle = wmi_unified_attach(wma_handle, NULL,
Mukul Sharmacc1f3f92017-01-30 19:56:24 +05302119 WMI_TLV_TARGET, use_cookie, &ops, psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002120 if (!wmi_handle) {
2121 WMA_LOGP("%s: failed to attach WMI", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302122 qdf_status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002123 goto err_wma_handle;
2124 }
2125
Rajeev Kumarda2444c2017-01-10 22:42:07 -08002126 target_if_register_legacy_service_ready_cb(
2127 wma_legacy_service_ready_event_handler);
2128
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002129 WMA_LOGA("WMA --> wmi_unified_attach - success");
Mukul Sharmacc1f3f92017-01-30 19:56:24 +05302130
2131 /* set the wmi handle (as tgt_if_handle) in psoc */
2132 wlan_psoc_obj_lock(psoc);
2133 wlan_psoc_set_tgt_if_handle(psoc, wmi_handle);
2134 wlan_psoc_obj_unlock(psoc);
2135
Govind Singhd76a5b02016-03-08 15:12:14 +05302136 wmi_unified_register_event_handler(wmi_handle,
2137 WMI_SERVICE_READY_EVENTID,
Rajeev Kumarda2444c2017-01-10 22:42:07 -08002138 init_deinit_service_ready_event_handler,
Govind Singhd76a5b02016-03-08 15:12:14 +05302139 WMA_RX_SERIALIZER_CTX);
2140 wmi_unified_register_event_handler(wmi_handle,
2141 WMI_SERVICE_READY_EXT_EVENTID,
Rajeev Kumarda2444c2017-01-10 22:42:07 -08002142 init_deinit_service_ext_ready_event_handler,
Govind Singhd76a5b02016-03-08 15:12:14 +05302143 WMA_RX_SERIALIZER_CTX);
2144 wmi_unified_register_event_handler(wmi_handle,
2145 WMI_READY_EVENTID,
2146 wma_rx_ready_event,
2147 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002148 /* Save the WMI & HTC handle */
2149 wma_handle->wmi_handle = wmi_handle;
2150 wma_handle->htc_handle = htc_handle;
2151 wma_handle->cds_context = cds_context;
Anurag Chouhan6d760662016-02-20 16:05:43 +05302152 wma_handle->qdf_dev = qdf_dev;
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302153 wma_handle->max_scan = cds_cfg->max_scan;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002154
Houston Hoffmanc45db892015-11-13 19:59:25 -08002155 wma_handle->wma_runtime_resume_lock =
2156 qdf_runtime_lock_init("wma_runtime_resume");
2157
Manishekar Chandrasekaranebcab882016-05-04 12:55:14 +05302158 /* Initialize max_no_of_peers for wma_get_number_of_peers_supported() */
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302159 wma_init_max_no_of_peers(wma_handle, cds_cfg->max_station);
Manishekar Chandrasekaranebcab882016-05-04 12:55:14 +05302160 /* Cap maxStation based on the target version */
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302161 cds_cfg->max_station = wma_get_number_of_peers_supported(wma_handle);
Manishekar Chandrasekaranebcab882016-05-04 12:55:14 +05302162 /* Reinitialize max_no_of_peers based on the capped maxStation value */
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302163 wma_init_max_no_of_peers(wma_handle, cds_cfg->max_station);
Manishekar Chandrasekaranebcab882016-05-04 12:55:14 +05302164
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002165 /* initialize default target config */
2166 wma_set_default_tgt_config(wma_handle);
2167
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302168 wma_handle->tx_chain_mask_cck = cds_cfg->tx_chain_mask_cck;
2169 wma_handle->self_gen_frm_pwr = cds_cfg->self_gen_frm_pwr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002170
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002171 /* Allocate dfs_ic and initialize DFS */
2172 wma_handle->dfs_ic = wma_dfs_attach(wma_handle->dfs_ic);
2173 if (wma_handle->dfs_ic == NULL) {
2174 WMA_LOGE("%s: Memory allocation failed for dfs_ic", __func__);
2175 goto err_wmi_handle;
2176 }
2177#if defined(QCA_WIFI_FTM)
Anurag Chouhan6d760662016-02-20 16:05:43 +05302178 if (cds_get_conparam() == QDF_GLOBAL_FTM_MODE)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002179 wma_utf_attach(wma_handle);
2180#endif /* QCA_WIFI_FTM */
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302181 wma_init_max_no_of_peers(wma_handle, cds_cfg->max_station);
2182 cds_cfg->max_station = wma_get_number_of_peers_supported(wma_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002183
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302184 cds_cfg->max_bssid = WMA_MAX_SUPPORTED_BSS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002185
2186 wma_handle->wlan_resource_config.num_wow_filters =
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302187 cds_cfg->max_wow_filters;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002188 wma_handle->wlan_resource_config.num_keep_alive_pattern =
2189 WMA_MAXNUM_PERIODIC_TX_PTRNS;
2190
2191 /* The current firmware implementation requires the number of
Anurag Chouhanffb21542016-02-17 14:33:03 +05302192 * offload peers should be (number of vdevs + 1).
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002193 */
2194 wma_handle->wlan_resource_config.num_offload_peers =
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302195 cds_cfg->ap_maxoffload_peers + 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002196
2197 wma_handle->wlan_resource_config.num_offload_reorder_buffs =
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302198 cds_cfg->ap_maxoffload_reorderbuffs + 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002199
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302200 wma_handle->ol_ini_info = cds_cfg->ol_ini_info;
2201 wma_handle->max_station = cds_cfg->max_station;
2202 wma_handle->max_bssid = cds_cfg->max_bssid;
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302203 wma_handle->driver_type = cds_cfg->driver_type;
2204 wma_handle->ssdp = cds_cfg->ssdp;
2205 wma_handle->enable_mc_list = cds_cfg->enable_mc_list;
Anurag Chouhan04dbf6d2016-09-08 15:32:52 +05302206 wma_handle->bpf_packet_filter_enable =
2207 cds_cfg->bpf_packet_filter_enable;
Dustin Brown13995f02017-01-12 15:38:42 -08002208 wma_handle->active_bpf_mode = cds_cfg->active_bpf_mode;
Srinivas Girigowda57b450e2016-10-27 21:00:46 -07002209 wma_handle->link_stats_results = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002210#ifdef FEATURE_WLAN_RA_FILTERING
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302211 wma_handle->IsRArateLimitEnabled = cds_cfg->is_ra_ratelimit_enabled;
2212 wma_handle->RArateLimitInterval = cds_cfg->ra_ratelimit_interval;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002213#endif /* FEATURE_WLAN_RA_FILTERING */
2214#ifdef WLAN_FEATURE_LPSS
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302215 wma_handle->is_lpass_enabled = cds_cfg->is_lpass_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002216#endif
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302217 wma_set_nan_enable(wma_handle, cds_cfg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002218 /*
2219 * Indicates if DFS Phyerr filtering offload
2220 * is Enabled/Disabed from ini
2221 */
2222 wma_handle->dfs_phyerr_filter_offload =
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302223 cds_cfg->dfs_phyerr_filter_offload;
2224 wma_handle->dfs_pri_multiplier = cds_cfg->dfs_pri_multiplier;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302225 wma_handle->interfaces = qdf_mem_malloc(sizeof(struct wma_txrx_node) *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002226 wma_handle->max_bssid);
2227 if (!wma_handle->interfaces) {
2228 WMA_LOGP("%s: failed to allocate interface table", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302229 qdf_status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002230 goto err_scn_context;
2231 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302232 qdf_mem_zero(wma_handle->interfaces, sizeof(struct wma_txrx_node) *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002233 wma_handle->max_bssid);
2234 /* Register the debug print event handler */
2235 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Govind Singhd76a5b02016-03-08 15:12:14 +05302236 WMI_DEBUG_PRINT_EVENTID,
2237 wma_unified_debug_print_event_handler,
2238 WMA_RX_SERIALIZER_CTX);
Govind Singha471e5e2015-10-12 17:11:14 +05302239 /* Register profiling event Handler */
2240 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2241 WMI_WLAN_PROFILE_DATA_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302242 wma_profile_data_report_event_handler,
2243 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002244
2245 wma_handle->tgt_cfg_update_cb = tgt_cfg_cb;
2246 wma_handle->dfs_radar_indication_cb = radar_ind_cb;
2247 wma_handle->old_hw_mode_index = WMA_DEFAULT_HW_MODE_INDEX;
2248 wma_handle->new_hw_mode_index = WMA_DEFAULT_HW_MODE_INDEX;
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05302249 wma_handle->saved_chan.num_channels = 0;
Sandeep Puligillaafa52892016-10-26 19:03:16 -07002250 wma_handle->fw_timeout_crash = cds_cfg->fw_timeout_crash;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002251
Anurag Chouhandf2b2682016-02-29 14:15:27 +05302252 qdf_status = qdf_event_create(&wma_handle->wma_ready_event);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302253 if (qdf_status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002254 WMA_LOGP("%s: wma_ready_event initialization failed", __func__);
2255 goto err_event_init;
2256 }
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05302257
Anurag Chouhan210db072016-02-22 18:42:15 +05302258 qdf_status = qdf_mc_timer_init(&wma_handle->service_ready_ext_timer,
Anurag Chouhan6d760662016-02-20 16:05:43 +05302259 QDF_TIMER_TYPE_SW,
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05302260 wma_service_ready_ext_evt_timeout,
2261 wma_handle);
Anurag Chouhandf2b2682016-02-29 14:15:27 +05302262 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05302263 WMA_LOGE("Failed to initialize service ready ext timeout");
2264 goto err_event_init;
2265 }
2266
Anurag Chouhandf2b2682016-02-29 14:15:27 +05302267 qdf_status = qdf_event_create(&wma_handle->target_suspend);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302268 if (qdf_status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002269 WMA_LOGP("%s: target suspend event initialization failed",
2270 __func__);
2271 goto err_event_init;
2272 }
2273
2274 /* Init Tx Frame Complete event */
Anurag Chouhandf2b2682016-02-29 14:15:27 +05302275 qdf_status = qdf_event_create(&wma_handle->tx_frm_download_comp_event);
2276 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002277 WMA_LOGP("%s: failed to init tx_frm_download_comp_event",
2278 __func__);
2279 goto err_event_init;
2280 }
2281
2282 /* Init tx queue empty check event */
Anurag Chouhandf2b2682016-02-29 14:15:27 +05302283 qdf_status = qdf_event_create(&wma_handle->tx_queue_empty_event);
2284 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002285 WMA_LOGP("%s: failed to init tx_queue_empty_event", __func__);
2286 goto err_event_init;
2287 }
2288
Anurag Chouhandf2b2682016-02-29 14:15:27 +05302289 qdf_status = qdf_event_create(&wma_handle->wma_resume_event);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302290 if (qdf_status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002291 WMA_LOGP("%s: wma_resume_event initialization failed",
2292 __func__);
2293 goto err_event_init;
2294 }
2295
Prashanth Bhattae675ca72016-10-20 18:42:37 -07002296 qdf_status = cds_shutdown_notifier_register(wma_shutdown_notifier_cb,
2297 wma_handle);
2298 if (qdf_status != QDF_STATUS_SUCCESS) {
2299 WMA_LOGP("%s: Shutdown notifier register failed: %d",
2300 __func__, qdf_status);
2301 goto err_event_init;
2302 }
2303
Anurag Chouhandf2b2682016-02-29 14:15:27 +05302304 qdf_status = qdf_event_create(&wma_handle->runtime_suspend);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302305 if (qdf_status != QDF_STATUS_SUCCESS) {
Houston Hoffmana76591b2015-11-10 16:52:05 -08002306 WMA_LOGP("%s: runtime_suspend event initialization failed",
2307 __func__);
2308 goto err_event_init;
2309 }
2310
Anurag Chouhandf2b2682016-02-29 14:15:27 +05302311 qdf_status = qdf_event_create(&wma_handle->recovery_event);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302312 if (qdf_status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002313 WMA_LOGP("%s: recovery event initialization failed", __func__);
2314 goto err_event_init;
2315 }
2316
Anurag Chouhanffb21542016-02-17 14:33:03 +05302317 qdf_list_create(&wma_handle->vdev_resp_queue,
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -07002318 MAX_ENTRY_VDEV_RESP_QUEUE);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05302319 qdf_spinlock_create(&wma_handle->vdev_respq_lock);
Anurag Chouhanffb21542016-02-17 14:33:03 +05302320 qdf_list_create(&wma_handle->wma_hold_req_queue,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002321 MAX_ENTRY_HOLD_REQ_QUEUE);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05302322 qdf_spinlock_create(&wma_handle->wma_hold_req_q_lock);
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05302323 qdf_atomic_init(&wma_handle->is_wow_bus_suspended);
2324 qdf_atomic_init(&wma_handle->scan_id_counter);
Nitesh Shah0f3fce52016-10-13 22:01:41 +05302325 qdf_atomic_init(&wma_handle->num_pending_scans);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002326
2327 /* Register vdev start response event handler */
2328 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2329 WMI_VDEV_START_RESP_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302330 wma_vdev_start_resp_handler,
2331 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002332
2333 /* Register vdev stop response event handler */
2334 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2335 WMI_VDEV_STOPPED_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302336 wma_vdev_stop_resp_handler,
2337 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002338
2339 /* register for STA kickout function */
2340 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2341 WMI_PEER_STA_KICKOUT_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302342 wma_peer_sta_kickout_event_handler,
2343 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002344
2345 /* register for stats response event */
2346 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2347 WMI_UPDATE_STATS_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302348 wma_stats_event_handler,
2349 WMA_RX_SERIALIZER_CTX);
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05302350
2351#ifdef WLAN_POWER_DEBUGFS
2352 /* register for Chip Power stats event */
2353 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2354 WMI_PDEV_CHIP_POWER_STATS_EVENTID,
2355 wma_unified_power_debug_stats_event_handler,
2356 WMA_RX_SERIALIZER_CTX);
2357#endif
2358
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002359 /* register for linkspeed response event */
2360 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2361 WMI_PEER_ESTIMATED_LINKSPEED_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302362 wma_link_speed_event_handler,
2363 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002364
2365#ifdef FEATURE_OEM_DATA_SUPPORT
2366 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08002367 WMI_OEM_RESPONSE_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302368 wma_oem_data_response_handler,
2369 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002370#endif /* FEATURE_OEM_DATA_SUPPORT */
2371 /*
2372 * Register appropriate DFS phyerr event handler for
2373 * Phyerror events. Handlers differ for phyerr filtering
2374 * offload enable and disable cases.
2375 */
2376 wma_register_dfs_event_handler(wma_handle);
2377
2378 /* Register peer change event handler */
2379 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2380 WMI_PEER_STATE_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302381 wma_peer_state_change_event_handler,
2382 WMA_RX_WORK_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002383
2384 /* Register beacon tx complete event id. The event is required
2385 * for sending channel switch announcement frames
2386 */
2387 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Govind Singhd76a5b02016-03-08 15:12:14 +05302388 WMI_OFFLOAD_BCN_TX_STATUS_EVENTID,
2389 wma_unified_bcntx_status_event_handler,
2390 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002391
2392 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2393 WMI_UPDATE_VDEV_RATE_STATS_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302394 wma_link_status_event_handler,
2395 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002396#ifdef WLAN_FEATURE_LINK_LAYER_STATS
2397 /* Register event handler for processing Link Layer Stats
2398 * response from the FW
2399 */
2400 wma_register_ll_stats_event_handler(wma_handle);
2401
2402#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
2403
2404 /*
2405 * Register event handler to receive firmware mem dump
2406 * copy complete indication
2407 */
2408 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2409 WMI_UPDATE_FW_MEM_DUMP_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302410 wma_fw_mem_dump_event_handler,
2411 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002412
2413 /* Firmware debug log */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302414 qdf_status = dbglog_init(wma_handle->wmi_handle);
2415 if (qdf_status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002416 WMA_LOGP("%s: Firmware Dbglog initialization failed", __func__);
2417 goto err_dbglog_init;
2418 }
2419
2420 /*
2421 * Update Powersave mode
2422 * 1 - Legacy Powersave + Deepsleep Disabled
2423 * 2 - QPower + Deepsleep Disabled
2424 * 3 - Legacy Powersave + Deepsleep Enabled
2425 * 4 - QPower + Deepsleep Enabled
2426 */
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302427 wma_handle->powersave_mode = cds_cfg->powersave_offload_enabled;
2428 wma_handle->staMaxLIModDtim = cds_cfg->sta_maxlimod_dtim;
2429 wma_handle->staModDtim = cds_cfg->sta_mod_dtim;
2430 wma_handle->staDynamicDtim = cds_cfg->sta_dynamic_dtim;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002431
2432 /*
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302433 * Value of cds_cfg->wow_enable can be,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002434 * 0 - Disable both magic pattern match and pattern byte match.
2435 * 1 - Enable magic pattern match on all interfaces.
2436 * 2 - Enable pattern byte match on all interfaces.
2437 * 3 - Enable both magic patter and pattern byte match on
2438 * all interfaces.
2439 */
2440 wma_handle->wow.magic_ptrn_enable =
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302441 (cds_cfg->wow_enable & 0x01) ? true : false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002442 wma_handle->ptrn_match_enable_all_vdev =
Arun Khandavallic811dcc2016-06-26 07:37:21 +05302443 (cds_cfg->wow_enable & 0x02) ? true : false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002444
2445#ifdef FEATURE_WLAN_TDLS
2446 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2447 WMI_TDLS_PEER_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302448 wma_tdls_event_handler,
2449 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002450#endif /* FEATURE_WLAN_TDLS */
2451
2452 /* register for install key completion event */
2453 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Govind Singhd76a5b02016-03-08 15:12:14 +05302454 WMI_VDEV_INSTALL_KEY_COMPLETE_EVENTID,
2455 wma_vdev_install_key_complete_event_handler,
2456 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002457#ifdef WLAN_FEATURE_NAN
2458 /* register for nan response event */
2459 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2460 WMI_NAN_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302461 wma_nan_rsp_event_handler,
2462 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002463#endif /* WLAN_FEATURE_NAN */
2464
2465#ifdef WLAN_FEATURE_STATS_EXT
2466 /* register for extended stats event */
2467 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2468 WMI_STATS_EXT_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302469 wma_stats_ext_event_handler,
2470 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002471#endif /* WLAN_FEATURE_STATS_EXT */
2472#ifdef FEATURE_WLAN_EXTSCAN
2473 wma_register_extscan_event_handler(wma_handle);
2474#endif /* WLAN_FEATURE_STATS_EXT */
2475
2476 WMA_LOGD("%s: Exit", __func__);
2477
2478#ifdef WLAN_FEATURE_ROAM_OFFLOAD
2479 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2480 WMI_ROAM_SYNCH_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302481 wma_roam_synch_event_handler,
2482 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002483#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
2484 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2485 WMI_RSSI_BREACH_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302486 wma_rssi_breached_event_handler,
2487 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002488
Anurag Chouhana37b5b72016-02-21 14:53:42 +05302489 qdf_wake_lock_create(&wma_handle->wmi_cmd_rsp_wake_lock,
Govind Singhd76a5b02016-03-08 15:12:14 +05302490 "wlan_fw_rsp_wakelock");
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002491 wma_handle->wmi_cmd_rsp_runtime_lock =
Anurag Chouhana37b5b72016-02-21 14:53:42 +05302492 qdf_runtime_lock_init("wlan_fw_rsp_runtime_lock");
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002493
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002494 /* Register peer assoc conf event handler */
2495 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2496 WMI_PEER_ASSOC_CONF_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302497 wma_peer_assoc_conf_handler,
2498 WMA_RX_SERIALIZER_CTX);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002499 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2500 WMI_VDEV_DELETE_RESP_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302501 wma_vdev_delete_handler,
2502 WMA_RX_SERIALIZER_CTX);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002503 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2504 WMI_PEER_DELETE_RESP_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05302505 wma_peer_delete_handler,
2506 WMA_RX_SERIALIZER_CTX);
Arun Khandavalli2476ef52016-04-26 20:19:43 +05302507 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2508 WMI_BPF_CAPABILIY_INFO_EVENTID,
2509 wma_get_bpf_caps_event_handler,
2510 WMA_RX_SERIALIZER_CTX);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +05302511 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2512 WMI_VDEV_ENCRYPT_DECRYPT_DATA_RESP_EVENTID,
2513 wma_encrypt_decrypt_msg_handler,
2514 WMA_RX_SERIALIZER_CTX);
Kapil Gupta4f0c0c12017-02-07 15:21:15 +05302515 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2516 WMI_CHAN_INFO_EVENTID,
2517 wma_chan_info_event_handler,
2518 WMA_RX_SERIALIZER_CTX);
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002519 wmi_unified_register_event_handler(wma_handle->wmi_handle,
2520 WMI_DEBUG_MESG_FLUSH_COMPLETE_EVENTID,
2521 wma_flush_complete_evt_handler,
Rajeev Kumarc3032b82017-02-14 15:56:01 -08002522 WMA_RX_WORK_CTX);
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002523
Deepak Dhamdherebf1f9b12016-05-27 14:49:41 -07002524 wma_ndp_register_all_event_handlers(wma_handle);
Frank Liu65b17d92016-11-23 15:58:44 +08002525
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05302526 wma_register_debug_callback();
2527
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302528 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002529
2530err_dbglog_init:
Anurag Chouhana37b5b72016-02-21 14:53:42 +05302531 qdf_wake_lock_destroy(&wma_handle->wmi_cmd_rsp_wake_lock);
2532 qdf_runtime_lock_deinit(wma_handle->wmi_cmd_rsp_runtime_lock);
2533 qdf_spinlock_destroy(&wma_handle->vdev_respq_lock);
2534 qdf_spinlock_destroy(&wma_handle->wma_hold_req_q_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002535err_event_init:
2536 wmi_unified_unregister_event_handler(wma_handle->wmi_handle,
2537 WMI_DEBUG_PRINT_EVENTID);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302538 qdf_mem_free(wma_handle->interfaces);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002539err_scn_context:
2540 wma_dfs_detach(wma_handle->dfs_ic);
2541#if defined(QCA_WIFI_FTM)
2542 wma_utf_detach(wma_handle);
2543#endif /* QCA_WIFI_FTM */
2544err_wmi_handle:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302545 qdf_mem_free(((p_cds_contextType) cds_context)->cfg_ctx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002546 OS_FREE(wmi_handle);
2547
2548err_wma_handle:
2549
Anurag Chouhan6d760662016-02-20 16:05:43 +05302550 if (cds_get_conparam() != QDF_GLOBAL_FTM_MODE) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002551#ifdef FEATURE_WLAN_SCAN_PNO
Anurag Chouhana37b5b72016-02-21 14:53:42 +05302552 qdf_wake_lock_destroy(&wma_handle->pno_wake_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002553#endif /* FEATURE_WLAN_SCAN_PNO */
2554#ifdef FEATURE_WLAN_EXTSCAN
Anurag Chouhana37b5b72016-02-21 14:53:42 +05302555 qdf_wake_lock_destroy(&wma_handle->extscan_wake_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002556#endif /* FEATURE_WLAN_EXTSCAN */
Anurag Chouhana37b5b72016-02-21 14:53:42 +05302557 qdf_wake_lock_destroy(&wma_handle->wow_wake_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002558 }
Houston Hoffmanc45db892015-11-13 19:59:25 -08002559
2560 qdf_runtime_lock_deinit(wma_handle->wma_runtime_resume_lock);
Anurag Chouhan6d760662016-02-20 16:05:43 +05302561 cds_free_context(cds_context, QDF_MODULE_ID_WMA, wma_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002562
2563 WMA_LOGD("%s: Exit", __func__);
2564
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302565 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002566}
2567
2568/**
2569 * wma_pre_start() - wma pre start
2570 * @cds_ctx: cds context
2571 *
2572 * Return: 0 on success, errno on failure
2573 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302574QDF_STATUS wma_pre_start(void *cds_ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002575{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302576 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002577 A_STATUS status = A_OK;
2578 tp_wma_handle wma_handle;
Rajeev Kumarb60abe42017-01-21 15:39:31 -08002579 struct scheduler_msg wma_msg = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002580
2581 WMA_LOGD("%s: Enter", __func__);
2582
Anurag Chouhan6d760662016-02-20 16:05:43 +05302583 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002584
2585 /* Validate the wma_handle */
2586 if (NULL == wma_handle) {
2587 WMA_LOGP("%s: invalid argument", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302588 qdf_status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002589 goto end;
2590 }
2591 /* Open endpoint for ctrl path - WMI <--> HTC */
2592 status = wmi_unified_connect_htc_service(wma_handle->wmi_handle,
2593 wma_handle->htc_handle);
2594 if (A_OK != status) {
2595 WMA_LOGP("%s: wmi_unified_connect_htc_service", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302596 qdf_status = QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002597 goto end;
2598 }
2599
2600 WMA_LOGA("WMA --> wmi_unified_connect_htc_service - success");
2601
2602 /* Trigger the CFG DOWNLOAD */
2603 wma_msg.type = WNI_CFG_DNLD_REQ;
2604 wma_msg.bodyptr = NULL;
2605 wma_msg.bodyval = 0;
2606
Rajeev Kumarb60abe42017-01-21 15:39:31 -08002607 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA, &wma_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302608 if (QDF_STATUS_SUCCESS != qdf_status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002609 WMA_LOGP("%s: Failed to post WNI_CFG_DNLD_REQ msg", __func__);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302610 QDF_ASSERT(0);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302611 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002612 }
2613end:
2614 WMA_LOGD("%s: Exit", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302615 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002616}
2617
2618/**
2619 * wma_send_msg() - Send wma message to PE.
2620 * @wma_handle: wma handle
2621 * @msg_type: message type
2622 * @body_ptr: message body ptr
2623 * @body_val: message body value
2624 *
2625 * Return: none
2626 */
2627void wma_send_msg(tp_wma_handle wma_handle, uint16_t msg_type,
2628 void *body_ptr, uint32_t body_val)
2629{
Rajeev Kumar416b73f2017-01-21 16:45:21 -08002630 struct scheduler_msg msg = { 0 };
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302631 uint32_t status = QDF_STATUS_SUCCESS;
Anurag Chouhan6d760662016-02-20 16:05:43 +05302632 tpAniSirGlobal pMac = cds_get_context(QDF_MODULE_ID_PE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002633 msg.type = msg_type;
2634 msg.bodyval = body_val;
2635 msg.bodyptr = body_ptr;
2636 status = lim_post_msg_api(pMac, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302637 if (QDF_STATUS_SUCCESS != status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002638 if (NULL != body_ptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302639 qdf_mem_free(body_ptr);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302640 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002641 }
2642 return;
2643}
2644
2645/**
2646 * wma_set_base_macaddr_indicate() - set base mac address in fw
2647 * @wma_handle: wma handle
2648 * @customAddr: base mac address
2649 *
2650 * Return: 0 for success or error code
2651 */
2652static int wma_set_base_macaddr_indicate(tp_wma_handle wma_handle,
2653 tSirMacAddr *customAddr)
2654{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002655 int err;
2656
Govind Singhf25a0f12016-03-08 16:09:48 +05302657 err = wmi_unified_set_base_macaddr_indicate_cmd(wma_handle->wmi_handle,
2658 (uint8_t *)customAddr);
2659 if (err)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002660 return -EIO;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002661 WMA_LOGD("Base MAC Addr: " MAC_ADDRESS_STR,
2662 MAC_ADDR_ARRAY((*customAddr)));
2663
2664 return 0;
2665}
2666
2667/**
2668 * wma_log_supported_evt_handler() - Enable/Disable FW diag/log events
2669 * @handle: WMA handle
2670 * @event: Event received from FW
2671 * @len: Length of the event
2672 *
2673 * Enables the low frequency events and disables the high frequency
2674 * events. Bit 17 indicates if the event if low/high frequency.
2675 * 1 - high frequency, 0 - low frequency
2676 *
2677 * Return: 0 on successfully enabling/disabling the events
2678 */
2679static int wma_log_supported_evt_handler(void *handle,
2680 uint8_t *event,
2681 uint32_t len)
2682{
2683 tp_wma_handle wma = (tp_wma_handle) handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002684
Govind Singhf25a0f12016-03-08 16:09:48 +05302685 if (wmi_unified_log_supported_evt_cmd(wma->wmi_handle,
2686 event, len))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002687 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002688
2689 return 0;
2690}
2691
2692/**
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05302693 * wma_pdev_set_hw_mode_resp_evt_handler() - Set HW mode resp evt handler
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002694 * @handle: WMI handle
2695 * @event: Event recevied from FW
2696 * @len: Length of the event
2697 *
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05302698 * Event handler for WMI_PDEV_SET_HW_MODE_RESP_EVENTID that is sent to host
2699 * driver in response to a WMI_PDEV_SET_HW_MODE_CMDID being sent to WLAN
2700 * firmware
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002701 *
2702 * Return: Success on receiving valid params from FW
2703 */
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05302704static int wma_pdev_set_hw_mode_resp_evt_handler(void *handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002705 uint8_t *event,
2706 uint32_t len)
2707{
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05302708 WMI_PDEV_SET_HW_MODE_RESP_EVENTID_param_tlvs *param_buf;
2709 wmi_pdev_set_hw_mode_response_event_fixed_param *wmi_event;
2710 wmi_pdev_set_hw_mode_response_vdev_mac_entry *vdev_mac_entry;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002711 uint32_t i;
2712 struct sir_set_hw_mode_resp *hw_mode_resp;
2713 tp_wma_handle wma = (tp_wma_handle) handle;
2714
2715 if (!wma) {
2716 WMA_LOGE("%s: Invalid WMA handle", __func__);
2717 /* Since WMA handle itself is NULL, we cannot send fail
2718 * response back to LIM here
2719 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302720 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002721 }
2722
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302723 hw_mode_resp = qdf_mem_malloc(sizeof(*hw_mode_resp));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002724 if (!hw_mode_resp) {
2725 WMA_LOGI("%s: Memory allocation failed", __func__);
2726 /* Since this memory allocation itself failed, we cannot
2727 * send fail response back to LIM here
2728 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302729 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002730 }
2731
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05302732 param_buf = (WMI_PDEV_SET_HW_MODE_RESP_EVENTID_param_tlvs *) event;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002733 if (!param_buf) {
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05302734 WMA_LOGE("Invalid WMI_PDEV_SET_HW_MODE_RESP_EVENTID event");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002735 /* Need to send response back to upper layer to free
2736 * active command list
2737 */
2738 goto fail;
2739 }
2740
2741 wmi_event = param_buf->fixed_param;
2742 hw_mode_resp->status = wmi_event->status;
2743 hw_mode_resp->cfgd_hw_mode_index = wmi_event->cfgd_hw_mode_index;
2744 hw_mode_resp->num_vdev_mac_entries = wmi_event->num_vdev_mac_entries;
2745
2746 WMA_LOGI("%s: status:%d cfgd_hw_mode_index:%d num_vdev_mac_entries:%d",
2747 __func__, wmi_event->status,
2748 wmi_event->cfgd_hw_mode_index,
2749 wmi_event->num_vdev_mac_entries);
2750 vdev_mac_entry =
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05302751 param_buf->wmi_pdev_set_hw_mode_response_vdev_mac_mapping;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002752
2753 /* Store the vdev-mac map in WMA and prepare to send to PE */
2754 for (i = 0; i < wmi_event->num_vdev_mac_entries; i++) {
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05302755 uint32_t vdev_id, mac_id, pdev_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002756 vdev_id = vdev_mac_entry[i].vdev_id;
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05302757 pdev_id = vdev_mac_entry[i].pdev_id;
2758 if (pdev_id == WMI_PDEV_ID_SOC) {
2759 WMA_LOGE("%s: soc level id received for mac id)",
2760 __func__);
2761 QDF_BUG(0);
2762 goto fail;
2763 }
2764 mac_id = WMA_PDEV_TO_MAC_MAP(vdev_mac_entry[i].pdev_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002765
2766 WMA_LOGI("%s: vdev_id:%d mac_id:%d",
2767 __func__, vdev_id, mac_id);
2768
2769 hw_mode_resp->vdev_mac_map[i].vdev_id = vdev_id;
2770 hw_mode_resp->vdev_mac_map[i].mac_id = mac_id;
2771 wma_update_intf_hw_mode_params(vdev_id, mac_id,
2772 wmi_event->cfgd_hw_mode_index);
2773 }
2774
2775 if (hw_mode_resp->status == SET_HW_MODE_STATUS_OK) {
2776 if (WMA_DEFAULT_HW_MODE_INDEX == wma->new_hw_mode_index) {
2777 wma->new_hw_mode_index = wmi_event->cfgd_hw_mode_index;
2778 } else {
2779 wma->old_hw_mode_index = wma->new_hw_mode_index;
2780 wma->new_hw_mode_index = wmi_event->cfgd_hw_mode_index;
2781 }
2782 }
2783
2784 WMA_LOGI("%s: Updated: old_hw_mode_index:%d new_hw_mode_index:%d",
2785 __func__, wma->old_hw_mode_index, wma->new_hw_mode_index);
2786
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05302787 wma_send_msg(wma, SIR_HAL_PDEV_SET_HW_MODE_RESP,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002788 (void *) hw_mode_resp, 0);
2789
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302790 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002791
2792fail:
2793 WMA_LOGE("%s: Sending fail response to LIM", __func__);
2794 hw_mode_resp->status = SET_HW_MODE_STATUS_ECANCELED;
2795 hw_mode_resp->cfgd_hw_mode_index = 0;
2796 hw_mode_resp->num_vdev_mac_entries = 0;
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05302797 wma_send_msg(wma, SIR_HAL_PDEV_SET_HW_MODE_RESP,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002798 (void *) hw_mode_resp, 0);
2799
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302800 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002801}
2802
2803/**
Naveen Rawat8cc23b02016-07-14 12:22:56 -07002804 * wma_process_pdev_hw_mode_trans_ind() - Process HW mode transition info
2805 *
2806 * @handle: WMA handle
2807 * @fixed_param: Event fixed parameters
2808 * @vdev_mac_entry - vdev mac entry
2809 * @hw_mode_trans_ind - Buffer to store parsed information
2810 *
2811 * Parses fixed_param, vdev_mac_entry and fills in the information into
2812 * hw_mode_trans_ind and wma
2813 *
2814 * Return: None
2815 */
2816void wma_process_pdev_hw_mode_trans_ind(void *handle,
2817 wmi_pdev_hw_mode_transition_event_fixed_param *fixed_param,
2818 wmi_pdev_set_hw_mode_response_vdev_mac_entry *vdev_mac_entry,
2819 struct sir_hw_mode_trans_ind *hw_mode_trans_ind)
2820{
2821 uint32_t i;
2822 tp_wma_handle wma = (tp_wma_handle) handle;
2823
2824 hw_mode_trans_ind->old_hw_mode_index = fixed_param->old_hw_mode_index;
2825 hw_mode_trans_ind->new_hw_mode_index = fixed_param->new_hw_mode_index;
2826 hw_mode_trans_ind->num_vdev_mac_entries =
2827 fixed_param->num_vdev_mac_entries;
2828 WMA_LOGI("%s: old_hw_mode_index:%d new_hw_mode_index:%d entries=%d",
2829 __func__, fixed_param->old_hw_mode_index,
2830 fixed_param->new_hw_mode_index,
2831 fixed_param->num_vdev_mac_entries);
2832
2833 /* Store the vdev-mac map in WMA and send to policy manager */
2834 for (i = 0; i < fixed_param->num_vdev_mac_entries; i++) {
2835 uint32_t vdev_id, mac_id, pdev_id;
2836 vdev_id = vdev_mac_entry[i].vdev_id;
2837 pdev_id = vdev_mac_entry[i].pdev_id;
2838
2839 if (pdev_id == WMI_PDEV_ID_SOC) {
2840 WMA_LOGE("%s: soc level id received for mac id)",
2841 __func__);
2842 QDF_BUG(0);
2843 return;
2844 }
2845
2846 mac_id = WMA_PDEV_TO_MAC_MAP(vdev_mac_entry[i].pdev_id);
2847
2848 WMA_LOGI("%s: vdev_id:%d mac_id:%d",
2849 __func__, vdev_id, mac_id);
2850
2851 hw_mode_trans_ind->vdev_mac_map[i].vdev_id = vdev_id;
2852 hw_mode_trans_ind->vdev_mac_map[i].mac_id = mac_id;
2853 wma_update_intf_hw_mode_params(vdev_id, mac_id,
2854 fixed_param->new_hw_mode_index);
2855 }
2856 wma->old_hw_mode_index = fixed_param->old_hw_mode_index;
2857 wma->new_hw_mode_index = fixed_param->new_hw_mode_index;
2858
2859 WMA_LOGI("%s: Updated: old_hw_mode_index:%d new_hw_mode_index:%d",
2860 __func__, wma->old_hw_mode_index, wma->new_hw_mode_index);
2861}
2862
2863/**
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05302864 * wma_pdev_hw_mode_transition_evt_handler() - HW mode transition evt handler
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002865 * @handle: WMI handle
2866 * @event: Event recevied from FW
2867 * @len: Length of the event
2868 *
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05302869 * Event handler for WMI_PDEV_HW_MODE_TRANSITION_EVENTID that indicates an
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002870 * asynchronous hardware mode transition. This event notifies the host driver
2871 * that firmware independently changed the hardware mode for some reason, such
2872 * as Coex, LFR 3.0, etc
2873 *
2874 * Return: Success on receiving valid params from FW
2875 */
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05302876static int wma_pdev_hw_mode_transition_evt_handler(void *handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002877 uint8_t *event,
2878 uint32_t len)
2879{
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05302880 WMI_PDEV_HW_MODE_TRANSITION_EVENTID_param_tlvs *param_buf;
2881 wmi_pdev_hw_mode_transition_event_fixed_param *wmi_event;
2882 wmi_pdev_set_hw_mode_response_vdev_mac_entry *vdev_mac_entry;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002883 struct sir_hw_mode_trans_ind *hw_mode_trans_ind;
2884 tp_wma_handle wma = (tp_wma_handle) handle;
2885
2886 if (!wma) {
2887 /* This is an async event. So, not sending any event to LIM */
2888 WMA_LOGE("Invalid WMA handle");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302889 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002890 }
2891
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05302892 param_buf = (WMI_PDEV_HW_MODE_TRANSITION_EVENTID_param_tlvs *) event;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002893 if (!param_buf) {
2894 /* This is an async event. So, not sending any event to LIM */
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05302895 WMA_LOGE("Invalid WMI_PDEV_HW_MODE_TRANSITION_EVENTID event");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302896 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002897 }
2898
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302899 hw_mode_trans_ind = qdf_mem_malloc(sizeof(*hw_mode_trans_ind));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002900 if (!hw_mode_trans_ind) {
2901 WMA_LOGI("%s: Memory allocation failed", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302902 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002903 }
2904
2905 wmi_event = param_buf->fixed_param;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002906 vdev_mac_entry =
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05302907 param_buf->wmi_pdev_set_hw_mode_response_vdev_mac_mapping;
Naveen Rawat8cc23b02016-07-14 12:22:56 -07002908 wma_process_pdev_hw_mode_trans_ind(wma, wmi_event, vdev_mac_entry,
2909 hw_mode_trans_ind);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002910 /* Pass the message to PE */
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05302911 wma_send_msg(wma, SIR_HAL_PDEV_HW_MODE_TRANS_IND,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002912 (void *) hw_mode_trans_ind, 0);
2913
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302914 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002915}
2916
2917/**
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05302918 * wma_pdev_set_dual_mode_config_resp_evt_handler() - Dual mode evt handler
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002919 * @handle: WMI handle
2920 * @event: Event received from FW
2921 * @len: Length of the event
2922 *
2923 * Notifies the host driver of the completion or failure of a
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05302924 * WMI_PDEV_SET_MAC_CONFIG_CMDID command. This event would be returned to
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002925 * the host driver once the firmware has completed a reconfiguration of the Scan
2926 * and FW mode configuration. This changes could include entering or leaving a
2927 * dual mac configuration for either scan and/or more permanent firmware mode.
2928 *
2929 * Return: Success on receiving valid params from FW
2930 */
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05302931static int wma_pdev_set_dual_mode_config_resp_evt_handler(void *handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002932 uint8_t *event,
2933 uint32_t len)
2934{
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05302935 WMI_PDEV_SET_MAC_CONFIG_RESP_EVENTID_param_tlvs *param_buf;
2936 wmi_pdev_set_mac_config_response_event_fixed_param *wmi_event;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002937 tp_wma_handle wma = (tp_wma_handle) handle;
2938 struct sir_dual_mac_config_resp *dual_mac_cfg_resp;
2939
2940 if (!wma) {
2941 WMA_LOGE("%s: Invalid WMA handle", __func__);
2942 /* Since the WMA handle is NULL, we cannot send resp to LIM.
2943 * So, returning from here.
2944 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302945 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002946 }
2947
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302948 dual_mac_cfg_resp = qdf_mem_malloc(sizeof(*dual_mac_cfg_resp));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002949 if (!dual_mac_cfg_resp) {
2950 WMA_LOGE("%s: Memory allocation failed", __func__);
2951 /* Since the mem alloc failed, we cannot send resp to LIM.
2952 * So, returning from here.
2953 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302954 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002955 }
2956
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05302957 param_buf = (WMI_PDEV_SET_MAC_CONFIG_RESP_EVENTID_param_tlvs *)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002958 event;
2959 if (!param_buf) {
2960 WMA_LOGE("%s: Invalid event", __func__);
2961 goto fail;
2962 }
2963
2964 wmi_event = param_buf->fixed_param;
2965 WMA_LOGI("%s: status:%d", __func__, wmi_event->status);
2966 dual_mac_cfg_resp->status = wmi_event->status;
2967
2968 if (SET_HW_MODE_STATUS_OK == dual_mac_cfg_resp->status) {
2969 wma->dual_mac_cfg.prev_scan_config =
2970 wma->dual_mac_cfg.cur_scan_config;
2971 wma->dual_mac_cfg.prev_fw_mode_config =
2972 wma->dual_mac_cfg.cur_fw_mode_config;
2973 wma->dual_mac_cfg.cur_scan_config =
2974 wma->dual_mac_cfg.req_scan_config;
2975 wma->dual_mac_cfg.cur_fw_mode_config =
2976 wma->dual_mac_cfg.req_fw_mode_config;
2977 }
2978
2979 /* Pass the message to PE */
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05302980 wma_send_msg(wma, SIR_HAL_PDEV_MAC_CFG_RESP,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002981 (void *) dual_mac_cfg_resp, 0);
2982
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302983 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002984
2985fail:
2986 WMA_LOGE("%s: Sending fail response to LIM", __func__);
2987 dual_mac_cfg_resp->status = SET_HW_MODE_STATUS_ECANCELED;
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05302988 wma_send_msg(wma, SIR_HAL_PDEV_MAC_CFG_RESP,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002989 (void *) dual_mac_cfg_resp, 0);
2990
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302991 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002992
2993}
2994
2995/**
2996 * wma_start() - wma start function.
2997 * Intialize event handlers and timers.
2998 * @cds_ctx: cds context
2999 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303000 * Return: 0 on success, QDF Error on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003001 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303002QDF_STATUS wma_start(void *cds_ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003003{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303004 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003005 tp_wma_handle wma_handle;
3006 int status;
3007 WMA_LOGD("%s: Enter", __func__);
3008
Anurag Chouhan6d760662016-02-20 16:05:43 +05303009 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003010
3011 /* validate the wma_handle */
3012 if (NULL == wma_handle) {
3013 WMA_LOGP("%s: Invalid handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303014 qdf_status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003015 goto end;
3016 }
Sandeep Puligillad0004212017-02-26 18:34:56 -08003017#ifndef NAPIER_SCAN
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003018 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
3019 WMI_SCAN_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05303020 wma_scan_event_callback,
3021 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003022 if (0 != status) {
3023 WMA_LOGP("%s: Failed to register scan callback", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303024 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003025 goto end;
3026 }
Sandeep Puligillad0004212017-02-26 18:34:56 -08003027#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003028 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
3029 WMI_ROAM_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05303030 wma_roam_event_callback,
Padma, Santhosh Kumar18169ce2017-03-02 18:04:02 +05303031 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003032 if (0 != status) {
3033 WMA_LOGP("%s: Failed to register Roam callback", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303034 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003035 goto end;
3036 }
3037
3038 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
3039 WMI_WOW_WAKEUP_HOST_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05303040 wma_wow_wakeup_host_event,
3041 WMA_RX_TASKLET_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003042 if (status) {
3043 WMA_LOGP("%s: Failed to register wow wakeup host event handler",
3044 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303045 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003046 goto end;
3047 }
3048
3049 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
3050 WMI_PDEV_RESUME_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05303051 wma_pdev_resume_event_handler,
3052 WMA_RX_TASKLET_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003053 if (status) {
3054 WMA_LOGP("%s: Failed to register PDEV resume event handler",
3055 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303056 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003057 goto end;
3058 }
3059
3060#ifdef FEATURE_WLAN_SCAN_PNO
3061 if (WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
3062 WMI_SERVICE_NLO)) {
3063
3064 WMA_LOGD("FW supports pno offload, registering nlo match handler");
3065
3066 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
Govind Singhd76a5b02016-03-08 15:12:14 +05303067 WMI_NLO_MATCH_EVENTID,
3068 wma_nlo_match_evt_handler,
3069 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003070 if (status) {
3071 WMA_LOGE("Failed to register nlo match event cb");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303072 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003073 goto end;
3074 }
3075
3076 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
Govind Singhd76a5b02016-03-08 15:12:14 +05303077 WMI_NLO_SCAN_COMPLETE_EVENTID,
3078 wma_nlo_scan_cmp_evt_handler,
3079 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003080 if (status) {
3081 WMA_LOGE("Failed to register nlo scan comp event cb");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303082 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003083 goto end;
3084 }
3085 }
3086#endif /* FEATURE_WLAN_SCAN_PNO */
3087
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05303088#if defined(QCA_LL_LEGACY_TX_FLOW_CONTROL) || \
3089 defined(QCA_LL_TX_FLOW_CONTROL_V2) || defined(CONFIG_HL_SUPPORT)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003090 WMA_LOGE("MCC TX Pause Event Handler register");
3091 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
Govind Singhd76a5b02016-03-08 15:12:14 +05303092 WMI_TX_PAUSE_EVENTID,
3093 wma_mcc_vdev_tx_pause_evt_handler,
3094 WMA_RX_TASKLET_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003095#endif /* QCA_LL_LEGACY_TX_FLOW_CONTROL */
3096
3097#ifdef FEATURE_WLAN_CH_AVOID
3098 WMA_LOGD("Registering channel to avoid handler");
3099
3100 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
Govind Singhd76a5b02016-03-08 15:12:14 +05303101 WMI_WLAN_FREQ_AVOID_EVENTID,
3102 wma_channel_avoid_evt_handler,
3103 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003104 if (status) {
3105 WMA_LOGE("Failed to register channel to avoid event cb");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303106 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003107 goto end;
3108 }
3109#endif /* FEATURE_WLAN_CH_AVOID */
3110#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
3111 WMA_LOGD("Registering auto shutdown handler");
3112 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
Govind Singhd76a5b02016-03-08 15:12:14 +05303113 WMI_HOST_AUTO_SHUTDOWN_EVENTID,
3114 wma_auto_shutdown_event_handler,
3115 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003116 if (status) {
3117 WMA_LOGE("Failed to register WMI Auto shutdown event handler");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303118 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003119 goto end;
3120 }
3121#endif /* FEATURE_WLAN_AUTO_SHUTDOWN */
3122 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
Govind Singhd76a5b02016-03-08 15:12:14 +05303123 WMI_THERMAL_MGMT_EVENTID,
3124 wma_thermal_mgmt_evt_handler,
3125 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003126 if (status) {
3127 WMA_LOGE("Failed to register thermal mitigation event cb");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303128 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003129 goto end;
3130 }
3131
3132 status = wma_ocb_register_event_handlers(wma_handle);
3133 if (status) {
3134 WMA_LOGE("Failed to register ocb event handlers");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303135 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003136 goto end;
3137 }
3138
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303139 qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003140
3141#ifdef QCA_WIFI_FTM
3142 /*
3143 * Tx mgmt attach requires TXRX context which is not created
3144 * in FTM mode. So skip the TX mgmt attach.
3145 */
Anurag Chouhan6d760662016-02-20 16:05:43 +05303146 if (cds_get_conparam() == QDF_GLOBAL_FTM_MODE)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003147 goto end;
3148#endif /* QCA_WIFI_FTM */
3149
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003150 if (WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
3151 WMI_SERVICE_RMC)) {
3152
3153 WMA_LOGD("FW supports cesium network, registering event handlers");
3154
3155 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
3156 WMI_PEER_INFO_EVENTID,
3157 wma_ibss_peer_info_event_handler,
3158 WMA_RX_SERIALIZER_CTX);
3159 if (status) {
3160 WMA_LOGE("Failed to register ibss peer info event cb");
3161 qdf_status = QDF_STATUS_E_FAILURE;
3162 goto end;
3163 }
3164
3165 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
3166 WMI_PEER_TX_FAIL_CNT_THR_EVENTID,
3167 wma_fast_tx_fail_event_handler,
3168 WMA_RX_SERIALIZER_CTX);
3169 if (status) {
3170 WMA_LOGE("Failed to register peer fast tx failure event cb");
3171 qdf_status = QDF_STATUS_E_FAILURE;
3172 goto end;
3173 }
3174 } else {
3175 WMA_LOGE("Target does not support cesium network");
3176 }
3177
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303178 qdf_status = wma_tx_attach(wma_handle);
3179 if (qdf_status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003180 WMA_LOGP("%s: Failed to register tx management", __func__);
3181 goto end;
3182 }
3183
3184 /* Initialize log completion timeout */
Anurag Chouhan210db072016-02-22 18:42:15 +05303185 qdf_status = qdf_mc_timer_init(&wma_handle->log_completion_timer,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303186 QDF_TIMER_TYPE_SW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003187 wma_log_completion_timeout,
3188 wma_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303189 if (qdf_status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003190 WMA_LOGE("Failed to initialize log completion timeout");
3191 goto end;
3192 }
3193
3194 /* Initialize the get temperature event handler */
3195 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
Govind Singhd76a5b02016-03-08 15:12:14 +05303196 WMI_PDEV_TEMPERATURE_EVENTID,
3197 wma_pdev_temperature_evt_handler,
3198 WMA_RX_SERIALIZER_CTX);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303199 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003200 WMA_LOGE("Failed to register get_temperature event cb");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303201 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003202 goto end;
3203 }
3204
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07003205 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
3206 WMI_VDEV_TSF_REPORT_EVENTID,
3207 wma_vdev_tsf_handler,
3208 WMA_RX_SERIALIZER_CTX);
3209 if (0 != status) {
3210 WMA_LOGP("%s: Failed to register tsf callback", __func__);
3211 qdf_status = QDF_STATUS_E_FAILURE;
3212 goto end;
3213 }
3214
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303215 /* Initialize the wma_pdev_set_hw_mode_resp_evt_handler event handler */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003216 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303217 WMI_PDEV_SET_HW_MODE_RESP_EVENTID,
3218 wma_pdev_set_hw_mode_resp_evt_handler,
Govind Singhd76a5b02016-03-08 15:12:14 +05303219 WMA_RX_SERIALIZER_CTX);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303220 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003221 WMA_LOGE("Failed to register set hw mode resp event cb");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303222 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003223 goto end;
3224 }
3225
3226 /* Initialize the WMI_SOC_HW_MODE_TRANSITION_EVENTID event handler */
3227 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05303228 WMI_PDEV_HW_MODE_TRANSITION_EVENTID,
3229 wma_pdev_hw_mode_transition_evt_handler,
Govind Singhd76a5b02016-03-08 15:12:14 +05303230 WMA_RX_SERIALIZER_CTX);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303231 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003232 WMA_LOGE("Failed to register hw mode transition event cb");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303233 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003234 goto end;
3235 }
3236
3237 /* Initialize the set dual mac configuration event handler */
3238 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05303239 WMI_PDEV_SET_MAC_CONFIG_RESP_EVENTID,
3240 wma_pdev_set_dual_mode_config_resp_evt_handler,
Govind Singhd76a5b02016-03-08 15:12:14 +05303241 WMA_RX_SERIALIZER_CTX);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303242 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003243 WMA_LOGE("Failed to register hw mode transition event cb");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303244 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003245 goto end;
3246 }
3247
Peng Xu8fdaa492016-06-22 10:20:47 -07003248 /* Initialize the P2P Listen Offload event handler */
3249 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
3250 WMI_P2P_LISTEN_OFFLOAD_STOPPED_EVENTID,
3251 wma_p2p_lo_event_handler,
3252 WMA_RX_SERIALIZER_CTX);
3253 if (!QDF_IS_STATUS_SUCCESS(status)) {
3254 WMA_LOGE("Failed to register p2p lo event cb");
3255 qdf_status = QDF_STATUS_E_FAILURE;
3256 goto end;
3257 }
3258
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003259end:
3260 WMA_LOGD("%s: Exit", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303261 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003262}
3263
3264/**
3265 * wma_stop() - wma stop function.
3266 * cleanup timers and suspend target.
3267 * @cds_ctx: cds context
3268 * @reason: reason for wma_stop.
3269 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303270 * Return: 0 on success, QDF Error on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003271 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303272QDF_STATUS wma_stop(void *cds_ctx, uint8_t reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003273{
3274 tp_wma_handle wma_handle;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303275 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Govind Singhede435f2015-12-01 16:16:36 +05303276 int i;
Anurag Chouhan6d760662016-02-20 16:05:43 +05303277 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003278
3279 WMA_LOGD("%s: Enter", __func__);
3280
3281 /* validate the wma_handle */
3282 if (NULL == wma_handle) {
3283 WMA_LOGP("%s: Invalid handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303284 qdf_status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003285 goto end;
3286 }
3287#ifdef QCA_WIFI_FTM
3288 /*
3289 * Tx mgmt detach requires TXRX context which is not created
3290 * in FTM mode. So skip the TX mgmt detach.
3291 */
Anurag Chouhan6d760662016-02-20 16:05:43 +05303292 if (cds_get_conparam() == QDF_GLOBAL_FTM_MODE) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303293 qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003294 goto end;
3295 }
3296#endif /* QCA_WIFI_FTM */
3297
3298 if (wma_handle->ack_work_ctx) {
3299 cds_flush_work(&wma_handle->ack_work_ctx->ack_cmp_work);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303300 qdf_mem_free(wma_handle->ack_work_ctx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003301 wma_handle->ack_work_ctx = NULL;
3302 }
3303
3304 /* Destroy the timer for log completion */
Anurag Chouhan210db072016-02-22 18:42:15 +05303305 qdf_status = qdf_mc_timer_destroy(&wma_handle->log_completion_timer);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303306 if (qdf_status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003307 WMA_LOGE("Failed to destroy the log completion timer");
3308 }
3309
Govind Singhede435f2015-12-01 16:16:36 +05303310 /* clean up ll-queue for all vdev */
3311 for (i = 0; i < wma_handle->max_bssid; i++) {
3312 if (wma_handle->interfaces[i].handle &&
Mukul Sharmaf9047232017-03-02 16:58:56 +05303313 wma_is_vdev_up(i)) {
Leo Chang96464902016-10-28 11:10:54 -07003314 cdp_fc_vdev_flush(
3315 cds_get_context(QDF_MODULE_ID_SOC),
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003316 wma_handle->
3317 interfaces[i].handle);
Govind Singhede435f2015-12-01 16:16:36 +05303318 }
3319 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303320 qdf_status = wma_tx_detach(wma_handle);
3321 if (qdf_status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003322 WMA_LOGP("%s: Failed to deregister tx management", __func__);
3323 goto end;
3324 }
3325
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003326end:
3327 WMA_LOGD("%s: Exit", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303328 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003329}
3330
3331/**
3332 * wma_cleanup_hold_req() - cleanup hold request queue
3333 * @wma: wma handle
3334 *
3335 * Return: none
3336 */
3337static void wma_cleanup_hold_req(tp_wma_handle wma)
3338{
3339 struct wma_target_req *req_msg = NULL;
Anurag Chouhanffb21542016-02-17 14:33:03 +05303340 qdf_list_node_t *node1 = NULL;
3341 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003342
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303343 qdf_spin_lock_bh(&wma->wma_hold_req_q_lock);
Anurag Chouhanffb21542016-02-17 14:33:03 +05303344 if (!qdf_list_size(&wma->wma_hold_req_queue)) {
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303345 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
Krishna Kumaar Natarajanea08e502015-11-09 16:57:40 -08003346 WMA_LOGI(FL("request queue is empty"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003347 return;
3348 }
3349
Anurag Chouhanffb21542016-02-17 14:33:03 +05303350 while (QDF_STATUS_SUCCESS !=
3351 qdf_list_peek_front(&wma->wma_hold_req_queue, &node1)) {
Anurag Chouhanc5548422016-02-24 18:33:27 +05303352 req_msg = qdf_container_of(node1, struct wma_target_req, node);
Anurag Chouhanffb21542016-02-17 14:33:03 +05303353 status = qdf_list_remove_node(&wma->wma_hold_req_queue, node1);
3354 if (QDF_STATUS_SUCCESS != status) {
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303355 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003356 WMA_LOGE(FL("Failed to remove request for vdev_id %d type %d"),
3357 req_msg->vdev_id, req_msg->type);
3358 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003359 }
Anurag Chouhan210db072016-02-22 18:42:15 +05303360 qdf_mc_timer_destroy(&req_msg->event_timeout);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303361 qdf_mem_free(req_msg);
Krishna Kumaar Natarajanea08e502015-11-09 16:57:40 -08003362 }
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303363 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003364}
3365
3366/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003367 * wma_wmi_service_close() - close wma wmi service interface.
3368 * @cds_ctx: cds context
3369 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303370 * Return: 0 on success, QDF Error on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003371 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303372QDF_STATUS wma_wmi_service_close(void *cds_ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003373{
3374 tp_wma_handle wma_handle;
3375 struct beacon_info *bcn;
3376 int i;
3377
3378 WMA_LOGD("%s: Enter", __func__);
3379
Anurag Chouhan6d760662016-02-20 16:05:43 +05303380 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003381
3382 /* validate the wma_handle */
3383 if (NULL == wma_handle) {
3384 WMA_LOGE("%s: Invalid wma handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303385 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003386 }
3387
3388 /* validate the wmi handle */
3389 if (NULL == wma_handle->wmi_handle) {
3390 WMA_LOGE("%s: Invalid wmi handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303391 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003392 }
3393
3394 /* dettach the wmi serice */
3395 WMA_LOGD("calling wmi_unified_detach");
3396 wmi_unified_detach(wma_handle->wmi_handle);
3397 wma_handle->wmi_handle = NULL;
3398
3399 for (i = 0; i < wma_handle->max_bssid; i++) {
3400 bcn = wma_handle->interfaces[i].beacon;
3401
3402 if (bcn) {
3403 if (bcn->dma_mapped)
Nirav Shahcbc6d722016-03-01 16:24:53 +05303404 qdf_nbuf_unmap_single(wma_handle->qdf_dev,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303405 bcn->buf, QDF_DMA_TO_DEVICE);
Nirav Shahcbc6d722016-03-01 16:24:53 +05303406 qdf_nbuf_free(bcn->buf);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303407 qdf_mem_free(bcn);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003408 wma_handle->interfaces[i].beacon = NULL;
3409 }
3410
3411 if (wma_handle->interfaces[i].handle) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303412 qdf_mem_free(wma_handle->interfaces[i].handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003413 wma_handle->interfaces[i].handle = NULL;
3414 }
Yue Ma664effc2016-01-12 18:43:54 -08003415
3416 if (wma_handle->interfaces[i].addBssStaContext) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303417 qdf_mem_free(wma_handle->
Yue Ma664effc2016-01-12 18:43:54 -08003418 interfaces[i].addBssStaContext);
3419 wma_handle->interfaces[i].addBssStaContext = NULL;
3420 }
3421
3422 if (wma_handle->interfaces[i].del_staself_req) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303423 qdf_mem_free(wma_handle->interfaces[i].del_staself_req);
Yue Ma664effc2016-01-12 18:43:54 -08003424 wma_handle->interfaces[i].del_staself_req = NULL;
3425 }
yeshwanth sriram guntuka8dd80382017-01-30 17:04:58 +05303426
3427 if (wma_handle->interfaces[i].stats_rsp) {
3428 qdf_mem_free(wma_handle->interfaces[i].stats_rsp);
3429 wma_handle->interfaces[i].stats_rsp = NULL;
3430 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003431 }
3432
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303433 qdf_mem_free(wma_handle->interfaces);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003434 /* free the wma_handle */
Anurag Chouhan6d760662016-02-20 16:05:43 +05303435 cds_free_context(wma_handle->cds_context, QDF_MODULE_ID_WMA,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003436 wma_handle);
3437
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303438 qdf_mem_free(((p_cds_contextType) cds_ctx)->cfg_ctx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003439 WMA_LOGD("%s: Exit", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303440 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003441}
3442
Xun Luoa858a472015-11-10 08:24:45 -08003443/**
3444 * wma_wmi_work_close() - close the work queue items associated with WMI
3445 * @cds_ctx: Pointer to cds context
3446 *
3447 * This function closes work queue items associated with WMI, but not fully
3448 * closes WMI service.
3449 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303450 * Return: QDF_STATUS_SUCCESS if work close is successful. Otherwise
Xun Luoa858a472015-11-10 08:24:45 -08003451 * proper error codes.
3452 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303453QDF_STATUS wma_wmi_work_close(void *cds_ctx)
Xun Luoa858a472015-11-10 08:24:45 -08003454{
3455 tp_wma_handle wma_handle;
3456
3457 WMA_LOGD("%s: Enter", __func__);
3458
Anurag Chouhan6d760662016-02-20 16:05:43 +05303459 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Xun Luoa858a472015-11-10 08:24:45 -08003460
3461 /* validate the wma_handle */
3462 if (NULL == wma_handle) {
3463 WMA_LOGE("%s: Invalid wma handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303464 return QDF_STATUS_E_INVAL;
Xun Luoa858a472015-11-10 08:24:45 -08003465 }
3466
3467 /* validate the wmi handle */
3468 if (NULL == wma_handle->wmi_handle) {
3469 WMA_LOGE("%s: Invalid wmi handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303470 return QDF_STATUS_E_INVAL;
Xun Luoa858a472015-11-10 08:24:45 -08003471 }
3472
3473 /* remove the wmi work */
3474 WMA_LOGD("calling wmi_unified_remove_work");
3475 wmi_unified_remove_work(wma_handle->wmi_handle);
3476
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303477 return QDF_STATUS_SUCCESS;
Xun Luoa858a472015-11-10 08:24:45 -08003478}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003479
Krunal Soni2e48d012016-05-02 16:55:26 -07003480/**
3481 * wma_cleanup_dbs_phy_caps() - release memory allocated for holding ext cap
3482 * @wma_handle: pointer to wma handle
3483 *
3484 * This function releases all the memory created for holding extended
3485 * capabilities per hardware mode and per PHY
3486 *
3487 * Return: void
3488 */
3489static void wma_cleanup_dbs_phy_caps(t_wma_handle *wma_handle)
3490{
3491 if (NULL == wma_handle) {
3492 WMA_LOGE("%s: Invalid wma handle", __func__);
3493 return;
3494 }
3495
3496 if (wma_handle->phy_caps.hw_mode_to_mac_cap_map) {
3497 qdf_mem_free(wma_handle->phy_caps.hw_mode_to_mac_cap_map);
3498 wma_handle->phy_caps.hw_mode_to_mac_cap_map = NULL;
3499 WMA_LOGI("%s: hw_mode_to_mac_cap_map freed", __func__);
3500 }
3501
3502 if (wma_handle->phy_caps.each_hw_mode_cap) {
3503 qdf_mem_free(wma_handle->phy_caps.each_hw_mode_cap);
3504 wma_handle->phy_caps.each_hw_mode_cap = NULL;
3505 WMA_LOGI("%s: each_hw_mode_cap freed", __func__);
3506 }
3507
3508 if (wma_handle->phy_caps.each_phy_cap_per_hwmode) {
3509 qdf_mem_free(wma_handle->phy_caps.each_phy_cap_per_hwmode);
3510 wma_handle->phy_caps.each_phy_cap_per_hwmode = NULL;
3511 WMA_LOGI("%s: each_phy_cap_per_hwmode freed", __func__);
3512 }
3513
3514 if (wma_handle->phy_caps.each_phy_hal_reg_cap) {
3515 qdf_mem_free(wma_handle->phy_caps.each_phy_hal_reg_cap);
3516 wma_handle->phy_caps.each_phy_hal_reg_cap = NULL;
3517 WMA_LOGI("%s: each_phy_hal_reg_cap freed", __func__);
3518 }
3519}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003520
3521/**
3522 * wma_close() - wma close function.
3523 * cleanup resources attached with wma.
3524 * @cds_ctx: cds context
3525 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303526 * Return: 0 on success, QDF Error on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003527 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303528QDF_STATUS wma_close(void *cds_ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003529{
3530 tp_wma_handle wma_handle;
3531 uint32_t idx;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303532 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003533
3534 WMA_LOGD("%s: Enter", __func__);
3535
Anurag Chouhan6d760662016-02-20 16:05:43 +05303536 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003537
3538 /* validate the wma_handle */
3539 if (NULL == wma_handle) {
3540 WMA_LOGE("%s: Invalid wma handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303541 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003542 }
3543
3544 /* validate the wmi handle */
3545 if (NULL == wma_handle->wmi_handle) {
3546 WMA_LOGP("%s: Invalid wmi handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303547 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003548 }
3549
3550 /* Free DBS list */
3551 if (wma_handle->hw_mode.hw_mode_list) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303552 qdf_mem_free(wma_handle->hw_mode.hw_mode_list);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003553 wma_handle->hw_mode.hw_mode_list = NULL;
3554 WMA_LOGI("%s: DBS list is freed", __func__);
3555 }
Krunal Soni2e48d012016-05-02 16:55:26 -07003556 wma_cleanup_dbs_phy_caps(wma_handle);
Anurag Chouhan6d760662016-02-20 16:05:43 +05303557 if (cds_get_conparam() != QDF_GLOBAL_FTM_MODE) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003558#ifdef FEATURE_WLAN_SCAN_PNO
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303559 qdf_wake_lock_destroy(&wma_handle->pno_wake_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003560#endif /* FEATURE_WLAN_SCAN_PNO */
3561#ifdef FEATURE_WLAN_EXTSCAN
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303562 qdf_wake_lock_destroy(&wma_handle->extscan_wake_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003563#endif /* FEATURE_WLAN_EXTSCAN */
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303564 qdf_wake_lock_destroy(&wma_handle->wow_wake_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003565 }
3566
3567 /* unregister Firmware debug log */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303568 qdf_status = dbglog_deinit(wma_handle->wmi_handle);
3569 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003570 WMA_LOGP("%s: dbglog_deinit failed", __func__);
3571
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303572 /* close the qdf events */
Anurag Chouhandf2b2682016-02-29 14:15:27 +05303573 qdf_event_destroy(&wma_handle->wma_ready_event);
Anurag Chouhan210db072016-02-22 18:42:15 +05303574 qdf_status = qdf_mc_timer_destroy(&wma_handle->service_ready_ext_timer);
Anurag Chouhandf2b2682016-02-29 14:15:27 +05303575 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05303576 WMA_LOGP("%s: Failed to destroy service ready ext event timer",
3577 __func__);
3578
Anurag Chouhandf2b2682016-02-29 14:15:27 +05303579 qdf_event_destroy(&wma_handle->target_suspend);
3580 qdf_event_destroy(&wma_handle->wma_resume_event);
3581 qdf_event_destroy(&wma_handle->runtime_suspend);
3582 qdf_event_destroy(&wma_handle->recovery_event);
Kai Liu27f20372016-09-28 23:52:36 +08003583 qdf_event_destroy(&wma_handle->tx_frm_download_comp_event);
3584 qdf_event_destroy(&wma_handle->tx_queue_empty_event);
Manikandan Mohanb0932ab2017-02-12 16:30:55 -08003585 wma_cleanup_vdev_resp_queue(wma_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003586 wma_cleanup_hold_req(wma_handle);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303587 qdf_wake_lock_destroy(&wma_handle->wmi_cmd_rsp_wake_lock);
3588 qdf_runtime_lock_deinit(wma_handle->wmi_cmd_rsp_runtime_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003589 for (idx = 0; idx < wma_handle->num_mem_chunks; ++idx) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303590 qdf_mem_free_consistent(wma_handle->qdf_dev,
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303591 wma_handle->qdf_dev->dev,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003592 wma_handle->mem_chunks[idx].len,
3593 wma_handle->mem_chunks[idx].vaddr,
3594 wma_handle->mem_chunks[idx].paddr,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303595 qdf_get_dma_mem_context(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003596 (&(wma_handle->mem_chunks[idx])),
3597 memctx));
3598 }
3599
3600#if defined(QCA_WIFI_FTM)
3601 /* Detach UTF and unregister the handler */
Anurag Chouhan6d760662016-02-20 16:05:43 +05303602 if (cds_get_conparam() == QDF_GLOBAL_FTM_MODE)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003603 wma_utf_detach(wma_handle);
3604#endif /* QCA_WIFI_FTM */
3605
3606 if (NULL != wma_handle->dfs_ic) {
3607 wma_dfs_detach(wma_handle->dfs_ic);
3608 wma_handle->dfs_ic = NULL;
3609 }
3610
3611 if (NULL != wma_handle->pGetRssiReq) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303612 qdf_mem_free(wma_handle->pGetRssiReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003613 wma_handle->pGetRssiReq = NULL;
3614 }
Deepak Dhamdherebf1f9b12016-05-27 14:49:41 -07003615
Srinivas Girigowdaad874a82016-10-25 14:08:00 -07003616 if (wma_handle->link_stats_results) {
3617 qdf_mem_free(wma_handle->link_stats_results);
3618 wma_handle->link_stats_results = NULL;
3619 }
3620
Deepak Dhamdherebf1f9b12016-05-27 14:49:41 -07003621 wma_ndp_unregister_all_event_handlers(wma_handle);
3622
Selvaraj, Sridhar3a1823f2017-02-01 17:32:21 +05303623 wlan_objmgr_psoc_release_ref(wma_handle->psoc, WLAN_LEGACY_WMA_ID);
Selvaraj, Sridhar0672a122016-12-29 16:11:48 +05303624 wma_handle->psoc = NULL;
Mukul Sharmac3e7a782017-02-03 12:16:11 +05303625 target_if_close();
Frank Liu65b17d92016-11-23 15:58:44 +08003626 wma_target_if_close(wma_handle);
3627
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003628 WMA_LOGD("%s: Exit", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303629 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003630}
3631
3632/**
3633 * wma_update_fw_config() - update fw configuration
3634 * @wma_handle: wma handle
3635 * @tgt_cap: target capabality
3636 *
3637 * Return: none
3638 */
3639static void wma_update_fw_config(tp_wma_handle wma_handle,
3640 struct wma_target_cap *tgt_cap)
3641{
3642 /*
3643 * tgt_cap contains default target resource configuration
3644 * which can be modified here, if required
3645 */
3646 /* Override the no. of max fragments as per platform configuration */
3647 tgt_cap->wlan_resource_config.max_frag_entries =
Anurag Chouhan6d760662016-02-20 16:05:43 +05303648 QDF_MIN(QCA_OL_11AC_TX_MAX_FRAGS,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003649 wma_handle->max_frag_entry);
3650 wma_handle->max_frag_entry =
3651 tgt_cap->wlan_resource_config.max_frag_entries;
Arun Khandavalli3dd06de2016-08-17 10:20:29 +05303652
3653 /* Update no. of maxWoWFilters depending on BPF service */
3654 if (WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
3655 WMI_SERVICE_BPF_OFFLOAD))
3656 tgt_cap->wlan_resource_config.num_wow_filters =
Arun Khandavallid454d422016-08-17 12:47:05 +05303657 WMA_STA_WOW_DEFAULT_PTRN_MAX;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003658}
3659
3660/**
3661 * wma_alloc_host_mem_chunk() - allocate host memory
3662 * @wma_handle: wma handle
3663 * @req_id: request id
3664 * @idx: index
3665 * @num_units: number of units
3666 * @unit_len: unit length
3667 *
3668 * allocate a chunk of memory at the index indicated and
3669 * if allocation fail allocate smallest size possiblr and
3670 * return number of units allocated.
3671 *
3672 * Return: number of units or 0 for error.
3673 */
3674static uint32_t wma_alloc_host_mem_chunk(tp_wma_handle wma_handle,
3675 uint32_t req_id, uint32_t idx,
3676 uint32_t num_units, uint32_t unit_len)
3677{
Anurag Chouhan6d760662016-02-20 16:05:43 +05303678 qdf_dma_addr_t paddr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003679 if (!num_units || !unit_len) {
3680 return 0;
3681 }
3682 wma_handle->mem_chunks[idx].vaddr = NULL;
3683 /** reduce the requested allocation by half until allocation succeeds */
3684 while (wma_handle->mem_chunks[idx].vaddr == NULL && num_units) {
3685 wma_handle->mem_chunks[idx].vaddr =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303686 qdf_mem_alloc_consistent(wma_handle->qdf_dev,
3687 wma_handle->qdf_dev->dev,
3688 num_units * unit_len,
3689 &paddr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003690 if (wma_handle->mem_chunks[idx].vaddr == NULL) {
3691 num_units = (num_units >> 1);/* reduce length by half */
3692 } else {
3693 wma_handle->mem_chunks[idx].paddr = paddr;
3694 wma_handle->mem_chunks[idx].len = num_units * unit_len;
3695 wma_handle->mem_chunks[idx].req_id = req_id;
3696 }
3697 }
3698 return num_units;
3699}
3700
3701#define HOST_MEM_SIZE_UNIT 4
3702/**
3703 * wma_alloc_host_mem() - allocate amount of memory requested by FW.
3704 * @wma_handle: wma handle
3705 * @req_id: request id
3706 * @num_units: number of units
3707 * @unit_len: unit length
3708 *
3709 * Return: none
3710 */
3711static void wma_alloc_host_mem(tp_wma_handle wma_handle, uint32_t req_id,
3712 uint32_t num_units, uint32_t unit_len)
3713{
3714 uint32_t remaining_units, allocated_units, idx;
3715
3716 /* adjust the length to nearest multiple of unit size */
3717 unit_len = (unit_len + (HOST_MEM_SIZE_UNIT - 1)) &
3718 (~(HOST_MEM_SIZE_UNIT - 1));
3719 idx = wma_handle->num_mem_chunks;
3720 remaining_units = num_units;
3721 while (remaining_units) {
3722 allocated_units = wma_alloc_host_mem_chunk(wma_handle, req_id,
3723 idx, remaining_units,
3724 unit_len);
3725 if (allocated_units == 0) {
3726 WMA_LOGE("FAILED TO ALLOCATED memory unit len %d"
3727 " units requested %d units allocated %d ",
3728 unit_len, num_units,
3729 (num_units - remaining_units));
3730 wma_handle->num_mem_chunks = idx;
3731 break;
3732 }
3733 remaining_units -= allocated_units;
3734 ++idx;
3735 if (idx == MAX_MEM_CHUNKS) {
3736 WMA_LOGE("RWACHED MAX CHUNK LIMIT for memory units %d"
3737 " unit len %d requested by FW,"
3738 " only allocated %d ",
3739 num_units, unit_len,
3740 (num_units - remaining_units));
3741 wma_handle->num_mem_chunks = idx;
3742 break;
3743 }
3744 }
3745 wma_handle->num_mem_chunks = idx;
3746}
3747
3748/**
3749 * wma_update_target_services() - update target services from wma handle
3750 * @wh: wma handle
3751 * @cfg: target services
3752 *
3753 * Return: none
3754 */
3755static inline void wma_update_target_services(tp_wma_handle wh,
3756 struct wma_tgt_services *cfg)
3757{
3758 /* STA power save */
3759 cfg->sta_power_save = WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap,
3760 WMI_SERVICE_STA_PWRSAVE);
3761
3762 /* Enable UAPSD */
3763 cfg->uapsd = WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap,
3764 WMI_SERVICE_AP_UAPSD);
3765
3766 /* Update AP DFS service */
3767 cfg->ap_dfs = WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap,
3768 WMI_SERVICE_AP_DFS);
3769
3770 /* Enable 11AC */
3771 cfg->en_11ac = WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap,
3772 WMI_SERVICE_11AC);
3773 if (cfg->en_11ac)
3774 g_fw_wlan_feat_caps |= (1 << DOT11AC);
3775
3776 /* Proactive ARP response */
3777 g_fw_wlan_feat_caps |= (1 << WLAN_PERIODIC_TX_PTRN);
3778
3779 /* Enable WOW */
3780 g_fw_wlan_feat_caps |= (1 << WOW);
3781
3782 /* ARP offload */
3783 cfg->arp_offload = WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap,
3784 WMI_SERVICE_ARPNS_OFFLOAD);
3785
3786 /* Adaptive early-rx */
3787 cfg->early_rx = WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap,
3788 WMI_SERVICE_EARLY_RX);
3789#ifdef FEATURE_WLAN_SCAN_PNO
3790 /* PNO offload */
3791 if (WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap, WMI_SERVICE_NLO))
3792 cfg->pno_offload = true;
3793#endif /* FEATURE_WLAN_SCAN_PNO */
3794
3795#ifdef FEATURE_WLAN_EXTSCAN
3796 if (WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap, WMI_SERVICE_EXTSCAN)) {
3797 g_fw_wlan_feat_caps |= (1 << EXTENDED_SCAN);
3798 }
3799#endif /* FEATURE_WLAN_EXTSCAN */
3800 cfg->lte_coex_ant_share = WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap,
3801 WMI_SERVICE_LTE_ANT_SHARE_SUPPORT);
3802#ifdef FEATURE_WLAN_TDLS
3803 /* Enable TDLS */
3804 if (WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap, WMI_SERVICE_TDLS)) {
3805 cfg->en_tdls = 1;
3806 g_fw_wlan_feat_caps |= (1 << TDLS);
3807 }
3808 /* Enable advanced TDLS features */
3809 if (WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap,
3810 WMI_SERVICE_TDLS_OFFCHAN)) {
3811 cfg->en_tdls_offchan = 1;
3812 g_fw_wlan_feat_caps |= (1 << TDLS_OFF_CHANNEL);
3813 }
3814
3815 cfg->en_tdls_uapsd_buf_sta =
3816 WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap,
3817 WMI_SERVICE_TDLS_UAPSD_BUFFER_STA);
3818 cfg->en_tdls_uapsd_sleep_sta =
3819 WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap,
3820 WMI_SERVICE_TDLS_UAPSD_SLEEP_STA);
3821#endif /* FEATURE_WLAN_TDLS */
3822 if (WMI_SERVICE_IS_ENABLED
3823 (wh->wmi_service_bitmap, WMI_SERVICE_BEACON_OFFLOAD))
3824 cfg->beacon_offload = true;
mukul sharma72c8b222015-09-04 17:02:01 +05303825 if (WMI_SERVICE_IS_ENABLED
3826 (wh->wmi_service_bitmap, WMI_SERVICE_STA_PMF_OFFLOAD))
3827 cfg->pmf_offload = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003828#ifdef WLAN_FEATURE_ROAM_OFFLOAD
3829 /* Enable Roam Offload */
3830 cfg->en_roam_offload = WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap,
3831 WMI_SERVICE_ROAM_HO_OFFLOAD);
3832#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
3833#ifdef WLAN_FEATURE_NAN
3834 if (WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap, WMI_SERVICE_NAN))
3835 g_fw_wlan_feat_caps |= (1 << NAN);
3836#endif /* WLAN_FEATURE_NAN */
3837
3838 if (WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap, WMI_SERVICE_RTT))
3839 g_fw_wlan_feat_caps |= (1 << RTT);
Yun Park4d968df2016-10-11 11:44:15 -07003840
3841 if (WMI_SERVICE_IS_ENABLED(wh->wmi_service_bitmap,
3842 WMI_SERVICE_TX_MSDU_ID_NEW_PARTITION_SUPPORT)) {
Leo Chang96464902016-10-28 11:10:54 -07003843 cdp_ipa_set_uc_tx_partition_base(
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003844 cds_get_context(QDF_MODULE_ID_SOC),
3845 (struct cdp_cfg *)cds_get_context(QDF_MODULE_ID_CFG),
3846 HTT_TX_IPA_NEW_MSDU_ID_SPACE_BEGIN);
Yun Park4d968df2016-10-11 11:44:15 -07003847 WMA_LOGI("%s: TX_MSDU_ID_NEW_PARTITION=%d", __func__,
3848 HTT_TX_IPA_NEW_MSDU_ID_SPACE_BEGIN);
3849 } else {
Leo Chang96464902016-10-28 11:10:54 -07003850 cdp_ipa_set_uc_tx_partition_base(
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003851 cds_get_context(QDF_MODULE_ID_SOC),
3852 (struct cdp_cfg *)cds_get_context(QDF_MODULE_ID_CFG),
3853 HTT_TX_IPA_MSDU_ID_SPACE_BEGIN);
Yun Park4d968df2016-10-11 11:44:15 -07003854 WMA_LOGI("%s: TX_MSDU_ID_OLD_PARTITION=%d", __func__,
3855 HTT_TX_IPA_MSDU_ID_SPACE_BEGIN);
3856 }
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07003857
3858 wma_he_update_tgt_services(wh, cfg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003859}
3860
3861/**
3862 * wma_update_target_ht_cap() - update ht capabality from wma handle
3863 * @wh: wma handle
3864 * @cfg: ht capabality
3865 *
3866 * Return: none
3867 */
3868static inline void wma_update_target_ht_cap(tp_wma_handle wh,
3869 struct wma_tgt_ht_cap *cfg)
3870{
3871 /* RX STBC */
3872 cfg->ht_rx_stbc = !!(wh->ht_cap_info & WMI_HT_CAP_RX_STBC);
3873
3874 /* TX STBC */
3875 cfg->ht_tx_stbc = !!(wh->ht_cap_info & WMI_HT_CAP_TX_STBC);
3876
3877 /* MPDU density */
3878 cfg->mpdu_density = wh->ht_cap_info & WMI_HT_CAP_MPDU_DENSITY;
3879
3880 /* HT RX LDPC */
3881 cfg->ht_rx_ldpc = !!(wh->ht_cap_info & WMI_HT_CAP_LDPC);
3882
3883 /* HT SGI */
3884 cfg->ht_sgi_20 = !!(wh->ht_cap_info & WMI_HT_CAP_HT20_SGI);
3885
3886 cfg->ht_sgi_40 = !!(wh->ht_cap_info & WMI_HT_CAP_HT40_SGI);
3887
3888 /* RF chains */
3889 cfg->num_rf_chains = wh->num_rf_chains;
3890
Jeff Johnson3fd21822016-11-08 11:30:37 -08003891 WMA_LOGD("%s: ht_cap_info - %x ht_rx_stbc - %d, ht_tx_stbc - %d\n"
3892 "mpdu_density - %d ht_rx_ldpc - %d ht_sgi_20 - %d\n"
3893 "ht_sgi_40 - %d num_rf_chains - %d", __func__, wh->ht_cap_info,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003894 cfg->ht_rx_stbc, cfg->ht_tx_stbc, cfg->mpdu_density,
3895 cfg->ht_rx_ldpc, cfg->ht_sgi_20, cfg->ht_sgi_40,
3896 cfg->num_rf_chains);
3897
3898}
3899
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003900/**
3901 * wma_update_target_vht_cap() - update vht capabality from wma handle
3902 * @wh: wma handle
3903 * @cfg: vht capabality
3904 *
3905 * Return: none
3906 */
3907static inline void wma_update_target_vht_cap(tp_wma_handle wh,
3908 struct wma_tgt_vht_cap *cfg)
3909{
3910
3911 if (wh->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_11454)
3912 cfg->vht_max_mpdu = WMI_VHT_CAP_MAX_MPDU_LEN_11454;
3913 else if (wh->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_7935)
3914 cfg->vht_max_mpdu = WMI_VHT_CAP_MAX_MPDU_LEN_7935;
3915 else
3916 cfg->vht_max_mpdu = 0;
3917
3918
3919 if (wh->vht_cap_info & WMI_VHT_CAP_CH_WIDTH_80P80_160MHZ) {
3920 cfg->supp_chan_width = 1 << eHT_CHANNEL_WIDTH_80P80MHZ;
3921 cfg->supp_chan_width |= 1 << eHT_CHANNEL_WIDTH_160MHZ;
3922 } else if (wh->vht_cap_info & WMI_VHT_CAP_CH_WIDTH_160MHZ)
3923 cfg->supp_chan_width = 1 << eHT_CHANNEL_WIDTH_160MHZ;
3924 else
3925 cfg->supp_chan_width = 1 << eHT_CHANNEL_WIDTH_80MHZ;
3926
3927 cfg->vht_rx_ldpc = wh->vht_cap_info & WMI_VHT_CAP_RX_LDPC;
3928
3929 cfg->vht_short_gi_80 = wh->vht_cap_info & WMI_VHT_CAP_SGI_80MHZ;
3930 cfg->vht_short_gi_160 = wh->vht_cap_info & WMI_VHT_CAP_SGI_160MHZ;
3931
3932 cfg->vht_tx_stbc = wh->vht_cap_info & WMI_VHT_CAP_TX_STBC;
3933
3934 cfg->vht_rx_stbc = (wh->vht_cap_info & WMI_VHT_CAP_RX_STBC_1SS) |
3935 (wh->vht_cap_info & WMI_VHT_CAP_RX_STBC_2SS) |
3936 (wh->vht_cap_info & WMI_VHT_CAP_RX_STBC_3SS) ;
3937
3938 cfg->vht_max_ampdu_len_exp = (wh->vht_cap_info &
3939 WMI_VHT_CAP_MAX_AMPDU_LEN_EXP)
3940 >> WMI_VHT_CAP_MAX_AMPDU_LEN_EXP_SHIFT;
3941
3942 cfg->vht_su_bformer = wh->vht_cap_info & WMI_VHT_CAP_SU_BFORMER;
3943
3944 cfg->vht_su_bformee = wh->vht_cap_info & WMI_VHT_CAP_SU_BFORMEE;
3945
3946 cfg->vht_mu_bformer = wh->vht_cap_info & WMI_VHT_CAP_MU_BFORMER;
3947
3948 cfg->vht_mu_bformee = wh->vht_cap_info & WMI_VHT_CAP_MU_BFORMEE;
3949
3950 cfg->vht_txop_ps = wh->vht_cap_info & WMI_VHT_CAP_TXOP_PS;
3951
Jeff Johnson3fd21822016-11-08 11:30:37 -08003952 WMA_LOGD("%s: max_mpdu %d supp_chan_width %x rx_ldpc %x\n"
3953 "short_gi_80 %x tx_stbc %x rx_stbc %x txop_ps %x\n"
3954 "su_bformee %x mu_bformee %x max_ampdu_len_exp %d", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003955 cfg->vht_max_mpdu, cfg->supp_chan_width, cfg->vht_rx_ldpc,
3956 cfg->vht_short_gi_80, cfg->vht_tx_stbc, cfg->vht_rx_stbc,
3957 cfg->vht_txop_ps, cfg->vht_su_bformee, cfg->vht_mu_bformee,
3958 cfg->vht_max_ampdu_len_exp);
3959}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003960
3961/**
Krunal Soniaa664da2016-06-15 23:46:40 -07003962 * wma_derive_ext_ht_cap() - Derive HT caps based on given value
3963 * @wma_handle: pointer to wma_handle
3964 * @ht_cap: given pointer to HT caps which needs to be updated
3965 * @tx_chain: given tx chainmask value
3966 * @rx_chain: given rx chainmask value
3967 * @value: new HT cap info provided in form of bitmask
3968 *
3969 * This function takes the value provided in form of bitmask and decodes
3970 * it. After decoding, what ever value it gets, it takes the union(max) or
3971 * intersection(min) with previously derived values.
3972 *
3973 * Return: none
3974 *
3975 */
3976static void wma_derive_ext_ht_cap(tp_wma_handle wma_handle,
3977 struct wma_tgt_ht_cap *ht_cap, uint32_t value,
3978 uint32_t tx_chain, uint32_t rx_chain)
3979{
3980 struct wma_tgt_ht_cap tmp = {0};
3981
3982 if (NULL == wma_handle || NULL == ht_cap)
3983 return;
3984
Ankit Guptaa5076012016-09-14 11:32:19 -07003985 if (!qdf_mem_cmp(ht_cap, &tmp, sizeof(struct wma_tgt_ht_cap))) {
Krunal Soniaa664da2016-06-15 23:46:40 -07003986 ht_cap->ht_rx_stbc = (!!(value & WMI_HT_CAP_RX_STBC));
3987 ht_cap->ht_tx_stbc = (!!(value & WMI_HT_CAP_TX_STBC));
3988 ht_cap->mpdu_density = (!!(value & WMI_HT_CAP_MPDU_DENSITY));
3989 ht_cap->ht_rx_ldpc = (!!(value & WMI_HT_CAP_RX_LDPC));
3990 ht_cap->ht_sgi_20 = (!!(value & WMI_HT_CAP_HT20_SGI));
3991 ht_cap->ht_sgi_40 = (!!(value & WMI_HT_CAP_HT40_SGI));
3992 ht_cap->num_rf_chains =
3993 QDF_MAX(wma_get_num_of_setbits_from_bitmask(tx_chain),
3994 wma_get_num_of_setbits_from_bitmask(rx_chain));
3995 } else {
3996 ht_cap->ht_rx_stbc = QDF_MIN(ht_cap->ht_rx_stbc,
3997 (!!(value & WMI_HT_CAP_RX_STBC)));
3998 ht_cap->ht_tx_stbc = QDF_MAX(ht_cap->ht_tx_stbc,
3999 (!!(value & WMI_HT_CAP_TX_STBC)));
4000 ht_cap->mpdu_density = QDF_MIN(ht_cap->mpdu_density,
4001 (!!(value & WMI_HT_CAP_MPDU_DENSITY)));
4002 ht_cap->ht_rx_ldpc = QDF_MIN(ht_cap->ht_rx_ldpc,
4003 (!!(value & WMI_HT_CAP_RX_LDPC)));
4004 ht_cap->ht_sgi_20 = QDF_MIN(ht_cap->ht_sgi_20,
4005 (!!(value & WMI_HT_CAP_HT20_SGI)));
4006 ht_cap->ht_sgi_40 = QDF_MIN(ht_cap->ht_sgi_40,
4007 (!!(value & WMI_HT_CAP_HT40_SGI)));
4008 ht_cap->num_rf_chains =
4009 QDF_MAX(ht_cap->num_rf_chains,
4010 QDF_MAX(wma_get_num_of_setbits_from_bitmask(
4011 tx_chain),
4012 wma_get_num_of_setbits_from_bitmask(
4013 rx_chain)));
4014 }
4015}
4016
4017/**
4018 * wma_update_target_ext_ht_cap() - Update HT caps with given extended cap
4019 * @wma_handle: pointer to wma_handle
4020 * @ht_cap: HT cap structure to be filled
4021 *
4022 * This function loop through each hardware mode and for each hardware mode
4023 * again it loop through each MAC/PHY and pull the caps 2G and 5G specific
4024 * HT caps and derives the final cap.
4025 *
4026 * Return: none
4027 *
4028 */
4029static void wma_update_target_ext_ht_cap(tp_wma_handle wma_handle,
4030 struct wma_tgt_ht_cap *ht_cap)
4031{
4032 int i, j = 0, max_mac;
4033 uint32_t ht_2g, ht_5g;
4034 struct wma_tgt_ht_cap tmp_ht_cap = {0}, tmp_cap = {0};
4035 struct extended_caps *phy_caps;
4036 WMI_MAC_PHY_CAPABILITIES *mac_cap;
4037
4038 /*
4039 * for legacy device extended cap might not even come, so in that case
4040 * don't overwrite legacy values
4041 */
4042 if (!wma_handle ||
4043 (0 == wma_handle->phy_caps.num_hw_modes.num_hw_modes)) {
4044 WMA_LOGI("%s: No extended HT cap for current SOC", __func__);
4045 return;
4046 }
4047
4048 phy_caps = &wma_handle->phy_caps;
4049 for (i = 0; i < phy_caps->num_hw_modes.num_hw_modes; i++) {
4050 if (phy_caps->each_hw_mode_cap[i].phy_id_map == PHY1_PHY2)
4051 max_mac = j + 2;
4052 else
4053 max_mac = j + 1;
4054 for ( ; j < max_mac; j++) {
4055 mac_cap = &phy_caps->each_phy_cap_per_hwmode[j];
4056 ht_2g = mac_cap->ht_cap_info_2G;
4057 ht_5g = mac_cap->ht_cap_info_5G;
4058 if (ht_2g)
4059 wma_derive_ext_ht_cap(wma_handle, &tmp_ht_cap,
4060 ht_2g, mac_cap->tx_chain_mask_2G,
4061 mac_cap->rx_chain_mask_2G);
4062 if (ht_5g)
4063 wma_derive_ext_ht_cap(wma_handle, &tmp_ht_cap,
4064 ht_5g, mac_cap->tx_chain_mask_5G,
4065 mac_cap->rx_chain_mask_5G);
4066 }
4067 }
4068
Ankit Guptaa5076012016-09-14 11:32:19 -07004069 if (qdf_mem_cmp(&tmp_cap, &tmp_ht_cap,
Krunal Soniaa664da2016-06-15 23:46:40 -07004070 sizeof(struct wma_tgt_ht_cap))) {
4071 qdf_mem_copy(ht_cap, &tmp_ht_cap,
4072 sizeof(struct wma_tgt_ht_cap));
4073 }
4074
Jeff Johnson3fd21822016-11-08 11:30:37 -08004075 WMA_LOGI("%s: [ext ht cap] ht_rx_stbc - %d, ht_tx_stbc - %d\n"
4076 "mpdu_density - %d ht_rx_ldpc - %d ht_sgi_20 - %d\n"
4077 "ht_sgi_40 - %d num_rf_chains - %d", __func__,
Krunal Soniaa664da2016-06-15 23:46:40 -07004078 ht_cap->ht_rx_stbc, ht_cap->ht_tx_stbc,
4079 ht_cap->mpdu_density, ht_cap->ht_rx_ldpc,
4080 ht_cap->ht_sgi_20, ht_cap->ht_sgi_40,
4081 ht_cap->num_rf_chains);
4082}
4083
4084/**
4085 * wma_derive_ext_vht_cap() - Derive VHT caps based on given value
4086 * @wma_handle: pointer to wma_handle
4087 * @vht_cap: pointer to given VHT caps to be filled
4088 * @value: new VHT cap info provided in form of bitmask
4089 *
4090 * This function takes the value provided in form of bitmask and decodes
4091 * it. After decoding, what ever value it gets, it takes the union(max) or
4092 * intersection(min) with previously derived values.
4093 *
4094 * Return: none
4095 *
4096 */
4097static void wma_derive_ext_vht_cap(t_wma_handle *wma_handle,
4098 struct wma_tgt_vht_cap *vht_cap, uint32_t value)
4099{
4100 struct wma_tgt_vht_cap tmp_cap = {0};
4101 uint32_t tmp = 0;
4102
4103 if (NULL == wma_handle || NULL == vht_cap)
4104 return;
4105
Ankit Guptaa5076012016-09-14 11:32:19 -07004106 if (!qdf_mem_cmp(vht_cap, &tmp_cap,
Krunal Soniaa664da2016-06-15 23:46:40 -07004107 sizeof(struct wma_tgt_vht_cap))) {
4108 if (value & WMI_VHT_CAP_MAX_MPDU_LEN_11454)
4109 vht_cap->vht_max_mpdu = WMI_VHT_CAP_MAX_MPDU_LEN_11454;
4110 else if (value & WMI_VHT_CAP_MAX_MPDU_LEN_7935)
4111 vht_cap->vht_max_mpdu = WMI_VHT_CAP_MAX_MPDU_LEN_7935;
4112 else
4113 vht_cap->vht_max_mpdu = 0;
4114
4115 if (value & WMI_VHT_CAP_CH_WIDTH_80P80_160MHZ) {
4116 vht_cap->supp_chan_width =
4117 1 << eHT_CHANNEL_WIDTH_80P80MHZ;
4118 vht_cap->supp_chan_width |=
4119 1 << eHT_CHANNEL_WIDTH_160MHZ;
4120 } else if (value & WMI_VHT_CAP_CH_WIDTH_160MHZ) {
4121 vht_cap->supp_chan_width =
4122 1 << eHT_CHANNEL_WIDTH_160MHZ;
4123 } else {
4124 vht_cap->supp_chan_width = 1 << eHT_CHANNEL_WIDTH_80MHZ;
4125 }
4126 vht_cap->vht_rx_ldpc = value & WMI_VHT_CAP_RX_LDPC;
4127 vht_cap->vht_short_gi_80 = value & WMI_VHT_CAP_SGI_80MHZ;
4128 vht_cap->vht_short_gi_160 = value & WMI_VHT_CAP_SGI_160MHZ;
4129 vht_cap->vht_tx_stbc = value & WMI_VHT_CAP_TX_STBC;
4130 vht_cap->vht_rx_stbc =
4131 (value & WMI_VHT_CAP_RX_STBC_1SS) |
4132 (value & WMI_VHT_CAP_RX_STBC_2SS) |
4133 (value & WMI_VHT_CAP_RX_STBC_3SS);
4134 vht_cap->vht_max_ampdu_len_exp =
4135 (value & WMI_VHT_CAP_MAX_AMPDU_LEN_EXP) >>
4136 WMI_VHT_CAP_MAX_AMPDU_LEN_EXP_SHIFT;
4137 vht_cap->vht_su_bformer = value & WMI_VHT_CAP_SU_BFORMER;
4138 vht_cap->vht_su_bformee = value & WMI_VHT_CAP_SU_BFORMEE;
4139 vht_cap->vht_mu_bformer = value & WMI_VHT_CAP_MU_BFORMER;
4140 vht_cap->vht_mu_bformee = value & WMI_VHT_CAP_MU_BFORMEE;
4141 vht_cap->vht_txop_ps = value & WMI_VHT_CAP_TXOP_PS;
4142 } else {
4143 if (value & WMI_VHT_CAP_MAX_MPDU_LEN_11454)
4144 tmp = WMI_VHT_CAP_MAX_MPDU_LEN_11454;
4145 else if (value & WMI_VHT_CAP_MAX_MPDU_LEN_7935)
4146 tmp = WMI_VHT_CAP_MAX_MPDU_LEN_7935;
4147 else
4148 tmp = 0;
4149 vht_cap->vht_max_mpdu = QDF_MIN(vht_cap->vht_max_mpdu, tmp);
4150
4151 if ((value & WMI_VHT_CAP_CH_WIDTH_80P80_160MHZ)) {
4152 tmp = (1 << eHT_CHANNEL_WIDTH_80P80MHZ) |
4153 (1 << eHT_CHANNEL_WIDTH_160MHZ);
4154 } else if (value & WMI_VHT_CAP_CH_WIDTH_160MHZ) {
4155 tmp = 1 << eHT_CHANNEL_WIDTH_160MHZ;
4156 } else {
4157 tmp = 1 << eHT_CHANNEL_WIDTH_80MHZ;
4158 }
4159 vht_cap->supp_chan_width =
4160 QDF_MAX(vht_cap->supp_chan_width, tmp);
4161 vht_cap->vht_rx_ldpc = QDF_MIN(vht_cap->vht_rx_ldpc,
4162 value & WMI_VHT_CAP_RX_LDPC);
4163 vht_cap->vht_short_gi_80 = QDF_MAX(vht_cap->vht_short_gi_80,
4164 value & WMI_VHT_CAP_SGI_80MHZ);
4165 vht_cap->vht_short_gi_160 = QDF_MAX(vht_cap->vht_short_gi_160,
4166 value & WMI_VHT_CAP_SGI_160MHZ);
4167 vht_cap->vht_tx_stbc = QDF_MAX(vht_cap->vht_tx_stbc,
4168 value & WMI_VHT_CAP_TX_STBC);
4169 vht_cap->vht_rx_stbc = QDF_MIN(vht_cap->vht_rx_stbc,
4170 (value & WMI_VHT_CAP_RX_STBC_1SS) |
4171 (value & WMI_VHT_CAP_RX_STBC_2SS) |
4172 (value & WMI_VHT_CAP_RX_STBC_3SS));
4173 vht_cap->vht_max_ampdu_len_exp =
4174 QDF_MIN(vht_cap->vht_max_ampdu_len_exp,
4175 (value & WMI_VHT_CAP_MAX_AMPDU_LEN_EXP) >>
4176 WMI_VHT_CAP_MAX_AMPDU_LEN_EXP_SHIFT);
4177 vht_cap->vht_su_bformer = QDF_MAX(vht_cap->vht_su_bformer,
4178 value & WMI_VHT_CAP_SU_BFORMER);
4179 vht_cap->vht_su_bformee = QDF_MAX(vht_cap->vht_su_bformee,
4180 value & WMI_VHT_CAP_SU_BFORMEE);
4181 vht_cap->vht_mu_bformer = QDF_MAX(vht_cap->vht_mu_bformer,
4182 value & WMI_VHT_CAP_MU_BFORMER);
4183 vht_cap->vht_mu_bformee = QDF_MAX(vht_cap->vht_mu_bformee,
4184 value & WMI_VHT_CAP_MU_BFORMEE);
4185 vht_cap->vht_txop_ps = QDF_MIN(vht_cap->vht_txop_ps,
4186 value & WMI_VHT_CAP_TXOP_PS);
4187 }
4188}
4189
4190/**
4191 * wma_update_target_ext_vht_cap() - Update VHT caps with given extended cap
4192 * @wma_handle: pointer to wma_handle
4193 * @vht_cap: VHT cap structure to be filled
4194 *
4195 * This function loop through each hardware mode and for each hardware mode
4196 * again it loop through each MAC/PHY and pull the caps 2G and 5G specific
4197 * VHT caps and derives the final cap.
4198 *
4199 * Return: none
4200 *
4201 */
4202static void wma_update_target_ext_vht_cap(t_wma_handle *wma_handle,
4203 struct wma_tgt_vht_cap *vht_cap)
4204{
4205 int i, j = 0, max_mac;
4206 uint32_t vht_cap_info_2g, vht_cap_info_5g;
4207 struct wma_tgt_vht_cap tmp_vht_cap = {0}, tmp_cap = {0};
4208 struct extended_caps *phy_caps;
4209 WMI_MAC_PHY_CAPABILITIES *mac_cap;
4210
4211 /*
4212 * for legacy device extended cap might not even come, so in that case
4213 * don't overwrite legacy values
4214 */
4215 if (!wma_handle ||
4216 (0 == wma_handle->phy_caps.num_hw_modes.num_hw_modes)) {
4217 WMA_LOGI("%s: No extended VHT cap for current SOC", __func__);
4218 return;
4219 }
4220
4221 phy_caps = &wma_handle->phy_caps;
4222 for (i = 0; i < phy_caps->num_hw_modes.num_hw_modes; i++) {
4223 if (phy_caps->each_hw_mode_cap[i].phy_id_map == PHY1_PHY2)
4224 max_mac = j + 2;
4225 else
4226 max_mac = j + 1;
4227 for ( ; j < max_mac; j++) {
4228 mac_cap = &phy_caps->each_phy_cap_per_hwmode[j];
4229 vht_cap_info_2g = mac_cap->vht_cap_info_2G;
4230 vht_cap_info_5g = mac_cap->vht_cap_info_5G;
4231 if (vht_cap_info_2g)
4232 wma_derive_ext_vht_cap(wma_handle, &tmp_vht_cap,
4233 vht_cap_info_2g);
4234 if (vht_cap_info_5g)
4235 wma_derive_ext_vht_cap(wma_handle, &tmp_vht_cap,
4236 vht_cap_info_5g);
4237 }
4238 }
4239
Ankit Guptaa5076012016-09-14 11:32:19 -07004240 if (qdf_mem_cmp(&tmp_cap, &tmp_vht_cap,
Krunal Soniaa664da2016-06-15 23:46:40 -07004241 sizeof(struct wma_tgt_vht_cap))) {
4242 qdf_mem_copy(vht_cap, &tmp_vht_cap,
4243 sizeof(struct wma_tgt_vht_cap));
4244 }
4245
Jeff Johnson3fd21822016-11-08 11:30:37 -08004246 WMA_LOGI("%s: [ext vhtcap] max_mpdu %d supp_chan_width %x rx_ldpc %x\n"
4247 "short_gi_80 %x tx_stbc %x rx_stbc %x txop_ps %x\n"
4248 "su_bformee %x mu_bformee %x max_ampdu_len_exp %d", __func__,
Krunal Soniaa664da2016-06-15 23:46:40 -07004249 vht_cap->vht_max_mpdu, vht_cap->supp_chan_width,
4250 vht_cap->vht_rx_ldpc, vht_cap->vht_short_gi_80,
4251 vht_cap->vht_tx_stbc, vht_cap->vht_rx_stbc,
4252 vht_cap->vht_txop_ps, vht_cap->vht_su_bformee,
4253 vht_cap->vht_mu_bformee, vht_cap->vht_max_ampdu_len_exp);
4254}
4255
4256/**
Anurag Chouhan04dbf6d2016-09-08 15:32:52 +05304257 * wma_update_ra_rate_limit() - update wma config
4258 * @wma_handle: wma handle
4259 * @cfg: target config
4260 *
4261 * Return: none
4262 */
4263#ifdef FEATURE_WLAN_RA_FILTERING
4264static void wma_update_ra_rate_limit(tp_wma_handle wma_handle,
4265 struct wma_tgt_cfg *cfg)
4266{
4267 cfg->is_ra_rate_limit_enabled = wma_handle->IsRArateLimitEnabled;
4268}
4269#else
4270static void wma_update_ra_rate_limit(tp_wma_handle wma_handle,
4271 struct wma_tgt_cfg *cfg)
4272{
4273}
4274#endif
4275
4276/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004277 * wma_update_hdd_cfg() - update HDD config
4278 * @wma_handle: wma handle
4279 *
4280 * Return: none
4281 */
4282static void wma_update_hdd_cfg(tp_wma_handle wma_handle)
4283{
4284 struct wma_tgt_cfg tgt_cfg;
Anurag Chouhan6d760662016-02-20 16:05:43 +05304285 void *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004286
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304287 qdf_mem_zero(&tgt_cfg, sizeof(struct wma_tgt_cfg));
Naveen Rawat64e477e2016-05-20 10:34:56 -07004288
4289 tgt_cfg.sub_20_support = wma_handle->sub_20_support;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004290 tgt_cfg.reg_domain = wma_handle->reg_cap.eeprom_rd;
4291 tgt_cfg.eeprom_rd_ext = wma_handle->reg_cap.eeprom_rd_ext;
4292
4293 switch (wma_handle->phy_capability) {
4294 case WMI_11G_CAPABILITY:
4295 case WMI_11NG_CAPABILITY:
4296 tgt_cfg.band_cap = eCSR_BAND_24;
4297 break;
4298 case WMI_11A_CAPABILITY:
4299 case WMI_11NA_CAPABILITY:
4300 case WMI_11AC_CAPABILITY:
4301 tgt_cfg.band_cap = eCSR_BAND_5G;
4302 break;
4303 case WMI_11AG_CAPABILITY:
4304 case WMI_11NAG_CAPABILITY:
4305 default:
4306 tgt_cfg.band_cap = eCSR_BAND_ALL;
4307 }
4308
4309 tgt_cfg.max_intf_count = wma_handle->wlan_resource_config.num_vdevs;
4310
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304311 qdf_mem_copy(tgt_cfg.hw_macaddr.bytes, wma_handle->hwaddr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004312 ATH_MAC_LEN);
4313
4314 wma_update_target_services(wma_handle, &tgt_cfg.services);
4315 wma_update_target_ht_cap(wma_handle, &tgt_cfg.ht_cap);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004316 wma_update_target_vht_cap(wma_handle, &tgt_cfg.vht_cap);
Krunal Soniaa664da2016-06-15 23:46:40 -07004317 /*
4318 * This will overwrite the structure filled by wma_update_target_ht_cap
4319 * and wma_update_target_vht_cap APIs.
4320 */
4321 wma_update_target_ext_ht_cap(wma_handle, &tgt_cfg.ht_cap);
4322 wma_update_target_ext_vht_cap(wma_handle, &tgt_cfg.vht_cap);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004323
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07004324 wma_update_target_ext_he_cap(wma_handle, &tgt_cfg);
4325
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004326 tgt_cfg.target_fw_version = wma_handle->target_fw_version;
Sandeep Puligilla3d6a8e22016-10-11 18:57:14 -07004327 tgt_cfg.target_fw_vers_ext = wma_handle->target_fw_vers_ext;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004328#ifdef WLAN_FEATURE_LPSS
4329 tgt_cfg.lpss_support = wma_handle->lpss_support;
4330#endif /* WLAN_FEATURE_LPSS */
4331 tgt_cfg.ap_arpns_support = wma_handle->ap_arpns_support;
Rajeev Kumare5a16822016-07-27 13:11:42 -07004332 tgt_cfg.bpf_enabled = wma_handle->bpf_enabled;
Anurag Chouhan04dbf6d2016-09-08 15:32:52 +05304333 wma_update_ra_rate_limit(wma_handle, &tgt_cfg);
Krishna Kumaar Natarajan1ae49112015-11-24 21:43:22 -08004334 tgt_cfg.fine_time_measurement_cap =
4335 wma_handle->fine_time_measurement_cap;
Rajeev Kumar Sirasanagandla47873002016-09-09 13:46:09 +05304336 tgt_cfg.wmi_max_len = wmi_get_max_msg_len(wma_handle->wmi_handle)
4337 - WMI_TLV_HEADROOM;
Ryan Hsu3c8f79f2015-12-02 16:45:09 -08004338 wma_setup_egap_support(&tgt_cfg, wma_handle);
Krishna Kumaar Natarajan1ae49112015-11-24 21:43:22 -08004339
Deepak Dhamdhere13230d32016-05-26 00:46:53 -07004340 wma_update_hdd_cfg_ndp(wma_handle, &tgt_cfg);
Naveen Rawatcb186cf2016-07-11 13:47:19 -07004341 wma_handle->tgt_cfg_update_cb(hdd_ctx, &tgt_cfg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004342}
4343
4344/**
4345 * wma_setup_wmi_init_msg() - fill wmi init message buffer
4346 * @wma_handle: wma handle
4347 * @ev: ready event fixed params
4348 * @param_buf: redy event TLVs
4349 * @len: buffer length
4350 *
4351 * Return: wmi buffer or NULL for error
4352 */
Govind Singhf25a0f12016-03-08 16:09:48 +05304353static int wma_setup_wmi_init_msg(tp_wma_handle wma_handle,
4354 wmi_service_ready_event_fixed_param *ev,
4355 WMI_SERVICE_READY_EVENTID_param_tlvs *param_buf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004356{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004357 wlan_host_mem_req *ev_mem_reqs;
4358 wmi_abi_version my_vers;
Govind Singhf25a0f12016-03-08 16:09:48 +05304359 wmi_abi_version host_abi_vers;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004360 int num_whitelist;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004361 uint16_t idx;
4362 uint32_t num_units;
4363
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004364 ev_mem_reqs = param_buf->mem_reqs;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004365
4366 /* allocate memory requested by FW */
4367 if (ev->num_mem_reqs > WMI_MAX_MEM_REQS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304368 QDF_ASSERT(0);
Govind Singhf25a0f12016-03-08 16:09:48 +05304369 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004370 }
4371
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004372 for (idx = 0; idx < ev->num_mem_reqs; ++idx) {
4373 num_units = ev_mem_reqs[idx].num_units;
4374 if (ev_mem_reqs[idx].num_unit_info & NUM_UNITS_IS_NUM_PEERS) {
4375 /*
4376 * number of units to allocate is number
4377 * of peers, 1 extra for self peer on
4378 * target. this needs to be fied, host
4379 * and target can get out of sync
4380 */
Govind Singhf25a0f12016-03-08 16:09:48 +05304381 num_units = wma_handle->wlan_resource_config.num_peers + 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004382 }
4383 WMA_LOGD
4384 ("idx %d req %d num_units %d num_unit_info %d unit size %d actual units %d ",
4385 idx, ev_mem_reqs[idx].req_id,
4386 ev_mem_reqs[idx].num_units,
4387 ev_mem_reqs[idx].num_unit_info,
4388 ev_mem_reqs[idx].unit_size, num_units);
4389 wma_alloc_host_mem(wma_handle, ev_mem_reqs[idx].req_id,
4390 num_units, ev_mem_reqs[idx].unit_size);
4391 }
Govind Singhf25a0f12016-03-08 16:09:48 +05304392
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304393 qdf_mem_copy(&wma_handle->target_abi_vers,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004394 &param_buf->fixed_param->fw_abi_vers,
4395 sizeof(wmi_abi_version));
4396 num_whitelist = sizeof(version_whitelist) /
4397 sizeof(wmi_whitelist_version_info);
4398 my_vers.abi_version_0 = WMI_ABI_VERSION_0;
4399 my_vers.abi_version_1 = WMI_ABI_VERSION_1;
4400 my_vers.abi_version_ns_0 = WMI_ABI_VERSION_NS_0;
4401 my_vers.abi_version_ns_1 = WMI_ABI_VERSION_NS_1;
4402 my_vers.abi_version_ns_2 = WMI_ABI_VERSION_NS_2;
4403 my_vers.abi_version_ns_3 = WMI_ABI_VERSION_NS_3;
4404
4405 wmi_cmp_and_set_abi_version(num_whitelist, version_whitelist,
4406 &my_vers,
4407 &param_buf->fixed_param->fw_abi_vers,
Govind Singhf25a0f12016-03-08 16:09:48 +05304408 &host_abi_vers);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004409
Govind Singhf25a0f12016-03-08 16:09:48 +05304410 qdf_mem_copy(&wma_handle->final_abi_vers, &host_abi_vers,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004411 sizeof(wmi_abi_version));
Govind Singhf25a0f12016-03-08 16:09:48 +05304412
4413 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004414}
4415
4416/**
4417 * wma_dump_dbs_hw_mode() - Print the DBS HW modes
4418 * @wma_handle: WMA handle
4419 *
4420 * Prints the DBS HW modes sent by the FW as part
4421 * of WMI ready event
4422 *
4423 * Return: None
4424 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07004425static void wma_dump_dbs_hw_mode(tp_wma_handle wma_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004426{
4427 uint32_t i, param;
4428
4429 if (!wma_handle) {
4430 WMA_LOGE("%s: Invalid WMA handle", __func__);
4431 return;
4432 }
4433
4434 for (i = 0; i < wma_handle->num_dbs_hw_modes; i++) {
4435 param = wma_handle->hw_mode.hw_mode_list[i];
4436 WMA_LOGA("%s:[%d]-MAC0: tx_ss:%d rx_ss:%d bw_idx:%d",
4437 __func__, i,
Nitesh Shah5b7bae02016-09-28 18:58:33 +05304438 WMA_HW_MODE_MAC0_TX_STREAMS_GET(param),
4439 WMA_HW_MODE_MAC0_RX_STREAMS_GET(param),
4440 WMA_HW_MODE_MAC0_BANDWIDTH_GET(param));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004441 WMA_LOGA("%s:[%d]-MAC1: tx_ss:%d rx_ss:%d bw_idx:%d",
4442 __func__, i,
Nitesh Shah5b7bae02016-09-28 18:58:33 +05304443 WMA_HW_MODE_MAC1_TX_STREAMS_GET(param),
4444 WMA_HW_MODE_MAC1_RX_STREAMS_GET(param),
4445 WMA_HW_MODE_MAC1_BANDWIDTH_GET(param));
4446 WMA_LOGA("%s:[%d] DBS:%d SBS:%d", __func__, i,
4447 WMA_HW_MODE_DBS_MODE_GET(param),
4448 WMA_HW_MODE_SBS_MODE_GET(param));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004449 }
4450}
4451
4452/**
4453 * wma_init_scan_fw_mode_config() - Initialize scan/fw mode config
4454 * @wma_handle: WMA handle
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05304455 * @scan_config: Scam mode configuration
4456 * @fw_config: FW mode configuration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004457 *
4458 * Enables all the valid bits of concurrent_scan_config_bits and
4459 * fw_mode_config_bits.
4460 *
4461 * Return: None
4462 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07004463static void wma_init_scan_fw_mode_config(tp_wma_handle wma_handle,
4464 uint32_t scan_config,
4465 uint32_t fw_config)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004466{
Anurag Chouhan6d760662016-02-20 16:05:43 +05304467 tpAniSirGlobal mac = cds_get_context(QDF_MODULE_ID_PE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004468
4469 WMA_LOGD("%s: Enter", __func__);
4470
4471 if (!mac) {
4472 WMA_LOGE("%s: Invalid mac handle", __func__);
4473 return;
4474 }
4475
4476 if (!wma_handle) {
4477 WMA_LOGE("%s: Invalid WMA handle", __func__);
4478 return;
4479 }
4480
4481 wma_handle->dual_mac_cfg.cur_scan_config = 0;
4482 wma_handle->dual_mac_cfg.cur_fw_mode_config = 0;
4483
4484 /* If dual mac features are disabled in the INI, we
4485 * need not proceed further
4486 */
4487 if (mac->dual_mac_feature_disable) {
4488 WMA_LOGE("%s: Disabling dual mac capabilities", __func__);
4489 /* All capabilites are initialized to 0. We can return */
4490 goto done;
4491 }
4492
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05304493 /* Initialize concurrent_scan_config_bits with default FW value */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004494 WMI_DBS_CONC_SCAN_CFG_DBS_SCAN_SET(
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05304495 wma_handle->dual_mac_cfg.cur_scan_config,
4496 WMI_DBS_CONC_SCAN_CFG_DBS_SCAN_GET(scan_config));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004497 WMI_DBS_CONC_SCAN_CFG_AGILE_SCAN_SET(
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05304498 wma_handle->dual_mac_cfg.cur_scan_config,
4499 WMI_DBS_CONC_SCAN_CFG_AGILE_SCAN_GET(scan_config));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004500 WMI_DBS_CONC_SCAN_CFG_AGILE_DFS_SCAN_SET(
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05304501 wma_handle->dual_mac_cfg.cur_scan_config,
4502 WMI_DBS_CONC_SCAN_CFG_AGILE_DFS_SCAN_GET(scan_config));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004503
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05304504 /* Initialize fw_mode_config_bits with default FW value */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004505 WMI_DBS_FW_MODE_CFG_DBS_SET(
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05304506 wma_handle->dual_mac_cfg.cur_fw_mode_config,
4507 WMI_DBS_FW_MODE_CFG_DBS_GET(fw_config));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004508 WMI_DBS_FW_MODE_CFG_AGILE_DFS_SET(
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05304509 wma_handle->dual_mac_cfg.cur_fw_mode_config,
4510 WMI_DBS_FW_MODE_CFG_AGILE_DFS_GET(fw_config));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004511done:
4512 /* Initialize the previous scan/fw mode config */
4513 wma_handle->dual_mac_cfg.prev_scan_config =
4514 wma_handle->dual_mac_cfg.cur_scan_config;
4515 wma_handle->dual_mac_cfg.prev_fw_mode_config =
4516 wma_handle->dual_mac_cfg.cur_fw_mode_config;
4517
4518 WMA_LOGD("%s: cur_scan_config:%x cur_fw_mode_config:%x",
4519 __func__,
4520 wma_handle->dual_mac_cfg.cur_scan_config,
4521 wma_handle->dual_mac_cfg.cur_fw_mode_config);
4522}
4523
4524/**
Anurag Chouhan04dbf6d2016-09-08 15:32:52 +05304525 * wma_update_ra_limit() - update ra limit based on bpf filter
4526 * enabled or not
4527 * @handle: wma handle
4528 *
4529 * Return: none
4530 */
4531#ifdef FEATURE_WLAN_RA_FILTERING
4532static void wma_update_ra_limit(tp_wma_handle wma_handle)
4533{
4534 if (wma_handle->bpf_enabled)
4535 wma_handle->IsRArateLimitEnabled = false;
4536}
4537#else
4538static void wma_update_ra__limit(tp_wma_handle handle)
4539{
4540}
4541#endif
4542
4543/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004544 * wma_rx_service_ready_event() - event handler to process
4545 * wmi rx sevice ready event.
4546 * @handle: wma handle
4547 * @cmd_param_info: command params info
4548 *
4549 * Return: none
4550 */
Govind Singhd76a5b02016-03-08 15:12:14 +05304551int wma_rx_service_ready_event(void *handle, uint8_t *cmd_param_info,
4552 uint32_t length)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004553{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004554 tp_wma_handle wma_handle = (tp_wma_handle) handle;
4555 struct wma_target_cap target_cap;
4556 WMI_SERVICE_READY_EVENTID_param_tlvs *param_buf;
4557 wmi_service_ready_event_fixed_param *ev;
4558 int status;
4559 uint32_t *ev_wlan_dbs_hw_mode_list;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304560 QDF_STATUS ret;
Leo Chang96464902016-10-28 11:10:54 -07004561 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004562
4563 WMA_LOGD("%s: Enter", __func__);
4564
4565 param_buf = (WMI_SERVICE_READY_EVENTID_param_tlvs *) cmd_param_info;
4566 if (!(handle && param_buf)) {
4567 WMA_LOGP("%s: Invalid arguments", __func__);
Govind Singhd76a5b02016-03-08 15:12:14 +05304568 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004569 }
4570
4571 ev = param_buf->fixed_param;
4572 if (!ev) {
4573 WMA_LOGP("%s: Invalid buffer", __func__);
Govind Singhd76a5b02016-03-08 15:12:14 +05304574 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004575 }
4576
4577 WMA_LOGA("WMA <-- WMI_SERVICE_READY_EVENTID");
4578
4579 wma_handle->num_dbs_hw_modes = ev->num_dbs_hw_modes;
4580 ev_wlan_dbs_hw_mode_list = param_buf->wlan_dbs_hw_mode_list;
4581 wma_handle->hw_mode.hw_mode_list =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304582 qdf_mem_malloc(sizeof(*wma_handle->hw_mode.hw_mode_list) *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004583 wma_handle->num_dbs_hw_modes);
4584 if (!wma_handle->hw_mode.hw_mode_list) {
4585 WMA_LOGE("%s: Memory allocation failed for DBS", __func__);
4586 /* Continuing with the rest of the processing */
4587 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304588 qdf_mem_copy(wma_handle->hw_mode.hw_mode_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004589 ev_wlan_dbs_hw_mode_list,
4590 (sizeof(*wma_handle->hw_mode.hw_mode_list) *
4591 wma_handle->num_dbs_hw_modes));
4592
4593 wma_dump_dbs_hw_mode(wma_handle);
4594
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05304595 /* Initializes the fw_mode and scan_config to zero.
4596 * If ext service ready event is present it will set
4597 * the actual values of these two params.
4598 * This is to ensure that no garbage values would be
4599 * present in the absence of ext service ready event.
4600 */
4601 wma_init_scan_fw_mode_config(wma_handle, 0, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004602
4603 wma_handle->phy_capability = ev->phy_capability;
4604 wma_handle->max_frag_entry = ev->max_frag_entry;
4605 wma_handle->num_rf_chains = ev->num_rf_chains;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304606 qdf_mem_copy(&wma_handle->reg_cap, param_buf->hal_reg_capabilities,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004607 sizeof(HAL_REG_CAPABILITIES));
4608 wma_handle->ht_cap_info = ev->ht_cap_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004609 wma_handle->vht_cap_info = ev->vht_cap_info;
4610 wma_handle->vht_supp_mcs = ev->vht_supp_mcs;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004611 wma_handle->num_rf_chains = ev->num_rf_chains;
4612
4613 wma_handle->target_fw_version = ev->fw_build_vers;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004614 wma_handle->new_hw_mode_index = ev->default_dbs_hw_mode_index;
Krishna Kumaar Natarajan1ae49112015-11-24 21:43:22 -08004615 wma_handle->fine_time_measurement_cap = ev->wmi_fw_sub_feat_caps;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004616
4617 WMA_LOGD("%s: Firmware default hw mode index : %d",
4618 __func__, ev->default_dbs_hw_mode_index);
4619 WMA_LOGE("%s: Firmware build version : %08x",
4620 __func__, ev->fw_build_vers);
Krishna Kumaar Natarajan1ae49112015-11-24 21:43:22 -08004621 WMA_LOGD(FL("FW fine time meas cap: 0x%x"), ev->wmi_fw_sub_feat_caps);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004622
4623 if (ev->hw_bd_id) {
4624 wma_handle->hw_bd_id = ev->hw_bd_id;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304625 qdf_mem_copy(wma_handle->hw_bd_info,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004626 ev->hw_bd_info, sizeof(ev->hw_bd_info));
4627
4628 WMA_LOGE("%s: Board version: %x.%x",
4629 __func__,
4630 wma_handle->hw_bd_info[0], wma_handle->hw_bd_info[1]);
4631 } else {
4632 wma_handle->hw_bd_id = 0;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304633 qdf_mem_zero(wma_handle->hw_bd_info,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004634 sizeof(wma_handle->hw_bd_info));
4635 WMA_LOGE("%s: Board version is unknown!", __func__);
4636 }
Rakesh Sunki8641f8a2015-12-10 15:11:19 -08004637 wma_handle->dfs_ic->dfs_hw_bd_id = wma_handle->hw_bd_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004638
4639 /* TODO: Recheck below line to dump service ready event */
4640 /* dbg_print_wmi_service_11ac(ev); */
4641
4642 /* wmi service is ready */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304643 qdf_mem_copy(wma_handle->wmi_service_bitmap,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004644 param_buf->wmi_service_bitmap,
4645 sizeof(wma_handle->wmi_service_bitmap));
Nirav Shah22bf44d2015-12-10 15:39:48 +05304646
Leo Chang96464902016-10-28 11:10:54 -07004647 cdp_cfg_tx_set_is_mgmt_over_wmi_enabled(soc,
Nirav Shah22bf44d2015-12-10 15:39:48 +05304648 WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
4649 WMI_SERVICE_MGMT_TX_WMI));
Leo Chang96464902016-10-28 11:10:54 -07004650 cdp_set_desc_global_pool_size(soc, ev->num_msdu_desc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004651 /* SWBA event handler for beacon transmission */
4652 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
4653 WMI_HOST_SWBA_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05304654 wma_beacon_swba_handler,
4655 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004656 if (status) {
4657 WMA_LOGE("Failed to register swba beacon event cb");
Govind Singhd76a5b02016-03-08 15:12:14 +05304658 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004659 }
4660#ifdef WLAN_FEATURE_LPSS
4661 wma_handle->lpss_support =
4662 WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
4663 WMI_SERVICE_LPASS);
4664#endif /* WLAN_FEATURE_LPSS */
4665
4666 /*
4667 * This Service bit is added to check for ARP/NS Offload
4668 * support for LL/HL targets
4669 */
4670 wma_handle->ap_arpns_support =
4671 WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
4672 WMI_SERVICE_AP_ARPNS_OFFLOAD);
4673
Anurag Chouhan04dbf6d2016-09-08 15:32:52 +05304674 wma_handle->bpf_enabled = (wma_handle->bpf_packet_filter_enable &&
Rajeev Kumare5a16822016-07-27 13:11:42 -07004675 WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
Anurag Chouhan04dbf6d2016-09-08 15:32:52 +05304676 WMI_SERVICE_BPF_OFFLOAD));
4677 wma_update_ra_limit(wma_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004678 if (WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
4679 WMI_SERVICE_CSA_OFFLOAD)) {
4680 WMA_LOGD("%s: FW support CSA offload capability", __func__);
4681 status =
4682 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Govind Singhd76a5b02016-03-08 15:12:14 +05304683 WMI_CSA_HANDLING_EVENTID,
4684 wma_csa_offload_handler,
4685 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004686 if (status) {
4687 WMA_LOGE("Failed to register CSA offload event cb");
Govind Singhd76a5b02016-03-08 15:12:14 +05304688 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004689 }
4690 }
4691
4692 if (WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
4693 WMI_SERVICE_MGMT_TX_WMI)) {
4694 WMA_LOGE("Firmware supports management TX over WMI,use WMI interface instead of HTT for management Tx");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004695 /*
4696 * Register Tx completion event handler for MGMT Tx over WMI
4697 * case
4698 */
4699 status = wmi_unified_register_event_handler(
4700 wma_handle->wmi_handle,
4701 WMI_MGMT_TX_COMPLETION_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05304702 wma_mgmt_tx_completion_handler,
4703 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004704 if (status) {
4705 WMA_LOGE("Failed to register MGMT over WMI completion handler");
Govind Singhd76a5b02016-03-08 15:12:14 +05304706 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004707 }
4708
Nirav Shah20489972016-06-16 19:20:28 +05304709 status = wmi_unified_register_event_handler(
4710 wma_handle->wmi_handle,
4711 WMI_MGMT_TX_BUNDLE_COMPLETION_EVENTID,
4712 wma_mgmt_tx_bundle_completion_handler,
4713 WMA_RX_SERIALIZER_CTX);
4714 if (status) {
4715 WMA_LOGE("Failed to register MGMT over WMI completion handler");
4716 return -EINVAL;
4717 }
4718
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004719 } else {
4720 WMA_LOGE("FW doesnot support WMI_SERVICE_MGMT_TX_WMI, Use HTT interface for Management Tx");
4721 }
4722#ifdef WLAN_FEATURE_GTK_OFFLOAD
4723 if (WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
4724 WMI_SERVICE_GTK_OFFLOAD)) {
4725 status =
4726 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma3d36c392017-01-18 18:39:12 +05304727 WMI_GTK_OFFLOAD_STATUS_EVENTID,
4728 target_if_pmo_gtk_offload_status_event,
4729 WMA_RX_WORK_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004730 if (status) {
4731 WMA_LOGE("Failed to register GTK offload event cb");
Govind Singhd76a5b02016-03-08 15:12:14 +05304732 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004733 }
4734 }
4735#endif /* WLAN_FEATURE_GTK_OFFLOAD */
4736
4737 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
4738 WMI_P2P_NOA_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05304739 wma_p2p_noa_event_handler,
4740 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004741 if (status) {
4742 WMA_LOGE("Failed to register WMI_P2P_NOA_EVENTID callback");
Govind Singhd76a5b02016-03-08 15:12:14 +05304743 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004744 }
4745 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
Govind Singhd76a5b02016-03-08 15:12:14 +05304746 WMI_TBTTOFFSET_UPDATE_EVENTID,
4747 wma_tbttoffset_update_event_handler,
4748 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004749 if (status) {
4750 WMA_LOGE
4751 ("Failed to register WMI_TBTTOFFSET_UPDATE_EVENTID callback");
Govind Singhd76a5b02016-03-08 15:12:14 +05304752 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004753 }
4754
Govind Singhefc5ccd2016-04-25 11:11:55 +05304755 /* mac_id is replaced with pdev_id in converged firmware to have
4756 * multi-radio support. In order to maintain backward compatibility
4757 * with old fw, host needs to check WMI_SERVICE_DEPRECATED_REPLACE
4758 * in service bitmap from FW and host needs to set use_pdev_id in
4759 * wmi_resource_config to true. If WMI_SERVICE_DEPRECATED_REPLACE
4760 * service is not set, then host shall not expect MAC ID from FW in
4761 * VDEV START RESPONSE event and host shall use PDEV ID.
4762 */
4763 if (WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
4764 WMI_SERVICE_DEPRECATED_REPLACE))
4765 wma_handle->wlan_resource_config.use_pdev_id = true;
4766 else
4767 wma_handle->wlan_resource_config.use_pdev_id = false;
4768
Ryan Hsu3c8f79f2015-12-02 16:45:09 -08004769 /* register the Enhanced Green AP event handler */
4770 wma_register_egap_event_handle(wma_handle);
4771
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004772 /* Initialize the log supported event handler */
4773 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
4774 WMI_DIAG_EVENT_LOG_SUPPORTED_EVENTID,
Govind Singhd76a5b02016-03-08 15:12:14 +05304775 wma_log_supported_evt_handler,
4776 WMA_RX_SERIALIZER_CTX);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304777 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004778 WMA_LOGE("Failed to register log supported event cb");
Govind Singhd76a5b02016-03-08 15:12:14 +05304779 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004780 }
4781
Leo Chang96464902016-10-28 11:10:54 -07004782 cdp_mark_first_wakeup_packet(soc,
Himanshu Agarwal19141bb2016-07-20 20:15:48 +05304783 WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
4784 WMI_SERVICE_MARK_FIRST_WAKEUP_PACKET));
4785
Deepak Dhamdhere13230d32016-05-26 00:46:53 -07004786 wma_handle->nan_datapath_enabled =
4787 WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
4788 WMI_SERVICE_NAN_DATA);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304789 qdf_mem_copy(target_cap.wmi_service_bitmap,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004790 param_buf->wmi_service_bitmap,
4791 sizeof(wma_handle->wmi_service_bitmap));
4792 target_cap.wlan_resource_config = wma_handle->wlan_resource_config;
4793 wma_update_fw_config(wma_handle, &target_cap);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304794 qdf_mem_copy(wma_handle->wmi_service_bitmap,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004795 target_cap.wmi_service_bitmap,
4796 sizeof(wma_handle->wmi_service_bitmap));
4797 wma_handle->wlan_resource_config = target_cap.wlan_resource_config;
4798
Govind Singhf25a0f12016-03-08 16:09:48 +05304799 status = wmi_unified_save_fw_version_cmd(wma_handle->wmi_handle,
4800 param_buf);
4801 if (status != EOK) {
4802 WMA_LOGE("Failed to send WMI_INIT_CMDID command");
4803 return -EINVAL;
4804 }
4805
4806 status = wma_setup_wmi_init_msg(wma_handle, ev, param_buf);
4807 if (status != EOK) {
4808 WMA_LOGE("Failed to setup for wma init command");
Govind Singhd76a5b02016-03-08 15:12:14 +05304809 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004810 }
4811
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05304812 /* A host, which supports WMI_SERVICE_READY_EXT_EVENTID, would need to
4813 * check the WMI_SERVICE_READY message for an "extension" flag, and if
4814 * this flag is set, then hold off on sending the WMI_INIT message until
4815 * WMI_SERVICE_READY_EXT_EVENTID is received.
4816 */
4817 if (!WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
4818 WMI_SERVICE_EXT_MSG)) {
4819 /* No service extended message support.
4820 * Send INIT command immediately
4821 */
4822 WMA_LOGA("WMA --> WMI_INIT_CMDID");
Govind Singhf25a0f12016-03-08 16:09:48 +05304823 status = wmi_unified_send_init_cmd(wma_handle->wmi_handle,
4824 &wma_handle->wlan_resource_config,
4825 wma_handle->num_mem_chunks,
4826 wma_handle->mem_chunks, 1);
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05304827 if (status != EOK) {
4828 WMA_LOGE("Failed to send WMI_INIT_CMDID command");
Govind Singhd76a5b02016-03-08 15:12:14 +05304829 return -EINVAL;
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05304830 }
4831 } else {
Govind Singhf25a0f12016-03-08 16:09:48 +05304832 status = wmi_unified_send_init_cmd(wma_handle->wmi_handle,
4833 &wma_handle->wlan_resource_config,
4834 wma_handle->num_mem_chunks,
4835 wma_handle->mem_chunks, 0);
4836 if (status != EOK) {
4837 WMA_LOGE("Failed to save WMI_INIT_CMDID command parameter");
4838 return -EINVAL;
4839 }
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05304840 /* The saved 'buf' will be freed after sending INIT command or
4841 * in other cases as required
4842 */
Anurag Chouhan210db072016-02-22 18:42:15 +05304843 ret = qdf_mc_timer_start(&wma_handle->service_ready_ext_timer,
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05304844 WMA_SERVICE_READY_EXT_TIMEOUT);
Anurag Chouhandf2b2682016-02-29 14:15:27 +05304845 if (!QDF_IS_STATUS_SUCCESS(ret))
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05304846 WMA_LOGP("Failed to start the service ready ext timer");
4847
4848 WMA_LOGA("%s: WMA waiting for WMI_SERVICE_READY_EXT_EVENTID",
4849 __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004850 }
Govind Singhd76a5b02016-03-08 15:12:14 +05304851
4852 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004853}
4854
4855/**
Krunal Soni0193b6f2016-08-15 15:53:43 -07004856 * wma_get_phyid_for_given_band() - to get phyid for band
4857 *
4858 * @wma_handle: Pointer to wma handle
4859 * @map: Pointer to map which is derived from hw mode & has mapping between
4860 * hw mode and available PHYs for that hw mode.
4861 * @band: enum value of for 2G or 5G band
4862 * @phyid: Pointer to phyid which needs to be filled
4863 *
4864 * This API looks in to the map to find out which particular phy supports
4865 * provided band and return the idx (also called phyid) of that phy. Caller
4866 * use this phyid to fetch various caps of that phy
4867 *
4868 * Return: QDF_STATUS
4869 */
4870static QDF_STATUS wma_get_phyid_for_given_band(
4871 t_wma_handle * wma_handle,
4872 struct hw_mode_idx_to_mac_cap_idx *map,
4873 enum cds_band_type band, uint8_t *phyid)
4874{
4875 uint8_t idx, i;
4876 WMI_MAC_PHY_CAPABILITIES *cap;
4877
4878 if (!wma_handle) {
4879 WMA_LOGE("Invalid wma handle");
4880 return QDF_STATUS_E_FAILURE;
4881 }
4882
4883 if (!map) {
4884 WMA_LOGE("Invalid given map");
4885 return QDF_STATUS_E_FAILURE;
4886 }
4887 idx = map->mac_cap_idx;
4888 *phyid = idx;
4889
4890 for (i = 0; i < map->num_of_macs; i++) {
4891 cap = &wma_handle->phy_caps.each_phy_cap_per_hwmode[idx + i];
4892 if ((band == CDS_BAND_2GHZ) &&
4893 (WLAN_2G_CAPABILITY == cap->supported_bands)) {
4894 *phyid = idx + i;
4895 WMA_LOGI("Select 2G capable phyid[%d]", *phyid);
4896 return QDF_STATUS_SUCCESS;
4897 } else if ((band == CDS_BAND_5GHZ) &&
4898 (WLAN_5G_CAPABILITY == cap->supported_bands)) {
4899 *phyid = idx + i;
4900 WMA_LOGI("Select 5G capable phyid[%d]", *phyid);
4901 return QDF_STATUS_SUCCESS;
4902 }
4903 }
4904 WMA_LOGI("Using default single hw mode phyid[%d]", *phyid);
4905 return QDF_STATUS_SUCCESS;
4906}
4907
4908/**
4909 * wma_get_caps_for_phyidx_hwmode() - to fetch caps for given hw mode and band
4910 * @caps_per_phy: Pointer to capabilities structure which needs to be filled
4911 * @hw_mode: Provided hardware mode
4912 * @band: Provide band i.e. 2G or 5G
4913 *
4914 * This API finds cap which suitable for provided hw mode and band. If user
4915 * is provides some invalid hw mode then it will automatically falls back to
4916 * default hw mode
4917 *
4918 * Return: QDF_STATUS
4919 */
4920QDF_STATUS wma_get_caps_for_phyidx_hwmode(struct wma_caps_per_phy *caps_per_phy,
4921 enum hw_mode_dbs_capab hw_mode, enum cds_band_type band)
4922{
4923 t_wma_handle *wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
4924 struct hw_mode_idx_to_mac_cap_idx *map;
4925 WMI_MAC_PHY_CAPABILITIES *phy_cap;
4926 uint8_t phyid, our_hw_mode = hw_mode;
4927
4928 if (!wma_handle) {
4929 WMA_LOGE("Invalid wma handle");
4930 return QDF_STATUS_E_FAILURE;
4931 }
4932
4933 if (0 == wma_handle->phy_caps.num_hw_modes.num_hw_modes) {
4934 WMA_LOGE("Invalid number of hw modes");
4935 return QDF_STATUS_E_FAILURE;
4936 }
4937
4938 if (!wma_is_dbs_enable())
4939 our_hw_mode = HW_MODE_DBS_NONE;
4940
4941 if (!caps_per_phy) {
4942 WMA_LOGE("Invalid caps pointer");
4943 return QDF_STATUS_E_FAILURE;
4944 }
4945
4946 map = &wma_handle->phy_caps.hw_mode_to_mac_cap_map[our_hw_mode];
4947
4948 if (QDF_STATUS_SUCCESS !=
4949 wma_get_phyid_for_given_band(wma_handle, map, band, &phyid)) {
4950 WMA_LOGE("Invalid phyid");
4951 return QDF_STATUS_E_FAILURE;
4952 }
4953 phy_cap = &wma_handle->phy_caps.each_phy_cap_per_hwmode[phyid];
4954
4955 caps_per_phy->ht_2g = phy_cap->ht_cap_info_2G;
4956 caps_per_phy->ht_5g = phy_cap->ht_cap_info_5G;
4957 caps_per_phy->vht_2g = phy_cap->vht_cap_info_2G;
4958 caps_per_phy->vht_5g = phy_cap->vht_cap_info_5G;
4959 caps_per_phy->he_2g = phy_cap->he_cap_info_2G;
4960 caps_per_phy->he_5g = phy_cap->he_cap_info_5G;
4961
4962 return QDF_STATUS_SUCCESS;
4963}
4964
4965/**
4966 * wma_is_rx_ldpc_supported_for_channel() - to find out if ldpc is supported
4967 *
4968 * @channel: Channel number for which it needs to check if rx ldpc is enabled
4969 *
4970 * This API takes channel number as argument and takes default hw mode as DBS
4971 * to check if rx LDPC support is enabled for that channel or no
4972 */
4973bool wma_is_rx_ldpc_supported_for_channel(uint32_t channel)
4974{
4975 struct wma_caps_per_phy caps_per_phy = {0};
4976 enum cds_band_type band;
4977 bool status;
4978
4979 if (!CDS_IS_CHANNEL_24GHZ(channel))
4980 band = CDS_BAND_5GHZ;
4981 else
4982 band = CDS_BAND_2GHZ;
4983
4984 if (QDF_STATUS_SUCCESS != wma_get_caps_for_phyidx_hwmode(
4985 &caps_per_phy,
4986 HW_MODE_DBS, band)) {
4987 return false;
4988 }
4989 if (CDS_IS_CHANNEL_24GHZ(channel))
4990 status = (!!(caps_per_phy.ht_2g & WMI_HT_CAP_RX_LDPC));
4991 else
4992 status = (!!(caps_per_phy.ht_5g & WMI_HT_CAP_RX_LDPC));
4993
4994 return status;
4995}
4996
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07004997/**
4998 * wma_print_mac_phy_capabilities() - Prints MAC PHY capabilities
4999 * @cap: pointer to WMI_MAC_PHY_CAPABILITIES
5000 * @index: MAC_PHY index
5001 *
5002 * Return: none
5003 */
5004static void wma_print_mac_phy_capabilities(WMI_MAC_PHY_CAPABILITIES *cap,
5005 int index)
5006{
5007 uint32_t mac_2G, mac_5G;
5008 uint32_t phy_2G[WMI_MAX_HECAP_PHY_SIZE];
5009 uint32_t phy_5G[WMI_MAX_HECAP_PHY_SIZE];
5010 wmi_ppe_threshold ppet_2G, ppet_5G;
5011
5012 WMA_LOGI("\t: index [%d]", index);
5013 WMA_LOGI("\t: cap for hw_mode_id[%d]", cap->hw_mode_id);
5014 WMA_LOGI("\t: pdev_id[%d]", cap->pdev_id);
5015 WMA_LOGI("\t: phy_id[%d]", cap->phy_id);
5016 WMA_LOGI("\t: supports_11b[%d]",
5017 WMI_SUPPORT_11B_GET(cap->supported_flags));
5018 WMA_LOGI("\t: supports_11g[%d]",
5019 WMI_SUPPORT_11G_GET(cap->supported_flags));
5020 WMA_LOGI("\t: supports_11a[%d]",
5021 WMI_SUPPORT_11A_GET(cap->supported_flags));
5022 WMA_LOGI("\t: supports_11n[%d]",
5023 WMI_SUPPORT_11N_GET(cap->supported_flags));
5024 WMA_LOGI("\t: supports_11ac[%d]",
5025 WMI_SUPPORT_11AC_GET(cap->supported_flags));
5026 WMA_LOGI("\t: supports_11ax[%d]",
5027 WMI_SUPPORT_11AX_GET(cap->supported_flags));
5028 WMA_LOGI("\t: supported_flags[%d]", cap->supported_flags);
5029 WMA_LOGI("\t: supported_bands[%d]", cap->supported_bands);
5030 WMA_LOGI("\t: ampdu_density[%d]", cap->ampdu_density);
5031 WMA_LOGI("\t: max_bw_supported_2G[%d]", cap->max_bw_supported_2G);
5032 WMA_LOGI("\t: ht_cap_info_2G[%d]", cap->ht_cap_info_2G);
5033 WMA_LOGI("\t: vht_cap_info_2G[%d]", cap->vht_cap_info_2G);
5034 WMA_LOGI("\t: vht_supp_mcs_2G[%d]", cap->vht_supp_mcs_2G);
5035 WMA_LOGI("\t: tx_chain_mask_2G[%d]", cap->tx_chain_mask_2G);
5036 WMA_LOGI("\t: rx_chain_mask_2G[%d]", cap->rx_chain_mask_2G);
5037 WMA_LOGI("\t: max_bw_supported_5G[%d]", cap->max_bw_supported_5G);
5038 WMA_LOGI("\t: ht_cap_info_5G[%d]", cap->ht_cap_info_5G);
5039 WMA_LOGI("\t: vht_cap_info_5G[%d]", cap->vht_cap_info_5G);
5040 WMA_LOGI("\t: vht_supp_mcs_5G[%d]", cap->vht_supp_mcs_5G);
5041 WMA_LOGI("\t: tx_chain_mask_5G[%d]", cap->tx_chain_mask_5G);
5042 WMA_LOGI("\t: rx_chain_mask_5G[%d]", cap->rx_chain_mask_5G);
5043 WMA_LOGI("\t: he_cap_info_2G[%08x]", cap->he_cap_info_2G);
5044 WMA_LOGI("\t: he_supp_mcs_2G[%08x]", cap->he_supp_mcs_2G);
5045 WMA_LOGI("\t: he_cap_info_5G[%08x]", cap->he_cap_info_5G);
5046 WMA_LOGI("\t: he_supp_mcs_5G[%08x]", cap->he_supp_mcs_5G);
5047 mac_2G = cap->he_cap_info_2G;
5048 mac_5G = cap->he_cap_info_5G;
5049 qdf_mem_copy(phy_2G, cap->he_cap_phy_info_2G,
5050 WMI_MAX_HECAP_PHY_SIZE * 4);
5051 qdf_mem_copy(phy_5G, cap->he_cap_phy_info_5G,
5052 WMI_MAX_HECAP_PHY_SIZE * 4);
5053 ppet_2G = cap->he_ppet2G;
5054 ppet_5G = cap->he_ppet5G;
5055
5056 wma_print_he_mac_cap(mac_2G);
5057 wma_print_he_phy_cap(phy_2G);
5058 wma_print_he_ppet(&ppet_2G);
5059 wma_print_he_mac_cap(mac_5G);
5060 wma_print_he_phy_cap(phy_5G);
5061 wma_print_he_ppet(&ppet_5G);
5062}
Krunal Soni0193b6f2016-08-15 15:53:43 -07005063
5064/**
Krunal Soni2e48d012016-05-02 16:55:26 -07005065 * wma_print_populate_soc_caps() - Prints all the caps populated per hw mode
5066 * @wma_handle: pointer to wma_handle
5067 *
5068 * This function prints all the caps populater per hw mode and per PHY
5069 *
5070 * Return: none
5071 */
5072static void wma_print_populate_soc_caps(t_wma_handle *wma_handle)
5073{
5074 int i, j = 0, max_mac;
5075 WMI_MAC_PHY_CAPABILITIES *tmp;
5076
5077 /* print number of hw modes */
5078 WMA_LOGI("%s: num of hw modes [%d]", __func__,
5079 wma_handle->phy_caps.num_hw_modes.num_hw_modes);
5080 WMA_LOGI("%s: <====== HW mode cap printing starts ======>", __func__);
5081 /* print cap of each hw mode */
5082 for (i = 0; i < wma_handle->phy_caps.num_hw_modes.num_hw_modes; i++) {
5083 WMA_LOGI("====>: hw mode id[%d], phy_id map[%d]",
5084 wma_handle->phy_caps.each_hw_mode_cap[i].hw_mode_id,
5085 wma_handle->phy_caps.each_hw_mode_cap[i].phy_id_map);
5086 if (wma_handle->phy_caps.each_hw_mode_cap[i].phy_id_map ==
5087 PHY1_PHY2)
5088 max_mac = j + 2;
5089 else
5090 max_mac = j + 1;
5091
5092 for ( ; j < max_mac; j++) {
5093 tmp = &wma_handle->phy_caps.each_phy_cap_per_hwmode[j];
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07005094 wma_print_mac_phy_capabilities(tmp, j);
Krunal Soni2e48d012016-05-02 16:55:26 -07005095 }
5096 }
5097 WMA_LOGI("%s: <====== HW mode cap printing ends ======>\n", __func__);
5098}
5099
5100/**
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305101 * wma_map_wmi_channel_width_to_hw_mode_bw() - returns bandwidth
5102 * in terms of hw_mode_bandwidth
5103 * @width: bandwidth in terms of wmi_channel_width
5104 *
5105 * This function returns the bandwidth in terms of hw_mode_bandwidth.
5106 *
5107 * Return: BW in terms of hw_mode_bandwidth.
5108 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07005109static enum hw_mode_bandwidth wma_map_wmi_channel_width_to_hw_mode_bw(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305110 wmi_channel_width width)
5111{
5112 switch (width) {
5113 case WMI_CHAN_WIDTH_20:
5114 return HW_MODE_20_MHZ;
5115 case WMI_CHAN_WIDTH_40:
5116 return HW_MODE_40_MHZ;
5117 case WMI_CHAN_WIDTH_80:
5118 return HW_MODE_80_MHZ;
5119 case WMI_CHAN_WIDTH_160:
5120 return HW_MODE_160_MHZ;
5121 case WMI_CHAN_WIDTH_80P80:
5122 return HW_MODE_80_PLUS_80_MHZ;
5123 case WMI_CHAN_WIDTH_5:
5124 return HW_MODE_5_MHZ;
5125 case WMI_CHAN_WIDTH_10:
5126 return HW_MODE_10_MHZ;
5127 default:
5128 return HW_MODE_BW_NONE;
5129 }
5130
5131 return HW_MODE_BW_NONE;
5132}
5133
5134/**
5135 * wma_get_hw_mode_params() - get TX-RX stream and bandwidth
5136 * supported from the capabilities.
5137 * @caps: PHY capability
5138 * @info: param to store TX-RX stream and BW information
5139 *
5140 * This function will calculate TX-RX stream and bandwidth supported
5141 * as per the PHY capability, and assign to mac_ss_bw_info.
5142 *
5143 * Return: none
5144 */
5145static void wma_get_hw_mode_params(WMI_MAC_PHY_CAPABILITIES *caps,
5146 struct mac_ss_bw_info *info)
5147{
5148 if (!caps) {
5149 WMA_LOGE("%s: Invalid capabilities", __func__);
5150 return;
5151 }
5152
5153 info->mac_tx_stream = wma_get_num_of_setbits_from_bitmask(
5154 QDF_MAX(caps->tx_chain_mask_2G,
5155 caps->tx_chain_mask_5G));
5156 info->mac_rx_stream = wma_get_num_of_setbits_from_bitmask(
5157 QDF_MAX(caps->rx_chain_mask_2G,
5158 caps->rx_chain_mask_5G));
5159 info->mac_bw = wma_map_wmi_channel_width_to_hw_mode_bw(
5160 QDF_MAX(caps->max_bw_supported_2G,
5161 caps->max_bw_supported_5G));
5162}
5163
5164/**
5165 * wma_set_hw_mode_params() - sets TX-RX stream, bandwidth and
5166 * DBS in hw_mode_list
5167 * @wma_handle: pointer to wma global structure
5168 * @mac0_ss_bw_info: TX-RX streams, BW for MAC0
5169 * @mac1_ss_bw_info: TX-RX streams, BW for MAC1
5170 * @pos: refers to hw_mode_index
5171 * @dbs_mode: dbs_mode for the dbs_hw_mode
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305172 * @sbs_mode: sbs_mode for the sbs_hw_mode
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305173 *
5174 * This function sets TX-RX stream, bandwidth and DBS mode in
5175 * hw_mode_list.
5176 *
5177 * Return: none
5178 */
5179static void wma_set_hw_mode_params(t_wma_handle *wma_handle,
5180 struct mac_ss_bw_info mac0_ss_bw_info,
5181 struct mac_ss_bw_info mac1_ss_bw_info,
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305182 uint32_t pos, uint32_t dbs_mode,
5183 uint32_t sbs_mode)
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305184{
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305185 WMA_HW_MODE_MAC0_TX_STREAMS_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305186 wma_handle->hw_mode.hw_mode_list[pos],
5187 mac0_ss_bw_info.mac_tx_stream);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305188 WMA_HW_MODE_MAC0_RX_STREAMS_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305189 wma_handle->hw_mode.hw_mode_list[pos],
5190 mac0_ss_bw_info.mac_rx_stream);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305191 WMA_HW_MODE_MAC0_BANDWIDTH_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305192 wma_handle->hw_mode.hw_mode_list[pos],
5193 mac0_ss_bw_info.mac_bw);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305194 WMA_HW_MODE_MAC1_TX_STREAMS_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305195 wma_handle->hw_mode.hw_mode_list[pos],
5196 mac1_ss_bw_info.mac_tx_stream);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305197 WMA_HW_MODE_MAC1_RX_STREAMS_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305198 wma_handle->hw_mode.hw_mode_list[pos],
5199 mac1_ss_bw_info.mac_rx_stream);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305200 WMA_HW_MODE_MAC1_BANDWIDTH_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305201 wma_handle->hw_mode.hw_mode_list[pos],
5202 mac1_ss_bw_info.mac_bw);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305203 WMA_HW_MODE_DBS_MODE_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305204 wma_handle->hw_mode.hw_mode_list[pos],
5205 dbs_mode);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305206 WMA_HW_MODE_AGILE_DFS_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305207 wma_handle->hw_mode.hw_mode_list[pos],
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305208 HW_MODE_AGILE_DFS_NONE);
5209 WMA_HW_MODE_SBS_MODE_SET(
5210 wma_handle->hw_mode.hw_mode_list[pos],
5211 sbs_mode);
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305212}
5213
5214/**
5215 * wma_update_hw_mode_list() - updates hw_mode_list
5216 * @wma_handle: pointer to wma global structure
5217 *
5218 * This function updates hw_mode_list with tx_streams, rx_streams,
5219 * bandwidth, dbs and agile dfs for each hw_mode.
5220 *
5221 * Returns: 0 for success else failure.
5222 */
5223static QDF_STATUS wma_update_hw_mode_list(t_wma_handle *wma_handle)
5224{
5225 struct extended_caps *phy_caps;
5226 WMI_MAC_PHY_CAPABILITIES *tmp;
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305227 uint32_t i, hw_config_type, j = 0;
5228 uint32_t dbs_mode, sbs_mode;
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305229 struct mac_ss_bw_info mac0_ss_bw_info = {0};
5230 struct mac_ss_bw_info mac1_ss_bw_info = {0};
5231
5232 if (!wma_handle) {
5233 WMA_LOGE("%s: Invalid wma handle", __func__);
5234 return QDF_STATUS_E_FAILURE;
5235 }
5236
5237 phy_caps = &wma_handle->phy_caps;
5238 if (!phy_caps) {
5239 WMA_LOGE("%s: Invalid phy capabilities", __func__);
5240 return QDF_STATUS_SUCCESS;
5241 }
5242
5243 if (!phy_caps->num_hw_modes.num_hw_modes) {
5244 WMA_LOGE("%s: Number of HW modes: %d",
5245 __func__, phy_caps->num_hw_modes.num_hw_modes);
5246 return QDF_STATUS_SUCCESS;
5247 }
5248
5249 /*
5250 * This list was updated as part of service ready event. Re-populate
5251 * HW mode list from the device capabilities.
5252 */
5253 if (wma_handle->hw_mode.hw_mode_list) {
5254 qdf_mem_free(wma_handle->hw_mode.hw_mode_list);
5255 wma_handle->hw_mode.hw_mode_list = NULL;
5256 WMA_LOGI("%s: DBS list is freed", __func__);
5257 }
5258
5259 wma_handle->num_dbs_hw_modes = phy_caps->num_hw_modes.num_hw_modes;
5260 wma_handle->hw_mode.hw_mode_list =
5261 qdf_mem_malloc(sizeof(*wma_handle->hw_mode.hw_mode_list) *
5262 wma_handle->num_dbs_hw_modes);
5263 if (!wma_handle->hw_mode.hw_mode_list) {
5264 WMA_LOGE("%s: Memory allocation failed for DBS", __func__);
5265 return QDF_STATUS_E_FAILURE;
5266 }
5267
5268 WMA_LOGA("%s: Updated HW mode list: Num modes:%d",
5269 __func__, wma_handle->num_dbs_hw_modes);
5270
5271 for (i = 0; i < wma_handle->num_dbs_hw_modes; i++) {
5272 /* Update for MAC0 */
5273 tmp = &phy_caps->each_phy_cap_per_hwmode[j++];
5274 wma_get_hw_mode_params(tmp, &mac0_ss_bw_info);
5275 hw_config_type =
5276 phy_caps->each_hw_mode_cap[i].hw_mode_config_type;
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305277 dbs_mode = HW_MODE_DBS_NONE;
5278 sbs_mode = HW_MODE_SBS_NONE;
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305279 mac1_ss_bw_info.mac_tx_stream = 0;
5280 mac1_ss_bw_info.mac_rx_stream = 0;
5281 mac1_ss_bw_info.mac_bw = 0;
5282
5283 /* SBS and DBS have dual MAC. Upto 2 MACs are considered. */
5284 if ((hw_config_type == WMI_HW_MODE_DBS) ||
5285 (hw_config_type == WMI_HW_MODE_SBS_PASSIVE) ||
5286 (hw_config_type == WMI_HW_MODE_SBS)) {
5287 /* Update for MAC1 */
5288 tmp = &phy_caps->each_phy_cap_per_hwmode[j++];
5289 wma_get_hw_mode_params(tmp, &mac1_ss_bw_info);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305290 if (hw_config_type == WMI_HW_MODE_DBS)
5291 dbs_mode = HW_MODE_DBS;
5292 if ((hw_config_type == WMI_HW_MODE_SBS_PASSIVE) ||
5293 (hw_config_type == WMI_HW_MODE_SBS))
5294 sbs_mode = HW_MODE_SBS;
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305295 }
5296
5297 /* Updating HW mode list */
5298 wma_set_hw_mode_params(wma_handle, mac0_ss_bw_info,
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305299 mac1_ss_bw_info, i, dbs_mode,
5300 sbs_mode);
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305301 }
5302 wma_dump_dbs_hw_mode(wma_handle);
5303 return QDF_STATUS_SUCCESS;
5304}
5305
5306/**
Krunal Soni2e48d012016-05-02 16:55:26 -07005307 * wma_populate_soc_caps() - populate entire SOC's capabilities
5308 * @wma_handle: pointer to wma global structure
5309 * @param_buf: pointer to param of service ready extension event from fw
5310 *
5311 * This API populates all capabilities of entire SOC. For example,
5312 * how many number of hw modes are supported by this SOC, what are the
5313 * capabilities of each phy per hw mode, what are HAL reg capabilities per
5314 * phy.
5315 *
5316 * Return: none
5317 */
5318static void wma_populate_soc_caps(t_wma_handle *wma_handle,
5319 WMI_SERVICE_READY_EXT_EVENTID_param_tlvs *param_buf)
5320{
5321 int i, num_of_mac_caps = 0, tmp = 0;
5322 struct extended_caps *phy_caps;
5323 struct hw_mode_idx_to_mac_cap_idx *map;
5324
5325 WMA_LOGD("%s: Enter", __func__);
5326
5327 if (!wma_handle) {
5328 WMA_LOGP("%s: Invalid WMA handle", __func__);
5329 return;
5330 }
5331
5332 if (!param_buf) {
5333 WMA_LOGP("%s: Invalid event", __func__);
5334 return;
5335 }
5336 phy_caps = &wma_handle->phy_caps;
5337
5338 /*
5339 * first thing to do is to get how many number of hw modes are
5340 * supported and populate in wma_handle global structure
5341 */
Krunal Sonifd85ba62016-07-11 08:18:53 -07005342 if (NULL == param_buf->soc_hw_mode_caps) {
5343 WMA_LOGE("%s: Invalid number of hw modes", __func__);
5344 return;
5345 }
5346
Krunal Soni2e48d012016-05-02 16:55:26 -07005347 qdf_mem_copy(&phy_caps->num_hw_modes,
5348 param_buf->soc_hw_mode_caps,
5349 sizeof(WMI_SOC_MAC_PHY_HW_MODE_CAPS));
5350 if (0 == phy_caps->num_hw_modes.num_hw_modes) {
Krunal Sonifd85ba62016-07-11 08:18:53 -07005351 WMA_LOGE("%s: Number of hw modes is zero", __func__);
Krunal Soni2e48d012016-05-02 16:55:26 -07005352 return;
Krunal Soni2e48d012016-05-02 16:55:26 -07005353 }
Krunal Sonifd85ba62016-07-11 08:18:53 -07005354 WMA_LOGI("%s: Given number of hw modes[%d]",
5355 __func__, phy_caps->num_hw_modes.num_hw_modes);
Krunal Soni2e48d012016-05-02 16:55:26 -07005356
5357 /*
5358 * next thing is to allocate the memory to map hw mode to phy/mac caps
5359 */
5360 phy_caps->hw_mode_to_mac_cap_map =
5361 qdf_mem_malloc(phy_caps->num_hw_modes.num_hw_modes *
5362 sizeof(struct hw_mode_idx_to_mac_cap_idx));
5363 if (!phy_caps->hw_mode_to_mac_cap_map) {
5364 WMA_LOGE("%s: Memory allocation failed", __func__);
5365 return;
5366 }
5367
5368 /*
5369 * next thing is to allocate the memory for per hw caps
5370 */
5371 phy_caps->each_hw_mode_cap =
5372 qdf_mem_malloc(phy_caps->num_hw_modes.num_hw_modes *
5373 sizeof(WMI_HW_MODE_CAPABILITIES));
5374 if (!phy_caps->each_hw_mode_cap) {
5375 WMA_LOGE("%s: Memory allocation failed", __func__);
5376 wma_cleanup_dbs_phy_caps(wma_handle);
5377 return;
5378 }
5379 qdf_mem_copy(phy_caps->each_hw_mode_cap,
5380 param_buf->hw_mode_caps,
5381 phy_caps->num_hw_modes.num_hw_modes *
5382 sizeof(WMI_HW_MODE_CAPABILITIES));
5383 /*
5384 * next thing is to count the number of mac cap to populate per
5385 * hw mode and generate map, so that our search can be done
5386 * efficiently which is O(1)
5387 */
5388 for (i = 0; i < phy_caps->num_hw_modes.num_hw_modes; i++) {
5389 map = &phy_caps->hw_mode_to_mac_cap_map[i];
5390 if (phy_caps->each_hw_mode_cap[i].phy_id_map == PHY1_PHY2) {
5391 tmp = num_of_mac_caps;
5392 num_of_mac_caps = num_of_mac_caps + 2;
5393 map->num_of_macs = 2;
5394 } else {
5395 tmp = num_of_mac_caps;
5396 num_of_mac_caps = num_of_mac_caps + 1;
5397 map->num_of_macs = 1;
5398 }
5399 map->mac_cap_idx = tmp;
5400 map->hw_mode_id = phy_caps->each_hw_mode_cap[i].hw_mode_id;
5401 }
5402
5403 /*
5404 * next thing is to populate each phy caps per hw mode
5405 */
5406 phy_caps->each_phy_cap_per_hwmode =
5407 qdf_mem_malloc(num_of_mac_caps *
5408 sizeof(WMI_MAC_PHY_CAPABILITIES));
5409 if (!phy_caps->each_phy_cap_per_hwmode) {
5410 WMA_LOGE("%s: Memory allocation failed", __func__);
5411 wma_cleanup_dbs_phy_caps(wma_handle);
5412 return;
5413 }
5414 qdf_mem_copy(phy_caps->each_phy_cap_per_hwmode,
5415 param_buf->mac_phy_caps,
5416 num_of_mac_caps * sizeof(WMI_MAC_PHY_CAPABILITIES));
5417
5418 /*
5419 * next thing is to populate reg caps per phy
5420 */
5421 qdf_mem_copy(&phy_caps->num_phy_for_hal_reg_cap,
5422 param_buf->soc_hal_reg_caps,
5423 sizeof(WMI_SOC_HAL_REG_CAPABILITIES));
5424 if (phy_caps->num_phy_for_hal_reg_cap.num_phy == 0) {
5425 WMA_LOGE("%s: incorrect number of phys", __func__);
5426 wma_cleanup_dbs_phy_caps(wma_handle);
5427 return;
5428 }
5429 phy_caps->each_phy_hal_reg_cap =
5430 qdf_mem_malloc(phy_caps->num_phy_for_hal_reg_cap.num_phy *
5431 sizeof(WMI_HAL_REG_CAPABILITIES_EXT));
5432 if (!phy_caps->each_phy_hal_reg_cap) {
5433 WMA_LOGE("%s: Memory allocation failed", __func__);
5434 wma_cleanup_dbs_phy_caps(wma_handle);
5435 return;
5436 }
5437 qdf_mem_copy(phy_caps->each_phy_hal_reg_cap,
5438 param_buf->hal_reg_caps,
5439 phy_caps->num_phy_for_hal_reg_cap.num_phy *
5440 sizeof(WMI_HAL_REG_CAPABILITIES_EXT));
5441 wma_print_populate_soc_caps(wma_handle);
5442 return;
5443}
5444
5445/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005446 * wma_rx_service_ready_ext_event() - evt handler for sevice ready ext event.
5447 * @handle: wma handle
5448 * @event: params of the service ready extended event
Govind Singhd76a5b02016-03-08 15:12:14 +05305449 * @length: param length
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005450 *
5451 * Return: none
5452 */
Govind Singhd76a5b02016-03-08 15:12:14 +05305453int wma_rx_service_ready_ext_event(void *handle, uint8_t *event,
5454 uint32_t length)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005455{
5456 tp_wma_handle wma_handle = (tp_wma_handle) handle;
5457 WMI_SERVICE_READY_EXT_EVENTID_param_tlvs *param_buf;
5458 wmi_service_ready_ext_event_fixed_param *ev;
5459 int status;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305460 QDF_STATUS ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005461
5462 WMA_LOGD("%s: Enter", __func__);
5463
5464 if (!wma_handle) {
5465 WMA_LOGP("%s: Invalid WMA handle", __func__);
Govind Singhd76a5b02016-03-08 15:12:14 +05305466 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005467 }
5468
5469 param_buf = (WMI_SERVICE_READY_EXT_EVENTID_param_tlvs *) event;
5470 if (!param_buf) {
5471 WMA_LOGP("%s: Invalid event", __func__);
Govind Singhd76a5b02016-03-08 15:12:14 +05305472 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005473 }
5474
5475 ev = param_buf->fixed_param;
5476 if (!ev) {
5477 WMA_LOGP("%s: Invalid buffer", __func__);
Govind Singhd76a5b02016-03-08 15:12:14 +05305478 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005479 }
5480
5481 WMA_LOGA("WMA <-- WMI_SERVICE_READY_EXT_EVENTID");
5482
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05305483 WMA_LOGA("%s: Defaults: scan config:%x FW mode config:%x",
5484 __func__, ev->default_conc_scan_config_bits,
5485 ev->default_fw_config_bits);
5486
Anurag Chouhan210db072016-02-22 18:42:15 +05305487 ret = qdf_mc_timer_stop(&wma_handle->service_ready_ext_timer);
Anurag Chouhandf2b2682016-02-29 14:15:27 +05305488 if (!QDF_IS_STATUS_SUCCESS(ret)) {
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05305489 WMA_LOGP("Failed to stop the service ready ext timer");
Govind Singhd76a5b02016-03-08 15:12:14 +05305490 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005491 }
Krunal Soni2e48d012016-05-02 16:55:26 -07005492 wma_populate_soc_caps(wma_handle, param_buf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005493
Nitesh Shah877ad5d2016-09-22 19:27:58 +05305494 ret = wma_update_hw_mode_list(wma_handle);
5495 if (QDF_IS_STATUS_ERROR(ret)) {
5496 WMA_LOGE("Failed to update hw mode list");
5497 return -EINVAL;
5498 }
5499
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005500 WMA_LOGA("WMA --> WMI_INIT_CMDID");
Govind Singhf25a0f12016-03-08 16:09:48 +05305501 status = wmi_unified_send_saved_init_cmd(wma_handle->wmi_handle);
5502 if (status != EOK)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005503 /* In success case, WMI layer will free after getting copy
5504 * engine TX complete interrupt
5505 */
5506 WMA_LOGE("Failed to send WMI_INIT_CMDID command");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005507
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05305508 wma_init_scan_fw_mode_config(wma_handle,
5509 ev->default_conc_scan_config_bits,
5510 ev->default_fw_config_bits);
Sandeep Puligilla3d6a8e22016-10-11 18:57:14 -07005511 wma_handle->target_fw_vers_ext = ev->fw_build_vers_ext;
Govind Singhd76a5b02016-03-08 15:12:14 +05305512 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005513}
5514
5515/**
5516 * wma_rx_ready_event() - event handler to process
5517 * wmi rx ready event.
5518 * @handle: wma handle
5519 * @cmd_param_info: command params info
Govind Singhd76a5b02016-03-08 15:12:14 +05305520 * @length: param length
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005521 *
5522 * Return: none
5523 */
Govind Singhd76a5b02016-03-08 15:12:14 +05305524int wma_rx_ready_event(void *handle, uint8_t *cmd_param_info,
5525 uint32_t length)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005526{
5527 tp_wma_handle wma_handle = (tp_wma_handle) handle;
5528 WMI_READY_EVENTID_param_tlvs *param_buf = NULL;
5529 wmi_ready_event_fixed_param *ev = NULL;
5530
5531 WMA_LOGD("%s: Enter", __func__);
5532
5533 param_buf = (WMI_READY_EVENTID_param_tlvs *) cmd_param_info;
5534 if (!(wma_handle && param_buf)) {
5535 WMA_LOGP("%s: Invalid arguments", __func__);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305536 QDF_ASSERT(0);
Govind Singhd76a5b02016-03-08 15:12:14 +05305537 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005538 }
5539
5540 WMA_LOGA("WMA <-- WMI_READY_EVENTID");
5541
5542 ev = param_buf->fixed_param;
5543 /* Indicate to the waiting thread that the ready
5544 * event was received */
Naveen Rawat64e477e2016-05-20 10:34:56 -07005545 wma_handle->sub_20_support =
5546 WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
5547 WMI_SERVICE_HALF_RATE_QUARTER_RATE_SUPPORT);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005548 wma_handle->wmi_ready = true;
5549 wma_handle->wlan_init_status = ev->status;
5550
5551 /*
5552 * We need to check the WMI versions and make sure both
5553 * host and fw are compatible.
5554 */
5555 if (!wmi_versions_are_compatible(&wma_handle->final_abi_vers,
5556 &ev->fw_abi_vers)) {
5557 /*
5558 * Error: Our host version and the given firmware version
5559 * are incompatible.
5560 */
5561 WMA_LOGE("%s: Error: Incompatible WMI version."
5562 "Host: %d,%d,0x%x 0x%x 0x%x 0x%x, FW: %d,%d,0x%x 0x%x 0x%x 0x%x",
5563 __func__,
5564 WMI_VER_GET_MAJOR(wma_handle->final_abi_vers.
5565 abi_version_0),
5566 WMI_VER_GET_MINOR(wma_handle->final_abi_vers.
5567 abi_version_0),
5568 wma_handle->final_abi_vers.abi_version_ns_0,
5569 wma_handle->final_abi_vers.abi_version_ns_1,
5570 wma_handle->final_abi_vers.abi_version_ns_2,
5571 wma_handle->final_abi_vers.abi_version_ns_3,
5572 WMI_VER_GET_MAJOR(ev->fw_abi_vers.abi_version_0),
5573 WMI_VER_GET_MINOR(ev->fw_abi_vers.abi_version_0),
5574 ev->fw_abi_vers.abi_version_ns_0,
5575 ev->fw_abi_vers.abi_version_ns_1,
5576 ev->fw_abi_vers.abi_version_ns_2,
5577 ev->fw_abi_vers.abi_version_ns_3);
5578 if (wma_handle->wlan_init_status == WLAN_INIT_STATUS_SUCCESS) {
5579 /* Failed this connection to FW */
5580 wma_handle->wlan_init_status =
5581 WLAN_INIT_STATUS_GEN_FAILED;
5582 }
5583 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305584 qdf_mem_copy(&wma_handle->final_abi_vers, &ev->fw_abi_vers,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005585 sizeof(wmi_abi_version));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305586 qdf_mem_copy(&wma_handle->target_abi_vers, &ev->fw_abi_vers,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005587 sizeof(wmi_abi_version));
5588
5589 /* copy the mac addr */
5590 WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->mac_addr, wma_handle->myaddr);
5591 WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->mac_addr, wma_handle->hwaddr);
5592
5593 wma_update_hdd_cfg(wma_handle);
5594
Anurag Chouhandf2b2682016-02-29 14:15:27 +05305595 qdf_event_set(&wma_handle->wma_ready_event);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005596
5597 WMA_LOGD("Exit");
Govind Singhd76a5b02016-03-08 15:12:14 +05305598
5599 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005600}
5601
5602/**
5603 * wma_setneedshutdown() - setting wma needshutdown flag
5604 * @cds_ctx: cds context
5605 *
5606 * Return: none
5607 */
5608void wma_setneedshutdown(void *cds_ctx)
5609{
5610 tp_wma_handle wma_handle;
5611
5612 WMA_LOGD("%s: Enter", __func__);
5613
Anurag Chouhan6d760662016-02-20 16:05:43 +05305614 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005615
5616 if (NULL == wma_handle) {
5617 WMA_LOGP("%s: Invalid arguments", __func__);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305618 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005619 return;
5620 }
5621
5622 wma_handle->needShutdown = true;
5623 WMA_LOGD("%s: Exit", __func__);
5624}
5625
5626/**
5627 * wma_needshutdown() - Is wma needs shutdown?
5628 * @cds_ctx: cds context
5629 *
5630 * Return: returns true/false
5631 */
5632bool wma_needshutdown(void *cds_ctx)
5633{
5634 tp_wma_handle wma_handle;
5635
5636 WMA_LOGD("%s: Enter", __func__);
5637
Anurag Chouhan6d760662016-02-20 16:05:43 +05305638 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005639
5640 if (NULL == wma_handle) {
5641 WMA_LOGP("%s: Invalid arguments", __func__);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305642 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005643 return false;
5644 }
5645
5646 WMA_LOGD("%s: Exit", __func__);
5647 return wma_handle->needShutdown;
5648}
5649
5650/**
5651 * wma_wait_for_ready_event() - wait for wma ready event
5652 * @handle: wma handle
5653 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05305654 * Return: 0 for success or QDF error
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005655 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305656QDF_STATUS wma_wait_for_ready_event(WMA_HANDLE handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005657{
5658 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305659 QDF_STATUS qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005660
5661 /* wait until WMI_READY_EVENTID received from FW */
Anurag Chouhandf2b2682016-02-29 14:15:27 +05305662 qdf_status = qdf_wait_single_event(&(wma_handle->wma_ready_event),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005663 WMA_READY_EVENTID_TIMEOUT);
5664
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305665 if (QDF_STATUS_SUCCESS != qdf_status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005666 WMA_LOGP("%s: Timeout waiting for ready event from FW",
5667 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305668 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005669 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305670 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005671}
5672
5673/**
5674 * wma_set_ppsconfig() - set pps config in fw
5675 * @vdev_id: vdev id
5676 * @pps_param: pps params
5677 * @val : param value
5678 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05305679 * Return: 0 for success or QDF error
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005680 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305681QDF_STATUS wma_set_ppsconfig(uint8_t vdev_id, uint16_t pps_param,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005682 int val)
5683{
Anurag Chouhan6d760662016-02-20 16:05:43 +05305684 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005685 int ret = -EIO;
5686 uint32_t pps_val;
5687
5688 if (NULL == wma) {
5689 WMA_LOGE("%s: Failed to get wma", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305690 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005691 }
5692
5693 switch (pps_param) {
5694 case WMA_VHT_PPS_PAID_MATCH:
5695 pps_val = ((val << 31) & 0xffff0000) |
5696 (PKT_PWR_SAVE_PAID_MATCH & 0xffff);
5697 goto pkt_pwr_save_config;
5698 case WMA_VHT_PPS_GID_MATCH:
5699 pps_val = ((val << 31) & 0xffff0000) |
5700 (PKT_PWR_SAVE_GID_MATCH & 0xffff);
5701 goto pkt_pwr_save_config;
5702 case WMA_VHT_PPS_DELIM_CRC_FAIL:
5703 pps_val = ((val << 31) & 0xffff0000) |
5704 (PKT_PWR_SAVE_DELIM_CRC_FAIL & 0xffff);
5705 goto pkt_pwr_save_config;
5706
5707 /* Enable the code below as and when the functionality
5708 * is supported/added in host.
5709 */
5710#ifdef NOT_YET
5711 case WMA_VHT_PPS_EARLY_TIM_CLEAR:
5712 pps_val = ((val << 31) & 0xffff0000) |
5713 (PKT_PWR_SAVE_EARLY_TIM_CLEAR & 0xffff);
5714 goto pkt_pwr_save_config;
5715 case WMA_VHT_PPS_EARLY_DTIM_CLEAR:
5716 pps_val = ((val << 31) & 0xffff0000) |
5717 (PKT_PWR_SAVE_EARLY_DTIM_CLEAR & 0xffff);
5718 goto pkt_pwr_save_config;
5719 case WMA_VHT_PPS_EOF_PAD_DELIM:
5720 pps_val = ((val << 31) & 0xffff0000) |
5721 (PKT_PWR_SAVE_EOF_PAD_DELIM & 0xffff);
5722 goto pkt_pwr_save_config;
5723 case WMA_VHT_PPS_MACADDR_MISMATCH:
5724 pps_val = ((val << 31) & 0xffff0000) |
5725 (PKT_PWR_SAVE_MACADDR_MISMATCH & 0xffff);
5726 goto pkt_pwr_save_config;
5727 case WMA_VHT_PPS_GID_NSTS_ZERO:
5728 pps_val = ((val << 31) & 0xffff0000) |
5729 (PKT_PWR_SAVE_GID_NSTS_ZERO & 0xffff);
5730 goto pkt_pwr_save_config;
5731 case WMA_VHT_PPS_RSSI_CHECK:
5732 pps_val = ((val << 31) & 0xffff0000) |
5733 (PKT_PWR_SAVE_RSSI_CHECK & 0xffff);
5734 goto pkt_pwr_save_config;
5735#endif /* NOT_YET */
5736pkt_pwr_save_config:
5737 WMA_LOGD("vdev_id:%d val:0x%x pps_val:0x%x", vdev_id,
5738 val, pps_val);
Govind Singhd76a5b02016-03-08 15:12:14 +05305739 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005740 WMI_VDEV_PARAM_PACKET_POWERSAVE,
5741 pps_val);
5742 break;
5743 default:
5744 WMA_LOGE("%s:INVALID PPS CONFIG", __func__);
5745 }
5746
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305747 return (ret) ? QDF_STATUS_E_FAILURE : QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005748}
5749
5750/**
5751 * wma_process_set_mas() - Function to enable/disable MAS
5752 * @wma: Pointer to WMA handle
5753 * @mas_val: 1-Enable MAS, 0-Disable MAS
5754 *
5755 * This function enables/disables the MAS value
5756 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05305757 * Return: QDF_SUCCESS for success otherwise failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005758 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07005759static QDF_STATUS wma_process_set_mas(tp_wma_handle wma,
5760 uint32_t *mas_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005761{
5762 uint32_t val;
5763
5764 if (NULL == wma || NULL == mas_val) {
5765 WMA_LOGE("%s: Invalid input to enable/disable MAS", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305766 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005767 }
5768
5769 val = (*mas_val);
5770
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305771 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005772 wma_set_enable_disable_mcc_adaptive_scheduler(val)) {
5773 WMA_LOGE("%s: Unable to enable/disable MAS", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305774 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005775 } else {
5776 WMA_LOGE("%s: Value is %d", __func__, val);
5777 }
5778
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305779 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005780}
5781
5782/**
5783 * wma_process_set_miracast() - Function to set miracast value in WMA
5784 * @wma: Pointer to WMA handle
5785 * @miracast_val: 0-Disabled,1-Source,2-Sink
5786 *
5787 * This function stores the miracast value in WMA
5788 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05305789 * Return: QDF_SUCCESS for success otherwise failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005790 *
5791 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07005792static QDF_STATUS wma_process_set_miracast(tp_wma_handle wma,
5793 uint32_t *miracast_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005794{
5795 if (NULL == wma || NULL == miracast_val) {
5796 WMA_LOGE("%s: Invalid input to store miracast value", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305797 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005798 }
5799
5800 wma->miracast_value = *miracast_val;
5801 WMA_LOGE("%s: Miracast value is %d", __func__, wma->miracast_value);
5802
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305803 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005804}
5805
5806/**
5807 * wma_config_stats_factor() - Function to configure stats avg. factor
5808 * @wma: pointer to WMA handle
5809 * @avg_factor: stats. avg. factor passed down by userspace
5810 *
5811 * This function configures the avg. stats value in firmware
5812 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305813 * Return: QDF_STATUS_SUCCESS for success otherwise failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005814 *
5815 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305816static QDF_STATUS wma_config_stats_factor(tp_wma_handle wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005817 struct sir_stats_avg_factor *avg_factor)
5818{
Govind Singhd76a5b02016-03-08 15:12:14 +05305819 QDF_STATUS ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005820
5821 if (NULL == wma || NULL == avg_factor) {
5822 WMA_LOGE("%s: Invalid input of stats avg factor", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305823 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005824 }
5825
Govind Singhd76a5b02016-03-08 15:12:14 +05305826 ret = wma_vdev_set_param(wma->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005827 avg_factor->vdev_id,
5828 WMI_VDEV_PARAM_STATS_AVG_FACTOR,
5829 avg_factor->stats_avg_factor);
Govind Singhd76a5b02016-03-08 15:12:14 +05305830 if (QDF_IS_STATUS_ERROR(ret)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005831 WMA_LOGE(" failed to set avg_factor for vdev_id %d",
5832 avg_factor->vdev_id);
5833 }
5834
5835 WMA_LOGD("%s: Set stats_avg_factor %d for vdev_id %d", __func__,
5836 avg_factor->stats_avg_factor, avg_factor->vdev_id);
5837
5838 return ret;
5839}
5840
5841/**
5842 * wma_config_guard_time() - Function to set guard time in firmware
5843 * @wma: pointer to WMA handle
5844 * @guard_time: guard time passed down by userspace
5845 *
5846 * This function configures the guard time in firmware
5847 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305848 * Return: QDF_STATUS_SUCCESS for success otherwise failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005849 *
5850 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305851static QDF_STATUS wma_config_guard_time(tp_wma_handle wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005852 struct sir_guard_time_request *guard_time)
5853{
Govind Singhd76a5b02016-03-08 15:12:14 +05305854 QDF_STATUS ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005855
5856 if (NULL == wma || NULL == guard_time) {
5857 WMA_LOGE("%s: Invalid input of guard time", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305858 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005859 }
5860
Govind Singhd76a5b02016-03-08 15:12:14 +05305861 ret = wma_vdev_set_param(wma->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005862 guard_time->vdev_id,
5863 WMI_VDEV_PARAM_RX_LEAK_WINDOW,
5864 guard_time->guard_time);
Govind Singhd76a5b02016-03-08 15:12:14 +05305865 if (QDF_IS_STATUS_ERROR(ret)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005866 WMA_LOGE(" failed to set guard time for vdev_id %d",
5867 guard_time->vdev_id);
5868 }
5869
5870 WMA_LOGD("Set guard time %d for vdev_id %d",
5871 guard_time->guard_time, guard_time->vdev_id);
5872
5873 return ret;
5874}
5875
5876/**
5877 * wma_enable_specific_fw_logs() - Start/Stop logging of diag event/log id
5878 * @wma_handle: WMA handle
5879 * @start_log: Start logging related parameters
5880 *
5881 * Send the command to the FW based on which specific logging of diag
5882 * event/log id can be started/stopped
5883 *
5884 * Return: None
5885 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07005886static void wma_enable_specific_fw_logs(tp_wma_handle wma_handle,
5887 struct sir_wifi_start_log *start_log)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005888{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005889
5890 if (!start_log) {
5891 WMA_LOGE("%s: start_log pointer is NULL", __func__);
5892 return;
5893 }
5894 if (!wma_handle) {
5895 WMA_LOGE("%s: Invalid wma handle", __func__);
5896 return;
5897 }
5898
5899 if (!((start_log->ring_id == RING_ID_CONNECTIVITY) ||
5900 (start_log->ring_id == RING_ID_FIRMWARE_DEBUG))) {
5901 WMA_LOGD("%s: Not connectivity or fw debug ring: %d",
5902 __func__, start_log->ring_id);
5903 return;
5904 }
5905
Govind Singhf25a0f12016-03-08 16:09:48 +05305906 wmi_unified_enable_specific_fw_logs_cmd(wma_handle->wmi_handle,
5907 (struct wmi_wifi_start_log *)start_log);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005908
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005909 return;
5910}
5911
Poddar, Siddarth176c4362016-10-03 12:25:00 +05305912#define MEGABYTE (1024 * 1024)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005913/**
5914 * wma_set_wifi_start_packet_stats() - Start/stop packet stats
5915 * @wma_handle: WMA handle
5916 * @start_log: Struture containing the start wifi logger params
5917 *
5918 * This function is used to send the WMA commands to start/stop logging
5919 * of per packet statistics
5920 *
5921 * Return: None
5922 *
5923 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07005924#ifdef REMOVE_PKT_LOG
5925static void wma_set_wifi_start_packet_stats(void *wma_handle,
5926 struct sir_wifi_start_log *start_log)
5927{
5928 return;
5929}
5930#else
5931static void wma_set_wifi_start_packet_stats(void *wma_handle,
5932 struct sir_wifi_start_log *start_log)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005933{
Komal Seelam3d202862016-02-24 18:43:24 +05305934 struct hif_opaque_softc *scn;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005935 uint32_t log_state;
5936
5937 if (!start_log) {
5938 WMA_LOGE("%s: start_log pointer is NULL", __func__);
5939 return;
5940 }
5941 if (!wma_handle) {
5942 WMA_LOGE("%s: Invalid wma handle", __func__);
5943 return;
5944 }
5945
5946 /* No need to register for ring IDs other than packet stats */
5947 if (start_log->ring_id != RING_ID_PER_PACKET_STATS) {
5948 WMA_LOGI("%s: Ring id is not for per packet stats: %d",
5949 __func__, start_log->ring_id);
5950 return;
5951 }
5952
Anurag Chouhan6d760662016-02-20 16:05:43 +05305953 scn = cds_get_context(QDF_MODULE_ID_HIF);
Naveen Rawatb2109f62016-07-21 14:18:15 -07005954 if (scn == NULL) {
5955 WMA_LOGE("%s: Invalid HIF handle", __func__);
5956 return;
5957 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005958
5959 log_state = ATH_PKTLOG_ANI | ATH_PKTLOG_RCUPDATE | ATH_PKTLOG_RCFIND |
Nirav Shahdcc4c872016-07-28 11:35:26 +05305960 ATH_PKTLOG_RX | ATH_PKTLOG_TX |
5961 ATH_PKTLOG_TEXT | ATH_PKTLOG_SW_EVENT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005962
Poddar, Siddarth176c4362016-10-03 12:25:00 +05305963 if (start_log->size != 0) {
5964 pktlog_setsize(scn, start_log->size * MEGABYTE);
5965 return;
5966 }
5967
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005968 if (start_log->verbose_level == WLAN_LOG_LEVEL_ACTIVE) {
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -08005969 pktlog_enable(scn, log_state, start_log->ini_triggered,
Poddar, Siddartheefe3482016-09-21 18:12:59 +05305970 start_log->user_triggered,
5971 start_log->is_iwpriv_command);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005972 WMA_LOGI("%s: Enabling per packet stats", __func__);
5973 } else {
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -08005974 pktlog_enable(scn, 0, start_log->ini_triggered,
Poddar, Siddartheefe3482016-09-21 18:12:59 +05305975 start_log->user_triggered,
5976 start_log->is_iwpriv_command);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005977 WMA_LOGI("%s: Disabling per packet stats", __func__);
5978 }
5979}
5980#endif
5981
5982/**
5983 * wma_send_flush_logs_to_fw() - Send log flush command to FW
5984 * @wma_handle: WMI handle
5985 *
5986 * This function is used to send the flush command to the FW,
5987 * that will flush the fw logs that are residue in the FW
5988 *
5989 * Return: None
5990 */
5991void wma_send_flush_logs_to_fw(tp_wma_handle wma_handle)
5992{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305993 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005994 int ret;
5995
Govind Singhf25a0f12016-03-08 16:09:48 +05305996 ret = wmi_unified_flush_logs_to_fw_cmd(wma_handle->wmi_handle);
5997 if (ret != EOK)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005998 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005999
Anurag Chouhan210db072016-02-22 18:42:15 +05306000 status = qdf_mc_timer_start(&wma_handle->log_completion_timer,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006001 WMA_LOG_COMPLETION_TIMER);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306002 if (status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006003 WMA_LOGE("Failed to start the log completion timer");
6004}
6005
6006/**
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05306007 * wma_update_wep_default_key - To update default key id
6008 * @wma: pointer to wma handler
6009 * @update_def_key: pointer to wep_update_default_key_idx
6010 *
6011 * This function makes a copy of default key index to txrx node
6012 *
6013 * Return: Success
6014 */
6015static QDF_STATUS wma_update_wep_default_key(tp_wma_handle wma,
6016 struct wep_update_default_key_idx *update_def_key)
6017{
6018 struct wma_txrx_node *iface =
6019 &wma->interfaces[update_def_key->session_id];
6020 iface->wep_default_key_idx = update_def_key->default_idx;
6021
6022 return QDF_STATUS_SUCCESS;
6023}
6024
Agrawal, Ashish35b251d2016-09-08 19:21:03 +05306025/**
6026 * wma_update_tx_fail_cnt_th() - Set threshold for TX pkt fail
6027 * @wma_handle: WMA handle
6028 * @tx_fail_cnt_th: sme_tx_fail_cnt_threshold parameter
6029 *
6030 * This function is used to set Tx pkt fail count threshold,
6031 * FW will do disconnect with station once this threshold is reached.
6032 *
6033 * Return: VOS_STATUS_SUCCESS on success, error number otherwise
6034 */
6035static QDF_STATUS wma_update_tx_fail_cnt_th(tp_wma_handle wma,
6036 struct sme_tx_fail_cnt_threshold *tx_fail_cnt_th)
6037{
6038 u_int8_t vdev_id;
6039 u_int32_t tx_fail_disconn_th;
6040 int ret = -EIO;
6041
6042 if (!wma || !wma->wmi_handle) {
6043 WMA_LOGE(FL("WMA is closed, can not issue Tx pkt fail count threshold"));
6044 return QDF_STATUS_E_INVAL;
6045 }
6046 vdev_id = tx_fail_cnt_th->session_id;
6047 tx_fail_disconn_th = tx_fail_cnt_th->tx_fail_cnt_threshold;
6048 WMA_LOGD("Set TX pkt fail count threshold vdevId %d count %d",
6049 vdev_id, tx_fail_disconn_th);
6050
6051
6052 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
6053 WMI_VDEV_PARAM_DISCONNECT_TH,
6054 tx_fail_disconn_th);
6055
6056 if (ret) {
6057 WMA_LOGE(FL("Failed to send TX pkt fail count threshold command"));
6058 return QDF_STATUS_E_FAILURE;
6059 }
6060
6061 return QDF_STATUS_SUCCESS;
6062}
6063
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05306064/**
Agrawal Ashishda3e9502016-09-21 17:43:51 +05306065 * wma_update_short_retry_limit() - Set retry limit for short frames
6066 * @wma_handle: WMA handle
6067 * @short_retry_limit_th: retry limir count for Short frames.
6068 *
6069 * This function is used to configure the transmission retry limit at which
6070 * short frames needs to be retry.
6071 *
6072 * Return: VOS_STATUS_SUCCESS on success, error number otherwise
6073 */
6074static QDF_STATUS wma_update_short_retry_limit(tp_wma_handle wma,
6075 struct sme_short_retry_limit *short_retry_limit_th)
6076{
6077 uint8_t vdev_id;
6078 uint32_t short_retry_limit;
6079 int ret;
6080
6081 if (!wma || !wma->wmi_handle) {
6082 WMA_LOGE("WMA is closed, can not issue short retry limit threshold");
6083 return QDF_STATUS_E_INVAL;
6084 }
6085 vdev_id = short_retry_limit_th->session_id;
6086 short_retry_limit = short_retry_limit_th->short_retry_limit;
6087 WMA_LOGD("Set short retry limit threshold vdevId %d count %d",
6088 vdev_id, short_retry_limit);
6089
6090 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
6091 WMI_VDEV_PARAM_NON_AGG_SW_RETRY_TH,
6092 short_retry_limit);
6093
6094 if (ret) {
6095 WMA_LOGE("Failed to send short limit threshold command");
6096 return QDF_STATUS_E_FAILURE;
6097 }
6098 return QDF_STATUS_SUCCESS;
6099}
6100
6101/**
6102 * wma_update_long_retry_limit() - Set retry limit for long frames
6103 * @wma_handle: WMA handle
6104 * @long_retry_limit_th: retry limir count for long frames
6105 *
6106 * This function is used to configure the transmission retry limit at which
6107 * long frames needs to be retry
6108 *
6109 * Return: VOS_STATUS_SUCCESS on success, error number otherwise
6110 */
6111static QDF_STATUS wma_update_long_retry_limit(tp_wma_handle wma,
6112 struct sme_long_retry_limit *long_retry_limit_th)
6113{
6114 uint8_t vdev_id;
6115 uint32_t long_retry_limit;
6116 int ret;
6117
6118 if (!wma || !wma->wmi_handle) {
6119 WMA_LOGE("WMA is closed, can not issue long retry limit threshold");
6120 return QDF_STATUS_E_INVAL;
6121 }
6122 vdev_id = long_retry_limit_th->session_id;
6123 long_retry_limit = long_retry_limit_th->long_retry_limit;
6124 WMA_LOGD("Set TX pkt fail count threshold vdevId %d count %d",
6125 vdev_id, long_retry_limit);
6126
6127 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
6128 WMI_VDEV_PARAM_AGG_SW_RETRY_TH,
6129 long_retry_limit);
6130
6131 if (ret) {
6132 WMA_LOGE("Failed to send long limit threshold command");
6133 return QDF_STATUS_E_FAILURE;
6134 }
6135
6136 return QDF_STATUS_SUCCESS;
6137}
6138
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05306139/*
6140 * wma_update_sta_inactivity_timeout() - Set sta_inactivity_timeout to fw
6141 * @wma_handle: WMA handle
6142 * @sta_inactivity_timer: sme_sta_inactivity_timeout
6143 *
6144 * This function is used to set sta_inactivity_timeout.
6145 * If a station does not send anything in sta_inactivity_timeout seconds, an
6146 * empty data frame is sent to it in order to verify whether it is
6147 * still in range. If this frame is not ACKed, the station will be
6148 * disassociated and then deauthenticated.
6149 *
6150 * Return: None
6151 */
6152void wma_update_sta_inactivity_timeout(tp_wma_handle wma,
6153 struct sme_sta_inactivity_timeout *sta_inactivity_timer)
6154{
6155 uint8_t vdev_id;
6156 uint32_t max_unresponsive_time;
6157 uint32_t min_inactive_time, max_inactive_time;
6158
6159 if (!wma || !wma->wmi_handle) {
6160 WMA_LOGE("WMA is closed, can not issue sta_inactivity_timeout");
6161 return;
6162 }
6163 vdev_id = sta_inactivity_timer->session_id;
6164 max_unresponsive_time = sta_inactivity_timer->sta_inactivity_timeout;
6165 max_inactive_time = max_unresponsive_time * TWO_THIRD;
6166 min_inactive_time = max_unresponsive_time - max_inactive_time;
6167
6168 if (wma_vdev_set_param(wma->wmi_handle, vdev_id,
6169 WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS,
6170 min_inactive_time))
6171 WMA_LOGE("Failed to Set AP MIN IDLE INACTIVE TIME");
6172
6173 if (wma_vdev_set_param(wma->wmi_handle, vdev_id,
6174 WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS,
6175 max_inactive_time))
6176 WMA_LOGE("Failed to Set AP MAX IDLE INACTIVE TIME");
6177
6178 if (wma_vdev_set_param(wma->wmi_handle, vdev_id,
6179 WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS,
6180 max_unresponsive_time))
6181 WMA_LOGE("Failed to Set MAX UNRESPONSIVE TIME");
6182
6183 WMA_LOGI("%s:vdev_id:%d min_inactive_time: %u max_inactive_time: %u max_unresponsive_time: %u",
6184 __func__, vdev_id,
6185 min_inactive_time, max_inactive_time,
6186 max_unresponsive_time);
6187}
6188
Yingying Tang95409972016-10-20 15:16:15 +08006189#ifdef WLAN_FEATURE_WOW_PULSE
6190
6191
6192#define WMI_WOW_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM \
6193WMI_WOW_HOSTWAKEUP_GPIO_PIN_PATTERN_CONFIG_CMD_fixed_param
6194
6195
6196#define WMITLV_TAG_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM \
6197WMITLV_TAG_STRUC_wmi_wow_hostwakeup_gpio_pin_pattern_config_cmd_fixed_param
6198
6199/**
6200* wma_send_wow_pulse_cmd() - send wmi cmd of wow pulse cmd
6201* infomation to fw.
6202* @wma_handle: wma handler
6203* @udp_response: wow_pulse_mode pointer
6204*
6205* Return: Return QDF_STATUS
6206*/
6207static QDF_STATUS wma_send_wow_pulse_cmd(tp_wma_handle wma_handle,
6208 struct wow_pulse_mode *wow_pulse_cmd)
6209{
6210 QDF_STATUS status = QDF_STATUS_SUCCESS;
6211 wmi_buf_t buf;
6212 WMI_WOW_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM *cmd;
6213 u_int16_t len;
6214
6215 len = sizeof(*cmd);
6216 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
6217 if (!buf) {
6218 WMA_LOGE("wmi_buf_alloc failed");
6219 return QDF_STATUS_E_NOMEM;
6220 }
6221
6222 cmd = (WMI_WOW_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM *)wmi_buf_data(buf);
6223 qdf_mem_zero(cmd, len);
6224
6225 WMITLV_SET_HDR(&cmd->tlv_header,
6226 WMITLV_TAG_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM,
6227 WMITLV_GET_STRUCT_TLVLEN(
6228 WMI_WOW_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM));
6229
6230 cmd->enable = wow_pulse_cmd->wow_pulse_enable;
6231 cmd->pin = wow_pulse_cmd->wow_pulse_pin;
6232 cmd->interval_low = wow_pulse_cmd->wow_pulse_interval_low;
6233 cmd->interval_high = wow_pulse_cmd->wow_pulse_interval_high;
6234 cmd->repeat_cnt = WMI_WOW_PULSE_REPEAT_CNT;
6235
6236 if (wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
6237 WMI_WOW_HOSTWAKEUP_GPIO_PIN_PATTERN_CONFIG_CMDID)) {
6238 WMA_LOGE("Failed to send send wow pulse");
6239 wmi_buf_free(buf);
6240 status = QDF_STATUS_E_FAILURE;
6241 }
6242
6243 WMA_LOGD("%s: Exit", __func__);
6244 return status;
6245}
6246
6247#undef WMI_WOW_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM
6248#undef WMITLV_TAG_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM
6249#undef WMI_WOW_PULSE_REPEAT_CNT
6250
6251#else
6252static inline QDF_STATUS wma_send_wow_pulse_cmd(tp_wma_handle wma_handle,
6253 struct wow_pulse_mode *wow_pulse_cmd)
6254{
6255 return QDF_STATUS_E_FAILURE;
6256}
6257#endif
6258
6259
Agrawal Ashishda3e9502016-09-21 17:43:51 +05306260/**
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05306261 * wma_process_power_debug_stats_req() - Process the Chip Power stats collect
6262 * request and pass the Power stats request to Fw
6263 * @wma_handle: WMA handle
6264 *
6265 * Return: QDF_STATUS
6266 */
6267#ifdef WLAN_POWER_DEBUGFS
6268static QDF_STATUS wma_process_power_debug_stats_req(tp_wma_handle wma_handle)
6269{
6270 wmi_pdev_get_chip_power_stats_cmd_fixed_param *cmd;
6271 int32_t len;
6272 wmi_buf_t buf;
6273 uint8_t *buf_ptr;
6274 int ret;
6275
6276 if (!wma_handle) {
6277 WMA_LOGE("%s: input pointer is NULL", __func__);
6278 return QDF_STATUS_E_FAILURE;
6279 }
6280
6281 len = sizeof(*cmd);
6282 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
6283 if (!buf) {
6284 WMA_LOGE("%s: Failed allocate wmi buffer", __func__);
6285 return QDF_STATUS_E_NOMEM;
6286 }
6287
6288 buf_ptr = (u_int8_t *) wmi_buf_data(buf);
6289 cmd = (wmi_pdev_get_chip_power_stats_cmd_fixed_param *) buf_ptr;
6290
6291 WMITLV_SET_HDR(&cmd->tlv_header,
6292 WMITLV_TAG_STRUC_wmi_get_chip_power_stats_cmd_fixed_param,
6293 WMITLV_GET_STRUCT_TLVLEN(
6294 wmi_pdev_get_chip_power_stats_cmd_fixed_param));
6295 cmd->pdev_id = 0;
6296
6297 WMA_LOGD("POWER_DEBUG_STATS - Get Request Params; Pdev id - %d",
6298 cmd->pdev_id);
6299 ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
6300 WMI_PDEV_GET_CHIP_POWER_STATS_CMDID);
6301 if (ret) {
6302 WMA_LOGE("%s: Failed to send power debug stats request",
6303 __func__);
6304 wmi_buf_free(buf);
6305 return QDF_STATUS_E_FAILURE;
6306 }
6307 return QDF_STATUS_SUCCESS;
6308}
6309#else
6310static QDF_STATUS wma_process_power_debug_stats_req(tp_wma_handle wma_handle)
6311{
6312 return QDF_STATUS_SUCCESS;
6313}
6314#endif
6315
6316/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006317 * wma_mc_process_msg() - process wma messages and call appropriate function.
6318 * @cds_context: cds context
6319 * @msg: message
6320 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05306321 * Return: QDF_SUCCESS for success otherwise failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006322 */
Rajeev Kumarb60abe42017-01-21 15:39:31 -08006323QDF_STATUS wma_mc_process_msg(void *cds_context, struct scheduler_msg *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006324{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306325 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006326 tp_wma_handle wma_handle;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08006327 struct cdp_vdev *txrx_vdev_handle = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006328 extern uint8_t *mac_trace_get_wma_msg_string(uint16_t wmaMsg);
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05306329 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006330
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006331 if (NULL == msg) {
6332 WMA_LOGE("msg is NULL");
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306333 QDF_ASSERT(0);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306334 qdf_status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006335 goto end;
6336 }
6337
6338 WMA_LOGD("msg->type = %x %s", msg->type,
6339 mac_trace_get_wma_msg_string(msg->type));
6340
Anurag Chouhan6d760662016-02-20 16:05:43 +05306341 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006342
6343 if (NULL == wma_handle) {
6344 WMA_LOGP("%s: wma_handle is NULL", __func__);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306345 QDF_ASSERT(0);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306346 qdf_mem_free(msg->bodyptr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306347 qdf_status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006348 goto end;
6349 }
6350
6351 switch (msg->type) {
6352
6353 /* Message posted by wmi for all control path related
6354 * FW events to serialize through mc_thread.
6355 */
6356 case WMA_PROCESS_FW_EVENT:
6357 wma_process_fw_event(wma_handle,
6358 (wma_process_fw_event_params *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306359 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006360 break;
6361
6362#ifdef FEATURE_WLAN_ESE
6363 case WMA_TSM_STATS_REQ:
6364 WMA_LOGA("McThread: WMA_TSM_STATS_REQ");
6365 wma_process_tsm_stats_req(wma_handle, (void *)msg->bodyptr);
6366 break;
6367#endif /* FEATURE_WLAN_ESE */
6368 case WNI_CFG_DNLD_REQ:
6369 WMA_LOGA("McThread: WNI_CFG_DNLD_REQ");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306370 qdf_status = wma_wni_cfg_dnld(wma_handle);
Anurag Chouhandf2b2682016-02-29 14:15:27 +05306371 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006372 cds_wma_complete_cback(cds_context);
6373 } else {
6374 WMA_LOGD("config download failure");
6375 }
6376 break;
6377 case WMA_ADD_STA_SELF_REQ:
6378 txrx_vdev_handle =
6379 wma_vdev_attach(wma_handle,
6380 (struct add_sta_self_params *) msg->
6381 bodyptr, 1);
6382 if (!txrx_vdev_handle) {
6383 WMA_LOGE("Failed to attach vdev");
6384 } else {
6385 /* Register with TxRx Module for Data Ack Complete Cb */
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05306386 if (soc) {
6387 cdp_data_tx_cb_set(soc, txrx_vdev_handle,
6388 wma_data_tx_ack_comp_hdlr,
6389 wma_handle);
6390 } else {
6391 WMA_LOGE("%s: SOC context is NULL", __func__);
6392 qdf_status = QDF_STATUS_E_FAILURE;
6393 goto end;
6394 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006395 }
6396 break;
6397 case WMA_DEL_STA_SELF_REQ:
6398 wma_vdev_detach(wma_handle,
6399 (struct del_sta_self_params *) msg->bodyptr, 1);
6400 break;
6401 case WMA_START_SCAN_OFFLOAD_REQ:
6402 wma_start_scan(wma_handle, msg->bodyptr, msg->type);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306403 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006404 break;
6405 case WMA_STOP_SCAN_OFFLOAD_REQ:
6406 wma_stop_scan(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306407 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006408 break;
6409 case WMA_UPDATE_CHAN_LIST_REQ:
6410 wma_update_channel_list(wma_handle,
6411 (tSirUpdateChanList *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306412 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006413 break;
6414 case WMA_SET_LINK_STATE:
6415 wma_set_linkstate(wma_handle, (tpLinkStateParams) msg->bodyptr);
6416 break;
6417 case WMA_CHNL_SWITCH_REQ:
6418 wma_set_channel(wma_handle,
6419 (tpSwitchChannelParams) msg->bodyptr);
6420 break;
6421 case WMA_ADD_BSS_REQ:
6422 wma_add_bss(wma_handle, (tpAddBssParams) msg->bodyptr);
6423 break;
6424 case WMA_ADD_STA_REQ:
6425 wma_add_sta(wma_handle, (tpAddStaParams) msg->bodyptr);
6426 break;
6427 case WMA_SET_BSSKEY_REQ:
6428 wma_set_bsskey(wma_handle, (tpSetBssKeyParams) msg->bodyptr);
6429 break;
6430 case WMA_SET_STAKEY_REQ:
6431 wma_set_stakey(wma_handle, (tpSetStaKeyParams) msg->bodyptr);
6432 break;
6433 case WMA_DELETE_STA_REQ:
6434 wma_delete_sta(wma_handle, (tpDeleteStaParams) msg->bodyptr);
6435 break;
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07006436 case WMA_DELETE_BSS_HO_FAIL_REQ:
6437 wma_delete_bss_ho_fail(wma_handle,
6438 (tpDeleteBssParams) msg->bodyptr);
6439 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006440 case WMA_DELETE_BSS_REQ:
6441 wma_delete_bss(wma_handle, (tpDeleteBssParams) msg->bodyptr);
6442 break;
6443 case WMA_UPDATE_EDCA_PROFILE_IND:
6444 wma_process_update_edca_param_req(wma_handle,
6445 (tEdcaParams *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306446 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006447 break;
6448 case WMA_SEND_BEACON_REQ:
6449 wma_send_beacon(wma_handle, (tpSendbeaconParams) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306450 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006451 break;
6452 case WMA_SEND_PROBE_RSP_TMPL:
6453 wma_send_probe_rsp_tmpl(wma_handle,
6454 (tpSendProbeRespParams) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306455 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006456 break;
6457 case WMA_CLI_SET_CMD:
6458 wma_process_cli_set_cmd(wma_handle,
6459 (wma_cli_set_cmd_t *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306460 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006461 break;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07006462 case WMA_SET_PDEV_IE_REQ:
6463 wma_process_set_pdev_ie_req(wma_handle,
6464 (struct set_ie_param *)msg->bodyptr);
6465 qdf_mem_free(msg->bodyptr);
6466 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006467#if !defined(REMOVE_PKT_LOG)
6468 case WMA_PKTLOG_ENABLE_REQ:
6469 wma_pktlog_wmi_send_cmd(wma_handle,
6470 (struct ath_pktlog_wmi_params *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306471 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006472 break;
6473#endif /* REMOVE_PKT_LOG */
6474#if defined(QCA_WIFI_FTM)
6475 case WMA_FTM_CMD_REQ:
6476 wma_process_ftm_command(wma_handle,
6477 (struct ar6k_testmode_cmd_data *)msg->bodyptr);
6478 break;
6479#endif /* QCA_WIFI_FTM */
6480 case WMA_ENTER_PS_REQ:
6481 wma_enable_sta_ps_mode(wma_handle,
6482 (tpEnablePsParams) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306483 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006484 break;
6485 case WMA_EXIT_PS_REQ:
6486 wma_disable_sta_ps_mode(wma_handle,
6487 (tpDisablePsParams) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306488 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006489 break;
6490 case WMA_ENABLE_UAPSD_REQ:
6491 wma_enable_uapsd_mode(wma_handle,
6492 (tpEnableUapsdParams) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306493 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006494 break;
6495 case WMA_DISABLE_UAPSD_REQ:
6496 wma_disable_uapsd_mode(wma_handle,
6497 (tpDisableUapsdParams) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306498 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006499 break;
Kiran Kumar Lokere92fe7592016-09-14 20:15:45 -07006500 case WMA_SET_DTIM_PERIOD:
6501 wma_set_dtim_period(wma_handle,
6502 (struct set_dtim_params *)msg->bodyptr);
6503 qdf_mem_free(msg->bodyptr);
6504 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006505 case WMA_SET_TX_POWER_REQ:
6506 wma_set_tx_power(wma_handle, (tpMaxTxPowerParams) msg->bodyptr);
6507 break;
6508 case WMA_SET_MAX_TX_POWER_REQ:
6509 wma_set_max_tx_power(wma_handle,
6510 (tpMaxTxPowerParams) msg->bodyptr);
6511 break;
6512 case WMA_SET_KEEP_ALIVE:
6513 wma_set_keepalive_req(wma_handle,
6514 (tSirKeepAliveReq *) msg->bodyptr);
6515 break;
6516#ifdef FEATURE_WLAN_SCAN_PNO
6517 case WMA_SET_PNO_REQ:
6518 wma_config_pno(wma_handle, (tpSirPNOScanReq) msg->bodyptr);
6519 break;
6520
6521 case WMA_SME_SCAN_CACHE_UPDATED:
6522 wma_scan_cache_updated_ind(wma_handle, msg->bodyval);
6523 break;
6524#endif /* FEATURE_WLAN_SCAN_PNO */
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08006525#ifdef FEATURE_WLAN_ESE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006526 case WMA_SET_PLM_REQ:
6527 wma_config_plm(wma_handle, (tpSirPlmReq) msg->bodyptr);
6528 break;
6529#endif
6530 case WMA_GET_STATISTICS_REQ:
6531 wma_get_stats_req(wma_handle,
6532 (tAniGetPEStatsReq *) msg->bodyptr);
6533 break;
6534
6535 case WMA_CONFIG_PARAM_UPDATE_REQ:
Rajeev Kumar156188e2017-01-21 17:23:52 -08006536 wma_update_cfg_params(wma_handle, msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006537 break;
6538
6539 case WMA_UPDATE_OP_MODE:
6540 wma_process_update_opmode(wma_handle,
6541 (tUpdateVHTOpMode *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306542 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006543 break;
6544 case WMA_UPDATE_RX_NSS:
6545 wma_process_update_rx_nss(wma_handle,
6546 (tUpdateRxNss *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306547 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006548 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006549 case WMA_UPDATE_MEMBERSHIP:
6550 wma_process_update_membership(wma_handle,
6551 (tUpdateMembership *) msg->bodyptr);
6552 break;
6553 case WMA_UPDATE_USERPOS:
6554 wma_process_update_userpos(wma_handle,
6555 (tUpdateUserPos *) msg->bodyptr);
6556 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006557 case WMA_UPDATE_BEACON_IND:
6558 wma_process_update_beacon_params(wma_handle,
6559 (tUpdateBeaconParams *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306560 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006561 break;
6562
6563 case WMA_ADD_TS_REQ:
6564 wma_add_ts_req(wma_handle, (tAddTsParams *) msg->bodyptr);
6565 break;
6566
6567 case WMA_DEL_TS_REQ:
6568 wma_del_ts_req(wma_handle, (tDelTsParams *) msg->bodyptr);
6569 break;
6570
6571 case WMA_AGGR_QOS_REQ:
6572 wma_aggr_qos_req(wma_handle, (tAggrAddTsParams *) msg->bodyptr);
6573 break;
6574
6575 case WMA_RECEIVE_FILTER_SET_FILTER_REQ:
6576 wma_process_receive_filter_set_filter_req(wma_handle,
6577 (tSirRcvPktFilterCfgType *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306578 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006579 break;
6580
6581 case WMA_RECEIVE_FILTER_CLEAR_FILTER_REQ:
6582 wma_process_receive_filter_clear_filter_req(wma_handle,
6583 (tSirRcvFltPktClearParam *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306584 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006585 break;
6586
6587 case WMA_WOW_ADD_PTRN:
6588 wma_wow_add_pattern(wma_handle,
6589 (struct wow_add_pattern *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306590 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006591 break;
6592 case WMA_WOW_DEL_PTRN:
6593 wma_wow_delete_user_pattern(wma_handle,
6594 (struct wow_delete_pattern *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306595 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006596 break;
6597 case WMA_WOWL_ENTER_REQ:
6598 wma_wow_enter(wma_handle,
6599 (tpSirHalWowlEnterParams) msg->bodyptr);
6600 break;
6601 case WMA_WOWL_EXIT_REQ:
6602 wma_wow_exit(wma_handle, (tpSirHalWowlExitParams) msg->bodyptr);
6603 break;
Houston Hoffmana76591b2015-11-10 16:52:05 -08006604
6605 case WMA_RUNTIME_PM_SUSPEND_IND:
6606 wma_calculate_and_update_conn_state(wma_handle);
Anurag Chouhan6d760662016-02-20 16:05:43 +05306607 wma_suspend_req(wma_handle, QDF_RUNTIME_SUSPEND);
Houston Hoffmana76591b2015-11-10 16:52:05 -08006608 break;
6609
6610 case WMA_RUNTIME_PM_RESUME_IND:
Anurag Chouhan6d760662016-02-20 16:05:43 +05306611 wma_resume_req(wma_handle, QDF_RUNTIME_SUSPEND);
Houston Hoffmana76591b2015-11-10 16:52:05 -08006612 break;
6613
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006614 case WMA_8023_MULTICAST_LIST_REQ:
6615 wma_process_mcbc_set_filter_req(wma_handle,
6616 (tpSirRcvFltMcAddrList) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306617 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006618 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006619 case WMA_ROAM_SCAN_OFFLOAD_REQ:
6620 /*
6621 * Main entry point or roaming directives from CSR.
6622 */
Varun Reddy Yeturu30bc42c2016-02-04 10:07:30 -08006623 wma_process_roaming_config(wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006624 (tSirRoamOffloadScanReq *) msg->bodyptr);
6625 break;
6626
6627 case WMA_RATE_UPDATE_IND:
6628 wma_process_rate_update_indicate(wma_handle,
6629 (tSirRateUpdateInd *) msg->bodyptr);
6630 break;
6631
6632#ifdef FEATURE_WLAN_TDLS
6633 case WMA_UPDATE_FW_TDLS_STATE:
6634 wma_update_fw_tdls_state(wma_handle,
6635 (t_wma_tdls_params *) msg->bodyptr);
6636 break;
6637 case WMA_UPDATE_TDLS_PEER_STATE:
6638 wma_update_tdls_peer_state(wma_handle,
6639 (tTdlsPeerStateParams *) msg->bodyptr);
6640 break;
6641 case WMA_TDLS_SET_OFFCHAN_MODE:
6642 wma_set_tdls_offchan_mode(wma_handle,
6643 (tdls_chan_switch_params *)msg->bodyptr);
6644 break;
6645#endif /* FEATURE_WLAN_TDLS */
6646 case WMA_ADD_PERIODIC_TX_PTRN_IND:
6647 wma_process_add_periodic_tx_ptrn_ind(wma_handle,
6648 (tSirAddPeriodicTxPtrn *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306649 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006650 break;
6651 case WMA_DEL_PERIODIC_TX_PTRN_IND:
6652 wma_process_del_periodic_tx_ptrn_ind(wma_handle,
6653 (tSirDelPeriodicTxPtrn *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306654 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006655 break;
6656 case WMA_TX_POWER_LIMIT:
6657 wma_process_tx_power_limits(wma_handle,
6658 (tSirTxPowerLimit *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306659 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006660 break;
6661#ifdef FEATURE_WLAN_LPHB
6662 case WMA_LPHB_CONF_REQ:
6663 wma_process_lphb_conf_req(wma_handle,
6664 (tSirLPHBReq *) msg->bodyptr);
6665 break;
6666#endif /* FEATURE_WLAN_LPHB */
6667
6668#ifdef FEATURE_WLAN_CH_AVOID
6669 case WMA_CH_AVOID_UPDATE_REQ:
6670 wma_process_ch_avoid_update_req(wma_handle,
6671 (tSirChAvoidUpdateReq *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306672 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006673 break;
6674#endif /* FEATURE_WLAN_CH_AVOID */
6675#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
6676 case WMA_SET_AUTO_SHUTDOWN_TIMER_REQ:
6677 wma_set_auto_shutdown_timer_req(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306678 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006679 break;
6680#endif /* FEATURE_WLAN_AUTO_SHUTDOWN */
6681 case WMA_DHCP_START_IND:
6682 case WMA_DHCP_STOP_IND:
6683 wma_process_dhcp_ind(wma_handle, (tAniDHCPInd *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306684 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006685 break;
6686
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08006687 case WMA_IBSS_CESIUM_ENABLE_IND:
6688 wma_process_cesium_enable_ind(wma_handle);
6689 break;
6690 case WMA_GET_IBSS_PEER_INFO_REQ:
6691 wma_process_get_peer_info_req(wma_handle,
6692 (tSirIbssGetPeerInfoReqParams *)
6693 msg->bodyptr);
6694 qdf_mem_free(msg->bodyptr);
6695 break;
6696 case WMA_TX_FAIL_MONITOR_IND:
6697 wma_process_tx_fail_monitor_ind(wma_handle,
6698 (tAniTXFailMonitorInd *) msg->bodyptr);
6699 qdf_mem_free(msg->bodyptr);
6700 break;
6701
6702 case WMA_RMC_ENABLE_IND:
6703 wma_process_rmc_enable_ind(wma_handle);
6704 break;
6705 case WMA_RMC_DISABLE_IND:
6706 wma_process_rmc_disable_ind(wma_handle);
6707 break;
6708 case WMA_RMC_ACTION_PERIOD_IND:
6709 wma_process_rmc_action_period_ind(wma_handle);
6710 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006711 case WMA_INIT_THERMAL_INFO_CMD:
6712 wma_process_init_thermal_info(wma_handle,
6713 (t_thermal_mgmt *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306714 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006715 break;
6716
6717 case WMA_SET_THERMAL_LEVEL:
6718 wma_process_set_thermal_level(wma_handle, msg->bodyval);
6719 break;
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05306720#ifdef CONFIG_HL_SUPPORT
6721 case WMA_INIT_BAD_PEER_TX_CTL_INFO_CMD:
6722 wma_process_init_bad_peer_tx_ctl_info(
6723 wma_handle,
6724 (struct t_bad_peer_txtcl_config *)msg->bodyptr);
6725 qdf_mem_free(msg->bodyptr);
6726 break;
6727#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006728 case WMA_SET_P2P_GO_NOA_REQ:
6729 wma_process_set_p2pgo_noa_req(wma_handle,
6730 (tP2pPsParams *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306731 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006732 break;
6733 case WMA_SET_MIMOPS_REQ:
6734 wma_process_set_mimops_req(wma_handle,
6735 (tSetMIMOPS *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306736 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006737 break;
6738 case WMA_SET_SAP_INTRABSS_DIS:
6739 wma_set_vdev_intrabss_fwd(wma_handle,
6740 (tDisableIntraBssFwd *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306741 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006742 break;
6743 case WMA_GET_LINK_SPEED:
6744 wma_get_link_speed(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306745 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006746 break;
6747 case WMA_MODEM_POWER_STATE_IND:
6748 wma_notify_modem_power_state(wma_handle,
6749 (tSirModemPowerStateInd *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306750 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006751 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006752#ifdef WLAN_FEATURE_STATS_EXT
6753 case WMA_STATS_EXT_REQUEST:
6754 wma_stats_ext_req(wma_handle,
6755 (tpStatsExtRequest) (msg->bodyptr));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306756 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006757 break;
6758#endif /* WLAN_FEATURE_STATS_EXT */
6759 case WMA_HIDDEN_SSID_VDEV_RESTART:
6760 wma_hidden_ssid_vdev_restart(wma_handle,
6761 (tHalHiddenSsidVdevRestart *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306762 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006763 break;
6764#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
6765 case WMA_WLAN_EXT_WOW:
6766 wma_enable_ext_wow(wma_handle,
6767 (tSirExtWoWParams *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306768 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006769 break;
6770 case WMA_WLAN_SET_APP_TYPE1_PARAMS:
6771 wma_set_app_type1_params_in_fw(wma_handle,
6772 (tSirAppType1Params *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306773 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006774 break;
6775 case WMA_WLAN_SET_APP_TYPE2_PARAMS:
6776 wma_set_app_type2_params_in_fw(wma_handle,
6777 (tSirAppType2Params *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306778 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006779 break;
6780#endif /* WLAN_FEATURE_EXTWOW_SUPPORT */
6781#ifdef FEATURE_WLAN_EXTSCAN
6782 case WMA_EXTSCAN_START_REQ:
6783 wma_start_extscan(wma_handle,
6784 (tSirWifiScanCmdReqParams *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306785 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006786 break;
6787 case WMA_EXTSCAN_STOP_REQ:
6788 wma_stop_extscan(wma_handle,
6789 (tSirExtScanStopReqParams *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306790 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006791 break;
6792 case WMA_EXTSCAN_SET_BSSID_HOTLIST_REQ:
6793 wma_extscan_start_hotlist_monitor(wma_handle,
6794 (tSirExtScanSetBssidHotListReqParams *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306795 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006796 break;
6797 case WMA_EXTSCAN_RESET_BSSID_HOTLIST_REQ:
6798 wma_extscan_stop_hotlist_monitor(wma_handle,
6799 (tSirExtScanResetBssidHotlistReqParams *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306800 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006801 break;
6802 case WMA_EXTSCAN_SET_SIGNF_CHANGE_REQ:
6803 wma_extscan_start_change_monitor(wma_handle,
6804 (tSirExtScanSetSigChangeReqParams *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306805 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006806 break;
6807 case WMA_EXTSCAN_RESET_SIGNF_CHANGE_REQ:
6808 wma_extscan_stop_change_monitor(wma_handle,
6809 (tSirExtScanResetSignificantChangeReqParams *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306810 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006811 break;
6812 case WMA_EXTSCAN_GET_CACHED_RESULTS_REQ:
6813 wma_extscan_get_cached_results(wma_handle,
6814 (tSirExtScanGetCachedResultsReqParams *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306815 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006816 break;
6817 case WMA_EXTSCAN_GET_CAPABILITIES_REQ:
6818 wma_extscan_get_capabilities(wma_handle,
6819 (tSirGetExtScanCapabilitiesReqParams *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306820 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006821 break;
6822 case WMA_SET_EPNO_LIST_REQ:
6823 wma_set_epno_network_list(wma_handle,
6824 (struct wifi_epno_params *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306825 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006826 break;
Kapil Gupta5cda2252016-12-29 18:44:26 +05306827 case WMA_SET_PER_ROAM_CONFIG_CMD:
6828 wma_update_per_roam_config(wma_handle,
6829 (struct wmi_per_roam_config_req *)msg->bodyptr);
6830 qdf_mem_free(msg->bodyptr);
6831 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006832 case WMA_SET_PASSPOINT_LIST_REQ:
6833 /* Issue reset passpoint network list first and clear
6834 * the entries */
6835 wma_reset_passpoint_network_list(wma_handle,
6836 (struct wifi_passpoint_req *)msg->bodyptr);
6837
6838 wma_set_passpoint_network_list(wma_handle,
6839 (struct wifi_passpoint_req *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306840 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006841 break;
6842 case WMA_RESET_PASSPOINT_LIST_REQ:
6843 wma_reset_passpoint_network_list(wma_handle,
6844 (struct wifi_passpoint_req *)msg->bodyptr);
6845 break;
6846 case WMA_EXTSCAN_SET_SSID_HOTLIST_REQ:
6847 wma_set_ssid_hotlist(wma_handle,
6848 (struct sir_set_ssid_hotlist_request *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306849 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006850 break;
6851#endif /* FEATURE_WLAN_EXTSCAN */
6852 case WMA_SET_SCAN_MAC_OUI_REQ:
6853 wma_scan_probe_setoui(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306854 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006855 break;
6856#ifdef WLAN_FEATURE_LINK_LAYER_STATS
6857 case WMA_LINK_LAYER_STATS_CLEAR_REQ:
6858 wma_process_ll_stats_clear_req(wma_handle,
6859 (tpSirLLStatsClearReq) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306860 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006861 break;
6862 case WMA_LINK_LAYER_STATS_SET_REQ:
6863 wma_process_ll_stats_set_req(wma_handle,
6864 (tpSirLLStatsSetReq) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306865 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006866 break;
6867 case WMA_LINK_LAYER_STATS_GET_REQ:
6868 wma_process_ll_stats_get_req(wma_handle,
6869 (tpSirLLStatsGetReq) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306870 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006871 break;
6872#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
6873 case SIR_HAL_UNIT_TEST_CMD:
6874 wma_process_unit_test_cmd(wma_handle,
6875 (t_wma_unit_test_cmd *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306876 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006877 break;
6878#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006879 case WMA_ROAM_OFFLOAD_SYNCH_FAIL:
6880 wma_process_roam_synch_fail(wma_handle,
6881 (struct roam_offload_synch_fail *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306882 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006883 break;
6884 case SIR_HAL_ROAM_INVOKE:
6885 wma_process_roam_invoke(wma_handle,
6886 (struct wma_roam_invoke_cmd *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306887 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006888 break;
6889#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
6890#ifdef WLAN_FEATURE_NAN
6891 case WMA_NAN_REQUEST:
6892 wma_nan_req(wma_handle, (tNanRequest *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306893 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006894 break;
6895#endif /* WLAN_FEATURE_NAN */
6896 case SIR_HAL_SET_BASE_MACADDR_IND:
6897 wma_set_base_macaddr_indicate(wma_handle,
6898 (tSirMacAddr *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306899 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006900 break;
6901 case WMA_LINK_STATUS_GET_REQ:
6902 wma_process_link_status_req(wma_handle,
6903 (tAniGetLinkStatus *) msg->bodyptr);
6904 break;
6905 case WMA_GET_TEMPERATURE_REQ:
6906 wma_get_temperature(wma_handle);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306907 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006908 break;
Manikandan Mohan976e7562016-03-15 16:33:31 -07006909 case WMA_TSF_GPIO_PIN:
6910 wma_set_tsf_gpio_pin(wma_handle, msg->bodyval);
6911 break;
6912
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006913#ifdef DHCP_SERVER_OFFLOAD
6914 case WMA_SET_DHCP_SERVER_OFFLOAD_CMD:
6915 wma_process_dhcpserver_offload(wma_handle,
6916 (tSirDhcpSrvOffloadInfo *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306917 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006918 break;
6919#endif /* DHCP_SERVER_OFFLOAD */
6920#ifdef WLAN_FEATURE_GPIO_LED_FLASHING
6921 case WMA_LED_FLASHING_REQ:
6922 wma_set_led_flashing(wma_handle,
6923 (tSirLedFlashingReq *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306924 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006925 break;
6926#endif /* WLAN_FEATURE_GPIO_LED_FLASHING */
6927 case SIR_HAL_SET_MAS:
6928 wma_process_set_mas(wma_handle,
6929 (uint32_t *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306930 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006931 break;
6932 case SIR_HAL_SET_MIRACAST:
6933 wma_process_set_miracast(wma_handle,
6934 (uint32_t *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306935 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006936 break;
6937 case SIR_HAL_CONFIG_STATS_FACTOR:
6938 wma_config_stats_factor(wma_handle,
6939 (struct sir_stats_avg_factor *)
6940 msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306941 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006942 break;
6943 case SIR_HAL_CONFIG_GUARD_TIME:
6944 wma_config_guard_time(wma_handle,
6945 (struct sir_guard_time_request *)
6946 msg->bodyptr);
6947 case WMA_IPA_OFFLOAD_ENABLE_DISABLE:
6948 wma_ipa_offload_enable_disable(wma_handle,
6949 (struct sir_ipa_offload_enable_disable *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306950 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006951 break;
6952 case SIR_HAL_START_STOP_LOGGING:
6953 wma_set_wifi_start_packet_stats(wma_handle,
6954 (struct sir_wifi_start_log *)msg->bodyptr);
6955 wma_enable_specific_fw_logs(wma_handle,
6956 (struct sir_wifi_start_log *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306957 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006958 break;
6959 case SIR_HAL_FLUSH_LOG_TO_FW:
6960 wma_send_flush_logs_to_fw(wma_handle);
6961 /* Body ptr is NULL here */
6962 break;
6963 case WMA_SET_RSSI_MONITOR_REQ:
6964 wma_set_rssi_monitoring(wma_handle,
6965 (struct rssi_monitor_req *)msg->bodyptr);
Prakash Dhavali87ddca32016-11-29 17:02:11 -08006966 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006967 break;
6968 case WMA_FW_MEM_DUMP_REQ:
6969 wma_process_fw_mem_dump_req(wma_handle,
6970 (struct fw_dump_req *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306971 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006972 break;
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05306973 case SIR_HAL_PDEV_SET_PCL_TO_FW:
6974 wma_send_pdev_set_pcl_cmd(wma_handle,
6975 (struct wmi_pcl_chan_weights *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306976 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006977 break;
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05306978 case SIR_HAL_PDEV_SET_HW_MODE:
6979 wma_send_pdev_set_hw_mode_cmd(wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006980 (struct sir_hw_mode *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306981 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006982 break;
6983 case WMA_OCB_SET_CONFIG_CMD:
6984 wma_ocb_set_config_req(wma_handle,
6985 (struct sir_ocb_config *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306986 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006987 break;
6988 case WMA_OCB_SET_UTC_TIME_CMD:
6989 wma_ocb_set_utc_time(wma_handle,
6990 (struct sir_ocb_utc *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306991 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006992 break;
6993 case WMA_OCB_START_TIMING_ADVERT_CMD:
6994 wma_ocb_start_timing_advert(wma_handle,
6995 (struct sir_ocb_timing_advert *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306996 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006997 break;
6998 case WMA_OCB_STOP_TIMING_ADVERT_CMD:
6999 wma_ocb_stop_timing_advert(wma_handle,
7000 (struct sir_ocb_timing_advert *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307001 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007002 break;
7003 case WMA_DCC_CLEAR_STATS_CMD:
7004 wma_dcc_clear_stats(wma_handle,
7005 (struct sir_dcc_clear_stats *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307006 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007007 break;
7008 case WMA_OCB_GET_TSF_TIMER_CMD:
7009 wma_ocb_get_tsf_timer(wma_handle,
7010 (struct sir_ocb_get_tsf_timer *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307011 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007012 break;
Manikandan Mohan80dea792016-04-28 16:36:48 -07007013 case WMA_SET_WISA_PARAMS:
7014 wma_set_wisa_params(wma_handle,
7015 (struct sir_wisa_params *)msg->bodyptr);
7016 qdf_mem_free(msg->bodyptr);
7017 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007018 case WMA_DCC_GET_STATS_CMD:
7019 wma_dcc_get_stats(wma_handle,
7020 (struct sir_dcc_get_stats *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307021 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007022 break;
7023 case WMA_DCC_UPDATE_NDL_CMD:
7024 wma_dcc_update_ndl(wma_handle,
7025 (struct sir_dcc_update_ndl *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307026 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007027 break;
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05307028 case SIR_HAL_PDEV_DUAL_MAC_CFG_REQ:
7029 wma_send_pdev_set_dual_mac_config(wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007030 (struct sir_dual_mac_config *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307031 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007032 break;
7033 case WMA_SET_IE_INFO:
7034 wma_process_set_ie_info(wma_handle,
7035 (struct vdev_ie_info *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307036 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007037 break;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08007038 case SIR_HAL_SOC_ANTENNA_MODE_REQ:
7039 wma_send_pdev_set_antenna_mode(wma_handle,
7040 (struct sir_antenna_mode_param *)msg->bodyptr);
7041 qdf_mem_free(msg->bodyptr);
7042 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007043 case WMA_LRO_CONFIG_CMD:
7044 wma_lro_config_cmd(wma_handle,
Dhanashri Atre09828f12016-11-13 10:36:58 -08007045 (struct cdp_lro_hash_config *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307046 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007047 break;
Ravi Joshi9e891ba2015-11-09 19:03:46 -08007048 case WMA_GW_PARAM_UPDATE_REQ:
7049 wma_set_gateway_params(wma_handle,
7050 (struct gateway_param_update_req *)msg->bodyptr);
Archana Ramachandran28ab4122016-03-08 16:17:14 -08007051 qdf_mem_free(msg->bodyptr);
Ryan Hsu3c8f79f2015-12-02 16:45:09 -08007052 break;
7053 case WMA_SET_EGAP_CONF_PARAMS:
7054 wma_send_egap_conf_params(wma_handle,
7055 (struct egap_conf_params *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307056 qdf_mem_free(msg->bodyptr);
Ravi Joshi9e891ba2015-11-09 19:03:46 -08007057 break;
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +05307058 case WMA_SET_ADAPT_DWELLTIME_CONF_PARAMS:
7059 wma_send_adapt_dwelltime_params(wma_handle,
7060 (struct adaptive_dwelltime_params *)msg->bodyptr);
7061 qdf_mem_free(msg->bodyptr);
7062 break;
Sandeep Puligillae0875662016-02-12 16:09:21 -08007063 case WMA_HT40_OBSS_SCAN_IND:
7064 wma_send_ht40_obss_scanind(wma_handle,
7065 (struct obss_ht40_scanind *)msg->bodyptr);
7066 qdf_mem_free(msg->bodyptr);
7067 break;
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -07007068 case WMA_ADD_BCN_FILTER_CMDID:
7069 wma_add_beacon_filter(wma_handle, msg->bodyptr);
7070 qdf_mem_free(msg->bodyptr);
7071 break;
7072 case WMA_REMOVE_BCN_FILTER_CMDID:
7073 wma_remove_beacon_filter(wma_handle, msg->bodyptr);
7074 qdf_mem_free(msg->bodyptr);
7075 break;
Arun Khandavalli2476ef52016-04-26 20:19:43 +05307076 case WDA_BPF_GET_CAPABILITIES_REQ:
7077 wma_get_bpf_capabilities(wma_handle);
7078 break;
7079 case WDA_BPF_SET_INSTRUCTIONS_REQ:
7080 wma_set_bpf_instructions(wma_handle, msg->bodyptr);
7081 qdf_mem_free(msg->bodyptr);
7082 break;
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -07007083 case SIR_HAL_NDP_INITIATOR_REQ:
7084 wma_handle_ndp_initiator_req(wma_handle, msg->bodyptr);
7085 qdf_mem_free(msg->bodyptr);
7086 break;
Naveen Rawatf28315c2016-06-29 18:06:02 -07007087
Abhishek Singh4fef7472016-06-06 11:36:03 -07007088 case SIR_HAL_NDP_RESPONDER_REQ:
7089 wma_handle_ndp_responder_req(wma_handle, msg->bodyptr);
Naveen Rawatf28315c2016-06-29 18:06:02 -07007090 break;
7091
7092 case SIR_HAL_NDP_END_REQ:
7093 wma_handle_ndp_end_req(wma_handle, msg->bodyptr);
Abhishek Singh4fef7472016-06-06 11:36:03 -07007094 qdf_mem_free(msg->bodyptr);
7095 break;
Manjeet Singhf82ed072016-07-08 11:40:00 +05307096 case SIR_HAL_POWER_DBG_CMD:
7097 wma_process_hal_pwr_dbg_cmd(wma_handle,
7098 msg->bodyptr);
7099 qdf_mem_free(msg->bodyptr);
7100 break;
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05307101 case WMA_UPDATE_WEP_DEFAULT_KEY:
7102 wma_update_wep_default_key(wma_handle,
7103 (struct wep_update_default_key_idx *)msg->bodyptr);
7104 qdf_mem_free(msg->bodyptr);
7105 break;
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +05307106 case WMA_SEND_FREQ_RANGE_CONTROL_IND:
7107 wma_enable_disable_caevent_ind(wma_handle, msg->bodyval);
7108 break;
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +05307109 case WMA_ENCRYPT_DECRYPT_MSG:
7110 wma_encrypt_decrypt_msg(wma_handle, msg->bodyptr);
7111 qdf_mem_free(msg->bodyptr);
7112 break;
Agrawal, Ashish35b251d2016-09-08 19:21:03 +05307113 case SIR_HAL_UPDATE_TX_FAIL_CNT_TH:
7114 wma_update_tx_fail_cnt_th(wma_handle, msg->bodyptr);
7115 qdf_mem_free(msg->bodyptr);
7116 break;
Agrawal Ashishda3e9502016-09-21 17:43:51 +05307117 case SIR_HAL_LONG_RETRY_LIMIT_CNT:
7118 wma_update_long_retry_limit(wma_handle, msg->bodyptr);
7119 qdf_mem_free(msg->bodyptr);
7120 break;
7121 case SIR_HAL_SHORT_RETRY_LIMIT_CNT:
7122 wma_update_short_retry_limit(wma_handle, msg->bodyptr);
7123 qdf_mem_free(msg->bodyptr);
7124 break;
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05307125 case SIR_HAL_POWER_DEBUG_STATS_REQ:
7126 wma_process_power_debug_stats_req(wma_handle);
7127 break;
Yingying Tang95409972016-10-20 15:16:15 +08007128 case WMA_SET_WOW_PULSE_CMD:
7129 wma_send_wow_pulse_cmd(wma_handle,
7130 (struct wow_pulse_mode *)msg->bodyptr);
7131 qdf_mem_free(msg->bodyptr);
7132 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007133 default:
Dustin Brown86534fb2017-01-24 14:28:20 -08007134 WMA_LOGE("Unhandled WMA message of type %d", msg->type);
7135 if (msg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307136 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007137 }
7138end:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307139 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007140}
7141
Krunal Sonid32c6bc2016-10-18 18:00:21 -07007142QDF_STATUS wma_mc_process_handler(struct scheduler_msg *msg)
7143{
7144 void *cds_ctx = cds_get_global_context();
7145
7146 if (cds_ctx == NULL) {
7147 QDF_TRACE(QDF_MODULE_ID_SYS, QDF_TRACE_LEVEL_ERROR,
7148 "CDS context is NULL");
7149 return QDF_STATUS_E_FAILURE;
7150 }
Rajeev Kumar156188e2017-01-21 17:23:52 -08007151 return wma_mc_process_msg(cds_ctx, msg);
Krunal Sonid32c6bc2016-10-18 18:00:21 -07007152}
Krunal Sonid32c6bc2016-10-18 18:00:21 -07007153
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007154/**
7155 * wma_log_completion_timeout() - Log completion timeout
7156 * @data: Timeout handler data
7157 *
7158 * This function is called when log completion timer expires
7159 *
7160 * Return: None
7161 */
7162void wma_log_completion_timeout(void *data)
7163{
7164 tp_wma_handle wma_handle;
7165
7166 WMA_LOGE("%s: Timeout occured for log completion command", __func__);
7167
7168 wma_handle = (tp_wma_handle) data;
7169 if (!wma_handle)
7170 WMA_LOGE("%s: Invalid WMA handle", __func__);
7171
7172 /* Though we did not receive any event from FW,
7173 * we can flush whatever logs we have with us */
7174 cds_logging_set_fw_flush_complete();
7175
7176 return;
7177}
7178
7179/**
Manishekar Chandrasekaranb82554d2016-08-04 17:46:46 +05307180 * wma_map_pcl_weights() - Map PCL weights
7181 * @pcl_weight: Internal PCL weights
7182 *
7183 * Maps the internal weights of PCL to the weights needed by FW
7184 *
7185 * Return: Mapped channel weight of type wmi_pcl_chan_weight
7186 */
7187static wmi_pcl_chan_weight wma_map_pcl_weights(uint32_t pcl_weight)
7188{
7189 switch (pcl_weight) {
7190 case WEIGHT_OF_GROUP1_PCL_CHANNELS:
7191 return WMI_PCL_WEIGHT_VERY_HIGH;
7192 case WEIGHT_OF_GROUP2_PCL_CHANNELS:
7193 return WMI_PCL_WEIGHT_HIGH;
7194 case WEIGHT_OF_GROUP3_PCL_CHANNELS:
7195 return WMI_PCL_WEIGHT_MEDIUM;
7196 case WEIGHT_OF_NON_PCL_CHANNELS:
7197 return WMI_PCL_WEIGHT_LOW;
7198 default:
7199 return WMI_PCL_WEIGHT_DISALLOW;
7200 }
7201}
7202
7203/**
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05307204 * wma_send_pdev_set_pcl_cmd() - Send WMI_SOC_SET_PCL_CMDID to FW
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007205 * @wma_handle: WMA handle
7206 * @msg: PCL structure containing the PCL and the number of channels
7207 *
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05307208 * WMI_PDEV_SET_PCL_CMDID provides a Preferred Channel List (PCL) to the WLAN
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007209 * firmware. The DBS Manager is the consumer of this information in the WLAN
7210 * firmware. The channel list will be used when a Virtual DEVice (VDEV) needs
7211 * to migrate to a new channel without host driver involvement. An example of
7212 * this behavior is Legacy Fast Roaming (LFR 3.0). Generally, the host will
7213 * manage the channel selection without firmware involvement.
7214 *
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05307215 * WMI_PDEV_SET_PCL_CMDID will carry only the weight list and not the actual
7216 * channel list. The weights corresponds to the channels sent in
7217 * WMI_SCAN_CHAN_LIST_CMDID. The channels from PCL would be having a higher
7218 * weightage compared to the non PCL channels.
7219 *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007220 * Return: Success if the cmd is sent successfully to the firmware
7221 */
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05307222QDF_STATUS wma_send_pdev_set_pcl_cmd(tp_wma_handle wma_handle,
7223 struct wmi_pcl_chan_weights *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007224{
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05307225 uint32_t i;
7226 QDF_STATUS status;
7227
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007228 if (!wma_handle) {
7229 WMA_LOGE("%s: WMA handle is NULL. Cannot issue command",
7230 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307231 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007232 }
7233
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05307234 for (i = 0; i < wma_handle->saved_chan.num_channels; i++) {
7235 msg->saved_chan_list[i] =
7236 wma_handle->saved_chan.channel_list[i];
7237 }
7238
7239 msg->saved_num_chan = wma_handle->saved_chan.num_channels;
7240 status = cds_get_valid_chan_weights((struct sir_pcl_chan_weights *)msg);
Manishekar Chandrasekaranb82554d2016-08-04 17:46:46 +05307241
7242 for (i = 0; i < msg->saved_num_chan; i++) {
7243 msg->weighed_valid_list[i] =
7244 wma_map_pcl_weights(msg->weighed_valid_list[i]);
7245 WMA_LOGD("%s: chan:%d weight[%d]=%d", __func__,
7246 msg->saved_chan_list[i], i,
7247 msg->weighed_valid_list[i]);
7248 }
7249
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05307250 if (!QDF_IS_STATUS_SUCCESS(status)) {
7251 WMA_LOGE("%s: Error in creating weighed pcl", __func__);
7252 return status;
7253 }
7254
7255 if (wmi_unified_pdev_set_pcl_cmd(wma_handle->wmi_handle, msg))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307256 return QDF_STATUS_E_FAILURE;
Govind Singhf25a0f12016-03-08 16:09:48 +05307257
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307258 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007259}
7260
7261/**
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05307262 * wma_send_pdev_set_hw_mode_cmd() - Send WMI_PDEV_SET_HW_MODE_CMDID to FW
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007263 * @wma_handle: WMA handle
7264 * @msg: Structure containing the following parameters
7265 *
7266 * - hw_mode_index: The HW_Mode field is a enumerated type that is selected
7267 * from the HW_Mode table, which is returned in the WMI_SERVICE_READY_EVENTID.
7268 *
7269 * Provides notification to the WLAN firmware that host driver is requesting a
7270 * HardWare (HW) Mode change. This command is needed to support iHelium in the
7271 * configurations that include the Dual Band Simultaneous (DBS) feature.
7272 *
7273 * Return: Success if the cmd is sent successfully to the firmware
7274 */
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05307275QDF_STATUS wma_send_pdev_set_hw_mode_cmd(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007276 struct sir_hw_mode *msg)
7277{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007278 struct sir_set_hw_mode_resp *param;
7279
7280 if (!wma_handle) {
7281 WMA_LOGE("%s: WMA handle is NULL. Cannot issue command",
7282 __func__);
7283 /* Handle is NULL. Will not be able to send failure
7284 * response as well
7285 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307286 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007287 }
7288
7289 if (!msg) {
7290 WMA_LOGE("%s: Set HW mode param is NULL", __func__);
7291 /* Lets try to free the active command list */
7292 goto fail;
7293 }
7294
Govind Singhf25a0f12016-03-08 16:09:48 +05307295 if (wmi_unified_soc_set_hw_mode_cmd(wma_handle->wmi_handle,
7296 msg->hw_mode_index))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007297 goto fail;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007298
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307299 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007300fail:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307301 param = qdf_mem_malloc(sizeof(*param));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007302 if (!param) {
7303 WMA_LOGE("%s: Memory allocation failed", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307304 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007305 }
7306 param->status = SET_HW_MODE_STATUS_ECANCELED;
7307 param->cfgd_hw_mode_index = 0;
7308 param->num_vdev_mac_entries = 0;
7309 WMA_LOGE("%s: Sending HW mode fail response to LIM", __func__);
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05307310 wma_send_msg(wma_handle, SIR_HAL_PDEV_SET_HW_MODE_RESP,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007311 (void *) param, 0);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307312 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007313}
7314
7315/**
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05307316 * wma_send_pdev_set_dual_mac_config() - Set dual mac config to FW
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007317 * @wma_handle: WMA handle
7318 * @msg: Dual MAC config parameters
7319 *
7320 * Configures WLAN firmware with the dual MAC features
7321 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307322 * Return: QDF_STATUS. 0 on success.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007323 */
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05307324QDF_STATUS wma_send_pdev_set_dual_mac_config(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007325 struct sir_dual_mac_config *msg)
7326{
Manishekar Chandrasekaran91152df2016-04-25 14:29:27 +05307327 QDF_STATUS status;
7328
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007329 if (!wma_handle) {
7330 WMA_LOGE("%s: WMA handle is NULL. Cannot issue command",
7331 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307332 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007333 }
7334
7335 if (!msg) {
7336 WMA_LOGE("%s: Set dual mode config is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307337 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007338 }
7339
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05307340 status = wmi_unified_pdev_set_dual_mac_config_cmd(
7341 wma_handle->wmi_handle,
Manishekar Chandrasekaran91152df2016-04-25 14:29:27 +05307342 (struct wmi_dual_mac_config *)msg);
7343 if (QDF_IS_STATUS_ERROR(status)) {
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05307344 WMA_LOGE("%s: Failed to send WMI_PDEV_SET_DUAL_MAC_CONFIG_CMDID: %d",
Manishekar Chandrasekaran91152df2016-04-25 14:29:27 +05307345 __func__, status);
7346 return status;
7347 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007348
Manishekar Chandrasekaran91152df2016-04-25 14:29:27 +05307349 wma_handle->dual_mac_cfg.req_scan_config = msg->scan_config;
7350 wma_handle->dual_mac_cfg.req_fw_mode_config = msg->fw_mode_config;
Govind Singhf25a0f12016-03-08 16:09:48 +05307351
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307352 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007353}
7354
7355/**
Archana Ramachandrana20ef812015-11-13 16:12:13 -08007356 * wma_send_pdev_set_antenna_mode() - Set antenna mode to FW
7357 * @wma_handle: WMA handle
7358 * @msg: Antenna mode parameters
7359 *
7360 * Send WMI_PDEV_SET_ANTENNA_MODE_CMDID to FW requesting to
7361 * modify the number of TX/RX chains from host
7362 *
7363 * Return: QDF_STATUS. 0 on success.
7364 */
7365QDF_STATUS wma_send_pdev_set_antenna_mode(tp_wma_handle wma_handle,
7366 struct sir_antenna_mode_param *msg)
7367{
7368 wmi_pdev_set_antenna_mode_cmd_fixed_param *cmd;
7369 wmi_buf_t buf;
7370 uint32_t len;
7371 QDF_STATUS status = QDF_STATUS_SUCCESS;
7372 struct sir_antenna_mode_resp *param;
7373
7374 if (!wma_handle) {
7375 WMA_LOGE("%s: WMA handle is NULL. Cannot issue command",
7376 __func__);
7377 return QDF_STATUS_E_NULL_VALUE;
7378 }
7379
7380 if (!msg) {
7381 WMA_LOGE("%s: Set antenna mode param is NULL", __func__);
7382 return QDF_STATUS_E_NULL_VALUE;
7383 }
7384
7385 len = sizeof(*cmd);
7386
7387 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
7388 if (!buf) {
7389 WMA_LOGE("%s: wmi_buf_alloc failed", __func__);
7390 status = QDF_STATUS_E_NOMEM;
7391 goto resp;
7392 }
7393
7394 cmd = (wmi_pdev_set_antenna_mode_cmd_fixed_param *) wmi_buf_data(buf);
7395 WMITLV_SET_HDR(&cmd->tlv_header,
7396 WMITLV_TAG_STRUC_wmi_pdev_set_antenna_mode_cmd_fixed_param,
7397 WMITLV_GET_STRUCT_TLVLEN(
7398 wmi_pdev_set_antenna_mode_cmd_fixed_param));
7399
7400 cmd->pdev_id = WMI_PDEV_ID_SOC;
7401 /* Bits 0-15 is num of RX chains 16-31 is num of TX chains */
7402 cmd->num_txrx_chains = msg->num_rx_chains;
7403 cmd->num_txrx_chains |= (msg->num_tx_chains << 16);
7404
7405 WMA_LOGI("%s: Num of chains TX: %d RX: %d txrx_chains: 0x%x",
7406 __func__, msg->num_tx_chains,
7407 msg->num_rx_chains, cmd->num_txrx_chains);
7408
7409 if (wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
7410 WMI_PDEV_SET_ANTENNA_MODE_CMDID)) {
7411 WMA_LOGE("%s: Failed to send WMI_PDEV_SET_ANTENNA_MODE_CMDID",
7412 __func__);
7413 wmi_buf_free(buf);
7414 status = QDF_STATUS_E_FAILURE;
7415 goto resp;
7416 }
7417 status = QDF_STATUS_SUCCESS;
7418
7419resp:
7420 param = qdf_mem_malloc(sizeof(*param));
7421 if (!param) {
7422 WMA_LOGE("%s: Memory allocation failed", __func__);
7423 return QDF_STATUS_E_NOMEM;
7424 }
7425 param->status = (status) ?
7426 SET_ANTENNA_MODE_STATUS_ECANCELED :
7427 SET_ANTENNA_MODE_STATUS_OK;
7428 WMA_LOGE("%s: Send antenna mode resp to LIM status: %d",
7429 __func__, param->status);
7430 wma_send_msg(wma_handle, SIR_HAL_SOC_ANTENNA_MODE_RESP,
7431 (void *) param, 0);
7432 return status;
7433}
7434
7435/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007436 * wma_crash_inject() - sends command to FW to simulate crash
7437 * @wma_handle: pointer of WMA context
7438 * @type: subtype of the command
7439 * @delay_time_ms: time in milliseconds for FW to delay the crash
7440 *
7441 * This function will send a command to FW in order to simulate different
7442 * kinds of FW crashes.
7443 *
Govind Singhd76a5b02016-03-08 15:12:14 +05307444 * Return: QDF_STATUS_SUCCESS for success or error code
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007445 */
Govind Singhd76a5b02016-03-08 15:12:14 +05307446QDF_STATUS wma_crash_inject(tp_wma_handle wma_handle, uint32_t type,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007447 uint32_t delay_time_ms)
7448{
Govind Singhd76a5b02016-03-08 15:12:14 +05307449 struct crash_inject param;
7450 param.type = type;
7451 param.delay_time_ms = delay_time_ms;
7452
7453 return wmi_crash_inject(wma_handle->wmi_handle, &param);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007454}
Govind Singhd76a5b02016-03-08 15:12:14 +05307455
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007456#if defined(FEATURE_LRO)
7457/**
7458 * wma_lro_init() - sends LRO configuration to FW
7459 * @lro_config: pointer to the config parameters
7460 *
7461 * This function ends LRO configuration to FW.
7462 *
7463 * Return: 0 for success or reasons for failure
7464 */
Dhanashri Atre09828f12016-11-13 10:36:58 -08007465int wma_lro_init(struct cdp_lro_hash_config *lro_config)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007466{
Rajeev Kumarb60abe42017-01-21 15:39:31 -08007467 struct scheduler_msg msg = {0};
Dhanashri Atre09828f12016-11-13 10:36:58 -08007468 struct cdp_lro_hash_config *iwcmd;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007469
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307470 iwcmd = qdf_mem_malloc(sizeof(*iwcmd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007471 if (!iwcmd) {
7472 WMA_LOGE("memory allocation for WMA_LRO_CONFIG_CMD failed!");
7473 return -ENOMEM;
7474 }
7475
7476 *iwcmd = *lro_config;
7477
7478 msg.type = WMA_LRO_CONFIG_CMD;
7479 msg.reserved = 0;
7480 msg.bodyptr = iwcmd;
7481
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307482 if (QDF_STATUS_SUCCESS !=
Rajeev Kumarb60abe42017-01-21 15:39:31 -08007483 scheduler_post_msg(QDF_MODULE_ID_WMA, &msg)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007484 WMA_LOGE("Failed to post WMA_LRO_CONFIG_CMD msg!");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307485 qdf_mem_free(iwcmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007486 return -EAGAIN;
7487 }
7488
7489 WMA_LOGD("sending the LRO configuration to the fw");
7490 return 0;
7491}
7492#endif
Leo Chang96464902016-10-28 11:10:54 -07007493
7494void wma_peer_set_default_routing(void *scn_handle, uint8_t *peer_macaddr,
7495 uint8_t vdev_id, bool hash_based, uint8_t ring_num)
7496{
7497 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
7498 struct peer_set_params param;
7499
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05307500 if (!wma) {
7501 WMA_LOGE("%s:wma_handle is NULL", __func__);
7502 return;
7503 }
Leo Chang96464902016-10-28 11:10:54 -07007504
7505 /* TODO: Need bit definitions for ring number and hash based routing
7506 * fields in common wmi header file
7507 */
7508 param.param_id = WMI_HOST_PEER_SET_DEFAULT_ROUTING;
7509 param.vdev_id = vdev_id;
7510 param.param_value = ((hash_based) ? 1 : 0) | (ring_num << 1);
Dhanashri Atre09828f12016-11-13 10:36:58 -08007511 WMA_LOGD("%s: param_value 0x%d", __func__, param.param_value);
Leo Chang96464902016-10-28 11:10:54 -07007512 wmi_set_peer_param_send(wma->wmi_handle, peer_macaddr, &param);
7513
7514 return;
7515}
7516
7517int wma_peer_rx_reorder_queue_setup(void *scn_handle,
7518 uint8_t vdev_id, uint8_t *peer_macaddr, qdf_dma_addr_t hw_qdesc,
7519 int tid, uint16_t queue_no)
7520{
7521 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
7522 struct rx_reorder_queue_setup_params param;
7523
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05307524 if (!wma) {
7525 WMA_LOGE("%s:wma_handle is NULL", __func__);
7526 return QDF_STATUS_E_FAILURE;
7527 }
7528
Leo Chang96464902016-10-28 11:10:54 -07007529 param.tid = tid;
7530 param.vdev_id = vdev_id;
7531 param.peer_macaddr = peer_macaddr;
7532 param.hw_qdesc_paddr_lo = hw_qdesc & 0xffffffff;
7533 param.hw_qdesc_paddr_hi = (uint64_t)hw_qdesc >> 32;
7534 param.queue_no = queue_no;
7535
7536 return wmi_unified_peer_rx_reorder_queue_setup_send(wma->wmi_handle,
7537 &param);
7538}
7539
7540int wma_peer_rx_reorder_queue_remove(void *scn_handle,
7541 uint8_t vdev_id, uint8_t *peer_macaddr, uint32_t peer_tid_bitmap)
7542{
7543 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
7544 struct rx_reorder_queue_remove_params param;
7545
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05307546 if (!wma) {
7547 WMA_LOGE("%s:wma_handle is NULL", __func__);
7548 return QDF_STATUS_E_FAILURE;
7549 }
7550
Leo Chang96464902016-10-28 11:10:54 -07007551 param.vdev_id = vdev_id;
7552 param.peer_macaddr = peer_macaddr;
7553 param.peer_tid_bitmap = peer_tid_bitmap;
7554
7555 return wmi_unified_peer_rx_reorder_queue_remove_send(wma->wmi_handle,
7556 &param);
7557}
7558
7559