blob: 806b3464c5885648518d5de4f87393a866f18eb8 [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
Harprit Chhabada98225f62018-12-11 15:29:55 -08002 * Copyright (c) 2013-2019 The Linux Foundation. All rights reserved.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003 *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004 * Permission to use, copy, modify, and/or distribute this software for
5 * any purpose with or without fee is hereby granted, provided that the
6 * above copyright notice and this permission notice appear in all
7 * copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16 * PERFORMANCE OF THIS SOFTWARE.
17 */
18
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080019/**
20 * DOC: wma_main.c
21 *
22 * This file contains wma initialization and FW exchange
23 * related functions.
24 */
25
26/* Header files */
27
28#include "wma.h"
29#include "wma_api.h"
30#include "cds_api.h"
31#include "wmi_unified_api.h"
32#include "wlan_qct_sys.h"
33#include "wni_api.h"
34#include "ani_global.h"
35#include "wmi_unified.h"
36#include "wni_cfg.h"
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +053037#if defined(CONFIG_HL_SUPPORT)
38#include "wlan_tgt_def_config_hl.h"
39#else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080040#include "wlan_tgt_def_config.h"
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +053041#endif
Nirav Shahcbc6d722016-03-01 16:24:53 +053042#include "qdf_nbuf.h"
Anurag Chouhan6d760662016-02-20 16:05:43 +053043#include "qdf_types.h"
Anurag Chouhan600c3a02016-03-01 10:33:54 +053044#include "qdf_mem.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080045#include "wma_types.h"
46#include "lim_api.h"
47#include "lim_session_utils.h"
48
49#include "cds_utils.h"
50
51#if !defined(REMOVE_PKT_LOG)
52#include "pktlog_ac.h"
53#endif /* REMOVE_PKT_LOG */
54
55#include "dbglog_host.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080056#include "csr_api.h"
57#include "ol_fw.h"
58
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080059#include "wma_internal.h"
60
61#include "wma_ocb.h"
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -070062#include "wlan_policy_mgr_api.h"
Dhanashri Atreb08959a2016-03-01 17:28:03 -080063#include "cdp_txrx_cfg.h"
64#include "cdp_txrx_flow_ctrl_legacy.h"
65#include "cdp_txrx_flow_ctrl_v2.h"
66#include "cdp_txrx_ipa.h"
Leo Chang96464902016-10-28 11:10:54 -070067#include "cdp_txrx_misc.h"
Jeff Johnson6136fb92017-03-30 15:21:49 -070068#include "wma_fips_api.h"
Deepak Dhamdhere13230d32016-05-26 00:46:53 -070069#include "wma_nan_datapath.h"
Qun Zhangef655622019-02-25 10:48:10 +080070#include "wma_fw_state.h"
Frank Liu65b17d92016-11-23 15:58:44 +080071#include "wlan_lmac_if_def.h"
72#include "wlan_lmac_if_api.h"
Mukul Sharmac3e7a782017-02-03 12:16:11 +053073#include "target_if.h"
Harprit Chhabada31e3e162019-01-16 16:48:14 -080074#include "target_if_scan.h"
Mukul Sharmadad267e2017-02-04 13:25:34 +053075#include "wlan_global_lmac_if_api.h"
Mukul Sharma3d36c392017-01-18 18:39:12 +053076#include "target_if_pmo.h"
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -070077#include "wma_he.h"
Mukul Sharma6411bb82017-03-01 15:57:07 +053078#include "wlan_pmo_obj_mgmt_api.h"
Frank Liu65b17d92016-11-23 15:58:44 +080079
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070080#include "wlan_reg_tgt_api.h"
81#include "wlan_reg_services_api.h"
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -080082#include <cdp_txrx_handle.h>
Tushnim Bhattacharyya45ed04f2017-03-15 10:15:05 -070083#include <wlan_pmo_ucfg_api.h>
Naveen Rawat4efe41b2017-04-29 16:23:14 -070084#include "wifi_pos_api.h"
85#include "hif_main.h"
Sandeep Puligilla063a4342018-01-10 02:50:14 -080086#include <target_if_spectral.h>
87#include <wlan_spectral_utils_api.h>
Arunk Khandavallia6305a32018-01-25 11:19:18 +053088#include "init_event_handler.h"
Sourav Mohapatracf632572018-04-02 11:01:35 +053089#include "init_deinit_lmac.h"
Himanshu Agarwalceb9faa2018-01-24 22:30:05 +053090#include "target_if_green_ap.h"
Arunk Khandavalli10af7282018-02-05 16:55:48 +053091#include "service_ready_param.h"
Naveen Rawat3ff5cff2018-01-29 14:31:16 -080092#include "wlan_cp_stats_mc_ucfg_api.h"
Manikandan Mohandcd0fdf2018-08-02 18:13:37 -070093#include "cfg_nan_api.h"
Pragaspathi Thilagaraj00bd8bc2018-08-18 01:23:01 +053094#include "wlan_mlme_api.h"
Wu Gao51a63562018-11-08 16:29:10 +080095#include "wlan_mlme_ucfg_api.h"
Alok Kumar02301292018-11-28 18:10:34 +053096#include "cfg_ucfg_api.h"
hangtian351b7c92019-01-17 16:52:45 +080097#include "init_cmd_api.h"
Nachiket Kukade15bd4f72019-02-19 17:30:50 +053098#include "nan_ucfg_api.h"
Arun Kumar Khandavallideda5a82019-03-11 15:32:19 +053099#include "wma_coex.h"
Tushnim Bhattacharyya45ed04f2017-03-15 10:15:05 -0700100
Agrawal Ashishb0aa0752017-04-21 19:31:10 +0530101#define WMA_LOG_COMPLETION_TIMER 3000 /* 3 seconds */
Rajeev Kumar Sirasanagandla47873002016-09-09 13:46:09 +0530102#define WMI_TLV_HEADROOM 128
gaurank kathpalia85f8a612018-02-21 18:55:24 +0530103
104#define WMA_FW_TIME_SYNC_TIMER 60000 /* 1 min */
105
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700106uint8_t *mac_trace_get_wma_msg_string(uint16_t wmaMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800107static uint32_t g_fw_wlan_feat_caps;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800108/**
109 * wma_get_fw_wlan_feat_caps() - get fw feature capablity
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -0700110 * @feature: feature enum value
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800111 *
112 * Return: true/false
113 */
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -0700114bool wma_get_fw_wlan_feat_caps(enum cap_bitmap feature)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800115{
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -0700116 return (g_fw_wlan_feat_caps & (1 << feature)) ? true : false;
117}
118
119/**
120 * wma_set_fw_wlan_feat_caps() - set fw feature capablity
121 * @feature: feature enum value
122 *
123 * Return: None
124 */
125void wma_set_fw_wlan_feat_caps(enum cap_bitmap feature)
126{
127 g_fw_wlan_feat_caps |= (1 << feature);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800128}
129
130/**
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +0530131 * wma_service_ready_ext_evt_timeout() - Service ready extended event timeout
132 * @data: Timeout handler data
133 *
134 * This function is called when the FW fails to send WMI_SERVICE_READY_EXT_EVENT
135 * message
136 *
137 * Return: None
138 */
139static void wma_service_ready_ext_evt_timeout(void *data)
140{
141 tp_wma_handle wma_handle;
142
143 WMA_LOGA("%s: Timeout waiting for WMI_SERVICE_READY_EXT_EVENT",
144 __func__);
145
146 wma_handle = (tp_wma_handle) data;
147
148 if (!wma_handle) {
149 WMA_LOGE("%s: Invalid WMA handle", __func__);
150 goto end;
151 }
152
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +0530153end:
Naveen Rawatac39a102016-10-07 10:58:29 -0700154 /* Assert here. Panic is being called in insmod thread */
155 QDF_ASSERT(0);
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +0530156}
157
158/**
Komal Seelam02d09342016-02-23 18:03:19 +0530159 * wma_get_ini_handle() - API to get WMA ini info handle
160 * @wma: WMA Handle
161 *
162 * Returns the pointer to WMA ini structure.
163 * Return: struct wma_ini_config
164 */
165struct wma_ini_config *wma_get_ini_handle(tp_wma_handle wma)
166{
167 if (!wma) {
168 WMA_LOGE("%s: Invalid WMA context\n", __func__);
169 return NULL;
170 }
171
172 return &wma->ini_config;
173}
174
175#define MAX_SUPPORTED_PEERS_REV1_1 14
176#define MAX_SUPPORTED_PEERS_REV1_3 32
177#define MIN_NO_OF_PEERS 1
178
179/**
180 * wma_get_number_of_peers_supported - API to query for number of peers
181 * supported
182 * @wma: WMA Handle
183 *
184 * Return: Max Number of Peers Supported
185 */
186static uint8_t wma_get_number_of_peers_supported(tp_wma_handle wma)
187{
Komal Seelam02d09342016-02-23 18:03:19 +0530188 struct wma_ini_config *cfg = wma_get_ini_handle(wma);
189 uint8_t max_no_of_peers = cfg ? cfg->max_no_of_peers : MIN_NO_OF_PEERS;
Komal Seelam02d09342016-02-23 18:03:19 +0530190
191 return max_no_of_peers;
192}
193
194/**
bings6b3614e2017-02-21 10:18:36 +0800195 * wma_get_number_of_tids_supported - API to query for number of tids supported
196 * @no_of_peers_supported: Number of peer supported
197 *
198 * Return: Max number of tids supported
199 */
200#if defined(CONFIG_HL_SUPPORT)
Rachit Kankane0106e382018-05-16 18:59:28 +0530201static uint32_t wma_get_number_of_tids_supported(uint8_t no_of_peers_supported,
202 uint8_t num_vdevs)
bings6b3614e2017-02-21 10:18:36 +0800203{
204 return 4 * no_of_peers_supported;
205}
206#else
Rachit Kankane0106e382018-05-16 18:59:28 +0530207static uint32_t wma_get_number_of_tids_supported(uint8_t no_of_peers_supported,
208 uint8_t num_vdevs)
bings6b3614e2017-02-21 10:18:36 +0800209{
Rachit Kankane0106e382018-05-16 18:59:28 +0530210 return 2 * (no_of_peers_supported + num_vdevs + 2);
bings6b3614e2017-02-21 10:18:36 +0800211}
212#endif
213
Rachit Kankane0106e382018-05-16 18:59:28 +0530214#ifndef NUM_OF_ADDITIONAL_FW_PEERS
215#define NUM_OF_ADDITIONAL_FW_PEERS 2
216#endif
bings6b3614e2017-02-21 10:18:36 +0800217/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800218 * wma_set_default_tgt_config() - set default tgt config
219 * @wma_handle: wma handle
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530220 * @tgt_cfg: Resource config given to target
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800221 *
222 * Return: none
223 */
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530224static void wma_set_default_tgt_config(tp_wma_handle wma_handle,
Rachit Kankane0106e382018-05-16 18:59:28 +0530225 target_resource_config *tgt_cfg,
226 struct cds_config_info *cds_cfg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800227{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800228 uint8_t no_of_peers_supported;
Mukul Sharmab10c8c72017-11-02 17:25:59 +0530229
Rachit Kankane0106e382018-05-16 18:59:28 +0530230 no_of_peers_supported = wma_get_number_of_peers_supported(wma_handle);
231
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530232 qdf_mem_zero(tgt_cfg, sizeof(target_resource_config));
Rachit Kankane0106e382018-05-16 18:59:28 +0530233 tgt_cfg->num_vdevs = cds_cfg->num_vdevs;
234 tgt_cfg->num_peers = no_of_peers_supported +
235 cds_cfg->num_vdevs +
236 NUM_OF_ADDITIONAL_FW_PEERS;
237 /* The current firmware implementation requires the number of
238 * offload peers should be (number of vdevs + 1).
239 */
240 tgt_cfg->num_offload_peers = cds_cfg->ap_maxoffload_peers + 1;
241 tgt_cfg->num_offload_reorder_buffs =
242 cds_cfg->ap_maxoffload_reorderbuffs + 1;
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530243 tgt_cfg->num_peer_keys = CFG_TGT_NUM_PEER_KEYS;
Rachit Kankane0106e382018-05-16 18:59:28 +0530244 tgt_cfg->num_tids = wma_get_number_of_tids_supported(
245 no_of_peers_supported, cds_cfg->num_vdevs);
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530246 tgt_cfg->ast_skid_limit = CFG_TGT_AST_SKID_LIMIT;
247 tgt_cfg->tx_chain_mask = CFG_TGT_DEFAULT_TX_CHAIN_MASK;
248 tgt_cfg->rx_chain_mask = CFG_TGT_DEFAULT_RX_CHAIN_MASK;
249 tgt_cfg->rx_timeout_pri[0] = CFG_TGT_RX_TIMEOUT_LO_PRI;
250 tgt_cfg->rx_timeout_pri[1] = CFG_TGT_RX_TIMEOUT_LO_PRI;
251 tgt_cfg->rx_timeout_pri[2] = CFG_TGT_RX_TIMEOUT_LO_PRI;
252 tgt_cfg->rx_timeout_pri[3] = CFG_TGT_RX_TIMEOUT_HI_PRI;
253 tgt_cfg->rx_decap_mode = CFG_TGT_RX_DECAP_MODE;
Harprit Chhabada31e3e162019-01-16 16:48:14 -0800254 tgt_cfg->scan_max_pending_req = WLAN_MAX_ACTIVE_SCANS_ALLOWED;
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530255 tgt_cfg->bmiss_offload_max_vdev =
256 CFG_TGT_DEFAULT_BMISS_OFFLOAD_MAX_VDEV;
257 tgt_cfg->roam_offload_max_vdev = CFG_TGT_DEFAULT_ROAM_OFFLOAD_MAX_VDEV;
258 tgt_cfg->roam_offload_max_ap_profiles =
Mukul Sharmab10c8c72017-11-02 17:25:59 +0530259 CFG_TGT_DEFAULT_ROAM_OFFLOAD_MAX_PROFILES;
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530260 tgt_cfg->num_mcast_groups = CFG_TGT_DEFAULT_NUM_MCAST_GROUPS;
261 tgt_cfg->num_mcast_table_elems = CFG_TGT_DEFAULT_NUM_MCAST_TABLE_ELEMS;
262 tgt_cfg->mcast2ucast_mode = CFG_TGT_DEFAULT_MCAST2UCAST_MODE;
263 tgt_cfg->tx_dbg_log_size = CFG_TGT_DEFAULT_TX_DBG_LOG_SIZE;
264 tgt_cfg->num_wds_entries = CFG_TGT_WDS_ENTRIES;
265 tgt_cfg->dma_burst_size = CFG_TGT_DEFAULT_DMA_BURST_SIZE;
266 tgt_cfg->mac_aggr_delim = CFG_TGT_DEFAULT_MAC_AGGR_DELIM;
267 tgt_cfg->rx_skip_defrag_timeout_dup_detection_check =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800268 CFG_TGT_DEFAULT_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK,
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530269 tgt_cfg->vow_config = CFG_TGT_DEFAULT_VOW_CONFIG;
270 tgt_cfg->gtk_offload_max_vdev = CFG_TGT_DEFAULT_GTK_OFFLOAD_MAX_VDEV;
271 tgt_cfg->num_msdu_desc = CFG_TGT_NUM_MSDU_DESC;
272 tgt_cfg->max_frag_entries = CFG_TGT_MAX_FRAG_TABLE_ENTRIES;
273 tgt_cfg->num_tdls_vdevs = CFG_TGT_NUM_TDLS_VDEVS;
274 tgt_cfg->num_tdls_conn_table_entries =
Mukul Sharmab10c8c72017-11-02 17:25:59 +0530275 CFG_TGT_NUM_TDLS_CONN_TABLE_ENTRIES;
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530276 tgt_cfg->beacon_tx_offload_max_vdev =
Mukul Sharmab10c8c72017-11-02 17:25:59 +0530277 CFG_TGT_DEFAULT_BEACON_TX_OFFLOAD_MAX_VDEV;
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530278 tgt_cfg->num_multicast_filter_entries =
Mukul Sharmab10c8c72017-11-02 17:25:59 +0530279 CFG_TGT_MAX_MULTICAST_FILTER_ENTRIES;
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530280 tgt_cfg->num_wow_filters = 0;
Rachit Kankane0106e382018-05-16 18:59:28 +0530281 tgt_cfg->num_keep_alive_pattern = WMA_MAXNUM_PERIODIC_TX_PTRNS;
jsreekumac44b922018-06-12 20:18:39 +0530282 tgt_cfg->num_max_sta_vdevs = CFG_TGT_DEFAULT_MAX_STA_VDEVS;
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530283 tgt_cfg->keep_alive_pattern_size = 0;
284 tgt_cfg->max_tdls_concurrent_sleep_sta =
Mukul Sharmab10c8c72017-11-02 17:25:59 +0530285 CFG_TGT_NUM_TDLS_CONC_SLEEP_STAS;
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530286 tgt_cfg->max_tdls_concurrent_buffer_sta =
Mukul Sharmab10c8c72017-11-02 17:25:59 +0530287 CFG_TGT_NUM_TDLS_CONC_BUFFER_STAS;
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530288 tgt_cfg->wmi_send_separate = 0;
289 tgt_cfg->num_ocb_vdevs = CFG_TGT_NUM_OCB_VDEVS;
290 tgt_cfg->num_ocb_channels = CFG_TGT_NUM_OCB_CHANNELS;
291 tgt_cfg->num_ocb_schedules = CFG_TGT_NUM_OCB_SCHEDULES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800292
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800293
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530294 tgt_cfg->mgmt_comp_evt_bundle_support = true;
295 tgt_cfg->tx_msdu_new_partition_id_support = true;
Nirav Shah20489972016-06-16 19:20:28 +0530296
Arunk Khandavallicfde2712018-01-25 11:27:42 +0530297 if (cds_get_conparam() == QDF_GLOBAL_MONITOR_MODE)
298 tgt_cfg->rx_decap_mode = CFG_TGT_RX_DECAP_MODE_RAW;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800299}
300
301/**
302 * wma_cli_get_command() - WMA "get" command processor
303 * @vdev_id: virtual device for the command
304 * @param_id: parameter id
305 * @vpdev: parameter category
306 *
307 * Return: parameter value on success, -EINVAL on failure
308 */
309int wma_cli_get_command(int vdev_id, int param_id, int vpdev)
310{
311 int ret = 0;
312 tp_wma_handle wma;
313 struct wma_txrx_node *intr = NULL;
314
Anurag Chouhan6d760662016-02-20 16:05:43 +0530315 wma = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800316
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -0700317 if (!wma) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800318 WMA_LOGE("%s: Invalid wma handle", __func__);
319 return -EINVAL;
320 }
321
322 intr = wma->interfaces;
323
324 if (VDEV_CMD == vpdev) {
325 switch (param_id) {
326 case WMI_VDEV_PARAM_NSS:
327 ret = intr[vdev_id].config.nss;
328 break;
329#ifdef QCA_SUPPORT_GTX
330 case WMI_VDEV_PARAM_GTX_HT_MCS:
331 ret = intr[vdev_id].config.gtx_info.gtxRTMask[0];
332 break;
333 case WMI_VDEV_PARAM_GTX_VHT_MCS:
334 ret = intr[vdev_id].config.gtx_info.gtxRTMask[1];
335 break;
336 case WMI_VDEV_PARAM_GTX_USR_CFG:
337 ret = intr[vdev_id].config.gtx_info.gtxUsrcfg;
338 break;
339 case WMI_VDEV_PARAM_GTX_THRE:
340 ret = intr[vdev_id].config.gtx_info.gtxPERThreshold;
341 break;
342 case WMI_VDEV_PARAM_GTX_MARGIN:
343 ret = intr[vdev_id].config.gtx_info.gtxPERMargin;
344 break;
345 case WMI_VDEV_PARAM_GTX_STEP:
346 ret = intr[vdev_id].config.gtx_info.gtxTPCstep;
347 break;
348 case WMI_VDEV_PARAM_GTX_MINTPC:
349 ret = intr[vdev_id].config.gtx_info.gtxTPCMin;
350 break;
351 case WMI_VDEV_PARAM_GTX_BW_MASK:
352 ret = intr[vdev_id].config.gtx_info.gtxBWMask;
353 break;
354#endif /* QCA_SUPPORT_GTX */
355 case WMI_VDEV_PARAM_LDPC:
356 ret = intr[vdev_id].config.ldpc;
357 break;
358 case WMI_VDEV_PARAM_TX_STBC:
359 ret = intr[vdev_id].config.tx_stbc;
360 break;
361 case WMI_VDEV_PARAM_RX_STBC:
362 ret = intr[vdev_id].config.rx_stbc;
363 break;
364 case WMI_VDEV_PARAM_SGI:
365 ret = intr[vdev_id].config.shortgi;
366 break;
367 case WMI_VDEV_PARAM_ENABLE_RTSCTS:
368 ret = intr[vdev_id].config.rtscts_en;
369 break;
370 case WMI_VDEV_PARAM_CHWIDTH:
371 ret = intr[vdev_id].config.chwidth;
372 break;
373 case WMI_VDEV_PARAM_FIXED_RATE:
374 ret = intr[vdev_id].config.tx_rate;
375 break;
Krishna Kumaar Natarajan1a71ec72017-03-23 12:26:31 -0700376 case WMI_VDEV_PARAM_HE_DCM:
Krishna Kumaar Natarajan150cd012017-03-23 12:29:10 -0700377 case WMI_VDEV_PARAM_HE_RANGE_EXT:
Krishna Kumaar Natarajan1a71ec72017-03-23 12:26:31 -0700378 ret = wma_get_he_vdev_param(&intr[vdev_id], param_id);
379 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800380 default:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700381 WMA_LOGE("Invalid cli_get vdev command/Not yet implemented 0x%x",
382 param_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800383 return -EINVAL;
384 }
385 } else if (PDEV_CMD == vpdev) {
386 switch (param_id) {
387 case WMI_PDEV_PARAM_ANI_ENABLE:
388 ret = wma->pdevconfig.ani_enable;
389 break;
390 case WMI_PDEV_PARAM_ANI_POLL_PERIOD:
391 ret = wma->pdevconfig.ani_poll_len;
392 break;
393 case WMI_PDEV_PARAM_ANI_LISTEN_PERIOD:
394 ret = wma->pdevconfig.ani_listen_len;
395 break;
396 case WMI_PDEV_PARAM_ANI_OFDM_LEVEL:
397 ret = wma->pdevconfig.ani_ofdm_level;
398 break;
399 case WMI_PDEV_PARAM_ANI_CCK_LEVEL:
400 ret = wma->pdevconfig.ani_cck_level;
401 break;
402 case WMI_PDEV_PARAM_DYNAMIC_BW:
403 ret = wma->pdevconfig.cwmenable;
404 break;
405 case WMI_PDEV_PARAM_CTS_CBW:
406 ret = wma->pdevconfig.cts_cbw;
407 break;
408 case WMI_PDEV_PARAM_TX_CHAIN_MASK:
409 ret = wma->pdevconfig.txchainmask;
410 break;
411 case WMI_PDEV_PARAM_RX_CHAIN_MASK:
412 ret = wma->pdevconfig.rxchainmask;
413 break;
414 case WMI_PDEV_PARAM_TXPOWER_LIMIT2G:
415 ret = wma->pdevconfig.txpow2g;
416 break;
417 case WMI_PDEV_PARAM_TXPOWER_LIMIT5G:
418 ret = wma->pdevconfig.txpow5g;
419 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800420 default:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700421 WMA_LOGE("Invalid cli_get pdev command/Not yet implemented 0x%x",
422 param_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800423 return -EINVAL;
424 }
425 } else if (GEN_CMD == vpdev) {
426 switch (param_id) {
427 case GEN_VDEV_PARAM_AMPDU:
428 ret = intr[vdev_id].config.ampdu;
429 break;
430 case GEN_VDEV_PARAM_AMSDU:
431 ret = intr[vdev_id].config.amsdu;
432 break;
Varun Reddy Yeturu5ab47462016-05-08 18:08:11 -0700433 case GEN_VDEV_ROAM_SYNCH_DELAY:
434 ret = intr[vdev_id].roam_synch_delay;
435 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800436 default:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700437 WMA_LOGE("Invalid generic vdev command/Not yet implemented 0x%x",
438 param_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800439 return -EINVAL;
440 }
441 } else if (PPS_CMD == vpdev) {
442 switch (param_id) {
443 case WMI_VDEV_PPS_PAID_MATCH:
444 ret = intr[vdev_id].config.pps_params.paid_match_enable;
445 break;
446 case WMI_VDEV_PPS_GID_MATCH:
447 ret = intr[vdev_id].config.pps_params.gid_match_enable;
448 break;
449 case WMI_VDEV_PPS_EARLY_TIM_CLEAR:
450 ret = intr[vdev_id].config.pps_params.tim_clear;
451 break;
452 case WMI_VDEV_PPS_EARLY_DTIM_CLEAR:
453 ret = intr[vdev_id].config.pps_params.dtim_clear;
454 break;
455 case WMI_VDEV_PPS_EOF_PAD_DELIM:
456 ret = intr[vdev_id].config.pps_params.eof_delim;
457 break;
458 case WMI_VDEV_PPS_MACADDR_MISMATCH:
459 ret = intr[vdev_id].config.pps_params.mac_match;
460 break;
461 case WMI_VDEV_PPS_DELIM_CRC_FAIL:
462 ret = intr[vdev_id].config.pps_params.delim_fail;
463 break;
464 case WMI_VDEV_PPS_GID_NSTS_ZERO:
465 ret = intr[vdev_id].config.pps_params.nsts_zero;
466 break;
467 case WMI_VDEV_PPS_RSSI_CHECK:
468 ret = intr[vdev_id].config.pps_params.rssi_chk;
469 break;
470 default:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700471 WMA_LOGE("Invalid pps vdev command/Not yet implemented 0x%x",
472 param_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800473 return -EINVAL;
474 }
475 } else if (QPOWER_CMD == vpdev) {
476 switch (param_id) {
477 case WMI_STA_PS_PARAM_QPOWER_PSPOLL_COUNT:
478 ret = intr[vdev_id].config.qpower_params.
479 max_ps_poll_cnt;
480 break;
481 case WMI_STA_PS_PARAM_QPOWER_MAX_TX_BEFORE_WAKE:
482 ret = intr[vdev_id].config.qpower_params.
483 max_tx_before_wake;
484 break;
485 case WMI_STA_PS_PARAM_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL:
486 ret = intr[vdev_id].config.qpower_params.
487 spec_ps_poll_wake_interval;
488 break;
489 case WMI_STA_PS_PARAM_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL:
490 ret = intr[vdev_id].config.qpower_params.
491 max_spec_nodata_ps_poll;
492 break;
493 default:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700494 WMA_LOGE("Invalid generic vdev command/Not yet implemented 0x%x",
495 param_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800496 return -EINVAL;
497 }
498 } else if (GTX_CMD == vpdev) {
499 switch (param_id) {
500 case WMI_VDEV_PARAM_GTX_HT_MCS:
501 ret = intr[vdev_id].config.gtx_info.gtxRTMask[0];
502 break;
503 case WMI_VDEV_PARAM_GTX_VHT_MCS:
504 ret = intr[vdev_id].config.gtx_info.gtxRTMask[1];
505 break;
506 case WMI_VDEV_PARAM_GTX_USR_CFG:
507 ret = intr[vdev_id].config.gtx_info.gtxUsrcfg;
508 break;
509 case WMI_VDEV_PARAM_GTX_THRE:
510 ret = intr[vdev_id].config.gtx_info.gtxPERThreshold;
511 break;
512 case WMI_VDEV_PARAM_GTX_MARGIN:
513 ret = intr[vdev_id].config.gtx_info.gtxPERMargin;
514 break;
515 case WMI_VDEV_PARAM_GTX_STEP:
516 ret = intr[vdev_id].config.gtx_info.gtxTPCstep;
517 break;
518 case WMI_VDEV_PARAM_GTX_MINTPC:
519 ret = intr[vdev_id].config.gtx_info.gtxTPCMin;
520 break;
521 case WMI_VDEV_PARAM_GTX_BW_MASK:
522 ret = intr[vdev_id].config.gtx_info.gtxBWMask;
523 break;
524 default:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700525 WMA_LOGE("Invalid generic vdev command/Not yet implemented 0x%x",
526 param_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800527 return -EINVAL;
528 }
529 }
530 return ret;
531}
532
533/**
534 * wma_cli_set2_command() - WMA "set 2 params" command processor
535 * @vdev_id: virtual device for the command
536 * @param_id: parameter id
537 * @sval1: first parameter value
538 * @sval2: second parameter value
539 * @vpdev: parameter category
540 *
541 * Command handler for set operations which require 2 parameters
542 *
543 * Return: 0 on success, errno on failure
544 */
545int wma_cli_set2_command(int vdev_id, int param_id, int sval1,
546 int sval2, int vpdev)
547{
Rajeev Kumarb60abe42017-01-21 15:39:31 -0800548 struct scheduler_msg msg = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800549 wma_cli_set_cmd_t *iwcmd;
550
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530551 iwcmd = qdf_mem_malloc(sizeof(*iwcmd));
Arif Hussain157263f2018-10-03 13:07:15 -0700552 if (!iwcmd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800553 return -ENOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800554
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530555 qdf_mem_zero(iwcmd, sizeof(*iwcmd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800556 iwcmd->param_value = sval1;
557 iwcmd->param_sec_value = sval2;
558 iwcmd->param_vdev_id = vdev_id;
559 iwcmd->param_id = param_id;
560 iwcmd->param_vp_dev = vpdev;
561 msg.type = WMA_CLI_SET_CMD;
562 msg.reserved = 0;
563 msg.bodyptr = iwcmd;
564
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530565 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia00861f02018-08-28 19:16:12 +0530566 scheduler_post_message(QDF_MODULE_ID_WMA,
567 QDF_MODULE_ID_WMA,
568 QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530569 qdf_mem_free(iwcmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800570 return -EIO;
571 }
572 return 0;
573}
574
575/**
576 * wma_cli_set_command() - WMA "set" command processor
577 * @vdev_id: virtual device for the command
578 * @param_id: parameter id
579 * @sval: parameter value
580 * @vpdev: parameter category
581 *
582 * Command handler for set operations
583 *
584 * Return: 0 on success, errno on failure
585 */
586int wma_cli_set_command(int vdev_id, int param_id, int sval, int vpdev)
587{
588 return wma_cli_set2_command(vdev_id, param_id, sval, 0, vpdev);
589
590}
591
Krunal Soniaadaa272017-10-04 16:42:55 -0700592QDF_STATUS wma_form_unit_test_cmd_and_send(uint32_t vdev_id,
593 uint32_t module_id, uint32_t arg_count, uint32_t *arg)
594{
595 struct wmi_unit_test_cmd *unit_test_args;
596 tp_wma_handle wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
597 uint32_t i;
598 QDF_STATUS status;
599
600 WMA_LOGD(FL("enter"));
Sourav Mohapatraea7210b2018-11-16 16:58:52 +0530601 if (arg_count > WMA_MAX_NUM_ARGS) {
Krunal Soniaadaa272017-10-04 16:42:55 -0700602 WMA_LOGE(FL("arg_count is crossed the boundary"));
603 return QDF_STATUS_E_FAILURE;
604 }
605 if (!wma_handle || !wma_handle->wmi_handle) {
606 WMA_LOGE(FL("Invalid WMA/WMI handle"));
607 return QDF_STATUS_E_FAILURE;
608 }
609 unit_test_args = qdf_mem_malloc(sizeof(*unit_test_args));
Arif Hussain157263f2018-10-03 13:07:15 -0700610 if (!unit_test_args)
Krunal Soniaadaa272017-10-04 16:42:55 -0700611 return QDF_STATUS_E_NOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -0700612
Krunal Soniaadaa272017-10-04 16:42:55 -0700613 unit_test_args->vdev_id = vdev_id;
614 unit_test_args->module_id = module_id;
615 unit_test_args->num_args = arg_count;
616 for (i = 0; i < arg_count; i++)
617 unit_test_args->args[i] = arg[i];
618
619 status = wmi_unified_unit_test_cmd(wma_handle->wmi_handle,
620 unit_test_args);
621 qdf_mem_free(unit_test_args);
622 WMA_LOGD(FL("exit"));
623
624 return status;
625}
626
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -0800627static void wma_process_send_addba_req(tp_wma_handle wma_handle,
628 struct send_add_ba_req *send_addba)
629{
630 QDF_STATUS status;
631
632 if (!wma_handle || !wma_handle->wmi_handle) {
633 WMA_LOGE(FL("Invalid WMA/WMI handle"));
634 qdf_mem_free(send_addba);
635 return;
636 }
637
638 status = wmi_unified_addba_send_cmd_send(wma_handle->wmi_handle,
639 send_addba->mac_addr,
640 &send_addba->param);
641 if (QDF_STATUS_SUCCESS != status) {
642 WMA_LOGE(FL("Failed to process WMA_SEND_ADDBA_REQ"));
643 }
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -0700644 wma_debug("sent ADDBA req to" QDF_MAC_ADDR_STR "tid %d buff_size %d",
Srinivas Girigowda34fbba02019-04-08 12:07:44 -0700645 QDF_MAC_ADDR_ARRAY(send_addba->mac_addr),
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -0800646 send_addba->param.tidno,
647 send_addba->param.buffersize);
648
649 qdf_mem_free(send_addba);
650}
651
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800652/**
Yun Parkb4f591d2017-03-29 15:51:01 -0700653 * wma_ipa_get_stat() - get IPA data path stats from FW
654 *
655 * Return: 0 on success, errno on failure
656 */
657#ifdef IPA_OFFLOAD
658static int wma_ipa_get_stat(void)
659{
660 struct cdp_pdev *pdev;
661
662 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
663 if (!pdev) {
664 WMA_LOGE("pdev NULL for uc stat");
665 return -EINVAL;
666 }
667 cdp_ipa_get_stat(cds_get_context(QDF_MODULE_ID_SOC), pdev);
668
669 return 0;
670}
671#else
672static int wma_ipa_get_stat(void)
673{
674 return 0;
675}
676#endif
677
678/**
679 * wma_ipa_uc_get_share_stats() - get Tx/Rx byte stats from FW
680 * @privcmd: private command
681 *
682 * Return: 0 on success, errno on failure
683 */
684#if defined(IPA_OFFLOAD) && defined(FEATURE_METERING)
685static int wma_ipa_uc_get_share_stats(wma_cli_set_cmd_t *privcmd)
686{
687 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
688 struct cdp_pdev *pdev;
689 uint8_t reset_stats = privcmd->param_value;
690
691 WMA_LOGD("%s: reset_stats=%d",
692 "WMA_VDEV_TXRX_GET_IPA_UC_SHARING_STATS_CMDID",
693 reset_stats);
694 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
695 if (!pdev) {
696 WMA_LOGE("pdev NULL for uc get share stats");
697 return -EINVAL;
698 }
699 cdp_ipa_uc_get_share_stats(soc, pdev, reset_stats);
700
701 return 0;
702}
703#else
704static int wma_ipa_uc_get_share_stats(wma_cli_set_cmd_t *privcmd)
705{
706 return 0;
707}
708#endif
709
710/**
711 * wma_ipa_uc_set_quota() - set quota limit to FW
712 * @privcmd: private command
713 *
714 * Return: 0 on success, errno on failure
715 */
716#if defined(IPA_OFFLOAD) && defined(FEATURE_METERING)
717static int wma_ipa_uc_set_quota(wma_cli_set_cmd_t *privcmd)
718{
719 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
720 struct cdp_pdev *pdev;
721 uint64_t quota_bytes = privcmd->param_sec_value;
722
723 quota_bytes <<= 32;
724 quota_bytes |= privcmd->param_value;
725
726 WMA_LOGD("%s: quota_bytes=%llu",
727 "WMA_VDEV_TXRX_SET_IPA_UC_QUOTA_CMDID",
728 quota_bytes);
729 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
730 if (!pdev) {
731 WMA_LOGE("pdev NULL for uc set quota");
732 return -EINVAL;
733 }
734 cdp_ipa_uc_set_quota(soc, pdev, quota_bytes);
735
736 return 0;
737}
738#else
739static int wma_ipa_uc_set_quota(wma_cli_set_cmd_t *privcmd)
740{
741 return 0;
742}
743#endif
744
745/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800746 * wma_set_priv_cfg() - set private config parameters
747 * @wma_handle: wma handle
748 * @privcmd: private command
749 *
750 * Return: 0 for success or error code
751 */
752static int32_t wma_set_priv_cfg(tp_wma_handle wma_handle,
753 wma_cli_set_cmd_t *privcmd)
754{
755 int32_t ret = 0;
756
757 switch (privcmd->param_id) {
758 case WMA_VDEV_TXRX_FWSTATS_ENABLE_CMDID:
759 ret = wma_set_txrx_fw_stats_level(wma_handle,
760 privcmd->param_vdev_id,
761 privcmd->param_value);
762 break;
763 case WMA_VDEV_TXRX_FWSTATS_RESET_CMDID:
764 ret = wma_txrx_fw_stats_reset(wma_handle,
765 privcmd->param_vdev_id,
766 privcmd->param_value);
767 break;
768 case WMI_STA_SMPS_FORCE_MODE_CMDID:
Archana Ramachandran20d2e232016-02-11 16:58:40 -0800769 ret = wma_set_mimops(wma_handle,
770 privcmd->param_vdev_id,
771 privcmd->param_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800772 break;
773 case WMI_STA_SMPS_PARAM_CMDID:
774 wma_set_smps_params(wma_handle, privcmd->param_vdev_id,
775 privcmd->param_value);
776 break;
777 case WMA_VDEV_MCC_SET_TIME_LATENCY:
778 {
779 /* Extract first MCC adapter/vdev channel number and latency */
780 uint8_t mcc_channel = privcmd->param_value & 0x000000FF;
781 uint8_t mcc_channel_latency =
782 (privcmd->param_value & 0x0000FF00) >> 8;
783 int ret = -1;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700784
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800785 WMA_LOGD("%s: Parsed input: Channel #1:%d, latency:%dms",
786 __func__, mcc_channel, mcc_channel_latency);
787 ret = wma_set_mcc_channel_time_latency(wma_handle,
788 mcc_channel,
789 mcc_channel_latency);
790 }
791 break;
792 case WMA_VDEV_MCC_SET_TIME_QUOTA:
793 {
794 /* Extract the MCC 2 adapters/vdevs channel numbers and time
795 * quota value for the first adapter only (which is specified
796 * in iwpriv command.
797 */
798 uint8_t adapter_2_chan_number =
799 privcmd->param_value & 0x000000FF;
800 uint8_t adapter_1_chan_number =
801 (privcmd->param_value & 0x0000FF00) >> 8;
802 uint8_t adapter_1_quota =
803 (privcmd->param_value & 0x00FF0000) >> 16;
804 int ret = -1;
805
806 WMA_LOGD("%s: Parsed input: Channel #1:%d, Channel #2:%d, quota 1:%dms",
807 __func__, adapter_1_chan_number,
808 adapter_2_chan_number, adapter_1_quota);
809
810 ret = wma_set_mcc_channel_time_quota(wma_handle,
811 adapter_1_chan_number,
812 adapter_1_quota,
813 adapter_2_chan_number);
814 }
815 break;
816 case WMA_VDEV_IBSS_SET_ATIM_WINDOW_SIZE:
817 {
818 wma_handle->wma_ibss_power_save_params.atimWindowLength =
819 privcmd->param_value;
820 WMA_LOGD("%s: IBSS power save ATIM Window = %d",
821 __func__, wma_handle->wma_ibss_power_save_params.
822 atimWindowLength);
823 }
824 break;
825 case WMA_VDEV_IBSS_SET_POWER_SAVE_ALLOWED:
826 {
827 wma_handle->wma_ibss_power_save_params.isPowerSaveAllowed =
828 privcmd->param_value;
829 WMA_LOGD("%s: IBSS is Power Save Allowed = %d",
830 __func__, wma_handle->wma_ibss_power_save_params.
831 isPowerSaveAllowed);
832 }
833 break;
834 case WMA_VDEV_IBSS_SET_POWER_COLLAPSE_ALLOWED:
835 {
836 wma_handle->wma_ibss_power_save_params. isPowerCollapseAllowed =
837 privcmd->param_value;
838 WMA_LOGD("%s: IBSS is Power Collapse Allowed = %d",
839 __func__, wma_handle->wma_ibss_power_save_params.
840 isPowerCollapseAllowed);
841 }
842 break;
843 case WMA_VDEV_IBSS_SET_AWAKE_ON_TX_RX:
844 {
845 wma_handle->wma_ibss_power_save_params.isAwakeonTxRxEnabled =
846 privcmd->param_value;
847 WMA_LOGD("%s: IBSS Power Save Awake on Tx/Rx Enabled = %d",
848 __func__, wma_handle->wma_ibss_power_save_params.
849 isAwakeonTxRxEnabled);
850 }
851 break;
852 case WMA_VDEV_IBSS_SET_INACTIVITY_TIME:
853 {
854 wma_handle->wma_ibss_power_save_params.inactivityCount =
855 privcmd->param_value;
856 WMA_LOGD("%s: IBSS Power Save Data Inactivity Count = %d",
857 __func__, wma_handle->wma_ibss_power_save_params.
858 inactivityCount);
859 }
860 break;
861 case WMA_VDEV_IBSS_SET_TXSP_END_INACTIVITY_TIME:
862 {
863 wma_handle->wma_ibss_power_save_params.txSPEndInactivityTime =
864 privcmd->param_value;
865 WMA_LOGD("%s: IBSS Power Save Transmit EOSP inactivity time out = %d",
866 __func__, wma_handle->wma_ibss_power_save_params.
867 txSPEndInactivityTime);
868 }
869 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800870 case WMA_VDEV_IBSS_PS_SET_WARMUP_TIME_SECS:
871 {
872 wma_handle->wma_ibss_power_save_params.ibssPsWarmupTime =
873 privcmd->param_value;
874 WMA_LOGD("%s: IBSS Power Save Warm Up Time in Seconds = %d",
875 __func__, wma_handle->wma_ibss_power_save_params.
876 ibssPsWarmupTime);
877 }
878 break;
879 case WMA_VDEV_IBSS_PS_SET_1RX_CHAIN_IN_ATIM_WINDOW:
880 {
881 wma_handle->wma_ibss_power_save_params.ibssPs1RxChainInAtimEnable
882 = privcmd->param_value;
883 WMA_LOGD("%s: IBSS Power Save single RX Chain Enable In ATIM = %d",
884 __func__, wma_handle->wma_ibss_power_save_params.
885 ibssPs1RxChainInAtimEnable);
886 }
887 break;
888
889 case WMA_VDEV_TXRX_GET_IPA_UC_FW_STATS_CMDID:
890 {
Yun Parkb4f591d2017-03-29 15:51:01 -0700891 wma_ipa_get_stat();
Yun Park637d6482016-10-05 10:51:33 -0700892 }
893 break;
894
895 case WMA_VDEV_TXRX_GET_IPA_UC_SHARING_STATS_CMDID:
896 {
Yun Parkb4f591d2017-03-29 15:51:01 -0700897 wma_ipa_uc_get_share_stats(privcmd);
Yun Park637d6482016-10-05 10:51:33 -0700898 }
899 break;
900
901 case WMA_VDEV_TXRX_SET_IPA_UC_QUOTA_CMDID:
902 {
Yun Parkb4f591d2017-03-29 15:51:01 -0700903 wma_ipa_uc_set_quota(privcmd);
Yun Park327e7812017-02-14 15:18:10 -0800904
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800905 }
906 break;
907
908 default:
909 WMA_LOGE("Invalid wma config command id:%d", privcmd->param_id);
910 ret = -EINVAL;
911 }
912 return ret;
913}
914
915/**
Kiran Kumar Lokere6d3a30d2018-01-15 18:18:29 -0800916 * wma_set_dtim_period() - set dtim period to FW
917 * @wma: wma handle
918 * @dtim_params: dtim params
919 *
920 * Return: none
921 */
922static void wma_set_dtim_period(tp_wma_handle wma,
923 struct set_dtim_params *dtim_params)
924{
925 struct wma_txrx_node *iface =
926 &wma->interfaces[dtim_params->session_id];
927 if (!wma_is_vdev_valid(dtim_params->session_id)) {
928 WMA_LOGE("%s: invalid VDEV", __func__);
929 return;
930 }
931 WMA_LOGD("%s: set dtim_period %d", __func__,
932 dtim_params->dtim_period);
933 iface->dtimPeriod = dtim_params->dtim_period;
934
935}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800936
937/**
938 * wma_process_cli_set_cmd() - set parameters to fw
939 * @wma: wma handle
940 * @privcmd: command
941 *
942 * Return: none
943 */
944static void wma_process_cli_set_cmd(tp_wma_handle wma,
945 wma_cli_set_cmd_t *privcmd)
946{
Govind Singhd76a5b02016-03-08 15:12:14 +0530947 int vid = privcmd->param_vdev_id, pps_val = 0;
948 QDF_STATUS ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800949 struct wma_txrx_node *intr = wma->interfaces;
Jeff Johnson9f18aa72018-12-02 12:05:12 -0800950 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800951 struct qpower_params *qparams = &intr[vid].config.qpower_params;
Govind Singhd76a5b02016-03-08 15:12:14 +0530952 struct pdev_params pdev_param;
Leo Chang96464902016-10-28 11:10:54 -0700953 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Arunk Khandavalli2462f462018-01-25 14:41:02 +0530954 struct target_psoc_info *tgt_hdl;
Kiran Kumar Lokere9f881ae2018-03-07 18:59:30 -0800955 struct sir_set_tx_rx_aggregation_size aggr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800956
Jeff Johnsonadba3962017-09-18 08:12:35 -0700957 WMA_LOGD("wmihandle %pK", wma->wmi_handle);
Arif Hussain0e246802018-05-01 18:13:44 -0700958 qdf_mem_zero(&aggr, sizeof(aggr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800959
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -0700960 if (!mac) {
Jeff Johnsonfe8dc692018-11-22 08:45:13 -0800961 WMA_LOGE("%s: Failed to get mac", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800962 return;
963 }
964
Arunk Khandavalli2462f462018-01-25 14:41:02 +0530965 tgt_hdl = wlan_psoc_get_tgt_if_handle(wma->psoc);
966 if (!tgt_hdl) {
967 WMA_LOGE("%s: target psoc info is NULL", __func__);
968 return;
969 }
970
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800971 if (privcmd->param_id >= WMI_CMDID_MAX) {
972 /*
973 * This configuration setting is not done using any wmi
974 * command, call appropriate handler.
975 */
976 if (wma_set_priv_cfg(wma, privcmd))
977 WMA_LOGE("Failed to set wma priv congiuration");
978 return;
979 }
980
981 switch (privcmd->param_vp_dev) {
982 case VDEV_CMD:
Pragaspathi Thilagarajf81a8f02018-08-15 21:44:07 +0530983 if (!wma_is_vdev_valid(privcmd->param_vdev_id)) {
Bhargav Shaha89d3b42016-04-20 13:04:56 +0530984 WMA_LOGE("%s Vdev id is not valid", __func__);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700985 return;
Bhargav Shaha89d3b42016-04-20 13:04:56 +0530986 }
987
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800988 WMA_LOGD("vdev id %d pid %d pval %d", privcmd->param_vdev_id,
989 privcmd->param_id, privcmd->param_value);
Govind Singhd76a5b02016-03-08 15:12:14 +0530990 ret = wma_vdev_set_param(wma->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800991 privcmd->param_vdev_id,
992 privcmd->param_id,
993 privcmd->param_value);
Govind Singhd76a5b02016-03-08 15:12:14 +0530994 if (QDF_IS_STATUS_ERROR(ret)) {
995 WMA_LOGE("wma_vdev_set_param failed ret %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800996 ret);
997 return;
998 }
999 break;
1000 case PDEV_CMD:
1001 WMA_LOGD("pdev pid %d pval %d", privcmd->param_id,
1002 privcmd->param_value);
1003 if ((privcmd->param_id == WMI_PDEV_PARAM_RX_CHAIN_MASK) ||
1004 (privcmd->param_id == WMI_PDEV_PARAM_TX_CHAIN_MASK)) {
Jiachao Wu08719b02017-07-05 13:05:34 +08001005 if (QDF_STATUS_SUCCESS !=
1006 wma_check_txrx_chainmask(
Arunk Khandavalli2462f462018-01-25 14:41:02 +05301007 target_if_get_num_rf_chains(tgt_hdl),
Jiachao Wu08719b02017-07-05 13:05:34 +08001008 privcmd->param_value)) {
1009 WMA_LOGD("Chainmask value is invalid");
1010 return;
1011 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001012 }
Govind Singhd76a5b02016-03-08 15:12:14 +05301013 pdev_param.param_id = privcmd->param_id;
1014 pdev_param.param_value = privcmd->param_value;
1015 ret = wmi_unified_pdev_param_send(wma->wmi_handle,
1016 &pdev_param,
1017 WMA_WILDCARD_PDEV_ID);
1018 if (QDF_IS_STATUS_ERROR(ret)) {
1019 WMA_LOGE("wma_vdev_set_param failed ret %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001020 ret);
1021 return;
1022 }
1023 break;
1024 case GEN_CMD:
1025 {
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08001026 struct cdp_vdev *vdev = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001027 struct wma_txrx_node *intr = wma->interfaces;
1028
1029 vdev = wma_find_vdev_by_id(wma, privcmd->param_vdev_id);
1030 if (!vdev) {
1031 WMA_LOGE("%s:Invalid vdev handle", __func__);
1032 return;
1033 }
1034
1035 WMA_LOGD("gen pid %d pval %d", privcmd->param_id,
1036 privcmd->param_value);
1037
1038 switch (privcmd->param_id) {
Arif Hussain0e246802018-05-01 18:13:44 -07001039 case GEN_VDEV_PARAM_AMSDU:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001040 case GEN_VDEV_PARAM_AMPDU:
Lin Baic1351142018-05-17 11:50:01 +08001041 if (!soc) {
1042 WMA_LOGE("%s:SOC context is NULL", __func__);
1043 return;
1044 }
1045
1046 if (privcmd->param_id == GEN_VDEV_PARAM_AMPDU) {
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05301047 ret = cdp_aggr_cfg(soc, vdev,
1048 privcmd->param_value, 0);
1049 if (ret)
1050 WMA_LOGE("cdp_aggr_cfg set ampdu failed ret %d",
1051 ret);
1052 else
1053 intr[privcmd->param_vdev_id].config.
1054 ampdu = privcmd->param_value;
Arif Hussain0e246802018-05-01 18:13:44 -07001055
Lin Baic1351142018-05-17 11:50:01 +08001056 aggr.aggr_type =
1057 WMI_VDEV_CUSTOM_AGGR_TYPE_AMPDU;
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05301058 } else {
Lin Baic1351142018-05-17 11:50:01 +08001059 aggr.aggr_type =
1060 WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU;
1061 }
1062
1063 aggr.vdev_id = vid;
1064 aggr.tx_aggregation_size = privcmd->param_value;
1065 aggr.rx_aggregation_size = privcmd->param_value;
1066
1067 ret = wma_set_tx_rx_aggregation_size(&aggr);
1068 if (QDF_IS_STATUS_ERROR(ret)) {
1069 WMA_LOGE("set_aggr_size failed ret %d", ret);
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05301070 return;
1071 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001072 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001073 case GEN_PARAM_CRASH_INJECT:
Rajeev Kumar0a9901b2015-12-15 15:59:19 -08001074 if (QDF_GLOBAL_FTM_MODE == cds_get_conparam())
1075 WMA_LOGE("Crash inject not allowed in FTM mode");
1076 else
1077 ret = wma_crash_inject(wma,
1078 privcmd->param_value,
1079 privcmd->param_sec_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001080 break;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07001081 case GEN_PARAM_CAPTURE_TSF:
1082 ret = wma_capture_tsf(wma, privcmd->param_value);
1083 break;
1084 case GEN_PARAM_RESET_TSF_GPIO:
1085 ret = wma_reset_tsf_gpio(wma, privcmd->param_value);
1086 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001087 default:
1088 WMA_LOGE("Invalid param id 0x%x",
1089 privcmd->param_id);
1090 break;
1091 }
1092 break;
1093 }
1094 case DBG_CMD:
1095 WMA_LOGD("dbg pid %d pval %d", privcmd->param_id,
1096 privcmd->param_value);
1097 switch (privcmd->param_id) {
1098 case WMI_DBGLOG_LOG_LEVEL:
1099 ret = dbglog_set_log_lvl(wma->wmi_handle,
1100 privcmd->param_value);
1101 if (ret)
1102 WMA_LOGE("dbglog_set_log_lvl failed ret %d",
1103 ret);
1104 break;
1105 case WMI_DBGLOG_VAP_ENABLE:
1106 ret = dbglog_vap_log_enable(wma->wmi_handle,
1107 privcmd->param_value, true);
1108 if (ret)
1109 WMA_LOGE("dbglog_vap_log_enable failed ret %d",
1110 ret);
1111 break;
1112 case WMI_DBGLOG_VAP_DISABLE:
1113 ret = dbglog_vap_log_enable(wma->wmi_handle,
1114 privcmd->param_value, false);
1115 if (ret)
1116 WMA_LOGE("dbglog_vap_log_enable failed ret %d",
1117 ret);
1118 break;
1119 case WMI_DBGLOG_MODULE_ENABLE:
1120 ret = dbglog_module_log_enable(wma->wmi_handle,
1121 privcmd->param_value, true);
1122 if (ret)
1123 WMA_LOGE("dbglog_module_log_enable failed ret %d",
1124 ret);
1125 break;
1126 case WMI_DBGLOG_MODULE_DISABLE:
1127 ret = dbglog_module_log_enable(wma->wmi_handle,
1128 privcmd->param_value, false);
1129 if (ret)
1130 WMA_LOGE("dbglog_module_log_enable failed ret %d",
1131 ret);
1132 break;
1133 case WMI_DBGLOG_MOD_LOG_LEVEL:
1134 ret = dbglog_set_mod_log_lvl(wma->wmi_handle,
1135 privcmd->param_value);
1136 if (ret)
1137 WMA_LOGE("dbglog_module_log_enable failed ret %d",
1138 ret);
1139 break;
1140 case WMI_DBGLOG_TYPE:
1141 ret = dbglog_parser_type_init(wma->wmi_handle,
1142 privcmd->param_value);
1143 if (ret)
1144 WMA_LOGE("dbglog_parser_type_init failed ret %d",
1145 ret);
1146 break;
1147 case WMI_DBGLOG_REPORT_ENABLE:
1148 ret = dbglog_report_enable(wma->wmi_handle,
1149 privcmd->param_value);
1150 if (ret)
1151 WMA_LOGE("dbglog_report_enable failed ret %d",
1152 ret);
1153 break;
Govind Singha471e5e2015-10-12 17:11:14 +05301154 case WMI_WLAN_PROFILE_TRIGGER_CMDID:
Govind Singhf25a0f12016-03-08 16:09:48 +05301155 ret = wma_unified_fw_profiling_cmd(wma->wmi_handle,
Govind Singha471e5e2015-10-12 17:11:14 +05301156 WMI_WLAN_PROFILE_TRIGGER_CMDID,
1157 privcmd->param_value, 0);
1158 if (ret)
1159 WMA_LOGE("Profile cmd failed for %d ret %d",
1160 WMI_WLAN_PROFILE_TRIGGER_CMDID, ret);
1161 break;
1162 case WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID:
Govind Singhf25a0f12016-03-08 16:09:48 +05301163 ret = wma_unified_fw_profiling_cmd(wma->wmi_handle,
Govind Singha471e5e2015-10-12 17:11:14 +05301164 WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
1165 privcmd->param_value,
1166 privcmd->param_sec_value);
1167 if (ret)
1168 WMA_LOGE("Profile cmd failed for %d ret %d",
1169 WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
1170 ret);
1171 break;
1172 case WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID:
Govind Singhf25a0f12016-03-08 16:09:48 +05301173 ret = wma_unified_fw_profiling_cmd(wma->wmi_handle,
Govind Singha471e5e2015-10-12 17:11:14 +05301174 WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
1175 privcmd->param_value,
1176 privcmd->param_sec_value);
1177 if (ret)
1178 WMA_LOGE("Profile cmd failed for %d ret %d",
1179 WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
1180 ret);
1181 break;
1182 case WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID:
Govind Singhf25a0f12016-03-08 16:09:48 +05301183 ret = wma_unified_fw_profiling_cmd(wma->wmi_handle,
Govind Singha471e5e2015-10-12 17:11:14 +05301184 WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
1185 0, 0);
1186 if (ret)
1187 WMA_LOGE("Profile cmd failed for %d ret %d",
1188 WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
1189 ret);
1190 break;
1191 case WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID:
Govind Singhf25a0f12016-03-08 16:09:48 +05301192 ret = wma_unified_fw_profiling_cmd(wma->wmi_handle,
Govind Singha471e5e2015-10-12 17:11:14 +05301193 WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
1194 0, 0);
1195 if (ret)
1196 WMA_LOGE("Profile cmd failed for %d ret %d",
1197 WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
1198 ret);
1199 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001200 case WMI_PDEV_GREEN_AP_PS_ENABLE_CMDID:
1201 /* Set the Green AP */
Govind Singhd76a5b02016-03-08 15:12:14 +05301202 ret = wmi_unified_green_ap_ps_send
1203 (wma->wmi_handle, privcmd->param_value,
1204 WMA_WILDCARD_PDEV_ID);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001205 if (ret) {
1206 WMA_LOGE("Set GreenAP Failed val %d",
1207 privcmd->param_value);
1208 }
1209 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001210
1211 default:
1212 WMA_LOGE("Invalid param id 0x%x", privcmd->param_id);
1213 break;
1214 }
1215 break;
1216 case PPS_CMD:
1217 WMA_LOGD("dbg pid %d pval %d", privcmd->param_id,
1218 privcmd->param_value);
1219 switch (privcmd->param_id) {
1220
1221 case WMI_VDEV_PPS_PAID_MATCH:
1222 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1223 (PKT_PWR_SAVE_PAID_MATCH & 0xffff);
1224 intr[vid].config.pps_params.paid_match_enable =
1225 privcmd->param_value;
1226 break;
1227 case WMI_VDEV_PPS_GID_MATCH:
1228 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1229 (PKT_PWR_SAVE_GID_MATCH & 0xffff);
1230 intr[vid].config.pps_params.gid_match_enable =
1231 privcmd->param_value;
1232 break;
1233 case WMI_VDEV_PPS_EARLY_TIM_CLEAR:
1234 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1235 (PKT_PWR_SAVE_EARLY_TIM_CLEAR & 0xffff);
1236 intr[vid].config.pps_params.tim_clear =
1237 privcmd->param_value;
1238 break;
1239 case WMI_VDEV_PPS_EARLY_DTIM_CLEAR:
1240 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1241 (PKT_PWR_SAVE_EARLY_DTIM_CLEAR & 0xffff);
1242 intr[vid].config.pps_params.dtim_clear =
1243 privcmd->param_value;
1244 break;
1245 case WMI_VDEV_PPS_EOF_PAD_DELIM:
1246 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1247 (PKT_PWR_SAVE_EOF_PAD_DELIM & 0xffff);
1248 intr[vid].config.pps_params.eof_delim =
1249 privcmd->param_value;
1250 break;
1251 case WMI_VDEV_PPS_MACADDR_MISMATCH:
1252 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1253 (PKT_PWR_SAVE_MACADDR_MISMATCH & 0xffff);
1254 intr[vid].config.pps_params.mac_match =
1255 privcmd->param_value;
1256 break;
1257 case WMI_VDEV_PPS_DELIM_CRC_FAIL:
1258 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1259 (PKT_PWR_SAVE_DELIM_CRC_FAIL & 0xffff);
1260 intr[vid].config.pps_params.delim_fail =
1261 privcmd->param_value;
1262 break;
1263 case WMI_VDEV_PPS_GID_NSTS_ZERO:
1264 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1265 (PKT_PWR_SAVE_GID_NSTS_ZERO & 0xffff);
1266 intr[vid].config.pps_params.nsts_zero =
1267 privcmd->param_value;
1268 break;
1269 case WMI_VDEV_PPS_RSSI_CHECK:
1270 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1271 (PKT_PWR_SAVE_RSSI_CHECK & 0xffff);
1272 intr[vid].config.pps_params.rssi_chk =
1273 privcmd->param_value;
1274 break;
1275 case WMI_VDEV_PPS_5G_EBT:
1276 pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1277 (PKT_PWR_SAVE_5G_EBT & 0xffff);
1278 intr[vid].config.pps_params.ebt_5g =
1279 privcmd->param_value;
1280 break;
1281 default:
1282 WMA_LOGE("Invalid param id 0x%x", privcmd->param_id);
1283 break;
1284 }
1285 break;
1286
1287 case QPOWER_CMD:
1288 WMA_LOGD("QPOWER CLI CMD pid %d pval %d", privcmd->param_id,
1289 privcmd->param_value);
1290 switch (privcmd->param_id) {
1291 case WMI_STA_PS_PARAM_QPOWER_PSPOLL_COUNT:
1292 WMA_LOGD("QPOWER CLI CMD:Ps Poll Cnt val %d",
1293 privcmd->param_value);
1294 /* Set the QPower Ps Poll Count */
Govind Singhd76a5b02016-03-08 15:12:14 +05301295 ret = wma_unified_set_sta_ps_param(wma->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001296 vid, WMI_STA_PS_PARAM_QPOWER_PSPOLL_COUNT,
1297 privcmd->param_value);
1298 if (ret) {
1299 WMA_LOGE("Set Q-PsPollCnt Failed vdevId %d val %d",
1300 vid, privcmd->param_value);
1301 } else {
1302 qparams->max_ps_poll_cnt = privcmd->param_value;
1303 }
1304 break;
1305 case WMI_STA_PS_PARAM_QPOWER_MAX_TX_BEFORE_WAKE:
1306 WMA_LOGD("QPOWER CLI CMD:Max Tx Before wake val %d",
1307 privcmd->param_value);
1308 /* Set the QPower Max Tx Before Wake */
Govind Singhd76a5b02016-03-08 15:12:14 +05301309 ret = wma_unified_set_sta_ps_param(wma->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001310 vid, WMI_STA_PS_PARAM_QPOWER_MAX_TX_BEFORE_WAKE,
1311 privcmd->param_value);
1312 if (ret) {
1313 WMA_LOGE("Set Q-MaxTxBefWake Failed vId %d val %d",
1314 vid, privcmd->param_value);
1315 } else {
1316 qparams->max_tx_before_wake =
1317 privcmd->param_value;
1318 }
1319 break;
1320 case WMI_STA_PS_PARAM_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL:
1321 WMA_LOGD("QPOWER CLI CMD:Ps Poll Wake Inv val %d",
1322 privcmd->param_value);
1323 /* Set the QPower Spec Ps Poll Wake Inv */
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001324 ret = wma_unified_set_sta_ps_param(wma->wmi_handle, vid,
1325 WMI_STA_PS_PARAM_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001326 privcmd->param_value);
1327 if (ret) {
1328 WMA_LOGE("Set Q-PsPoll WakeIntv Failed vId %d val %d",
1329 vid, privcmd->param_value);
1330 } else {
1331 qparams->spec_ps_poll_wake_interval =
1332 privcmd->param_value;
1333 }
1334 break;
1335 case WMI_STA_PS_PARAM_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL:
1336 WMA_LOGD("QPOWER CLI CMD:Spec NoData Ps Poll val %d",
1337 privcmd->param_value);
1338 /* Set the QPower Spec NoData PsPoll */
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001339 ret = wma_unified_set_sta_ps_param(wma->wmi_handle, vid,
1340 WMI_STA_PS_PARAM_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001341 privcmd->param_value);
1342 if (ret) {
1343 WMA_LOGE("Set Q-SpecNoDataPsPoll Failed vId %d val %d",
1344 vid, privcmd->param_value);
1345 } else {
1346 qparams->max_spec_nodata_ps_poll =
1347 privcmd->param_value;
1348 }
1349 break;
1350
1351 default:
1352 WMA_LOGE("Invalid param id 0x%x", privcmd->param_id);
1353 break;
1354 }
1355 break;
1356 case GTX_CMD:
1357 WMA_LOGD("vdev id %d pid %d pval %d", privcmd->param_vdev_id,
1358 privcmd->param_id, privcmd->param_value);
1359 switch (privcmd->param_id) {
1360 case WMI_VDEV_PARAM_GTX_HT_MCS:
1361 intr[vid].config.gtx_info.gtxRTMask[0] =
1362 privcmd->param_value;
1363 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1364 privcmd->param_vdev_id,
1365 &intr[vid].config.gtx_info);
1366 break;
1367 case WMI_VDEV_PARAM_GTX_VHT_MCS:
1368 intr[vid].config.gtx_info.gtxRTMask[1] =
1369 privcmd->param_value;
1370 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1371 privcmd->param_vdev_id,
1372 &intr[vid].config.gtx_info);
1373 break;
1374
1375 case WMI_VDEV_PARAM_GTX_USR_CFG:
1376 intr[vid].config.gtx_info.gtxUsrcfg =
1377 privcmd->param_value;
1378 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1379 privcmd->param_vdev_id,
1380 &intr[vid].config.gtx_info);
1381 break;
1382
1383 case WMI_VDEV_PARAM_GTX_THRE:
1384 intr[vid].config.gtx_info.gtxPERThreshold =
1385 privcmd->param_value;
1386 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1387 privcmd->param_vdev_id,
1388 &intr[vid].config.gtx_info);
1389 break;
1390
1391 case WMI_VDEV_PARAM_GTX_MARGIN:
1392 intr[vid].config.gtx_info.gtxPERMargin =
1393 privcmd->param_value;
1394 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1395 privcmd->param_vdev_id,
1396 &intr[vid].config.gtx_info);
1397 break;
1398
1399 case WMI_VDEV_PARAM_GTX_STEP:
1400 intr[vid].config.gtx_info.gtxTPCstep =
1401 privcmd->param_value;
1402 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1403 privcmd->param_vdev_id,
1404 &intr[vid].config.gtx_info);
1405 break;
1406
1407 case WMI_VDEV_PARAM_GTX_MINTPC:
1408 intr[vid].config.gtx_info.gtxTPCMin =
1409 privcmd->param_value;
1410 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1411 privcmd->param_vdev_id,
1412 &intr[vid].config.gtx_info);
1413 break;
1414
1415 case WMI_VDEV_PARAM_GTX_BW_MASK:
1416 intr[vid].config.gtx_info.gtxBWMask =
1417 privcmd->param_value;
1418 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1419 privcmd->param_vdev_id,
1420 &intr[vid].config.gtx_info);
1421 if (ret) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001422 WMA_LOGE("wma_vdev_set_param failed ret %d",
1423 ret);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001424 return;
1425 }
1426 break;
1427 default:
1428 break;
1429 }
1430 break;
1431
1432 default:
1433 WMA_LOGE("Invalid vpdev command id");
1434 }
1435 if (1 == privcmd->param_vp_dev) {
1436 switch (privcmd->param_id) {
1437 case WMI_VDEV_PARAM_NSS:
1438 intr[vid].config.nss = privcmd->param_value;
1439 break;
1440 case WMI_VDEV_PARAM_LDPC:
1441 intr[vid].config.ldpc = privcmd->param_value;
1442 break;
1443 case WMI_VDEV_PARAM_TX_STBC:
1444 intr[vid].config.tx_stbc = privcmd->param_value;
1445 break;
1446 case WMI_VDEV_PARAM_RX_STBC:
1447 intr[vid].config.rx_stbc = privcmd->param_value;
1448 break;
1449 case WMI_VDEV_PARAM_SGI:
1450 intr[vid].config.shortgi = privcmd->param_value;
1451 break;
1452 case WMI_VDEV_PARAM_ENABLE_RTSCTS:
1453 intr[vid].config.rtscts_en = privcmd->param_value;
1454 break;
1455 case WMI_VDEV_PARAM_CHWIDTH:
1456 intr[vid].config.chwidth = privcmd->param_value;
1457 break;
1458 case WMI_VDEV_PARAM_FIXED_RATE:
1459 intr[vid].config.tx_rate = privcmd->param_value;
1460 break;
1461 case WMI_VDEV_PARAM_EARLY_RX_ADJUST_ENABLE:
1462 intr[vid].config.erx_adjust = privcmd->param_value;
1463 break;
1464 case WMI_VDEV_PARAM_EARLY_RX_TGT_BMISS_NUM:
1465 intr[vid].config.erx_bmiss_num = privcmd->param_value;
1466 break;
1467 case WMI_VDEV_PARAM_EARLY_RX_BMISS_SAMPLE_CYCLE:
1468 intr[vid].config.erx_bmiss_cycle = privcmd->param_value;
1469 break;
1470 case WMI_VDEV_PARAM_EARLY_RX_SLOP_STEP:
1471 intr[vid].config.erx_slop_step = privcmd->param_value;
1472 break;
1473 case WMI_VDEV_PARAM_EARLY_RX_INIT_SLOP:
1474 intr[vid].config.erx_init_slop = privcmd->param_value;
1475 break;
1476 case WMI_VDEV_PARAM_EARLY_RX_ADJUST_PAUSE:
1477 intr[vid].config.erx_adj_pause = privcmd->param_value;
1478 break;
1479 case WMI_VDEV_PARAM_EARLY_RX_DRIFT_SAMPLE:
1480 intr[vid].config.erx_dri_sample = privcmd->param_value;
1481 break;
Krishna Kumaar Natarajan1a71ec72017-03-23 12:26:31 -07001482 case WMI_VDEV_PARAM_HE_DCM:
Krishna Kumaar Natarajan150cd012017-03-23 12:29:10 -07001483 case WMI_VDEV_PARAM_HE_RANGE_EXT:
Krishna Kumaar Natarajan1a71ec72017-03-23 12:26:31 -07001484 wma_set_he_vdev_param(&intr[vid], privcmd->param_id,
1485 privcmd->param_value);
1486 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001487 default:
Yeshwanth Sriram Guntukacbe61442018-08-23 18:08:44 +05301488 WMA_LOGD("Invalid wma_cli_set vdev command/Not yet implemented 0x%x",
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001489 privcmd->param_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001490 break;
1491 }
1492 } else if (2 == privcmd->param_vp_dev) {
1493 switch (privcmd->param_id) {
1494 case WMI_PDEV_PARAM_ANI_ENABLE:
1495 wma->pdevconfig.ani_enable = privcmd->param_value;
1496 break;
1497 case WMI_PDEV_PARAM_ANI_POLL_PERIOD:
1498 wma->pdevconfig.ani_poll_len = privcmd->param_value;
1499 break;
1500 case WMI_PDEV_PARAM_ANI_LISTEN_PERIOD:
1501 wma->pdevconfig.ani_listen_len = privcmd->param_value;
1502 break;
1503 case WMI_PDEV_PARAM_ANI_OFDM_LEVEL:
1504 wma->pdevconfig.ani_ofdm_level = privcmd->param_value;
1505 break;
1506 case WMI_PDEV_PARAM_ANI_CCK_LEVEL:
1507 wma->pdevconfig.ani_cck_level = privcmd->param_value;
1508 break;
1509 case WMI_PDEV_PARAM_DYNAMIC_BW:
1510 wma->pdevconfig.cwmenable = privcmd->param_value;
1511 break;
1512 case WMI_PDEV_PARAM_CTS_CBW:
1513 wma->pdevconfig.cts_cbw = privcmd->param_value;
1514 break;
1515 case WMI_PDEV_PARAM_TX_CHAIN_MASK:
1516 wma->pdevconfig.txchainmask = privcmd->param_value;
1517 break;
1518 case WMI_PDEV_PARAM_RX_CHAIN_MASK:
1519 wma->pdevconfig.rxchainmask = privcmd->param_value;
1520 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001521 case WMI_PDEV_PARAM_TXPOWER_LIMIT2G:
1522 wma->pdevconfig.txpow2g = privcmd->param_value;
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08001523 if ((mac->mlme_cfg->gen.band_capability ==
Varun Reddy Yeturua48bc412017-11-17 15:33:35 -08001524 BAND_ALL) ||
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08001525 (mac->mlme_cfg->gen.band_capability ==
Wu Gao5f764082019-01-04 15:54:38 +08001526 BAND_2G))
1527 mac->mlme_cfg->power.current_tx_power_level =
1528 (uint8_t)privcmd->param_value;
1529 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001530 WMA_LOGE("Current band is not 2G");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001531 break;
1532 case WMI_PDEV_PARAM_TXPOWER_LIMIT5G:
1533 wma->pdevconfig.txpow5g = privcmd->param_value;
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08001534 if ((mac->mlme_cfg->gen.band_capability ==
Varun Reddy Yeturua48bc412017-11-17 15:33:35 -08001535 BAND_ALL) ||
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08001536 (mac->mlme_cfg->gen.band_capability ==
Wu Gao5f764082019-01-04 15:54:38 +08001537 BAND_5G))
1538 mac->mlme_cfg->power.current_tx_power_level =
1539 (uint8_t)privcmd->param_value;
1540 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001541 WMA_LOGE("Current band is not 5G");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001542 break;
1543 default:
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07001544 WMA_LOGD("Invalid wma_cli_set pdev command/Not yet implemented 0x%x",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001545 privcmd->param_id);
1546 break;
1547 }
1548 } else if (5 == privcmd->param_vp_dev) {
Govind Singhd76a5b02016-03-08 15:12:14 +05301549 ret = wma_vdev_set_param(wma->wmi_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001550 privcmd->param_vdev_id,
1551 WMI_VDEV_PARAM_PACKET_POWERSAVE,
1552 pps_val);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001553 if (ret)
1554 WMA_LOGE("Failed to send wmi packet power save cmd");
1555 else
1556 WMA_LOGD("Sent packet power save cmd %d value %x to target",
1557 privcmd->param_id, pps_val);
1558 }
1559}
1560
Dustin Brown05557182017-10-12 14:44:49 -07001561uint32_t wma_critical_events_in_flight(void)
1562{
1563 t_wma_handle *wma;
1564
1565 wma = cds_get_context(QDF_MODULE_ID_WMA);
1566 if (!wma)
1567 return 0;
1568
1569 return qdf_atomic_read(&wma->critical_events_in_flight);
1570}
1571
1572static bool wma_event_is_critical(uint32_t event_id)
1573{
1574 switch (event_id) {
1575 case WMI_ROAM_SYNCH_EVENTID:
1576 return true;
1577 default:
1578 return false;
1579 }
1580}
1581
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001582/**
1583 * wma_process_fw_event() - process any fw event
1584 * @wma: wma handle
1585 * @buf: fw event buffer
1586 *
1587 * This function process any fw event to serialize it through mc thread.
1588 *
1589 * Return: none
1590 */
1591static int wma_process_fw_event(tp_wma_handle wma,
1592 wma_process_fw_event_params *buf)
1593{
1594 struct wmi_unified *wmi_handle = (struct wmi_unified *)buf->wmi_handle;
Dustin Brown05557182017-10-12 14:44:49 -07001595 uint32_t event_id = WMI_GET_FIELD(qdf_nbuf_data(buf->evt_buf),
1596 WMI_CMD_HDR, COMMANDID);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001597
1598 wmi_process_fw_event(wmi_handle, buf->evt_buf);
Dustin Brown05557182017-10-12 14:44:49 -07001599
1600 if (wma_event_is_critical(event_id))
1601 qdf_atomic_dec(&wma->critical_events_in_flight);
1602
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001603 return 0;
1604}
1605
1606/**
Govind Singhd76a5b02016-03-08 15:12:14 +05301607 * wmi_process_fw_event_tasklet_ctx() - process in tasklet context
1608 * @ctx: handle to wmi
1609 * @ev: wmi event buffer
1610 *
1611 * Event process by below function will be in tasket context,
1612 * need to use this method only for time sensitive functions.
1613 *
1614 * Return: none
1615 */
1616static int wma_process_fw_event_tasklet_ctx(void *ctx, void *ev)
1617{
1618 wmi_process_fw_event(ctx, ev);
1619
1620 return 0;
1621}
1622
1623/**
Manjeet Singhf82ed072016-07-08 11:40:00 +05301624 * wma_process_hal_pwr_dbg_cmd() - send hal pwr dbg cmd to fw.
1625 * @handle: wma handle
1626 * @sir_pwr_dbg_params: unit test command
1627 *
1628 * This function send unit test command to fw.
1629 *
1630 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_** on error
1631 */
1632QDF_STATUS wma_process_hal_pwr_dbg_cmd(WMA_HANDLE handle,
1633 struct sir_mac_pwr_dbg_cmd *
1634 sir_pwr_dbg_params)
1635{
1636 tp_wma_handle wma_handle = (tp_wma_handle)handle;
1637 int i;
1638 struct wmi_power_dbg_params wmi_pwr_dbg_params;
1639 QDF_STATUS status;
1640
1641 if (!sir_pwr_dbg_params) {
1642 WMA_LOGE("%s: sir_pwr_dbg_params is null", __func__);
1643 return QDF_STATUS_E_INVAL;
1644 }
1645 wmi_pwr_dbg_params.module_id = sir_pwr_dbg_params->module_id;
1646 wmi_pwr_dbg_params.pdev_id = sir_pwr_dbg_params->pdev_id;
1647 wmi_pwr_dbg_params.num_args = sir_pwr_dbg_params->num_args;
1648
1649 for (i = 0; i < wmi_pwr_dbg_params.num_args; i++)
1650 wmi_pwr_dbg_params.args[i] = sir_pwr_dbg_params->args[i];
1651
1652 status = wmi_unified_send_power_dbg_cmd(wma_handle->wmi_handle,
1653 &wmi_pwr_dbg_params);
1654
1655 return status;
1656}
1657
Houston Hoffmanb6084f12017-05-30 19:24:07 -07001658static void wma_discard_fw_event(struct scheduler_msg *msg)
1659{
Will Huang9323e852018-02-02 17:55:15 +08001660 if (!msg->bodyptr)
1661 return;
1662
Houston Hoffmanb6084f12017-05-30 19:24:07 -07001663 switch (msg->type) {
1664 case WMA_PROCESS_FW_EVENT:
1665 qdf_nbuf_free(((wma_process_fw_event_params *)msg->bodyptr)
1666 ->evt_buf);
1667 break;
Abhishek Singhcaf6a652017-07-06 17:35:42 +05301668 case WMA_SET_LINK_STATE:
1669 qdf_mem_free(((tpLinkStateParams) msg->bodyptr)->callbackArg);
1670 break;
Houston Hoffmanb6084f12017-05-30 19:24:07 -07001671 }
Will Huang9323e852018-02-02 17:55:15 +08001672
1673 qdf_mem_free(msg->bodyptr);
Houston Hoffmanb6084f12017-05-30 19:24:07 -07001674 msg->bodyptr = NULL;
1675 msg->bodyval = 0;
1676 msg->type = 0;
1677}
1678
gaurank kathpalia748c7272018-10-24 22:05:15 +05301679QDF_STATUS
1680wma_vdev_nss_chain_params_send(uint8_t vdev_id,
1681 struct wlan_mlme_nss_chains *user_cfg)
1682{
1683 tp_wma_handle wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
gaurank kathpalia2fc3b892018-11-14 13:48:44 +05301684 struct vdev_nss_chains vdev_user_cfg;
gaurank kathpalia748c7272018-10-24 22:05:15 +05301685 if (!wma_handle) {
1686 WMA_LOGE("%s: wma_handle is NULL", __func__);
1687 return QDF_STATUS_E_FAILURE;
1688 }
1689
gaurank kathpalia2fc3b892018-11-14 13:48:44 +05301690 vdev_user_cfg.disable_rx_mrc[NSS_CHAINS_BAND_2GHZ] =
1691 user_cfg->disable_rx_mrc[NSS_CHAINS_BAND_2GHZ];
1692 vdev_user_cfg.disable_tx_mrc[NSS_CHAINS_BAND_2GHZ] =
1693 user_cfg->disable_tx_mrc[NSS_CHAINS_BAND_2GHZ];
1694 vdev_user_cfg.disable_rx_mrc[NSS_CHAINS_BAND_5GHZ] =
1695 user_cfg->disable_rx_mrc[NSS_CHAINS_BAND_5GHZ];
1696 vdev_user_cfg.disable_tx_mrc[NSS_CHAINS_BAND_5GHZ] =
1697 user_cfg->disable_tx_mrc[NSS_CHAINS_BAND_5GHZ];
1698
1699 vdev_user_cfg.num_rx_chains[NSS_CHAINS_BAND_2GHZ]
1700 = user_cfg->num_rx_chains[NSS_CHAINS_BAND_2GHZ];
1701 vdev_user_cfg.num_tx_chains[NSS_CHAINS_BAND_2GHZ]
1702 = user_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ];
1703 vdev_user_cfg.num_rx_chains[NSS_CHAINS_BAND_5GHZ] =
1704 user_cfg->num_rx_chains[NSS_CHAINS_BAND_5GHZ];
1705 vdev_user_cfg.num_tx_chains[NSS_CHAINS_BAND_5GHZ] =
1706 user_cfg->num_tx_chains[NSS_CHAINS_BAND_5GHZ];
1707
1708 vdev_user_cfg.rx_nss[NSS_CHAINS_BAND_2GHZ] =
1709 user_cfg->rx_nss[NSS_CHAINS_BAND_2GHZ];
1710 vdev_user_cfg.tx_nss[NSS_CHAINS_BAND_2GHZ] =
1711 user_cfg->tx_nss[NSS_CHAINS_BAND_2GHZ];
1712 vdev_user_cfg.rx_nss[NSS_CHAINS_BAND_5GHZ] =
1713 user_cfg->rx_nss[NSS_CHAINS_BAND_5GHZ];
1714 vdev_user_cfg.tx_nss[NSS_CHAINS_BAND_5GHZ] =
1715 user_cfg->tx_nss[NSS_CHAINS_BAND_5GHZ];
1716
1717 vdev_user_cfg.num_tx_chains_11a = user_cfg->num_tx_chains_11a;
1718 vdev_user_cfg.num_tx_chains_11b = user_cfg->num_tx_chains_11b;
1719 vdev_user_cfg.num_tx_chains_11g = user_cfg->num_tx_chains_11g;
1720
gaurank kathpalia748c7272018-10-24 22:05:15 +05301721 return wmi_unified_vdev_nss_chain_params_send(wma_handle->wmi_handle,
1722 vdev_id,
gaurank kathpalia2fc3b892018-11-14 13:48:44 +05301723 &vdev_user_cfg);
gaurank kathpalia748c7272018-10-24 22:05:15 +05301724}
1725
Manjeet Singhf82ed072016-07-08 11:40:00 +05301726/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001727 * wma_process_fw_event_handler() - common event handler to serialize
1728 * event processing through mc_thread
Govind Singhd76a5b02016-03-08 15:12:14 +05301729 * @ctx: wmi context
1730 * @ev: event buffer
1731 * @rx_ctx: rx execution context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001732 *
1733 * Return: 0 on success, errno on failure
1734 */
Govind Singhd76a5b02016-03-08 15:12:14 +05301735static int wma_process_fw_event_mc_thread_ctx(void *ctx, void *ev)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001736{
1737 wma_process_fw_event_params *params_buf;
Rajeev Kumarb60abe42017-01-21 15:39:31 -08001738 struct scheduler_msg cds_msg = { 0 };
Dustin Brown05557182017-10-12 14:44:49 -07001739 tp_wma_handle wma;
1740 uint32_t event_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001741
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301742 params_buf = qdf_mem_malloc(sizeof(wma_process_fw_event_params));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001743 if (!params_buf) {
Govind Singhd76a5b02016-03-08 15:12:14 +05301744 qdf_nbuf_free(ev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001745 return -ENOMEM;
1746 }
1747
Govind Singhd76a5b02016-03-08 15:12:14 +05301748 params_buf->wmi_handle = (struct wmi_unified *)ctx;
Amar Singhal0cb9a5c2018-07-18 12:31:06 -07001749 params_buf->evt_buf = ev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001750
Dustin Brown05557182017-10-12 14:44:49 -07001751 wma = cds_get_context(QDF_MODULE_ID_WMA);
1752 event_id = WMI_GET_FIELD(qdf_nbuf_data(params_buf->evt_buf),
1753 WMI_CMD_HDR, COMMANDID);
1754 if (wma && wma_event_is_critical(event_id))
1755 qdf_atomic_inc(&wma->critical_events_in_flight);
1756
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001757 cds_msg.type = WMA_PROCESS_FW_EVENT;
1758 cds_msg.bodyptr = params_buf;
1759 cds_msg.bodyval = 0;
Houston Hoffmanb6084f12017-05-30 19:24:07 -07001760 cds_msg.flush_callback = wma_discard_fw_event;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001761
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301762 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia00861f02018-08-28 19:16:12 +05301763 scheduler_post_message(QDF_MODULE_ID_WMA,
1764 QDF_MODULE_ID_WMA,
1765 QDF_MODULE_ID_WMA, &cds_msg)) {
Govind Singhd76a5b02016-03-08 15:12:14 +05301766 qdf_nbuf_free(ev);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301767 qdf_mem_free(params_buf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001768 return -EFAULT;
1769 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001770 return 0;
1771
1772}
1773
Harprit Chhabada3f4c0582018-12-26 12:24:53 -08001774int wma_process_fw_event_handler(ol_scn_t scn_handle, void *evt_buf,
1775 uint8_t rx_ctx)
Govind Singhd76a5b02016-03-08 15:12:14 +05301776{
1777 int err = 0;
Harprit Chhabada3f4c0582018-12-26 12:24:53 -08001778 struct wmi_unified *wmi_handle;
Amar Singhal4228c392018-06-26 15:09:58 -07001779 struct wlan_objmgr_psoc *psoc;
1780 struct target_psoc_info *tgt_hdl;
Amar Singhal4228c392018-06-26 15:09:58 -07001781 bool is_wmi_ready = false;
1782
Amar Singhal4228c392018-06-26 15:09:58 -07001783 psoc = target_if_get_psoc_from_scn_hdl(scn_handle);
1784 if (!psoc) {
1785 WMA_LOGE("psoc is null");
1786 return err;
1787 }
1788
Harprit Chhabada3f4c0582018-12-26 12:24:53 -08001789 wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
1790 if (!wmi_handle) {
1791 WMA_LOGE("wmi_handle is null");
1792 return err;
1793 }
1794
Amar Singhal0cb9a5c2018-07-18 12:31:06 -07001795 tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
Amar Singhal4228c392018-06-26 15:09:58 -07001796 if (!tgt_hdl) {
1797 WMA_LOGE("target_psoc_info is null");
1798 return err;
1799 }
1800
1801 is_wmi_ready = target_psoc_get_wmi_ready(tgt_hdl);
1802 if (!is_wmi_ready) {
Amar Singhal0cb9a5c2018-07-18 12:31:06 -07001803 WMA_LOGD("fw event recvd before ready event processed");
1804 WMA_LOGD("therefore use worker thread");
Harprit Chhabada3f4c0582018-12-26 12:24:53 -08001805 wmi_process_fw_event_worker_thread_ctx(wmi_handle, evt_buf);
Amar Singhal4228c392018-06-26 15:09:58 -07001806 return err;
1807 }
Govind Singhd76a5b02016-03-08 15:12:14 +05301808
1809 if (rx_ctx == WMA_RX_SERIALIZER_CTX) {
Harprit Chhabada3f4c0582018-12-26 12:24:53 -08001810 err = wma_process_fw_event_mc_thread_ctx(wmi_handle, evt_buf);
Govind Singhd76a5b02016-03-08 15:12:14 +05301811 } else if (rx_ctx == WMA_RX_TASKLET_CTX) {
Harprit Chhabada3f4c0582018-12-26 12:24:53 -08001812 wma_process_fw_event_tasklet_ctx(wmi_handle, evt_buf);
Govind Singhd76a5b02016-03-08 15:12:14 +05301813 } else {
1814 WMA_LOGE("%s: invalid wmi event execution context", __func__);
Amar Singhal4228c392018-06-26 15:09:58 -07001815 qdf_nbuf_free(evt_buf);
Govind Singhd76a5b02016-03-08 15:12:14 +05301816 }
1817
1818 return err;
1819}
1820
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001821/**
Komal Seelam02d09342016-02-23 18:03:19 +05301822 * wma_init_max_no_of_peers - API to initialize wma configuration params
1823 * @wma_handle: WMA Handle
1824 * @max_peers: Max Peers supported
1825 *
1826 * Return: void
1827 */
Rachit Kankane0106e382018-05-16 18:59:28 +05301828static uint8_t wma_init_max_no_of_peers(tp_wma_handle wma_handle,
Komal Seelam02d09342016-02-23 18:03:19 +05301829 uint16_t max_peers)
1830{
1831 struct wma_ini_config *cfg = wma_get_ini_handle(wma_handle);
Rachit Kankane0106e382018-05-16 18:59:28 +05301832 struct hif_opaque_softc *scn = cds_get_context(QDF_MODULE_ID_HIF);
1833 uint32_t tgt_version = hif_get_target_info_handle(scn)->target_version;
1834 uint8_t max_no_of_peers;
1835 uint8_t max_supported_peers = (tgt_version == AR6320_REV1_1_VERSION) ?
1836 MAX_SUPPORTED_PEERS_REV1_1 : MAX_SUPPORTED_PEERS_REV1_3;
Komal Seelam02d09342016-02-23 18:03:19 +05301837
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07001838 if (!cfg) {
Naveen Rawat35804772016-06-27 15:40:28 -07001839 WMA_LOGE("%s: NULL WMA ini handle", __func__);
Rachit Kankane0106e382018-05-16 18:59:28 +05301840 return 0;
Naveen Rawat35804772016-06-27 15:40:28 -07001841 }
1842
Rachit Kankane0106e382018-05-16 18:59:28 +05301843 max_no_of_peers = (max_peers > max_supported_peers) ?
1844 max_supported_peers : max_peers;
1845 cfg->max_no_of_peers = max_no_of_peers;
1846 return max_no_of_peers;
Komal Seelam02d09342016-02-23 18:03:19 +05301847}
1848
Prashanth Bhattae675ca72016-10-20 18:42:37 -07001849/**
Manikandan Mohanb0932ab2017-02-12 16:30:55 -08001850 * wma_cleanup_vdev_resp_queue() - cleanup vdev response queue
1851 * @wma: wma handle
1852 *
1853 * Return: none
1854 */
1855static void wma_cleanup_vdev_resp_queue(tp_wma_handle wma)
1856{
1857 struct wma_target_req *req_msg = NULL;
1858 qdf_list_node_t *node1 = NULL;
Manikandan Mohanb0932ab2017-02-12 16:30:55 -08001859
1860 qdf_spin_lock_bh(&wma->vdev_respq_lock);
1861 if (!qdf_list_size(&wma->vdev_resp_queue)) {
1862 qdf_spin_unlock_bh(&wma->vdev_respq_lock);
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08001863 WMA_LOGD(FL("request queue maybe empty"));
Manikandan Mohanb0932ab2017-02-12 16:30:55 -08001864 return;
1865 }
1866
Sandeep Puligilla5ac6bd22017-10-17 12:33:56 -07001867 WMA_LOGD(FL("Cleaning up vdev resp queue"));
1868
Wu Gao30f65eb2017-08-09 19:56:10 +08001869 /* peek front, and then cleanup it in wma_vdev_resp_timer */
1870 while (qdf_list_peek_front(&wma->vdev_resp_queue, &node1) ==
Manikandan Mohanb0932ab2017-02-12 16:30:55 -08001871 QDF_STATUS_SUCCESS) {
1872 req_msg = qdf_container_of(node1, struct wma_target_req, node);
Manikandan Mohanb0932ab2017-02-12 16:30:55 -08001873 qdf_spin_unlock_bh(&wma->vdev_respq_lock);
Abhishek Singhc614ec42017-04-25 16:17:34 +05301874 qdf_mc_timer_stop(&req_msg->event_timeout);
1875 wma_vdev_resp_timer(req_msg);
Manikandan Mohanb0932ab2017-02-12 16:30:55 -08001876 qdf_spin_lock_bh(&wma->vdev_respq_lock);
1877 }
1878 qdf_spin_unlock_bh(&wma->vdev_respq_lock);
1879}
1880
1881/**
Abhishek Singhc614ec42017-04-25 16:17:34 +05301882 * wma_cleanup_hold_req() - cleanup hold request queue
1883 * @wma: wma handle
1884 *
1885 * Return: none
1886 */
1887static void wma_cleanup_hold_req(tp_wma_handle wma)
1888{
1889 struct wma_target_req *req_msg = NULL;
1890 qdf_list_node_t *node1 = NULL;
1891
1892 qdf_spin_lock_bh(&wma->wma_hold_req_q_lock);
1893 if (!qdf_list_size(&wma->wma_hold_req_queue)) {
1894 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
1895 WMA_LOGD(FL("request queue is empty"));
1896 return;
1897 }
1898
Wu Gao30f65eb2017-08-09 19:56:10 +08001899 /* peek front, and then cleanup it in wma_hold_req_timer */
Abhishek Singhc614ec42017-04-25 16:17:34 +05301900 while (QDF_STATUS_SUCCESS ==
Wu Gao30f65eb2017-08-09 19:56:10 +08001901 qdf_list_peek_front(&wma->wma_hold_req_queue, &node1)) {
Abhishek Singhc614ec42017-04-25 16:17:34 +05301902 req_msg = qdf_container_of(node1, struct wma_target_req, node);
1903 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
1904 /* Cleanup timeout handler */
1905 qdf_mc_timer_stop(&req_msg->event_timeout);
Abhishek Singhc614ec42017-04-25 16:17:34 +05301906 wma_hold_req_timer(req_msg);
1907 qdf_spin_lock_bh(&wma->wma_hold_req_q_lock);
1908 }
1909 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
1910}
1911
1912/**
Abhishek Singh0ac37442018-05-02 21:07:57 +05301913 * wma_cleanup_vdev_resp_and_hold_req() - cleaunup the vdev resp and hold req
1914 * queue
1915 * @msg :scheduler msg
1916 *
1917 * Return: QDF_STATUS
1918 */
1919static QDF_STATUS
1920wma_cleanup_vdev_resp_and_hold_req(struct scheduler_msg *msg)
1921{
1922 if (!msg || !msg->bodyptr) {
1923 WMA_LOGE(FL("msg or body pointer is NULL"));
1924 return QDF_STATUS_E_INVAL;
1925 }
1926
1927 wma_cleanup_vdev_resp_queue(msg->bodyptr);
1928 wma_cleanup_hold_req(msg->bodyptr);
1929
1930 return QDF_STATUS_SUCCESS;
1931}
1932
1933/**
Prashanth Bhattae675ca72016-10-20 18:42:37 -07001934 * wma_shutdown_notifier_cb - Shutdown notifer call back
1935 * @priv : WMA handle
1936 *
1937 * During recovery, WMA may wait for resume to complete if the crash happens
1938 * while in suspend. This may cause delays in completing the recovery. This call
1939 * back would be called during recovery and the event is completed so that if
1940 * the resume is waiting on FW to respond then it can get out of the wait so
1941 * that recovery thread can start bringing down all the modules.
1942 *
1943 * Return: None
1944 */
1945static void wma_shutdown_notifier_cb(void *priv)
1946{
1947 tp_wma_handle wma_handle = priv;
Abhishek Singh0ac37442018-05-02 21:07:57 +05301948 struct scheduler_msg msg = { 0 };
1949 QDF_STATUS status;
Prashanth Bhattae675ca72016-10-20 18:42:37 -07001950
Wu Gaod7dd6e42018-10-16 17:22:56 +08001951 ucfg_pmo_psoc_wakeup_host_event_received(wma_handle->psoc);
Rajeev Kumar64beb9f2018-10-10 11:23:51 -07001952 wmi_stop(wma_handle->wmi_handle);
Abhishek Singh0ac37442018-05-02 21:07:57 +05301953
1954 msg.bodyptr = priv;
1955 msg.callback = wma_cleanup_vdev_resp_and_hold_req;
gaurank kathpalia00861f02018-08-28 19:16:12 +05301956 status = scheduler_post_message(QDF_MODULE_ID_WMA,
1957 QDF_MODULE_ID_WMA,
1958 QDF_MODULE_ID_TARGET_IF, &msg);
Prashanth Bhattae675ca72016-10-20 18:42:37 -07001959}
1960
Mukul Sharma5ff3c582016-09-12 15:23:35 +05301961struct wma_version_info g_wmi_version_info;
1962
Wen Gong3f003382018-05-14 14:26:37 +08001963#ifdef WLAN_FEATURE_MEMDUMP_ENABLE
Komal Seelam02d09342016-02-23 18:03:19 +05301964/**
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05301965 * wma_state_info_dump() - prints state information of wma layer
1966 * @buf: buffer pointer
1967 * @size: size of buffer to be filled
1968 *
1969 * This function is used to dump state information of wma layer
1970 *
1971 * Return: None
1972 */
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001973#ifdef QCA_SUPPORT_CP_STATS
1974static void wma_state_info_dump(char **buf_ptr, uint16_t *size)
1975{
1976 uint8_t vdev_id;
1977 uint16_t len = 0;
1978 t_wma_handle *wma;
1979 char *buf = *buf_ptr;
1980 struct wma_txrx_node *iface;
1981 struct wake_lock_stats stats;
1982 struct wlan_objmgr_vdev *vdev;
1983
1984 wma = cds_get_context(QDF_MODULE_ID_WMA);
1985 if (!wma) {
1986 WMA_LOGE("%s: WMA context is invald!", __func__);
1987 return;
1988 }
1989
Yeshwanth Sriram Guntukacbe61442018-08-23 18:08:44 +05301990 WMA_LOGD("%s: size of buffer: %d", __func__, *size);
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001991
1992 for (vdev_id = 0; vdev_id < wma->max_bssid; vdev_id++) {
1993 iface = &wma->interfaces[vdev_id];
1994 if (!iface->handle)
1995 continue;
1996
1997 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(wma->psoc,
1998 vdev_id, WLAN_LEGACY_WMA_ID);
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07001999 if (!vdev)
Yeshwanth Sriram Guntuka0e6f4462018-05-07 17:33:43 +05302000 continue;
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002001 ucfg_mc_cp_stats_get_vdev_wake_lock_stats(vdev, &stats);
2002 len += qdf_scnprintf(buf + len, *size - len,
2003 "\n"
2004 "vdev_id %d\n"
2005 "WoW Stats\n"
2006 "\tpno_match %u\n"
2007 "\tpno_complete %u\n"
2008 "\tgscan %u\n"
2009 "\tlow_rssi %u\n"
2010 "\trssi_breach %u\n"
2011 "\tucast %u\n"
2012 "\tbcast %u\n"
2013 "\ticmpv4 %u\n"
2014 "\ticmpv6 %u\n"
2015 "\tipv4_mcast %u\n"
2016 "\tipv6_mcast %u\n"
2017 "\tipv6_mcast_ra %u\n"
2018 "\tipv6_mcast_ns %u\n"
2019 "\tipv6_mcast_na %u\n"
2020 "\toem_response %u\n"
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002021 "dtimPeriod %d\n"
2022 "chanmode %d\n"
2023 "vht_capable %d\n"
2024 "ht_capable %d\n"
2025 "chan_width %d\n"
2026 "vdev_active %d\n"
2027 "vdev_up %d\n"
2028 "aid %d\n"
2029 "rate_flags %d\n"
2030 "nss %d\n"
2031 "tx_power %d\n"
2032 "max_tx_power %d\n"
2033 "nwType %d\n"
2034 "tx_streams %d\n"
2035 "rx_streams %d\n"
Arif Hussain99465632019-04-05 09:52:33 -07002036 "chain_mask %d",
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002037 vdev_id,
2038 stats.pno_match_wake_up_count,
2039 stats.pno_complete_wake_up_count,
2040 stats.gscan_wake_up_count,
2041 stats.low_rssi_wake_up_count,
2042 stats.rssi_breach_wake_up_count,
2043 stats.ucast_wake_up_count,
2044 stats.bcast_wake_up_count,
2045 stats.icmpv4_count,
2046 stats.icmpv6_count,
2047 stats.ipv4_mcast_wake_up_count,
2048 stats.ipv6_mcast_wake_up_count,
2049 stats.ipv6_mcast_ra_stats,
2050 stats.ipv6_mcast_ns_stats,
2051 stats.ipv6_mcast_na_stats,
2052 stats.oem_response_wake_up_count,
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002053 iface->dtimPeriod,
2054 iface->chanmode,
2055 iface->vht_capable,
2056 iface->ht_capable,
2057 iface->chan_width,
2058 iface->vdev_active,
2059 wma_is_vdev_up(vdev_id),
2060 iface->aid,
2061 iface->rate_flags,
2062 iface->nss,
2063 iface->tx_power,
2064 iface->max_tx_power,
2065 iface->nwType,
2066 iface->tx_streams,
2067 iface->rx_streams,
Arif Hussain53937342019-03-08 14:14:06 -08002068 iface->chain_mask);
Yeshwanth Sriram Guntuka0e6f4462018-05-07 17:33:43 +05302069 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID);
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002070 }
2071
2072 *size -= len;
2073 *buf_ptr += len;
2074}
2075#else /* QCA_SUPPORT_CP_STATS */
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05302076static void wma_state_info_dump(char **buf_ptr, uint16_t *size)
2077{
Dustin Brown9d797d62017-01-11 16:39:12 -08002078 t_wma_handle *wma;
2079 struct sir_vdev_wow_stats *stats;
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05302080 uint16_t len = 0;
2081 char *buf = *buf_ptr;
2082 struct wma_txrx_node *iface;
2083 uint8_t vdev_id;
2084
Dustin Brown9d797d62017-01-11 16:39:12 -08002085 wma = cds_get_context(QDF_MODULE_ID_WMA);
2086 if (!wma) {
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05302087 WMA_LOGE("%s: WMA context is invald!", __func__);
2088 return;
2089 }
2090
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07002091 WMA_LOGE("%s: size of buffer: %d", __func__, *size);
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05302092
Dustin Brown9d797d62017-01-11 16:39:12 -08002093 for (vdev_id = 0; vdev_id < wma->max_bssid; vdev_id++) {
2094 iface = &wma->interfaces[vdev_id];
2095 if (!iface->handle)
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05302096 continue;
2097
Dustin Brown9d797d62017-01-11 16:39:12 -08002098 stats = &iface->wow_stats;
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05302099 len += qdf_scnprintf(buf + len, *size - len,
Dustin Brown9d797d62017-01-11 16:39:12 -08002100 "\n"
2101 "vdev_id %d\n"
2102 "WoW Stats\n"
2103 "\tpno_match %u\n"
2104 "\tpno_complete %u\n"
2105 "\tgscan %u\n"
2106 "\tlow_rssi %u\n"
2107 "\trssi_breach %u\n"
2108 "\tucast %u\n"
2109 "\tbcast %u\n"
2110 "\ticmpv4 %u\n"
2111 "\ticmpv6 %u\n"
2112 "\tipv4_mcast %u\n"
2113 "\tipv6_mcast %u\n"
2114 "\tipv6_mcast_ra %u\n"
2115 "\tipv6_mcast_ns %u\n"
2116 "\tipv6_mcast_na %u\n"
2117 "\toem_response %u\n"
Dustin Brown9d797d62017-01-11 16:39:12 -08002118 "dtimPeriod %d\n"
2119 "chanmode %d\n"
2120 "vht_capable %d\n"
2121 "ht_capable %d\n"
2122 "chan_width %d\n"
2123 "vdev_active %d\n"
2124 "vdev_up %d\n"
2125 "aid %d\n"
2126 "rate_flags %d\n"
2127 "nss %d\n"
2128 "tx_power %d\n"
2129 "max_tx_power %d\n"
2130 "nwType %d\n"
2131 "tx_streams %d\n"
2132 "rx_streams %d\n"
Arif Hussain99465632019-04-05 09:52:33 -07002133 "chain_mask %d",
Dustin Brown9d797d62017-01-11 16:39:12 -08002134 vdev_id,
2135 stats->pno_match,
2136 stats->pno_complete,
2137 stats->gscan,
2138 stats->low_rssi,
2139 stats->rssi_breach,
2140 stats->ucast,
2141 stats->bcast,
2142 stats->icmpv4,
2143 stats->icmpv6,
2144 stats->ipv4_mcast,
2145 stats->ipv6_mcast,
2146 stats->ipv6_mcast_ra,
2147 stats->ipv6_mcast_ns,
2148 stats->ipv6_mcast_na,
2149 stats->oem_response,
Dustin Brown9d797d62017-01-11 16:39:12 -08002150 iface->dtimPeriod,
2151 iface->chanmode,
2152 iface->vht_capable,
2153 iface->ht_capable,
2154 iface->chan_width,
2155 iface->vdev_active,
Mukul Sharmaf9047232017-03-02 16:58:56 +05302156 wma_is_vdev_up(vdev_id),
Dustin Brown9d797d62017-01-11 16:39:12 -08002157 iface->aid,
2158 iface->rate_flags,
2159 iface->nss,
2160 iface->tx_power,
2161 iface->max_tx_power,
2162 iface->nwType,
2163 iface->tx_streams,
2164 iface->rx_streams,
Arif Hussain99465632019-04-05 09:52:33 -07002165 iface->chain_mask);
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05302166 }
2167
2168 *size -= len;
2169 *buf_ptr += len;
2170}
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002171#endif /* QCA_SUPPORT_CP_STATS */
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05302172
2173/**
2174 * wma_register_debug_callback() - registration function for wma layer
2175 * to print wma state information
2176 */
2177static void wma_register_debug_callback(void)
2178{
2179 qdf_register_debug_callback(QDF_MODULE_ID_WMA, &wma_state_info_dump);
2180}
Wen Gong3f003382018-05-14 14:26:37 +08002181#else /* WLAN_FEATURE_MEMDUMP_ENABLE */
Wen Gongaa6d55d2018-04-26 16:33:21 +08002182static void wma_register_debug_callback(void)
2183{
2184}
Wen Gong3f003382018-05-14 14:26:37 +08002185#endif /* WLAN_FEATURE_MEMDUMP_ENABLE */
Frank Liu65b17d92016-11-23 15:58:44 +08002186/**
2187 * wma_register_tx_ops_handler() - register tx_ops of southbound
2188 * @tx_ops: tx_ops pointer in southbound
2189 *
2190 * Return: 0 on success, errno on failure
2191 */
2192static QDF_STATUS
2193wma_register_tx_ops_handler(struct wlan_lmac_if_tx_ops *tx_ops)
2194{
2195 /*
2196 * Assign tx_ops, it's up to UMAC modules to declare and define these
2197 * functions which are used to send wmi command to target.
2198 */
2199
Himanshu Agarwalce716f82016-12-21 19:07:54 +05302200 if (!tx_ops) {
2201 WMA_LOGE("%s: pointer to lmac if tx ops is NULL", __func__);
2202 return QDF_STATUS_E_INVAL;
2203 }
2204
2205 /* mgmt_txrx component's tx ops */
2206 tx_ops->mgmt_txrx_tx_ops.mgmt_tx_send = wma_mgmt_unified_cmd_send;
2207
Sravan Kumar Kairam0fbaefe2018-09-10 16:57:50 +05302208 /* mgmt txrx component nbuf op for nbuf dma unmap */
2209 tx_ops->mgmt_txrx_tx_ops.tx_drain_nbuf_op = wma_mgmt_nbuf_unmap_cb;
2210
Frank Liu65b17d92016-11-23 15:58:44 +08002211 return QDF_STATUS_SUCCESS;
2212}
2213
2214/**
2215 * wma_target_if_open() - Attach UMAC modules' interface with wmi layer
2216 * @wma_handle: wma handle
2217 *
2218 * Separate module defines below functions:
2219 * 1. tgt_wmi_<module>_<action> api sends wmi command, assigned to south bound
2220 * tx_ops function pointers;
2221 * 2. module's south dispatcher handles information from lower layer, assigned
2222 * to south bound rx_ops function pointers;
2223 * 3. wmi event handler deals with wmi event, extracts umac needed information,
2224 * and call rx_ops(module's dispatcher). It executes in tasklet context and
2225 * is up to dispatcher to decide the context to reside in tasklet or in
2226 * thread context.
2227 *
2228 * Return: None
2229 */
2230static void wma_target_if_open(tp_wma_handle wma_handle)
2231{
Selvaraj, Sridhar0672a122016-12-29 16:11:48 +05302232 struct wlan_objmgr_psoc *psoc = wma_handle->psoc;
Frank Liu65b17d92016-11-23 15:58:44 +08002233
2234 if (!psoc)
2235 return;
2236
Mukul Sharmadad267e2017-02-04 13:25:34 +05302237 wlan_global_lmac_if_set_txops_registration_cb(WLAN_DEV_OL,
2238 target_if_register_tx_ops);
2239 wlan_lmac_if_set_umac_txops_registration_cb(
2240 wma_register_tx_ops_handler);
2241 wlan_global_lmac_if_open(psoc);
Frank Liu65b17d92016-11-23 15:58:44 +08002242
Frank Liu65b17d92016-11-23 15:58:44 +08002243}
2244
2245/**
2246 * wma_target_if_close() - Detach UMAC modules' interface with wmi layer
2247 * @wma_handle: wma handle
2248 *
2249 * Return: None
2250 */
2251static void wma_target_if_close(tp_wma_handle wma_handle)
2252{
Selvaraj, Sridhar0672a122016-12-29 16:11:48 +05302253 struct wlan_objmgr_psoc *psoc = wma_handle->psoc;
Frank Liu65b17d92016-11-23 15:58:44 +08002254
2255 if (!psoc)
2256 return;
2257
Mukul Sharmadad267e2017-02-04 13:25:34 +05302258 wlan_global_lmac_if_close(psoc);
Frank Liu65b17d92016-11-23 15:58:44 +08002259}
Frank Liu65b17d92016-11-23 15:58:44 +08002260
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05302261/**
Himanshu Agarwal2228e072018-01-24 17:42:17 +05302262 * wma_get_pdev_from_scn_handle() - API to get pdev from scn handle
2263 * @scn_handle: opaque wma handle
2264 *
2265 * API to get pdev from scn handle
2266 *
2267 * Return: None
2268 */
2269static struct wlan_objmgr_pdev *wma_get_pdev_from_scn_handle(void *scn_handle)
2270{
2271 tp_wma_handle wma_handle;
2272
2273 if (!scn_handle) {
2274 WMA_LOGE("invalid scn handle");
2275 return NULL;
2276 }
2277 wma_handle = (tp_wma_handle)scn_handle;
2278
2279 return wma_handle->pdev;
2280}
2281
Rajeev Kumarda2444c2017-01-10 22:42:07 -08002282/**
2283 * wma_legacy_service_ready_event_handler() - legacy (ext)service ready handler
2284 * @event_id: event_id
2285 * @handle: wma handle
2286 * @event_data: event data
2287 * @length: event length
2288 *
2289 * Return: 0 for success, negative error code for failure
2290 */
2291static int wma_legacy_service_ready_event_handler(uint32_t event_id,
2292 void *handle,
2293 uint8_t *event_data,
2294 uint32_t length)
2295{
Arunk Khandavallia6305a32018-01-25 11:19:18 +05302296 switch (event_id) {
2297 case wmi_service_ready_event_id:
Rajeev Kumarda2444c2017-01-10 22:42:07 -08002298 return wma_rx_service_ready_event(handle, event_data, length);
Arunk Khandavallia6305a32018-01-25 11:19:18 +05302299 case wmi_service_ready_ext_event_id:
Rajeev Kumarda2444c2017-01-10 22:42:07 -08002300 return wma_rx_service_ready_ext_event(handle, event_data,
2301 length);
Arunk Khandavallia6305a32018-01-25 11:19:18 +05302302 case wmi_ready_event_id:
2303 return wma_rx_ready_event(handle, event_data, length);
2304 default:
2305 WMA_LOGE("Legacy callback invoked with invalid event_id:%d",
2306 event_id);
Rajeev Kumarda2444c2017-01-10 22:42:07 -08002307 QDF_BUG(0);
Arunk Khandavallia6305a32018-01-25 11:19:18 +05302308 }
Rajeev Kumarda2444c2017-01-10 22:42:07 -08002309
2310 return 0;
2311}
Mukul Sharmac3e7a782017-02-03 12:16:11 +05302312
2313/**
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002314 * wma_flush_complete_evt_handler() - FW log flush complete event handler
2315 * @handle: WMI handle
2316 * @event: Event recevied from FW
2317 * @len: Length of the event
2318 *
2319 */
2320static int wma_flush_complete_evt_handler(void *handle,
2321 u_int8_t *event,
2322 u_int32_t len)
2323{
2324 QDF_STATUS status;
2325 tp_wma_handle wma = (tp_wma_handle) handle;
2326
2327 WMI_DEBUG_MESG_FLUSH_COMPLETE_EVENTID_param_tlvs *param_buf;
2328 wmi_debug_mesg_flush_complete_fixed_param *wmi_event;
Poddar, Siddarthc2c08142017-09-13 17:49:56 +05302329 wmi_debug_mesg_fw_data_stall_param *data_stall_event;
2330 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
2331 uint8_t *buf_ptr;
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002332 uint32_t reason_code;
2333
2334 param_buf = (WMI_DEBUG_MESG_FLUSH_COMPLETE_EVENTID_param_tlvs *) event;
2335 if (!param_buf) {
2336 WMA_LOGE("Invalid log flush complete event buffer");
2337 return QDF_STATUS_E_FAILURE;
2338 }
2339
2340 wmi_event = param_buf->fixed_param;
2341 reason_code = wmi_event->reserved0;
Rajeev Kumardcce8092018-05-02 15:48:17 -07002342 WMA_LOGD("Received reason code %d from FW", reason_code);
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002343
Poddar, Siddarthc2c08142017-09-13 17:49:56 +05302344 buf_ptr = (uint8_t *)wmi_event;
2345 buf_ptr = buf_ptr + sizeof(wmi_debug_mesg_flush_complete_fixed_param) +
2346 WMI_TLV_HDR_SIZE;
2347 data_stall_event = (wmi_debug_mesg_fw_data_stall_param *) buf_ptr;
2348
2349 if (((data_stall_event->tlv_header & 0xFFFF0000) >> 16 ==
2350 WMITLV_TAG_STRUC_wmi_debug_mesg_fw_data_stall_param)) {
2351 /**
2352 * Log data stall info received from FW:
2353 *
2354 * Possible data stall recovery types:
2355 * WLAN_DBG_DATA_STALL_RECOVERY_CONNECT_DISCONNECT
2356 * WLAN_DBG_DATA_STALL_RECOVERY_CONNECT_MAC_PHY_RESET
2357 * WLAN_DBG_DATA_STALL_RECOVERY_CONNECT_PDR
2358 *
2359 * Possible data stall event types:
2360 * WLAN_DBG_DATA_STALL_VDEV_PAUSE
2361 * WLAN_DBG_DATA_STALL_HWSCHED_CMD_FILTER
2362 * WLAN_DBG_DATA_STALL_HWSCHED_CMD_FLUSH
2363 * WLAN_DBG_DATA_STALL_RX_REFILL_FAILED
2364 * WLAN_DBG_DATA_STALL_RX_FCS_LEN_ERROR
2365 *
2366 * reason_code1:
2367 * The information stored in reason_code1 varies based on the
2368 * data stall type values:
2369 *
2370 * data_stall_type | reason_code1
2371 * -----------------------------------------------------
2372 * HWSCHED_CMD_FLUSH | flush req reason (0-40)
2373 * RX_REFILL_FAILED | ring_id (0-7)
2374 * RX_FCS_LEN_ERROR | exact error type
2375 *
2376 * reasone_code2:
2377 * on which tid/hwq stall happened
2378 *
2379 */
2380 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG,
2381 "Data Stall event:");
2382 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG,
2383 "data_stall_type: %x vdev_id_bitmap: %x reason_code1: %x reason_code2: %x recovery_type: %x ",
2384 data_stall_event->data_stall_type,
2385 data_stall_event->vdev_id_bitmap,
2386 data_stall_event->reason_code1,
2387 data_stall_event->reason_code2,
2388 data_stall_event->recovery_type);
2389
2390 cdp_post_data_stall_event(soc,
2391 DATA_STALL_LOG_INDICATOR_FIRMWARE,
2392 data_stall_event->data_stall_type,
2393 0XFF,
2394 data_stall_event->vdev_id_bitmap,
2395 data_stall_event->recovery_type);
2396 }
2397
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002398 /*
2399 * reason_code = 0; Flush event in response to flush command
2400 * reason_code = other value; Asynchronous flush event for fatal events
2401 */
2402 if (!reason_code && (cds_is_log_report_in_progress() == false)) {
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08002403 WMA_LOGD("Received WMI flush event without sending CMD");
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002404 return -EINVAL;
2405 } else if (!reason_code && cds_is_log_report_in_progress() == true) {
2406 /* Flush event in response to flush command */
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08002407 WMA_LOGD("Received WMI flush event in response to flush CMD");
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002408 status = qdf_mc_timer_stop(&wma->log_completion_timer);
2409 if (status != QDF_STATUS_SUCCESS)
2410 WMA_LOGE("Failed to stop the log completion timeout");
2411 cds_logging_set_fw_flush_complete();
Zhu Jianminb639e9b2017-10-26 19:09:12 +08002412 return QDF_STATUS_SUCCESS;
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002413 } else if (reason_code && cds_is_log_report_in_progress() == false) {
2414 /* Asynchronous flush event for fatal events */
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002415 status = cds_set_log_completion(WLAN_LOG_TYPE_FATAL,
2416 WLAN_LOG_INDICATOR_FIRMWARE,
2417 reason_code, false);
2418 if (QDF_STATUS_SUCCESS != status) {
2419 WMA_LOGE("%s: Failed to set log trigger params",
2420 __func__);
2421 return QDF_STATUS_E_FAILURE;
2422 }
2423 cds_logging_set_fw_flush_complete();
2424 return status;
2425 } else {
2426 /* Asynchronous flush event for fatal event,
2427 * but, report in progress already
2428 */
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08002429 WMA_LOGD("%s: Bug report already in progress - dropping! type:%d, indicator=%d reason_code=%d",
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002430 __func__, WLAN_LOG_TYPE_FATAL,
2431 WLAN_LOG_INDICATOR_FIRMWARE, reason_code);
2432 return QDF_STATUS_E_FAILURE;
2433 }
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002434 /* Asynchronous flush event for fatal event,
2435 * but, report in progress already
2436 */
2437 WMA_LOGW("%s: Bug report already in progress - dropping! type:%d, indicator=%d reason_code=%d",
2438 __func__, WLAN_LOG_TYPE_FATAL,
2439 WLAN_LOG_INDICATOR_FIRMWARE, reason_code);
2440 return QDF_STATUS_E_FAILURE;
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002441}
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07002442
2443#ifdef WLAN_CONV_SPECTRAL_ENABLE
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002444/**
2445 * wma_extract_single_phyerr_spectral() - extract single phy error from event
2446 * @handle: wma handle
2447 * @param evt_buf: pointer to event buffer
2448 * @param datalen: data length of event buffer
2449 * @param buf_offset: Pointer to hold value of current event buffer offset
2450 * post extraction
2451 * @param phyerr: Pointer to hold phyerr
2452 *
2453 * Return: QDF_STATUS
2454 */
2455static QDF_STATUS wma_extract_single_phyerr_spectral(void *handle,
2456 void *evt_buf,
2457 uint16_t datalen, uint16_t *buf_offset,
2458 wmi_host_phyerr_t *phyerr)
2459{
2460 wmi_single_phyerr_rx_event *ev;
2461 int n = *buf_offset;
2462
2463 ev = (wmi_single_phyerr_rx_event *)((uint8_t *)evt_buf + n);
2464
2465 if (n < datalen) {
2466 /* ensure there's at least space for the header */
2467 if ((datalen - n) < sizeof(ev->hdr)) {
2468 WMA_LOGE("%s: not enough space? (datalen=%d, n=%d, hdr=%zu bytes",
2469 __func__, datalen, n, sizeof(ev->hdr));
2470 return QDF_STATUS_E_FAILURE;
2471 }
2472
2473 phyerr->bufp = ev->bufp;
2474 phyerr->buf_len = ev->hdr.buf_len;
2475
2476 /*
2477 * Sanity check the buffer length of the event against
2478 * what we currently have.
2479 *
2480 * Since buf_len is 32 bits, we check if it overflows
2481 * a large 32 bit value. It's not 0x7fffffff because
2482 * we increase n by (buf_len + sizeof(hdr)), which would
2483 * in itself cause n to overflow.
2484 *
2485 * If "int" is 64 bits then this becomes a moot point.
2486 */
2487 if (ev->hdr.buf_len > 0x7f000000) {
2488 WMA_LOGE("%s: buf_len is garbage? (0x%x)",
2489 __func__, ev->hdr.buf_len);
2490 return QDF_STATUS_E_FAILURE;
2491 }
2492 if (n + ev->hdr.buf_len > datalen) {
2493 WMA_LOGE("%s: buf_len exceeds available space n=%d, buf_len=%d, datalen=%d",
2494 __func__, n, ev->hdr.buf_len, datalen);
2495 return QDF_STATUS_E_FAILURE;
2496 }
2497
2498 phyerr->phy_err_code = WMI_UNIFIED_PHYERRCODE_GET(&ev->hdr);
2499 phyerr->tsf_timestamp = ev->hdr.tsf_timestamp;
2500
2501#ifdef DEBUG_SPECTRAL_SCAN
2502 WMA_LOGD("%s: len=%d, tsf=0x%08x, rssi = 0x%x/0x%x/0x%x/0x%x, comb rssi = 0x%x, phycode=%d",
2503 __func__,
2504 ev->hdr.buf_len,
2505 ev->hdr.tsf_timestamp,
2506 ev->hdr.rssi_chain0,
2507 ev->hdr.rssi_chain1,
2508 ev->hdr.rssi_chain2,
2509 ev->hdr.rssi_chain3,
2510 WMI_UNIFIED_RSSI_COMB_GET(&ev->hdr),
2511 phyerr->phy_err_code);
2512
2513 /*
2514 * For now, unroll this loop - the chain 'value' field isn't
2515 * a variable but glued together into a macro field definition.
2516 * Grr. :-)
2517 */
2518 WMA_LOGD("%s: chain 0: raw=0x%08x; pri20=%d sec20=%d sec40=%d sec80=%d",
2519 __func__,
2520 ev->hdr.rssi_chain0,
2521 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 0, PRI20),
2522 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 0, SEC20),
2523 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 0, SEC40),
2524 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 0, SEC80));
2525
2526 WMA_LOGD("%s: chain 1: raw=0x%08x: pri20=%d sec20=%d sec40=%d sec80=%d",
2527 __func__,
2528 ev->hdr.rssi_chain1,
2529 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 1, PRI20),
2530 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 1, SEC20),
2531 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 1, SEC40),
2532 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 1, SEC80));
2533
2534 WMA_LOGD("%s: chain 2: raw=0x%08x: pri20=%d sec20=%d sec40=%d sec80=%d",
2535 __func__,
2536 ev->hdr.rssi_chain2,
2537 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 2, PRI20),
2538 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 2, SEC20),
2539 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 2, SEC40),
2540 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 2, SEC80));
2541
2542 WMA_LOGD("%s: chain 3: raw=0x%08x: pri20=%d sec20=%d sec40=%d sec80=%d",
2543 __func__,
2544 ev->hdr.rssi_chain3,
2545 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 3, PRI20),
2546 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 3, SEC20),
2547 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 3, SEC40),
2548 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 3, SEC80));
2549
2550
2551 WMA_LOGD("%s: freq_info_1=0x%08x, freq_info_2=0x%08x",
2552 __func__, ev->hdr.freq_info_1, ev->hdr.freq_info_2);
2553
2554 /*
2555 * The NF chain values are signed and are negative - hence
2556 * the cast evilness.
2557 */
2558 WMA_LOGD("%s: nfval[1]=0x%08x, nfval[2]=0x%08x, nf=%d/%d/%d/%d, freq1=%d, freq2=%d, cw=%d",
2559 __func__,
2560 ev->hdr.nf_list_1,
2561 ev->hdr.nf_list_2,
2562 (int) WMI_UNIFIED_NF_CHAIN_GET(&ev->hdr, 0),
2563 (int) WMI_UNIFIED_NF_CHAIN_GET(&ev->hdr, 1),
2564 (int) WMI_UNIFIED_NF_CHAIN_GET(&ev->hdr, 2),
2565 (int) WMI_UNIFIED_NF_CHAIN_GET(&ev->hdr, 3),
2566 WMI_UNIFIED_FREQ_INFO_GET(&ev->hdr, 1),
2567 WMI_UNIFIED_FREQ_INFO_GET(&ev->hdr, 2),
2568 WMI_UNIFIED_CHWIDTH_GET(&ev->hdr));
2569#endif
2570
2571 /*
2572 * If required, pass spectral events to the spectral module
2573 */
2574 if (ev->hdr.buf_len > 0) {
2575
2576 /* Initialize the NF values to Zero. */
2577 phyerr->rf_info.noise_floor[0] =
2578 WMI_UNIFIED_NF_CHAIN_GET(&ev->hdr, 0);
2579 phyerr->rf_info.noise_floor[1] =
2580 WMI_UNIFIED_NF_CHAIN_GET(&ev->hdr, 1);
2581 phyerr->rf_info.noise_floor[2] =
2582 WMI_UNIFIED_NF_CHAIN_GET(&ev->hdr, 2);
2583 phyerr->rf_info.noise_floor[3] =
2584 WMI_UNIFIED_NF_CHAIN_GET(&ev->hdr, 3);
2585
2586 /* populate the rf info */
2587 phyerr->rf_info.rssi_comb =
2588 WMI_UNIFIED_RSSI_COMB_GET(&ev->hdr);
2589
2590 /* Need to unroll loop due to macro
2591 * constraints chain 0
2592 */
2593 phyerr->rf_info.pc_rssi_info[0].rssi_pri20 =
2594 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 0, PRI20);
2595 phyerr->rf_info.pc_rssi_info[0].rssi_sec20 =
2596 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 0, SEC20);
2597 phyerr->rf_info.pc_rssi_info[0].rssi_sec40 =
2598 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 0, SEC40);
2599 phyerr->rf_info.pc_rssi_info[0].rssi_sec80 =
2600 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 0, SEC80);
2601
2602 /* chain 1 */
2603 phyerr->rf_info.pc_rssi_info[1].rssi_pri20 =
2604 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 1, PRI20);
2605 phyerr->rf_info.pc_rssi_info[1].rssi_sec20 =
2606 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 1, SEC20);
2607 phyerr->rf_info.pc_rssi_info[1].rssi_sec40 =
2608 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 1, SEC40);
2609 phyerr->rf_info.pc_rssi_info[1].rssi_sec80 =
2610 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 1, SEC80);
2611
2612 /* chain 2 */
2613 phyerr->rf_info.pc_rssi_info[2].rssi_pri20 =
2614 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 2, PRI20);
2615 phyerr->rf_info.pc_rssi_info[2].rssi_sec20 =
2616 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 2, SEC20);
2617 phyerr->rf_info.pc_rssi_info[2].rssi_sec40 =
2618 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 2, SEC40);
2619 phyerr->rf_info.pc_rssi_info[2].rssi_sec80 =
2620 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 2, SEC80);
2621
2622 /* chain 3 */
2623 phyerr->rf_info.pc_rssi_info[3].rssi_pri20 =
2624 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 3, PRI20);
2625 phyerr->rf_info.pc_rssi_info[3].rssi_sec20 =
2626 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 3, SEC20);
2627 phyerr->rf_info.pc_rssi_info[3].rssi_sec40 =
2628 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 3, SEC40);
2629 phyerr->rf_info.pc_rssi_info[3].rssi_sec80 =
2630 WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 3, SEC80);
2631
2632 phyerr->chan_info.center_freq1 =
2633 WMI_UNIFIED_FREQ_INFO_GET(&ev->hdr, 1);
2634 phyerr->chan_info.center_freq2 =
2635 WMI_UNIFIED_FREQ_INFO_GET(&ev->hdr, 2);
2636
2637 }
2638
2639 /*
2640 * Advance the buffer pointer to the next PHY error.
2641 * buflen is the length of this payload, so we need to
2642 * advance past the current header _AND_ the payload.
2643 */
2644 n += sizeof(*ev) + ev->hdr.buf_len;
2645 }
2646 *buf_offset += n;
2647
2648 return QDF_STATUS_SUCCESS;
2649}
2650
2651/**
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002652 * spectral_phyerr_event_handler() - spectral phyerr event handler
2653 * @handle: wma handle
2654 * @data: data buffer
2655 * @datalen: buffer length
2656 *
2657 * Return: QDF_STATUS
2658 */
2659static QDF_STATUS spectral_phyerr_event_handler(void *handle,
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07002660 uint8_t *data,
2661 uint32_t datalen)
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002662{
2663 tp_wma_handle wma = (tp_wma_handle) handle;
2664 QDF_STATUS status = QDF_STATUS_SUCCESS;
2665 uint16_t buf_offset, event_buf_len = 0;
2666 wmi_single_phyerr_rx_event *ev;
2667 wmi_host_phyerr_t phyerr;
2668 struct target_if_spectral_rfqual_info rfqual_info;
2669 struct target_if_spectral_chan_info chan_info;
2670 struct target_if_spectral_acs_stats acs_stats;
2671
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07002672 if (!wma) {
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002673 WMA_LOGE("%s:wma handle is NULL", __func__);
2674 return QDF_STATUS_E_FAILURE;
2675 }
2676
2677 memset(&phyerr, 0, sizeof(wmi_host_phyerr_t));
Arif Hussaind54b62c2018-03-01 13:31:37 -08002678 status = wmi_extract_comb_phyerr(wma->wmi_handle, data, datalen,
2679 &buf_offset, &phyerr);
2680 if (QDF_IS_STATUS_ERROR(status)) {
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002681 WMA_LOGE("%s: extract comb phyerr failed", __func__);
2682 return QDF_STATUS_E_FAILURE;
2683 }
2684
2685 ev = (wmi_single_phyerr_rx_event *)phyerr.bufp;
2686 event_buf_len = phyerr.buf_len;
2687 /* Loop over the bufp, extracting out phyerrors */
2688 buf_offset = 0;
2689 while (buf_offset < event_buf_len) {
2690 if (wma_extract_single_phyerr_spectral(handle, ev,
2691 event_buf_len, &buf_offset, &phyerr)) {
2692 WMA_LOGE("%s: extract single phy err failed", __func__);
2693 return QDF_STATUS_E_FAILURE;
2694 }
2695
2696 if (phyerr.buf_len > 0) {
2697 if (sizeof(phyerr.rf_info) > sizeof(rfqual_info))
2698 qdf_mem_copy(&rfqual_info, &phyerr.rf_info,
2699 sizeof(rfqual_info));
2700 else
2701 qdf_mem_copy(&rfqual_info, &phyerr.rf_info,
2702 sizeof(phyerr.rf_info));
2703
2704 if (sizeof(phyerr.chan_info) > sizeof(chan_info))
2705 qdf_mem_copy(&chan_info, &phyerr.chan_info,
2706 sizeof(chan_info));
2707 else
2708 qdf_mem_copy(&chan_info, &phyerr.chan_info,
2709 sizeof(phyerr.chan_info));
2710
2711 target_if_spectral_process_phyerr(wma->pdev, phyerr.bufp,
2712 phyerr.buf_len,
2713 &rfqual_info,
2714 &chan_info,
2715 phyerr.tsf64,
2716 &acs_stats);
2717 }
2718 }
2719
2720 return status;
2721}
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07002722#else
Chaoli Zhou5d6bad12018-06-13 14:29:33 +08002723static QDF_STATUS
2724wma_extract_single_phyerr_spectral(void *handle, void *evt_buf,
2725 uint16_t datalen,
2726 uint16_t *buf_offset,
2727 wmi_host_phyerr_t *phyerr)
2728{
2729 return QDF_STATUS_SUCCESS;
2730}
2731
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07002732static QDF_STATUS spectral_phyerr_event_handler(void *handle,
2733 uint8_t *data, uint32_t datalen)
2734{
2735 return QDF_STATUS_SUCCESS;
2736}
2737#endif
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08002738
Arif Hussainf63f7a32017-08-22 12:49:42 -07002739/**
Arif Hussaind54b62c2018-03-01 13:31:37 -08002740 * dfs_phyerr_event_handler() - dfs phyerr event handler
2741 * @handle: wma handle
2742 * @data: data buffer
2743 * @datalen: buffer length
2744 * @fulltsf: 64 bit event TSF
2745 *
2746 * Function to process DFS phy errors.
2747 *
2748 * Return: QDF_STATUS
2749 */
2750static QDF_STATUS dfs_phyerr_event_handler(tp_wma_handle handle,
2751 uint8_t *data,
2752 uint32_t datalen,
2753 uint64_t fulltsf)
2754{
2755 QDF_STATUS status = QDF_STATUS_SUCCESS;
2756 struct wlan_lmac_if_dfs_rx_ops *dfs_rx_ops;
2757 wmi_host_phyerr_t phyerr;
2758 int8_t rssi_comb;
2759 uint16_t buf_offset;
2760
2761 if (!handle->psoc) {
2762 WMA_LOGE("%s: psoc is null", __func__);
2763 return QDF_STATUS_E_INVAL;
2764 }
2765
2766 dfs_rx_ops = wlan_lmac_if_get_dfs_rx_ops(handle->psoc);
2767 if (!dfs_rx_ops) {
2768 WMA_LOGE("%s: dfs_rx_ops is null", __func__);
2769 return QDF_STATUS_E_INVAL;
2770 }
2771
2772 if (!dfs_rx_ops->dfs_process_phyerr) {
2773 WMA_LOGE("%s: dfs_process_phyerr handler is null", __func__);
2774 return QDF_STATUS_E_INVAL;
2775 }
2776
2777 if (!handle->pdev) {
2778 WMA_LOGE("%s: pdev is null", __func__);
2779 return -EINVAL;
2780 }
2781
2782 buf_offset = 0;
2783 while (buf_offset < datalen) {
2784 status = wmi_extract_single_phyerr(handle->wmi_handle, data, datalen,
2785 &buf_offset, &phyerr);
2786 if (QDF_IS_STATUS_ERROR(status)) {
2787 /* wmi_extract_single_phyerr has logs */
2788 return status;
2789 }
2790
2791 rssi_comb = phyerr.rf_info.rssi_comb & 0xFF;
2792 if (phyerr.buf_len > 0)
2793 dfs_rx_ops->dfs_process_phyerr(handle->pdev,
2794 &phyerr.bufp[0],
2795 phyerr.buf_len,
2796 rssi_comb,
2797 rssi_comb,
2798 phyerr.tsf_timestamp,
2799 fulltsf);
2800 }
2801
2802 return QDF_STATUS_SUCCESS;
2803}
2804
2805/**
Arif Hussainf63f7a32017-08-22 12:49:42 -07002806 * wma_unified_phyerr_rx_event_handler() - phyerr event handler
2807 * @handle: wma handle
2808 * @data: data buffer
2809 * @datalen: buffer length
2810 *
2811 * WMI Handler for WMI_PHYERR_EVENTID event from firmware.
2812 * This handler is currently handling DFS and spectral scan
2813 * phy errors.
2814 *
2815 * Return: 0 for success, other value for failure
2816 */
2817static int wma_unified_phyerr_rx_event_handler(void *handle,
Arif Hussaind54b62c2018-03-01 13:31:37 -08002818 uint8_t *data,
2819 uint32_t datalen)
2820{
Arif Hussainf63f7a32017-08-22 12:49:42 -07002821 /* phyerr handling is moved to cmn project
2822 * As WIN still uses handler registration in non-cmn code.
2823 * need complete testing of non offloaded DFS code before we enable
2824 * it in cmn code.
2825 **/
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002826 tp_wma_handle wma = (tp_wma_handle) handle;
2827 QDF_STATUS status = QDF_STATUS_SUCCESS;
2828 wmi_host_phyerr_t phyerr;
2829 uint16_t buf_offset = 0;
Chaoli Zhou5d6bad12018-06-13 14:29:33 +08002830 wmi_single_phyerr_rx_event *ev;
2831 uint16_t event_buf_len = 0;
2832 wmi_host_phyerr_t phyerr2;
2833 bool spectralscan = false;
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002834
Arif Hussaind54b62c2018-03-01 13:31:37 -08002835 if (!wma) {
2836 WMA_LOGE("%s: wma handle is null", __func__);
2837 return -EINVAL;
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002838 }
2839
2840 /* sanity check on data length */
Arif Hussaind54b62c2018-03-01 13:31:37 -08002841 status = wmi_extract_comb_phyerr(wma->wmi_handle, data, datalen,
2842 &buf_offset, &phyerr);
2843 if (QDF_IS_STATUS_ERROR(status)) {
2844 WMA_LOGE("%s: extract phyerr failed: %d", __func__, status);
2845 return qdf_status_to_os_return(status);
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002846 }
Chaoli Zhou5d6bad12018-06-13 14:29:33 +08002847 ev = (wmi_single_phyerr_rx_event *)phyerr.bufp;
2848 event_buf_len = phyerr.buf_len;
2849 /* Loop over the bufp, extracting out phyerrors */
2850 buf_offset = 0;
2851 while (ev && (buf_offset < event_buf_len)) {
2852 if (wma_extract_single_phyerr_spectral(handle, ev,
2853 event_buf_len,
2854 &buf_offset,
2855 &phyerr2)) {
2856 WMA_LOGE("%s: extract single phy err failed", __func__);
2857 return qdf_status_to_os_return(QDF_STATUS_E_FAILURE);
2858 }
2859 if ((buf_offset != 0) && (phyerr2.phy_err_code == 0x26 ||
2860 phyerr2.phy_err_code == 0x24)) {
2861 spectralscan = true;
2862 } else {
2863 break;
2864 }
2865 }
2866 if (spectralscan) {
2867 status = spectral_phyerr_event_handler(wma, data, datalen);
2868 return qdf_status_to_os_return(status);
2869 }
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002870 /* handle different PHY Error conditions */
2871 if (((phyerr.phy_err_mask0 & (WMI_PHY_ERROR_MASK0_RADAR |
Arif Hussaind54b62c2018-03-01 13:31:37 -08002872 WMI_PHY_ERROR_MASK0_FALSE_RADAR_EXT |
2873 WMI_PHY_ERROR_MASK0_SPECTRAL_SCAN)) == 0)) {
2874 WMA_LOGD("%s: Unknown phy error event", __func__);
2875 return -EINVAL;
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002876 }
2877
2878 /* Handle Spectral or DFS PHY Error */
2879 if (phyerr.phy_err_mask0 & (WMI_PHY_ERROR_MASK0_RADAR |
Arif Hussaind54b62c2018-03-01 13:31:37 -08002880 WMI_PHY_ERROR_MASK0_FALSE_RADAR_EXT)) {
2881 if (wma->is_dfs_offloaded) {
2882 WMA_LOGD("%s: Unexpected phy error, dfs offloaded",
2883 __func__);
2884 return -EINVAL;
2885 }
2886 status = dfs_phyerr_event_handler(wma,
2887 phyerr.bufp,
2888 phyerr.buf_len,
2889 phyerr.tsf64);
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002890 } else if (phyerr.phy_err_mask0 & (WMI_PHY_ERROR_MASK0_SPECTRAL_SCAN |
Arif Hussaind54b62c2018-03-01 13:31:37 -08002891 WMI_PHY_ERROR_MASK0_FALSE_RADAR_EXT)) {
Sandeep Puligilla707cea52018-01-17 23:19:41 -08002892 status = spectral_phyerr_event_handler(wma, data, datalen);
2893 }
Arif Hussaind54b62c2018-03-01 13:31:37 -08002894
2895 return qdf_status_to_os_return(status);
Arif Hussainf63f7a32017-08-22 12:49:42 -07002896}
2897
Dustin Brownec2c92e2017-07-26 11:13:49 -07002898void wma_vdev_init(struct wma_txrx_node *vdev)
2899{
2900 qdf_wake_lock_create(&vdev->vdev_start_wakelock, "vdev_start");
2901 qdf_wake_lock_create(&vdev->vdev_stop_wakelock, "vdev_stop");
Rajeev Kumar155a3e42017-10-10 15:31:17 -07002902 qdf_wake_lock_create(&vdev->vdev_set_key_wakelock, "vdev_set_key");
Naveen Rawatd7734142017-10-27 10:02:40 -07002903 vdev->is_waiting_for_key = false;
Dustin Brownec2c92e2017-07-26 11:13:49 -07002904}
2905
2906void wma_vdev_deinit(struct wma_txrx_node *vdev)
2907{
Abhinav Kumar0a846132018-08-09 11:49:46 +05302908 struct beacon_info *bcn;
2909 tp_wma_handle wma_handle;
2910
2911 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
2912 /* validate the wma_handle */
2913 if (!wma_handle) {
2914 WMA_LOGE("%s: Invalid wma handle", __func__);
2915 return;
2916 }
2917
2918 bcn = vdev->beacon;
2919 if (bcn) {
2920 if (bcn->dma_mapped)
2921 qdf_nbuf_unmap_single(wma_handle->qdf_dev,
2922 bcn->buf, QDF_DMA_TO_DEVICE);
2923 qdf_nbuf_free(bcn->buf);
2924 qdf_mem_free(bcn);
2925 vdev->beacon = NULL;
2926 }
2927
2928 if (vdev->handle) {
2929 qdf_mem_free(vdev->handle);
2930 vdev->handle = NULL;
2931 }
2932
2933 if (vdev->addBssStaContext) {
2934 qdf_mem_free(vdev->addBssStaContext);
2935 vdev->addBssStaContext = NULL;
2936 }
2937
2938 if (vdev->staKeyParams) {
2939 qdf_mem_free(vdev->staKeyParams);
2940 vdev->staKeyParams = NULL;
2941 }
2942
2943 if (vdev->del_staself_req) {
2944 qdf_mem_free(vdev->del_staself_req);
2945 vdev->del_staself_req = NULL;
2946 }
2947
2948 if (vdev->stats_rsp) {
2949 qdf_mem_free(vdev->stats_rsp);
2950 vdev->stats_rsp = NULL;
2951 }
2952
2953 if (vdev->psnr_req) {
2954 qdf_mem_free(vdev->psnr_req);
2955 vdev->psnr_req = NULL;
2956 }
2957
2958 if (vdev->rcpi_req) {
2959 qdf_mem_free(vdev->rcpi_req);
2960 vdev->rcpi_req = NULL;
2961 }
2962
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +05302963 if (vdev->roam_scan_stats_req) {
2964 struct sir_roam_scan_stats *req;
2965
2966 req = vdev->roam_scan_stats_req;
2967 vdev->roam_scan_stats_req = NULL;
2968 qdf_mem_free(req);
2969 }
2970
Abhinav Kumar0a846132018-08-09 11:49:46 +05302971 if (vdev->roam_synch_frame_ind.bcn_probe_rsp) {
2972 qdf_mem_free(vdev->roam_synch_frame_ind.bcn_probe_rsp);
2973 vdev->roam_synch_frame_ind.bcn_probe_rsp = NULL;
2974 }
2975
2976 if (vdev->roam_synch_frame_ind.reassoc_req) {
2977 qdf_mem_free(vdev->roam_synch_frame_ind.reassoc_req);
2978 vdev->roam_synch_frame_ind.reassoc_req = NULL;
2979 }
2980
2981 if (vdev->roam_synch_frame_ind.reassoc_rsp) {
2982 qdf_mem_free(vdev->roam_synch_frame_ind.reassoc_rsp);
2983 vdev->roam_synch_frame_ind.reassoc_rsp = NULL;
2984 }
2985
Dustin Brownec2c92e2017-07-26 11:13:49 -07002986 qdf_wake_lock_destroy(&vdev->vdev_start_wakelock);
2987 qdf_wake_lock_destroy(&vdev->vdev_stop_wakelock);
Rajeev Kumar155a3e42017-10-10 15:31:17 -07002988 qdf_wake_lock_destroy(&vdev->vdev_set_key_wakelock);
Naveen Rawatd7734142017-10-27 10:02:40 -07002989 vdev->is_waiting_for_key = false;
Dustin Brownec2c92e2017-07-26 11:13:49 -07002990}
2991
Kabilan Kannanfc3a8c02018-02-21 13:36:29 -08002992/**
2993 * wma_wmi_stop() - generic function to block WMI commands
2994 * @return: None
2995 */
2996void wma_wmi_stop(void)
2997{
2998 tp_wma_handle wma_handle;
2999
3000 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Pragaspathi Thilagarajbc5a34b2018-10-09 18:35:45 +05303001 if ((!wma_handle) || (!wma_handle->wmi_handle)) {
Kabilan Kannanfc3a8c02018-02-21 13:36:29 -08003002 QDF_TRACE(QDF_MODULE_ID_WMI, QDF_TRACE_LEVEL_INFO,
Pragaspathi Thilagarajbc5a34b2018-10-09 18:35:45 +05303003 "wma_handle or wmi_handle is NULL\n");
Kabilan Kannanfc3a8c02018-02-21 13:36:29 -08003004 return;
3005 }
3006 wmi_stop(wma_handle->wmi_handle);
3007}
3008
Naveen Rawate8b1b822018-01-30 09:46:16 -08003009#ifdef QCA_SUPPORT_CP_STATS
3010static void wma_register_stats_events(wmi_unified_t wmi_handle) {}
3011#else
3012static void wma_register_stats_events(wmi_unified_t wmi_handle)
3013{
3014 wmi_unified_register_event_handler(wmi_handle,
3015 wmi_update_stats_event_id,
3016 wma_stats_event_handler,
3017 WMA_RX_SERIALIZER_CTX);
3018}
3019#endif
3020
Harprit Chhabada98225f62018-12-11 15:29:55 -08003021#ifdef CONFIG_WMI_BCN_OFFLOAD
3022static QDF_STATUS
3023wma_register_swba_events(wmi_unified_t wmi_handle)
3024{
3025 QDF_STATUS status;
3026
3027 status = wmi_unified_register_event_handler(wmi_handle,
3028 wmi_host_swba_event_id,
3029 wma_beacon_swba_handler,
3030 WMA_RX_SERIALIZER_CTX);
3031
3032 return status;
3033}
3034#else
3035static QDF_STATUS wma_register_swba_events(wmi_unified_t wmi_handle)
3036{
3037 return QDF_STATUS_SUCCESS;
3038}
3039#endif
3040
Nachiket Kukade177b5b02018-05-22 20:52:17 +05303041#ifdef FEATURE_WLAN_APF
3042static void wma_register_apf_events(tp_wma_handle wma_handle)
3043{
3044 if (!wma_handle) {
3045 QDF_TRACE(QDF_MODULE_ID_WMI, QDF_TRACE_LEVEL_INFO,
3046 "wma_handle is NULL\n");
3047 return;
3048 }
3049
3050 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3051 wmi_apf_capability_info_event_id,
3052 wma_get_apf_caps_event_handler,
3053 WMA_RX_SERIALIZER_CTX);
3054 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3055 wmi_apf_get_vdev_work_memory_resp_event_id,
3056 wma_apf_read_work_memory_event_handler,
3057 WMA_RX_SERIALIZER_CTX);
3058}
3059#else /* FEATURE_WLAN_APF */
3060static void wma_register_apf_events(tp_wma_handle wma_handle)
3061{
3062}
3063#endif /* FEATURE_WLAN_APF */
3064
Visweswara Tanuku633976b2019-01-07 16:13:12 +05303065#ifdef WLAN_FEATURE_MOTION_DETECTION
3066/**
3067 * wma_register_md_events - Register motion detection event handlers
3068 * @wma_handle: wma handle
3069 * Return: None
3070 */
3071static void wma_register_md_events(tp_wma_handle wma_handle)
3072{
3073 if (!wma_handle) {
3074 QDF_TRACE(QDF_MODULE_ID_WMI, QDF_TRACE_LEVEL_INFO,
3075 "wma_handle is NULL\n");
3076 return;
3077 }
3078
3079 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3080 WMI_MOTION_DET_HOST_EVENTID,
3081 wma_motion_det_host_event_handler,
3082 WMA_RX_SERIALIZER_CTX);
3083
3084 wmi_unified_register_event_handler(
3085 wma_handle->wmi_handle,
3086 WMI_MOTION_DET_BASE_LINE_HOST_EVENTID,
3087 wma_motion_det_base_line_host_event_handler,
3088 WMA_RX_SERIALIZER_CTX);
3089}
3090#else /* WLAN_FEATURE_MOTION_DETECTION */
3091/**
3092 * wma_register_md_events - Register motion detection event handlers
3093 * @wma_handle: wma handle
3094 * Return: None
3095 */
3096static void wma_register_md_events(tp_wma_handle wma_handle)
3097{
3098}
3099#endif /* WLAN_FEATURE_MOTION_DETECTION */
3100
Krunal Sonif9ba53d2019-01-03 21:44:41 -08003101#ifdef FEATURE_WLM_STATS
3102static void wma_register_wlm_stats_events(tp_wma_handle wma_handle)
3103{
3104 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3105 wmi_wlm_stats_event_id,
3106 wma_wlm_stats_rsp,
3107 WMA_RX_SERIALIZER_CTX);
3108}
3109#else /* FEATURE_WLM_STATS */
3110static void wma_register_wlm_stats_events(tp_wma_handle wma_handle)
3111{
3112}
3113#endif /* FEATURE_WLM_STATS */
3114
Arif Hussain49698112018-07-31 00:32:50 -07003115struct wlan_objmgr_psoc *wma_get_psoc_from_scn_handle(void *scn_handle)
3116{
3117 tp_wma_handle wma_handle;
3118
3119 if (!scn_handle) {
3120 WMA_LOGE("invalid scn handle");
3121 return NULL;
3122 }
3123 wma_handle = (tp_wma_handle)scn_handle;
3124
3125 return wma_handle->psoc;
3126}
3127
Pragaspathi Thilagaraj8b12fbe2019-01-22 15:59:28 +05303128void wma_get_phy_mode_cb(uint8_t chan, uint32_t chan_width, uint32_t *phy_mode)
Ashish Kumar Dhanotiyacd311c82018-09-14 10:55:10 +05303129{
3130 uint32_t dot11_mode;
Jeff Johnson009c40f2018-11-05 09:54:37 -08003131 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
Ashish Kumar Dhanotiyacd311c82018-09-14 10:55:10 +05303132
3133 if (!mac) {
3134 wma_err("MAC context is NULL");
3135 *phy_mode = MODE_UNKNOWN;
3136 return;
3137 }
3138
gaurank kathpalia1be77fa2019-01-04 13:32:09 +05303139 dot11_mode = mac->mlme_cfg->dot11_mode.dot11_mode;
Ashish Kumar Dhanotiyacd311c82018-09-14 10:55:10 +05303140 *phy_mode = wma_chan_phy_mode(chan, chan_width, dot11_mode);
3141}
3142
Nachiket Kukade15bd4f72019-02-19 17:30:50 +05303143#ifdef WLAN_FEATURE_NAN
3144static void
3145wma_register_nan_callbacks(tp_wma_handle wma_handle)
3146{
3147 struct nan_callbacks cb_obj = {0};
3148
3149 cb_obj.update_ndi_conn = wma_ndi_update_connection_info;
3150
3151 ucfg_nan_register_wma_callbacks(wma_handle->psoc, &cb_obj);
3152}
3153#else
3154static void wma_register_nan_callbacks(tp_wma_handle wma_handle)
3155{
3156}
3157#endif
3158
Ashish Kumar Dhanotiyacd311c82018-09-14 10:55:10 +05303159/**
Kabilan Kannanfc3a8c02018-02-21 13:36:29 -08003160 * wma_open() - Allocate wma context and initialize it.
3161 * @cds_context: cds context
3162 * @wma_tgt_cfg_cb: tgt config callback fun
3163 * @radar_ind_cb: dfs radar indication callback
3164 * @cds_cfg: mac parameters
3165 *
3166 * Return: 0 on success, errno on failure
3167 */
Jeff Johnsonff6addf2017-09-13 10:06:03 -07003168QDF_STATUS wma_open(struct wlan_objmgr_psoc *psoc,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003169 wma_tgt_cfg_cb tgt_cfg_cb,
bings482bae22018-01-17 16:25:31 +08003170 struct cds_config_info *cds_cfg,
3171 uint32_t target_type)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003172{
3173 tp_wma_handle wma_handle;
3174 HTC_HANDLE htc_handle;
Anurag Chouhan6d760662016-02-20 16:05:43 +05303175 qdf_device_t qdf_dev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003176 void *wmi_handle;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303177 QDF_STATUS qdf_status;
Lin Bai04f603e2018-03-19 11:01:06 +08003178 struct wmi_unified_attach_params *params;
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07003179 struct policy_mgr_wma_cbacks wma_cbacks;
Frank Liu00d73fe2017-05-19 22:11:28 +08003180 struct target_psoc_info *tgt_psoc_info;
Dustin Brownec2c92e2017-07-26 11:13:49 -07003181 int i;
Pragaspathi Thilagaraj00bd8bc2018-08-18 01:23:01 +05303182 bool val = 0;
Jeff Johnsonff6addf2017-09-13 10:06:03 -07003183 void *cds_context;
Arunk Khandavallicfde2712018-01-25 11:27:42 +05303184 target_resource_config *wlan_res_cfg;
Wu Gao51a63562018-11-08 16:29:10 +08003185 uint8_t delay_before_vdev_stop;
lifeng0b46ae52018-12-13 09:42:27 +08003186 uint32_t self_gen_frm_pwr = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003187
3188 WMA_LOGD("%s: Enter", __func__);
3189
Jeff Johnsonff6addf2017-09-13 10:06:03 -07003190 cds_context = cds_get_global_context();
3191 if (!cds_context) {
3192 WMA_LOGE("%s: Invalid CDS context", __func__);
3193 return QDF_STATUS_E_INVAL;
3194 }
3195
Mukul Sharma5ff3c582016-09-12 15:23:35 +05303196 g_wmi_version_info.major = __WMI_VER_MAJOR_;
3197 g_wmi_version_info.minor = __WMI_VER_MINOR_;
3198 g_wmi_version_info.revision = __WMI_REVISION_;
3199
Anurag Chouhan6d760662016-02-20 16:05:43 +05303200 qdf_dev = cds_get_context(QDF_MODULE_ID_QDF_DEVICE);
3201 htc_handle = cds_get_context(QDF_MODULE_ID_HTC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003202
3203 if (!htc_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003204 WMA_LOGE("%s: Invalid HTC handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303205 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003206 }
3207
3208 /* Alloc memory for WMA Context */
Jeff Johnsonadb3b1c2017-09-13 10:42:36 -07003209 qdf_status = cds_alloc_context(QDF_MODULE_ID_WMA,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003210 (void **)&wma_handle,
Jeff Johnsonadb3b1c2017-09-13 10:42:36 -07003211 sizeof(*wma_handle));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003212
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303213 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003214 WMA_LOGE("%s: Memory allocation failed for wma_handle",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003215 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303216 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003217 }
3218
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303219 qdf_mem_zero(wma_handle, sizeof(t_wma_handle));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003220
Arunk Khandavallia6305a32018-01-25 11:19:18 +05303221 if (target_if_alloc_psoc_tgt_info(psoc)) {
3222 WMA_LOGE("%s target psoc info allocation failed", __func__);
3223 qdf_status = QDF_STATUS_E_NOMEM;
3224 goto err_free_wma_handle;
Frank Liu00d73fe2017-05-19 22:11:28 +08003225 }
3226
Anurag Chouhan6d760662016-02-20 16:05:43 +05303227 if (cds_get_conparam() != QDF_GLOBAL_FTM_MODE) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003228#ifdef FEATURE_WLAN_EXTSCAN
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303229 qdf_wake_lock_create(&wma_handle->extscan_wake_lock,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003230 "wlan_extscan_wl");
3231#endif /* FEATURE_WLAN_EXTSCAN */
Mukul Sharmae44d0542017-05-23 21:50:56 +05303232 qdf_wake_lock_create(&wma_handle->wow_wake_lock,
3233 "wlan_wow_wl");
3234 qdf_wake_lock_create(&wma_handle->wow_auth_req_wl,
3235 "wlan_auth_req_wl");
3236 qdf_wake_lock_create(&wma_handle->wow_assoc_req_wl,
3237 "wlan_assoc_req_wl");
3238 qdf_wake_lock_create(&wma_handle->wow_deauth_rec_wl,
3239 "wlan_deauth_rec_wl");
3240 qdf_wake_lock_create(&wma_handle->wow_disassoc_rec_wl,
3241 "wlan_disassoc_rec_wl");
3242 qdf_wake_lock_create(&wma_handle->wow_ap_assoc_lost_wl,
3243 "wlan_ap_assoc_lost_wl");
3244 qdf_wake_lock_create(&wma_handle->wow_auto_shutdown_wl,
3245 "wlan_auto_shutdown_wl");
3246 qdf_wake_lock_create(&wma_handle->roam_ho_wl,
3247 "wlan_roam_ho_wl");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003248 }
3249
Selvaraj, Sridhar3a1823f2017-02-01 17:32:21 +05303250 qdf_status = wlan_objmgr_psoc_try_get_ref(psoc, WLAN_LEGACY_WMA_ID);
3251 if (QDF_IS_STATUS_ERROR(qdf_status)) {
3252 WMA_LOGE("%s: PSOC get_ref fails", __func__);
Zhu Jianminf9e2e2d2018-05-30 16:20:24 +08003253 goto err_get_psoc_ref;
Selvaraj, Sridhar3a1823f2017-02-01 17:32:21 +05303254 }
Selvaraj, Sridhar0672a122016-12-29 16:11:48 +05303255 wma_handle->psoc = psoc;
3256
Rajeev Kumarda2444c2017-01-10 22:42:07 -08003257 wma_target_if_open(wma_handle);
Rajeev Kumarda2444c2017-01-10 22:42:07 -08003258
Lin Bai04f603e2018-03-19 11:01:06 +08003259 /*
3260 * Allocate locally used params with its rx_ops member,
3261 * and free it immediately after used.
3262 */
3263 params = qdf_mem_malloc(sizeof(*params) + sizeof(struct wmi_rx_ops));
3264 if (!params) {
Lin Bai04f603e2018-03-19 11:01:06 +08003265 qdf_status = QDF_STATUS_E_NOMEM;
3266 goto err_wma_handle;
3267 }
3268
3269 params->rx_ops = (struct wmi_rx_ops *)(params + 1);
3270 params->osdev = NULL;
3271 params->target_type = WMI_TLV_TARGET;
3272 params->use_cookie = false;
3273 params->psoc = psoc;
3274 params->max_commands = WMI_MAX_CMDS;
Govind Singhd76a5b02016-03-08 15:12:14 +05303275 /* Attach mc_thread context processing function */
Lin Bai04f603e2018-03-19 11:01:06 +08003276 params->rx_ops->wma_process_fw_event_handler_cbk =
3277 wma_process_fw_event_handler;
Surabhi Vishnoi75b1a812018-02-09 12:07:16 +05303278
Himanshu Agarwal88b16a42018-02-06 15:10:59 +05303279 /* initialize tlv attach */
3280 wmi_tlv_init();
Surabhi Vishnoi75b1a812018-02-09 12:07:16 +05303281
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003282 /* attach the wmi */
Lin Bai04f603e2018-03-19 11:01:06 +08003283 wmi_handle = wmi_unified_attach(wma_handle, params);
3284 qdf_mem_free(params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003285 if (!wmi_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003286 WMA_LOGE("%s: failed to attach WMI", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303287 qdf_status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003288 goto err_wma_handle;
3289 }
3290
Rajeev Kumarda2444c2017-01-10 22:42:07 -08003291 target_if_register_legacy_service_ready_cb(
3292 wma_legacy_service_ready_event_handler);
3293
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003294 WMA_LOGA("WMA --> wmi_unified_attach - success");
Mukul Sharmacc1f3f92017-01-30 19:56:24 +05303295
Frank Liu00d73fe2017-05-19 22:11:28 +08003296 /* store the wmi handle in tgt_if_handle */
Arunk Khandavallia6305a32018-01-25 11:19:18 +05303297 tgt_psoc_info = wlan_psoc_get_tgt_if_handle(psoc);
Mukul Sharmacc1f3f92017-01-30 19:56:24 +05303298
bings6b413662018-02-06 17:51:36 +08003299 target_psoc_set_target_type(tgt_psoc_info, target_type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003300 /* Save the WMI & HTC handle */
Arunk Khandavallia6305a32018-01-25 11:19:18 +05303301 target_psoc_set_wmi_hdl(tgt_psoc_info, wmi_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003302 wma_handle->wmi_handle = wmi_handle;
Arunk Khandavallia6305a32018-01-25 11:19:18 +05303303 target_psoc_set_htc_hdl(tgt_psoc_info, htc_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003304 wma_handle->cds_context = cds_context;
Anurag Chouhan6d760662016-02-20 16:05:43 +05303305 wma_handle->qdf_dev = qdf_dev;
Arunk Khandavallia6305a32018-01-25 11:19:18 +05303306 /* Register Converged Event handlers */
3307 init_deinit_register_tgt_psoc_ev_handlers(psoc);
3308
Manishekar Chandrasekaranebcab882016-05-04 12:55:14 +05303309 /* Initialize max_no_of_peers for wma_get_number_of_peers_supported() */
Rachit Kankane0106e382018-05-16 18:59:28 +05303310 cds_cfg->max_station = wma_init_max_no_of_peers(wma_handle,
3311 cds_cfg->max_station);
Manishekar Chandrasekaranebcab882016-05-04 12:55:14 +05303312
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003313 /* initialize default target config */
Arunk Khandavallicfde2712018-01-25 11:27:42 +05303314 wlan_res_cfg = target_psoc_get_wlan_res_cfg(tgt_psoc_info);
Arif Hussaind15902c2018-03-02 00:08:29 -08003315 if (!wlan_res_cfg) {
3316 WMA_LOGE("%s: wlan_res_cfg is null", __func__);
3317 qdf_status = QDF_STATUS_E_NOMEM;
3318 goto err_wma_handle;
3319 }
Arunk Khandavallicfde2712018-01-25 11:27:42 +05303320
Rachit Kankane0106e382018-05-16 18:59:28 +05303321 wma_set_default_tgt_config(wma_handle, wlan_res_cfg, cds_cfg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003322
Pragaspathi Thilagaraj00bd8bc2018-08-18 01:23:01 +05303323 qdf_status = wlan_mlme_get_tx_chainmask_cck(psoc, &val);
3324 if (qdf_status != QDF_STATUS_SUCCESS) {
3325 WMA_LOGE("%s: Failed to get tx_chainmask_cck", __func__);
3326 qdf_status = QDF_STATUS_E_FAILURE;
3327 goto err_wma_handle;
3328 }
3329 wma_handle->tx_chain_mask_cck = val;
lifeng0b46ae52018-12-13 09:42:27 +08003330
3331 qdf_status = wlan_mlme_get_self_gen_frm_pwr(psoc, &self_gen_frm_pwr);
3332 if (qdf_status != QDF_STATUS_SUCCESS)
3333 WMA_LOGE("%s: Failed to get self_gen_frm_pwr", __func__);
3334 wma_handle->self_gen_frm_pwr = self_gen_frm_pwr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003335
Dustin Browne8d91fc2019-02-04 14:49:04 -08003336 cds_cfg->max_bssid = WLAN_MAX_VDEVS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003337
Arun Khandavallic811dcc2016-06-26 07:37:21 +05303338 wma_handle->max_station = cds_cfg->max_station;
3339 wma_handle->max_bssid = cds_cfg->max_bssid;
Wu Gao66454f12018-09-26 19:55:41 +08003340 wma_handle->enable_mc_list =
3341 ucfg_pmo_is_mc_addr_list_enabled(wma_handle->psoc);
Wu Gao9d117fb2019-01-10 21:52:31 +08003342 wma_handle->active_uc_apf_mode =
3343 ucfg_pmo_get_active_uc_apf_mode(wma_handle->psoc);
3344 wma_handle->active_mc_bc_apf_mode =
3345 ucfg_pmo_get_active_mc_bc_apf_mode(wma_handle->psoc);
Srinivas Girigowda57b450e2016-10-27 21:00:46 -07003346 wma_handle->link_stats_results = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003347#ifdef WLAN_FEATURE_LPSS
Arun Khandavallic811dcc2016-06-26 07:37:21 +05303348 wma_handle->is_lpass_enabled = cds_cfg->is_lpass_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003349#endif
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303350 wma_handle->interfaces = qdf_mem_malloc(sizeof(struct wma_txrx_node) *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003351 wma_handle->max_bssid);
3352 if (!wma_handle->interfaces) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303353 qdf_status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003354 goto err_scn_context;
3355 }
Dustin Brownec2c92e2017-07-26 11:13:49 -07003356
Zhu Jianmina2f8e8d2018-02-11 16:37:10 +08003357 for (i = 0; i < wma_handle->max_bssid; ++i) {
Dustin Brownec2c92e2017-07-26 11:13:49 -07003358 wma_vdev_init(&wma_handle->interfaces[i]);
Wu Gao51a63562018-11-08 16:29:10 +08003359 ucfg_mlme_get_delay_before_vdev_stop(wma_handle->psoc,
3360 &delay_before_vdev_stop);
Zhu Jianmina2f8e8d2018-02-11 16:37:10 +08003361 wma_handle->interfaces[i].delay_before_vdev_stop =
Wu Gao51a63562018-11-08 16:29:10 +08003362 delay_before_vdev_stop;
Zhu Jianmina2f8e8d2018-02-11 16:37:10 +08003363 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003364 /* Register the debug print event handler */
3365 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303366 wmi_debug_print_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303367 wma_unified_debug_print_event_handler,
3368 WMA_RX_SERIALIZER_CTX);
Govind Singha471e5e2015-10-12 17:11:14 +05303369 /* Register profiling event Handler */
3370 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303371 wmi_wlan_profile_data_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303372 wma_profile_data_report_event_handler,
3373 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003374
3375 wma_handle->tgt_cfg_update_cb = tgt_cfg_cb;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003376 wma_handle->old_hw_mode_index = WMA_DEFAULT_HW_MODE_INDEX;
3377 wma_handle->new_hw_mode_index = WMA_DEFAULT_HW_MODE_INDEX;
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05303378 wma_handle->saved_chan.num_channels = 0;
Sandeep Puligillaafa52892016-10-26 19:03:16 -07003379 wma_handle->fw_timeout_crash = cds_cfg->fw_timeout_crash;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003380
Anurag Chouhan210db072016-02-22 18:42:15 +05303381 qdf_status = qdf_mc_timer_init(&wma_handle->service_ready_ext_timer,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303382 QDF_TIMER_TYPE_SW,
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05303383 wma_service_ready_ext_evt_timeout,
3384 wma_handle);
Anurag Chouhandf2b2682016-02-29 14:15:27 +05303385 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05303386 WMA_LOGE("Failed to initialize service ready ext timeout");
3387 goto err_event_init;
3388 }
3389
Anurag Chouhandf2b2682016-02-29 14:15:27 +05303390 qdf_status = qdf_event_create(&wma_handle->target_suspend);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303391 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003392 WMA_LOGE("%s: target suspend event initialization failed",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003393 __func__);
3394 goto err_event_init;
3395 }
3396
3397 /* Init Tx Frame Complete event */
Anurag Chouhandf2b2682016-02-29 14:15:27 +05303398 qdf_status = qdf_event_create(&wma_handle->tx_frm_download_comp_event);
3399 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003400 WMA_LOGE("%s: failed to init tx_frm_download_comp_event",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003401 __func__);
3402 goto err_event_init;
3403 }
3404
3405 /* Init tx queue empty check event */
Anurag Chouhandf2b2682016-02-29 14:15:27 +05303406 qdf_status = qdf_event_create(&wma_handle->tx_queue_empty_event);
3407 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003408 WMA_LOGE("%s: failed to init tx_queue_empty_event", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003409 goto err_event_init;
3410 }
3411
Prashanth Bhattae675ca72016-10-20 18:42:37 -07003412 qdf_status = cds_shutdown_notifier_register(wma_shutdown_notifier_cb,
3413 wma_handle);
3414 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003415 WMA_LOGE("%s: Shutdown notifier register failed: %d",
Prashanth Bhattae675ca72016-10-20 18:42:37 -07003416 __func__, qdf_status);
3417 goto err_event_init;
3418 }
3419
Anurag Chouhandf2b2682016-02-29 14:15:27 +05303420 qdf_status = qdf_event_create(&wma_handle->runtime_suspend);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303421 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003422 WMA_LOGE("%s: runtime_suspend event initialization failed",
Houston Hoffmana76591b2015-11-10 16:52:05 -08003423 __func__);
3424 goto err_event_init;
3425 }
3426
Anurag Chouhandf2b2682016-02-29 14:15:27 +05303427 qdf_status = qdf_event_create(&wma_handle->recovery_event);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303428 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003429 WMA_LOGE("%s: recovery event initialization failed", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003430 goto err_event_init;
3431 }
3432
Anurag Chouhanffb21542016-02-17 14:33:03 +05303433 qdf_list_create(&wma_handle->vdev_resp_queue,
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -07003434 MAX_ENTRY_VDEV_RESP_QUEUE);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303435 qdf_spinlock_create(&wma_handle->vdev_respq_lock);
Anurag Chouhanffb21542016-02-17 14:33:03 +05303436 qdf_list_create(&wma_handle->wma_hold_req_queue,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003437 MAX_ENTRY_HOLD_REQ_QUEUE);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303438 qdf_spinlock_create(&wma_handle->wma_hold_req_q_lock);
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05303439 qdf_atomic_init(&wma_handle->is_wow_bus_suspended);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003440
3441 /* Register vdev start response event handler */
3442 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303443 wmi_vdev_start_resp_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303444 wma_vdev_start_resp_handler,
3445 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003446
3447 /* Register vdev stop response event handler */
3448 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303449 wmi_vdev_stopped_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303450 wma_vdev_stop_resp_handler,
3451 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003452
3453 /* register for STA kickout function */
3454 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303455 wmi_peer_sta_kickout_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303456 wma_peer_sta_kickout_event_handler,
3457 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003458
Naveen Rawate8b1b822018-01-30 09:46:16 -08003459 /* register for stats event */
3460 wma_register_stats_events(wma_handle->wmi_handle);
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05303461
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05303462 /* register for stats response event */
3463 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303464 wmi_get_arp_stats_req_id,
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05303465 wma_get_arp_stats_handler,
3466 WMA_RX_SERIALIZER_CTX);
3467
Qun Zhangef655622019-02-25 10:48:10 +08003468 /* register for fw state response event */
3469 wma_register_fw_state_events(wma_handle->wmi_handle);
3470
Will Huanga9814592017-05-24 15:47:58 +08003471 /* register for peer info response event */
3472 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303473 wmi_peer_stats_info_event_id,
Will Huanga9814592017-05-24 15:47:58 +08003474 wma_peer_info_event_handler,
3475 WMA_RX_SERIALIZER_CTX);
3476
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05303477#ifdef WLAN_POWER_DEBUGFS
3478 /* register for Chip Power stats event */
3479 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303480 wmi_pdev_chip_power_stats_event_id,
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05303481 wma_unified_power_debug_stats_event_handler,
3482 WMA_RX_SERIALIZER_CTX);
3483#endif
Arunk Khandavallica56d4b2018-11-29 15:46:00 +05303484#ifdef WLAN_FEATURE_BEACON_RECEPTION_STATS
3485 /* register for beacon stats event */
3486 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3487 wmi_vdev_bcn_reception_stats_event_id,
3488 wma_unified_beacon_debug_stats_event_handler,
3489 WMA_RX_SERIALIZER_CTX);
3490#endif
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05303491
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003492 /* register for linkspeed response event */
3493 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303494 wmi_peer_estimated_linkspeed_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303495 wma_link_speed_event_handler,
3496 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003497
3498#ifdef FEATURE_OEM_DATA_SUPPORT
3499 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303500 wmi_oem_response_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303501 wma_oem_data_response_handler,
3502 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003503#endif /* FEATURE_OEM_DATA_SUPPORT */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003504
3505 /* Register peer change event handler */
3506 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303507 wmi_peer_state_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303508 wma_peer_state_change_event_handler,
3509 WMA_RX_WORK_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003510
3511 /* Register beacon tx complete event id. The event is required
3512 * for sending channel switch announcement frames
3513 */
3514 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303515 wmi_offload_bcn_tx_status_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303516 wma_unified_bcntx_status_event_handler,
3517 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003518
3519 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303520 wmi_update_vdev_rate_stats_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303521 wma_link_status_event_handler,
3522 WMA_RX_SERIALIZER_CTX);
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +05303523
3524 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3525 wmi_roam_scan_stats_event_id,
3526 wma_roam_scan_stats_event_handler,
3527 WMA_RX_SERIALIZER_CTX);
3528
Yeshwanth Sriram Guntukafa9f3792019-02-28 18:24:58 +05303529 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3530 wmi_pdev_cold_boot_cal_event_id,
3531 wma_cold_boot_cal_event_handler,
3532 WMA_RX_WORK_CTX);
3533
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003534#ifdef WLAN_FEATURE_LINK_LAYER_STATS
3535 /* Register event handler for processing Link Layer Stats
3536 * response from the FW
3537 */
3538 wma_register_ll_stats_event_handler(wma_handle);
3539
3540#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
3541
SaidiReddy Yenugacc733af2016-11-09 17:45:42 +05303542 wmi_set_tgt_assert(wma_handle->wmi_handle,
3543 cds_cfg->force_target_assert_enabled);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003544 /* Firmware debug log */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303545 qdf_status = dbglog_init(wma_handle->wmi_handle);
3546 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07003547 WMA_LOGE("%s: Firmware Dbglog initialization failed", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003548 goto err_dbglog_init;
3549 }
3550
3551 /*
3552 * Update Powersave mode
3553 * 1 - Legacy Powersave + Deepsleep Disabled
3554 * 2 - QPower + Deepsleep Disabled
3555 * 3 - Legacy Powersave + Deepsleep Enabled
3556 * 4 - QPower + Deepsleep Enabled
3557 */
Wu Gao66454f12018-09-26 19:55:41 +08003558 wma_handle->powersave_mode =
3559 ucfg_pmo_power_save_offload_enabled(wma_handle->psoc);
Arun Khandavallic811dcc2016-06-26 07:37:21 +05303560 wma_handle->staMaxLIModDtim = cds_cfg->sta_maxlimod_dtim;
Wu Gao66454f12018-09-26 19:55:41 +08003561 wma_handle->staModDtim = ucfg_pmo_get_sta_mod_dtim(wma_handle->psoc);
3562 wma_handle->staDynamicDtim =
3563 ucfg_pmo_get_sta_dynamic_dtim(wma_handle->psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003564
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003565 /* register for install key completion event */
3566 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303567 wmi_vdev_install_key_complete_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303568 wma_vdev_install_key_complete_event_handler,
3569 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003570
3571#ifdef WLAN_FEATURE_STATS_EXT
3572 /* register for extended stats event */
3573 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303574 wmi_stats_ext_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303575 wma_stats_ext_event_handler,
3576 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003577#endif /* WLAN_FEATURE_STATS_EXT */
3578#ifdef FEATURE_WLAN_EXTSCAN
3579 wma_register_extscan_event_handler(wma_handle);
3580#endif /* WLAN_FEATURE_STATS_EXT */
3581
3582 WMA_LOGD("%s: Exit", __func__);
3583
3584#ifdef WLAN_FEATURE_ROAM_OFFLOAD
3585 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303586 wmi_roam_synch_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303587 wma_roam_synch_event_handler,
3588 WMA_RX_SERIALIZER_CTX);
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05303589 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303590 wmi_roam_synch_frame_event_id,
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05303591 wma_roam_synch_frame_event_handler,
3592 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003593#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
3594 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303595 wmi_rssi_breach_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303596 wma_rssi_breached_event_handler,
3597 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003598
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303599 qdf_wake_lock_create(&wma_handle->wmi_cmd_rsp_wake_lock,
Govind Singhd76a5b02016-03-08 15:12:14 +05303600 "wlan_fw_rsp_wakelock");
Prashanth Bhatta87b6dc02017-01-19 15:17:58 -08003601 qdf_runtime_lock_init(&wma_handle->wmi_cmd_rsp_runtime_lock);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003602
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003603 /* Register peer assoc conf event handler */
3604 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303605 wmi_peer_assoc_conf_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303606 wma_peer_assoc_conf_handler,
3607 WMA_RX_SERIALIZER_CTX);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003608 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303609 wmi_vdev_delete_resp_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303610 wma_vdev_delete_handler,
3611 WMA_RX_SERIALIZER_CTX);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003612 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303613 wmi_peer_delete_response_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303614 wma_peer_delete_handler,
3615 WMA_RX_SERIALIZER_CTX);
Arun Khandavalli2476ef52016-04-26 20:19:43 +05303616 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303617 wmi_chan_info_event_id,
Kapil Gupta4f0c0c12017-02-07 15:21:15 +05303618 wma_chan_info_event_handler,
3619 WMA_RX_SERIALIZER_CTX);
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08003620 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303621 wmi_dbg_mesg_flush_complete_event_id,
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08003622 wma_flush_complete_evt_handler,
Rajeev Kumarc3032b82017-02-14 15:56:01 -08003623 WMA_RX_WORK_CTX);
lifeng66831662017-05-19 16:01:35 +08003624 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303625 wmi_report_rx_aggr_failure_event_id,
lifeng66831662017-05-19 16:01:35 +08003626 wma_rx_aggr_failure_event_handler,
3627 WMA_RX_SERIALIZER_CTX);
Rajeev Kumar91ac6ac2017-02-14 15:49:14 -08003628
Ashish Kumar Dhanotiya9335d812017-06-30 16:57:20 +05303629 wma_handle->ito_repeat_count = cds_cfg->ito_repeat_count;
Sandeep Puligilla819d94f2017-10-10 18:33:56 -07003630 wma_handle->bandcapability = cds_cfg->bandcapability;
Ashish Kumar Dhanotiya9335d812017-06-30 16:57:20 +05303631
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +05303632 /* Register PWR_SAVE_FAIL event only in case of recovery(1) */
Wu Gao66454f12018-09-26 19:55:41 +08003633 if (ucfg_pmo_get_auto_power_fail_mode(wma_handle->psoc) ==
Hanumanth Reddy Pothulaab395952017-09-05 19:12:26 +05303634 PMO_FW_TO_SEND_WOW_IND_ON_PWR_FAILURE) {
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +05303635 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303636 wmi_pdev_chip_pwr_save_failure_detect_event_id,
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +05303637 wma_chip_power_save_failure_detected_handler,
3638 WMA_RX_WORK_CTX);
3639 }
3640
lifengd217d192017-05-09 19:44:16 +08003641 wmi_unified_register_event_handler(wma_handle->wmi_handle,
lifengfe6c3e22018-04-03 12:10:04 +08003642 wmi_pdev_div_rssi_antid_event_id,
3643 wma_pdev_div_info_evt_handler,
lifengd217d192017-05-09 19:44:16 +08003644 WMA_RX_WORK_CTX);
3645
Frank Liu65b17d92016-11-23 15:58:44 +08003646
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05303647 wma_register_debug_callback();
Ashish Kumar Dhanotiyacd311c82018-09-14 10:55:10 +05303648 wifi_pos_register_get_phy_mode_cb(wma_handle->psoc,
3649 wma_get_phy_mode_cb);
3650
Mukul Sharma6411bb82017-03-01 15:57:07 +05303651 /* Register callback with PMO so PMO can update the vdev pause bitmap*/
3652 pmo_register_pause_bitmap_notifier(wma_handle->psoc,
3653 wma_vdev_update_pause_bitmap);
3654 pmo_register_get_pause_bitmap(wma_handle->psoc,
3655 wma_vdev_get_pause_bitmap);
Will Huangad015772018-06-15 11:27:50 +08003656 pmo_register_get_vdev_dp_handle(wma_handle->psoc,
3657 wma_vdev_get_vdev_dp_handle);
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +05303658 pmo_register_is_device_in_low_pwr_mode(wma_handle->psoc,
3659 wma_vdev_is_device_in_low_pwr_mode);
Nachiket Kukade37b4e6d2018-06-01 18:44:42 +05303660 pmo_register_get_dtim_period_callback(wma_handle->psoc,
3661 wma_vdev_get_dtim_period);
3662 pmo_register_get_beacon_interval_callback(wma_handle->psoc,
3663 wma_vdev_get_beacon_interval);
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07003664 wma_cbacks.wma_get_connection_info = wma_get_connection_info;
Nachiket Kukade15bd4f72019-02-19 17:30:50 +05303665 wma_register_nan_callbacks(wma_handle);
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07003666 qdf_status = policy_mgr_register_wma_cb(wma_handle->psoc, &wma_cbacks);
3667 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
3668 WMA_LOGE("Failed to register wma cb with Policy Manager");
3669 }
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05303670
Arif Hussainf63f7a32017-08-22 12:49:42 -07003671 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303672 wmi_phyerr_event_id,
Arif Hussainf63f7a32017-08-22 12:49:42 -07003673 wma_unified_phyerr_rx_event_handler,
3674 WMA_RX_WORK_CTX);
3675
Arif Hussainee10f902017-12-27 16:30:17 -08003676 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3677 wmi_sap_obss_detection_report_event_id,
3678 wma_vdev_obss_detection_info_handler,
3679 WMA_RX_SERIALIZER_CTX);
3680
Arif Hussain05fb4872018-01-03 16:02:55 -08003681 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3682 wmi_obss_color_collision_report_event_id,
3683 wma_vdev_bss_color_collision_info_handler,
3684 WMA_RX_WORK_CTX);
3685
Varun Reddy Yeturud33033f2018-06-11 10:58:30 -07003686#ifdef WLAN_SUPPORT_TWT
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -07003687 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3688 wmi_twt_enable_complete_event_id,
3689 wma_twt_en_complete_event_handler,
3690 WMA_RX_SERIALIZER_CTX);
3691#endif
3692
Nachiket Kukade177b5b02018-05-22 20:52:17 +05303693 wma_register_apf_events(wma_handle);
Visweswara Tanuku633976b2019-01-07 16:13:12 +05303694 wma_register_md_events(wma_handle);
Krunal Sonif9ba53d2019-01-03 21:44:41 -08003695 wma_register_wlm_stats_events(wma_handle);
Arun Kumar Khandavallideda5a82019-03-11 15:32:19 +05303696 wma_register_mws_coex_events(wma_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303697 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003698
3699err_dbglog_init:
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303700 qdf_wake_lock_destroy(&wma_handle->wmi_cmd_rsp_wake_lock);
Prashanth Bhatta87b6dc02017-01-19 15:17:58 -08003701 qdf_runtime_lock_deinit(&wma_handle->wmi_cmd_rsp_runtime_lock);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303702 qdf_spinlock_destroy(&wma_handle->vdev_respq_lock);
3703 qdf_spinlock_destroy(&wma_handle->wma_hold_req_q_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003704err_event_init:
3705 wmi_unified_unregister_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303706 wmi_debug_print_event_id);
Dustin Brownec2c92e2017-07-26 11:13:49 -07003707
3708 for (i = 0; i < wma_handle->max_bssid; ++i)
3709 wma_vdev_deinit(&wma_handle->interfaces[i]);
3710
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303711 qdf_mem_free(wma_handle->interfaces);
Dustin Brownec2c92e2017-07-26 11:13:49 -07003712
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003713err_scn_context:
Jeff Johnson2b6982c2018-05-29 14:56:11 -07003714 qdf_mem_free(((struct cds_context *) cds_context)->cfg_ctx);
Rajeev Kumarfe6e62f2018-10-22 16:18:41 -07003715 ((struct cds_context *)cds_context)->cfg_ctx = NULL;
Dustin Brown96310112019-02-21 16:42:58 -08003716 qdf_mem_free(wmi_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003717
3718err_wma_handle:
Zhu Jianminf9e2e2d2018-05-30 16:20:24 +08003719 wlan_objmgr_psoc_release_ref(psoc, WLAN_LEGACY_WMA_ID);
3720err_get_psoc_ref:
Arunk Khandavallia6305a32018-01-25 11:19:18 +05303721 target_if_free_psoc_tgt_info(psoc);
Anurag Chouhan6d760662016-02-20 16:05:43 +05303722 if (cds_get_conparam() != QDF_GLOBAL_FTM_MODE) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003723#ifdef FEATURE_WLAN_EXTSCAN
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303724 qdf_wake_lock_destroy(&wma_handle->extscan_wake_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003725#endif /* FEATURE_WLAN_EXTSCAN */
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303726 qdf_wake_lock_destroy(&wma_handle->wow_wake_lock);
Mukul Sharmae44d0542017-05-23 21:50:56 +05303727 qdf_wake_lock_destroy(&wma_handle->wow_auth_req_wl);
3728 qdf_wake_lock_destroy(&wma_handle->wow_assoc_req_wl);
3729 qdf_wake_lock_destroy(&wma_handle->wow_deauth_rec_wl);
3730 qdf_wake_lock_destroy(&wma_handle->wow_disassoc_rec_wl);
3731 qdf_wake_lock_destroy(&wma_handle->wow_ap_assoc_lost_wl);
3732 qdf_wake_lock_destroy(&wma_handle->wow_auto_shutdown_wl);
3733 qdf_wake_lock_destroy(&wma_handle->roam_ho_wl);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003734 }
Arunk Khandavallia6305a32018-01-25 11:19:18 +05303735err_free_wma_handle:
Jeff Johnsonadb3b1c2017-09-13 10:42:36 -07003736 cds_free_context(QDF_MODULE_ID_WMA, wma_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003737
3738 WMA_LOGD("%s: Exit", __func__);
3739
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303740 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003741}
3742
3743/**
3744 * wma_pre_start() - wma pre start
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003745 *
3746 * Return: 0 on success, errno on failure
3747 */
Jeff Johnson8ad89c62017-09-13 08:55:55 -07003748QDF_STATUS wma_pre_start(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003749{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303750 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003751 tp_wma_handle wma_handle;
Arunk Khandavallia6305a32018-01-25 11:19:18 +05303752 void *htc_handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003753
3754 WMA_LOGD("%s: Enter", __func__);
3755
Anurag Chouhan6d760662016-02-20 16:05:43 +05303756 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003757
3758 /* Validate the wma_handle */
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07003759 if (!wma_handle) {
Arunk Khandavallia6305a32018-01-25 11:19:18 +05303760 WMA_LOGE("%s: invalid wma handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303761 qdf_status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003762 goto end;
3763 }
Nachiket Kukade8003d252017-03-30 15:55:58 +05303764
Sourav Mohapatracf632572018-04-02 11:01:35 +05303765 htc_handle = lmac_get_htc_hdl(wma_handle->psoc);
Arunk Khandavallia6305a32018-01-25 11:19:18 +05303766 if (!htc_handle) {
3767 WMA_LOGE("%s: invalid htc handle", __func__);
3768 qdf_status = QDF_STATUS_E_INVAL;
3769 goto end;
3770 }
3771
3772 /* Open endpoint for ctrl path - WMI <--> HTC */
3773 qdf_status = wmi_unified_connect_htc_service(wma_handle->wmi_handle,
3774 htc_handle);
3775 if (qdf_status != QDF_STATUS_SUCCESS) {
3776 WMA_LOGE("%s: wmi_unified_connect_htc_service", __func__);
Nachiket Kukade8003d252017-03-30 15:55:58 +05303777 if (!cds_is_fw_down())
3778 QDF_BUG(0);
3779
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303780 qdf_status = QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003781 goto end;
3782 }
3783
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08003784 WMA_LOGD("WMA --> wmi_unified_connect_htc_service - success");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003785
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003786end:
3787 WMA_LOGD("%s: Exit", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303788 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003789}
3790
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303791void wma_send_msg_by_priority(tp_wma_handle wma_handle, uint16_t msg_type,
3792 void *body_ptr, uint32_t body_val, bool is_high_priority)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003793{
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303794 struct scheduler_msg msg = {0};
3795 QDF_STATUS status;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003796
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003797 msg.type = msg_type;
3798 msg.bodyval = body_val;
3799 msg.bodyptr = body_ptr;
Will Huang9323e852018-02-02 17:55:15 +08003800 msg.flush_callback = wma_discard_fw_event;
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303801
3802 status = scheduler_post_msg_by_priority(QDF_MODULE_ID_PE,
3803 &msg, is_high_priority);
3804 if (!QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303805 if (body_ptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303806 qdf_mem_free(body_ptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003807 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003808}
3809
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303810
3811void wma_send_msg(tp_wma_handle wma_handle, uint16_t msg_type,
3812 void *body_ptr, uint32_t body_val)
3813{
3814 wma_send_msg_by_priority(wma_handle, msg_type,
3815 body_ptr, body_val, false);
3816}
3817
3818void wma_send_msg_high_priority(tp_wma_handle wma_handle, uint16_t msg_type,
3819 void *body_ptr, uint32_t body_val)
3820{
3821 wma_send_msg_by_priority(wma_handle, msg_type,
3822 body_ptr, body_val, true);
3823}
3824
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003825/**
3826 * wma_set_base_macaddr_indicate() - set base mac address in fw
3827 * @wma_handle: wma handle
3828 * @customAddr: base mac address
3829 *
3830 * Return: 0 for success or error code
3831 */
3832static int wma_set_base_macaddr_indicate(tp_wma_handle wma_handle,
3833 tSirMacAddr *customAddr)
3834{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003835 int err;
3836
Govind Singhf25a0f12016-03-08 16:09:48 +05303837 err = wmi_unified_set_base_macaddr_indicate_cmd(wma_handle->wmi_handle,
3838 (uint8_t *)customAddr);
3839 if (err)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003840 return -EIO;
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -07003841 wma_debug("Base MAC Addr: " QDF_MAC_ADDR_STR,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -07003842 QDF_MAC_ADDR_ARRAY((*customAddr)));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003843
3844 return 0;
3845}
3846
3847/**
3848 * wma_log_supported_evt_handler() - Enable/Disable FW diag/log events
3849 * @handle: WMA handle
3850 * @event: Event received from FW
3851 * @len: Length of the event
3852 *
3853 * Enables the low frequency events and disables the high frequency
3854 * events. Bit 17 indicates if the event if low/high frequency.
3855 * 1 - high frequency, 0 - low frequency
3856 *
3857 * Return: 0 on successfully enabling/disabling the events
3858 */
3859static int wma_log_supported_evt_handler(void *handle,
3860 uint8_t *event,
3861 uint32_t len)
3862{
3863 tp_wma_handle wma = (tp_wma_handle) handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003864
Govind Singhf25a0f12016-03-08 16:09:48 +05303865 if (wmi_unified_log_supported_evt_cmd(wma->wmi_handle,
3866 event, len))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003867 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003868
3869 return 0;
3870}
3871
3872/**
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303873 * wma_pdev_set_hw_mode_resp_evt_handler() - Set HW mode resp evt handler
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003874 * @handle: WMI handle
3875 * @event: Event recevied from FW
3876 * @len: Length of the event
3877 *
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303878 * Event handler for WMI_PDEV_SET_HW_MODE_RESP_EVENTID that is sent to host
3879 * driver in response to a WMI_PDEV_SET_HW_MODE_CMDID being sent to WLAN
3880 * firmware
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003881 *
Dustin Brownec2c92e2017-07-26 11:13:49 -07003882 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003883 */
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303884static int wma_pdev_set_hw_mode_resp_evt_handler(void *handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003885 uint8_t *event,
3886 uint32_t len)
3887{
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303888 WMI_PDEV_SET_HW_MODE_RESP_EVENTID_param_tlvs *param_buf;
3889 wmi_pdev_set_hw_mode_response_event_fixed_param *wmi_event;
3890 wmi_pdev_set_hw_mode_response_vdev_mac_entry *vdev_mac_entry;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003891 uint32_t i;
3892 struct sir_set_hw_mode_resp *hw_mode_resp;
3893 tp_wma_handle wma = (tp_wma_handle) handle;
3894
3895 if (!wma) {
3896 WMA_LOGE("%s: Invalid WMA handle", __func__);
3897 /* Since WMA handle itself is NULL, we cannot send fail
3898 * response back to LIM here
3899 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303900 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003901 }
Dustin Brownec2c92e2017-07-26 11:13:49 -07003902
3903 wma_release_wakelock(&wma->wmi_cmd_rsp_wake_lock);
Tushnim Bhattacharyya4a03db82017-11-10 17:58:28 -08003904 wma_remove_req(wma, 0, WMA_PDEV_SET_HW_MODE_RESP);
Dustin Brownec2c92e2017-07-26 11:13:49 -07003905
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303906 hw_mode_resp = qdf_mem_malloc(sizeof(*hw_mode_resp));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003907 if (!hw_mode_resp) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003908 /* Since this memory allocation itself failed, we cannot
3909 * send fail response back to LIM here
3910 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303911 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003912 }
3913
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303914 param_buf = (WMI_PDEV_SET_HW_MODE_RESP_EVENTID_param_tlvs *) event;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003915 if (!param_buf) {
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303916 WMA_LOGE("Invalid WMI_PDEV_SET_HW_MODE_RESP_EVENTID event");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003917 /* Need to send response back to upper layer to free
3918 * active command list
3919 */
3920 goto fail;
3921 }
Krunal Soni50a05542017-10-03 19:39:48 -07003922 if (param_buf->fixed_param->num_vdev_mac_entries >=
3923 MAX_VDEV_SUPPORTED) {
3924 WMA_LOGE("num_vdev_mac_entries crossed max value");
3925 goto fail;
3926 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003927
3928 wmi_event = param_buf->fixed_param;
Abhinav Kumara03659c2017-12-28 15:18:07 +05303929 if (wmi_event->num_vdev_mac_entries >
3930 param_buf->num_wmi_pdev_set_hw_mode_response_vdev_mac_mapping) {
3931 WMA_LOGE("Invalid num_vdev_mac_entries: %d",
3932 wmi_event->num_vdev_mac_entries);
3933 goto fail;
3934 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003935 hw_mode_resp->status = wmi_event->status;
3936 hw_mode_resp->cfgd_hw_mode_index = wmi_event->cfgd_hw_mode_index;
3937 hw_mode_resp->num_vdev_mac_entries = wmi_event->num_vdev_mac_entries;
3938
Kiran Kumar Lokere1d411bb2017-11-29 15:24:05 -08003939 WMA_LOGD("%s: status:%d cfgd_hw_mode_index:%d num_vdev_mac_entries:%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003940 __func__, wmi_event->status,
3941 wmi_event->cfgd_hw_mode_index,
3942 wmi_event->num_vdev_mac_entries);
3943 vdev_mac_entry =
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303944 param_buf->wmi_pdev_set_hw_mode_response_vdev_mac_mapping;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003945
3946 /* Store the vdev-mac map in WMA and prepare to send to PE */
3947 for (i = 0; i < wmi_event->num_vdev_mac_entries; i++) {
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303948 uint32_t vdev_id, mac_id, pdev_id;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003949
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003950 vdev_id = vdev_mac_entry[i].vdev_id;
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303951 pdev_id = vdev_mac_entry[i].pdev_id;
3952 if (pdev_id == WMI_PDEV_ID_SOC) {
3953 WMA_LOGE("%s: soc level id received for mac id)",
Tushnim Bhattacharyyac23d56c2018-10-05 14:11:43 -07003954 __func__);
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303955 goto fail;
3956 }
Pragaspathi Thilagaraj0092b672018-05-23 17:08:45 +05303957 if (vdev_id >= wma->max_bssid) {
3958 WMA_LOGE("%s: vdev_id: %d is invalid, max_bssid: %d",
3959 __func__, vdev_id, wma->max_bssid);
3960 goto fail;
3961 }
3962
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303963 mac_id = WMA_PDEV_TO_MAC_MAP(vdev_mac_entry[i].pdev_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003964
Kiran Kumar Lokere1d411bb2017-11-29 15:24:05 -08003965 WMA_LOGD("%s: vdev_id:%d mac_id:%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003966 __func__, vdev_id, mac_id);
3967
3968 hw_mode_resp->vdev_mac_map[i].vdev_id = vdev_id;
3969 hw_mode_resp->vdev_mac_map[i].mac_id = mac_id;
3970 wma_update_intf_hw_mode_params(vdev_id, mac_id,
3971 wmi_event->cfgd_hw_mode_index);
3972 }
3973
3974 if (hw_mode_resp->status == SET_HW_MODE_STATUS_OK) {
3975 if (WMA_DEFAULT_HW_MODE_INDEX == wma->new_hw_mode_index) {
3976 wma->new_hw_mode_index = wmi_event->cfgd_hw_mode_index;
3977 } else {
3978 wma->old_hw_mode_index = wma->new_hw_mode_index;
3979 wma->new_hw_mode_index = wmi_event->cfgd_hw_mode_index;
3980 }
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003981 policy_mgr_update_hw_mode_index(wma->psoc,
3982 wmi_event->cfgd_hw_mode_index);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003983 }
3984
Kiran Kumar Lokere1d411bb2017-11-29 15:24:05 -08003985 WMA_LOGD("%s: Updated: old_hw_mode_index:%d new_hw_mode_index:%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003986 __func__, wma->old_hw_mode_index, wma->new_hw_mode_index);
3987
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303988 wma_send_msg(wma, SIR_HAL_PDEV_SET_HW_MODE_RESP,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003989 (void *) hw_mode_resp, 0);
3990
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303991 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003992
3993fail:
3994 WMA_LOGE("%s: Sending fail response to LIM", __func__);
3995 hw_mode_resp->status = SET_HW_MODE_STATUS_ECANCELED;
3996 hw_mode_resp->cfgd_hw_mode_index = 0;
3997 hw_mode_resp->num_vdev_mac_entries = 0;
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05303998 wma_send_msg(wma, SIR_HAL_PDEV_SET_HW_MODE_RESP,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003999 (void *) hw_mode_resp, 0);
4000
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304001 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004002}
4003
4004/**
Naveen Rawat8cc23b02016-07-14 12:22:56 -07004005 * wma_process_pdev_hw_mode_trans_ind() - Process HW mode transition info
4006 *
4007 * @handle: WMA handle
4008 * @fixed_param: Event fixed parameters
4009 * @vdev_mac_entry - vdev mac entry
4010 * @hw_mode_trans_ind - Buffer to store parsed information
4011 *
4012 * Parses fixed_param, vdev_mac_entry and fills in the information into
4013 * hw_mode_trans_ind and wma
4014 *
4015 * Return: None
4016 */
4017void wma_process_pdev_hw_mode_trans_ind(void *handle,
4018 wmi_pdev_hw_mode_transition_event_fixed_param *fixed_param,
4019 wmi_pdev_set_hw_mode_response_vdev_mac_entry *vdev_mac_entry,
4020 struct sir_hw_mode_trans_ind *hw_mode_trans_ind)
4021{
4022 uint32_t i;
4023 tp_wma_handle wma = (tp_wma_handle) handle;
Harprit Chhabada3cfca962018-12-04 13:41:31 -08004024
gaurank kathpaliad2967a72018-05-01 12:35:14 +05304025 if (fixed_param->num_vdev_mac_entries > MAX_VDEV_SUPPORTED) {
4026 WMA_LOGE("Number of Vdev mac entries %d exceeded"
4027 " max vdev supported %d",
4028 fixed_param->num_vdev_mac_entries,
4029 MAX_VDEV_SUPPORTED);
4030 return;
4031 }
Naveen Rawat8cc23b02016-07-14 12:22:56 -07004032 hw_mode_trans_ind->old_hw_mode_index = fixed_param->old_hw_mode_index;
4033 hw_mode_trans_ind->new_hw_mode_index = fixed_param->new_hw_mode_index;
4034 hw_mode_trans_ind->num_vdev_mac_entries =
4035 fixed_param->num_vdev_mac_entries;
Kiran Kumar Lokere1d411bb2017-11-29 15:24:05 -08004036 WMA_LOGD("%s: old_hw_mode_index:%d new_hw_mode_index:%d entries=%d",
Naveen Rawat8cc23b02016-07-14 12:22:56 -07004037 __func__, fixed_param->old_hw_mode_index,
4038 fixed_param->new_hw_mode_index,
4039 fixed_param->num_vdev_mac_entries);
4040
Harprit Chhabada3cfca962018-12-04 13:41:31 -08004041 if (!vdev_mac_entry) {
4042 WMA_LOGE("Invalid vdev_mac_entry");
4043 return;
4044 }
4045
Naveen Rawat8cc23b02016-07-14 12:22:56 -07004046 /* Store the vdev-mac map in WMA and send to policy manager */
4047 for (i = 0; i < fixed_param->num_vdev_mac_entries; i++) {
4048 uint32_t vdev_id, mac_id, pdev_id;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004049
Naveen Rawat8cc23b02016-07-14 12:22:56 -07004050 vdev_id = vdev_mac_entry[i].vdev_id;
4051 pdev_id = vdev_mac_entry[i].pdev_id;
4052
4053 if (pdev_id == WMI_PDEV_ID_SOC) {
4054 WMA_LOGE("%s: soc level id received for mac id)",
Tushnim Bhattacharyyac23d56c2018-10-05 14:11:43 -07004055 __func__);
Naveen Rawat8cc23b02016-07-14 12:22:56 -07004056 return;
4057 }
Pragaspathi Thilagaraj0092b672018-05-23 17:08:45 +05304058 if (vdev_id >= wma->max_bssid) {
4059 WMA_LOGE("%s: vdev_id: %d is invalid, max_bssid: %d",
4060 __func__, vdev_id, wma->max_bssid);
4061 return;
4062 }
Naveen Rawat8cc23b02016-07-14 12:22:56 -07004063
4064 mac_id = WMA_PDEV_TO_MAC_MAP(vdev_mac_entry[i].pdev_id);
4065
Jianmin Zhucc6b3d02019-03-07 14:19:34 +08004066 wma_debug("vdev_id:%d mac_id:%d", vdev_id, mac_id);
Naveen Rawat8cc23b02016-07-14 12:22:56 -07004067
4068 hw_mode_trans_ind->vdev_mac_map[i].vdev_id = vdev_id;
4069 hw_mode_trans_ind->vdev_mac_map[i].mac_id = mac_id;
4070 wma_update_intf_hw_mode_params(vdev_id, mac_id,
4071 fixed_param->new_hw_mode_index);
4072 }
4073 wma->old_hw_mode_index = fixed_param->old_hw_mode_index;
4074 wma->new_hw_mode_index = fixed_param->new_hw_mode_index;
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07004075 policy_mgr_update_new_hw_mode_index(wma->psoc,
4076 fixed_param->new_hw_mode_index);
4077 policy_mgr_update_old_hw_mode_index(wma->psoc,
4078 fixed_param->old_hw_mode_index);
Naveen Rawat8cc23b02016-07-14 12:22:56 -07004079
Kiran Kumar Lokere1d411bb2017-11-29 15:24:05 -08004080 WMA_LOGD("%s: Updated: old_hw_mode_index:%d new_hw_mode_index:%d",
Naveen Rawat8cc23b02016-07-14 12:22:56 -07004081 __func__, wma->old_hw_mode_index, wma->new_hw_mode_index);
4082}
4083
4084/**
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05304085 * wma_pdev_hw_mode_transition_evt_handler() - HW mode transition evt handler
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004086 * @handle: WMI handle
4087 * @event: Event recevied from FW
4088 * @len: Length of the event
4089 *
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05304090 * Event handler for WMI_PDEV_HW_MODE_TRANSITION_EVENTID that indicates an
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004091 * asynchronous hardware mode transition. This event notifies the host driver
4092 * that firmware independently changed the hardware mode for some reason, such
4093 * as Coex, LFR 3.0, etc
4094 *
4095 * Return: Success on receiving valid params from FW
4096 */
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05304097static int wma_pdev_hw_mode_transition_evt_handler(void *handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004098 uint8_t *event,
4099 uint32_t len)
4100{
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05304101 WMI_PDEV_HW_MODE_TRANSITION_EVENTID_param_tlvs *param_buf;
4102 wmi_pdev_hw_mode_transition_event_fixed_param *wmi_event;
4103 wmi_pdev_set_hw_mode_response_vdev_mac_entry *vdev_mac_entry;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004104 struct sir_hw_mode_trans_ind *hw_mode_trans_ind;
4105 tp_wma_handle wma = (tp_wma_handle) handle;
4106
4107 if (!wma) {
4108 /* This is an async event. So, not sending any event to LIM */
4109 WMA_LOGE("Invalid WMA handle");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304110 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004111 }
4112
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05304113 param_buf = (WMI_PDEV_HW_MODE_TRANSITION_EVENTID_param_tlvs *) event;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004114 if (!param_buf) {
4115 /* This is an async event. So, not sending any event to LIM */
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05304116 WMA_LOGE("Invalid WMI_PDEV_HW_MODE_TRANSITION_EVENTID event");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304117 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004118 }
4119
Arif Hussain34f72062017-10-04 17:25:24 -07004120 if (param_buf->fixed_param->num_vdev_mac_entries > MAX_VDEV_SUPPORTED) {
4121 WMA_LOGE("num_vdev_mac_entries: %d crossed max value: %d",
4122 param_buf->fixed_param->num_vdev_mac_entries,
4123 MAX_VDEV_SUPPORTED);
4124 return QDF_STATUS_E_FAILURE;
4125 }
4126
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304127 hw_mode_trans_ind = qdf_mem_malloc(sizeof(*hw_mode_trans_ind));
Arif Hussain157263f2018-10-03 13:07:15 -07004128 if (!hw_mode_trans_ind)
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004129 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004130
4131 wmi_event = param_buf->fixed_param;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004132 vdev_mac_entry =
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05304133 param_buf->wmi_pdev_set_hw_mode_response_vdev_mac_mapping;
Abhinav Kumara03659c2017-12-28 15:18:07 +05304134 if (wmi_event->num_vdev_mac_entries >
4135 param_buf->num_wmi_pdev_set_hw_mode_response_vdev_mac_mapping) {
4136 WMA_LOGE("Invalid num_vdev_mac_entries: %d",
4137 wmi_event->num_vdev_mac_entries);
4138 qdf_mem_free(hw_mode_trans_ind);
4139 return -EINVAL;
4140 }
Naveen Rawat8cc23b02016-07-14 12:22:56 -07004141 wma_process_pdev_hw_mode_trans_ind(wma, wmi_event, vdev_mac_entry,
4142 hw_mode_trans_ind);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004143 /* Pass the message to PE */
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05304144 wma_send_msg(wma, SIR_HAL_PDEV_HW_MODE_TRANS_IND,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004145 (void *) hw_mode_trans_ind, 0);
4146
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304147 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004148}
4149
4150/**
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05304151 * wma_pdev_set_dual_mode_config_resp_evt_handler() - Dual mode evt handler
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004152 * @handle: WMI handle
4153 * @event: Event received from FW
4154 * @len: Length of the event
4155 *
4156 * Notifies the host driver of the completion or failure of a
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05304157 * WMI_PDEV_SET_MAC_CONFIG_CMDID command. This event would be returned to
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004158 * the host driver once the firmware has completed a reconfiguration of the Scan
4159 * and FW mode configuration. This changes could include entering or leaving a
4160 * dual mac configuration for either scan and/or more permanent firmware mode.
4161 *
4162 * Return: Success on receiving valid params from FW
4163 */
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05304164static int wma_pdev_set_dual_mode_config_resp_evt_handler(void *handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004165 uint8_t *event,
4166 uint32_t len)
4167{
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05304168 WMI_PDEV_SET_MAC_CONFIG_RESP_EVENTID_param_tlvs *param_buf;
4169 wmi_pdev_set_mac_config_response_event_fixed_param *wmi_event;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004170 tp_wma_handle wma = (tp_wma_handle) handle;
4171 struct sir_dual_mac_config_resp *dual_mac_cfg_resp;
4172
4173 if (!wma) {
4174 WMA_LOGE("%s: Invalid WMA handle", __func__);
4175 /* Since the WMA handle is NULL, we cannot send resp to LIM.
4176 * So, returning from here.
4177 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304178 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004179 }
Krunal Sonia5ccb802017-07-03 12:59:40 -07004180 wma_release_wakelock(&wma->wmi_cmd_rsp_wake_lock);
Abhishek Singhd93a0b22018-10-30 17:04:56 +05304181 wma_remove_req(wma, 0, WMA_PDEV_MAC_CFG_RESP);
4182
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304183 dual_mac_cfg_resp = qdf_mem_malloc(sizeof(*dual_mac_cfg_resp));
Arif Hussain157263f2018-10-03 13:07:15 -07004184 if (!dual_mac_cfg_resp)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004185 /* Since the mem alloc failed, we cannot send resp to LIM.
4186 * So, returning from here.
4187 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304188 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004189
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05304190 param_buf = (WMI_PDEV_SET_MAC_CONFIG_RESP_EVENTID_param_tlvs *)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004191 event;
4192 if (!param_buf) {
4193 WMA_LOGE("%s: Invalid event", __func__);
4194 goto fail;
4195 }
4196
4197 wmi_event = param_buf->fixed_param;
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004198 WMA_LOGD("%s: status:%d", __func__, wmi_event->status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004199 dual_mac_cfg_resp->status = wmi_event->status;
4200
4201 if (SET_HW_MODE_STATUS_OK == dual_mac_cfg_resp->status) {
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07004202 policy_mgr_update_dbs_scan_config(wma->psoc);
4203 policy_mgr_update_dbs_fw_config(wma->psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004204 }
4205
4206 /* Pass the message to PE */
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05304207 wma_send_msg(wma, SIR_HAL_PDEV_MAC_CFG_RESP,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004208 (void *) dual_mac_cfg_resp, 0);
4209
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304210 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004211
4212fail:
4213 WMA_LOGE("%s: Sending fail response to LIM", __func__);
4214 dual_mac_cfg_resp->status = SET_HW_MODE_STATUS_ECANCELED;
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05304215 wma_send_msg(wma, SIR_HAL_PDEV_MAC_CFG_RESP,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004216 (void *) dual_mac_cfg_resp, 0);
4217
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304218 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004219
4220}
4221
4222/**
gaurank kathpalia85f8a612018-02-21 18:55:24 +05304223 * wma_send_time_stamp_sync_cmd() - timer callback send timestamp to
4224 * firmware to sync with host.
4225 * @wma_handle: wma handle
4226 *
4227 * Return: void
4228 */
4229static void wma_send_time_stamp_sync_cmd(void *data)
4230{
4231 tp_wma_handle wma_handle;
4232 QDF_STATUS qdf_status;
4233
4234 wma_handle = (tp_wma_handle) data;
4235
4236 wmi_send_time_stamp_sync_cmd_tlv(wma_handle->wmi_handle);
4237
4238 /* Start/Restart the timer */
4239 qdf_status = qdf_mc_timer_start(&wma_handle->wma_fw_time_sync_timer,
4240 WMA_FW_TIME_SYNC_TIMER);
4241 if (QDF_IS_STATUS_ERROR(qdf_status))
4242 WMA_LOGE("Failed to start the firmware time sync timer");
4243}
4244
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07004245#ifdef WLAN_CONV_SPECTRAL_ENABLE
4246static void wma_register_spectral_cmds(tp_wma_handle wma_handle)
4247{
4248 struct wmi_spectral_cmd_ops cmd_ops;
4249
4250 cmd_ops.wmi_spectral_configure_cmd_send =
4251 wmi_unified_vdev_spectral_configure_cmd_send;
4252 cmd_ops.wmi_spectral_enable_cmd_send =
4253 wmi_unified_vdev_spectral_enable_cmd_send;
4254 wlan_register_wmi_spectral_cmd_ops(wma_handle->pdev, &cmd_ops);
4255}
4256#else
4257static void wma_register_spectral_cmds(tp_wma_handle wma_handle)
4258{
4259}
4260#endif
gaurank kathpalia85f8a612018-02-21 18:55:24 +05304261/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004262 * wma_start() - wma start function.
Jeff Johnsonc97816c2018-05-12 17:13:23 -07004263 * Initialize event handlers and timers.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004264 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05304265 * Return: 0 on success, QDF Error on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004266 */
Jeff Johnsond4892552017-09-13 08:41:31 -07004267QDF_STATUS wma_start(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004268{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304269 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004270 tp_wma_handle wma_handle;
4271 int status;
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304272 struct wmi_unified *wmi_handle;
Ke Huangae49ad02018-11-27 10:53:11 +08004273 struct mac_context *mac = NULL;
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07004274
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004275 WMA_LOGD("%s: Enter", __func__);
4276
Anurag Chouhan6d760662016-02-20 16:05:43 +05304277 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004278 /* validate the wma_handle */
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07004279 if (!wma_handle) {
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304280 WMA_LOGE("%s: Invalid wma handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304281 qdf_status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004282 goto end;
4283 }
Sandeep Puligillad698bf52017-09-15 16:07:02 -07004284
Sourav Mohapatracf632572018-04-02 11:01:35 +05304285 wmi_handle = get_wmi_unified_hdl_from_psoc(wma_handle->psoc);
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304286 if (!wmi_handle) {
4287 WMA_LOGE("%s: Invalid wmi handle", __func__);
4288 qdf_status = QDF_STATUS_E_INVAL;
4289 goto end;
4290 }
4291
Ke Huangae49ad02018-11-27 10:53:11 +08004292 mac = cds_get_context(QDF_MODULE_ID_PE);
4293 if (!mac) {
4294 WMA_LOGE("%s: Invalid mac context", __func__);
4295 goto end;
4296 }
4297
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304298 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304299 wmi_roam_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05304300 wma_roam_event_callback,
Padma, Santhosh Kumar18169ce2017-03-02 18:04:02 +05304301 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004302 if (0 != status) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004303 WMA_LOGE("%s: Failed to register Roam callback", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304304 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004305 goto end;
4306 }
4307
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304308 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304309 wmi_wow_wakeup_host_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05304310 wma_wow_wakeup_host_event,
4311 WMA_RX_TASKLET_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004312 if (status) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004313 WMA_LOGE("%s: Failed to register wow wakeup host event handler",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004314 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304315 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004316 goto end;
4317 }
4318
Will Huang3cd2b7c2017-11-17 13:16:56 +08004319 if (wma_d0_wow_is_supported()) {
4320 status = wmi_unified_register_event_handler(
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304321 wmi_handle,
Will Huang9adefff2017-12-15 14:50:03 +08004322 wmi_d0_wow_disable_ack_event_id,
Will Huang3cd2b7c2017-11-17 13:16:56 +08004323 wma_d0_wow_disable_ack_event,
4324 WMA_RX_TASKLET_CTX);
4325 if (status) {
4326 WMA_LOGE("%s: Failed to register d0wow disable ack"
4327 " event handler", __func__);
4328 qdf_status = QDF_STATUS_E_FAILURE;
4329 goto end;
4330 }
4331 }
4332
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304333 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304334 wmi_pdev_resume_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05304335 wma_pdev_resume_event_handler,
4336 WMA_RX_TASKLET_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004337 if (status) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004338 WMA_LOGE("%s: Failed to register PDEV resume event handler",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004339 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304340 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004341 goto end;
4342 }
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05304343#if defined(QCA_LL_LEGACY_TX_FLOW_CONTROL) || \
4344 defined(QCA_LL_TX_FLOW_CONTROL_V2) || defined(CONFIG_HL_SUPPORT)
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08004345 WMA_LOGD("MCC TX Pause Event Handler register");
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304346 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304347 wmi_tx_pause_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05304348 wma_mcc_vdev_tx_pause_evt_handler,
4349 WMA_RX_TASKLET_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004350#endif /* QCA_LL_LEGACY_TX_FLOW_CONTROL */
4351
Kabilan Kannancaa85502018-04-13 18:04:58 -07004352 WMA_LOGD("Registering SAR2 response handler");
4353 status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
4354 wmi_wlan_sar2_result_event_id,
4355 wma_sar_rsp_evt_handler,
4356 WMA_RX_SERIALIZER_CTX);
4357 if (status) {
4358 WMA_LOGE("Failed to register sar response event cb");
4359 qdf_status = QDF_STATUS_E_FAILURE;
4360 goto end;
4361 }
4362
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004363#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
4364 WMA_LOGD("Registering auto shutdown handler");
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304365 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304366 wmi_host_auto_shutdown_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05304367 wma_auto_shutdown_event_handler,
4368 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004369 if (status) {
4370 WMA_LOGE("Failed to register WMI Auto shutdown event handler");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304371 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004372 goto end;
4373 }
4374#endif /* FEATURE_WLAN_AUTO_SHUTDOWN */
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304375 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304376 wmi_thermal_mgmt_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05304377 wma_thermal_mgmt_evt_handler,
4378 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004379 if (status) {
4380 WMA_LOGE("Failed to register thermal mitigation event cb");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304381 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004382 goto end;
4383 }
4384
Zhang Qian47e22ce2018-01-04 15:38:38 +08004385 status = wma_ocb_register_callbacks(wma_handle);
4386 if (!QDF_IS_STATUS_SUCCESS(status)) {
4387 WMA_LOGE("Failed to register OCB callbacks");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304388 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004389 goto end;
4390 }
4391
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304392 qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004393
4394#ifdef QCA_WIFI_FTM
4395 /*
4396 * Tx mgmt attach requires TXRX context which is not created
4397 * in FTM mode. So skip the TX mgmt attach.
4398 */
Anurag Chouhan6d760662016-02-20 16:05:43 +05304399 if (cds_get_conparam() == QDF_GLOBAL_FTM_MODE)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004400 goto end;
4401#endif /* QCA_WIFI_FTM */
4402
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304403 if (wmi_service_enabled(wmi_handle, wmi_service_rmc)) {
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08004404
4405 WMA_LOGD("FW supports cesium network, registering event handlers");
4406
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004407 status = wmi_unified_register_event_handler(
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304408 wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304409 wmi_peer_info_event_id,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004410 wma_ibss_peer_info_event_handler,
4411 WMA_RX_SERIALIZER_CTX);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08004412 if (status) {
4413 WMA_LOGE("Failed to register ibss peer info event cb");
4414 qdf_status = QDF_STATUS_E_FAILURE;
4415 goto end;
4416 }
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004417 status = wmi_unified_register_event_handler(
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304418 wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304419 wmi_peer_tx_fail_cnt_thr_event_id,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004420 wma_fast_tx_fail_event_handler,
4421 WMA_RX_SERIALIZER_CTX);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08004422 if (status) {
4423 WMA_LOGE("Failed to register peer fast tx failure event cb");
4424 qdf_status = QDF_STATUS_E_FAILURE;
4425 goto end;
4426 }
4427 } else {
4428 WMA_LOGE("Target does not support cesium network");
4429 }
4430
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304431 qdf_status = wma_tx_attach(wma_handle);
4432 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004433 WMA_LOGE("%s: Failed to register tx management", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004434 goto end;
4435 }
4436
Wu Gaof3cbeaf2019-01-15 18:26:25 +08004437 if (!mac->mlme_cfg->gen.enable_remove_time_stamp_sync_cmd &&
4438 cds_get_conparam() != QDF_GLOBAL_FTM_MODE) {
4439 /* Initialize firmware time stamp sync timer */
4440 qdf_status = qdf_mc_timer_init(
Ke Huangae49ad02018-11-27 10:53:11 +08004441 &wma_handle->wma_fw_time_sync_timer,
4442 QDF_TIMER_TYPE_SW,
4443 wma_send_time_stamp_sync_cmd,
4444 wma_handle);
Wu Gaof3cbeaf2019-01-15 18:26:25 +08004445 if (QDF_IS_STATUS_ERROR(qdf_status)) {
4446 WMA_LOGE("Failed to init fw time sync timer");
4447 goto end;
Lin Bai5dc8ddb2018-08-23 17:46:34 +08004448 }
Wu Gaof3cbeaf2019-01-15 18:26:25 +08004449
4450 /* Start firmware time stamp sync timer */
4451 wma_send_time_stamp_sync_cmd(wma_handle);
gaurank kathpalia85f8a612018-02-21 18:55:24 +05304452 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004453 /* Initialize log completion timeout */
Anurag Chouhan210db072016-02-22 18:42:15 +05304454 qdf_status = qdf_mc_timer_init(&wma_handle->log_completion_timer,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304455 QDF_TIMER_TYPE_SW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004456 wma_log_completion_timeout,
4457 wma_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304458 if (qdf_status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004459 WMA_LOGE("Failed to initialize log completion timeout");
4460 goto end;
4461 }
4462
Jeff Johnson6136fb92017-03-30 15:21:49 -07004463 status = wma_fips_register_event_handlers(wma_handle);
4464 if (!QDF_IS_STATUS_SUCCESS(status)) {
4465 WMA_LOGE("Failed to register FIPS event handler");
4466 qdf_status = QDF_STATUS_E_FAILURE;
4467 goto end;
4468 }
4469
Jeff Johnsonf0e54b02017-12-18 15:22:25 -08004470 status = wma_sar_register_event_handlers(wma_handle);
4471 if (!QDF_IS_STATUS_SUCCESS(status)) {
4472 WMA_LOGE("Failed to register SAR event handlers");
4473 qdf_status = QDF_STATUS_E_FAILURE;
4474 goto end;
4475 }
4476
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004477 /* Initialize the get temperature event handler */
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304478 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304479 wmi_pdev_temperature_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05304480 wma_pdev_temperature_evt_handler,
4481 WMA_RX_SERIALIZER_CTX);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304482 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004483 WMA_LOGE("Failed to register get_temperature event cb");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304484 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004485 goto end;
4486 }
4487
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304488 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304489 wmi_vdev_tsf_report_event_id,
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07004490 wma_vdev_tsf_handler,
4491 WMA_RX_SERIALIZER_CTX);
4492 if (0 != status) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004493 WMA_LOGE("%s: Failed to register tsf callback", __func__);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07004494 qdf_status = QDF_STATUS_E_FAILURE;
4495 goto end;
4496 }
4497
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05304498 /* Initialize the wma_pdev_set_hw_mode_resp_evt_handler event handler */
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304499 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304500 wmi_pdev_set_hw_mode_rsp_event_id,
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05304501 wma_pdev_set_hw_mode_resp_evt_handler,
Govind Singhd76a5b02016-03-08 15:12:14 +05304502 WMA_RX_SERIALIZER_CTX);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304503 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004504 WMA_LOGE("Failed to register set hw mode resp event cb");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304505 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004506 goto end;
4507 }
4508
4509 /* Initialize the WMI_SOC_HW_MODE_TRANSITION_EVENTID event handler */
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304510 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304511 wmi_pdev_hw_mode_transition_event_id,
Manishekar Chandrasekaran05fd2672016-04-27 12:59:20 +05304512 wma_pdev_hw_mode_transition_evt_handler,
Govind Singhd76a5b02016-03-08 15:12:14 +05304513 WMA_RX_SERIALIZER_CTX);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304514 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004515 WMA_LOGE("Failed to register hw mode transition event cb");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304516 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004517 goto end;
4518 }
4519
4520 /* Initialize the set dual mac configuration event handler */
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304521 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304522 wmi_pdev_set_mac_config_resp_event_id,
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05304523 wma_pdev_set_dual_mode_config_resp_evt_handler,
Govind Singhd76a5b02016-03-08 15:12:14 +05304524 WMA_RX_SERIALIZER_CTX);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304525 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004526 WMA_LOGE("Failed to register hw mode transition event cb");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304527 qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004528 goto end;
4529 }
4530
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05304531 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05304532 wmi_coex_bt_activity_event_id,
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05304533 wma_wlan_bt_activity_evt_handler,
4534 WMA_RX_SERIALIZER_CTX);
4535 if (!QDF_IS_STATUS_SUCCESS(status)) {
4536 WMA_LOGE("Failed to register coex bt activity event handler");
4537 qdf_status = QDF_STATUS_E_FAILURE;
4538 goto end;
4539 }
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07004540 wma_register_spectral_cmds(wma_handle);
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05304541
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004542end:
4543 WMA_LOGD("%s: Exit", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304544 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004545}
4546
Jeff Johnson62cd6802018-07-20 12:38:25 -07004547QDF_STATUS wma_stop(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004548{
4549 tp_wma_handle wma_handle;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304550 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Govind Singhede435f2015-12-01 16:16:36 +05304551 int i;
Ke Huangae49ad02018-11-27 10:53:11 +08004552 struct mac_context *mac = NULL;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004553
Anurag Chouhan6d760662016-02-20 16:05:43 +05304554 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004555 WMA_LOGD("%s: Enter", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004556 /* validate the wma_handle */
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07004557 if (!wma_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004558 WMA_LOGE("%s: Invalid handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304559 qdf_status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004560 goto end;
4561 }
Ke Huangae49ad02018-11-27 10:53:11 +08004562 mac = cds_get_context(QDF_MODULE_ID_PE);
4563 if (!mac) {
4564 WMA_LOGE("%s: Invalid mac context", __func__);
4565 goto end;
4566 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004567#ifdef QCA_WIFI_FTM
4568 /*
4569 * Tx mgmt detach requires TXRX context which is not created
4570 * in FTM mode. So skip the TX mgmt detach.
4571 */
Anurag Chouhan6d760662016-02-20 16:05:43 +05304572 if (cds_get_conparam() == QDF_GLOBAL_FTM_MODE) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304573 qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004574 goto end;
4575 }
4576#endif /* QCA_WIFI_FTM */
4577
4578 if (wma_handle->ack_work_ctx) {
4579 cds_flush_work(&wma_handle->ack_work_ctx->ack_cmp_work);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304580 qdf_mem_free(wma_handle->ack_work_ctx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004581 wma_handle->ack_work_ctx = NULL;
4582 }
4583
4584 /* Destroy the timer for log completion */
Anurag Chouhan210db072016-02-22 18:42:15 +05304585 qdf_status = qdf_mc_timer_destroy(&wma_handle->log_completion_timer);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004586 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004587 WMA_LOGE("Failed to destroy the log completion timer");
Govind Singhede435f2015-12-01 16:16:36 +05304588 /* clean up ll-queue for all vdev */
4589 for (i = 0; i < wma_handle->max_bssid; i++) {
4590 if (wma_handle->interfaces[i].handle &&
Mukul Sharmaf9047232017-03-02 16:58:56 +05304591 wma_is_vdev_up(i)) {
Leo Chang96464902016-10-28 11:10:54 -07004592 cdp_fc_vdev_flush(
4593 cds_get_context(QDF_MODULE_ID_SOC),
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004594 wma_handle->
4595 interfaces[i].handle);
Govind Singhede435f2015-12-01 16:16:36 +05304596 }
4597 }
gaurank kathpalia85f8a612018-02-21 18:55:24 +05304598
Wu Gaof3cbeaf2019-01-15 18:26:25 +08004599 if (!mac->mlme_cfg->gen.enable_remove_time_stamp_sync_cmd &&
4600 cds_get_conparam() != QDF_GLOBAL_FTM_MODE) {
4601 /* Destroy firmware time stamp sync timer */
4602 qdf_status = qdf_mc_timer_destroy(
4603 &wma_handle->wma_fw_time_sync_timer);
4604 if (QDF_IS_STATUS_ERROR(qdf_status))
4605 WMA_LOGE("Failed to destroy fw sync timer");
gaurank kathpalia85f8a612018-02-21 18:55:24 +05304606 }
4607
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304608 qdf_status = wma_tx_detach(wma_handle);
4609 if (qdf_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004610 WMA_LOGE("%s: Failed to deregister tx management", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004611 goto end;
4612 }
4613
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004614end:
4615 WMA_LOGD("%s: Exit", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304616 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004617}
4618
4619/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004620 * wma_wmi_service_close() - close wma wmi service interface.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004621 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05304622 * Return: 0 on success, QDF Error on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004623 */
Jeff Johnson7b3ddc22017-09-13 09:42:44 -07004624QDF_STATUS wma_wmi_service_close(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004625{
Jeff Johnson7b3ddc22017-09-13 09:42:44 -07004626 void *cds_ctx;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004627 tp_wma_handle wma_handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004628 int i;
4629
4630 WMA_LOGD("%s: Enter", __func__);
4631
Jeff Johnson7b3ddc22017-09-13 09:42:44 -07004632 cds_ctx = cds_get_global_context();
4633 if (!cds_ctx) {
4634 WMA_LOGE("%s: Invalid CDS context", __func__);
4635 return QDF_STATUS_E_INVAL;
4636 }
4637
Anurag Chouhan6d760662016-02-20 16:05:43 +05304638 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004639
4640 /* validate the wma_handle */
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07004641 if (!wma_handle) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004642 WMA_LOGE("%s: Invalid wma handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304643 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004644 }
4645
4646 /* validate the wmi handle */
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07004647 if (!wma_handle->wmi_handle) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004648 WMA_LOGE("%s: Invalid wmi handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304649 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004650 }
4651
4652 /* dettach the wmi serice */
4653 WMA_LOGD("calling wmi_unified_detach");
4654 wmi_unified_detach(wma_handle->wmi_handle);
4655 wma_handle->wmi_handle = NULL;
4656
4657 for (i = 0; i < wma_handle->max_bssid; i++) {
Dustin Brownec2c92e2017-07-26 11:13:49 -07004658 wma_vdev_deinit(&wma_handle->interfaces[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004659 }
4660
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304661 qdf_mem_free(wma_handle->interfaces);
Dustin Brownec2c92e2017-07-26 11:13:49 -07004662
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004663 /* free the wma_handle */
Jeff Johnsonadb3b1c2017-09-13 10:42:36 -07004664 cds_free_context(QDF_MODULE_ID_WMA, wma_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004665
hangtiane52fa912018-11-26 15:44:38 +08004666 if (((struct cds_context *)cds_ctx)->cfg_ctx)
4667 qdf_mem_free(((struct cds_context *)cds_ctx)->cfg_ctx);
Rajeev Kumarfe6e62f2018-10-22 16:18:41 -07004668 ((struct cds_context *)cds_ctx)->cfg_ctx = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004669 WMA_LOGD("%s: Exit", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304670 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004671}
4672
Xun Luoa858a472015-11-10 08:24:45 -08004673/**
4674 * wma_wmi_work_close() - close the work queue items associated with WMI
Xun Luoa858a472015-11-10 08:24:45 -08004675 *
4676 * This function closes work queue items associated with WMI, but not fully
4677 * closes WMI service.
4678 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304679 * Return: QDF_STATUS_SUCCESS if work close is successful. Otherwise
Xun Luoa858a472015-11-10 08:24:45 -08004680 * proper error codes.
4681 */
Jeff Johnson6b8473d2017-09-13 09:20:53 -07004682QDF_STATUS wma_wmi_work_close(void)
Xun Luoa858a472015-11-10 08:24:45 -08004683{
4684 tp_wma_handle wma_handle;
4685
4686 WMA_LOGD("%s: Enter", __func__);
4687
Anurag Chouhan6d760662016-02-20 16:05:43 +05304688 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Xun Luoa858a472015-11-10 08:24:45 -08004689
4690 /* validate the wma_handle */
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07004691 if (!wma_handle) {
Xun Luoa858a472015-11-10 08:24:45 -08004692 WMA_LOGE("%s: Invalid wma handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304693 return QDF_STATUS_E_INVAL;
Xun Luoa858a472015-11-10 08:24:45 -08004694 }
4695
4696 /* validate the wmi handle */
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07004697 if (!wma_handle->wmi_handle) {
Xun Luoa858a472015-11-10 08:24:45 -08004698 WMA_LOGE("%s: Invalid wmi handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304699 return QDF_STATUS_E_INVAL;
Xun Luoa858a472015-11-10 08:24:45 -08004700 }
4701
4702 /* remove the wmi work */
4703 WMA_LOGD("calling wmi_unified_remove_work");
4704 wmi_unified_remove_work(wma_handle->wmi_handle);
4705
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304706 return QDF_STATUS_SUCCESS;
Xun Luoa858a472015-11-10 08:24:45 -08004707}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004708
Krunal Soni2e48d012016-05-02 16:55:26 -07004709/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004710 * wma_close() - wma close function.
4711 * cleanup resources attached with wma.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004712 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05304713 * Return: 0 on success, QDF Error on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004714 */
Jeff Johnson542da352017-09-13 09:17:28 -07004715QDF_STATUS wma_close(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004716{
4717 tp_wma_handle wma_handle;
hangtian351b7c92019-01-17 16:52:45 +08004718 struct target_psoc_info *tgt_psoc_info;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304719 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004720
4721 WMA_LOGD("%s: Enter", __func__);
4722
Anurag Chouhan6d760662016-02-20 16:05:43 +05304723 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004724
4725 /* validate the wma_handle */
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07004726 if (!wma_handle) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004727 WMA_LOGE("%s: Invalid wma handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304728 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004729 }
4730
4731 /* validate the wmi handle */
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07004732 if (!wma_handle->wmi_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004733 WMA_LOGE("%s: Invalid wmi handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304734 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004735 }
4736
4737 /* Free DBS list */
4738 if (wma_handle->hw_mode.hw_mode_list) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304739 qdf_mem_free(wma_handle->hw_mode.hw_mode_list);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004740 wma_handle->hw_mode.hw_mode_list = NULL;
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004741 WMA_LOGD("%s: DBS list is freed", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004742 }
Arunk Khandavalli10af7282018-02-05 16:55:48 +05304743
Anurag Chouhan6d760662016-02-20 16:05:43 +05304744 if (cds_get_conparam() != QDF_GLOBAL_FTM_MODE) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004745#ifdef FEATURE_WLAN_EXTSCAN
Anurag Chouhana37b5b72016-02-21 14:53:42 +05304746 qdf_wake_lock_destroy(&wma_handle->extscan_wake_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004747#endif /* FEATURE_WLAN_EXTSCAN */
Anurag Chouhana37b5b72016-02-21 14:53:42 +05304748 qdf_wake_lock_destroy(&wma_handle->wow_wake_lock);
Mukul Sharmae44d0542017-05-23 21:50:56 +05304749 qdf_wake_lock_destroy(&wma_handle->wow_auth_req_wl);
4750 qdf_wake_lock_destroy(&wma_handle->wow_assoc_req_wl);
4751 qdf_wake_lock_destroy(&wma_handle->wow_deauth_rec_wl);
4752 qdf_wake_lock_destroy(&wma_handle->wow_disassoc_rec_wl);
4753 qdf_wake_lock_destroy(&wma_handle->wow_ap_assoc_lost_wl);
4754 qdf_wake_lock_destroy(&wma_handle->wow_auto_shutdown_wl);
4755 qdf_wake_lock_destroy(&wma_handle->roam_ho_wl);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004756 }
4757
4758 /* unregister Firmware debug log */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304759 qdf_status = dbglog_deinit(wma_handle->wmi_handle);
4760 if (qdf_status != QDF_STATUS_SUCCESS)
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004761 WMA_LOGE("%s: dbglog_deinit failed", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004762
Anurag Chouhan210db072016-02-22 18:42:15 +05304763 qdf_status = qdf_mc_timer_destroy(&wma_handle->service_ready_ext_timer);
Anurag Chouhandf2b2682016-02-29 14:15:27 +05304764 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07004765 WMA_LOGE("%s: Failed to destroy service ready ext event timer",
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05304766 __func__);
4767
Anurag Chouhandf2b2682016-02-29 14:15:27 +05304768 qdf_event_destroy(&wma_handle->target_suspend);
Anurag Chouhandf2b2682016-02-29 14:15:27 +05304769 qdf_event_destroy(&wma_handle->runtime_suspend);
4770 qdf_event_destroy(&wma_handle->recovery_event);
Kai Liu27f20372016-09-28 23:52:36 +08004771 qdf_event_destroy(&wma_handle->tx_frm_download_comp_event);
4772 qdf_event_destroy(&wma_handle->tx_queue_empty_event);
Manikandan Mohanb0932ab2017-02-12 16:30:55 -08004773 wma_cleanup_vdev_resp_queue(wma_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004774 wma_cleanup_hold_req(wma_handle);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05304775 qdf_wake_lock_destroy(&wma_handle->wmi_cmd_rsp_wake_lock);
Prashanth Bhatta87b6dc02017-01-19 15:17:58 -08004776 qdf_runtime_lock_deinit(&wma_handle->wmi_cmd_rsp_runtime_lock);
Poddar, Siddarth2fb98072017-07-19 14:58:30 +05304777 qdf_spinlock_destroy(&wma_handle->vdev_respq_lock);
4778 qdf_spinlock_destroy(&wma_handle->wma_hold_req_q_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004779
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07004780 if (wma_handle->pGetRssiReq) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304781 qdf_mem_free(wma_handle->pGetRssiReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004782 wma_handle->pGetRssiReq = NULL;
4783 }
Deepak Dhamdherebf1f9b12016-05-27 14:49:41 -07004784
yeshwanth sriram guntuka584c2332017-07-29 12:50:25 +05304785 wma_unified_radio_tx_mem_free(wma_handle);
Srinivas Girigowdaad874a82016-10-25 14:08:00 -07004786
Kiran Kumar Lokeref089a3a2017-04-20 21:39:26 -07004787 if (wma_handle->pdev) {
4788 wlan_objmgr_pdev_release_ref(wma_handle->pdev,
4789 WLAN_LEGACY_WMA_ID);
4790 wma_handle->pdev = NULL;
4791 }
Frank Liu00d73fe2017-05-19 22:11:28 +08004792
Nachiket Kukade37b4e6d2018-06-01 18:44:42 +05304793 pmo_unregister_get_beacon_interval_callback(wma_handle->psoc);
4794 pmo_unregister_get_dtim_period_callback(wma_handle->psoc);
Mukul Sharma44746042018-05-24 17:30:52 +05304795 pmo_unregister_is_device_in_low_pwr_mode(wma_handle->psoc);
4796 pmo_unregister_get_pause_bitmap(wma_handle->psoc);
4797 pmo_unregister_pause_bitmap_notifier(wma_handle->psoc);
Will Huangad015772018-06-15 11:27:50 +08004798 pmo_unregister_get_vdev_dp_handle(wma_handle->psoc);
Mukul Sharma6411bb82017-03-01 15:57:07 +05304799
hangtian351b7c92019-01-17 16:52:45 +08004800 tgt_psoc_info = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
4801 init_deinit_free_num_units(wma_handle->psoc, tgt_psoc_info);
Arunk Khandavallia6305a32018-01-25 11:19:18 +05304802 target_if_free_psoc_tgt_info(wma_handle->psoc);
4803
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +05304804 wlan_objmgr_psoc_release_ref(wma_handle->psoc, WLAN_LEGACY_WMA_ID);
4805 wma_handle->psoc = NULL;
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +05304806 wma_target_if_close(wma_handle);
Mukul Sharma6411bb82017-03-01 15:57:07 +05304807
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004808 WMA_LOGD("%s: Exit", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304809 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004810}
4811
4812/**
4813 * wma_update_fw_config() - update fw configuration
Dustin Brownb9987af2018-03-01 17:15:11 -08004814 * @psoc: psoc to query configuration from
4815 * @tgt_hdl: target capability info
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004816 *
4817 * Return: none
4818 */
Dustin Brownb9987af2018-03-01 17:15:11 -08004819static void wma_update_fw_config(struct wlan_objmgr_psoc *psoc,
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304820 struct target_psoc_info *tgt_hdl)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004821{
Dustin Brownb9987af2018-03-01 17:15:11 -08004822 target_resource_config *cfg = &tgt_hdl->info.wlan_res_cfg;
4823
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004824 /* Override the no. of max fragments as per platform configuration */
Dustin Brownb9987af2018-03-01 17:15:11 -08004825 cfg->max_frag_entries = QDF_MIN(QCA_OL_11AC_TX_MAX_FRAGS,
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304826 target_if_get_max_frag_entry(tgt_hdl));
Dustin Brownb9987af2018-03-01 17:15:11 -08004827 target_if_set_max_frag_entry(tgt_hdl, cfg->max_frag_entries);
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304828
Dustin Brownb9987af2018-03-01 17:15:11 -08004829 cfg->num_wow_filters = ucfg_pmo_get_num_wow_filters(psoc);
Nachiket Kukadee547a482018-05-22 16:43:30 +05304830 cfg->apf_instruction_size = ucfg_pmo_get_apf_instruction_size(psoc);
Dustin Brown67d69eb2018-03-02 11:11:34 -08004831 cfg->num_packet_filters = ucfg_pmo_get_num_packet_filters(psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004832}
4833
4834/**
Yun Parkb4f591d2017-03-29 15:51:01 -07004835 * wma_set_tx_partition_base() - set TX MSDU ID partition base for IPA
4836 * @value: TX MSDU ID partition base
4837 *
4838 * Return: none
4839 */
4840#ifdef IPA_OFFLOAD
4841static void wma_set_tx_partition_base(uint32_t value)
4842{
4843 cdp_ipa_set_uc_tx_partition_base(
4844 cds_get_context(QDF_MODULE_ID_SOC),
4845 (struct cdp_cfg *)cds_get_context(QDF_MODULE_ID_CFG),
4846 value);
4847 WMA_LOGD("%s: TX_MSDU_ID_PARTITION=%d", __func__,
4848 value);
4849}
4850#else
4851static void wma_set_tx_partition_base(uint32_t value)
4852{
4853}
4854#endif
4855
4856/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004857 * wma_update_target_services() - update target services from wma handle
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304858 * @wmi_handle: Unified wmi handle
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004859 * @cfg: target services
4860 *
4861 * Return: none
4862 */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304863static inline void wma_update_target_services(struct wmi_unified *wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004864 struct wma_tgt_services *cfg)
4865{
4866 /* STA power save */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304867 cfg->sta_power_save = wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304868 wmi_service_sta_pwrsave);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004869
4870 /* Enable UAPSD */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304871 cfg->uapsd = wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304872 wmi_service_ap_uapsd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004873
4874 /* Update AP DFS service */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304875 cfg->ap_dfs = wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304876 wmi_service_ap_dfs);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004877
4878 /* Enable 11AC */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304879 cfg->en_11ac = wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304880 wmi_service_11ac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004881 if (cfg->en_11ac)
4882 g_fw_wlan_feat_caps |= (1 << DOT11AC);
4883
4884 /* Proactive ARP response */
4885 g_fw_wlan_feat_caps |= (1 << WLAN_PERIODIC_TX_PTRN);
4886
4887 /* Enable WOW */
4888 g_fw_wlan_feat_caps |= (1 << WOW);
4889
4890 /* ARP offload */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304891 cfg->arp_offload = wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304892 wmi_service_arpns_offload);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004893
4894 /* Adaptive early-rx */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304895 cfg->early_rx = wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304896 wmi_service_early_rx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004897#ifdef FEATURE_WLAN_SCAN_PNO
4898 /* PNO offload */
Rajeev Kumar617aadd2018-05-31 16:36:13 -07004899 if (wmi_service_enabled(wmi_handle, wmi_service_nlo)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004900 cfg->pno_offload = true;
Rajeev Kumar617aadd2018-05-31 16:36:13 -07004901 g_fw_wlan_feat_caps |= (1 << PNO);
4902 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004903#endif /* FEATURE_WLAN_SCAN_PNO */
4904
4905#ifdef FEATURE_WLAN_EXTSCAN
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304906 if (wmi_service_enabled(wmi_handle, wmi_service_extscan))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004907 g_fw_wlan_feat_caps |= (1 << EXTENDED_SCAN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004908#endif /* FEATURE_WLAN_EXTSCAN */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304909 cfg->lte_coex_ant_share = wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304910 wmi_service_lte_ant_share_support);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004911#ifdef FEATURE_WLAN_TDLS
4912 /* Enable TDLS */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304913 if (wmi_service_enabled(wmi_handle, wmi_service_tdls)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004914 cfg->en_tdls = 1;
4915 g_fw_wlan_feat_caps |= (1 << TDLS);
4916 }
4917 /* Enable advanced TDLS features */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304918 if (wmi_service_enabled(wmi_handle, wmi_service_tdls_offchan)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004919 cfg->en_tdls_offchan = 1;
4920 g_fw_wlan_feat_caps |= (1 << TDLS_OFF_CHANNEL);
4921 }
4922
4923 cfg->en_tdls_uapsd_buf_sta =
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304924 wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304925 wmi_service_tdls_uapsd_buffer_sta);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004926 cfg->en_tdls_uapsd_sleep_sta =
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304927 wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304928 wmi_service_tdls_uapsd_sleep_sta);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004929#endif /* FEATURE_WLAN_TDLS */
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304930 if (wmi_service_enabled
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304931 (wmi_handle, wmi_service_beacon_offload))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004932 cfg->beacon_offload = true;
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304933 if (wmi_service_enabled
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304934 (wmi_handle, wmi_service_sta_pmf_offload))
mukul sharma72c8b222015-09-04 17:02:01 +05304935 cfg->pmf_offload = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004936#ifdef WLAN_FEATURE_ROAM_OFFLOAD
4937 /* Enable Roam Offload */
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304938 cfg->en_roam_offload = wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304939 wmi_service_roam_ho_offload);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004940#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
4941#ifdef WLAN_FEATURE_NAN
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304942 if (wmi_service_enabled(wmi_handle, wmi_service_nan))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004943 g_fw_wlan_feat_caps |= (1 << NAN);
4944#endif /* WLAN_FEATURE_NAN */
4945
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304946 if (wmi_service_enabled(wmi_handle, wmi_service_rtt))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004947 g_fw_wlan_feat_caps |= (1 << RTT);
Yun Park4d968df2016-10-11 11:44:15 -07004948
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304949 if (wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304950 wmi_service_tx_msdu_id_new_partition_support)) {
Yun Parkb4f591d2017-03-29 15:51:01 -07004951 wma_set_tx_partition_base(HTT_TX_IPA_NEW_MSDU_ID_SPACE_BEGIN);
Yun Park4d968df2016-10-11 11:44:15 -07004952 } else {
Yun Parkb4f591d2017-03-29 15:51:01 -07004953 wma_set_tx_partition_base(HTT_TX_IPA_MSDU_ID_SPACE_BEGIN);
Yun Park4d968df2016-10-11 11:44:15 -07004954 }
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07004955
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304956 wma_he_update_tgt_services(wmi_handle, cfg);
Will Huang496b36c2017-07-11 16:38:50 +08004957
4958 cfg->get_peer_info_enabled =
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304959 wmi_service_enabled(wmi_handle,
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304960 wmi_service_peer_stats_info);
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304961 if (wmi_service_enabled(wmi_handle, wmi_service_fils_support))
Vignesh Viswanathan731186f2017-09-18 13:47:37 +05304962 cfg->is_fils_roaming_supported = true;
Varun Reddy Yeturu62c32652017-10-26 15:32:35 -07004963
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304964 if (wmi_service_enabled(wmi_handle, wmi_service_mawc_support))
Varun Reddy Yeturu62c32652017-10-26 15:32:35 -07004965 cfg->is_fw_mawc_capable = true;
4966
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05304967 if (wmi_service_enabled(wmi_handle,
4968 wmi_service_11k_neighbour_report_support))
Vignesh Viswanathan694e28e2018-01-18 20:53:57 +05304969 cfg->is_11k_offload_supported = true;
Varun Reddy Yeturu4b54ec82018-05-30 16:00:38 -07004970
4971 if (wmi_service_enabled(wmi_handle, wmi_service_twt_requestor))
4972 cfg->twt_requestor = true;
4973 if (wmi_service_enabled(wmi_handle, wmi_service_twt_responder))
4974 cfg->twt_responder = true;
Liangwei Dong0da14262018-07-03 03:30:23 -04004975 if (wmi_service_enabled(wmi_handle, wmi_service_obss_scan))
4976 cfg->obss_scan_offload = true;
Arunk Khandavallica56d4b2018-11-29 15:46:00 +05304977 if (wmi_service_enabled(wmi_handle, wmi_service_beacon_reception_stats))
4978 cfg->bcn_reception_stats = true;
Sourav Mohapatrac457ae62018-12-06 15:19:41 +05304979
4980 if (wmi_service_enabled(wmi_handle, wmi_service_vdev_latency_config))
4981 g_fw_wlan_feat_caps |= (1 << VDEV_LATENCY_CONFIG);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004982}
4983
4984/**
4985 * wma_update_target_ht_cap() - update ht capabality from wma handle
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304986 * @tgt_hdl: pointer to structure target_psoc_info
4987 * @cfg: ht capability
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004988 *
4989 * Return: none
4990 */
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304991static inline void
4992wma_update_target_ht_cap(struct target_psoc_info *tgt_hdl,
4993 struct wma_tgt_ht_cap *cfg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004994{
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304995 int ht_cap_info;
4996
4997 ht_cap_info = target_if_get_ht_cap_info(tgt_hdl);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004998 /* RX STBC */
Arunk Khandavalli2462f462018-01-25 14:41:02 +05304999 cfg->ht_rx_stbc = !!(ht_cap_info & WMI_HT_CAP_RX_STBC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005000
5001 /* TX STBC */
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305002 cfg->ht_tx_stbc = !!(ht_cap_info & WMI_HT_CAP_TX_STBC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005003
5004 /* MPDU density */
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305005 cfg->mpdu_density = ht_cap_info & WMI_HT_CAP_MPDU_DENSITY;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005006
5007 /* HT RX LDPC */
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305008 cfg->ht_rx_ldpc = !!(ht_cap_info & WMI_HT_CAP_LDPC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005009
5010 /* HT SGI */
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305011 cfg->ht_sgi_20 = !!(ht_cap_info & WMI_HT_CAP_HT20_SGI);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005012
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305013 cfg->ht_sgi_40 = !!(ht_cap_info & WMI_HT_CAP_HT40_SGI);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005014
5015 /* RF chains */
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305016 cfg->num_rf_chains = target_if_get_num_rf_chains(tgt_hdl);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005017
Jeff Johnson3fd21822016-11-08 11:30:37 -08005018 WMA_LOGD("%s: ht_cap_info - %x ht_rx_stbc - %d, ht_tx_stbc - %d\n"
5019 "mpdu_density - %d ht_rx_ldpc - %d ht_sgi_20 - %d\n"
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305020 "ht_sgi_40 - %d num_rf_chains - %d", __func__,
5021 ht_cap_info,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005022 cfg->ht_rx_stbc, cfg->ht_tx_stbc, cfg->mpdu_density,
5023 cfg->ht_rx_ldpc, cfg->ht_sgi_20, cfg->ht_sgi_40,
5024 cfg->num_rf_chains);
5025
5026}
5027
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005028/**
5029 * wma_update_target_vht_cap() - update vht capabality from wma handle
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305030 * @tgt_hdl: pointer to structure target_psoc_info
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005031 * @cfg: vht capabality
5032 *
5033 * Return: none
5034 */
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305035static inline void
5036wma_update_target_vht_cap(struct target_psoc_info *tgt_hdl,
5037 struct wma_tgt_vht_cap *cfg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005038{
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305039 int vht_cap_info = target_if_get_vht_cap_info(tgt_hdl);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005040
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305041 if (vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_11454)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005042 cfg->vht_max_mpdu = WMI_VHT_CAP_MAX_MPDU_LEN_11454;
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305043 else if (vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_7935)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005044 cfg->vht_max_mpdu = WMI_VHT_CAP_MAX_MPDU_LEN_7935;
5045 else
5046 cfg->vht_max_mpdu = 0;
5047
5048
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305049 if (vht_cap_info & WMI_VHT_CAP_CH_WIDTH_80P80_160MHZ) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005050 cfg->supp_chan_width = 1 << eHT_CHANNEL_WIDTH_80P80MHZ;
5051 cfg->supp_chan_width |= 1 << eHT_CHANNEL_WIDTH_160MHZ;
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305052 } else if (vht_cap_info & WMI_VHT_CAP_CH_WIDTH_160MHZ) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005053 cfg->supp_chan_width = 1 << eHT_CHANNEL_WIDTH_160MHZ;
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305054 } else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005055 cfg->supp_chan_width = 1 << eHT_CHANNEL_WIDTH_80MHZ;
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305056 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005057
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305058 cfg->vht_rx_ldpc = vht_cap_info & WMI_VHT_CAP_RX_LDPC;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005059
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305060 cfg->vht_short_gi_80 = vht_cap_info & WMI_VHT_CAP_SGI_80MHZ;
5061 cfg->vht_short_gi_160 = vht_cap_info & WMI_VHT_CAP_SGI_160MHZ;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005062
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305063 cfg->vht_tx_stbc = vht_cap_info & WMI_VHT_CAP_TX_STBC;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005064
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305065 cfg->vht_rx_stbc =
5066 (vht_cap_info & WMI_VHT_CAP_RX_STBC_1SS) |
5067 (vht_cap_info & WMI_VHT_CAP_RX_STBC_2SS) |
5068 (vht_cap_info & WMI_VHT_CAP_RX_STBC_3SS);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005069
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305070 cfg->vht_max_ampdu_len_exp = (vht_cap_info &
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005071 WMI_VHT_CAP_MAX_AMPDU_LEN_EXP)
5072 >> WMI_VHT_CAP_MAX_AMPDU_LEN_EXP_SHIFT;
5073
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305074 cfg->vht_su_bformer = vht_cap_info & WMI_VHT_CAP_SU_BFORMER;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005075
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305076 cfg->vht_su_bformee = vht_cap_info & WMI_VHT_CAP_SU_BFORMEE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005077
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305078 cfg->vht_mu_bformer = vht_cap_info & WMI_VHT_CAP_MU_BFORMER;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005079
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305080 cfg->vht_mu_bformee = vht_cap_info & WMI_VHT_CAP_MU_BFORMEE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005081
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305082 cfg->vht_txop_ps = vht_cap_info & WMI_VHT_CAP_TXOP_PS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005083
Jeff Johnson3fd21822016-11-08 11:30:37 -08005084 WMA_LOGD("%s: max_mpdu %d supp_chan_width %x rx_ldpc %x\n"
5085 "short_gi_80 %x tx_stbc %x rx_stbc %x txop_ps %x\n"
5086 "su_bformee %x mu_bformee %x max_ampdu_len_exp %d", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005087 cfg->vht_max_mpdu, cfg->supp_chan_width, cfg->vht_rx_ldpc,
5088 cfg->vht_short_gi_80, cfg->vht_tx_stbc, cfg->vht_rx_stbc,
5089 cfg->vht_txop_ps, cfg->vht_su_bformee, cfg->vht_mu_bformee,
5090 cfg->vht_max_ampdu_len_exp);
5091}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005092
5093/**
Krunal Sonica50b452017-08-04 22:24:59 -07005094 * wma_update_supported_bands() - update supported bands from service ready ext
Krunal Sonica50b452017-08-04 22:24:59 -07005095 * @supported_bands: Supported band given by FW through service ready ext params
5096 * @new_supported_bands: New supported band which needs to be updated by
5097 * this API which WMA layer understands
5098 *
5099 * This API will convert FW given supported band to enum which WMA layer
5100 * understands
5101 *
5102 * Return: QDF_STATUS
5103 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305104static QDF_STATUS wma_update_supported_bands(
Krunal Sonica50b452017-08-04 22:24:59 -07005105 WLAN_BAND_CAPABILITY supported_bands,
5106 WMI_PHY_CAPABILITY *new_supported_bands)
5107{
5108 QDF_STATUS status = QDF_STATUS_SUCCESS;
5109
Krunal Sonica50b452017-08-04 22:24:59 -07005110 if (!new_supported_bands) {
5111 WMA_LOGE("%s: NULL new supported band variable", __func__);
5112 return QDF_STATUS_E_FAILURE;
5113 }
5114 switch (supported_bands) {
5115 case WLAN_2G_CAPABILITY:
5116 *new_supported_bands |= WMI_11G_CAPABILITY;
5117 break;
5118 case WLAN_5G_CAPABILITY:
5119 *new_supported_bands |= WMI_11A_CAPABILITY;
5120 break;
5121 default:
5122 WMA_LOGE("%s: wrong supported band", __func__);
5123 status = QDF_STATUS_E_FAILURE;
5124 break;
5125 }
5126 return status;
5127}
5128
5129/**
Krunal Soniaa664da2016-06-15 23:46:40 -07005130 * wma_derive_ext_ht_cap() - Derive HT caps based on given value
Krunal Soniaa664da2016-06-15 23:46:40 -07005131 * @ht_cap: given pointer to HT caps which needs to be updated
5132 * @tx_chain: given tx chainmask value
5133 * @rx_chain: given rx chainmask value
5134 * @value: new HT cap info provided in form of bitmask
5135 *
5136 * This function takes the value provided in form of bitmask and decodes
5137 * it. After decoding, what ever value it gets, it takes the union(max) or
5138 * intersection(min) with previously derived values.
5139 *
5140 * Return: none
5141 *
5142 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305143static void wma_derive_ext_ht_cap(
Krunal Soniaa664da2016-06-15 23:46:40 -07005144 struct wma_tgt_ht_cap *ht_cap, uint32_t value,
5145 uint32_t tx_chain, uint32_t rx_chain)
5146{
5147 struct wma_tgt_ht_cap tmp = {0};
5148
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07005149 if (!ht_cap)
Krunal Soniaa664da2016-06-15 23:46:40 -07005150 return;
5151
Ankit Guptaa5076012016-09-14 11:32:19 -07005152 if (!qdf_mem_cmp(ht_cap, &tmp, sizeof(struct wma_tgt_ht_cap))) {
Krunal Soniaa664da2016-06-15 23:46:40 -07005153 ht_cap->ht_rx_stbc = (!!(value & WMI_HT_CAP_RX_STBC));
5154 ht_cap->ht_tx_stbc = (!!(value & WMI_HT_CAP_TX_STBC));
5155 ht_cap->mpdu_density = (!!(value & WMI_HT_CAP_MPDU_DENSITY));
5156 ht_cap->ht_rx_ldpc = (!!(value & WMI_HT_CAP_RX_LDPC));
5157 ht_cap->ht_sgi_20 = (!!(value & WMI_HT_CAP_HT20_SGI));
5158 ht_cap->ht_sgi_40 = (!!(value & WMI_HT_CAP_HT40_SGI));
5159 ht_cap->num_rf_chains =
5160 QDF_MAX(wma_get_num_of_setbits_from_bitmask(tx_chain),
5161 wma_get_num_of_setbits_from_bitmask(rx_chain));
5162 } else {
5163 ht_cap->ht_rx_stbc = QDF_MIN(ht_cap->ht_rx_stbc,
5164 (!!(value & WMI_HT_CAP_RX_STBC)));
5165 ht_cap->ht_tx_stbc = QDF_MAX(ht_cap->ht_tx_stbc,
5166 (!!(value & WMI_HT_CAP_TX_STBC)));
5167 ht_cap->mpdu_density = QDF_MIN(ht_cap->mpdu_density,
5168 (!!(value & WMI_HT_CAP_MPDU_DENSITY)));
5169 ht_cap->ht_rx_ldpc = QDF_MIN(ht_cap->ht_rx_ldpc,
5170 (!!(value & WMI_HT_CAP_RX_LDPC)));
5171 ht_cap->ht_sgi_20 = QDF_MIN(ht_cap->ht_sgi_20,
5172 (!!(value & WMI_HT_CAP_HT20_SGI)));
5173 ht_cap->ht_sgi_40 = QDF_MIN(ht_cap->ht_sgi_40,
5174 (!!(value & WMI_HT_CAP_HT40_SGI)));
5175 ht_cap->num_rf_chains =
5176 QDF_MAX(ht_cap->num_rf_chains,
5177 QDF_MAX(wma_get_num_of_setbits_from_bitmask(
5178 tx_chain),
5179 wma_get_num_of_setbits_from_bitmask(
5180 rx_chain)));
5181 }
5182}
5183
5184/**
5185 * wma_update_target_ext_ht_cap() - Update HT caps with given extended cap
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305186 * @tgt_hdl - target psoc information
Krunal Soniaa664da2016-06-15 23:46:40 -07005187 * @ht_cap: HT cap structure to be filled
5188 *
5189 * This function loop through each hardware mode and for each hardware mode
5190 * again it loop through each MAC/PHY and pull the caps 2G and 5G specific
5191 * HT caps and derives the final cap.
5192 *
5193 * Return: none
5194 *
5195 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305196static void wma_update_target_ext_ht_cap(struct target_psoc_info *tgt_hdl,
5197 struct wma_tgt_ht_cap *ht_cap)
Krunal Soniaa664da2016-06-15 23:46:40 -07005198{
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08005199 int i, total_mac_phy_cnt;
Krunal Soniaa664da2016-06-15 23:46:40 -07005200 uint32_t ht_2g, ht_5g;
5201 struct wma_tgt_ht_cap tmp_ht_cap = {0}, tmp_cap = {0};
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305202 struct wlan_psoc_host_mac_phy_caps *mac_phy_cap;
5203 int num_hw_modes;
Krunal Soniaa664da2016-06-15 23:46:40 -07005204
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08005205 total_mac_phy_cnt = target_psoc_get_total_mac_phy_cnt(tgt_hdl);
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305206 num_hw_modes = target_psoc_get_num_hw_modes(tgt_hdl);
5207 mac_phy_cap = target_psoc_get_mac_phy_cap(tgt_hdl);
Krunal Soniaa664da2016-06-15 23:46:40 -07005208 /*
5209 * for legacy device extended cap might not even come, so in that case
5210 * don't overwrite legacy values
5211 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305212 if (!num_hw_modes) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07005213 WMA_LOGD("%s: No extended HT cap for current SOC", __func__);
Krunal Soniaa664da2016-06-15 23:46:40 -07005214 return;
5215 }
5216
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08005217 for (i = 0; i < total_mac_phy_cnt; i++) {
5218 ht_2g = mac_phy_cap[i].ht_cap_info_2G;
5219 ht_5g = mac_phy_cap[i].ht_cap_info_5G;
5220 if (ht_2g)
5221 wma_derive_ext_ht_cap(&tmp_ht_cap,
5222 ht_2g,
5223 mac_phy_cap[i].tx_chain_mask_2G,
5224 mac_phy_cap[i].rx_chain_mask_2G);
5225 if (ht_5g)
5226 wma_derive_ext_ht_cap(&tmp_ht_cap,
5227 ht_5g,
5228 mac_phy_cap[i].tx_chain_mask_5G,
5229 mac_phy_cap[i].rx_chain_mask_5G);
Krunal Soniaa664da2016-06-15 23:46:40 -07005230 }
5231
Ankit Guptaa5076012016-09-14 11:32:19 -07005232 if (qdf_mem_cmp(&tmp_cap, &tmp_ht_cap,
Krunal Soniaa664da2016-06-15 23:46:40 -07005233 sizeof(struct wma_tgt_ht_cap))) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07005234 qdf_mem_copy(ht_cap, &tmp_ht_cap,
5235 sizeof(struct wma_tgt_ht_cap));
Krunal Soniaa664da2016-06-15 23:46:40 -07005236 }
5237
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07005238 WMA_LOGD("%s: [ext ht cap] ht_rx_stbc - %d, ht_tx_stbc - %d\n"
Jeff Johnson3fd21822016-11-08 11:30:37 -08005239 "mpdu_density - %d ht_rx_ldpc - %d ht_sgi_20 - %d\n"
5240 "ht_sgi_40 - %d num_rf_chains - %d", __func__,
Krunal Soniaa664da2016-06-15 23:46:40 -07005241 ht_cap->ht_rx_stbc, ht_cap->ht_tx_stbc,
5242 ht_cap->mpdu_density, ht_cap->ht_rx_ldpc,
5243 ht_cap->ht_sgi_20, ht_cap->ht_sgi_40,
5244 ht_cap->num_rf_chains);
5245}
5246
5247/**
5248 * wma_derive_ext_vht_cap() - Derive VHT caps based on given value
Krunal Soniaa664da2016-06-15 23:46:40 -07005249 * @vht_cap: pointer to given VHT caps to be filled
5250 * @value: new VHT cap info provided in form of bitmask
5251 *
5252 * This function takes the value provided in form of bitmask and decodes
5253 * it. After decoding, what ever value it gets, it takes the union(max) or
5254 * intersection(min) with previously derived values.
5255 *
5256 * Return: none
5257 *
5258 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305259static void wma_derive_ext_vht_cap(
Krunal Soniaa664da2016-06-15 23:46:40 -07005260 struct wma_tgt_vht_cap *vht_cap, uint32_t value)
5261{
5262 struct wma_tgt_vht_cap tmp_cap = {0};
5263 uint32_t tmp = 0;
5264
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07005265 if (!vht_cap)
Krunal Soniaa664da2016-06-15 23:46:40 -07005266 return;
5267
Ankit Guptaa5076012016-09-14 11:32:19 -07005268 if (!qdf_mem_cmp(vht_cap, &tmp_cap,
Krunal Soniaa664da2016-06-15 23:46:40 -07005269 sizeof(struct wma_tgt_vht_cap))) {
5270 if (value & WMI_VHT_CAP_MAX_MPDU_LEN_11454)
5271 vht_cap->vht_max_mpdu = WMI_VHT_CAP_MAX_MPDU_LEN_11454;
5272 else if (value & WMI_VHT_CAP_MAX_MPDU_LEN_7935)
5273 vht_cap->vht_max_mpdu = WMI_VHT_CAP_MAX_MPDU_LEN_7935;
5274 else
5275 vht_cap->vht_max_mpdu = 0;
5276
5277 if (value & WMI_VHT_CAP_CH_WIDTH_80P80_160MHZ) {
5278 vht_cap->supp_chan_width =
5279 1 << eHT_CHANNEL_WIDTH_80P80MHZ;
5280 vht_cap->supp_chan_width |=
5281 1 << eHT_CHANNEL_WIDTH_160MHZ;
5282 } else if (value & WMI_VHT_CAP_CH_WIDTH_160MHZ) {
5283 vht_cap->supp_chan_width =
5284 1 << eHT_CHANNEL_WIDTH_160MHZ;
5285 } else {
5286 vht_cap->supp_chan_width = 1 << eHT_CHANNEL_WIDTH_80MHZ;
5287 }
5288 vht_cap->vht_rx_ldpc = value & WMI_VHT_CAP_RX_LDPC;
5289 vht_cap->vht_short_gi_80 = value & WMI_VHT_CAP_SGI_80MHZ;
5290 vht_cap->vht_short_gi_160 = value & WMI_VHT_CAP_SGI_160MHZ;
5291 vht_cap->vht_tx_stbc = value & WMI_VHT_CAP_TX_STBC;
5292 vht_cap->vht_rx_stbc =
5293 (value & WMI_VHT_CAP_RX_STBC_1SS) |
5294 (value & WMI_VHT_CAP_RX_STBC_2SS) |
5295 (value & WMI_VHT_CAP_RX_STBC_3SS);
5296 vht_cap->vht_max_ampdu_len_exp =
5297 (value & WMI_VHT_CAP_MAX_AMPDU_LEN_EXP) >>
5298 WMI_VHT_CAP_MAX_AMPDU_LEN_EXP_SHIFT;
5299 vht_cap->vht_su_bformer = value & WMI_VHT_CAP_SU_BFORMER;
5300 vht_cap->vht_su_bformee = value & WMI_VHT_CAP_SU_BFORMEE;
5301 vht_cap->vht_mu_bformer = value & WMI_VHT_CAP_MU_BFORMER;
5302 vht_cap->vht_mu_bformee = value & WMI_VHT_CAP_MU_BFORMEE;
5303 vht_cap->vht_txop_ps = value & WMI_VHT_CAP_TXOP_PS;
5304 } else {
5305 if (value & WMI_VHT_CAP_MAX_MPDU_LEN_11454)
5306 tmp = WMI_VHT_CAP_MAX_MPDU_LEN_11454;
5307 else if (value & WMI_VHT_CAP_MAX_MPDU_LEN_7935)
5308 tmp = WMI_VHT_CAP_MAX_MPDU_LEN_7935;
5309 else
5310 tmp = 0;
5311 vht_cap->vht_max_mpdu = QDF_MIN(vht_cap->vht_max_mpdu, tmp);
5312
5313 if ((value & WMI_VHT_CAP_CH_WIDTH_80P80_160MHZ)) {
5314 tmp = (1 << eHT_CHANNEL_WIDTH_80P80MHZ) |
5315 (1 << eHT_CHANNEL_WIDTH_160MHZ);
5316 } else if (value & WMI_VHT_CAP_CH_WIDTH_160MHZ) {
5317 tmp = 1 << eHT_CHANNEL_WIDTH_160MHZ;
5318 } else {
5319 tmp = 1 << eHT_CHANNEL_WIDTH_80MHZ;
5320 }
5321 vht_cap->supp_chan_width =
5322 QDF_MAX(vht_cap->supp_chan_width, tmp);
5323 vht_cap->vht_rx_ldpc = QDF_MIN(vht_cap->vht_rx_ldpc,
5324 value & WMI_VHT_CAP_RX_LDPC);
5325 vht_cap->vht_short_gi_80 = QDF_MAX(vht_cap->vht_short_gi_80,
5326 value & WMI_VHT_CAP_SGI_80MHZ);
5327 vht_cap->vht_short_gi_160 = QDF_MAX(vht_cap->vht_short_gi_160,
5328 value & WMI_VHT_CAP_SGI_160MHZ);
5329 vht_cap->vht_tx_stbc = QDF_MAX(vht_cap->vht_tx_stbc,
5330 value & WMI_VHT_CAP_TX_STBC);
5331 vht_cap->vht_rx_stbc = QDF_MIN(vht_cap->vht_rx_stbc,
5332 (value & WMI_VHT_CAP_RX_STBC_1SS) |
5333 (value & WMI_VHT_CAP_RX_STBC_2SS) |
5334 (value & WMI_VHT_CAP_RX_STBC_3SS));
5335 vht_cap->vht_max_ampdu_len_exp =
5336 QDF_MIN(vht_cap->vht_max_ampdu_len_exp,
5337 (value & WMI_VHT_CAP_MAX_AMPDU_LEN_EXP) >>
5338 WMI_VHT_CAP_MAX_AMPDU_LEN_EXP_SHIFT);
5339 vht_cap->vht_su_bformer = QDF_MAX(vht_cap->vht_su_bformer,
5340 value & WMI_VHT_CAP_SU_BFORMER);
5341 vht_cap->vht_su_bformee = QDF_MAX(vht_cap->vht_su_bformee,
5342 value & WMI_VHT_CAP_SU_BFORMEE);
5343 vht_cap->vht_mu_bformer = QDF_MAX(vht_cap->vht_mu_bformer,
5344 value & WMI_VHT_CAP_MU_BFORMER);
5345 vht_cap->vht_mu_bformee = QDF_MAX(vht_cap->vht_mu_bformee,
5346 value & WMI_VHT_CAP_MU_BFORMEE);
5347 vht_cap->vht_txop_ps = QDF_MIN(vht_cap->vht_txop_ps,
5348 value & WMI_VHT_CAP_TXOP_PS);
5349 }
5350}
5351
5352/**
5353 * wma_update_target_ext_vht_cap() - Update VHT caps with given extended cap
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305354 * @tgt_hdl - target psoc information
Krunal Soniaa664da2016-06-15 23:46:40 -07005355 * @vht_cap: VHT cap structure to be filled
5356 *
5357 * This function loop through each hardware mode and for each hardware mode
5358 * again it loop through each MAC/PHY and pull the caps 2G and 5G specific
5359 * VHT caps and derives the final cap.
5360 *
5361 * Return: none
5362 *
5363 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305364static void wma_update_target_ext_vht_cap(struct target_psoc_info *tgt_hdl,
5365 struct wma_tgt_vht_cap *vht_cap)
Krunal Soniaa664da2016-06-15 23:46:40 -07005366{
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08005367 int i, num_hw_modes, total_mac_phy_cnt;
Krunal Soniaa664da2016-06-15 23:46:40 -07005368 uint32_t vht_cap_info_2g, vht_cap_info_5g;
5369 struct wma_tgt_vht_cap tmp_vht_cap = {0}, tmp_cap = {0};
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305370 struct wlan_psoc_host_mac_phy_caps *mac_phy_cap;
5371
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08005372 total_mac_phy_cnt = target_psoc_get_total_mac_phy_cnt(tgt_hdl);
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305373 num_hw_modes = target_psoc_get_num_hw_modes(tgt_hdl);
5374 mac_phy_cap = target_psoc_get_mac_phy_cap(tgt_hdl);
Krunal Soniaa664da2016-06-15 23:46:40 -07005375
5376 /*
5377 * for legacy device extended cap might not even come, so in that case
5378 * don't overwrite legacy values
5379 */
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08005380 if (!num_hw_modes) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07005381 WMA_LOGD("%s: No extended VHT cap for current SOC", __func__);
Krunal Soniaa664da2016-06-15 23:46:40 -07005382 return;
5383 }
5384
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08005385 for (i = 0; i < total_mac_phy_cnt; i++) {
5386 vht_cap_info_2g = mac_phy_cap[i].vht_cap_info_2G;
5387 vht_cap_info_5g = mac_phy_cap[i].vht_cap_info_5G;
5388 if (vht_cap_info_2g)
5389 wma_derive_ext_vht_cap(&tmp_vht_cap,
5390 vht_cap_info_2g);
5391 if (vht_cap_info_5g)
5392 wma_derive_ext_vht_cap(&tmp_vht_cap,
5393 vht_cap_info_5g);
Krunal Soniaa664da2016-06-15 23:46:40 -07005394 }
5395
Ankit Guptaa5076012016-09-14 11:32:19 -07005396 if (qdf_mem_cmp(&tmp_cap, &tmp_vht_cap,
Krunal Soniaa664da2016-06-15 23:46:40 -07005397 sizeof(struct wma_tgt_vht_cap))) {
5398 qdf_mem_copy(vht_cap, &tmp_vht_cap,
5399 sizeof(struct wma_tgt_vht_cap));
5400 }
5401
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07005402 WMA_LOGD("%s: [ext vhtcap] max_mpdu %d supp_chan_width %x rx_ldpc %x\n"
Jeff Johnson3fd21822016-11-08 11:30:37 -08005403 "short_gi_80 %x tx_stbc %x rx_stbc %x txop_ps %x\n"
5404 "su_bformee %x mu_bformee %x max_ampdu_len_exp %d", __func__,
Krunal Soniaa664da2016-06-15 23:46:40 -07005405 vht_cap->vht_max_mpdu, vht_cap->supp_chan_width,
5406 vht_cap->vht_rx_ldpc, vht_cap->vht_short_gi_80,
5407 vht_cap->vht_tx_stbc, vht_cap->vht_rx_stbc,
5408 vht_cap->vht_txop_ps, vht_cap->vht_su_bformee,
5409 vht_cap->vht_mu_bformee, vht_cap->vht_max_ampdu_len_exp);
5410}
5411
Jeff Johnson0918f242018-07-17 18:52:17 -07005412static void
5413wma_update_sar_version(struct wlan_psoc_host_service_ext_param *param,
5414 struct wma_tgt_cfg *cfg)
5415{
5416 cfg->sar_version = param ? param->sar_version : SAR_VERSION_1;
5417}
5418
Anurag Chouhan04dbf6d2016-09-08 15:32:52 +05305419/**
Krunal Sonica50b452017-08-04 22:24:59 -07005420 * wma_update_hdd_band_cap() - update band cap which hdd understands
5421 * @supported_band: supported band which has been given by FW
5422 * @tgt_cfg: target configuration to be updated
5423 *
5424 * Convert WMA given supported band to enum which HDD understands
5425 *
5426 * Return: None
5427 */
5428static void wma_update_hdd_band_cap(WMI_PHY_CAPABILITY supported_band,
5429 struct wma_tgt_cfg *tgt_cfg)
5430{
5431 switch (supported_band) {
5432 case WMI_11G_CAPABILITY:
5433 case WMI_11NG_CAPABILITY:
Varun Reddy Yeturua48bc412017-11-17 15:33:35 -08005434 tgt_cfg->band_cap = BAND_2G;
Krunal Sonica50b452017-08-04 22:24:59 -07005435 break;
5436 case WMI_11A_CAPABILITY:
5437 case WMI_11NA_CAPABILITY:
5438 case WMI_11AC_CAPABILITY:
Varun Reddy Yeturua48bc412017-11-17 15:33:35 -08005439 tgt_cfg->band_cap = BAND_5G;
Krunal Sonica50b452017-08-04 22:24:59 -07005440 break;
5441 case WMI_11AG_CAPABILITY:
5442 case WMI_11NAG_CAPABILITY:
5443 default:
Varun Reddy Yeturua48bc412017-11-17 15:33:35 -08005444 tgt_cfg->band_cap = BAND_ALL;
Krunal Sonica50b452017-08-04 22:24:59 -07005445 }
5446}
5447
5448/**
Arif Hussainee10f902017-12-27 16:30:17 -08005449 * wma_update_obss_detection_support() - update obss detection offload support
5450 * @wh: wma handle
5451 * @tgt_cfg: target configuration to be updated
5452 *
5453 * Update obss detection offload support based on service bit.
5454 *
5455 * Return: None
5456 */
5457static void wma_update_obss_detection_support(tp_wma_handle wh,
5458 struct wma_tgt_cfg *tgt_cfg)
5459{
Arif Hussain05fb4872018-01-03 16:02:55 -08005460 if (wmi_service_enabled(wh->wmi_handle,
5461 wmi_service_ap_obss_detection_offload))
Arif Hussainee10f902017-12-27 16:30:17 -08005462 tgt_cfg->obss_detection_offloaded = true;
5463 else
5464 tgt_cfg->obss_detection_offloaded = false;
5465}
5466
5467/**
Arif Hussain50689082019-03-26 12:07:58 -07005468 * wma_update_bcast_twt_support() - update bcost twt support
5469 * @wh: wma handle
5470 * @tgt_cfg: target configuration to be updated
5471 *
5472 * Update braodcast twt support based on service bit.
5473 *
5474 * Return: None
5475 */
5476static void wma_update_bcast_twt_support(tp_wma_handle wh,
5477 struct wma_tgt_cfg *tgt_cfg)
5478{
5479 if (wmi_service_enabled(wh->wmi_handle,
5480 wmi_service_bcast_twt_support))
5481 tgt_cfg->bcast_twt_support = true;
5482 else
5483 tgt_cfg->bcast_twt_support = false;
5484}
5485
5486/**
Arif Hussain05fb4872018-01-03 16:02:55 -08005487 * wma_update_obss_color_collision_support() - update obss color collision
5488 * offload support
5489 * @wh: wma handle
5490 * @tgt_cfg: target configuration to be updated
5491 *
5492 * Update obss color collision offload support based on service bit.
5493 *
5494 * Return: None
5495 */
5496static void wma_update_obss_color_collision_support(tp_wma_handle wh,
5497 struct wma_tgt_cfg *tgt_cfg)
5498{
5499 if (wmi_service_enabled(wh->wmi_handle, wmi_service_bss_color_offload))
5500 tgt_cfg->obss_color_collision_offloaded = true;
5501 else
5502 tgt_cfg->obss_color_collision_offloaded = false;
5503}
5504
Jeff Johnson6ec742c2018-03-31 15:21:08 -07005505#ifdef WLAN_SUPPORT_GREEN_AP
5506static void wma_green_ap_register_handlers(tp_wma_handle wma_handle)
5507{
5508 if (WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
5509 WMI_SERVICE_EGAP))
5510 target_if_green_ap_register_egap_event_handler(
5511 wma_handle->pdev);
5512
5513}
5514#else
5515static void wma_green_ap_register_handlers(tp_wma_handle wma_handle)
5516{
5517}
5518#endif
5519
Nachiket Kukade85aa3782018-11-02 20:12:34 +05305520#ifdef WLAN_FEATURE_NAN
5521static void wma_update_nan_target_caps(tp_wma_handle wma_handle,
5522 struct wma_tgt_cfg *tgt_cfg)
5523{
5524 if (wmi_service_enabled(wma_handle->wmi_handle,
5525 wmi_service_nan_disable_support))
5526 tgt_cfg->nan_caps.nan_disable_supported = 1;
5527
5528 if (wmi_service_enabled(wma_handle->wmi_handle,
5529 wmi_service_nan_dbs_support))
5530 tgt_cfg->nan_caps.nan_dbs_supported = 1;
5531
5532 if (wmi_service_enabled(wma_handle->wmi_handle,
5533 wmi_service_ndi_dbs_support))
5534 tgt_cfg->nan_caps.ndi_dbs_supported = 1;
5535
5536 if (wmi_service_enabled(wma_handle->wmi_handle,
5537 wmi_service_nan_sap_support))
5538 tgt_cfg->nan_caps.nan_sap_supported = 1;
5539
5540 if (wmi_service_enabled(wma_handle->wmi_handle,
5541 wmi_service_ndi_sap_support))
5542 tgt_cfg->nan_caps.ndi_sap_supported = 1;
5543}
5544#else
5545static void wma_update_nan_target_caps(tp_wma_handle wma_handle,
5546 struct wma_tgt_cfg *tgt_cfg)
5547{
5548}
5549#endif
5550
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05305551static uint8_t
5552wma_convert_chainmask_to_chain(uint8_t chainmask)
5553{
5554 uint8_t num_chains = 0;
5555
5556 while (chainmask) {
5557 chainmask &= (chainmask - 1);
5558 num_chains++;
5559 }
5560
5561 return num_chains;
5562}
5563
5564static void
5565wma_fill_chain_cfg(struct target_psoc_info *tgt_hdl,
5566 uint8_t phy)
5567{
5568 struct mac_context *mac_ctx;
5569 uint8_t num_chain;
5570 struct wlan_psoc_host_mac_phy_caps *mac_phy_cap =
5571 tgt_hdl->info.mac_phy_cap;
5572
5573 mac_ctx = cds_get_context(QDF_MODULE_ID_PE);
5574 if (!mac_ctx) {
5575 WMA_LOGE("fill chain cfg failed as mac_ctx is NULL");
5576 return;
5577 }
5578
5579 num_chain = wma_convert_chainmask_to_chain(mac_phy_cap[phy].
5580 tx_chain_mask_2G);
5581
5582 if (num_chain > mac_ctx->fw_chain_cfg.max_tx_chains_2g)
5583 mac_ctx->fw_chain_cfg.max_tx_chains_2g = num_chain;
5584
5585 num_chain = wma_convert_chainmask_to_chain(mac_phy_cap[phy].
5586 tx_chain_mask_5G);
5587
5588 if (num_chain > mac_ctx->fw_chain_cfg.max_tx_chains_5g)
5589 mac_ctx->fw_chain_cfg.max_tx_chains_5g = num_chain;
5590
5591 num_chain = wma_convert_chainmask_to_chain(mac_phy_cap[phy].
5592 rx_chain_mask_2G);
5593
5594 if (num_chain > mac_ctx->fw_chain_cfg.max_rx_chains_2g)
5595 mac_ctx->fw_chain_cfg.max_rx_chains_2g = num_chain;
5596
5597 num_chain = wma_convert_chainmask_to_chain(mac_phy_cap[phy].
5598 rx_chain_mask_5G);
5599
5600 if (num_chain > mac_ctx->fw_chain_cfg.max_rx_chains_5g)
5601 mac_ctx->fw_chain_cfg.max_rx_chains_5g = num_chain;
5602}
5603
Arif Hussain05fb4872018-01-03 16:02:55 -08005604/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005605 * wma_update_hdd_cfg() - update HDD config
5606 * @wma_handle: wma handle
5607 *
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05305608 * Return: Zero on success err number on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005609 */
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05305610static int wma_update_hdd_cfg(tp_wma_handle wma_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005611{
5612 struct wma_tgt_cfg tgt_cfg;
Anurag Chouhan6d760662016-02-20 16:05:43 +05305613 void *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305614 target_resource_config *wlan_res_cfg;
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305615 struct wlan_psoc_host_service_ext_param *service_ext_param;
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05305616 struct target_psoc_info *tgt_hdl;
5617 struct wmi_unified *wmi_handle;
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05305618 uint8_t i;
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05305619 int ret;
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305620
5621 WMA_LOGD("%s: Enter", __func__);
5622
5623 tgt_hdl = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
5624 if (!tgt_hdl) {
5625 WMA_LOGE("%s: target psoc info is NULL", __func__);
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05305626 return -EINVAL;
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305627 }
5628
5629 wlan_res_cfg = target_psoc_get_wlan_res_cfg(tgt_hdl);
Arif Hussaind15902c2018-03-02 00:08:29 -08005630 if (!wlan_res_cfg) {
5631 WMA_LOGE("%s: wlan_res_cfg is null", __func__);
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05305632 return -EINVAL;
Arif Hussaind15902c2018-03-02 00:08:29 -08005633 }
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05305634
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305635 service_ext_param =
5636 target_psoc_get_service_ext_param(tgt_hdl);
Sourav Mohapatracf632572018-04-02 11:01:35 +05305637 wmi_handle = get_wmi_unified_hdl_from_psoc(wma_handle->psoc);
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05305638 if (!wmi_handle) {
5639 WMA_LOGE("%s: wmi handle is NULL", __func__);
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05305640 return -EINVAL;
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05305641 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005642
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305643 qdf_mem_zero(&tgt_cfg, sizeof(struct wma_tgt_cfg));
Naveen Rawat64e477e2016-05-20 10:34:56 -07005644
5645 tgt_cfg.sub_20_support = wma_handle->sub_20_support;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005646 tgt_cfg.reg_domain = wma_handle->reg_cap.eeprom_rd;
5647 tgt_cfg.eeprom_rd_ext = wma_handle->reg_cap.eeprom_rd_ext;
5648
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305649 tgt_cfg.max_intf_count = wlan_res_cfg->num_vdevs;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005650
Pragaspathi Thilagarajeb367282019-02-19 00:42:28 +05305651 if (wmi_service_enabled(wmi_handle, wmi_service_wpa3_ft_sae_support))
5652 tgt_cfg.ft_akm_service_bitmap |= (1 << AKM_FT_SAE);
5653
5654 if (wmi_service_enabled(wmi_handle,
5655 wmi_service_wpa3_ft_suite_b_support))
5656 tgt_cfg.ft_akm_service_bitmap |= (1 << AKM_FT_SUITEB_SHA384);
5657
5658 if (wmi_service_enabled(wmi_handle, wmi_service_ft_fils))
5659 tgt_cfg.ft_akm_service_bitmap |= (1 << AKM_FT_FILS);
5660
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305661 qdf_mem_copy(tgt_cfg.hw_macaddr.bytes, wma_handle->hwaddr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005662 ATH_MAC_LEN);
5663
Arunk Khandavalli4b44ef42018-01-25 16:45:49 +05305664 wma_update_target_services(wmi_handle, &tgt_cfg.services);
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305665 wma_update_target_ht_cap(tgt_hdl, &tgt_cfg.ht_cap);
5666 wma_update_target_vht_cap(tgt_hdl, &tgt_cfg.vht_cap);
Krunal Soniaa664da2016-06-15 23:46:40 -07005667 /*
5668 * This will overwrite the structure filled by wma_update_target_ht_cap
5669 * and wma_update_target_vht_cap APIs.
5670 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305671 wma_update_target_ext_ht_cap(tgt_hdl, &tgt_cfg.ht_cap);
5672 wma_update_target_ext_vht_cap(tgt_hdl, &tgt_cfg.vht_cap);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005673
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305674 wma_update_target_ext_he_cap(tgt_hdl, &tgt_cfg);
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07005675
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305676 tgt_cfg.target_fw_version = target_if_get_fw_version(tgt_hdl);
5677 if (service_ext_param)
5678 tgt_cfg.target_fw_vers_ext =
5679 service_ext_param->fw_build_vers_ext;
5680
Ryan Hsuc6918552018-05-16 13:29:59 -07005681 tgt_cfg.hw_bd_id = wma_handle->hw_bd_id;
5682 tgt_cfg.hw_bd_info.bdf_version = wma_handle->hw_bd_info[BDF_VERSION];
5683 tgt_cfg.hw_bd_info.ref_design_id =
5684 wma_handle->hw_bd_info[REF_DESIGN_ID];
5685 tgt_cfg.hw_bd_info.customer_id = wma_handle->hw_bd_info[CUSTOMER_ID];
5686 tgt_cfg.hw_bd_info.project_id = wma_handle->hw_bd_info[PROJECT_ID];
5687 tgt_cfg.hw_bd_info.board_data_rev =
5688 wma_handle->hw_bd_info[BOARD_DATA_REV];
5689
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005690#ifdef WLAN_FEATURE_LPSS
5691 tgt_cfg.lpss_support = wma_handle->lpss_support;
5692#endif /* WLAN_FEATURE_LPSS */
5693 tgt_cfg.ap_arpns_support = wma_handle->ap_arpns_support;
Arif Hussaind54b62c2018-03-01 13:31:37 -08005694 tgt_cfg.dfs_cac_offload = wma_handle->is_dfs_offloaded;
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +05305695 tgt_cfg.rcpi_enabled = wma_handle->rcpi_enabled;
Arunk Khandavalli80a61352018-01-25 12:19:37 +05305696 wma_update_hdd_band_cap(target_if_get_phy_capability(tgt_hdl),
5697 &tgt_cfg);
Jeff Johnson0918f242018-07-17 18:52:17 -07005698 wma_update_sar_version(service_ext_param, &tgt_cfg);
Krishna Kumaar Natarajan1ae49112015-11-24 21:43:22 -08005699 tgt_cfg.fine_time_measurement_cap =
Arunk Khandavalli2462f462018-01-25 14:41:02 +05305700 target_if_get_wmi_fw_sub_feat_caps(tgt_hdl);
Rajeev Kumar Sirasanagandla47873002016-09-09 13:46:09 +05305701 tgt_cfg.wmi_max_len = wmi_get_max_msg_len(wma_handle->wmi_handle)
5702 - WMI_TLV_HEADROOM;
Nachiket Kukade8b4bfd82017-05-25 18:34:48 +05305703 tgt_cfg.tx_bfee_8ss_enabled = wma_handle->tx_bfee_8ss_enabled;
gaurank kathpalia5fcefa92018-10-24 15:03:15 +05305704 tgt_cfg.dynamic_nss_chains_support =
5705 wma_handle->dynamic_nss_chains_support;
Arif Hussainee10f902017-12-27 16:30:17 -08005706 wma_update_obss_detection_support(wma_handle, &tgt_cfg);
Arif Hussain05fb4872018-01-03 16:02:55 -08005707 wma_update_obss_color_collision_support(wma_handle, &tgt_cfg);
Deepak Dhamdhere13230d32016-05-26 00:46:53 -07005708 wma_update_hdd_cfg_ndp(wma_handle, &tgt_cfg);
Nachiket Kukade85aa3782018-11-02 20:12:34 +05305709 wma_update_nan_target_caps(wma_handle, &tgt_cfg);
Arif Hussain50689082019-03-26 12:07:58 -07005710 wma_update_bcast_twt_support(wma_handle, &tgt_cfg);
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05305711
5712 /* Take the max of chains supported by FW, which will limit nss */
5713 for (i = 0; i < tgt_hdl->info.total_mac_phy_cnt; i++)
5714 wma_fill_chain_cfg(tgt_hdl, i);
5715
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05305716 ret = wma_handle->tgt_cfg_update_cb(hdd_ctx, &tgt_cfg);
5717 if (ret)
5718 return -EINVAL;
Himanshu Agarwal2228e072018-01-24 17:42:17 +05305719 target_if_store_pdev_target_if_ctx(wma_get_pdev_from_scn_handle);
Nachiket Kukade7dda8c22018-03-12 19:59:43 +05305720 target_pdev_set_wmi_handle(wma_handle->pdev->tgt_if_handle,
5721 wma_handle->wmi_handle);
Jeff Johnson6ec742c2018-03-31 15:21:08 -07005722 wma_green_ap_register_handlers(wma_handle);
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05305723
5724 return ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005725}
5726
5727/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005728 * wma_dump_dbs_hw_mode() - Print the DBS HW modes
5729 * @wma_handle: WMA handle
5730 *
5731 * Prints the DBS HW modes sent by the FW as part
5732 * of WMI ready event
5733 *
5734 * Return: None
5735 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07005736static void wma_dump_dbs_hw_mode(tp_wma_handle wma_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005737{
5738 uint32_t i, param;
5739
5740 if (!wma_handle) {
5741 WMA_LOGE("%s: Invalid WMA handle", __func__);
5742 return;
5743 }
5744
5745 for (i = 0; i < wma_handle->num_dbs_hw_modes; i++) {
5746 param = wma_handle->hw_mode.hw_mode_list[i];
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08005747 WMA_LOGD("%s:[%d]-MAC0: tx_ss:%d rx_ss:%d bw_idx:%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005748 __func__, i,
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305749 WMA_HW_MODE_MAC0_TX_STREAMS_GET(param),
5750 WMA_HW_MODE_MAC0_RX_STREAMS_GET(param),
5751 WMA_HW_MODE_MAC0_BANDWIDTH_GET(param));
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08005752 WMA_LOGD("%s:[%d]-MAC1: tx_ss:%d rx_ss:%d bw_idx:%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005753 __func__, i,
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305754 WMA_HW_MODE_MAC1_TX_STREAMS_GET(param),
5755 WMA_HW_MODE_MAC1_RX_STREAMS_GET(param),
5756 WMA_HW_MODE_MAC1_BANDWIDTH_GET(param));
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08005757 WMA_LOGD("%s:[%d] DBS:%d SBS:%d", __func__, i,
Nitesh Shah5b7bae02016-09-28 18:58:33 +05305758 WMA_HW_MODE_DBS_MODE_GET(param),
5759 WMA_HW_MODE_SBS_MODE_GET(param));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005760 }
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07005761 policy_mgr_dump_dbs_hw_mode(wma_handle->psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005762}
5763
5764/**
5765 * wma_init_scan_fw_mode_config() - Initialize scan/fw mode config
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305766 * @psoc: Object manager psoc
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05305767 * @scan_config: Scam mode configuration
5768 * @fw_config: FW mode configuration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005769 *
5770 * Enables all the valid bits of concurrent_scan_config_bits and
5771 * fw_mode_config_bits.
5772 *
5773 * Return: None
5774 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305775static void wma_init_scan_fw_mode_config(struct wlan_objmgr_psoc *psoc,
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07005776 uint32_t scan_config,
5777 uint32_t fw_config)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005778{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005779 WMA_LOGD("%s: Enter", __func__);
5780
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305781 if (!psoc) {
5782 WMA_LOGE("%s: obj psoc is NULL", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005783 return;
5784 }
5785
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305786 policy_mgr_init_dbs_config(psoc, scan_config, fw_config);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005787}
5788
Dustin Brown06259e52018-02-28 16:00:02 -08005789static void wma_set_pmo_caps(struct wlan_objmgr_psoc *psoc)
5790{
5791 QDF_STATUS status;
Sourav Mohapatra5daec822018-07-10 14:40:06 +05305792 tp_wma_handle wma;
Dustin Brown06259e52018-02-28 16:00:02 -08005793 struct pmo_device_caps caps;
5794
Sourav Mohapatra5daec822018-07-10 14:40:06 +05305795 wma = cds_get_context(QDF_MODULE_ID_WMA);
Arif Hussaineec28b52018-08-21 17:21:28 -07005796 if (!wma) {
5797 WMA_LOGE("%s: wma handler is null", __func__);
5798 return;
5799 }
5800
Dustin Brown06259e52018-02-28 16:00:02 -08005801 caps.arp_ns_offload =
Sourav Mohapatra5daec822018-07-10 14:40:06 +05305802 wmi_service_enabled(wma->wmi_handle, wmi_service_arpns_offload);
Dustin Brown06259e52018-02-28 16:00:02 -08005803 caps.apf =
Sourav Mohapatra5daec822018-07-10 14:40:06 +05305804 wmi_service_enabled(wma->wmi_handle, wmi_service_apf_offload);
Dustin Brown06259e52018-02-28 16:00:02 -08005805 caps.packet_filter =
Sourav Mohapatra5daec822018-07-10 14:40:06 +05305806 wmi_service_enabled(wma->wmi_handle,
5807 wmi_service_packet_filter_offload);
Dustin Brown06259e52018-02-28 16:00:02 -08005808 caps.unified_wow =
Sourav Mohapatra5daec822018-07-10 14:40:06 +05305809 wmi_service_enabled(wma->wmi_handle,
5810 wmi_service_unified_wow_capability);
Nachiket Kukade4b7c8e02018-06-01 22:53:06 +05305811 caps.li_offload =
Sourav Mohapatra5daec822018-07-10 14:40:06 +05305812 wmi_service_enabled(wma->wmi_handle,
5813 wmi_service_listen_interval_offload_support
5814 );
Dustin Brown06259e52018-02-28 16:00:02 -08005815
5816 status = ucfg_pmo_psoc_set_caps(psoc, &caps);
5817 if (QDF_IS_STATUS_ERROR(status))
5818 WMA_LOGE("Failed to set PMO capabilities; status:%d", status);
5819}
5820
Pragaspathi Thilagaraj1f3f99f2019-04-24 23:48:47 +05305821/**
5822 * wma_set_mlme_caps() - Populate the MLME related target capabilities to the
5823 * mlme component
5824 * @psoc: Pointer to psoc object
5825 *
5826 * Return: None
5827 */
5828static void wma_set_mlme_caps(struct wlan_objmgr_psoc *psoc)
5829{
5830 tp_wma_handle wma;
5831 bool tgt_cap;
5832 QDF_STATUS status;
5833
5834 wma = cds_get_context(QDF_MODULE_ID_WMA);
5835 if (!wma) {
5836 WMA_LOGE("%s: wma handler is null", __func__);
5837 return;
5838 }
5839
5840 tgt_cap = wmi_service_enabled(wma->wmi_handle,
5841 wmi_service_adaptive_11r_support);
5842
5843 status = ucfg_mlme_set_tgt_adaptive_11r_cap(psoc, tgt_cap);
5844 if (QDF_IS_STATUS_ERROR(status))
5845 WMA_LOGE("Failed to set adaptive 11r cap");
5846}
5847
Dustin Brown06259e52018-02-28 16:00:02 -08005848static void wma_set_component_caps(struct wlan_objmgr_psoc *psoc)
5849{
5850 wma_set_pmo_caps(psoc);
Pragaspathi Thilagaraj1f3f99f2019-04-24 23:48:47 +05305851 wma_set_mlme_caps(psoc);
Dustin Brown06259e52018-02-28 16:00:02 -08005852}
5853
Mukul Sharma44746042018-05-24 17:30:52 +05305854#if defined(WLAN_FEATURE_GTK_OFFLOAD) && defined(WLAN_POWER_MANAGEMENT_OFFLOAD)
5855static QDF_STATUS wma_register_gtk_offload_event(tp_wma_handle wma_handle)
5856{
5857 QDF_STATUS status = QDF_STATUS_E_FAILURE;
5858
5859 if (!wma_handle) {
5860 WMA_LOGE("%s: wma_handle passed is NULL", __func__);
5861 return QDF_STATUS_E_FAILURE;
5862 }
5863
5864 if (wmi_service_enabled(wma_handle->wmi_handle,
5865 wmi_service_gtk_offload)) {
5866 status = wmi_unified_register_event_handler(
5867 wma_handle->wmi_handle,
5868 wmi_gtk_offload_status_event_id,
5869 target_if_pmo_gtk_offload_status_event,
5870 WMA_RX_WORK_CTX);
5871 }
5872 return status;
5873}
5874#else
5875static QDF_STATUS wma_register_gtk_offload_event(tp_wma_handle wma_handle)
5876{
5877 return QDF_STATUS_SUCCESS;
5878}
5879#endif /* WLAN_FEATURE_GTK_OFFLOAD && WLAN_POWER_MANAGEMENT_OFFLOAD */
5880
Anurag Chouhan04dbf6d2016-09-08 15:32:52 +05305881/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005882 * wma_rx_service_ready_event() - event handler to process
5883 * wmi rx sevice ready event.
5884 * @handle: wma handle
5885 * @cmd_param_info: command params info
5886 *
5887 * Return: none
5888 */
Govind Singhd76a5b02016-03-08 15:12:14 +05305889int wma_rx_service_ready_event(void *handle, uint8_t *cmd_param_info,
Dustin Brown7678b6c2018-03-07 13:00:52 -08005890 uint32_t length)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005891{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005892 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005893 WMI_SERVICE_READY_EVENTID_param_tlvs *param_buf;
5894 wmi_service_ready_event_fixed_param *ev;
Dustin Brown7678b6c2018-03-07 13:00:52 -08005895 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005896 uint32_t *ev_wlan_dbs_hw_mode_list;
Leo Chang96464902016-10-28 11:10:54 -07005897 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Arunk Khandavallia6305a32018-01-25 11:19:18 +05305898 struct target_psoc_info *tgt_hdl;
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305899 struct wlan_psoc_target_capability_info *tgt_cap_info;
5900 target_resource_config *wlan_res_cfg;
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05305901 struct wmi_unified *wmi_handle;
5902 uint32_t *service_bitmap;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005903
5904 WMA_LOGD("%s: Enter", __func__);
5905
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05305906 if (!handle) {
5907 WMA_LOGE("%s: wma_handle passed is NULL", __func__);
5908 return -EINVAL;
5909 }
5910
Arunk Khandavallia6305a32018-01-25 11:19:18 +05305911 tgt_hdl = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
5912 if (!tgt_hdl) {
5913 WMA_LOGE("%s: target psoc info is NULL", __func__);
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305914 return -EINVAL;
Arunk Khandavallia6305a32018-01-25 11:19:18 +05305915 }
5916
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305917 wlan_res_cfg = target_psoc_get_wlan_res_cfg(tgt_hdl);
5918 tgt_cap_info = target_psoc_get_target_caps(tgt_hdl);
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05305919 service_bitmap = target_psoc_get_service_bitmap(tgt_hdl);
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305920
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005921 param_buf = (WMI_SERVICE_READY_EVENTID_param_tlvs *) cmd_param_info;
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05305922 if (!param_buf) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07005923 WMA_LOGE("%s: Invalid arguments", __func__);
Govind Singhd76a5b02016-03-08 15:12:14 +05305924 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005925 }
5926
5927 ev = param_buf->fixed_param;
5928 if (!ev) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07005929 WMA_LOGE("%s: Invalid buffer", __func__);
Govind Singhd76a5b02016-03-08 15:12:14 +05305930 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005931 }
5932
Sourav Mohapatracf632572018-04-02 11:01:35 +05305933 wmi_handle = get_wmi_unified_hdl_from_psoc(wma_handle->psoc);
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05305934 if (!wmi_handle) {
5935 WMA_LOGE("%s: wmi handle is NULL", __func__);
5936 return -EINVAL;
5937 }
5938
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08005939 WMA_LOGD("WMA <-- WMI_SERVICE_READY_EVENTID");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005940
Amar Singhal7b038ca2017-10-04 13:38:39 -07005941 if (ev->num_dbs_hw_modes > param_buf->num_wlan_dbs_hw_mode_list) {
5942 WMA_LOGE("FW dbs_hw_mode entry %d more than value %d in TLV hdr",
5943 ev->num_dbs_hw_modes,
5944 param_buf->num_wlan_dbs_hw_mode_list);
5945 return -EINVAL;
5946 }
5947
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005948 wma_handle->num_dbs_hw_modes = ev->num_dbs_hw_modes;
5949 ev_wlan_dbs_hw_mode_list = param_buf->wlan_dbs_hw_mode_list;
Arif Hussain157263f2018-10-03 13:07:15 -07005950
5951 /* Continuing with the rest of the processing,
5952 * even if memory allocation fails
5953 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005954 wma_handle->hw_mode.hw_mode_list =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305955 qdf_mem_malloc(sizeof(*wma_handle->hw_mode.hw_mode_list) *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005956 wma_handle->num_dbs_hw_modes);
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305957
5958 if (wma_handle->hw_mode.hw_mode_list)
5959 qdf_mem_copy(wma_handle->hw_mode.hw_mode_list,
5960 ev_wlan_dbs_hw_mode_list,
5961 (sizeof(*wma_handle->hw_mode.hw_mode_list) *
5962 wma_handle->num_dbs_hw_modes));
5963
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07005964 policy_mgr_init_dbs_hw_mode(wma_handle->psoc,
5965 ev->num_dbs_hw_modes, ev_wlan_dbs_hw_mode_list);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005966 wma_dump_dbs_hw_mode(wma_handle);
5967
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05305968 /* Initializes the fw_mode and scan_config to zero.
5969 * If ext service ready event is present it will set
5970 * the actual values of these two params.
5971 * This is to ensure that no garbage values would be
5972 * present in the absence of ext service ready event.
5973 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05305974 wma_init_scan_fw_mode_config(wma_handle->psoc, 0, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005975
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305976 qdf_mem_copy(&wma_handle->reg_cap, param_buf->hal_reg_capabilities,
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305977 sizeof(HAL_REG_CAPABILITIES));
5978
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005979 wma_handle->vht_supp_mcs = ev->vht_supp_mcs;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005980
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305981 wma_handle->new_hw_mode_index = tgt_cap_info->default_dbs_hw_mode_index;
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07005982 policy_mgr_update_new_hw_mode_index(wma_handle->psoc,
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305983 tgt_cap_info->default_dbs_hw_mode_index);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005984
5985 WMA_LOGD("%s: Firmware default hw mode index : %d",
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305986 __func__, tgt_cap_info->default_dbs_hw_mode_index);
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08005987 WMA_LOGI("%s: Firmware build version : %08x",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005988 __func__, ev->fw_build_vers);
Arunk Khandavallicfde2712018-01-25 11:27:42 +05305989 WMA_LOGD("FW fine time meas cap: 0x%x",
5990 tgt_cap_info->wmi_fw_sub_feat_caps);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005991
Ryan Hsuc6918552018-05-16 13:29:59 -07005992 wma_handle->hw_bd_id = ev->hw_bd_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005993
Ryan Hsuc6918552018-05-16 13:29:59 -07005994 wma_handle->hw_bd_info[BDF_VERSION] =
5995 WMI_GET_BDF_VERSION(ev->hw_bd_info);
5996 wma_handle->hw_bd_info[REF_DESIGN_ID] =
5997 WMI_GET_REF_DESIGN(ev->hw_bd_info);
5998 wma_handle->hw_bd_info[CUSTOMER_ID] =
5999 WMI_GET_CUSTOMER_ID(ev->hw_bd_info);
6000 wma_handle->hw_bd_info[PROJECT_ID] =
6001 WMI_GET_PROJECT_ID(ev->hw_bd_info);
6002 wma_handle->hw_bd_info[BOARD_DATA_REV] =
6003 WMI_GET_BOARD_DATA_REV(ev->hw_bd_info);
6004
6005 WMA_LOGI("%s: Board id: %x, Board version: %x %x %x %x %x",
6006 __func__, wma_handle->hw_bd_id,
6007 wma_handle->hw_bd_info[BDF_VERSION],
6008 wma_handle->hw_bd_info[REF_DESIGN_ID],
6009 wma_handle->hw_bd_info[CUSTOMER_ID],
6010 wma_handle->hw_bd_info[PROJECT_ID],
6011 wma_handle->hw_bd_info[BOARD_DATA_REV]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006012
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006013 /* wmi service is ready */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306014 qdf_mem_copy(wma_handle->wmi_service_bitmap,
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05306015 service_bitmap,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006016 sizeof(wma_handle->wmi_service_bitmap));
Nirav Shah22bf44d2015-12-10 15:39:48 +05306017
Leo Chang96464902016-10-28 11:10:54 -07006018 cdp_cfg_tx_set_is_mgmt_over_wmi_enabled(soc,
Dustin Brown7678b6c2018-03-07 13:00:52 -08006019 wmi_service_enabled(wmi_handle, wmi_service_mgmt_tx_wmi));
Leo Chang96464902016-10-28 11:10:54 -07006020 cdp_set_desc_global_pool_size(soc, ev->num_msdu_desc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006021 /* SWBA event handler for beacon transmission */
Harprit Chhabada98225f62018-12-11 15:29:55 -08006022 status = wma_register_swba_events(wma_handle->wmi_handle);
6023
Dustin Brown7678b6c2018-03-07 13:00:52 -08006024 if (QDF_IS_STATUS_ERROR(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006025 WMA_LOGE("Failed to register swba beacon event cb");
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306026 goto free_hw_mode_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006027 }
6028#ifdef WLAN_FEATURE_LPSS
6029 wma_handle->lpss_support =
Dustin Brown7678b6c2018-03-07 13:00:52 -08006030 wmi_service_enabled(wmi_handle, wmi_service_lpass);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006031#endif /* WLAN_FEATURE_LPSS */
6032
6033 /*
6034 * This Service bit is added to check for ARP/NS Offload
6035 * support for LL/HL targets
6036 */
6037 wma_handle->ap_arpns_support =
Dustin Brown7678b6c2018-03-07 13:00:52 -08006038 wmi_service_enabled(wmi_handle, wmi_service_ap_arpns_offload);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006039
Dustin Brown7678b6c2018-03-07 13:00:52 -08006040 if (wmi_service_enabled(wmi_handle, wmi_service_csa_offload)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006041 WMA_LOGD("%s: FW support CSA offload capability", __func__);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07006042 status = wmi_unified_register_event_handler(
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05306043 wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05306044 wmi_csa_handling_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05306045 wma_csa_offload_handler,
6046 WMA_RX_SERIALIZER_CTX);
Dustin Brown7678b6c2018-03-07 13:00:52 -08006047 if (QDF_IS_STATUS_ERROR(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006048 WMA_LOGE("Failed to register CSA offload event cb");
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306049 goto free_hw_mode_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006050 }
6051 }
6052
Dustin Brown7678b6c2018-03-07 13:00:52 -08006053 if (wmi_service_enabled(wmi_handle, wmi_service_mgmt_tx_wmi)) {
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08006054 WMA_LOGD("Firmware supports management TX over WMI,use WMI interface instead of HTT for management Tx");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006055 /*
6056 * Register Tx completion event handler for MGMT Tx over WMI
6057 * case
6058 */
6059 status = wmi_unified_register_event_handler(
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05306060 wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05306061 wmi_mgmt_tx_completion_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05306062 wma_mgmt_tx_completion_handler,
6063 WMA_RX_SERIALIZER_CTX);
Dustin Brown7678b6c2018-03-07 13:00:52 -08006064 if (QDF_IS_STATUS_ERROR(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006065 WMA_LOGE("Failed to register MGMT over WMI completion handler");
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306066 goto free_hw_mode_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006067 }
6068
Nirav Shah20489972016-06-16 19:20:28 +05306069 status = wmi_unified_register_event_handler(
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05306070 wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05306071 wmi_mgmt_tx_bundle_completion_event_id,
Nirav Shah20489972016-06-16 19:20:28 +05306072 wma_mgmt_tx_bundle_completion_handler,
6073 WMA_RX_SERIALIZER_CTX);
Dustin Brown7678b6c2018-03-07 13:00:52 -08006074 if (QDF_IS_STATUS_ERROR(status)) {
Nirav Shah20489972016-06-16 19:20:28 +05306075 WMA_LOGE("Failed to register MGMT over WMI completion handler");
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306076 goto free_hw_mode_list;
Nirav Shah20489972016-06-16 19:20:28 +05306077 }
6078
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006079 } else {
6080 WMA_LOGE("FW doesnot support WMI_SERVICE_MGMT_TX_WMI, Use HTT interface for Management Tx");
6081 }
Dustin Brown7678b6c2018-03-07 13:00:52 -08006082
Mukul Sharma44746042018-05-24 17:30:52 +05306083 status = wma_register_gtk_offload_event(wma_handle);
6084 if (QDF_IS_STATUS_ERROR(status)) {
6085 WMA_LOGE("Failed to register GTK offload event cb");
6086 goto free_hw_mode_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006087 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006088
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05306089 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05306090 wmi_tbttoffset_update_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05306091 wma_tbttoffset_update_event_handler,
6092 WMA_RX_SERIALIZER_CTX);
Dustin Brown7678b6c2018-03-07 13:00:52 -08006093 if (QDF_IS_STATUS_ERROR(status)) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07006094 WMA_LOGE("Failed to register WMI_TBTTOFFSET_UPDATE_EVENTID callback");
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306095 goto free_hw_mode_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006096 }
6097
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05306098 if (wmi_service_enabled(wma_handle->wmi_handle,
6099 wmi_service_rcpi_support)) {
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +05306100 /* register for rcpi response event */
6101 status = wmi_unified_register_event_handler(
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05306102 wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05306103 wmi_update_rcpi_event_id,
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +05306104 wma_rcpi_event_handler,
6105 WMA_RX_SERIALIZER_CTX);
Dustin Brown7678b6c2018-03-07 13:00:52 -08006106 if (QDF_IS_STATUS_ERROR(status)) {
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +05306107 WMA_LOGE("Failed to register RCPI event handler");
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306108 goto free_hw_mode_list;
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +05306109 }
6110 wma_handle->rcpi_enabled = true;
6111 }
6112
Govind Singhefc5ccd2016-04-25 11:11:55 +05306113 /* mac_id is replaced with pdev_id in converged firmware to have
6114 * multi-radio support. In order to maintain backward compatibility
6115 * with old fw, host needs to check WMI_SERVICE_DEPRECATED_REPLACE
6116 * in service bitmap from FW and host needs to set use_pdev_id in
6117 * wmi_resource_config to true. If WMI_SERVICE_DEPRECATED_REPLACE
6118 * service is not set, then host shall not expect MAC ID from FW in
6119 * VDEV START RESPONSE event and host shall use PDEV ID.
6120 */
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05306121 if (wmi_service_enabled(wmi_handle, wmi_service_deprecated_replace))
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306122 wlan_res_cfg->use_pdev_id = true;
Govind Singhefc5ccd2016-04-25 11:11:55 +05306123 else
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306124 wlan_res_cfg->use_pdev_id = false;
Govind Singhefc5ccd2016-04-25 11:11:55 +05306125
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306126 wlan_res_cfg->max_num_dbs_scan_duty_cycle = CDS_DBS_SCAN_CLIENTS_MAX;
Nitesh Shahf9a09ff2017-05-22 15:46:25 +05306127
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006128 /* Initialize the log supported event handler */
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05306129 status = wmi_unified_register_event_handler(wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05306130 wmi_diag_event_id_log_supported_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05306131 wma_log_supported_evt_handler,
6132 WMA_RX_SERIALIZER_CTX);
Dustin Brown7678b6c2018-03-07 13:00:52 -08006133 if (QDF_IS_STATUS_ERROR(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006134 WMA_LOGE("Failed to register log supported event cb");
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306135 goto free_hw_mode_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006136 }
6137
Leo Chang96464902016-10-28 11:10:54 -07006138 cdp_mark_first_wakeup_packet(soc,
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05306139 wmi_service_enabled(wmi_handle,
Visweswara Tanuku025f5862019-01-08 17:35:33 +05306140 wmi_service_mark_first_wakeup_packet));
Arif Hussaind54b62c2018-03-01 13:31:37 -08006141 wma_handle->is_dfs_offloaded =
Arunk Khandavalliaaf6b142018-01-25 12:42:42 +05306142 wmi_service_enabled(wmi_handle,
Visweswara Tanuku025f5862019-01-08 17:35:33 +05306143 wmi_service_dfs_phyerr_offload);
Arif Hussaindb6e4e92018-06-01 16:39:15 -07006144
Deepak Dhamdhere13230d32016-05-26 00:46:53 -07006145 wma_handle->nan_datapath_enabled =
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05306146 wmi_service_enabled(wma_handle->wmi_handle,
Visweswara Tanuku025f5862019-01-08 17:35:33 +05306147 wmi_service_nan_data);
6148
6149 wma_handle->fw_therm_throt_support =
6150 wmi_service_enabled(wma_handle->wmi_handle,
6151 wmi_service_tt);
Dustin Brown06259e52018-02-28 16:00:02 -08006152
6153 wma_set_component_caps(wma_handle->psoc);
6154
Dustin Brownb9987af2018-03-01 17:15:11 -08006155 wma_update_fw_config(wma_handle->psoc, tgt_hdl);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006156
Dustin Brown7678b6c2018-03-07 13:00:52 -08006157 status = wmi_unified_save_fw_version_cmd(wmi_handle, param_buf);
6158 if (QDF_IS_STATUS_ERROR(status)) {
Govind Singhf25a0f12016-03-08 16:09:48 +05306159 WMA_LOGE("Failed to send WMI_INIT_CMDID command");
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306160 goto free_hw_mode_list;
Govind Singhf25a0f12016-03-08 16:09:48 +05306161 }
6162
Zhu Jianmin2d87a1c2018-05-31 11:22:23 +08006163 if (wmi_service_enabled(wmi_handle, wmi_service_ext_msg)) {
6164 status = qdf_mc_timer_start(
6165 &wma_handle->service_ready_ext_timer,
6166 WMA_SERVICE_READY_EXT_TIMEOUT);
6167 if (QDF_IS_STATUS_ERROR(status))
6168 WMA_LOGE("Failed to start the service ready ext timer");
6169 }
Dustin Brown7678b6c2018-03-07 13:00:52 -08006170 wma_handle->tx_bfee_8ss_enabled =
6171 wmi_service_enabled(wmi_handle, wmi_service_8ss_tx_bfee);
Nachiket Kukade8b4bfd82017-05-25 18:34:48 +05306172
gaurank kathpalia5fcefa92018-10-24 15:03:15 +05306173 wma_handle->dynamic_nss_chains_support = wmi_service_enabled(wmi_handle,
6174 wmi_service_per_vdev_chain_support);
Arunk Khandavallia6305a32018-01-25 11:19:18 +05306175 target_psoc_set_num_radios(tgt_hdl, 1);
6176
Govind Singhd76a5b02016-03-08 15:12:14 +05306177 return 0;
Arunk Khandavallicfde2712018-01-25 11:27:42 +05306178
6179free_hw_mode_list:
6180 if (wma_handle->hw_mode.hw_mode_list) {
6181 qdf_mem_free(wma_handle->hw_mode.hw_mode_list);
6182 wma_handle->hw_mode.hw_mode_list = NULL;
6183 WMA_LOGD("%s: DBS list is freed", __func__);
6184 }
6185
6186 return -EINVAL;
6187
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006188}
6189
6190/**
Krunal Soni0193b6f2016-08-15 15:53:43 -07006191 * wma_get_phyid_for_given_band() - to get phyid for band
6192 *
6193 * @wma_handle: Pointer to wma handle
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306194* @tgt_hdl: target psoc information
Krunal Soni0193b6f2016-08-15 15:53:43 -07006195 * @band: enum value of for 2G or 5G band
6196 * @phyid: Pointer to phyid which needs to be filled
6197 *
6198 * This API looks in to the map to find out which particular phy supports
6199 * provided band and return the idx (also called phyid) of that phy. Caller
6200 * use this phyid to fetch various caps of that phy
6201 *
6202 * Return: QDF_STATUS
6203 */
6204static QDF_STATUS wma_get_phyid_for_given_band(
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07006205 tp_wma_handle wma_handle,
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306206 struct target_psoc_info *tgt_hdl,
Krunal Soni0193b6f2016-08-15 15:53:43 -07006207 enum cds_band_type band, uint8_t *phyid)
6208{
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306209 uint8_t idx, i, num_radios;
6210 struct wlan_psoc_host_mac_phy_caps *mac_phy_cap;
Krunal Soni0193b6f2016-08-15 15:53:43 -07006211
6212 if (!wma_handle) {
6213 WMA_LOGE("Invalid wma handle");
6214 return QDF_STATUS_E_FAILURE;
6215 }
6216
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306217 idx = 0;
Krunal Soni0193b6f2016-08-15 15:53:43 -07006218 *phyid = idx;
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306219 num_radios = target_psoc_get_num_radios(tgt_hdl);
6220 mac_phy_cap = target_psoc_get_mac_phy_cap(tgt_hdl);
Krunal Soni0193b6f2016-08-15 15:53:43 -07006221
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306222 for (i = 0; i < num_radios; i++) {
Krunal Soni0193b6f2016-08-15 15:53:43 -07006223 if ((band == CDS_BAND_2GHZ) &&
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306224 (WLAN_2G_CAPABILITY == mac_phy_cap[idx + i].supported_bands)) {
Krunal Soni0193b6f2016-08-15 15:53:43 -07006225 *phyid = idx + i;
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006226 WMA_LOGD("Select 2G capable phyid[%d]", *phyid);
Krunal Soni0193b6f2016-08-15 15:53:43 -07006227 return QDF_STATUS_SUCCESS;
6228 } else if ((band == CDS_BAND_5GHZ) &&
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306229 (WLAN_5G_CAPABILITY == mac_phy_cap[idx + i].supported_bands)) {
Krunal Soni0193b6f2016-08-15 15:53:43 -07006230 *phyid = idx + i;
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006231 WMA_LOGD("Select 5G capable phyid[%d]", *phyid);
Krunal Soni0193b6f2016-08-15 15:53:43 -07006232 return QDF_STATUS_SUCCESS;
6233 }
6234 }
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006235 WMA_LOGD("Using default single hw mode phyid[%d]", *phyid);
Krunal Soni0193b6f2016-08-15 15:53:43 -07006236 return QDF_STATUS_SUCCESS;
6237}
6238
6239/**
6240 * wma_get_caps_for_phyidx_hwmode() - to fetch caps for given hw mode and band
6241 * @caps_per_phy: Pointer to capabilities structure which needs to be filled
6242 * @hw_mode: Provided hardware mode
6243 * @band: Provide band i.e. 2G or 5G
6244 *
6245 * This API finds cap which suitable for provided hw mode and band. If user
6246 * is provides some invalid hw mode then it will automatically falls back to
6247 * default hw mode
6248 *
6249 * Return: QDF_STATUS
6250 */
6251QDF_STATUS wma_get_caps_for_phyidx_hwmode(struct wma_caps_per_phy *caps_per_phy,
6252 enum hw_mode_dbs_capab hw_mode, enum cds_band_type band)
6253{
6254 t_wma_handle *wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Arunk Khandavalli2462f462018-01-25 14:41:02 +05306255 struct target_psoc_info *tgt_hdl;
6256 int ht_cap_info, vht_cap_info;
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306257 uint8_t phyid, our_hw_mode = hw_mode, num_hw_modes;
6258 struct wlan_psoc_host_mac_phy_caps *mac_phy_cap;
Krunal Soni0193b6f2016-08-15 15:53:43 -07006259
6260 if (!wma_handle) {
6261 WMA_LOGE("Invalid wma handle");
6262 return QDF_STATUS_E_FAILURE;
6263 }
6264
Arunk Khandavalli2462f462018-01-25 14:41:02 +05306265 tgt_hdl = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
6266 if (!tgt_hdl) {
6267 WMA_LOGE("%s: target psoc info is NULL", __func__);
6268 return -EINVAL;
6269 }
6270
6271 ht_cap_info = target_if_get_ht_cap_info(tgt_hdl);
6272 vht_cap_info = target_if_get_vht_cap_info(tgt_hdl);
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306273 num_hw_modes = target_psoc_get_num_hw_modes(tgt_hdl);
6274 mac_phy_cap = target_psoc_get_mac_phy_cap(tgt_hdl);
Arunk Khandavalli2462f462018-01-25 14:41:02 +05306275
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306276 if (!num_hw_modes) {
jiad080abce2017-08-08 15:17:39 +08006277 WMA_LOGD("Invalid number of hw modes, use legacy HT/VHT caps");
Arunk Khandavalli2462f462018-01-25 14:41:02 +05306278 caps_per_phy->ht_2g = ht_cap_info;
6279 caps_per_phy->ht_5g = ht_cap_info;
6280 caps_per_phy->vht_2g = vht_cap_info;
6281 caps_per_phy->vht_5g = vht_cap_info;
jiad080abce2017-08-08 15:17:39 +08006282 /* legacy platform doesn't support HE IE */
Kiran Kumar Lokere1f96b4a2018-08-22 14:47:11 -07006283 caps_per_phy->he_2g[0] = 0;
6284 caps_per_phy->he_2g[1] = 0;
6285 caps_per_phy->he_5g[0] = 0;
6286 caps_per_phy->he_5g[1] = 0;
jiad080abce2017-08-08 15:17:39 +08006287
6288 return QDF_STATUS_SUCCESS;
Krunal Soni0193b6f2016-08-15 15:53:43 -07006289 }
6290
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07006291 if (!policy_mgr_is_dbs_enable(wma_handle->psoc))
Krunal Soni0193b6f2016-08-15 15:53:43 -07006292 our_hw_mode = HW_MODE_DBS_NONE;
6293
6294 if (!caps_per_phy) {
6295 WMA_LOGE("Invalid caps pointer");
6296 return QDF_STATUS_E_FAILURE;
6297 }
6298
Krunal Soni0193b6f2016-08-15 15:53:43 -07006299 if (QDF_STATUS_SUCCESS !=
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306300 wma_get_phyid_for_given_band(wma_handle, tgt_hdl, band, &phyid)) {
Krunal Soni0193b6f2016-08-15 15:53:43 -07006301 WMA_LOGE("Invalid phyid");
6302 return QDF_STATUS_E_FAILURE;
6303 }
Krunal Soni0193b6f2016-08-15 15:53:43 -07006304
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306305 caps_per_phy->ht_2g = mac_phy_cap[phyid].ht_cap_info_2G;
6306 caps_per_phy->ht_5g = mac_phy_cap[phyid].ht_cap_info_5G;
6307 caps_per_phy->vht_2g = mac_phy_cap[phyid].vht_cap_info_2G;
6308 caps_per_phy->vht_5g = mac_phy_cap[phyid].vht_cap_info_5G;
Kiran Kumar Lokere1f96b4a2018-08-22 14:47:11 -07006309 qdf_mem_copy(caps_per_phy->he_2g, mac_phy_cap[phyid].he_cap_info_2G,
6310 sizeof(caps_per_phy->he_2g));
6311 qdf_mem_copy(caps_per_phy->he_5g, mac_phy_cap[phyid].he_cap_info_5G,
6312 sizeof(caps_per_phy->he_5g));
Krunal Soni0193b6f2016-08-15 15:53:43 -07006313
Naveen Rawat98322472018-03-06 10:29:42 -08006314 caps_per_phy->tx_chain_mask_2G = mac_phy_cap->tx_chain_mask_2G;
6315 caps_per_phy->rx_chain_mask_2G = mac_phy_cap->rx_chain_mask_2G;
6316 caps_per_phy->tx_chain_mask_5G = mac_phy_cap->tx_chain_mask_5G;
6317 caps_per_phy->rx_chain_mask_5G = mac_phy_cap->rx_chain_mask_5G;
6318
Krunal Soni0193b6f2016-08-15 15:53:43 -07006319 return QDF_STATUS_SUCCESS;
6320}
6321
6322/**
6323 * wma_is_rx_ldpc_supported_for_channel() - to find out if ldpc is supported
6324 *
6325 * @channel: Channel number for which it needs to check if rx ldpc is enabled
6326 *
6327 * This API takes channel number as argument and takes default hw mode as DBS
6328 * to check if rx LDPC support is enabled for that channel or no
6329 */
6330bool wma_is_rx_ldpc_supported_for_channel(uint32_t channel)
6331{
jiad080abce2017-08-08 15:17:39 +08006332 t_wma_handle *wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306333 struct target_psoc_info *tgt_hdl;
Krunal Soni0193b6f2016-08-15 15:53:43 -07006334 struct wma_caps_per_phy caps_per_phy = {0};
6335 enum cds_band_type band;
6336 bool status;
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306337 uint8_t num_hw_modes;
Krunal Soni0193b6f2016-08-15 15:53:43 -07006338
Amar Singhal4c3fbb42018-01-02 13:20:28 -08006339 if (!wma_handle) {
6340 WMA_LOGE("Invalid wma handle");
6341 return false;
6342 }
6343
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306344 tgt_hdl = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
6345 if (!tgt_hdl) {
6346 WMA_LOGE("Target handle is NULL");
6347 return QDF_STATUS_E_FAILURE;
6348 }
6349
6350 num_hw_modes = target_psoc_get_num_hw_modes(tgt_hdl);
6351
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07006352 if (!WLAN_REG_IS_24GHZ_CH(channel))
Krunal Soni0193b6f2016-08-15 15:53:43 -07006353 band = CDS_BAND_5GHZ;
6354 else
6355 band = CDS_BAND_2GHZ;
6356
6357 if (QDF_STATUS_SUCCESS != wma_get_caps_for_phyidx_hwmode(
6358 &caps_per_phy,
6359 HW_MODE_DBS, band)) {
6360 return false;
6361 }
jiad080abce2017-08-08 15:17:39 +08006362
6363 /*
6364 * Legacy platforms like Rome set WMI_HT_CAP_LDPC to specify RX LDPC
6365 * capability. But new platforms like Helium set WMI_HT_CAP_RX_LDPC
6366 * instead.
6367 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306368 if (0 == num_hw_modes) {
jiad080abce2017-08-08 15:17:39 +08006369 status = (!!(caps_per_phy.ht_2g & WMI_HT_CAP_LDPC));
6370 } else {
6371 if (WLAN_REG_IS_24GHZ_CH(channel))
6372 status = (!!(caps_per_phy.ht_2g & WMI_HT_CAP_RX_LDPC));
6373 else
6374 status = (!!(caps_per_phy.ht_5g & WMI_HT_CAP_RX_LDPC));
6375 }
Krunal Soni0193b6f2016-08-15 15:53:43 -07006376
6377 return status;
6378}
6379
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07006380/**
6381 * wma_print_mac_phy_capabilities() - Prints MAC PHY capabilities
6382 * @cap: pointer to WMI_MAC_PHY_CAPABILITIES
6383 * @index: MAC_PHY index
6384 *
6385 * Return: none
6386 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306387static void wma_print_mac_phy_capabilities(struct wlan_psoc_host_mac_phy_caps
6388 *cap, int index)
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07006389{
Kiran Kumar Lokere1f96b4a2018-08-22 14:47:11 -07006390 uint32_t mac_2G[PSOC_HOST_MAX_MAC_SIZE];
6391 uint32_t mac_5G[PSOC_HOST_MAX_MAC_SIZE];
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07006392 uint32_t phy_2G[WMI_MAX_HECAP_PHY_SIZE];
6393 uint32_t phy_5G[WMI_MAX_HECAP_PHY_SIZE];
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306394 struct wlan_psoc_host_ppe_threshold ppet_2G, ppet_5G;
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07006395
Dustin Brown576eea42018-06-21 12:38:21 -07006396 WMA_LOGD("\t: index [%d]", index);
6397 WMA_LOGD("\t: cap for hw_mode_id[%d]", cap->hw_mode_id);
6398 WMA_LOGD("\t: pdev_id[%d]", cap->pdev_id);
6399 WMA_LOGD("\t: phy_id[%d]", cap->phy_id);
Rachit Kankane4b6fdd12019-01-10 20:51:16 +05306400 WMA_LOGD("\t: hw_mode_config_type[%d]", cap->hw_mode_config_type);
Dustin Brown576eea42018-06-21 12:38:21 -07006401 WMA_LOGD("\t: supports_11b[%d]", cap->supports_11b);
6402 WMA_LOGD("\t: supports_11g[%d]", cap->supports_11g);
6403 WMA_LOGD("\t: supports_11a[%d]", cap->supports_11a);
6404 WMA_LOGD("\t: supports_11n[%d]", cap->supports_11n);
6405 WMA_LOGD("\t: supports_11ac[%d]", cap->supports_11ac);
6406 WMA_LOGD("\t: supports_11ax[%d]", cap->supports_11ax);
6407 WMA_LOGD("\t: supported_bands[%d]", cap->supported_bands);
6408 WMA_LOGD("\t: ampdu_density[%d]", cap->ampdu_density);
6409 WMA_LOGD("\t: max_bw_supported_2G[%d]", cap->max_bw_supported_2G);
6410 WMA_LOGD("\t: ht_cap_info_2G[%d]", cap->ht_cap_info_2G);
6411 WMA_LOGD("\t: vht_cap_info_2G[%d]", cap->vht_cap_info_2G);
6412 WMA_LOGD("\t: vht_supp_mcs_2G[%d]", cap->vht_supp_mcs_2G);
6413 WMA_LOGD("\t: tx_chain_mask_2G[%d]", cap->tx_chain_mask_2G);
6414 WMA_LOGD("\t: rx_chain_mask_2G[%d]", cap->rx_chain_mask_2G);
6415 WMA_LOGD("\t: max_bw_supported_5G[%d]", cap->max_bw_supported_5G);
6416 WMA_LOGD("\t: ht_cap_info_5G[%d]", cap->ht_cap_info_5G);
6417 WMA_LOGD("\t: vht_cap_info_5G[%d]", cap->vht_cap_info_5G);
6418 WMA_LOGD("\t: vht_supp_mcs_5G[%d]", cap->vht_supp_mcs_5G);
6419 WMA_LOGD("\t: tx_chain_mask_5G[%d]", cap->tx_chain_mask_5G);
6420 WMA_LOGD("\t: rx_chain_mask_5G[%d]", cap->rx_chain_mask_5G);
Kiran Kumar Lokere1f96b4a2018-08-22 14:47:11 -07006421 WMA_LOGD("\t: he_cap_info_2G[0][%08x]", cap->he_cap_info_2G[0]);
6422 WMA_LOGD("\t: he_cap_info_2G[1][%08x]", cap->he_cap_info_2G[1]);
Dustin Brown576eea42018-06-21 12:38:21 -07006423 WMA_LOGD("\t: he_supp_mcs_2G[%08x]", cap->he_supp_mcs_2G);
Kiran Kumar Lokere1f96b4a2018-08-22 14:47:11 -07006424 WMA_LOGD("\t: he_cap_info_5G[0][%08x]", cap->he_cap_info_5G[0]);
6425 WMA_LOGD("\t: he_cap_info_5G[1][%08x]", cap->he_cap_info_5G[1]);
Dustin Brown576eea42018-06-21 12:38:21 -07006426 WMA_LOGD("\t: he_supp_mcs_5G[%08x]", cap->he_supp_mcs_5G);
Kiran Kumar Lokere1f96b4a2018-08-22 14:47:11 -07006427 qdf_mem_copy(mac_2G, cap->he_cap_info_2G, sizeof(mac_2G));
6428 qdf_mem_copy(mac_5G, cap->he_cap_info_5G, sizeof(mac_5G));
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07006429 qdf_mem_copy(phy_2G, cap->he_cap_phy_info_2G,
6430 WMI_MAX_HECAP_PHY_SIZE * 4);
6431 qdf_mem_copy(phy_5G, cap->he_cap_phy_info_5G,
6432 WMI_MAX_HECAP_PHY_SIZE * 4);
6433 ppet_2G = cap->he_ppet2G;
6434 ppet_5G = cap->he_ppet5G;
6435
Kiran Kumar Lokere1f96b4a2018-08-22 14:47:11 -07006436 wma_print_he_mac_cap_w1(mac_2G[0]);
6437 wma_print_he_mac_cap_w2(mac_2G[1]);
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07006438 wma_print_he_phy_cap(phy_2G);
6439 wma_print_he_ppet(&ppet_2G);
Kiran Kumar Lokere1f96b4a2018-08-22 14:47:11 -07006440 wma_print_he_mac_cap_w1(mac_5G[0]);
6441 wma_print_he_mac_cap_w1(mac_5G[1]);
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07006442 wma_print_he_phy_cap(phy_5G);
6443 wma_print_he_ppet(&ppet_5G);
6444}
Krunal Soni0193b6f2016-08-15 15:53:43 -07006445
6446/**
Krunal Soni2e48d012016-05-02 16:55:26 -07006447 * wma_print_populate_soc_caps() - Prints all the caps populated per hw mode
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306448 * @tgt_info: target related info
Krunal Soni2e48d012016-05-02 16:55:26 -07006449 *
6450 * This function prints all the caps populater per hw mode and per PHY
6451 *
6452 * Return: none
6453 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306454static void wma_print_populate_soc_caps(struct target_psoc_info *tgt_hdl)
Krunal Soni2e48d012016-05-02 16:55:26 -07006455{
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08006456 int i, num_hw_modes, total_mac_phy_cnt;
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306457 struct wlan_psoc_host_mac_phy_caps *mac_phy_cap, *tmp;
6458
6459 num_hw_modes = target_psoc_get_num_hw_modes(tgt_hdl);
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08006460 total_mac_phy_cnt = target_psoc_get_total_mac_phy_cnt(tgt_hdl);
Krunal Soni2e48d012016-05-02 16:55:26 -07006461
6462 /* print number of hw modes */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306463 WMA_LOGD("%s: num of hw modes [%d]", __func__, num_hw_modes);
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08006464 WMA_LOGD("%s: num mac_phy_cnt [%d]", __func__, total_mac_phy_cnt);
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306465 mac_phy_cap = target_psoc_get_mac_phy_cap(tgt_hdl);
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006466 WMA_LOGD("%s: <====== HW mode cap printing starts ======>", __func__);
Krunal Soni2e48d012016-05-02 16:55:26 -07006467 /* print cap of each hw mode */
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08006468 for (i = 0; i < total_mac_phy_cnt; i++) {
Lin Bai772fbaf2018-07-04 14:20:55 +08006469 WMA_LOGD("====>: hw mode id[%d], phy id[%d]",
6470 mac_phy_cap[i].hw_mode_id,
6471 mac_phy_cap[i].phy_id);
Kiran Kumar Lokere0923ad82018-02-28 19:01:16 -08006472 tmp = &mac_phy_cap[i];
6473 wma_print_mac_phy_capabilities(tmp, i);
Krunal Soni2e48d012016-05-02 16:55:26 -07006474 }
Dustin Brown576eea42018-06-21 12:38:21 -07006475 WMA_LOGD("%s: <====== HW mode cap printing ends ======>\n", __func__);
Krunal Soni2e48d012016-05-02 16:55:26 -07006476}
6477
6478/**
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306479 * wma_map_wmi_channel_width_to_hw_mode_bw() - returns bandwidth
6480 * in terms of hw_mode_bandwidth
6481 * @width: bandwidth in terms of wmi_channel_width
6482 *
6483 * This function returns the bandwidth in terms of hw_mode_bandwidth.
6484 *
6485 * Return: BW in terms of hw_mode_bandwidth.
6486 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07006487static enum hw_mode_bandwidth wma_map_wmi_channel_width_to_hw_mode_bw(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306488 wmi_channel_width width)
6489{
6490 switch (width) {
6491 case WMI_CHAN_WIDTH_20:
6492 return HW_MODE_20_MHZ;
6493 case WMI_CHAN_WIDTH_40:
6494 return HW_MODE_40_MHZ;
6495 case WMI_CHAN_WIDTH_80:
6496 return HW_MODE_80_MHZ;
6497 case WMI_CHAN_WIDTH_160:
6498 return HW_MODE_160_MHZ;
6499 case WMI_CHAN_WIDTH_80P80:
6500 return HW_MODE_80_PLUS_80_MHZ;
6501 case WMI_CHAN_WIDTH_5:
6502 return HW_MODE_5_MHZ;
6503 case WMI_CHAN_WIDTH_10:
6504 return HW_MODE_10_MHZ;
6505 default:
6506 return HW_MODE_BW_NONE;
6507 }
6508
6509 return HW_MODE_BW_NONE;
6510}
6511
6512/**
6513 * wma_get_hw_mode_params() - get TX-RX stream and bandwidth
6514 * supported from the capabilities.
6515 * @caps: PHY capability
6516 * @info: param to store TX-RX stream and BW information
6517 *
6518 * This function will calculate TX-RX stream and bandwidth supported
6519 * as per the PHY capability, and assign to mac_ss_bw_info.
6520 *
6521 * Return: none
6522 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306523static void wma_get_hw_mode_params(struct wlan_psoc_host_mac_phy_caps *caps,
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306524 struct mac_ss_bw_info *info)
6525{
6526 if (!caps) {
6527 WMA_LOGE("%s: Invalid capabilities", __func__);
6528 return;
6529 }
6530
6531 info->mac_tx_stream = wma_get_num_of_setbits_from_bitmask(
6532 QDF_MAX(caps->tx_chain_mask_2G,
6533 caps->tx_chain_mask_5G));
6534 info->mac_rx_stream = wma_get_num_of_setbits_from_bitmask(
6535 QDF_MAX(caps->rx_chain_mask_2G,
6536 caps->rx_chain_mask_5G));
6537 info->mac_bw = wma_map_wmi_channel_width_to_hw_mode_bw(
6538 QDF_MAX(caps->max_bw_supported_2G,
6539 caps->max_bw_supported_5G));
6540}
6541
6542/**
6543 * wma_set_hw_mode_params() - sets TX-RX stream, bandwidth and
6544 * DBS in hw_mode_list
6545 * @wma_handle: pointer to wma global structure
6546 * @mac0_ss_bw_info: TX-RX streams, BW for MAC0
6547 * @mac1_ss_bw_info: TX-RX streams, BW for MAC1
6548 * @pos: refers to hw_mode_index
6549 * @dbs_mode: dbs_mode for the dbs_hw_mode
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306550 * @sbs_mode: sbs_mode for the sbs_hw_mode
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306551 *
6552 * This function sets TX-RX stream, bandwidth and DBS mode in
6553 * hw_mode_list.
6554 *
6555 * Return: none
6556 */
6557static void wma_set_hw_mode_params(t_wma_handle *wma_handle,
6558 struct mac_ss_bw_info mac0_ss_bw_info,
6559 struct mac_ss_bw_info mac1_ss_bw_info,
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306560 uint32_t pos, uint32_t dbs_mode,
6561 uint32_t sbs_mode)
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306562{
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306563 WMA_HW_MODE_MAC0_TX_STREAMS_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306564 wma_handle->hw_mode.hw_mode_list[pos],
6565 mac0_ss_bw_info.mac_tx_stream);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306566 WMA_HW_MODE_MAC0_RX_STREAMS_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306567 wma_handle->hw_mode.hw_mode_list[pos],
6568 mac0_ss_bw_info.mac_rx_stream);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306569 WMA_HW_MODE_MAC0_BANDWIDTH_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306570 wma_handle->hw_mode.hw_mode_list[pos],
6571 mac0_ss_bw_info.mac_bw);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306572 WMA_HW_MODE_MAC1_TX_STREAMS_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306573 wma_handle->hw_mode.hw_mode_list[pos],
6574 mac1_ss_bw_info.mac_tx_stream);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306575 WMA_HW_MODE_MAC1_RX_STREAMS_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306576 wma_handle->hw_mode.hw_mode_list[pos],
6577 mac1_ss_bw_info.mac_rx_stream);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306578 WMA_HW_MODE_MAC1_BANDWIDTH_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306579 wma_handle->hw_mode.hw_mode_list[pos],
6580 mac1_ss_bw_info.mac_bw);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306581 WMA_HW_MODE_DBS_MODE_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306582 wma_handle->hw_mode.hw_mode_list[pos],
6583 dbs_mode);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306584 WMA_HW_MODE_AGILE_DFS_SET(
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306585 wma_handle->hw_mode.hw_mode_list[pos],
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306586 HW_MODE_AGILE_DFS_NONE);
6587 WMA_HW_MODE_SBS_MODE_SET(
6588 wma_handle->hw_mode.hw_mode_list[pos],
6589 sbs_mode);
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306590}
6591
6592/**
6593 * wma_update_hw_mode_list() - updates hw_mode_list
6594 * @wma_handle: pointer to wma global structure
Arunk Khandavalli80a61352018-01-25 12:19:37 +05306595 * @tgt_hdl - target psoc information
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306596 *
6597 * This function updates hw_mode_list with tx_streams, rx_streams,
6598 * bandwidth, dbs and agile dfs for each hw_mode.
6599 *
6600 * Returns: 0 for success else failure.
6601 */
Arunk Khandavalli80a61352018-01-25 12:19:37 +05306602static QDF_STATUS wma_update_hw_mode_list(t_wma_handle *wma_handle,
6603 struct target_psoc_info *tgt_hdl)
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306604{
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306605 struct wlan_psoc_host_mac_phy_caps *tmp, *mac_phy_cap;
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306606 uint32_t i, hw_config_type, j = 0;
6607 uint32_t dbs_mode, sbs_mode;
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306608 struct mac_ss_bw_info mac0_ss_bw_info = {0};
6609 struct mac_ss_bw_info mac1_ss_bw_info = {0};
Krunal Sonica50b452017-08-04 22:24:59 -07006610 WMI_PHY_CAPABILITY new_supported_band = 0;
6611 bool supported_band_update_failure = false;
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306612 struct wlan_psoc_target_capability_info *tgt_cap_info;
6613 int num_hw_modes;
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306614
6615 if (!wma_handle) {
6616 WMA_LOGE("%s: Invalid wma handle", __func__);
6617 return QDF_STATUS_E_FAILURE;
6618 }
6619
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306620 num_hw_modes = target_psoc_get_num_hw_modes(tgt_hdl);
6621 mac_phy_cap = target_psoc_get_mac_phy_cap(tgt_hdl);
6622 tgt_cap_info = target_psoc_get_target_caps(tgt_hdl);
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306623 /*
6624 * This list was updated as part of service ready event. Re-populate
6625 * HW mode list from the device capabilities.
6626 */
6627 if (wma_handle->hw_mode.hw_mode_list) {
6628 qdf_mem_free(wma_handle->hw_mode.hw_mode_list);
6629 wma_handle->hw_mode.hw_mode_list = NULL;
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006630 WMA_LOGD("%s: DBS list is freed", __func__);
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306631 }
6632
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306633 wma_handle->hw_mode.hw_mode_list =
6634 qdf_mem_malloc(sizeof(*wma_handle->hw_mode.hw_mode_list) *
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306635 num_hw_modes);
Wu Gaoe4c142d2018-11-06 11:54:32 +08006636 if (!wma_handle->hw_mode.hw_mode_list) {
6637 wma_handle->num_dbs_hw_modes = 0;
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306638 return QDF_STATUS_E_FAILURE;
Wu Gaoe4c142d2018-11-06 11:54:32 +08006639 }
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306640
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08006641 WMA_LOGD("%s: Updated HW mode list: Num modes:%d",
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306642 __func__, num_hw_modes);
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306643
Wu Gaoe4c142d2018-11-06 11:54:32 +08006644 wma_handle->num_dbs_hw_modes = num_hw_modes;
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306645 for (i = 0; i < num_hw_modes; i++) {
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306646 /* Update for MAC0 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306647 tmp = &mac_phy_cap[j++];
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306648 wma_get_hw_mode_params(tmp, &mac0_ss_bw_info);
Rachit Kankane4b6fdd12019-01-10 20:51:16 +05306649 hw_config_type = tmp->hw_mode_config_type;
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306650 dbs_mode = HW_MODE_DBS_NONE;
6651 sbs_mode = HW_MODE_SBS_NONE;
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306652 mac1_ss_bw_info.mac_tx_stream = 0;
6653 mac1_ss_bw_info.mac_rx_stream = 0;
6654 mac1_ss_bw_info.mac_bw = 0;
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306655 if (wma_update_supported_bands(tmp->supported_bands,
6656 &new_supported_band)
6657 != QDF_STATUS_SUCCESS)
Krunal Sonica50b452017-08-04 22:24:59 -07006658 supported_band_update_failure = true;
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306659
6660 /* SBS and DBS have dual MAC. Upto 2 MACs are considered. */
6661 if ((hw_config_type == WMI_HW_MODE_DBS) ||
6662 (hw_config_type == WMI_HW_MODE_SBS_PASSIVE) ||
6663 (hw_config_type == WMI_HW_MODE_SBS)) {
6664 /* Update for MAC1 */
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306665 tmp = &mac_phy_cap[j++];
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306666 wma_get_hw_mode_params(tmp, &mac1_ss_bw_info);
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306667 if (hw_config_type == WMI_HW_MODE_DBS)
6668 dbs_mode = HW_MODE_DBS;
6669 if ((hw_config_type == WMI_HW_MODE_SBS_PASSIVE) ||
6670 (hw_config_type == WMI_HW_MODE_SBS))
6671 sbs_mode = HW_MODE_SBS;
Krunal Sonica50b452017-08-04 22:24:59 -07006672 if (QDF_STATUS_SUCCESS !=
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306673 wma_update_supported_bands(tmp->supported_bands,
Krunal Sonica50b452017-08-04 22:24:59 -07006674 &new_supported_band))
6675 supported_band_update_failure = true;
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306676 }
6677
6678 /* Updating HW mode list */
6679 wma_set_hw_mode_params(wma_handle, mac0_ss_bw_info,
Nitesh Shah5b7bae02016-09-28 18:58:33 +05306680 mac1_ss_bw_info, i, dbs_mode,
6681 sbs_mode);
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306682 }
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07006683
Krunal Sonica50b452017-08-04 22:24:59 -07006684 /* overwrite phy_capability which we got from service ready event */
6685 if (!supported_band_update_failure) {
6686 WMA_LOGD("%s: updating supported band from old[%d] to new[%d]",
Arunk Khandavalli80a61352018-01-25 12:19:37 +05306687 __func__, target_if_get_phy_capability(tgt_hdl),
Krunal Sonica50b452017-08-04 22:24:59 -07006688 new_supported_band);
Arunk Khandavalli80a61352018-01-25 12:19:37 +05306689 target_if_set_phy_capability(tgt_hdl, new_supported_band);
Krunal Sonica50b452017-08-04 22:24:59 -07006690 }
6691
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07006692 if (QDF_STATUS_SUCCESS !=
Krunal Sonica50b452017-08-04 22:24:59 -07006693 policy_mgr_update_hw_mode_list(wma_handle->psoc,
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306694 tgt_hdl))
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07006695 WMA_LOGE("%s: failed to update policy manager", __func__);
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306696 wma_dump_dbs_hw_mode(wma_handle);
6697 return QDF_STATUS_SUCCESS;
6698}
6699
Naveen Rawat4efe41b2017-04-29 16:23:14 -07006700static void wma_init_wifi_pos_dma_rings(t_wma_handle *wma_handle,
6701 uint8_t num_mac, void *buf)
6702{
6703 struct hif_softc *hif_ctx = cds_get_context(QDF_MODULE_ID_HIF);
Amar Singhal4c3fbb42018-01-02 13:20:28 -08006704 void *hal_soc;
6705
6706 if (!hif_ctx) {
6707 WMA_LOGE("invalid hif context");
6708 return;
6709 }
6710
6711 hal_soc = hif_get_hal_handle(hif_ctx);
Naveen Rawat4efe41b2017-04-29 16:23:14 -07006712
6713 wifi_pos_init_cir_cfr_rings(wma_handle->psoc, hal_soc, num_mac, buf);
6714}
6715
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306716/**
Krunal Soni2e48d012016-05-02 16:55:26 -07006717 * wma_populate_soc_caps() - populate entire SOC's capabilities
6718 * @wma_handle: pointer to wma global structure
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306719 * @tgt_hdl: target psoc information
Krunal Soni2e48d012016-05-02 16:55:26 -07006720 * @param_buf: pointer to param of service ready extension event from fw
6721 *
6722 * This API populates all capabilities of entire SOC. For example,
6723 * how many number of hw modes are supported by this SOC, what are the
6724 * capabilities of each phy per hw mode, what are HAL reg capabilities per
6725 * phy.
6726 *
6727 * Return: none
6728 */
6729static void wma_populate_soc_caps(t_wma_handle *wma_handle,
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306730 struct target_psoc_info *tgt_hdl,
Krunal Soni2e48d012016-05-02 16:55:26 -07006731 WMI_SERVICE_READY_EXT_EVENTID_param_tlvs *param_buf)
6732{
Krunal Soni2e48d012016-05-02 16:55:26 -07006733
6734 WMA_LOGD("%s: Enter", __func__);
6735
Naveen Rawat4efe41b2017-04-29 16:23:14 -07006736 wma_init_wifi_pos_dma_rings(wma_handle,
6737 param_buf->num_oem_dma_ring_caps,
6738 param_buf->oem_dma_ring_caps);
6739
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306740 wma_print_populate_soc_caps(tgt_hdl);
Krunal Soni2e48d012016-05-02 16:55:26 -07006741}
6742
6743/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006744 * wma_rx_service_ready_ext_event() - evt handler for sevice ready ext event.
6745 * @handle: wma handle
6746 * @event: params of the service ready extended event
Govind Singhd76a5b02016-03-08 15:12:14 +05306747 * @length: param length
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006748 *
6749 * Return: none
6750 */
Govind Singhd76a5b02016-03-08 15:12:14 +05306751int wma_rx_service_ready_ext_event(void *handle, uint8_t *event,
6752 uint32_t length)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006753{
6754 tp_wma_handle wma_handle = (tp_wma_handle) handle;
6755 WMI_SERVICE_READY_EXT_EVENTID_param_tlvs *param_buf;
6756 wmi_service_ready_ext_event_fixed_param *ev;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306757 QDF_STATUS ret;
Arunk Khandavallia6305a32018-01-25 11:19:18 +05306758 struct target_psoc_info *tgt_hdl;
Arunk Khandavalli2462f462018-01-25 14:41:02 +05306759 uint32_t conc_scan_config_bits, fw_config_bits;
jitiphilebf3a922018-11-05 14:25:00 +05306760 struct wmi_unified *wmi_handle;
6761 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
6762 target_resource_config *wlan_res_cfg;
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306763
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006764 WMA_LOGD("%s: Enter", __func__);
6765
6766 if (!wma_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006767 WMA_LOGE("%s: Invalid WMA handle", __func__);
Govind Singhd76a5b02016-03-08 15:12:14 +05306768 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006769 }
6770
jitiphilebf3a922018-11-05 14:25:00 +05306771 wmi_handle = get_wmi_unified_hdl_from_psoc(wma_handle->psoc);
6772
Arunk Khandavallia6305a32018-01-25 11:19:18 +05306773 tgt_hdl = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
6774 if (!tgt_hdl) {
6775 WMA_LOGE("%s: target psoc info is NULL", __func__);
6776 return -EINVAL;
6777 }
6778
jitiphilebf3a922018-11-05 14:25:00 +05306779 wlan_res_cfg = target_psoc_get_wlan_res_cfg(tgt_hdl);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006780 param_buf = (WMI_SERVICE_READY_EXT_EVENTID_param_tlvs *) event;
6781 if (!param_buf) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006782 WMA_LOGE("%s: Invalid event", __func__);
Govind Singhd76a5b02016-03-08 15:12:14 +05306783 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006784 }
6785
6786 ev = param_buf->fixed_param;
6787 if (!ev) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006788 WMA_LOGE("%s: Invalid buffer", __func__);
Govind Singhd76a5b02016-03-08 15:12:14 +05306789 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006790 }
6791
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08006792 WMA_LOGD("WMA <-- WMI_SERVICE_READY_EXT_EVENTID");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006793
Arunk Khandavalli2462f462018-01-25 14:41:02 +05306794 fw_config_bits = target_if_get_fw_config_bits(tgt_hdl);
6795 conc_scan_config_bits = target_if_get_conc_scan_config_bits(tgt_hdl);
6796
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08006797 WMA_LOGD("%s: Defaults: scan config:%x FW mode config:%x",
Arunk Khandavalli2462f462018-01-25 14:41:02 +05306798 __func__, conc_scan_config_bits, fw_config_bits);
Chandrasekaran, Manishekarc8416922015-10-14 11:19:00 +05306799
Anurag Chouhan210db072016-02-22 18:42:15 +05306800 ret = qdf_mc_timer_stop(&wma_handle->service_ready_ext_timer);
Anurag Chouhandf2b2682016-02-29 14:15:27 +05306801 if (!QDF_IS_STATUS_SUCCESS(ret)) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006802 WMA_LOGE("Failed to stop the service ready ext timer");
Govind Singhd76a5b02016-03-08 15:12:14 +05306803 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006804 }
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306805 wma_populate_soc_caps(wma_handle, tgt_hdl, param_buf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006806
Arunk Khandavalli80a61352018-01-25 12:19:37 +05306807 ret = wma_update_hw_mode_list(wma_handle, tgt_hdl);
Nitesh Shah877ad5d2016-09-22 19:27:58 +05306808 if (QDF_IS_STATUS_ERROR(ret)) {
6809 WMA_LOGE("Failed to update hw mode list");
6810 return -EINVAL;
6811 }
6812
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08006813 WMA_LOGD("WMA --> WMI_INIT_CMDID");
Mukul Sharmab10c8c72017-11-02 17:25:59 +05306814
Arunk Khandavalli10af7282018-02-05 16:55:48 +05306815 wma_init_scan_fw_mode_config(wma_handle->psoc, conc_scan_config_bits,
Arunk Khandavalli2462f462018-01-25 14:41:02 +05306816 fw_config_bits);
Arunk Khandavallia6305a32018-01-25 11:19:18 +05306817
6818 target_psoc_set_num_radios(tgt_hdl, 1);
jitiphilebf3a922018-11-05 14:25:00 +05306819
6820 if (wmi_service_enabled(wmi_handle,
6821 wmi_service_new_htt_msg_format)) {
6822 cdp_cfg_set_new_htt_msg_format(soc, 1);
6823 wlan_res_cfg->new_htt_msg_format = true;
6824 } else {
6825 cdp_cfg_set_new_htt_msg_format(soc, 0);
6826 wlan_res_cfg->new_htt_msg_format = false;
6827 }
6828
Alok Kumar02301292018-11-28 18:10:34 +05306829 if (cfg_get(wma_handle->psoc, CFG_DP_ENABLE_PEER_UMAP_CONF_SUPPORT) &&
6830 wmi_service_enabled(wmi_handle,
6831 wmi_service_peer_unmap_cnf_support)) {
6832 wlan_res_cfg->peer_unmap_conf_support = true;
6833 cdp_cfg_set_peer_unmap_conf_support(soc, true);
6834 } else {
6835 wlan_res_cfg->peer_unmap_conf_support = false;
6836 cdp_cfg_set_peer_unmap_conf_support(soc, false);
6837 }
6838
Govind Singhd76a5b02016-03-08 15:12:14 +05306839 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006840}
6841
6842/**
6843 * wma_rx_ready_event() - event handler to process
6844 * wmi rx ready event.
6845 * @handle: wma handle
6846 * @cmd_param_info: command params info
Govind Singhd76a5b02016-03-08 15:12:14 +05306847 * @length: param length
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006848 *
6849 * Return: none
6850 */
Govind Singhd76a5b02016-03-08 15:12:14 +05306851int wma_rx_ready_event(void *handle, uint8_t *cmd_param_info,
6852 uint32_t length)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006853{
6854 tp_wma_handle wma_handle = (tp_wma_handle) handle;
6855 WMI_READY_EVENTID_param_tlvs *param_buf = NULL;
6856 wmi_ready_event_fixed_param *ev = NULL;
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05306857 int ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006858
6859 WMA_LOGD("%s: Enter", __func__);
6860
6861 param_buf = (WMI_READY_EVENTID_param_tlvs *) cmd_param_info;
6862 if (!(wma_handle && param_buf)) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006863 WMA_LOGE("%s: Invalid arguments", __func__);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306864 QDF_ASSERT(0);
Govind Singhd76a5b02016-03-08 15:12:14 +05306865 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006866 }
6867
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08006868 WMA_LOGD("WMA <-- WMI_READY_EVENTID");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006869
6870 ev = param_buf->fixed_param;
6871 /* Indicate to the waiting thread that the ready
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07006872 * event was received
6873 */
Naveen Rawat64e477e2016-05-20 10:34:56 -07006874 wma_handle->sub_20_support =
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05306875 wmi_service_enabled(wma_handle->wmi_handle,
6876 wmi_service_half_rate_quarter_rate_support);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006877 wma_handle->wmi_ready = true;
6878 wma_handle->wlan_init_status = ev->status;
6879
Arif Hussainbaf28b82018-06-27 15:27:44 -07006880 if (wma_handle->is_dfs_offloaded)
6881 wmi_unified_dfs_phyerr_offload_en_cmd(
6882 wma_handle->wmi_handle, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006883 /* copy the mac addr */
6884 WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->mac_addr, wma_handle->myaddr);
6885 WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->mac_addr, wma_handle->hwaddr);
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05306886 ret = wma_update_hdd_cfg(wma_handle);
6887 if (ret)
6888 return ret;
6889
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006890 WMA_LOGD("Exit");
Govind Singhd76a5b02016-03-08 15:12:14 +05306891
6892 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006893}
6894
6895/**
6896 * wma_setneedshutdown() - setting wma needshutdown flag
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006897 *
6898 * Return: none
6899 */
Jeff Johnson1f8d0a02017-09-13 08:09:05 -07006900void wma_setneedshutdown(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006901{
6902 tp_wma_handle wma_handle;
6903
6904 WMA_LOGD("%s: Enter", __func__);
6905
Anurag Chouhan6d760662016-02-20 16:05:43 +05306906 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006907
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07006908 if (!wma_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006909 WMA_LOGE("%s: Invalid arguments", __func__);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306910 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006911 return;
6912 }
6913
6914 wma_handle->needShutdown = true;
6915 WMA_LOGD("%s: Exit", __func__);
6916}
6917
6918/**
6919 * wma_needshutdown() - Is wma needs shutdown?
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006920 *
6921 * Return: returns true/false
6922 */
Jeff Johnson1b5404e2017-09-13 08:04:46 -07006923bool wma_needshutdown(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006924{
6925 tp_wma_handle wma_handle;
6926
6927 WMA_LOGD("%s: Enter", __func__);
6928
Anurag Chouhan6d760662016-02-20 16:05:43 +05306929 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006930
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07006931 if (!wma_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07006932 WMA_LOGE("%s: Invalid arguments", __func__);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306933 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006934 return false;
6935 }
6936
6937 WMA_LOGD("%s: Exit", __func__);
6938 return wma_handle->needShutdown;
6939}
6940
6941/**
6942 * wma_wait_for_ready_event() - wait for wma ready event
6943 * @handle: wma handle
6944 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05306945 * Return: 0 for success or QDF error
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006946 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306947QDF_STATUS wma_wait_for_ready_event(WMA_HANDLE handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006948{
Dustin Brown19048bd2018-07-09 10:53:18 -07006949 tp_wma_handle wma_handle = (tp_wma_handle)handle;
6950 QDF_STATUS status;
Arunk Khandavallia6305a32018-01-25 11:19:18 +05306951 struct target_psoc_info *tgt_hdl;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006952
Arunk Khandavallia6305a32018-01-25 11:19:18 +05306953 tgt_hdl = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
6954 if (!tgt_hdl) {
Dustin Brown19048bd2018-07-09 10:53:18 -07006955 wma_err("target psoc info is NULL");
Arunk Khandavallia6305a32018-01-25 11:19:18 +05306956 return QDF_STATUS_E_INVAL;
6957 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006958
Dustin Brown19048bd2018-07-09 10:53:18 -07006959 status = qdf_wait_for_event_completion(&tgt_hdl->info.event,
6960 WMA_READY_EVENTID_TIMEOUT);
Arun Kumar Khandavallia4234582019-03-20 16:16:05 +05306961 if (!tgt_hdl->info.wmi_ready) {
6962 wma_err("Error in pdev creation");
6963 return QDF_STATUS_E_INVAL;
6964 }
6965
Dustin Brown19048bd2018-07-09 10:53:18 -07006966 if (status == QDF_STATUS_E_TIMEOUT)
6967 wma_err("Timeout waiting for FW ready event");
6968 else if (QDF_IS_STATUS_ERROR(status))
6969 wma_err("Failed to wait for FW ready event; status:%u", status);
6970 else
6971 wma_info("FW ready event received");
Arunk Khandavallia6305a32018-01-25 11:19:18 +05306972
Dustin Brown19048bd2018-07-09 10:53:18 -07006973 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006974}
6975
6976/**
6977 * wma_set_ppsconfig() - set pps config in fw
6978 * @vdev_id: vdev id
6979 * @pps_param: pps params
6980 * @val : param value
6981 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05306982 * Return: 0 for success or QDF error
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006983 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306984QDF_STATUS wma_set_ppsconfig(uint8_t vdev_id, uint16_t pps_param,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006985 int val)
6986{
Anurag Chouhan6d760662016-02-20 16:05:43 +05306987 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006988 int ret = -EIO;
6989 uint32_t pps_val;
6990
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07006991 if (!wma) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006992 WMA_LOGE("%s: Failed to get wma", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306993 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006994 }
6995
6996 switch (pps_param) {
6997 case WMA_VHT_PPS_PAID_MATCH:
6998 pps_val = ((val << 31) & 0xffff0000) |
6999 (PKT_PWR_SAVE_PAID_MATCH & 0xffff);
7000 goto pkt_pwr_save_config;
7001 case WMA_VHT_PPS_GID_MATCH:
7002 pps_val = ((val << 31) & 0xffff0000) |
7003 (PKT_PWR_SAVE_GID_MATCH & 0xffff);
7004 goto pkt_pwr_save_config;
7005 case WMA_VHT_PPS_DELIM_CRC_FAIL:
7006 pps_val = ((val << 31) & 0xffff0000) |
7007 (PKT_PWR_SAVE_DELIM_CRC_FAIL & 0xffff);
7008 goto pkt_pwr_save_config;
7009
7010 /* Enable the code below as and when the functionality
7011 * is supported/added in host.
7012 */
7013#ifdef NOT_YET
7014 case WMA_VHT_PPS_EARLY_TIM_CLEAR:
7015 pps_val = ((val << 31) & 0xffff0000) |
7016 (PKT_PWR_SAVE_EARLY_TIM_CLEAR & 0xffff);
7017 goto pkt_pwr_save_config;
7018 case WMA_VHT_PPS_EARLY_DTIM_CLEAR:
7019 pps_val = ((val << 31) & 0xffff0000) |
7020 (PKT_PWR_SAVE_EARLY_DTIM_CLEAR & 0xffff);
7021 goto pkt_pwr_save_config;
7022 case WMA_VHT_PPS_EOF_PAD_DELIM:
7023 pps_val = ((val << 31) & 0xffff0000) |
7024 (PKT_PWR_SAVE_EOF_PAD_DELIM & 0xffff);
7025 goto pkt_pwr_save_config;
7026 case WMA_VHT_PPS_MACADDR_MISMATCH:
7027 pps_val = ((val << 31) & 0xffff0000) |
7028 (PKT_PWR_SAVE_MACADDR_MISMATCH & 0xffff);
7029 goto pkt_pwr_save_config;
7030 case WMA_VHT_PPS_GID_NSTS_ZERO:
7031 pps_val = ((val << 31) & 0xffff0000) |
7032 (PKT_PWR_SAVE_GID_NSTS_ZERO & 0xffff);
7033 goto pkt_pwr_save_config;
7034 case WMA_VHT_PPS_RSSI_CHECK:
7035 pps_val = ((val << 31) & 0xffff0000) |
7036 (PKT_PWR_SAVE_RSSI_CHECK & 0xffff);
7037 goto pkt_pwr_save_config;
7038#endif /* NOT_YET */
7039pkt_pwr_save_config:
7040 WMA_LOGD("vdev_id:%d val:0x%x pps_val:0x%x", vdev_id,
7041 val, pps_val);
Govind Singhd76a5b02016-03-08 15:12:14 +05307042 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07007043 WMI_VDEV_PARAM_PACKET_POWERSAVE,
7044 pps_val);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007045 break;
7046 default:
7047 WMA_LOGE("%s:INVALID PPS CONFIG", __func__);
7048 }
7049
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307050 return (ret) ? QDF_STATUS_E_FAILURE : QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007051}
7052
7053/**
7054 * wma_process_set_mas() - Function to enable/disable MAS
7055 * @wma: Pointer to WMA handle
7056 * @mas_val: 1-Enable MAS, 0-Disable MAS
7057 *
7058 * This function enables/disables the MAS value
7059 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05307060 * Return: QDF_SUCCESS for success otherwise failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007061 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07007062static QDF_STATUS wma_process_set_mas(tp_wma_handle wma,
7063 uint32_t *mas_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007064{
7065 uint32_t val;
7066
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07007067 if (!wma || !mas_val) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007068 WMA_LOGE("%s: Invalid input to enable/disable MAS", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307069 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007070 }
7071
7072 val = (*mas_val);
7073
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307074 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007075 wma_set_enable_disable_mcc_adaptive_scheduler(val)) {
7076 WMA_LOGE("%s: Unable to enable/disable MAS", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307077 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007078 }
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07007079 WMA_LOGE("%s: Value is %d", __func__, val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307080 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007081}
7082
7083/**
7084 * wma_process_set_miracast() - Function to set miracast value in WMA
7085 * @wma: Pointer to WMA handle
7086 * @miracast_val: 0-Disabled,1-Source,2-Sink
7087 *
7088 * This function stores the miracast value in WMA
7089 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05307090 * Return: QDF_SUCCESS for success otherwise failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007091 *
7092 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07007093static QDF_STATUS wma_process_set_miracast(tp_wma_handle wma,
7094 uint32_t *miracast_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007095{
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07007096 if (!wma || !miracast_val) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007097 WMA_LOGE("%s: Invalid input to store miracast value", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307098 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007099 }
7100
7101 wma->miracast_value = *miracast_val;
7102 WMA_LOGE("%s: Miracast value is %d", __func__, wma->miracast_value);
7103
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307104 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007105}
7106
7107/**
7108 * wma_config_stats_factor() - Function to configure stats avg. factor
7109 * @wma: pointer to WMA handle
7110 * @avg_factor: stats. avg. factor passed down by userspace
7111 *
7112 * This function configures the avg. stats value in firmware
7113 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307114 * Return: QDF_STATUS_SUCCESS for success otherwise failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007115 *
7116 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307117static QDF_STATUS wma_config_stats_factor(tp_wma_handle wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007118 struct sir_stats_avg_factor *avg_factor)
7119{
Govind Singhd76a5b02016-03-08 15:12:14 +05307120 QDF_STATUS ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007121
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07007122 if (!wma || !avg_factor) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007123 WMA_LOGE("%s: Invalid input of stats avg factor", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307124 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007125 }
7126
Govind Singhd76a5b02016-03-08 15:12:14 +05307127 ret = wma_vdev_set_param(wma->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007128 avg_factor->vdev_id,
7129 WMI_VDEV_PARAM_STATS_AVG_FACTOR,
7130 avg_factor->stats_avg_factor);
Govind Singhd76a5b02016-03-08 15:12:14 +05307131 if (QDF_IS_STATUS_ERROR(ret)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007132 WMA_LOGE(" failed to set avg_factor for vdev_id %d",
7133 avg_factor->vdev_id);
7134 }
7135
7136 WMA_LOGD("%s: Set stats_avg_factor %d for vdev_id %d", __func__,
7137 avg_factor->stats_avg_factor, avg_factor->vdev_id);
7138
7139 return ret;
7140}
7141
7142/**
7143 * wma_config_guard_time() - Function to set guard time in firmware
7144 * @wma: pointer to WMA handle
7145 * @guard_time: guard time passed down by userspace
7146 *
7147 * This function configures the guard time in firmware
7148 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307149 * Return: QDF_STATUS_SUCCESS for success otherwise failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007150 *
7151 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307152static QDF_STATUS wma_config_guard_time(tp_wma_handle wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007153 struct sir_guard_time_request *guard_time)
7154{
Govind Singhd76a5b02016-03-08 15:12:14 +05307155 QDF_STATUS ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007156
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07007157 if (!wma || !guard_time) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007158 WMA_LOGE("%s: Invalid input of guard time", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307159 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007160 }
7161
Govind Singhd76a5b02016-03-08 15:12:14 +05307162 ret = wma_vdev_set_param(wma->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007163 guard_time->vdev_id,
7164 WMI_VDEV_PARAM_RX_LEAK_WINDOW,
7165 guard_time->guard_time);
Govind Singhd76a5b02016-03-08 15:12:14 +05307166 if (QDF_IS_STATUS_ERROR(ret)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007167 WMA_LOGE(" failed to set guard time for vdev_id %d",
7168 guard_time->vdev_id);
7169 }
7170
7171 WMA_LOGD("Set guard time %d for vdev_id %d",
7172 guard_time->guard_time, guard_time->vdev_id);
7173
7174 return ret;
7175}
7176
7177/**
7178 * wma_enable_specific_fw_logs() - Start/Stop logging of diag event/log id
7179 * @wma_handle: WMA handle
7180 * @start_log: Start logging related parameters
7181 *
7182 * Send the command to the FW based on which specific logging of diag
7183 * event/log id can be started/stopped
7184 *
7185 * Return: None
7186 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07007187static void wma_enable_specific_fw_logs(tp_wma_handle wma_handle,
7188 struct sir_wifi_start_log *start_log)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007189{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007190
7191 if (!start_log) {
7192 WMA_LOGE("%s: start_log pointer is NULL", __func__);
7193 return;
7194 }
7195 if (!wma_handle) {
7196 WMA_LOGE("%s: Invalid wma handle", __func__);
7197 return;
7198 }
7199
7200 if (!((start_log->ring_id == RING_ID_CONNECTIVITY) ||
7201 (start_log->ring_id == RING_ID_FIRMWARE_DEBUG))) {
7202 WMA_LOGD("%s: Not connectivity or fw debug ring: %d",
7203 __func__, start_log->ring_id);
7204 return;
7205 }
7206
Govind Singhf25a0f12016-03-08 16:09:48 +05307207 wmi_unified_enable_specific_fw_logs_cmd(wma_handle->wmi_handle,
7208 (struct wmi_wifi_start_log *)start_log);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007209}
7210
Poddar, Siddarth176c4362016-10-03 12:25:00 +05307211#define MEGABYTE (1024 * 1024)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007212/**
7213 * wma_set_wifi_start_packet_stats() - Start/stop packet stats
7214 * @wma_handle: WMA handle
7215 * @start_log: Struture containing the start wifi logger params
7216 *
7217 * This function is used to send the WMA commands to start/stop logging
7218 * of per packet statistics
7219 *
7220 * Return: None
7221 *
7222 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07007223#ifdef REMOVE_PKT_LOG
7224static void wma_set_wifi_start_packet_stats(void *wma_handle,
7225 struct sir_wifi_start_log *start_log)
7226{
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07007227}
Venkata Sharath Chandra Manchala1240fc72017-10-26 17:32:29 -07007228
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07007229#else
7230static void wma_set_wifi_start_packet_stats(void *wma_handle,
7231 struct sir_wifi_start_log *start_log)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007232{
Komal Seelam3d202862016-02-24 18:43:24 +05307233 struct hif_opaque_softc *scn;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007234 uint32_t log_state;
7235
7236 if (!start_log) {
7237 WMA_LOGE("%s: start_log pointer is NULL", __func__);
7238 return;
7239 }
7240 if (!wma_handle) {
7241 WMA_LOGE("%s: Invalid wma handle", __func__);
7242 return;
7243 }
7244
7245 /* No need to register for ring IDs other than packet stats */
7246 if (start_log->ring_id != RING_ID_PER_PACKET_STATS) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07007247 WMA_LOGD("%s: Ring id is not for per packet stats: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007248 __func__, start_log->ring_id);
7249 return;
7250 }
7251
Anurag Chouhan6d760662016-02-20 16:05:43 +05307252 scn = cds_get_context(QDF_MODULE_ID_HIF);
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07007253 if (!scn) {
Naveen Rawatb2109f62016-07-21 14:18:15 -07007254 WMA_LOGE("%s: Invalid HIF handle", __func__);
7255 return;
7256 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007257
Venkata Sharath Chandra Manchala1240fc72017-10-26 17:32:29 -07007258#ifdef HELIUMPLUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007259 log_state = ATH_PKTLOG_ANI | ATH_PKTLOG_RCUPDATE | ATH_PKTLOG_RCFIND |
Nirav Shahdcc4c872016-07-28 11:35:26 +05307260 ATH_PKTLOG_RX | ATH_PKTLOG_TX |
Venkata Sharath Chandra Manchala29965172018-01-18 14:17:29 -08007261 ATH_PKTLOG_TEXT | ATH_PKTLOG_SW_EVENT;
Venkata Sharath Chandra Manchalacd660982018-10-28 21:04:28 -07007262#elif defined(QCA_WIFI_QCA6390)
7263 log_state = ATH_PKTLOG_RCFIND | ATH_PKTLOG_RCUPDATE |
Venkata Sharath Chandra Manchala27e44902019-01-28 11:29:18 -08007264 ATH_PKTLOG_TX | ATH_PKTLOG_LITE_T2H |
7265 ATH_PKTLOG_SW_EVENT | ATH_PKTLOG_RX;
Venkata Sharath Chandra Manchalacd660982018-10-28 21:04:28 -07007266#elif defined(QCA_WIFI_QCA6290)
7267 log_state = ATH_PKTLOG_LITE_RX | ATH_PKTLOG_LITE_T2H;
Venkata Sharath Chandra Manchala1240fc72017-10-26 17:32:29 -07007268#else
Venkata Sharath Chandra Manchalacd660982018-10-28 21:04:28 -07007269 WMA_LOGD("%s: Packet log Not supported", __func__);
7270 log_state = 0;
Venkata Sharath Chandra Manchala1240fc72017-10-26 17:32:29 -07007271#endif
Poddar, Siddarth176c4362016-10-03 12:25:00 +05307272 if (start_log->size != 0) {
7273 pktlog_setsize(scn, start_log->size * MEGABYTE);
7274 return;
Poddar, Siddarthab99a272017-04-10 12:53:26 +05307275 } else if (start_log->is_pktlog_buff_clear == true) {
7276 pktlog_clearbuff(scn, start_log->is_pktlog_buff_clear);
7277 return;
Poddar, Siddarth176c4362016-10-03 12:25:00 +05307278 }
7279
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007280 if (start_log->verbose_level == WLAN_LOG_LEVEL_ACTIVE) {
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -08007281 pktlog_enable(scn, log_state, start_log->ini_triggered,
Poddar, Siddartheefe3482016-09-21 18:12:59 +05307282 start_log->user_triggered,
7283 start_log->is_iwpriv_command);
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08007284 WMA_LOGD("%s: Enabling per packet stats", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007285 } else {
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -08007286 pktlog_enable(scn, 0, start_log->ini_triggered,
Poddar, Siddartheefe3482016-09-21 18:12:59 +05307287 start_log->user_triggered,
7288 start_log->is_iwpriv_command);
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08007289 WMA_LOGD("%s: Disabling per packet stats", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007290 }
7291}
7292#endif
7293
7294/**
7295 * wma_send_flush_logs_to_fw() - Send log flush command to FW
7296 * @wma_handle: WMI handle
7297 *
7298 * This function is used to send the flush command to the FW,
7299 * that will flush the fw logs that are residue in the FW
7300 *
7301 * Return: None
7302 */
7303void wma_send_flush_logs_to_fw(tp_wma_handle wma_handle)
7304{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307305 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007306
Dustin Brownfd578602019-02-22 13:52:24 -08007307 status = wmi_unified_flush_logs_to_fw_cmd(wma_handle->wmi_handle);
7308 if (QDF_IS_STATUS_ERROR(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007309 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007310
Anurag Chouhan210db072016-02-22 18:42:15 +05307311 status = qdf_mc_timer_start(&wma_handle->log_completion_timer,
Dustin Brownfd578602019-02-22 13:52:24 -08007312 WMA_LOG_COMPLETION_TIMER);
7313 if (QDF_IS_STATUS_ERROR(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007314 WMA_LOGE("Failed to start the log completion timer");
7315}
7316
7317/**
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05307318 * wma_update_wep_default_key - To update default key id
7319 * @wma: pointer to wma handler
7320 * @update_def_key: pointer to wep_update_default_key_idx
7321 *
7322 * This function makes a copy of default key index to txrx node
7323 *
7324 * Return: Success
7325 */
7326static QDF_STATUS wma_update_wep_default_key(tp_wma_handle wma,
7327 struct wep_update_default_key_idx *update_def_key)
7328{
7329 struct wma_txrx_node *iface =
7330 &wma->interfaces[update_def_key->session_id];
7331 iface->wep_default_key_idx = update_def_key->default_idx;
7332
7333 return QDF_STATUS_SUCCESS;
7334}
7335
Agrawal, Ashish35b251d2016-09-08 19:21:03 +05307336/**
7337 * wma_update_tx_fail_cnt_th() - Set threshold for TX pkt fail
7338 * @wma_handle: WMA handle
7339 * @tx_fail_cnt_th: sme_tx_fail_cnt_threshold parameter
7340 *
7341 * This function is used to set Tx pkt fail count threshold,
7342 * FW will do disconnect with station once this threshold is reached.
7343 *
Dustin Brown6ca9b022019-02-21 16:47:11 -08007344 * Return: QDF_STATUS
Agrawal, Ashish35b251d2016-09-08 19:21:03 +05307345 */
7346static QDF_STATUS wma_update_tx_fail_cnt_th(tp_wma_handle wma,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07007347 struct sme_tx_fail_cnt_threshold *tx_fail_cnt_th)
Agrawal, Ashish35b251d2016-09-08 19:21:03 +05307348{
7349 u_int8_t vdev_id;
7350 u_int32_t tx_fail_disconn_th;
7351 int ret = -EIO;
7352
7353 if (!wma || !wma->wmi_handle) {
7354 WMA_LOGE(FL("WMA is closed, can not issue Tx pkt fail count threshold"));
7355 return QDF_STATUS_E_INVAL;
7356 }
7357 vdev_id = tx_fail_cnt_th->session_id;
7358 tx_fail_disconn_th = tx_fail_cnt_th->tx_fail_cnt_threshold;
7359 WMA_LOGD("Set TX pkt fail count threshold vdevId %d count %d",
7360 vdev_id, tx_fail_disconn_th);
7361
7362
7363 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
7364 WMI_VDEV_PARAM_DISCONNECT_TH,
7365 tx_fail_disconn_th);
7366
7367 if (ret) {
7368 WMA_LOGE(FL("Failed to send TX pkt fail count threshold command"));
7369 return QDF_STATUS_E_FAILURE;
7370 }
7371
7372 return QDF_STATUS_SUCCESS;
7373}
7374
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05307375/**
Agrawal Ashishda3e9502016-09-21 17:43:51 +05307376 * wma_update_short_retry_limit() - Set retry limit for short frames
7377 * @wma_handle: WMA handle
7378 * @short_retry_limit_th: retry limir count for Short frames.
7379 *
7380 * This function is used to configure the transmission retry limit at which
7381 * short frames needs to be retry.
7382 *
Dustin Brown6ca9b022019-02-21 16:47:11 -08007383 * Return: QDF_STATUS
Agrawal Ashishda3e9502016-09-21 17:43:51 +05307384 */
7385static QDF_STATUS wma_update_short_retry_limit(tp_wma_handle wma,
7386 struct sme_short_retry_limit *short_retry_limit_th)
7387{
7388 uint8_t vdev_id;
7389 uint32_t short_retry_limit;
7390 int ret;
7391
7392 if (!wma || !wma->wmi_handle) {
7393 WMA_LOGE("WMA is closed, can not issue short retry limit threshold");
7394 return QDF_STATUS_E_INVAL;
7395 }
7396 vdev_id = short_retry_limit_th->session_id;
7397 short_retry_limit = short_retry_limit_th->short_retry_limit;
7398 WMA_LOGD("Set short retry limit threshold vdevId %d count %d",
7399 vdev_id, short_retry_limit);
7400
7401 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
7402 WMI_VDEV_PARAM_NON_AGG_SW_RETRY_TH,
7403 short_retry_limit);
7404
7405 if (ret) {
7406 WMA_LOGE("Failed to send short limit threshold command");
7407 return QDF_STATUS_E_FAILURE;
7408 }
7409 return QDF_STATUS_SUCCESS;
7410}
7411
7412/**
7413 * wma_update_long_retry_limit() - Set retry limit for long frames
7414 * @wma_handle: WMA handle
7415 * @long_retry_limit_th: retry limir count for long frames
7416 *
7417 * This function is used to configure the transmission retry limit at which
7418 * long frames needs to be retry
7419 *
Dustin Brown6ca9b022019-02-21 16:47:11 -08007420 * Return: QDF_STATUS
Agrawal Ashishda3e9502016-09-21 17:43:51 +05307421 */
7422static QDF_STATUS wma_update_long_retry_limit(tp_wma_handle wma,
7423 struct sme_long_retry_limit *long_retry_limit_th)
7424{
7425 uint8_t vdev_id;
7426 uint32_t long_retry_limit;
7427 int ret;
7428
7429 if (!wma || !wma->wmi_handle) {
7430 WMA_LOGE("WMA is closed, can not issue long retry limit threshold");
7431 return QDF_STATUS_E_INVAL;
7432 }
7433 vdev_id = long_retry_limit_th->session_id;
7434 long_retry_limit = long_retry_limit_th->long_retry_limit;
7435 WMA_LOGD("Set TX pkt fail count threshold vdevId %d count %d",
7436 vdev_id, long_retry_limit);
7437
7438 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
7439 WMI_VDEV_PARAM_AGG_SW_RETRY_TH,
7440 long_retry_limit);
7441
7442 if (ret) {
7443 WMA_LOGE("Failed to send long limit threshold command");
7444 return QDF_STATUS_E_FAILURE;
7445 }
7446
7447 return QDF_STATUS_SUCCESS;
7448}
7449
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05307450/*
7451 * wma_update_sta_inactivity_timeout() - Set sta_inactivity_timeout to fw
7452 * @wma_handle: WMA handle
7453 * @sta_inactivity_timer: sme_sta_inactivity_timeout
7454 *
7455 * This function is used to set sta_inactivity_timeout.
7456 * If a station does not send anything in sta_inactivity_timeout seconds, an
7457 * empty data frame is sent to it in order to verify whether it is
7458 * still in range. If this frame is not ACKed, the station will be
7459 * disassociated and then deauthenticated.
7460 *
7461 * Return: None
7462 */
7463void wma_update_sta_inactivity_timeout(tp_wma_handle wma,
7464 struct sme_sta_inactivity_timeout *sta_inactivity_timer)
7465{
7466 uint8_t vdev_id;
7467 uint32_t max_unresponsive_time;
7468 uint32_t min_inactive_time, max_inactive_time;
7469
7470 if (!wma || !wma->wmi_handle) {
7471 WMA_LOGE("WMA is closed, can not issue sta_inactivity_timeout");
7472 return;
7473 }
7474 vdev_id = sta_inactivity_timer->session_id;
7475 max_unresponsive_time = sta_inactivity_timer->sta_inactivity_timeout;
7476 max_inactive_time = max_unresponsive_time * TWO_THIRD;
7477 min_inactive_time = max_unresponsive_time - max_inactive_time;
7478
7479 if (wma_vdev_set_param(wma->wmi_handle, vdev_id,
7480 WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS,
7481 min_inactive_time))
7482 WMA_LOGE("Failed to Set AP MIN IDLE INACTIVE TIME");
7483
7484 if (wma_vdev_set_param(wma->wmi_handle, vdev_id,
7485 WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS,
7486 max_inactive_time))
7487 WMA_LOGE("Failed to Set AP MAX IDLE INACTIVE TIME");
7488
7489 if (wma_vdev_set_param(wma->wmi_handle, vdev_id,
7490 WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS,
7491 max_unresponsive_time))
7492 WMA_LOGE("Failed to Set MAX UNRESPONSIVE TIME");
7493
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07007494 WMA_LOGD("%s:vdev_id:%d min_inactive_time: %u max_inactive_time: %u max_unresponsive_time: %u",
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05307495 __func__, vdev_id,
7496 min_inactive_time, max_inactive_time,
7497 max_unresponsive_time);
7498}
7499
Yingying Tang95409972016-10-20 15:16:15 +08007500#ifdef WLAN_FEATURE_WOW_PULSE
7501
7502
7503#define WMI_WOW_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM \
7504WMI_WOW_HOSTWAKEUP_GPIO_PIN_PATTERN_CONFIG_CMD_fixed_param
7505
7506
7507#define WMITLV_TAG_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM \
7508WMITLV_TAG_STRUC_wmi_wow_hostwakeup_gpio_pin_pattern_config_cmd_fixed_param
7509
7510/**
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07007511 * wma_send_wow_pulse_cmd() - send wmi cmd of wow pulse cmd
7512 * information to fw.
7513 * @wma_handle: wma handler
7514 * @udp_response: wow_pulse_mode pointer
7515 *
7516 * Return: Return QDF_STATUS
7517 */
Yingying Tang95409972016-10-20 15:16:15 +08007518static QDF_STATUS wma_send_wow_pulse_cmd(tp_wma_handle wma_handle,
7519 struct wow_pulse_mode *wow_pulse_cmd)
7520{
7521 QDF_STATUS status = QDF_STATUS_SUCCESS;
7522 wmi_buf_t buf;
7523 WMI_WOW_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM *cmd;
7524 u_int16_t len;
7525
7526 len = sizeof(*cmd);
7527 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07007528 if (!buf)
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07007529 return QDF_STATUS_E_NOMEM;
Yingying Tang95409972016-10-20 15:16:15 +08007530
7531 cmd = (WMI_WOW_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM *)wmi_buf_data(buf);
7532 qdf_mem_zero(cmd, len);
7533
7534 WMITLV_SET_HDR(&cmd->tlv_header,
7535 WMITLV_TAG_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM,
7536 WMITLV_GET_STRUCT_TLVLEN(
7537 WMI_WOW_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM));
7538
7539 cmd->enable = wow_pulse_cmd->wow_pulse_enable;
7540 cmd->pin = wow_pulse_cmd->wow_pulse_pin;
7541 cmd->interval_low = wow_pulse_cmd->wow_pulse_interval_low;
7542 cmd->interval_high = wow_pulse_cmd->wow_pulse_interval_high;
7543 cmd->repeat_cnt = WMI_WOW_PULSE_REPEAT_CNT;
7544
7545 if (wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
7546 WMI_WOW_HOSTWAKEUP_GPIO_PIN_PATTERN_CONFIG_CMDID)) {
Yingying Tang95409972016-10-20 15:16:15 +08007547 wmi_buf_free(buf);
7548 status = QDF_STATUS_E_FAILURE;
7549 }
7550
7551 WMA_LOGD("%s: Exit", __func__);
7552 return status;
7553}
7554
7555#undef WMI_WOW_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM
7556#undef WMITLV_TAG_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM
7557#undef WMI_WOW_PULSE_REPEAT_CNT
7558
7559#else
7560static inline QDF_STATUS wma_send_wow_pulse_cmd(tp_wma_handle wma_handle,
7561 struct wow_pulse_mode *wow_pulse_cmd)
7562{
7563 return QDF_STATUS_E_FAILURE;
7564}
7565#endif
7566
7567
Agrawal Ashishda3e9502016-09-21 17:43:51 +05307568/**
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05307569 * wma_process_power_debug_stats_req() - Process the Chip Power stats collect
7570 * request and pass the Power stats request to Fw
7571 * @wma_handle: WMA handle
7572 *
7573 * Return: QDF_STATUS
7574 */
7575#ifdef WLAN_POWER_DEBUGFS
7576static QDF_STATUS wma_process_power_debug_stats_req(tp_wma_handle wma_handle)
7577{
7578 wmi_pdev_get_chip_power_stats_cmd_fixed_param *cmd;
7579 int32_t len;
7580 wmi_buf_t buf;
7581 uint8_t *buf_ptr;
7582 int ret;
7583
7584 if (!wma_handle) {
7585 WMA_LOGE("%s: input pointer is NULL", __func__);
7586 return QDF_STATUS_E_FAILURE;
7587 }
7588
7589 len = sizeof(*cmd);
7590 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07007591 if (!buf)
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05307592 return QDF_STATUS_E_NOMEM;
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05307593
7594 buf_ptr = (u_int8_t *) wmi_buf_data(buf);
7595 cmd = (wmi_pdev_get_chip_power_stats_cmd_fixed_param *) buf_ptr;
7596
7597 WMITLV_SET_HDR(&cmd->tlv_header,
7598 WMITLV_TAG_STRUC_wmi_get_chip_power_stats_cmd_fixed_param,
7599 WMITLV_GET_STRUCT_TLVLEN(
7600 wmi_pdev_get_chip_power_stats_cmd_fixed_param));
7601 cmd->pdev_id = 0;
7602
7603 WMA_LOGD("POWER_DEBUG_STATS - Get Request Params; Pdev id - %d",
7604 cmd->pdev_id);
7605 ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
7606 WMI_PDEV_GET_CHIP_POWER_STATS_CMDID);
7607 if (ret) {
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05307608 wmi_buf_free(buf);
7609 return QDF_STATUS_E_FAILURE;
7610 }
7611 return QDF_STATUS_SUCCESS;
7612}
7613#else
7614static QDF_STATUS wma_process_power_debug_stats_req(tp_wma_handle wma_handle)
7615{
7616 return QDF_STATUS_SUCCESS;
7617}
7618#endif
Arunk Khandavallica56d4b2018-11-29 15:46:00 +05307619#ifdef WLAN_FEATURE_BEACON_RECEPTION_STATS
7620static QDF_STATUS wma_process_beacon_debug_stats_req(tp_wma_handle wma_handle,
7621 uint32_t *vdev_id)
7622{
7623 wmi_vdev_get_bcn_recv_stats_cmd_fixed_param *cmd;
7624 int32_t len;
7625 wmi_buf_t buf;
7626 uint8_t *buf_ptr;
7627 int ret;
7628
7629 WMA_LOGD("%s: Enter", __func__);
7630 if (!wma_handle) {
7631 WMA_LOGE("%s: input pointer is NULL", __func__);
7632 return QDF_STATUS_E_FAILURE;
7633 }
7634
7635 len = sizeof(*cmd);
7636 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
7637 if (!buf)
7638 return QDF_STATUS_E_NOMEM;
7639
7640 buf_ptr = (u_int8_t *)wmi_buf_data(buf);
7641 cmd = (wmi_vdev_get_bcn_recv_stats_cmd_fixed_param *)buf_ptr;
7642
7643 WMITLV_SET_HDR(&cmd->tlv_header,
7644 WMITLV_TAG_STRUC_wmi_get_bcn_recv_stats_fixed_param,
7645 WMITLV_GET_STRUCT_TLVLEN(
7646 wmi_vdev_get_bcn_recv_stats_cmd_fixed_param));
7647 cmd->vdev_id = *vdev_id;
7648
7649 WMA_LOGD("BEACON_DEBUG_STATS - Get Request Params; vdev id - %d",
7650 cmd->vdev_id);
7651 ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
7652 WMI_VDEV_GET_BCN_RECEPTION_STATS_CMDID);
7653 if (ret) {
7654 wmi_buf_free(buf);
7655 return QDF_STATUS_E_FAILURE;
7656 }
7657
7658 WMA_LOGD("%s: Exit", __func__);
7659 return QDF_STATUS_SUCCESS;
7660}
7661#else
7662static QDF_STATUS wma_process_beacon_debug_stats_req(tp_wma_handle wma_handle,
7663 uint32_t *vdev_id)
7664{
7665 return QDF_STATUS_SUCCESS;
7666}
7667#endif
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05307668
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05307669/**
7670 * wma_set_arp_req_stats() - process set arp stats request command to fw
7671 * @wma_handle: WMA handle
7672 * @req_buf: set srp stats request buffer
7673 *
7674 * Return: None
7675 */
7676static void wma_set_arp_req_stats(WMA_HANDLE handle,
7677 struct set_arp_stats_params *req_buf)
7678{
Dustin Brownfd578602019-02-22 13:52:24 -08007679 QDF_STATUS status;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05307680 struct set_arp_stats *arp_stats;
7681 tp_wma_handle wma_handle = (tp_wma_handle) handle;
7682
7683 if (!wma_handle || !wma_handle->wmi_handle) {
7684 WMA_LOGE("%s: WMA is closed, cannot send per roam config",
7685 __func__);
7686 return;
7687 }
Yeshwanth Sriram Guntukad5aae7f2017-11-27 14:33:51 +05307688 if (!wma_is_vdev_valid(req_buf->vdev_id)) {
Pragaspathi Thilagarajd5cb9e82019-02-04 14:13:52 +05307689 WMA_LOGE("vdev id:%d is not active", req_buf->vdev_id);
Yeshwanth Sriram Guntukad5aae7f2017-11-27 14:33:51 +05307690 return;
7691 }
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05307692
7693 arp_stats = (struct set_arp_stats *)req_buf;
7694 status = wmi_unified_set_arp_stats_req(wma_handle->wmi_handle,
7695 arp_stats);
Dustin Brownfd578602019-02-22 13:52:24 -08007696 if (QDF_IS_STATUS_ERROR(status))
7697 wma_err("failed to set arp stats to FW");
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05307698}
7699
7700/**
7701 * wma_get_arp_req_stats() - process get arp stats request command to fw
7702 * @wma_handle: WMA handle
7703 * @req_buf: get srp stats request buffer
7704 *
7705 * Return: None
7706 */
7707static void wma_get_arp_req_stats(WMA_HANDLE handle,
7708 struct get_arp_stats_params *req_buf)
7709{
Dustin Brownfd578602019-02-22 13:52:24 -08007710 QDF_STATUS status;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05307711 struct get_arp_stats *arp_stats;
7712 tp_wma_handle wma_handle = (tp_wma_handle) handle;
7713
7714 if (!wma_handle || !wma_handle->wmi_handle) {
7715 WMA_LOGE("%s: WMA is closed, cannot send per roam config",
7716 __func__);
7717 return;
7718 }
Yeshwanth Sriram Guntuka3e4d96f2017-12-19 14:09:04 +05307719 if (!wma_is_vdev_valid(req_buf->vdev_id)) {
Pragaspathi Thilagarajd5cb9e82019-02-04 14:13:52 +05307720 WMA_LOGE("vdev id:%d is not active", req_buf->vdev_id);
Yeshwanth Sriram Guntuka3e4d96f2017-12-19 14:09:04 +05307721 return;
7722 }
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05307723
7724 arp_stats = (struct get_arp_stats *)req_buf;
7725 status = wmi_unified_get_arp_stats_req(wma_handle->wmi_handle,
7726 arp_stats);
Dustin Brownfd578602019-02-22 13:52:24 -08007727 if (QDF_IS_STATUS_ERROR(status))
7728 wma_err("failed to send get arp stats to FW");
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05307729}
7730
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05307731/**
7732 * wma_set_del_pmkid_cache() - API to set/delete PMKID cache entry in fw
7733 * @handle: WMA handle
7734 * @pmk_cache: PMK cache entry
7735 *
7736 * Return: None
7737 */
7738static void wma_set_del_pmkid_cache(WMA_HANDLE handle,
7739 struct wmi_unified_pmk_cache *pmk_cache)
7740{
Dustin Brownfd578602019-02-22 13:52:24 -08007741 QDF_STATUS status;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05307742 tp_wma_handle wma_handle = (tp_wma_handle) handle;
7743
7744 if (!wma_handle || !wma_handle->wmi_handle) {
7745 WMA_LOGE("WMA is closed, cannot send set del pmkid");
7746 return;
7747 }
7748
7749 status = wmi_unified_set_del_pmkid_cache(wma_handle->wmi_handle,
7750 pmk_cache);
Dustin Brownfd578602019-02-22 13:52:24 -08007751 if (QDF_IS_STATUS_ERROR(status))
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05307752 WMA_LOGE("failed to send set/del pmkid cmd to fw");
7753}
7754
Vignesh Viswanathan694e28e2018-01-18 20:53:57 +05307755/**
Vignesh Viswanathan694e28e2018-01-18 20:53:57 +05307756 * wma_send_invoke_neighbor_report() - API to send invoke neighbor report
7757 * command to fw
7758 *
7759 * @handle: WMA handle
7760 * @params: Pointer to invoke neighbor report params
7761 *
7762 * Return: None
7763 */
7764static
7765void wma_send_invoke_neighbor_report(WMA_HANDLE handle,
7766 struct wmi_invoke_neighbor_report_params *params)
7767{
7768 QDF_STATUS status;
7769 tp_wma_handle wma_handle = (tp_wma_handle) handle;
7770
7771 if (!wma_handle || !wma_handle->wmi_handle) {
7772 WMA_LOGE("WMA is closed, cannot send invoke neighbor report");
7773 return;
7774 }
7775
7776 status = wmi_unified_invoke_neighbor_report_cmd(wma_handle->wmi_handle,
7777 params);
7778
7779 if (status != QDF_STATUS_SUCCESS)
7780 WMA_LOGE("failed to send invoke neighbor report command");
7781}
7782
lifeng66831662017-05-19 16:01:35 +08007783QDF_STATUS wma_set_rx_reorder_timeout_val(tp_wma_handle wma_handle,
7784 struct sir_set_rx_reorder_timeout_val *reorder_timeout)
7785{
7786 wmi_pdev_set_reorder_timeout_val_cmd_fixed_param *cmd;
7787 uint32_t len;
7788 wmi_buf_t buf;
7789 int ret;
7790
7791 if (!reorder_timeout) {
7792 WMA_LOGE(FL("invalid pointer"));
7793 return QDF_STATUS_E_INVAL;
7794 }
7795
7796 if (!wma_handle) {
7797 WMA_LOGE(FL("WMA context is invald!"));
7798 return QDF_STATUS_E_INVAL;
7799 }
7800 len = sizeof(*cmd);
7801 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07007802 if (!buf)
lifeng66831662017-05-19 16:01:35 +08007803 return QDF_STATUS_E_NOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07007804
lifeng66831662017-05-19 16:01:35 +08007805 cmd = (wmi_pdev_set_reorder_timeout_val_cmd_fixed_param *)
7806 wmi_buf_data(buf);
7807
7808 WMITLV_SET_HDR(&cmd->tlv_header,
7809 WMITLV_TAG_STRUC_wmi_pdev_set_reorder_timeout_val_cmd_fixed_param,
7810 WMITLV_GET_STRUCT_TLVLEN(wmi_pdev_set_reorder_timeout_val_cmd_fixed_param));
7811
7812 memcpy(cmd->rx_timeout_pri, reorder_timeout->rx_timeout_pri,
7813 sizeof(reorder_timeout->rx_timeout_pri));
7814
7815 WMA_LOGD("rx aggr record timeout: VO: %d, VI: %d, BE: %d, BK: %d",
7816 cmd->rx_timeout_pri[0], cmd->rx_timeout_pri[1],
7817 cmd->rx_timeout_pri[2], cmd->rx_timeout_pri[3]);
7818
7819 ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
7820 WMI_PDEV_SET_REORDER_TIMEOUT_VAL_CMDID);
7821 if (ret) {
lifeng66831662017-05-19 16:01:35 +08007822 wmi_buf_free(buf);
7823 return QDF_STATUS_E_FAILURE;
7824 }
7825
7826 return QDF_STATUS_SUCCESS;
7827}
7828
7829QDF_STATUS wma_set_rx_blocksize(tp_wma_handle wma_handle,
7830 struct sir_peer_set_rx_blocksize *peer_rx_blocksize)
7831{
7832 wmi_peer_set_rx_blocksize_cmd_fixed_param *cmd;
7833 int32_t len;
7834 wmi_buf_t buf;
7835 u_int8_t *buf_ptr;
7836 int ret;
7837
7838 if (!peer_rx_blocksize) {
7839 WMA_LOGE(FL("invalid pointer"));
7840 return QDF_STATUS_E_INVAL;
7841 }
7842
7843 if (!wma_handle) {
7844 WMA_LOGE(FL(" WMA context is invald!"));
7845 return QDF_STATUS_E_INVAL;
7846 }
7847
7848 len = sizeof(*cmd);
7849 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07007850 if (!buf)
lifeng66831662017-05-19 16:01:35 +08007851 return QDF_STATUS_E_NOMEM;
lifeng66831662017-05-19 16:01:35 +08007852
7853 buf_ptr = (u_int8_t *) wmi_buf_data(buf);
7854 cmd = (wmi_peer_set_rx_blocksize_cmd_fixed_param *) buf_ptr;
7855
7856 WMITLV_SET_HDR(&cmd->tlv_header,
7857 WMITLV_TAG_STRUC_wmi_peer_set_rx_blocksize_cmd_fixed_param,
7858 WMITLV_GET_STRUCT_TLVLEN(wmi_peer_set_rx_blocksize_cmd_fixed_param));
7859
7860 cmd->vdev_id = peer_rx_blocksize->vdev_id;
7861 cmd->rx_block_ack_win_limit =
7862 peer_rx_blocksize->rx_block_ack_win_limit;
7863 WMI_CHAR_ARRAY_TO_MAC_ADDR(peer_rx_blocksize->peer_macaddr.bytes,
7864 &cmd->peer_macaddr);
7865
7866 WMA_LOGD("rx aggr blocksize: %d", cmd->rx_block_ack_win_limit);
7867
7868 ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
7869 WMI_PEER_SET_RX_BLOCKSIZE_CMDID);
7870 if (ret) {
lifeng66831662017-05-19 16:01:35 +08007871 wmi_buf_free(buf);
7872 return QDF_STATUS_E_FAILURE;
7873 }
7874
7875 return QDF_STATUS_SUCCESS;
7876}
7877
lifengd217d192017-05-09 19:44:16 +08007878QDF_STATUS wma_get_chain_rssi(tp_wma_handle wma_handle,
7879 struct get_chain_rssi_req_params *req_params)
7880{
lifengfe6c3e22018-04-03 12:10:04 +08007881 wmi_pdev_div_get_rssi_antid_fixed_param *cmd;
lifengd217d192017-05-09 19:44:16 +08007882 wmi_buf_t wmi_buf;
lifengfe6c3e22018-04-03 12:10:04 +08007883 uint32_t len = sizeof(wmi_pdev_div_get_rssi_antid_fixed_param);
lifengd217d192017-05-09 19:44:16 +08007884 u_int8_t *buf_ptr;
7885
7886 if (!wma_handle) {
7887 WMA_LOGE(FL("WMA is closed, can not issue cmd"));
7888 return QDF_STATUS_E_INVAL;
7889 }
7890
7891 wmi_buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07007892 if (!wmi_buf)
lifengd217d192017-05-09 19:44:16 +08007893 return QDF_STATUS_E_NOMEM;
lifengd217d192017-05-09 19:44:16 +08007894
7895 buf_ptr = (u_int8_t *)wmi_buf_data(wmi_buf);
7896
lifengfe6c3e22018-04-03 12:10:04 +08007897 cmd = (wmi_pdev_div_get_rssi_antid_fixed_param *)buf_ptr;
lifengd217d192017-05-09 19:44:16 +08007898 WMITLV_SET_HDR(&cmd->tlv_header,
lifengfe6c3e22018-04-03 12:10:04 +08007899 WMITLV_TAG_STRUC_wmi_pdev_div_get_rssi_antid_fixed_param,
lifengd217d192017-05-09 19:44:16 +08007900 WMITLV_GET_STRUCT_TLVLEN(
lifengfe6c3e22018-04-03 12:10:04 +08007901 wmi_pdev_div_get_rssi_antid_fixed_param));
7902 cmd->pdev_id = 0;
lifengd217d192017-05-09 19:44:16 +08007903 WMI_CHAR_ARRAY_TO_MAC_ADDR(req_params->peer_macaddr.bytes,
lifengfe6c3e22018-04-03 12:10:04 +08007904 &cmd->macaddr);
lifengd217d192017-05-09 19:44:16 +08007905
7906 if (wmi_unified_cmd_send(wma_handle->wmi_handle, wmi_buf, len,
lifengfe6c3e22018-04-03 12:10:04 +08007907 WMI_PDEV_DIV_GET_RSSI_ANTID_CMDID)) {
lifengd217d192017-05-09 19:44:16 +08007908 wmi_buf_free(wmi_buf);
7909 return QDF_STATUS_E_FAILURE;
7910 }
7911
7912 return QDF_STATUS_SUCCESS;
7913}
7914
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05307915#if defined(WLAN_FEATURE_FILS_SK)
7916/**
7917 * wma_roam_scan_send_hlp() - API to send HLP IE info to fw
7918 * @wma_handle: WMA handle
7919 * @req: HLP params
7920 *
7921 * Return: QDF_STATUS
7922 */
7923static QDF_STATUS wma_roam_scan_send_hlp(tp_wma_handle wma_handle,
7924 struct hlp_params *req)
7925{
7926 struct hlp_params *params;
7927 QDF_STATUS status;
7928
7929 params = qdf_mem_malloc(sizeof(*params));
Arif Hussain157263f2018-10-03 13:07:15 -07007930 if (!params)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05307931 return QDF_STATUS_E_NOMEM;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05307932
7933 params->vdev_id = req->vdev_id;
7934 params->hlp_ie_len = req->hlp_ie_len;
7935 qdf_mem_copy(params->hlp_ie, req->hlp_ie, req->hlp_ie_len);
7936 status = wmi_unified_roam_send_hlp_cmd(wma_handle->wmi_handle, params);
7937
7938 WMA_LOGD("Send HLP status %d vdev id %d", status, params->vdev_id);
7939 qdf_trace_hex_dump(QDF_MODULE_ID_WMI, QDF_TRACE_LEVEL_DEBUG,
7940 params->hlp_ie, 10);
7941
7942 qdf_mem_free(params);
7943 return status;
7944}
7945#else
7946static QDF_STATUS wma_roam_scan_send_hlp(tp_wma_handle wma_handle,
7947 struct hlp_params *req)
7948{
7949 return QDF_STATUS_SUCCESS;
7950}
7951#endif
7952
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05307953/**
Ganesh Kondabattini35739572017-06-21 16:26:39 +05307954 * wma_process_set_limit_off_chan() - set limit off chanel parameters
7955 * @wma_handle: pointer to wma handle
7956 * @param: pointer to sir_limit_off_chan
7957 *
7958 * Return: QDF_STATUS_SUCCESS for success or error code.
7959 */
7960static QDF_STATUS wma_process_limit_off_chan(tp_wma_handle wma_handle,
7961 struct sir_limit_off_chan *param)
7962{
7963 int32_t err;
7964 struct wmi_limit_off_chan_param limit_off_chan_param;
7965
Rajeev Kumar752d64e2017-10-05 16:32:58 -07007966 if (param->vdev_id >= wma_handle->max_bssid) {
7967 WMA_LOGE(FL("Invalid vdev_id: %d"), param->vdev_id);
7968 return QDF_STATUS_E_INVAL;
7969 }
7970 if (!wma_is_vdev_up(param->vdev_id)) {
Yeshwanth Sriram Guntukacbe61442018-08-23 18:08:44 +05307971 WMA_LOGD("vdev %d is not up skipping limit_off_chan_param",
7972 param->vdev_id);
Rajeev Kumar752d64e2017-10-05 16:32:58 -07007973 return QDF_STATUS_E_INVAL;
7974 }
7975
Ganesh Kondabattini35739572017-06-21 16:26:39 +05307976 limit_off_chan_param.vdev_id = param->vdev_id;
7977 limit_off_chan_param.status = param->is_tos_active;
7978 limit_off_chan_param.max_offchan_time = param->max_off_chan_time;
7979 limit_off_chan_param.rest_time = param->rest_time;
7980 limit_off_chan_param.skip_dfs_chans = param->skip_dfs_chans;
7981
7982 err = wmi_unified_send_limit_off_chan_cmd(wma_handle->wmi_handle,
7983 &limit_off_chan_param);
7984 if (err) {
7985 WMA_LOGE("\n failed to set limit off chan cmd");
7986 return QDF_STATUS_E_FAILURE;
7987 }
7988
7989 return QDF_STATUS_SUCCESS;
7990}
7991
Arif Hussain05fb4872018-01-03 16:02:55 -08007992static QDF_STATUS wma_process_obss_color_collision_req(tp_wma_handle wma_handle,
7993 struct wmi_obss_color_collision_cfg_param *cfg)
7994{
7995 QDF_STATUS status;
7996
7997 if (cfg->vdev_id >= wma_handle->max_bssid) {
7998 WMA_LOGE(FL("Invalid vdev_id: %d"), cfg->vdev_id);
7999 return QDF_STATUS_E_INVAL;
8000 }
8001 if (!wma_is_vdev_up(cfg->vdev_id)) {
8002 WMA_LOGE("vdev %d is not up skipping obss color collision req",
8003 cfg->vdev_id);
8004 return QDF_STATUS_E_INVAL;
8005 }
8006
8007 status = wmi_unified_send_obss_color_collision_cfg_cmd(wma_handle->
8008 wmi_handle, cfg);
8009 if (QDF_IS_STATUS_ERROR(status))
8010 WMA_LOGE("Failed to send obss color collision cfg");
8011
8012 return status;
8013}
8014
Ganesh Kondabattini35739572017-06-21 16:26:39 +05308015/**
Arif Hussainee10f902017-12-27 16:30:17 -08008016 * wma_send_obss_detection_cfg() - send obss detection cfg to firmware
8017 * @wma_handle: pointer to wma handle
8018 * @cfg: obss detection configuration
8019 *
8020 * Send obss detection configuration to firmware.
8021 *
8022 * Return: None
8023 */
8024static void wma_send_obss_detection_cfg(tp_wma_handle wma_handle,
8025 struct wmi_obss_detection_cfg_param
8026 *cfg)
8027{
8028 QDF_STATUS status;
8029
8030 if (cfg->vdev_id >= wma_handle->max_bssid) {
8031 WMA_LOGE(FL("Invalid vdev_id: %d"), cfg->vdev_id);
8032 return;
8033 }
8034 if (!wma_is_vdev_up(cfg->vdev_id)) {
8035 WMA_LOGE("vdev %d is not up skipping obss detection req",
8036 cfg->vdev_id);
8037 return;
8038 }
8039
8040 status = wmi_unified_send_obss_detection_cfg_cmd(wma_handle->wmi_handle,
8041 cfg);
8042 if (QDF_IS_STATUS_ERROR(status))
8043 WMA_LOGE("Failed to send obss detection cfg");
8044
8045 return;
8046}
8047
Visweswara Tanuku633976b2019-01-07 16:13:12 +05308048#ifdef WLAN_FEATURE_MOTION_DETECTION
8049/**
8050 * wma_motion_det_host_event_handler - motion detection event handler
8051 * @handle: WMA global handle
8052 * @event: motion detection event
8053 * @len: Length of cmd
8054 *
8055 * Call motion detection event callback handler
8056 *
8057 * Return: 0 on success, else error on failure
8058 */
8059int wma_motion_det_host_event_handler(void *handle, uint8_t *event,
8060 uint32_t len)
8061{
8062 wmi_motion_det_event *motion_det_event_hdr;
8063 WMI_MOTION_DET_HOST_EVENTID_param_tlvs *param_buf =
8064 (WMI_MOTION_DET_HOST_EVENTID_param_tlvs *)event;
8065 struct sir_md_evt *md_event;
8066 struct mac_context *pmac = (struct mac_context *)cds_get_context(
8067 QDF_MODULE_ID_PE);
8068
8069 if (!param_buf) {
8070 WMA_LOGE("Invalid motion det host event buffer");
8071 return -EINVAL;
8072 }
8073
Harprit Chhabadac67478f2019-04-09 11:39:22 -07008074 if (!pmac || !pmac->sme.md_host_evt_cb) {
8075 WMA_LOGE("Invalid motion detect callback");
8076 return -EINVAL;
8077 }
8078
Visweswara Tanuku633976b2019-01-07 16:13:12 +05308079 motion_det_event_hdr = param_buf->fixed_param;
8080 WMA_LOGA("motion detect host event received, vdev_id=%d, status=%d",
8081 motion_det_event_hdr->vdev_id, motion_det_event_hdr->status);
8082
8083 md_event = qdf_mem_malloc(sizeof(*md_event));
8084 if (!event)
8085 return -ENOMEM;
8086
8087 md_event->vdev_id = motion_det_event_hdr->vdev_id;
8088 md_event->status = motion_det_event_hdr->status;
8089
8090 pmac->sme.md_host_evt_cb(pmac->sme.md_ctx, md_event);
8091
8092 qdf_mem_free(md_event);
8093 return 0;
8094}
8095
8096/**
8097 * wma_motion_det_base_line_host_event_handler - md baselining event handler
8098 * @handle: WMA global handle
8099 * @event: motion detection baselining event
8100 * @len: Length of cmd
8101 *
8102 * Return: 0 on success, else error on failure
8103 */
8104int wma_motion_det_base_line_host_event_handler(void *handle,
8105 uint8_t *event, uint32_t len)
8106{
8107 wmi_motion_det_base_line_event *motion_det_base_line_event_hdr;
8108 WMI_MOTION_DET_BASE_LINE_HOST_EVENTID_param_tlvs *param_buf =
8109 (WMI_MOTION_DET_BASE_LINE_HOST_EVENTID_param_tlvs *)event;
8110
8111 if (!param_buf) {
8112 WMA_LOGE("Invalid motion det base line event buffer");
8113 return -EINVAL;
8114 }
8115
8116 motion_det_base_line_event_hdr = param_buf->fixed_param;
8117 WMA_LOGA("motion host detect base line event received, vdev_id=%d",
8118 motion_det_base_line_event_hdr->vdev_id);
8119 WMA_LOGA("baseline_value=%d bl_max_corr_resv=%d bl_min_corr_resv=%d",
8120 motion_det_base_line_event_hdr->bl_baseline_value,
8121 motion_det_base_line_event_hdr->bl_max_corr_reserved,
8122 motion_det_base_line_event_hdr->bl_min_corr_reserved);
8123
8124 return 0;
8125}
8126
8127/**
8128 * wma_set_motion_det_config - Sends motion detection configuration wmi cmd
8129 * @wma_handle: WMA global handle
8130 * @motion_det_cfg: motion detection configuration
8131 *
8132 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_ERROR on error
8133 */
8134static QDF_STATUS wma_set_motion_det_config(
8135 tp_wma_handle wma_handle,
8136 struct sme_motion_det_cfg *motion_det_cfg)
8137{
8138 wmi_motion_det_config_params_cmd_fixed_param *cmd;
8139 wmi_buf_t buf;
8140 int err;
8141
8142 buf = wmi_buf_alloc(wma_handle->wmi_handle, sizeof(*cmd));
8143 if (!buf)
8144 return QDF_STATUS_E_NOMEM;
8145
8146 cmd = (wmi_motion_det_config_params_cmd_fixed_param *)wmi_buf_data(buf);
8147 qdf_mem_zero(cmd, sizeof(*cmd));
8148
8149 WMITLV_SET_HDR(
8150 &cmd->tlv_header,
8151 WMITLV_TAG_STRUC_wmi_motion_det_config_params_cmd_fixed_param,
8152 WMITLV_GET_STRUCT_TLVLEN(
8153 wmi_motion_det_config_params_cmd_fixed_param));
8154 cmd->vdev_id = motion_det_cfg->vdev_id;
8155 cmd->time_t1 = motion_det_cfg->time_t1;
8156 cmd->time_t2 = motion_det_cfg->time_t2;
8157 cmd->n1 = motion_det_cfg->n1;
8158 cmd->n2 = motion_det_cfg->n2;
8159 cmd->time_t1_gap = motion_det_cfg->time_t1_gap;
8160 cmd->time_t2_gap = motion_det_cfg->time_t2_gap;
8161 cmd->coarse_K = motion_det_cfg->coarse_K;
8162 cmd->fine_K = motion_det_cfg->fine_K;
8163 cmd->coarse_Q = motion_det_cfg->coarse_Q;
8164 cmd->fine_Q = motion_det_cfg->fine_Q;
8165 cmd->md_coarse_thr_high = motion_det_cfg->md_coarse_thr_high;
8166 cmd->md_fine_thr_high = motion_det_cfg->md_fine_thr_high;
8167 cmd->md_coarse_thr_low = motion_det_cfg->md_coarse_thr_low;
8168 cmd->md_fine_thr_low = motion_det_cfg->md_fine_thr_low;
8169
8170 err = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, sizeof(*cmd),
8171 WMI_MOTION_DET_CONFIG_PARAM_CMDID);
8172 if (err) {
8173 wmi_buf_free(buf);
8174 return QDF_STATUS_E_FAILURE;
8175 }
8176 WMA_LOGA("Set motion_det_config to vdevId %d\n"
8177 "time_t1 %d\n"
8178 "time_t2 %d\n"
8179 "n1 %d\n"
8180 "n2 %d\n"
8181 "time_t1_gap %d\n"
8182 "time_t2_gap %d\n"
8183 "coarse_K %d\n"
8184 "fine_K %d\n"
8185 "coarse_Q %d\n"
8186 "fine_Q %d\n"
8187 "md_coarse_thr_high %d\n"
8188 "md_fine_thr_high %d\n"
8189 "md_coarse_thr_low %d\n"
8190 "md_fine_thr_low %d\n",
8191 motion_det_cfg->vdev_id,
8192 motion_det_cfg->time_t1,
8193 motion_det_cfg->time_t2,
8194 motion_det_cfg->n1,
8195 motion_det_cfg->n2,
8196 motion_det_cfg->time_t1_gap,
8197 motion_det_cfg->time_t2_gap,
8198 motion_det_cfg->coarse_K,
8199 motion_det_cfg->fine_K,
8200 motion_det_cfg->coarse_Q,
8201 motion_det_cfg->fine_Q,
8202 motion_det_cfg->md_coarse_thr_high,
8203 motion_det_cfg->md_fine_thr_high,
8204 motion_det_cfg->md_coarse_thr_low,
8205 motion_det_cfg->md_fine_thr_low);
8206 return QDF_STATUS_SUCCESS;
8207}
8208
8209/**
8210 * wma_set_motion_det_enable - Sends motion detection start/stop wmi cmd
8211 * @wma_handle: WMA global handle
8212 * @md_en: motion detection start/stop
8213 *
8214 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_ERROR on error
8215 */
8216static QDF_STATUS wma_set_motion_det_enable(tp_wma_handle wma_handle,
8217 struct sme_motion_det_en *md_en)
8218{
8219 wmi_motion_det_start_stop_cmd_fixed_param *cmd;
8220 wmi_buf_t buf;
8221 int err;
8222
8223 buf = wmi_buf_alloc(wma_handle->wmi_handle, sizeof(*cmd));
8224 if (!buf)
8225 return QDF_STATUS_E_NOMEM;
8226
8227 cmd = (wmi_motion_det_start_stop_cmd_fixed_param *)wmi_buf_data(buf);
8228 qdf_mem_zero(cmd, sizeof(*cmd));
8229
8230 WMITLV_SET_HDR(
8231 &cmd->tlv_header,
8232 WMITLV_TAG_STRUC_wmi_motion_det_start_stop_cmd_fixed_param,
8233 WMITLV_GET_STRUCT_TLVLEN(
8234 wmi_motion_det_start_stop_cmd_fixed_param));
8235 cmd->vdev_id = md_en->vdev_id;
8236 cmd->enable = md_en->enable;
8237
8238 err = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, sizeof(*cmd),
8239 WMI_MOTION_DET_START_STOP_CMDID);
8240 if (err) {
8241 wmi_buf_free(buf);
8242 return QDF_STATUS_E_FAILURE;
8243 }
8244 WMA_LOGA("Set motion_det_enable to vdevId %d %d", md_en->vdev_id,
8245 md_en->enable);
8246 return QDF_STATUS_SUCCESS;
8247}
8248
8249/**
8250 * wma_set_motion_det_base_line_config - Sends md baselining cfg wmi cmd
8251 * @wma_handle: WMA global handle
8252 * @md_base_line_cfg: md baselining configuration
8253 *
8254 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_ERROR on error
8255 */
8256static QDF_STATUS wma_set_motion_det_base_line_config(
8257 tp_wma_handle wma_handle,
8258 struct sme_motion_det_base_line_cfg *md_base_line_cfg)
8259{
8260 wmi_motion_det_base_line_config_params_cmd_fixed_param *cmd;
8261 wmi_buf_t buf;
8262 int err;
8263
8264 buf = wmi_buf_alloc(wma_handle->wmi_handle, sizeof(*cmd));
8265 if (!buf)
8266 return QDF_STATUS_E_NOMEM;
8267
8268 cmd = (wmi_motion_det_base_line_config_params_cmd_fixed_param *)
8269 wmi_buf_data(buf);
8270 qdf_mem_zero(cmd, sizeof(*cmd));
8271
8272 WMITLV_SET_HDR(
8273 &cmd->tlv_header,
8274 WMITLV_TAG_STRUC_wmi_motion_det_base_line_config_params_cmd_fixed_param,
8275 WMITLV_GET_STRUCT_TLVLEN(
8276 wmi_motion_det_base_line_config_params_cmd_fixed_param));
8277
8278 cmd->vdev_id = md_base_line_cfg->vdev_id;
8279 cmd->bl_time_t = md_base_line_cfg->bl_time_t;
8280 cmd->bl_packet_gap = md_base_line_cfg->bl_packet_gap;
8281 cmd->bl_n = md_base_line_cfg->bl_n;
8282 cmd->bl_num_meas = md_base_line_cfg->bl_num_meas;
8283
8284 err = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, sizeof(*cmd),
8285 WMI_MOTION_DET_BASE_LINE_CONFIG_PARAM_CMDID);
8286 if (err) {
8287 wmi_buf_free(buf);
8288 return QDF_STATUS_E_FAILURE;
8289 }
8290 WMA_LOGA("Set motion_det_baseline_config to vdevId %d\n"
8291 "bl_time_t %d\n"
8292 "bl_packet_gap %d\n"
8293 "bl_n %d\n"
8294 "bl_num_meas %d\n",
8295 md_base_line_cfg->vdev_id,
8296 md_base_line_cfg->bl_time_t,
8297 md_base_line_cfg->bl_packet_gap,
8298 md_base_line_cfg->bl_n,
8299 md_base_line_cfg->bl_num_meas);
8300 return QDF_STATUS_SUCCESS;
8301}
8302
8303/**
8304 * wma_set_motion_det_base_line_enable - Sends md baselining start/stop wmi cmd
8305 * @wma_handle: WMA global handle
8306 * @md_base_line_en: motion detection baselining start/stop
8307 *
8308 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_ERROR on error
8309 */
8310static QDF_STATUS wma_set_motion_det_base_line_enable(
8311 tp_wma_handle wma_handle,
8312 struct sme_motion_det_base_line_en *md_base_line_en)
8313{
8314 wmi_motion_det_base_line_start_stop_cmd_fixed_param *cmd;
8315 wmi_buf_t buf;
8316 int err;
8317
8318 buf = wmi_buf_alloc(wma_handle->wmi_handle, sizeof(*cmd));
8319 if (!buf)
8320 return QDF_STATUS_E_NOMEM;
8321
8322 cmd = (wmi_motion_det_base_line_start_stop_cmd_fixed_param *)
8323 wmi_buf_data(buf);
8324 qdf_mem_zero(cmd, sizeof(*cmd));
8325
8326 WMITLV_SET_HDR(
Visweswara Tanuku6488a1c2019-02-13 14:15:26 +05308327 &cmd->tlv_header,
Visweswara Tanuku633976b2019-01-07 16:13:12 +05308328 WMITLV_TAG_STRUC_wmi_motion_det_base_line_start_stop_cmd_fixed_param,
8329 WMITLV_GET_STRUCT_TLVLEN(
8330 wmi_motion_det_base_line_start_stop_cmd_fixed_param));
8331
8332 cmd->vdev_id = md_base_line_en->vdev_id;
8333 cmd->enable = md_base_line_en->enable;
8334
8335 err = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, sizeof(*cmd),
8336 WMI_MOTION_DET_BASE_LINE_START_STOP_CMDID);
8337 if (err) {
8338 wmi_buf_free(buf);
8339 return QDF_STATUS_E_FAILURE;
8340 }
8341 WMA_LOGA("Set motion_det_base_line_enable to vdevId %d enable %d",
8342 md_base_line_en->vdev_id, md_base_line_en->enable);
8343 return QDF_STATUS_SUCCESS;
8344}
8345#endif /* WLAN_FEATURE_MOTION_DETECTION */
8346
Arif Hussainee10f902017-12-27 16:30:17 -08008347/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008348 * wma_mc_process_msg() - process wma messages and call appropriate function.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008349 * @msg: message
8350 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05308351 * Return: QDF_SUCCESS for success otherwise failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008352 */
Jeff Johnson5be42ab2017-09-13 09:10:39 -07008353static QDF_STATUS wma_mc_process_msg(struct scheduler_msg *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008354{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308355 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008356 tp_wma_handle wma_handle;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08008357 struct cdp_vdev *txrx_vdev_handle = NULL;
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -07008358
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008359 extern uint8_t *mac_trace_get_wma_msg_string(uint16_t wmaMsg);
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05308360 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008361
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07008362 if (!msg) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008363 WMA_LOGE("msg is NULL");
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308364 QDF_ASSERT(0);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308365 qdf_status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008366 goto end;
8367 }
8368
8369 WMA_LOGD("msg->type = %x %s", msg->type,
8370 mac_trace_get_wma_msg_string(msg->type));
8371
Anurag Chouhan6d760662016-02-20 16:05:43 +05308372 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008373
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07008374 if (!wma_handle) {
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07008375 WMA_LOGE("%s: wma_handle is NULL", __func__);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308376 QDF_ASSERT(0);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308377 qdf_mem_free(msg->bodyptr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308378 qdf_status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008379 goto end;
8380 }
8381
8382 switch (msg->type) {
8383
8384 /* Message posted by wmi for all control path related
8385 * FW events to serialize through mc_thread.
8386 */
8387 case WMA_PROCESS_FW_EVENT:
8388 wma_process_fw_event(wma_handle,
8389 (wma_process_fw_event_params *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308390 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008391 break;
8392
8393#ifdef FEATURE_WLAN_ESE
8394 case WMA_TSM_STATS_REQ:
Srinivas Girigowda86ecc012017-03-10 12:26:57 -08008395 WMA_LOGD("McThread: WMA_TSM_STATS_REQ");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008396 wma_process_tsm_stats_req(wma_handle, (void *)msg->bodyptr);
8397 break;
8398#endif /* FEATURE_WLAN_ESE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008399 case WMA_ADD_STA_SELF_REQ:
8400 txrx_vdev_handle =
8401 wma_vdev_attach(wma_handle,
8402 (struct add_sta_self_params *) msg->
8403 bodyptr, 1);
8404 if (!txrx_vdev_handle) {
8405 WMA_LOGE("Failed to attach vdev");
8406 } else {
8407 /* Register with TxRx Module for Data Ack Complete Cb */
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05308408 if (soc) {
8409 cdp_data_tx_cb_set(soc, txrx_vdev_handle,
8410 wma_data_tx_ack_comp_hdlr,
8411 wma_handle);
8412 } else {
8413 WMA_LOGE("%s: SOC context is NULL", __func__);
8414 qdf_status = QDF_STATUS_E_FAILURE;
8415 goto end;
8416 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008417 }
8418 break;
8419 case WMA_DEL_STA_SELF_REQ:
8420 wma_vdev_detach(wma_handle,
8421 (struct del_sta_self_params *) msg->bodyptr, 1);
8422 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008423 case WMA_UPDATE_CHAN_LIST_REQ:
8424 wma_update_channel_list(wma_handle,
8425 (tSirUpdateChanList *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308426 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008427 break;
8428 case WMA_SET_LINK_STATE:
8429 wma_set_linkstate(wma_handle, (tpLinkStateParams) msg->bodyptr);
8430 break;
8431 case WMA_CHNL_SWITCH_REQ:
8432 wma_set_channel(wma_handle,
8433 (tpSwitchChannelParams) msg->bodyptr);
8434 break;
8435 case WMA_ADD_BSS_REQ:
8436 wma_add_bss(wma_handle, (tpAddBssParams) msg->bodyptr);
8437 break;
8438 case WMA_ADD_STA_REQ:
8439 wma_add_sta(wma_handle, (tpAddStaParams) msg->bodyptr);
8440 break;
Rakshith Suresh Patkar5f9efa32019-02-04 13:26:56 +05308441 case WMA_SEND_PEER_UNMAP_CONF:
8442 wma_peer_unmap_conf_send(
8443 wma_handle,
8444 (struct send_peer_unmap_conf_params *)msg->bodyptr);
8445 qdf_mem_free(msg->bodyptr);
8446 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008447 case WMA_SET_BSSKEY_REQ:
8448 wma_set_bsskey(wma_handle, (tpSetBssKeyParams) msg->bodyptr);
8449 break;
8450 case WMA_SET_STAKEY_REQ:
8451 wma_set_stakey(wma_handle, (tpSetStaKeyParams) msg->bodyptr);
8452 break;
8453 case WMA_DELETE_STA_REQ:
8454 wma_delete_sta(wma_handle, (tpDeleteStaParams) msg->bodyptr);
8455 break;
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07008456 case WMA_DELETE_BSS_HO_FAIL_REQ:
8457 wma_delete_bss_ho_fail(wma_handle,
8458 (tpDeleteBssParams) msg->bodyptr);
8459 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008460 case WMA_DELETE_BSS_REQ:
8461 wma_delete_bss(wma_handle, (tpDeleteBssParams) msg->bodyptr);
8462 break;
8463 case WMA_UPDATE_EDCA_PROFILE_IND:
8464 wma_process_update_edca_param_req(wma_handle,
8465 (tEdcaParams *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308466 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008467 break;
8468 case WMA_SEND_BEACON_REQ:
8469 wma_send_beacon(wma_handle, (tpSendbeaconParams) msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008470 break;
Abhishek Singh3d30a3b2018-09-12 15:49:18 +05308471 case WMA_SEND_AP_VDEV_UP:
8472 wma_set_ap_vdev_up(wma_handle, msg->bodyval);
8473 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008474 case WMA_SEND_PROBE_RSP_TMPL:
8475 wma_send_probe_rsp_tmpl(wma_handle,
8476 (tpSendProbeRespParams) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308477 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008478 break;
8479 case WMA_CLI_SET_CMD:
8480 wma_process_cli_set_cmd(wma_handle,
8481 (wma_cli_set_cmd_t *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308482 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008483 break;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07008484 case WMA_SET_PDEV_IE_REQ:
8485 wma_process_set_pdev_ie_req(wma_handle,
8486 (struct set_ie_param *)msg->bodyptr);
8487 qdf_mem_free(msg->bodyptr);
8488 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008489#if !defined(REMOVE_PKT_LOG)
8490 case WMA_PKTLOG_ENABLE_REQ:
8491 wma_pktlog_wmi_send_cmd(wma_handle,
8492 (struct ath_pktlog_wmi_params *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308493 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008494 break;
8495#endif /* REMOVE_PKT_LOG */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008496 case WMA_ENTER_PS_REQ:
8497 wma_enable_sta_ps_mode(wma_handle,
8498 (tpEnablePsParams) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308499 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008500 break;
8501 case WMA_EXIT_PS_REQ:
8502 wma_disable_sta_ps_mode(wma_handle,
8503 (tpDisablePsParams) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308504 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008505 break;
8506 case WMA_ENABLE_UAPSD_REQ:
8507 wma_enable_uapsd_mode(wma_handle,
8508 (tpEnableUapsdParams) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308509 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008510 break;
8511 case WMA_DISABLE_UAPSD_REQ:
8512 wma_disable_uapsd_mode(wma_handle,
8513 (tpDisableUapsdParams) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308514 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008515 break;
Kiran Kumar Lokere6d3a30d2018-01-15 18:18:29 -08008516 case WMA_SET_DTIM_PERIOD:
8517 wma_set_dtim_period(wma_handle,
8518 (struct set_dtim_params *)msg->bodyptr);
8519 qdf_mem_free(msg->bodyptr);
8520 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008521 case WMA_SET_TX_POWER_REQ:
8522 wma_set_tx_power(wma_handle, (tpMaxTxPowerParams) msg->bodyptr);
8523 break;
8524 case WMA_SET_MAX_TX_POWER_REQ:
8525 wma_set_max_tx_power(wma_handle,
8526 (tpMaxTxPowerParams) msg->bodyptr);
8527 break;
8528 case WMA_SET_KEEP_ALIVE:
Jeff Johnson562ccad2019-02-06 22:10:24 -08008529 wma_set_keepalive_req(wma_handle, msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008530 break;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08008531#ifdef FEATURE_WLAN_ESE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008532 case WMA_SET_PLM_REQ:
Jeff Johnsonb120a822019-02-02 22:15:55 -08008533 wma_config_plm(wma_handle, msg->bodyptr);
8534 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008535 break;
8536#endif
8537 case WMA_GET_STATISTICS_REQ:
8538 wma_get_stats_req(wma_handle,
8539 (tAniGetPEStatsReq *) msg->bodyptr);
8540 break;
8541
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008542 case WMA_UPDATE_OP_MODE:
8543 wma_process_update_opmode(wma_handle,
8544 (tUpdateVHTOpMode *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308545 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008546 break;
8547 case WMA_UPDATE_RX_NSS:
8548 wma_process_update_rx_nss(wma_handle,
8549 (tUpdateRxNss *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308550 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008551 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008552 case WMA_UPDATE_MEMBERSHIP:
8553 wma_process_update_membership(wma_handle,
8554 (tUpdateMembership *) msg->bodyptr);
8555 break;
8556 case WMA_UPDATE_USERPOS:
8557 wma_process_update_userpos(wma_handle,
8558 (tUpdateUserPos *) msg->bodyptr);
8559 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008560 case WMA_UPDATE_BEACON_IND:
8561 wma_process_update_beacon_params(wma_handle,
8562 (tUpdateBeaconParams *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308563 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008564 break;
8565
8566 case WMA_ADD_TS_REQ:
Jeff Johnson9851fcc2018-12-22 17:29:58 -08008567 wma_add_ts_req(wma_handle, msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008568 break;
8569
8570 case WMA_DEL_TS_REQ:
Jeff Johnson256002f2018-12-22 17:53:19 -08008571 wma_del_ts_req(wma_handle, msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008572 break;
8573
8574 case WMA_AGGR_QOS_REQ:
Jeff Johnson54024412018-12-22 12:07:06 -08008575 wma_aggr_qos_req(wma_handle, msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008576 break;
8577
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008578 case WMA_8023_MULTICAST_LIST_REQ:
8579 wma_process_mcbc_set_filter_req(wma_handle,
8580 (tpSirRcvFltMcAddrList) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308581 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008582 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008583 case WMA_ROAM_SCAN_OFFLOAD_REQ:
Jeff Johnsone6da4b02019-02-06 22:22:04 -08008584 wma_process_roaming_config(wma_handle, msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008585 break;
8586
8587 case WMA_RATE_UPDATE_IND:
8588 wma_process_rate_update_indicate(wma_handle,
8589 (tSirRateUpdateInd *) msg->bodyptr);
8590 break;
8591
8592#ifdef FEATURE_WLAN_TDLS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008593 case WMA_UPDATE_TDLS_PEER_STATE:
Jeff Johnson517ee492019-02-07 11:59:04 -08008594 wma_update_tdls_peer_state(wma_handle, msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008595 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008596#endif /* FEATURE_WLAN_TDLS */
8597 case WMA_ADD_PERIODIC_TX_PTRN_IND:
8598 wma_process_add_periodic_tx_ptrn_ind(wma_handle,
8599 (tSirAddPeriodicTxPtrn *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308600 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008601 break;
8602 case WMA_DEL_PERIODIC_TX_PTRN_IND:
8603 wma_process_del_periodic_tx_ptrn_ind(wma_handle,
8604 (tSirDelPeriodicTxPtrn *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308605 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008606 break;
8607 case WMA_TX_POWER_LIMIT:
Jeff Johnson19ce8d02019-02-08 22:56:23 -08008608 wma_process_tx_power_limits(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308609 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008610 break;
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008611 case WMA_SEND_ADDBA_REQ:
8612 wma_process_send_addba_req(wma_handle,
8613 (struct send_add_ba_req *)msg->bodyptr);
8614 break;
8615
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008616#ifdef FEATURE_WLAN_CH_AVOID
8617 case WMA_CH_AVOID_UPDATE_REQ:
8618 wma_process_ch_avoid_update_req(wma_handle,
8619 (tSirChAvoidUpdateReq *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308620 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008621 break;
8622#endif /* FEATURE_WLAN_CH_AVOID */
8623#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
8624 case WMA_SET_AUTO_SHUTDOWN_TIMER_REQ:
8625 wma_set_auto_shutdown_timer_req(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308626 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008627 break;
8628#endif /* FEATURE_WLAN_AUTO_SHUTDOWN */
8629 case WMA_DHCP_START_IND:
8630 case WMA_DHCP_STOP_IND:
8631 wma_process_dhcp_ind(wma_handle, (tAniDHCPInd *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308632 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008633 break;
8634
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008635 case WMA_IBSS_CESIUM_ENABLE_IND:
8636 wma_process_cesium_enable_ind(wma_handle);
8637 break;
8638 case WMA_GET_IBSS_PEER_INFO_REQ:
8639 wma_process_get_peer_info_req(wma_handle,
8640 (tSirIbssGetPeerInfoReqParams *)
8641 msg->bodyptr);
8642 qdf_mem_free(msg->bodyptr);
8643 break;
8644 case WMA_TX_FAIL_MONITOR_IND:
8645 wma_process_tx_fail_monitor_ind(wma_handle,
8646 (tAniTXFailMonitorInd *) msg->bodyptr);
8647 qdf_mem_free(msg->bodyptr);
8648 break;
8649
8650 case WMA_RMC_ENABLE_IND:
8651 wma_process_rmc_enable_ind(wma_handle);
8652 break;
8653 case WMA_RMC_DISABLE_IND:
8654 wma_process_rmc_disable_ind(wma_handle);
8655 break;
8656 case WMA_RMC_ACTION_PERIOD_IND:
8657 wma_process_rmc_action_period_ind(wma_handle);
8658 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008659 case WMA_INIT_THERMAL_INFO_CMD:
8660 wma_process_init_thermal_info(wma_handle,
8661 (t_thermal_mgmt *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308662 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008663 break;
8664
8665 case WMA_SET_THERMAL_LEVEL:
8666 wma_process_set_thermal_level(wma_handle, msg->bodyval);
8667 break;
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05308668#ifdef CONFIG_HL_SUPPORT
8669 case WMA_INIT_BAD_PEER_TX_CTL_INFO_CMD:
8670 wma_process_init_bad_peer_tx_ctl_info(
8671 wma_handle,
8672 (struct t_bad_peer_txtcl_config *)msg->bodyptr);
8673 qdf_mem_free(msg->bodyptr);
8674 break;
8675#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008676 case WMA_SET_MIMOPS_REQ:
8677 wma_process_set_mimops_req(wma_handle,
8678 (tSetMIMOPS *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308679 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008680 break;
8681 case WMA_SET_SAP_INTRABSS_DIS:
8682 wma_set_vdev_intrabss_fwd(wma_handle,
8683 (tDisableIntraBssFwd *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308684 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008685 break;
Will Huanga9814592017-05-24 15:47:58 +08008686 case WMA_GET_PEER_INFO:
8687 wma_get_peer_info(wma_handle, msg->bodyptr);
8688 qdf_mem_free(msg->bodyptr);
8689 break;
8690 case WMA_GET_PEER_INFO_EXT:
8691 wma_get_peer_info_ext(wma_handle, msg->bodyptr);
8692 qdf_mem_free(msg->bodyptr);
8693 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008694 case WMA_MODEM_POWER_STATE_IND:
8695 wma_notify_modem_power_state(wma_handle,
8696 (tSirModemPowerStateInd *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308697 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008698 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008699#ifdef WLAN_FEATURE_STATS_EXT
8700 case WMA_STATS_EXT_REQUEST:
8701 wma_stats_ext_req(wma_handle,
8702 (tpStatsExtRequest) (msg->bodyptr));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308703 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008704 break;
8705#endif /* WLAN_FEATURE_STATS_EXT */
8706 case WMA_HIDDEN_SSID_VDEV_RESTART:
8707 wma_hidden_ssid_vdev_restart(wma_handle,
8708 (tHalHiddenSsidVdevRestart *) msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008709 break;
8710#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
8711 case WMA_WLAN_EXT_WOW:
8712 wma_enable_ext_wow(wma_handle,
8713 (tSirExtWoWParams *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308714 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008715 break;
8716 case WMA_WLAN_SET_APP_TYPE1_PARAMS:
8717 wma_set_app_type1_params_in_fw(wma_handle,
8718 (tSirAppType1Params *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308719 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008720 break;
8721 case WMA_WLAN_SET_APP_TYPE2_PARAMS:
8722 wma_set_app_type2_params_in_fw(wma_handle,
8723 (tSirAppType2Params *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308724 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008725 break;
8726#endif /* WLAN_FEATURE_EXTWOW_SUPPORT */
8727#ifdef FEATURE_WLAN_EXTSCAN
8728 case WMA_EXTSCAN_START_REQ:
Jeff Johnsondab58602018-07-14 15:30:24 -07008729 wma_start_extscan(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308730 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008731 break;
8732 case WMA_EXTSCAN_STOP_REQ:
Jeff Johnson7272ea72018-07-15 17:22:27 -07008733 wma_stop_extscan(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308734 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008735 break;
8736 case WMA_EXTSCAN_SET_BSSID_HOTLIST_REQ:
Jeff Johnson1148cb02018-07-13 23:14:32 -07008737 wma_extscan_start_hotlist_monitor(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308738 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008739 break;
8740 case WMA_EXTSCAN_RESET_BSSID_HOTLIST_REQ:
Jeff Johnson9743eb72018-07-14 10:30:04 -07008741 wma_extscan_stop_hotlist_monitor(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308742 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008743 break;
8744 case WMA_EXTSCAN_SET_SIGNF_CHANGE_REQ:
Jeff Johnsonb43ed032018-07-16 06:59:21 -07008745 wma_extscan_start_change_monitor(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308746 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008747 break;
8748 case WMA_EXTSCAN_RESET_SIGNF_CHANGE_REQ:
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07008749 wma_extscan_stop_change_monitor(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308750 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008751 break;
8752 case WMA_EXTSCAN_GET_CACHED_RESULTS_REQ:
Jeff Johnson2ba60092018-07-17 08:19:37 -07008753 wma_extscan_get_cached_results(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308754 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008755 break;
8756 case WMA_EXTSCAN_GET_CAPABILITIES_REQ:
Jeff Johnsonfed9a732018-07-18 12:18:03 -07008757 wma_extscan_get_capabilities(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308758 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008759 break;
8760 case WMA_SET_EPNO_LIST_REQ:
Jeff Johnson360135b2018-07-18 20:51:47 -07008761 wma_set_epno_network_list(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308762 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008763 break;
Kapil Gupta5cda2252016-12-29 18:44:26 +05308764 case WMA_SET_PER_ROAM_CONFIG_CMD:
8765 wma_update_per_roam_config(wma_handle,
8766 (struct wmi_per_roam_config_req *)msg->bodyptr);
8767 qdf_mem_free(msg->bodyptr);
8768 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008769 case WMA_SET_PASSPOINT_LIST_REQ:
8770 /* Issue reset passpoint network list first and clear
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07008771 * the entries
8772 */
Jeff Johnson2a7f1012018-07-19 07:21:06 -07008773 wma_reset_passpoint_network_list(wma_handle, msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008774
Jeff Johnson2a7f1012018-07-19 07:21:06 -07008775 wma_set_passpoint_network_list(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308776 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008777 break;
8778 case WMA_RESET_PASSPOINT_LIST_REQ:
Jeff Johnson2a7f1012018-07-19 07:21:06 -07008779 wma_reset_passpoint_network_list(wma_handle, msg->bodyptr);
Pragaspathi Thilagarajf65cffe2018-06-15 14:20:26 +05308780 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008781 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008782#endif /* FEATURE_WLAN_EXTSCAN */
8783 case WMA_SET_SCAN_MAC_OUI_REQ:
8784 wma_scan_probe_setoui(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308785 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008786 break;
8787#ifdef WLAN_FEATURE_LINK_LAYER_STATS
8788 case WMA_LINK_LAYER_STATS_CLEAR_REQ:
8789 wma_process_ll_stats_clear_req(wma_handle,
8790 (tpSirLLStatsClearReq) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308791 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008792 break;
8793 case WMA_LINK_LAYER_STATS_SET_REQ:
8794 wma_process_ll_stats_set_req(wma_handle,
8795 (tpSirLLStatsSetReq) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308796 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008797 break;
8798 case WMA_LINK_LAYER_STATS_GET_REQ:
8799 wma_process_ll_stats_get_req(wma_handle,
8800 (tpSirLLStatsGetReq) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308801 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008802 break;
Zhang Qian73c348a2017-03-13 16:15:55 +08008803 case WDA_LINK_LAYER_STATS_SET_THRESHOLD:
8804 wma_config_stats_ext_threshold(wma_handle,
8805 (struct sir_ll_ext_stats_threshold *)msg->bodyptr);
8806 qdf_mem_free(msg->bodyptr);
8807 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008808#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008809#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008810 case WMA_ROAM_OFFLOAD_SYNCH_FAIL:
8811 wma_process_roam_synch_fail(wma_handle,
8812 (struct roam_offload_synch_fail *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308813 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008814 break;
8815 case SIR_HAL_ROAM_INVOKE:
8816 wma_process_roam_invoke(wma_handle,
8817 (struct wma_roam_invoke_cmd *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308818 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008819 break;
8820#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008821 case SIR_HAL_SET_BASE_MACADDR_IND:
8822 wma_set_base_macaddr_indicate(wma_handle,
8823 (tSirMacAddr *) msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308824 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008825 break;
8826 case WMA_LINK_STATUS_GET_REQ:
8827 wma_process_link_status_req(wma_handle,
8828 (tAniGetLinkStatus *) msg->bodyptr);
8829 break;
8830 case WMA_GET_TEMPERATURE_REQ:
8831 wma_get_temperature(wma_handle);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308832 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008833 break;
Manikandan Mohan976e7562016-03-15 16:33:31 -07008834 case WMA_TSF_GPIO_PIN:
8835 wma_set_tsf_gpio_pin(wma_handle, msg->bodyval);
8836 break;
8837
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008838#ifdef DHCP_SERVER_OFFLOAD
8839 case WMA_SET_DHCP_SERVER_OFFLOAD_CMD:
Jeff Johnsone77641e2019-02-15 09:00:41 -08008840 wma_process_dhcpserver_offload(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308841 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008842 break;
8843#endif /* DHCP_SERVER_OFFLOAD */
8844#ifdef WLAN_FEATURE_GPIO_LED_FLASHING
8845 case WMA_LED_FLASHING_REQ:
Jeff Johnson5a6b6602017-10-04 14:44:30 -07008846 wma_set_led_flashing(wma_handle, msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308847 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008848 break;
8849#endif /* WLAN_FEATURE_GPIO_LED_FLASHING */
8850 case SIR_HAL_SET_MAS:
8851 wma_process_set_mas(wma_handle,
8852 (uint32_t *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308853 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008854 break;
8855 case SIR_HAL_SET_MIRACAST:
8856 wma_process_set_miracast(wma_handle,
8857 (uint32_t *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308858 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008859 break;
8860 case SIR_HAL_CONFIG_STATS_FACTOR:
8861 wma_config_stats_factor(wma_handle,
8862 (struct sir_stats_avg_factor *)
8863 msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308864 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008865 break;
8866 case SIR_HAL_CONFIG_GUARD_TIME:
8867 wma_config_guard_time(wma_handle,
8868 (struct sir_guard_time_request *)
8869 msg->bodyptr);
Vignesh Viswanathan9fa8fef2017-12-12 14:45:38 +05308870 qdf_mem_free(msg->bodyptr);
8871 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008872 case SIR_HAL_START_STOP_LOGGING:
8873 wma_set_wifi_start_packet_stats(wma_handle,
8874 (struct sir_wifi_start_log *)msg->bodyptr);
8875 wma_enable_specific_fw_logs(wma_handle,
8876 (struct sir_wifi_start_log *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308877 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008878 break;
8879 case SIR_HAL_FLUSH_LOG_TO_FW:
8880 wma_send_flush_logs_to_fw(wma_handle);
8881 /* Body ptr is NULL here */
8882 break;
8883 case WMA_SET_RSSI_MONITOR_REQ:
Jeff Johnson4c6d40f2019-02-22 20:49:56 -08008884 wma_set_rssi_monitoring(wma_handle, msg->bodyptr);
Prakash Dhavali87ddca32016-11-29 17:02:11 -08008885 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008886 break;
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05308887 case SIR_HAL_PDEV_SET_PCL_TO_FW:
8888 wma_send_pdev_set_pcl_cmd(wma_handle,
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -07008889 (struct set_pcl_req *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308890 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008891 break;
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05308892 case SIR_HAL_PDEV_SET_HW_MODE:
8893 wma_send_pdev_set_hw_mode_cmd(wma_handle,
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07008894 (struct policy_mgr_hw_mode *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308895 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008896 break;
Manikandan Mohan80dea792016-04-28 16:36:48 -07008897 case WMA_SET_WISA_PARAMS:
8898 wma_set_wisa_params(wma_handle,
8899 (struct sir_wisa_params *)msg->bodyptr);
8900 qdf_mem_free(msg->bodyptr);
8901 break;
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05308902 case SIR_HAL_PDEV_DUAL_MAC_CFG_REQ:
8903 wma_send_pdev_set_dual_mac_config(wma_handle,
Srinivas Girigowdaeb6ecf32018-02-15 17:04:22 -08008904 (struct policy_mgr_dual_mac_config *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308905 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008906 break;
8907 case WMA_SET_IE_INFO:
8908 wma_process_set_ie_info(wma_handle,
8909 (struct vdev_ie_info *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308910 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008911 break;
Kiran Kumar Lokereee205772018-09-27 00:27:27 -07008912 case WMA_CFG_VENDOR_ACTION_TB_PPDU:
8913 wma_process_cfg_action_frm_tb_ppdu(wma_handle, msg->bodyptr);
8914 qdf_mem_free(msg->bodyptr);
8915 break;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08008916 case SIR_HAL_SOC_ANTENNA_MODE_REQ:
8917 wma_send_pdev_set_antenna_mode(wma_handle,
8918 (struct sir_antenna_mode_param *)msg->bodyptr);
8919 qdf_mem_free(msg->bodyptr);
8920 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008921 case WMA_LRO_CONFIG_CMD:
8922 wma_lro_config_cmd(wma_handle,
Dhanashri Atre09828f12016-11-13 10:36:58 -08008923 (struct cdp_lro_hash_config *)msg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308924 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008925 break;
Ravi Joshi9e891ba2015-11-09 19:03:46 -08008926 case WMA_GW_PARAM_UPDATE_REQ:
Jeff Johnson38d0ce62019-02-22 17:05:14 -08008927 wma_set_gateway_params(wma_handle, msg->bodyptr);
Archana Ramachandran28ab4122016-03-08 16:17:14 -08008928 qdf_mem_free(msg->bodyptr);
Ryan Hsu3c8f79f2015-12-02 16:45:09 -08008929 break;
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +05308930 case WMA_SET_ADAPT_DWELLTIME_CONF_PARAMS:
8931 wma_send_adapt_dwelltime_params(wma_handle,
8932 (struct adaptive_dwelltime_params *)msg->bodyptr);
8933 qdf_mem_free(msg->bodyptr);
8934 break;
Sandeep Puligillae0875662016-02-12 16:09:21 -08008935 case WMA_HT40_OBSS_SCAN_IND:
8936 wma_send_ht40_obss_scanind(wma_handle,
8937 (struct obss_ht40_scanind *)msg->bodyptr);
8938 qdf_mem_free(msg->bodyptr);
8939 break;
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -07008940 case WMA_ADD_BCN_FILTER_CMDID:
8941 wma_add_beacon_filter(wma_handle, msg->bodyptr);
8942 qdf_mem_free(msg->bodyptr);
8943 break;
8944 case WMA_REMOVE_BCN_FILTER_CMDID:
8945 wma_remove_beacon_filter(wma_handle, msg->bodyptr);
8946 qdf_mem_free(msg->bodyptr);
8947 break;
Nachiket Kukadee547a482018-05-22 16:43:30 +05308948 case WDA_APF_GET_CAPABILITIES_REQ:
8949 wma_get_apf_capabilities(wma_handle);
Arun Khandavalli2476ef52016-04-26 20:19:43 +05308950 break;
Manjeet Singhf82ed072016-07-08 11:40:00 +05308951 case SIR_HAL_POWER_DBG_CMD:
8952 wma_process_hal_pwr_dbg_cmd(wma_handle,
8953 msg->bodyptr);
8954 qdf_mem_free(msg->bodyptr);
8955 break;
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05308956 case WMA_UPDATE_WEP_DEFAULT_KEY:
8957 wma_update_wep_default_key(wma_handle,
8958 (struct wep_update_default_key_idx *)msg->bodyptr);
8959 qdf_mem_free(msg->bodyptr);
8960 break;
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +05308961 case WMA_SEND_FREQ_RANGE_CONTROL_IND:
8962 wma_enable_disable_caevent_ind(wma_handle, msg->bodyval);
8963 break;
Agrawal, Ashish35b251d2016-09-08 19:21:03 +05308964 case SIR_HAL_UPDATE_TX_FAIL_CNT_TH:
8965 wma_update_tx_fail_cnt_th(wma_handle, msg->bodyptr);
8966 qdf_mem_free(msg->bodyptr);
8967 break;
Agrawal Ashishda3e9502016-09-21 17:43:51 +05308968 case SIR_HAL_LONG_RETRY_LIMIT_CNT:
8969 wma_update_long_retry_limit(wma_handle, msg->bodyptr);
8970 qdf_mem_free(msg->bodyptr);
8971 break;
8972 case SIR_HAL_SHORT_RETRY_LIMIT_CNT:
8973 wma_update_short_retry_limit(wma_handle, msg->bodyptr);
8974 qdf_mem_free(msg->bodyptr);
8975 break;
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05308976 case SIR_HAL_POWER_DEBUG_STATS_REQ:
8977 wma_process_power_debug_stats_req(wma_handle);
8978 break;
Arunk Khandavallica56d4b2018-11-29 15:46:00 +05308979 case WMA_BEACON_DEBUG_STATS_REQ:
8980 wma_process_beacon_debug_stats_req(wma_handle, msg->bodyptr);
8981 qdf_mem_free(msg->bodyptr);
8982 break;
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +05308983 case WMA_GET_RCPI_REQ:
8984 wma_get_rcpi_req(wma_handle,
8985 (struct sme_rcpi_req *)msg->bodyptr);
8986 qdf_mem_free(msg->bodyptr);
8987 break;
Yingying Tang95409972016-10-20 15:16:15 +08008988 case WMA_SET_WOW_PULSE_CMD:
8989 wma_send_wow_pulse_cmd(wma_handle,
8990 (struct wow_pulse_mode *)msg->bodyptr);
8991 qdf_mem_free(msg->bodyptr);
8992 break;
Nitesh Shahf9a09ff2017-05-22 15:46:25 +05308993 case WMA_SET_DBS_SCAN_SEL_CONF_PARAMS:
8994 wma_send_dbs_scan_selection_params(wma_handle,
8995 (struct wmi_dbs_scan_sel_params *)msg->bodyptr);
8996 qdf_mem_free(msg->bodyptr);
8997 break;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05308998 case WMA_SET_ARP_STATS_REQ:
8999 wma_set_arp_req_stats(wma_handle,
9000 (struct set_arp_stats_params *)msg->bodyptr);
9001 qdf_mem_free(msg->bodyptr);
9002 break;
9003 case WMA_GET_ARP_STATS_REQ:
9004 wma_get_arp_req_stats(wma_handle,
9005 (struct get_arp_stats_params *)msg->bodyptr);
9006 qdf_mem_free(msg->bodyptr);
9007 break;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05309008 case SIR_HAL_SET_DEL_PMKID_CACHE:
Jeff Johnson622aad62018-12-07 15:05:37 -08009009 wma_set_del_pmkid_cache(wma_handle, msg->bodyptr);
Ashish Kumar Dhanotiya36510832019-02-20 22:13:25 +05309010 if (msg->bodyptr) {
9011 qdf_mem_zero(msg->bodyptr,
9012 sizeof(struct wmi_unified_pmk_cache));
9013 qdf_mem_free(msg->bodyptr);
9014 }
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05309015 break;
9016 case SIR_HAL_HLP_IE_INFO:
9017 wma_roam_scan_send_hlp(wma_handle,
9018 (struct hlp_params *)msg->bodyptr);
9019 qdf_mem_free(msg->bodyptr);
9020 break;
Ganesh Kondabattini35739572017-06-21 16:26:39 +05309021 case WMA_SET_LIMIT_OFF_CHAN:
9022 wma_process_limit_off_chan(wma_handle, msg->bodyptr);
9023 qdf_mem_free(msg->bodyptr);
9024 break;
Arif Hussainee10f902017-12-27 16:30:17 -08009025 case WMA_OBSS_DETECTION_REQ:
9026 wma_send_obss_detection_cfg(wma_handle, msg->bodyptr);
9027 qdf_mem_free(msg->bodyptr);
9028 break;
Vignesh Viswanathan694e28e2018-01-18 20:53:57 +05309029 case WMA_INVOKE_NEIGHBOR_REPORT:
9030 wma_send_invoke_neighbor_report(wma_handle, msg->bodyptr);
9031 qdf_mem_free(msg->bodyptr);
9032 break;
Arif Hussain05fb4872018-01-03 16:02:55 -08009033 case WMA_OBSS_COLOR_COLLISION_REQ:
9034 wma_process_obss_color_collision_req(wma_handle, msg->bodyptr);
9035 qdf_mem_free(msg->bodyptr);
9036 break;
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +05309037 case WMA_GET_ROAM_SCAN_STATS:
9038 wma_get_roam_scan_stats(wma_handle, msg->bodyptr);
9039 qdf_mem_free(msg->bodyptr);
9040 break;
Visweswara Tanuku633976b2019-01-07 16:13:12 +05309041#ifdef WLAN_FEATURE_MOTION_DETECTION
9042 case WMA_SET_MOTION_DET_CONFIG:
9043 wma_set_motion_det_config(
9044 wma_handle,
9045 (struct sme_motion_det_cfg *)msg->bodyptr);
9046 qdf_mem_free(msg->bodyptr);
9047 break;
9048 case WMA_SET_MOTION_DET_ENABLE:
9049 wma_set_motion_det_enable(
9050 wma_handle,
9051 (struct sme_motion_det_en *)msg->bodyptr);
9052 qdf_mem_free(msg->bodyptr);
9053 break;
9054 case WMA_SET_MOTION_DET_BASE_LINE_CONFIG:
9055 wma_set_motion_det_base_line_config(
9056 wma_handle,
9057 (struct sme_motion_det_base_line_cfg *)msg->bodyptr);
9058 qdf_mem_free(msg->bodyptr);
9059 break;
9060 case WMA_SET_MOTION_DET_BASE_LINE_ENABLE:
9061 wma_set_motion_det_base_line_enable(
9062 wma_handle,
9063 (struct sme_motion_det_base_line_en *)msg->bodyptr);
9064 qdf_mem_free(msg->bodyptr);
9065 break;
9066#endif /* WLAN_FEATURE_MOTION_DETECTION */
Visweswara Tanuku025f5862019-01-08 17:35:33 +05309067#ifdef FW_THERMAL_THROTTLE_SUPPORT
9068 case WMA_SET_THERMAL_THROTTLE_CFG:
9069 if (!wma_handle->thermal_mgmt_info.thermalMgmtEnabled)
9070 wmi_unified_thermal_mitigation_param_cmd_send(
9071 wma_handle->wmi_handle, msg->bodyptr);
9072 else
9073 qdf_status = QDF_STATUS_E_INVAL;
9074 qdf_mem_free(msg->bodyptr);
9075 break;
9076 case WMA_SET_THERMAL_MGMT:
9077 if (!wma_handle->thermal_mgmt_info.thermalMgmtEnabled)
9078 wma_set_thermal_mgmt(
9079 wma_handle,
9080 *((t_thermal_cmd_params *)msg->bodyptr));
9081 else
9082 qdf_status = QDF_STATUS_E_INVAL;
9083 qdf_mem_free(msg->bodyptr);
9084 break;
9085#endif /* FW_THERMAL_THROTTLE_SUPPORT */
Arun Kumar Khandavallideda5a82019-03-11 15:32:19 +05309086#ifdef WLAN_MWS_INFO_DEBUGFS
9087 case WMA_GET_MWS_COEX_INFO_REQ:
9088 wma_get_mws_coex_info_req(wma_handle, msg->bodyptr);
9089 qdf_mem_free(msg->bodyptr);
9090 break;
9091#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009092 default:
Sandeep Puligilla1f1e4002018-08-18 12:15:01 -07009093 WMA_LOGD("Unhandled WMA message of type %d", msg->type);
Dustin Brown86534fb2017-01-24 14:28:20 -08009094 if (msg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309095 qdf_mem_free(msg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009096 }
9097end:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309098 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009099}
9100
Krunal Sonid32c6bc2016-10-18 18:00:21 -07009101QDF_STATUS wma_mc_process_handler(struct scheduler_msg *msg)
9102{
Jeff Johnson5be42ab2017-09-13 09:10:39 -07009103 return wma_mc_process_msg(msg);
Krunal Sonid32c6bc2016-10-18 18:00:21 -07009104}
Krunal Sonid32c6bc2016-10-18 18:00:21 -07009105
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009106/**
9107 * wma_log_completion_timeout() - Log completion timeout
9108 * @data: Timeout handler data
9109 *
9110 * This function is called when log completion timer expires
9111 *
9112 * Return: None
9113 */
9114void wma_log_completion_timeout(void *data)
9115{
9116 tp_wma_handle wma_handle;
9117
Yeshwanth Sriram Guntukacbe61442018-08-23 18:08:44 +05309118 WMA_LOGD("%s: Timeout occurred for log completion command", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009119
9120 wma_handle = (tp_wma_handle) data;
9121 if (!wma_handle)
9122 WMA_LOGE("%s: Invalid WMA handle", __func__);
9123
9124 /* Though we did not receive any event from FW,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07009125 * we can flush whatever logs we have with us
9126 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009127 cds_logging_set_fw_flush_complete();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009128}
9129
9130/**
Manishekar Chandrasekaranb82554d2016-08-04 17:46:46 +05309131 * wma_map_pcl_weights() - Map PCL weights
9132 * @pcl_weight: Internal PCL weights
9133 *
9134 * Maps the internal weights of PCL to the weights needed by FW
9135 *
9136 * Return: Mapped channel weight of type wmi_pcl_chan_weight
9137 */
9138static wmi_pcl_chan_weight wma_map_pcl_weights(uint32_t pcl_weight)
9139{
9140 switch (pcl_weight) {
9141 case WEIGHT_OF_GROUP1_PCL_CHANNELS:
9142 return WMI_PCL_WEIGHT_VERY_HIGH;
9143 case WEIGHT_OF_GROUP2_PCL_CHANNELS:
9144 return WMI_PCL_WEIGHT_HIGH;
9145 case WEIGHT_OF_GROUP3_PCL_CHANNELS:
9146 return WMI_PCL_WEIGHT_MEDIUM;
9147 case WEIGHT_OF_NON_PCL_CHANNELS:
9148 return WMI_PCL_WEIGHT_LOW;
9149 default:
9150 return WMI_PCL_WEIGHT_DISALLOW;
9151 }
9152}
9153
9154/**
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05309155 * wma_send_pdev_set_pcl_cmd() - Send WMI_SOC_SET_PCL_CMDID to FW
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009156 * @wma_handle: WMA handle
9157 * @msg: PCL structure containing the PCL and the number of channels
9158 *
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05309159 * WMI_PDEV_SET_PCL_CMDID provides a Preferred Channel List (PCL) to the WLAN
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009160 * firmware. The DBS Manager is the consumer of this information in the WLAN
9161 * firmware. The channel list will be used when a Virtual DEVice (VDEV) needs
9162 * to migrate to a new channel without host driver involvement. An example of
9163 * this behavior is Legacy Fast Roaming (LFR 3.0). Generally, the host will
9164 * manage the channel selection without firmware involvement.
9165 *
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05309166 * WMI_PDEV_SET_PCL_CMDID will carry only the weight list and not the actual
9167 * channel list. The weights corresponds to the channels sent in
9168 * WMI_SCAN_CHAN_LIST_CMDID. The channels from PCL would be having a higher
9169 * weightage compared to the non PCL channels.
9170 *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009171 * Return: Success if the cmd is sent successfully to the firmware
9172 */
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05309173QDF_STATUS wma_send_pdev_set_pcl_cmd(tp_wma_handle wma_handle,
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -07009174 struct set_pcl_req *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009175{
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05309176 uint32_t i;
9177 QDF_STATUS status;
9178
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009179 if (!wma_handle) {
9180 WMA_LOGE("%s: WMA handle is NULL. Cannot issue command",
9181 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309182 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009183 }
9184
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05309185 for (i = 0; i < wma_handle->saved_chan.num_channels; i++) {
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -07009186 msg->chan_weights.saved_chan_list[i] =
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05309187 wma_handle->saved_chan.channel_list[i];
9188 }
9189
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -07009190 msg->chan_weights.saved_num_chan = wma_handle->saved_chan.num_channels;
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07009191 status = policy_mgr_get_valid_chan_weights(wma_handle->psoc,
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -07009192 (struct policy_mgr_pcl_chan_weights *)&msg->chan_weights);
Manishekar Chandrasekaranb82554d2016-08-04 17:46:46 +05309193
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -07009194 for (i = 0; i < msg->chan_weights.saved_num_chan; i++) {
9195 msg->chan_weights.weighed_valid_list[i] =
9196 wma_map_pcl_weights(
9197 msg->chan_weights.weighed_valid_list[i]);
Sandeep Puligilla819d94f2017-10-10 18:33:56 -07009198 /* Dont allow roaming on 2G when 5G_ONLY configured */
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -07009199 if (((wma_handle->bandcapability == BAND_5G) ||
9200 (msg->band == BAND_5G)) &&
9201 (WLAN_REG_IS_24GHZ_CH(
9202 msg->chan_weights.saved_chan_list[i]))) {
9203 msg->chan_weights.weighed_valid_list[i] =
Sandeep Puligilla819d94f2017-10-10 18:33:56 -07009204 WEIGHT_OF_DISALLOWED_CHANNELS;
9205 }
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -07009206 if ((msg->band == BAND_2G) &&
9207 WLAN_REG_IS_5GHZ_CH(msg->chan_weights.saved_chan_list[i]))
9208 msg->chan_weights.weighed_valid_list[i] =
9209 WEIGHT_OF_DISALLOWED_CHANNELS;
Manishekar Chandrasekaranb82554d2016-08-04 17:46:46 +05309210 WMA_LOGD("%s: chan:%d weight[%d]=%d", __func__,
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -07009211 msg->chan_weights.saved_chan_list[i], i,
9212 msg->chan_weights.weighed_valid_list[i]);
Manishekar Chandrasekaranb82554d2016-08-04 17:46:46 +05309213 }
9214
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +05309215 if (!QDF_IS_STATUS_SUCCESS(status)) {
9216 WMA_LOGE("%s: Error in creating weighed pcl", __func__);
9217 return status;
9218 }
9219
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -07009220 if (wmi_unified_pdev_set_pcl_cmd(wma_handle->wmi_handle,
9221 &msg->chan_weights))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309222 return QDF_STATUS_E_FAILURE;
Govind Singhf25a0f12016-03-08 16:09:48 +05309223
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309224 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009225}
9226
9227/**
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05309228 * wma_send_pdev_set_hw_mode_cmd() - Send WMI_PDEV_SET_HW_MODE_CMDID to FW
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009229 * @wma_handle: WMA handle
9230 * @msg: Structure containing the following parameters
9231 *
9232 * - hw_mode_index: The HW_Mode field is a enumerated type that is selected
9233 * from the HW_Mode table, which is returned in the WMI_SERVICE_READY_EVENTID.
9234 *
9235 * Provides notification to the WLAN firmware that host driver is requesting a
9236 * HardWare (HW) Mode change. This command is needed to support iHelium in the
9237 * configurations that include the Dual Band Simultaneous (DBS) feature.
9238 *
9239 * Return: Success if the cmd is sent successfully to the firmware
9240 */
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05309241QDF_STATUS wma_send_pdev_set_hw_mode_cmd(tp_wma_handle wma_handle,
Dustin Brownec2c92e2017-07-26 11:13:49 -07009242 struct policy_mgr_hw_mode *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009243{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009244 struct sir_set_hw_mode_resp *param;
Tushnim Bhattacharyya86294892017-10-25 16:29:11 -07009245 struct wma_target_req *timeout_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009246
9247 if (!wma_handle) {
9248 WMA_LOGE("%s: WMA handle is NULL. Cannot issue command",
9249 __func__);
9250 /* Handle is NULL. Will not be able to send failure
9251 * response as well
9252 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309253 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009254 }
9255
9256 if (!msg) {
9257 WMA_LOGE("%s: Set HW mode param is NULL", __func__);
9258 /* Lets try to free the active command list */
9259 goto fail;
9260 }
9261
Dustin Brownec2c92e2017-07-26 11:13:49 -07009262 wma_acquire_wakelock(&wma_handle->wmi_cmd_rsp_wake_lock,
9263 WMA_VDEV_HW_MODE_REQUEST_TIMEOUT);
Govind Singhf25a0f12016-03-08 16:09:48 +05309264 if (wmi_unified_soc_set_hw_mode_cmd(wma_handle->wmi_handle,
Dustin Brownec2c92e2017-07-26 11:13:49 -07009265 msg->hw_mode_index)) {
9266 wma_release_wakelock(&wma_handle->wmi_cmd_rsp_wake_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009267 goto fail;
Krunal Sonicebcc292017-06-14 19:59:20 -07009268 }
Tushnim Bhattacharyya86294892017-10-25 16:29:11 -07009269 timeout_msg = wma_fill_hold_req(wma_handle, 0,
9270 SIR_HAL_PDEV_SET_HW_MODE,
9271 WMA_PDEV_SET_HW_MODE_RESP, NULL,
9272 WMA_VDEV_HW_MODE_REQUEST_TIMEOUT - 1);
9273 if (!timeout_msg) {
9274 WMA_LOGE("Failed to allocate request for SIR_HAL_PDEV_SET_HW_MODE");
9275 wma_remove_req(wma_handle, 0, WMA_PDEV_SET_HW_MODE_RESP);
9276 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009277
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309278 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009279fail:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309280 param = qdf_mem_malloc(sizeof(*param));
Arif Hussain157263f2018-10-03 13:07:15 -07009281 if (!param)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309282 return QDF_STATUS_E_NULL_VALUE;
Arif Hussain157263f2018-10-03 13:07:15 -07009283
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009284 param->status = SET_HW_MODE_STATUS_ECANCELED;
9285 param->cfgd_hw_mode_index = 0;
9286 param->num_vdev_mac_entries = 0;
9287 WMA_LOGE("%s: Sending HW mode fail response to LIM", __func__);
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +05309288 wma_send_msg(wma_handle, SIR_HAL_PDEV_SET_HW_MODE_RESP,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009289 (void *) param, 0);
Abhishek Singhd93a0b22018-10-30 17:04:56 +05309290 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009291}
9292
9293/**
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05309294 * wma_send_pdev_set_dual_mac_config() - Set dual mac config to FW
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009295 * @wma_handle: WMA handle
9296 * @msg: Dual MAC config parameters
9297 *
9298 * Configures WLAN firmware with the dual MAC features
9299 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309300 * Return: QDF_STATUS. 0 on success.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009301 */
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05309302QDF_STATUS wma_send_pdev_set_dual_mac_config(tp_wma_handle wma_handle,
Srinivas Girigowdaeb6ecf32018-02-15 17:04:22 -08009303 struct policy_mgr_dual_mac_config *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009304{
Manishekar Chandrasekaran91152df2016-04-25 14:29:27 +05309305 QDF_STATUS status;
Abhishek Singhd93a0b22018-10-30 17:04:56 +05309306 struct wma_target_req *req_msg;
9307 struct sir_dual_mac_config_resp *resp;
Manishekar Chandrasekaran91152df2016-04-25 14:29:27 +05309308
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009309 if (!wma_handle) {
9310 WMA_LOGE("%s: WMA handle is NULL. Cannot issue command",
9311 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309312 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009313 }
9314
9315 if (!msg) {
9316 WMA_LOGE("%s: Set dual mode config is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309317 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009318 }
9319
Krunal Sonia5ccb802017-07-03 12:59:40 -07009320 /*
9321 * aquire the wake lock here and release it in response handler function
9322 * In error condition, release the wake lock right away
9323 */
9324 wma_acquire_wakelock(&wma_handle->wmi_cmd_rsp_wake_lock,
Abhishek Singhd1f21c72019-01-21 15:16:34 +05309325 WMA_VDEV_PLCY_MGR_WAKE_LOCK_TIMEOUT);
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05309326 status = wmi_unified_pdev_set_dual_mac_config_cmd(
9327 wma_handle->wmi_handle,
Srinivas Girigowdaeb6ecf32018-02-15 17:04:22 -08009328 (struct policy_mgr_dual_mac_config *)msg);
Manishekar Chandrasekaran91152df2016-04-25 14:29:27 +05309329 if (QDF_IS_STATUS_ERROR(status)) {
Manishekar Chandrasekaran5d46f702016-04-27 12:50:52 +05309330 WMA_LOGE("%s: Failed to send WMI_PDEV_SET_DUAL_MAC_CONFIG_CMDID: %d",
Manishekar Chandrasekaran91152df2016-04-25 14:29:27 +05309331 __func__, status);
Krunal Sonia5ccb802017-07-03 12:59:40 -07009332 wma_release_wakelock(&wma_handle->wmi_cmd_rsp_wake_lock);
Abhishek Singhd93a0b22018-10-30 17:04:56 +05309333 goto fail;
Manishekar Chandrasekaran91152df2016-04-25 14:29:27 +05309334 }
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07009335 policy_mgr_update_dbs_req_config(wma_handle->psoc,
9336 msg->scan_config, msg->fw_mode_config);
Govind Singhf25a0f12016-03-08 16:09:48 +05309337
Abhishek Singhd93a0b22018-10-30 17:04:56 +05309338 req_msg = wma_fill_hold_req(wma_handle, 0,
9339 SIR_HAL_PDEV_DUAL_MAC_CFG_REQ,
9340 WMA_PDEV_MAC_CFG_RESP, NULL,
9341 WMA_VDEV_DUAL_MAC_CFG_TIMEOUT);
9342 if (!req_msg) {
9343 WMA_LOGE("Failed to allocate request for SIR_HAL_PDEV_DUAL_MAC_CFG_REQ");
9344 wma_remove_req(wma_handle, 0, WMA_PDEV_MAC_CFG_RESP);
9345 }
9346
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309347 return QDF_STATUS_SUCCESS;
Abhishek Singhd93a0b22018-10-30 17:04:56 +05309348
9349fail:
9350 resp = qdf_mem_malloc(sizeof(*resp));
9351 if (!resp)
9352 return QDF_STATUS_E_NULL_VALUE;
9353
9354 resp->status = SET_HW_MODE_STATUS_ECANCELED;
9355 WMA_LOGE("%s: Sending failure response to LIM", __func__);
9356 wma_send_msg(wma_handle, SIR_HAL_PDEV_MAC_CFG_RESP, (void *) resp, 0);
9357 return QDF_STATUS_E_FAILURE;
9358
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009359}
9360
9361/**
Archana Ramachandrana20ef812015-11-13 16:12:13 -08009362 * wma_send_pdev_set_antenna_mode() - Set antenna mode to FW
9363 * @wma_handle: WMA handle
9364 * @msg: Antenna mode parameters
9365 *
9366 * Send WMI_PDEV_SET_ANTENNA_MODE_CMDID to FW requesting to
9367 * modify the number of TX/RX chains from host
9368 *
9369 * Return: QDF_STATUS. 0 on success.
9370 */
9371QDF_STATUS wma_send_pdev_set_antenna_mode(tp_wma_handle wma_handle,
9372 struct sir_antenna_mode_param *msg)
9373{
9374 wmi_pdev_set_antenna_mode_cmd_fixed_param *cmd;
9375 wmi_buf_t buf;
9376 uint32_t len;
9377 QDF_STATUS status = QDF_STATUS_SUCCESS;
9378 struct sir_antenna_mode_resp *param;
9379
9380 if (!wma_handle) {
9381 WMA_LOGE("%s: WMA handle is NULL. Cannot issue command",
9382 __func__);
9383 return QDF_STATUS_E_NULL_VALUE;
9384 }
9385
9386 if (!msg) {
9387 WMA_LOGE("%s: Set antenna mode param is NULL", __func__);
9388 return QDF_STATUS_E_NULL_VALUE;
9389 }
9390
9391 len = sizeof(*cmd);
9392
9393 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
9394 if (!buf) {
Archana Ramachandrana20ef812015-11-13 16:12:13 -08009395 status = QDF_STATUS_E_NOMEM;
9396 goto resp;
9397 }
9398
9399 cmd = (wmi_pdev_set_antenna_mode_cmd_fixed_param *) wmi_buf_data(buf);
9400 WMITLV_SET_HDR(&cmd->tlv_header,
9401 WMITLV_TAG_STRUC_wmi_pdev_set_antenna_mode_cmd_fixed_param,
9402 WMITLV_GET_STRUCT_TLVLEN(
9403 wmi_pdev_set_antenna_mode_cmd_fixed_param));
9404
9405 cmd->pdev_id = WMI_PDEV_ID_SOC;
9406 /* Bits 0-15 is num of RX chains 16-31 is num of TX chains */
9407 cmd->num_txrx_chains = msg->num_rx_chains;
9408 cmd->num_txrx_chains |= (msg->num_tx_chains << 16);
9409
Srinivas Girigowda3ad735a2017-03-20 09:26:17 -07009410 WMA_LOGD("%s: Num of chains TX: %d RX: %d txrx_chains: 0x%x",
Archana Ramachandrana20ef812015-11-13 16:12:13 -08009411 __func__, msg->num_tx_chains,
9412 msg->num_rx_chains, cmd->num_txrx_chains);
9413
9414 if (wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
9415 WMI_PDEV_SET_ANTENNA_MODE_CMDID)) {
Archana Ramachandrana20ef812015-11-13 16:12:13 -08009416 wmi_buf_free(buf);
9417 status = QDF_STATUS_E_FAILURE;
9418 goto resp;
9419 }
9420 status = QDF_STATUS_SUCCESS;
9421
9422resp:
9423 param = qdf_mem_malloc(sizeof(*param));
Arif Hussain157263f2018-10-03 13:07:15 -07009424 if (!param)
Archana Ramachandrana20ef812015-11-13 16:12:13 -08009425 return QDF_STATUS_E_NOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07009426
Archana Ramachandrana20ef812015-11-13 16:12:13 -08009427 param->status = (status) ?
9428 SET_ANTENNA_MODE_STATUS_ECANCELED :
9429 SET_ANTENNA_MODE_STATUS_OK;
9430 WMA_LOGE("%s: Send antenna mode resp to LIM status: %d",
9431 __func__, param->status);
9432 wma_send_msg(wma_handle, SIR_HAL_SOC_ANTENNA_MODE_RESP,
9433 (void *) param, 0);
9434 return status;
9435}
9436
9437/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009438 * wma_crash_inject() - sends command to FW to simulate crash
9439 * @wma_handle: pointer of WMA context
9440 * @type: subtype of the command
9441 * @delay_time_ms: time in milliseconds for FW to delay the crash
9442 *
9443 * This function will send a command to FW in order to simulate different
9444 * kinds of FW crashes.
9445 *
Govind Singhd76a5b02016-03-08 15:12:14 +05309446 * Return: QDF_STATUS_SUCCESS for success or error code
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009447 */
Yu Wang46082dc2017-09-19 12:25:38 +08009448QDF_STATUS wma_crash_inject(WMA_HANDLE wma_handle, uint32_t type,
9449 uint32_t delay_time_ms)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009450{
Govind Singhd76a5b02016-03-08 15:12:14 +05309451 struct crash_inject param;
Yu Wang46082dc2017-09-19 12:25:38 +08009452 tp_wma_handle wma = (tp_wma_handle)wma_handle;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07009453
Govind Singhd76a5b02016-03-08 15:12:14 +05309454 param.type = type;
9455 param.delay_time_ms = delay_time_ms;
Yu Wang46082dc2017-09-19 12:25:38 +08009456 return wmi_crash_inject(wma->wmi_handle, &param);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009457}
Govind Singhd76a5b02016-03-08 15:12:14 +05309458
Manjunathappa Prakash7b0ad462018-04-15 00:37:16 -07009459#ifdef RECEIVE_OFFLOAD
Dhanashri Atre09828f12016-11-13 10:36:58 -08009460int wma_lro_init(struct cdp_lro_hash_config *lro_config)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009461{
Rajeev Kumarb60abe42017-01-21 15:39:31 -08009462 struct scheduler_msg msg = {0};
Dhanashri Atre09828f12016-11-13 10:36:58 -08009463 struct cdp_lro_hash_config *iwcmd;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009464
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309465 iwcmd = qdf_mem_malloc(sizeof(*iwcmd));
Arif Hussain157263f2018-10-03 13:07:15 -07009466 if (!iwcmd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009467 return -ENOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009468
9469 *iwcmd = *lro_config;
9470
9471 msg.type = WMA_LRO_CONFIG_CMD;
9472 msg.reserved = 0;
9473 msg.bodyptr = iwcmd;
9474
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309475 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia00861f02018-08-28 19:16:12 +05309476 scheduler_post_message(QDF_MODULE_ID_WMA,
9477 QDF_MODULE_ID_WMA,
9478 QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309479 qdf_mem_free(iwcmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009480 return -EAGAIN;
9481 }
9482
9483 WMA_LOGD("sending the LRO configuration to the fw");
9484 return 0;
9485}
9486#endif
Leo Chang96464902016-10-28 11:10:54 -07009487
Ashish Kumar Dhanotiyab28338c2017-07-21 20:12:34 +05309488QDF_STATUS wma_configure_smps_params(uint32_t vdev_id, uint32_t param_id,
9489 uint32_t param_val)
9490{
9491 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
9492 int smps_cmd_value;
9493 int status = QDF_STATUS_E_INVAL;
9494
9495 if (!wma) {
9496 WMA_LOGE("%s: Failed to get wma", __func__);
9497 return status;
9498 }
9499
9500 smps_cmd_value = param_id << WMI_SMPS_PARAM_VALUE_S;
9501 smps_cmd_value = smps_cmd_value | param_val;
9502
9503 status = wma_set_smps_params(wma, vdev_id, smps_cmd_value);
9504 if (status)
9505 WMA_LOGE("Failed to set SMPS Param");
9506
9507 return status;
9508}
9509
Leo Chang96464902016-10-28 11:10:54 -07009510
Nachiket Kukadeaaf8a712017-07-27 19:15:36 +05309511/**
9512 * wma_config_bmiss_bcnt_params() - set bmiss config parameters
9513 * @vdev_id: virtual device for the command
9514 * @first_cnt: bmiss first value
9515 * @final_cnt: bmiss final value
9516 *
9517 * Return: QDF_STATUS_SUCCESS or non-zero on failure
9518 */
9519QDF_STATUS wma_config_bmiss_bcnt_params(uint32_t vdev_id, uint32_t first_cnt,
9520 uint32_t final_cnt)
9521{
9522 tp_wma_handle wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
9523 int status = QDF_STATUS_E_INVAL;
9524
9525 if (!wma_handle) {
9526 WMA_LOGE("%s: Failed to get wma", __func__);
9527 return status;
9528 }
9529
9530 status = wma_roam_scan_bmiss_cnt(wma_handle, first_cnt, final_cnt,
9531 vdev_id);
9532
9533 if (status)
9534 WMA_LOGE("Failed to set Bmiss Param");
9535
9536 return status;
9537}
9538