xref: /wlan-driver/qcacld-3.0/core/wma/src/wma_main.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2013-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name /**
21*5113495bSYour Name  *  DOC:  wma_main.c
22*5113495bSYour Name  *
23*5113495bSYour Name  *  This file contains wma initialization and FW exchange
24*5113495bSYour Name  *  related functions.
25*5113495bSYour Name  */
26*5113495bSYour Name 
27*5113495bSYour Name /* Header files */
28*5113495bSYour Name 
29*5113495bSYour Name #include "wma.h"
30*5113495bSYour Name #include "wma_api.h"
31*5113495bSYour Name #include "cds_api.h"
32*5113495bSYour Name #include "wmi_unified_api.h"
33*5113495bSYour Name #include "wlan_qct_sys.h"
34*5113495bSYour Name #include "wni_api.h"
35*5113495bSYour Name #include "ani_global.h"
36*5113495bSYour Name #include "wmi_unified.h"
37*5113495bSYour Name #include "wni_cfg.h"
38*5113495bSYour Name #if defined(CONFIG_HL_SUPPORT)
39*5113495bSYour Name #include "wlan_tgt_def_config_hl.h"
40*5113495bSYour Name #else
41*5113495bSYour Name #include "wlan_tgt_def_config.h"
42*5113495bSYour Name #endif
43*5113495bSYour Name #include "qdf_nbuf.h"
44*5113495bSYour Name #include "qdf_types.h"
45*5113495bSYour Name #include "qdf_mem.h"
46*5113495bSYour Name #include "wma_types.h"
47*5113495bSYour Name #include "lim_api.h"
48*5113495bSYour Name #include "lim_session_utils.h"
49*5113495bSYour Name #include "wlan_cm_tgt_if_tx_api.h"
50*5113495bSYour Name #include "wlan_cm_roam_api.h"
51*5113495bSYour Name 
52*5113495bSYour Name #include "cds_utils.h"
53*5113495bSYour Name 
54*5113495bSYour Name #if !defined(REMOVE_PKT_LOG)
55*5113495bSYour Name #include "pktlog_ac.h"
56*5113495bSYour Name #endif /* REMOVE_PKT_LOG */
57*5113495bSYour Name 
58*5113495bSYour Name #include "dbglog_host.h"
59*5113495bSYour Name #include "csr_api.h"
60*5113495bSYour Name #include "ol_fw.h"
61*5113495bSYour Name 
62*5113495bSYour Name #include "wma_internal.h"
63*5113495bSYour Name 
64*5113495bSYour Name #include "wma_ocb.h"
65*5113495bSYour Name #include "wlan_policy_mgr_api.h"
66*5113495bSYour Name #include "cdp_txrx_cfg.h"
67*5113495bSYour Name #include "cdp_txrx_flow_ctrl_legacy.h"
68*5113495bSYour Name #include "cdp_txrx_flow_ctrl_v2.h"
69*5113495bSYour Name #include "cdp_txrx_ipa.h"
70*5113495bSYour Name #include "cdp_txrx_misc.h"
71*5113495bSYour Name #include "wma_fips_api.h"
72*5113495bSYour Name #include "wma_nan_datapath.h"
73*5113495bSYour Name #include "wma_fw_state.h"
74*5113495bSYour Name #include "wlan_lmac_if_def.h"
75*5113495bSYour Name #include "wlan_lmac_if_api.h"
76*5113495bSYour Name #include "target_if.h"
77*5113495bSYour Name #include "target_if_scan.h"
78*5113495bSYour Name #include "wlan_global_lmac_if_api.h"
79*5113495bSYour Name #include "target_if_pmo.h"
80*5113495bSYour Name #include "wma_he.h"
81*5113495bSYour Name #include "wlan_pmo_obj_mgmt_api.h"
82*5113495bSYour Name 
83*5113495bSYour Name #include "wlan_reg_tgt_api.h"
84*5113495bSYour Name #include "wlan_reg_services_api.h"
85*5113495bSYour Name #include <cdp_txrx_handle.h>
86*5113495bSYour Name #include <wlan_pmo_ucfg_api.h>
87*5113495bSYour Name #include "wifi_pos_api.h"
88*5113495bSYour Name #include "hif_main.h"
89*5113495bSYour Name #ifdef WLAN_CONV_SPECTRAL_ENABLE
90*5113495bSYour Name #include <target_if_spectral.h>
91*5113495bSYour Name #include <wlan_spectral_utils_api.h>
92*5113495bSYour Name #endif
93*5113495bSYour Name #include "init_event_handler.h"
94*5113495bSYour Name #include "init_deinit_lmac.h"
95*5113495bSYour Name #include "target_if_green_ap.h"
96*5113495bSYour Name #include "service_ready_param.h"
97*5113495bSYour Name #include "wlan_cp_stats_mc_ucfg_api.h"
98*5113495bSYour Name #include "cfg_nan_api.h"
99*5113495bSYour Name #include "wlan_mlme_api.h"
100*5113495bSYour Name #include "wlan_mlme_ucfg_api.h"
101*5113495bSYour Name #include "cfg_ucfg_api.h"
102*5113495bSYour Name #include "init_cmd_api.h"
103*5113495bSYour Name #include "nan_ucfg_api.h"
104*5113495bSYour Name #include "wma_coex.h"
105*5113495bSYour Name #include "wma_twt.h"
106*5113495bSYour Name #include "target_if_vdev_mgr_rx_ops.h"
107*5113495bSYour Name #include "wlan_tdls_cfg_api.h"
108*5113495bSYour Name #include "wlan_policy_mgr_i.h"
109*5113495bSYour Name #include "target_if_psoc_timer_tx_ops.h"
110*5113495bSYour Name #include <ftm_time_sync_ucfg_api.h>
111*5113495bSYour Name #include "wlan_ipa_ucfg_api.h"
112*5113495bSYour Name #include "wma_eht.h"
113*5113495bSYour Name 
114*5113495bSYour Name #ifdef DIRECT_BUF_RX_ENABLE
115*5113495bSYour Name #include <target_if_direct_buf_rx_api.h>
116*5113495bSYour Name #endif
117*5113495bSYour Name 
118*5113495bSYour Name #include "wlan_pkt_capture_ucfg_api.h"
119*5113495bSYour Name #include "target_if_cm_roam_event.h"
120*5113495bSYour Name #include "wlan_fwol_ucfg_api.h"
121*5113495bSYour Name #include "wlan_tdls_api.h"
122*5113495bSYour Name #include "wlan_twt_cfg_ext_api.h"
123*5113495bSYour Name #include "wlan_mlo_mgr_sta.h"
124*5113495bSYour Name #include "wlan_dp_api.h"
125*5113495bSYour Name #include "wlan_dp_ucfg_api.h"
126*5113495bSYour Name 
127*5113495bSYour Name #define WMA_LOG_COMPLETION_TIMER 500 /* 500 msecs */
128*5113495bSYour Name #define WMI_TLV_HEADROOM 128
129*5113495bSYour Name 
130*5113495bSYour Name static uint32_t g_fw_wlan_feat_caps;
131*5113495bSYour Name /**
132*5113495bSYour Name  * wma_get_fw_wlan_feat_caps() - get fw feature capability
133*5113495bSYour Name  * @feature: feature enum value
134*5113495bSYour Name  *
135*5113495bSYour Name  * Return: true/false
136*5113495bSYour Name  */
wma_get_fw_wlan_feat_caps(enum cap_bitmap feature)137*5113495bSYour Name bool wma_get_fw_wlan_feat_caps(enum cap_bitmap feature)
138*5113495bSYour Name {
139*5113495bSYour Name 	return (g_fw_wlan_feat_caps & (1 << feature)) ? true : false;
140*5113495bSYour Name }
141*5113495bSYour Name 
142*5113495bSYour Name /**
143*5113495bSYour Name  * wma_set_fw_wlan_feat_caps() - set fw feature capability
144*5113495bSYour Name  * @feature: feature enum value
145*5113495bSYour Name  *
146*5113495bSYour Name  * Return: None
147*5113495bSYour Name  */
wma_set_fw_wlan_feat_caps(enum cap_bitmap feature)148*5113495bSYour Name void wma_set_fw_wlan_feat_caps(enum cap_bitmap feature)
149*5113495bSYour Name {
150*5113495bSYour Name 	g_fw_wlan_feat_caps |= (1 << feature);
151*5113495bSYour Name }
152*5113495bSYour Name 
153*5113495bSYour Name /**
154*5113495bSYour Name  * wma_service_ready_ext_evt_timeout() - Service ready extended event timeout
155*5113495bSYour Name  * @data: Timeout handler data
156*5113495bSYour Name  *
157*5113495bSYour Name  * This function is called when the FW fails to send WMI_SERVICE_READY_EXT_EVENT
158*5113495bSYour Name  * message
159*5113495bSYour Name  *
160*5113495bSYour Name  * Return: None
161*5113495bSYour Name  */
wma_service_ready_ext_evt_timeout(void * data)162*5113495bSYour Name static void wma_service_ready_ext_evt_timeout(void *data)
163*5113495bSYour Name {
164*5113495bSYour Name 	wma_alert("Timeout waiting for WMI_SERVICE_READY_EXT_EVENT");
165*5113495bSYour Name 
166*5113495bSYour Name 	/* Assert here. Panic is being called in insmod thread */
167*5113495bSYour Name 	QDF_ASSERT(0);
168*5113495bSYour Name }
169*5113495bSYour Name 
170*5113495bSYour Name /**
171*5113495bSYour Name  * wma_get_ini_handle() - API to get WMA ini info handle
172*5113495bSYour Name  * @wma: WMA Handle
173*5113495bSYour Name  *
174*5113495bSYour Name  * Returns the pointer to WMA ini structure.
175*5113495bSYour Name  * Return: struct wma_ini_config
176*5113495bSYour Name  */
wma_get_ini_handle(tp_wma_handle wma)177*5113495bSYour Name struct wma_ini_config *wma_get_ini_handle(tp_wma_handle wma)
178*5113495bSYour Name {
179*5113495bSYour Name 	if (wma_validate_handle(wma))
180*5113495bSYour Name 		return NULL;
181*5113495bSYour Name 
182*5113495bSYour Name 	return &wma->ini_config;
183*5113495bSYour Name }
184*5113495bSYour Name 
__wma_validate_handle(tp_wma_handle wma_handle,const char * func)185*5113495bSYour Name int __wma_validate_handle(tp_wma_handle wma_handle, const char *func)
186*5113495bSYour Name {
187*5113495bSYour Name 	if (!wma_handle) {
188*5113495bSYour Name 		wma_err("Invalid WMA handle (via %s)", func);
189*5113495bSYour Name 		return -EINVAL;
190*5113495bSYour Name 	}
191*5113495bSYour Name 
192*5113495bSYour Name 	return 0;
193*5113495bSYour Name }
194*5113495bSYour Name 
195*5113495bSYour Name #define MAX_SUPPORTED_PEERS_REV1_1 14
196*5113495bSYour Name #define MAX_SUPPORTED_PEERS_REV1_3 32
197*5113495bSYour Name #ifdef WLAN_MAX_CLIENTS_ALLOWED
198*5113495bSYour Name #define MAX_SUPPORTED_PEERS WLAN_MAX_CLIENTS_ALLOWED
199*5113495bSYour Name #else
200*5113495bSYour Name #define MAX_SUPPORTED_PEERS 32
201*5113495bSYour Name #endif
202*5113495bSYour Name #define MIN_NO_OF_PEERS 1
203*5113495bSYour Name 
204*5113495bSYour Name /**
205*5113495bSYour Name  * wma_get_number_of_peers_supported - API to query for number of peers
206*5113495bSYour Name  * supported
207*5113495bSYour Name  * @wma: WMA Handle
208*5113495bSYour Name  *
209*5113495bSYour Name  * Return: Max Number of Peers Supported
210*5113495bSYour Name  */
wma_get_number_of_peers_supported(tp_wma_handle wma)211*5113495bSYour Name static uint8_t wma_get_number_of_peers_supported(tp_wma_handle wma)
212*5113495bSYour Name {
213*5113495bSYour Name 	struct wma_ini_config *cfg = wma_get_ini_handle(wma);
214*5113495bSYour Name 	uint8_t max_no_of_peers = cfg ? cfg->max_no_of_peers : MIN_NO_OF_PEERS;
215*5113495bSYour Name 
216*5113495bSYour Name 	return max_no_of_peers;
217*5113495bSYour Name }
218*5113495bSYour Name 
219*5113495bSYour Name /**
220*5113495bSYour Name  * wma_get_number_of_tids_supported - API to query for number of tids supported
221*5113495bSYour Name  * @no_of_peers_supported: Number of peer supported
222*5113495bSYour Name  * @no_vdevs: Number of vdevs
223*5113495bSYour Name  *
224*5113495bSYour Name  * Return: Max number of tids supported
225*5113495bSYour Name  */
226*5113495bSYour Name #if defined(CONFIG_HL_SUPPORT)
wma_get_number_of_tids_supported(uint8_t no_of_peers_supported,uint8_t num_vdevs)227*5113495bSYour Name static uint32_t wma_get_number_of_tids_supported(uint8_t no_of_peers_supported,
228*5113495bSYour Name 						 uint8_t num_vdevs)
229*5113495bSYour Name {
230*5113495bSYour Name 	return 4 * no_of_peers_supported;
231*5113495bSYour Name }
232*5113495bSYour Name #else
wma_get_number_of_tids_supported(uint8_t no_of_peers_supported,uint8_t num_vdevs)233*5113495bSYour Name static uint32_t wma_get_number_of_tids_supported(uint8_t no_of_peers_supported,
234*5113495bSYour Name 						 uint8_t num_vdevs)
235*5113495bSYour Name {
236*5113495bSYour Name 	return 2 * (no_of_peers_supported + num_vdevs + 2);
237*5113495bSYour Name }
238*5113495bSYour Name #endif
239*5113495bSYour Name 
240*5113495bSYour Name #if (defined(IPA_DISABLE_OVERRIDE)) && (!defined(IPA_OFFLOAD))
wma_set_ipa_disable_config(target_resource_config * tgt_cfg)241*5113495bSYour Name static void wma_set_ipa_disable_config(
242*5113495bSYour Name 					target_resource_config *tgt_cfg)
243*5113495bSYour Name {
244*5113495bSYour Name 	tgt_cfg->ipa_disable = true;
245*5113495bSYour Name }
246*5113495bSYour Name #else
wma_set_ipa_disable_config(target_resource_config * tgt_cfg)247*5113495bSYour Name static void wma_set_ipa_disable_config(
248*5113495bSYour Name 					target_resource_config *tgt_cfg)
249*5113495bSYour Name {
250*5113495bSYour Name 	tgt_cfg->ipa_disable = ucfg_ipa_is_enabled() ? false : true;
251*5113495bSYour Name }
252*5113495bSYour Name #endif
253*5113495bSYour Name 
254*5113495bSYour Name #ifndef NUM_OF_ADDITIONAL_FW_PEERS
255*5113495bSYour Name #define NUM_OF_ADDITIONAL_FW_PEERS	2
256*5113495bSYour Name #endif
257*5113495bSYour Name 
258*5113495bSYour Name /**
259*5113495bSYour Name  * wma_update_num_peers_tids() - Update num_peers and tids based on num_vdevs
260*5113495bSYour Name  * @wma_handle: wma handle
261*5113495bSYour Name  * @tgt_cfg: Resource config given to target
262*5113495bSYour Name  *
263*5113495bSYour Name  * Get num_vdevs from tgt_cfg and update num_peers and tids based on it.
264*5113495bSYour Name  *
265*5113495bSYour Name  * Return: none
266*5113495bSYour Name  */
wma_update_num_peers_tids(t_wma_handle * wma_handle,target_resource_config * tgt_cfg)267*5113495bSYour Name static void wma_update_num_peers_tids(t_wma_handle *wma_handle,
268*5113495bSYour Name 				      target_resource_config *tgt_cfg)
269*5113495bSYour Name 
270*5113495bSYour Name {
271*5113495bSYour Name 	uint8_t no_of_peers_supported;
272*5113495bSYour Name 
273*5113495bSYour Name 	no_of_peers_supported = wma_get_number_of_peers_supported(wma_handle);
274*5113495bSYour Name 
275*5113495bSYour Name 	tgt_cfg->num_peers = no_of_peers_supported + tgt_cfg->num_vdevs +
276*5113495bSYour Name 				NUM_OF_ADDITIONAL_FW_PEERS;
277*5113495bSYour Name 	/* The current firmware implementation requires the number of
278*5113495bSYour Name 	 * offload peers should be (number of vdevs + 1).
279*5113495bSYour Name 	 */
280*5113495bSYour Name 	tgt_cfg->num_tids =
281*5113495bSYour Name 		wma_get_number_of_tids_supported(no_of_peers_supported,
282*5113495bSYour Name 						 tgt_cfg->num_vdevs);
283*5113495bSYour Name }
284*5113495bSYour Name 
285*5113495bSYour Name #ifdef FEATURE_WDS
286*5113495bSYour Name /**
287*5113495bSYour Name  * wma_set_peer_map_unmap_v2_config() - Update peer_map_unmap_v2
288*5113495bSYour Name  * @psoc: Object manager psoc
289*5113495bSYour Name  * @tgt_cfg: Resource config given to target
290*5113495bSYour Name  *
291*5113495bSYour Name  * This function enables Peer map/unmap v2 feature.
292*5113495bSYour Name  *
293*5113495bSYour Name  * Return: none
294*5113495bSYour Name  */
wma_set_peer_map_unmap_v2_config(struct wlan_objmgr_psoc * psoc,target_resource_config * tgt_cfg)295*5113495bSYour Name static void wma_set_peer_map_unmap_v2_config(struct wlan_objmgr_psoc *psoc,
296*5113495bSYour Name 					     target_resource_config *tgt_cfg)
297*5113495bSYour Name {
298*5113495bSYour Name 	tgt_cfg->peer_map_unmap_v2 =
299*5113495bSYour Name 			wlan_mlme_get_wds_mode(psoc) ? true : false;
300*5113495bSYour Name }
301*5113495bSYour Name #else
wma_set_peer_map_unmap_v2_config(struct wlan_objmgr_psoc * psoc,target_resource_config * tgt_cfg)302*5113495bSYour Name static void wma_set_peer_map_unmap_v2_config(struct wlan_objmgr_psoc *psoc,
303*5113495bSYour Name 					     target_resource_config *tgt_cfg)
304*5113495bSYour Name {
305*5113495bSYour Name 	tgt_cfg->peer_map_unmap_v2 = false;
306*5113495bSYour Name }
307*5113495bSYour Name #endif
308*5113495bSYour Name 
309*5113495bSYour Name #ifdef FEATURE_SET
310*5113495bSYour Name /**
311*5113495bSYour Name  * wma_get_concurrency_support() - Get concurrency support
312*5113495bSYour Name  * @psoc: Object manager psoc
313*5113495bSYour Name  *
314*5113495bSYour Name  * Return: WMI_HOST_BAND_CONCURRENCY
315*5113495bSYour Name  */
316*5113495bSYour Name static WMI_HOST_BAND_CONCURRENCY
wma_get_concurrency_support(struct wlan_objmgr_psoc * psoc)317*5113495bSYour Name wma_get_concurrency_support(struct wlan_objmgr_psoc *psoc)
318*5113495bSYour Name {
319*5113495bSYour Name 	bool is_sbs_enabled = false;
320*5113495bSYour Name 
321*5113495bSYour Name 	if (policy_mgr_is_dual_mac_disabled_in_ini(psoc))
322*5113495bSYour Name 		return WMI_HOST_BAND_CONCURRENCY_NONE;
323*5113495bSYour Name 
324*5113495bSYour Name 	policy_mgr_get_sbs_cfg(psoc, &is_sbs_enabled);
325*5113495bSYour Name 
326*5113495bSYour Name 	if (is_sbs_enabled)
327*5113495bSYour Name 		return WMI_HOST_BAND_CONCURRENCY_DBS_SBS;
328*5113495bSYour Name 	else
329*5113495bSYour Name 		return WMI_HOST_BAND_CONCURRENCY_DBS;
330*5113495bSYour Name }
331*5113495bSYour Name 
332*5113495bSYour Name /**
333*5113495bSYour Name  * wma_update_set_feature_version() - Update the set feature version
334*5113495bSYour Name  *
335*5113495bSYour Name  * @fs: Feature set structure in which version needs to be updated.
336*5113495bSYour Name  *
337*5113495bSYour Name  * Version 1 - Base feature version
338*5113495bSYour Name  * Version 2 - WMI_HOST_VENDOR1_REQ1_VERSION_3_30 updated.
339*5113495bSYour Name  * Version 3 - min sleep period for TWT and Scheduled PM in FW updated
340*5113495bSYour Name  * Version 4 - WMI_HOST_VENDOR1_REQ1_VERSION_3_40 updated.
341*5113495bSYour Name  * Version 5 - INI based 11BE support updated
342*5113495bSYour Name  * Version 6 - sta dump info updated
343*5113495bSYour Name  *
344*5113495bSYour Name  * Return: None
345*5113495bSYour Name  */
wma_update_set_feature_version(struct target_feature_set * fs)346*5113495bSYour Name static void wma_update_set_feature_version(struct target_feature_set *fs)
347*5113495bSYour Name {
348*5113495bSYour Name 	fs->feature_set_version = 6;
349*5113495bSYour Name }
350*5113495bSYour Name 
351*5113495bSYour Name /**
352*5113495bSYour Name  * wma_set_feature_set_info() - Set feature set info
353*5113495bSYour Name  * @wma_handle: WMA handle
354*5113495bSYour Name  * @feature_set: Feature set structure which needs to be filled
355*5113495bSYour Name  *
356*5113495bSYour Name  * Return: WMI_HOST_BAND_CONCURRENCY
357*5113495bSYour Name  */
wma_set_feature_set_info(tp_wma_handle wma_handle,struct target_feature_set * feature_set)358*5113495bSYour Name static void wma_set_feature_set_info(tp_wma_handle wma_handle,
359*5113495bSYour Name 				     struct target_feature_set *feature_set)
360*5113495bSYour Name {
361*5113495bSYour Name 	struct cds_context *cds_ctx =
362*5113495bSYour Name 		(struct cds_context *)(wma_handle->cds_context);
363*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
364*5113495bSYour Name 	struct wlan_scan_features scan_feature_set = {0};
365*5113495bSYour Name 	struct wlan_twt_features twt_feature_set = {0};
366*5113495bSYour Name 	struct wlan_mlme_features mlme_feature_set = {0};
367*5113495bSYour Name 	struct wlan_tdls_features tdls_feature_set = {0};
368*5113495bSYour Name 
369*5113495bSYour Name 	psoc = wma_handle->psoc;
370*5113495bSYour Name 	if (!psoc) {
371*5113495bSYour Name 		wma_err("Invalid psoc");
372*5113495bSYour Name 		return;
373*5113495bSYour Name 	}
374*5113495bSYour Name 
375*5113495bSYour Name 	if (!cds_ctx) {
376*5113495bSYour Name 		wma_err("Invalid cds context");
377*5113495bSYour Name 		return;
378*5113495bSYour Name 	}
379*5113495bSYour Name 
380*5113495bSYour Name 	if (!cds_ctx->cds_cfg) {
381*5113495bSYour Name 		wma_err("Invalid cds config");
382*5113495bSYour Name 		return;
383*5113495bSYour Name 	}
384*5113495bSYour Name 
385*5113495bSYour Name 	feature_set->wifi_standard =
386*5113495bSYour Name 			cds_ctx->cds_cfg->cds_feature_set.wifi_standard;
387*5113495bSYour Name 	feature_set->sap_5g_supported =
388*5113495bSYour Name 			cds_ctx->cds_cfg->cds_feature_set.sap_5g_supported;
389*5113495bSYour Name 	feature_set->sap_6g_supported =
390*5113495bSYour Name 			cds_ctx->cds_cfg->cds_feature_set.sap_6g_supported;
391*5113495bSYour Name 	feature_set->band_capability =
392*5113495bSYour Name 			cds_ctx->cds_cfg->cds_feature_set.band_capability;
393*5113495bSYour Name 
394*5113495bSYour Name 	feature_set->concurrency_support = wma_get_concurrency_support(psoc);
395*5113495bSYour Name 
396*5113495bSYour Name 	wlan_scan_get_feature_info(psoc, &scan_feature_set);
397*5113495bSYour Name 	feature_set->pno_in_unassoc_state =
398*5113495bSYour Name 					scan_feature_set.pno_in_unassoc_state;
399*5113495bSYour Name 	if (feature_set->pno_in_unassoc_state)
400*5113495bSYour Name 		feature_set->pno_in_assoc_state =
401*5113495bSYour Name 					scan_feature_set.pno_in_assoc_state;
402*5113495bSYour Name 
403*5113495bSYour Name 	wlan_twt_get_feature_info(psoc, &twt_feature_set);
404*5113495bSYour Name 	feature_set->enable_twt = twt_feature_set.enable_twt;
405*5113495bSYour Name 	if (feature_set->enable_twt) {
406*5113495bSYour Name 		feature_set->enable_twt_requester =
407*5113495bSYour Name 					twt_feature_set.enable_twt_requester;
408*5113495bSYour Name 		feature_set->enable_twt_broadcast =
409*5113495bSYour Name 					twt_feature_set.enable_twt_broadcast;
410*5113495bSYour Name 		feature_set->enable_twt_flexible =
411*5113495bSYour Name 					twt_feature_set.enable_twt_flexible;
412*5113495bSYour Name 	}
413*5113495bSYour Name 
414*5113495bSYour Name 	feature_set->enable_rfc835 = true;
415*5113495bSYour Name 
416*5113495bSYour Name 	wlan_mlme_get_feature_info(psoc, &mlme_feature_set);
417*5113495bSYour Name 
418*5113495bSYour Name 	feature_set->enable_wifi_optimizer =
419*5113495bSYour Name 				mlme_feature_set.enable_wifi_optimizer;
420*5113495bSYour Name 	feature_set->sap_max_num_clients =
421*5113495bSYour Name 				mlme_feature_set.sap_max_num_clients;
422*5113495bSYour Name 
423*5113495bSYour Name 	feature_set->vendor_req_1_version =
424*5113495bSYour Name 				mlme_feature_set.vendor_req_1_version;
425*5113495bSYour Name 	feature_set->roaming_high_cu_roam_trigger =
426*5113495bSYour Name 				mlme_feature_set.roaming_high_cu_roam_trigger;
427*5113495bSYour Name 	feature_set->roaming_emergency_trigger =
428*5113495bSYour Name 				mlme_feature_set.roaming_emergency_trigger;
429*5113495bSYour Name 	feature_set->roaming_btm_trihgger =
430*5113495bSYour Name 					mlme_feature_set.roaming_btm_trihgger;
431*5113495bSYour Name 	feature_set->roaming_idle_trigger =
432*5113495bSYour Name 					mlme_feature_set.roaming_idle_trigger;
433*5113495bSYour Name 	feature_set->roaming_wtc_trigger =
434*5113495bSYour Name 				mlme_feature_set.roaming_wtc_trigger;
435*5113495bSYour Name 	feature_set->roaming_btcoex_trigger =
436*5113495bSYour Name 				mlme_feature_set.roaming_btcoex_trigger;
437*5113495bSYour Name 	feature_set->roaming_btw_wpa_wpa2 =
438*5113495bSYour Name 					mlme_feature_set.roaming_btw_wpa_wpa2;
439*5113495bSYour Name 	feature_set->roaming_manage_chan_list_api =
440*5113495bSYour Name 				mlme_feature_set.roaming_manage_chan_list_api;
441*5113495bSYour Name 
442*5113495bSYour Name 	feature_set->roaming_adaptive_11r =
443*5113495bSYour Name 					mlme_feature_set.roaming_adaptive_11r;
444*5113495bSYour Name 	feature_set->roaming_ctrl_api_get_set =
445*5113495bSYour Name 				mlme_feature_set.roaming_ctrl_api_get_set;
446*5113495bSYour Name 	feature_set->roaming_ctrl_api_reassoc =
447*5113495bSYour Name 				mlme_feature_set.roaming_ctrl_api_reassoc;
448*5113495bSYour Name 	feature_set->roaming_ctrl_get_cu =
449*5113495bSYour Name 					mlme_feature_set.roaming_ctrl_get_cu;
450*5113495bSYour Name 	feature_set->vendor_req_2_version =
451*5113495bSYour Name 			mlme_feature_set.vendor_req_2_version;
452*5113495bSYour Name 	feature_set->iface_combinations = mlme_feature_set.iface_combinations;
453*5113495bSYour Name 
454*5113495bSYour Name 	if (mlme_feature_set.enable2x2)
455*5113495bSYour Name 		feature_set->num_antennas = WMI_HOST_MIMO_2X2;
456*5113495bSYour Name 	else
457*5113495bSYour Name 		feature_set->num_antennas = WMI_HOST_SISO;
458*5113495bSYour Name 
459*5113495bSYour Name 	feature_set->set_country_code_hal_supported = true;
460*5113495bSYour Name 	feature_set->get_valid_channel_supported = true;
461*5113495bSYour Name 	feature_set->supported_dot11mode = feature_set->wifi_standard;
462*5113495bSYour Name 	feature_set->sap_wpa3_support = true;
463*5113495bSYour Name 	feature_set->assurance_disconnect_reason_api = true;
464*5113495bSYour Name 	feature_set->frame_pcap_log_mgmt =
465*5113495bSYour Name 				    ucfg_dp_is_local_pkt_capture_enabled(psoc);
466*5113495bSYour Name 	feature_set->frame_pcap_log_ctrl = feature_set->frame_pcap_log_mgmt;
467*5113495bSYour Name 	feature_set->frame_pcap_log_data = feature_set->frame_pcap_log_mgmt;
468*5113495bSYour Name 
469*5113495bSYour Name 	/*
470*5113495bSYour Name 	 * This information is hardcoded based on hdd_sta_akm_suites,
471*5113495bSYour Name 	 *wlan_crypto_key_mgmt and wlan_crypto_rsnx_cap
472*5113495bSYour Name 	 */
473*5113495bSYour Name 
474*5113495bSYour Name 	/* WLAN_CRYPTO_RSNX_CAP_SAE_H2E support*/
475*5113495bSYour Name 	feature_set->security_wpa3_sae_h2e = true;
476*5113495bSYour Name 	feature_set->security_wpa3_sae_ft = true;
477*5113495bSYour Name 	feature_set->security_wpa3_enterp_suitb = true;
478*5113495bSYour Name 	feature_set->security_wpa3_enterp_suitb_192bit = true;
479*5113495bSYour Name 	feature_set->security_fills_sha_256 = true;
480*5113495bSYour Name 	feature_set->security_fills_sha_384 = true;
481*5113495bSYour Name 	feature_set->security_fills_sha_256_FT = true;
482*5113495bSYour Name 	feature_set->security_fills_sha_384_FT = true;
483*5113495bSYour Name 	/* This is OWE security support */
484*5113495bSYour Name 	feature_set->security_enhanced_open = true;
485*5113495bSYour Name 
486*5113495bSYour Name 	feature_set->enable_nan = cfg_nan_get_enable(psoc);
487*5113495bSYour Name 
488*5113495bSYour Name 	wlan_tdls_get_features_info(psoc, &tdls_feature_set);
489*5113495bSYour Name 	feature_set->enable_tdls = tdls_feature_set.enable_tdls;
490*5113495bSYour Name 	if (feature_set->enable_tdls) {
491*5113495bSYour Name 		feature_set->enable_tdls_offchannel =
492*5113495bSYour Name 				tdls_feature_set.enable_tdls_offchannel;
493*5113495bSYour Name 		feature_set->max_tdls_peers = tdls_feature_set.max_tdls_peers;
494*5113495bSYour Name 		feature_set->enable_tdls_capability_enhance =
495*5113495bSYour Name 			tdls_feature_set.enable_tdls_capability_enhance;
496*5113495bSYour Name 	}
497*5113495bSYour Name 
498*5113495bSYour Name 	if (feature_set->sap_6g_supported)
499*5113495bSYour Name 		feature_set->enable_p2p_6e =
500*5113495bSYour Name 					policy_mgr_is_6ghz_conc_mode_supported(
501*5113495bSYour Name 							psoc,
502*5113495bSYour Name 							PM_P2P_CLIENT_MODE);
503*5113495bSYour Name 
504*5113495bSYour Name 	feature_set->peer_bigdata_getbssinfo_support = true;
505*5113495bSYour Name 	feature_set->peer_bigdata_assocreject_info_support = true;
506*5113495bSYour Name 	feature_set->peer_getstainfo_support = true;
507*5113495bSYour Name 	feature_set->sta_dump_support = true;
508*5113495bSYour Name 	wma_update_set_feature_version(feature_set);
509*5113495bSYour Name }
510*5113495bSYour Name 
511*5113495bSYour Name /**
512*5113495bSYour Name  * wma_send_feature_set_cmd() - Send feature set command to FW
513*5113495bSYour Name  * @wma_handle: WMA handle
514*5113495bSYour Name  *
515*5113495bSYour Name  * Return: None
516*5113495bSYour Name  */
wma_send_feature_set_cmd(tp_wma_handle wma_handle)517*5113495bSYour Name static void wma_send_feature_set_cmd(tp_wma_handle wma_handle)
518*5113495bSYour Name {
519*5113495bSYour Name 	struct target_feature_set feature_set;
520*5113495bSYour Name 
521*5113495bSYour Name 	if (!wma_handle) {
522*5113495bSYour Name 		wma_err("Invalid wma_handle");
523*5113495bSYour Name 		return;
524*5113495bSYour Name 	}
525*5113495bSYour Name 
526*5113495bSYour Name 	wma_set_feature_set_info(wma_handle, &feature_set);
527*5113495bSYour Name 
528*5113495bSYour Name 	wmi_feature_set_cmd_send(wma_handle->wmi_handle,
529*5113495bSYour Name 				 &feature_set);
530*5113495bSYour Name }
531*5113495bSYour Name 
532*5113495bSYour Name /**
533*5113495bSYour Name  * wma_is_feature_set_supported() - Check if feaure set is supported or not
534*5113495bSYour Name  * @wma_handle: WMA handle
535*5113495bSYour Name  *
536*5113495bSYour Name  * Return: True, if feature set is supported else return false
537*5113495bSYour Name  */
wma_is_feature_set_supported(tp_wma_handle wma_handle)538*5113495bSYour Name static bool wma_is_feature_set_supported(tp_wma_handle wma_handle)
539*5113495bSYour Name {
540*5113495bSYour Name 	struct cds_context *cds_ctx =
541*5113495bSYour Name 		(struct cds_context *)(wma_handle->cds_context);
542*5113495bSYour Name 	bool is_feature_enabled_from_fw;
543*5113495bSYour Name 
544*5113495bSYour Name 	if (!cds_ctx) {
545*5113495bSYour Name 		wma_err("Invalid cds context");
546*5113495bSYour Name 		return false;
547*5113495bSYour Name 	}
548*5113495bSYour Name 
549*5113495bSYour Name 	if (!cds_ctx->cds_cfg) {
550*5113495bSYour Name 		wma_err("Invalid cds config");
551*5113495bSYour Name 		return false;
552*5113495bSYour Name 	}
553*5113495bSYour Name 
554*5113495bSYour Name 	is_feature_enabled_from_fw =
555*5113495bSYour Name 		wmi_service_enabled(wma_handle->wmi_handle,
556*5113495bSYour Name 				    wmi_service_feature_set_event_support);
557*5113495bSYour Name 
558*5113495bSYour Name 	if (!is_feature_enabled_from_fw)
559*5113495bSYour Name 		wma_debug("Get wifi feature is disabled from fw");
560*5113495bSYour Name 
561*5113495bSYour Name 	return (is_feature_enabled_from_fw &&
562*5113495bSYour Name 		cds_ctx->cds_cfg->get_wifi_features);
563*5113495bSYour Name }
564*5113495bSYour Name #else
wma_send_feature_set_cmd(tp_wma_handle wma_handle)565*5113495bSYour Name static inline void wma_send_feature_set_cmd(tp_wma_handle wma_handle)
566*5113495bSYour Name {
567*5113495bSYour Name }
568*5113495bSYour Name 
wma_is_feature_set_supported(tp_wma_handle wma_handle)569*5113495bSYour Name static bool wma_is_feature_set_supported(tp_wma_handle wma_handle)
570*5113495bSYour Name {
571*5113495bSYour Name 	return false;
572*5113495bSYour Name }
573*5113495bSYour Name 
574*5113495bSYour Name #endif
575*5113495bSYour Name 
576*5113495bSYour Name /**
577*5113495bSYour Name  * wma_set_default_tgt_config() - set default tgt config
578*5113495bSYour Name  * @wma_handle: wma handle
579*5113495bSYour Name  * @tgt_cfg: Resource config given to target
580*5113495bSYour Name  * @cds_cfg: cds configuration
581*5113495bSYour Name  *
582*5113495bSYour Name  * Return: none
583*5113495bSYour Name  */
wma_set_default_tgt_config(tp_wma_handle wma_handle,target_resource_config * tgt_cfg,struct cds_config_info * cds_cfg)584*5113495bSYour Name static void wma_set_default_tgt_config(tp_wma_handle wma_handle,
585*5113495bSYour Name 				       target_resource_config *tgt_cfg,
586*5113495bSYour Name 				       struct cds_config_info *cds_cfg)
587*5113495bSYour Name {
588*5113495bSYour Name 	enum QDF_GLOBAL_MODE con_mode;
589*5113495bSYour Name 
590*5113495bSYour Name 	qdf_mem_zero(tgt_cfg, sizeof(target_resource_config));
591*5113495bSYour Name 
592*5113495bSYour Name 	tgt_cfg->num_vdevs = cds_cfg->num_vdevs;
593*5113495bSYour Name 	wma_update_num_peers_tids(wma_handle, tgt_cfg);
594*5113495bSYour Name 
595*5113495bSYour Name 	/* The current firmware implementation requires the number of
596*5113495bSYour Name 	 * offload peers should be (number of vdevs + 1).
597*5113495bSYour Name 	 */
598*5113495bSYour Name 	tgt_cfg->num_offload_peers = cds_cfg->ap_maxoffload_peers + 1;
599*5113495bSYour Name 	tgt_cfg->num_offload_reorder_buffs =
600*5113495bSYour Name 				cds_cfg->ap_maxoffload_reorderbuffs + 1;
601*5113495bSYour Name 	tgt_cfg->num_peer_keys = CFG_TGT_NUM_PEER_KEYS;
602*5113495bSYour Name 	tgt_cfg->ast_skid_limit = CFG_TGT_AST_SKID_LIMIT;
603*5113495bSYour Name 	tgt_cfg->tx_chain_mask = CFG_TGT_DEFAULT_TX_CHAIN_MASK;
604*5113495bSYour Name 	tgt_cfg->rx_chain_mask = CFG_TGT_DEFAULT_RX_CHAIN_MASK;
605*5113495bSYour Name 	tgt_cfg->rx_timeout_pri[0] = CFG_TGT_RX_TIMEOUT_LO_PRI;
606*5113495bSYour Name 	tgt_cfg->rx_timeout_pri[1] = CFG_TGT_RX_TIMEOUT_LO_PRI;
607*5113495bSYour Name 	tgt_cfg->rx_timeout_pri[2] = CFG_TGT_RX_TIMEOUT_LO_PRI;
608*5113495bSYour Name 	tgt_cfg->rx_timeout_pri[3] = CFG_TGT_RX_TIMEOUT_HI_PRI;
609*5113495bSYour Name 	tgt_cfg->rx_decap_mode = CFG_TGT_RX_DECAP_MODE;
610*5113495bSYour Name 	tgt_cfg->scan_max_pending_req = WLAN_MAX_ACTIVE_SCANS_ALLOWED;
611*5113495bSYour Name 	tgt_cfg->bmiss_offload_max_vdev =
612*5113495bSYour Name 			CFG_TGT_DEFAULT_BMISS_OFFLOAD_MAX_VDEV;
613*5113495bSYour Name 	tgt_cfg->roam_offload_max_vdev = CFG_TGT_DEFAULT_ROAM_OFFLOAD_MAX_VDEV;
614*5113495bSYour Name 	tgt_cfg->roam_offload_max_ap_profiles =
615*5113495bSYour Name 		CFG_TGT_DEFAULT_ROAM_OFFLOAD_MAX_PROFILES;
616*5113495bSYour Name 	tgt_cfg->num_mcast_groups = CFG_TGT_DEFAULT_NUM_MCAST_GROUPS;
617*5113495bSYour Name 	tgt_cfg->num_mcast_table_elems = CFG_TGT_DEFAULT_NUM_MCAST_TABLE_ELEMS;
618*5113495bSYour Name 	tgt_cfg->mcast2ucast_mode = CFG_TGT_DEFAULT_MCAST2UCAST_MODE;
619*5113495bSYour Name 	tgt_cfg->tx_dbg_log_size = CFG_TGT_DEFAULT_TX_DBG_LOG_SIZE;
620*5113495bSYour Name 	tgt_cfg->num_wds_entries = CFG_TGT_WDS_ENTRIES;
621*5113495bSYour Name 	tgt_cfg->dma_burst_size = CFG_TGT_DEFAULT_DMA_BURST_SIZE;
622*5113495bSYour Name 	tgt_cfg->mac_aggr_delim = CFG_TGT_DEFAULT_MAC_AGGR_DELIM;
623*5113495bSYour Name 	tgt_cfg->rx_skip_defrag_timeout_dup_detection_check =
624*5113495bSYour Name 		CFG_TGT_DEFAULT_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK,
625*5113495bSYour Name 	tgt_cfg->vow_config = CFG_TGT_DEFAULT_VOW_CONFIG;
626*5113495bSYour Name 	tgt_cfg->gtk_offload_max_vdev = CFG_TGT_DEFAULT_GTK_OFFLOAD_MAX_VDEV;
627*5113495bSYour Name 	tgt_cfg->num_msdu_desc = CFG_TGT_NUM_MSDU_DESC;
628*5113495bSYour Name 	tgt_cfg->max_frag_entries = CFG_TGT_MAX_FRAG_TABLE_ENTRIES;
629*5113495bSYour Name 	tgt_cfg->num_tdls_vdevs = CFG_TGT_NUM_TDLS_VDEVS;
630*5113495bSYour Name 	tgt_cfg->num_tdls_conn_table_entries =
631*5113495bSYour Name 			QDF_MIN(CFG_TGT_NUM_TDLS_CONN_TABLE_ENTRIES,
632*5113495bSYour Name 				cfg_tdls_get_max_peer_count(wma_handle->psoc));
633*5113495bSYour Name 	tgt_cfg->beacon_tx_offload_max_vdev =
634*5113495bSYour Name 		CFG_TGT_DEFAULT_BEACON_TX_OFFLOAD_MAX_VDEV;
635*5113495bSYour Name 	tgt_cfg->num_multicast_filter_entries =
636*5113495bSYour Name 		CFG_TGT_MAX_MULTICAST_FILTER_ENTRIES;
637*5113495bSYour Name 	tgt_cfg->num_wow_filters = 0;
638*5113495bSYour Name 	tgt_cfg->num_keep_alive_pattern = MAXNUM_PERIODIC_TX_PTRNS;
639*5113495bSYour Name 	tgt_cfg->num_max_sta_vdevs = CFG_TGT_DEFAULT_MAX_STA_VDEVS;
640*5113495bSYour Name 	tgt_cfg->keep_alive_pattern_size = 0;
641*5113495bSYour Name 	tgt_cfg->max_tdls_concurrent_sleep_sta =
642*5113495bSYour Name 		CFG_TGT_NUM_TDLS_CONC_SLEEP_STAS;
643*5113495bSYour Name 	tgt_cfg->max_tdls_concurrent_buffer_sta =
644*5113495bSYour Name 		CFG_TGT_NUM_TDLS_CONC_BUFFER_STAS;
645*5113495bSYour Name 	tgt_cfg->wmi_send_separate = 0;
646*5113495bSYour Name 	tgt_cfg->num_ocb_vdevs = CFG_TGT_NUM_OCB_VDEVS;
647*5113495bSYour Name 	tgt_cfg->num_ocb_channels = CFG_TGT_NUM_OCB_CHANNELS;
648*5113495bSYour Name 	tgt_cfg->num_ocb_schedules = CFG_TGT_NUM_OCB_SCHEDULES;
649*5113495bSYour Name 	tgt_cfg->twt_ap_sta_count = CFG_TGT_DEFAULT_TWT_AP_STA_COUNT;
650*5113495bSYour Name 	tgt_cfg->enable_pci_gen = cfg_get(wma_handle->psoc, CFG_ENABLE_PCI_GEN);
651*5113495bSYour Name 
652*5113495bSYour Name 	tgt_cfg->mgmt_comp_evt_bundle_support = true;
653*5113495bSYour Name 	tgt_cfg->tx_msdu_new_partition_id_support = true;
654*5113495bSYour Name 	tgt_cfg->is_sap_connected_d3wow_enabled =
655*5113495bSYour Name 		ucfg_pmo_get_sap_mode_bus_suspend(wma_handle->psoc);
656*5113495bSYour Name 	tgt_cfg->is_go_connected_d3wow_enabled =
657*5113495bSYour Name 		ucfg_pmo_get_go_mode_bus_suspend(wma_handle->psoc);
658*5113495bSYour Name 	tgt_cfg->num_max_active_vdevs =
659*5113495bSYour Name 		policy_mgr_get_max_conc_cxns(wma_handle->psoc);
660*5113495bSYour Name 	tgt_cfg->num_max_mlo_link_per_ml_bss =
661*5113495bSYour Name 		wlan_mlme_get_sta_mlo_conn_max_num(wma_handle->psoc);
662*5113495bSYour Name 	cfg_nan_get_max_ndi(wma_handle->psoc,
663*5113495bSYour Name 			    &tgt_cfg->max_ndi);
664*5113495bSYour Name 
665*5113495bSYour Name 	con_mode = cds_get_conparam();
666*5113495bSYour Name 	if (con_mode == QDF_GLOBAL_MONITOR_MODE)
667*5113495bSYour Name 		tgt_cfg->rx_decap_mode = CFG_TGT_RX_DECAP_MODE_RAW;
668*5113495bSYour Name 
669*5113495bSYour Name 	if (con_mode == QDF_GLOBAL_FTM_MODE) {
670*5113495bSYour Name 		tgt_cfg->num_offload_peers = 0;
671*5113495bSYour Name 		tgt_cfg->num_offload_reorder_buffs = 0;
672*5113495bSYour Name 		tgt_cfg->bmiss_offload_max_vdev = 0;
673*5113495bSYour Name 		tgt_cfg->roam_offload_max_vdev = 0;
674*5113495bSYour Name 		tgt_cfg->roam_offload_max_ap_profiles = 0;
675*5113495bSYour Name 		tgt_cfg->beacon_tx_offload_max_vdev = 1;
676*5113495bSYour Name 		tgt_cfg->num_multicast_filter_entries = 0;
677*5113495bSYour Name 		tgt_cfg->gtk_offload_max_vdev = 0;
678*5113495bSYour Name 	}
679*5113495bSYour Name 	cfg_nan_get_ndp_max_sessions(wma_handle->psoc,
680*5113495bSYour Name 				     &tgt_cfg->max_ndp_sessions);
681*5113495bSYour Name 
682*5113495bSYour Name 	wma_set_ipa_disable_config(tgt_cfg);
683*5113495bSYour Name 	wma_set_peer_map_unmap_v2_config(wma_handle->psoc, tgt_cfg);
684*5113495bSYour Name 
685*5113495bSYour Name 	tgt_cfg->notify_frame_support = DP_MARK_NOTIFY_FRAME_SUPPORT;
686*5113495bSYour Name }
687*5113495bSYour Name 
688*5113495bSYour Name /**
689*5113495bSYour Name  * wma_cli_get_command() - WMA "get" command processor
690*5113495bSYour Name  * @vdev_id: virtual device for the command
691*5113495bSYour Name  * @param_id: parameter id
692*5113495bSYour Name  * @vpdev: parameter category
693*5113495bSYour Name  *
694*5113495bSYour Name  * Return: parameter value on success, -EINVAL on failure
695*5113495bSYour Name  */
wma_cli_get_command(int vdev_id,int param_id,int vpdev)696*5113495bSYour Name int wma_cli_get_command(int vdev_id, int param_id, int vpdev)
697*5113495bSYour Name {
698*5113495bSYour Name 	int ret = 0;
699*5113495bSYour Name 	tp_wma_handle wma;
700*5113495bSYour Name 	struct wma_txrx_node *intr = NULL;
701*5113495bSYour Name 
702*5113495bSYour Name 	wma = cds_get_context(QDF_MODULE_ID_WMA);
703*5113495bSYour Name 	if (!wma)
704*5113495bSYour Name 		return -EINVAL;
705*5113495bSYour Name 
706*5113495bSYour Name 	intr = wma->interfaces;
707*5113495bSYour Name 
708*5113495bSYour Name 	if (VDEV_CMD == vpdev) {
709*5113495bSYour Name 		switch (param_id) {
710*5113495bSYour Name 		case wmi_vdev_param_nss:
711*5113495bSYour Name 			ret = intr[vdev_id].config.nss;
712*5113495bSYour Name 			break;
713*5113495bSYour Name #ifdef QCA_SUPPORT_GTX
714*5113495bSYour Name 		case wmi_vdev_param_gtx_ht_mcs:
715*5113495bSYour Name 			ret = intr[vdev_id].config.gtx_info.gtxRTMask[0];
716*5113495bSYour Name 			break;
717*5113495bSYour Name 		case wmi_vdev_param_gtx_vht_mcs:
718*5113495bSYour Name 			ret = intr[vdev_id].config.gtx_info.gtxRTMask[1];
719*5113495bSYour Name 			break;
720*5113495bSYour Name 		case wmi_vdev_param_gtx_usr_cfg:
721*5113495bSYour Name 			ret = intr[vdev_id].config.gtx_info.gtxUsrcfg;
722*5113495bSYour Name 			break;
723*5113495bSYour Name 		case wmi_vdev_param_gtx_thre:
724*5113495bSYour Name 			ret = intr[vdev_id].config.gtx_info.gtxPERThreshold;
725*5113495bSYour Name 			break;
726*5113495bSYour Name 		case wmi_vdev_param_gtx_margin:
727*5113495bSYour Name 			ret = intr[vdev_id].config.gtx_info.gtxPERMargin;
728*5113495bSYour Name 			break;
729*5113495bSYour Name 		case wmi_vdev_param_gtx_step:
730*5113495bSYour Name 			ret = intr[vdev_id].config.gtx_info.gtxTPCstep;
731*5113495bSYour Name 			break;
732*5113495bSYour Name 		case wmi_vdev_param_gtx_mintpc:
733*5113495bSYour Name 			ret = intr[vdev_id].config.gtx_info.gtxTPCMin;
734*5113495bSYour Name 			break;
735*5113495bSYour Name 		case wmi_vdev_param_gtx_bw_mask:
736*5113495bSYour Name 			ret = intr[vdev_id].config.gtx_info.gtxBWMask;
737*5113495bSYour Name 			break;
738*5113495bSYour Name #endif /* QCA_SUPPORT_GTX */
739*5113495bSYour Name 		case wmi_vdev_param_ldpc:
740*5113495bSYour Name 			ret = intr[vdev_id].config.ldpc;
741*5113495bSYour Name 			break;
742*5113495bSYour Name 		case wmi_vdev_param_tx_stbc:
743*5113495bSYour Name 			ret = intr[vdev_id].config.tx_stbc;
744*5113495bSYour Name 			break;
745*5113495bSYour Name 		case wmi_vdev_param_rx_stbc:
746*5113495bSYour Name 			ret = intr[vdev_id].config.rx_stbc;
747*5113495bSYour Name 			break;
748*5113495bSYour Name 		case wmi_vdev_param_sgi:
749*5113495bSYour Name 			ret = intr[vdev_id].config.shortgi;
750*5113495bSYour Name 			break;
751*5113495bSYour Name 		case wmi_vdev_param_enable_rtscts:
752*5113495bSYour Name 			ret = intr[vdev_id].config.rtscts_en;
753*5113495bSYour Name 			break;
754*5113495bSYour Name 		case wmi_vdev_param_chwidth:
755*5113495bSYour Name 			ret = intr[vdev_id].config.chwidth;
756*5113495bSYour Name 			break;
757*5113495bSYour Name 		case wmi_vdev_param_fixed_rate:
758*5113495bSYour Name 			ret = intr[vdev_id].config.tx_rate;
759*5113495bSYour Name 			break;
760*5113495bSYour Name 		case wmi_vdev_param_he_dcm_enable:
761*5113495bSYour Name 		case wmi_vdev_param_he_range_ext:
762*5113495bSYour Name 			ret = wma_get_he_vdev_param(&intr[vdev_id], param_id);
763*5113495bSYour Name 			break;
764*5113495bSYour Name 		default:
765*5113495bSYour Name 			wma_err("Invalid cli_get vdev command/Not yet implemented 0x%x",
766*5113495bSYour Name 				param_id);
767*5113495bSYour Name 			return -EINVAL;
768*5113495bSYour Name 		}
769*5113495bSYour Name 	} else if (PDEV_CMD == vpdev) {
770*5113495bSYour Name 		switch (param_id) {
771*5113495bSYour Name 		case wmi_pdev_param_ani_enable:
772*5113495bSYour Name 			ret = wma->pdevconfig.ani_enable;
773*5113495bSYour Name 			break;
774*5113495bSYour Name 		case wmi_pdev_param_ani_poll_period:
775*5113495bSYour Name 			ret = wma->pdevconfig.ani_poll_len;
776*5113495bSYour Name 			break;
777*5113495bSYour Name 		case wmi_pdev_param_ani_listen_period:
778*5113495bSYour Name 			ret = wma->pdevconfig.ani_listen_len;
779*5113495bSYour Name 			break;
780*5113495bSYour Name 		case wmi_pdev_param_ani_ofdm_level:
781*5113495bSYour Name 			ret = wma->pdevconfig.ani_ofdm_level;
782*5113495bSYour Name 			break;
783*5113495bSYour Name 		case wmi_pdev_param_ani_cck_level:
784*5113495bSYour Name 			ret = wma->pdevconfig.ani_cck_level;
785*5113495bSYour Name 			break;
786*5113495bSYour Name 		case wmi_pdev_param_dynamic_bw:
787*5113495bSYour Name 			ret = wma->pdevconfig.cwmenable;
788*5113495bSYour Name 			break;
789*5113495bSYour Name 		case wmi_pdev_param_cts_cbw:
790*5113495bSYour Name 			ret = wma->pdevconfig.cts_cbw;
791*5113495bSYour Name 			break;
792*5113495bSYour Name 		case wmi_pdev_param_tx_chain_mask:
793*5113495bSYour Name 			ret = wma->pdevconfig.txchainmask;
794*5113495bSYour Name 			break;
795*5113495bSYour Name 		case wmi_pdev_param_rx_chain_mask:
796*5113495bSYour Name 			ret = wma->pdevconfig.rxchainmask;
797*5113495bSYour Name 			break;
798*5113495bSYour Name 		case wmi_pdev_param_txpower_limit2g:
799*5113495bSYour Name 			ret = wma->pdevconfig.txpow2g;
800*5113495bSYour Name 			break;
801*5113495bSYour Name 		case wmi_pdev_param_txpower_limit5g:
802*5113495bSYour Name 			ret = wma->pdevconfig.txpow5g;
803*5113495bSYour Name 			break;
804*5113495bSYour Name 		default:
805*5113495bSYour Name 			wma_err("Invalid cli_get pdev command/Not yet implemented 0x%x",
806*5113495bSYour Name 				param_id);
807*5113495bSYour Name 			return -EINVAL;
808*5113495bSYour Name 		}
809*5113495bSYour Name 	} else if (GEN_CMD == vpdev) {
810*5113495bSYour Name 		switch (param_id) {
811*5113495bSYour Name 		case GEN_VDEV_PARAM_AMPDU:
812*5113495bSYour Name 			ret = intr[vdev_id].config.ampdu;
813*5113495bSYour Name 			break;
814*5113495bSYour Name 		case GEN_VDEV_PARAM_AMSDU:
815*5113495bSYour Name 			ret = intr[vdev_id].config.amsdu;
816*5113495bSYour Name 			break;
817*5113495bSYour Name 		case GEN_VDEV_ROAM_SYNCH_DELAY:
818*5113495bSYour Name 			ret = intr[vdev_id].roam_synch_delay;
819*5113495bSYour Name 			break;
820*5113495bSYour Name 		case GEN_VDEV_PARAM_TX_AMPDU:
821*5113495bSYour Name 			ret = intr[vdev_id].config.tx_ampdu;
822*5113495bSYour Name 			break;
823*5113495bSYour Name 		case GEN_VDEV_PARAM_RX_AMPDU:
824*5113495bSYour Name 			ret = intr[vdev_id].config.rx_ampdu;
825*5113495bSYour Name 			break;
826*5113495bSYour Name 		case GEN_VDEV_PARAM_TX_AMSDU:
827*5113495bSYour Name 			ret = intr[vdev_id].config.tx_amsdu;
828*5113495bSYour Name 			break;
829*5113495bSYour Name 		case GEN_VDEV_PARAM_RX_AMSDU:
830*5113495bSYour Name 			ret = intr[vdev_id].config.rx_amsdu;
831*5113495bSYour Name 			break;
832*5113495bSYour Name 		default:
833*5113495bSYour Name 			wma_warn("Invalid generic vdev command/Not yet implemented 0x%x",
834*5113495bSYour Name 				 param_id);
835*5113495bSYour Name 			return -EINVAL;
836*5113495bSYour Name 		}
837*5113495bSYour Name 	} else if (PPS_CMD == vpdev) {
838*5113495bSYour Name 		switch (param_id) {
839*5113495bSYour Name 		case WMI_VDEV_PPS_PAID_MATCH:
840*5113495bSYour Name 			ret = intr[vdev_id].config.pps_params.paid_match_enable;
841*5113495bSYour Name 			break;
842*5113495bSYour Name 		case WMI_VDEV_PPS_GID_MATCH:
843*5113495bSYour Name 			ret = intr[vdev_id].config.pps_params.gid_match_enable;
844*5113495bSYour Name 			break;
845*5113495bSYour Name 		case WMI_VDEV_PPS_EARLY_TIM_CLEAR:
846*5113495bSYour Name 			ret = intr[vdev_id].config.pps_params.tim_clear;
847*5113495bSYour Name 			break;
848*5113495bSYour Name 		case WMI_VDEV_PPS_EARLY_DTIM_CLEAR:
849*5113495bSYour Name 			ret = intr[vdev_id].config.pps_params.dtim_clear;
850*5113495bSYour Name 			break;
851*5113495bSYour Name 		case WMI_VDEV_PPS_EOF_PAD_DELIM:
852*5113495bSYour Name 			ret = intr[vdev_id].config.pps_params.eof_delim;
853*5113495bSYour Name 			break;
854*5113495bSYour Name 		case WMI_VDEV_PPS_MACADDR_MISMATCH:
855*5113495bSYour Name 			ret = intr[vdev_id].config.pps_params.mac_match;
856*5113495bSYour Name 			break;
857*5113495bSYour Name 		case WMI_VDEV_PPS_DELIM_CRC_FAIL:
858*5113495bSYour Name 			ret = intr[vdev_id].config.pps_params.delim_fail;
859*5113495bSYour Name 			break;
860*5113495bSYour Name 		case WMI_VDEV_PPS_GID_NSTS_ZERO:
861*5113495bSYour Name 			ret = intr[vdev_id].config.pps_params.nsts_zero;
862*5113495bSYour Name 			break;
863*5113495bSYour Name 		case WMI_VDEV_PPS_RSSI_CHECK:
864*5113495bSYour Name 			ret = intr[vdev_id].config.pps_params.rssi_chk;
865*5113495bSYour Name 			break;
866*5113495bSYour Name 		default:
867*5113495bSYour Name 			wma_err("Invalid pps vdev command/Not yet implemented 0x%x",
868*5113495bSYour Name 				param_id);
869*5113495bSYour Name 			return -EINVAL;
870*5113495bSYour Name 		}
871*5113495bSYour Name 	} else if (QPOWER_CMD == vpdev) {
872*5113495bSYour Name 		switch (param_id) {
873*5113495bSYour Name 		case WMI_STA_PS_PARAM_QPOWER_PSPOLL_COUNT:
874*5113495bSYour Name 			ret = intr[vdev_id].config.qpower_params.
875*5113495bSYour Name 			      max_ps_poll_cnt;
876*5113495bSYour Name 			break;
877*5113495bSYour Name 		case WMI_STA_PS_PARAM_QPOWER_MAX_TX_BEFORE_WAKE:
878*5113495bSYour Name 			ret = intr[vdev_id].config.qpower_params.
879*5113495bSYour Name 			      max_tx_before_wake;
880*5113495bSYour Name 			break;
881*5113495bSYour Name 		case WMI_STA_PS_PARAM_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL:
882*5113495bSYour Name 			ret = intr[vdev_id].config.qpower_params.
883*5113495bSYour Name 			      spec_ps_poll_wake_interval;
884*5113495bSYour Name 			break;
885*5113495bSYour Name 		case WMI_STA_PS_PARAM_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL:
886*5113495bSYour Name 			ret = intr[vdev_id].config.qpower_params.
887*5113495bSYour Name 			      max_spec_nodata_ps_poll;
888*5113495bSYour Name 			break;
889*5113495bSYour Name 		default:
890*5113495bSYour Name 			wma_warn("Invalid generic vdev command/Not yet implemented 0x%x",
891*5113495bSYour Name 				 param_id);
892*5113495bSYour Name 			return -EINVAL;
893*5113495bSYour Name 		}
894*5113495bSYour Name 	} else if (GTX_CMD == vpdev) {
895*5113495bSYour Name 		switch (param_id) {
896*5113495bSYour Name 		case wmi_vdev_param_gtx_ht_mcs:
897*5113495bSYour Name 			ret = intr[vdev_id].config.gtx_info.gtxRTMask[0];
898*5113495bSYour Name 			break;
899*5113495bSYour Name 		case wmi_vdev_param_gtx_vht_mcs:
900*5113495bSYour Name 			ret = intr[vdev_id].config.gtx_info.gtxRTMask[1];
901*5113495bSYour Name 			break;
902*5113495bSYour Name 		case wmi_vdev_param_gtx_usr_cfg:
903*5113495bSYour Name 			ret = intr[vdev_id].config.gtx_info.gtxUsrcfg;
904*5113495bSYour Name 			break;
905*5113495bSYour Name 		case wmi_vdev_param_gtx_thre:
906*5113495bSYour Name 			ret = intr[vdev_id].config.gtx_info.gtxPERThreshold;
907*5113495bSYour Name 			break;
908*5113495bSYour Name 		case wmi_vdev_param_gtx_margin:
909*5113495bSYour Name 			ret = intr[vdev_id].config.gtx_info.gtxPERMargin;
910*5113495bSYour Name 			break;
911*5113495bSYour Name 		case wmi_vdev_param_gtx_step:
912*5113495bSYour Name 			ret = intr[vdev_id].config.gtx_info.gtxTPCstep;
913*5113495bSYour Name 			break;
914*5113495bSYour Name 		case wmi_vdev_param_gtx_mintpc:
915*5113495bSYour Name 			ret = intr[vdev_id].config.gtx_info.gtxTPCMin;
916*5113495bSYour Name 			break;
917*5113495bSYour Name 		case wmi_vdev_param_gtx_bw_mask:
918*5113495bSYour Name 			ret = intr[vdev_id].config.gtx_info.gtxBWMask;
919*5113495bSYour Name 			break;
920*5113495bSYour Name 		default:
921*5113495bSYour Name 			wma_warn("Invalid generic vdev command/Not yet implemented 0x%x",
922*5113495bSYour Name 				 param_id);
923*5113495bSYour Name 			return -EINVAL;
924*5113495bSYour Name 		}
925*5113495bSYour Name 	}
926*5113495bSYour Name 	return ret;
927*5113495bSYour Name }
928*5113495bSYour Name 
929*5113495bSYour Name /**
930*5113495bSYour Name  * wma_cli_set2_command() - WMA "set 2 params" command processor
931*5113495bSYour Name  * @vdev_id: virtual device for the command
932*5113495bSYour Name  * @param_id: parameter id
933*5113495bSYour Name  * @sval1: first parameter value
934*5113495bSYour Name  * @sval2: second parameter value
935*5113495bSYour Name  * @vpdev: parameter category
936*5113495bSYour Name  *
937*5113495bSYour Name  * Command handler for set operations which require 2 parameters
938*5113495bSYour Name  *
939*5113495bSYour Name  * Return: 0 on success, errno on failure
940*5113495bSYour Name  */
wma_cli_set2_command(int vdev_id,int param_id,int sval1,int sval2,int vpdev)941*5113495bSYour Name int wma_cli_set2_command(int vdev_id, int param_id, int sval1,
942*5113495bSYour Name 			 int sval2, int vpdev)
943*5113495bSYour Name {
944*5113495bSYour Name 	struct scheduler_msg msg = { 0 };
945*5113495bSYour Name 	wma_cli_set_cmd_t *iwcmd;
946*5113495bSYour Name 
947*5113495bSYour Name 	iwcmd = qdf_mem_malloc(sizeof(*iwcmd));
948*5113495bSYour Name 	if (!iwcmd)
949*5113495bSYour Name 		return -ENOMEM;
950*5113495bSYour Name 
951*5113495bSYour Name 	qdf_mem_zero(iwcmd, sizeof(*iwcmd));
952*5113495bSYour Name 	iwcmd->param_value = sval1;
953*5113495bSYour Name 	iwcmd->param_sec_value = sval2;
954*5113495bSYour Name 	iwcmd->param_vdev_id = vdev_id;
955*5113495bSYour Name 	iwcmd->param_id = param_id;
956*5113495bSYour Name 	iwcmd->param_vp_dev = vpdev;
957*5113495bSYour Name 	msg.type = WMA_CLI_SET_CMD;
958*5113495bSYour Name 	msg.reserved = 0;
959*5113495bSYour Name 	msg.bodyptr = iwcmd;
960*5113495bSYour Name 
961*5113495bSYour Name 	if (QDF_STATUS_SUCCESS !=
962*5113495bSYour Name 	    scheduler_post_message(QDF_MODULE_ID_WMA,
963*5113495bSYour Name 				   QDF_MODULE_ID_WMA,
964*5113495bSYour Name 				   QDF_MODULE_ID_WMA, &msg)) {
965*5113495bSYour Name 		qdf_mem_free(iwcmd);
966*5113495bSYour Name 		return -EIO;
967*5113495bSYour Name 	}
968*5113495bSYour Name 	return 0;
969*5113495bSYour Name }
970*5113495bSYour Name 
971*5113495bSYour Name /**
972*5113495bSYour Name  * wma_cli_set_command() - WMA "set" command processor
973*5113495bSYour Name  * @vdev_id: virtual device for the command
974*5113495bSYour Name  * @param_id: parameter id
975*5113495bSYour Name  * @sval: parameter value
976*5113495bSYour Name  * @vpdev: parameter category
977*5113495bSYour Name  *
978*5113495bSYour Name  * Command handler for set operations
979*5113495bSYour Name  *
980*5113495bSYour Name  * Return: 0 on success, errno on failure
981*5113495bSYour Name  */
wma_cli_set_command(int vdev_id,int param_id,int sval,int vpdev)982*5113495bSYour Name int wma_cli_set_command(int vdev_id, int param_id, int sval, int vpdev)
983*5113495bSYour Name {
984*5113495bSYour Name 	return wma_cli_set2_command(vdev_id, param_id, sval, 0, vpdev);
985*5113495bSYour Name 
986*5113495bSYour Name }
987*5113495bSYour Name 
wma_form_unit_test_cmd_and_send(uint32_t vdev_id,uint32_t module_id,uint32_t arg_count,uint32_t * arg)988*5113495bSYour Name QDF_STATUS wma_form_unit_test_cmd_and_send(uint32_t vdev_id,
989*5113495bSYour Name 			uint32_t module_id, uint32_t arg_count, uint32_t *arg)
990*5113495bSYour Name {
991*5113495bSYour Name 	struct wmi_unit_test_cmd *unit_test_args;
992*5113495bSYour Name 	tp_wma_handle wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
993*5113495bSYour Name 	uint32_t i;
994*5113495bSYour Name 	QDF_STATUS status;
995*5113495bSYour Name 	struct wmi_unified *wmi_handle;
996*5113495bSYour Name 
997*5113495bSYour Name 	wma_debug("enter");
998*5113495bSYour Name 
999*5113495bSYour Name 	if (QDF_GLOBAL_FTM_MODE != cds_get_conparam()) {
1000*5113495bSYour Name 		if (!wma_is_vdev_valid(vdev_id))
1001*5113495bSYour Name 			return QDF_STATUS_E_FAILURE;
1002*5113495bSYour Name 	}
1003*5113495bSYour Name 
1004*5113495bSYour Name 	if (arg_count > WMI_UNIT_TEST_MAX_NUM_ARGS) {
1005*5113495bSYour Name 		wma_err("arg_count is crossed the boundary");
1006*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1007*5113495bSYour Name 	}
1008*5113495bSYour Name 
1009*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
1010*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1011*5113495bSYour Name 
1012*5113495bSYour Name 	wmi_handle = wma_handle->wmi_handle;
1013*5113495bSYour Name 	if (wmi_validate_handle(wmi_handle))
1014*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1015*5113495bSYour Name 
1016*5113495bSYour Name 	unit_test_args = qdf_mem_malloc(sizeof(*unit_test_args));
1017*5113495bSYour Name 	if (!unit_test_args)
1018*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
1019*5113495bSYour Name 
1020*5113495bSYour Name 	unit_test_args->vdev_id = vdev_id;
1021*5113495bSYour Name 	unit_test_args->module_id = module_id;
1022*5113495bSYour Name 	unit_test_args->num_args = arg_count;
1023*5113495bSYour Name 	for (i = 0; i < arg_count; i++)
1024*5113495bSYour Name 		unit_test_args->args[i] = arg[i];
1025*5113495bSYour Name 
1026*5113495bSYour Name 	status = wmi_unified_unit_test_cmd(wmi_handle,
1027*5113495bSYour Name 					   unit_test_args);
1028*5113495bSYour Name 	qdf_mem_free(unit_test_args);
1029*5113495bSYour Name 	wma_debug("exit");
1030*5113495bSYour Name 
1031*5113495bSYour Name 	return status;
1032*5113495bSYour Name }
1033*5113495bSYour Name 
wma_process_send_addba_req(tp_wma_handle wma_handle,struct send_add_ba_req * send_addba)1034*5113495bSYour Name static void wma_process_send_addba_req(tp_wma_handle wma_handle,
1035*5113495bSYour Name 		struct send_add_ba_req *send_addba)
1036*5113495bSYour Name {
1037*5113495bSYour Name 	QDF_STATUS status;
1038*5113495bSYour Name 	struct wmi_unified *wmi_handle;
1039*5113495bSYour Name 
1040*5113495bSYour Name 	if (wma_validate_handle(wma_handle)) {
1041*5113495bSYour Name 		qdf_mem_free(send_addba);
1042*5113495bSYour Name 		return;
1043*5113495bSYour Name 	}
1044*5113495bSYour Name 
1045*5113495bSYour Name 	wmi_handle = wma_handle->wmi_handle;
1046*5113495bSYour Name 	if (wmi_validate_handle(wmi_handle)) {
1047*5113495bSYour Name 		qdf_mem_free(send_addba);
1048*5113495bSYour Name 		return;
1049*5113495bSYour Name 	}
1050*5113495bSYour Name 
1051*5113495bSYour Name 	status = wmi_unified_addba_send_cmd_send(wmi_handle,
1052*5113495bSYour Name 					   send_addba->mac_addr,
1053*5113495bSYour Name 					   &send_addba->param);
1054*5113495bSYour Name 	if (QDF_STATUS_SUCCESS != status) {
1055*5113495bSYour Name 		wma_err("Failed to process WMA_SEND_ADDBA_REQ");
1056*5113495bSYour Name 	}
1057*5113495bSYour Name 	wma_debug("sent ADDBA req to" QDF_MAC_ADDR_FMT "tid %d buff_size %d",
1058*5113495bSYour Name 			QDF_MAC_ADDR_REF(send_addba->mac_addr),
1059*5113495bSYour Name 			send_addba->param.tidno,
1060*5113495bSYour Name 			send_addba->param.buffersize);
1061*5113495bSYour Name 
1062*5113495bSYour Name 	qdf_mem_free(send_addba);
1063*5113495bSYour Name }
1064*5113495bSYour Name 
1065*5113495bSYour Name /**
1066*5113495bSYour Name  * wma_set_priv_cfg() - set private config parameters
1067*5113495bSYour Name  * @wma_handle: wma handle
1068*5113495bSYour Name  * @privcmd: private command
1069*5113495bSYour Name  *
1070*5113495bSYour Name  * Return: 0 for success or error code
1071*5113495bSYour Name  */
wma_set_priv_cfg(tp_wma_handle wma_handle,wma_cli_set_cmd_t * privcmd)1072*5113495bSYour Name static int32_t wma_set_priv_cfg(tp_wma_handle wma_handle,
1073*5113495bSYour Name 				wma_cli_set_cmd_t *privcmd)
1074*5113495bSYour Name {
1075*5113495bSYour Name 	int32_t ret = 0;
1076*5113495bSYour Name 
1077*5113495bSYour Name 	switch (privcmd->param_id) {
1078*5113495bSYour Name 	case WMA_VDEV_TXRX_FWSTATS_ENABLE_CMDID:
1079*5113495bSYour Name 		ret = wma_set_txrx_fw_stats_level(wma_handle,
1080*5113495bSYour Name 						  privcmd->param_vdev_id,
1081*5113495bSYour Name 						  privcmd->param_value);
1082*5113495bSYour Name 		break;
1083*5113495bSYour Name 	case WMA_VDEV_TXRX_FWSTATS_RESET_CMDID:
1084*5113495bSYour Name 		ret = wma_txrx_fw_stats_reset(wma_handle,
1085*5113495bSYour Name 					      privcmd->param_vdev_id,
1086*5113495bSYour Name 					      privcmd->param_value);
1087*5113495bSYour Name 		break;
1088*5113495bSYour Name 	case WMI_STA_SMPS_FORCE_MODE_CMDID:
1089*5113495bSYour Name 		ret = wma_set_mimops(wma_handle,
1090*5113495bSYour Name 				     privcmd->param_vdev_id,
1091*5113495bSYour Name 				     privcmd->param_value);
1092*5113495bSYour Name 		break;
1093*5113495bSYour Name 	case WMI_STA_SMPS_PARAM_CMDID:
1094*5113495bSYour Name 		wma_set_smps_params(wma_handle, privcmd->param_vdev_id,
1095*5113495bSYour Name 				    privcmd->param_value);
1096*5113495bSYour Name 		break;
1097*5113495bSYour Name 	case WMA_VDEV_MCC_SET_TIME_LATENCY:
1098*5113495bSYour Name 	{
1099*5113495bSYour Name 		/* Extract first MCC adapter/vdev channel number and latency */
1100*5113495bSYour Name 		uint8_t mcc_channel = privcmd->param_value & 0x000000FF;
1101*5113495bSYour Name 		uint8_t mcc_channel_latency =
1102*5113495bSYour Name 			(privcmd->param_value & 0x0000FF00) >> 8;
1103*5113495bSYour Name 		int ret = -1;
1104*5113495bSYour Name 
1105*5113495bSYour Name 		wma_debug("Parsed input: Channel #1:%d, latency:%dms",
1106*5113495bSYour Name 			 mcc_channel, mcc_channel_latency);
1107*5113495bSYour Name 		ret = wma_set_mcc_channel_time_latency(wma_handle,
1108*5113495bSYour Name 						       mcc_channel,
1109*5113495bSYour Name 						       mcc_channel_latency);
1110*5113495bSYour Name 	}
1111*5113495bSYour Name 		break;
1112*5113495bSYour Name 	case WMA_VDEV_MCC_SET_TIME_QUOTA:
1113*5113495bSYour Name 	{
1114*5113495bSYour Name 		/* Extract the MCC 2 adapters/vdevs channel numbers and time
1115*5113495bSYour Name 		 * quota value for the first adapter only (which is specified
1116*5113495bSYour Name 		 * in iwpriv command.
1117*5113495bSYour Name 		 */
1118*5113495bSYour Name 		uint8_t adapter_2_chan_number =
1119*5113495bSYour Name 			privcmd->param_value & 0x000000FF;
1120*5113495bSYour Name 		uint8_t adapter_1_chan_number =
1121*5113495bSYour Name 			(privcmd->param_value & 0x0000FF00) >> 8;
1122*5113495bSYour Name 		uint8_t adapter_1_quota =
1123*5113495bSYour Name 			(privcmd->param_value & 0x00FF0000) >> 16;
1124*5113495bSYour Name 		int ret = -1;
1125*5113495bSYour Name 
1126*5113495bSYour Name 		wma_debug("Parsed input: Channel #1:%d, Channel #2:%d, quota 1:%dms",
1127*5113495bSYour Name 			  adapter_1_chan_number,
1128*5113495bSYour Name 			  adapter_2_chan_number, adapter_1_quota);
1129*5113495bSYour Name 
1130*5113495bSYour Name 		ret = wma_set_mcc_channel_time_quota(wma_handle,
1131*5113495bSYour Name 						     adapter_1_chan_number,
1132*5113495bSYour Name 						     adapter_1_quota,
1133*5113495bSYour Name 						     adapter_2_chan_number);
1134*5113495bSYour Name 	}
1135*5113495bSYour Name 		break;
1136*5113495bSYour Name 	default:
1137*5113495bSYour Name 		wma_err("Invalid wma config command id:%d", privcmd->param_id);
1138*5113495bSYour Name 		ret = -EINVAL;
1139*5113495bSYour Name 	}
1140*5113495bSYour Name 	return ret;
1141*5113495bSYour Name }
1142*5113495bSYour Name 
1143*5113495bSYour Name /**
1144*5113495bSYour Name  * wma_set_dtim_period() - set dtim period to FW
1145*5113495bSYour Name  * @wma: wma handle
1146*5113495bSYour Name  * @dtim_params: dtim params
1147*5113495bSYour Name  *
1148*5113495bSYour Name  * Return: none
1149*5113495bSYour Name  */
wma_set_dtim_period(tp_wma_handle wma,struct set_dtim_params * dtim_params)1150*5113495bSYour Name static void wma_set_dtim_period(tp_wma_handle wma,
1151*5113495bSYour Name 				struct set_dtim_params *dtim_params)
1152*5113495bSYour Name {
1153*5113495bSYour Name 	struct wma_txrx_node *iface =
1154*5113495bSYour Name 		&wma->interfaces[dtim_params->session_id];
1155*5113495bSYour Name 	if (!wma_is_vdev_valid(dtim_params->session_id)) {
1156*5113495bSYour Name 		wma_err("invalid VDEV");
1157*5113495bSYour Name 		return;
1158*5113495bSYour Name 	}
1159*5113495bSYour Name 	wma_debug("set dtim_period %d", dtim_params->dtim_period);
1160*5113495bSYour Name 	iface->dtimPeriod = dtim_params->dtim_period;
1161*5113495bSYour Name 
1162*5113495bSYour Name }
1163*5113495bSYour Name 
wma_is_tx_chainmask_valid(int value,struct target_psoc_info * tgt_hdl)1164*5113495bSYour Name static inline bool wma_is_tx_chainmask_valid(int value,
1165*5113495bSYour Name 					     struct target_psoc_info *tgt_hdl)
1166*5113495bSYour Name {
1167*5113495bSYour Name 	struct wlan_psoc_host_mac_phy_caps *mac_phy_cap;
1168*5113495bSYour Name 	uint8_t total_mac_phy_cnt, i;
1169*5113495bSYour Name 
1170*5113495bSYour Name 	mac_phy_cap = target_psoc_get_mac_phy_cap(tgt_hdl);
1171*5113495bSYour Name 	if (!mac_phy_cap) {
1172*5113495bSYour Name 		wma_err("Invalid MAC PHY capabilities handle");
1173*5113495bSYour Name 		return false;
1174*5113495bSYour Name 	}
1175*5113495bSYour Name 
1176*5113495bSYour Name 	total_mac_phy_cnt = target_psoc_get_total_mac_phy_cnt(tgt_hdl);
1177*5113495bSYour Name 	for (i = 0; i < total_mac_phy_cnt; i++) {
1178*5113495bSYour Name 		if (((mac_phy_cap[i].tx_chain_mask_5G) & (value))) {
1179*5113495bSYour Name 			return true;
1180*5113495bSYour Name 		}
1181*5113495bSYour Name 	}
1182*5113495bSYour Name 
1183*5113495bSYour Name 	return false;
1184*5113495bSYour Name }
1185*5113495bSYour Name 
1186*5113495bSYour Name /**
1187*5113495bSYour Name  * wma_convert_ac_value() - map ac setting to the value to be used in FW.
1188*5113495bSYour Name  * @ac_value: ac value to be mapped.
1189*5113495bSYour Name  *
1190*5113495bSYour Name  * Return: enum wmi_traffic_ac
1191*5113495bSYour Name  */
wma_convert_ac_value(uint32_t ac_value)1192*5113495bSYour Name static inline wmi_traffic_ac wma_convert_ac_value(uint32_t ac_value)
1193*5113495bSYour Name {
1194*5113495bSYour Name 	switch (ac_value) {
1195*5113495bSYour Name 	case QCA_WLAN_AC_BE:
1196*5113495bSYour Name 		return WMI_AC_BE;
1197*5113495bSYour Name 	case QCA_WLAN_AC_BK:
1198*5113495bSYour Name 		return WMI_AC_BK;
1199*5113495bSYour Name 	case QCA_WLAN_AC_VI:
1200*5113495bSYour Name 		return WMI_AC_VI;
1201*5113495bSYour Name 	case QCA_WLAN_AC_VO:
1202*5113495bSYour Name 		return WMI_AC_VO;
1203*5113495bSYour Name 	case QCA_WLAN_AC_ALL:
1204*5113495bSYour Name 		return WMI_AC_MAX;
1205*5113495bSYour Name 	}
1206*5113495bSYour Name 	wma_err("invalid enum: %u", ac_value);
1207*5113495bSYour Name 	return WMI_AC_MAX;
1208*5113495bSYour Name }
1209*5113495bSYour Name 
1210*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
1211*5113495bSYour Name /**
1212*5113495bSYour Name  * wma_set_per_link_amsdu_cap() - Set AMSDU/AMPDU capability per link to FW.
1213*5113495bSYour Name  * @wma: wma handle
1214*5113495bSYour Name  * @privcmd: pointer to set command parameters
1215*5113495bSYour Name  * @aggr_type: aggregration type
1216*5113495bSYour Name  *
1217*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS if set command is sent successfully, else
1218*5113495bSYour Name  * QDF_STATUS_E_FAILURE
1219*5113495bSYour Name  */
1220*5113495bSYour Name static QDF_STATUS
wma_set_per_link_amsdu_cap(tp_wma_handle wma,wma_cli_set_cmd_t * privcmd,wmi_vdev_custom_aggr_type_t aggr_type)1221*5113495bSYour Name wma_set_per_link_amsdu_cap(tp_wma_handle wma, wma_cli_set_cmd_t *privcmd,
1222*5113495bSYour Name 			   wmi_vdev_custom_aggr_type_t aggr_type)
1223*5113495bSYour Name {
1224*5113495bSYour Name 	uint8_t vdev_id;
1225*5113495bSYour Name 	uint8_t op_mode;
1226*5113495bSYour Name 	QDF_STATUS ret = QDF_STATUS_E_FAILURE;
1227*5113495bSYour Name 
1228*5113495bSYour Name 	for (vdev_id = 0; vdev_id < WLAN_MAX_VDEVS; vdev_id++) {
1229*5113495bSYour Name 		op_mode = wlan_get_opmode_from_vdev_id(wma->pdev, vdev_id);
1230*5113495bSYour Name 		if (op_mode == QDF_STA_MODE) {
1231*5113495bSYour Name 			ret = wma_set_tx_rx_aggr_size(vdev_id,
1232*5113495bSYour Name 						      privcmd->param_value,
1233*5113495bSYour Name 						      privcmd->param_value,
1234*5113495bSYour Name 						      aggr_type);
1235*5113495bSYour Name 			if (QDF_IS_STATUS_ERROR(ret)) {
1236*5113495bSYour Name 				wma_err("set_aggr_size failed for vdev: %d, ret %d",
1237*5113495bSYour Name 					vdev_id, ret);
1238*5113495bSYour Name 				return ret;
1239*5113495bSYour Name 			}
1240*5113495bSYour Name 		}
1241*5113495bSYour Name 	}
1242*5113495bSYour Name 
1243*5113495bSYour Name 	return ret;
1244*5113495bSYour Name }
1245*5113495bSYour Name #else
1246*5113495bSYour Name static inline QDF_STATUS
wma_set_per_link_amsdu_cap(tp_wma_handle wma,wma_cli_set_cmd_t * privcmd,wmi_vdev_custom_aggr_type_t aggr_type)1247*5113495bSYour Name wma_set_per_link_amsdu_cap(tp_wma_handle wma, wma_cli_set_cmd_t *privcmd,
1248*5113495bSYour Name 			   wmi_vdev_custom_aggr_type_t aggr_type)
1249*5113495bSYour Name {
1250*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1251*5113495bSYour Name }
1252*5113495bSYour Name #endif
1253*5113495bSYour Name 
1254*5113495bSYour Name /**
1255*5113495bSYour Name  * wma_process_cli_set_cmd() - set parameters to fw
1256*5113495bSYour Name  * @wma: wma handle
1257*5113495bSYour Name  * @privcmd: command
1258*5113495bSYour Name  *
1259*5113495bSYour Name  * Return: none
1260*5113495bSYour Name  */
wma_process_cli_set_cmd(tp_wma_handle wma,wma_cli_set_cmd_t * privcmd)1261*5113495bSYour Name static void wma_process_cli_set_cmd(tp_wma_handle wma,
1262*5113495bSYour Name 				    wma_cli_set_cmd_t *privcmd)
1263*5113495bSYour Name {
1264*5113495bSYour Name 	int vid = privcmd->param_vdev_id, pps_val = 0;
1265*5113495bSYour Name 	QDF_STATUS ret;
1266*5113495bSYour Name 	struct wma_txrx_node *intr = wma->interfaces;
1267*5113495bSYour Name 	struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
1268*5113495bSYour Name 	struct qpower_params *qparams = &intr[vid].config.qpower_params;
1269*5113495bSYour Name 	struct pdev_params pdev_param = {0};
1270*5113495bSYour Name 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
1271*5113495bSYour Name 	struct target_psoc_info *tgt_hdl;
1272*5113495bSYour Name 	enum wlan_eht_mode eht_mode;
1273*5113495bSYour Name 
1274*5113495bSYour Name 	if (!mac) {
1275*5113495bSYour Name 		wma_err("Failed to get mac");
1276*5113495bSYour Name 		return;
1277*5113495bSYour Name 	}
1278*5113495bSYour Name 
1279*5113495bSYour Name 	tgt_hdl = wlan_psoc_get_tgt_if_handle(wma->psoc);
1280*5113495bSYour Name 	if (!tgt_hdl) {
1281*5113495bSYour Name 		wma_err("target psoc info is NULL");
1282*5113495bSYour Name 		return;
1283*5113495bSYour Name 	}
1284*5113495bSYour Name 
1285*5113495bSYour Name 	if (privcmd->param_id >= WMI_CMDID_MAX) {
1286*5113495bSYour Name 		/*
1287*5113495bSYour Name 		 * This configuration setting is not done using any wmi
1288*5113495bSYour Name 		 * command, call appropriate handler.
1289*5113495bSYour Name 		 */
1290*5113495bSYour Name 		if (wma_set_priv_cfg(wma, privcmd))
1291*5113495bSYour Name 			wma_err("Failed to set wma priv configuration");
1292*5113495bSYour Name 		return;
1293*5113495bSYour Name 	}
1294*5113495bSYour Name 
1295*5113495bSYour Name 	switch (privcmd->param_vp_dev) {
1296*5113495bSYour Name 	case VDEV_CMD:
1297*5113495bSYour Name 		if (!wma_is_vdev_valid(privcmd->param_vdev_id)) {
1298*5113495bSYour Name 			wma_err("Vdev id is not valid");
1299*5113495bSYour Name 			return;
1300*5113495bSYour Name 		}
1301*5113495bSYour Name 
1302*5113495bSYour Name 		wma_debug("vdev id %d pid %d pval %d", privcmd->param_vdev_id,
1303*5113495bSYour Name 			 privcmd->param_id, privcmd->param_value);
1304*5113495bSYour Name 		ret = wma_vdev_set_param(wma->wmi_handle,
1305*5113495bSYour Name 						      privcmd->param_vdev_id,
1306*5113495bSYour Name 						      privcmd->param_id,
1307*5113495bSYour Name 						      privcmd->param_value);
1308*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(ret)) {
1309*5113495bSYour Name 			wma_err("wma_vdev_set_param failed ret %d", ret);
1310*5113495bSYour Name 			return;
1311*5113495bSYour Name 		}
1312*5113495bSYour Name 		break;
1313*5113495bSYour Name 	case PDEV_CMD:
1314*5113495bSYour Name 		wma_debug("pdev pid %d pval %d", privcmd->param_id,
1315*5113495bSYour Name 			 privcmd->param_value);
1316*5113495bSYour Name 		if ((privcmd->param_id == wmi_pdev_param_rx_chain_mask) ||
1317*5113495bSYour Name 		    (privcmd->param_id == wmi_pdev_param_tx_chain_mask)) {
1318*5113495bSYour Name 			if (QDF_STATUS_SUCCESS !=
1319*5113495bSYour Name 					wma_check_txrx_chainmask(
1320*5113495bSYour Name 					target_if_get_num_rf_chains(tgt_hdl),
1321*5113495bSYour Name 					privcmd->param_value)) {
1322*5113495bSYour Name 				wma_debug("Chainmask value is invalid");
1323*5113495bSYour Name 				return;
1324*5113495bSYour Name 			}
1325*5113495bSYour Name 		}
1326*5113495bSYour Name 
1327*5113495bSYour Name 		if (privcmd->param_id == wmi_pdev_param_tx_chain_mask) {
1328*5113495bSYour Name 			if (!wma_is_tx_chainmask_valid(privcmd->param_value,
1329*5113495bSYour Name 						       tgt_hdl)) {
1330*5113495bSYour Name 				wma_debug("Chainmask value is invalid");
1331*5113495bSYour Name 				return;
1332*5113495bSYour Name 			}
1333*5113495bSYour Name 		}
1334*5113495bSYour Name 		pdev_param.param_id = privcmd->param_id;
1335*5113495bSYour Name 		pdev_param.param_value = privcmd->param_value;
1336*5113495bSYour Name 		if (privcmd->param_id == wmi_pdev_param_twt_ac_config)
1337*5113495bSYour Name 			pdev_param.param_value =
1338*5113495bSYour Name 				wma_convert_ac_value(pdev_param.param_value);
1339*5113495bSYour Name 		ret = wmi_unified_pdev_param_send(wma->wmi_handle,
1340*5113495bSYour Name 						 &pdev_param,
1341*5113495bSYour Name 						 privcmd->param_sec_value);
1342*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(ret)) {
1343*5113495bSYour Name 			wma_err("wma_vdev_set_param failed ret %d", ret);
1344*5113495bSYour Name 			return;
1345*5113495bSYour Name 		}
1346*5113495bSYour Name 		break;
1347*5113495bSYour Name 	case GEN_CMD:
1348*5113495bSYour Name 	{
1349*5113495bSYour Name 		struct wma_txrx_node *intr = wma->interfaces;
1350*5113495bSYour Name 		wmi_vdev_custom_aggr_type_t aggr_type =
1351*5113495bSYour Name 			WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU;
1352*5113495bSYour Name 
1353*5113495bSYour Name 		wma_debug("gen pid %d pval %d", privcmd->param_id,
1354*5113495bSYour Name 			 privcmd->param_value);
1355*5113495bSYour Name 
1356*5113495bSYour Name 		switch (privcmd->param_id) {
1357*5113495bSYour Name 		case GEN_VDEV_PARAM_AMSDU:
1358*5113495bSYour Name 		case GEN_VDEV_PARAM_AMPDU:
1359*5113495bSYour Name 			if (!soc) {
1360*5113495bSYour Name 				wma_err("SOC context is NULL");
1361*5113495bSYour Name 				return;
1362*5113495bSYour Name 			}
1363*5113495bSYour Name 
1364*5113495bSYour Name 			if (privcmd->param_id == GEN_VDEV_PARAM_AMPDU) {
1365*5113495bSYour Name 				ret = cdp_aggr_cfg(soc, privcmd->param_vdev_id,
1366*5113495bSYour Name 						   privcmd->param_value, 0);
1367*5113495bSYour Name 				if (ret)
1368*5113495bSYour Name 					wma_err("cdp_aggr_cfg set ampdu failed ret %d",
1369*5113495bSYour Name 						ret);
1370*5113495bSYour Name 				else
1371*5113495bSYour Name 					intr[privcmd->param_vdev_id].config.
1372*5113495bSYour Name 						ampdu = privcmd->param_value;
1373*5113495bSYour Name 
1374*5113495bSYour Name 				aggr_type =
1375*5113495bSYour Name 					WMI_VDEV_CUSTOM_AGGR_TYPE_AMPDU;
1376*5113495bSYour Name 			}
1377*5113495bSYour Name 
1378*5113495bSYour Name 			wlan_mlme_get_eht_mode(wma->psoc, &eht_mode);
1379*5113495bSYour Name 			if (eht_mode == WLAN_EHT_MODE_MLSR ||
1380*5113495bSYour Name 			    eht_mode == WLAN_EHT_MODE_MLMR) {
1381*5113495bSYour Name 				ret = wma_set_per_link_amsdu_cap(wma, privcmd,
1382*5113495bSYour Name 								 aggr_type);
1383*5113495bSYour Name 				if (QDF_IS_STATUS_ERROR(ret))
1384*5113495bSYour Name 					return;
1385*5113495bSYour Name 			} else {
1386*5113495bSYour Name 				ret = wma_set_tx_rx_aggr_size(
1387*5113495bSYour Name 							vid,
1388*5113495bSYour Name 							privcmd->param_value,
1389*5113495bSYour Name 							privcmd->param_value,
1390*5113495bSYour Name 							aggr_type);
1391*5113495bSYour Name 				if (QDF_IS_STATUS_ERROR(ret)) {
1392*5113495bSYour Name 					wma_err("set_aggr_size failed ret %d",
1393*5113495bSYour Name 						ret);
1394*5113495bSYour Name 					return;
1395*5113495bSYour Name 				}
1396*5113495bSYour Name 			}
1397*5113495bSYour Name 			break;
1398*5113495bSYour Name 		case GEN_PARAM_CRASH_INJECT:
1399*5113495bSYour Name 			if (QDF_GLOBAL_FTM_MODE  == cds_get_conparam())
1400*5113495bSYour Name 				wma_err("Crash inject not allowed in FTM mode");
1401*5113495bSYour Name 			else
1402*5113495bSYour Name 				ret = wma_crash_inject(wma,
1403*5113495bSYour Name 						privcmd->param_value,
1404*5113495bSYour Name 						privcmd->param_sec_value);
1405*5113495bSYour Name 			break;
1406*5113495bSYour Name 		case GEN_PARAM_CAPTURE_TSF:
1407*5113495bSYour Name 			ret = wma_capture_tsf(wma, privcmd->param_value);
1408*5113495bSYour Name 			break;
1409*5113495bSYour Name 		case GEN_PARAM_RESET_TSF_GPIO:
1410*5113495bSYour Name 			ret = wma_reset_tsf_gpio(wma, privcmd->param_value);
1411*5113495bSYour Name 			break;
1412*5113495bSYour Name 		default:
1413*5113495bSYour Name 			ret = wma_set_tsf_auto_report(wma,
1414*5113495bSYour Name 						      privcmd->param_vdev_id,
1415*5113495bSYour Name 						      privcmd->param_id,
1416*5113495bSYour Name 						      privcmd->param_value);
1417*5113495bSYour Name 			if (ret == QDF_STATUS_E_FAILURE)
1418*5113495bSYour Name 				wma_err("Invalid param id 0x%x",
1419*5113495bSYour Name 					privcmd->param_id);
1420*5113495bSYour Name 			break;
1421*5113495bSYour Name 		}
1422*5113495bSYour Name 		break;
1423*5113495bSYour Name 	}
1424*5113495bSYour Name 	case DBG_CMD:
1425*5113495bSYour Name 		wma_debug("dbg pid %d pval %d", privcmd->param_id,
1426*5113495bSYour Name 			 privcmd->param_value);
1427*5113495bSYour Name 		switch (privcmd->param_id) {
1428*5113495bSYour Name 		case WMI_DBGLOG_LOG_LEVEL:
1429*5113495bSYour Name 			ret = dbglog_set_log_lvl(wma->wmi_handle,
1430*5113495bSYour Name 						   privcmd->param_value);
1431*5113495bSYour Name 			if (ret)
1432*5113495bSYour Name 				wma_err("dbglog_set_log_lvl failed ret %d",
1433*5113495bSYour Name 					 ret);
1434*5113495bSYour Name 			break;
1435*5113495bSYour Name 		case WMI_DBGLOG_VAP_ENABLE:
1436*5113495bSYour Name 			ret = dbglog_vap_log_enable(wma->wmi_handle,
1437*5113495bSYour Name 						    privcmd->param_value, true);
1438*5113495bSYour Name 			if (ret)
1439*5113495bSYour Name 				wma_err("dbglog_vap_log_enable failed ret %d",
1440*5113495bSYour Name 					 ret);
1441*5113495bSYour Name 			break;
1442*5113495bSYour Name 		case WMI_DBGLOG_VAP_DISABLE:
1443*5113495bSYour Name 			ret = dbglog_vap_log_enable(wma->wmi_handle,
1444*5113495bSYour Name 						privcmd->param_value, false);
1445*5113495bSYour Name 			if (ret)
1446*5113495bSYour Name 				wma_err("dbglog_vap_log_enable failed ret %d",
1447*5113495bSYour Name 					 ret);
1448*5113495bSYour Name 			break;
1449*5113495bSYour Name 		case WMI_DBGLOG_MODULE_ENABLE:
1450*5113495bSYour Name 			ret = dbglog_module_log_enable(wma->wmi_handle,
1451*5113495bSYour Name 						privcmd->param_value, true);
1452*5113495bSYour Name 			if (ret)
1453*5113495bSYour Name 				wma_err("dbglog_module_log_enable failed ret %d",
1454*5113495bSYour Name 					ret);
1455*5113495bSYour Name 			break;
1456*5113495bSYour Name 		case WMI_DBGLOG_MODULE_DISABLE:
1457*5113495bSYour Name 			ret = dbglog_module_log_enable(wma->wmi_handle,
1458*5113495bSYour Name 						privcmd->param_value, false);
1459*5113495bSYour Name 			if (ret)
1460*5113495bSYour Name 				wma_err("dbglog_module_log_enable failed ret %d",
1461*5113495bSYour Name 					ret);
1462*5113495bSYour Name 			break;
1463*5113495bSYour Name 		case WMI_DBGLOG_MOD_LOG_LEVEL:
1464*5113495bSYour Name 			ret = dbglog_set_mod_log_lvl(wma->wmi_handle,
1465*5113495bSYour Name 						       privcmd->param_value);
1466*5113495bSYour Name 			if (ret)
1467*5113495bSYour Name 				wma_err("dbglog_module_log_enable failed ret %d",
1468*5113495bSYour Name 					ret);
1469*5113495bSYour Name 			break;
1470*5113495bSYour Name 		case WMI_DBGLOG_MOD_WOW_LOG_LEVEL:
1471*5113495bSYour Name 			ret = dbglog_set_mod_wow_log_lvl(wma->wmi_handle,
1472*5113495bSYour Name 							 privcmd->param_value);
1473*5113495bSYour Name 			if (ret)
1474*5113495bSYour Name 				wma_err("WMI_DBGLOG_MOD_WOW_LOG_LEVEL failed ret %d",
1475*5113495bSYour Name 					ret);
1476*5113495bSYour Name 			break;
1477*5113495bSYour Name 		case WMI_DBGLOG_TYPE:
1478*5113495bSYour Name 			ret = dbglog_parser_type_init(wma->wmi_handle,
1479*5113495bSYour Name 							privcmd->param_value);
1480*5113495bSYour Name 			if (ret)
1481*5113495bSYour Name 				wma_err("dbglog_parser_type_init failed ret %d",
1482*5113495bSYour Name 					ret);
1483*5113495bSYour Name 			break;
1484*5113495bSYour Name 		case WMI_DBGLOG_REPORT_ENABLE:
1485*5113495bSYour Name 			ret = dbglog_report_enable(wma->wmi_handle,
1486*5113495bSYour Name 						     privcmd->param_value);
1487*5113495bSYour Name 			if (ret)
1488*5113495bSYour Name 				wma_err("dbglog_report_enable failed ret %d",
1489*5113495bSYour Name 					 ret);
1490*5113495bSYour Name 			break;
1491*5113495bSYour Name 		case WMI_WLAN_PROFILE_TRIGGER_CMDID:
1492*5113495bSYour Name 			ret = wma_unified_fw_profiling_cmd(wma->wmi_handle,
1493*5113495bSYour Name 					 WMI_WLAN_PROFILE_TRIGGER_CMDID,
1494*5113495bSYour Name 					 privcmd->param_value, 0);
1495*5113495bSYour Name 			if (ret)
1496*5113495bSYour Name 				wma_err("Profile cmd failed for %d ret %d",
1497*5113495bSYour Name 					WMI_WLAN_PROFILE_TRIGGER_CMDID, ret);
1498*5113495bSYour Name 			break;
1499*5113495bSYour Name 		case WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID:
1500*5113495bSYour Name 			ret = wma_unified_fw_profiling_cmd(wma->wmi_handle,
1501*5113495bSYour Name 				  WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
1502*5113495bSYour Name 				  privcmd->param_value,
1503*5113495bSYour Name 				  privcmd->param_sec_value);
1504*5113495bSYour Name 			if (ret)
1505*5113495bSYour Name 				wma_err("Profile cmd failed for %d ret %d",
1506*5113495bSYour Name 					WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
1507*5113495bSYour Name 					ret);
1508*5113495bSYour Name 			break;
1509*5113495bSYour Name 		case WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID:
1510*5113495bSYour Name 			ret = wma_unified_fw_profiling_cmd(wma->wmi_handle,
1511*5113495bSYour Name 					 WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
1512*5113495bSYour Name 					 privcmd->param_value,
1513*5113495bSYour Name 					 privcmd->param_sec_value);
1514*5113495bSYour Name 			if (ret)
1515*5113495bSYour Name 				wma_err("Profile cmd failed for %d ret %d",
1516*5113495bSYour Name 					WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
1517*5113495bSYour Name 					ret);
1518*5113495bSYour Name 			break;
1519*5113495bSYour Name 		case WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID:
1520*5113495bSYour Name 			ret = wma_unified_fw_profiling_cmd(wma->wmi_handle,
1521*5113495bSYour Name 					 WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
1522*5113495bSYour Name 					 0, 0);
1523*5113495bSYour Name 			if (ret)
1524*5113495bSYour Name 				wma_err("Profile cmd failed for %d ret %d",
1525*5113495bSYour Name 					WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
1526*5113495bSYour Name 					ret);
1527*5113495bSYour Name 			break;
1528*5113495bSYour Name 		case WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID:
1529*5113495bSYour Name 			ret = wma_unified_fw_profiling_cmd(wma->wmi_handle,
1530*5113495bSYour Name 					WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
1531*5113495bSYour Name 					0, 0);
1532*5113495bSYour Name 			if (ret)
1533*5113495bSYour Name 				wma_err("Profile cmd failed for %d ret %d",
1534*5113495bSYour Name 					WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
1535*5113495bSYour Name 					ret);
1536*5113495bSYour Name 			break;
1537*5113495bSYour Name 		case WMI_PDEV_GREEN_AP_PS_ENABLE_CMDID:
1538*5113495bSYour Name 			/* Set the Green AP */
1539*5113495bSYour Name 			ret = wmi_unified_green_ap_ps_send
1540*5113495bSYour Name 					(wma->wmi_handle, privcmd->param_value,
1541*5113495bSYour Name 					 WMA_WILDCARD_PDEV_ID);
1542*5113495bSYour Name 			if (ret) {
1543*5113495bSYour Name 				wma_err("Set GreenAP Failed val %d",
1544*5113495bSYour Name 					privcmd->param_value);
1545*5113495bSYour Name 			}
1546*5113495bSYour Name 			break;
1547*5113495bSYour Name 
1548*5113495bSYour Name 		default:
1549*5113495bSYour Name 			wma_err("Invalid param id 0x%x", privcmd->param_id);
1550*5113495bSYour Name 			break;
1551*5113495bSYour Name 		}
1552*5113495bSYour Name 		break;
1553*5113495bSYour Name 	case PPS_CMD:
1554*5113495bSYour Name 		wma_debug("dbg pid %d pval %d", privcmd->param_id,
1555*5113495bSYour Name 			 privcmd->param_value);
1556*5113495bSYour Name 		switch (privcmd->param_id) {
1557*5113495bSYour Name 
1558*5113495bSYour Name 		case WMI_VDEV_PPS_PAID_MATCH:
1559*5113495bSYour Name 			pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1560*5113495bSYour Name 				  (PKT_PWR_SAVE_PAID_MATCH & 0xffff);
1561*5113495bSYour Name 			intr[vid].config.pps_params.paid_match_enable =
1562*5113495bSYour Name 				privcmd->param_value;
1563*5113495bSYour Name 			break;
1564*5113495bSYour Name 		case WMI_VDEV_PPS_GID_MATCH:
1565*5113495bSYour Name 			pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1566*5113495bSYour Name 				  (PKT_PWR_SAVE_GID_MATCH & 0xffff);
1567*5113495bSYour Name 			intr[vid].config.pps_params.gid_match_enable =
1568*5113495bSYour Name 				privcmd->param_value;
1569*5113495bSYour Name 			break;
1570*5113495bSYour Name 		case WMI_VDEV_PPS_EARLY_TIM_CLEAR:
1571*5113495bSYour Name 			pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1572*5113495bSYour Name 				  (PKT_PWR_SAVE_EARLY_TIM_CLEAR & 0xffff);
1573*5113495bSYour Name 			intr[vid].config.pps_params.tim_clear =
1574*5113495bSYour Name 				privcmd->param_value;
1575*5113495bSYour Name 			break;
1576*5113495bSYour Name 		case WMI_VDEV_PPS_EARLY_DTIM_CLEAR:
1577*5113495bSYour Name 			pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1578*5113495bSYour Name 				  (PKT_PWR_SAVE_EARLY_DTIM_CLEAR & 0xffff);
1579*5113495bSYour Name 			intr[vid].config.pps_params.dtim_clear =
1580*5113495bSYour Name 				privcmd->param_value;
1581*5113495bSYour Name 			break;
1582*5113495bSYour Name 		case WMI_VDEV_PPS_EOF_PAD_DELIM:
1583*5113495bSYour Name 			pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1584*5113495bSYour Name 				  (PKT_PWR_SAVE_EOF_PAD_DELIM & 0xffff);
1585*5113495bSYour Name 			intr[vid].config.pps_params.eof_delim =
1586*5113495bSYour Name 				privcmd->param_value;
1587*5113495bSYour Name 			break;
1588*5113495bSYour Name 		case WMI_VDEV_PPS_MACADDR_MISMATCH:
1589*5113495bSYour Name 			pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1590*5113495bSYour Name 				  (PKT_PWR_SAVE_MACADDR_MISMATCH & 0xffff);
1591*5113495bSYour Name 			intr[vid].config.pps_params.mac_match =
1592*5113495bSYour Name 				privcmd->param_value;
1593*5113495bSYour Name 			break;
1594*5113495bSYour Name 		case WMI_VDEV_PPS_DELIM_CRC_FAIL:
1595*5113495bSYour Name 			pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1596*5113495bSYour Name 				  (PKT_PWR_SAVE_DELIM_CRC_FAIL & 0xffff);
1597*5113495bSYour Name 			intr[vid].config.pps_params.delim_fail =
1598*5113495bSYour Name 				privcmd->param_value;
1599*5113495bSYour Name 			break;
1600*5113495bSYour Name 		case WMI_VDEV_PPS_GID_NSTS_ZERO:
1601*5113495bSYour Name 			pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1602*5113495bSYour Name 				  (PKT_PWR_SAVE_GID_NSTS_ZERO & 0xffff);
1603*5113495bSYour Name 			intr[vid].config.pps_params.nsts_zero =
1604*5113495bSYour Name 				privcmd->param_value;
1605*5113495bSYour Name 			break;
1606*5113495bSYour Name 		case WMI_VDEV_PPS_RSSI_CHECK:
1607*5113495bSYour Name 			pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1608*5113495bSYour Name 				  (PKT_PWR_SAVE_RSSI_CHECK & 0xffff);
1609*5113495bSYour Name 			intr[vid].config.pps_params.rssi_chk =
1610*5113495bSYour Name 				privcmd->param_value;
1611*5113495bSYour Name 			break;
1612*5113495bSYour Name 		case WMI_VDEV_PPS_5G_EBT:
1613*5113495bSYour Name 			pps_val = ((privcmd->param_value << 31) & 0xffff0000) |
1614*5113495bSYour Name 				  (PKT_PWR_SAVE_5G_EBT & 0xffff);
1615*5113495bSYour Name 			intr[vid].config.pps_params.ebt_5g =
1616*5113495bSYour Name 				privcmd->param_value;
1617*5113495bSYour Name 			break;
1618*5113495bSYour Name 		default:
1619*5113495bSYour Name 			wma_err("Invalid param id 0x%x", privcmd->param_id);
1620*5113495bSYour Name 			break;
1621*5113495bSYour Name 		}
1622*5113495bSYour Name 		break;
1623*5113495bSYour Name 
1624*5113495bSYour Name 	case QPOWER_CMD:
1625*5113495bSYour Name 		wma_debug("QPOWER CLI CMD pid %d pval %d", privcmd->param_id,
1626*5113495bSYour Name 			 privcmd->param_value);
1627*5113495bSYour Name 		switch (privcmd->param_id) {
1628*5113495bSYour Name 		case WMI_STA_PS_PARAM_QPOWER_PSPOLL_COUNT:
1629*5113495bSYour Name 			wma_debug("QPOWER CLI CMD:Ps Poll Cnt val %d",
1630*5113495bSYour Name 				 privcmd->param_value);
1631*5113495bSYour Name 			/* Set the QPower Ps Poll Count */
1632*5113495bSYour Name 			ret = wma_unified_set_sta_ps_param(wma->wmi_handle,
1633*5113495bSYour Name 				vid, WMI_STA_PS_PARAM_QPOWER_PSPOLL_COUNT,
1634*5113495bSYour Name 				privcmd->param_value);
1635*5113495bSYour Name 			if (ret) {
1636*5113495bSYour Name 				wma_err("Set Q-PsPollCnt Failed vdevId %d val %d",
1637*5113495bSYour Name 					vid, privcmd->param_value);
1638*5113495bSYour Name 			} else {
1639*5113495bSYour Name 				qparams->max_ps_poll_cnt = privcmd->param_value;
1640*5113495bSYour Name 			}
1641*5113495bSYour Name 			break;
1642*5113495bSYour Name 		case WMI_STA_PS_PARAM_QPOWER_MAX_TX_BEFORE_WAKE:
1643*5113495bSYour Name 			wma_debug("QPOWER CLI CMD:Max Tx Before wake val %d",
1644*5113495bSYour Name 				 privcmd->param_value);
1645*5113495bSYour Name 			/* Set the QPower Max Tx Before Wake */
1646*5113495bSYour Name 			ret = wma_unified_set_sta_ps_param(wma->wmi_handle,
1647*5113495bSYour Name 				vid, WMI_STA_PS_PARAM_QPOWER_MAX_TX_BEFORE_WAKE,
1648*5113495bSYour Name 				privcmd->param_value);
1649*5113495bSYour Name 			if (ret) {
1650*5113495bSYour Name 				wma_err("Set Q-MaxTxBefWake Failed vId %d val %d",
1651*5113495bSYour Name 					vid, privcmd->param_value);
1652*5113495bSYour Name 			} else {
1653*5113495bSYour Name 				qparams->max_tx_before_wake =
1654*5113495bSYour Name 						privcmd->param_value;
1655*5113495bSYour Name 			}
1656*5113495bSYour Name 			break;
1657*5113495bSYour Name 		case WMI_STA_PS_PARAM_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL:
1658*5113495bSYour Name 			wma_debug("QPOWER CLI CMD:Ps Poll Wake Inv val %d",
1659*5113495bSYour Name 				 privcmd->param_value);
1660*5113495bSYour Name 			/* Set the QPower Spec Ps Poll Wake Inv */
1661*5113495bSYour Name 			ret = wma_unified_set_sta_ps_param(wma->wmi_handle, vid,
1662*5113495bSYour Name 				WMI_STA_PS_PARAM_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL,
1663*5113495bSYour Name 				privcmd->param_value);
1664*5113495bSYour Name 			if (ret) {
1665*5113495bSYour Name 				wma_err("Set Q-PsPoll WakeIntv Failed vId %d val %d",
1666*5113495bSYour Name 					vid, privcmd->param_value);
1667*5113495bSYour Name 			} else {
1668*5113495bSYour Name 				qparams->spec_ps_poll_wake_interval =
1669*5113495bSYour Name 					privcmd->param_value;
1670*5113495bSYour Name 			}
1671*5113495bSYour Name 			break;
1672*5113495bSYour Name 		case WMI_STA_PS_PARAM_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL:
1673*5113495bSYour Name 			wma_debug("QPOWER CLI CMD:Spec NoData Ps Poll val %d",
1674*5113495bSYour Name 				 privcmd->param_value);
1675*5113495bSYour Name 			/* Set the QPower Spec NoData PsPoll */
1676*5113495bSYour Name 			ret = wma_unified_set_sta_ps_param(wma->wmi_handle, vid,
1677*5113495bSYour Name 				WMI_STA_PS_PARAM_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL,
1678*5113495bSYour Name 				privcmd->param_value);
1679*5113495bSYour Name 			if (ret) {
1680*5113495bSYour Name 				wma_err("Set Q-SpecNoDataPsPoll Failed vId %d val %d",
1681*5113495bSYour Name 					vid, privcmd->param_value);
1682*5113495bSYour Name 			} else {
1683*5113495bSYour Name 				qparams->max_spec_nodata_ps_poll =
1684*5113495bSYour Name 					privcmd->param_value;
1685*5113495bSYour Name 			}
1686*5113495bSYour Name 			break;
1687*5113495bSYour Name 
1688*5113495bSYour Name 		default:
1689*5113495bSYour Name 			wma_err("Invalid param id 0x%x", privcmd->param_id);
1690*5113495bSYour Name 			break;
1691*5113495bSYour Name 		}
1692*5113495bSYour Name 		break;
1693*5113495bSYour Name 	case GTX_CMD:
1694*5113495bSYour Name 		wma_debug("vdev id %d pid %d pval %d", privcmd->param_vdev_id,
1695*5113495bSYour Name 			 privcmd->param_id, privcmd->param_value);
1696*5113495bSYour Name 		switch (privcmd->param_id) {
1697*5113495bSYour Name 		case wmi_vdev_param_gtx_ht_mcs:
1698*5113495bSYour Name 			intr[vid].config.gtx_info.gtxRTMask[0] =
1699*5113495bSYour Name 				privcmd->param_value;
1700*5113495bSYour Name 			ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1701*5113495bSYour Name 					privcmd->param_vdev_id,
1702*5113495bSYour Name 					&intr[vid].config.gtx_info);
1703*5113495bSYour Name 			break;
1704*5113495bSYour Name 		case wmi_vdev_param_gtx_vht_mcs:
1705*5113495bSYour Name 			intr[vid].config.gtx_info.gtxRTMask[1] =
1706*5113495bSYour Name 				privcmd->param_value;
1707*5113495bSYour Name 			ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1708*5113495bSYour Name 					privcmd->param_vdev_id,
1709*5113495bSYour Name 					&intr[vid].config.gtx_info);
1710*5113495bSYour Name 			break;
1711*5113495bSYour Name 
1712*5113495bSYour Name 		case wmi_vdev_param_gtx_usr_cfg:
1713*5113495bSYour Name 			intr[vid].config.gtx_info.gtxUsrcfg =
1714*5113495bSYour Name 				privcmd->param_value;
1715*5113495bSYour Name 			ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1716*5113495bSYour Name 					privcmd->param_vdev_id,
1717*5113495bSYour Name 					&intr[vid].config.gtx_info);
1718*5113495bSYour Name 			break;
1719*5113495bSYour Name 
1720*5113495bSYour Name 		case wmi_vdev_param_gtx_thre:
1721*5113495bSYour Name 			intr[vid].config.gtx_info.gtxPERThreshold =
1722*5113495bSYour Name 				privcmd->param_value;
1723*5113495bSYour Name 			ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1724*5113495bSYour Name 					privcmd->param_vdev_id,
1725*5113495bSYour Name 					&intr[vid].config.gtx_info);
1726*5113495bSYour Name 			break;
1727*5113495bSYour Name 
1728*5113495bSYour Name 		case wmi_vdev_param_gtx_margin:
1729*5113495bSYour Name 			intr[vid].config.gtx_info.gtxPERMargin =
1730*5113495bSYour Name 				privcmd->param_value;
1731*5113495bSYour Name 			ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1732*5113495bSYour Name 					privcmd->param_vdev_id,
1733*5113495bSYour Name 					&intr[vid].config.gtx_info);
1734*5113495bSYour Name 			break;
1735*5113495bSYour Name 
1736*5113495bSYour Name 		case wmi_vdev_param_gtx_step:
1737*5113495bSYour Name 			intr[vid].config.gtx_info.gtxTPCstep =
1738*5113495bSYour Name 				privcmd->param_value;
1739*5113495bSYour Name 			ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1740*5113495bSYour Name 					privcmd->param_vdev_id,
1741*5113495bSYour Name 					&intr[vid].config.gtx_info);
1742*5113495bSYour Name 			break;
1743*5113495bSYour Name 
1744*5113495bSYour Name 		case wmi_vdev_param_gtx_mintpc:
1745*5113495bSYour Name 			intr[vid].config.gtx_info.gtxTPCMin =
1746*5113495bSYour Name 				privcmd->param_value;
1747*5113495bSYour Name 			ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1748*5113495bSYour Name 					privcmd->param_vdev_id,
1749*5113495bSYour Name 					&intr[vid].config.gtx_info);
1750*5113495bSYour Name 			break;
1751*5113495bSYour Name 
1752*5113495bSYour Name 		case wmi_vdev_param_gtx_bw_mask:
1753*5113495bSYour Name 			intr[vid].config.gtx_info.gtxBWMask =
1754*5113495bSYour Name 				privcmd->param_value;
1755*5113495bSYour Name 			ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle,
1756*5113495bSYour Name 					privcmd->param_vdev_id,
1757*5113495bSYour Name 					&intr[vid].config.gtx_info);
1758*5113495bSYour Name 			if (ret) {
1759*5113495bSYour Name 				wma_err("wma_vdev_set_param failed ret %d",
1760*5113495bSYour Name 					 ret);
1761*5113495bSYour Name 				return;
1762*5113495bSYour Name 			}
1763*5113495bSYour Name 			break;
1764*5113495bSYour Name 		default:
1765*5113495bSYour Name 			break;
1766*5113495bSYour Name 		}
1767*5113495bSYour Name 		break;
1768*5113495bSYour Name 
1769*5113495bSYour Name 	default:
1770*5113495bSYour Name 		wma_err("Invalid vpdev command id");
1771*5113495bSYour Name 	}
1772*5113495bSYour Name 	if (1 == privcmd->param_vp_dev) {
1773*5113495bSYour Name 		switch (privcmd->param_id) {
1774*5113495bSYour Name 		case wmi_vdev_param_nss:
1775*5113495bSYour Name 			intr[vid].config.nss = privcmd->param_value;
1776*5113495bSYour Name 			break;
1777*5113495bSYour Name 		case wmi_vdev_param_ldpc:
1778*5113495bSYour Name 			intr[vid].config.ldpc = privcmd->param_value;
1779*5113495bSYour Name 			break;
1780*5113495bSYour Name 		case wmi_vdev_param_tx_stbc:
1781*5113495bSYour Name 			intr[vid].config.tx_stbc = privcmd->param_value;
1782*5113495bSYour Name 			break;
1783*5113495bSYour Name 		case wmi_vdev_param_rx_stbc:
1784*5113495bSYour Name 			intr[vid].config.rx_stbc = privcmd->param_value;
1785*5113495bSYour Name 			break;
1786*5113495bSYour Name 		case wmi_vdev_param_sgi:
1787*5113495bSYour Name 			intr[vid].config.shortgi = privcmd->param_value;
1788*5113495bSYour Name 			break;
1789*5113495bSYour Name 		case wmi_vdev_param_enable_rtscts:
1790*5113495bSYour Name 			intr[vid].config.rtscts_en = privcmd->param_value;
1791*5113495bSYour Name 			break;
1792*5113495bSYour Name 		case wmi_vdev_param_chwidth:
1793*5113495bSYour Name 			intr[vid].config.chwidth = privcmd->param_value;
1794*5113495bSYour Name 			break;
1795*5113495bSYour Name 		case wmi_vdev_param_fixed_rate:
1796*5113495bSYour Name 			intr[vid].config.tx_rate = privcmd->param_value;
1797*5113495bSYour Name 			break;
1798*5113495bSYour Name 		case wmi_vdev_param_early_rx_adjust_enable:
1799*5113495bSYour Name 			intr[vid].config.erx_adjust = privcmd->param_value;
1800*5113495bSYour Name 			break;
1801*5113495bSYour Name 		case wmi_vdev_param_early_rx_tgt_bmiss_num:
1802*5113495bSYour Name 			intr[vid].config.erx_bmiss_num = privcmd->param_value;
1803*5113495bSYour Name 			break;
1804*5113495bSYour Name 		case wmi_vdev_param_early_rx_bmiss_sample_cycle:
1805*5113495bSYour Name 			intr[vid].config.erx_bmiss_cycle = privcmd->param_value;
1806*5113495bSYour Name 			break;
1807*5113495bSYour Name 		case wmi_vdev_param_early_rx_slop_step:
1808*5113495bSYour Name 			intr[vid].config.erx_slop_step = privcmd->param_value;
1809*5113495bSYour Name 			break;
1810*5113495bSYour Name 		case wmi_vdev_param_early_rx_init_slop:
1811*5113495bSYour Name 			intr[vid].config.erx_init_slop = privcmd->param_value;
1812*5113495bSYour Name 			break;
1813*5113495bSYour Name 		case wmi_vdev_param_early_rx_adjust_pause:
1814*5113495bSYour Name 			intr[vid].config.erx_adj_pause = privcmd->param_value;
1815*5113495bSYour Name 			break;
1816*5113495bSYour Name 		case wmi_vdev_param_early_rx_drift_sample:
1817*5113495bSYour Name 			intr[vid].config.erx_dri_sample = privcmd->param_value;
1818*5113495bSYour Name 			break;
1819*5113495bSYour Name 		case wmi_vdev_param_he_dcm_enable:
1820*5113495bSYour Name 		case wmi_vdev_param_he_range_ext:
1821*5113495bSYour Name 			wma_set_he_vdev_param(&intr[vid], privcmd->param_id,
1822*5113495bSYour Name 					      privcmd->param_value);
1823*5113495bSYour Name 			break;
1824*5113495bSYour Name 		default:
1825*5113495bSYour Name 			wma_debug("vdev cmd is not part vdev_cli_config 0x%x",
1826*5113495bSYour Name 				  privcmd->param_id);
1827*5113495bSYour Name 			break;
1828*5113495bSYour Name 		}
1829*5113495bSYour Name 	} else if (2 == privcmd->param_vp_dev) {
1830*5113495bSYour Name 		switch (privcmd->param_id) {
1831*5113495bSYour Name 		case wmi_pdev_param_ani_enable:
1832*5113495bSYour Name 			wma->pdevconfig.ani_enable = privcmd->param_value;
1833*5113495bSYour Name 			break;
1834*5113495bSYour Name 		case wmi_pdev_param_ani_poll_period:
1835*5113495bSYour Name 			wma->pdevconfig.ani_poll_len = privcmd->param_value;
1836*5113495bSYour Name 			break;
1837*5113495bSYour Name 		case wmi_pdev_param_ani_listen_period:
1838*5113495bSYour Name 			wma->pdevconfig.ani_listen_len = privcmd->param_value;
1839*5113495bSYour Name 			break;
1840*5113495bSYour Name 		case wmi_pdev_param_ani_ofdm_level:
1841*5113495bSYour Name 			wma->pdevconfig.ani_ofdm_level = privcmd->param_value;
1842*5113495bSYour Name 			break;
1843*5113495bSYour Name 		case wmi_pdev_param_ani_cck_level:
1844*5113495bSYour Name 			wma->pdevconfig.ani_cck_level = privcmd->param_value;
1845*5113495bSYour Name 			break;
1846*5113495bSYour Name 		case wmi_pdev_param_dynamic_bw:
1847*5113495bSYour Name 			wma->pdevconfig.cwmenable = privcmd->param_value;
1848*5113495bSYour Name 			break;
1849*5113495bSYour Name 		case wmi_pdev_param_cts_cbw:
1850*5113495bSYour Name 			wma->pdevconfig.cts_cbw = privcmd->param_value;
1851*5113495bSYour Name 			break;
1852*5113495bSYour Name 		case wmi_pdev_param_tx_chain_mask:
1853*5113495bSYour Name 			wma->pdevconfig.txchainmask = privcmd->param_value;
1854*5113495bSYour Name 			break;
1855*5113495bSYour Name 		case wmi_pdev_param_rx_chain_mask:
1856*5113495bSYour Name 			wma->pdevconfig.rxchainmask = privcmd->param_value;
1857*5113495bSYour Name 			break;
1858*5113495bSYour Name 		case wmi_pdev_param_txpower_limit2g:
1859*5113495bSYour Name 			wma->pdevconfig.txpow2g = privcmd->param_value;
1860*5113495bSYour Name 			if (mac->mlme_cfg->gen.band_capability & BIT(REG_BAND_2G))
1861*5113495bSYour Name 				mac->mlme_cfg->power.current_tx_power_level =
1862*5113495bSYour Name 					(uint8_t)privcmd->param_value;
1863*5113495bSYour Name 			else
1864*5113495bSYour Name 				wma_err("Current band is not 2G");
1865*5113495bSYour Name 			break;
1866*5113495bSYour Name 		case wmi_pdev_param_txpower_limit5g:
1867*5113495bSYour Name 			wma->pdevconfig.txpow5g = privcmd->param_value;
1868*5113495bSYour Name 			if (mac->mlme_cfg->gen.band_capability & BIT(REG_BAND_5G))
1869*5113495bSYour Name 				mac->mlme_cfg->power.current_tx_power_level =
1870*5113495bSYour Name 					(uint8_t)privcmd->param_value;
1871*5113495bSYour Name 			else
1872*5113495bSYour Name 				wma_err("Current band is not 5G");
1873*5113495bSYour Name 			break;
1874*5113495bSYour Name 		default:
1875*5113495bSYour Name 			wma_debug("Invalid wma_cli_set pdev command/Not yet implemented 0x%x",
1876*5113495bSYour Name 				 privcmd->param_id);
1877*5113495bSYour Name 			break;
1878*5113495bSYour Name 		}
1879*5113495bSYour Name 	} else if (5 == privcmd->param_vp_dev) {
1880*5113495bSYour Name 		ret = wma_vdev_set_param(wma->wmi_handle,
1881*5113495bSYour Name 					privcmd->param_vdev_id,
1882*5113495bSYour Name 					wmi_vdev_param_packet_powersave,
1883*5113495bSYour Name 					pps_val);
1884*5113495bSYour Name 		if (ret)
1885*5113495bSYour Name 			wma_err("Failed to send wmi packet power save cmd");
1886*5113495bSYour Name 		else
1887*5113495bSYour Name 			wma_debug("Sent packet power save cmd %d value %x to target",
1888*5113495bSYour Name 				privcmd->param_id, pps_val);
1889*5113495bSYour Name 	}
1890*5113495bSYour Name }
1891*5113495bSYour Name 
wma_critical_events_in_flight(void)1892*5113495bSYour Name uint32_t wma_critical_events_in_flight(void)
1893*5113495bSYour Name {
1894*5113495bSYour Name 	t_wma_handle *wma;
1895*5113495bSYour Name 
1896*5113495bSYour Name 	wma = cds_get_context(QDF_MODULE_ID_WMA);
1897*5113495bSYour Name 	if (!wma)
1898*5113495bSYour Name 		return 0;
1899*5113495bSYour Name 
1900*5113495bSYour Name 	if (wmi_validate_handle(wma->wmi_handle))
1901*5113495bSYour Name 		return 0;
1902*5113495bSYour Name 
1903*5113495bSYour Name 	return wmi_critical_events_in_flight(wma->wmi_handle);
1904*5113495bSYour Name }
1905*5113495bSYour Name 
1906*5113495bSYour Name /**
1907*5113495bSYour Name  * wma_process_hal_pwr_dbg_cmd() - send hal pwr dbg cmd to fw.
1908*5113495bSYour Name  * @handle: wma handle
1909*5113495bSYour Name  * @sir_pwr_dbg_params: unit test command
1910*5113495bSYour Name  *
1911*5113495bSYour Name  * This function send unit test command to fw.
1912*5113495bSYour Name  *
1913*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_** on error
1914*5113495bSYour Name  */
wma_process_hal_pwr_dbg_cmd(WMA_HANDLE handle,struct sir_mac_pwr_dbg_cmd * sir_pwr_dbg_params)1915*5113495bSYour Name QDF_STATUS wma_process_hal_pwr_dbg_cmd(WMA_HANDLE handle,
1916*5113495bSYour Name 				       struct sir_mac_pwr_dbg_cmd *
1917*5113495bSYour Name 				       sir_pwr_dbg_params)
1918*5113495bSYour Name {
1919*5113495bSYour Name 	tp_wma_handle wma_handle = (tp_wma_handle)handle;
1920*5113495bSYour Name 	int i;
1921*5113495bSYour Name 	struct wmi_power_dbg_params wmi_pwr_dbg_params;
1922*5113495bSYour Name 	QDF_STATUS status;
1923*5113495bSYour Name 
1924*5113495bSYour Name 	if (!sir_pwr_dbg_params) {
1925*5113495bSYour Name 		wma_err("sir_pwr_dbg_params is null");
1926*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1927*5113495bSYour Name 	}
1928*5113495bSYour Name 	wmi_pwr_dbg_params.module_id = sir_pwr_dbg_params->module_id;
1929*5113495bSYour Name 	wmi_pwr_dbg_params.pdev_id = sir_pwr_dbg_params->pdev_id;
1930*5113495bSYour Name 	wmi_pwr_dbg_params.num_args = sir_pwr_dbg_params->num_args;
1931*5113495bSYour Name 
1932*5113495bSYour Name 	for (i = 0; i < wmi_pwr_dbg_params.num_args; i++)
1933*5113495bSYour Name 		wmi_pwr_dbg_params.args[i] = sir_pwr_dbg_params->args[i];
1934*5113495bSYour Name 
1935*5113495bSYour Name 	status = wmi_unified_send_power_dbg_cmd(wma_handle->wmi_handle,
1936*5113495bSYour Name 						&wmi_pwr_dbg_params);
1937*5113495bSYour Name 
1938*5113495bSYour Name 	return status;
1939*5113495bSYour Name }
1940*5113495bSYour Name 
wma_discard_fw_event(struct scheduler_msg * msg)1941*5113495bSYour Name static QDF_STATUS wma_discard_fw_event(struct scheduler_msg *msg)
1942*5113495bSYour Name {
1943*5113495bSYour Name 	if (!msg->bodyptr)
1944*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1945*5113495bSYour Name 
1946*5113495bSYour Name 	qdf_mem_free(msg->bodyptr);
1947*5113495bSYour Name 	msg->bodyptr = NULL;
1948*5113495bSYour Name 	msg->bodyval = 0;
1949*5113495bSYour Name 	msg->type = 0;
1950*5113495bSYour Name 
1951*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1952*5113495bSYour Name }
1953*5113495bSYour Name 
1954*5113495bSYour Name QDF_STATUS
wma_vdev_nss_chain_params_send(uint8_t vdev_id,struct wlan_mlme_nss_chains * user_cfg)1955*5113495bSYour Name wma_vdev_nss_chain_params_send(uint8_t vdev_id,
1956*5113495bSYour Name 			       struct wlan_mlme_nss_chains *user_cfg)
1957*5113495bSYour Name {
1958*5113495bSYour Name 	tp_wma_handle wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
1959*5113495bSYour Name 	struct vdev_nss_chains vdev_user_cfg;
1960*5113495bSYour Name 	if (!wma_handle)
1961*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1962*5113495bSYour Name 
1963*5113495bSYour Name 	vdev_user_cfg.disable_rx_mrc[NSS_CHAINS_BAND_2GHZ] =
1964*5113495bSYour Name 				user_cfg->disable_rx_mrc[NSS_CHAINS_BAND_2GHZ];
1965*5113495bSYour Name 	vdev_user_cfg.disable_tx_mrc[NSS_CHAINS_BAND_2GHZ] =
1966*5113495bSYour Name 				user_cfg->disable_tx_mrc[NSS_CHAINS_BAND_2GHZ];
1967*5113495bSYour Name 	vdev_user_cfg.disable_rx_mrc[NSS_CHAINS_BAND_5GHZ] =
1968*5113495bSYour Name 				user_cfg->disable_rx_mrc[NSS_CHAINS_BAND_5GHZ];
1969*5113495bSYour Name 	vdev_user_cfg.disable_tx_mrc[NSS_CHAINS_BAND_5GHZ] =
1970*5113495bSYour Name 				user_cfg->disable_tx_mrc[NSS_CHAINS_BAND_5GHZ];
1971*5113495bSYour Name 
1972*5113495bSYour Name 	vdev_user_cfg.num_rx_chains[NSS_CHAINS_BAND_2GHZ]
1973*5113495bSYour Name 				= user_cfg->num_rx_chains[NSS_CHAINS_BAND_2GHZ];
1974*5113495bSYour Name 	vdev_user_cfg.num_tx_chains[NSS_CHAINS_BAND_2GHZ]
1975*5113495bSYour Name 				= user_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ];
1976*5113495bSYour Name 	vdev_user_cfg.num_rx_chains[NSS_CHAINS_BAND_5GHZ] =
1977*5113495bSYour Name 				user_cfg->num_rx_chains[NSS_CHAINS_BAND_5GHZ];
1978*5113495bSYour Name 	vdev_user_cfg.num_tx_chains[NSS_CHAINS_BAND_5GHZ] =
1979*5113495bSYour Name 				user_cfg->num_tx_chains[NSS_CHAINS_BAND_5GHZ];
1980*5113495bSYour Name 
1981*5113495bSYour Name 	vdev_user_cfg.rx_nss[NSS_CHAINS_BAND_2GHZ] =
1982*5113495bSYour Name 				user_cfg->rx_nss[NSS_CHAINS_BAND_2GHZ];
1983*5113495bSYour Name 	vdev_user_cfg.tx_nss[NSS_CHAINS_BAND_2GHZ] =
1984*5113495bSYour Name 				user_cfg->tx_nss[NSS_CHAINS_BAND_2GHZ];
1985*5113495bSYour Name 	vdev_user_cfg.rx_nss[NSS_CHAINS_BAND_5GHZ] =
1986*5113495bSYour Name 				user_cfg->rx_nss[NSS_CHAINS_BAND_5GHZ];
1987*5113495bSYour Name 	vdev_user_cfg.tx_nss[NSS_CHAINS_BAND_5GHZ] =
1988*5113495bSYour Name 				user_cfg->tx_nss[NSS_CHAINS_BAND_5GHZ];
1989*5113495bSYour Name 
1990*5113495bSYour Name 	vdev_user_cfg.num_tx_chains_11a = user_cfg->num_tx_chains_11a;
1991*5113495bSYour Name 	vdev_user_cfg.num_tx_chains_11b = user_cfg->num_tx_chains_11b;
1992*5113495bSYour Name 	vdev_user_cfg.num_tx_chains_11g = user_cfg->num_tx_chains_11g;
1993*5113495bSYour Name 
1994*5113495bSYour Name 	return wmi_unified_vdev_nss_chain_params_send(wma_handle->wmi_handle,
1995*5113495bSYour Name 						      vdev_id,
1996*5113495bSYour Name 						      &vdev_user_cfg);
1997*5113495bSYour Name }
1998*5113495bSYour Name 
1999*5113495bSYour Name /**
2000*5113495bSYour Name  * wma_antenna_isolation_event_handler() - antenna isolation event handler
2001*5113495bSYour Name  * @handle: wma handle
2002*5113495bSYour Name  * @param: event data
2003*5113495bSYour Name  * @len: length
2004*5113495bSYour Name  *
2005*5113495bSYour Name  * Return: 0 for success or error code
2006*5113495bSYour Name  */
wma_antenna_isolation_event_handler(void * handle,u8 * param,u32 len)2007*5113495bSYour Name static int wma_antenna_isolation_event_handler(void *handle,
2008*5113495bSYour Name 					       u8 *param,
2009*5113495bSYour Name 					       u32 len)
2010*5113495bSYour Name {
2011*5113495bSYour Name 	struct scheduler_msg cds_msg = {0};
2012*5113495bSYour Name 	wmi_coex_report_isolation_event_fixed_param *event;
2013*5113495bSYour Name 	WMI_COEX_REPORT_ANTENNA_ISOLATION_EVENTID_param_tlvs *param_buf;
2014*5113495bSYour Name 	struct sir_isolation_resp *pisolation;
2015*5113495bSYour Name 	struct mac_context *mac = NULL;
2016*5113495bSYour Name 
2017*5113495bSYour Name 	wma_debug("handle %pK param %pK len %d", handle, param, len);
2018*5113495bSYour Name 
2019*5113495bSYour Name 	mac = (struct mac_context *)cds_get_context(QDF_MODULE_ID_PE);
2020*5113495bSYour Name 	if (!mac) {
2021*5113495bSYour Name 		wma_err("Invalid mac context");
2022*5113495bSYour Name 		return -EINVAL;
2023*5113495bSYour Name 	}
2024*5113495bSYour Name 
2025*5113495bSYour Name 	pisolation = qdf_mem_malloc(sizeof(*pisolation));
2026*5113495bSYour Name 	if (!pisolation)
2027*5113495bSYour Name 		return 0;
2028*5113495bSYour Name 
2029*5113495bSYour Name 	param_buf =
2030*5113495bSYour Name 		(WMI_COEX_REPORT_ANTENNA_ISOLATION_EVENTID_param_tlvs *)param;
2031*5113495bSYour Name 	if (!param_buf) {
2032*5113495bSYour Name 		wma_err("Invalid isolation event");
2033*5113495bSYour Name 		return -EINVAL;
2034*5113495bSYour Name 	}
2035*5113495bSYour Name 	event = param_buf->fixed_param;
2036*5113495bSYour Name 	pisolation->isolation_chain0 = event->isolation_chain0;
2037*5113495bSYour Name 	pisolation->isolation_chain1 = event->isolation_chain1;
2038*5113495bSYour Name 	pisolation->isolation_chain2 = event->isolation_chain2;
2039*5113495bSYour Name 	pisolation->isolation_chain3 = event->isolation_chain3;
2040*5113495bSYour Name 
2041*5113495bSYour Name 	wma_debug("chain1 %d chain2 %d chain3 %d chain4 %d",
2042*5113495bSYour Name 		 pisolation->isolation_chain0, pisolation->isolation_chain1,
2043*5113495bSYour Name 		 pisolation->isolation_chain2, pisolation->isolation_chain3);
2044*5113495bSYour Name 
2045*5113495bSYour Name 	cds_msg.type = eWNI_SME_ANTENNA_ISOLATION_RSP;
2046*5113495bSYour Name 	cds_msg.bodyptr = pisolation;
2047*5113495bSYour Name 	cds_msg.bodyval = 0;
2048*5113495bSYour Name 	if (QDF_STATUS_SUCCESS !=
2049*5113495bSYour Name 	    scheduler_post_message(QDF_MODULE_ID_WMA,
2050*5113495bSYour Name 				   QDF_MODULE_ID_SME,
2051*5113495bSYour Name 				   QDF_MODULE_ID_SME, &cds_msg)) {
2052*5113495bSYour Name 		wma_err("could not post peer info rsp msg to SME");
2053*5113495bSYour Name 		/* free the mem and return */
2054*5113495bSYour Name 		qdf_mem_free(pisolation);
2055*5113495bSYour Name 	}
2056*5113495bSYour Name 
2057*5113495bSYour Name 	return 0;
2058*5113495bSYour Name }
2059*5113495bSYour Name 
2060*5113495bSYour Name /**
2061*5113495bSYour Name  * wma_init_max_no_of_peers - API to initialize wma configuration params
2062*5113495bSYour Name  * @wma_handle: WMA Handle
2063*5113495bSYour Name  * @max_peers: Max Peers supported
2064*5113495bSYour Name  *
2065*5113495bSYour Name  * Return: void
2066*5113495bSYour Name  */
wma_init_max_no_of_peers(tp_wma_handle wma_handle,uint16_t max_peers)2067*5113495bSYour Name static uint8_t wma_init_max_no_of_peers(tp_wma_handle wma_handle,
2068*5113495bSYour Name 				     uint16_t max_peers)
2069*5113495bSYour Name {
2070*5113495bSYour Name 	struct wma_ini_config *cfg = wma_get_ini_handle(wma_handle);
2071*5113495bSYour Name 	struct hif_opaque_softc *scn = cds_get_context(QDF_MODULE_ID_HIF);
2072*5113495bSYour Name 	uint32_t tgt_version = hif_get_target_info_handle(scn)->target_version;
2073*5113495bSYour Name 	uint8_t max_no_of_peers;
2074*5113495bSYour Name 	uint8_t max_supported_peers;
2075*5113495bSYour Name 
2076*5113495bSYour Name 	if (!cfg) {
2077*5113495bSYour Name 		wma_err("NULL WMA ini handle");
2078*5113495bSYour Name 		return 0;
2079*5113495bSYour Name 	}
2080*5113495bSYour Name 
2081*5113495bSYour Name 	switch (tgt_version) {
2082*5113495bSYour Name 	case AR6320_REV1_1_VERSION:
2083*5113495bSYour Name 		max_supported_peers = MAX_SUPPORTED_PEERS_REV1_1;
2084*5113495bSYour Name 		break;
2085*5113495bSYour Name 	case AR6320_REV1_3_VERSION:
2086*5113495bSYour Name 		max_supported_peers = MAX_SUPPORTED_PEERS_REV1_3;
2087*5113495bSYour Name 		break;
2088*5113495bSYour Name 	default:
2089*5113495bSYour Name 		max_supported_peers = MAX_SUPPORTED_PEERS;
2090*5113495bSYour Name 		break;
2091*5113495bSYour Name 	}
2092*5113495bSYour Name 	max_no_of_peers = (max_peers > max_supported_peers) ?
2093*5113495bSYour Name 				max_supported_peers : max_peers;
2094*5113495bSYour Name 	cfg->max_no_of_peers = max_no_of_peers;
2095*5113495bSYour Name 
2096*5113495bSYour Name 	return max_no_of_peers;
2097*5113495bSYour Name }
2098*5113495bSYour Name 
2099*5113495bSYour Name /**
2100*5113495bSYour Name  * wma_cleanup_hold_req() - cleanup hold request queue
2101*5113495bSYour Name  * @wma: wma handle
2102*5113495bSYour Name  *
2103*5113495bSYour Name  * Return: none
2104*5113495bSYour Name  */
wma_cleanup_hold_req(tp_wma_handle wma)2105*5113495bSYour Name static void wma_cleanup_hold_req(tp_wma_handle wma)
2106*5113495bSYour Name {
2107*5113495bSYour Name 	struct wma_target_req *req_msg = NULL;
2108*5113495bSYour Name 	qdf_list_node_t *node1 = NULL;
2109*5113495bSYour Name 
2110*5113495bSYour Name 	qdf_spin_lock_bh(&wma->wma_hold_req_q_lock);
2111*5113495bSYour Name 	if (!qdf_list_size(&wma->wma_hold_req_queue)) {
2112*5113495bSYour Name 		qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
2113*5113495bSYour Name 		wma_debug("request queue is empty");
2114*5113495bSYour Name 		return;
2115*5113495bSYour Name 	}
2116*5113495bSYour Name 
2117*5113495bSYour Name 	/* peek front, and then cleanup it in wma_hold_req_timer */
2118*5113495bSYour Name 	while (QDF_STATUS_SUCCESS ==
2119*5113495bSYour Name 		qdf_list_peek_front(&wma->wma_hold_req_queue, &node1)) {
2120*5113495bSYour Name 		req_msg = qdf_container_of(node1, struct wma_target_req, node);
2121*5113495bSYour Name 		qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
2122*5113495bSYour Name 		/* Cleanup timeout handler */
2123*5113495bSYour Name 		qdf_mc_timer_stop(&req_msg->event_timeout);
2124*5113495bSYour Name 		wma_hold_req_timer(req_msg);
2125*5113495bSYour Name 		qdf_spin_lock_bh(&wma->wma_hold_req_q_lock);
2126*5113495bSYour Name 	}
2127*5113495bSYour Name 	qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
2128*5113495bSYour Name }
2129*5113495bSYour Name 
2130*5113495bSYour Name /**
2131*5113495bSYour Name  * wma_cleanup_vdev_resp_and_hold_req() - cleaunup the vdev resp and hold req
2132*5113495bSYour Name  * queue
2133*5113495bSYour Name  * @msg :scheduler msg
2134*5113495bSYour Name  *
2135*5113495bSYour Name  * Return: QDF_STATUS
2136*5113495bSYour Name  */
2137*5113495bSYour Name static QDF_STATUS
wma_cleanup_vdev_resp_and_hold_req(struct scheduler_msg * msg)2138*5113495bSYour Name wma_cleanup_vdev_resp_and_hold_req(struct scheduler_msg *msg)
2139*5113495bSYour Name {
2140*5113495bSYour Name 	tp_wma_handle wma;
2141*5113495bSYour Name 
2142*5113495bSYour Name 	if (!msg || !msg->bodyptr) {
2143*5113495bSYour Name 		wma_err("msg or body pointer is NULL");
2144*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
2145*5113495bSYour Name 	}
2146*5113495bSYour Name 
2147*5113495bSYour Name 	wma = msg->bodyptr;
2148*5113495bSYour Name 	target_if_flush_psoc_vdev_timers(wma->psoc);
2149*5113495bSYour Name 	wma_cleanup_hold_req(wma);
2150*5113495bSYour Name 
2151*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2152*5113495bSYour Name }
2153*5113495bSYour Name 
2154*5113495bSYour Name /**
2155*5113495bSYour Name  * wma_cleanup_vdev_resp_and_hold_req_flush_cb() - flush cb for the msg to clean
2156*5113495bSYour Name  * up vdev resp and hold req
2157*5113495bSYour Name  * @msg :scheduler msg
2158*5113495bSYour Name  *
2159*5113495bSYour Name  * As passed msg->bodyptr is wma in this case this is dummy flush cb so that
2160*5113495bSYour Name  * driver doesn't try to free msg->bodyptr when this msg is flushed.
2161*5113495bSYour Name  *
2162*5113495bSYour Name  * Return: QDF_STATUS
2163*5113495bSYour Name  */
2164*5113495bSYour Name static inline QDF_STATUS
wma_cleanup_vdev_resp_and_hold_req_flush_cb(struct scheduler_msg * msg)2165*5113495bSYour Name wma_cleanup_vdev_resp_and_hold_req_flush_cb(struct scheduler_msg *msg)
2166*5113495bSYour Name {
2167*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2168*5113495bSYour Name }
2169*5113495bSYour Name 
2170*5113495bSYour Name /**
2171*5113495bSYour Name  * wma_shutdown_notifier_cb - Shutdown notifier call back
2172*5113495bSYour Name  * @priv : WMA handle
2173*5113495bSYour Name  *
2174*5113495bSYour Name  * During recovery, WMA may wait for resume to complete if the crash happens
2175*5113495bSYour Name  * while in suspend. This may cause delays in completing the recovery. This call
2176*5113495bSYour Name  * back would be called during recovery and the event is completed so that if
2177*5113495bSYour Name  * the resume is waiting on FW to respond then it can get out of the wait so
2178*5113495bSYour Name  * that recovery thread can start bringing down all the modules.
2179*5113495bSYour Name  *
2180*5113495bSYour Name  * Return: None
2181*5113495bSYour Name  */
wma_shutdown_notifier_cb(void * priv)2182*5113495bSYour Name static void wma_shutdown_notifier_cb(void *priv)
2183*5113495bSYour Name {
2184*5113495bSYour Name 	tp_wma_handle wma_handle = priv;
2185*5113495bSYour Name 	struct scheduler_msg msg = { 0 };
2186*5113495bSYour Name 	QDF_STATUS status;
2187*5113495bSYour Name 
2188*5113495bSYour Name 	ucfg_pmo_psoc_wakeup_host_event_received(wma_handle->psoc);
2189*5113495bSYour Name 	wmi_stop(wma_handle->wmi_handle);
2190*5113495bSYour Name 
2191*5113495bSYour Name 	msg.bodyptr = wma_handle;
2192*5113495bSYour Name 	msg.callback = wma_cleanup_vdev_resp_and_hold_req;
2193*5113495bSYour Name 	msg.flush_callback = wma_cleanup_vdev_resp_and_hold_req_flush_cb;
2194*5113495bSYour Name 	status = scheduler_post_message(QDF_MODULE_ID_WMA,
2195*5113495bSYour Name 					QDF_MODULE_ID_WMA,
2196*5113495bSYour Name 					QDF_MODULE_ID_TARGET_IF, &msg);
2197*5113495bSYour Name }
2198*5113495bSYour Name 
2199*5113495bSYour Name struct wma_version_info g_wmi_version_info;
2200*5113495bSYour Name 
2201*5113495bSYour Name #ifdef WLAN_FEATURE_MEMDUMP_ENABLE
2202*5113495bSYour Name /**
2203*5113495bSYour Name  * wma_state_info_dump() - prints state information of wma layer
2204*5113495bSYour Name  * @buf_ptr: buffer pointer
2205*5113495bSYour Name  * @size: size of buffer to be filled
2206*5113495bSYour Name  *
2207*5113495bSYour Name  * This function is used to dump state information of wma layer
2208*5113495bSYour Name  *
2209*5113495bSYour Name  * Return: None
2210*5113495bSYour Name  */
wma_state_info_dump(char ** buf_ptr,uint16_t * size)2211*5113495bSYour Name static void wma_state_info_dump(char **buf_ptr, uint16_t *size)
2212*5113495bSYour Name {
2213*5113495bSYour Name 	uint8_t vdev_id;
2214*5113495bSYour Name 	uint16_t len = 0;
2215*5113495bSYour Name 	t_wma_handle *wma;
2216*5113495bSYour Name 	char *buf = *buf_ptr;
2217*5113495bSYour Name 	struct wma_txrx_node *iface;
2218*5113495bSYour Name 	struct wake_lock_stats stats;
2219*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
2220*5113495bSYour Name 	uint32_t rate_flag;
2221*5113495bSYour Name 	QDF_STATUS status;
2222*5113495bSYour Name 
2223*5113495bSYour Name 	wma = cds_get_context(QDF_MODULE_ID_WMA);
2224*5113495bSYour Name 	if (!wma)
2225*5113495bSYour Name 		return;
2226*5113495bSYour Name 
2227*5113495bSYour Name 	wma_debug("size of buffer: %d", *size);
2228*5113495bSYour Name 
2229*5113495bSYour Name 	for (vdev_id = 0; vdev_id < wma->max_bssid; vdev_id++) {
2230*5113495bSYour Name 		iface = &wma->interfaces[vdev_id];
2231*5113495bSYour Name 		vdev = iface->vdev;
2232*5113495bSYour Name 		if (!vdev)
2233*5113495bSYour Name 			continue;
2234*5113495bSYour Name 
2235*5113495bSYour Name 		status = wma_get_vdev_rate_flag(iface->vdev, &rate_flag);
2236*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(status))
2237*5113495bSYour Name 			continue;
2238*5113495bSYour Name 
2239*5113495bSYour Name 		vdev = wlan_objmgr_get_vdev_by_id_from_psoc(wma->psoc,
2240*5113495bSYour Name 						vdev_id, WLAN_LEGACY_WMA_ID);
2241*5113495bSYour Name 		if (!vdev)
2242*5113495bSYour Name 			continue;
2243*5113495bSYour Name 		ucfg_mc_cp_stats_get_vdev_wake_lock_stats(vdev, &stats);
2244*5113495bSYour Name 		len += qdf_scnprintf(buf + len, *size - len,
2245*5113495bSYour Name 			"\n"
2246*5113495bSYour Name 			"vdev_id %d\n"
2247*5113495bSYour Name 			"WoW Stats\n"
2248*5113495bSYour Name 			"\tpno_match %u\n"
2249*5113495bSYour Name 			"\tpno_complete %u\n"
2250*5113495bSYour Name 			"\tgscan %u\n"
2251*5113495bSYour Name 			"\tlow_rssi %u\n"
2252*5113495bSYour Name 			"\trssi_breach %u\n"
2253*5113495bSYour Name 			"\tucast %u\n"
2254*5113495bSYour Name 			"\tbcast %u\n"
2255*5113495bSYour Name 			"\ticmpv4 %u\n"
2256*5113495bSYour Name 			"\ticmpv6 %u\n"
2257*5113495bSYour Name 			"\tipv4_mcast %u\n"
2258*5113495bSYour Name 			"\tipv6_mcast %u\n"
2259*5113495bSYour Name 			"\tipv6_mcast_ra %u\n"
2260*5113495bSYour Name 			"\tipv6_mcast_ns %u\n"
2261*5113495bSYour Name 			"\tipv6_mcast_na %u\n"
2262*5113495bSYour Name 			"\toem_response %u\n"
2263*5113495bSYour Name 			"\tuc_drop %u\n"
2264*5113495bSYour Name 			"\tfatal_event %u\n"
2265*5113495bSYour Name 			"dtimPeriod %d\n"
2266*5113495bSYour Name 			"chan_width %d\n"
2267*5113495bSYour Name 			"vdev_active %d\n"
2268*5113495bSYour Name 			"vdev_up %d\n"
2269*5113495bSYour Name 			"aid %d\n"
2270*5113495bSYour Name 			"rate_flags %d\n"
2271*5113495bSYour Name 			"nss %d\n"
2272*5113495bSYour Name 			"nwType %d\n"
2273*5113495bSYour Name 			"tx_streams %d",
2274*5113495bSYour Name 			vdev_id,
2275*5113495bSYour Name 			stats.pno_match_wake_up_count,
2276*5113495bSYour Name 			stats.pno_complete_wake_up_count,
2277*5113495bSYour Name 			stats.gscan_wake_up_count,
2278*5113495bSYour Name 			stats.low_rssi_wake_up_count,
2279*5113495bSYour Name 			stats.rssi_breach_wake_up_count,
2280*5113495bSYour Name 			stats.ucast_wake_up_count,
2281*5113495bSYour Name 			stats.bcast_wake_up_count,
2282*5113495bSYour Name 			stats.icmpv4_count,
2283*5113495bSYour Name 			stats.icmpv6_count,
2284*5113495bSYour Name 			stats.ipv4_mcast_wake_up_count,
2285*5113495bSYour Name 			stats.ipv6_mcast_wake_up_count,
2286*5113495bSYour Name 			stats.ipv6_mcast_ra_stats,
2287*5113495bSYour Name 			stats.ipv6_mcast_ns_stats,
2288*5113495bSYour Name 			stats.ipv6_mcast_na_stats,
2289*5113495bSYour Name 			stats.oem_response_wake_up_count,
2290*5113495bSYour Name 			stats.uc_drop_wake_up_count,
2291*5113495bSYour Name 			stats.fatal_event_wake_up_count,
2292*5113495bSYour Name 			iface->dtimPeriod,
2293*5113495bSYour Name 			iface->chan_width,
2294*5113495bSYour Name 			iface->vdev_active,
2295*5113495bSYour Name 			wma_is_vdev_up(vdev_id),
2296*5113495bSYour Name 			iface->aid,
2297*5113495bSYour Name 			rate_flag,
2298*5113495bSYour Name 			iface->nss,
2299*5113495bSYour Name 			iface->nwType,
2300*5113495bSYour Name 			iface->tx_streams);
2301*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID);
2302*5113495bSYour Name 	}
2303*5113495bSYour Name 
2304*5113495bSYour Name 	*size -= len;
2305*5113495bSYour Name 	*buf_ptr += len;
2306*5113495bSYour Name }
2307*5113495bSYour Name 
2308*5113495bSYour Name /**
2309*5113495bSYour Name  * wma_register_debug_callback() - registration function for wma layer
2310*5113495bSYour Name  * to print wma state information
2311*5113495bSYour Name  */
wma_register_debug_callback(void)2312*5113495bSYour Name static void wma_register_debug_callback(void)
2313*5113495bSYour Name {
2314*5113495bSYour Name 	qdf_register_debug_callback(QDF_MODULE_ID_WMA, &wma_state_info_dump);
2315*5113495bSYour Name }
2316*5113495bSYour Name #else /* WLAN_FEATURE_MEMDUMP_ENABLE */
wma_register_debug_callback(void)2317*5113495bSYour Name static void wma_register_debug_callback(void)
2318*5113495bSYour Name {
2319*5113495bSYour Name }
2320*5113495bSYour Name #endif /* WLAN_FEATURE_MEMDUMP_ENABLE */
2321*5113495bSYour Name /**
2322*5113495bSYour Name  * wma_register_tx_ops_handler() - register tx_ops of southbound
2323*5113495bSYour Name  * @tx_ops:  tx_ops pointer in southbound
2324*5113495bSYour Name  *
2325*5113495bSYour Name  * Return: 0 on success, errno on failure
2326*5113495bSYour Name  */
2327*5113495bSYour Name static QDF_STATUS
wma_register_tx_ops_handler(struct wlan_lmac_if_tx_ops * tx_ops)2328*5113495bSYour Name wma_register_tx_ops_handler(struct wlan_lmac_if_tx_ops *tx_ops)
2329*5113495bSYour Name {
2330*5113495bSYour Name 	/*
2331*5113495bSYour Name 	 * Assign tx_ops, it's up to UMAC modules to declare and define these
2332*5113495bSYour Name 	 * functions which are used to send wmi command to target.
2333*5113495bSYour Name 	 */
2334*5113495bSYour Name 
2335*5113495bSYour Name 	if (!tx_ops) {
2336*5113495bSYour Name 		wma_err("pointer to lmac if tx ops is NULL");
2337*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
2338*5113495bSYour Name 	}
2339*5113495bSYour Name 
2340*5113495bSYour Name 	/* mgmt_txrx component's tx ops */
2341*5113495bSYour Name 	tx_ops->mgmt_txrx_tx_ops.mgmt_tx_send = wma_mgmt_unified_cmd_send;
2342*5113495bSYour Name 
2343*5113495bSYour Name 	/* mgmt txrx component nbuf op for nbuf dma unmap */
2344*5113495bSYour Name 	tx_ops->mgmt_txrx_tx_ops.tx_drain_nbuf_op = wma_mgmt_nbuf_unmap_cb;
2345*5113495bSYour Name 
2346*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2347*5113495bSYour Name }
2348*5113495bSYour Name 
2349*5113495bSYour Name /**
2350*5113495bSYour Name  * wma_target_if_open() - Attach UMAC modules' interface with wmi layer
2351*5113495bSYour Name  * @wma_handle: wma handle
2352*5113495bSYour Name  *
2353*5113495bSYour Name  * Separate module defines below functions:
2354*5113495bSYour Name  * 1. tgt_wmi_<module>_<action> api sends wmi command, assigned to south bound
2355*5113495bSYour Name  *    tx_ops function pointers;
2356*5113495bSYour Name  * 2. module's south dispatcher handles information from lower layer, assigned
2357*5113495bSYour Name  *    to south bound rx_ops function pointers;
2358*5113495bSYour Name  * 3. wmi event handler deals with wmi event, extracts umac needed information,
2359*5113495bSYour Name  *    and call rx_ops(module's dispatcher). It executes in tasklet context and
2360*5113495bSYour Name  *    is up to dispatcher to decide the context to reside in tasklet or in
2361*5113495bSYour Name  *    thread context.
2362*5113495bSYour Name  *
2363*5113495bSYour Name  * Return: None
2364*5113495bSYour Name  */
wma_target_if_open(tp_wma_handle wma_handle)2365*5113495bSYour Name static void wma_target_if_open(tp_wma_handle wma_handle)
2366*5113495bSYour Name {
2367*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = wma_handle->psoc;
2368*5113495bSYour Name 
2369*5113495bSYour Name 	if (!psoc)
2370*5113495bSYour Name 		return;
2371*5113495bSYour Name 
2372*5113495bSYour Name 	wlan_global_lmac_if_set_txops_registration_cb(WLAN_DEV_OL,
2373*5113495bSYour Name 					target_if_register_tx_ops);
2374*5113495bSYour Name 	wlan_lmac_if_set_umac_txops_registration_cb(
2375*5113495bSYour Name 		wma_register_tx_ops_handler);
2376*5113495bSYour Name 	wlan_global_lmac_if_open(psoc);
2377*5113495bSYour Name 
2378*5113495bSYour Name }
2379*5113495bSYour Name 
2380*5113495bSYour Name /**
2381*5113495bSYour Name  * wma_legacy_service_ready_event_handler() - legacy (ext)service ready handler
2382*5113495bSYour Name  * @event_id: event_id
2383*5113495bSYour Name  * @handle: wma handle
2384*5113495bSYour Name  * @event_data: event data
2385*5113495bSYour Name  * @length: event length
2386*5113495bSYour Name  *
2387*5113495bSYour Name  * Return: 0 for success, negative error code for failure
2388*5113495bSYour Name  */
wma_legacy_service_ready_event_handler(uint32_t event_id,void * handle,uint8_t * event_data,uint32_t length)2389*5113495bSYour Name static int wma_legacy_service_ready_event_handler(uint32_t event_id,
2390*5113495bSYour Name 						  void *handle,
2391*5113495bSYour Name 						  uint8_t *event_data,
2392*5113495bSYour Name 						  uint32_t length)
2393*5113495bSYour Name {
2394*5113495bSYour Name 	switch (event_id) {
2395*5113495bSYour Name 	case wmi_service_ready_event_id:
2396*5113495bSYour Name 		return wma_rx_service_ready_event(handle, event_data, length);
2397*5113495bSYour Name 	case wmi_service_ready_ext_event_id:
2398*5113495bSYour Name 		return wma_rx_service_ready_ext_event(handle, event_data,
2399*5113495bSYour Name 						      length);
2400*5113495bSYour Name 	case wmi_ready_event_id:
2401*5113495bSYour Name 		return wma_rx_ready_event(handle, event_data, length);
2402*5113495bSYour Name 	case wmi_service_ready_ext2_event_id:
2403*5113495bSYour Name 		return wma_rx_service_ready_ext2_event(handle, event_data,
2404*5113495bSYour Name 						      length);
2405*5113495bSYour Name 	default:
2406*5113495bSYour Name 		wma_err("Legacy callback invoked with invalid event_id:%d",
2407*5113495bSYour Name 			 event_id);
2408*5113495bSYour Name 		QDF_BUG(0);
2409*5113495bSYour Name 	}
2410*5113495bSYour Name 
2411*5113495bSYour Name 	return 0;
2412*5113495bSYour Name }
2413*5113495bSYour Name 
2414*5113495bSYour Name #ifdef WLAN_FEATURE_CAL_FAILURE_TRIGGER
2415*5113495bSYour Name /**
2416*5113495bSYour Name  * wma_process_cal_fail_info() - Process cal failure event and
2417*5113495bSYour Name  *                               send it to userspace
2418*5113495bSYour Name  * @wmi_event:  Cal failure event data
2419*5113495bSYour Name  */
wma_process_cal_fail_info(uint8_t * wmi_event)2420*5113495bSYour Name static void wma_process_cal_fail_info(uint8_t *wmi_event)
2421*5113495bSYour Name {
2422*5113495bSYour Name 	struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
2423*5113495bSYour Name 	uint8_t *buf_ptr;
2424*5113495bSYour Name 	wmi_debug_mesg_fw_cal_failure_param *cal_failure_event;
2425*5113495bSYour Name 
2426*5113495bSYour Name 	if (!mac) {
2427*5113495bSYour Name 		wma_err("Invalid mac context");
2428*5113495bSYour Name 		return;
2429*5113495bSYour Name 	}
2430*5113495bSYour Name 
2431*5113495bSYour Name 	if (!mac->cal_failure_event_cb) {
2432*5113495bSYour Name 		wma_err("Callback not registered for cal failure event");
2433*5113495bSYour Name 		return;
2434*5113495bSYour Name 	}
2435*5113495bSYour Name 
2436*5113495bSYour Name 	buf_ptr = wmi_event;
2437*5113495bSYour Name 	buf_ptr = buf_ptr + sizeof(wmi_debug_mesg_flush_complete_fixed_param) +
2438*5113495bSYour Name 		  WMI_TLV_HDR_SIZE +
2439*5113495bSYour Name 		  sizeof(wmi_debug_mesg_fw_data_stall_param) + WMI_TLV_HDR_SIZE;
2440*5113495bSYour Name 
2441*5113495bSYour Name 	cal_failure_event = (wmi_debug_mesg_fw_cal_failure_param *)buf_ptr;
2442*5113495bSYour Name 
2443*5113495bSYour Name 	if (((cal_failure_event->tlv_header & 0xFFFF0000) >> 16 ==
2444*5113495bSYour Name 			WMITLV_TAG_STRUC_wmi_debug_mesg_fw_cal_failure_param)) {
2445*5113495bSYour Name 		/**
2446*5113495bSYour Name 		 * Log calibration failure information received from FW
2447*5113495bSYour Name 		 */
2448*5113495bSYour Name 		wma_debug("Calibration failure event:");
2449*5113495bSYour Name 		wma_debug("calType: %x calFailureReasonCode: %x",
2450*5113495bSYour Name 			  cal_failure_event->cal_type,
2451*5113495bSYour Name 			  cal_failure_event->cal_failure_reason_code);
2452*5113495bSYour Name 		mac->cal_failure_event_cb(
2453*5113495bSYour Name 				cal_failure_event->cal_type,
2454*5113495bSYour Name 				cal_failure_event->cal_failure_reason_code);
2455*5113495bSYour Name 	} else {
2456*5113495bSYour Name 		wma_err("Invalid TLV header in cal failure event");
2457*5113495bSYour Name 	}
2458*5113495bSYour Name }
2459*5113495bSYour Name #else
wma_process_cal_fail_info(uint8_t * wmi_event)2460*5113495bSYour Name static inline void wma_process_cal_fail_info(uint8_t *wmi_event)
2461*5113495bSYour Name {
2462*5113495bSYour Name }
2463*5113495bSYour Name #endif
2464*5113495bSYour Name 
2465*5113495bSYour Name /**
2466*5113495bSYour Name  * wma_flush_complete_evt_handler() - FW log flush complete event handler
2467*5113495bSYour Name  * @handle: WMI handle
2468*5113495bSYour Name  * @event:  Event received from FW
2469*5113495bSYour Name  * @len:    Length of the event
2470*5113495bSYour Name  *
2471*5113495bSYour Name  */
wma_flush_complete_evt_handler(void * handle,u_int8_t * event,u_int32_t len)2472*5113495bSYour Name static int wma_flush_complete_evt_handler(void *handle,
2473*5113495bSYour Name 		u_int8_t *event,
2474*5113495bSYour Name 		u_int32_t len)
2475*5113495bSYour Name {
2476*5113495bSYour Name 	QDF_STATUS status;
2477*5113495bSYour Name 	tp_wma_handle wma = (tp_wma_handle) handle;
2478*5113495bSYour Name 
2479*5113495bSYour Name 	WMI_DEBUG_MESG_FLUSH_COMPLETE_EVENTID_param_tlvs *param_buf;
2480*5113495bSYour Name 	wmi_debug_mesg_flush_complete_fixed_param *wmi_event;
2481*5113495bSYour Name 	wmi_debug_mesg_fw_data_stall_param *data_stall_event;
2482*5113495bSYour Name 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
2483*5113495bSYour Name 	uint8_t *buf_ptr;
2484*5113495bSYour Name 	uint32_t reason_code;
2485*5113495bSYour Name 
2486*5113495bSYour Name 	param_buf = (WMI_DEBUG_MESG_FLUSH_COMPLETE_EVENTID_param_tlvs *) event;
2487*5113495bSYour Name 	if (!param_buf) {
2488*5113495bSYour Name 		wma_err("Invalid log flush complete event buffer");
2489*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
2490*5113495bSYour Name 	}
2491*5113495bSYour Name 
2492*5113495bSYour Name 	wmi_event = param_buf->fixed_param;
2493*5113495bSYour Name 	reason_code = wmi_event->reserved0;
2494*5113495bSYour Name 	wma_debug("Received reason code %d from FW", reason_code);
2495*5113495bSYour Name 
2496*5113495bSYour Name 	if (reason_code == WMI_DIAG_TRIGGER_DATA_STALL) {
2497*5113495bSYour Name 		buf_ptr = (uint8_t *)wmi_event;
2498*5113495bSYour Name 		buf_ptr = buf_ptr +
2499*5113495bSYour Name 			  sizeof(wmi_debug_mesg_flush_complete_fixed_param) +
2500*5113495bSYour Name 			  WMI_TLV_HDR_SIZE;
2501*5113495bSYour Name 		data_stall_event =
2502*5113495bSYour Name 				(wmi_debug_mesg_fw_data_stall_param *)buf_ptr;
2503*5113495bSYour Name 	}
2504*5113495bSYour Name 
2505*5113495bSYour Name 	if (reason_code == WMI_DIAG_TRIGGER_DATA_STALL &&
2506*5113495bSYour Name 	    ((data_stall_event->tlv_header & 0xFFFF0000) >> 16 ==
2507*5113495bSYour Name 	      WMITLV_TAG_STRUC_wmi_debug_mesg_fw_data_stall_param)) {
2508*5113495bSYour Name 		/**
2509*5113495bSYour Name 		 * Log data stall info received from FW:
2510*5113495bSYour Name 		 *
2511*5113495bSYour Name 		 * Possible data stall recovery types:
2512*5113495bSYour Name 		 * WLAN_DBG_DATA_STALL_RECOVERY_CONNECT_DISCONNECT
2513*5113495bSYour Name 		 * WLAN_DBG_DATA_STALL_RECOVERY_CONNECT_MAC_PHY_RESET
2514*5113495bSYour Name 		 * WLAN_DBG_DATA_STALL_RECOVERY_CONNECT_PDR
2515*5113495bSYour Name 		 *
2516*5113495bSYour Name 		 * Possible data stall event types:
2517*5113495bSYour Name 		 * WLAN_DBG_DATA_STALL_VDEV_PAUSE
2518*5113495bSYour Name 		 * WLAN_DBG_DATA_STALL_HWSCHED_CMD_FILTER
2519*5113495bSYour Name 		 * WLAN_DBG_DATA_STALL_HWSCHED_CMD_FLUSH
2520*5113495bSYour Name 		 * WLAN_DBG_DATA_STALL_RX_REFILL_FAILED
2521*5113495bSYour Name 		 * WLAN_DBG_DATA_STALL_RX_FCS_LEN_ERROR
2522*5113495bSYour Name 		 *
2523*5113495bSYour Name 		 * reason_code1:
2524*5113495bSYour Name 		 * The information stored in reason_code1 varies based on the
2525*5113495bSYour Name 		 * data stall type values:
2526*5113495bSYour Name 		 *
2527*5113495bSYour Name 		 * data_stall_type      | reason_code1
2528*5113495bSYour Name 		 * -----------------------------------------------------
2529*5113495bSYour Name 		 * HWSCHED_CMD_FLUSH    | flush req reason (0-40)
2530*5113495bSYour Name 		 * RX_REFILL_FAILED     | ring_id (0-7)
2531*5113495bSYour Name 		 * RX_FCS_LEN_ERROR     | exact error type
2532*5113495bSYour Name 		 *
2533*5113495bSYour Name 		 * reasone_code2:
2534*5113495bSYour Name 		 * on which tid/hwq stall happened
2535*5113495bSYour Name 		 *
2536*5113495bSYour Name 		 */
2537*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG,
2538*5113495bSYour Name 			  "Data Stall event:");
2539*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG,
2540*5113495bSYour Name 			  "data_stall_type: %x vdev_id_bitmap: %x reason_code1: %x reason_code2: %x recovery_type: %x ",
2541*5113495bSYour Name 			  data_stall_event->data_stall_type,
2542*5113495bSYour Name 			  data_stall_event->vdev_id_bitmap,
2543*5113495bSYour Name 			  data_stall_event->reason_code1,
2544*5113495bSYour Name 			  data_stall_event->reason_code2,
2545*5113495bSYour Name 			  data_stall_event->recovery_type);
2546*5113495bSYour Name 
2547*5113495bSYour Name 		cdp_post_data_stall_event(soc,
2548*5113495bSYour Name 					DATA_STALL_LOG_INDICATOR_FIRMWARE,
2549*5113495bSYour Name 					data_stall_event->data_stall_type,
2550*5113495bSYour Name 					OL_TXRX_PDEV_ID,
2551*5113495bSYour Name 					data_stall_event->vdev_id_bitmap,
2552*5113495bSYour Name 					data_stall_event->recovery_type);
2553*5113495bSYour Name 	}
2554*5113495bSYour Name 
2555*5113495bSYour Name 	if (reason_code == WMI_DIAG_TRIGGER_CAL_FAILURE) {
2556*5113495bSYour Name 		wma_process_cal_fail_info((uint8_t *)wmi_event);
2557*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
2558*5113495bSYour Name 	}
2559*5113495bSYour Name 
2560*5113495bSYour Name 	/*
2561*5113495bSYour Name 	 * reason_code = 0; Flush event in response to flush command
2562*5113495bSYour Name 	 * reason_code = other value; Asynchronous flush event for fatal events
2563*5113495bSYour Name 	 */
2564*5113495bSYour Name 	if (!reason_code && (cds_is_log_report_in_progress() == false)) {
2565*5113495bSYour Name 		wma_debug("Received WMI flush event without sending CMD");
2566*5113495bSYour Name 		return -EINVAL;
2567*5113495bSYour Name 	} else if (!reason_code && cds_is_log_report_in_progress() == true) {
2568*5113495bSYour Name 		/* Flush event in response to flush command */
2569*5113495bSYour Name 		wma_debug("Received WMI flush event in response to flush CMD");
2570*5113495bSYour Name 		status = qdf_mc_timer_stop(&wma->log_completion_timer);
2571*5113495bSYour Name 		if (status != QDF_STATUS_SUCCESS)
2572*5113495bSYour Name 			wma_err("Failed to stop the log completion timeout");
2573*5113495bSYour Name 		cds_logging_set_fw_flush_complete();
2574*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
2575*5113495bSYour Name 	} else if (reason_code && cds_is_log_report_in_progress() == false) {
2576*5113495bSYour Name 		/* Asynchronous flush event for fatal events */
2577*5113495bSYour Name 		status = cds_set_log_completion(WLAN_LOG_TYPE_FATAL,
2578*5113495bSYour Name 				WLAN_LOG_INDICATOR_FIRMWARE,
2579*5113495bSYour Name 				reason_code, false);
2580*5113495bSYour Name 		if (QDF_STATUS_SUCCESS != status) {
2581*5113495bSYour Name 			wma_err("Failed to set log trigger params");
2582*5113495bSYour Name 			return QDF_STATUS_E_FAILURE;
2583*5113495bSYour Name 		}
2584*5113495bSYour Name 		cds_logging_set_fw_flush_complete();
2585*5113495bSYour Name 		return status;
2586*5113495bSYour Name 	} else {
2587*5113495bSYour Name 		/* Asynchronous flush event for fatal event,
2588*5113495bSYour Name 		 * but, report in progress already
2589*5113495bSYour Name 		 */
2590*5113495bSYour Name 		wma_debug("Bug report already in progress - dropping! type:%d, indicator=%d reason_code=%d",
2591*5113495bSYour Name 				WLAN_LOG_TYPE_FATAL,
2592*5113495bSYour Name 				WLAN_LOG_INDICATOR_FIRMWARE, reason_code);
2593*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
2594*5113495bSYour Name 	}
2595*5113495bSYour Name 	/* Asynchronous flush event for fatal event,
2596*5113495bSYour Name 	 * but, report in progress already
2597*5113495bSYour Name 	 */
2598*5113495bSYour Name 	wma_warn("Bug report already in progress - dropping! type:%d, indicator=%d reason_code=%d",
2599*5113495bSYour Name 		WLAN_LOG_TYPE_FATAL,
2600*5113495bSYour Name 		WLAN_LOG_INDICATOR_FIRMWARE, reason_code);
2601*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
2602*5113495bSYour Name }
2603*5113495bSYour Name 
2604*5113495bSYour Name #ifdef WLAN_CONV_SPECTRAL_ENABLE
2605*5113495bSYour Name /**
2606*5113495bSYour Name  * wma_extract_single_phyerr_spectral() - extract single phy error from event
2607*5113495bSYour Name  * @handle: wma handle
2608*5113495bSYour Name  * @evt_buf: pointer to event buffer
2609*5113495bSYour Name  * @datalen: data length of event buffer
2610*5113495bSYour Name  * @buf_offset: Pointer to hold value of current event buffer offset
2611*5113495bSYour Name  * post extraction
2612*5113495bSYour Name  * @phyerr: Pointer to hold phyerr
2613*5113495bSYour Name  *
2614*5113495bSYour Name  * Return: QDF_STATUS
2615*5113495bSYour Name  */
wma_extract_single_phyerr_spectral(void * handle,void * evt_buf,uint16_t datalen,uint16_t * buf_offset,wmi_host_phyerr_t * phyerr)2616*5113495bSYour Name static QDF_STATUS wma_extract_single_phyerr_spectral(void *handle,
2617*5113495bSYour Name 		void *evt_buf,
2618*5113495bSYour Name 		uint16_t datalen, uint16_t *buf_offset,
2619*5113495bSYour Name 		wmi_host_phyerr_t *phyerr)
2620*5113495bSYour Name {
2621*5113495bSYour Name 	wmi_single_phyerr_rx_event *ev;
2622*5113495bSYour Name 	int n = *buf_offset;
2623*5113495bSYour Name 
2624*5113495bSYour Name 	ev = (wmi_single_phyerr_rx_event *)((uint8_t *)evt_buf + n);
2625*5113495bSYour Name 
2626*5113495bSYour Name 	if (n < datalen) {
2627*5113495bSYour Name 		/* ensure there's at least space for the header */
2628*5113495bSYour Name 		if ((datalen - n) < sizeof(ev->hdr)) {
2629*5113495bSYour Name 			wma_err("not enough space? (datalen=%d, n=%d, hdr=%zu bytes",
2630*5113495bSYour Name 				datalen, n, sizeof(ev->hdr));
2631*5113495bSYour Name 			return QDF_STATUS_E_FAILURE;
2632*5113495bSYour Name 		}
2633*5113495bSYour Name 
2634*5113495bSYour Name 		phyerr->bufp = ev->bufp;
2635*5113495bSYour Name 		phyerr->buf_len = ev->hdr.buf_len;
2636*5113495bSYour Name 
2637*5113495bSYour Name 		/*
2638*5113495bSYour Name 		 * Sanity check the buffer length of the event against
2639*5113495bSYour Name 		 * what we currently have.
2640*5113495bSYour Name 		 *
2641*5113495bSYour Name 		 * Since buf_len is 32 bits, we check if it overflows
2642*5113495bSYour Name 		 * a large 32 bit value.  It's not 0x7fffffff because
2643*5113495bSYour Name 		 * we increase n by (buf_len + sizeof(hdr)), which would
2644*5113495bSYour Name 		 * in itself cause n to overflow.
2645*5113495bSYour Name 		 *
2646*5113495bSYour Name 		 * If "int" is 64 bits then this becomes a moot point.
2647*5113495bSYour Name 		 */
2648*5113495bSYour Name 		if (ev->hdr.buf_len > 0x7f000000) {
2649*5113495bSYour Name 			wma_err("buf_len is garbage? (0x%x)", ev->hdr.buf_len);
2650*5113495bSYour Name 			return QDF_STATUS_E_FAILURE;
2651*5113495bSYour Name 		}
2652*5113495bSYour Name 		if (n + ev->hdr.buf_len > datalen) {
2653*5113495bSYour Name 			wma_err("buf_len exceeds available space n=%d, buf_len=%d, datalen=%d",
2654*5113495bSYour Name 				n, ev->hdr.buf_len, datalen);
2655*5113495bSYour Name 			return QDF_STATUS_E_FAILURE;
2656*5113495bSYour Name 		}
2657*5113495bSYour Name 
2658*5113495bSYour Name 		phyerr->phy_err_code = WMI_UNIFIED_PHYERRCODE_GET(&ev->hdr);
2659*5113495bSYour Name 		phyerr->tsf_timestamp = ev->hdr.tsf_timestamp;
2660*5113495bSYour Name 
2661*5113495bSYour Name #ifdef DEBUG_SPECTRAL_SCAN
2662*5113495bSYour Name 		wma_debug("len=%d, tsf=0x%08x, rssi = 0x%x/0x%x/0x%x/0x%x, comb rssi = 0x%x, phycode=%d",
2663*5113495bSYour Name 				ev->hdr.buf_len,
2664*5113495bSYour Name 				ev->hdr.tsf_timestamp,
2665*5113495bSYour Name 				ev->hdr.rssi_chain0,
2666*5113495bSYour Name 				ev->hdr.rssi_chain1,
2667*5113495bSYour Name 				ev->hdr.rssi_chain2,
2668*5113495bSYour Name 				ev->hdr.rssi_chain3,
2669*5113495bSYour Name 				WMI_UNIFIED_RSSI_COMB_GET(&ev->hdr),
2670*5113495bSYour Name 					  phyerr->phy_err_code);
2671*5113495bSYour Name 
2672*5113495bSYour Name 		/*
2673*5113495bSYour Name 		 * For now, unroll this loop - the chain 'value' field isn't
2674*5113495bSYour Name 		 * a variable but glued together into a macro field definition.
2675*5113495bSYour Name 		 * Grr. :-)
2676*5113495bSYour Name 		 */
2677*5113495bSYour Name 		wma_debug("chain 0: raw=0x%08x; pri20=%d sec20=%d sec40=%d sec80=%d",
2678*5113495bSYour Name 				ev->hdr.rssi_chain0,
2679*5113495bSYour Name 				WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 0, PRI20),
2680*5113495bSYour Name 				WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 0, SEC20),
2681*5113495bSYour Name 				WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 0, SEC40),
2682*5113495bSYour Name 				WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 0, SEC80));
2683*5113495bSYour Name 
2684*5113495bSYour Name 		wma_debug("chain 1: raw=0x%08x: pri20=%d sec20=%d sec40=%d sec80=%d",
2685*5113495bSYour Name 				ev->hdr.rssi_chain1,
2686*5113495bSYour Name 				WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 1, PRI20),
2687*5113495bSYour Name 				WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 1, SEC20),
2688*5113495bSYour Name 				WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 1, SEC40),
2689*5113495bSYour Name 				WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 1, SEC80));
2690*5113495bSYour Name 
2691*5113495bSYour Name 		wma_debug("chain 2: raw=0x%08x: pri20=%d sec20=%d sec40=%d sec80=%d",
2692*5113495bSYour Name 				ev->hdr.rssi_chain2,
2693*5113495bSYour Name 				WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 2, PRI20),
2694*5113495bSYour Name 				WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 2, SEC20),
2695*5113495bSYour Name 				WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 2, SEC40),
2696*5113495bSYour Name 				WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 2, SEC80));
2697*5113495bSYour Name 
2698*5113495bSYour Name 		wma_debug("chain 3: raw=0x%08x: pri20=%d sec20=%d sec40=%d sec80=%d",
2699*5113495bSYour Name 				ev->hdr.rssi_chain3,
2700*5113495bSYour Name 				WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 3, PRI20),
2701*5113495bSYour Name 				WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 3, SEC20),
2702*5113495bSYour Name 				WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 3, SEC40),
2703*5113495bSYour Name 				WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 3, SEC80));
2704*5113495bSYour Name 
2705*5113495bSYour Name 
2706*5113495bSYour Name 		wma_debug("freq_info_1=0x%08x, freq_info_2=0x%08x",
2707*5113495bSYour Name 			   ev->hdr.freq_info_1, ev->hdr.freq_info_2);
2708*5113495bSYour Name 
2709*5113495bSYour Name 		/*
2710*5113495bSYour Name 		 * The NF chain values are signed and are negative - hence
2711*5113495bSYour Name 		 * the cast evilness.
2712*5113495bSYour Name 		 */
2713*5113495bSYour Name 		wma_debug("nfval[1]=0x%08x, nfval[2]=0x%08x, nf=%d/%d/%d/%d, freq1=%d, freq2=%d, cw=%d",
2714*5113495bSYour Name 				ev->hdr.nf_list_1,
2715*5113495bSYour Name 				ev->hdr.nf_list_2,
2716*5113495bSYour Name 				(int) WMI_UNIFIED_NF_CHAIN_GET(&ev->hdr, 0),
2717*5113495bSYour Name 				(int) WMI_UNIFIED_NF_CHAIN_GET(&ev->hdr, 1),
2718*5113495bSYour Name 				(int) WMI_UNIFIED_NF_CHAIN_GET(&ev->hdr, 2),
2719*5113495bSYour Name 				(int) WMI_UNIFIED_NF_CHAIN_GET(&ev->hdr, 3),
2720*5113495bSYour Name 				WMI_UNIFIED_FREQ_INFO_GET(&ev->hdr, 1),
2721*5113495bSYour Name 				WMI_UNIFIED_FREQ_INFO_GET(&ev->hdr, 2),
2722*5113495bSYour Name 				WMI_UNIFIED_CHWIDTH_GET(&ev->hdr));
2723*5113495bSYour Name #endif
2724*5113495bSYour Name 
2725*5113495bSYour Name 		/*
2726*5113495bSYour Name 		 * If required, pass spectral events to the spectral module
2727*5113495bSYour Name 		 */
2728*5113495bSYour Name 		if (ev->hdr.buf_len > 0) {
2729*5113495bSYour Name 
2730*5113495bSYour Name 			/* Initialize the NF values to Zero. */
2731*5113495bSYour Name 			phyerr->rf_info.noise_floor[0] =
2732*5113495bSYour Name 			    WMI_UNIFIED_NF_CHAIN_GET(&ev->hdr, 0);
2733*5113495bSYour Name 			phyerr->rf_info.noise_floor[1] =
2734*5113495bSYour Name 			    WMI_UNIFIED_NF_CHAIN_GET(&ev->hdr, 1);
2735*5113495bSYour Name 			phyerr->rf_info.noise_floor[2] =
2736*5113495bSYour Name 			    WMI_UNIFIED_NF_CHAIN_GET(&ev->hdr, 2);
2737*5113495bSYour Name 			phyerr->rf_info.noise_floor[3] =
2738*5113495bSYour Name 			    WMI_UNIFIED_NF_CHAIN_GET(&ev->hdr, 3);
2739*5113495bSYour Name 
2740*5113495bSYour Name 			/* populate the rf info */
2741*5113495bSYour Name 			phyerr->rf_info.rssi_comb =
2742*5113495bSYour Name 			    WMI_UNIFIED_RSSI_COMB_GET(&ev->hdr);
2743*5113495bSYour Name 
2744*5113495bSYour Name 			/* Need to unroll loop due to macro
2745*5113495bSYour Name 			 * constraints chain 0
2746*5113495bSYour Name 			 */
2747*5113495bSYour Name 			phyerr->rf_info.pc_rssi_info[0].rssi_pri20 =
2748*5113495bSYour Name 			WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 0, PRI20);
2749*5113495bSYour Name 			phyerr->rf_info.pc_rssi_info[0].rssi_sec20 =
2750*5113495bSYour Name 			WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 0, SEC20);
2751*5113495bSYour Name 			phyerr->rf_info.pc_rssi_info[0].rssi_sec40 =
2752*5113495bSYour Name 			WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 0, SEC40);
2753*5113495bSYour Name 			phyerr->rf_info.pc_rssi_info[0].rssi_sec80 =
2754*5113495bSYour Name 			WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 0, SEC80);
2755*5113495bSYour Name 
2756*5113495bSYour Name 			/* chain 1 */
2757*5113495bSYour Name 			phyerr->rf_info.pc_rssi_info[1].rssi_pri20 =
2758*5113495bSYour Name 			WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 1, PRI20);
2759*5113495bSYour Name 			phyerr->rf_info.pc_rssi_info[1].rssi_sec20 =
2760*5113495bSYour Name 			WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 1, SEC20);
2761*5113495bSYour Name 			phyerr->rf_info.pc_rssi_info[1].rssi_sec40 =
2762*5113495bSYour Name 			WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 1, SEC40);
2763*5113495bSYour Name 			phyerr->rf_info.pc_rssi_info[1].rssi_sec80 =
2764*5113495bSYour Name 			WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 1, SEC80);
2765*5113495bSYour Name 
2766*5113495bSYour Name 			/* chain 2 */
2767*5113495bSYour Name 			phyerr->rf_info.pc_rssi_info[2].rssi_pri20 =
2768*5113495bSYour Name 			WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 2, PRI20);
2769*5113495bSYour Name 			phyerr->rf_info.pc_rssi_info[2].rssi_sec20 =
2770*5113495bSYour Name 			WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 2, SEC20);
2771*5113495bSYour Name 			phyerr->rf_info.pc_rssi_info[2].rssi_sec40 =
2772*5113495bSYour Name 			WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 2, SEC40);
2773*5113495bSYour Name 			phyerr->rf_info.pc_rssi_info[2].rssi_sec80 =
2774*5113495bSYour Name 			WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 2, SEC80);
2775*5113495bSYour Name 
2776*5113495bSYour Name 			/* chain 3 */
2777*5113495bSYour Name 			phyerr->rf_info.pc_rssi_info[3].rssi_pri20 =
2778*5113495bSYour Name 			WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 3, PRI20);
2779*5113495bSYour Name 			phyerr->rf_info.pc_rssi_info[3].rssi_sec20 =
2780*5113495bSYour Name 			WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 3, SEC20);
2781*5113495bSYour Name 			phyerr->rf_info.pc_rssi_info[3].rssi_sec40 =
2782*5113495bSYour Name 			WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 3, SEC40);
2783*5113495bSYour Name 			phyerr->rf_info.pc_rssi_info[3].rssi_sec80 =
2784*5113495bSYour Name 			WMI_UNIFIED_RSSI_CHAN_GET(&ev->hdr, 3, SEC80);
2785*5113495bSYour Name 
2786*5113495bSYour Name 			phyerr->chan_info.center_freq1 =
2787*5113495bSYour Name 			    WMI_UNIFIED_FREQ_INFO_GET(&ev->hdr, 1);
2788*5113495bSYour Name 			phyerr->chan_info.center_freq2 =
2789*5113495bSYour Name 			    WMI_UNIFIED_FREQ_INFO_GET(&ev->hdr, 2);
2790*5113495bSYour Name 
2791*5113495bSYour Name 		}
2792*5113495bSYour Name 
2793*5113495bSYour Name 		/*
2794*5113495bSYour Name 		 * Advance the buffer pointer to the next PHY error.
2795*5113495bSYour Name 		 * buflen is the length of this payload, so we need to
2796*5113495bSYour Name 		 * advance past the current header _AND_ the payload.
2797*5113495bSYour Name 		 */
2798*5113495bSYour Name 		 n += sizeof(*ev) + ev->hdr.buf_len;
2799*5113495bSYour Name 	}
2800*5113495bSYour Name 	*buf_offset += n;
2801*5113495bSYour Name 
2802*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2803*5113495bSYour Name }
2804*5113495bSYour Name 
2805*5113495bSYour Name /**
2806*5113495bSYour Name  * spectral_phyerr_event_handler() - spectral phyerr event handler
2807*5113495bSYour Name  * @handle: wma handle
2808*5113495bSYour Name  * @data: data buffer
2809*5113495bSYour Name  * @datalen: buffer length
2810*5113495bSYour Name  *
2811*5113495bSYour Name  * Return:  QDF_STATUS
2812*5113495bSYour Name  */
spectral_phyerr_event_handler(void * handle,uint8_t * data,uint32_t datalen)2813*5113495bSYour Name static QDF_STATUS spectral_phyerr_event_handler(void *handle,
2814*5113495bSYour Name 						uint8_t *data,
2815*5113495bSYour Name 						uint32_t datalen)
2816*5113495bSYour Name {
2817*5113495bSYour Name 	tp_wma_handle wma = (tp_wma_handle) handle;
2818*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
2819*5113495bSYour Name 	uint16_t buf_offset, event_buf_len = 0;
2820*5113495bSYour Name 	wmi_single_phyerr_rx_event *ev;
2821*5113495bSYour Name 	wmi_host_phyerr_t phyerr;
2822*5113495bSYour Name 	struct target_if_spectral_rfqual_info rfqual_info;
2823*5113495bSYour Name 	struct target_if_spectral_chan_info chan_info;
2824*5113495bSYour Name 	struct target_if_spectral_acs_stats acs_stats;
2825*5113495bSYour Name 
2826*5113495bSYour Name 	if (wma_validate_handle(wma))
2827*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
2828*5113495bSYour Name 
2829*5113495bSYour Name 	memset(&phyerr, 0, sizeof(wmi_host_phyerr_t));
2830*5113495bSYour Name 	status = wmi_extract_comb_phyerr(wma->wmi_handle, data, datalen,
2831*5113495bSYour Name 					 &buf_offset, &phyerr);
2832*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
2833*5113495bSYour Name 		wma_err("extract comb phyerr failed");
2834*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
2835*5113495bSYour Name 	}
2836*5113495bSYour Name 
2837*5113495bSYour Name 	ev = (wmi_single_phyerr_rx_event *)phyerr.bufp;
2838*5113495bSYour Name 	event_buf_len = phyerr.buf_len;
2839*5113495bSYour Name 	/* Loop over the bufp, extracting out phyerrors */
2840*5113495bSYour Name 	buf_offset = 0;
2841*5113495bSYour Name 	while (buf_offset < event_buf_len) {
2842*5113495bSYour Name 		if (wma_extract_single_phyerr_spectral(handle, ev,
2843*5113495bSYour Name 			event_buf_len, &buf_offset, &phyerr)) {
2844*5113495bSYour Name 			wma_err("extract single phy err failed");
2845*5113495bSYour Name 			return QDF_STATUS_E_FAILURE;
2846*5113495bSYour Name 		}
2847*5113495bSYour Name 
2848*5113495bSYour Name 		if (phyerr.buf_len > 0) {
2849*5113495bSYour Name 			if (sizeof(phyerr.rf_info) > sizeof(rfqual_info))
2850*5113495bSYour Name 				qdf_mem_copy(&rfqual_info, &phyerr.rf_info,
2851*5113495bSYour Name 						sizeof(rfqual_info));
2852*5113495bSYour Name 			else
2853*5113495bSYour Name 				qdf_mem_copy(&rfqual_info, &phyerr.rf_info,
2854*5113495bSYour Name 						sizeof(phyerr.rf_info));
2855*5113495bSYour Name 
2856*5113495bSYour Name 			if (sizeof(phyerr.chan_info) > sizeof(chan_info))
2857*5113495bSYour Name 				qdf_mem_copy(&chan_info, &phyerr.chan_info,
2858*5113495bSYour Name 						sizeof(chan_info));
2859*5113495bSYour Name 			else
2860*5113495bSYour Name 				qdf_mem_copy(&chan_info, &phyerr.chan_info,
2861*5113495bSYour Name 						sizeof(phyerr.chan_info));
2862*5113495bSYour Name 
2863*5113495bSYour Name 			target_if_spectral_process_phyerr(wma->pdev, phyerr.bufp,
2864*5113495bSYour Name 							phyerr.buf_len,
2865*5113495bSYour Name 							&rfqual_info,
2866*5113495bSYour Name 							&chan_info,
2867*5113495bSYour Name 							phyerr.tsf64,
2868*5113495bSYour Name 							&acs_stats);
2869*5113495bSYour Name 		}
2870*5113495bSYour Name 	}
2871*5113495bSYour Name 
2872*5113495bSYour Name 	return status;
2873*5113495bSYour Name }
2874*5113495bSYour Name #else
2875*5113495bSYour Name static QDF_STATUS
wma_extract_single_phyerr_spectral(void * handle,void * evt_buf,uint16_t datalen,uint16_t * buf_offset,wmi_host_phyerr_t * phyerr)2876*5113495bSYour Name wma_extract_single_phyerr_spectral(void *handle, void *evt_buf,
2877*5113495bSYour Name 				   uint16_t datalen,
2878*5113495bSYour Name 				   uint16_t *buf_offset,
2879*5113495bSYour Name 				   wmi_host_phyerr_t *phyerr)
2880*5113495bSYour Name {
2881*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2882*5113495bSYour Name }
2883*5113495bSYour Name 
spectral_phyerr_event_handler(void * handle,uint8_t * data,uint32_t datalen)2884*5113495bSYour Name static QDF_STATUS spectral_phyerr_event_handler(void *handle,
2885*5113495bSYour Name 					uint8_t *data, uint32_t datalen)
2886*5113495bSYour Name {
2887*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2888*5113495bSYour Name }
2889*5113495bSYour Name #endif
2890*5113495bSYour Name 
2891*5113495bSYour Name /**
2892*5113495bSYour Name  * dfs_phyerr_event_handler() - dfs phyerr event handler
2893*5113495bSYour Name  * @handle: wma handle
2894*5113495bSYour Name  * @data: data buffer
2895*5113495bSYour Name  * @datalen: buffer length
2896*5113495bSYour Name  * @fulltsf: 64 bit event TSF
2897*5113495bSYour Name  *
2898*5113495bSYour Name  * Function to process DFS phy errors.
2899*5113495bSYour Name  *
2900*5113495bSYour Name  * Return: QDF_STATUS
2901*5113495bSYour Name  */
dfs_phyerr_event_handler(tp_wma_handle handle,uint8_t * data,uint32_t datalen,uint64_t fulltsf)2902*5113495bSYour Name static QDF_STATUS dfs_phyerr_event_handler(tp_wma_handle handle,
2903*5113495bSYour Name 					   uint8_t *data,
2904*5113495bSYour Name 					   uint32_t datalen,
2905*5113495bSYour Name 					   uint64_t fulltsf)
2906*5113495bSYour Name {
2907*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
2908*5113495bSYour Name 	struct wlan_lmac_if_dfs_rx_ops *dfs_rx_ops;
2909*5113495bSYour Name 	wmi_host_phyerr_t phyerr;
2910*5113495bSYour Name 	int8_t rssi_comb;
2911*5113495bSYour Name 	uint16_t buf_offset;
2912*5113495bSYour Name 
2913*5113495bSYour Name 	if (!handle->psoc) {
2914*5113495bSYour Name 		wma_err("psoc is null");
2915*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
2916*5113495bSYour Name 	}
2917*5113495bSYour Name 
2918*5113495bSYour Name 	dfs_rx_ops = wlan_lmac_if_get_dfs_rx_ops(handle->psoc);
2919*5113495bSYour Name 	if (!dfs_rx_ops) {
2920*5113495bSYour Name 		wma_err("dfs_rx_ops is null");
2921*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
2922*5113495bSYour Name 	}
2923*5113495bSYour Name 
2924*5113495bSYour Name 	if (!dfs_rx_ops->dfs_process_phyerr) {
2925*5113495bSYour Name 		wma_err("dfs_process_phyerr handler is null");
2926*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
2927*5113495bSYour Name 	}
2928*5113495bSYour Name 
2929*5113495bSYour Name 	if (!handle->pdev) {
2930*5113495bSYour Name 		wma_err("pdev is null");
2931*5113495bSYour Name 		return -EINVAL;
2932*5113495bSYour Name 	}
2933*5113495bSYour Name 
2934*5113495bSYour Name 	buf_offset = 0;
2935*5113495bSYour Name 	while (buf_offset < datalen) {
2936*5113495bSYour Name 		status = wmi_extract_single_phyerr(handle->wmi_handle, data, datalen,
2937*5113495bSYour Name 						   &buf_offset, &phyerr);
2938*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(status)) {
2939*5113495bSYour Name 			/* wmi_extract_single_phyerr has logs */
2940*5113495bSYour Name 			return status;
2941*5113495bSYour Name 		}
2942*5113495bSYour Name 
2943*5113495bSYour Name 		rssi_comb = phyerr.rf_info.rssi_comb & 0xFF;
2944*5113495bSYour Name 		if (phyerr.buf_len > 0)
2945*5113495bSYour Name 			dfs_rx_ops->dfs_process_phyerr(handle->pdev,
2946*5113495bSYour Name 						       &phyerr.bufp[0],
2947*5113495bSYour Name 						       phyerr.buf_len,
2948*5113495bSYour Name 						       rssi_comb,
2949*5113495bSYour Name 						       rssi_comb,
2950*5113495bSYour Name 						       phyerr.tsf_timestamp,
2951*5113495bSYour Name 						       fulltsf);
2952*5113495bSYour Name 	}
2953*5113495bSYour Name 
2954*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2955*5113495bSYour Name }
2956*5113495bSYour Name 
2957*5113495bSYour Name /**
2958*5113495bSYour Name  * wma_unified_phyerr_rx_event_handler() - phyerr event handler
2959*5113495bSYour Name  * @handle: wma handle
2960*5113495bSYour Name  * @data: data buffer
2961*5113495bSYour Name  * @datalen: buffer length
2962*5113495bSYour Name  *
2963*5113495bSYour Name  * WMI Handler for WMI_PHYERR_EVENTID event from firmware.
2964*5113495bSYour Name  * This handler is currently handling DFS and spectral scan
2965*5113495bSYour Name  * phy errors.
2966*5113495bSYour Name  *
2967*5113495bSYour Name  * Return: 0 for success, other value for failure
2968*5113495bSYour Name  */
wma_unified_phyerr_rx_event_handler(void * handle,uint8_t * data,uint32_t datalen)2969*5113495bSYour Name static int wma_unified_phyerr_rx_event_handler(void *handle,
2970*5113495bSYour Name 					       uint8_t *data,
2971*5113495bSYour Name 					       uint32_t datalen)
2972*5113495bSYour Name {
2973*5113495bSYour Name 	/* phyerr handling is moved to cmn project
2974*5113495bSYour Name 	 * As WIN still uses handler registration in non-cmn code.
2975*5113495bSYour Name 	 * need complete testing of non offloaded DFS code before we enable
2976*5113495bSYour Name 	 * it in cmn code.
2977*5113495bSYour Name 	 **/
2978*5113495bSYour Name 	tp_wma_handle wma = (tp_wma_handle) handle;
2979*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
2980*5113495bSYour Name 	wmi_host_phyerr_t phyerr;
2981*5113495bSYour Name 	uint16_t buf_offset = 0;
2982*5113495bSYour Name 	wmi_single_phyerr_rx_event *ev;
2983*5113495bSYour Name 	uint16_t event_buf_len = 0;
2984*5113495bSYour Name 	wmi_host_phyerr_t phyerr2;
2985*5113495bSYour Name 	bool spectralscan = false;
2986*5113495bSYour Name 
2987*5113495bSYour Name 	if (wma_validate_handle(wma))
2988*5113495bSYour Name 		return -EINVAL;
2989*5113495bSYour Name 
2990*5113495bSYour Name 	/* sanity check on data length */
2991*5113495bSYour Name 	status = wmi_extract_comb_phyerr(wma->wmi_handle, data, datalen,
2992*5113495bSYour Name 					 &buf_offset, &phyerr);
2993*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
2994*5113495bSYour Name 		wma_err("extract phyerr failed: %d", status);
2995*5113495bSYour Name 		return qdf_status_to_os_return(status);
2996*5113495bSYour Name 	}
2997*5113495bSYour Name 	ev = (wmi_single_phyerr_rx_event *)phyerr.bufp;
2998*5113495bSYour Name 	event_buf_len = phyerr.buf_len;
2999*5113495bSYour Name 	/* Loop over the bufp, extracting out phyerrors */
3000*5113495bSYour Name 	buf_offset = 0;
3001*5113495bSYour Name 	while (ev && (buf_offset < event_buf_len)) {
3002*5113495bSYour Name 		if (wma_extract_single_phyerr_spectral(handle, ev,
3003*5113495bSYour Name 						       event_buf_len,
3004*5113495bSYour Name 						       &buf_offset,
3005*5113495bSYour Name 						       &phyerr2)) {
3006*5113495bSYour Name 			wma_err("extract single phy err failed");
3007*5113495bSYour Name 			return qdf_status_to_os_return(QDF_STATUS_E_FAILURE);
3008*5113495bSYour Name 		}
3009*5113495bSYour Name 		if ((buf_offset != 0) && (phyerr2.phy_err_code == 0x26 ||
3010*5113495bSYour Name 					  phyerr2.phy_err_code == 0x24)) {
3011*5113495bSYour Name 			spectralscan = true;
3012*5113495bSYour Name 		} else {
3013*5113495bSYour Name 			break;
3014*5113495bSYour Name 		}
3015*5113495bSYour Name 	}
3016*5113495bSYour Name 	if (spectralscan) {
3017*5113495bSYour Name 		status = spectral_phyerr_event_handler(wma, data, datalen);
3018*5113495bSYour Name 		return qdf_status_to_os_return(status);
3019*5113495bSYour Name 	}
3020*5113495bSYour Name 	/* handle different PHY Error conditions */
3021*5113495bSYour Name 	if (((phyerr.phy_err_mask0 & (WMI_PHY_ERROR_MASK0_RADAR |
3022*5113495bSYour Name 	    WMI_PHY_ERROR_MASK0_FALSE_RADAR_EXT |
3023*5113495bSYour Name 	    WMI_PHY_ERROR_MASK0_SPECTRAL_SCAN)) == 0)) {
3024*5113495bSYour Name 		wma_debug("Unknown phy error event");
3025*5113495bSYour Name 		return -EINVAL;
3026*5113495bSYour Name 	}
3027*5113495bSYour Name 
3028*5113495bSYour Name 	/* Handle Spectral or DFS PHY Error */
3029*5113495bSYour Name 	if (phyerr.phy_err_mask0 & (WMI_PHY_ERROR_MASK0_RADAR |
3030*5113495bSYour Name 	    WMI_PHY_ERROR_MASK0_FALSE_RADAR_EXT)) {
3031*5113495bSYour Name 		if (wma->is_dfs_offloaded) {
3032*5113495bSYour Name 			wma_debug("Unexpected phy error, dfs offloaded");
3033*5113495bSYour Name 			return -EINVAL;
3034*5113495bSYour Name 		}
3035*5113495bSYour Name 		status = dfs_phyerr_event_handler(wma,
3036*5113495bSYour Name 						  phyerr.bufp,
3037*5113495bSYour Name 						  phyerr.buf_len,
3038*5113495bSYour Name 						  phyerr.tsf64);
3039*5113495bSYour Name 	} else if (phyerr.phy_err_mask0 & (WMI_PHY_ERROR_MASK0_SPECTRAL_SCAN |
3040*5113495bSYour Name 		   WMI_PHY_ERROR_MASK0_FALSE_RADAR_EXT)) {
3041*5113495bSYour Name 		status = spectral_phyerr_event_handler(wma, data, datalen);
3042*5113495bSYour Name 	}
3043*5113495bSYour Name 
3044*5113495bSYour Name 	return qdf_status_to_os_return(status);
3045*5113495bSYour Name }
3046*5113495bSYour Name 
wma_vdev_init(struct wma_txrx_node * vdev)3047*5113495bSYour Name void wma_vdev_init(struct wma_txrx_node *vdev)
3048*5113495bSYour Name {
3049*5113495bSYour Name 	vdev->is_waiting_for_key = false;
3050*5113495bSYour Name }
3051*5113495bSYour Name 
wma_vdev_deinit(struct wma_txrx_node * vdev)3052*5113495bSYour Name void wma_vdev_deinit(struct wma_txrx_node *vdev)
3053*5113495bSYour Name {
3054*5113495bSYour Name 	struct beacon_info *bcn;
3055*5113495bSYour Name 	tp_wma_handle wma_handle;
3056*5113495bSYour Name 
3057*5113495bSYour Name 	wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
3058*5113495bSYour Name 	if (!wma_handle)
3059*5113495bSYour Name 		return;
3060*5113495bSYour Name 
3061*5113495bSYour Name 	bcn = vdev->beacon;
3062*5113495bSYour Name 	if (bcn) {
3063*5113495bSYour Name 		if (bcn->dma_mapped)
3064*5113495bSYour Name 			qdf_nbuf_unmap_single(wma_handle->qdf_dev,
3065*5113495bSYour Name 				bcn->buf, QDF_DMA_TO_DEVICE);
3066*5113495bSYour Name 		qdf_nbuf_free(bcn->buf);
3067*5113495bSYour Name 		qdf_mem_free(bcn);
3068*5113495bSYour Name 		vdev->beacon = NULL;
3069*5113495bSYour Name 	}
3070*5113495bSYour Name 
3071*5113495bSYour Name 	if (vdev->vdev_active == true)
3072*5113495bSYour Name 		vdev->vdev_active = false;
3073*5113495bSYour Name 
3074*5113495bSYour Name 	if (vdev->addBssStaContext) {
3075*5113495bSYour Name 		qdf_mem_free(vdev->addBssStaContext);
3076*5113495bSYour Name 		vdev->addBssStaContext = NULL;
3077*5113495bSYour Name 	}
3078*5113495bSYour Name 
3079*5113495bSYour Name 	if (vdev->psnr_req) {
3080*5113495bSYour Name 		qdf_mem_free(vdev->psnr_req);
3081*5113495bSYour Name 		vdev->psnr_req = NULL;
3082*5113495bSYour Name 	}
3083*5113495bSYour Name 
3084*5113495bSYour Name 	if (vdev->rcpi_req) {
3085*5113495bSYour Name 		qdf_mem_free(vdev->rcpi_req);
3086*5113495bSYour Name 		vdev->rcpi_req = NULL;
3087*5113495bSYour Name 	}
3088*5113495bSYour Name 
3089*5113495bSYour Name 	if (vdev->roam_scan_stats_req) {
3090*5113495bSYour Name 		struct sir_roam_scan_stats *req;
3091*5113495bSYour Name 
3092*5113495bSYour Name 		req = vdev->roam_scan_stats_req;
3093*5113495bSYour Name 		vdev->roam_scan_stats_req = NULL;
3094*5113495bSYour Name 		qdf_mem_free(req);
3095*5113495bSYour Name 	}
3096*5113495bSYour Name 
3097*5113495bSYour Name 	if (vdev->roam_synch_frame_ind.bcn_probe_rsp) {
3098*5113495bSYour Name 		qdf_mem_free(vdev->roam_synch_frame_ind.bcn_probe_rsp);
3099*5113495bSYour Name 		vdev->roam_synch_frame_ind.bcn_probe_rsp = NULL;
3100*5113495bSYour Name 	}
3101*5113495bSYour Name 
3102*5113495bSYour Name 	if (vdev->roam_synch_frame_ind.reassoc_req) {
3103*5113495bSYour Name 		qdf_mem_free(vdev->roam_synch_frame_ind.reassoc_req);
3104*5113495bSYour Name 		vdev->roam_synch_frame_ind.reassoc_req = NULL;
3105*5113495bSYour Name 	}
3106*5113495bSYour Name 
3107*5113495bSYour Name 	if (vdev->roam_synch_frame_ind.reassoc_rsp) {
3108*5113495bSYour Name 		qdf_mem_free(vdev->roam_synch_frame_ind.reassoc_rsp);
3109*5113495bSYour Name 		vdev->roam_synch_frame_ind.reassoc_rsp = NULL;
3110*5113495bSYour Name 	}
3111*5113495bSYour Name 
3112*5113495bSYour Name 	if (vdev->plink_status_req) {
3113*5113495bSYour Name 		qdf_mem_free(vdev->plink_status_req);
3114*5113495bSYour Name 		vdev->plink_status_req = NULL;
3115*5113495bSYour Name 	}
3116*5113495bSYour Name 
3117*5113495bSYour Name 	vdev->is_waiting_for_key = false;
3118*5113495bSYour Name }
3119*5113495bSYour Name 
3120*5113495bSYour Name /**
3121*5113495bSYour Name  * wma_wmi_stop() - generic function to block WMI commands
3122*5113495bSYour Name  * @return: None
3123*5113495bSYour Name  */
wma_wmi_stop(void)3124*5113495bSYour Name void wma_wmi_stop(void)
3125*5113495bSYour Name {
3126*5113495bSYour Name 	tp_wma_handle wma_handle;
3127*5113495bSYour Name 
3128*5113495bSYour Name 	wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
3129*5113495bSYour Name 	if (!wma_handle)
3130*5113495bSYour Name 		return;
3131*5113495bSYour Name 
3132*5113495bSYour Name 	if (wmi_validate_handle(wma_handle->wmi_handle))
3133*5113495bSYour Name 		return;
3134*5113495bSYour Name 
3135*5113495bSYour Name 	wmi_stop(wma_handle->wmi_handle);
3136*5113495bSYour Name }
3137*5113495bSYour Name 
3138*5113495bSYour Name #ifdef WLAN_WMI_BCN
3139*5113495bSYour Name static QDF_STATUS
wma_register_swba_events(wmi_unified_t wmi_handle)3140*5113495bSYour Name wma_register_swba_events(wmi_unified_t wmi_handle)
3141*5113495bSYour Name {
3142*5113495bSYour Name 	QDF_STATUS status;
3143*5113495bSYour Name 
3144*5113495bSYour Name 	status = wmi_unified_register_event_handler(wmi_handle,
3145*5113495bSYour Name 						    wmi_host_swba_event_id,
3146*5113495bSYour Name 						    wma_beacon_swba_handler,
3147*5113495bSYour Name 						    WMA_RX_SERIALIZER_CTX);
3148*5113495bSYour Name 
3149*5113495bSYour Name 	return status;
3150*5113495bSYour Name }
3151*5113495bSYour Name #else
wma_register_swba_events(wmi_unified_t wmi_handle)3152*5113495bSYour Name static QDF_STATUS wma_register_swba_events(wmi_unified_t wmi_handle)
3153*5113495bSYour Name {
3154*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
3155*5113495bSYour Name }
3156*5113495bSYour Name #endif
3157*5113495bSYour Name 
3158*5113495bSYour Name #ifdef FEATURE_WLAN_APF
wma_register_apf_events(tp_wma_handle wma_handle)3159*5113495bSYour Name static void wma_register_apf_events(tp_wma_handle wma_handle)
3160*5113495bSYour Name {
3161*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
3162*5113495bSYour Name 		return;
3163*5113495bSYour Name 
3164*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
3165*5113495bSYour Name 					   wmi_apf_capability_info_event_id,
3166*5113495bSYour Name 					   wma_get_apf_caps_event_handler,
3167*5113495bSYour Name 					   WMA_RX_SERIALIZER_CTX);
3168*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
3169*5113495bSYour Name 				wmi_apf_get_vdev_work_memory_resp_event_id,
3170*5113495bSYour Name 				wma_apf_read_work_memory_event_handler,
3171*5113495bSYour Name 				WMA_RX_SERIALIZER_CTX);
3172*5113495bSYour Name }
3173*5113495bSYour Name #else /* FEATURE_WLAN_APF */
wma_register_apf_events(tp_wma_handle wma_handle)3174*5113495bSYour Name static void wma_register_apf_events(tp_wma_handle wma_handle)
3175*5113495bSYour Name {
3176*5113495bSYour Name }
3177*5113495bSYour Name #endif /* FEATURE_WLAN_APF */
3178*5113495bSYour Name 
3179*5113495bSYour Name #ifdef WLAN_FEATURE_MOTION_DETECTION
3180*5113495bSYour Name /**
3181*5113495bSYour Name  * wma_register_md_events - Register motion detection event handlers
3182*5113495bSYour Name  * @wma_handle: wma handle
3183*5113495bSYour Name  * Return: None
3184*5113495bSYour Name  */
wma_register_md_events(tp_wma_handle wma_handle)3185*5113495bSYour Name static void wma_register_md_events(tp_wma_handle wma_handle)
3186*5113495bSYour Name {
3187*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
3188*5113495bSYour Name 		return;
3189*5113495bSYour Name 
3190*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
3191*5113495bSYour Name 					   wmi_motion_det_host_eventid,
3192*5113495bSYour Name 					   wma_motion_det_host_event_handler,
3193*5113495bSYour Name 					   WMA_RX_SERIALIZER_CTX);
3194*5113495bSYour Name 
3195*5113495bSYour Name 	wmi_unified_register_event_handler(
3196*5113495bSYour Name 				wma_handle->wmi_handle,
3197*5113495bSYour Name 				wmi_motion_det_base_line_host_eventid,
3198*5113495bSYour Name 				wma_motion_det_base_line_host_event_handler,
3199*5113495bSYour Name 				WMA_RX_SERIALIZER_CTX);
3200*5113495bSYour Name }
3201*5113495bSYour Name #else /* WLAN_FEATURE_MOTION_DETECTION */
3202*5113495bSYour Name /**
3203*5113495bSYour Name  * wma_register_md_events - Register motion detection event handlers
3204*5113495bSYour Name  * @wma_handle: wma handle
3205*5113495bSYour Name  * Return: None
3206*5113495bSYour Name  */
wma_register_md_events(tp_wma_handle wma_handle)3207*5113495bSYour Name static void wma_register_md_events(tp_wma_handle wma_handle)
3208*5113495bSYour Name {
3209*5113495bSYour Name }
3210*5113495bSYour Name #endif /* WLAN_FEATURE_MOTION_DETECTION */
3211*5113495bSYour Name 
3212*5113495bSYour Name #ifdef FEATURE_WLM_STATS
wma_register_wlm_stats_events(tp_wma_handle wma_handle)3213*5113495bSYour Name static void wma_register_wlm_stats_events(tp_wma_handle wma_handle)
3214*5113495bSYour Name {
3215*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
3216*5113495bSYour Name 					   wmi_wlm_stats_event_id,
3217*5113495bSYour Name 					   wma_wlm_stats_rsp,
3218*5113495bSYour Name 					   WMA_RX_SERIALIZER_CTX);
3219*5113495bSYour Name }
3220*5113495bSYour Name #else /* FEATURE_WLM_STATS */
wma_register_wlm_stats_events(tp_wma_handle wma_handle)3221*5113495bSYour Name static void wma_register_wlm_stats_events(tp_wma_handle wma_handle)
3222*5113495bSYour Name {
3223*5113495bSYour Name }
3224*5113495bSYour Name #endif /* FEATURE_WLM_STATS */
3225*5113495bSYour Name 
3226*5113495bSYour Name #ifdef MULTI_CLIENT_LL_SUPPORT
wma_register_wlm_latency_level_event(tp_wma_handle wma_handle)3227*5113495bSYour Name static void wma_register_wlm_latency_level_event(tp_wma_handle wma_handle)
3228*5113495bSYour Name {
3229*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
3230*5113495bSYour Name 				   wmi_vdev_latency_event_id,
3231*5113495bSYour Name 				   wma_latency_level_event_handler,
3232*5113495bSYour Name 				   WMA_RX_WORK_CTX);
3233*5113495bSYour Name }
3234*5113495bSYour Name #else
wma_register_wlm_latency_level_event(tp_wma_handle wma_handle)3235*5113495bSYour Name static void wma_register_wlm_latency_level_event(tp_wma_handle wma_handle)
3236*5113495bSYour Name {
3237*5113495bSYour Name }
3238*5113495bSYour Name #endif
3239*5113495bSYour Name 
wma_get_psoc_from_scn_handle(void * scn_handle)3240*5113495bSYour Name struct wlan_objmgr_psoc *wma_get_psoc_from_scn_handle(void *scn_handle)
3241*5113495bSYour Name {
3242*5113495bSYour Name 	tp_wma_handle wma_handle;
3243*5113495bSYour Name 
3244*5113495bSYour Name 	if (!scn_handle) {
3245*5113495bSYour Name 		wma_err("invalid scn handle");
3246*5113495bSYour Name 		return NULL;
3247*5113495bSYour Name 	}
3248*5113495bSYour Name 	wma_handle = (tp_wma_handle)scn_handle;
3249*5113495bSYour Name 
3250*5113495bSYour Name 	return wma_handle->psoc;
3251*5113495bSYour Name }
3252*5113495bSYour Name 
wma_get_fw_phy_mode_for_freq_cb(uint32_t freq,uint32_t chan_width,uint32_t * phy_mode)3253*5113495bSYour Name void wma_get_fw_phy_mode_for_freq_cb(uint32_t freq, uint32_t chan_width,
3254*5113495bSYour Name 				     uint32_t *phy_mode)
3255*5113495bSYour Name {
3256*5113495bSYour Name 	uint32_t dot11_mode;
3257*5113495bSYour Name 	enum wlan_phymode host_phy_mode;
3258*5113495bSYour Name 	struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
3259*5113495bSYour Name 
3260*5113495bSYour Name 	if (!mac) {
3261*5113495bSYour Name 		wma_err("MAC context is NULL");
3262*5113495bSYour Name 		*phy_mode = WLAN_PHYMODE_AUTO;
3263*5113495bSYour Name 		return;
3264*5113495bSYour Name 	}
3265*5113495bSYour Name 
3266*5113495bSYour Name 	dot11_mode = mac->mlme_cfg->dot11_mode.dot11_mode;
3267*5113495bSYour Name 
3268*5113495bSYour Name 	/* Update invalid dot11 modes to valid dot11 modes */
3269*5113495bSYour Name 	if (WLAN_REG_IS_24GHZ_CH_FREQ(freq) &&
3270*5113495bSYour Name 	    dot11_mode == MLME_DOT11_MODE_11A)
3271*5113495bSYour Name 		dot11_mode = MLME_DOT11_MODE_11G;
3272*5113495bSYour Name 
3273*5113495bSYour Name 	if (WLAN_REG_IS_5GHZ_CH_FREQ(freq) &&
3274*5113495bSYour Name 	    (dot11_mode == MLME_DOT11_MODE_11B ||
3275*5113495bSYour Name 	     dot11_mode == MLME_DOT11_MODE_11G ||
3276*5113495bSYour Name 	     dot11_mode == MLME_DOT11_MODE_11G_ONLY))
3277*5113495bSYour Name 		dot11_mode = MLME_DOT11_MODE_11A;
3278*5113495bSYour Name 
3279*5113495bSYour Name 	host_phy_mode = wma_chan_phy_mode(freq, chan_width, dot11_mode);
3280*5113495bSYour Name 	*phy_mode = wmi_host_to_fw_phymode(host_phy_mode);
3281*5113495bSYour Name }
3282*5113495bSYour Name 
wma_get_phy_mode_cb(qdf_freq_t freq,uint32_t chan_width,enum wlan_phymode * phy_mode)3283*5113495bSYour Name void wma_get_phy_mode_cb(qdf_freq_t freq, uint32_t chan_width,
3284*5113495bSYour Name 			 enum wlan_phymode *phy_mode)
3285*5113495bSYour Name {
3286*5113495bSYour Name 	uint32_t dot11_mode;
3287*5113495bSYour Name 	struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
3288*5113495bSYour Name 
3289*5113495bSYour Name 	if (!mac) {
3290*5113495bSYour Name 		wma_err("MAC context is NULL");
3291*5113495bSYour Name 		*phy_mode = WLAN_PHYMODE_AUTO;
3292*5113495bSYour Name 		return;
3293*5113495bSYour Name 	}
3294*5113495bSYour Name 
3295*5113495bSYour Name 	dot11_mode = mac->mlme_cfg->dot11_mode.dot11_mode;
3296*5113495bSYour Name 	*phy_mode = wma_chan_phy_mode(freq, chan_width, dot11_mode);
3297*5113495bSYour Name }
3298*5113495bSYour Name 
3299*5113495bSYour Name #ifdef WLAN_FEATURE_NAN
3300*5113495bSYour Name static void
wma_register_nan_callbacks(tp_wma_handle wma_handle)3301*5113495bSYour Name wma_register_nan_callbacks(tp_wma_handle wma_handle)
3302*5113495bSYour Name {
3303*5113495bSYour Name 	struct nan_callbacks cb_obj = {0};
3304*5113495bSYour Name 
3305*5113495bSYour Name 	cb_obj.update_ndi_conn = wma_ndi_update_connection_info;
3306*5113495bSYour Name 
3307*5113495bSYour Name 	ucfg_nan_register_wma_callbacks(wma_handle->psoc, &cb_obj);
3308*5113495bSYour Name }
3309*5113495bSYour Name #else
wma_register_nan_callbacks(tp_wma_handle wma_handle)3310*5113495bSYour Name static void wma_register_nan_callbacks(tp_wma_handle wma_handle)
3311*5113495bSYour Name {
3312*5113495bSYour Name }
3313*5113495bSYour Name #endif
3314*5113495bSYour Name 
3315*5113495bSYour Name #ifdef WLAN_FEATURE_PKT_CAPTURE
3316*5113495bSYour Name static void
wma_register_pkt_capture_callbacks(tp_wma_handle wma_handle)3317*5113495bSYour Name wma_register_pkt_capture_callbacks(tp_wma_handle wma_handle)
3318*5113495bSYour Name {
3319*5113495bSYour Name 	struct pkt_capture_callbacks cb_obj = {0};
3320*5113495bSYour Name 
3321*5113495bSYour Name 	cb_obj.get_rmf_status = wma_get_rmf_status;
3322*5113495bSYour Name 
3323*5113495bSYour Name 	ucfg_pkt_capture_register_wma_callbacks(wma_handle->psoc, &cb_obj);
3324*5113495bSYour Name }
3325*5113495bSYour Name #else
3326*5113495bSYour Name static inline void
wma_register_pkt_capture_callbacks(tp_wma_handle wma_handle)3327*5113495bSYour Name wma_register_pkt_capture_callbacks(tp_wma_handle wma_handle)
3328*5113495bSYour Name {
3329*5113495bSYour Name }
3330*5113495bSYour Name #endif
3331*5113495bSYour Name 
3332*5113495bSYour Name #ifdef TRACE_RECORD
wma_trace_dump(void * mac_ctx,tp_qdf_trace_record record,uint16_t rec_index)3333*5113495bSYour Name static void wma_trace_dump(void *mac_ctx, tp_qdf_trace_record record,
3334*5113495bSYour Name 			   uint16_t rec_index)
3335*5113495bSYour Name {
3336*5113495bSYour Name 	/*
3337*5113495bSYour Name 	 * This is dummy handler registered to qdf_trace as wma module wants to
3338*5113495bSYour Name 	 * insert trace records in qdf trace global record table but qdf_trace
3339*5113495bSYour Name 	 * does not allow to insert the trace records in the global record
3340*5113495bSYour Name 	 * table if a module is not registered with the qdf trace.
3341*5113495bSYour Name 	 */
3342*5113495bSYour Name }
3343*5113495bSYour Name 
wma_trace_init(void)3344*5113495bSYour Name static void wma_trace_init(void)
3345*5113495bSYour Name {
3346*5113495bSYour Name 	qdf_trace_register(QDF_MODULE_ID_WMA, &wma_trace_dump);
3347*5113495bSYour Name }
3348*5113495bSYour Name #else
wma_trace_init(void)3349*5113495bSYour Name static inline void wma_trace_init(void)
3350*5113495bSYour Name {
3351*5113495bSYour Name }
3352*5113495bSYour Name #endif
3353*5113495bSYour Name 
3354*5113495bSYour Name #ifdef FEATURE_CLUB_LL_STATS_AND_GET_STATION
wma_get_service_cap_club_get_sta_in_ll_stats_req(struct wmi_unified * wmi_handle,struct wma_tgt_services * cfg)3355*5113495bSYour Name static void wma_get_service_cap_club_get_sta_in_ll_stats_req(
3356*5113495bSYour Name 					struct wmi_unified *wmi_handle,
3357*5113495bSYour Name 					struct wma_tgt_services *cfg)
3358*5113495bSYour Name {
3359*5113495bSYour Name 	cfg->is_get_station_clubbed_in_ll_stats_req =
3360*5113495bSYour Name 		wmi_service_enabled(wmi_handle,
3361*5113495bSYour Name 				    wmi_service_get_station_in_ll_stats_req);
3362*5113495bSYour Name }
3363*5113495bSYour Name #else
wma_get_service_cap_club_get_sta_in_ll_stats_req(struct wmi_unified * wmi_handle,struct wma_tgt_services * cfg)3364*5113495bSYour Name static void wma_get_service_cap_club_get_sta_in_ll_stats_req(
3365*5113495bSYour Name 					struct wmi_unified *wmi_handle,
3366*5113495bSYour Name 					struct wma_tgt_services *cfg)
3367*5113495bSYour Name {
3368*5113495bSYour Name }
3369*5113495bSYour Name #endif /* FEATURE_CLUB_LL_STATS_AND_GET_STATION */
3370*5113495bSYour Name 
3371*5113495bSYour Name #ifdef WLAN_FEATURE_11BE_MLO
3372*5113495bSYour Name static void
wma_update_num_tdls_vdevs_if_11be_mlo(struct wlan_objmgr_psoc * psoc,target_resource_config * wlan_res_cfg)3373*5113495bSYour Name wma_update_num_tdls_vdevs_if_11be_mlo(struct wlan_objmgr_psoc *psoc,
3374*5113495bSYour Name 				      target_resource_config *wlan_res_cfg)
3375*5113495bSYour Name {
3376*5113495bSYour Name 	if (!wlan_tdls_is_fw_11be_mlo_capable(psoc))
3377*5113495bSYour Name 		return;
3378*5113495bSYour Name 
3379*5113495bSYour Name 	wlan_res_cfg->num_tdls_vdevs = WLAN_UMAC_MLO_MAX_VDEVS;
3380*5113495bSYour Name 	wma_debug("update tdls num vdevs %d", wlan_res_cfg->num_tdls_vdevs);
3381*5113495bSYour Name }
3382*5113495bSYour Name 
3383*5113495bSYour Name static void
wma_get_service_cap_per_link_mlo_stats(struct wmi_unified * wmi_handle,struct wma_tgt_services * cfg)3384*5113495bSYour Name wma_get_service_cap_per_link_mlo_stats(struct wmi_unified *wmi_handle,
3385*5113495bSYour Name 				       struct wma_tgt_services *cfg)
3386*5113495bSYour Name {
3387*5113495bSYour Name 	cfg->is_mlo_per_link_stats_supported =
3388*5113495bSYour Name 		wmi_service_enabled(wmi_handle,
3389*5113495bSYour Name 				    wmi_service_per_link_stats_support);
3390*5113495bSYour Name 	wma_debug("mlo_per_link stats is %s supported by FW",
3391*5113495bSYour Name 		  cfg->is_mlo_per_link_stats_supported ? "" : "NOT");
3392*5113495bSYour Name }
3393*5113495bSYour Name #else
3394*5113495bSYour Name static void
wma_update_num_tdls_vdevs_if_11be_mlo(struct wlan_objmgr_psoc * psoc,target_resource_config * wlan_res_cfg)3395*5113495bSYour Name wma_update_num_tdls_vdevs_if_11be_mlo(struct wlan_objmgr_psoc *psoc,
3396*5113495bSYour Name 				      target_resource_config *wlan_res_cfg)
3397*5113495bSYour Name {
3398*5113495bSYour Name }
3399*5113495bSYour Name 
3400*5113495bSYour Name static void
wma_get_service_cap_per_link_mlo_stats(struct wmi_unified * wmi_handle,struct wma_tgt_services * cfg)3401*5113495bSYour Name wma_get_service_cap_per_link_mlo_stats(struct wmi_unified *wmi_handle,
3402*5113495bSYour Name 				       struct wma_tgt_services *cfg)
3403*5113495bSYour Name {
3404*5113495bSYour Name }
3405*5113495bSYour Name #endif
3406*5113495bSYour Name 
3407*5113495bSYour Name /**
3408*5113495bSYour Name  * wma_set_exclude_selftx_from_cca_busy_time() - Set exclude self tx time from
3409*5113495bSYour Name  * cca busy time bool
3410*5113495bSYour Name  * @exclude_selftx_from_cca_busy: Bool to update in in wma ini config
3411*5113495bSYour Name  * @wma_handle: WMA handle
3412*5113495bSYour Name  *
3413*5113495bSYour Name  * Return: None
3414*5113495bSYour Name  */
3415*5113495bSYour Name static void
wma_set_exclude_selftx_from_cca_busy_time(bool exclude_selftx_from_cca_busy,tp_wma_handle wma_handle)3416*5113495bSYour Name wma_set_exclude_selftx_from_cca_busy_time(bool exclude_selftx_from_cca_busy,
3417*5113495bSYour Name 					  tp_wma_handle wma_handle)
3418*5113495bSYour Name {
3419*5113495bSYour Name 	struct wma_ini_config *cfg = wma_get_ini_handle(wma_handle);
3420*5113495bSYour Name 
3421*5113495bSYour Name 	if (!cfg) {
3422*5113495bSYour Name 		wma_err("NULL WMA ini handle");
3423*5113495bSYour Name 		return;
3424*5113495bSYour Name 	}
3425*5113495bSYour Name 
3426*5113495bSYour Name 	cfg->exclude_selftx_from_cca_busy = exclude_selftx_from_cca_busy;
3427*5113495bSYour Name }
3428*5113495bSYour Name 
wma_deinit_pagefault_wakeup_history(tp_wma_handle wma)3429*5113495bSYour Name static void wma_deinit_pagefault_wakeup_history(tp_wma_handle wma)
3430*5113495bSYour Name {
3431*5113495bSYour Name 	struct wma_pf_sym *pf_sym_entry;
3432*5113495bSYour Name 	int8_t idx, max_sym_count = WLAN_WMA_MAX_PF_SYM;
3433*5113495bSYour Name 	bool is_ssr = false;
3434*5113495bSYour Name 
3435*5113495bSYour Name 	if (wlan_pmo_enable_ssr_on_page_fault(wma->psoc)) {
3436*5113495bSYour Name 		is_ssr = true;
3437*5113495bSYour Name 		max_sym_count = 0x1;
3438*5113495bSYour Name 	}
3439*5113495bSYour Name 
3440*5113495bSYour Name 	for (idx = 0; idx < max_sym_count; idx++) {
3441*5113495bSYour Name 		pf_sym_entry = &wma->wma_pf_hist.wma_pf_sym[idx];
3442*5113495bSYour Name 		pf_sym_entry->pf_sym.symbol = 0x0;
3443*5113495bSYour Name 		pf_sym_entry->pf_sym.count = 0x0;
3444*5113495bSYour Name 		qdf_mem_free(pf_sym_entry->pf_ev_ts);
3445*5113495bSYour Name 		pf_sym_entry->pf_ev_ts = NULL;
3446*5113495bSYour Name 	}
3447*5113495bSYour Name 
3448*5113495bSYour Name 	if (!is_ssr) {
3449*5113495bSYour Name 		qdf_mem_free(wma->wma_pf_hist.pf_notify_buf_ptr);
3450*5113495bSYour Name 		wma->wma_pf_hist.pf_notify_buf_ptr = NULL;
3451*5113495bSYour Name 		wma->wma_pf_hist.pf_notify_buf_len = 0x0;
3452*5113495bSYour Name 	}
3453*5113495bSYour Name 	qdf_spinlock_destroy(&wma->wma_pf_hist.lock);
3454*5113495bSYour Name }
3455*5113495bSYour Name 
wma_init_pagefault_wakeup_history(tp_wma_handle wma)3456*5113495bSYour Name static QDF_STATUS wma_init_pagefault_wakeup_history(tp_wma_handle wma)
3457*5113495bSYour Name {
3458*5113495bSYour Name 	struct wma_pf_sym *pf_sym_entry;
3459*5113495bSYour Name 	int8_t idx, idx2, max_sym_count = WLAN_WMA_MAX_PF_SYM;
3460*5113495bSYour Name 	uint8_t max_pf_count;
3461*5113495bSYour Name 	bool is_ssr = false;
3462*5113495bSYour Name 
3463*5113495bSYour Name 	if (wlan_pmo_enable_ssr_on_page_fault(wma->psoc)) {
3464*5113495bSYour Name 		is_ssr = true;
3465*5113495bSYour Name 		max_sym_count = 0x1;
3466*5113495bSYour Name 	}
3467*5113495bSYour Name 
3468*5113495bSYour Name 	max_pf_count = wlan_pmo_get_min_pagefault_wakeups_for_action(wma->psoc);
3469*5113495bSYour Name 	for (idx = 0; idx < max_sym_count; idx++) {
3470*5113495bSYour Name 		pf_sym_entry = &wma->wma_pf_hist.wma_pf_sym[idx];
3471*5113495bSYour Name 		pf_sym_entry->pf_sym.symbol = 0x0;
3472*5113495bSYour Name 		pf_sym_entry->pf_sym.count = 0x0;
3473*5113495bSYour Name 		pf_sym_entry->pf_ev_ts = qdf_mem_malloc(max_pf_count *
3474*5113495bSYour Name 							sizeof(qdf_time_t));
3475*5113495bSYour Name 		if (!pf_sym_entry->pf_ev_ts)
3476*5113495bSYour Name 			goto mem_err;
3477*5113495bSYour Name 	}
3478*5113495bSYour Name 
3479*5113495bSYour Name 	if (!is_ssr) {
3480*5113495bSYour Name 		wma->wma_pf_hist.pf_notify_buf_len = 0x0;
3481*5113495bSYour Name 		wma->wma_pf_hist.pf_notify_buf_ptr =
3482*5113495bSYour Name 				qdf_mem_malloc(WLAN_WMA_PF_APPS_NOTIFY_BUF_LEN);
3483*5113495bSYour Name 		if (!wma->wma_pf_hist.pf_notify_buf_ptr)
3484*5113495bSYour Name 			goto mem_err;
3485*5113495bSYour Name 	}
3486*5113495bSYour Name 
3487*5113495bSYour Name 	qdf_spinlock_create(&wma->wma_pf_hist.lock);
3488*5113495bSYour Name 
3489*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
3490*5113495bSYour Name 
3491*5113495bSYour Name mem_err:
3492*5113495bSYour Name 	for (idx2 = --idx; idx2 >= 0; idx2--) {
3493*5113495bSYour Name 		pf_sym_entry = &wma->wma_pf_hist.wma_pf_sym[idx2];
3494*5113495bSYour Name 		qdf_mem_free(pf_sym_entry->pf_ev_ts);
3495*5113495bSYour Name 		pf_sym_entry->pf_ev_ts = NULL;
3496*5113495bSYour Name 	}
3497*5113495bSYour Name 
3498*5113495bSYour Name 	return QDF_STATUS_E_NOMEM;
3499*5113495bSYour Name }
3500*5113495bSYour Name 
3501*5113495bSYour Name /**
3502*5113495bSYour Name  * wma_open() - Allocate wma context and initialize it.
3503*5113495bSYour Name  * @psoc: psoc object
3504*5113495bSYour Name  * @tgt_cfg_cb: tgt config callback fun
3505*5113495bSYour Name  * @cds_cfg:  mac parameters
3506*5113495bSYour Name  * @target_type: target type
3507*5113495bSYour Name  *
3508*5113495bSYour Name  * Return: 0 on success, errno on failure
3509*5113495bSYour Name  */
wma_open(struct wlan_objmgr_psoc * psoc,wma_tgt_cfg_cb tgt_cfg_cb,struct cds_config_info * cds_cfg,uint32_t target_type)3510*5113495bSYour Name QDF_STATUS wma_open(struct wlan_objmgr_psoc *psoc,
3511*5113495bSYour Name 		    wma_tgt_cfg_cb tgt_cfg_cb,
3512*5113495bSYour Name 		    struct cds_config_info *cds_cfg,
3513*5113495bSYour Name 		    uint32_t target_type)
3514*5113495bSYour Name {
3515*5113495bSYour Name 	tp_wma_handle wma_handle;
3516*5113495bSYour Name 	HTC_HANDLE htc_handle;
3517*5113495bSYour Name 	qdf_device_t qdf_dev;
3518*5113495bSYour Name 	void *wmi_handle;
3519*5113495bSYour Name 	QDF_STATUS qdf_status;
3520*5113495bSYour Name 	struct wmi_unified_attach_params *params;
3521*5113495bSYour Name 	struct policy_mgr_wma_cbacks wma_cbacks;
3522*5113495bSYour Name 	struct target_psoc_info *tgt_psoc_info;
3523*5113495bSYour Name 	int i;
3524*5113495bSYour Name 	bool val = 0;
3525*5113495bSYour Name 	void *cds_context;
3526*5113495bSYour Name 	target_resource_config *wlan_res_cfg;
3527*5113495bSYour Name 	uint32_t self_gen_frm_pwr = 0;
3528*5113495bSYour Name 	uint32_t device_mode = cds_get_conparam();
3529*5113495bSYour Name 
3530*5113495bSYour Name 	wma_debug("Enter");
3531*5113495bSYour Name 
3532*5113495bSYour Name 	cds_context = cds_get_global_context();
3533*5113495bSYour Name 	if (!cds_context) {
3534*5113495bSYour Name 		wma_err("Invalid CDS context");
3535*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
3536*5113495bSYour Name 	}
3537*5113495bSYour Name 
3538*5113495bSYour Name 	g_wmi_version_info.major = __WMI_VER_MAJOR_;
3539*5113495bSYour Name 	g_wmi_version_info.minor = __WMI_VER_MINOR_;
3540*5113495bSYour Name 	g_wmi_version_info.revision = __WMI_REVISION_;
3541*5113495bSYour Name 
3542*5113495bSYour Name 	qdf_dev = cds_get_context(QDF_MODULE_ID_QDF_DEVICE);
3543*5113495bSYour Name 	htc_handle = cds_get_context(QDF_MODULE_ID_HTC);
3544*5113495bSYour Name 
3545*5113495bSYour Name 	if (!htc_handle) {
3546*5113495bSYour Name 		wma_err("Invalid HTC handle");
3547*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
3548*5113495bSYour Name 	}
3549*5113495bSYour Name 
3550*5113495bSYour Name 	/* Alloc memory for WMA Context */
3551*5113495bSYour Name 	qdf_status = cds_alloc_context(QDF_MODULE_ID_WMA,
3552*5113495bSYour Name 				       (void **)&wma_handle,
3553*5113495bSYour Name 				       sizeof(*wma_handle));
3554*5113495bSYour Name 
3555*5113495bSYour Name 	if (qdf_status != QDF_STATUS_SUCCESS) {
3556*5113495bSYour Name 		wma_err("Memory allocation failed for wma_handle");
3557*5113495bSYour Name 		return qdf_status;
3558*5113495bSYour Name 	}
3559*5113495bSYour Name 
3560*5113495bSYour Name 	qdf_mem_zero(wma_handle, sizeof(t_wma_handle));
3561*5113495bSYour Name 
3562*5113495bSYour Name 	if (target_if_alloc_psoc_tgt_info(psoc)) {
3563*5113495bSYour Name 		wma_err("target psoc info allocation failed");
3564*5113495bSYour Name 		qdf_status = QDF_STATUS_E_NOMEM;
3565*5113495bSYour Name 		goto err_free_wma_handle;
3566*5113495bSYour Name 	}
3567*5113495bSYour Name 
3568*5113495bSYour Name 	if (device_mode != QDF_GLOBAL_FTM_MODE) {
3569*5113495bSYour Name #ifdef FEATURE_WLAN_EXTSCAN
3570*5113495bSYour Name 		qdf_wake_lock_create(&wma_handle->extscan_wake_lock,
3571*5113495bSYour Name 					"wlan_extscan_wl");
3572*5113495bSYour Name #endif /* FEATURE_WLAN_EXTSCAN */
3573*5113495bSYour Name 		qdf_wake_lock_create(&wma_handle->wow_wake_lock,
3574*5113495bSYour Name 			"wlan_wow_wl");
3575*5113495bSYour Name 		qdf_wake_lock_create(&wma_handle->wow_auth_req_wl,
3576*5113495bSYour Name 			"wlan_auth_req_wl");
3577*5113495bSYour Name 		qdf_wake_lock_create(&wma_handle->wow_assoc_req_wl,
3578*5113495bSYour Name 			"wlan_assoc_req_wl");
3579*5113495bSYour Name 		qdf_wake_lock_create(&wma_handle->wow_deauth_rec_wl,
3580*5113495bSYour Name 			"wlan_deauth_rec_wl");
3581*5113495bSYour Name 		qdf_wake_lock_create(&wma_handle->wow_disassoc_rec_wl,
3582*5113495bSYour Name 			"wlan_disassoc_rec_wl");
3583*5113495bSYour Name 		qdf_wake_lock_create(&wma_handle->wow_ap_assoc_lost_wl,
3584*5113495bSYour Name 			"wlan_ap_assoc_lost_wl");
3585*5113495bSYour Name 		qdf_wake_lock_create(&wma_handle->wow_auto_shutdown_wl,
3586*5113495bSYour Name 			"wlan_auto_shutdown_wl");
3587*5113495bSYour Name 		qdf_wake_lock_create(&wma_handle->roam_ho_wl,
3588*5113495bSYour Name 			"wlan_roam_ho_wl");
3589*5113495bSYour Name 		qdf_wake_lock_create(&wma_handle->roam_preauth_wl,
3590*5113495bSYour Name 				     "wlan_roam_preauth_wl");
3591*5113495bSYour Name 		qdf_wake_lock_create(&wma_handle->probe_req_wps_wl,
3592*5113495bSYour Name 				     "wlan_probe_req_wps_wl");
3593*5113495bSYour Name 		qdf_wake_lock_create(&wma_handle->sap_d3_wow_wake_lock,
3594*5113495bSYour Name 				     "wlan_sap_d3_wow_wake_lock");
3595*5113495bSYour Name 		qdf_wake_lock_create(&wma_handle->go_d3_wow_wake_lock,
3596*5113495bSYour Name 				     "wlan_go_d3_wow_wake_lock");
3597*5113495bSYour Name 	}
3598*5113495bSYour Name 
3599*5113495bSYour Name 	qdf_status = wlan_objmgr_psoc_try_get_ref(psoc, WLAN_LEGACY_WMA_ID);
3600*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(qdf_status)) {
3601*5113495bSYour Name 		wma_err("PSOC get_ref fails");
3602*5113495bSYour Name 		goto err_get_psoc_ref;
3603*5113495bSYour Name 	}
3604*5113495bSYour Name 	wma_handle->psoc = psoc;
3605*5113495bSYour Name 
3606*5113495bSYour Name 	if (!wlan_pmo_no_op_on_page_fault(psoc)) {
3607*5113495bSYour Name 		qdf_status = wma_init_pagefault_wakeup_history(wma_handle);
3608*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(qdf_status))
3609*5113495bSYour Name 			goto err_wma_handle;
3610*5113495bSYour Name 	}
3611*5113495bSYour Name 
3612*5113495bSYour Name 	wma_target_if_open(wma_handle);
3613*5113495bSYour Name 
3614*5113495bSYour Name 	/*
3615*5113495bSYour Name 	 * Allocate locally used params with its rx_ops member,
3616*5113495bSYour Name 	 * and free it immediately after used.
3617*5113495bSYour Name 	 */
3618*5113495bSYour Name 	params = qdf_mem_malloc(sizeof(*params));
3619*5113495bSYour Name 	if (!params) {
3620*5113495bSYour Name 		qdf_status = QDF_STATUS_E_NOMEM;
3621*5113495bSYour Name 		goto err_wma_handle;
3622*5113495bSYour Name 	}
3623*5113495bSYour Name 
3624*5113495bSYour Name 	params->osdev = NULL;
3625*5113495bSYour Name 	params->target_type = WMI_TLV_TARGET;
3626*5113495bSYour Name 	params->use_cookie = false;
3627*5113495bSYour Name 	params->psoc = psoc;
3628*5113495bSYour Name 	params->max_commands = WMI_MAX_CMDS;
3629*5113495bSYour Name 
3630*5113495bSYour Name 	/* initialize tlv attach */
3631*5113495bSYour Name 	wmi_tlv_init();
3632*5113495bSYour Name 
3633*5113495bSYour Name 	/* attach the wmi */
3634*5113495bSYour Name 	wmi_handle = wmi_unified_attach(wma_handle, params);
3635*5113495bSYour Name 	qdf_mem_free(params);
3636*5113495bSYour Name 	if (!wmi_handle) {
3637*5113495bSYour Name 		wma_err("failed to attach WMI");
3638*5113495bSYour Name 		qdf_status = QDF_STATUS_E_NOMEM;
3639*5113495bSYour Name 		goto err_wma_handle;
3640*5113495bSYour Name 	}
3641*5113495bSYour Name 
3642*5113495bSYour Name 	target_if_register_legacy_service_ready_cb(
3643*5113495bSYour Name 					wma_legacy_service_ready_event_handler);
3644*5113495bSYour Name 
3645*5113495bSYour Name 	wma_info("WMA --> wmi_unified_attach - success");
3646*5113495bSYour Name 
3647*5113495bSYour Name 	/* store the wmi handle in tgt_if_handle */
3648*5113495bSYour Name 	tgt_psoc_info = wlan_psoc_get_tgt_if_handle(psoc);
3649*5113495bSYour Name 
3650*5113495bSYour Name 	target_psoc_set_target_type(tgt_psoc_info, target_type);
3651*5113495bSYour Name 	target_psoc_set_device_mode(tgt_psoc_info, device_mode);
3652*5113495bSYour Name 	/* Save the WMI & HTC handle */
3653*5113495bSYour Name 	target_psoc_set_wmi_hdl(tgt_psoc_info, wmi_handle);
3654*5113495bSYour Name 	wma_handle->wmi_handle = wmi_handle;
3655*5113495bSYour Name 	target_psoc_set_htc_hdl(tgt_psoc_info, htc_handle);
3656*5113495bSYour Name 	wma_handle->cds_context = cds_context;
3657*5113495bSYour Name 	wma_handle->qdf_dev = qdf_dev;
3658*5113495bSYour Name 	wma_handle->enable_tx_compl_tsf64 =
3659*5113495bSYour Name 			cds_cfg->enable_tx_compl_tsf64;
3660*5113495bSYour Name 
3661*5113495bSYour Name 	/* Register Converged Event handlers */
3662*5113495bSYour Name 	init_deinit_register_tgt_psoc_ev_handlers(psoc);
3663*5113495bSYour Name 
3664*5113495bSYour Name 	/* Register LFR2/3 common Roam Event handler */
3665*5113495bSYour Name 	target_if_roam_register_common_events(psoc);
3666*5113495bSYour Name 
3667*5113495bSYour Name 	/* Register Roam offload Event handlers */
3668*5113495bSYour Name 	target_if_roam_offload_register_events(psoc);
3669*5113495bSYour Name 
3670*5113495bSYour Name 	/* Initialize max_no_of_peers for wma_get_number_of_peers_supported() */
3671*5113495bSYour Name 	cds_cfg->max_station = wma_init_max_no_of_peers(wma_handle,
3672*5113495bSYour Name 							cds_cfg->max_station);
3673*5113495bSYour Name 
3674*5113495bSYour Name 	wlan_mlme_set_assoc_sta_limit(psoc, cds_cfg->max_station);
3675*5113495bSYour Name 
3676*5113495bSYour Name 	wlan_mlme_register_common_events(psoc);
3677*5113495bSYour Name 
3678*5113495bSYour Name 	/* initialize default target config */
3679*5113495bSYour Name 	wlan_res_cfg = target_psoc_get_wlan_res_cfg(tgt_psoc_info);
3680*5113495bSYour Name 	if (!wlan_res_cfg) {
3681*5113495bSYour Name 		wma_err("wlan_res_cfg is null");
3682*5113495bSYour Name 		qdf_status = QDF_STATUS_E_NOMEM;
3683*5113495bSYour Name 		goto err_wma_handle;
3684*5113495bSYour Name 	}
3685*5113495bSYour Name 
3686*5113495bSYour Name 	wma_set_default_tgt_config(wma_handle, wlan_res_cfg, cds_cfg);
3687*5113495bSYour Name 	wma_update_num_tdls_vdevs_if_11be_mlo(psoc, wlan_res_cfg);
3688*5113495bSYour Name 
3689*5113495bSYour Name 	qdf_status = wlan_mlme_get_tx_chainmask_cck(psoc, &val);
3690*5113495bSYour Name 	if (qdf_status != QDF_STATUS_SUCCESS) {
3691*5113495bSYour Name 		wma_err("Failed to get tx_chainmask_cck");
3692*5113495bSYour Name 		qdf_status = QDF_STATUS_E_FAILURE;
3693*5113495bSYour Name 		goto err_wma_handle;
3694*5113495bSYour Name 	}
3695*5113495bSYour Name 	wma_handle->tx_chain_mask_cck = val;
3696*5113495bSYour Name 
3697*5113495bSYour Name 	qdf_status = wlan_mlme_get_self_gen_frm_pwr(psoc, &self_gen_frm_pwr);
3698*5113495bSYour Name 	if (qdf_status != QDF_STATUS_SUCCESS)
3699*5113495bSYour Name 		wma_err("Failed to get self_gen_frm_pwr");
3700*5113495bSYour Name 	wma_handle->self_gen_frm_pwr = self_gen_frm_pwr;
3701*5113495bSYour Name 
3702*5113495bSYour Name 	cds_cfg->max_bssid = WLAN_MAX_VDEVS;
3703*5113495bSYour Name 
3704*5113495bSYour Name 	wma_handle->max_station = cds_cfg->max_station;
3705*5113495bSYour Name 	wma_handle->max_bssid = cds_cfg->max_bssid;
3706*5113495bSYour Name 	wma_handle->enable_mc_list =
3707*5113495bSYour Name 		ucfg_pmo_is_mc_addr_list_enabled(wma_handle->psoc);
3708*5113495bSYour Name 	wma_handle->active_uc_apf_mode =
3709*5113495bSYour Name 		ucfg_pmo_get_active_uc_apf_mode(wma_handle->psoc);
3710*5113495bSYour Name 	wma_handle->active_mc_bc_apf_mode =
3711*5113495bSYour Name 		ucfg_pmo_get_active_mc_bc_apf_mode(wma_handle->psoc);
3712*5113495bSYour Name 	wma_handle->link_stats_results = NULL;
3713*5113495bSYour Name #ifdef WLAN_FEATURE_LPSS
3714*5113495bSYour Name 	wma_handle->is_lpass_enabled = cds_cfg->is_lpass_enabled;
3715*5113495bSYour Name #endif
3716*5113495bSYour Name 	wma_handle->interfaces = qdf_mem_malloc(sizeof(struct wma_txrx_node) *
3717*5113495bSYour Name 						wma_handle->max_bssid);
3718*5113495bSYour Name 	if (!wma_handle->interfaces) {
3719*5113495bSYour Name 		qdf_status = QDF_STATUS_E_NOMEM;
3720*5113495bSYour Name 		goto err_scn_context;
3721*5113495bSYour Name 	}
3722*5113495bSYour Name 
3723*5113495bSYour Name 	for (i = 0; i < wma_handle->max_bssid; ++i)
3724*5113495bSYour Name 		wma_vdev_init(&wma_handle->interfaces[i]);
3725*5113495bSYour Name 
3726*5113495bSYour Name 	/* Register the debug print event handler */
3727*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
3728*5113495bSYour Name 					wmi_debug_print_event_id,
3729*5113495bSYour Name 					wma_unified_debug_print_event_handler,
3730*5113495bSYour Name 					WMA_RX_SERIALIZER_CTX);
3731*5113495bSYour Name 	/* Register profiling event Handler */
3732*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
3733*5113495bSYour Name 					wmi_wlan_profile_data_event_id,
3734*5113495bSYour Name 					wma_profile_data_report_event_handler,
3735*5113495bSYour Name 					WMA_RX_SERIALIZER_CTX);
3736*5113495bSYour Name 
3737*5113495bSYour Name 	wma_handle->tgt_cfg_update_cb = tgt_cfg_cb;
3738*5113495bSYour Name 	wma_handle->old_hw_mode_index = WMA_DEFAULT_HW_MODE_INDEX;
3739*5113495bSYour Name 	wma_handle->new_hw_mode_index = WMA_DEFAULT_HW_MODE_INDEX;
3740*5113495bSYour Name 	wma_handle->saved_chan.num_channels = 0;
3741*5113495bSYour Name 	wma_handle->fw_timeout_crash = cds_cfg->fw_timeout_crash;
3742*5113495bSYour Name 
3743*5113495bSYour Name 	qdf_status = qdf_mc_timer_init(&wma_handle->service_ready_ext_timer,
3744*5113495bSYour Name 					QDF_TIMER_TYPE_SW,
3745*5113495bSYour Name 					wma_service_ready_ext_evt_timeout,
3746*5113495bSYour Name 					wma_handle);
3747*5113495bSYour Name 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
3748*5113495bSYour Name 		wma_err("Failed to initialize service ready ext timeout");
3749*5113495bSYour Name 		goto err_event_init;
3750*5113495bSYour Name 	}
3751*5113495bSYour Name 
3752*5113495bSYour Name 	qdf_status = qdf_event_create(&wma_handle->target_suspend);
3753*5113495bSYour Name 	if (qdf_status != QDF_STATUS_SUCCESS) {
3754*5113495bSYour Name 		wma_err("target suspend event initialization failed");
3755*5113495bSYour Name 		goto err_event_init;
3756*5113495bSYour Name 	}
3757*5113495bSYour Name 
3758*5113495bSYour Name 	/* Init Tx Frame Complete event */
3759*5113495bSYour Name 	qdf_status = qdf_event_create(&wma_handle->tx_frm_download_comp_event);
3760*5113495bSYour Name 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
3761*5113495bSYour Name 		wma_err("failed to init tx_frm_download_comp_event");
3762*5113495bSYour Name 		goto err_event_init;
3763*5113495bSYour Name 	}
3764*5113495bSYour Name 
3765*5113495bSYour Name 	/* Init tx queue empty check event */
3766*5113495bSYour Name 	qdf_status = qdf_event_create(&wma_handle->tx_queue_empty_event);
3767*5113495bSYour Name 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
3768*5113495bSYour Name 		wma_err("failed to init tx_queue_empty_event");
3769*5113495bSYour Name 		goto err_event_init;
3770*5113495bSYour Name 	}
3771*5113495bSYour Name 
3772*5113495bSYour Name 	qdf_status = cds_shutdown_notifier_register(wma_shutdown_notifier_cb,
3773*5113495bSYour Name 						    wma_handle);
3774*5113495bSYour Name 	if (qdf_status != QDF_STATUS_SUCCESS) {
3775*5113495bSYour Name 		wma_err("Shutdown notifier register failed: %d", qdf_status);
3776*5113495bSYour Name 		goto err_event_init;
3777*5113495bSYour Name 	}
3778*5113495bSYour Name 
3779*5113495bSYour Name 	qdf_status = qdf_event_create(&wma_handle->runtime_suspend);
3780*5113495bSYour Name 	if (qdf_status != QDF_STATUS_SUCCESS) {
3781*5113495bSYour Name 		wma_err("runtime_suspend event initialization failed");
3782*5113495bSYour Name 		goto err_event_init;
3783*5113495bSYour Name 	}
3784*5113495bSYour Name 
3785*5113495bSYour Name 	qdf_status = qdf_event_create(&wma_handle->recovery_event);
3786*5113495bSYour Name 	if (qdf_status != QDF_STATUS_SUCCESS) {
3787*5113495bSYour Name 		wma_err("recovery event initialization failed");
3788*5113495bSYour Name 		goto err_event_init;
3789*5113495bSYour Name 	}
3790*5113495bSYour Name 
3791*5113495bSYour Name 	qdf_status = qdf_mutex_create(&wma_handle->radio_stats_lock);
3792*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(qdf_status)) {
3793*5113495bSYour Name 		wma_err("Failed to create radio stats mutex");
3794*5113495bSYour Name 		goto err_event_init;
3795*5113495bSYour Name 	}
3796*5113495bSYour Name 
3797*5113495bSYour Name 	qdf_list_create(&wma_handle->wma_hold_req_queue,
3798*5113495bSYour Name 		      MAX_ENTRY_HOLD_REQ_QUEUE);
3799*5113495bSYour Name 	qdf_spinlock_create(&wma_handle->wma_hold_req_q_lock);
3800*5113495bSYour Name 	qdf_atomic_init(&wma_handle->is_wow_bus_suspended);
3801*5113495bSYour Name 	qdf_atomic_init(&wma_handle->sap_num_clients_connected);
3802*5113495bSYour Name 	qdf_atomic_init(&wma_handle->go_num_clients_connected);
3803*5113495bSYour Name 
3804*5113495bSYour Name 	/* register for STA kickout function */
3805*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
3806*5113495bSYour Name 					   wmi_peer_sta_kickout_event_id,
3807*5113495bSYour Name 					   wma_peer_sta_kickout_event_handler,
3808*5113495bSYour Name 					   WMA_RX_SERIALIZER_CTX);
3809*5113495bSYour Name 	/* register for fw state response event */
3810*5113495bSYour Name 	wma_register_fw_state_events(wma_handle->wmi_handle);
3811*5113495bSYour Name 
3812*5113495bSYour Name #ifdef WLAN_POWER_DEBUG
3813*5113495bSYour Name 	/* register for Chip Power stats event */
3814*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
3815*5113495bSYour Name 				wmi_pdev_chip_power_stats_event_id,
3816*5113495bSYour Name 				wma_unified_power_debug_stats_event_handler,
3817*5113495bSYour Name 				WMA_RX_SERIALIZER_CTX);
3818*5113495bSYour Name #endif
3819*5113495bSYour Name #ifdef WLAN_FEATURE_BEACON_RECEPTION_STATS
3820*5113495bSYour Name 	/* register for beacon stats event */
3821*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
3822*5113495bSYour Name 				wmi_vdev_bcn_reception_stats_event_id,
3823*5113495bSYour Name 				wma_unified_beacon_debug_stats_event_handler,
3824*5113495bSYour Name 				WMA_RX_SERIALIZER_CTX);
3825*5113495bSYour Name #endif
3826*5113495bSYour Name 
3827*5113495bSYour Name #if defined(CLD_PM_QOS) && defined(WLAN_FEATURE_LL_MODE)
3828*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
3829*5113495bSYour Name 					   wmi_vdev_bcn_latency_event_id,
3830*5113495bSYour Name 					   wma_vdev_bcn_latency_event_handler,
3831*5113495bSYour Name 					   WMA_RX_SERIALIZER_CTX);
3832*5113495bSYour Name #endif
3833*5113495bSYour Name 	/* register for linkspeed response event */
3834*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
3835*5113495bSYour Name 					   wmi_peer_estimated_linkspeed_event_id,
3836*5113495bSYour Name 					   wma_link_speed_event_handler,
3837*5113495bSYour Name 					   WMA_RX_SERIALIZER_CTX);
3838*5113495bSYour Name 
3839*5113495bSYour Name #ifdef FEATURE_OEM_DATA_SUPPORT
3840*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
3841*5113495bSYour Name 					   wmi_oem_response_event_id,
3842*5113495bSYour Name 					   wma_oem_data_response_handler,
3843*5113495bSYour Name 					   WMA_RX_SERIALIZER_CTX);
3844*5113495bSYour Name #endif /* FEATURE_OEM_DATA_SUPPORT */
3845*5113495bSYour Name 
3846*5113495bSYour Name 	/* Register beacon tx complete event id. The event is required
3847*5113495bSYour Name 	 * for sending channel switch announcement frames
3848*5113495bSYour Name 	 */
3849*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
3850*5113495bSYour Name 					wmi_offload_bcn_tx_status_event_id,
3851*5113495bSYour Name 					wma_unified_bcntx_status_event_handler,
3852*5113495bSYour Name 					WMA_RX_SERIALIZER_CTX);
3853*5113495bSYour Name 
3854*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
3855*5113495bSYour Name 					   wmi_update_vdev_rate_stats_event_id,
3856*5113495bSYour Name 					   wma_link_status_event_handler,
3857*5113495bSYour Name 					   WMA_RX_SERIALIZER_CTX);
3858*5113495bSYour Name 
3859*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
3860*5113495bSYour Name 					   wmi_roam_scan_stats_event_id,
3861*5113495bSYour Name 					   wma_roam_scan_stats_event_handler,
3862*5113495bSYour Name 					   WMA_RX_SERIALIZER_CTX);
3863*5113495bSYour Name 
3864*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
3865*5113495bSYour Name 					   wmi_pdev_cold_boot_cal_event_id,
3866*5113495bSYour Name 					   wma_cold_boot_cal_event_handler,
3867*5113495bSYour Name 					   WMA_RX_WORK_CTX);
3868*5113495bSYour Name 
3869*5113495bSYour Name #ifdef FEATURE_OEM_DATA
3870*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
3871*5113495bSYour Name 					   wmi_oem_data_event_id,
3872*5113495bSYour Name 					   wma_oem_event_handler,
3873*5113495bSYour Name 					   WMA_RX_WORK_CTX);
3874*5113495bSYour Name #endif
3875*5113495bSYour Name 
3876*5113495bSYour Name #ifdef WLAN_FEATURE_LINK_LAYER_STATS
3877*5113495bSYour Name 	/* Register event handler for processing Link Layer Stats
3878*5113495bSYour Name 	 * response from the FW
3879*5113495bSYour Name 	 */
3880*5113495bSYour Name 	wma_register_ll_stats_event_handler(wma_handle);
3881*5113495bSYour Name 
3882*5113495bSYour Name #endif /* WLAN_FEATURE_LINK_LAYER_STATS */
3883*5113495bSYour Name 
3884*5113495bSYour Name 	wmi_set_tgt_assert(wma_handle->wmi_handle,
3885*5113495bSYour Name 			   cds_cfg->force_target_assert_enabled);
3886*5113495bSYour Name 	/* Firmware debug log */
3887*5113495bSYour Name 	qdf_status = dbglog_init(wma_handle->wmi_handle);
3888*5113495bSYour Name 	if (qdf_status != QDF_STATUS_SUCCESS) {
3889*5113495bSYour Name 		wma_err("Firmware Dbglog initialization failed");
3890*5113495bSYour Name 		goto err_dbglog_init;
3891*5113495bSYour Name 	}
3892*5113495bSYour Name 
3893*5113495bSYour Name 	wma_handle->staMaxLIModDtim = cds_cfg->sta_maxlimod_dtim;
3894*5113495bSYour Name 	wma_handle->sta_max_li_mod_dtim_ms = cds_cfg->sta_maxlimod_dtim_ms;
3895*5113495bSYour Name 	wma_handle->staModDtim = ucfg_pmo_get_sta_mod_dtim(wma_handle->psoc);
3896*5113495bSYour Name 	wma_handle->staDynamicDtim =
3897*5113495bSYour Name 			ucfg_pmo_get_sta_dynamic_dtim(wma_handle->psoc);
3898*5113495bSYour Name 
3899*5113495bSYour Name #ifdef WLAN_FEATURE_STATS_EXT
3900*5113495bSYour Name 	/* register for extended stats event */
3901*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
3902*5113495bSYour Name 					   wmi_stats_ext_event_id,
3903*5113495bSYour Name 					   wma_stats_ext_event_handler,
3904*5113495bSYour Name 					   WMA_RX_SERIALIZER_CTX);
3905*5113495bSYour Name #endif /* WLAN_FEATURE_STATS_EXT */
3906*5113495bSYour Name #ifdef FEATURE_WLAN_EXTSCAN
3907*5113495bSYour Name 	wma_register_extscan_event_handler(wma_handle);
3908*5113495bSYour Name #endif /* WLAN_FEATURE_STATS_EXT */
3909*5113495bSYour Name 
3910*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
3911*5113495bSYour Name 				wmi_rssi_breach_event_id,
3912*5113495bSYour Name 				wma_rssi_breached_event_handler,
3913*5113495bSYour Name 				WMA_RX_SERIALIZER_CTX);
3914*5113495bSYour Name 
3915*5113495bSYour Name 	qdf_wake_lock_create(&wma_handle->wmi_cmd_rsp_wake_lock,
3916*5113495bSYour Name 					"wlan_fw_rsp_wakelock");
3917*5113495bSYour Name 	qdf_runtime_lock_init(&wma_handle->wmi_cmd_rsp_runtime_lock);
3918*5113495bSYour Name 	qdf_runtime_lock_init(&wma_handle->sap_prevent_runtime_pm_lock);
3919*5113495bSYour Name 	qdf_runtime_lock_init(&wma_handle->ndp_prevent_runtime_pm_lock);
3920*5113495bSYour Name 
3921*5113495bSYour Name 	/* Register peer assoc conf event handler */
3922*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
3923*5113495bSYour Name 					   wmi_peer_assoc_conf_event_id,
3924*5113495bSYour Name 					   wma_peer_assoc_conf_handler,
3925*5113495bSYour Name 					   WMA_RX_SERIALIZER_CTX);
3926*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
3927*5113495bSYour Name 					   wmi_peer_create_conf_event_id,
3928*5113495bSYour Name 					   wma_peer_create_confirm_handler,
3929*5113495bSYour Name 					   WMA_RX_SERIALIZER_CTX);
3930*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
3931*5113495bSYour Name 					   wmi_peer_delete_response_event_id,
3932*5113495bSYour Name 					   wma_peer_delete_handler,
3933*5113495bSYour Name 					   WMA_RX_SERIALIZER_CTX);
3934*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
3935*5113495bSYour Name 					   wmi_chan_info_event_id,
3936*5113495bSYour Name 					   wma_chan_info_event_handler,
3937*5113495bSYour Name 					   WMA_RX_SERIALIZER_CTX);
3938*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
3939*5113495bSYour Name 				wmi_dbg_mesg_flush_complete_event_id,
3940*5113495bSYour Name 				wma_flush_complete_evt_handler,
3941*5113495bSYour Name 				WMA_RX_WORK_CTX);
3942*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
3943*5113495bSYour Name 				wmi_report_rx_aggr_failure_event_id,
3944*5113495bSYour Name 				wma_rx_aggr_failure_event_handler,
3945*5113495bSYour Name 				WMA_RX_SERIALIZER_CTX);
3946*5113495bSYour Name 
3947*5113495bSYour Name 	wmi_unified_register_event_handler(
3948*5113495bSYour Name 				wma_handle->wmi_handle,
3949*5113495bSYour Name 				wmi_coex_report_antenna_isolation_event_id,
3950*5113495bSYour Name 				wma_antenna_isolation_event_handler,
3951*5113495bSYour Name 				WMA_RX_SERIALIZER_CTX);
3952*5113495bSYour Name 
3953*5113495bSYour Name 	wma_handle->ito_repeat_count = cds_cfg->ito_repeat_count;
3954*5113495bSYour Name 	wma_handle->bandcapability = cds_cfg->bandcapability;
3955*5113495bSYour Name 
3956*5113495bSYour Name 	/* Register PWR_SAVE_FAIL event only in case of recovery(1) */
3957*5113495bSYour Name 	if (ucfg_pmo_get_auto_power_fail_mode(wma_handle->psoc) ==
3958*5113495bSYour Name 	    PMO_FW_TO_SEND_WOW_IND_ON_PWR_FAILURE) {
3959*5113495bSYour Name 		wmi_unified_register_event_handler(wma_handle->wmi_handle,
3960*5113495bSYour Name 			wmi_pdev_chip_pwr_save_failure_detect_event_id,
3961*5113495bSYour Name 			wma_chip_power_save_failure_detected_handler,
3962*5113495bSYour Name 			WMA_RX_WORK_CTX);
3963*5113495bSYour Name 	}
3964*5113495bSYour Name 
3965*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
3966*5113495bSYour Name 				wmi_pdev_div_rssi_antid_event_id,
3967*5113495bSYour Name 				wma_pdev_div_info_evt_handler,
3968*5113495bSYour Name 				WMA_RX_WORK_CTX);
3969*5113495bSYour Name 
3970*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
3971*5113495bSYour Name 					   wmi_get_ani_level_event_id,
3972*5113495bSYour Name 					   wma_get_ani_level_evt_handler,
3973*5113495bSYour Name 					   WMA_RX_WORK_CTX);
3974*5113495bSYour Name 
3975*5113495bSYour Name 	wma_register_debug_callback();
3976*5113495bSYour Name 	wifi_pos_register_get_phy_mode_cb(wma_handle->psoc,
3977*5113495bSYour Name 					  wma_get_phy_mode_cb);
3978*5113495bSYour Name 	wifi_pos_register_get_fw_phy_mode_for_freq_cb(
3979*5113495bSYour Name 					wma_handle->psoc,
3980*5113495bSYour Name 					wma_get_fw_phy_mode_for_freq_cb);
3981*5113495bSYour Name 
3982*5113495bSYour Name 	/* Register callback with PMO so PMO can update the vdev pause bitmap*/
3983*5113495bSYour Name 	pmo_register_pause_bitmap_notifier(wma_handle->psoc,
3984*5113495bSYour Name 		wma_vdev_update_pause_bitmap);
3985*5113495bSYour Name 	pmo_register_get_pause_bitmap(wma_handle->psoc,
3986*5113495bSYour Name 		wma_vdev_get_pause_bitmap);
3987*5113495bSYour Name 	pmo_register_is_device_in_low_pwr_mode(wma_handle->psoc,
3988*5113495bSYour Name 		wma_vdev_is_device_in_low_pwr_mode);
3989*5113495bSYour Name 	pmo_register_get_dtim_period_callback(wma_handle->psoc,
3990*5113495bSYour Name 					      wma_vdev_get_dtim_period);
3991*5113495bSYour Name 	pmo_register_get_beacon_interval_callback(wma_handle->psoc,
3992*5113495bSYour Name 						  wma_vdev_get_beacon_interval);
3993*5113495bSYour Name 	wma_cbacks.wma_get_connection_info = wma_get_connection_info;
3994*5113495bSYour Name 	wma_register_nan_callbacks(wma_handle);
3995*5113495bSYour Name 	wma_register_pkt_capture_callbacks(wma_handle);
3996*5113495bSYour Name 	qdf_status = policy_mgr_register_wma_cb(wma_handle->psoc, &wma_cbacks);
3997*5113495bSYour Name 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
3998*5113495bSYour Name 		wma_err("Failed to register wma cb with Policy Manager");
3999*5113495bSYour Name 	}
4000*5113495bSYour Name 
4001*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
4002*5113495bSYour Name 			wmi_phyerr_event_id,
4003*5113495bSYour Name 			wma_unified_phyerr_rx_event_handler,
4004*5113495bSYour Name 			WMA_RX_WORK_CTX);
4005*5113495bSYour Name 
4006*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
4007*5113495bSYour Name 			wmi_sap_obss_detection_report_event_id,
4008*5113495bSYour Name 			wma_vdev_obss_detection_info_handler,
4009*5113495bSYour Name 			WMA_RX_SERIALIZER_CTX);
4010*5113495bSYour Name 
4011*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
4012*5113495bSYour Name 			wmi_obss_color_collision_report_event_id,
4013*5113495bSYour Name 			wma_vdev_bss_color_collision_info_handler,
4014*5113495bSYour Name 			WMA_RX_WORK_CTX);
4015*5113495bSYour Name 
4016*5113495bSYour Name 	wma_register_twt_events(wma_handle);
4017*5113495bSYour Name 
4018*5113495bSYour Name 	wma_register_apf_events(wma_handle);
4019*5113495bSYour Name 	wma_register_md_events(wma_handle);
4020*5113495bSYour Name 	wma_register_wlm_stats_events(wma_handle);
4021*5113495bSYour Name 	wma_register_wlm_latency_level_event(wma_handle);
4022*5113495bSYour Name 	wma_register_mws_coex_events(wma_handle);
4023*5113495bSYour Name 	wma_trace_init();
4024*5113495bSYour Name 	wma_set_exclude_selftx_from_cca_busy_time(
4025*5113495bSYour Name 			cds_cfg->exclude_selftx_from_cca_busy,
4026*5113495bSYour Name 			wma_handle);
4027*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
4028*5113495bSYour Name 
4029*5113495bSYour Name err_dbglog_init:
4030*5113495bSYour Name 	qdf_status = qdf_mutex_destroy(&wma_handle->radio_stats_lock);
4031*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(qdf_status))
4032*5113495bSYour Name 		wma_err("Failed to destroy radio stats mutex");
4033*5113495bSYour Name 
4034*5113495bSYour Name 	qdf_wake_lock_destroy(&wma_handle->wmi_cmd_rsp_wake_lock);
4035*5113495bSYour Name 	qdf_runtime_lock_deinit(&wma_handle->ndp_prevent_runtime_pm_lock);
4036*5113495bSYour Name 	qdf_runtime_lock_deinit(&wma_handle->sap_prevent_runtime_pm_lock);
4037*5113495bSYour Name 	qdf_runtime_lock_deinit(&wma_handle->wmi_cmd_rsp_runtime_lock);
4038*5113495bSYour Name 	qdf_spinlock_destroy(&wma_handle->wma_hold_req_q_lock);
4039*5113495bSYour Name err_event_init:
4040*5113495bSYour Name 	wmi_unified_unregister_event_handler(wma_handle->wmi_handle,
4041*5113495bSYour Name 					     wmi_debug_print_event_id);
4042*5113495bSYour Name 
4043*5113495bSYour Name 	for (i = 0; i < wma_handle->max_bssid; ++i)
4044*5113495bSYour Name 		wma_vdev_deinit(&wma_handle->interfaces[i]);
4045*5113495bSYour Name 
4046*5113495bSYour Name 	qdf_mem_free(wma_handle->interfaces);
4047*5113495bSYour Name 
4048*5113495bSYour Name err_scn_context:
4049*5113495bSYour Name 	qdf_mem_free(((struct cds_context *) cds_context)->cfg_ctx);
4050*5113495bSYour Name 	((struct cds_context *)cds_context)->cfg_ctx = NULL;
4051*5113495bSYour Name 	qdf_mem_free(wmi_handle);
4052*5113495bSYour Name 
4053*5113495bSYour Name err_wma_handle:
4054*5113495bSYour Name 	wlan_objmgr_psoc_release_ref(psoc, WLAN_LEGACY_WMA_ID);
4055*5113495bSYour Name err_get_psoc_ref:
4056*5113495bSYour Name 	target_if_free_psoc_tgt_info(psoc);
4057*5113495bSYour Name 	if (cds_get_conparam() != QDF_GLOBAL_FTM_MODE) {
4058*5113495bSYour Name 		qdf_wake_lock_destroy(&wma_handle->go_d3_wow_wake_lock);
4059*5113495bSYour Name 		qdf_wake_lock_destroy(&wma_handle->sap_d3_wow_wake_lock);
4060*5113495bSYour Name #ifdef FEATURE_WLAN_EXTSCAN
4061*5113495bSYour Name 		qdf_wake_lock_destroy(&wma_handle->extscan_wake_lock);
4062*5113495bSYour Name #endif /* FEATURE_WLAN_EXTSCAN */
4063*5113495bSYour Name 		qdf_wake_lock_destroy(&wma_handle->wow_wake_lock);
4064*5113495bSYour Name 		qdf_wake_lock_destroy(&wma_handle->wow_auth_req_wl);
4065*5113495bSYour Name 		qdf_wake_lock_destroy(&wma_handle->wow_assoc_req_wl);
4066*5113495bSYour Name 		qdf_wake_lock_destroy(&wma_handle->wow_deauth_rec_wl);
4067*5113495bSYour Name 		qdf_wake_lock_destroy(&wma_handle->wow_disassoc_rec_wl);
4068*5113495bSYour Name 		qdf_wake_lock_destroy(&wma_handle->wow_ap_assoc_lost_wl);
4069*5113495bSYour Name 		qdf_wake_lock_destroy(&wma_handle->wow_auto_shutdown_wl);
4070*5113495bSYour Name 		qdf_wake_lock_destroy(&wma_handle->roam_ho_wl);
4071*5113495bSYour Name 		qdf_wake_lock_destroy(&wma_handle->roam_preauth_wl);
4072*5113495bSYour Name 		qdf_wake_lock_destroy(&wma_handle->probe_req_wps_wl);
4073*5113495bSYour Name 	}
4074*5113495bSYour Name err_free_wma_handle:
4075*5113495bSYour Name 	cds_free_context(QDF_MODULE_ID_WMA, wma_handle);
4076*5113495bSYour Name 
4077*5113495bSYour Name 	wma_debug("Exit");
4078*5113495bSYour Name 
4079*5113495bSYour Name 	return qdf_status;
4080*5113495bSYour Name }
4081*5113495bSYour Name 
4082*5113495bSYour Name /**
4083*5113495bSYour Name  * wma_pre_start() - wma pre start
4084*5113495bSYour Name  *
4085*5113495bSYour Name  * Return: 0 on success, errno on failure
4086*5113495bSYour Name  */
wma_pre_start(void)4087*5113495bSYour Name QDF_STATUS wma_pre_start(void)
4088*5113495bSYour Name {
4089*5113495bSYour Name 	QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
4090*5113495bSYour Name 	tp_wma_handle wma_handle;
4091*5113495bSYour Name 	void *htc_handle;
4092*5113495bSYour Name 
4093*5113495bSYour Name 	wma_debug("Enter");
4094*5113495bSYour Name 
4095*5113495bSYour Name 	wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
4096*5113495bSYour Name 
4097*5113495bSYour Name 	/* Validate the wma_handle */
4098*5113495bSYour Name 	if (!wma_handle) {
4099*5113495bSYour Name 		qdf_status = QDF_STATUS_E_INVAL;
4100*5113495bSYour Name 		goto end;
4101*5113495bSYour Name 	}
4102*5113495bSYour Name 
4103*5113495bSYour Name 	htc_handle = lmac_get_htc_hdl(wma_handle->psoc);
4104*5113495bSYour Name 	if (!htc_handle) {
4105*5113495bSYour Name 		wma_err("invalid htc handle");
4106*5113495bSYour Name 		qdf_status = QDF_STATUS_E_INVAL;
4107*5113495bSYour Name 		goto end;
4108*5113495bSYour Name 	}
4109*5113495bSYour Name 
4110*5113495bSYour Name 	/* Open endpoint for ctrl path - WMI <--> HTC */
4111*5113495bSYour Name 	qdf_status = wmi_unified_connect_htc_service(wma_handle->wmi_handle,
4112*5113495bSYour Name 						     htc_handle);
4113*5113495bSYour Name 	if (qdf_status != QDF_STATUS_SUCCESS) {
4114*5113495bSYour Name 		wma_err("wmi_unified_connect_htc_service");
4115*5113495bSYour Name 		if (!cds_is_fw_down())
4116*5113495bSYour Name 			QDF_BUG(0);
4117*5113495bSYour Name 
4118*5113495bSYour Name 		qdf_status = QDF_STATUS_E_FAULT;
4119*5113495bSYour Name 		goto end;
4120*5113495bSYour Name 	}
4121*5113495bSYour Name 
4122*5113495bSYour Name 	/* Open endpoint for wmi diag path */
4123*5113495bSYour Name 	qdf_status = wmi_diag_connect_pdev_htc_service(wma_handle->wmi_handle,
4124*5113495bSYour Name 						       htc_handle);
4125*5113495bSYour Name 	if (qdf_status != QDF_STATUS_SUCCESS) {
4126*5113495bSYour Name 		wma_err("wmi_diag_connect_pdev_htc_service");
4127*5113495bSYour Name 		if (!cds_is_fw_down())
4128*5113495bSYour Name 			QDF_BUG(0);
4129*5113495bSYour Name 
4130*5113495bSYour Name 		qdf_status = QDF_STATUS_E_FAULT;
4131*5113495bSYour Name 		goto end;
4132*5113495bSYour Name 	}
4133*5113495bSYour Name 
4134*5113495bSYour Name 	wma_debug("WMA --> wmi_unified_connect_htc_service - success");
4135*5113495bSYour Name 
4136*5113495bSYour Name end:
4137*5113495bSYour Name 	wma_debug("Exit");
4138*5113495bSYour Name 	return qdf_status;
4139*5113495bSYour Name }
4140*5113495bSYour Name 
wma_send_msg_by_priority(tp_wma_handle wma_handle,uint16_t msg_type,void * body_ptr,uint32_t body_val,bool is_high_priority)4141*5113495bSYour Name void wma_send_msg_by_priority(tp_wma_handle wma_handle, uint16_t msg_type,
4142*5113495bSYour Name 		 void *body_ptr, uint32_t body_val, bool is_high_priority)
4143*5113495bSYour Name {
4144*5113495bSYour Name 	struct scheduler_msg msg = {0};
4145*5113495bSYour Name 	QDF_STATUS status;
4146*5113495bSYour Name 
4147*5113495bSYour Name 	msg.type = msg_type;
4148*5113495bSYour Name 	msg.bodyval = body_val;
4149*5113495bSYour Name 	msg.bodyptr = body_ptr;
4150*5113495bSYour Name 	msg.flush_callback = wma_discard_fw_event;
4151*5113495bSYour Name 
4152*5113495bSYour Name 	status = scheduler_post_msg_by_priority(QDF_MODULE_ID_PE,
4153*5113495bSYour Name 					       &msg, is_high_priority);
4154*5113495bSYour Name 	if (!QDF_IS_STATUS_SUCCESS(status)) {
4155*5113495bSYour Name 		if (body_ptr)
4156*5113495bSYour Name 			qdf_mem_free(body_ptr);
4157*5113495bSYour Name 	}
4158*5113495bSYour Name }
4159*5113495bSYour Name 
4160*5113495bSYour Name 
wma_send_msg(tp_wma_handle wma_handle,uint16_t msg_type,void * body_ptr,uint32_t body_val)4161*5113495bSYour Name void wma_send_msg(tp_wma_handle wma_handle, uint16_t msg_type,
4162*5113495bSYour Name 			 void *body_ptr, uint32_t body_val)
4163*5113495bSYour Name {
4164*5113495bSYour Name 	wma_send_msg_by_priority(wma_handle, msg_type,
4165*5113495bSYour Name 				body_ptr, body_val, false);
4166*5113495bSYour Name }
4167*5113495bSYour Name 
wma_send_msg_high_priority(tp_wma_handle wma_handle,uint16_t msg_type,void * body_ptr,uint32_t body_val)4168*5113495bSYour Name void wma_send_msg_high_priority(tp_wma_handle wma_handle, uint16_t msg_type,
4169*5113495bSYour Name 			 void *body_ptr, uint32_t body_val)
4170*5113495bSYour Name {
4171*5113495bSYour Name 	wma_send_msg_by_priority(wma_handle, msg_type,
4172*5113495bSYour Name 				body_ptr, body_val, true);
4173*5113495bSYour Name }
4174*5113495bSYour Name 
4175*5113495bSYour Name /**
4176*5113495bSYour Name  * wma_set_base_macaddr_indicate() - set base mac address in fw
4177*5113495bSYour Name  * @wma_handle: wma handle
4178*5113495bSYour Name  * @customAddr: base mac address
4179*5113495bSYour Name  *
4180*5113495bSYour Name  * Return: 0 for success or error code
4181*5113495bSYour Name  */
wma_set_base_macaddr_indicate(tp_wma_handle wma_handle,tSirMacAddr * customAddr)4182*5113495bSYour Name static int wma_set_base_macaddr_indicate(tp_wma_handle wma_handle,
4183*5113495bSYour Name 					 tSirMacAddr *customAddr)
4184*5113495bSYour Name {
4185*5113495bSYour Name 	int err;
4186*5113495bSYour Name 
4187*5113495bSYour Name 	err = wmi_unified_set_base_macaddr_indicate_cmd(wma_handle->wmi_handle,
4188*5113495bSYour Name 				     (uint8_t *)customAddr);
4189*5113495bSYour Name 	if (err)
4190*5113495bSYour Name 		return -EIO;
4191*5113495bSYour Name 	wma_debug("Base MAC Addr: " QDF_MAC_ADDR_FMT,
4192*5113495bSYour Name 		 QDF_MAC_ADDR_REF((*customAddr)));
4193*5113495bSYour Name 
4194*5113495bSYour Name 	return 0;
4195*5113495bSYour Name }
4196*5113495bSYour Name 
4197*5113495bSYour Name /**
4198*5113495bSYour Name  * wma_log_supported_evt_handler() - Enable/Disable FW diag/log events
4199*5113495bSYour Name  * @handle: WMA handle
4200*5113495bSYour Name  * @event:  Event received from FW
4201*5113495bSYour Name  * @len:    Length of the event
4202*5113495bSYour Name  *
4203*5113495bSYour Name  * Enables the low frequency events and disables the high frequency
4204*5113495bSYour Name  * events. Bit 17 indicates if the event if low/high frequency.
4205*5113495bSYour Name  * 1 - high frequency, 0 - low frequency
4206*5113495bSYour Name  *
4207*5113495bSYour Name  * Return: 0 on successfully enabling/disabling the events
4208*5113495bSYour Name  */
wma_log_supported_evt_handler(void * handle,uint8_t * event,uint32_t len)4209*5113495bSYour Name static int wma_log_supported_evt_handler(void *handle,
4210*5113495bSYour Name 		uint8_t *event,
4211*5113495bSYour Name 		uint32_t len)
4212*5113495bSYour Name {
4213*5113495bSYour Name 	tp_wma_handle wma = (tp_wma_handle) handle;
4214*5113495bSYour Name 
4215*5113495bSYour Name 	if (wmi_unified_log_supported_evt_cmd(wma->wmi_handle,
4216*5113495bSYour Name 				event, len))
4217*5113495bSYour Name 		return -EINVAL;
4218*5113495bSYour Name 
4219*5113495bSYour Name 	return 0;
4220*5113495bSYour Name }
4221*5113495bSYour Name 
4222*5113495bSYour Name /**
4223*5113495bSYour Name  * wma_pdev_set_hw_mode_resp_evt_handler() - Set HW mode resp evt handler
4224*5113495bSYour Name  * @handle: WMI handle
4225*5113495bSYour Name  * @event:  Event received from FW
4226*5113495bSYour Name  * @len:    Length of the event
4227*5113495bSYour Name  *
4228*5113495bSYour Name  * Event handler for WMI_PDEV_SET_HW_MODE_RESP_EVENTID that is sent to host
4229*5113495bSYour Name  * driver in response to a WMI_PDEV_SET_HW_MODE_CMDID being sent to WLAN
4230*5113495bSYour Name  * firmware
4231*5113495bSYour Name  *
4232*5113495bSYour Name  * Return: QDF_STATUS
4233*5113495bSYour Name  */
wma_pdev_set_hw_mode_resp_evt_handler(void * handle,uint8_t * event,uint32_t len)4234*5113495bSYour Name static int wma_pdev_set_hw_mode_resp_evt_handler(void *handle,
4235*5113495bSYour Name 		uint8_t *event,
4236*5113495bSYour Name 		uint32_t len)
4237*5113495bSYour Name {
4238*5113495bSYour Name 	WMI_PDEV_SET_HW_MODE_RESP_EVENTID_param_tlvs *param_buf;
4239*5113495bSYour Name 	wmi_pdev_set_hw_mode_response_event_fixed_param *wmi_event;
4240*5113495bSYour Name 	wmi_pdev_set_hw_mode_response_vdev_mac_entry *vdev_mac_entry;
4241*5113495bSYour Name 	uint32_t i;
4242*5113495bSYour Name 	struct sir_set_hw_mode_resp *hw_mode_resp;
4243*5113495bSYour Name 	tp_wma_handle wma = (tp_wma_handle) handle;
4244*5113495bSYour Name 
4245*5113495bSYour Name 	if (wma_validate_handle(wma)) {
4246*5113495bSYour Name 		/* Since WMA handle itself is NULL, we cannot send fail
4247*5113495bSYour Name 		 * response back to LIM here
4248*5113495bSYour Name 		 */
4249*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
4250*5113495bSYour Name 	}
4251*5113495bSYour Name 
4252*5113495bSYour Name 	wma_release_wakelock(&wma->wmi_cmd_rsp_wake_lock);
4253*5113495bSYour Name 	wma_remove_req(wma, 0, WMA_PDEV_SET_HW_MODE_RESP);
4254*5113495bSYour Name 
4255*5113495bSYour Name 	hw_mode_resp = qdf_mem_malloc(sizeof(*hw_mode_resp));
4256*5113495bSYour Name 	if (!hw_mode_resp) {
4257*5113495bSYour Name 		/* Since this memory allocation itself failed, we cannot
4258*5113495bSYour Name 		 * send fail response back to LIM here
4259*5113495bSYour Name 		 */
4260*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
4261*5113495bSYour Name 	}
4262*5113495bSYour Name 
4263*5113495bSYour Name 	param_buf = (WMI_PDEV_SET_HW_MODE_RESP_EVENTID_param_tlvs *) event;
4264*5113495bSYour Name 	if (!param_buf) {
4265*5113495bSYour Name 		wma_err("Invalid WMI_PDEV_SET_HW_MODE_RESP_EVENTID event");
4266*5113495bSYour Name 		/* Need to send response back to upper layer to free
4267*5113495bSYour Name 		 * active command list
4268*5113495bSYour Name 		 */
4269*5113495bSYour Name 		goto fail;
4270*5113495bSYour Name 	}
4271*5113495bSYour Name 	if (param_buf->fixed_param->num_vdev_mac_entries >=
4272*5113495bSYour Name 						MAX_VDEV_SUPPORTED) {
4273*5113495bSYour Name 		wma_err("num_vdev_mac_entries crossed max value");
4274*5113495bSYour Name 		goto fail;
4275*5113495bSYour Name 	}
4276*5113495bSYour Name 
4277*5113495bSYour Name 	wmi_event = param_buf->fixed_param;
4278*5113495bSYour Name 	if (wmi_event->num_vdev_mac_entries >
4279*5113495bSYour Name 	    param_buf->num_wmi_pdev_set_hw_mode_response_vdev_mac_mapping) {
4280*5113495bSYour Name 		wma_err("Invalid num_vdev_mac_entries: %d",
4281*5113495bSYour Name 			wmi_event->num_vdev_mac_entries);
4282*5113495bSYour Name 		goto fail;
4283*5113495bSYour Name 	}
4284*5113495bSYour Name 	hw_mode_resp->status = wmi_event->status;
4285*5113495bSYour Name 	hw_mode_resp->cfgd_hw_mode_index = wmi_event->cfgd_hw_mode_index;
4286*5113495bSYour Name 	hw_mode_resp->num_vdev_mac_entries = wmi_event->num_vdev_mac_entries;
4287*5113495bSYour Name 
4288*5113495bSYour Name 	wma->set_hw_mode_resp_status = wmi_event->status;
4289*5113495bSYour Name 	wma_debug("status:%d cfgd_hw_mode_index:%d num_vdev_mac_entries:%d",
4290*5113495bSYour Name 			wmi_event->status,
4291*5113495bSYour Name 			wmi_event->cfgd_hw_mode_index,
4292*5113495bSYour Name 			wmi_event->num_vdev_mac_entries);
4293*5113495bSYour Name 	vdev_mac_entry =
4294*5113495bSYour Name 		param_buf->wmi_pdev_set_hw_mode_response_vdev_mac_mapping;
4295*5113495bSYour Name 
4296*5113495bSYour Name 	/* Store the vdev-mac map in WMA and prepare to send to PE  */
4297*5113495bSYour Name 	for (i = 0; i < wmi_event->num_vdev_mac_entries; i++) {
4298*5113495bSYour Name 		uint32_t vdev_id, mac_id, pdev_id;
4299*5113495bSYour Name 
4300*5113495bSYour Name 		vdev_id = vdev_mac_entry[i].vdev_id;
4301*5113495bSYour Name 		pdev_id = vdev_mac_entry[i].pdev_id;
4302*5113495bSYour Name 		if (pdev_id == OL_TXRX_PDEV_ID) {
4303*5113495bSYour Name 			wma_err("soc level id received for mac id");
4304*5113495bSYour Name 			goto fail;
4305*5113495bSYour Name 		}
4306*5113495bSYour Name 		if (vdev_id >= wma->max_bssid) {
4307*5113495bSYour Name 			wma_err("vdev_id: %d is invalid, max_bssid: %d",
4308*5113495bSYour Name 				vdev_id, wma->max_bssid);
4309*5113495bSYour Name 			goto fail;
4310*5113495bSYour Name 		}
4311*5113495bSYour Name 
4312*5113495bSYour Name 		mac_id = WMA_PDEV_TO_MAC_MAP(vdev_mac_entry[i].pdev_id);
4313*5113495bSYour Name 
4314*5113495bSYour Name 		wma_debug("vdev_id:%d mac_id:%d", vdev_id, mac_id);
4315*5113495bSYour Name 
4316*5113495bSYour Name 		hw_mode_resp->vdev_mac_map[i].vdev_id = vdev_id;
4317*5113495bSYour Name 		hw_mode_resp->vdev_mac_map[i].mac_id = mac_id;
4318*5113495bSYour Name 		wma_update_intf_hw_mode_params(vdev_id, mac_id,
4319*5113495bSYour Name 				wmi_event->cfgd_hw_mode_index);
4320*5113495bSYour Name 	}
4321*5113495bSYour Name 
4322*5113495bSYour Name 	if (hw_mode_resp->status == SET_HW_MODE_STATUS_OK) {
4323*5113495bSYour Name 		if (WMA_DEFAULT_HW_MODE_INDEX == wma->new_hw_mode_index) {
4324*5113495bSYour Name 			wma->new_hw_mode_index = wmi_event->cfgd_hw_mode_index;
4325*5113495bSYour Name 		} else {
4326*5113495bSYour Name 			wma->old_hw_mode_index = wma->new_hw_mode_index;
4327*5113495bSYour Name 			wma->new_hw_mode_index = wmi_event->cfgd_hw_mode_index;
4328*5113495bSYour Name 		}
4329*5113495bSYour Name 		policy_mgr_update_hw_mode_index(wma->psoc,
4330*5113495bSYour Name 		wmi_event->cfgd_hw_mode_index);
4331*5113495bSYour Name 	}
4332*5113495bSYour Name 
4333*5113495bSYour Name 	wma_debug("Updated: old_hw_mode_index:%d new_hw_mode_index:%d",
4334*5113495bSYour Name 		 wma->old_hw_mode_index, wma->new_hw_mode_index);
4335*5113495bSYour Name 
4336*5113495bSYour Name 	wma_send_msg(wma, SIR_HAL_PDEV_SET_HW_MODE_RESP,
4337*5113495bSYour Name 		     (void *) hw_mode_resp, 0);
4338*5113495bSYour Name 
4339*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
4340*5113495bSYour Name 
4341*5113495bSYour Name fail:
4342*5113495bSYour Name 	wma_err("Sending fail response to LIM");
4343*5113495bSYour Name 	hw_mode_resp->status = SET_HW_MODE_STATUS_ECANCELED;
4344*5113495bSYour Name 	hw_mode_resp->cfgd_hw_mode_index = 0;
4345*5113495bSYour Name 	hw_mode_resp->num_vdev_mac_entries = 0;
4346*5113495bSYour Name 	wma_send_msg(wma, SIR_HAL_PDEV_SET_HW_MODE_RESP,
4347*5113495bSYour Name 			(void *) hw_mode_resp, 0);
4348*5113495bSYour Name 
4349*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
4350*5113495bSYour Name }
4351*5113495bSYour Name 
4352*5113495bSYour Name /**
4353*5113495bSYour Name  * wma_process_pdev_hw_mode_trans_ind() - Process HW mode transition info
4354*5113495bSYour Name  *
4355*5113495bSYour Name  * @handle: WMA handle
4356*5113495bSYour Name  * @fixed_param: Event fixed parameters
4357*5113495bSYour Name  * @vdev_mac_entry: vdev mac entry
4358*5113495bSYour Name  * @hw_mode_trans_ind: Buffer to store parsed information
4359*5113495bSYour Name  *
4360*5113495bSYour Name  * Parses fixed_param, vdev_mac_entry and fills in the information into
4361*5113495bSYour Name  * hw_mode_trans_ind and wma
4362*5113495bSYour Name  *
4363*5113495bSYour Name  * Return: None
4364*5113495bSYour Name  */
wma_process_pdev_hw_mode_trans_ind(void * handle,wmi_pdev_hw_mode_transition_event_fixed_param * fixed_param,wmi_pdev_set_hw_mode_response_vdev_mac_entry * vdev_mac_entry,struct cm_hw_mode_trans_ind * hw_mode_trans_ind)4365*5113495bSYour Name void wma_process_pdev_hw_mode_trans_ind(void *handle,
4366*5113495bSYour Name 	wmi_pdev_hw_mode_transition_event_fixed_param *fixed_param,
4367*5113495bSYour Name 	wmi_pdev_set_hw_mode_response_vdev_mac_entry *vdev_mac_entry,
4368*5113495bSYour Name 	struct cm_hw_mode_trans_ind *hw_mode_trans_ind)
4369*5113495bSYour Name {
4370*5113495bSYour Name 	uint32_t i;
4371*5113495bSYour Name 	tp_wma_handle wma = (tp_wma_handle) handle;
4372*5113495bSYour Name 
4373*5113495bSYour Name 	if (fixed_param->num_vdev_mac_entries > MAX_VDEV_SUPPORTED) {
4374*5113495bSYour Name 		wma_err("Number of Vdev mac entries %d exceeded max vdev supported %d",
4375*5113495bSYour Name 			fixed_param->num_vdev_mac_entries,
4376*5113495bSYour Name 			MAX_VDEV_SUPPORTED);
4377*5113495bSYour Name 		return;
4378*5113495bSYour Name 	}
4379*5113495bSYour Name 	hw_mode_trans_ind->old_hw_mode_index = fixed_param->old_hw_mode_index;
4380*5113495bSYour Name 	hw_mode_trans_ind->new_hw_mode_index = fixed_param->new_hw_mode_index;
4381*5113495bSYour Name 	hw_mode_trans_ind->num_vdev_mac_entries =
4382*5113495bSYour Name 					fixed_param->num_vdev_mac_entries;
4383*5113495bSYour Name 
4384*5113495bSYour Name 	if (!vdev_mac_entry) {
4385*5113495bSYour Name 		wma_debug("null vdev_mac_entry");
4386*5113495bSYour Name 		goto update_hw_mode;
4387*5113495bSYour Name 	}
4388*5113495bSYour Name 
4389*5113495bSYour Name 	/* Store the vdev-mac map in WMA and send to policy manager */
4390*5113495bSYour Name 	for (i = 0; i < fixed_param->num_vdev_mac_entries; i++) {
4391*5113495bSYour Name 		uint32_t vdev_id, mac_id, pdev_id;
4392*5113495bSYour Name 
4393*5113495bSYour Name 		vdev_id = vdev_mac_entry[i].vdev_id;
4394*5113495bSYour Name 		pdev_id = vdev_mac_entry[i].pdev_id;
4395*5113495bSYour Name 
4396*5113495bSYour Name 		if (pdev_id == OL_TXRX_PDEV_ID) {
4397*5113495bSYour Name 			wma_err("soc level id received for mac id");
4398*5113495bSYour Name 			return;
4399*5113495bSYour Name 		}
4400*5113495bSYour Name 		if (vdev_id >= wma->max_bssid) {
4401*5113495bSYour Name 			wma_err("vdev_id: %d is invalid, max_bssid: %d",
4402*5113495bSYour Name 			        vdev_id, wma->max_bssid);
4403*5113495bSYour Name 			return;
4404*5113495bSYour Name 		}
4405*5113495bSYour Name 
4406*5113495bSYour Name 		mac_id = WMA_PDEV_TO_MAC_MAP(vdev_mac_entry[i].pdev_id);
4407*5113495bSYour Name 		hw_mode_trans_ind->vdev_mac_map[i].vdev_id = vdev_id;
4408*5113495bSYour Name 		hw_mode_trans_ind->vdev_mac_map[i].mac_id = mac_id;
4409*5113495bSYour Name 		wma_update_intf_hw_mode_params(vdev_id, mac_id,
4410*5113495bSYour Name 				fixed_param->new_hw_mode_index);
4411*5113495bSYour Name 	}
4412*5113495bSYour Name update_hw_mode:
4413*5113495bSYour Name 	wma->old_hw_mode_index = fixed_param->old_hw_mode_index;
4414*5113495bSYour Name 	wma->new_hw_mode_index = fixed_param->new_hw_mode_index;
4415*5113495bSYour Name 	policy_mgr_update_new_hw_mode_index(wma->psoc,
4416*5113495bSYour Name 		fixed_param->new_hw_mode_index);
4417*5113495bSYour Name 	policy_mgr_update_old_hw_mode_index(wma->psoc,
4418*5113495bSYour Name 		fixed_param->old_hw_mode_index);
4419*5113495bSYour Name }
4420*5113495bSYour Name 
4421*5113495bSYour Name static void
wma_process_mac_freq_mapping(struct cm_hw_mode_trans_ind * hw_mode_trans_ind,WMI_PDEV_HW_MODE_TRANSITION_EVENTID_param_tlvs * param_buf)4422*5113495bSYour Name wma_process_mac_freq_mapping(struct cm_hw_mode_trans_ind *hw_mode_trans_ind,
4423*5113495bSYour Name 		WMI_PDEV_HW_MODE_TRANSITION_EVENTID_param_tlvs *param_buf)
4424*5113495bSYour Name {
4425*5113495bSYour Name 	uint32_t i, num_mac_freq;
4426*5113495bSYour Name 	wmi_pdev_band_to_mac *mac_freq;
4427*5113495bSYour Name 
4428*5113495bSYour Name 	mac_freq = param_buf->mac_freq_mapping;
4429*5113495bSYour Name 	num_mac_freq = param_buf->num_mac_freq_mapping;
4430*5113495bSYour Name 
4431*5113495bSYour Name 	if (!mac_freq) {
4432*5113495bSYour Name 		wma_debug("mac_freq Null");
4433*5113495bSYour Name 		return;
4434*5113495bSYour Name 	}
4435*5113495bSYour Name 
4436*5113495bSYour Name 	if (!num_mac_freq || num_mac_freq > MAX_FREQ_RANGE_NUM) {
4437*5113495bSYour Name 		wma_debug("num mac freq invalid %d", num_mac_freq);
4438*5113495bSYour Name 		return;
4439*5113495bSYour Name 	}
4440*5113495bSYour Name 
4441*5113495bSYour Name 	hw_mode_trans_ind->num_freq_map = num_mac_freq;
4442*5113495bSYour Name 	for (i = 0; i < num_mac_freq; i++) {
4443*5113495bSYour Name 		hw_mode_trans_ind->mac_freq_map[i].mac_id =
4444*5113495bSYour Name 				WMA_PDEV_TO_MAC_MAP(mac_freq[i].pdev_id);
4445*5113495bSYour Name 		hw_mode_trans_ind->mac_freq_map[i].start_freq =
4446*5113495bSYour Name 							mac_freq[i].start_freq;
4447*5113495bSYour Name 		hw_mode_trans_ind->mac_freq_map[i].end_freq =
4448*5113495bSYour Name 							mac_freq[i].end_freq;
4449*5113495bSYour Name 	}
4450*5113495bSYour Name }
4451*5113495bSYour Name 
4452*5113495bSYour Name /**
4453*5113495bSYour Name  * wma_pdev_hw_mode_transition_evt_handler() - HW mode transition evt handler
4454*5113495bSYour Name  * @handle: WMI handle
4455*5113495bSYour Name  * @event:  Event received from FW
4456*5113495bSYour Name  * @len:    Length of the event
4457*5113495bSYour Name  *
4458*5113495bSYour Name  * Event handler for WMI_PDEV_HW_MODE_TRANSITION_EVENTID that indicates an
4459*5113495bSYour Name  * asynchronous hardware mode transition. This event notifies the host driver
4460*5113495bSYour Name  * that firmware independently changed the hardware mode for some reason, such
4461*5113495bSYour Name  * as Coex, LFR 3.0, etc
4462*5113495bSYour Name  *
4463*5113495bSYour Name  * Return: Success on receiving valid params from FW
4464*5113495bSYour Name  */
wma_pdev_hw_mode_transition_evt_handler(void * handle,uint8_t * event,uint32_t len)4465*5113495bSYour Name static int wma_pdev_hw_mode_transition_evt_handler(void *handle,
4466*5113495bSYour Name 		uint8_t *event,
4467*5113495bSYour Name 		uint32_t len)
4468*5113495bSYour Name {
4469*5113495bSYour Name 	WMI_PDEV_HW_MODE_TRANSITION_EVENTID_param_tlvs *param_buf;
4470*5113495bSYour Name 	wmi_pdev_hw_mode_transition_event_fixed_param *wmi_event;
4471*5113495bSYour Name 	wmi_pdev_set_hw_mode_response_vdev_mac_entry *vdev_mac_entry;
4472*5113495bSYour Name 	struct cm_hw_mode_trans_ind *hw_mode_trans_ind;
4473*5113495bSYour Name 	tp_wma_handle wma = (tp_wma_handle) handle;
4474*5113495bSYour Name 
4475*5113495bSYour Name 	if (wma_validate_handle(wma)) {
4476*5113495bSYour Name 		/* This is an async event. So, not sending any event to LIM */
4477*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
4478*5113495bSYour Name 	}
4479*5113495bSYour Name 
4480*5113495bSYour Name 	param_buf = (WMI_PDEV_HW_MODE_TRANSITION_EVENTID_param_tlvs *) event;
4481*5113495bSYour Name 	if (!param_buf) {
4482*5113495bSYour Name 		/* This is an async event. So, not sending any event to LIM */
4483*5113495bSYour Name 		wma_err("Invalid WMI_PDEV_HW_MODE_TRANSITION_EVENTID event");
4484*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
4485*5113495bSYour Name 	}
4486*5113495bSYour Name 
4487*5113495bSYour Name 	if (param_buf->fixed_param->num_vdev_mac_entries > MAX_VDEV_SUPPORTED) {
4488*5113495bSYour Name 		wma_err("num_vdev_mac_entries: %d crossed max value: %d",
4489*5113495bSYour Name 			param_buf->fixed_param->num_vdev_mac_entries,
4490*5113495bSYour Name 			MAX_VDEV_SUPPORTED);
4491*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
4492*5113495bSYour Name 	}
4493*5113495bSYour Name 
4494*5113495bSYour Name 	hw_mode_trans_ind = qdf_mem_malloc(sizeof(*hw_mode_trans_ind));
4495*5113495bSYour Name 	if (!hw_mode_trans_ind)
4496*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
4497*5113495bSYour Name 
4498*5113495bSYour Name 	wmi_event = param_buf->fixed_param;
4499*5113495bSYour Name 	vdev_mac_entry =
4500*5113495bSYour Name 		param_buf->wmi_pdev_set_hw_mode_response_vdev_mac_mapping;
4501*5113495bSYour Name 	if (wmi_event->num_vdev_mac_entries >
4502*5113495bSYour Name 	    param_buf->num_wmi_pdev_set_hw_mode_response_vdev_mac_mapping) {
4503*5113495bSYour Name 		wma_err("Invalid num_vdev_mac_entries: %d",
4504*5113495bSYour Name 			wmi_event->num_vdev_mac_entries);
4505*5113495bSYour Name 		qdf_mem_free(hw_mode_trans_ind);
4506*5113495bSYour Name 		return -EINVAL;
4507*5113495bSYour Name 	}
4508*5113495bSYour Name 
4509*5113495bSYour Name 	wma_process_pdev_hw_mode_trans_ind(wma, wmi_event, vdev_mac_entry,
4510*5113495bSYour Name 		hw_mode_trans_ind);
4511*5113495bSYour Name 	wma_process_mac_freq_mapping(hw_mode_trans_ind, param_buf);
4512*5113495bSYour Name 
4513*5113495bSYour Name 	if (policy_mgr_is_hwmode_offload_enabled(wma->psoc)) {
4514*5113495bSYour Name 		policy_mgr_hw_mode_transition_cb(
4515*5113495bSYour Name 			hw_mode_trans_ind->old_hw_mode_index,
4516*5113495bSYour Name 			hw_mode_trans_ind->new_hw_mode_index,
4517*5113495bSYour Name 			hw_mode_trans_ind->num_vdev_mac_entries,
4518*5113495bSYour Name 			hw_mode_trans_ind->vdev_mac_map,
4519*5113495bSYour Name 			hw_mode_trans_ind->num_freq_map,
4520*5113495bSYour Name 			hw_mode_trans_ind->mac_freq_map,
4521*5113495bSYour Name 			wma->psoc);
4522*5113495bSYour Name 		qdf_mem_free(hw_mode_trans_ind);
4523*5113495bSYour Name 	} else {
4524*5113495bSYour Name 		struct scheduler_msg sme_msg = {0};
4525*5113495bSYour Name 		QDF_STATUS status;
4526*5113495bSYour Name 
4527*5113495bSYour Name 		wma_debug("post eWNI_SME_HW_MODE_TRANS_IND");
4528*5113495bSYour Name 		sme_msg.type = eWNI_SME_HW_MODE_TRANS_IND;
4529*5113495bSYour Name 		sme_msg.bodyptr = hw_mode_trans_ind;
4530*5113495bSYour Name 		sme_msg.flush_callback = wma_discard_fw_event;
4531*5113495bSYour Name 
4532*5113495bSYour Name 		status = scheduler_post_message(QDF_MODULE_ID_WMA,
4533*5113495bSYour Name 						QDF_MODULE_ID_SME,
4534*5113495bSYour Name 						QDF_MODULE_ID_SME, &sme_msg);
4535*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(status))
4536*5113495bSYour Name 			qdf_mem_free(hw_mode_trans_ind);
4537*5113495bSYour Name 	}
4538*5113495bSYour Name 
4539*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
4540*5113495bSYour Name }
4541*5113495bSYour Name 
4542*5113495bSYour Name /**
4543*5113495bSYour Name  * wma_pdev_set_dual_mode_config_resp_evt_handler() - Dual mode evt handler
4544*5113495bSYour Name  * @handle: WMI handle
4545*5113495bSYour Name  * @event:  Event received from FW
4546*5113495bSYour Name  * @len:    Length of the event
4547*5113495bSYour Name  *
4548*5113495bSYour Name  * Notifies the host driver of the completion or failure of a
4549*5113495bSYour Name  * WMI_PDEV_SET_MAC_CONFIG_CMDID command. This event would be returned to
4550*5113495bSYour Name  * the host driver once the firmware has completed a reconfiguration of the Scan
4551*5113495bSYour Name  * and FW mode configuration. This changes could include entering or leaving a
4552*5113495bSYour Name  * dual mac configuration for either scan and/or more permanent firmware mode.
4553*5113495bSYour Name  *
4554*5113495bSYour Name  * Return: Success on receiving valid params from FW
4555*5113495bSYour Name  */
wma_pdev_set_dual_mode_config_resp_evt_handler(void * handle,uint8_t * event,uint32_t len)4556*5113495bSYour Name static int wma_pdev_set_dual_mode_config_resp_evt_handler(void *handle,
4557*5113495bSYour Name 		uint8_t *event,
4558*5113495bSYour Name 		uint32_t len)
4559*5113495bSYour Name {
4560*5113495bSYour Name 	WMI_PDEV_SET_MAC_CONFIG_RESP_EVENTID_param_tlvs *param_buf;
4561*5113495bSYour Name 	wmi_pdev_set_mac_config_response_event_fixed_param *wmi_event;
4562*5113495bSYour Name 	tp_wma_handle wma = (tp_wma_handle) handle;
4563*5113495bSYour Name 	struct sir_dual_mac_config_resp *dual_mac_cfg_resp;
4564*5113495bSYour Name 
4565*5113495bSYour Name 	if (wma_validate_handle(wma)) {
4566*5113495bSYour Name 		/* Since the WMA handle is NULL, we cannot send resp to LIM.
4567*5113495bSYour Name 		 * So, returning from here.
4568*5113495bSYour Name 		 */
4569*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
4570*5113495bSYour Name 	}
4571*5113495bSYour Name 	wma_release_wakelock(&wma->wmi_cmd_rsp_wake_lock);
4572*5113495bSYour Name 	wma_remove_req(wma, 0, WMA_PDEV_MAC_CFG_RESP);
4573*5113495bSYour Name 
4574*5113495bSYour Name 	dual_mac_cfg_resp = qdf_mem_malloc(sizeof(*dual_mac_cfg_resp));
4575*5113495bSYour Name 	if (!dual_mac_cfg_resp)
4576*5113495bSYour Name 		/* Since the mem alloc failed, we cannot send resp to LIM.
4577*5113495bSYour Name 		 * So, returning from here.
4578*5113495bSYour Name 		 */
4579*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
4580*5113495bSYour Name 
4581*5113495bSYour Name 	param_buf = (WMI_PDEV_SET_MAC_CONFIG_RESP_EVENTID_param_tlvs *)
4582*5113495bSYour Name 		event;
4583*5113495bSYour Name 	if (!param_buf) {
4584*5113495bSYour Name 		wma_err("Invalid event");
4585*5113495bSYour Name 		goto fail;
4586*5113495bSYour Name 	}
4587*5113495bSYour Name 
4588*5113495bSYour Name 	wmi_event = param_buf->fixed_param;
4589*5113495bSYour Name 	wma_debug("status: %d", wmi_event->status);
4590*5113495bSYour Name 	dual_mac_cfg_resp->status = wmi_event->status;
4591*5113495bSYour Name 
4592*5113495bSYour Name 	if (SET_HW_MODE_STATUS_OK == dual_mac_cfg_resp->status) {
4593*5113495bSYour Name 		policy_mgr_update_dbs_scan_config(wma->psoc);
4594*5113495bSYour Name 		policy_mgr_update_dbs_fw_config(wma->psoc);
4595*5113495bSYour Name 	}
4596*5113495bSYour Name 
4597*5113495bSYour Name 	/* Pass the message to PE */
4598*5113495bSYour Name 	wma_send_msg(wma, SIR_HAL_PDEV_MAC_CFG_RESP,
4599*5113495bSYour Name 			(void *) dual_mac_cfg_resp, 0);
4600*5113495bSYour Name 
4601*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
4602*5113495bSYour Name 
4603*5113495bSYour Name fail:
4604*5113495bSYour Name 	wma_err("Sending fail response to LIM");
4605*5113495bSYour Name 	dual_mac_cfg_resp->status = SET_HW_MODE_STATUS_ECANCELED;
4606*5113495bSYour Name 	wma_send_msg(wma, SIR_HAL_PDEV_MAC_CFG_RESP,
4607*5113495bSYour Name 			(void *) dual_mac_cfg_resp, 0);
4608*5113495bSYour Name 
4609*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
4610*5113495bSYour Name 
4611*5113495bSYour Name }
4612*5113495bSYour Name 
4613*5113495bSYour Name #ifdef WLAN_CONV_SPECTRAL_ENABLE
wma_register_spectral_cmds(tp_wma_handle wma_handle)4614*5113495bSYour Name static void wma_register_spectral_cmds(tp_wma_handle wma_handle)
4615*5113495bSYour Name {
4616*5113495bSYour Name 	struct spectral_wmi_ops cmd_ops;
4617*5113495bSYour Name 
4618*5113495bSYour Name 	cmd_ops.wmi_spectral_configure_cmd_send =
4619*5113495bSYour Name 			wmi_unified_vdev_spectral_configure_cmd_send;
4620*5113495bSYour Name 	cmd_ops.wmi_spectral_enable_cmd_send =
4621*5113495bSYour Name 			wmi_unified_vdev_spectral_enable_cmd_send;
4622*5113495bSYour Name 	wlan_register_spectral_wmi_ops(wma_handle->psoc, &cmd_ops);
4623*5113495bSYour Name }
4624*5113495bSYour Name #else
wma_register_spectral_cmds(tp_wma_handle wma_handle)4625*5113495bSYour Name static void wma_register_spectral_cmds(tp_wma_handle wma_handle)
4626*5113495bSYour Name {
4627*5113495bSYour Name }
4628*5113495bSYour Name #endif
4629*5113495bSYour Name /**
4630*5113495bSYour Name  * wma_start() - wma start function.
4631*5113495bSYour Name  *               Initialize event handlers and timers.
4632*5113495bSYour Name  *
4633*5113495bSYour Name  * Return: 0 on success, QDF Error on failure
4634*5113495bSYour Name  */
wma_start(void)4635*5113495bSYour Name QDF_STATUS wma_start(void)
4636*5113495bSYour Name {
4637*5113495bSYour Name 	QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
4638*5113495bSYour Name 	tp_wma_handle wma_handle;
4639*5113495bSYour Name 	struct wmi_unified *wmi_handle;
4640*5113495bSYour Name 	struct mac_context *mac = NULL;
4641*5113495bSYour Name 
4642*5113495bSYour Name 	wma_debug("Enter");
4643*5113495bSYour Name 
4644*5113495bSYour Name 	wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
4645*5113495bSYour Name 	if (!wma_handle) {
4646*5113495bSYour Name 		qdf_status = QDF_STATUS_E_INVAL;
4647*5113495bSYour Name 		goto end;
4648*5113495bSYour Name 	}
4649*5113495bSYour Name 
4650*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(wma_handle->psoc);
4651*5113495bSYour Name 	if (wmi_validate_handle(wmi_handle)) {
4652*5113495bSYour Name 		qdf_status = QDF_STATUS_E_INVAL;
4653*5113495bSYour Name 		goto end;
4654*5113495bSYour Name 	}
4655*5113495bSYour Name 
4656*5113495bSYour Name 	mac = cds_get_context(QDF_MODULE_ID_PE);
4657*5113495bSYour Name 	if (!mac) {
4658*5113495bSYour Name 		qdf_status = QDF_STATUS_E_INVAL;
4659*5113495bSYour Name 		goto end;
4660*5113495bSYour Name 	}
4661*5113495bSYour Name 
4662*5113495bSYour Name 	qdf_status = wmi_unified_register_event_handler(wmi_handle,
4663*5113495bSYour Name 						    wmi_wow_wakeup_host_event_id,
4664*5113495bSYour Name 						    wma_wow_wakeup_host_event,
4665*5113495bSYour Name 						    WMA_RX_TASKLET_CTX);
4666*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(qdf_status)) {
4667*5113495bSYour Name 		wma_err("Failed to register wow wakeup host event handler");
4668*5113495bSYour Name 		qdf_status = QDF_STATUS_E_FAILURE;
4669*5113495bSYour Name 		goto end;
4670*5113495bSYour Name 	}
4671*5113495bSYour Name 
4672*5113495bSYour Name 	if (wma_d0_wow_is_supported()) {
4673*5113495bSYour Name 		qdf_status = wmi_unified_register_event_handler(
4674*5113495bSYour Name 				wmi_handle,
4675*5113495bSYour Name 				wmi_d0_wow_disable_ack_event_id,
4676*5113495bSYour Name 				wma_d0_wow_disable_ack_event,
4677*5113495bSYour Name 				WMA_RX_TASKLET_CTX);
4678*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(qdf_status)) {
4679*5113495bSYour Name 			wma_err("Failed to register d0wow disable ack event handler");
4680*5113495bSYour Name 			qdf_status = QDF_STATUS_E_FAILURE;
4681*5113495bSYour Name 			goto end;
4682*5113495bSYour Name 		}
4683*5113495bSYour Name 	}
4684*5113495bSYour Name 
4685*5113495bSYour Name 	qdf_status = wmi_unified_register_event_handler(wmi_handle,
4686*5113495bSYour Name 				wmi_pdev_resume_event_id,
4687*5113495bSYour Name 				wma_pdev_resume_event_handler,
4688*5113495bSYour Name 				WMA_RX_TASKLET_CTX);
4689*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(qdf_status)) {
4690*5113495bSYour Name 		wma_err("Failed to register PDEV resume event handler");
4691*5113495bSYour Name 		qdf_status = QDF_STATUS_E_FAILURE;
4692*5113495bSYour Name 		goto end;
4693*5113495bSYour Name 	}
4694*5113495bSYour Name #if defined(QCA_LL_LEGACY_TX_FLOW_CONTROL) || \
4695*5113495bSYour Name 	defined(QCA_LL_TX_FLOW_CONTROL_V2) || defined(CONFIG_HL_SUPPORT)
4696*5113495bSYour Name 	wma_debug("MCC TX Pause Event Handler register");
4697*5113495bSYour Name 	qdf_status = wmi_unified_register_event_handler(wmi_handle,
4698*5113495bSYour Name 					wmi_tx_pause_event_id,
4699*5113495bSYour Name 					wma_mcc_vdev_tx_pause_evt_handler,
4700*5113495bSYour Name 					WMA_RX_TASKLET_CTX);
4701*5113495bSYour Name #endif /* QCA_LL_LEGACY_TX_FLOW_CONTROL */
4702*5113495bSYour Name 
4703*5113495bSYour Name 	wma_debug("Registering SAR2 response handler");
4704*5113495bSYour Name 	qdf_status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
4705*5113495bSYour Name 						wmi_wlan_sar2_result_event_id,
4706*5113495bSYour Name 						wma_sar_rsp_evt_handler,
4707*5113495bSYour Name 						WMA_RX_SERIALIZER_CTX);
4708*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(qdf_status)) {
4709*5113495bSYour Name 		wma_err("Failed to register sar response event cb");
4710*5113495bSYour Name 		qdf_status = QDF_STATUS_E_FAILURE;
4711*5113495bSYour Name 		goto end;
4712*5113495bSYour Name 	}
4713*5113495bSYour Name 
4714*5113495bSYour Name #ifdef FEATURE_WLAN_AUTO_SHUTDOWN
4715*5113495bSYour Name 	wma_debug("Registering auto shutdown handler");
4716*5113495bSYour Name 	qdf_status = wmi_unified_register_event_handler(wmi_handle,
4717*5113495bSYour Name 						wmi_host_auto_shutdown_event_id,
4718*5113495bSYour Name 						wma_auto_shutdown_event_handler,
4719*5113495bSYour Name 						WMA_RX_SERIALIZER_CTX);
4720*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(qdf_status)) {
4721*5113495bSYour Name 		wma_err("Failed to register WMI Auto shutdown event handler");
4722*5113495bSYour Name 		qdf_status = QDF_STATUS_E_FAILURE;
4723*5113495bSYour Name 		goto end;
4724*5113495bSYour Name 	}
4725*5113495bSYour Name #endif /* FEATURE_WLAN_AUTO_SHUTDOWN */
4726*5113495bSYour Name 	qdf_status = wmi_unified_register_event_handler(wmi_handle,
4727*5113495bSYour Name 						wmi_thermal_mgmt_event_id,
4728*5113495bSYour Name 						wma_thermal_mgmt_evt_handler,
4729*5113495bSYour Name 						WMA_RX_SERIALIZER_CTX);
4730*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(qdf_status)) {
4731*5113495bSYour Name 		wma_err("Failed to register thermal mitigation event cb");
4732*5113495bSYour Name 		qdf_status = QDF_STATUS_E_FAILURE;
4733*5113495bSYour Name 		goto end;
4734*5113495bSYour Name 	}
4735*5113495bSYour Name 
4736*5113495bSYour Name 	qdf_status = wma_ocb_register_callbacks(wma_handle);
4737*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(qdf_status)) {
4738*5113495bSYour Name 		wma_err("Failed to register OCB callbacks");
4739*5113495bSYour Name 		qdf_status = QDF_STATUS_E_FAILURE;
4740*5113495bSYour Name 		goto end;
4741*5113495bSYour Name 	}
4742*5113495bSYour Name 
4743*5113495bSYour Name 	qdf_status = QDF_STATUS_SUCCESS;
4744*5113495bSYour Name 
4745*5113495bSYour Name #ifdef QCA_WIFI_FTM
4746*5113495bSYour Name 	/*
4747*5113495bSYour Name 	 * Tx mgmt attach requires TXRX context which is not created
4748*5113495bSYour Name 	 * in FTM mode. So skip the TX mgmt attach.
4749*5113495bSYour Name 	 */
4750*5113495bSYour Name 	if (cds_get_conparam() == QDF_GLOBAL_FTM_MODE)
4751*5113495bSYour Name 		goto end;
4752*5113495bSYour Name #endif /* QCA_WIFI_FTM */
4753*5113495bSYour Name 
4754*5113495bSYour Name 	qdf_status = wma_tx_attach(wma_handle);
4755*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(qdf_status)) {
4756*5113495bSYour Name 		wma_err("Failed to register tx management");
4757*5113495bSYour Name 		goto end;
4758*5113495bSYour Name 	}
4759*5113495bSYour Name 
4760*5113495bSYour Name 	/* Initialize log completion timeout */
4761*5113495bSYour Name 	qdf_status = qdf_mc_timer_init(&wma_handle->log_completion_timer,
4762*5113495bSYour Name 			QDF_TIMER_TYPE_SW,
4763*5113495bSYour Name 			wma_log_completion_timeout,
4764*5113495bSYour Name 			wma_handle);
4765*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(qdf_status)) {
4766*5113495bSYour Name 		wma_err("Failed to initialize log completion timeout");
4767*5113495bSYour Name 		goto end;
4768*5113495bSYour Name 	}
4769*5113495bSYour Name 
4770*5113495bSYour Name 	qdf_status = wma_fips_register_event_handlers(wma_handle);
4771*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(qdf_status)) {
4772*5113495bSYour Name 		wma_err("Failed to register FIPS event handler");
4773*5113495bSYour Name 		qdf_status = QDF_STATUS_E_FAILURE;
4774*5113495bSYour Name 		goto end;
4775*5113495bSYour Name 	}
4776*5113495bSYour Name 
4777*5113495bSYour Name 	qdf_status = wma_sar_register_event_handlers(wma_handle);
4778*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(qdf_status)) {
4779*5113495bSYour Name 		wma_err("Failed to register SAR event handlers");
4780*5113495bSYour Name 		qdf_status = QDF_STATUS_E_FAILURE;
4781*5113495bSYour Name 		goto end;
4782*5113495bSYour Name 	}
4783*5113495bSYour Name 
4784*5113495bSYour Name 	/* Initialize the get temperature event handler */
4785*5113495bSYour Name 	qdf_status = wmi_unified_register_event_handler(wmi_handle,
4786*5113495bSYour Name 					wmi_pdev_temperature_event_id,
4787*5113495bSYour Name 					wma_pdev_temperature_evt_handler,
4788*5113495bSYour Name 					WMA_RX_SERIALIZER_CTX);
4789*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(qdf_status)) {
4790*5113495bSYour Name 		wma_err("Failed to register get_temperature event cb");
4791*5113495bSYour Name 		qdf_status = QDF_STATUS_E_FAILURE;
4792*5113495bSYour Name 		goto end;
4793*5113495bSYour Name 	}
4794*5113495bSYour Name 
4795*5113495bSYour Name 	qdf_status = wmi_unified_register_event_handler(wmi_handle,
4796*5113495bSYour Name 						wmi_vdev_tsf_report_event_id,
4797*5113495bSYour Name 						wma_vdev_tsf_handler,
4798*5113495bSYour Name 						WMA_RX_SERIALIZER_CTX);
4799*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(qdf_status)) {
4800*5113495bSYour Name 		wma_err("Failed to register tsf callback");
4801*5113495bSYour Name 		qdf_status = QDF_STATUS_E_FAILURE;
4802*5113495bSYour Name 		goto end;
4803*5113495bSYour Name 	}
4804*5113495bSYour Name 
4805*5113495bSYour Name 	/* Initialize the wma_pdev_set_hw_mode_resp_evt_handler event handler */
4806*5113495bSYour Name 	qdf_status = wmi_unified_register_event_handler(wmi_handle,
4807*5113495bSYour Name 			wmi_pdev_set_hw_mode_rsp_event_id,
4808*5113495bSYour Name 			wma_pdev_set_hw_mode_resp_evt_handler,
4809*5113495bSYour Name 			WMA_RX_SERIALIZER_CTX);
4810*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(qdf_status)) {
4811*5113495bSYour Name 		wma_err("Failed to register set hw mode resp event cb");
4812*5113495bSYour Name 		qdf_status = QDF_STATUS_E_FAILURE;
4813*5113495bSYour Name 		goto end;
4814*5113495bSYour Name 	}
4815*5113495bSYour Name 
4816*5113495bSYour Name 	/* Initialize the WMI_SOC_HW_MODE_TRANSITION_EVENTID event handler */
4817*5113495bSYour Name 	qdf_status = wmi_unified_register_event_handler(wmi_handle,
4818*5113495bSYour Name 			wmi_pdev_hw_mode_transition_event_id,
4819*5113495bSYour Name 			wma_pdev_hw_mode_transition_evt_handler,
4820*5113495bSYour Name 			WMA_RX_SERIALIZER_CTX);
4821*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(qdf_status)) {
4822*5113495bSYour Name 		wma_err("Failed to register hw mode transition event cb");
4823*5113495bSYour Name 		qdf_status = QDF_STATUS_E_FAILURE;
4824*5113495bSYour Name 		goto end;
4825*5113495bSYour Name 	}
4826*5113495bSYour Name 
4827*5113495bSYour Name 	/* Initialize the set dual mac configuration event handler */
4828*5113495bSYour Name 	qdf_status = wmi_unified_register_event_handler(wmi_handle,
4829*5113495bSYour Name 			wmi_pdev_set_mac_config_resp_event_id,
4830*5113495bSYour Name 			wma_pdev_set_dual_mode_config_resp_evt_handler,
4831*5113495bSYour Name 			WMA_RX_SERIALIZER_CTX);
4832*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(qdf_status)) {
4833*5113495bSYour Name 		wma_err("Failed to register hw mode transition event cb");
4834*5113495bSYour Name 		qdf_status = QDF_STATUS_E_FAILURE;
4835*5113495bSYour Name 		goto end;
4836*5113495bSYour Name 	}
4837*5113495bSYour Name 
4838*5113495bSYour Name 	qdf_status = wmi_unified_register_event_handler(wmi_handle,
4839*5113495bSYour Name 			wmi_coex_bt_activity_event_id,
4840*5113495bSYour Name 			wma_wlan_bt_activity_evt_handler,
4841*5113495bSYour Name 			WMA_RX_SERIALIZER_CTX);
4842*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(qdf_status)) {
4843*5113495bSYour Name 		wma_err("Failed to register coex bt activity event handler");
4844*5113495bSYour Name 		qdf_status = QDF_STATUS_E_FAILURE;
4845*5113495bSYour Name 		goto end;
4846*5113495bSYour Name 	}
4847*5113495bSYour Name 	wma_register_spectral_cmds(wma_handle);
4848*5113495bSYour Name 
4849*5113495bSYour Name end:
4850*5113495bSYour Name 	wma_debug("Exit");
4851*5113495bSYour Name 	return qdf_status;
4852*5113495bSYour Name }
4853*5113495bSYour Name 
wma_stop(void)4854*5113495bSYour Name QDF_STATUS wma_stop(void)
4855*5113495bSYour Name {
4856*5113495bSYour Name 	tp_wma_handle wma_handle;
4857*5113495bSYour Name 	QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
4858*5113495bSYour Name 	int i;
4859*5113495bSYour Name 	struct mac_context *mac = NULL;
4860*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
4861*5113495bSYour Name 
4862*5113495bSYour Name 	wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
4863*5113495bSYour Name 	wma_debug("Enter");
4864*5113495bSYour Name 	if (!wma_handle) {
4865*5113495bSYour Name 		qdf_status = QDF_STATUS_E_INVAL;
4866*5113495bSYour Name 		goto end;
4867*5113495bSYour Name 	}
4868*5113495bSYour Name 	mac = cds_get_context(QDF_MODULE_ID_PE);
4869*5113495bSYour Name 	if (!mac) {
4870*5113495bSYour Name 		goto end;
4871*5113495bSYour Name 	}
4872*5113495bSYour Name #ifdef QCA_WIFI_FTM
4873*5113495bSYour Name 	/*
4874*5113495bSYour Name 	 * Tx mgmt detach requires TXRX context which is not created
4875*5113495bSYour Name 	 * in FTM mode. So skip the TX mgmt detach.
4876*5113495bSYour Name 	 */
4877*5113495bSYour Name 	if (cds_get_conparam() == QDF_GLOBAL_FTM_MODE) {
4878*5113495bSYour Name 		qdf_status = QDF_STATUS_SUCCESS;
4879*5113495bSYour Name 		goto end;
4880*5113495bSYour Name 	}
4881*5113495bSYour Name #endif /* QCA_WIFI_FTM */
4882*5113495bSYour Name 
4883*5113495bSYour Name 	if (wma_handle->ack_work_ctx) {
4884*5113495bSYour Name 		cds_flush_work(&wma_handle->ack_work_ctx->ack_cmp_work);
4885*5113495bSYour Name 		if (wma_handle->ack_work_ctx->frame)
4886*5113495bSYour Name 			qdf_nbuf_free(wma_handle->ack_work_ctx->frame);
4887*5113495bSYour Name 
4888*5113495bSYour Name 		qdf_mem_free(wma_handle->ack_work_ctx);
4889*5113495bSYour Name 		wma_handle->ack_work_ctx = NULL;
4890*5113495bSYour Name 	}
4891*5113495bSYour Name 
4892*5113495bSYour Name 	/* Destroy the timer for log completion */
4893*5113495bSYour Name 	qdf_status = qdf_mc_timer_destroy(&wma_handle->log_completion_timer);
4894*5113495bSYour Name 	if (qdf_status != QDF_STATUS_SUCCESS)
4895*5113495bSYour Name 		wma_err("Failed to destroy the log completion timer");
4896*5113495bSYour Name 	/* clean up ll-queue for all vdev */
4897*5113495bSYour Name 	for (i = 0; i < wma_handle->max_bssid; i++) {
4898*5113495bSYour Name 		vdev = wma_handle->interfaces[i].vdev;
4899*5113495bSYour Name 		if (!vdev)
4900*5113495bSYour Name 			continue;
4901*5113495bSYour Name 
4902*5113495bSYour Name 		if (wma_is_vdev_up(i))
4903*5113495bSYour Name 			cdp_fc_vdev_flush(cds_get_context(QDF_MODULE_ID_SOC),
4904*5113495bSYour Name 					  i);
4905*5113495bSYour Name 	}
4906*5113495bSYour Name 
4907*5113495bSYour Name 	qdf_status = wma_tx_detach(wma_handle);
4908*5113495bSYour Name 	if (qdf_status != QDF_STATUS_SUCCESS) {
4909*5113495bSYour Name 		wma_err("Failed to deregister tx management");
4910*5113495bSYour Name 		goto end;
4911*5113495bSYour Name 	}
4912*5113495bSYour Name 
4913*5113495bSYour Name end:
4914*5113495bSYour Name 	wma_debug("Exit");
4915*5113495bSYour Name 	return qdf_status;
4916*5113495bSYour Name }
4917*5113495bSYour Name 
4918*5113495bSYour Name /**
4919*5113495bSYour Name  * wma_wmi_service_close() - close wma wmi service interface.
4920*5113495bSYour Name  *
4921*5113495bSYour Name  * Return: 0 on success, QDF Error on failure
4922*5113495bSYour Name  */
wma_wmi_service_close(void)4923*5113495bSYour Name QDF_STATUS wma_wmi_service_close(void)
4924*5113495bSYour Name {
4925*5113495bSYour Name 	void *cds_ctx;
4926*5113495bSYour Name 	tp_wma_handle wma_handle;
4927*5113495bSYour Name 	uint8_t i;
4928*5113495bSYour Name 	struct wmi_unified *wmi_handle;
4929*5113495bSYour Name 
4930*5113495bSYour Name 	wma_debug("Enter");
4931*5113495bSYour Name 
4932*5113495bSYour Name 	cds_ctx = cds_get_global_context();
4933*5113495bSYour Name 	if (!cds_ctx) {
4934*5113495bSYour Name 		wma_err("Invalid CDS context");
4935*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
4936*5113495bSYour Name 	}
4937*5113495bSYour Name 
4938*5113495bSYour Name 	wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
4939*5113495bSYour Name 	if (!wma_handle)
4940*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
4941*5113495bSYour Name 
4942*5113495bSYour Name 	wmi_handle = wma_handle->wmi_handle;
4943*5113495bSYour Name 	if (wmi_validate_handle(wmi_handle))
4944*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
4945*5113495bSYour Name 
4946*5113495bSYour Name 	/* detach the wmi service */
4947*5113495bSYour Name 	wma_debug("calling wmi_unified_detach");
4948*5113495bSYour Name 	wmi_unified_detach(wmi_handle);
4949*5113495bSYour Name 	wma_handle->wmi_handle = NULL;
4950*5113495bSYour Name 
4951*5113495bSYour Name 	for (i = 0; i < wma_handle->max_bssid; i++)
4952*5113495bSYour Name 		wma_vdev_deinit(&wma_handle->interfaces[i]);
4953*5113495bSYour Name 
4954*5113495bSYour Name 	qdf_mem_free(wma_handle->interfaces);
4955*5113495bSYour Name 
4956*5113495bSYour Name 	/* free the wma_handle */
4957*5113495bSYour Name 	cds_free_context(QDF_MODULE_ID_WMA, wma_handle);
4958*5113495bSYour Name 
4959*5113495bSYour Name 	if (((struct cds_context *)cds_ctx)->cfg_ctx)
4960*5113495bSYour Name 		qdf_mem_free(((struct cds_context *)cds_ctx)->cfg_ctx);
4961*5113495bSYour Name 	((struct cds_context *)cds_ctx)->cfg_ctx = NULL;
4962*5113495bSYour Name 	wma_debug("Exit");
4963*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
4964*5113495bSYour Name }
4965*5113495bSYour Name 
4966*5113495bSYour Name /**
4967*5113495bSYour Name  * wma_wmi_work_close() - close the work queue items associated with WMI
4968*5113495bSYour Name  *
4969*5113495bSYour Name  * This function closes work queue items associated with WMI, but not fully
4970*5113495bSYour Name  * closes WMI service.
4971*5113495bSYour Name  *
4972*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS if work close is successful. Otherwise
4973*5113495bSYour Name  *	proper error codes.
4974*5113495bSYour Name  */
wma_wmi_work_close(void)4975*5113495bSYour Name QDF_STATUS wma_wmi_work_close(void)
4976*5113495bSYour Name {
4977*5113495bSYour Name 	tp_wma_handle wma_handle;
4978*5113495bSYour Name 	struct wmi_unified *wmi_handle;
4979*5113495bSYour Name 
4980*5113495bSYour Name 	wma_debug("Enter");
4981*5113495bSYour Name 
4982*5113495bSYour Name 	wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
4983*5113495bSYour Name 	if (!wma_handle)
4984*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
4985*5113495bSYour Name 
4986*5113495bSYour Name 	wmi_handle = wma_handle->wmi_handle;
4987*5113495bSYour Name 	if (wmi_validate_handle(wmi_handle))
4988*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
4989*5113495bSYour Name 
4990*5113495bSYour Name 	/* remove the wmi work */
4991*5113495bSYour Name 	wma_debug("calling wmi_unified_remove_work");
4992*5113495bSYour Name 	wmi_unified_remove_work(wmi_handle);
4993*5113495bSYour Name 
4994*5113495bSYour Name 	wma_debug("Exit");
4995*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
4996*5113495bSYour Name }
4997*5113495bSYour Name 
4998*5113495bSYour Name /**
4999*5113495bSYour Name  * wma_close() - wma close function.
5000*5113495bSYour Name  *               cleanup resources attached with wma.
5001*5113495bSYour Name  *
5002*5113495bSYour Name  * Return: 0 on success, QDF Error on failure
5003*5113495bSYour Name  */
wma_close(void)5004*5113495bSYour Name QDF_STATUS wma_close(void)
5005*5113495bSYour Name {
5006*5113495bSYour Name 	tp_wma_handle wma_handle;
5007*5113495bSYour Name 	struct target_psoc_info *tgt_psoc_info;
5008*5113495bSYour Name 	QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
5009*5113495bSYour Name 	struct wmi_unified *wmi_handle;
5010*5113495bSYour Name 
5011*5113495bSYour Name 	wma_debug("Enter");
5012*5113495bSYour Name 
5013*5113495bSYour Name 	wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
5014*5113495bSYour Name 	if (!wma_handle)
5015*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
5016*5113495bSYour Name 
5017*5113495bSYour Name 	wmi_handle = wma_handle->wmi_handle;
5018*5113495bSYour Name 	if (wmi_validate_handle(wmi_handle))
5019*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
5020*5113495bSYour Name 
5021*5113495bSYour Name 	if (!wlan_pmo_no_op_on_page_fault(wma_handle->psoc))
5022*5113495bSYour Name 		wma_deinit_pagefault_wakeup_history(wma_handle);
5023*5113495bSYour Name 
5024*5113495bSYour Name 	qdf_atomic_set(&wma_handle->sap_num_clients_connected, 0);
5025*5113495bSYour Name 	qdf_atomic_set(&wma_handle->go_num_clients_connected, 0);
5026*5113495bSYour Name 
5027*5113495bSYour Name 	if (cds_get_conparam() != QDF_GLOBAL_FTM_MODE) {
5028*5113495bSYour Name 		qdf_wake_lock_destroy(&wma_handle->go_d3_wow_wake_lock);
5029*5113495bSYour Name 		qdf_wake_lock_destroy(&wma_handle->sap_d3_wow_wake_lock);
5030*5113495bSYour Name #ifdef FEATURE_WLAN_EXTSCAN
5031*5113495bSYour Name 		qdf_wake_lock_destroy(&wma_handle->extscan_wake_lock);
5032*5113495bSYour Name #endif /* FEATURE_WLAN_EXTSCAN */
5033*5113495bSYour Name 		qdf_wake_lock_destroy(&wma_handle->wow_wake_lock);
5034*5113495bSYour Name 		qdf_wake_lock_destroy(&wma_handle->wow_auth_req_wl);
5035*5113495bSYour Name 		qdf_wake_lock_destroy(&wma_handle->wow_assoc_req_wl);
5036*5113495bSYour Name 		qdf_wake_lock_destroy(&wma_handle->wow_deauth_rec_wl);
5037*5113495bSYour Name 		qdf_wake_lock_destroy(&wma_handle->wow_disassoc_rec_wl);
5038*5113495bSYour Name 		qdf_wake_lock_destroy(&wma_handle->wow_ap_assoc_lost_wl);
5039*5113495bSYour Name 		qdf_wake_lock_destroy(&wma_handle->wow_auto_shutdown_wl);
5040*5113495bSYour Name 		qdf_wake_lock_destroy(&wma_handle->roam_ho_wl);
5041*5113495bSYour Name 		qdf_wake_lock_destroy(&wma_handle->roam_preauth_wl);
5042*5113495bSYour Name 		qdf_wake_lock_destroy(&wma_handle->probe_req_wps_wl);
5043*5113495bSYour Name 	}
5044*5113495bSYour Name 
5045*5113495bSYour Name 	/* unregister Firmware debug log */
5046*5113495bSYour Name 	qdf_status = dbglog_deinit(wmi_handle);
5047*5113495bSYour Name 	if (qdf_status != QDF_STATUS_SUCCESS)
5048*5113495bSYour Name 		wma_err("dbglog_deinit failed");
5049*5113495bSYour Name 
5050*5113495bSYour Name 	qdf_status = qdf_mc_timer_destroy(&wma_handle->service_ready_ext_timer);
5051*5113495bSYour Name 	if (!QDF_IS_STATUS_SUCCESS(qdf_status))
5052*5113495bSYour Name 		wma_err("Failed to destroy service ready ext event timer");
5053*5113495bSYour Name 
5054*5113495bSYour Name 	qdf_event_destroy(&wma_handle->target_suspend);
5055*5113495bSYour Name 	qdf_event_destroy(&wma_handle->runtime_suspend);
5056*5113495bSYour Name 	qdf_event_destroy(&wma_handle->recovery_event);
5057*5113495bSYour Name 	qdf_event_destroy(&wma_handle->tx_frm_download_comp_event);
5058*5113495bSYour Name 	qdf_event_destroy(&wma_handle->tx_queue_empty_event);
5059*5113495bSYour Name 	wma_cleanup_hold_req(wma_handle);
5060*5113495bSYour Name 	qdf_wake_lock_destroy(&wma_handle->wmi_cmd_rsp_wake_lock);
5061*5113495bSYour Name 	qdf_runtime_lock_deinit(&wma_handle->ndp_prevent_runtime_pm_lock);
5062*5113495bSYour Name 	qdf_runtime_lock_deinit(&wma_handle->sap_prevent_runtime_pm_lock);
5063*5113495bSYour Name 	qdf_runtime_lock_deinit(&wma_handle->wmi_cmd_rsp_runtime_lock);
5064*5113495bSYour Name 	qdf_spinlock_destroy(&wma_handle->wma_hold_req_q_lock);
5065*5113495bSYour Name 
5066*5113495bSYour Name 	if (wma_handle->pGetRssiReq) {
5067*5113495bSYour Name 		qdf_mem_free(wma_handle->pGetRssiReq);
5068*5113495bSYour Name 		wma_handle->pGetRssiReq = NULL;
5069*5113495bSYour Name 	}
5070*5113495bSYour Name 
5071*5113495bSYour Name 	wma_unified_radio_tx_mem_free(wma_handle);
5072*5113495bSYour Name 
5073*5113495bSYour Name 	qdf_status = qdf_mutex_destroy(&wma_handle->radio_stats_lock);
5074*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(qdf_status))
5075*5113495bSYour Name 		wma_err("Failed to destroy radio stats mutex");
5076*5113495bSYour Name 
5077*5113495bSYour Name 	if (wma_handle->pdev) {
5078*5113495bSYour Name 		wlan_objmgr_pdev_release_ref(wma_handle->pdev,
5079*5113495bSYour Name 				WLAN_LEGACY_WMA_ID);
5080*5113495bSYour Name 		wma_handle->pdev = NULL;
5081*5113495bSYour Name 	}
5082*5113495bSYour Name 
5083*5113495bSYour Name 	pmo_unregister_get_beacon_interval_callback(wma_handle->psoc);
5084*5113495bSYour Name 	pmo_unregister_get_dtim_period_callback(wma_handle->psoc);
5085*5113495bSYour Name 	pmo_unregister_is_device_in_low_pwr_mode(wma_handle->psoc);
5086*5113495bSYour Name 	pmo_unregister_get_pause_bitmap(wma_handle->psoc);
5087*5113495bSYour Name 	pmo_unregister_pause_bitmap_notifier(wma_handle->psoc);
5088*5113495bSYour Name 
5089*5113495bSYour Name 	tgt_psoc_info = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
5090*5113495bSYour Name 	init_deinit_free_num_units(wma_handle->psoc, tgt_psoc_info);
5091*5113495bSYour Name 	target_if_free_psoc_tgt_info(wma_handle->psoc);
5092*5113495bSYour Name 
5093*5113495bSYour Name 	wlan_objmgr_psoc_release_ref(wma_handle->psoc, WLAN_LEGACY_WMA_ID);
5094*5113495bSYour Name 	wma_handle->psoc = NULL;
5095*5113495bSYour Name 
5096*5113495bSYour Name 	wma_debug("Exit");
5097*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
5098*5113495bSYour Name }
5099*5113495bSYour Name 
5100*5113495bSYour Name /**
5101*5113495bSYour Name  * wma_update_fw_config() - update fw configuration
5102*5113495bSYour Name  * @psoc: psoc to query configuration from
5103*5113495bSYour Name  * @tgt_hdl: target capability info
5104*5113495bSYour Name  *
5105*5113495bSYour Name  * Return: none
5106*5113495bSYour Name  */
wma_update_fw_config(struct wlan_objmgr_psoc * psoc,struct target_psoc_info * tgt_hdl)5107*5113495bSYour Name static void wma_update_fw_config(struct wlan_objmgr_psoc *psoc,
5108*5113495bSYour Name 				 struct target_psoc_info *tgt_hdl)
5109*5113495bSYour Name {
5110*5113495bSYour Name 	target_resource_config *cfg = &tgt_hdl->info.wlan_res_cfg;
5111*5113495bSYour Name 
5112*5113495bSYour Name 	/* Override the no. of max fragments as per platform configuration */
5113*5113495bSYour Name 	cfg->max_frag_entries =	QDF_MIN(QCA_OL_11AC_TX_MAX_FRAGS,
5114*5113495bSYour Name 					target_if_get_max_frag_entry(tgt_hdl));
5115*5113495bSYour Name 	target_if_set_max_frag_entry(tgt_hdl, cfg->max_frag_entries);
5116*5113495bSYour Name 
5117*5113495bSYour Name 	if (cds_get_conparam() == QDF_GLOBAL_FTM_MODE)
5118*5113495bSYour Name 		cfg->num_wow_filters =  0;
5119*5113495bSYour Name 	else
5120*5113495bSYour Name 		cfg->num_wow_filters = ucfg_pmo_get_num_wow_filters(psoc);
5121*5113495bSYour Name 
5122*5113495bSYour Name 	cfg->apf_instruction_size = ucfg_pmo_get_apf_instruction_size(psoc);
5123*5113495bSYour Name 	cfg->num_packet_filters = ucfg_pmo_get_num_packet_filters(psoc);
5124*5113495bSYour Name }
5125*5113495bSYour Name 
5126*5113495bSYour Name /**
5127*5113495bSYour Name  * wma_set_tx_partition_base() - set TX MSDU ID partition base for IPA
5128*5113495bSYour Name  * @value:  TX MSDU ID partition base
5129*5113495bSYour Name  *
5130*5113495bSYour Name  * Return: none
5131*5113495bSYour Name  */
5132*5113495bSYour Name #ifdef IPA_OFFLOAD
wma_set_tx_partition_base(uint32_t value)5133*5113495bSYour Name static void wma_set_tx_partition_base(uint32_t value)
5134*5113495bSYour Name {
5135*5113495bSYour Name 	cdp_ipa_set_uc_tx_partition_base(
5136*5113495bSYour Name 			cds_get_context(QDF_MODULE_ID_SOC),
5137*5113495bSYour Name 			(struct cdp_cfg *)cds_get_context(QDF_MODULE_ID_CFG),
5138*5113495bSYour Name 			value);
5139*5113495bSYour Name 	wma_debug("TX_MSDU_ID_PARTITION=%d", value);
5140*5113495bSYour Name }
5141*5113495bSYour Name #else
wma_set_tx_partition_base(uint32_t value)5142*5113495bSYour Name static void wma_set_tx_partition_base(uint32_t value)
5143*5113495bSYour Name {
5144*5113495bSYour Name }
5145*5113495bSYour Name #endif
5146*5113495bSYour Name 
5147*5113495bSYour Name #ifdef WLAN_FEATURE_IGMP_OFFLOAD
5148*5113495bSYour Name /**
5149*5113495bSYour Name  * wma_get_igmp_offload_enable() - update tgt service with igmp offload support
5150*5113495bSYour Name  * @wmi_handle: Unified wmi handle
5151*5113495bSYour Name  * @cfg: target services
5152*5113495bSYour Name  *
5153*5113495bSYour Name  * Return: none
5154*5113495bSYour Name  */
5155*5113495bSYour Name static inline void
wma_get_igmp_offload_enable(struct wmi_unified * wmi_handle,struct wma_tgt_services * cfg)5156*5113495bSYour Name wma_get_igmp_offload_enable(struct wmi_unified *wmi_handle,
5157*5113495bSYour Name 			    struct wma_tgt_services *cfg)
5158*5113495bSYour Name {
5159*5113495bSYour Name 	cfg->igmp_offload_enable = wmi_service_enabled(
5160*5113495bSYour Name 					wmi_handle,
5161*5113495bSYour Name 					wmi_service_igmp_offload_support);
5162*5113495bSYour Name }
5163*5113495bSYour Name #else
5164*5113495bSYour Name static inline void
wma_get_igmp_offload_enable(struct wmi_unified * wmi_handle,struct wma_tgt_services * cfg)5165*5113495bSYour Name wma_get_igmp_offload_enable(struct wmi_unified *wmi_handle,
5166*5113495bSYour Name 			    struct wma_tgt_services *cfg)
5167*5113495bSYour Name {}
5168*5113495bSYour Name #endif
5169*5113495bSYour Name 
5170*5113495bSYour Name #ifdef FEATURE_WLAN_TDLS
5171*5113495bSYour Name /**
5172*5113495bSYour Name  * wma_get_tdls_wideband_support() - update tgt service with service tdls
5173*5113495bSYour Name  *                                   wideband support
5174*5113495bSYour Name  * @wmi_handle: Unified wmi handle
5175*5113495bSYour Name  * @cfg: target services
5176*5113495bSYour Name  *
5177*5113495bSYour Name  * Return: none
5178*5113495bSYour Name  */
5179*5113495bSYour Name static inline void
wma_get_tdls_wideband_support(struct wmi_unified * wmi_handle,struct wma_tgt_services * cfg)5180*5113495bSYour Name wma_get_tdls_wideband_support(struct wmi_unified *wmi_handle,
5181*5113495bSYour Name 			      struct wma_tgt_services *cfg)
5182*5113495bSYour Name {
5183*5113495bSYour Name 	cfg->en_tdls_wideband_support = wmi_service_enabled(
5184*5113495bSYour Name 					     wmi_handle,
5185*5113495bSYour Name 					     wmi_service_tdls_wideband_support);
5186*5113495bSYour Name }
5187*5113495bSYour Name 
5188*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
5189*5113495bSYour Name /**
5190*5113495bSYour Name  * wma_get_tdls_mlo_support() - update tgt service with service tdls
5191*5113495bSYour Name  * be support
5192*5113495bSYour Name  * @wmi_handle: Unified wmi handle
5193*5113495bSYour Name  * @cfg: target services
5194*5113495bSYour Name  *
5195*5113495bSYour Name  * Return: none
5196*5113495bSYour Name  */
5197*5113495bSYour Name static inline void
wma_get_tdls_mlo_support(struct wmi_unified * wmi_handle,struct wma_tgt_services * cfg)5198*5113495bSYour Name wma_get_tdls_mlo_support(struct wmi_unified *wmi_handle,
5199*5113495bSYour Name 			 struct wma_tgt_services *cfg)
5200*5113495bSYour Name {
5201*5113495bSYour Name 	cfg->en_tdls_mlo_support =
5202*5113495bSYour Name 		wmi_service_enabled(wmi_handle,
5203*5113495bSYour Name 				    wmi_service_tdls_mlo_support);
5204*5113495bSYour Name }
5205*5113495bSYour Name 
5206*5113495bSYour Name static inline void
wma_get_n_link_mlo_support(struct wmi_unified * wmi_handle,struct wma_tgt_services * cfg)5207*5113495bSYour Name wma_get_n_link_mlo_support(struct wmi_unified *wmi_handle,
5208*5113495bSYour Name 			   struct wma_tgt_services *cfg)
5209*5113495bSYour Name {
5210*5113495bSYour Name 	cfg->en_n_link_mlo_support =
5211*5113495bSYour Name 		wmi_service_enabled(wmi_handle,
5212*5113495bSYour Name 				    wmi_service_n_link_mlo_support);
5213*5113495bSYour Name }
5214*5113495bSYour Name 
5215*5113495bSYour Name #else
5216*5113495bSYour Name static inline void
wma_get_tdls_mlo_support(struct wmi_unified * wmi_handle,struct wma_tgt_services * cfg)5217*5113495bSYour Name wma_get_tdls_mlo_support(struct wmi_unified *wmi_handle,
5218*5113495bSYour Name 			 struct wma_tgt_services *cfg)
5219*5113495bSYour Name {
5220*5113495bSYour Name }
5221*5113495bSYour Name 
5222*5113495bSYour Name static inline void
wma_get_n_link_mlo_support(struct wmi_unified * wmi_handle,struct wma_tgt_services * cfg)5223*5113495bSYour Name wma_get_n_link_mlo_support(struct wmi_unified *wmi_handle,
5224*5113495bSYour Name 			   struct wma_tgt_services *cfg)
5225*5113495bSYour Name {
5226*5113495bSYour Name }
5227*5113495bSYour Name #endif /* WLAN_FEATURE_11BE */
5228*5113495bSYour Name 
5229*5113495bSYour Name #ifdef WLAN_FEATURE_11AX
5230*5113495bSYour Name /**
5231*5113495bSYour Name  * wma_get_tdls_ax_support() - update tgt service with service tdls ax support
5232*5113495bSYour Name  * @wmi_handle: Unified wmi handle
5233*5113495bSYour Name  * @cfg: target services
5234*5113495bSYour Name  *
5235*5113495bSYour Name  * Return: none
5236*5113495bSYour Name  */
5237*5113495bSYour Name static inline void
wma_get_tdls_ax_support(struct wmi_unified * wmi_handle,struct wma_tgt_services * cfg)5238*5113495bSYour Name wma_get_tdls_ax_support(struct wmi_unified *wmi_handle,
5239*5113495bSYour Name 			struct wma_tgt_services *cfg)
5240*5113495bSYour Name {
5241*5113495bSYour Name 	cfg->en_tdls_11ax_support = wmi_service_enabled(
5242*5113495bSYour Name 						wmi_handle,
5243*5113495bSYour Name 						wmi_service_tdls_ax_support);
5244*5113495bSYour Name }
5245*5113495bSYour Name 
5246*5113495bSYour Name static inline void
wma_get_tdls_6g_support(struct wmi_unified * wmi_handle,struct wma_tgt_services * cfg)5247*5113495bSYour Name wma_get_tdls_6g_support(struct wmi_unified *wmi_handle,
5248*5113495bSYour Name 			struct wma_tgt_services *cfg)
5249*5113495bSYour Name {
5250*5113495bSYour Name 	cfg->en_tdls_6g_support = wmi_service_enabled(
5251*5113495bSYour Name 						wmi_handle,
5252*5113495bSYour Name 						wmi_service_tdls_6g_support);
5253*5113495bSYour Name }
5254*5113495bSYour Name 
5255*5113495bSYour Name #else
5256*5113495bSYour Name static inline void
wma_get_tdls_ax_support(struct wmi_unified * wmi_handle,struct wma_tgt_services * cfg)5257*5113495bSYour Name wma_get_tdls_ax_support(struct wmi_unified *wmi_handle,
5258*5113495bSYour Name 			struct wma_tgt_services *cfg)
5259*5113495bSYour Name {}
5260*5113495bSYour Name 
5261*5113495bSYour Name static inline void
wma_get_tdls_6g_support(struct wmi_unified * wmi_handle,struct wma_tgt_services * cfg)5262*5113495bSYour Name wma_get_tdls_6g_support(struct wmi_unified *wmi_handle,
5263*5113495bSYour Name 			struct wma_tgt_services *cfg)
5264*5113495bSYour Name {}
5265*5113495bSYour Name 
5266*5113495bSYour Name #endif
5267*5113495bSYour Name #else
5268*5113495bSYour Name static inline void
wma_get_tdls_mlo_support(struct wmi_unified * wmi_handle,struct wma_tgt_services * cfg)5269*5113495bSYour Name wma_get_tdls_mlo_support(struct wmi_unified *wmi_handle,
5270*5113495bSYour Name 			 struct wma_tgt_services *cfg)
5271*5113495bSYour Name {
5272*5113495bSYour Name }
5273*5113495bSYour Name 
5274*5113495bSYour Name static inline void
wma_get_n_link_mlo_support(struct wmi_unified * wmi_handle,struct wma_tgt_services * cfg)5275*5113495bSYour Name wma_get_n_link_mlo_support(struct wmi_unified *wmi_handle,
5276*5113495bSYour Name 			   struct wma_tgt_services *cfg)
5277*5113495bSYour Name {}
5278*5113495bSYour Name 
5279*5113495bSYour Name static inline void
wma_get_tdls_ax_support(struct wmi_unified * wmi_handle,struct wma_tgt_services * cfg)5280*5113495bSYour Name wma_get_tdls_ax_support(struct wmi_unified *wmi_handle,
5281*5113495bSYour Name 			struct wma_tgt_services *cfg)
5282*5113495bSYour Name {}
5283*5113495bSYour Name 
5284*5113495bSYour Name static inline void
wma_get_tdls_6g_support(struct wmi_unified * wmi_handle,struct wma_tgt_services * cfg)5285*5113495bSYour Name wma_get_tdls_6g_support(struct wmi_unified *wmi_handle,
5286*5113495bSYour Name 			struct wma_tgt_services *cfg)
5287*5113495bSYour Name {}
5288*5113495bSYour Name 
5289*5113495bSYour Name static inline void
wma_get_tdls_wideband_support(struct wmi_unified * wmi_handle,struct wma_tgt_services * cfg)5290*5113495bSYour Name wma_get_tdls_wideband_support(struct wmi_unified *wmi_handle,
5291*5113495bSYour Name 			      struct wma_tgt_services *cfg)
5292*5113495bSYour Name {}
5293*5113495bSYour Name #endif
5294*5113495bSYour Name 
5295*5113495bSYour Name #ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE
wma_get_dynamic_vdev_macaddr_support(struct wmi_unified * wmi_handle,struct wma_tgt_services * cfg)5296*5113495bSYour Name static inline void wma_get_dynamic_vdev_macaddr_support(
5297*5113495bSYour Name 		  struct wmi_unified *wmi_handle, struct wma_tgt_services *cfg)
5298*5113495bSYour Name {
5299*5113495bSYour Name 	cfg->dynamic_vdev_macaddr_support =
5300*5113495bSYour Name 		wmi_service_enabled(
5301*5113495bSYour Name 			wmi_handle,
5302*5113495bSYour Name 			wmi_service_dynamic_update_vdev_macaddr_support);
5303*5113495bSYour Name }
5304*5113495bSYour Name #else
wma_get_dynamic_vdev_macaddr_support(struct wmi_unified * wmi_handle,struct wma_tgt_services * cfg)5305*5113495bSYour Name static inline void wma_get_dynamic_vdev_macaddr_support(
5306*5113495bSYour Name 		  struct wmi_unified *wmi_handle, struct wma_tgt_services *cfg)
5307*5113495bSYour Name {
5308*5113495bSYour Name }
5309*5113495bSYour Name #endif
5310*5113495bSYour Name 
5311*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
5312*5113495bSYour Name /**
5313*5113495bSYour Name  * wma_get_mlo_tid_to_link_mapping_support() - update tgt service with
5314*5113495bSYour Name  * service tid to link mapping support
5315*5113495bSYour Name  * @wmi_handle: Unified wmi handle
5316*5113495bSYour Name  * @cfg: target services
5317*5113495bSYour Name  *
5318*5113495bSYour Name  * Return: none
5319*5113495bSYour Name  */
5320*5113495bSYour Name static inline void
wma_get_mlo_tid_to_link_mapping_support(struct wmi_unified * wmi_handle,struct wma_tgt_services * cfg)5321*5113495bSYour Name wma_get_mlo_tid_to_link_mapping_support(struct wmi_unified *wmi_handle,
5322*5113495bSYour Name 					struct wma_tgt_services *cfg)
5323*5113495bSYour Name {
5324*5113495bSYour Name 	cfg->en_mlo_tid_to_link_support =
5325*5113495bSYour Name 		wmi_service_enabled(wmi_handle,
5326*5113495bSYour Name 				    wmi_service_mlo_tid_to_link_mapping_support);
5327*5113495bSYour Name }
5328*5113495bSYour Name 
5329*5113495bSYour Name #else
5330*5113495bSYour Name static inline void
wma_get_mlo_tid_to_link_mapping_support(struct wmi_unified * wmi_handle,struct wma_tgt_services * cfg)5331*5113495bSYour Name wma_get_mlo_tid_to_link_mapping_support(struct wmi_unified *wmi_handle,
5332*5113495bSYour Name 					struct wma_tgt_services *cfg)
5333*5113495bSYour Name {
5334*5113495bSYour Name }
5335*5113495bSYour Name #endif
5336*5113495bSYour Name 
5337*5113495bSYour Name #ifdef WLAN_FEATURE_NAN
5338*5113495bSYour Name /**
5339*5113495bSYour Name  * wma_nan_set_pairing_feature() - set feature bit for Secure NAN if max
5340*5113495bSYour Name  * pairing session has non-zero value.
5341*5113495bSYour Name  *
5342*5113495bSYour Name  * Return: none
5343*5113495bSYour Name  */
wma_nan_set_pairing_feature(void)5344*5113495bSYour Name static void wma_nan_set_pairing_feature(void)
5345*5113495bSYour Name {
5346*5113495bSYour Name 	tp_wma_handle wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
5347*5113495bSYour Name 	struct target_psoc_info *tgt_hdl;
5348*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
5349*5113495bSYour Name 
5350*5113495bSYour Name 	if (!wma_handle) {
5351*5113495bSYour Name 		wma_err("wma handle is null");
5352*5113495bSYour Name 		return;
5353*5113495bSYour Name 	}
5354*5113495bSYour Name 
5355*5113495bSYour Name 	psoc = wma_handle->psoc;
5356*5113495bSYour Name 	tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
5357*5113495bSYour Name 	if (!tgt_hdl) {
5358*5113495bSYour Name 		wma_err("tgt_hdl is null");
5359*5113495bSYour Name 		return;
5360*5113495bSYour Name 	}
5361*5113495bSYour Name 
5362*5113495bSYour Name 	if (tgt_hdl->info.service_ext2_param.max_nan_pairing_sessions) {
5363*5113495bSYour Name 		wma_set_fw_wlan_feat_caps(SECURE_NAN);
5364*5113495bSYour Name 		wma_debug("Secure NAN is enabled");
5365*5113495bSYour Name 	}
5366*5113495bSYour Name }
5367*5113495bSYour Name #endif /* WLAN_FEATURE_NAN */
5368*5113495bSYour Name 
5369*5113495bSYour Name /**
5370*5113495bSYour Name  * wma_update_target_services() - update target services from wma handle
5371*5113495bSYour Name  * @wmi_handle: Unified wmi handle
5372*5113495bSYour Name  * @cfg: target services
5373*5113495bSYour Name  *
5374*5113495bSYour Name  * Return: none
5375*5113495bSYour Name  */
wma_update_target_services(struct wmi_unified * wmi_handle,struct wma_tgt_services * cfg)5376*5113495bSYour Name static inline void wma_update_target_services(struct wmi_unified *wmi_handle,
5377*5113495bSYour Name 					      struct wma_tgt_services *cfg)
5378*5113495bSYour Name {
5379*5113495bSYour Name 	/* STA power save */
5380*5113495bSYour Name 	cfg->sta_power_save = wmi_service_enabled(wmi_handle,
5381*5113495bSYour Name 						     wmi_service_sta_pwrsave);
5382*5113495bSYour Name 
5383*5113495bSYour Name 	/* Enable UAPSD */
5384*5113495bSYour Name 	cfg->uapsd = wmi_service_enabled(wmi_handle,
5385*5113495bSYour Name 					    wmi_service_ap_uapsd);
5386*5113495bSYour Name 
5387*5113495bSYour Name 	/* Update AP DFS service */
5388*5113495bSYour Name 	cfg->ap_dfs = wmi_service_enabled(wmi_handle,
5389*5113495bSYour Name 					     wmi_service_ap_dfs);
5390*5113495bSYour Name 
5391*5113495bSYour Name 	/* Enable 11AC */
5392*5113495bSYour Name 	cfg->en_11ac = wmi_service_enabled(wmi_handle,
5393*5113495bSYour Name 					      wmi_service_11ac);
5394*5113495bSYour Name 	if (cfg->en_11ac)
5395*5113495bSYour Name 		g_fw_wlan_feat_caps |= (1 << DOT11AC);
5396*5113495bSYour Name 
5397*5113495bSYour Name 	/* Proactive ARP response */
5398*5113495bSYour Name 	g_fw_wlan_feat_caps |= (1 << WLAN_PERIODIC_TX_PTRN);
5399*5113495bSYour Name 
5400*5113495bSYour Name 	/* Enable WOW */
5401*5113495bSYour Name 	g_fw_wlan_feat_caps |= (1 << WOW);
5402*5113495bSYour Name 
5403*5113495bSYour Name 	/* ARP offload */
5404*5113495bSYour Name 	cfg->arp_offload = wmi_service_enabled(wmi_handle,
5405*5113495bSYour Name 						  wmi_service_arpns_offload);
5406*5113495bSYour Name 
5407*5113495bSYour Name 	/* Adaptive early-rx */
5408*5113495bSYour Name 	cfg->early_rx = wmi_service_enabled(wmi_handle,
5409*5113495bSYour Name 					       wmi_service_early_rx);
5410*5113495bSYour Name 
5411*5113495bSYour Name 	cfg->is_fw_therm_throt_supp = wmi_service_enabled(wmi_handle,
5412*5113495bSYour Name 							  wmi_service_tt);
5413*5113495bSYour Name 
5414*5113495bSYour Name #ifdef FEATURE_WLAN_SCAN_PNO
5415*5113495bSYour Name 	/* PNO offload */
5416*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_nlo)) {
5417*5113495bSYour Name 		cfg->pno_offload = true;
5418*5113495bSYour Name 		g_fw_wlan_feat_caps |= (1 << PNO);
5419*5113495bSYour Name 	}
5420*5113495bSYour Name #endif /* FEATURE_WLAN_SCAN_PNO */
5421*5113495bSYour Name 
5422*5113495bSYour Name #ifdef FEATURE_WLAN_EXTSCAN
5423*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_extscan))
5424*5113495bSYour Name 		g_fw_wlan_feat_caps |= (1 << EXTENDED_SCAN);
5425*5113495bSYour Name #endif /* FEATURE_WLAN_EXTSCAN */
5426*5113495bSYour Name 	cfg->lte_coex_ant_share = wmi_service_enabled(wmi_handle,
5427*5113495bSYour Name 					wmi_service_lte_ant_share_support);
5428*5113495bSYour Name #ifdef FEATURE_WLAN_TDLS
5429*5113495bSYour Name 	/* Enable TDLS */
5430*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_tdls)) {
5431*5113495bSYour Name 		cfg->en_tdls = 1;
5432*5113495bSYour Name 		g_fw_wlan_feat_caps |= (1 << TDLS);
5433*5113495bSYour Name 	}
5434*5113495bSYour Name 	/* Enable advanced TDLS features */
5435*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_tdls_offchan)) {
5436*5113495bSYour Name 		cfg->en_tdls_offchan = 1;
5437*5113495bSYour Name 		g_fw_wlan_feat_caps |= (1 << TDLS_OFF_CHANNEL);
5438*5113495bSYour Name 	}
5439*5113495bSYour Name 
5440*5113495bSYour Name 	cfg->en_tdls_uapsd_buf_sta =
5441*5113495bSYour Name 		wmi_service_enabled(wmi_handle,
5442*5113495bSYour Name 				       wmi_service_tdls_uapsd_buffer_sta);
5443*5113495bSYour Name 	cfg->en_tdls_uapsd_sleep_sta =
5444*5113495bSYour Name 		wmi_service_enabled(wmi_handle,
5445*5113495bSYour Name 				       wmi_service_tdls_uapsd_sleep_sta);
5446*5113495bSYour Name #endif /* FEATURE_WLAN_TDLS */
5447*5113495bSYour Name 	if (wmi_service_enabled
5448*5113495bSYour Name 		    (wmi_handle, wmi_service_beacon_offload))
5449*5113495bSYour Name 		cfg->beacon_offload = true;
5450*5113495bSYour Name 	if (wmi_service_enabled
5451*5113495bSYour Name 		    (wmi_handle, wmi_service_sta_pmf_offload))
5452*5113495bSYour Name 		cfg->pmf_offload = true;
5453*5113495bSYour Name #ifdef WLAN_FEATURE_ROAM_OFFLOAD
5454*5113495bSYour Name 	/* Enable Roam Offload */
5455*5113495bSYour Name 	cfg->en_roam_offload = wmi_service_enabled(wmi_handle,
5456*5113495bSYour Name 					      wmi_service_roam_ho_offload);
5457*5113495bSYour Name #endif /* WLAN_FEATURE_ROAM_OFFLOAD */
5458*5113495bSYour Name #ifdef WLAN_FEATURE_NAN
5459*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_nan))
5460*5113495bSYour Name 		g_fw_wlan_feat_caps |= (1 << NAN);
5461*5113495bSYour Name 	wma_nan_set_pairing_feature();
5462*5113495bSYour Name #endif /* WLAN_FEATURE_NAN */
5463*5113495bSYour Name 
5464*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_rtt))
5465*5113495bSYour Name 		g_fw_wlan_feat_caps |= (1 << RTT);
5466*5113495bSYour Name 
5467*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle,
5468*5113495bSYour Name 			wmi_service_tx_msdu_id_new_partition_support)) {
5469*5113495bSYour Name 		wma_set_tx_partition_base(HTT_TX_IPA_NEW_MSDU_ID_SPACE_BEGIN);
5470*5113495bSYour Name 	} else {
5471*5113495bSYour Name 		wma_set_tx_partition_base(HTT_TX_IPA_MSDU_ID_SPACE_BEGIN);
5472*5113495bSYour Name 	}
5473*5113495bSYour Name 
5474*5113495bSYour Name 	wma_he_update_tgt_services(wmi_handle, cfg);
5475*5113495bSYour Name 	wma_eht_update_tgt_services(wmi_handle, cfg);
5476*5113495bSYour Name 
5477*5113495bSYour Name 	cfg->get_peer_info_enabled =
5478*5113495bSYour Name 		wmi_service_enabled(wmi_handle,
5479*5113495bSYour Name 				       wmi_service_peer_stats_info);
5480*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_fils_support))
5481*5113495bSYour Name 		cfg->is_fils_roaming_supported = true;
5482*5113495bSYour Name 
5483*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_mawc_support))
5484*5113495bSYour Name 		cfg->is_fw_mawc_capable = true;
5485*5113495bSYour Name 
5486*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle,
5487*5113495bSYour Name 				wmi_service_11k_neighbour_report_support))
5488*5113495bSYour Name 		cfg->is_11k_offload_supported = true;
5489*5113495bSYour Name 
5490*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_twt_requestor))
5491*5113495bSYour Name 		cfg->twt_requestor = true;
5492*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_twt_responder))
5493*5113495bSYour Name 		cfg->twt_responder = true;
5494*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_obss_scan))
5495*5113495bSYour Name 		cfg->obss_scan_offload = true;
5496*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_beacon_reception_stats))
5497*5113495bSYour Name 		cfg->bcn_reception_stats = true;
5498*5113495bSYour Name 
5499*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_vdev_latency_config))
5500*5113495bSYour Name 		g_fw_wlan_feat_caps |= (1 << VDEV_LATENCY_CONFIG);
5501*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle,
5502*5113495bSYour Name 				wmi_roam_scan_chan_list_to_host_support))
5503*5113495bSYour Name 		cfg->is_roam_scan_ch_to_host = true;
5504*5113495bSYour Name 
5505*5113495bSYour Name 	cfg->ll_stats_per_chan_rx_tx_time =
5506*5113495bSYour Name 		wmi_service_enabled(wmi_handle,
5507*5113495bSYour Name 				    wmi_service_ll_stats_per_chan_rx_tx_time);
5508*5113495bSYour Name 
5509*5113495bSYour Name 	wma_get_service_cap_club_get_sta_in_ll_stats_req(wmi_handle, cfg);
5510*5113495bSYour Name 
5511*5113495bSYour Name 	wma_get_igmp_offload_enable(wmi_handle, cfg);
5512*5113495bSYour Name 	wma_get_tdls_ax_support(wmi_handle, cfg);
5513*5113495bSYour Name 	wma_get_tdls_mlo_support(wmi_handle, cfg);
5514*5113495bSYour Name 	wma_get_tdls_6g_support(wmi_handle, cfg);
5515*5113495bSYour Name 	wma_get_tdls_wideband_support(wmi_handle, cfg);
5516*5113495bSYour Name 	wma_get_dynamic_vdev_macaddr_support(wmi_handle, cfg);
5517*5113495bSYour Name 	wma_get_service_cap_per_link_mlo_stats(wmi_handle, cfg);
5518*5113495bSYour Name 	wma_get_n_link_mlo_support(wmi_handle, cfg);
5519*5113495bSYour Name 	wma_get_mlo_tid_to_link_mapping_support(wmi_handle, cfg);
5520*5113495bSYour Name }
5521*5113495bSYour Name 
5522*5113495bSYour Name /**
5523*5113495bSYour Name  * wma_update_target_ht_cap() - update ht capabality from wma handle
5524*5113495bSYour Name  * @tgt_hdl: pointer to structure target_psoc_info
5525*5113495bSYour Name  * @cfg: ht capability
5526*5113495bSYour Name  *
5527*5113495bSYour Name  * Return: none
5528*5113495bSYour Name  */
5529*5113495bSYour Name static inline void
wma_update_target_ht_cap(struct target_psoc_info * tgt_hdl,struct wma_tgt_ht_cap * cfg)5530*5113495bSYour Name wma_update_target_ht_cap(struct target_psoc_info *tgt_hdl,
5531*5113495bSYour Name 			 struct wma_tgt_ht_cap *cfg)
5532*5113495bSYour Name {
5533*5113495bSYour Name 	int ht_cap_info;
5534*5113495bSYour Name 
5535*5113495bSYour Name 	ht_cap_info = target_if_get_ht_cap_info(tgt_hdl);
5536*5113495bSYour Name 	/* RX STBC */
5537*5113495bSYour Name 	cfg->ht_rx_stbc = !!(ht_cap_info & WMI_HT_CAP_RX_STBC);
5538*5113495bSYour Name 
5539*5113495bSYour Name 	/* TX STBC */
5540*5113495bSYour Name 	cfg->ht_tx_stbc = !!(ht_cap_info & WMI_HT_CAP_TX_STBC);
5541*5113495bSYour Name 
5542*5113495bSYour Name 	/* MPDU density */
5543*5113495bSYour Name 	cfg->mpdu_density = ht_cap_info & WMI_HT_CAP_MPDU_DENSITY;
5544*5113495bSYour Name 
5545*5113495bSYour Name 	/* HT RX LDPC */
5546*5113495bSYour Name 	cfg->ht_rx_ldpc = !!(ht_cap_info & WMI_HT_CAP_LDPC);
5547*5113495bSYour Name 
5548*5113495bSYour Name 	/* HT SGI */
5549*5113495bSYour Name 	cfg->ht_sgi_20 = !!(ht_cap_info & WMI_HT_CAP_HT20_SGI);
5550*5113495bSYour Name 
5551*5113495bSYour Name 	cfg->ht_sgi_40 = !!(ht_cap_info & WMI_HT_CAP_HT40_SGI);
5552*5113495bSYour Name 
5553*5113495bSYour Name 	cfg->dynamic_smps = !!(ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS);
5554*5113495bSYour Name 
5555*5113495bSYour Name 	/* RF chains */
5556*5113495bSYour Name 	cfg->num_rf_chains = target_if_get_num_rf_chains(tgt_hdl);
5557*5113495bSYour Name 
5558*5113495bSYour Name 	wma_nofl_debug("ht_cap_info - %x ht_rx_stbc - %d, ht_tx_stbc - %d\n"
5559*5113495bSYour Name 		 "mpdu_density - %d ht_rx_ldpc - %d ht_sgi_20 - %d\n"
5560*5113495bSYour Name 		 "ht_sgi_40 - %d num_rf_chains - %d dynamic_smps - %d",
5561*5113495bSYour Name 		 ht_cap_info,
5562*5113495bSYour Name 		 cfg->ht_rx_stbc, cfg->ht_tx_stbc, cfg->mpdu_density,
5563*5113495bSYour Name 		 cfg->ht_rx_ldpc, cfg->ht_sgi_20, cfg->ht_sgi_40,
5564*5113495bSYour Name 		 cfg->num_rf_chains, cfg->dynamic_smps);
5565*5113495bSYour Name 
5566*5113495bSYour Name }
5567*5113495bSYour Name 
5568*5113495bSYour Name /**
5569*5113495bSYour Name  * wma_update_target_vht_cap() - update vht capabality from wma handle
5570*5113495bSYour Name  * @tgt_hdl: pointer to structure target_psoc_info
5571*5113495bSYour Name  * @cfg: vht capabality
5572*5113495bSYour Name  *
5573*5113495bSYour Name  * Return: none
5574*5113495bSYour Name  */
5575*5113495bSYour Name static inline void
wma_update_target_vht_cap(struct target_psoc_info * tgt_hdl,struct wma_tgt_vht_cap * cfg)5576*5113495bSYour Name wma_update_target_vht_cap(struct target_psoc_info *tgt_hdl,
5577*5113495bSYour Name 			  struct wma_tgt_vht_cap *cfg)
5578*5113495bSYour Name {
5579*5113495bSYour Name 	int vht_cap_info = target_if_get_vht_cap_info(tgt_hdl);
5580*5113495bSYour Name 
5581*5113495bSYour Name 	if (vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_11454)
5582*5113495bSYour Name 		cfg->vht_max_mpdu = WMI_VHT_CAP_MAX_MPDU_LEN_11454;
5583*5113495bSYour Name 	else if (vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_7935)
5584*5113495bSYour Name 		cfg->vht_max_mpdu = WMI_VHT_CAP_MAX_MPDU_LEN_7935;
5585*5113495bSYour Name 	else
5586*5113495bSYour Name 		cfg->vht_max_mpdu = 0;
5587*5113495bSYour Name 
5588*5113495bSYour Name 
5589*5113495bSYour Name 	if (vht_cap_info & WMI_VHT_CAP_CH_WIDTH_80P80_160MHZ) {
5590*5113495bSYour Name 		cfg->supp_chan_width = 1 << eHT_CHANNEL_WIDTH_80P80MHZ;
5591*5113495bSYour Name 		cfg->supp_chan_width |= 1 << eHT_CHANNEL_WIDTH_160MHZ;
5592*5113495bSYour Name 	} else if (vht_cap_info & WMI_VHT_CAP_CH_WIDTH_160MHZ) {
5593*5113495bSYour Name 		cfg->supp_chan_width = 1 << eHT_CHANNEL_WIDTH_160MHZ;
5594*5113495bSYour Name 	} else {
5595*5113495bSYour Name 		cfg->supp_chan_width = 1 << eHT_CHANNEL_WIDTH_80MHZ;
5596*5113495bSYour Name 	}
5597*5113495bSYour Name 
5598*5113495bSYour Name 	cfg->vht_rx_ldpc = vht_cap_info & WMI_VHT_CAP_RX_LDPC;
5599*5113495bSYour Name 
5600*5113495bSYour Name 	cfg->vht_short_gi_80 = vht_cap_info & WMI_VHT_CAP_SGI_80MHZ;
5601*5113495bSYour Name 	cfg->vht_short_gi_160 = vht_cap_info & WMI_VHT_CAP_SGI_160MHZ;
5602*5113495bSYour Name 
5603*5113495bSYour Name 	cfg->vht_tx_stbc = vht_cap_info & WMI_VHT_CAP_TX_STBC;
5604*5113495bSYour Name 
5605*5113495bSYour Name 	cfg->vht_rx_stbc =
5606*5113495bSYour Name 		(vht_cap_info & WMI_VHT_CAP_RX_STBC_1SS) |
5607*5113495bSYour Name 		(vht_cap_info & WMI_VHT_CAP_RX_STBC_2SS) |
5608*5113495bSYour Name 		(vht_cap_info & WMI_VHT_CAP_RX_STBC_3SS);
5609*5113495bSYour Name 
5610*5113495bSYour Name 	cfg->vht_max_ampdu_len_exp = (vht_cap_info &
5611*5113495bSYour Name 				      WMI_VHT_CAP_MAX_AMPDU_LEN_EXP)
5612*5113495bSYour Name 				     >> WMI_VHT_CAP_MAX_AMPDU_LEN_EXP_SHIFT;
5613*5113495bSYour Name 
5614*5113495bSYour Name 	cfg->vht_su_bformer = vht_cap_info & WMI_VHT_CAP_SU_BFORMER;
5615*5113495bSYour Name 
5616*5113495bSYour Name 	cfg->vht_su_bformee = vht_cap_info & WMI_VHT_CAP_SU_BFORMEE;
5617*5113495bSYour Name 
5618*5113495bSYour Name 	cfg->vht_mu_bformer = vht_cap_info & WMI_VHT_CAP_MU_BFORMER;
5619*5113495bSYour Name 
5620*5113495bSYour Name 	cfg->vht_mu_bformee = vht_cap_info & WMI_VHT_CAP_MU_BFORMEE;
5621*5113495bSYour Name 
5622*5113495bSYour Name 	cfg->vht_txop_ps = vht_cap_info & WMI_VHT_CAP_TXOP_PS;
5623*5113495bSYour Name 
5624*5113495bSYour Name 	wma_nofl_debug("max_mpdu %d supp_chan_width %x rx_ldpc %x\n"
5625*5113495bSYour Name 		 "short_gi_80 %x tx_stbc %x rx_stbc %x txop_ps %x\n"
5626*5113495bSYour Name 		 "su_bformee %x mu_bformee %x max_ampdu_len_exp %d",
5627*5113495bSYour Name 		 cfg->vht_max_mpdu, cfg->supp_chan_width, cfg->vht_rx_ldpc,
5628*5113495bSYour Name 		 cfg->vht_short_gi_80, cfg->vht_tx_stbc, cfg->vht_rx_stbc,
5629*5113495bSYour Name 		 cfg->vht_txop_ps, cfg->vht_su_bformee, cfg->vht_mu_bformee,
5630*5113495bSYour Name 		 cfg->vht_max_ampdu_len_exp);
5631*5113495bSYour Name }
5632*5113495bSYour Name 
5633*5113495bSYour Name /**
5634*5113495bSYour Name  * wma_update_supported_bands() - update supported bands from service ready ext
5635*5113495bSYour Name  * @supported_bands: Supported band given by FW through service ready ext params
5636*5113495bSYour Name  * @new_supported_bands: New supported band which needs to be updated by
5637*5113495bSYour Name  *			 this API which WMA layer understands
5638*5113495bSYour Name  *
5639*5113495bSYour Name  * This API will convert FW given supported band to enum which WMA layer
5640*5113495bSYour Name  * understands
5641*5113495bSYour Name  *
5642*5113495bSYour Name  * Return: QDF_STATUS
5643*5113495bSYour Name  */
wma_update_supported_bands(WLAN_BAND_CAPABILITY supported_bands,WMI_PHY_CAPABILITY * new_supported_bands)5644*5113495bSYour Name static QDF_STATUS wma_update_supported_bands(
5645*5113495bSYour Name 			WLAN_BAND_CAPABILITY supported_bands,
5646*5113495bSYour Name 			WMI_PHY_CAPABILITY *new_supported_bands)
5647*5113495bSYour Name {
5648*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
5649*5113495bSYour Name 
5650*5113495bSYour Name 	if (!new_supported_bands) {
5651*5113495bSYour Name 		wma_err("NULL new supported band variable");
5652*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
5653*5113495bSYour Name 	}
5654*5113495bSYour Name 	switch (supported_bands) {
5655*5113495bSYour Name 	case WLAN_2G_CAPABILITY:
5656*5113495bSYour Name 		*new_supported_bands |= WMI_11G_CAPABILITY;
5657*5113495bSYour Name 		break;
5658*5113495bSYour Name 	case WLAN_5G_CAPABILITY:
5659*5113495bSYour Name 		*new_supported_bands |= WMI_11A_CAPABILITY;
5660*5113495bSYour Name 		break;
5661*5113495bSYour Name 	default:
5662*5113495bSYour Name 		wma_err("wrong supported band");
5663*5113495bSYour Name 		status = QDF_STATUS_E_FAILURE;
5664*5113495bSYour Name 		break;
5665*5113495bSYour Name 	}
5666*5113495bSYour Name 	return status;
5667*5113495bSYour Name }
5668*5113495bSYour Name 
5669*5113495bSYour Name /**
5670*5113495bSYour Name  * wma_derive_ext_ht_cap() - Derive HT caps based on given value
5671*5113495bSYour Name  * @ht_cap: given pointer to HT caps which needs to be updated
5672*5113495bSYour Name  * @value: new HT cap info provided in form of bitmask
5673*5113495bSYour Name  * @tx_chain: given tx chainmask value
5674*5113495bSYour Name  * @rx_chain: given rx chainmask value
5675*5113495bSYour Name  *
5676*5113495bSYour Name  * This function takes the value provided in form of bitmask and decodes
5677*5113495bSYour Name  * it. After decoding, what ever value it gets, it takes the union(max) or
5678*5113495bSYour Name  * intersection(min) with previously derived values.
5679*5113495bSYour Name  *
5680*5113495bSYour Name  * Return: none
5681*5113495bSYour Name  *
5682*5113495bSYour Name  */
wma_derive_ext_ht_cap(struct wma_tgt_ht_cap * ht_cap,uint32_t value,uint32_t tx_chain,uint32_t rx_chain)5683*5113495bSYour Name static void wma_derive_ext_ht_cap(
5684*5113495bSYour Name 			struct wma_tgt_ht_cap *ht_cap, uint32_t value,
5685*5113495bSYour Name 			uint32_t tx_chain, uint32_t rx_chain)
5686*5113495bSYour Name {
5687*5113495bSYour Name 	struct wma_tgt_ht_cap tmp = {0};
5688*5113495bSYour Name 
5689*5113495bSYour Name 	if (!ht_cap)
5690*5113495bSYour Name 		return;
5691*5113495bSYour Name 
5692*5113495bSYour Name 	if (!qdf_mem_cmp(ht_cap, &tmp, sizeof(struct wma_tgt_ht_cap))) {
5693*5113495bSYour Name 		ht_cap->ht_rx_stbc = (!!(value & WMI_HT_CAP_RX_STBC));
5694*5113495bSYour Name 		ht_cap->ht_tx_stbc = (!!(value & WMI_HT_CAP_TX_STBC));
5695*5113495bSYour Name 		ht_cap->mpdu_density = (!!(value & WMI_HT_CAP_MPDU_DENSITY));
5696*5113495bSYour Name 		ht_cap->ht_rx_ldpc = (!!(value & WMI_HT_CAP_RX_LDPC));
5697*5113495bSYour Name 		ht_cap->ht_sgi_20 = (!!(value & WMI_HT_CAP_HT20_SGI));
5698*5113495bSYour Name 		ht_cap->ht_sgi_40 = (!!(value & WMI_HT_CAP_HT40_SGI));
5699*5113495bSYour Name 		ht_cap->dynamic_smps = (!!(value & WMI_HT_CAP_DYNAMIC_SMPS));
5700*5113495bSYour Name 		ht_cap->num_rf_chains =
5701*5113495bSYour Name 			QDF_MAX(wma_get_num_of_setbits_from_bitmask(tx_chain),
5702*5113495bSYour Name 				wma_get_num_of_setbits_from_bitmask(rx_chain));
5703*5113495bSYour Name 	} else {
5704*5113495bSYour Name 		ht_cap->ht_rx_stbc = QDF_MIN(ht_cap->ht_rx_stbc,
5705*5113495bSYour Name 					(!!(value & WMI_HT_CAP_RX_STBC)));
5706*5113495bSYour Name 		ht_cap->ht_tx_stbc = QDF_MAX(ht_cap->ht_tx_stbc,
5707*5113495bSYour Name 					(!!(value & WMI_HT_CAP_TX_STBC)));
5708*5113495bSYour Name 		ht_cap->mpdu_density = QDF_MIN(ht_cap->mpdu_density,
5709*5113495bSYour Name 					(!!(value & WMI_HT_CAP_MPDU_DENSITY)));
5710*5113495bSYour Name 		ht_cap->ht_rx_ldpc = QDF_MIN(ht_cap->ht_rx_ldpc,
5711*5113495bSYour Name 					(!!(value & WMI_HT_CAP_RX_LDPC)));
5712*5113495bSYour Name 		ht_cap->ht_sgi_20 = QDF_MIN(ht_cap->ht_sgi_20,
5713*5113495bSYour Name 					(!!(value & WMI_HT_CAP_HT20_SGI)));
5714*5113495bSYour Name 		ht_cap->ht_sgi_40 = QDF_MIN(ht_cap->ht_sgi_40,
5715*5113495bSYour Name 					(!!(value & WMI_HT_CAP_HT40_SGI)));
5716*5113495bSYour Name 		ht_cap->dynamic_smps = QDF_MIN(ht_cap->dynamic_smps,
5717*5113495bSYour Name 					(!!(value & WMI_HT_CAP_DYNAMIC_SMPS)));
5718*5113495bSYour Name 
5719*5113495bSYour Name 		ht_cap->num_rf_chains =
5720*5113495bSYour Name 			QDF_MAX(ht_cap->num_rf_chains,
5721*5113495bSYour Name 				QDF_MAX(wma_get_num_of_setbits_from_bitmask(
5722*5113495bSYour Name 								tx_chain),
5723*5113495bSYour Name 					wma_get_num_of_setbits_from_bitmask(
5724*5113495bSYour Name 								rx_chain)));
5725*5113495bSYour Name 	}
5726*5113495bSYour Name }
5727*5113495bSYour Name 
5728*5113495bSYour Name /**
5729*5113495bSYour Name  * wma_update_target_ext_ht_cap() - Update HT caps with given extended cap
5730*5113495bSYour Name  * @tgt_hdl: target psoc information
5731*5113495bSYour Name  * @ht_cap: HT cap structure to be filled
5732*5113495bSYour Name  *
5733*5113495bSYour Name  * This function loop through each hardware mode and for each hardware mode
5734*5113495bSYour Name  * again it loop through each MAC/PHY and pull the caps 2G and 5G specific
5735*5113495bSYour Name  * HT caps and derives the final cap.
5736*5113495bSYour Name  *
5737*5113495bSYour Name  * Return: none
5738*5113495bSYour Name  *
5739*5113495bSYour Name  */
wma_update_target_ext_ht_cap(struct target_psoc_info * tgt_hdl,struct wma_tgt_ht_cap * ht_cap)5740*5113495bSYour Name static void wma_update_target_ext_ht_cap(struct target_psoc_info *tgt_hdl,
5741*5113495bSYour Name 					 struct wma_tgt_ht_cap *ht_cap)
5742*5113495bSYour Name {
5743*5113495bSYour Name 	int i, total_mac_phy_cnt;
5744*5113495bSYour Name 	uint32_t ht_2g, ht_5g;
5745*5113495bSYour Name 	struct wma_tgt_ht_cap tmp_ht_cap = {0}, tmp_cap = {0};
5746*5113495bSYour Name 	struct wlan_psoc_host_mac_phy_caps *mac_phy_cap;
5747*5113495bSYour Name 	int num_hw_modes;
5748*5113495bSYour Name 
5749*5113495bSYour Name 	total_mac_phy_cnt = target_psoc_get_total_mac_phy_cnt(tgt_hdl);
5750*5113495bSYour Name 	num_hw_modes = target_psoc_get_num_hw_modes(tgt_hdl);
5751*5113495bSYour Name 	mac_phy_cap = target_psoc_get_mac_phy_cap(tgt_hdl);
5752*5113495bSYour Name 
5753*5113495bSYour Name 	if (!mac_phy_cap) {
5754*5113495bSYour Name 		wma_err("Invalid MAC PHY capabilities handle");
5755*5113495bSYour Name 		return;
5756*5113495bSYour Name 	}
5757*5113495bSYour Name 
5758*5113495bSYour Name 	/*
5759*5113495bSYour Name 	 * for legacy device extended cap might not even come, so in that case
5760*5113495bSYour Name 	 * don't overwrite legacy values
5761*5113495bSYour Name 	 */
5762*5113495bSYour Name 	if (!num_hw_modes) {
5763*5113495bSYour Name 		wma_debug("No extended HT cap for current SOC");
5764*5113495bSYour Name 		return;
5765*5113495bSYour Name 	}
5766*5113495bSYour Name 
5767*5113495bSYour Name 	for (i = 0; i < total_mac_phy_cnt; i++) {
5768*5113495bSYour Name 		ht_2g = mac_phy_cap[i].ht_cap_info_2G;
5769*5113495bSYour Name 		ht_5g = mac_phy_cap[i].ht_cap_info_5G;
5770*5113495bSYour Name 		if (ht_2g)
5771*5113495bSYour Name 			wma_derive_ext_ht_cap(&tmp_ht_cap,
5772*5113495bSYour Name 					ht_2g,
5773*5113495bSYour Name 					mac_phy_cap[i].tx_chain_mask_2G,
5774*5113495bSYour Name 					mac_phy_cap[i].rx_chain_mask_2G);
5775*5113495bSYour Name 		if (ht_5g)
5776*5113495bSYour Name 			wma_derive_ext_ht_cap(&tmp_ht_cap,
5777*5113495bSYour Name 					ht_5g,
5778*5113495bSYour Name 					mac_phy_cap[i].tx_chain_mask_5G,
5779*5113495bSYour Name 					mac_phy_cap[i].rx_chain_mask_5G);
5780*5113495bSYour Name 	}
5781*5113495bSYour Name 
5782*5113495bSYour Name 	if (qdf_mem_cmp(&tmp_cap, &tmp_ht_cap,
5783*5113495bSYour Name 				sizeof(struct wma_tgt_ht_cap))) {
5784*5113495bSYour Name 		qdf_mem_copy(ht_cap, &tmp_ht_cap,
5785*5113495bSYour Name 				sizeof(struct wma_tgt_ht_cap));
5786*5113495bSYour Name 	}
5787*5113495bSYour Name 
5788*5113495bSYour Name 	wma_nofl_debug("[ext ht cap] ht_rx_stbc - %d, ht_tx_stbc - %d\n"
5789*5113495bSYour Name 			"mpdu_density - %d ht_rx_ldpc - %d ht_sgi_20 - %d\n"
5790*5113495bSYour Name 			"ht_sgi_40 - %d num_rf_chains - %d dynamic_smps - %d",
5791*5113495bSYour Name 			ht_cap->ht_rx_stbc, ht_cap->ht_tx_stbc,
5792*5113495bSYour Name 			ht_cap->mpdu_density, ht_cap->ht_rx_ldpc,
5793*5113495bSYour Name 			ht_cap->ht_sgi_20, ht_cap->ht_sgi_40,
5794*5113495bSYour Name 			ht_cap->num_rf_chains, ht_cap->dynamic_smps);
5795*5113495bSYour Name }
5796*5113495bSYour Name 
5797*5113495bSYour Name /**
5798*5113495bSYour Name  * wma_derive_ext_vht_cap() - Derive VHT caps based on given value
5799*5113495bSYour Name  * @vht_cap: pointer to given VHT caps to be filled
5800*5113495bSYour Name  * @value: new VHT cap info provided in form of bitmask
5801*5113495bSYour Name  *
5802*5113495bSYour Name  * This function takes the value provided in form of bitmask and decodes
5803*5113495bSYour Name  * it. After decoding, what ever value it gets, it takes the union(max) or
5804*5113495bSYour Name  * intersection(min) with previously derived values.
5805*5113495bSYour Name  *
5806*5113495bSYour Name  * Return: none
5807*5113495bSYour Name  *
5808*5113495bSYour Name  */
wma_derive_ext_vht_cap(struct wma_tgt_vht_cap * vht_cap,uint32_t value)5809*5113495bSYour Name static void wma_derive_ext_vht_cap(
5810*5113495bSYour Name 			struct wma_tgt_vht_cap *vht_cap, uint32_t value)
5811*5113495bSYour Name {
5812*5113495bSYour Name 	struct wma_tgt_vht_cap tmp_cap = {0};
5813*5113495bSYour Name 	uint32_t tmp = 0;
5814*5113495bSYour Name 
5815*5113495bSYour Name 	if (!vht_cap)
5816*5113495bSYour Name 		return;
5817*5113495bSYour Name 
5818*5113495bSYour Name 	if (!qdf_mem_cmp(vht_cap, &tmp_cap,
5819*5113495bSYour Name 				sizeof(struct wma_tgt_vht_cap))) {
5820*5113495bSYour Name 		if (value & WMI_VHT_CAP_MAX_MPDU_LEN_11454)
5821*5113495bSYour Name 			vht_cap->vht_max_mpdu = WMI_VHT_CAP_MAX_MPDU_LEN_11454;
5822*5113495bSYour Name 		else if (value & WMI_VHT_CAP_MAX_MPDU_LEN_7935)
5823*5113495bSYour Name 			vht_cap->vht_max_mpdu = WMI_VHT_CAP_MAX_MPDU_LEN_7935;
5824*5113495bSYour Name 		else
5825*5113495bSYour Name 			vht_cap->vht_max_mpdu = 0;
5826*5113495bSYour Name 
5827*5113495bSYour Name 		if (value & WMI_VHT_CAP_CH_WIDTH_80P80_160MHZ) {
5828*5113495bSYour Name 			vht_cap->supp_chan_width =
5829*5113495bSYour Name 				1 << eHT_CHANNEL_WIDTH_80P80MHZ;
5830*5113495bSYour Name 			vht_cap->supp_chan_width |=
5831*5113495bSYour Name 				1 << eHT_CHANNEL_WIDTH_160MHZ;
5832*5113495bSYour Name 		} else if (value & WMI_VHT_CAP_CH_WIDTH_160MHZ) {
5833*5113495bSYour Name 			vht_cap->supp_chan_width =
5834*5113495bSYour Name 				1 << eHT_CHANNEL_WIDTH_160MHZ;
5835*5113495bSYour Name 		} else {
5836*5113495bSYour Name 			vht_cap->supp_chan_width = 1 << eHT_CHANNEL_WIDTH_80MHZ;
5837*5113495bSYour Name 		}
5838*5113495bSYour Name 		vht_cap->vht_rx_ldpc = value & WMI_VHT_CAP_RX_LDPC;
5839*5113495bSYour Name 		vht_cap->vht_short_gi_80 = value & WMI_VHT_CAP_SGI_80MHZ;
5840*5113495bSYour Name 		vht_cap->vht_short_gi_160 = value & WMI_VHT_CAP_SGI_160MHZ;
5841*5113495bSYour Name 		vht_cap->vht_tx_stbc = value & WMI_VHT_CAP_TX_STBC;
5842*5113495bSYour Name 		vht_cap->vht_rx_stbc =
5843*5113495bSYour Name 			(value & WMI_VHT_CAP_RX_STBC_1SS) |
5844*5113495bSYour Name 			(value & WMI_VHT_CAP_RX_STBC_2SS) |
5845*5113495bSYour Name 			(value & WMI_VHT_CAP_RX_STBC_3SS);
5846*5113495bSYour Name 		vht_cap->vht_max_ampdu_len_exp =
5847*5113495bSYour Name 			(value & WMI_VHT_CAP_MAX_AMPDU_LEN_EXP) >>
5848*5113495bSYour Name 				WMI_VHT_CAP_MAX_AMPDU_LEN_EXP_SHIFT;
5849*5113495bSYour Name 		vht_cap->vht_su_bformer = value & WMI_VHT_CAP_SU_BFORMER;
5850*5113495bSYour Name 		vht_cap->vht_su_bformee = value & WMI_VHT_CAP_SU_BFORMEE;
5851*5113495bSYour Name 		vht_cap->vht_mu_bformer = value & WMI_VHT_CAP_MU_BFORMER;
5852*5113495bSYour Name 		vht_cap->vht_mu_bformee = value & WMI_VHT_CAP_MU_BFORMEE;
5853*5113495bSYour Name 		vht_cap->vht_txop_ps = value & WMI_VHT_CAP_TXOP_PS;
5854*5113495bSYour Name 	} else {
5855*5113495bSYour Name 		if (value & WMI_VHT_CAP_MAX_MPDU_LEN_11454)
5856*5113495bSYour Name 			tmp = WMI_VHT_CAP_MAX_MPDU_LEN_11454;
5857*5113495bSYour Name 		else if (value & WMI_VHT_CAP_MAX_MPDU_LEN_7935)
5858*5113495bSYour Name 			tmp = WMI_VHT_CAP_MAX_MPDU_LEN_7935;
5859*5113495bSYour Name 		else
5860*5113495bSYour Name 			tmp = 0;
5861*5113495bSYour Name 		vht_cap->vht_max_mpdu = QDF_MIN(vht_cap->vht_max_mpdu, tmp);
5862*5113495bSYour Name 
5863*5113495bSYour Name 		if ((value & WMI_VHT_CAP_CH_WIDTH_80P80_160MHZ)) {
5864*5113495bSYour Name 			tmp = (1 << eHT_CHANNEL_WIDTH_80P80MHZ) |
5865*5113495bSYour Name 				(1 << eHT_CHANNEL_WIDTH_160MHZ);
5866*5113495bSYour Name 		} else if (value & WMI_VHT_CAP_CH_WIDTH_160MHZ) {
5867*5113495bSYour Name 			tmp = 1 << eHT_CHANNEL_WIDTH_160MHZ;
5868*5113495bSYour Name 		} else {
5869*5113495bSYour Name 			tmp = 1 << eHT_CHANNEL_WIDTH_80MHZ;
5870*5113495bSYour Name 		}
5871*5113495bSYour Name 		vht_cap->supp_chan_width =
5872*5113495bSYour Name 			QDF_MAX(vht_cap->supp_chan_width, tmp);
5873*5113495bSYour Name 		vht_cap->vht_rx_ldpc = QDF_MIN(vht_cap->vht_rx_ldpc,
5874*5113495bSYour Name 						value & WMI_VHT_CAP_RX_LDPC);
5875*5113495bSYour Name 		vht_cap->vht_short_gi_80 = QDF_MAX(vht_cap->vht_short_gi_80,
5876*5113495bSYour Name 						value & WMI_VHT_CAP_SGI_80MHZ);
5877*5113495bSYour Name 		vht_cap->vht_short_gi_160 = QDF_MAX(vht_cap->vht_short_gi_160,
5878*5113495bSYour Name 						value & WMI_VHT_CAP_SGI_160MHZ);
5879*5113495bSYour Name 		vht_cap->vht_tx_stbc = QDF_MAX(vht_cap->vht_tx_stbc,
5880*5113495bSYour Name 						value & WMI_VHT_CAP_TX_STBC);
5881*5113495bSYour Name 		vht_cap->vht_rx_stbc = QDF_MIN(vht_cap->vht_rx_stbc,
5882*5113495bSYour Name 					(value & WMI_VHT_CAP_RX_STBC_1SS) |
5883*5113495bSYour Name 					(value & WMI_VHT_CAP_RX_STBC_2SS) |
5884*5113495bSYour Name 					(value & WMI_VHT_CAP_RX_STBC_3SS));
5885*5113495bSYour Name 		vht_cap->vht_max_ampdu_len_exp =
5886*5113495bSYour Name 			QDF_MIN(vht_cap->vht_max_ampdu_len_exp,
5887*5113495bSYour Name 				(value & WMI_VHT_CAP_MAX_AMPDU_LEN_EXP) >>
5888*5113495bSYour Name 					WMI_VHT_CAP_MAX_AMPDU_LEN_EXP_SHIFT);
5889*5113495bSYour Name 		vht_cap->vht_su_bformer = QDF_MAX(vht_cap->vht_su_bformer,
5890*5113495bSYour Name 						value & WMI_VHT_CAP_SU_BFORMER);
5891*5113495bSYour Name 		vht_cap->vht_su_bformee = QDF_MAX(vht_cap->vht_su_bformee,
5892*5113495bSYour Name 						value & WMI_VHT_CAP_SU_BFORMEE);
5893*5113495bSYour Name 		vht_cap->vht_mu_bformer = QDF_MAX(vht_cap->vht_mu_bformer,
5894*5113495bSYour Name 						value & WMI_VHT_CAP_MU_BFORMER);
5895*5113495bSYour Name 		vht_cap->vht_mu_bformee = QDF_MAX(vht_cap->vht_mu_bformee,
5896*5113495bSYour Name 						value & WMI_VHT_CAP_MU_BFORMEE);
5897*5113495bSYour Name 		vht_cap->vht_txop_ps = QDF_MIN(vht_cap->vht_txop_ps,
5898*5113495bSYour Name 						value & WMI_VHT_CAP_TXOP_PS);
5899*5113495bSYour Name 	}
5900*5113495bSYour Name }
5901*5113495bSYour Name 
5902*5113495bSYour Name /**
5903*5113495bSYour Name  * wma_update_target_ext_vht_cap() - Update VHT caps with given extended cap
5904*5113495bSYour Name  * @tgt_hdl: target psoc information
5905*5113495bSYour Name  * @vht_cap: VHT cap structure to be filled
5906*5113495bSYour Name  *
5907*5113495bSYour Name  * This function loop through each hardware mode and for each hardware mode
5908*5113495bSYour Name  * again it loop through each MAC/PHY and pull the caps 2G and 5G specific
5909*5113495bSYour Name  * VHT caps and derives the final cap.
5910*5113495bSYour Name  *
5911*5113495bSYour Name  * Return: none
5912*5113495bSYour Name  *
5913*5113495bSYour Name  */
wma_update_target_ext_vht_cap(struct target_psoc_info * tgt_hdl,struct wma_tgt_vht_cap * vht_cap)5914*5113495bSYour Name static void wma_update_target_ext_vht_cap(struct target_psoc_info *tgt_hdl,
5915*5113495bSYour Name 					  struct wma_tgt_vht_cap *vht_cap)
5916*5113495bSYour Name {
5917*5113495bSYour Name 	int i, num_hw_modes, total_mac_phy_cnt;
5918*5113495bSYour Name 	uint32_t vht_cap_info_2g, vht_cap_info_5g;
5919*5113495bSYour Name 	struct wma_tgt_vht_cap tmp_vht_cap = {0}, tmp_cap = {0};
5920*5113495bSYour Name 	struct wlan_psoc_host_mac_phy_caps *mac_phy_cap;
5921*5113495bSYour Name 	uint32_t vht_mcs_10_11_supp = 0;
5922*5113495bSYour Name 
5923*5113495bSYour Name 	total_mac_phy_cnt = target_psoc_get_total_mac_phy_cnt(tgt_hdl);
5924*5113495bSYour Name 	num_hw_modes = target_psoc_get_num_hw_modes(tgt_hdl);
5925*5113495bSYour Name 
5926*5113495bSYour Name 	mac_phy_cap = target_psoc_get_mac_phy_cap(tgt_hdl);
5927*5113495bSYour Name 	if (!mac_phy_cap) {
5928*5113495bSYour Name 		wma_err("Invalid MAC PHY capabilities handle");
5929*5113495bSYour Name 		return;
5930*5113495bSYour Name 	}
5931*5113495bSYour Name 
5932*5113495bSYour Name 	/*
5933*5113495bSYour Name 	 * for legacy device extended cap might not even come, so in that case
5934*5113495bSYour Name 	 * don't overwrite legacy values
5935*5113495bSYour Name 	 */
5936*5113495bSYour Name 	if (!num_hw_modes) {
5937*5113495bSYour Name 		wma_debug("No extended VHT cap for current SOC");
5938*5113495bSYour Name 		return;
5939*5113495bSYour Name 	}
5940*5113495bSYour Name 
5941*5113495bSYour Name 	for (i = 0; i < total_mac_phy_cnt; i++) {
5942*5113495bSYour Name 		vht_cap_info_2g = mac_phy_cap[i].vht_cap_info_2G;
5943*5113495bSYour Name 		vht_cap_info_5g = mac_phy_cap[i].vht_cap_info_5G;
5944*5113495bSYour Name 		if (vht_cap_info_2g)
5945*5113495bSYour Name 			wma_derive_ext_vht_cap(&tmp_vht_cap,
5946*5113495bSYour Name 					vht_cap_info_2g);
5947*5113495bSYour Name 		if (vht_cap_info_5g)
5948*5113495bSYour Name 			wma_derive_ext_vht_cap(&tmp_vht_cap,
5949*5113495bSYour Name 					vht_cap_info_5g);
5950*5113495bSYour Name 		if (WMI_GET_BITS(mac_phy_cap[i].vht_supp_mcs_5G, 16, 2) &&
5951*5113495bSYour Name 		    WMI_VHT_MCS_NOTIFY_EXT_SS_GET(mac_phy_cap[i].
5952*5113495bSYour Name 			    vht_supp_mcs_5G))
5953*5113495bSYour Name 			vht_mcs_10_11_supp = 1;
5954*5113495bSYour Name 		if (WMI_GET_BITS(mac_phy_cap[i].vht_supp_mcs_2G, 16, 2) &&
5955*5113495bSYour Name 		    WMI_VHT_MCS_NOTIFY_EXT_SS_GET(mac_phy_cap[i].
5956*5113495bSYour Name 			    vht_supp_mcs_2G))
5957*5113495bSYour Name 			vht_mcs_10_11_supp = 1;
5958*5113495bSYour Name 	}
5959*5113495bSYour Name 
5960*5113495bSYour Name 	if (qdf_mem_cmp(&tmp_cap, &tmp_vht_cap,
5961*5113495bSYour Name 				sizeof(struct wma_tgt_vht_cap))) {
5962*5113495bSYour Name 			qdf_mem_copy(vht_cap, &tmp_vht_cap,
5963*5113495bSYour Name 					sizeof(struct wma_tgt_vht_cap));
5964*5113495bSYour Name 	}
5965*5113495bSYour Name 	vht_cap->vht_mcs_10_11_supp = vht_mcs_10_11_supp;
5966*5113495bSYour Name 	wma_nofl_debug("[ext vhtcap] max_mpdu %d supp_chan_width %x rx_ldpc %x\n"
5967*5113495bSYour Name 		"short_gi_80 %x tx_stbc %x rx_stbc %x txop_ps %x\n"
5968*5113495bSYour Name 		"su_bformee %x mu_bformee %x max_ampdu_len_exp %d\n"
5969*5113495bSYour Name 		"vht_mcs_10_11_supp %d",
5970*5113495bSYour Name 		vht_cap->vht_max_mpdu, vht_cap->supp_chan_width,
5971*5113495bSYour Name 		vht_cap->vht_rx_ldpc, vht_cap->vht_short_gi_80,
5972*5113495bSYour Name 		vht_cap->vht_tx_stbc, vht_cap->vht_rx_stbc,
5973*5113495bSYour Name 		vht_cap->vht_txop_ps, vht_cap->vht_su_bformee,
5974*5113495bSYour Name 		vht_cap->vht_mu_bformee, vht_cap->vht_max_ampdu_len_exp,
5975*5113495bSYour Name 		vht_cap->vht_mcs_10_11_supp);
5976*5113495bSYour Name }
5977*5113495bSYour Name 
5978*5113495bSYour Name static void
wma_update_sar_version(struct wlan_psoc_host_service_ext_param * param,struct wma_tgt_cfg * cfg)5979*5113495bSYour Name wma_update_sar_version(struct wlan_psoc_host_service_ext_param *param,
5980*5113495bSYour Name 		       struct wma_tgt_cfg *cfg)
5981*5113495bSYour Name {
5982*5113495bSYour Name 	cfg->sar_version = param ? param->sar_version : SAR_VERSION_1;
5983*5113495bSYour Name }
5984*5113495bSYour Name 
5985*5113495bSYour Name /**
5986*5113495bSYour Name  * wma_update_hdd_band_cap() - update band cap which hdd understands
5987*5113495bSYour Name  * @supported_band: supported band which has been given by FW
5988*5113495bSYour Name  * @tgt_cfg: target configuration to be updated
5989*5113495bSYour Name  * @psoc: psoc ptr
5990*5113495bSYour Name  *
5991*5113495bSYour Name  * Convert WMA given supported band to enum which HDD understands
5992*5113495bSYour Name  *
5993*5113495bSYour Name  * Return: None
5994*5113495bSYour Name  */
wma_update_hdd_band_cap(WMI_PHY_CAPABILITY supported_band,struct wma_tgt_cfg * tgt_cfg,struct wlan_objmgr_psoc * psoc)5995*5113495bSYour Name static void wma_update_hdd_band_cap(WMI_PHY_CAPABILITY supported_band,
5996*5113495bSYour Name 				    struct wma_tgt_cfg *tgt_cfg,
5997*5113495bSYour Name 				    struct wlan_objmgr_psoc *psoc)
5998*5113495bSYour Name {
5999*5113495bSYour Name 	switch (supported_band) {
6000*5113495bSYour Name 	case WMI_11G_CAPABILITY:
6001*5113495bSYour Name 	case WMI_11NG_CAPABILITY:
6002*5113495bSYour Name 		tgt_cfg->band_cap = BIT(REG_BAND_2G);
6003*5113495bSYour Name 		break;
6004*5113495bSYour Name 	case WMI_11A_CAPABILITY:
6005*5113495bSYour Name 	case WMI_11NA_CAPABILITY:
6006*5113495bSYour Name 	case WMI_11AC_CAPABILITY:
6007*5113495bSYour Name 		tgt_cfg->band_cap = BIT(REG_BAND_5G);
6008*5113495bSYour Name 		break;
6009*5113495bSYour Name 	case WMI_11AG_CAPABILITY:
6010*5113495bSYour Name 	case WMI_11NAG_CAPABILITY:
6011*5113495bSYour Name 	case WMI_11AX_CAPABILITY:
6012*5113495bSYour Name 		tgt_cfg->band_cap = (BIT(REG_BAND_2G) | BIT(REG_BAND_5G));
6013*5113495bSYour Name 		if (wlan_reg_is_6ghz_supported(psoc))
6014*5113495bSYour Name 			tgt_cfg->band_cap |= BIT(REG_BAND_6G);
6015*5113495bSYour Name 		break;
6016*5113495bSYour Name 	default:
6017*5113495bSYour Name 		tgt_cfg->band_cap = (BIT(REG_BAND_2G) |
6018*5113495bSYour Name 				     BIT(REG_BAND_5G) |
6019*5113495bSYour Name 				     BIT(REG_BAND_6G));
6020*5113495bSYour Name 	}
6021*5113495bSYour Name }
6022*5113495bSYour Name 
6023*5113495bSYour Name /**
6024*5113495bSYour Name  * wma_update_obss_detection_support() - update obss detection offload support
6025*5113495bSYour Name  * @wh: wma handle
6026*5113495bSYour Name  * @tgt_cfg: target configuration to be updated
6027*5113495bSYour Name  *
6028*5113495bSYour Name  * Update obss detection offload support based on service bit.
6029*5113495bSYour Name  *
6030*5113495bSYour Name  * Return: None
6031*5113495bSYour Name  */
wma_update_obss_detection_support(tp_wma_handle wh,struct wma_tgt_cfg * tgt_cfg)6032*5113495bSYour Name static void wma_update_obss_detection_support(tp_wma_handle wh,
6033*5113495bSYour Name 					      struct wma_tgt_cfg *tgt_cfg)
6034*5113495bSYour Name {
6035*5113495bSYour Name 	if (wmi_service_enabled(wh->wmi_handle,
6036*5113495bSYour Name 				wmi_service_ap_obss_detection_offload))
6037*5113495bSYour Name 		tgt_cfg->obss_detection_offloaded = true;
6038*5113495bSYour Name 	else
6039*5113495bSYour Name 		tgt_cfg->obss_detection_offloaded = false;
6040*5113495bSYour Name }
6041*5113495bSYour Name 
6042*5113495bSYour Name /**
6043*5113495bSYour Name  * wma_update_obss_color_collision_support() - update obss color collision
6044*5113495bSYour Name  *   offload support
6045*5113495bSYour Name  * @wh: wma handle
6046*5113495bSYour Name  * @tgt_cfg: target configuration to be updated
6047*5113495bSYour Name  *
6048*5113495bSYour Name  * Update obss color collision offload support based on service bit.
6049*5113495bSYour Name  *
6050*5113495bSYour Name  * Return: None
6051*5113495bSYour Name  */
wma_update_obss_color_collision_support(tp_wma_handle wh,struct wma_tgt_cfg * tgt_cfg)6052*5113495bSYour Name static void wma_update_obss_color_collision_support(tp_wma_handle wh,
6053*5113495bSYour Name 						    struct wma_tgt_cfg *tgt_cfg)
6054*5113495bSYour Name {
6055*5113495bSYour Name 	if (wmi_service_enabled(wh->wmi_handle, wmi_service_bss_color_offload))
6056*5113495bSYour Name 		tgt_cfg->obss_color_collision_offloaded = true;
6057*5113495bSYour Name 	else
6058*5113495bSYour Name 		tgt_cfg->obss_color_collision_offloaded = false;
6059*5113495bSYour Name }
6060*5113495bSYour Name 
6061*5113495bSYour Name /**
6062*5113495bSYour Name  * wma_update_restricted_80p80_bw_support() - update restricted 80+80 support
6063*5113495bSYour Name  * @wh: wma handle
6064*5113495bSYour Name  * @tgt_cfg: target configuration to be updated
6065*5113495bSYour Name  *
6066*5113495bSYour Name  * Update restricted 80+80MHz (165MHz) BW support based on service bit.
6067*5113495bSYour Name  *
6068*5113495bSYour Name  * Return: None
6069*5113495bSYour Name  */
wma_update_restricted_80p80_bw_support(tp_wma_handle wh,struct wma_tgt_cfg * tgt_cfg)6070*5113495bSYour Name static void wma_update_restricted_80p80_bw_support(tp_wma_handle wh,
6071*5113495bSYour Name 						   struct wma_tgt_cfg *tgt_cfg)
6072*5113495bSYour Name {
6073*5113495bSYour Name 	if (wmi_service_enabled(wh->wmi_handle,
6074*5113495bSYour Name 				wmi_service_bw_165mhz_support))
6075*5113495bSYour Name 		tgt_cfg->restricted_80p80_bw_supp = true;
6076*5113495bSYour Name 	else
6077*5113495bSYour Name 		tgt_cfg->restricted_80p80_bw_supp = false;
6078*5113495bSYour Name }
6079*5113495bSYour Name 
6080*5113495bSYour Name /**
6081*5113495bSYour Name  * wma_update_aux_dev_caps() - update aux device capability
6082*5113495bSYour Name  * @tgt_hdl: target psoc information
6083*5113495bSYour Name  * @tgt_cfg: target configuration to be updated
6084*5113495bSYour Name  *
6085*5113495bSYour Name  * Update aux device capability to wma_tgt_cfg.
6086*5113495bSYour Name  *
6087*5113495bSYour Name  * Return: None
6088*5113495bSYour Name  */
wma_update_aux_dev_caps(struct target_psoc_info * tgt_hdl,struct wma_tgt_cfg * tgt_cfg)6089*5113495bSYour Name static void wma_update_aux_dev_caps(struct target_psoc_info *tgt_hdl,
6090*5113495bSYour Name 				    struct wma_tgt_cfg *tgt_cfg)
6091*5113495bSYour Name {
6092*5113495bSYour Name 	uint8_t cap_idx;
6093*5113495bSYour Name 	uint32_t num_aux_dev_caps;
6094*5113495bSYour Name 	struct wlan_psoc_host_aux_dev_caps *aux_dev_caps;
6095*5113495bSYour Name 	enum wmi_host_hw_mode_config_type hw_mode_id;
6096*5113495bSYour Name 
6097*5113495bSYour Name 	num_aux_dev_caps  = tgt_hdl->info.service_ext2_param.num_aux_dev_caps;
6098*5113495bSYour Name 	aux_dev_caps = tgt_hdl->info.aux_dev_caps;
6099*5113495bSYour Name 
6100*5113495bSYour Name 	for (cap_idx = 0; cap_idx < num_aux_dev_caps; cap_idx++) {
6101*5113495bSYour Name 		/*current only support AUX0*/
6102*5113495bSYour Name 		if (aux_dev_caps[cap_idx].aux_index != 0)
6103*5113495bSYour Name 			continue;
6104*5113495bSYour Name 
6105*5113495bSYour Name 		hw_mode_id = aux_dev_caps[cap_idx].hw_mode_id;
6106*5113495bSYour Name 		if (hw_mode_id >= WMI_HOST_HW_MODE_MAX) {
6107*5113495bSYour Name 			wma_err("invalid hw mode id %d.", hw_mode_id);
6108*5113495bSYour Name 			continue;
6109*5113495bSYour Name 		}
6110*5113495bSYour Name 		tgt_cfg->wma_aux0_dev_caps[hw_mode_id].supported_modes_bitmap =
6111*5113495bSYour Name 			aux_dev_caps[cap_idx].supported_modes_bitmap;
6112*5113495bSYour Name 		tgt_cfg->wma_aux0_dev_caps[hw_mode_id].listen_pdev_id_map =
6113*5113495bSYour Name 			aux_dev_caps[cap_idx].listen_pdev_id_map;
6114*5113495bSYour Name 		tgt_cfg->wma_aux0_dev_caps[hw_mode_id].emlsr_pdev_id_map =
6115*5113495bSYour Name 			aux_dev_caps[cap_idx].emlsr_pdev_id_map;
6116*5113495bSYour Name 	}
6117*5113495bSYour Name }
6118*5113495bSYour Name 
6119*5113495bSYour Name #ifdef WLAN_SUPPORT_GREEN_AP
wma_green_ap_register_handlers(tp_wma_handle wma_handle)6120*5113495bSYour Name static void wma_green_ap_register_handlers(tp_wma_handle wma_handle)
6121*5113495bSYour Name {
6122*5113495bSYour Name 	if (WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
6123*5113495bSYour Name 				   WMI_SERVICE_EGAP))
6124*5113495bSYour Name 		target_if_green_ap_register_egap_event_handler(
6125*5113495bSYour Name 					wma_handle->pdev);
6126*5113495bSYour Name 
6127*5113495bSYour Name 	target_if_green_ap_register_ll_ps_event_handler(wma_handle->pdev);
6128*5113495bSYour Name 
6129*5113495bSYour Name }
6130*5113495bSYour Name #else
wma_green_ap_register_handlers(tp_wma_handle wma_handle)6131*5113495bSYour Name static inline void wma_green_ap_register_handlers(tp_wma_handle wma_handle)
6132*5113495bSYour Name {
6133*5113495bSYour Name }
6134*5113495bSYour Name #endif
6135*5113495bSYour Name 
6136*5113495bSYour Name #ifdef WLAN_FEATURE_NAN
6137*5113495bSYour Name #ifdef WLAN_FEATURE_11BE_MLO
wma_update_mlo_sta_nan_ndi_target_caps(tp_wma_handle wma_handle,struct wma_tgt_cfg * tgt_cfg)6138*5113495bSYour Name static void wma_update_mlo_sta_nan_ndi_target_caps(tp_wma_handle wma_handle,
6139*5113495bSYour Name 						   struct wma_tgt_cfg *tgt_cfg)
6140*5113495bSYour Name {
6141*5113495bSYour Name 	if (wmi_service_enabled(wma_handle->wmi_handle,
6142*5113495bSYour Name 				wmi_service_mlo_sta_nan_ndi_support))
6143*5113495bSYour Name 		tgt_cfg->nan_caps.mlo_sta_nan_ndi_allowed = 1;
6144*5113495bSYour Name }
6145*5113495bSYour Name #else
wma_update_mlo_sta_nan_ndi_target_caps(tp_wma_handle wma_handle,struct wma_tgt_cfg * tgt_cfg)6146*5113495bSYour Name static void wma_update_mlo_sta_nan_ndi_target_caps(tp_wma_handle wma_handle,
6147*5113495bSYour Name 						   struct wma_tgt_cfg *tgt_cfg)
6148*5113495bSYour Name {
6149*5113495bSYour Name }
6150*5113495bSYour Name #endif /* WLAN_FEATURE_11BE_MLO */
6151*5113495bSYour Name 
wma_update_nan_target_caps(tp_wma_handle wma_handle,struct wma_tgt_cfg * tgt_cfg)6152*5113495bSYour Name static void wma_update_nan_target_caps(tp_wma_handle wma_handle,
6153*5113495bSYour Name 				       struct wma_tgt_cfg *tgt_cfg)
6154*5113495bSYour Name {
6155*5113495bSYour Name 	if (wmi_service_enabled(wma_handle->wmi_handle,
6156*5113495bSYour Name 				wmi_service_nan_disable_support))
6157*5113495bSYour Name 		tgt_cfg->nan_caps.nan_conc_control = 1;
6158*5113495bSYour Name 
6159*5113495bSYour Name 	if (wmi_service_enabled(wma_handle->wmi_handle,
6160*5113495bSYour Name 				wmi_service_nan_dbs_support))
6161*5113495bSYour Name 		tgt_cfg->nan_caps.nan_dbs_supported = 1;
6162*5113495bSYour Name 
6163*5113495bSYour Name 	if (wmi_service_enabled(wma_handle->wmi_handle,
6164*5113495bSYour Name 				wmi_service_ndi_dbs_support))
6165*5113495bSYour Name 		tgt_cfg->nan_caps.ndi_dbs_supported = 1;
6166*5113495bSYour Name 
6167*5113495bSYour Name 	if (wmi_service_enabled(wma_handle->wmi_handle,
6168*5113495bSYour Name 				wmi_service_nan_sap_support))
6169*5113495bSYour Name 		tgt_cfg->nan_caps.nan_sap_supported = 1;
6170*5113495bSYour Name 
6171*5113495bSYour Name 	if (wmi_service_enabled(wma_handle->wmi_handle,
6172*5113495bSYour Name 				wmi_service_ndi_sap_support))
6173*5113495bSYour Name 		tgt_cfg->nan_caps.ndi_sap_supported = 1;
6174*5113495bSYour Name 
6175*5113495bSYour Name 	if (wmi_service_enabled(wma_handle->wmi_handle, wmi_service_nan_vdev))
6176*5113495bSYour Name 		tgt_cfg->nan_caps.nan_vdev_allowed = 1;
6177*5113495bSYour Name 
6178*5113495bSYour Name 	if (wmi_service_enabled(wma_handle->wmi_handle,
6179*5113495bSYour Name 				wmi_service_sta_nan_ndi_four_port))
6180*5113495bSYour Name 		tgt_cfg->nan_caps.sta_nan_ndi_ndi_allowed = 1;
6181*5113495bSYour Name 
6182*5113495bSYour Name 	if (wmi_service_enabled(wma_handle->wmi_handle,
6183*5113495bSYour Name 				wmi_service_ndi_txbf_support))
6184*5113495bSYour Name 		tgt_cfg->nan_caps.ndi_txbf_supported = 1;
6185*5113495bSYour Name 
6186*5113495bSYour Name 	wma_update_mlo_sta_nan_ndi_target_caps(wma_handle, tgt_cfg);
6187*5113495bSYour Name }
6188*5113495bSYour Name #else
wma_update_nan_target_caps(tp_wma_handle wma_handle,struct wma_tgt_cfg * tgt_cfg)6189*5113495bSYour Name static void wma_update_nan_target_caps(tp_wma_handle wma_handle,
6190*5113495bSYour Name 				       struct wma_tgt_cfg *tgt_cfg)
6191*5113495bSYour Name {
6192*5113495bSYour Name }
6193*5113495bSYour Name #endif
6194*5113495bSYour Name 
6195*5113495bSYour Name static uint8_t
wma_convert_chainmask_to_chain(uint8_t chainmask)6196*5113495bSYour Name wma_convert_chainmask_to_chain(uint8_t chainmask)
6197*5113495bSYour Name {
6198*5113495bSYour Name 	uint8_t num_chains = 0;
6199*5113495bSYour Name 
6200*5113495bSYour Name 	while (chainmask) {
6201*5113495bSYour Name 		chainmask &= (chainmask - 1);
6202*5113495bSYour Name 		num_chains++;
6203*5113495bSYour Name 	}
6204*5113495bSYour Name 
6205*5113495bSYour Name 	return num_chains;
6206*5113495bSYour Name }
6207*5113495bSYour Name 
6208*5113495bSYour Name static void
wma_fill_chain_cfg(struct target_psoc_info * tgt_hdl,uint8_t phy)6209*5113495bSYour Name wma_fill_chain_cfg(struct target_psoc_info *tgt_hdl,
6210*5113495bSYour Name 		   uint8_t phy)
6211*5113495bSYour Name {
6212*5113495bSYour Name 	struct mac_context *mac_ctx;
6213*5113495bSYour Name 	uint8_t num_chain;
6214*5113495bSYour Name 	struct wlan_psoc_host_mac_phy_caps *mac_phy_cap =
6215*5113495bSYour Name 						tgt_hdl->info.mac_phy_cap;
6216*5113495bSYour Name 
6217*5113495bSYour Name 	mac_ctx = cds_get_context(QDF_MODULE_ID_PE);
6218*5113495bSYour Name 	if (!mac_ctx) {
6219*5113495bSYour Name 		wma_err("fill chain cfg failed as mac_ctx is NULL");
6220*5113495bSYour Name 		return;
6221*5113495bSYour Name 	}
6222*5113495bSYour Name 
6223*5113495bSYour Name 	num_chain = wma_convert_chainmask_to_chain(mac_phy_cap[phy].
6224*5113495bSYour Name 						   tx_chain_mask_2G);
6225*5113495bSYour Name 
6226*5113495bSYour Name 	if (num_chain > mac_ctx->fw_chain_cfg.max_tx_chains_2g)
6227*5113495bSYour Name 		mac_ctx->fw_chain_cfg.max_tx_chains_2g = num_chain;
6228*5113495bSYour Name 
6229*5113495bSYour Name 	num_chain = wma_convert_chainmask_to_chain(mac_phy_cap[phy].
6230*5113495bSYour Name 						   tx_chain_mask_5G);
6231*5113495bSYour Name 
6232*5113495bSYour Name 	if (num_chain > mac_ctx->fw_chain_cfg.max_tx_chains_5g)
6233*5113495bSYour Name 		mac_ctx->fw_chain_cfg.max_tx_chains_5g = num_chain;
6234*5113495bSYour Name 
6235*5113495bSYour Name 	num_chain = wma_convert_chainmask_to_chain(mac_phy_cap[phy].
6236*5113495bSYour Name 						   rx_chain_mask_2G);
6237*5113495bSYour Name 
6238*5113495bSYour Name 	if (num_chain > mac_ctx->fw_chain_cfg.max_rx_chains_2g)
6239*5113495bSYour Name 		mac_ctx->fw_chain_cfg.max_rx_chains_2g = num_chain;
6240*5113495bSYour Name 
6241*5113495bSYour Name 	num_chain = wma_convert_chainmask_to_chain(mac_phy_cap[phy].
6242*5113495bSYour Name 						   rx_chain_mask_5G);
6243*5113495bSYour Name 
6244*5113495bSYour Name 	if (num_chain > mac_ctx->fw_chain_cfg.max_rx_chains_5g)
6245*5113495bSYour Name 		mac_ctx->fw_chain_cfg.max_rx_chains_5g = num_chain;
6246*5113495bSYour Name }
6247*5113495bSYour Name 
wma_update_mlme_related_tgt_caps(struct wlan_objmgr_psoc * psoc,struct wmi_unified * wmi_handle)6248*5113495bSYour Name static void wma_update_mlme_related_tgt_caps(struct wlan_objmgr_psoc *psoc,
6249*5113495bSYour Name 					     struct wmi_unified *wmi_handle)
6250*5113495bSYour Name {
6251*5113495bSYour Name 	struct mlme_tgt_caps mlme_tgt_cfg;
6252*5113495bSYour Name 
6253*5113495bSYour Name 	mlme_tgt_cfg.data_stall_recovery_fw_support =
6254*5113495bSYour Name 		wmi_service_enabled(wmi_handle,
6255*5113495bSYour Name 				    wmi_service_data_stall_recovery_support);
6256*5113495bSYour Name 
6257*5113495bSYour Name 	mlme_tgt_cfg.bigtk_support =
6258*5113495bSYour Name 		wmi_service_enabled(wmi_handle, wmi_beacon_protection_support);
6259*5113495bSYour Name 
6260*5113495bSYour Name 	mlme_tgt_cfg.stop_all_host_scan_support =
6261*5113495bSYour Name 		wmi_service_enabled(wmi_handle,
6262*5113495bSYour Name 				    wmi_service_host_scan_stop_vdev_all);
6263*5113495bSYour Name 	mlme_tgt_cfg.dual_sta_roam_fw_support =
6264*5113495bSYour Name 		wmi_service_enabled(wmi_handle,
6265*5113495bSYour Name 				    wmi_service_dual_sta_roam_support);
6266*5113495bSYour Name 
6267*5113495bSYour Name 	mlme_tgt_cfg.ocv_support =
6268*5113495bSYour Name 		wmi_service_enabled(wmi_handle,
6269*5113495bSYour Name 				    wmi_service_ocv_support);
6270*5113495bSYour Name 
6271*5113495bSYour Name 	wma_debug("beacon protection support %d, ocv support %d",
6272*5113495bSYour Name 		  mlme_tgt_cfg.bigtk_support, mlme_tgt_cfg.ocv_support);
6273*5113495bSYour Name 
6274*5113495bSYour Name 	/* Call this at last only after filling all the tgt caps */
6275*5113495bSYour Name 	wlan_mlme_update_cfg_with_tgt_caps(psoc, &mlme_tgt_cfg);
6276*5113495bSYour Name }
6277*5113495bSYour Name 
6278*5113495bSYour Name /**
6279*5113495bSYour Name  * wma_update_mlme_aux_dev_caps() - update aux device capability to mlme
6280*5113495bSYour Name  * @psoc: psoc handle
6281*5113495bSYour Name  * @tgt_hdl: target psoc information
6282*5113495bSYour Name  *
6283*5113495bSYour Name  * Update aux device capability to mlme.
6284*5113495bSYour Name  *
6285*5113495bSYour Name  * Return: None
6286*5113495bSYour Name  */
wma_update_mlme_aux_dev_caps(struct wlan_objmgr_psoc * psoc,struct target_psoc_info * tgt_hdl)6287*5113495bSYour Name static void wma_update_mlme_aux_dev_caps(struct wlan_objmgr_psoc *psoc,
6288*5113495bSYour Name 					 struct target_psoc_info *tgt_hdl)
6289*5113495bSYour Name {
6290*5113495bSYour Name 	uint8_t cap_idx;
6291*5113495bSYour Name 	uint32_t num_aux_dev_caps;
6292*5113495bSYour Name 	struct wlan_psoc_host_aux_dev_caps *aux_dev_caps;
6293*5113495bSYour Name 	enum wmi_host_hw_mode_config_type hw_mode_id;
6294*5113495bSYour Name 	struct wlan_mlme_aux_dev_caps
6295*5113495bSYour Name 		wlan_mlme_aux0_dev_caps[WLAN_MLME_HW_MODE_MAX] = {0};
6296*5113495bSYour Name 
6297*5113495bSYour Name 	if (WMI_HOST_HW_MODE_MAX != WLAN_MLME_HW_MODE_MAX)
6298*5113495bSYour Name 		wma_err("struct define mismatch, pls fix it.");
6299*5113495bSYour Name 
6300*5113495bSYour Name 	num_aux_dev_caps =
6301*5113495bSYour Name 		tgt_hdl->info.service_ext2_param.num_aux_dev_caps;
6302*5113495bSYour Name 	aux_dev_caps = tgt_hdl->info.aux_dev_caps;
6303*5113495bSYour Name 
6304*5113495bSYour Name 	for (cap_idx = 0; cap_idx < num_aux_dev_caps; cap_idx++) {
6305*5113495bSYour Name 		/*current only support AUX0*/
6306*5113495bSYour Name 		if (aux_dev_caps[cap_idx].aux_index != 0)
6307*5113495bSYour Name 			continue;
6308*5113495bSYour Name 
6309*5113495bSYour Name 		hw_mode_id = aux_dev_caps[cap_idx].hw_mode_id;
6310*5113495bSYour Name 		if (hw_mode_id >= WMI_HOST_HW_MODE_MAX) {
6311*5113495bSYour Name 			wma_err("invalid hw mode id %d.", hw_mode_id);
6312*5113495bSYour Name 			continue;
6313*5113495bSYour Name 		}
6314*5113495bSYour Name 		wlan_mlme_aux0_dev_caps[hw_mode_id].supported_modes_bitmap =
6315*5113495bSYour Name 				aux_dev_caps[cap_idx].supported_modes_bitmap;
6316*5113495bSYour Name 		wlan_mlme_aux0_dev_caps[hw_mode_id].listen_pdev_id_map =
6317*5113495bSYour Name 				aux_dev_caps[cap_idx].listen_pdev_id_map;
6318*5113495bSYour Name 		wlan_mlme_aux0_dev_caps[hw_mode_id].emlsr_pdev_id_map =
6319*5113495bSYour Name 				aux_dev_caps[cap_idx].emlsr_pdev_id_map;
6320*5113495bSYour Name 	}
6321*5113495bSYour Name 
6322*5113495bSYour Name 	wlan_mlme_update_aux_dev_caps(psoc, wlan_mlme_aux0_dev_caps);
6323*5113495bSYour Name }
6324*5113495bSYour Name 
6325*5113495bSYour Name static bool
wma_is_dbs_mandatory(struct wlan_objmgr_psoc * psoc,struct target_psoc_info * tgt_hdl)6326*5113495bSYour Name wma_is_dbs_mandatory(struct wlan_objmgr_psoc *psoc,
6327*5113495bSYour Name 		     struct target_psoc_info *tgt_hdl)
6328*5113495bSYour Name {
6329*5113495bSYour Name 	uint8_t i, total_mac_phy_cnt;
6330*5113495bSYour Name 	struct wlan_psoc_host_mac_phy_caps *mac_cap, *mac_phy_cap;
6331*5113495bSYour Name 	uint8_t supported_band = 0;
6332*5113495bSYour Name 
6333*5113495bSYour Name 	if (!policy_mgr_find_if_fw_supports_dbs(psoc) ||
6334*5113495bSYour Name 	    !policy_mgr_find_if_hwlist_has_dbs(psoc)) {
6335*5113495bSYour Name 		wma_debug("DBS is not mandatory");
6336*5113495bSYour Name 		return false;
6337*5113495bSYour Name 	}
6338*5113495bSYour Name 
6339*5113495bSYour Name 	total_mac_phy_cnt = target_psoc_get_total_mac_phy_cnt(tgt_hdl);
6340*5113495bSYour Name 	mac_phy_cap = target_psoc_get_mac_phy_cap(tgt_hdl);
6341*5113495bSYour Name 	if (!mac_phy_cap) {
6342*5113495bSYour Name 		wma_err("Invalid MAC PHY capabilities handle");
6343*5113495bSYour Name 		return false;
6344*5113495bSYour Name 	}
6345*5113495bSYour Name 
6346*5113495bSYour Name 
6347*5113495bSYour Name 	for (i = 0; i < total_mac_phy_cnt; i++) {
6348*5113495bSYour Name 		mac_cap = &mac_phy_cap[i];
6349*5113495bSYour Name 		if (mac_cap && (mac_cap->phy_id == 0))
6350*5113495bSYour Name 			supported_band |= mac_cap->supported_bands;
6351*5113495bSYour Name 	}
6352*5113495bSYour Name 
6353*5113495bSYour Name 	/* If Mac0 supports both the bands then DBS is not mandatory */
6354*5113495bSYour Name 	if (supported_band & WLAN_2G_CAPABILITY &&
6355*5113495bSYour Name 	    supported_band & WLAN_5G_CAPABILITY) {
6356*5113495bSYour Name 		wma_debug("Mac0 supports both bands DBS is optional");
6357*5113495bSYour Name 		return false;
6358*5113495bSYour Name 	}
6359*5113495bSYour Name 
6360*5113495bSYour Name 	wma_info("MAC0 does not support both bands %d DBS is mandatory",
6361*5113495bSYour Name 		 supported_band);
6362*5113495bSYour Name 
6363*5113495bSYour Name 	return true;
6364*5113495bSYour Name }
6365*5113495bSYour Name 
6366*5113495bSYour Name /**
6367*5113495bSYour Name  * wma_update_hdd_cfg() - update HDD config
6368*5113495bSYour Name  * @wma_handle: wma handle
6369*5113495bSYour Name  *
6370*5113495bSYour Name  * Return: Zero on success err number on failure
6371*5113495bSYour Name  */
wma_update_hdd_cfg(tp_wma_handle wma_handle)6372*5113495bSYour Name static int wma_update_hdd_cfg(tp_wma_handle wma_handle)
6373*5113495bSYour Name {
6374*5113495bSYour Name 	struct wma_tgt_cfg tgt_cfg;
6375*5113495bSYour Name 	void *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
6376*5113495bSYour Name 	target_resource_config *wlan_res_cfg;
6377*5113495bSYour Name 	struct wlan_psoc_host_service_ext_param *service_ext_param;
6378*5113495bSYour Name 	struct target_psoc_info *tgt_hdl;
6379*5113495bSYour Name 	struct wmi_unified *wmi_handle;
6380*5113495bSYour Name 	uint8_t i;
6381*5113495bSYour Name 	int ret;
6382*5113495bSYour Name 
6383*5113495bSYour Name 	wma_debug("Enter");
6384*5113495bSYour Name 
6385*5113495bSYour Name 	tgt_hdl = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
6386*5113495bSYour Name 	if (!tgt_hdl) {
6387*5113495bSYour Name 		wma_err("target psoc info is NULL");
6388*5113495bSYour Name 		return -EINVAL;
6389*5113495bSYour Name 	}
6390*5113495bSYour Name 
6391*5113495bSYour Name 	wlan_res_cfg = target_psoc_get_wlan_res_cfg(tgt_hdl);
6392*5113495bSYour Name 	if (!wlan_res_cfg) {
6393*5113495bSYour Name 		wma_err("wlan_res_cfg is null");
6394*5113495bSYour Name 		return -EINVAL;
6395*5113495bSYour Name 	}
6396*5113495bSYour Name 
6397*5113495bSYour Name 	service_ext_param =
6398*5113495bSYour Name 			target_psoc_get_service_ext_param(tgt_hdl);
6399*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(wma_handle->psoc);
6400*5113495bSYour Name 	if (wmi_validate_handle(wmi_handle))
6401*5113495bSYour Name 		return -EINVAL;
6402*5113495bSYour Name 
6403*5113495bSYour Name 	wma_update_mlme_related_tgt_caps(wma_handle->psoc, wmi_handle);
6404*5113495bSYour Name 	wma_update_mlme_aux_dev_caps(wma_handle->psoc, tgt_hdl);
6405*5113495bSYour Name 
6406*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_peer_create_conf))
6407*5113495bSYour Name 		wlan_psoc_nif_fw_ext_cap_set(wma_handle->psoc,
6408*5113495bSYour Name 					     WLAN_SOC_F_PEER_CREATE_RESP);
6409*5113495bSYour Name 
6410*5113495bSYour Name 	qdf_mem_zero(&tgt_cfg, sizeof(struct wma_tgt_cfg));
6411*5113495bSYour Name 
6412*5113495bSYour Name 	tgt_cfg.sub_20_support = wma_handle->sub_20_support;
6413*5113495bSYour Name 	tgt_cfg.reg_domain = wma_handle->reg_cap.eeprom_rd;
6414*5113495bSYour Name 	tgt_cfg.eeprom_rd_ext = wma_handle->reg_cap.eeprom_rd_ext;
6415*5113495bSYour Name 
6416*5113495bSYour Name 	tgt_cfg.max_intf_count = wlan_res_cfg->num_vdevs;
6417*5113495bSYour Name 	policy_mgr_set_max_conc_cxns(wma_handle->psoc,
6418*5113495bSYour Name 				     wlan_res_cfg->num_max_active_vdevs);
6419*5113495bSYour Name 
6420*5113495bSYour Name 	qdf_mem_copy(tgt_cfg.hw_macaddr.bytes, wma_handle->hwaddr,
6421*5113495bSYour Name 		     ATH_MAC_LEN);
6422*5113495bSYour Name 
6423*5113495bSYour Name 	wma_update_target_services(wmi_handle, &tgt_cfg.services);
6424*5113495bSYour Name 	wma_update_target_ht_cap(tgt_hdl, &tgt_cfg.ht_cap);
6425*5113495bSYour Name 	wma_update_target_vht_cap(tgt_hdl, &tgt_cfg.vht_cap);
6426*5113495bSYour Name 	/*
6427*5113495bSYour Name 	 * This will overwrite the structure filled by wma_update_target_ht_cap
6428*5113495bSYour Name 	 * and wma_update_target_vht_cap APIs.
6429*5113495bSYour Name 	 */
6430*5113495bSYour Name 	wma_update_target_ext_ht_cap(tgt_hdl, &tgt_cfg.ht_cap);
6431*5113495bSYour Name 	wma_update_target_ext_vht_cap(tgt_hdl, &tgt_cfg.vht_cap);
6432*5113495bSYour Name 
6433*5113495bSYour Name 	wma_update_target_ext_he_cap(tgt_hdl, &tgt_cfg);
6434*5113495bSYour Name 	wma_update_target_ext_eht_cap(tgt_hdl, &tgt_cfg);
6435*5113495bSYour Name 
6436*5113495bSYour Name 	tgt_cfg.target_fw_version = target_if_get_fw_version(tgt_hdl);
6437*5113495bSYour Name 	if (service_ext_param)
6438*5113495bSYour Name 		tgt_cfg.target_fw_vers_ext =
6439*5113495bSYour Name 				service_ext_param->fw_build_vers_ext;
6440*5113495bSYour Name 
6441*5113495bSYour Name 	tgt_cfg.hw_bd_id = wma_handle->hw_bd_id;
6442*5113495bSYour Name 	tgt_cfg.hw_bd_info.bdf_version = wma_handle->hw_bd_info[BDF_VERSION];
6443*5113495bSYour Name 	tgt_cfg.hw_bd_info.ref_design_id =
6444*5113495bSYour Name 		wma_handle->hw_bd_info[REF_DESIGN_ID];
6445*5113495bSYour Name 	tgt_cfg.hw_bd_info.customer_id = wma_handle->hw_bd_info[CUSTOMER_ID];
6446*5113495bSYour Name 	tgt_cfg.hw_bd_info.project_id = wma_handle->hw_bd_info[PROJECT_ID];
6447*5113495bSYour Name 	tgt_cfg.hw_bd_info.board_data_rev =
6448*5113495bSYour Name 		wma_handle->hw_bd_info[BOARD_DATA_REV];
6449*5113495bSYour Name 
6450*5113495bSYour Name #ifdef WLAN_FEATURE_LPSS
6451*5113495bSYour Name 	tgt_cfg.lpss_support = wma_handle->lpss_support;
6452*5113495bSYour Name #endif /* WLAN_FEATURE_LPSS */
6453*5113495bSYour Name 	tgt_cfg.ap_arpns_support = wma_handle->ap_arpns_support;
6454*5113495bSYour Name 	tgt_cfg.dfs_cac_offload = wma_handle->is_dfs_offloaded;
6455*5113495bSYour Name 	tgt_cfg.rcpi_enabled = wma_handle->rcpi_enabled;
6456*5113495bSYour Name 	wma_update_hdd_band_cap(target_if_get_phy_capability(tgt_hdl),
6457*5113495bSYour Name 				&tgt_cfg, wma_handle->psoc);
6458*5113495bSYour Name 	wma_update_sar_version(service_ext_param, &tgt_cfg);
6459*5113495bSYour Name 	tgt_cfg.fine_time_measurement_cap =
6460*5113495bSYour Name 		target_if_get_wmi_fw_sub_feat_caps(tgt_hdl);
6461*5113495bSYour Name 	tgt_cfg.wmi_max_len = wmi_get_max_msg_len(wma_handle->wmi_handle)
6462*5113495bSYour Name 			      - WMI_TLV_HEADROOM;
6463*5113495bSYour Name 	tgt_cfg.tx_bfee_8ss_enabled = wma_handle->tx_bfee_8ss_enabled;
6464*5113495bSYour Name 	tgt_cfg.dynamic_nss_chains_support =
6465*5113495bSYour Name 				wma_handle->dynamic_nss_chains_support;
6466*5113495bSYour Name 	wma_update_obss_detection_support(wma_handle, &tgt_cfg);
6467*5113495bSYour Name 	wma_update_obss_color_collision_support(wma_handle, &tgt_cfg);
6468*5113495bSYour Name 	wma_update_hdd_cfg_ndp(wma_handle, &tgt_cfg);
6469*5113495bSYour Name 	wma_update_nan_target_caps(wma_handle, &tgt_cfg);
6470*5113495bSYour Name 	wma_update_bcast_twt_support(wma_handle, &tgt_cfg);
6471*5113495bSYour Name 	wma_update_twt_tgt_cap(wma_handle, &tgt_cfg);
6472*5113495bSYour Name 	wma_update_restricted_80p80_bw_support(wma_handle, &tgt_cfg);
6473*5113495bSYour Name 	wma_update_aux_dev_caps(tgt_hdl, &tgt_cfg);
6474*5113495bSYour Name 	/* Take the max of chains supported by FW, which will limit nss */
6475*5113495bSYour Name 	for (i = 0; i < tgt_hdl->info.total_mac_phy_cnt; i++)
6476*5113495bSYour Name 		wma_fill_chain_cfg(tgt_hdl, i);
6477*5113495bSYour Name 
6478*5113495bSYour Name 	ret = wma_handle->tgt_cfg_update_cb(hdd_ctx, &tgt_cfg);
6479*5113495bSYour Name 	if (ret)
6480*5113495bSYour Name 		return -EINVAL;
6481*5113495bSYour Name 
6482*5113495bSYour Name 	wma_green_ap_register_handlers(wma_handle);
6483*5113495bSYour Name 
6484*5113495bSYour Name 	return ret;
6485*5113495bSYour Name }
6486*5113495bSYour Name 
6487*5113495bSYour Name /**
6488*5113495bSYour Name  * wma_init_scan_fw_mode_config() - Initialize scan/fw mode config
6489*5113495bSYour Name  * @psoc: Object manager psoc
6490*5113495bSYour Name  * @scan_config: Scam mode configuration
6491*5113495bSYour Name  * @fw_config: FW mode configuration
6492*5113495bSYour Name  *
6493*5113495bSYour Name  * Enables all the valid bits of concurrent_scan_config_bits and
6494*5113495bSYour Name  * fw_mode_config_bits.
6495*5113495bSYour Name  *
6496*5113495bSYour Name  * Return: None
6497*5113495bSYour Name  */
wma_init_scan_fw_mode_config(struct wlan_objmgr_psoc * psoc,uint32_t scan_config,uint32_t fw_config)6498*5113495bSYour Name static void wma_init_scan_fw_mode_config(struct wlan_objmgr_psoc *psoc,
6499*5113495bSYour Name 					 uint32_t scan_config,
6500*5113495bSYour Name 					 uint32_t fw_config)
6501*5113495bSYour Name {
6502*5113495bSYour Name 	wma_debug("Enter");
6503*5113495bSYour Name 
6504*5113495bSYour Name 	if (!psoc) {
6505*5113495bSYour Name 		wma_err("obj psoc is NULL");
6506*5113495bSYour Name 		return;
6507*5113495bSYour Name 	}
6508*5113495bSYour Name 
6509*5113495bSYour Name 	policy_mgr_init_dbs_config(psoc, scan_config, fw_config);
6510*5113495bSYour Name 	policy_mgr_init_sbs_fw_config(psoc, fw_config);
6511*5113495bSYour Name 
6512*5113495bSYour Name 	wma_debug("Exit");
6513*5113495bSYour Name }
6514*5113495bSYour Name 
wma_set_pmo_caps(struct wlan_objmgr_psoc * psoc)6515*5113495bSYour Name static void wma_set_pmo_caps(struct wlan_objmgr_psoc *psoc)
6516*5113495bSYour Name {
6517*5113495bSYour Name 	QDF_STATUS status;
6518*5113495bSYour Name 	tp_wma_handle wma;
6519*5113495bSYour Name 	struct pmo_device_caps caps;
6520*5113495bSYour Name 
6521*5113495bSYour Name 	wma = cds_get_context(QDF_MODULE_ID_WMA);
6522*5113495bSYour Name 	if (!wma)
6523*5113495bSYour Name 		return;
6524*5113495bSYour Name 
6525*5113495bSYour Name 	caps.arp_ns_offload =
6526*5113495bSYour Name 		wmi_service_enabled(wma->wmi_handle, wmi_service_arpns_offload);
6527*5113495bSYour Name 	caps.apf =
6528*5113495bSYour Name 		wmi_service_enabled(wma->wmi_handle, wmi_service_apf_offload);
6529*5113495bSYour Name 	caps.packet_filter =
6530*5113495bSYour Name 		wmi_service_enabled(wma->wmi_handle,
6531*5113495bSYour Name 				    wmi_service_packet_filter_offload);
6532*5113495bSYour Name 	caps.unified_wow =
6533*5113495bSYour Name 		wmi_service_enabled(wma->wmi_handle,
6534*5113495bSYour Name 				    wmi_service_unified_wow_capability);
6535*5113495bSYour Name 	caps.li_offload =
6536*5113495bSYour Name 		wmi_service_enabled(wma->wmi_handle,
6537*5113495bSYour Name 				    wmi_service_listen_interval_offload_support
6538*5113495bSYour Name 				    );
6539*5113495bSYour Name 
6540*5113495bSYour Name 	status = ucfg_pmo_psoc_set_caps(psoc, &caps);
6541*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
6542*5113495bSYour Name 		wma_err("Failed to set PMO capabilities; status:%d", status);
6543*5113495bSYour Name }
6544*5113495bSYour Name 
6545*5113495bSYour Name /**
6546*5113495bSYour Name  * wma_set_mlme_caps() - Populate the MLME related target capabilities to the
6547*5113495bSYour Name  * mlme component
6548*5113495bSYour Name  * @psoc: Pointer to psoc object
6549*5113495bSYour Name  *
6550*5113495bSYour Name  * Return: None
6551*5113495bSYour Name  */
wma_set_mlme_caps(struct wlan_objmgr_psoc * psoc)6552*5113495bSYour Name static void wma_set_mlme_caps(struct wlan_objmgr_psoc *psoc)
6553*5113495bSYour Name {
6554*5113495bSYour Name 	tp_wma_handle wma;
6555*5113495bSYour Name 	bool tgt_cap;
6556*5113495bSYour Name 	uint32_t akm_bitmap = 0;
6557*5113495bSYour Name 	QDF_STATUS status;
6558*5113495bSYour Name 
6559*5113495bSYour Name 	wma = cds_get_context(QDF_MODULE_ID_WMA);
6560*5113495bSYour Name 	if (!wma)
6561*5113495bSYour Name 		return;
6562*5113495bSYour Name 
6563*5113495bSYour Name 	tgt_cap = wmi_service_enabled(wma->wmi_handle,
6564*5113495bSYour Name 				      wmi_service_adaptive_11r_support);
6565*5113495bSYour Name 
6566*5113495bSYour Name 	status = ucfg_mlme_set_tgt_adaptive_11r_cap(psoc, tgt_cap);
6567*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
6568*5113495bSYour Name 		wma_err("Failed to set adaptive 11r cap");
6569*5113495bSYour Name 
6570*5113495bSYour Name 	tgt_cap = wmi_service_enabled(wma->wmi_handle,
6571*5113495bSYour Name 				      wmi_service_wpa3_ft_sae_support);
6572*5113495bSYour Name 	if (tgt_cap)
6573*5113495bSYour Name 		 akm_bitmap |= (1 << AKM_FT_SAE);
6574*5113495bSYour Name 
6575*5113495bSYour Name 	tgt_cap = wmi_service_enabled(wma->wmi_handle,
6576*5113495bSYour Name 				      wmi_service_wpa3_ft_suite_b_support);
6577*5113495bSYour Name 	if (tgt_cap)
6578*5113495bSYour Name 		akm_bitmap |= (1 << AKM_FT_SUITEB_SHA384);
6579*5113495bSYour Name 
6580*5113495bSYour Name 	tgt_cap = wmi_service_enabled(wma->wmi_handle,
6581*5113495bSYour Name 				      wmi_service_ft_fils);
6582*5113495bSYour Name 	if (tgt_cap)
6583*5113495bSYour Name 		akm_bitmap |= (1 << AKM_FT_FILS);
6584*5113495bSYour Name 
6585*5113495bSYour Name 	tgt_cap = wmi_service_enabled(wma->wmi_handle,
6586*5113495bSYour Name 				      wmi_service_owe_roam_support);
6587*5113495bSYour Name 	if (tgt_cap)
6588*5113495bSYour Name 		akm_bitmap |= (1 << AKM_OWE);
6589*5113495bSYour Name 
6590*5113495bSYour Name 	tgt_cap = wmi_service_enabled(wma->wmi_handle,
6591*5113495bSYour Name 				      wmi_service_sae_roam_support);
6592*5113495bSYour Name 	if (tgt_cap)
6593*5113495bSYour Name 		akm_bitmap |= (1 << AKM_SAE);
6594*5113495bSYour Name 
6595*5113495bSYour Name 	tgt_cap = wmi_service_enabled(wma->wmi_handle,
6596*5113495bSYour Name 				      wmi_service_suiteb_roam_support);
6597*5113495bSYour Name 	if (tgt_cap)
6598*5113495bSYour Name 		akm_bitmap |= (1 << AKM_SUITEB);
6599*5113495bSYour Name 
6600*5113495bSYour Name 	tgt_cap = wmi_service_enabled(wma->wmi_handle,
6601*5113495bSYour Name 				      wmi_service_wpa3_sha384_roam_support);
6602*5113495bSYour Name 	if (tgt_cap)
6603*5113495bSYour Name 		akm_bitmap |= (1 << AKM_SAE_EXT);
6604*5113495bSYour Name 
6605*5113495bSYour Name 	status = mlme_set_tgt_wpa3_roam_cap(psoc, akm_bitmap);
6606*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
6607*5113495bSYour Name 		wma_err("Failed to set sae roam support");
6608*5113495bSYour Name }
6609*5113495bSYour Name 
6610*5113495bSYour Name #ifdef WLAN_FEATURE_BIG_DATA_STATS
wma_is_big_data_support_enable(struct wmi_unified * wmi_handle)6611*5113495bSYour Name static bool wma_is_big_data_support_enable(struct wmi_unified *wmi_handle)
6612*5113495bSYour Name {
6613*5113495bSYour Name 	return wmi_service_enabled(wmi_handle, wmi_service_big_data_support);
6614*5113495bSYour Name }
6615*5113495bSYour Name #else
wma_is_big_data_support_enable(struct wmi_unified * wmi_handle)6616*5113495bSYour Name static bool wma_is_big_data_support_enable(struct wmi_unified *wmi_handle)
6617*5113495bSYour Name {
6618*5113495bSYour Name 	return false;
6619*5113495bSYour Name }
6620*5113495bSYour Name #endif
6621*5113495bSYour Name 
6622*5113495bSYour Name /**
6623*5113495bSYour Name  * wma_set_mc_cp_caps() - Populate mc cp component related capabilities
6624*5113495bSYour Name  *			  to the mc cp component
6625*5113495bSYour Name  *
6626*5113495bSYour Name  * @psoc: Pointer to psoc object
6627*5113495bSYour Name  *
6628*5113495bSYour Name  * Return: None
6629*5113495bSYour Name  */
wma_set_mc_cp_caps(struct wlan_objmgr_psoc * psoc)6630*5113495bSYour Name static void wma_set_mc_cp_caps(struct wlan_objmgr_psoc *psoc)
6631*5113495bSYour Name {
6632*5113495bSYour Name 	tp_wma_handle wma;
6633*5113495bSYour Name 
6634*5113495bSYour Name 	wma = cds_get_context(QDF_MODULE_ID_WMA);
6635*5113495bSYour Name 	if (!wma)
6636*5113495bSYour Name 		return;
6637*5113495bSYour Name 
6638*5113495bSYour Name 	if (wma_is_big_data_support_enable(wma->wmi_handle))
6639*5113495bSYour Name 		ucfg_mc_cp_set_big_data_fw_support(psoc, true);
6640*5113495bSYour Name 	else
6641*5113495bSYour Name 		ucfg_mc_cp_set_big_data_fw_support(psoc, false);
6642*5113495bSYour Name }
6643*5113495bSYour Name 
6644*5113495bSYour Name #ifdef THERMAL_STATS_SUPPORT
wma_set_thermal_stats_fw_cap(tp_wma_handle wma,struct wlan_fwol_capability_info * cap)6645*5113495bSYour Name static void wma_set_thermal_stats_fw_cap(tp_wma_handle wma,
6646*5113495bSYour Name 					 struct wlan_fwol_capability_info *cap)
6647*5113495bSYour Name {
6648*5113495bSYour Name 	cap->fw_thermal_stats_cap = wmi_service_enabled(wma->wmi_handle,
6649*5113495bSYour Name 				wmi_service_thermal_stats_temp_range_supported);
6650*5113495bSYour Name }
6651*5113495bSYour Name #else
wma_set_thermal_stats_fw_cap(tp_wma_handle wma,struct wlan_fwol_capability_info * cap)6652*5113495bSYour Name static void wma_set_thermal_stats_fw_cap(tp_wma_handle wma,
6653*5113495bSYour Name 					 struct wlan_fwol_capability_info *cap)
6654*5113495bSYour Name {
6655*5113495bSYour Name }
6656*5113495bSYour Name #endif
6657*5113495bSYour Name 
6658*5113495bSYour Name /**
6659*5113495bSYour Name  * wma_set_fwol_caps() - Populate fwol component related capabilities
6660*5113495bSYour Name  *			 to the fwol component
6661*5113495bSYour Name  *
6662*5113495bSYour Name  * @psoc: Pointer to psoc object
6663*5113495bSYour Name  *
6664*5113495bSYour Name  * Return: None
6665*5113495bSYour Name  */
wma_set_fwol_caps(struct wlan_objmgr_psoc * psoc)6666*5113495bSYour Name static void wma_set_fwol_caps(struct wlan_objmgr_psoc *psoc)
6667*5113495bSYour Name {
6668*5113495bSYour Name 	tp_wma_handle wma;
6669*5113495bSYour Name 	struct wlan_fwol_capability_info cap_info;
6670*5113495bSYour Name 	wma = cds_get_context(QDF_MODULE_ID_WMA);
6671*5113495bSYour Name 
6672*5113495bSYour Name 	if (!wma) {
6673*5113495bSYour Name 		wma_err_rl("wma Null");
6674*5113495bSYour Name 		return;
6675*5113495bSYour Name 	}
6676*5113495bSYour Name 	if (!psoc) {
6677*5113495bSYour Name 		wma_err_rl("psoc Null");
6678*5113495bSYour Name 		return;
6679*5113495bSYour Name 	}
6680*5113495bSYour Name 
6681*5113495bSYour Name 	wma_set_thermal_stats_fw_cap(wma, &cap_info);
6682*5113495bSYour Name 	ucfg_fwol_update_fw_cap_info(psoc, &cap_info);
6683*5113495bSYour Name }
wma_set_component_caps(struct wlan_objmgr_psoc * psoc)6684*5113495bSYour Name static void wma_set_component_caps(struct wlan_objmgr_psoc *psoc)
6685*5113495bSYour Name {
6686*5113495bSYour Name 	wma_set_pmo_caps(psoc);
6687*5113495bSYour Name 	wma_set_mlme_caps(psoc);
6688*5113495bSYour Name 	wma_set_mc_cp_caps(psoc);
6689*5113495bSYour Name 	wma_set_fwol_caps(psoc);
6690*5113495bSYour Name }
6691*5113495bSYour Name 
6692*5113495bSYour Name #if defined(WLAN_FEATURE_GTK_OFFLOAD) && defined(WLAN_POWER_MANAGEMENT_OFFLOAD)
wma_register_gtk_offload_event(tp_wma_handle wma_handle)6693*5113495bSYour Name static QDF_STATUS wma_register_gtk_offload_event(tp_wma_handle wma_handle)
6694*5113495bSYour Name {
6695*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
6696*5113495bSYour Name 
6697*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
6698*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
6699*5113495bSYour Name 
6700*5113495bSYour Name 	if (wmi_service_enabled(wma_handle->wmi_handle,
6701*5113495bSYour Name 				wmi_service_gtk_offload)) {
6702*5113495bSYour Name 		status = wmi_unified_register_event_handler(
6703*5113495bSYour Name 					wma_handle->wmi_handle,
6704*5113495bSYour Name 					wmi_gtk_offload_status_event_id,
6705*5113495bSYour Name 					target_if_pmo_gtk_offload_status_event,
6706*5113495bSYour Name 					WMA_RX_WORK_CTX);
6707*5113495bSYour Name 	}
6708*5113495bSYour Name 	return status;
6709*5113495bSYour Name }
6710*5113495bSYour Name #else
wma_register_gtk_offload_event(tp_wma_handle wma_handle)6711*5113495bSYour Name static QDF_STATUS wma_register_gtk_offload_event(tp_wma_handle wma_handle)
6712*5113495bSYour Name {
6713*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
6714*5113495bSYour Name }
6715*5113495bSYour Name #endif /* WLAN_FEATURE_GTK_OFFLOAD && WLAN_POWER_MANAGEMENT_OFFLOAD */
6716*5113495bSYour Name 
6717*5113495bSYour Name /**
6718*5113495bSYour Name  * wma_rx_service_ready_event() - event handler to process
6719*5113495bSYour Name  *                                wmi rx service ready event.
6720*5113495bSYour Name  * @handle: wma handle
6721*5113495bSYour Name  * @cmd_param_info: command params info
6722*5113495bSYour Name  * @length: param length
6723*5113495bSYour Name  *
6724*5113495bSYour Name  * Return: none
6725*5113495bSYour Name  */
wma_rx_service_ready_event(void * handle,uint8_t * cmd_param_info,uint32_t length)6726*5113495bSYour Name int wma_rx_service_ready_event(void *handle, uint8_t *cmd_param_info,
6727*5113495bSYour Name 			       uint32_t length)
6728*5113495bSYour Name {
6729*5113495bSYour Name 	tp_wma_handle wma_handle = (tp_wma_handle) handle;
6730*5113495bSYour Name 	WMI_SERVICE_READY_EVENTID_param_tlvs *param_buf;
6731*5113495bSYour Name 	wmi_service_ready_event_fixed_param *ev;
6732*5113495bSYour Name 	QDF_STATUS status;
6733*5113495bSYour Name 	uint32_t *ev_wlan_dbs_hw_mode_list;
6734*5113495bSYour Name 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
6735*5113495bSYour Name 	struct target_psoc_info *tgt_hdl;
6736*5113495bSYour Name 	struct wlan_psoc_target_capability_info *tgt_cap_info;
6737*5113495bSYour Name 	target_resource_config *wlan_res_cfg;
6738*5113495bSYour Name 	struct wmi_unified *wmi_handle;
6739*5113495bSYour Name 	uint32_t *service_bitmap;
6740*5113495bSYour Name 
6741*5113495bSYour Name 	wma_debug("Enter");
6742*5113495bSYour Name 
6743*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
6744*5113495bSYour Name 		return -EINVAL;
6745*5113495bSYour Name 
6746*5113495bSYour Name 	tgt_hdl = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
6747*5113495bSYour Name 	if (!tgt_hdl) {
6748*5113495bSYour Name 		wma_err("target psoc info is NULL");
6749*5113495bSYour Name 		return -EINVAL;
6750*5113495bSYour Name 	}
6751*5113495bSYour Name 
6752*5113495bSYour Name 	wlan_res_cfg = target_psoc_get_wlan_res_cfg(tgt_hdl);
6753*5113495bSYour Name 	tgt_cap_info = target_psoc_get_target_caps(tgt_hdl);
6754*5113495bSYour Name 	service_bitmap = target_psoc_get_service_bitmap(tgt_hdl);
6755*5113495bSYour Name 
6756*5113495bSYour Name 	param_buf = (WMI_SERVICE_READY_EVENTID_param_tlvs *) cmd_param_info;
6757*5113495bSYour Name 	if (!param_buf) {
6758*5113495bSYour Name 		wma_err("Invalid arguments");
6759*5113495bSYour Name 		return -EINVAL;
6760*5113495bSYour Name 	}
6761*5113495bSYour Name 
6762*5113495bSYour Name 	ev = param_buf->fixed_param;
6763*5113495bSYour Name 	if (!ev) {
6764*5113495bSYour Name 		wma_err("Invalid buffer");
6765*5113495bSYour Name 		return -EINVAL;
6766*5113495bSYour Name 	}
6767*5113495bSYour Name 
6768*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(wma_handle->psoc);
6769*5113495bSYour Name 	if (wmi_validate_handle(wmi_handle))
6770*5113495bSYour Name 		return -EINVAL;
6771*5113495bSYour Name 
6772*5113495bSYour Name 	wma_debug("WMA <-- WMI_SERVICE_READY_EVENTID");
6773*5113495bSYour Name 
6774*5113495bSYour Name 	if (ev->num_dbs_hw_modes > param_buf->num_wlan_dbs_hw_mode_list) {
6775*5113495bSYour Name 		wma_err("FW dbs_hw_mode entry %d more than value %d in TLV hdr",
6776*5113495bSYour Name 			ev->num_dbs_hw_modes,
6777*5113495bSYour Name 			param_buf->num_wlan_dbs_hw_mode_list);
6778*5113495bSYour Name 		return -EINVAL;
6779*5113495bSYour Name 	}
6780*5113495bSYour Name 
6781*5113495bSYour Name 	ev_wlan_dbs_hw_mode_list = param_buf->wlan_dbs_hw_mode_list;
6782*5113495bSYour Name 
6783*5113495bSYour Name 	/* Continuing with the rest of the processing,
6784*5113495bSYour Name 	 * even if memory allocation fails
6785*5113495bSYour Name 	 */
6786*5113495bSYour Name 	policy_mgr_init_dbs_hw_mode(wma_handle->psoc, ev->num_dbs_hw_modes,
6787*5113495bSYour Name 				    ev_wlan_dbs_hw_mode_list);
6788*5113495bSYour Name 
6789*5113495bSYour Name 	/* Initializes the fw_mode and scan_config to zero.
6790*5113495bSYour Name 	 * If ext service ready event is present it will set
6791*5113495bSYour Name 	 * the actual values of these two params.
6792*5113495bSYour Name 	 * This is to ensure that no garbage values would be
6793*5113495bSYour Name 	 * present in the absence of ext service ready event.
6794*5113495bSYour Name 	 */
6795*5113495bSYour Name 	wma_init_scan_fw_mode_config(wma_handle->psoc, 0, 0);
6796*5113495bSYour Name 
6797*5113495bSYour Name 	qdf_mem_copy(&wma_handle->reg_cap, param_buf->hal_reg_capabilities,
6798*5113495bSYour Name 				 sizeof(HAL_REG_CAPABILITIES));
6799*5113495bSYour Name 
6800*5113495bSYour Name 	wma_handle->vht_supp_mcs = ev->vht_supp_mcs;
6801*5113495bSYour Name 
6802*5113495bSYour Name 	wma_handle->new_hw_mode_index = tgt_cap_info->default_dbs_hw_mode_index;
6803*5113495bSYour Name 	policy_mgr_update_new_hw_mode_index(wma_handle->psoc,
6804*5113495bSYour Name 	tgt_cap_info->default_dbs_hw_mode_index);
6805*5113495bSYour Name 
6806*5113495bSYour Name 	wma_debug("Firmware default hw mode index : %d",
6807*5113495bSYour Name 		 tgt_cap_info->default_dbs_hw_mode_index);
6808*5113495bSYour Name 	wma_info("Firmware build version : %08x",
6809*5113495bSYour Name 		 ev->fw_build_vers);
6810*5113495bSYour Name 	wma_debug("FW fine time meas cap: 0x%x",
6811*5113495bSYour Name 		 tgt_cap_info->wmi_fw_sub_feat_caps);
6812*5113495bSYour Name 
6813*5113495bSYour Name 	wma_handle->hw_bd_id = ev->hw_bd_id;
6814*5113495bSYour Name 
6815*5113495bSYour Name 	wma_handle->hw_bd_info[BDF_VERSION] =
6816*5113495bSYour Name 		WMI_GET_BDF_VERSION(ev->hw_bd_info);
6817*5113495bSYour Name 	wma_handle->hw_bd_info[REF_DESIGN_ID] =
6818*5113495bSYour Name 		WMI_GET_REF_DESIGN(ev->hw_bd_info);
6819*5113495bSYour Name 	wma_handle->hw_bd_info[CUSTOMER_ID] =
6820*5113495bSYour Name 		WMI_GET_CUSTOMER_ID(ev->hw_bd_info);
6821*5113495bSYour Name 	wma_handle->hw_bd_info[PROJECT_ID] =
6822*5113495bSYour Name 		WMI_GET_PROJECT_ID(ev->hw_bd_info);
6823*5113495bSYour Name 	wma_handle->hw_bd_info[BOARD_DATA_REV] =
6824*5113495bSYour Name 		WMI_GET_BOARD_DATA_REV(ev->hw_bd_info);
6825*5113495bSYour Name 
6826*5113495bSYour Name 	wma_info("Board id: %x, Board version: %x %x %x %x %x",
6827*5113495bSYour Name 		 wma_handle->hw_bd_id,
6828*5113495bSYour Name 		 wma_handle->hw_bd_info[BDF_VERSION],
6829*5113495bSYour Name 		 wma_handle->hw_bd_info[REF_DESIGN_ID],
6830*5113495bSYour Name 		 wma_handle->hw_bd_info[CUSTOMER_ID],
6831*5113495bSYour Name 		 wma_handle->hw_bd_info[PROJECT_ID],
6832*5113495bSYour Name 		 wma_handle->hw_bd_info[BOARD_DATA_REV]);
6833*5113495bSYour Name 
6834*5113495bSYour Name 	/* wmi service is ready */
6835*5113495bSYour Name 	qdf_mem_copy(wma_handle->wmi_service_bitmap,
6836*5113495bSYour Name 		     service_bitmap,
6837*5113495bSYour Name 		     sizeof(wma_handle->wmi_service_bitmap));
6838*5113495bSYour Name 
6839*5113495bSYour Name 	cdp_cfg_tx_set_is_mgmt_over_wmi_enabled(soc,
6840*5113495bSYour Name 		wmi_service_enabled(wmi_handle, wmi_service_mgmt_tx_wmi));
6841*5113495bSYour Name 	cdp_set_desc_global_pool_size(soc, ev->num_msdu_desc);
6842*5113495bSYour Name 	/* SWBA event handler for beacon transmission */
6843*5113495bSYour Name 	status = wma_register_swba_events(wma_handle->wmi_handle);
6844*5113495bSYour Name 
6845*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
6846*5113495bSYour Name 		wma_err("Failed to register swba beacon event cb");
6847*5113495bSYour Name 		goto failure;
6848*5113495bSYour Name 	}
6849*5113495bSYour Name #ifdef WLAN_FEATURE_LPSS
6850*5113495bSYour Name 	wma_handle->lpss_support =
6851*5113495bSYour Name 		wmi_service_enabled(wmi_handle, wmi_service_lpass);
6852*5113495bSYour Name #endif /* WLAN_FEATURE_LPSS */
6853*5113495bSYour Name 
6854*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_fse_cmem_alloc_support))
6855*5113495bSYour Name 		wlan_dp_set_fst_in_cmem(true);
6856*5113495bSYour Name 
6857*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle,
6858*5113495bSYour Name 			wmi_service_fisa_dynamic_msdu_aggr_size_support))
6859*5113495bSYour Name 		wlan_dp_set_fisa_dynamic_aggr_size_support(true);
6860*5113495bSYour Name 	/*
6861*5113495bSYour Name 	 * This Service bit is added to check for ARP/NS Offload
6862*5113495bSYour Name 	 * support for LL/HL targets
6863*5113495bSYour Name 	 */
6864*5113495bSYour Name 	wma_handle->ap_arpns_support =
6865*5113495bSYour Name 		wmi_service_enabled(wmi_handle, wmi_service_ap_arpns_offload);
6866*5113495bSYour Name 
6867*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_csa_offload)) {
6868*5113495bSYour Name 		wma_debug("FW support CSA offload capability");
6869*5113495bSYour Name 		status = wmi_unified_register_event_handler(
6870*5113495bSYour Name 						wmi_handle,
6871*5113495bSYour Name 						wmi_csa_handling_event_id,
6872*5113495bSYour Name 						wma_csa_offload_handler,
6873*5113495bSYour Name 						WMA_RX_SERIALIZER_CTX);
6874*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(status)) {
6875*5113495bSYour Name 			wma_err("Failed to register CSA offload event cb");
6876*5113495bSYour Name 			goto failure;
6877*5113495bSYour Name 		}
6878*5113495bSYour Name 	}
6879*5113495bSYour Name 
6880*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_mgmt_tx_wmi)) {
6881*5113495bSYour Name 		wma_debug("Firmware supports management TX over WMI,use WMI interface instead of HTT for management Tx");
6882*5113495bSYour Name 		/*
6883*5113495bSYour Name 		 * Register Tx completion event handler for MGMT Tx over WMI
6884*5113495bSYour Name 		 * case
6885*5113495bSYour Name 		 */
6886*5113495bSYour Name 		status = wmi_unified_register_event_handler(
6887*5113495bSYour Name 					wmi_handle,
6888*5113495bSYour Name 					wmi_mgmt_tx_completion_event_id,
6889*5113495bSYour Name 					wma_mgmt_tx_completion_handler,
6890*5113495bSYour Name 					WMA_RX_SERIALIZER_CTX);
6891*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(status)) {
6892*5113495bSYour Name 			wma_err("Failed to register MGMT over WMI completion handler");
6893*5113495bSYour Name 			goto failure;
6894*5113495bSYour Name 		}
6895*5113495bSYour Name 
6896*5113495bSYour Name 		status = wmi_unified_register_event_handler(
6897*5113495bSYour Name 				wmi_handle,
6898*5113495bSYour Name 				wmi_mgmt_tx_bundle_completion_event_id,
6899*5113495bSYour Name 				wma_mgmt_tx_bundle_completion_handler,
6900*5113495bSYour Name 				WMA_RX_SERIALIZER_CTX);
6901*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(status)) {
6902*5113495bSYour Name 			wma_err("Failed to register MGMT over WMI completion handler");
6903*5113495bSYour Name 			goto failure;
6904*5113495bSYour Name 		}
6905*5113495bSYour Name 
6906*5113495bSYour Name 	} else {
6907*5113495bSYour Name 		wma_err("FW does not support WMI_SERVICE_MGMT_TX_WMI, Use HTT interface for Management Tx");
6908*5113495bSYour Name 	}
6909*5113495bSYour Name 
6910*5113495bSYour Name 	status = wma_register_gtk_offload_event(wma_handle);
6911*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
6912*5113495bSYour Name 		wma_err("Failed to register GTK offload event cb");
6913*5113495bSYour Name 		goto failure;
6914*5113495bSYour Name 	}
6915*5113495bSYour Name 
6916*5113495bSYour Name 	status = wmi_unified_register_event_handler(wmi_handle,
6917*5113495bSYour Name 				wmi_tbttoffset_update_event_id,
6918*5113495bSYour Name 				wma_tbttoffset_update_event_handler,
6919*5113495bSYour Name 				WMA_RX_SERIALIZER_CTX);
6920*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
6921*5113495bSYour Name 		wma_err("Failed to register WMI_TBTTOFFSET_UPDATE_EVENTID callback");
6922*5113495bSYour Name 		goto failure;
6923*5113495bSYour Name 	}
6924*5113495bSYour Name 
6925*5113495bSYour Name 	if (wmi_service_enabled(wma_handle->wmi_handle,
6926*5113495bSYour Name 				   wmi_service_rcpi_support)) {
6927*5113495bSYour Name 		/* register for rcpi response event */
6928*5113495bSYour Name 		status = wmi_unified_register_event_handler(
6929*5113495bSYour Name 							wmi_handle,
6930*5113495bSYour Name 							wmi_update_rcpi_event_id,
6931*5113495bSYour Name 							wma_rcpi_event_handler,
6932*5113495bSYour Name 							WMA_RX_SERIALIZER_CTX);
6933*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(status)) {
6934*5113495bSYour Name 			wma_err("Failed to register RCPI event handler");
6935*5113495bSYour Name 			goto failure;
6936*5113495bSYour Name 		}
6937*5113495bSYour Name 		wma_handle->rcpi_enabled = true;
6938*5113495bSYour Name 	}
6939*5113495bSYour Name 
6940*5113495bSYour Name 	/* mac_id is replaced with pdev_id in converged firmware to have
6941*5113495bSYour Name 	 * multi-radio support. In order to maintain backward compatibility
6942*5113495bSYour Name 	 * with old fw, host needs to check WMI_SERVICE_DEPRECATED_REPLACE
6943*5113495bSYour Name 	 * in service bitmap from FW and host needs to set use_pdev_id in
6944*5113495bSYour Name 	 * wmi_resource_config to true. If WMI_SERVICE_DEPRECATED_REPLACE
6945*5113495bSYour Name 	 * service is not set, then host shall not expect MAC ID from FW in
6946*5113495bSYour Name 	 * VDEV START RESPONSE event and host shall use PDEV ID.
6947*5113495bSYour Name 	 */
6948*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_deprecated_replace))
6949*5113495bSYour Name 		wlan_res_cfg->use_pdev_id = true;
6950*5113495bSYour Name 	else
6951*5113495bSYour Name 		wlan_res_cfg->use_pdev_id = false;
6952*5113495bSYour Name 
6953*5113495bSYour Name 	wlan_res_cfg->max_num_dbs_scan_duty_cycle = CDS_DBS_SCAN_CLIENTS_MAX;
6954*5113495bSYour Name 
6955*5113495bSYour Name 	/* Initialize the log supported event handler */
6956*5113495bSYour Name 	status = wmi_unified_register_event_handler(wmi_handle,
6957*5113495bSYour Name 			wmi_diag_event_id_log_supported_event_id,
6958*5113495bSYour Name 			wma_log_supported_evt_handler,
6959*5113495bSYour Name 			WMA_RX_SERIALIZER_CTX);
6960*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
6961*5113495bSYour Name 		wma_err("Failed to register log supported event cb");
6962*5113495bSYour Name 		goto failure;
6963*5113495bSYour Name 	}
6964*5113495bSYour Name 
6965*5113495bSYour Name 	cdp_mark_first_wakeup_packet(
6966*5113495bSYour Name 		soc, OL_TXRX_PDEV_ID,
6967*5113495bSYour Name 		wmi_service_enabled(wmi_handle,
6968*5113495bSYour Name 				    wmi_service_mark_first_wakeup_packet));
6969*5113495bSYour Name 	wma_handle->is_dfs_offloaded =
6970*5113495bSYour Name 		wmi_service_enabled(wmi_handle,
6971*5113495bSYour Name 				    wmi_service_dfs_phyerr_offload);
6972*5113495bSYour Name 
6973*5113495bSYour Name 	wma_handle->nan_datapath_enabled =
6974*5113495bSYour Name 		wmi_service_enabled(wma_handle->wmi_handle,
6975*5113495bSYour Name 				    wmi_service_nan_data);
6976*5113495bSYour Name 
6977*5113495bSYour Name 	wma_handle->fw_therm_throt_support =
6978*5113495bSYour Name 		wmi_service_enabled(wma_handle->wmi_handle,
6979*5113495bSYour Name 				    wmi_service_tt);
6980*5113495bSYour Name 
6981*5113495bSYour Name 	wma_set_component_caps(wma_handle->psoc);
6982*5113495bSYour Name 
6983*5113495bSYour Name 	wma_update_fw_config(wma_handle->psoc, tgt_hdl);
6984*5113495bSYour Name 
6985*5113495bSYour Name 	status = wmi_unified_save_fw_version_cmd(wmi_handle, param_buf);
6986*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
6987*5113495bSYour Name 		wma_err("Failed to send WMI_INIT_CMDID command");
6988*5113495bSYour Name 		goto failure;
6989*5113495bSYour Name 	}
6990*5113495bSYour Name 
6991*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_ext_msg)) {
6992*5113495bSYour Name 		status = qdf_mc_timer_start(
6993*5113495bSYour Name 				&wma_handle->service_ready_ext_timer,
6994*5113495bSYour Name 				WMA_SERVICE_READY_EXT_TIMEOUT);
6995*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(status))
6996*5113495bSYour Name 			wma_err("Failed to start the service ready ext timer");
6997*5113495bSYour Name 	}
6998*5113495bSYour Name 	wma_handle->tx_bfee_8ss_enabled =
6999*5113495bSYour Name 		wmi_service_enabled(wmi_handle, wmi_service_8ss_tx_bfee);
7000*5113495bSYour Name 
7001*5113495bSYour Name 	wma_handle->dynamic_nss_chains_support = wmi_service_enabled(wmi_handle,
7002*5113495bSYour Name 					wmi_service_per_vdev_chain_support);
7003*5113495bSYour Name 	target_psoc_set_num_radios(tgt_hdl, 1);
7004*5113495bSYour Name 
7005*5113495bSYour Name 	return 0;
7006*5113495bSYour Name 
7007*5113495bSYour Name failure:
7008*5113495bSYour Name 	return -EINVAL;
7009*5113495bSYour Name 
7010*5113495bSYour Name }
7011*5113495bSYour Name 
7012*5113495bSYour Name /**
7013*5113495bSYour Name  * wma_get_caps_for_phyidx_hwmode() - to fetch caps for given hw mode and band
7014*5113495bSYour Name  * @caps_per_phy: Pointer to capabilities structure which needs to be filled
7015*5113495bSYour Name  * @hw_mode: Provided hardware mode
7016*5113495bSYour Name  * @band: Provide band i.e. 2G or 5G
7017*5113495bSYour Name  *
7018*5113495bSYour Name  * This API finds cap which suitable for provided hw mode and band. If user
7019*5113495bSYour Name  * is provides some invalid hw mode then it will automatically falls back to
7020*5113495bSYour Name  * default hw mode
7021*5113495bSYour Name  *
7022*5113495bSYour Name  * Return: QDF_STATUS
7023*5113495bSYour Name  */
wma_get_caps_for_phyidx_hwmode(struct wma_caps_per_phy * caps_per_phy,enum hw_mode_dbs_capab hw_mode,enum cds_band_type band)7024*5113495bSYour Name QDF_STATUS wma_get_caps_for_phyidx_hwmode(struct wma_caps_per_phy *caps_per_phy,
7025*5113495bSYour Name 		enum hw_mode_dbs_capab hw_mode, enum cds_band_type band)
7026*5113495bSYour Name {
7027*5113495bSYour Name 	t_wma_handle *wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
7028*5113495bSYour Name 	struct target_psoc_info *tgt_hdl;
7029*5113495bSYour Name 	int ht_cap_info, vht_cap_info;
7030*5113495bSYour Name 	uint8_t our_hw_mode = hw_mode, num_hw_modes, hw_mode_config_type;
7031*5113495bSYour Name 	struct wlan_psoc_host_mac_phy_caps *mac_phy_cap;
7032*5113495bSYour Name 	struct wlan_psoc_target_capability_info *tgt_cap_info;
7033*5113495bSYour Name 	uint8_t total_mac_phy_cnt, i;
7034*5113495bSYour Name 
7035*5113495bSYour Name 	if (!wma_handle)
7036*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
7037*5113495bSYour Name 
7038*5113495bSYour Name 	tgt_hdl = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
7039*5113495bSYour Name 	if (!tgt_hdl) {
7040*5113495bSYour Name 		wma_err("target psoc info is NULL");
7041*5113495bSYour Name 		return -EINVAL;
7042*5113495bSYour Name 	}
7043*5113495bSYour Name 	if (!caps_per_phy) {
7044*5113495bSYour Name 		wma_err("Invalid caps pointer");
7045*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
7046*5113495bSYour Name 	}
7047*5113495bSYour Name 
7048*5113495bSYour Name 	ht_cap_info = target_if_get_ht_cap_info(tgt_hdl);
7049*5113495bSYour Name 	vht_cap_info = target_if_get_vht_cap_info(tgt_hdl);
7050*5113495bSYour Name 	num_hw_modes = target_psoc_get_num_hw_modes(tgt_hdl);
7051*5113495bSYour Name 	mac_phy_cap = target_psoc_get_mac_phy_cap(tgt_hdl);
7052*5113495bSYour Name 	tgt_cap_info = target_psoc_get_target_caps(tgt_hdl);
7053*5113495bSYour Name 
7054*5113495bSYour Name 	if (!mac_phy_cap) {
7055*5113495bSYour Name 		wma_err("Invalid MAC PHY capabilities handle");
7056*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
7057*5113495bSYour Name 	}
7058*5113495bSYour Name 
7059*5113495bSYour Name 	if (!tgt_cap_info) {
7060*5113495bSYour Name 		wma_err("Invalid target capabilities handle");
7061*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
7062*5113495bSYour Name 	}
7063*5113495bSYour Name 
7064*5113495bSYour Name 	if (!num_hw_modes) {
7065*5113495bSYour Name 		wma_debug("Invalid number of hw modes, use legacy HT/VHT caps");
7066*5113495bSYour Name 		caps_per_phy->ht_2g = ht_cap_info;
7067*5113495bSYour Name 		caps_per_phy->ht_5g = ht_cap_info;
7068*5113495bSYour Name 		caps_per_phy->vht_2g = vht_cap_info;
7069*5113495bSYour Name 		caps_per_phy->vht_5g = vht_cap_info;
7070*5113495bSYour Name 		/* legacy platform doesn't support HE IE */
7071*5113495bSYour Name 		caps_per_phy->he_2g[0] = 0;
7072*5113495bSYour Name 		caps_per_phy->he_2g[1] = 0;
7073*5113495bSYour Name 		caps_per_phy->he_5g[0] = 0;
7074*5113495bSYour Name 		caps_per_phy->he_5g[1] = 0;
7075*5113495bSYour Name 		caps_per_phy->tx_chain_mask_2G =
7076*5113495bSYour Name 			EXTRACT_TX_CHAIN_MASK_2G(tgt_cap_info->txrx_chainmask);
7077*5113495bSYour Name 		caps_per_phy->rx_chain_mask_2G =
7078*5113495bSYour Name 			EXTRACT_RX_CHAIN_MASK_2G(tgt_cap_info->txrx_chainmask);
7079*5113495bSYour Name 		caps_per_phy->tx_chain_mask_5G =
7080*5113495bSYour Name 			EXTRACT_TX_CHAIN_MASK_5G(tgt_cap_info->txrx_chainmask);
7081*5113495bSYour Name 		caps_per_phy->rx_chain_mask_5G =
7082*5113495bSYour Name 			EXTRACT_RX_CHAIN_MASK_5G(tgt_cap_info->txrx_chainmask);
7083*5113495bSYour Name 
7084*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
7085*5113495bSYour Name 	}
7086*5113495bSYour Name 
7087*5113495bSYour Name 	if (!policy_mgr_is_dbs_enable(wma_handle->psoc))
7088*5113495bSYour Name 		our_hw_mode = HW_MODE_DBS_NONE;
7089*5113495bSYour Name 
7090*5113495bSYour Name 	total_mac_phy_cnt = target_psoc_get_total_mac_phy_cnt(tgt_hdl);
7091*5113495bSYour Name 	for (i = 0; i < total_mac_phy_cnt; i++) {
7092*5113495bSYour Name 		hw_mode_config_type = mac_phy_cap[i].hw_mode_config_type;
7093*5113495bSYour Name 		if (our_hw_mode == HW_MODE_DBS &&
7094*5113495bSYour Name 		    !(hw_mode_config_type == WMI_HW_MODE_DBS ||
7095*5113495bSYour Name 		    hw_mode_config_type == WMI_HW_MODE_DBS_OR_SBS))
7096*5113495bSYour Name 			continue;
7097*5113495bSYour Name 
7098*5113495bSYour Name 		if ((band == CDS_BAND_2GHZ || band == CDS_BAND_ALL) &&
7099*5113495bSYour Name 		    (WLAN_2G_CAPABILITY & mac_phy_cap[i].supported_bands) &&
7100*5113495bSYour Name 		    !caps_per_phy->tx_chain_mask_2G) {
7101*5113495bSYour Name 			caps_per_phy->ht_2g = mac_phy_cap[i].ht_cap_info_2G;
7102*5113495bSYour Name 			caps_per_phy->vht_2g = mac_phy_cap[i].vht_cap_info_2G;
7103*5113495bSYour Name 			qdf_mem_copy(caps_per_phy->he_2g,
7104*5113495bSYour Name 				     mac_phy_cap[i].he_cap_info_2G,
7105*5113495bSYour Name 				     sizeof(caps_per_phy->he_2g));
7106*5113495bSYour Name 
7107*5113495bSYour Name 			caps_per_phy->tx_chain_mask_2G =
7108*5113495bSYour Name 					mac_phy_cap[i].tx_chain_mask_2G;
7109*5113495bSYour Name 			caps_per_phy->rx_chain_mask_2G =
7110*5113495bSYour Name 					mac_phy_cap[i].rx_chain_mask_2G;
7111*5113495bSYour Name 
7112*5113495bSYour Name 			wma_debug("Select 2G capable phyid[%d] chain %d %d ht 0x%x vht 0x%x",
7113*5113495bSYour Name 				 i,
7114*5113495bSYour Name 				 caps_per_phy->tx_chain_mask_2G,
7115*5113495bSYour Name 				 caps_per_phy->rx_chain_mask_2G,
7116*5113495bSYour Name 				 caps_per_phy->ht_2g,
7117*5113495bSYour Name 				 caps_per_phy->vht_2g);
7118*5113495bSYour Name 		}
7119*5113495bSYour Name 		if ((band == CDS_BAND_5GHZ || band == CDS_BAND_ALL) &&
7120*5113495bSYour Name 		    (WLAN_5G_CAPABILITY & mac_phy_cap[i].supported_bands) &&
7121*5113495bSYour Name 		    !caps_per_phy->tx_chain_mask_5G) {
7122*5113495bSYour Name 			caps_per_phy->ht_5g = mac_phy_cap[i].ht_cap_info_5G;
7123*5113495bSYour Name 			caps_per_phy->vht_5g = mac_phy_cap[i].vht_cap_info_5G;
7124*5113495bSYour Name 			qdf_mem_copy(caps_per_phy->he_5g,
7125*5113495bSYour Name 				     mac_phy_cap[i].he_cap_info_5G,
7126*5113495bSYour Name 				     sizeof(caps_per_phy->he_5g));
7127*5113495bSYour Name 
7128*5113495bSYour Name 			caps_per_phy->tx_chain_mask_5G =
7129*5113495bSYour Name 					mac_phy_cap[i].tx_chain_mask_5G;
7130*5113495bSYour Name 			caps_per_phy->rx_chain_mask_5G =
7131*5113495bSYour Name 					mac_phy_cap[i].rx_chain_mask_5G;
7132*5113495bSYour Name 
7133*5113495bSYour Name 			wma_debug("Select 5G capable phyid[%d] chain %d %d ht 0x%x vht 0x%x",
7134*5113495bSYour Name 				 i,
7135*5113495bSYour Name 				 caps_per_phy->tx_chain_mask_5G,
7136*5113495bSYour Name 				 caps_per_phy->rx_chain_mask_5G,
7137*5113495bSYour Name 				 caps_per_phy->ht_5g,
7138*5113495bSYour Name 				 caps_per_phy->vht_5g);
7139*5113495bSYour Name 		}
7140*5113495bSYour Name 	}
7141*5113495bSYour Name 
7142*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
7143*5113495bSYour Name }
7144*5113495bSYour Name 
7145*5113495bSYour Name /**
7146*5113495bSYour Name  * wma_is_rx_ldpc_supported_for_channel() - to find out if ldpc is supported
7147*5113495bSYour Name  *
7148*5113495bSYour Name  * @ch_freq: Channel freq for which it needs to check if rx ldpc is enabled
7149*5113495bSYour Name  *
7150*5113495bSYour Name  * This API takes channel number as argument and takes default hw mode as DBS
7151*5113495bSYour Name  * to check if rx LDPC support is enabled for that channel or no
7152*5113495bSYour Name  */
wma_is_rx_ldpc_supported_for_channel(uint32_t ch_freq)7153*5113495bSYour Name bool wma_is_rx_ldpc_supported_for_channel(uint32_t ch_freq)
7154*5113495bSYour Name {
7155*5113495bSYour Name 	t_wma_handle *wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
7156*5113495bSYour Name 	struct target_psoc_info *tgt_hdl;
7157*5113495bSYour Name 	struct wma_caps_per_phy caps_per_phy = {0};
7158*5113495bSYour Name 	enum cds_band_type band;
7159*5113495bSYour Name 	bool status;
7160*5113495bSYour Name 	uint8_t num_hw_modes;
7161*5113495bSYour Name 
7162*5113495bSYour Name 	if (!wma_handle)
7163*5113495bSYour Name 		return false;
7164*5113495bSYour Name 
7165*5113495bSYour Name 	tgt_hdl = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
7166*5113495bSYour Name 	if (!tgt_hdl) {
7167*5113495bSYour Name 		wma_err("Target handle is NULL");
7168*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
7169*5113495bSYour Name 	}
7170*5113495bSYour Name 
7171*5113495bSYour Name 	num_hw_modes = target_psoc_get_num_hw_modes(tgt_hdl);
7172*5113495bSYour Name 
7173*5113495bSYour Name 	if (!WLAN_REG_IS_24GHZ_CH_FREQ(ch_freq))
7174*5113495bSYour Name 		band = CDS_BAND_5GHZ;
7175*5113495bSYour Name 	else
7176*5113495bSYour Name 		band = CDS_BAND_2GHZ;
7177*5113495bSYour Name 
7178*5113495bSYour Name 	if (QDF_STATUS_SUCCESS != wma_get_caps_for_phyidx_hwmode(
7179*5113495bSYour Name 						&caps_per_phy,
7180*5113495bSYour Name 						HW_MODE_DBS, band)) {
7181*5113495bSYour Name 		return false;
7182*5113495bSYour Name 	}
7183*5113495bSYour Name 
7184*5113495bSYour Name 	/*
7185*5113495bSYour Name 	 * Legacy platforms like Rome set WMI_HT_CAP_LDPC to specify RX LDPC
7186*5113495bSYour Name 	 * capability. But new platforms like Helium set WMI_HT_CAP_RX_LDPC
7187*5113495bSYour Name 	 * instead.
7188*5113495bSYour Name 	 */
7189*5113495bSYour Name 	if (0 == num_hw_modes) {
7190*5113495bSYour Name 		status = (!!(caps_per_phy.ht_2g & WMI_HT_CAP_LDPC));
7191*5113495bSYour Name 	} else {
7192*5113495bSYour Name 		if (WLAN_REG_IS_24GHZ_CH_FREQ(ch_freq))
7193*5113495bSYour Name 			status = (!!(caps_per_phy.ht_2g & WMI_HT_CAP_RX_LDPC));
7194*5113495bSYour Name 		else
7195*5113495bSYour Name 			status = (!!(caps_per_phy.ht_5g & WMI_HT_CAP_RX_LDPC));
7196*5113495bSYour Name 	}
7197*5113495bSYour Name 
7198*5113495bSYour Name 	return status;
7199*5113495bSYour Name }
7200*5113495bSYour Name 
7201*5113495bSYour Name /**
7202*5113495bSYour Name  * wma_print_mac_phy_capabilities() - Prints MAC PHY capabilities
7203*5113495bSYour Name  * @cap: pointer to WMI_MAC_PHY_CAPABILITIES
7204*5113495bSYour Name  * @index: MAC_PHY index
7205*5113495bSYour Name  *
7206*5113495bSYour Name  * Return: none
7207*5113495bSYour Name  */
wma_print_mac_phy_capabilities(struct wlan_psoc_host_mac_phy_caps * cap,int index)7208*5113495bSYour Name static void wma_print_mac_phy_capabilities(struct wlan_psoc_host_mac_phy_caps
7209*5113495bSYour Name 					   *cap, int index)
7210*5113495bSYour Name {
7211*5113495bSYour Name 	uint32_t mac_2G[PSOC_HOST_MAX_MAC_SIZE];
7212*5113495bSYour Name 	uint32_t mac_5G[PSOC_HOST_MAX_MAC_SIZE];
7213*5113495bSYour Name 	uint32_t phy_2G[WMI_MAX_HECAP_PHY_SIZE];
7214*5113495bSYour Name 	uint32_t phy_5G[WMI_MAX_HECAP_PHY_SIZE];
7215*5113495bSYour Name 	struct wlan_psoc_host_ppe_threshold ppet_2G, ppet_5G;
7216*5113495bSYour Name 
7217*5113495bSYour Name 	wma_nofl_debug("\t: index [%d]", index);
7218*5113495bSYour Name 	wma_nofl_debug("\t: cap for hw_mode_id[%d]", cap->hw_mode_id);
7219*5113495bSYour Name 	wma_nofl_debug("\t: pdev_id[%d]", cap->pdev_id);
7220*5113495bSYour Name 	wma_nofl_debug("\t: phy_id[%d]", cap->phy_id);
7221*5113495bSYour Name 	wma_nofl_debug("\t: hw_mode_config_type[%d]", cap->hw_mode_config_type);
7222*5113495bSYour Name 	wma_nofl_debug("\t: supports_11b[%d]", cap->supports_11b);
7223*5113495bSYour Name 	wma_nofl_debug("\t: supports_11g[%d]", cap->supports_11g);
7224*5113495bSYour Name 	wma_nofl_debug("\t: supports_11a[%d]", cap->supports_11a);
7225*5113495bSYour Name 	wma_nofl_debug("\t: supports_11n[%d]", cap->supports_11n);
7226*5113495bSYour Name 	wma_nofl_debug("\t: supports_11ac[%d]", cap->supports_11ac);
7227*5113495bSYour Name 	wma_nofl_debug("\t: supports_11ax[%d]", cap->supports_11ax);
7228*5113495bSYour Name 	wma_nofl_debug("\t: supported_bands[%d]", cap->supported_bands);
7229*5113495bSYour Name 	wma_nofl_debug("\t: ampdu_density[%d]", cap->ampdu_density);
7230*5113495bSYour Name 	wma_nofl_debug("\t: max_bw_supported_2G[%d]", cap->max_bw_supported_2G);
7231*5113495bSYour Name 	wma_nofl_debug("\t: ht_cap_info_2G[%d]", cap->ht_cap_info_2G);
7232*5113495bSYour Name 	wma_nofl_debug("\t: vht_cap_info_2G[0x%0X]", cap->vht_cap_info_2G);
7233*5113495bSYour Name 	wma_nofl_debug("\t: vht_supp_mcs_2G[0x%0X]", cap->vht_supp_mcs_2G);
7234*5113495bSYour Name 	wma_nofl_debug("\t: tx_chain_mask_2G[%d]", cap->tx_chain_mask_2G);
7235*5113495bSYour Name 	wma_nofl_debug("\t: rx_chain_mask_2G[%d]", cap->rx_chain_mask_2G);
7236*5113495bSYour Name 	wma_nofl_debug("\t: max_bw_supported_5G[%d]", cap->max_bw_supported_5G);
7237*5113495bSYour Name 	wma_nofl_debug("\t: ht_cap_info_5G[%d]", cap->ht_cap_info_5G);
7238*5113495bSYour Name 	wma_nofl_debug("\t: vht_cap_info_5G[0x%0X]", cap->vht_cap_info_5G);
7239*5113495bSYour Name 	wma_nofl_debug("\t: vht_supp_mcs_5G[0x%0X]", cap->vht_supp_mcs_5G);
7240*5113495bSYour Name 	wma_nofl_debug("\t: tx_chain_mask_5G[%d]", cap->tx_chain_mask_5G);
7241*5113495bSYour Name 	wma_nofl_debug("\t: rx_chain_mask_5G[%d]", cap->rx_chain_mask_5G);
7242*5113495bSYour Name 	wma_nofl_debug("\t: he_cap_info_2G[0][%08x]", cap->he_cap_info_2G[0]);
7243*5113495bSYour Name 	wma_nofl_debug("\t: he_cap_info_2G[1][%08x]", cap->he_cap_info_2G[1]);
7244*5113495bSYour Name 	wma_nofl_debug("\t: he_supp_mcs_2G[%08x]", cap->he_supp_mcs_2G);
7245*5113495bSYour Name 	wma_nofl_debug("\t: he_cap_info_5G[0][%08x]", cap->he_cap_info_5G[0]);
7246*5113495bSYour Name 	wma_nofl_debug("\t: he_cap_info_5G[1][%08x]", cap->he_cap_info_5G[1]);
7247*5113495bSYour Name 	wma_nofl_debug("\t: he_supp_mcs_5G[%08x]", cap->he_supp_mcs_5G);
7248*5113495bSYour Name 	qdf_mem_copy(mac_2G, cap->he_cap_info_2G, sizeof(mac_2G));
7249*5113495bSYour Name 	qdf_mem_copy(mac_5G, cap->he_cap_info_5G, sizeof(mac_5G));
7250*5113495bSYour Name 	qdf_mem_copy(phy_2G, cap->he_cap_phy_info_2G,
7251*5113495bSYour Name 		     WMI_MAX_HECAP_PHY_SIZE * 4);
7252*5113495bSYour Name 	qdf_mem_copy(phy_5G, cap->he_cap_phy_info_5G,
7253*5113495bSYour Name 		     WMI_MAX_HECAP_PHY_SIZE * 4);
7254*5113495bSYour Name 	ppet_2G = cap->he_ppet2G;
7255*5113495bSYour Name 	ppet_5G = cap->he_ppet5G;
7256*5113495bSYour Name 
7257*5113495bSYour Name 	wma_print_he_mac_cap_w1(mac_2G[0]);
7258*5113495bSYour Name 	wma_print_he_mac_cap_w2(mac_2G[1]);
7259*5113495bSYour Name 	wma_print_he_phy_cap(phy_2G);
7260*5113495bSYour Name 	wma_print_he_ppet(&ppet_2G);
7261*5113495bSYour Name 	wma_print_he_mac_cap_w1(mac_5G[0]);
7262*5113495bSYour Name 	wma_print_he_mac_cap_w1(mac_5G[1]);
7263*5113495bSYour Name 	wma_print_he_phy_cap(phy_5G);
7264*5113495bSYour Name 	wma_print_he_ppet(&ppet_5G);
7265*5113495bSYour Name }
7266*5113495bSYour Name 
7267*5113495bSYour Name /**
7268*5113495bSYour Name  * wma_print_populate_soc_caps() - Prints all the caps populated per hw mode
7269*5113495bSYour Name  * @tgt_hdl: target related info
7270*5113495bSYour Name  *
7271*5113495bSYour Name  * This function prints all the caps populater per hw mode and per PHY
7272*5113495bSYour Name  *
7273*5113495bSYour Name  * Return: none
7274*5113495bSYour Name  */
wma_print_populate_soc_caps(struct target_psoc_info * tgt_hdl)7275*5113495bSYour Name static void wma_print_populate_soc_caps(struct target_psoc_info *tgt_hdl)
7276*5113495bSYour Name {
7277*5113495bSYour Name 	int i, num_hw_modes, total_mac_phy_cnt;
7278*5113495bSYour Name 	struct wlan_psoc_host_mac_phy_caps *mac_phy_cap, *tmp;
7279*5113495bSYour Name 
7280*5113495bSYour Name 	num_hw_modes = target_psoc_get_num_hw_modes(tgt_hdl);
7281*5113495bSYour Name 	total_mac_phy_cnt = target_psoc_get_total_mac_phy_cnt(tgt_hdl);
7282*5113495bSYour Name 
7283*5113495bSYour Name 	/* print number of hw modes */
7284*5113495bSYour Name 	wma_debug("num of hw modes [%d]", num_hw_modes);
7285*5113495bSYour Name 	wma_debug("num mac_phy_cnt [%d]", total_mac_phy_cnt);
7286*5113495bSYour Name 
7287*5113495bSYour Name 	mac_phy_cap = target_psoc_get_mac_phy_cap(tgt_hdl);
7288*5113495bSYour Name 	if (!mac_phy_cap) {
7289*5113495bSYour Name 		wma_err("Invalid MAC PHY capabilities handle");
7290*5113495bSYour Name 		return;
7291*5113495bSYour Name 	}
7292*5113495bSYour Name 
7293*5113495bSYour Name 	wma_debug("<====== HW mode cap printing starts ======>");
7294*5113495bSYour Name 	/* print cap of each hw mode */
7295*5113495bSYour Name 	for (i = 0; i < total_mac_phy_cnt; i++) {
7296*5113495bSYour Name 		if (&mac_phy_cap[i]) {
7297*5113495bSYour Name 			wma_nofl_debug("====>: hw mode id[%d], phy id[%d]",
7298*5113495bSYour Name 				 mac_phy_cap[i].hw_mode_id,
7299*5113495bSYour Name 				 mac_phy_cap[i].phy_id);
7300*5113495bSYour Name 			tmp = &mac_phy_cap[i];
7301*5113495bSYour Name 			wma_print_mac_phy_capabilities(tmp, i);
7302*5113495bSYour Name 		}
7303*5113495bSYour Name 	}
7304*5113495bSYour Name 	wma_debug("<====== HW mode cap printing ends ======>\n");
7305*5113495bSYour Name }
7306*5113495bSYour Name 
7307*5113495bSYour Name /**
7308*5113495bSYour Name  * wma_update_hw_mode_list() - updates hw_mode_list
7309*5113495bSYour Name  * @wma_handle: pointer to wma global structure
7310*5113495bSYour Name  * @tgt_hdl: target psoc information
7311*5113495bSYour Name  *
7312*5113495bSYour Name  * This function updates hw_mode_list with tx_streams, rx_streams,
7313*5113495bSYour Name  * bandwidth, dbs and agile dfs for each hw_mode.
7314*5113495bSYour Name  *
7315*5113495bSYour Name  * Returns: 0 for success else failure.
7316*5113495bSYour Name  */
wma_update_hw_mode_list(t_wma_handle * wma_handle,struct target_psoc_info * tgt_hdl)7317*5113495bSYour Name static QDF_STATUS wma_update_hw_mode_list(t_wma_handle *wma_handle,
7318*5113495bSYour Name 					  struct target_psoc_info *tgt_hdl)
7319*5113495bSYour Name {
7320*5113495bSYour Name 	struct wlan_psoc_host_mac_phy_caps *tmp, *mac_phy_cap;
7321*5113495bSYour Name 	uint32_t i, hw_config_type, j = 0;
7322*5113495bSYour Name 	WMI_PHY_CAPABILITY new_supported_band = 0;
7323*5113495bSYour Name 	bool supported_band_update_failure = false;
7324*5113495bSYour Name 	struct wlan_psoc_target_capability_info *tgt_cap_info;
7325*5113495bSYour Name 	int num_hw_modes;
7326*5113495bSYour Name 
7327*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
7328*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
7329*5113495bSYour Name 
7330*5113495bSYour Name 	num_hw_modes = target_psoc_get_num_hw_modes(tgt_hdl);
7331*5113495bSYour Name 	mac_phy_cap = target_psoc_get_mac_phy_cap(tgt_hdl);
7332*5113495bSYour Name 	tgt_cap_info = target_psoc_get_target_caps(tgt_hdl);
7333*5113495bSYour Name 
7334*5113495bSYour Name 	if (!mac_phy_cap) {
7335*5113495bSYour Name 		wma_err("mac_phy_cap Null");
7336*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
7337*5113495bSYour Name 	}
7338*5113495bSYour Name 
7339*5113495bSYour Name 	wma_debug("Num modes:%d", num_hw_modes);
7340*5113495bSYour Name 	for (i = 0; i < num_hw_modes; i++) {
7341*5113495bSYour Name 		/* Update for MAC0 */
7342*5113495bSYour Name 		tmp = &mac_phy_cap[j++];
7343*5113495bSYour Name 		hw_config_type = tmp->hw_mode_config_type;
7344*5113495bSYour Name 		if (wma_update_supported_bands(tmp->supported_bands,
7345*5113495bSYour Name 						&new_supported_band)
7346*5113495bSYour Name 		   != QDF_STATUS_SUCCESS)
7347*5113495bSYour Name 			supported_band_update_failure = true;
7348*5113495bSYour Name 
7349*5113495bSYour Name 		/* SBS and DBS have dual MAC. Upto 2 MACs are considered. */
7350*5113495bSYour Name 		if ((hw_config_type == WMI_HW_MODE_DBS) ||
7351*5113495bSYour Name 		    (hw_config_type == WMI_HW_MODE_SBS_PASSIVE) ||
7352*5113495bSYour Name 		    (hw_config_type == WMI_HW_MODE_SBS) ||
7353*5113495bSYour Name 		    (hw_config_type == WMI_HW_MODE_DBS_OR_SBS)) {
7354*5113495bSYour Name 			/* Update for MAC1 */
7355*5113495bSYour Name 			tmp = &mac_phy_cap[j++];
7356*5113495bSYour Name 			if (QDF_STATUS_SUCCESS !=
7357*5113495bSYour Name 			    wma_update_supported_bands(tmp->supported_bands,
7358*5113495bSYour Name 						       &new_supported_band))
7359*5113495bSYour Name 				supported_band_update_failure = true;
7360*5113495bSYour Name 		}
7361*5113495bSYour Name 	}
7362*5113495bSYour Name 
7363*5113495bSYour Name 	/* overwrite phy_capability which we got from service ready event */
7364*5113495bSYour Name 	if (!supported_band_update_failure) {
7365*5113495bSYour Name 		wma_debug("updating supported band from old[%d] to new[%d]",
7366*5113495bSYour Name 			 target_if_get_phy_capability(tgt_hdl),
7367*5113495bSYour Name 			 new_supported_band);
7368*5113495bSYour Name 		target_if_set_phy_capability(tgt_hdl, new_supported_band);
7369*5113495bSYour Name 	}
7370*5113495bSYour Name 
7371*5113495bSYour Name 	if (QDF_STATUS_SUCCESS !=
7372*5113495bSYour Name 			policy_mgr_update_hw_mode_list(wma_handle->psoc,
7373*5113495bSYour Name 						       tgt_hdl))
7374*5113495bSYour Name 		wma_err("failed to update policy manager");
7375*5113495bSYour Name 
7376*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
7377*5113495bSYour Name }
7378*5113495bSYour Name 
wma_init_wifi_pos_dma_rings(t_wma_handle * wma_handle,uint8_t num_mac,void * buf)7379*5113495bSYour Name static void wma_init_wifi_pos_dma_rings(t_wma_handle *wma_handle,
7380*5113495bSYour Name 					uint8_t num_mac, void *buf)
7381*5113495bSYour Name {
7382*5113495bSYour Name 	struct hif_opaque_softc *hif_ctx = cds_get_context(QDF_MODULE_ID_HIF);
7383*5113495bSYour Name 	void *hal_soc;
7384*5113495bSYour Name 
7385*5113495bSYour Name 	if (!hif_ctx) {
7386*5113495bSYour Name 		wma_err("invalid hif context");
7387*5113495bSYour Name 		return;
7388*5113495bSYour Name 	}
7389*5113495bSYour Name 
7390*5113495bSYour Name 	hal_soc = hif_get_hal_handle(hif_ctx);
7391*5113495bSYour Name 
7392*5113495bSYour Name 	wifi_pos_init_cir_cfr_rings(wma_handle->psoc, hal_soc, num_mac, buf);
7393*5113495bSYour Name }
7394*5113495bSYour Name 
7395*5113495bSYour Name /**
7396*5113495bSYour Name  * wma_populate_soc_caps() - populate entire SOC's capabilities
7397*5113495bSYour Name  * @wma_handle: pointer to wma global structure
7398*5113495bSYour Name  * @tgt_hdl: target psoc information
7399*5113495bSYour Name  * @param_buf: pointer to param of service ready extension event from fw
7400*5113495bSYour Name  *
7401*5113495bSYour Name  * This API populates all capabilities of entire SOC. For example,
7402*5113495bSYour Name  * how many number of hw modes are supported by this SOC, what are the
7403*5113495bSYour Name  * capabilities of each phy per hw mode, what are HAL reg capabilities per
7404*5113495bSYour Name  * phy.
7405*5113495bSYour Name  *
7406*5113495bSYour Name  * Return: none
7407*5113495bSYour Name  */
wma_populate_soc_caps(t_wma_handle * wma_handle,struct target_psoc_info * tgt_hdl,WMI_SERVICE_READY_EXT_EVENTID_param_tlvs * param_buf)7408*5113495bSYour Name static void wma_populate_soc_caps(t_wma_handle *wma_handle,
7409*5113495bSYour Name 				  struct target_psoc_info *tgt_hdl,
7410*5113495bSYour Name 			WMI_SERVICE_READY_EXT_EVENTID_param_tlvs *param_buf)
7411*5113495bSYour Name {
7412*5113495bSYour Name 
7413*5113495bSYour Name 	wma_debug("Enter");
7414*5113495bSYour Name 
7415*5113495bSYour Name 	wma_init_wifi_pos_dma_rings(wma_handle,
7416*5113495bSYour Name 				    param_buf->num_oem_dma_ring_caps,
7417*5113495bSYour Name 				    param_buf->oem_dma_ring_caps);
7418*5113495bSYour Name 
7419*5113495bSYour Name 	wma_print_populate_soc_caps(tgt_hdl);
7420*5113495bSYour Name 	wma_debug("Exit");
7421*5113495bSYour Name }
7422*5113495bSYour Name 
7423*5113495bSYour Name /**
7424*5113495bSYour Name  * wma_init_dbr_params() - init dbr params
7425*5113495bSYour Name  * @wma_handle: pointer to wma global structure
7426*5113495bSYour Name  *
7427*5113495bSYour Name  * This API initializes params of direct buffer rx component.
7428*5113495bSYour Name  *
7429*5113495bSYour Name  * Return: none
7430*5113495bSYour Name  */
7431*5113495bSYour Name #ifdef DIRECT_BUF_RX_ENABLE
wma_init_dbr_params(t_wma_handle * wma_handle)7432*5113495bSYour Name static void wma_init_dbr_params(t_wma_handle *wma_handle)
7433*5113495bSYour Name {
7434*5113495bSYour Name 	struct hif_opaque_softc *hif_ctx = cds_get_context(QDF_MODULE_ID_HIF);
7435*5113495bSYour Name 	void *hal_soc;
7436*5113495bSYour Name 
7437*5113495bSYour Name 	if (!hif_ctx) {
7438*5113495bSYour Name 		wma_err("invalid hif context");
7439*5113495bSYour Name 		return;
7440*5113495bSYour Name 	}
7441*5113495bSYour Name 
7442*5113495bSYour Name 	hal_soc = hif_get_hal_handle(hif_ctx);
7443*5113495bSYour Name 	direct_buf_rx_target_attach(wma_handle->psoc, hal_soc,
7444*5113495bSYour Name 				    wma_handle->qdf_dev);
7445*5113495bSYour Name }
7446*5113495bSYour Name #else
wma_init_dbr_params(t_wma_handle * wma_handle)7447*5113495bSYour Name static inline void wma_init_dbr_params(t_wma_handle *wma_handle)
7448*5113495bSYour Name {
7449*5113495bSYour Name }
7450*5113495bSYour Name #endif
7451*5113495bSYour Name 
7452*5113495bSYour Name /**
7453*5113495bSYour Name  * wma_set_coex_res_cfg() - Set target COEX resource configuration.
7454*5113495bSYour Name  * @wma_handle: pointer to wma global structure
7455*5113495bSYour Name  * @wmi_handle: pointer to wmi handle
7456*5113495bSYour Name  * @wlan_res_cfg: Pointer to target resource configuration
7457*5113495bSYour Name  *
7458*5113495bSYour Name  * Return: none
7459*5113495bSYour Name  */
7460*5113495bSYour Name #ifdef FEATURE_COEX_CONFIG
wma_set_coex_res_cfg(t_wma_handle * wma_handle,struct wmi_unified * wmi_handle,target_resource_config * wlan_res_cfg)7461*5113495bSYour Name static void wma_set_coex_res_cfg(t_wma_handle *wma_handle,
7462*5113495bSYour Name 				 struct wmi_unified *wmi_handle,
7463*5113495bSYour Name 				 target_resource_config *wlan_res_cfg)
7464*5113495bSYour Name {
7465*5113495bSYour Name 	if (cfg_get(wma_handle->psoc, CFG_THREE_WAY_COEX_CONFIG_LEGACY) &&
7466*5113495bSYour Name 	    wmi_service_enabled(wmi_handle,
7467*5113495bSYour Name 				wmi_service_three_way_coex_config_legacy)) {
7468*5113495bSYour Name 		wlan_res_cfg->three_way_coex_config_legacy_en = true;
7469*5113495bSYour Name 	} else {
7470*5113495bSYour Name 		wlan_res_cfg->three_way_coex_config_legacy_en = false;
7471*5113495bSYour Name 	}
7472*5113495bSYour Name }
7473*5113495bSYour Name #else
wma_set_coex_res_cfg(t_wma_handle * wma_handle,struct wmi_unified * wmi_handle,target_resource_config * wlan_res_cfg)7474*5113495bSYour Name static void wma_set_coex_res_cfg(t_wma_handle *wma_handle,
7475*5113495bSYour Name 				 struct wmi_unified *wmi_handle,
7476*5113495bSYour Name 				 target_resource_config *wlan_res_cfg)
7477*5113495bSYour Name {
7478*5113495bSYour Name }
7479*5113495bSYour Name #endif
7480*5113495bSYour Name 
wma_update_hw_mode_config(tp_wma_handle wma_handle,struct target_psoc_info * tgt_hdl)7481*5113495bSYour Name static void wma_update_hw_mode_config(tp_wma_handle wma_handle,
7482*5113495bSYour Name 				      struct target_psoc_info *tgt_hdl)
7483*5113495bSYour Name {
7484*5113495bSYour Name 	uint32_t conc_scan_config_bits, fw_config_bits;
7485*5113495bSYour Name 
7486*5113495bSYour Name 	fw_config_bits = target_if_get_fw_config_bits(tgt_hdl);
7487*5113495bSYour Name 	conc_scan_config_bits = target_if_get_conc_scan_config_bits(tgt_hdl);
7488*5113495bSYour Name 
7489*5113495bSYour Name 	wma_debug("Defaults: scan config:%x FW mode config:%x",
7490*5113495bSYour Name 		  conc_scan_config_bits, fw_config_bits);
7491*5113495bSYour Name 
7492*5113495bSYour Name 	if (wma_is_dbs_mandatory(wma_handle->psoc, tgt_hdl) &&
7493*5113495bSYour Name 	    (policy_mgr_is_dual_mac_disabled_in_ini(wma_handle->psoc))) {
7494*5113495bSYour Name 		policy_mgr_set_dual_mac_feature(wma_handle->psoc,
7495*5113495bSYour Name 				ENABLE_DBS_CXN_AND_DISABLE_SIMULTANEOUS_SCAN);
7496*5113495bSYour Name 		policy_mgr_set_ch_select_plcy(wma_handle->psoc,
7497*5113495bSYour Name 					      POLICY_MGR_CH_SELECT_POLICY_DEF);
7498*5113495bSYour Name 	}
7499*5113495bSYour Name 	wma_init_scan_fw_mode_config(wma_handle->psoc, conc_scan_config_bits,
7500*5113495bSYour Name 				     fw_config_bits);
7501*5113495bSYour Name }
7502*5113495bSYour Name 
7503*5113495bSYour Name #define MAX_GRP_KEY 16
7504*5113495bSYour Name 
wma_rx_service_ready_ext2_event(void * handle,uint8_t * ev,uint32_t len)7505*5113495bSYour Name int wma_rx_service_ready_ext2_event(void *handle, uint8_t *ev, uint32_t len)
7506*5113495bSYour Name {
7507*5113495bSYour Name 	tp_wma_handle wma_handle = (tp_wma_handle)handle;
7508*5113495bSYour Name 	struct target_psoc_info *tgt_hdl;
7509*5113495bSYour Name 	target_resource_config *wlan_res_cfg;
7510*5113495bSYour Name 	QDF_STATUS status;
7511*5113495bSYour Name 
7512*5113495bSYour Name 	wma_debug("Enter");
7513*5113495bSYour Name 
7514*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
7515*5113495bSYour Name 		return -EINVAL;
7516*5113495bSYour Name 
7517*5113495bSYour Name 	tgt_hdl = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
7518*5113495bSYour Name 	if (!tgt_hdl) {
7519*5113495bSYour Name 		wma_err("target psoc info is NULL");
7520*5113495bSYour Name 		return -EINVAL;
7521*5113495bSYour Name 	}
7522*5113495bSYour Name 
7523*5113495bSYour Name 	wlan_res_cfg = target_psoc_get_wlan_res_cfg(tgt_hdl);
7524*5113495bSYour Name 
7525*5113495bSYour Name 	if (wlan_mlme_is_multipass_sap(wma_handle->psoc))
7526*5113495bSYour Name 		wlan_res_cfg->max_num_group_keys = MAX_GRP_KEY;
7527*5113495bSYour Name 
7528*5113495bSYour Name 	status = policy_mgr_update_sbs_freq(wma_handle->psoc, tgt_hdl);
7529*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
7530*5113495bSYour Name 		return -EINVAL;
7531*5113495bSYour Name 
7532*5113495bSYour Name 	wma_update_hw_mode_config(wma_handle, tgt_hdl);
7533*5113495bSYour Name 
7534*5113495bSYour Name 	return 0;
7535*5113495bSYour Name }
7536*5113495bSYour Name 
7537*5113495bSYour Name /**
7538*5113495bSYour Name  * wma_rx_service_ready_ext_event() - evt handler for service ready ext event.
7539*5113495bSYour Name  * @handle: wma handle
7540*5113495bSYour Name  * @event: params of the service ready extended event
7541*5113495bSYour Name  * @length: param length
7542*5113495bSYour Name  *
7543*5113495bSYour Name  * Return: none
7544*5113495bSYour Name  */
wma_rx_service_ready_ext_event(void * handle,uint8_t * event,uint32_t length)7545*5113495bSYour Name int wma_rx_service_ready_ext_event(void *handle, uint8_t *event,
7546*5113495bSYour Name 					uint32_t length)
7547*5113495bSYour Name {
7548*5113495bSYour Name 	tp_wma_handle wma_handle = (tp_wma_handle) handle;
7549*5113495bSYour Name 	WMI_SERVICE_READY_EXT_EVENTID_param_tlvs *param_buf;
7550*5113495bSYour Name 	wmi_service_ready_ext_event_fixed_param *ev;
7551*5113495bSYour Name 	QDF_STATUS ret;
7552*5113495bSYour Name 	struct target_psoc_info *tgt_hdl;
7553*5113495bSYour Name 	struct wlan_psoc_target_capability_info *tgt_cap_info;
7554*5113495bSYour Name 	struct wmi_unified *wmi_handle;
7555*5113495bSYour Name 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
7556*5113495bSYour Name 	target_resource_config *wlan_res_cfg;
7557*5113495bSYour Name 
7558*5113495bSYour Name 	wma_debug("Enter");
7559*5113495bSYour Name 
7560*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
7561*5113495bSYour Name 		return -EINVAL;
7562*5113495bSYour Name 
7563*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(wma_handle->psoc);
7564*5113495bSYour Name 	if (wmi_validate_handle(wmi_handle))
7565*5113495bSYour Name 		return -EINVAL;
7566*5113495bSYour Name 
7567*5113495bSYour Name 	tgt_hdl = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
7568*5113495bSYour Name 	if (!tgt_hdl) {
7569*5113495bSYour Name 		wma_err("target psoc info is NULL");
7570*5113495bSYour Name 		return -EINVAL;
7571*5113495bSYour Name 	}
7572*5113495bSYour Name 
7573*5113495bSYour Name 	wlan_res_cfg = target_psoc_get_wlan_res_cfg(tgt_hdl);
7574*5113495bSYour Name 	param_buf = (WMI_SERVICE_READY_EXT_EVENTID_param_tlvs *) event;
7575*5113495bSYour Name 	if (!param_buf) {
7576*5113495bSYour Name 		wma_err("Invalid event");
7577*5113495bSYour Name 		return -EINVAL;
7578*5113495bSYour Name 	}
7579*5113495bSYour Name 
7580*5113495bSYour Name 	ev = param_buf->fixed_param;
7581*5113495bSYour Name 	if (!ev) {
7582*5113495bSYour Name 		wma_err("Invalid buffer");
7583*5113495bSYour Name 		return -EINVAL;
7584*5113495bSYour Name 	}
7585*5113495bSYour Name 
7586*5113495bSYour Name 	wma_debug("WMA <-- WMI_SERVICE_READY_EXT_EVENTID");
7587*5113495bSYour Name 
7588*5113495bSYour Name 	tgt_cap_info = target_psoc_get_target_caps(tgt_hdl);
7589*5113495bSYour Name 	ret = qdf_mc_timer_stop(&wma_handle->service_ready_ext_timer);
7590*5113495bSYour Name 	if (!QDF_IS_STATUS_SUCCESS(ret)) {
7591*5113495bSYour Name 		wma_err("Failed to stop the service ready ext timer");
7592*5113495bSYour Name 		return -EINVAL;
7593*5113495bSYour Name 	}
7594*5113495bSYour Name 	wma_populate_soc_caps(wma_handle, tgt_hdl, param_buf);
7595*5113495bSYour Name 
7596*5113495bSYour Name 	ret = wma_update_hw_mode_list(wma_handle, tgt_hdl);
7597*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(ret)) {
7598*5113495bSYour Name 		wma_err("Failed to update hw mode list");
7599*5113495bSYour Name 		return -EINVAL;
7600*5113495bSYour Name 	}
7601*5113495bSYour Name 
7602*5113495bSYour Name 	wma_debug("WMA --> WMI_INIT_CMDID");
7603*5113495bSYour Name 
7604*5113495bSYour Name 	wma_update_hw_mode_config(wma_handle, tgt_hdl);
7605*5113495bSYour Name 
7606*5113495bSYour Name 	target_psoc_set_num_radios(tgt_hdl, 1);
7607*5113495bSYour Name 
7608*5113495bSYour Name 	wlan_dp_update_peer_map_unmap_version(&wlan_res_cfg->peer_map_unmap_version);
7609*5113495bSYour Name 
7610*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle,
7611*5113495bSYour Name 				wmi_service_new_htt_msg_format)) {
7612*5113495bSYour Name 		cdp_cfg_set_new_htt_msg_format(soc, 1);
7613*5113495bSYour Name 		wlan_res_cfg->new_htt_msg_format = true;
7614*5113495bSYour Name 	} else {
7615*5113495bSYour Name 		cdp_cfg_set_new_htt_msg_format(soc, 0);
7616*5113495bSYour Name 		wlan_res_cfg->new_htt_msg_format = false;
7617*5113495bSYour Name 	}
7618*5113495bSYour Name 
7619*5113495bSYour Name 	if (QDF_GLOBAL_FTM_MODE  != cds_get_conparam() &&
7620*5113495bSYour Name 	    ucfg_mlme_get_peer_unmap_conf(wma_handle->psoc) &&
7621*5113495bSYour Name 	    wmi_service_enabled(wmi_handle,
7622*5113495bSYour Name 				wmi_service_peer_unmap_cnf_support)) {
7623*5113495bSYour Name 		wlan_res_cfg->peer_unmap_conf_support = true;
7624*5113495bSYour Name 		cdp_cfg_set_peer_unmap_conf_support(soc, true);
7625*5113495bSYour Name 	} else {
7626*5113495bSYour Name 		wlan_res_cfg->peer_unmap_conf_support = false;
7627*5113495bSYour Name 		cdp_cfg_set_peer_unmap_conf_support(soc, false);
7628*5113495bSYour Name 	}
7629*5113495bSYour Name 
7630*5113495bSYour Name 	if (wma_handle->enable_tx_compl_tsf64 &&
7631*5113495bSYour Name 	    wmi_service_enabled(wmi_handle,
7632*5113495bSYour Name 				wmi_service_tx_compl_tsf64)) {
7633*5113495bSYour Name 		wlan_res_cfg->tstamp64_en = true;
7634*5113495bSYour Name 		cdp_cfg_set_tx_compl_tsf64(soc, true);
7635*5113495bSYour Name 	} else {
7636*5113495bSYour Name 		wlan_res_cfg->tstamp64_en = false;
7637*5113495bSYour Name 		cdp_cfg_set_tx_compl_tsf64(soc, false);
7638*5113495bSYour Name 	}
7639*5113495bSYour Name 
7640*5113495bSYour Name 	if (ucfg_is_ftm_time_sync_enable(wma_handle->psoc) &&
7641*5113495bSYour Name 	    wmi_service_enabled(wmi_handle, wmi_service_time_sync_ftm)) {
7642*5113495bSYour Name 		wlan_res_cfg->time_sync_ftm = true;
7643*5113495bSYour Name 		ucfg_ftm_time_sync_set_enable(wma_handle->psoc, true);
7644*5113495bSYour Name 	} else {
7645*5113495bSYour Name 		wlan_res_cfg->time_sync_ftm = false;
7646*5113495bSYour Name 		ucfg_ftm_time_sync_set_enable(wma_handle->psoc, false);
7647*5113495bSYour Name 	}
7648*5113495bSYour Name 
7649*5113495bSYour Name 	if (wmi_service_enabled(wma_handle->wmi_handle, wmi_service_nan_vdev))
7650*5113495bSYour Name 		ucfg_nan_set_vdev_creation_supp_by_fw(wma_handle->psoc, true);
7651*5113495bSYour Name 
7652*5113495bSYour Name 	/* Change default hw mode as below kind of target will only be
7653*5113495bSYour Name 	 * sending single HW mode
7654*5113495bSYour Name 	 */
7655*5113495bSYour Name 	if (!wmi_service_enabled(wmi_handle,
7656*5113495bSYour Name 				 wmi_service_dual_band_simultaneous_support))
7657*5113495bSYour Name 		wma_handle->new_hw_mode_index =
7658*5113495bSYour Name 				tgt_cap_info->default_dbs_hw_mode_index;
7659*5113495bSYour Name 
7660*5113495bSYour Name 	/*
7661*5113495bSYour Name 	 * Firmware can accommodate maximum 4 vdevs and the ini gNumVdevs
7662*5113495bSYour Name 	 * indicates the same.
7663*5113495bSYour Name 	 * If host driver is going to create vdev for NAN, it indicates
7664*5113495bSYour Name 	 * the total no.of vdevs supported to firmware which includes the
7665*5113495bSYour Name 	 * NAN vdev.
7666*5113495bSYour Name 	 * If firmware is going to create NAN discovery vdev, host should
7667*5113495bSYour Name 	 * indicate 3 vdevs and firmware shall add 1 vdev for NAN. So decrement
7668*5113495bSYour Name 	 * the num_vdevs by 1.
7669*5113495bSYour Name 	 * If NAN is not supported on some target(disabled through ini
7670*5113495bSYour Name 	 * param gEnableNanSupport), there is no use of reserving one vdev for
7671*5113495bSYour Name 	 * it in firmware though firmware advertises wmi_service_nan. Indicate
7672*5113495bSYour Name 	 * firmware that host is going to take care of the NAN vdev. Host can
7673*5113495bSYour Name 	 * use the vdev either for NAN or other operations on need basis.
7674*5113495bSYour Name 	 */
7675*5113495bSYour Name 
7676*5113495bSYour Name 	if (wmi_service_enabled(wma_handle->wmi_handle, wmi_service_nan)) {
7677*5113495bSYour Name 		if (ucfg_nan_is_vdev_creation_allowed(wma_handle->psoc) ||
7678*5113495bSYour Name 		    QDF_GLOBAL_FTM_MODE == cds_get_conparam() ||
7679*5113495bSYour Name 		    !cfg_nan_get_enable(wma_handle->psoc)) {
7680*5113495bSYour Name 			wlan_res_cfg->nan_separate_iface_support = true;
7681*5113495bSYour Name 		} else {
7682*5113495bSYour Name 			wlan_res_cfg->num_vdevs--;
7683*5113495bSYour Name 			wma_update_num_peers_tids(wma_handle, wlan_res_cfg);
7684*5113495bSYour Name 		}
7685*5113495bSYour Name 	}
7686*5113495bSYour Name 
7687*5113495bSYour Name 	if ((ucfg_pkt_capture_get_mode(wma_handle->psoc) !=
7688*5113495bSYour Name 						PACKET_CAPTURE_MODE_DISABLE) &&
7689*5113495bSYour Name 	    wmi_service_enabled(wmi_handle,
7690*5113495bSYour Name 				wmi_service_packet_capture_support))
7691*5113495bSYour Name 		wlan_res_cfg->pktcapture_support = true;
7692*5113495bSYour Name 	else
7693*5113495bSYour Name 		wlan_res_cfg->pktcapture_support = false;
7694*5113495bSYour Name 	wlan_res_cfg->max_peer_ext_stats = WMA_SON_MAX_PEER_EXT_STATS;
7695*5113495bSYour Name 
7696*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle,
7697*5113495bSYour Name 				wmi_service_sae_eapol_offload_support))
7698*5113495bSYour Name 		wlan_res_cfg->sae_eapol_offload = true;
7699*5113495bSYour Name 	else
7700*5113495bSYour Name 		wlan_res_cfg->sae_eapol_offload = false;
7701*5113495bSYour Name 
7702*5113495bSYour Name 	wma_debug("num_vdevs: %u", wlan_res_cfg->num_vdevs);
7703*5113495bSYour Name 
7704*5113495bSYour Name 	wma_init_dbr_params(wma_handle);
7705*5113495bSYour Name 
7706*5113495bSYour Name 	wma_set_coex_res_cfg(wma_handle, wmi_handle, wlan_res_cfg);
7707*5113495bSYour Name 
7708*5113495bSYour Name 	return 0;
7709*5113495bSYour Name }
7710*5113495bSYour Name 
7711*5113495bSYour Name /**
7712*5113495bSYour Name  * wma_rx_ready_event() - event handler to process
7713*5113495bSYour Name  *                        wmi rx ready event.
7714*5113495bSYour Name  * @handle: wma handle
7715*5113495bSYour Name  * @cmd_param_info: command params info
7716*5113495bSYour Name  * @length: param length
7717*5113495bSYour Name  *
7718*5113495bSYour Name  * Return: none
7719*5113495bSYour Name  */
wma_rx_ready_event(void * handle,uint8_t * cmd_param_info,uint32_t length)7720*5113495bSYour Name int wma_rx_ready_event(void *handle, uint8_t *cmd_param_info,
7721*5113495bSYour Name 					uint32_t length)
7722*5113495bSYour Name {
7723*5113495bSYour Name 	tp_wma_handle wma_handle = (tp_wma_handle) handle;
7724*5113495bSYour Name 	WMI_READY_EVENTID_param_tlvs *param_buf = NULL;
7725*5113495bSYour Name 	wmi_ready_event_fixed_param *ev = NULL;
7726*5113495bSYour Name 	int ret;
7727*5113495bSYour Name 
7728*5113495bSYour Name 	wma_debug("Enter");
7729*5113495bSYour Name 
7730*5113495bSYour Name 	param_buf = (WMI_READY_EVENTID_param_tlvs *) cmd_param_info;
7731*5113495bSYour Name 	if (!(wma_handle && param_buf)) {
7732*5113495bSYour Name 		wma_err("Invalid arguments");
7733*5113495bSYour Name 		QDF_ASSERT(0);
7734*5113495bSYour Name 		return -EINVAL;
7735*5113495bSYour Name 	}
7736*5113495bSYour Name 
7737*5113495bSYour Name 	wma_debug("WMA <-- WMI_READY_EVENTID");
7738*5113495bSYour Name 
7739*5113495bSYour Name 	if (wma_is_feature_set_supported(wma_handle))
7740*5113495bSYour Name 		wma_send_feature_set_cmd(wma_handle);
7741*5113495bSYour Name 
7742*5113495bSYour Name 	ev = param_buf->fixed_param;
7743*5113495bSYour Name 	/* Indicate to the waiting thread that the ready
7744*5113495bSYour Name 	 * event was received
7745*5113495bSYour Name 	 */
7746*5113495bSYour Name 	wma_handle->sub_20_support =
7747*5113495bSYour Name 		wmi_service_enabled(wma_handle->wmi_handle,
7748*5113495bSYour Name 				wmi_service_half_rate_quarter_rate_support);
7749*5113495bSYour Name 	wma_handle->wmi_ready = true;
7750*5113495bSYour Name 	wma_handle->wlan_init_status = ev->status;
7751*5113495bSYour Name 
7752*5113495bSYour Name 	if (wma_handle->is_dfs_offloaded)
7753*5113495bSYour Name 		wmi_unified_dfs_phyerr_offload_en_cmd(
7754*5113495bSYour Name 				wma_handle->wmi_handle, 0);
7755*5113495bSYour Name 	/* copy the mac addr */
7756*5113495bSYour Name 	WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->mac_addr, wma_handle->myaddr);
7757*5113495bSYour Name 	WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->mac_addr, wma_handle->hwaddr);
7758*5113495bSYour Name 	ret = wma_update_hdd_cfg(wma_handle);
7759*5113495bSYour Name 	if (ret)
7760*5113495bSYour Name 		return ret;
7761*5113495bSYour Name 
7762*5113495bSYour Name 	wma_debug("Exit");
7763*5113495bSYour Name 
7764*5113495bSYour Name 	return 0;
7765*5113495bSYour Name }
7766*5113495bSYour Name 
7767*5113495bSYour Name /**
7768*5113495bSYour Name  * wma_wait_for_ready_event() - wait for wma ready event
7769*5113495bSYour Name  * @handle: wma handle
7770*5113495bSYour Name  *
7771*5113495bSYour Name  * Return: 0 for success or QDF error
7772*5113495bSYour Name  */
wma_wait_for_ready_event(WMA_HANDLE handle)7773*5113495bSYour Name QDF_STATUS wma_wait_for_ready_event(WMA_HANDLE handle)
7774*5113495bSYour Name {
7775*5113495bSYour Name 	tp_wma_handle wma_handle = (tp_wma_handle)handle;
7776*5113495bSYour Name 	QDF_STATUS status;
7777*5113495bSYour Name 	struct target_psoc_info *tgt_hdl;
7778*5113495bSYour Name 
7779*5113495bSYour Name 	tgt_hdl = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
7780*5113495bSYour Name 	if (!tgt_hdl) {
7781*5113495bSYour Name 		wma_err("target psoc info is NULL");
7782*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
7783*5113495bSYour Name 	}
7784*5113495bSYour Name 
7785*5113495bSYour Name 	status = qdf_wait_for_event_completion(&tgt_hdl->info.event,
7786*5113495bSYour Name 					       WMA_READY_EVENTID_TIMEOUT);
7787*5113495bSYour Name 	if (!tgt_hdl->info.wmi_ready) {
7788*5113495bSYour Name 		wma_err("Error in pdev creation");
7789*5113495bSYour Name 		if (!cds_is_driver_recovering() || !cds_is_fw_down())
7790*5113495bSYour Name 			QDF_DEBUG_PANIC("FW ready event timed out");
7791*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
7792*5113495bSYour Name 	}
7793*5113495bSYour Name 
7794*5113495bSYour Name 	if (status == QDF_STATUS_E_TIMEOUT)
7795*5113495bSYour Name 		wma_err("Timeout waiting for FW ready event");
7796*5113495bSYour Name 	else if (QDF_IS_STATUS_ERROR(status))
7797*5113495bSYour Name 		wma_err("Failed to wait for FW ready event; status:%u", status);
7798*5113495bSYour Name 	else
7799*5113495bSYour Name 		wma_info("FW ready event received");
7800*5113495bSYour Name 
7801*5113495bSYour Name 	return status;
7802*5113495bSYour Name }
7803*5113495bSYour Name 
7804*5113495bSYour Name /**
7805*5113495bSYour Name  * wma_set_ppsconfig() - set pps config in fw
7806*5113495bSYour Name  * @vdev_id: vdev id
7807*5113495bSYour Name  * @pps_param: pps params
7808*5113495bSYour Name  * @val : param value
7809*5113495bSYour Name  *
7810*5113495bSYour Name  * Return: 0 for success or QDF error
7811*5113495bSYour Name  */
wma_set_ppsconfig(uint8_t vdev_id,uint16_t pps_param,int val)7812*5113495bSYour Name QDF_STATUS wma_set_ppsconfig(uint8_t vdev_id, uint16_t pps_param,
7813*5113495bSYour Name 				    int val)
7814*5113495bSYour Name {
7815*5113495bSYour Name 	tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
7816*5113495bSYour Name 	int ret = -EIO;
7817*5113495bSYour Name 	uint32_t pps_val;
7818*5113495bSYour Name 
7819*5113495bSYour Name 	if (!wma)
7820*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
7821*5113495bSYour Name 
7822*5113495bSYour Name 	switch (pps_param) {
7823*5113495bSYour Name 	case WMA_VHT_PPS_PAID_MATCH:
7824*5113495bSYour Name 		pps_val = ((val << 31) & 0xffff0000) |
7825*5113495bSYour Name 			  (PKT_PWR_SAVE_PAID_MATCH & 0xffff);
7826*5113495bSYour Name 		goto pkt_pwr_save_config;
7827*5113495bSYour Name 	case WMA_VHT_PPS_GID_MATCH:
7828*5113495bSYour Name 		pps_val = ((val << 31) & 0xffff0000) |
7829*5113495bSYour Name 			  (PKT_PWR_SAVE_GID_MATCH & 0xffff);
7830*5113495bSYour Name 		goto pkt_pwr_save_config;
7831*5113495bSYour Name 	case WMA_VHT_PPS_DELIM_CRC_FAIL:
7832*5113495bSYour Name 		pps_val = ((val << 31) & 0xffff0000) |
7833*5113495bSYour Name 			  (PKT_PWR_SAVE_DELIM_CRC_FAIL & 0xffff);
7834*5113495bSYour Name 		goto pkt_pwr_save_config;
7835*5113495bSYour Name 
7836*5113495bSYour Name 		/* Enable the code below as and when the functionality
7837*5113495bSYour Name 		 * is supported/added in host.
7838*5113495bSYour Name 		 */
7839*5113495bSYour Name #ifdef NOT_YET
7840*5113495bSYour Name 	case WMA_VHT_PPS_EARLY_TIM_CLEAR:
7841*5113495bSYour Name 		pps_val = ((val << 31) & 0xffff0000) |
7842*5113495bSYour Name 			  (PKT_PWR_SAVE_EARLY_TIM_CLEAR & 0xffff);
7843*5113495bSYour Name 		goto pkt_pwr_save_config;
7844*5113495bSYour Name 	case WMA_VHT_PPS_EARLY_DTIM_CLEAR:
7845*5113495bSYour Name 		pps_val = ((val << 31) & 0xffff0000) |
7846*5113495bSYour Name 			  (PKT_PWR_SAVE_EARLY_DTIM_CLEAR & 0xffff);
7847*5113495bSYour Name 		goto pkt_pwr_save_config;
7848*5113495bSYour Name 	case WMA_VHT_PPS_EOF_PAD_DELIM:
7849*5113495bSYour Name 		pps_val = ((val << 31) & 0xffff0000) |
7850*5113495bSYour Name 			  (PKT_PWR_SAVE_EOF_PAD_DELIM & 0xffff);
7851*5113495bSYour Name 		goto pkt_pwr_save_config;
7852*5113495bSYour Name 	case WMA_VHT_PPS_MACADDR_MISMATCH:
7853*5113495bSYour Name 		pps_val = ((val << 31) & 0xffff0000) |
7854*5113495bSYour Name 			  (PKT_PWR_SAVE_MACADDR_MISMATCH & 0xffff);
7855*5113495bSYour Name 		goto pkt_pwr_save_config;
7856*5113495bSYour Name 	case WMA_VHT_PPS_GID_NSTS_ZERO:
7857*5113495bSYour Name 		pps_val = ((val << 31) & 0xffff0000) |
7858*5113495bSYour Name 			  (PKT_PWR_SAVE_GID_NSTS_ZERO & 0xffff);
7859*5113495bSYour Name 		goto pkt_pwr_save_config;
7860*5113495bSYour Name 	case WMA_VHT_PPS_RSSI_CHECK:
7861*5113495bSYour Name 		pps_val = ((val << 31) & 0xffff0000) |
7862*5113495bSYour Name 			  (PKT_PWR_SAVE_RSSI_CHECK & 0xffff);
7863*5113495bSYour Name 		goto pkt_pwr_save_config;
7864*5113495bSYour Name #endif /* NOT_YET */
7865*5113495bSYour Name pkt_pwr_save_config:
7866*5113495bSYour Name 		wma_debug("vdev_id:%d val:0x%x pps_val:0x%x", vdev_id,
7867*5113495bSYour Name 			 val, pps_val);
7868*5113495bSYour Name 		ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
7869*5113495bSYour Name 					      wmi_vdev_param_packet_powersave,
7870*5113495bSYour Name 					      pps_val);
7871*5113495bSYour Name 		break;
7872*5113495bSYour Name 	default:
7873*5113495bSYour Name 		wma_err("INVALID PPS CONFIG");
7874*5113495bSYour Name 	}
7875*5113495bSYour Name 
7876*5113495bSYour Name 	return (ret) ? QDF_STATUS_E_FAILURE : QDF_STATUS_SUCCESS;
7877*5113495bSYour Name }
7878*5113495bSYour Name 
7879*5113495bSYour Name /**
7880*5113495bSYour Name  * wma_process_set_mas() - Function to enable/disable MAS
7881*5113495bSYour Name  * @wma:	Pointer to WMA handle
7882*5113495bSYour Name  * @mas_val:	1-Enable MAS, 0-Disable MAS
7883*5113495bSYour Name  *
7884*5113495bSYour Name  * This function enables/disables the MAS value
7885*5113495bSYour Name  *
7886*5113495bSYour Name  * Return: QDF_SUCCESS for success otherwise failure
7887*5113495bSYour Name  */
wma_process_set_mas(tp_wma_handle wma,uint32_t * mas_val)7888*5113495bSYour Name static QDF_STATUS wma_process_set_mas(tp_wma_handle wma,
7889*5113495bSYour Name 				      uint32_t *mas_val)
7890*5113495bSYour Name {
7891*5113495bSYour Name 	uint32_t val;
7892*5113495bSYour Name 
7893*5113495bSYour Name 	if (!wma || !mas_val) {
7894*5113495bSYour Name 		wma_err("Invalid input to enable/disable MAS");
7895*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
7896*5113495bSYour Name 	}
7897*5113495bSYour Name 
7898*5113495bSYour Name 	val = (*mas_val);
7899*5113495bSYour Name 
7900*5113495bSYour Name 	if (QDF_STATUS_SUCCESS !=
7901*5113495bSYour Name 			wma_set_enable_disable_mcc_adaptive_scheduler(val)) {
7902*5113495bSYour Name 		wma_err("Unable to enable/disable MAS");
7903*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
7904*5113495bSYour Name 	}
7905*5113495bSYour Name 	wma_debug("Value is %d", val);
7906*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
7907*5113495bSYour Name }
7908*5113495bSYour Name 
7909*5113495bSYour Name /**
7910*5113495bSYour Name  * wma_process_set_miracast() - Function to set miracast value in WMA
7911*5113495bSYour Name  * @wma:		Pointer to WMA handle
7912*5113495bSYour Name  * @miracast_val:	0-Disabled,1-Source,2-Sink
7913*5113495bSYour Name  *
7914*5113495bSYour Name  * This function stores the miracast value in WMA
7915*5113495bSYour Name  *
7916*5113495bSYour Name  * Return: QDF_SUCCESS for success otherwise failure
7917*5113495bSYour Name  *
7918*5113495bSYour Name  */
wma_process_set_miracast(tp_wma_handle wma,uint32_t * miracast_val)7919*5113495bSYour Name static QDF_STATUS wma_process_set_miracast(tp_wma_handle wma,
7920*5113495bSYour Name 					   uint32_t *miracast_val)
7921*5113495bSYour Name {
7922*5113495bSYour Name 	if (!wma || !miracast_val) {
7923*5113495bSYour Name 		wma_err("Invalid input to store miracast value");
7924*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
7925*5113495bSYour Name 	}
7926*5113495bSYour Name 
7927*5113495bSYour Name 	wma->miracast_value = *miracast_val;
7928*5113495bSYour Name 	wma_debug("Miracast value is %d", wma->miracast_value);
7929*5113495bSYour Name 
7930*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
7931*5113495bSYour Name }
7932*5113495bSYour Name 
7933*5113495bSYour Name /**
7934*5113495bSYour Name  * wma_config_stats_factor() - Function to configure stats avg. factor
7935*5113495bSYour Name  * @wma:  pointer to WMA handle
7936*5113495bSYour Name  * @avg_factor:	stats. avg. factor passed down by userspace
7937*5113495bSYour Name  *
7938*5113495bSYour Name  * This function configures the avg. stats value in firmware
7939*5113495bSYour Name  *
7940*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS for success otherwise failure
7941*5113495bSYour Name  *
7942*5113495bSYour Name  */
wma_config_stats_factor(tp_wma_handle wma,struct sir_stats_avg_factor * avg_factor)7943*5113495bSYour Name static QDF_STATUS wma_config_stats_factor(tp_wma_handle wma,
7944*5113495bSYour Name 				      struct sir_stats_avg_factor *avg_factor)
7945*5113495bSYour Name {
7946*5113495bSYour Name 	QDF_STATUS ret;
7947*5113495bSYour Name 
7948*5113495bSYour Name 	if (!wma || !avg_factor) {
7949*5113495bSYour Name 		wma_err("Invalid input of stats avg factor");
7950*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
7951*5113495bSYour Name 	}
7952*5113495bSYour Name 
7953*5113495bSYour Name 	ret = wma_vdev_set_param(wma->wmi_handle,
7954*5113495bSYour Name 					    avg_factor->vdev_id,
7955*5113495bSYour Name 					    wmi_vdev_param_stats_avg_factor,
7956*5113495bSYour Name 					    avg_factor->stats_avg_factor);
7957*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(ret)) {
7958*5113495bSYour Name 		wma_err("failed to set avg_factor for vdev_id %d",
7959*5113495bSYour Name 			 avg_factor->vdev_id);
7960*5113495bSYour Name 	}
7961*5113495bSYour Name 
7962*5113495bSYour Name 	wma_debug("Set stats_avg_factor %d for vdev_id %d",
7963*5113495bSYour Name 		 avg_factor->stats_avg_factor, avg_factor->vdev_id);
7964*5113495bSYour Name 
7965*5113495bSYour Name 	return ret;
7966*5113495bSYour Name }
7967*5113495bSYour Name 
7968*5113495bSYour Name /**
7969*5113495bSYour Name  * wma_config_guard_time() - Function to set guard time in firmware
7970*5113495bSYour Name  * @wma:  pointer to WMA handle
7971*5113495bSYour Name  * @guard_time:  guard time passed down by userspace
7972*5113495bSYour Name  *
7973*5113495bSYour Name  * This function configures the guard time in firmware
7974*5113495bSYour Name  *
7975*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS for success otherwise failure
7976*5113495bSYour Name  *
7977*5113495bSYour Name  */
wma_config_guard_time(tp_wma_handle wma,struct sir_guard_time_request * guard_time)7978*5113495bSYour Name static QDF_STATUS wma_config_guard_time(tp_wma_handle wma,
7979*5113495bSYour Name 				   struct sir_guard_time_request *guard_time)
7980*5113495bSYour Name {
7981*5113495bSYour Name 	QDF_STATUS ret;
7982*5113495bSYour Name 
7983*5113495bSYour Name 	if (!wma || !guard_time) {
7984*5113495bSYour Name 		wma_err("Invalid input of guard time");
7985*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
7986*5113495bSYour Name 	}
7987*5113495bSYour Name 
7988*5113495bSYour Name 	ret = wma_vdev_set_param(wma->wmi_handle,
7989*5113495bSYour Name 					      guard_time->vdev_id,
7990*5113495bSYour Name 					      wmi_vdev_param_rx_leak_window,
7991*5113495bSYour Name 					      guard_time->guard_time);
7992*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(ret)) {
7993*5113495bSYour Name 		wma_err("failed to set guard time for vdev_id %d",
7994*5113495bSYour Name 			 guard_time->vdev_id);
7995*5113495bSYour Name 	}
7996*5113495bSYour Name 
7997*5113495bSYour Name 	wma_debug("Set guard time %d for vdev_id %d",
7998*5113495bSYour Name 		 guard_time->guard_time, guard_time->vdev_id);
7999*5113495bSYour Name 
8000*5113495bSYour Name 	return ret;
8001*5113495bSYour Name }
8002*5113495bSYour Name 
8003*5113495bSYour Name /**
8004*5113495bSYour Name  * wma_enable_specific_fw_logs() - Start/Stop logging of diag event/log id
8005*5113495bSYour Name  * @wma_handle: WMA handle
8006*5113495bSYour Name  * @start_log: Start logging related parameters
8007*5113495bSYour Name  *
8008*5113495bSYour Name  * Send the command to the FW based on which specific logging of diag
8009*5113495bSYour Name  * event/log id can be started/stopped
8010*5113495bSYour Name  *
8011*5113495bSYour Name  * Return: None
8012*5113495bSYour Name  */
wma_enable_specific_fw_logs(tp_wma_handle wma_handle,struct sir_wifi_start_log * start_log)8013*5113495bSYour Name static void wma_enable_specific_fw_logs(tp_wma_handle wma_handle,
8014*5113495bSYour Name 					struct sir_wifi_start_log *start_log)
8015*5113495bSYour Name {
8016*5113495bSYour Name 
8017*5113495bSYour Name 	if (!start_log) {
8018*5113495bSYour Name 		wma_err("start_log pointer is NULL");
8019*5113495bSYour Name 		return;
8020*5113495bSYour Name 	}
8021*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
8022*5113495bSYour Name 		return;
8023*5113495bSYour Name 
8024*5113495bSYour Name 	if (!((start_log->ring_id == RING_ID_CONNECTIVITY) ||
8025*5113495bSYour Name 			(start_log->ring_id == RING_ID_FIRMWARE_DEBUG))) {
8026*5113495bSYour Name 		wma_debug("Not connectivity or fw debug ring: %d",
8027*5113495bSYour Name 				start_log->ring_id);
8028*5113495bSYour Name 		return;
8029*5113495bSYour Name 	}
8030*5113495bSYour Name 
8031*5113495bSYour Name 	wmi_unified_enable_specific_fw_logs_cmd(wma_handle->wmi_handle,
8032*5113495bSYour Name 				(struct wmi_wifi_start_log *)start_log);
8033*5113495bSYour Name }
8034*5113495bSYour Name 
8035*5113495bSYour Name #define MEGABYTE	(1024 * 1024)
8036*5113495bSYour Name /**
8037*5113495bSYour Name  * wma_set_wifi_start_packet_stats() - Start/stop packet stats
8038*5113495bSYour Name  * @wma_handle: WMA handle
8039*5113495bSYour Name  * @start_log: Structure containing the start wifi logger params
8040*5113495bSYour Name  *
8041*5113495bSYour Name  * This function is used to send the WMA commands to start/stop logging
8042*5113495bSYour Name  * of per packet statistics
8043*5113495bSYour Name  *
8044*5113495bSYour Name  * Return: None
8045*5113495bSYour Name  *
8046*5113495bSYour Name  */
8047*5113495bSYour Name #if !defined(FEATURE_PKTLOG) || defined(REMOVE_PKT_LOG)
wma_set_wifi_start_packet_stats(void * wma_handle,struct sir_wifi_start_log * start_log)8048*5113495bSYour Name static void wma_set_wifi_start_packet_stats(void *wma_handle,
8049*5113495bSYour Name 					struct sir_wifi_start_log *start_log)
8050*5113495bSYour Name {
8051*5113495bSYour Name }
8052*5113495bSYour Name 
8053*5113495bSYour Name #else
wma_set_wifi_start_packet_stats(void * wma_handle,struct sir_wifi_start_log * start_log)8054*5113495bSYour Name static void wma_set_wifi_start_packet_stats(void *wma_handle,
8055*5113495bSYour Name 					struct sir_wifi_start_log *start_log)
8056*5113495bSYour Name {
8057*5113495bSYour Name 	struct hif_opaque_softc *scn;
8058*5113495bSYour Name 	uint32_t log_state;
8059*5113495bSYour Name 
8060*5113495bSYour Name 	if (!start_log) {
8061*5113495bSYour Name 		wma_err("start_log pointer is NULL");
8062*5113495bSYour Name 		return;
8063*5113495bSYour Name 	}
8064*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
8065*5113495bSYour Name 		return;
8066*5113495bSYour Name 
8067*5113495bSYour Name 	/* No need to register for ring IDs other than packet stats */
8068*5113495bSYour Name 	if (start_log->ring_id != RING_ID_PER_PACKET_STATS) {
8069*5113495bSYour Name 		wma_debug("Ring id is not for per packet stats: %d",
8070*5113495bSYour Name 			 start_log->ring_id);
8071*5113495bSYour Name 		return;
8072*5113495bSYour Name 	}
8073*5113495bSYour Name 
8074*5113495bSYour Name 	scn = cds_get_context(QDF_MODULE_ID_HIF);
8075*5113495bSYour Name 	if (!scn) {
8076*5113495bSYour Name 		wma_err("Invalid HIF handle");
8077*5113495bSYour Name 		return;
8078*5113495bSYour Name 	}
8079*5113495bSYour Name 
8080*5113495bSYour Name #ifdef PKTLOG_LEGACY
8081*5113495bSYour Name 	log_state = ATH_PKTLOG_ANI | ATH_PKTLOG_RCUPDATE | ATH_PKTLOG_RCFIND |
8082*5113495bSYour Name 		ATH_PKTLOG_RX | ATH_PKTLOG_TX |
8083*5113495bSYour Name 		ATH_PKTLOG_TEXT | ATH_PKTLOG_SW_EVENT;
8084*5113495bSYour Name #elif defined(QCA_WIFI_QCA6390) || defined(QCA_WIFI_QCA6490) || \
8085*5113495bSYour Name       defined(QCA_WIFI_QCA6750) || defined(QCA_WIFI_KIWI) || \
8086*5113495bSYour Name       defined(QCA_WIFI_WCN6450)
8087*5113495bSYour Name 	log_state = ATH_PKTLOG_RCFIND | ATH_PKTLOG_RCUPDATE |
8088*5113495bSYour Name 		    ATH_PKTLOG_TX | ATH_PKTLOG_LITE_T2H |
8089*5113495bSYour Name 		    ATH_PKTLOG_SW_EVENT | ATH_PKTLOG_RX;
8090*5113495bSYour Name #elif defined(QCA_WIFI_QCA6290)
8091*5113495bSYour Name 	log_state = ATH_PKTLOG_LITE_RX | ATH_PKTLOG_LITE_T2H;
8092*5113495bSYour Name #else
8093*5113495bSYour Name 	wma_debug("Packet log Not supported");
8094*5113495bSYour Name 	log_state = 0;
8095*5113495bSYour Name #endif
8096*5113495bSYour Name 	if (start_log->size != 0) {
8097*5113495bSYour Name 		pktlog_setsize(scn, start_log->size * MEGABYTE);
8098*5113495bSYour Name 		return;
8099*5113495bSYour Name 	} else if (start_log->is_pktlog_buff_clear == true) {
8100*5113495bSYour Name 		pktlog_clearbuff(scn, start_log->is_pktlog_buff_clear);
8101*5113495bSYour Name 		return;
8102*5113495bSYour Name 	}
8103*5113495bSYour Name 
8104*5113495bSYour Name 	if (start_log->verbose_level == WLAN_LOG_LEVEL_ACTIVE) {
8105*5113495bSYour Name 		pktlog_enable(scn, log_state, start_log->ini_triggered,
8106*5113495bSYour Name 			      start_log->user_triggered,
8107*5113495bSYour Name 			      start_log->is_iwpriv_command);
8108*5113495bSYour Name 		wma_debug("Enabling per packet stats");
8109*5113495bSYour Name 	} else {
8110*5113495bSYour Name 		pktlog_enable(scn, 0, start_log->ini_triggered,
8111*5113495bSYour Name 				start_log->user_triggered,
8112*5113495bSYour Name 				start_log->is_iwpriv_command);
8113*5113495bSYour Name 		wma_debug("Disabling per packet stats");
8114*5113495bSYour Name 	}
8115*5113495bSYour Name }
8116*5113495bSYour Name #endif
8117*5113495bSYour Name 
8118*5113495bSYour Name /**
8119*5113495bSYour Name  * wma_send_flush_logs_to_fw() - Send log flush command to FW
8120*5113495bSYour Name  * @wma_handle: WMI handle
8121*5113495bSYour Name  *
8122*5113495bSYour Name  * This function is used to send the flush command to the FW,
8123*5113495bSYour Name  * that will flush the fw logs that are residue in the FW
8124*5113495bSYour Name  *
8125*5113495bSYour Name  * Return: None
8126*5113495bSYour Name  */
wma_send_flush_logs_to_fw(tp_wma_handle wma_handle)8127*5113495bSYour Name void wma_send_flush_logs_to_fw(tp_wma_handle wma_handle)
8128*5113495bSYour Name {
8129*5113495bSYour Name 	QDF_STATUS status;
8130*5113495bSYour Name 
8131*5113495bSYour Name 	status = wmi_unified_flush_logs_to_fw_cmd(wma_handle->wmi_handle);
8132*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
8133*5113495bSYour Name 		return;
8134*5113495bSYour Name 
8135*5113495bSYour Name 	status = qdf_mc_timer_start(&wma_handle->log_completion_timer,
8136*5113495bSYour Name 				    WMA_LOG_COMPLETION_TIMER);
8137*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
8138*5113495bSYour Name 		wma_err("Failed to start the log completion timer");
8139*5113495bSYour Name }
8140*5113495bSYour Name 
8141*5113495bSYour Name /**
8142*5113495bSYour Name  * wma_update_tx_fail_cnt_th() - Set threshold for TX pkt fail
8143*5113495bSYour Name  * @wma: WMA handle
8144*5113495bSYour Name  * @tx_fail_cnt_th: sme_tx_fail_cnt_threshold parameter
8145*5113495bSYour Name  *
8146*5113495bSYour Name  * This function is used to set Tx pkt fail count threshold,
8147*5113495bSYour Name  * FW will do disconnect with station once this threshold is reached.
8148*5113495bSYour Name  *
8149*5113495bSYour Name  * Return: QDF_STATUS
8150*5113495bSYour Name  */
wma_update_tx_fail_cnt_th(tp_wma_handle wma,struct sme_tx_fail_cnt_threshold * tx_fail_cnt_th)8151*5113495bSYour Name static QDF_STATUS wma_update_tx_fail_cnt_th(tp_wma_handle wma,
8152*5113495bSYour Name 			struct sme_tx_fail_cnt_threshold *tx_fail_cnt_th)
8153*5113495bSYour Name {
8154*5113495bSYour Name 	u_int8_t vdev_id;
8155*5113495bSYour Name 	u_int32_t tx_fail_disconn_th;
8156*5113495bSYour Name 	int ret = -EIO;
8157*5113495bSYour Name 	struct wmi_unified *wmi_handle;
8158*5113495bSYour Name 
8159*5113495bSYour Name 	if (wma_validate_handle(wma))
8160*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
8161*5113495bSYour Name 
8162*5113495bSYour Name 	wmi_handle = wma->wmi_handle;
8163*5113495bSYour Name 	if (wmi_validate_handle(wmi_handle))
8164*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
8165*5113495bSYour Name 
8166*5113495bSYour Name 	vdev_id = tx_fail_cnt_th->session_id;
8167*5113495bSYour Name 	tx_fail_disconn_th = tx_fail_cnt_th->tx_fail_cnt_threshold;
8168*5113495bSYour Name 	wma_debug("Set TX pkt fail count threshold  vdevId %d count %d",
8169*5113495bSYour Name 			vdev_id, tx_fail_disconn_th);
8170*5113495bSYour Name 
8171*5113495bSYour Name 	ret = wma_vdev_set_param(wmi_handle, vdev_id,
8172*5113495bSYour Name 			wmi_vdev_param_disconnect_th,
8173*5113495bSYour Name 			tx_fail_disconn_th);
8174*5113495bSYour Name 
8175*5113495bSYour Name 	if (ret) {
8176*5113495bSYour Name 		wma_err("Failed to send TX pkt fail count threshold command");
8177*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
8178*5113495bSYour Name 	}
8179*5113495bSYour Name 
8180*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
8181*5113495bSYour Name }
8182*5113495bSYour Name 
8183*5113495bSYour Name /**
8184*5113495bSYour Name  * wma_update_short_retry_limit() - Set retry limit for short frames
8185*5113495bSYour Name  * @wma: WMA handle
8186*5113495bSYour Name  * @short_retry_limit_th: retry limir count for Short frames.
8187*5113495bSYour Name  *
8188*5113495bSYour Name  * This function is used to configure the transmission retry limit at which
8189*5113495bSYour Name  * short frames needs to be retry.
8190*5113495bSYour Name  *
8191*5113495bSYour Name  * Return: QDF_STATUS
8192*5113495bSYour Name  */
wma_update_short_retry_limit(tp_wma_handle wma,struct sme_short_retry_limit * short_retry_limit_th)8193*5113495bSYour Name static QDF_STATUS wma_update_short_retry_limit(tp_wma_handle wma,
8194*5113495bSYour Name 		struct sme_short_retry_limit *short_retry_limit_th)
8195*5113495bSYour Name {
8196*5113495bSYour Name 	uint8_t vdev_id;
8197*5113495bSYour Name 	uint32_t short_retry_limit;
8198*5113495bSYour Name 	int ret;
8199*5113495bSYour Name 	struct wmi_unified *wmi_handle;
8200*5113495bSYour Name 
8201*5113495bSYour Name 	if (wma_validate_handle(wma))
8202*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
8203*5113495bSYour Name 
8204*5113495bSYour Name 	wmi_handle = wma->wmi_handle;
8205*5113495bSYour Name 	if (wmi_validate_handle(wmi_handle))
8206*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
8207*5113495bSYour Name 
8208*5113495bSYour Name 	vdev_id = short_retry_limit_th->session_id;
8209*5113495bSYour Name 	short_retry_limit = short_retry_limit_th->short_retry_limit;
8210*5113495bSYour Name 	wma_debug("Set short retry limit threshold  vdevId %d count %d",
8211*5113495bSYour Name 		vdev_id, short_retry_limit);
8212*5113495bSYour Name 
8213*5113495bSYour Name 	ret = wma_vdev_set_param(wmi_handle, vdev_id,
8214*5113495bSYour Name 				 wmi_vdev_param_non_agg_sw_retry_th,
8215*5113495bSYour Name 				 short_retry_limit);
8216*5113495bSYour Name 
8217*5113495bSYour Name 	if (ret) {
8218*5113495bSYour Name 		wma_err("Failed to send short limit threshold command");
8219*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
8220*5113495bSYour Name 	}
8221*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
8222*5113495bSYour Name }
8223*5113495bSYour Name 
8224*5113495bSYour Name /**
8225*5113495bSYour Name  * wma_update_long_retry_limit() - Set retry limit for long frames
8226*5113495bSYour Name  * @wma: WMA handle
8227*5113495bSYour Name  * @long_retry_limit_th: retry limir count for long frames
8228*5113495bSYour Name  *
8229*5113495bSYour Name  * This function is used to configure the transmission retry limit at which
8230*5113495bSYour Name  * long frames needs to be retry
8231*5113495bSYour Name  *
8232*5113495bSYour Name  * Return: QDF_STATUS
8233*5113495bSYour Name  */
wma_update_long_retry_limit(tp_wma_handle wma,struct sme_long_retry_limit * long_retry_limit_th)8234*5113495bSYour Name static QDF_STATUS wma_update_long_retry_limit(tp_wma_handle wma,
8235*5113495bSYour Name 		struct sme_long_retry_limit  *long_retry_limit_th)
8236*5113495bSYour Name {
8237*5113495bSYour Name 	uint8_t vdev_id;
8238*5113495bSYour Name 	uint32_t long_retry_limit;
8239*5113495bSYour Name 	int ret;
8240*5113495bSYour Name 	struct wmi_unified *wmi_handle;
8241*5113495bSYour Name 
8242*5113495bSYour Name 	if (wma_validate_handle(wma))
8243*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
8244*5113495bSYour Name 
8245*5113495bSYour Name 	wmi_handle = wma->wmi_handle;
8246*5113495bSYour Name 	if (wmi_validate_handle(wmi_handle))
8247*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
8248*5113495bSYour Name 
8249*5113495bSYour Name 	vdev_id = long_retry_limit_th->session_id;
8250*5113495bSYour Name 	long_retry_limit = long_retry_limit_th->long_retry_limit;
8251*5113495bSYour Name 	wma_debug("Set TX pkt fail count threshold  vdevId %d count %d",
8252*5113495bSYour Name 		vdev_id, long_retry_limit);
8253*5113495bSYour Name 
8254*5113495bSYour Name 	ret  = wma_vdev_set_param(wmi_handle, vdev_id,
8255*5113495bSYour Name 			wmi_vdev_param_agg_sw_retry_th,
8256*5113495bSYour Name 			long_retry_limit);
8257*5113495bSYour Name 
8258*5113495bSYour Name 	if (ret) {
8259*5113495bSYour Name 		wma_err("Failed to send long limit threshold command");
8260*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
8261*5113495bSYour Name 	}
8262*5113495bSYour Name 
8263*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
8264*5113495bSYour Name }
8265*5113495bSYour Name 
8266*5113495bSYour Name #define MAX_VDEV_AP_ALIVE_PARAMS 4
8267*5113495bSYour Name /* params being sent:
8268*5113495bSYour Name  * wmi_vdev_param_ap_keepalive_min_idle_inactive_time_secs
8269*5113495bSYour Name  * wmi_vdev_param_ap_keepalive_max_idle_inactive_secs
8270*5113495bSYour Name  * wmi_vdev_param_ap_keepalive_min_idle_inactive_time_secs
8271*5113495bSYour Name  * wmi_vdev_param_ap_keepalive_max_unresponsive_time_secs
8272*5113495bSYour Name  */
8273*5113495bSYour Name 
8274*5113495bSYour Name /*
8275*5113495bSYour Name  * wma_update_sta_inactivity_timeout() - Set sta_inactivity_timeout to fw
8276*5113495bSYour Name  * @wma_handle: WMA handle
8277*5113495bSYour Name  * @sta_inactivity_timer: sme_sta_inactivity_timeout
8278*5113495bSYour Name  *
8279*5113495bSYour Name  * This function is used to set sta_inactivity_timeout.
8280*5113495bSYour Name  * If a station does not send anything in sta_inactivity_timeout seconds, an
8281*5113495bSYour Name  * empty data frame is sent to it in order to verify whether it is
8282*5113495bSYour Name  * still in range. If this frame is not ACKed, the station will be
8283*5113495bSYour Name  * disassociated and then deauthenticated.
8284*5113495bSYour Name  *
8285*5113495bSYour Name  * Return: None
8286*5113495bSYour Name  */
wma_update_sta_inactivity_timeout(tp_wma_handle wma,struct sme_sta_inactivity_timeout * sta_inactivity_timer)8287*5113495bSYour Name void wma_update_sta_inactivity_timeout(tp_wma_handle wma,
8288*5113495bSYour Name 		struct sme_sta_inactivity_timeout  *sta_inactivity_timer)
8289*5113495bSYour Name {
8290*5113495bSYour Name 	uint8_t vdev_id;
8291*5113495bSYour Name 	uint32_t max_unresponsive_time;
8292*5113495bSYour Name 	uint32_t min_inactive_time, max_inactive_time;
8293*5113495bSYour Name 	struct wmi_unified *wmi_handle;
8294*5113495bSYour Name 	struct dev_set_param setparam[MAX_VDEV_AP_ALIVE_PARAMS] = {};
8295*5113495bSYour Name 	uint8_t index = 0;
8296*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
8297*5113495bSYour Name 
8298*5113495bSYour Name 	if (wma_validate_handle(wma))
8299*5113495bSYour Name 		return;
8300*5113495bSYour Name 
8301*5113495bSYour Name 	wmi_handle = wma->wmi_handle;
8302*5113495bSYour Name 	if (wmi_validate_handle(wmi_handle))
8303*5113495bSYour Name 		return;
8304*5113495bSYour Name 
8305*5113495bSYour Name 	vdev_id = sta_inactivity_timer->session_id;
8306*5113495bSYour Name 	max_unresponsive_time = sta_inactivity_timer->sta_inactivity_timeout;
8307*5113495bSYour Name 	max_inactive_time = max_unresponsive_time * TWO_THIRD;
8308*5113495bSYour Name 	min_inactive_time = max_unresponsive_time - max_inactive_time;
8309*5113495bSYour Name 	status = mlme_check_index_setparam(
8310*5113495bSYour Name 			setparam,
8311*5113495bSYour Name 			wmi_vdev_param_ap_keepalive_min_idle_inactive_time_secs,
8312*5113495bSYour Name 			min_inactive_time, index++,
8313*5113495bSYour Name 			MAX_VDEV_AP_ALIVE_PARAMS);
8314*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
8315*5113495bSYour Name 		wma_err("failed to set wmi_vdev_param_ap_keepalive_min_idle_inactive_time_secs");
8316*5113495bSYour Name 		goto error;
8317*5113495bSYour Name 	}
8318*5113495bSYour Name 	status = mlme_check_index_setparam(
8319*5113495bSYour Name 			setparam,
8320*5113495bSYour Name 			wmi_vdev_param_ap_keepalive_max_idle_inactive_secs,
8321*5113495bSYour Name 			min_inactive_time, index++, MAX_VDEV_AP_ALIVE_PARAMS);
8322*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
8323*5113495bSYour Name 		wma_err("failed to set wmi_vdev_param_ap_keepalive_max_idle_inactive_secs");
8324*5113495bSYour Name 		goto error;
8325*5113495bSYour Name 	}
8326*5113495bSYour Name 	status = mlme_check_index_setparam(
8327*5113495bSYour Name 			setparam,
8328*5113495bSYour Name 			wmi_vdev_param_ap_keepalive_min_idle_inactive_time_secs,
8329*5113495bSYour Name 			max_inactive_time, index++, MAX_VDEV_AP_ALIVE_PARAMS);
8330*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
8331*5113495bSYour Name 		wma_err("failed to set wmi_vdev_param_ap_keepalive_min_idle_inactive_time_secs");
8332*5113495bSYour Name 		goto error;
8333*5113495bSYour Name 	}
8334*5113495bSYour Name 	status = mlme_check_index_setparam(
8335*5113495bSYour Name 			setparam,
8336*5113495bSYour Name 			wmi_vdev_param_ap_keepalive_max_unresponsive_time_secs,
8337*5113495bSYour Name 			max_unresponsive_time, index++,
8338*5113495bSYour Name 			MAX_VDEV_AP_ALIVE_PARAMS);
8339*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
8340*5113495bSYour Name 		wma_err("failed to set wmi_vdev_param_ap_keepalive_max_unresponsive_time_secs");
8341*5113495bSYour Name 		goto error;
8342*5113495bSYour Name 	}
8343*5113495bSYour Name 
8344*5113495bSYour Name 	status = wma_send_multi_pdev_vdev_set_params(MLME_VDEV_SETPARAM,
8345*5113495bSYour Name 						     vdev_id, setparam, index);
8346*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
8347*5113495bSYour Name 		wma_err("Failed to send idle_inactive,unresponsive time vdev set params");
8348*5113495bSYour Name 
8349*5113495bSYour Name error:
8350*5113495bSYour Name 	return;
8351*5113495bSYour Name }
8352*5113495bSYour Name 
8353*5113495bSYour Name #ifdef WLAN_FEATURE_WOW_PULSE
8354*5113495bSYour Name 
8355*5113495bSYour Name 
8356*5113495bSYour Name #define WMI_WOW_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM \
8357*5113495bSYour Name WMI_WOW_HOSTWAKEUP_GPIO_PIN_PATTERN_CONFIG_CMD_fixed_param
8358*5113495bSYour Name 
8359*5113495bSYour Name 
8360*5113495bSYour Name #define WMITLV_TAG_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM \
8361*5113495bSYour Name WMITLV_TAG_STRUC_wmi_wow_hostwakeup_gpio_pin_pattern_config_cmd_fixed_param
8362*5113495bSYour Name 
8363*5113495bSYour Name /**
8364*5113495bSYour Name  * wma_send_wow_pulse_cmd() - send wmi cmd of wow pulse cmd
8365*5113495bSYour Name  * information to fw.
8366*5113495bSYour Name  * @wma_handle: wma handler
8367*5113495bSYour Name  * @wow_pulse_cmd: wow_pulse_mode pointer
8368*5113495bSYour Name  *
8369*5113495bSYour Name  * Return: Return QDF_STATUS
8370*5113495bSYour Name  */
wma_send_wow_pulse_cmd(tp_wma_handle wma_handle,struct wow_pulse_mode * wow_pulse_cmd)8371*5113495bSYour Name static QDF_STATUS wma_send_wow_pulse_cmd(tp_wma_handle wma_handle,
8372*5113495bSYour Name 					struct wow_pulse_mode *wow_pulse_cmd)
8373*5113495bSYour Name {
8374*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
8375*5113495bSYour Name 	wmi_buf_t buf;
8376*5113495bSYour Name 	WMI_WOW_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM *cmd;
8377*5113495bSYour Name 	u_int16_t len;
8378*5113495bSYour Name 
8379*5113495bSYour Name 	len = sizeof(*cmd);
8380*5113495bSYour Name 	buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
8381*5113495bSYour Name 	if (!buf)
8382*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
8383*5113495bSYour Name 
8384*5113495bSYour Name 	cmd = (WMI_WOW_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM *)wmi_buf_data(buf);
8385*5113495bSYour Name 	qdf_mem_zero(cmd, len);
8386*5113495bSYour Name 
8387*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
8388*5113495bSYour Name 		WMITLV_TAG_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM,
8389*5113495bSYour Name 		WMITLV_GET_STRUCT_TLVLEN(
8390*5113495bSYour Name 			WMI_WOW_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM));
8391*5113495bSYour Name 
8392*5113495bSYour Name 	cmd->enable = wow_pulse_cmd->wow_pulse_enable;
8393*5113495bSYour Name 	cmd->pin = wow_pulse_cmd->wow_pulse_pin;
8394*5113495bSYour Name 	cmd->interval_low = wow_pulse_cmd->wow_pulse_interval_low;
8395*5113495bSYour Name 	cmd->interval_high = wow_pulse_cmd->wow_pulse_interval_high;
8396*5113495bSYour Name 	cmd->repeat_cnt = wow_pulse_cmd->wow_pulse_repeat_count;
8397*5113495bSYour Name 	cmd->init_state = wow_pulse_cmd->wow_pulse_init_state;
8398*5113495bSYour Name 
8399*5113495bSYour Name 	if (wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
8400*5113495bSYour Name 		WMI_WOW_HOSTWAKEUP_GPIO_PIN_PATTERN_CONFIG_CMDID)) {
8401*5113495bSYour Name 		wmi_buf_free(buf);
8402*5113495bSYour Name 		status = QDF_STATUS_E_FAILURE;
8403*5113495bSYour Name 	}
8404*5113495bSYour Name 
8405*5113495bSYour Name 	wma_debug("Exit");
8406*5113495bSYour Name 	return status;
8407*5113495bSYour Name }
8408*5113495bSYour Name 
8409*5113495bSYour Name #undef WMI_WOW_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM
8410*5113495bSYour Name #undef WMITLV_TAG_HOSTWAKEUP_GPIO_CMD_FIXED_PARAM
8411*5113495bSYour Name #undef WMI_WOW_PULSE_REPEAT_CNT
8412*5113495bSYour Name 
8413*5113495bSYour Name #else
wma_send_wow_pulse_cmd(tp_wma_handle wma_handle,struct wow_pulse_mode * wow_pulse_cmd)8414*5113495bSYour Name static inline QDF_STATUS wma_send_wow_pulse_cmd(tp_wma_handle wma_handle,
8415*5113495bSYour Name 					struct wow_pulse_mode *wow_pulse_cmd)
8416*5113495bSYour Name {
8417*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
8418*5113495bSYour Name }
8419*5113495bSYour Name #endif
8420*5113495bSYour Name 
8421*5113495bSYour Name 
8422*5113495bSYour Name /**
8423*5113495bSYour Name  * wma_process_power_debug_stats_req() - Process the Chip Power stats collect
8424*5113495bSYour Name  * request and pass the Power stats request to Fw
8425*5113495bSYour Name  * @wma_handle: WMA handle
8426*5113495bSYour Name  *
8427*5113495bSYour Name  * Return: QDF_STATUS
8428*5113495bSYour Name  */
8429*5113495bSYour Name #ifdef WLAN_POWER_DEBUG
wma_process_power_debug_stats_req(tp_wma_handle wma_handle)8430*5113495bSYour Name static QDF_STATUS wma_process_power_debug_stats_req(tp_wma_handle wma_handle)
8431*5113495bSYour Name {
8432*5113495bSYour Name 	wmi_pdev_get_chip_power_stats_cmd_fixed_param *cmd;
8433*5113495bSYour Name 	int32_t len;
8434*5113495bSYour Name 	wmi_buf_t buf;
8435*5113495bSYour Name 	uint8_t *buf_ptr;
8436*5113495bSYour Name 	int ret;
8437*5113495bSYour Name 
8438*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
8439*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
8440*5113495bSYour Name 
8441*5113495bSYour Name 	len = sizeof(*cmd);
8442*5113495bSYour Name 	buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
8443*5113495bSYour Name 	if (!buf)
8444*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
8445*5113495bSYour Name 
8446*5113495bSYour Name 	buf_ptr = (u_int8_t *) wmi_buf_data(buf);
8447*5113495bSYour Name 	cmd = (wmi_pdev_get_chip_power_stats_cmd_fixed_param *) buf_ptr;
8448*5113495bSYour Name 
8449*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
8450*5113495bSYour Name 		WMITLV_TAG_STRUC_wmi_get_chip_power_stats_cmd_fixed_param,
8451*5113495bSYour Name 		WMITLV_GET_STRUCT_TLVLEN(
8452*5113495bSYour Name 			wmi_pdev_get_chip_power_stats_cmd_fixed_param));
8453*5113495bSYour Name 	cmd->pdev_id = 0;
8454*5113495bSYour Name 
8455*5113495bSYour Name 	wma_debug("POWER_DEBUG_STATS - Get Request Params; Pdev id - %d",
8456*5113495bSYour Name 			cmd->pdev_id);
8457*5113495bSYour Name 	ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
8458*5113495bSYour Name 			WMI_PDEV_GET_CHIP_POWER_STATS_CMDID);
8459*5113495bSYour Name 	if (ret) {
8460*5113495bSYour Name 		wmi_buf_free(buf);
8461*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
8462*5113495bSYour Name 	}
8463*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
8464*5113495bSYour Name }
8465*5113495bSYour Name #else
wma_process_power_debug_stats_req(tp_wma_handle wma_handle)8466*5113495bSYour Name static QDF_STATUS wma_process_power_debug_stats_req(tp_wma_handle wma_handle)
8467*5113495bSYour Name {
8468*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
8469*5113495bSYour Name }
8470*5113495bSYour Name #endif
8471*5113495bSYour Name #ifdef WLAN_FEATURE_BEACON_RECEPTION_STATS
wma_process_beacon_debug_stats_req(tp_wma_handle wma_handle,uint32_t * vdev_id)8472*5113495bSYour Name static QDF_STATUS wma_process_beacon_debug_stats_req(tp_wma_handle wma_handle,
8473*5113495bSYour Name 						     uint32_t *vdev_id)
8474*5113495bSYour Name {
8475*5113495bSYour Name 	wmi_vdev_get_bcn_recv_stats_cmd_fixed_param *cmd;
8476*5113495bSYour Name 	int32_t len;
8477*5113495bSYour Name 	wmi_buf_t buf;
8478*5113495bSYour Name 	uint8_t *buf_ptr;
8479*5113495bSYour Name 	int ret;
8480*5113495bSYour Name 
8481*5113495bSYour Name 	wma_debug("Enter");
8482*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
8483*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
8484*5113495bSYour Name 
8485*5113495bSYour Name 	len = sizeof(*cmd);
8486*5113495bSYour Name 	buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
8487*5113495bSYour Name 	if (!buf)
8488*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
8489*5113495bSYour Name 
8490*5113495bSYour Name 	buf_ptr = (u_int8_t *)wmi_buf_data(buf);
8491*5113495bSYour Name 	cmd = (wmi_vdev_get_bcn_recv_stats_cmd_fixed_param *)buf_ptr;
8492*5113495bSYour Name 
8493*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
8494*5113495bSYour Name 		WMITLV_TAG_STRUC_wmi_get_bcn_recv_stats_fixed_param,
8495*5113495bSYour Name 		WMITLV_GET_STRUCT_TLVLEN(
8496*5113495bSYour Name 			wmi_vdev_get_bcn_recv_stats_cmd_fixed_param));
8497*5113495bSYour Name 	cmd->vdev_id = *vdev_id;
8498*5113495bSYour Name 
8499*5113495bSYour Name 	wma_debug("BEACON_DEBUG_STATS - Get Request Params; vdev id - %d",
8500*5113495bSYour Name 		 cmd->vdev_id);
8501*5113495bSYour Name 	ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
8502*5113495bSYour Name 				   WMI_VDEV_GET_BCN_RECEPTION_STATS_CMDID);
8503*5113495bSYour Name 	if (ret) {
8504*5113495bSYour Name 		wmi_buf_free(buf);
8505*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
8506*5113495bSYour Name 	}
8507*5113495bSYour Name 
8508*5113495bSYour Name 	wma_debug("Exit");
8509*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
8510*5113495bSYour Name }
8511*5113495bSYour Name #else
wma_process_beacon_debug_stats_req(tp_wma_handle wma_handle,uint32_t * vdev_id)8512*5113495bSYour Name static QDF_STATUS wma_process_beacon_debug_stats_req(tp_wma_handle wma_handle,
8513*5113495bSYour Name 						     uint32_t *vdev_id)
8514*5113495bSYour Name {
8515*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
8516*5113495bSYour Name }
8517*5113495bSYour Name #endif
8518*5113495bSYour Name 
8519*5113495bSYour Name /**
8520*5113495bSYour Name  * wma_set_arp_req_stats() - process set arp stats request command to fw
8521*5113495bSYour Name  * @handle: WMA handle
8522*5113495bSYour Name  * @req_buf: set srp stats request buffer
8523*5113495bSYour Name  *
8524*5113495bSYour Name  * Return: None
8525*5113495bSYour Name  */
wma_set_arp_req_stats(WMA_HANDLE handle,struct set_arp_stats_params * req_buf)8526*5113495bSYour Name static void wma_set_arp_req_stats(WMA_HANDLE handle,
8527*5113495bSYour Name 				  struct set_arp_stats_params *req_buf)
8528*5113495bSYour Name {
8529*5113495bSYour Name 	QDF_STATUS status;
8530*5113495bSYour Name 	struct set_arp_stats *arp_stats;
8531*5113495bSYour Name 	tp_wma_handle wma_handle = (tp_wma_handle) handle;
8532*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
8533*5113495bSYour Name 	struct wmi_unified *wmi_handle;
8534*5113495bSYour Name 
8535*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
8536*5113495bSYour Name 		return;
8537*5113495bSYour Name 
8538*5113495bSYour Name 	wmi_handle = wma_handle->wmi_handle;
8539*5113495bSYour Name 	if (wmi_validate_handle(wmi_handle))
8540*5113495bSYour Name 		return;
8541*5113495bSYour Name 
8542*5113495bSYour Name 	if (!wma_is_vdev_valid(req_buf->vdev_id)) {
8543*5113495bSYour Name 		wma_err("vdev id:%d is not active", req_buf->vdev_id);
8544*5113495bSYour Name 		return;
8545*5113495bSYour Name 	}
8546*5113495bSYour Name 
8547*5113495bSYour Name 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(wma_handle->psoc,
8548*5113495bSYour Name 						    req_buf->vdev_id,
8549*5113495bSYour Name 						    WLAN_LEGACY_WMA_ID);
8550*5113495bSYour Name 	if (!vdev) {
8551*5113495bSYour Name 		wma_err("Can't get vdev by vdev_id:%d", req_buf->vdev_id);
8552*5113495bSYour Name 		return;
8553*5113495bSYour Name 	}
8554*5113495bSYour Name 
8555*5113495bSYour Name 	if (!wma_is_vdev_up(req_buf->vdev_id)) {
8556*5113495bSYour Name 		wma_debug("vdev id:%d is not started", req_buf->vdev_id);
8557*5113495bSYour Name 		goto release_ref;
8558*5113495bSYour Name 	}
8559*5113495bSYour Name 
8560*5113495bSYour Name 	arp_stats = (struct set_arp_stats *)req_buf;
8561*5113495bSYour Name 	status = wmi_unified_set_arp_stats_req(wmi_handle, arp_stats);
8562*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
8563*5113495bSYour Name 		wma_err("failed to set arp stats to FW");
8564*5113495bSYour Name 
8565*5113495bSYour Name release_ref:
8566*5113495bSYour Name 	wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID);
8567*5113495bSYour Name }
8568*5113495bSYour Name 
8569*5113495bSYour Name /**
8570*5113495bSYour Name  * wma_get_arp_req_stats() - process get arp stats request command to fw
8571*5113495bSYour Name  * @wma_handle: WMA handle
8572*5113495bSYour Name  * @req_buf: get srp stats request buffer
8573*5113495bSYour Name  *
8574*5113495bSYour Name  * Return: None
8575*5113495bSYour Name  */
wma_get_arp_req_stats(WMA_HANDLE handle,struct get_arp_stats_params * req_buf)8576*5113495bSYour Name static void wma_get_arp_req_stats(WMA_HANDLE handle,
8577*5113495bSYour Name 				  struct get_arp_stats_params *req_buf)
8578*5113495bSYour Name {
8579*5113495bSYour Name 	QDF_STATUS status;
8580*5113495bSYour Name 	struct get_arp_stats *arp_stats;
8581*5113495bSYour Name 	tp_wma_handle wma_handle = (tp_wma_handle) handle;
8582*5113495bSYour Name 	struct wmi_unified *wmi_handle;
8583*5113495bSYour Name 
8584*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
8585*5113495bSYour Name 		return;
8586*5113495bSYour Name 
8587*5113495bSYour Name 	wmi_handle = wma_handle->wmi_handle;
8588*5113495bSYour Name 	if (wmi_validate_handle(wmi_handle))
8589*5113495bSYour Name 		return;
8590*5113495bSYour Name 
8591*5113495bSYour Name 	if (!wma_is_vdev_valid(req_buf->vdev_id)) {
8592*5113495bSYour Name 		wma_err("vdev id:%d is not active", req_buf->vdev_id);
8593*5113495bSYour Name 		return;
8594*5113495bSYour Name 	}
8595*5113495bSYour Name 
8596*5113495bSYour Name 	arp_stats = (struct get_arp_stats *)req_buf;
8597*5113495bSYour Name 	status = wmi_unified_get_arp_stats_req(wmi_handle, arp_stats);
8598*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
8599*5113495bSYour Name 		wma_err("failed to send get arp stats to FW");
8600*5113495bSYour Name }
8601*5113495bSYour Name 
8602*5113495bSYour Name /**
8603*5113495bSYour Name  * wma_set_del_pmkid_cache() - API to set/delete PMKID cache entry in fw
8604*5113495bSYour Name  * @handle: WMA handle
8605*5113495bSYour Name  * @pmk_cache: PMK cache entry
8606*5113495bSYour Name  *
8607*5113495bSYour Name  * Return: None
8608*5113495bSYour Name  */
wma_set_del_pmkid_cache(WMA_HANDLE handle,struct wmi_unified_pmk_cache * pmk_cache)8609*5113495bSYour Name static void wma_set_del_pmkid_cache(WMA_HANDLE handle,
8610*5113495bSYour Name 				    struct wmi_unified_pmk_cache *pmk_cache)
8611*5113495bSYour Name {
8612*5113495bSYour Name 	QDF_STATUS status;
8613*5113495bSYour Name 	tp_wma_handle wma_handle = (tp_wma_handle) handle;
8614*5113495bSYour Name 	struct wmi_unified *wmi_handle;
8615*5113495bSYour Name 
8616*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
8617*5113495bSYour Name 		return;
8618*5113495bSYour Name 
8619*5113495bSYour Name 	wmi_handle = wma_handle->wmi_handle;
8620*5113495bSYour Name 	if (wmi_validate_handle(wmi_handle))
8621*5113495bSYour Name 		return;
8622*5113495bSYour Name 
8623*5113495bSYour Name 	status = wmi_unified_set_del_pmkid_cache(wmi_handle, pmk_cache);
8624*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
8625*5113495bSYour Name 		wma_err("failed to send set/del pmkid cmd to fw");
8626*5113495bSYour Name }
8627*5113495bSYour Name 
8628*5113495bSYour Name /**
8629*5113495bSYour Name  * wma_send_invoke_neighbor_report() - API to send invoke neighbor report
8630*5113495bSYour Name  * command to fw
8631*5113495bSYour Name  *
8632*5113495bSYour Name  * @handle: WMA handle
8633*5113495bSYour Name  * @params: Pointer to invoke neighbor report params
8634*5113495bSYour Name  *
8635*5113495bSYour Name  * Return: None
8636*5113495bSYour Name  */
8637*5113495bSYour Name static
wma_send_invoke_neighbor_report(WMA_HANDLE handle,struct wmi_invoke_neighbor_report_params * params)8638*5113495bSYour Name void wma_send_invoke_neighbor_report(WMA_HANDLE handle,
8639*5113495bSYour Name 			struct wmi_invoke_neighbor_report_params *params)
8640*5113495bSYour Name {
8641*5113495bSYour Name 	QDF_STATUS status;
8642*5113495bSYour Name 	tp_wma_handle wma_handle = (tp_wma_handle) handle;
8643*5113495bSYour Name 	struct wmi_unified *wmi_handle;
8644*5113495bSYour Name 
8645*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
8646*5113495bSYour Name 		return;
8647*5113495bSYour Name 
8648*5113495bSYour Name 	wmi_handle = wma_handle->wmi_handle;
8649*5113495bSYour Name 	if (wmi_validate_handle(wmi_handle))
8650*5113495bSYour Name 		return;
8651*5113495bSYour Name 
8652*5113495bSYour Name 	status = wmi_unified_invoke_neighbor_report_cmd(wmi_handle, params);
8653*5113495bSYour Name 
8654*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS)
8655*5113495bSYour Name 		wma_err("failed to send invoke neighbor report command");
8656*5113495bSYour Name }
8657*5113495bSYour Name 
wma_set_rx_reorder_timeout_val(tp_wma_handle wma_handle,struct sir_set_rx_reorder_timeout_val * reorder_timeout)8658*5113495bSYour Name QDF_STATUS wma_set_rx_reorder_timeout_val(tp_wma_handle wma_handle,
8659*5113495bSYour Name 	struct sir_set_rx_reorder_timeout_val *reorder_timeout)
8660*5113495bSYour Name {
8661*5113495bSYour Name 	wmi_pdev_set_reorder_timeout_val_cmd_fixed_param *cmd;
8662*5113495bSYour Name 	uint32_t len;
8663*5113495bSYour Name 	wmi_buf_t buf;
8664*5113495bSYour Name 	int ret;
8665*5113495bSYour Name 
8666*5113495bSYour Name 	if (!reorder_timeout) {
8667*5113495bSYour Name 		wma_err("invalid pointer");
8668*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
8669*5113495bSYour Name 	}
8670*5113495bSYour Name 
8671*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
8672*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
8673*5113495bSYour Name 
8674*5113495bSYour Name 	len = sizeof(*cmd);
8675*5113495bSYour Name 	buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
8676*5113495bSYour Name 	if (!buf)
8677*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
8678*5113495bSYour Name 
8679*5113495bSYour Name 	cmd = (wmi_pdev_set_reorder_timeout_val_cmd_fixed_param *)
8680*5113495bSYour Name 		wmi_buf_data(buf);
8681*5113495bSYour Name 
8682*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
8683*5113495bSYour Name 	WMITLV_TAG_STRUC_wmi_pdev_set_reorder_timeout_val_cmd_fixed_param,
8684*5113495bSYour Name 	WMITLV_GET_STRUCT_TLVLEN(wmi_pdev_set_reorder_timeout_val_cmd_fixed_param));
8685*5113495bSYour Name 
8686*5113495bSYour Name 	memcpy(cmd->rx_timeout_pri, reorder_timeout->rx_timeout_pri,
8687*5113495bSYour Name 		sizeof(reorder_timeout->rx_timeout_pri));
8688*5113495bSYour Name 
8689*5113495bSYour Name 	wma_debug("rx aggr record timeout: VO: %d, VI: %d, BE: %d, BK: %d",
8690*5113495bSYour Name 		cmd->rx_timeout_pri[0], cmd->rx_timeout_pri[1],
8691*5113495bSYour Name 		cmd->rx_timeout_pri[2], cmd->rx_timeout_pri[3]);
8692*5113495bSYour Name 
8693*5113495bSYour Name 	ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
8694*5113495bSYour Name 			WMI_PDEV_SET_REORDER_TIMEOUT_VAL_CMDID);
8695*5113495bSYour Name 	if (ret) {
8696*5113495bSYour Name 		wmi_buf_free(buf);
8697*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
8698*5113495bSYour Name 	}
8699*5113495bSYour Name 
8700*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
8701*5113495bSYour Name }
8702*5113495bSYour Name 
wma_set_rx_blocksize(tp_wma_handle wma_handle,struct sir_peer_set_rx_blocksize * peer_rx_blocksize)8703*5113495bSYour Name QDF_STATUS wma_set_rx_blocksize(tp_wma_handle wma_handle,
8704*5113495bSYour Name 	struct sir_peer_set_rx_blocksize *peer_rx_blocksize)
8705*5113495bSYour Name {
8706*5113495bSYour Name 	wmi_peer_set_rx_blocksize_cmd_fixed_param *cmd;
8707*5113495bSYour Name 	int32_t len;
8708*5113495bSYour Name 	wmi_buf_t buf;
8709*5113495bSYour Name 	u_int8_t *buf_ptr;
8710*5113495bSYour Name 	int ret;
8711*5113495bSYour Name 
8712*5113495bSYour Name 	if (!peer_rx_blocksize) {
8713*5113495bSYour Name 		wma_err("invalid pointer");
8714*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
8715*5113495bSYour Name 	}
8716*5113495bSYour Name 
8717*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
8718*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
8719*5113495bSYour Name 
8720*5113495bSYour Name 	len = sizeof(*cmd);
8721*5113495bSYour Name 	buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
8722*5113495bSYour Name 	if (!buf)
8723*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
8724*5113495bSYour Name 
8725*5113495bSYour Name 	buf_ptr = (u_int8_t *) wmi_buf_data(buf);
8726*5113495bSYour Name 	cmd = (wmi_peer_set_rx_blocksize_cmd_fixed_param *) buf_ptr;
8727*5113495bSYour Name 
8728*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
8729*5113495bSYour Name 	WMITLV_TAG_STRUC_wmi_peer_set_rx_blocksize_cmd_fixed_param,
8730*5113495bSYour Name 	WMITLV_GET_STRUCT_TLVLEN(wmi_peer_set_rx_blocksize_cmd_fixed_param));
8731*5113495bSYour Name 
8732*5113495bSYour Name 	cmd->vdev_id = peer_rx_blocksize->vdev_id;
8733*5113495bSYour Name 	cmd->rx_block_ack_win_limit =
8734*5113495bSYour Name 		peer_rx_blocksize->rx_block_ack_win_limit;
8735*5113495bSYour Name 	WMI_CHAR_ARRAY_TO_MAC_ADDR(peer_rx_blocksize->peer_macaddr.bytes,
8736*5113495bSYour Name 		&cmd->peer_macaddr);
8737*5113495bSYour Name 
8738*5113495bSYour Name 	wma_debug("rx aggr blocksize: %d", cmd->rx_block_ack_win_limit);
8739*5113495bSYour Name 
8740*5113495bSYour Name 	ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
8741*5113495bSYour Name 			WMI_PEER_SET_RX_BLOCKSIZE_CMDID);
8742*5113495bSYour Name 	if (ret) {
8743*5113495bSYour Name 		wmi_buf_free(buf);
8744*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
8745*5113495bSYour Name 	}
8746*5113495bSYour Name 
8747*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
8748*5113495bSYour Name }
8749*5113495bSYour Name 
wma_get_chain_rssi(tp_wma_handle wma_handle,struct get_chain_rssi_req_params * req_params)8750*5113495bSYour Name QDF_STATUS wma_get_chain_rssi(tp_wma_handle wma_handle,
8751*5113495bSYour Name 		struct get_chain_rssi_req_params *req_params)
8752*5113495bSYour Name {
8753*5113495bSYour Name 	wmi_pdev_div_get_rssi_antid_fixed_param *cmd;
8754*5113495bSYour Name 	wmi_buf_t wmi_buf;
8755*5113495bSYour Name 	uint32_t len = sizeof(wmi_pdev_div_get_rssi_antid_fixed_param);
8756*5113495bSYour Name 	u_int8_t *buf_ptr;
8757*5113495bSYour Name 
8758*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
8759*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
8760*5113495bSYour Name 
8761*5113495bSYour Name 	wmi_buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
8762*5113495bSYour Name 	if (!wmi_buf)
8763*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
8764*5113495bSYour Name 
8765*5113495bSYour Name 	buf_ptr = (u_int8_t *)wmi_buf_data(wmi_buf);
8766*5113495bSYour Name 
8767*5113495bSYour Name 	cmd = (wmi_pdev_div_get_rssi_antid_fixed_param *)buf_ptr;
8768*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
8769*5113495bSYour Name 		WMITLV_TAG_STRUC_wmi_pdev_div_get_rssi_antid_fixed_param,
8770*5113495bSYour Name 		WMITLV_GET_STRUCT_TLVLEN(
8771*5113495bSYour Name 		wmi_pdev_div_get_rssi_antid_fixed_param));
8772*5113495bSYour Name 	cmd->pdev_id = 0;
8773*5113495bSYour Name 	WMI_CHAR_ARRAY_TO_MAC_ADDR(req_params->peer_macaddr.bytes,
8774*5113495bSYour Name 				&cmd->macaddr);
8775*5113495bSYour Name 
8776*5113495bSYour Name 	if (wmi_unified_cmd_send(wma_handle->wmi_handle, wmi_buf, len,
8777*5113495bSYour Name 				 WMI_PDEV_DIV_GET_RSSI_ANTID_CMDID)) {
8778*5113495bSYour Name 		wmi_buf_free(wmi_buf);
8779*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
8780*5113495bSYour Name 	}
8781*5113495bSYour Name 
8782*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
8783*5113495bSYour Name }
8784*5113495bSYour Name 
8785*5113495bSYour Name #if defined(WLAN_FEATURE_FILS_SK)
8786*5113495bSYour Name /**
8787*5113495bSYour Name  * wma_roam_scan_send_hlp() - API to send HLP IE info to fw
8788*5113495bSYour Name  * @wma_handle: WMA handle
8789*5113495bSYour Name  * @req: HLP params
8790*5113495bSYour Name  *
8791*5113495bSYour Name  * Return: QDF_STATUS
8792*5113495bSYour Name  */
wma_roam_scan_send_hlp(tp_wma_handle wma_handle,struct hlp_params * req)8793*5113495bSYour Name static QDF_STATUS wma_roam_scan_send_hlp(tp_wma_handle wma_handle,
8794*5113495bSYour Name 					 struct hlp_params *req)
8795*5113495bSYour Name {
8796*5113495bSYour Name 	struct hlp_params *params;
8797*5113495bSYour Name 	QDF_STATUS status;
8798*5113495bSYour Name 
8799*5113495bSYour Name 	params = qdf_mem_malloc(sizeof(*params));
8800*5113495bSYour Name 	if (!params)
8801*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
8802*5113495bSYour Name 
8803*5113495bSYour Name 	params->vdev_id = req->vdev_id;
8804*5113495bSYour Name 	params->hlp_ie_len = req->hlp_ie_len;
8805*5113495bSYour Name 	qdf_mem_copy(params->hlp_ie, req->hlp_ie, req->hlp_ie_len);
8806*5113495bSYour Name 	status = wmi_unified_roam_send_hlp_cmd(wma_handle->wmi_handle, params);
8807*5113495bSYour Name 
8808*5113495bSYour Name 	wma_debug("Send HLP status %d vdev id %d", status, params->vdev_id);
8809*5113495bSYour Name 	qdf_trace_hex_dump(QDF_MODULE_ID_WMI, QDF_TRACE_LEVEL_DEBUG,
8810*5113495bSYour Name 				params->hlp_ie, 10);
8811*5113495bSYour Name 
8812*5113495bSYour Name 	qdf_mem_free(params);
8813*5113495bSYour Name 	return status;
8814*5113495bSYour Name }
8815*5113495bSYour Name #else
wma_roam_scan_send_hlp(tp_wma_handle wma_handle,struct hlp_params * req)8816*5113495bSYour Name static QDF_STATUS wma_roam_scan_send_hlp(tp_wma_handle wma_handle,
8817*5113495bSYour Name 					 struct hlp_params *req)
8818*5113495bSYour Name {
8819*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
8820*5113495bSYour Name }
8821*5113495bSYour Name #endif
8822*5113495bSYour Name 
8823*5113495bSYour Name /**
8824*5113495bSYour Name  * wma_process_limit_off_chan() - set limit off channel parameters
8825*5113495bSYour Name  * @wma_handle: pointer to wma handle
8826*5113495bSYour Name  * @param: pointer to sir_limit_off_chan
8827*5113495bSYour Name  *
8828*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS for success or error code.
8829*5113495bSYour Name  */
wma_process_limit_off_chan(tp_wma_handle wma_handle,struct sir_limit_off_chan * param)8830*5113495bSYour Name static QDF_STATUS wma_process_limit_off_chan(tp_wma_handle wma_handle,
8831*5113495bSYour Name 	struct sir_limit_off_chan *param)
8832*5113495bSYour Name {
8833*5113495bSYour Name 	int32_t err;
8834*5113495bSYour Name 	struct wmi_limit_off_chan_param limit_off_chan_param;
8835*5113495bSYour Name 
8836*5113495bSYour Name 	if (param->vdev_id >= wma_handle->max_bssid) {
8837*5113495bSYour Name 		wma_err("Invalid vdev_id: %d", param->vdev_id);
8838*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
8839*5113495bSYour Name 	}
8840*5113495bSYour Name 	if (!wma_is_vdev_up(param->vdev_id)) {
8841*5113495bSYour Name 		wma_debug("vdev %d is not up skipping limit_off_chan_param",
8842*5113495bSYour Name 			 param->vdev_id);
8843*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
8844*5113495bSYour Name 	}
8845*5113495bSYour Name 
8846*5113495bSYour Name 	limit_off_chan_param.vdev_id = param->vdev_id;
8847*5113495bSYour Name 	limit_off_chan_param.status = param->is_tos_active;
8848*5113495bSYour Name 	limit_off_chan_param.max_offchan_time = param->max_off_chan_time;
8849*5113495bSYour Name 	limit_off_chan_param.rest_time = param->rest_time;
8850*5113495bSYour Name 	limit_off_chan_param.skip_dfs_chans = param->skip_dfs_chans;
8851*5113495bSYour Name 
8852*5113495bSYour Name 	err = wmi_unified_send_limit_off_chan_cmd(wma_handle->wmi_handle,
8853*5113495bSYour Name 			&limit_off_chan_param);
8854*5113495bSYour Name 	if (err) {
8855*5113495bSYour Name 		wma_err("failed to set limit off chan cmd");
8856*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
8857*5113495bSYour Name 	}
8858*5113495bSYour Name 
8859*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
8860*5113495bSYour Name }
8861*5113495bSYour Name 
wma_process_obss_color_collision_req(tp_wma_handle wma_handle,struct wmi_obss_color_collision_cfg_param * cfg)8862*5113495bSYour Name static QDF_STATUS wma_process_obss_color_collision_req(tp_wma_handle wma_handle,
8863*5113495bSYour Name 		struct wmi_obss_color_collision_cfg_param *cfg)
8864*5113495bSYour Name {
8865*5113495bSYour Name 	QDF_STATUS status;
8866*5113495bSYour Name 
8867*5113495bSYour Name 	if (cfg->vdev_id >= wma_handle->max_bssid) {
8868*5113495bSYour Name 		wma_err("Invalid vdev_id: %d", cfg->vdev_id);
8869*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
8870*5113495bSYour Name 	}
8871*5113495bSYour Name 	if (!wma_is_vdev_up(cfg->vdev_id)) {
8872*5113495bSYour Name 		wma_err("vdev %d is not up skipping obss color collision req",
8873*5113495bSYour Name 			 cfg->vdev_id);
8874*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
8875*5113495bSYour Name 	}
8876*5113495bSYour Name 
8877*5113495bSYour Name 	status = wmi_unified_send_obss_color_collision_cfg_cmd(wma_handle->
8878*5113495bSYour Name 							       wmi_handle, cfg);
8879*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
8880*5113495bSYour Name 		wma_err("Failed to send obss color collision cfg");
8881*5113495bSYour Name 
8882*5113495bSYour Name 	return status;
8883*5113495bSYour Name }
8884*5113495bSYour Name 
8885*5113495bSYour Name /**
8886*5113495bSYour Name  * wma_send_obss_detection_cfg() - send obss detection cfg to firmware
8887*5113495bSYour Name  * @wma_handle: pointer to wma handle
8888*5113495bSYour Name  * @cfg: obss detection configuration
8889*5113495bSYour Name  *
8890*5113495bSYour Name  * Send obss detection configuration to firmware.
8891*5113495bSYour Name  *
8892*5113495bSYour Name  * Return: None
8893*5113495bSYour Name  */
wma_send_obss_detection_cfg(tp_wma_handle wma_handle,struct wmi_obss_detection_cfg_param * cfg)8894*5113495bSYour Name static void wma_send_obss_detection_cfg(tp_wma_handle wma_handle,
8895*5113495bSYour Name 					struct wmi_obss_detection_cfg_param
8896*5113495bSYour Name 					*cfg)
8897*5113495bSYour Name {
8898*5113495bSYour Name 	QDF_STATUS status;
8899*5113495bSYour Name 
8900*5113495bSYour Name 	if (cfg->vdev_id >= wma_handle->max_bssid) {
8901*5113495bSYour Name 		wma_err("Invalid vdev_id: %d", cfg->vdev_id);
8902*5113495bSYour Name 		return;
8903*5113495bSYour Name 	}
8904*5113495bSYour Name 	if (!wma_is_vdev_up(cfg->vdev_id)) {
8905*5113495bSYour Name 		wma_err("vdev %d is not up skipping obss detection req",
8906*5113495bSYour Name 			 cfg->vdev_id);
8907*5113495bSYour Name 		return;
8908*5113495bSYour Name 	}
8909*5113495bSYour Name 
8910*5113495bSYour Name 	status = wmi_unified_send_obss_detection_cfg_cmd(wma_handle->wmi_handle,
8911*5113495bSYour Name 							 cfg);
8912*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
8913*5113495bSYour Name 		wma_err("Failed to send obss detection cfg");
8914*5113495bSYour Name 
8915*5113495bSYour Name 	return;
8916*5113495bSYour Name }
8917*5113495bSYour Name 
8918*5113495bSYour Name #ifdef WLAN_FEATURE_MOTION_DETECTION
8919*5113495bSYour Name /**
8920*5113495bSYour Name  * wma_motion_det_host_event_handler - motion detection event handler
8921*5113495bSYour Name  * @handle: WMA global handle
8922*5113495bSYour Name  * @event: motion detection event
8923*5113495bSYour Name  * @len: Length of cmd
8924*5113495bSYour Name  *
8925*5113495bSYour Name  * Call motion detection event callback handler
8926*5113495bSYour Name  *
8927*5113495bSYour Name  * Return: 0 on success, else error on failure
8928*5113495bSYour Name  */
wma_motion_det_host_event_handler(void * handle,uint8_t * event,uint32_t len)8929*5113495bSYour Name int wma_motion_det_host_event_handler(void *handle, uint8_t *event,
8930*5113495bSYour Name 				      uint32_t len)
8931*5113495bSYour Name {
8932*5113495bSYour Name 	wmi_motion_det_event *motion_det_event_hdr;
8933*5113495bSYour Name 	WMI_MOTION_DET_HOST_EVENTID_param_tlvs *param_buf =
8934*5113495bSYour Name 			(WMI_MOTION_DET_HOST_EVENTID_param_tlvs *)event;
8935*5113495bSYour Name 	struct sir_md_evt *md_event;
8936*5113495bSYour Name 	struct mac_context *pmac = (struct mac_context *)cds_get_context(
8937*5113495bSYour Name 				    QDF_MODULE_ID_PE);
8938*5113495bSYour Name 
8939*5113495bSYour Name 	if (!param_buf) {
8940*5113495bSYour Name 		wma_err("Invalid motion det host event buffer");
8941*5113495bSYour Name 		return -EINVAL;
8942*5113495bSYour Name 	}
8943*5113495bSYour Name 
8944*5113495bSYour Name 	if (!pmac || !pmac->sme.md_host_evt_cb) {
8945*5113495bSYour Name 		wma_err("Invalid motion detect callback");
8946*5113495bSYour Name 		return -EINVAL;
8947*5113495bSYour Name 	}
8948*5113495bSYour Name 
8949*5113495bSYour Name 	motion_det_event_hdr = param_buf->fixed_param;
8950*5113495bSYour Name 	wma_alert("motion detect host event received, vdev_id=%d, status=%d",
8951*5113495bSYour Name 		 motion_det_event_hdr->vdev_id, motion_det_event_hdr->status);
8952*5113495bSYour Name 
8953*5113495bSYour Name 	md_event = qdf_mem_malloc(sizeof(*md_event));
8954*5113495bSYour Name 	if (!md_event)
8955*5113495bSYour Name 		return -ENOMEM;
8956*5113495bSYour Name 
8957*5113495bSYour Name 	md_event->vdev_id = motion_det_event_hdr->vdev_id;
8958*5113495bSYour Name 	md_event->status = motion_det_event_hdr->status;
8959*5113495bSYour Name 
8960*5113495bSYour Name 	pmac->sme.md_host_evt_cb(pmac->sme.md_ctx, md_event);
8961*5113495bSYour Name 
8962*5113495bSYour Name 	qdf_mem_free(md_event);
8963*5113495bSYour Name 	return 0;
8964*5113495bSYour Name }
8965*5113495bSYour Name 
8966*5113495bSYour Name /**
8967*5113495bSYour Name  * wma_motion_det_base_line_host_event_handler - md baselining event handler
8968*5113495bSYour Name  * @handle: WMA global handle
8969*5113495bSYour Name  * @event: motion detection baselining event
8970*5113495bSYour Name  * @len: Length of cmd
8971*5113495bSYour Name  *
8972*5113495bSYour Name  * Return: 0 on success, else error on failure
8973*5113495bSYour Name  */
wma_motion_det_base_line_host_event_handler(void * handle,uint8_t * event,uint32_t len)8974*5113495bSYour Name int wma_motion_det_base_line_host_event_handler(void *handle,
8975*5113495bSYour Name 						uint8_t *event, uint32_t len)
8976*5113495bSYour Name {
8977*5113495bSYour Name 	wmi_motion_det_base_line_event *motion_det_base_line_event_hdr;
8978*5113495bSYour Name 	WMI_MOTION_DET_BASE_LINE_HOST_EVENTID_param_tlvs *param_buf =
8979*5113495bSYour Name 		(WMI_MOTION_DET_BASE_LINE_HOST_EVENTID_param_tlvs *)event;
8980*5113495bSYour Name 	struct sir_md_bl_evt *md_bl_event;
8981*5113495bSYour Name 	struct mac_context *pmac = (struct mac_context *)cds_get_context(
8982*5113495bSYour Name 				    QDF_MODULE_ID_PE);
8983*5113495bSYour Name 
8984*5113495bSYour Name 	if (!param_buf) {
8985*5113495bSYour Name 		wma_err("Invalid motion detection base line event buffer");
8986*5113495bSYour Name 		return -EINVAL;
8987*5113495bSYour Name 	}
8988*5113495bSYour Name 
8989*5113495bSYour Name 	if (!pmac || !pmac->sme.md_bl_evt_cb) {
8990*5113495bSYour Name 		wma_err("Invalid motion detection base line callback");
8991*5113495bSYour Name 		return -EINVAL;
8992*5113495bSYour Name 	}
8993*5113495bSYour Name 
8994*5113495bSYour Name 	motion_det_base_line_event_hdr = param_buf->fixed_param;
8995*5113495bSYour Name 	wma_alert("motion detection base line event received, vdev_id=%d",
8996*5113495bSYour Name 		 motion_det_base_line_event_hdr->vdev_id);
8997*5113495bSYour Name 	wma_alert("baseline_value=%d bl_max_corr_resv=%d bl_min_corr_resv=%d",
8998*5113495bSYour Name 		 motion_det_base_line_event_hdr->bl_baseline_value,
8999*5113495bSYour Name 		 motion_det_base_line_event_hdr->bl_max_corr_reserved,
9000*5113495bSYour Name 		 motion_det_base_line_event_hdr->bl_min_corr_reserved);
9001*5113495bSYour Name 
9002*5113495bSYour Name 	md_bl_event = qdf_mem_malloc(sizeof(*md_bl_event));
9003*5113495bSYour Name 	if (!md_bl_event)
9004*5113495bSYour Name 		return -ENOMEM;
9005*5113495bSYour Name 
9006*5113495bSYour Name 	md_bl_event->vdev_id = motion_det_base_line_event_hdr->vdev_id;
9007*5113495bSYour Name 	md_bl_event->bl_baseline_value =
9008*5113495bSYour Name 			motion_det_base_line_event_hdr->bl_baseline_value;
9009*5113495bSYour Name 	md_bl_event->bl_max_corr_reserved =
9010*5113495bSYour Name 			motion_det_base_line_event_hdr->bl_max_corr_reserved;
9011*5113495bSYour Name 	md_bl_event->bl_min_corr_reserved =
9012*5113495bSYour Name 			motion_det_base_line_event_hdr->bl_min_corr_reserved;
9013*5113495bSYour Name 
9014*5113495bSYour Name 	pmac->sme.md_bl_evt_cb(pmac->sme.md_ctx, md_bl_event);
9015*5113495bSYour Name 
9016*5113495bSYour Name 	qdf_mem_free(md_bl_event);
9017*5113495bSYour Name 	return 0;
9018*5113495bSYour Name }
9019*5113495bSYour Name 
9020*5113495bSYour Name /**
9021*5113495bSYour Name  * wma_set_motion_det_config - Sends motion detection configuration wmi cmd
9022*5113495bSYour Name  * @wma_handle: WMA global handle
9023*5113495bSYour Name  * @motion_det_cfg: motion detection configuration
9024*5113495bSYour Name  *
9025*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_ERROR on error
9026*5113495bSYour Name  */
wma_set_motion_det_config(tp_wma_handle wma_handle,struct sme_motion_det_cfg * motion_det_cfg)9027*5113495bSYour Name static QDF_STATUS wma_set_motion_det_config(
9028*5113495bSYour Name 				tp_wma_handle wma_handle,
9029*5113495bSYour Name 				struct sme_motion_det_cfg *motion_det_cfg)
9030*5113495bSYour Name {
9031*5113495bSYour Name 	wmi_motion_det_config_params_cmd_fixed_param *cmd;
9032*5113495bSYour Name 	wmi_buf_t buf;
9033*5113495bSYour Name 	int err;
9034*5113495bSYour Name 
9035*5113495bSYour Name 	buf = wmi_buf_alloc(wma_handle->wmi_handle, sizeof(*cmd));
9036*5113495bSYour Name 	if (!buf)
9037*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
9038*5113495bSYour Name 
9039*5113495bSYour Name 	cmd = (wmi_motion_det_config_params_cmd_fixed_param *)wmi_buf_data(buf);
9040*5113495bSYour Name 	qdf_mem_zero(cmd, sizeof(*cmd));
9041*5113495bSYour Name 
9042*5113495bSYour Name 	WMITLV_SET_HDR(
9043*5113495bSYour Name 		&cmd->tlv_header,
9044*5113495bSYour Name 		WMITLV_TAG_STRUC_wmi_motion_det_config_params_cmd_fixed_param,
9045*5113495bSYour Name 		WMITLV_GET_STRUCT_TLVLEN(
9046*5113495bSYour Name 			wmi_motion_det_config_params_cmd_fixed_param));
9047*5113495bSYour Name 	cmd->vdev_id = motion_det_cfg->vdev_id;
9048*5113495bSYour Name 	cmd->time_t1 = motion_det_cfg->time_t1;
9049*5113495bSYour Name 	cmd->time_t2 = motion_det_cfg->time_t2;
9050*5113495bSYour Name 	cmd->n1 = motion_det_cfg->n1;
9051*5113495bSYour Name 	cmd->n2 = motion_det_cfg->n2;
9052*5113495bSYour Name 	cmd->time_t1_gap = motion_det_cfg->time_t1_gap;
9053*5113495bSYour Name 	cmd->time_t2_gap = motion_det_cfg->time_t2_gap;
9054*5113495bSYour Name 	cmd->coarse_K = motion_det_cfg->coarse_K;
9055*5113495bSYour Name 	cmd->fine_K = motion_det_cfg->fine_K;
9056*5113495bSYour Name 	cmd->coarse_Q = motion_det_cfg->coarse_Q;
9057*5113495bSYour Name 	cmd->fine_Q = motion_det_cfg->fine_Q;
9058*5113495bSYour Name 	cmd->md_coarse_thr_high = motion_det_cfg->md_coarse_thr_high;
9059*5113495bSYour Name 	cmd->md_fine_thr_high = motion_det_cfg->md_fine_thr_high;
9060*5113495bSYour Name 	cmd->md_coarse_thr_low = motion_det_cfg->md_coarse_thr_low;
9061*5113495bSYour Name 	cmd->md_fine_thr_low = motion_det_cfg->md_fine_thr_low;
9062*5113495bSYour Name 
9063*5113495bSYour Name 	err = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, sizeof(*cmd),
9064*5113495bSYour Name 				   WMI_MOTION_DET_CONFIG_PARAM_CMDID);
9065*5113495bSYour Name 	if (err) {
9066*5113495bSYour Name 		wmi_buf_free(buf);
9067*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
9068*5113495bSYour Name 	}
9069*5113495bSYour Name 	wma_nofl_alert("Set motion_det_config to vdevId %d\n"
9070*5113495bSYour Name 		 "time_t1 %d\n"
9071*5113495bSYour Name 		 "time_t2 %d\n"
9072*5113495bSYour Name 		 "n1 %d\n"
9073*5113495bSYour Name 		 "n2 %d\n"
9074*5113495bSYour Name 		 "time_t1_gap %d\n"
9075*5113495bSYour Name 		 "time_t2_gap %d\n"
9076*5113495bSYour Name 		 "coarse_K %d\n"
9077*5113495bSYour Name 		 "fine_K %d\n"
9078*5113495bSYour Name 		 "coarse_Q %d\n"
9079*5113495bSYour Name 		 "fine_Q %d\n"
9080*5113495bSYour Name 		 "md_coarse_thr_high %d\n"
9081*5113495bSYour Name 		 "md_fine_thr_high %d\n"
9082*5113495bSYour Name 		 "md_coarse_thr_low %d\n"
9083*5113495bSYour Name 		 "md_fine_thr_low %d\n",
9084*5113495bSYour Name 		 motion_det_cfg->vdev_id,
9085*5113495bSYour Name 		 motion_det_cfg->time_t1,
9086*5113495bSYour Name 		 motion_det_cfg->time_t2,
9087*5113495bSYour Name 		 motion_det_cfg->n1,
9088*5113495bSYour Name 		 motion_det_cfg->n2,
9089*5113495bSYour Name 		 motion_det_cfg->time_t1_gap,
9090*5113495bSYour Name 		 motion_det_cfg->time_t2_gap,
9091*5113495bSYour Name 		 motion_det_cfg->coarse_K,
9092*5113495bSYour Name 		 motion_det_cfg->fine_K,
9093*5113495bSYour Name 		 motion_det_cfg->coarse_Q,
9094*5113495bSYour Name 		 motion_det_cfg->fine_Q,
9095*5113495bSYour Name 		 motion_det_cfg->md_coarse_thr_high,
9096*5113495bSYour Name 		 motion_det_cfg->md_fine_thr_high,
9097*5113495bSYour Name 		 motion_det_cfg->md_coarse_thr_low,
9098*5113495bSYour Name 		 motion_det_cfg->md_fine_thr_low);
9099*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
9100*5113495bSYour Name }
9101*5113495bSYour Name 
9102*5113495bSYour Name /**
9103*5113495bSYour Name  * wma_set_motion_det_enable - Sends motion detection start/stop wmi cmd
9104*5113495bSYour Name  * @wma_handle: WMA global handle
9105*5113495bSYour Name  * @md_en: motion detection start/stop
9106*5113495bSYour Name  *
9107*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_ERROR on error
9108*5113495bSYour Name  */
wma_set_motion_det_enable(tp_wma_handle wma_handle,struct sme_motion_det_en * md_en)9109*5113495bSYour Name static QDF_STATUS wma_set_motion_det_enable(tp_wma_handle wma_handle,
9110*5113495bSYour Name 					    struct sme_motion_det_en *md_en)
9111*5113495bSYour Name {
9112*5113495bSYour Name 	wmi_motion_det_start_stop_cmd_fixed_param *cmd;
9113*5113495bSYour Name 	wmi_buf_t buf;
9114*5113495bSYour Name 	int err;
9115*5113495bSYour Name 
9116*5113495bSYour Name 	buf = wmi_buf_alloc(wma_handle->wmi_handle, sizeof(*cmd));
9117*5113495bSYour Name 	if (!buf)
9118*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
9119*5113495bSYour Name 
9120*5113495bSYour Name 	cmd = (wmi_motion_det_start_stop_cmd_fixed_param *)wmi_buf_data(buf);
9121*5113495bSYour Name 	qdf_mem_zero(cmd, sizeof(*cmd));
9122*5113495bSYour Name 
9123*5113495bSYour Name 	WMITLV_SET_HDR(
9124*5113495bSYour Name 		&cmd->tlv_header,
9125*5113495bSYour Name 		WMITLV_TAG_STRUC_wmi_motion_det_start_stop_cmd_fixed_param,
9126*5113495bSYour Name 		WMITLV_GET_STRUCT_TLVLEN(
9127*5113495bSYour Name 			wmi_motion_det_start_stop_cmd_fixed_param));
9128*5113495bSYour Name 	cmd->vdev_id = md_en->vdev_id;
9129*5113495bSYour Name 	cmd->enable = md_en->enable;
9130*5113495bSYour Name 
9131*5113495bSYour Name 	err = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, sizeof(*cmd),
9132*5113495bSYour Name 				   WMI_MOTION_DET_START_STOP_CMDID);
9133*5113495bSYour Name 	if (err) {
9134*5113495bSYour Name 		wmi_buf_free(buf);
9135*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
9136*5113495bSYour Name 	}
9137*5113495bSYour Name 	wma_alert("Set motion_det_enable to vdevId %d %d", md_en->vdev_id,
9138*5113495bSYour Name 		 md_en->enable);
9139*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
9140*5113495bSYour Name }
9141*5113495bSYour Name 
9142*5113495bSYour Name /**
9143*5113495bSYour Name  * wma_set_motion_det_base_line_config - Sends md baselining cfg wmi cmd
9144*5113495bSYour Name  * @wma_handle: WMA global handle
9145*5113495bSYour Name  * @md_base_line_cfg: md baselining configuration
9146*5113495bSYour Name  *
9147*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_ERROR on error
9148*5113495bSYour Name  */
wma_set_motion_det_base_line_config(tp_wma_handle wma_handle,struct sme_motion_det_base_line_cfg * md_base_line_cfg)9149*5113495bSYour Name static QDF_STATUS wma_set_motion_det_base_line_config(
9150*5113495bSYour Name 		tp_wma_handle wma_handle,
9151*5113495bSYour Name 		struct sme_motion_det_base_line_cfg *md_base_line_cfg)
9152*5113495bSYour Name {
9153*5113495bSYour Name 	wmi_motion_det_base_line_config_params_cmd_fixed_param *cmd;
9154*5113495bSYour Name 	wmi_buf_t buf;
9155*5113495bSYour Name 	int err;
9156*5113495bSYour Name 
9157*5113495bSYour Name 	buf = wmi_buf_alloc(wma_handle->wmi_handle, sizeof(*cmd));
9158*5113495bSYour Name 	if (!buf)
9159*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
9160*5113495bSYour Name 
9161*5113495bSYour Name 	cmd = (wmi_motion_det_base_line_config_params_cmd_fixed_param *)
9162*5113495bSYour Name 		wmi_buf_data(buf);
9163*5113495bSYour Name 	qdf_mem_zero(cmd, sizeof(*cmd));
9164*5113495bSYour Name 
9165*5113495bSYour Name 	WMITLV_SET_HDR(
9166*5113495bSYour Name 	&cmd->tlv_header,
9167*5113495bSYour Name 	WMITLV_TAG_STRUC_wmi_motion_det_base_line_config_params_cmd_fixed_param,
9168*5113495bSYour Name 	WMITLV_GET_STRUCT_TLVLEN(
9169*5113495bSYour Name 		wmi_motion_det_base_line_config_params_cmd_fixed_param));
9170*5113495bSYour Name 
9171*5113495bSYour Name 	cmd->vdev_id = md_base_line_cfg->vdev_id;
9172*5113495bSYour Name 	cmd->bl_time_t = md_base_line_cfg->bl_time_t;
9173*5113495bSYour Name 	cmd->bl_packet_gap = md_base_line_cfg->bl_packet_gap;
9174*5113495bSYour Name 	cmd->bl_n = md_base_line_cfg->bl_n;
9175*5113495bSYour Name 	cmd->bl_num_meas = md_base_line_cfg->bl_num_meas;
9176*5113495bSYour Name 
9177*5113495bSYour Name 	err = wmi_unified_cmd_send(wma_handle->wmi_handle, buf,	sizeof(*cmd),
9178*5113495bSYour Name 				   WMI_MOTION_DET_BASE_LINE_CONFIG_PARAM_CMDID);
9179*5113495bSYour Name 	if (err) {
9180*5113495bSYour Name 		wmi_buf_free(buf);
9181*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
9182*5113495bSYour Name 	}
9183*5113495bSYour Name 	wma_nofl_alert("Set motion_det_baseline_config to vdevId %d\n"
9184*5113495bSYour Name 		 "bl_time_t %d\n"
9185*5113495bSYour Name 		 "bl_packet_gap %d\n"
9186*5113495bSYour Name 		 "bl_n %d\n"
9187*5113495bSYour Name 		 "bl_num_meas %d\n",
9188*5113495bSYour Name 		 md_base_line_cfg->vdev_id,
9189*5113495bSYour Name 		 md_base_line_cfg->bl_time_t,
9190*5113495bSYour Name 		 md_base_line_cfg->bl_packet_gap,
9191*5113495bSYour Name 		 md_base_line_cfg->bl_n,
9192*5113495bSYour Name 		 md_base_line_cfg->bl_num_meas);
9193*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
9194*5113495bSYour Name }
9195*5113495bSYour Name 
9196*5113495bSYour Name /**
9197*5113495bSYour Name  * wma_set_motion_det_base_line_enable - Sends md baselining start/stop wmi cmd
9198*5113495bSYour Name  * @wma_handle: WMA global handle
9199*5113495bSYour Name  * @md_base_line_en: motion detection baselining start/stop
9200*5113495bSYour Name  *
9201*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_ERROR on error
9202*5113495bSYour Name  */
wma_set_motion_det_base_line_enable(tp_wma_handle wma_handle,struct sme_motion_det_base_line_en * md_base_line_en)9203*5113495bSYour Name static QDF_STATUS wma_set_motion_det_base_line_enable(
9204*5113495bSYour Name 			tp_wma_handle wma_handle,
9205*5113495bSYour Name 			struct sme_motion_det_base_line_en *md_base_line_en)
9206*5113495bSYour Name {
9207*5113495bSYour Name 	wmi_motion_det_base_line_start_stop_cmd_fixed_param *cmd;
9208*5113495bSYour Name 	wmi_buf_t buf;
9209*5113495bSYour Name 	int err;
9210*5113495bSYour Name 
9211*5113495bSYour Name 	buf = wmi_buf_alloc(wma_handle->wmi_handle, sizeof(*cmd));
9212*5113495bSYour Name 	if (!buf)
9213*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
9214*5113495bSYour Name 
9215*5113495bSYour Name 	cmd = (wmi_motion_det_base_line_start_stop_cmd_fixed_param *)
9216*5113495bSYour Name 		wmi_buf_data(buf);
9217*5113495bSYour Name 	qdf_mem_zero(cmd, sizeof(*cmd));
9218*5113495bSYour Name 
9219*5113495bSYour Name 	WMITLV_SET_HDR(
9220*5113495bSYour Name 	&cmd->tlv_header,
9221*5113495bSYour Name 	WMITLV_TAG_STRUC_wmi_motion_det_base_line_start_stop_cmd_fixed_param,
9222*5113495bSYour Name 	WMITLV_GET_STRUCT_TLVLEN(
9223*5113495bSYour Name 		wmi_motion_det_base_line_start_stop_cmd_fixed_param));
9224*5113495bSYour Name 
9225*5113495bSYour Name 	cmd->vdev_id = md_base_line_en->vdev_id;
9226*5113495bSYour Name 	cmd->enable = md_base_line_en->enable;
9227*5113495bSYour Name 
9228*5113495bSYour Name 	err = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, sizeof(*cmd),
9229*5113495bSYour Name 				   WMI_MOTION_DET_BASE_LINE_START_STOP_CMDID);
9230*5113495bSYour Name 	if (err) {
9231*5113495bSYour Name 		wmi_buf_free(buf);
9232*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
9233*5113495bSYour Name 	}
9234*5113495bSYour Name 	wma_alert("Set motion_det_base_line_enable to vdevId %d enable %d",
9235*5113495bSYour Name 		 md_base_line_en->vdev_id, md_base_line_en->enable);
9236*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
9237*5113495bSYour Name }
9238*5113495bSYour Name #endif /* WLAN_FEATURE_MOTION_DETECTION */
9239*5113495bSYour Name 
9240*5113495bSYour Name /**
9241*5113495bSYour Name  * wma_mc_process_msg() - process wma messages and call appropriate function.
9242*5113495bSYour Name  * @msg: message
9243*5113495bSYour Name  *
9244*5113495bSYour Name  * Return: QDF_SUCCESS for success otherwise failure
9245*5113495bSYour Name  */
wma_mc_process_msg(struct scheduler_msg * msg)9246*5113495bSYour Name static QDF_STATUS wma_mc_process_msg(struct scheduler_msg *msg)
9247*5113495bSYour Name {
9248*5113495bSYour Name 	QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
9249*5113495bSYour Name 	tp_wma_handle wma_handle;
9250*5113495bSYour Name 
9251*5113495bSYour Name 	if (!msg) {
9252*5113495bSYour Name 		wma_err("msg is NULL");
9253*5113495bSYour Name 		QDF_ASSERT(0);
9254*5113495bSYour Name 		qdf_status = QDF_STATUS_E_INVAL;
9255*5113495bSYour Name 		goto end;
9256*5113495bSYour Name 	}
9257*5113495bSYour Name 
9258*5113495bSYour Name 	wma_nofl_debug("Handle msg %s(0x%x)",
9259*5113495bSYour Name 		       mac_trace_get_wma_msg_string(msg->type), msg->type);
9260*5113495bSYour Name 
9261*5113495bSYour Name 	wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
9262*5113495bSYour Name 	if (!wma_handle) {
9263*5113495bSYour Name 		QDF_ASSERT(0);
9264*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9265*5113495bSYour Name 		qdf_status = QDF_STATUS_E_INVAL;
9266*5113495bSYour Name 		goto end;
9267*5113495bSYour Name 	}
9268*5113495bSYour Name 
9269*5113495bSYour Name 	switch (msg->type) {
9270*5113495bSYour Name #ifdef FEATURE_WLAN_ESE
9271*5113495bSYour Name 	case WMA_TSM_STATS_REQ:
9272*5113495bSYour Name 		wma_debug("McThread: WMA_TSM_STATS_REQ");
9273*5113495bSYour Name 		wma_process_tsm_stats_req(wma_handle, (void *)msg->bodyptr);
9274*5113495bSYour Name 		break;
9275*5113495bSYour Name #endif /* FEATURE_WLAN_ESE */
9276*5113495bSYour Name 	case WMA_UPDATE_CHAN_LIST_REQ:
9277*5113495bSYour Name 		wma_update_channel_list(wma_handle,
9278*5113495bSYour Name 					(tSirUpdateChanList *) msg->bodyptr);
9279*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9280*5113495bSYour Name 		break;
9281*5113495bSYour Name 	case WMA_ADD_STA_REQ:
9282*5113495bSYour Name 		wma_add_sta(wma_handle, (tpAddStaParams) msg->bodyptr);
9283*5113495bSYour Name 		break;
9284*5113495bSYour Name 	case WMA_SEND_PEER_UNMAP_CONF:
9285*5113495bSYour Name 		wma_peer_unmap_conf_send(
9286*5113495bSYour Name 			wma_handle,
9287*5113495bSYour Name 			(struct send_peer_unmap_conf_params *)msg->bodyptr);
9288*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9289*5113495bSYour Name 		break;
9290*5113495bSYour Name 	case WMA_DELETE_STA_REQ:
9291*5113495bSYour Name 		wma_delete_sta(wma_handle, (tpDeleteStaParams) msg->bodyptr);
9292*5113495bSYour Name 		break;
9293*5113495bSYour Name 	case WMA_DELETE_BSS_HO_FAIL_REQ:
9294*5113495bSYour Name 		wma_delete_bss_ho_fail(wma_handle, msg->bodyval);
9295*5113495bSYour Name 		break;
9296*5113495bSYour Name 	case WMA_DELETE_BSS_REQ:
9297*5113495bSYour Name 		wma_delete_bss(wma_handle, msg->bodyval);
9298*5113495bSYour Name 		break;
9299*5113495bSYour Name 	case WMA_UPDATE_EDCA_PROFILE_IND:
9300*5113495bSYour Name 		wma_process_update_edca_param_req(wma_handle,
9301*5113495bSYour Name 						  (tEdcaParams *) msg->bodyptr);
9302*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9303*5113495bSYour Name 		break;
9304*5113495bSYour Name 	case WMA_SEND_BEACON_REQ:
9305*5113495bSYour Name 		wma_send_beacon(wma_handle, (tpSendbeaconParams) msg->bodyptr);
9306*5113495bSYour Name 		break;
9307*5113495bSYour Name 	case WMA_SEND_AP_VDEV_UP:
9308*5113495bSYour Name 		wma_set_ap_vdev_up(wma_handle, msg->bodyval);
9309*5113495bSYour Name 		break;
9310*5113495bSYour Name 	case WMA_SEND_PROBE_RSP_TMPL:
9311*5113495bSYour Name 		wma_send_probe_rsp_tmpl(wma_handle,
9312*5113495bSYour Name 					(tpSendProbeRespParams) msg->bodyptr);
9313*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9314*5113495bSYour Name 		break;
9315*5113495bSYour Name 	case WMA_CLI_SET_CMD:
9316*5113495bSYour Name 		wma_process_cli_set_cmd(wma_handle,
9317*5113495bSYour Name 					(wma_cli_set_cmd_t *) msg->bodyptr);
9318*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9319*5113495bSYour Name 		break;
9320*5113495bSYour Name 	case WMA_SET_PDEV_IE_REQ:
9321*5113495bSYour Name 		wma_process_set_pdev_ie_req(wma_handle,
9322*5113495bSYour Name 				(struct set_ie_param *)msg->bodyptr);
9323*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9324*5113495bSYour Name 		break;
9325*5113495bSYour Name #if !defined(REMOVE_PKT_LOG) && defined(FEATURE_PKTLOG)
9326*5113495bSYour Name 	case WMA_PKTLOG_ENABLE_REQ:
9327*5113495bSYour Name 		wma_pktlog_wmi_send_cmd(wma_handle,
9328*5113495bSYour Name 			(struct ath_pktlog_wmi_params *)msg->bodyptr);
9329*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9330*5113495bSYour Name 		break;
9331*5113495bSYour Name #endif /* REMOVE_PKT_LOG */
9332*5113495bSYour Name 	case WMA_ENABLE_UAPSD_REQ:
9333*5113495bSYour Name 		wma_enable_uapsd_mode(wma_handle,
9334*5113495bSYour Name 				      (tpEnableUapsdParams) msg->bodyptr);
9335*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9336*5113495bSYour Name 		break;
9337*5113495bSYour Name 	case WMA_DISABLE_UAPSD_REQ:
9338*5113495bSYour Name 		wma_disable_uapsd_mode(wma_handle,
9339*5113495bSYour Name 				       (tpDisableUapsdParams) msg->bodyptr);
9340*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9341*5113495bSYour Name 		break;
9342*5113495bSYour Name 	case WMA_SET_DTIM_PERIOD:
9343*5113495bSYour Name 		wma_set_dtim_period(wma_handle,
9344*5113495bSYour Name 				    (struct set_dtim_params *)msg->bodyptr);
9345*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9346*5113495bSYour Name 		break;
9347*5113495bSYour Name 	case WMA_SET_TX_POWER_REQ:
9348*5113495bSYour Name 		wma_set_tx_power(wma_handle, (tpMaxTxPowerParams) msg->bodyptr);
9349*5113495bSYour Name 		break;
9350*5113495bSYour Name 	case WMA_SET_MAX_TX_POWER_REQ:
9351*5113495bSYour Name 		wma_set_max_tx_power(wma_handle,
9352*5113495bSYour Name 				     (tpMaxTxPowerParams) msg->bodyptr);
9353*5113495bSYour Name 		break;
9354*5113495bSYour Name 	case WMA_SET_KEEP_ALIVE:
9355*5113495bSYour Name 		wma_set_keepalive_req(wma_handle, msg->bodyptr);
9356*5113495bSYour Name 		break;
9357*5113495bSYour Name #ifdef FEATURE_WLAN_ESE
9358*5113495bSYour Name 	case WMA_SET_PLM_REQ:
9359*5113495bSYour Name 		wma_config_plm(wma_handle, msg->bodyptr);
9360*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9361*5113495bSYour Name 		break;
9362*5113495bSYour Name #endif
9363*5113495bSYour Name 
9364*5113495bSYour Name 	case WMA_UPDATE_OP_MODE:
9365*5113495bSYour Name 		wma_process_update_opmode(wma_handle,
9366*5113495bSYour Name 					  (tUpdateVHTOpMode *) msg->bodyptr);
9367*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9368*5113495bSYour Name 		break;
9369*5113495bSYour Name 	case WMA_UPDATE_RX_NSS:
9370*5113495bSYour Name 		wma_process_update_rx_nss(wma_handle,
9371*5113495bSYour Name 					  (tUpdateRxNss *) msg->bodyptr);
9372*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9373*5113495bSYour Name 		break;
9374*5113495bSYour Name 	case WMA_UPDATE_MEMBERSHIP:
9375*5113495bSYour Name 		wma_process_update_membership(wma_handle,
9376*5113495bSYour Name 			(tUpdateMembership *) msg->bodyptr);
9377*5113495bSYour Name 		break;
9378*5113495bSYour Name 	case WMA_UPDATE_USERPOS:
9379*5113495bSYour Name 		wma_process_update_userpos(wma_handle,
9380*5113495bSYour Name 					   (tUpdateUserPos *) msg->bodyptr);
9381*5113495bSYour Name 		break;
9382*5113495bSYour Name 	case WMA_UPDATE_BEACON_IND:
9383*5113495bSYour Name 		wma_process_update_beacon_params(wma_handle,
9384*5113495bSYour Name 			(tUpdateBeaconParams *) msg->bodyptr);
9385*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9386*5113495bSYour Name 		break;
9387*5113495bSYour Name 
9388*5113495bSYour Name 	case WMA_ADD_TS_REQ:
9389*5113495bSYour Name 		wma_add_ts_req(wma_handle, msg->bodyptr);
9390*5113495bSYour Name 		break;
9391*5113495bSYour Name 
9392*5113495bSYour Name 	case WMA_DEL_TS_REQ:
9393*5113495bSYour Name 		wma_del_ts_req(wma_handle, msg->bodyptr);
9394*5113495bSYour Name 		break;
9395*5113495bSYour Name 
9396*5113495bSYour Name 	case WMA_AGGR_QOS_REQ:
9397*5113495bSYour Name 		wma_aggr_qos_req(wma_handle, msg->bodyptr);
9398*5113495bSYour Name 		break;
9399*5113495bSYour Name 
9400*5113495bSYour Name 	case WMA_8023_MULTICAST_LIST_REQ:
9401*5113495bSYour Name 		wma_process_mcbc_set_filter_req(wma_handle,
9402*5113495bSYour Name 				(tpSirRcvFltMcAddrList) msg->bodyptr);
9403*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9404*5113495bSYour Name 		break;
9405*5113495bSYour Name 
9406*5113495bSYour Name 	case WMA_ROAM_PRE_AUTH_STATUS:
9407*5113495bSYour Name 		wma_send_roam_preauth_status(wma_handle, msg->bodyptr);
9408*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9409*5113495bSYour Name 		break;
9410*5113495bSYour Name 
9411*5113495bSYour Name 	case WMA_ROAM_SYNC_TIMEOUT:
9412*5113495bSYour Name 		wma_handle_roam_sync_timeout(wma_handle, msg->bodyptr);
9413*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9414*5113495bSYour Name 		break;
9415*5113495bSYour Name 	case WMA_RATE_UPDATE_IND:
9416*5113495bSYour Name 		wma_process_rate_update_indicate(wma_handle,
9417*5113495bSYour Name 				(tSirRateUpdateInd *) msg->bodyptr);
9418*5113495bSYour Name 		break;
9419*5113495bSYour Name 
9420*5113495bSYour Name #ifdef FEATURE_WLAN_TDLS
9421*5113495bSYour Name 	case WMA_UPDATE_TDLS_PEER_STATE:
9422*5113495bSYour Name 		wma_update_tdls_peer_state(wma_handle, msg->bodyptr);
9423*5113495bSYour Name 		break;
9424*5113495bSYour Name #endif /* FEATURE_WLAN_TDLS */
9425*5113495bSYour Name 	case WMA_ADD_PERIODIC_TX_PTRN_IND:
9426*5113495bSYour Name 		wma_process_add_periodic_tx_ptrn_ind(wma_handle,
9427*5113495bSYour Name 				(tSirAddPeriodicTxPtrn *) msg->bodyptr);
9428*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9429*5113495bSYour Name 		break;
9430*5113495bSYour Name 	case WMA_DEL_PERIODIC_TX_PTRN_IND:
9431*5113495bSYour Name 		wma_process_del_periodic_tx_ptrn_ind(wma_handle,
9432*5113495bSYour Name 				(tSirDelPeriodicTxPtrn *) msg->bodyptr);
9433*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9434*5113495bSYour Name 		break;
9435*5113495bSYour Name 	case WMA_TX_POWER_LIMIT:
9436*5113495bSYour Name 		wma_process_tx_power_limits(wma_handle, msg->bodyptr);
9437*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9438*5113495bSYour Name 		break;
9439*5113495bSYour Name 	case WMA_SEND_ADDBA_REQ:
9440*5113495bSYour Name 		wma_process_send_addba_req(wma_handle,
9441*5113495bSYour Name 				(struct send_add_ba_req *)msg->bodyptr);
9442*5113495bSYour Name 		break;
9443*5113495bSYour Name 
9444*5113495bSYour Name #ifdef FEATURE_WLAN_CH_AVOID
9445*5113495bSYour Name 	case WMA_CH_AVOID_UPDATE_REQ:
9446*5113495bSYour Name 		wma_process_ch_avoid_update_req(wma_handle,
9447*5113495bSYour Name 				(tSirChAvoidUpdateReq *) msg->bodyptr);
9448*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9449*5113495bSYour Name 		break;
9450*5113495bSYour Name #endif /* FEATURE_WLAN_CH_AVOID */
9451*5113495bSYour Name #ifdef FEATURE_WLAN_AUTO_SHUTDOWN
9452*5113495bSYour Name 	case WMA_SET_AUTO_SHUTDOWN_TIMER_REQ:
9453*5113495bSYour Name 		wma_set_auto_shutdown_timer_req(wma_handle, msg->bodyptr);
9454*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9455*5113495bSYour Name 		break;
9456*5113495bSYour Name #endif /* FEATURE_WLAN_AUTO_SHUTDOWN */
9457*5113495bSYour Name 	case WMA_DHCP_START_IND:
9458*5113495bSYour Name 	case WMA_DHCP_STOP_IND:
9459*5113495bSYour Name 		wma_process_dhcp_ind(wma_handle, (tAniDHCPInd *) msg->bodyptr);
9460*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9461*5113495bSYour Name 		break;
9462*5113495bSYour Name 	case WMA_INIT_THERMAL_INFO_CMD:
9463*5113495bSYour Name 		wma_process_init_thermal_info(wma_handle,
9464*5113495bSYour Name 					      (t_thermal_mgmt *) msg->bodyptr);
9465*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9466*5113495bSYour Name 		break;
9467*5113495bSYour Name 
9468*5113495bSYour Name 	case WMA_SET_THERMAL_LEVEL:
9469*5113495bSYour Name 		wma_process_set_thermal_level(wma_handle, msg->bodyval);
9470*5113495bSYour Name 		break;
9471*5113495bSYour Name #ifdef CONFIG_HL_SUPPORT
9472*5113495bSYour Name 	case WMA_INIT_BAD_PEER_TX_CTL_INFO_CMD:
9473*5113495bSYour Name 		wma_process_init_bad_peer_tx_ctl_info(
9474*5113495bSYour Name 			wma_handle,
9475*5113495bSYour Name 			(struct t_bad_peer_txtcl_config *)msg->bodyptr);
9476*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9477*5113495bSYour Name 			break;
9478*5113495bSYour Name #endif
9479*5113495bSYour Name 	case WMA_SET_MIMOPS_REQ:
9480*5113495bSYour Name 		wma_process_set_mimops_req(wma_handle,
9481*5113495bSYour Name 					   (tSetMIMOPS *) msg->bodyptr);
9482*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9483*5113495bSYour Name 		break;
9484*5113495bSYour Name 	case WMA_SET_SAP_INTRABSS_DIS:
9485*5113495bSYour Name 		wma_set_vdev_intrabss_fwd(wma_handle,
9486*5113495bSYour Name 					  (tDisableIntraBssFwd *) msg->bodyptr);
9487*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9488*5113495bSYour Name 		break;
9489*5113495bSYour Name 	case WMA_GET_ISOLATION:
9490*5113495bSYour Name 		wma_get_isolation(wma_handle);
9491*5113495bSYour Name 		break;
9492*5113495bSYour Name 	case WMA_MODEM_POWER_STATE_IND:
9493*5113495bSYour Name 		wma_notify_modem_power_state(wma_handle,
9494*5113495bSYour Name 				(tSirModemPowerStateInd *) msg->bodyptr);
9495*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9496*5113495bSYour Name 		break;
9497*5113495bSYour Name #ifdef WLAN_FEATURE_STATS_EXT
9498*5113495bSYour Name 	case WMA_STATS_EXT_REQUEST:
9499*5113495bSYour Name 		wma_stats_ext_req(wma_handle,
9500*5113495bSYour Name 				  (tpStatsExtRequest) (msg->bodyptr));
9501*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9502*5113495bSYour Name 		break;
9503*5113495bSYour Name #endif /* WLAN_FEATURE_STATS_EXT */
9504*5113495bSYour Name #ifdef WLAN_FEATURE_EXTWOW_SUPPORT
9505*5113495bSYour Name 	case WMA_WLAN_EXT_WOW:
9506*5113495bSYour Name 		wma_enable_ext_wow(wma_handle,
9507*5113495bSYour Name 				   (tSirExtWoWParams *) msg->bodyptr);
9508*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9509*5113495bSYour Name 		break;
9510*5113495bSYour Name 	case WMA_WLAN_SET_APP_TYPE1_PARAMS:
9511*5113495bSYour Name 		wma_set_app_type1_params_in_fw(wma_handle,
9512*5113495bSYour Name 				(tSirAppType1Params *) msg->bodyptr);
9513*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9514*5113495bSYour Name 		break;
9515*5113495bSYour Name 	case WMA_WLAN_SET_APP_TYPE2_PARAMS:
9516*5113495bSYour Name 		wma_set_app_type2_params_in_fw(wma_handle,
9517*5113495bSYour Name 				(tSirAppType2Params *) msg->bodyptr);
9518*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9519*5113495bSYour Name 		break;
9520*5113495bSYour Name #endif /* WLAN_FEATURE_EXTWOW_SUPPORT */
9521*5113495bSYour Name #ifdef FEATURE_WLAN_EXTSCAN
9522*5113495bSYour Name 	case WMA_EXTSCAN_START_REQ:
9523*5113495bSYour Name 		wma_start_extscan(wma_handle, msg->bodyptr);
9524*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9525*5113495bSYour Name 		break;
9526*5113495bSYour Name 	case WMA_EXTSCAN_STOP_REQ:
9527*5113495bSYour Name 		wma_stop_extscan(wma_handle, msg->bodyptr);
9528*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9529*5113495bSYour Name 		break;
9530*5113495bSYour Name 	case WMA_EXTSCAN_SET_BSSID_HOTLIST_REQ:
9531*5113495bSYour Name 		wma_extscan_start_hotlist_monitor(wma_handle, msg->bodyptr);
9532*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9533*5113495bSYour Name 		break;
9534*5113495bSYour Name 	case WMA_EXTSCAN_RESET_BSSID_HOTLIST_REQ:
9535*5113495bSYour Name 		wma_extscan_stop_hotlist_monitor(wma_handle, msg->bodyptr);
9536*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9537*5113495bSYour Name 		break;
9538*5113495bSYour Name 	case WMA_EXTSCAN_SET_SIGNF_CHANGE_REQ:
9539*5113495bSYour Name 		wma_extscan_start_change_monitor(wma_handle, msg->bodyptr);
9540*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9541*5113495bSYour Name 		break;
9542*5113495bSYour Name 	case WMA_EXTSCAN_RESET_SIGNF_CHANGE_REQ:
9543*5113495bSYour Name 		wma_extscan_stop_change_monitor(wma_handle, msg->bodyptr);
9544*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9545*5113495bSYour Name 		break;
9546*5113495bSYour Name 	case WMA_EXTSCAN_GET_CACHED_RESULTS_REQ:
9547*5113495bSYour Name 		wma_extscan_get_cached_results(wma_handle, msg->bodyptr);
9548*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9549*5113495bSYour Name 		break;
9550*5113495bSYour Name 	case WMA_EXTSCAN_GET_CAPABILITIES_REQ:
9551*5113495bSYour Name 		wma_extscan_get_capabilities(wma_handle, msg->bodyptr);
9552*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9553*5113495bSYour Name 		break;
9554*5113495bSYour Name 	case WMA_SET_EPNO_LIST_REQ:
9555*5113495bSYour Name 		wma_set_epno_network_list(wma_handle, msg->bodyptr);
9556*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9557*5113495bSYour Name 		break;
9558*5113495bSYour Name 	case WMA_SET_PASSPOINT_LIST_REQ:
9559*5113495bSYour Name 		/* Issue reset passpoint network list first and clear
9560*5113495bSYour Name 		 * the entries
9561*5113495bSYour Name 		 */
9562*5113495bSYour Name 		wma_reset_passpoint_network_list(wma_handle, msg->bodyptr);
9563*5113495bSYour Name 
9564*5113495bSYour Name 		wma_set_passpoint_network_list(wma_handle, msg->bodyptr);
9565*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9566*5113495bSYour Name 		break;
9567*5113495bSYour Name 	case WMA_RESET_PASSPOINT_LIST_REQ:
9568*5113495bSYour Name 		wma_reset_passpoint_network_list(wma_handle, msg->bodyptr);
9569*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9570*5113495bSYour Name 		break;
9571*5113495bSYour Name #endif /* FEATURE_WLAN_EXTSCAN */
9572*5113495bSYour Name 	case WMA_SET_SCAN_MAC_OUI_REQ:
9573*5113495bSYour Name 		wma_scan_probe_setoui(wma_handle, msg->bodyptr);
9574*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9575*5113495bSYour Name 		break;
9576*5113495bSYour Name #ifdef WLAN_FEATURE_LINK_LAYER_STATS
9577*5113495bSYour Name 	case WMA_LINK_LAYER_STATS_CLEAR_REQ:
9578*5113495bSYour Name 		wma_process_ll_stats_clear_req(wma_handle,
9579*5113495bSYour Name 			(tpSirLLStatsClearReq) msg->bodyptr);
9580*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9581*5113495bSYour Name 		break;
9582*5113495bSYour Name 	case WMA_LINK_LAYER_STATS_SET_REQ:
9583*5113495bSYour Name 		wma_process_ll_stats_set_req(wma_handle,
9584*5113495bSYour Name 					     (tpSirLLStatsSetReq) msg->bodyptr);
9585*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9586*5113495bSYour Name 		break;
9587*5113495bSYour Name 	case WMA_LINK_LAYER_STATS_GET_REQ:
9588*5113495bSYour Name 		wma_process_ll_stats_get_req(wma_handle,
9589*5113495bSYour Name 					     (tpSirLLStatsGetReq) msg->bodyptr);
9590*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9591*5113495bSYour Name 		break;
9592*5113495bSYour Name 	case WDA_LINK_LAYER_STATS_SET_THRESHOLD:
9593*5113495bSYour Name 		wma_config_stats_ext_threshold(wma_handle,
9594*5113495bSYour Name 			(struct sir_ll_ext_stats_threshold *)msg->bodyptr);
9595*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9596*5113495bSYour Name 		break;
9597*5113495bSYour Name #endif /* WLAN_FEATURE_LINK_LAYER_STATS */
9598*5113495bSYour Name 	case SIR_HAL_SET_BASE_MACADDR_IND:
9599*5113495bSYour Name 		wma_set_base_macaddr_indicate(wma_handle,
9600*5113495bSYour Name 					      (tSirMacAddr *) msg->bodyptr);
9601*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9602*5113495bSYour Name 		break;
9603*5113495bSYour Name 	case WMA_LINK_STATUS_GET_REQ:
9604*5113495bSYour Name 		wma_process_link_status_req(wma_handle,
9605*5113495bSYour Name 					    (tAniGetLinkStatus *) msg->bodyptr);
9606*5113495bSYour Name 		break;
9607*5113495bSYour Name 	case WMA_GET_TEMPERATURE_REQ:
9608*5113495bSYour Name 		wma_get_temperature(wma_handle);
9609*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9610*5113495bSYour Name 		break;
9611*5113495bSYour Name 	case WMA_TSF_GPIO_PIN:
9612*5113495bSYour Name 		wma_set_tsf_gpio_pin(wma_handle, msg->bodyval);
9613*5113495bSYour Name 		break;
9614*5113495bSYour Name 
9615*5113495bSYour Name #ifdef DHCP_SERVER_OFFLOAD
9616*5113495bSYour Name 	case WMA_SET_DHCP_SERVER_OFFLOAD_CMD:
9617*5113495bSYour Name 		wma_process_dhcpserver_offload(wma_handle, msg->bodyptr);
9618*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9619*5113495bSYour Name 		break;
9620*5113495bSYour Name #endif /* DHCP_SERVER_OFFLOAD */
9621*5113495bSYour Name #ifdef WLAN_FEATURE_GPIO_LED_FLASHING
9622*5113495bSYour Name 	case WMA_LED_FLASHING_REQ:
9623*5113495bSYour Name 		wma_set_led_flashing(wma_handle, msg->bodyptr);
9624*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9625*5113495bSYour Name 		break;
9626*5113495bSYour Name #endif /* WLAN_FEATURE_GPIO_LED_FLASHING */
9627*5113495bSYour Name 	case SIR_HAL_SET_MAS:
9628*5113495bSYour Name 		wma_process_set_mas(wma_handle,
9629*5113495bSYour Name 				(uint32_t *)msg->bodyptr);
9630*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9631*5113495bSYour Name 		break;
9632*5113495bSYour Name 	case SIR_HAL_SET_MIRACAST:
9633*5113495bSYour Name 		wma_process_set_miracast(wma_handle,
9634*5113495bSYour Name 				(uint32_t *)msg->bodyptr);
9635*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9636*5113495bSYour Name 		break;
9637*5113495bSYour Name 	case SIR_HAL_CONFIG_STATS_FACTOR:
9638*5113495bSYour Name 		wma_config_stats_factor(wma_handle,
9639*5113495bSYour Name 					(struct sir_stats_avg_factor *)
9640*5113495bSYour Name 					msg->bodyptr);
9641*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9642*5113495bSYour Name 		break;
9643*5113495bSYour Name 	case SIR_HAL_CONFIG_GUARD_TIME:
9644*5113495bSYour Name 		wma_config_guard_time(wma_handle,
9645*5113495bSYour Name 				      (struct sir_guard_time_request *)
9646*5113495bSYour Name 				      msg->bodyptr);
9647*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9648*5113495bSYour Name 		break;
9649*5113495bSYour Name 	case SIR_HAL_START_STOP_LOGGING:
9650*5113495bSYour Name 		wma_set_wifi_start_packet_stats(wma_handle,
9651*5113495bSYour Name 				(struct sir_wifi_start_log *)msg->bodyptr);
9652*5113495bSYour Name 		wma_enable_specific_fw_logs(wma_handle,
9653*5113495bSYour Name 				(struct sir_wifi_start_log *)msg->bodyptr);
9654*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9655*5113495bSYour Name 		break;
9656*5113495bSYour Name 	case SIR_HAL_FLUSH_LOG_TO_FW:
9657*5113495bSYour Name 		wma_send_flush_logs_to_fw(wma_handle);
9658*5113495bSYour Name 		/* Body ptr is NULL here */
9659*5113495bSYour Name 		break;
9660*5113495bSYour Name 	case WMA_SET_RSSI_MONITOR_REQ:
9661*5113495bSYour Name 		wma_set_rssi_monitoring(wma_handle, msg->bodyptr);
9662*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9663*5113495bSYour Name 		break;
9664*5113495bSYour Name 	case SIR_HAL_SET_PCL_TO_FW:
9665*5113495bSYour Name 		wma_send_set_pcl_cmd(wma_handle,
9666*5113495bSYour Name 				     (struct set_pcl_req *)msg->bodyptr);
9667*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9668*5113495bSYour Name 		break;
9669*5113495bSYour Name 	case SIR_HAL_PDEV_SET_HW_MODE:
9670*5113495bSYour Name 		wma_send_pdev_set_hw_mode_cmd(wma_handle,
9671*5113495bSYour Name 				(struct policy_mgr_hw_mode *)msg->bodyptr);
9672*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9673*5113495bSYour Name 		break;
9674*5113495bSYour Name 	case WMA_SET_WISA_PARAMS:
9675*5113495bSYour Name 		wma_set_wisa_params(wma_handle,
9676*5113495bSYour Name 			(struct sir_wisa_params *)msg->bodyptr);
9677*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9678*5113495bSYour Name 		break;
9679*5113495bSYour Name 	case SIR_HAL_PDEV_DUAL_MAC_CFG_REQ:
9680*5113495bSYour Name 		wma_send_pdev_set_dual_mac_config(wma_handle,
9681*5113495bSYour Name 				(struct policy_mgr_dual_mac_config *)msg->bodyptr);
9682*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9683*5113495bSYour Name 		break;
9684*5113495bSYour Name 	case WMA_SET_IE_INFO:
9685*5113495bSYour Name 		wma_process_set_ie_info(wma_handle,
9686*5113495bSYour Name 			(struct vdev_ie_info *)msg->bodyptr);
9687*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9688*5113495bSYour Name 		break;
9689*5113495bSYour Name 	case WMA_CFG_VENDOR_ACTION_TB_PPDU:
9690*5113495bSYour Name 		wma_process_cfg_action_frm_tb_ppdu(wma_handle, msg->bodyptr);
9691*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9692*5113495bSYour Name 		break;
9693*5113495bSYour Name 	case SIR_HAL_SOC_ANTENNA_MODE_REQ:
9694*5113495bSYour Name 		wma_send_pdev_set_antenna_mode(wma_handle,
9695*5113495bSYour Name 			(struct sir_antenna_mode_param *)msg->bodyptr);
9696*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9697*5113495bSYour Name 		break;
9698*5113495bSYour Name 	case WMA_GW_PARAM_UPDATE_REQ:
9699*5113495bSYour Name 		wma_set_gateway_params(wma_handle, msg->bodyptr);
9700*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9701*5113495bSYour Name 		break;
9702*5113495bSYour Name 	case WMA_SET_ADAPT_DWELLTIME_CONF_PARAMS:
9703*5113495bSYour Name 		wma_send_adapt_dwelltime_params(wma_handle,
9704*5113495bSYour Name 			(struct adaptive_dwelltime_params *)msg->bodyptr);
9705*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9706*5113495bSYour Name 		break;
9707*5113495bSYour Name 	case WMA_HT40_OBSS_SCAN_IND:
9708*5113495bSYour Name 		wma_send_ht40_obss_scanind(wma_handle,
9709*5113495bSYour Name 			(struct obss_ht40_scanind *)msg->bodyptr);
9710*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9711*5113495bSYour Name 		break;
9712*5113495bSYour Name 	case WMA_ADD_BCN_FILTER_CMDID:
9713*5113495bSYour Name 		wma_add_beacon_filter(wma_handle, msg->bodyptr);
9714*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9715*5113495bSYour Name 		break;
9716*5113495bSYour Name 	case WMA_REMOVE_BCN_FILTER_CMDID:
9717*5113495bSYour Name 		wma_remove_beacon_filter(wma_handle, msg->bodyptr);
9718*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9719*5113495bSYour Name 		break;
9720*5113495bSYour Name 	case WDA_APF_GET_CAPABILITIES_REQ:
9721*5113495bSYour Name 		wma_get_apf_capabilities(wma_handle);
9722*5113495bSYour Name 		break;
9723*5113495bSYour Name 	case SIR_HAL_POWER_DBG_CMD:
9724*5113495bSYour Name 		wma_process_hal_pwr_dbg_cmd(wma_handle,
9725*5113495bSYour Name 					    msg->bodyptr);
9726*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9727*5113495bSYour Name 		break;
9728*5113495bSYour Name 	case WMA_SEND_FREQ_RANGE_CONTROL_IND:
9729*5113495bSYour Name 		wma_enable_disable_caevent_ind(wma_handle, msg->bodyval);
9730*5113495bSYour Name 		break;
9731*5113495bSYour Name 	case SIR_HAL_UPDATE_TX_FAIL_CNT_TH:
9732*5113495bSYour Name 		wma_update_tx_fail_cnt_th(wma_handle, msg->bodyptr);
9733*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9734*5113495bSYour Name 		break;
9735*5113495bSYour Name 	case SIR_HAL_LONG_RETRY_LIMIT_CNT:
9736*5113495bSYour Name 		wma_update_long_retry_limit(wma_handle, msg->bodyptr);
9737*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9738*5113495bSYour Name 		break;
9739*5113495bSYour Name 	case SIR_HAL_SHORT_RETRY_LIMIT_CNT:
9740*5113495bSYour Name 		wma_update_short_retry_limit(wma_handle, msg->bodyptr);
9741*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9742*5113495bSYour Name 		break;
9743*5113495bSYour Name 	case SIR_HAL_POWER_DEBUG_STATS_REQ:
9744*5113495bSYour Name 		wma_process_power_debug_stats_req(wma_handle);
9745*5113495bSYour Name 		break;
9746*5113495bSYour Name 	case WMA_BEACON_DEBUG_STATS_REQ:
9747*5113495bSYour Name 		wma_process_beacon_debug_stats_req(wma_handle, msg->bodyptr);
9748*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9749*5113495bSYour Name 		break;
9750*5113495bSYour Name 	case WMA_GET_RCPI_REQ:
9751*5113495bSYour Name 		wma_get_rcpi_req(wma_handle,
9752*5113495bSYour Name 				 (struct sme_rcpi_req *)msg->bodyptr);
9753*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9754*5113495bSYour Name 		break;
9755*5113495bSYour Name 	case WMA_SET_WOW_PULSE_CMD:
9756*5113495bSYour Name 		wma_send_wow_pulse_cmd(wma_handle,
9757*5113495bSYour Name 			(struct wow_pulse_mode *)msg->bodyptr);
9758*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9759*5113495bSYour Name 		break;
9760*5113495bSYour Name 	case WMA_SET_DBS_SCAN_SEL_CONF_PARAMS:
9761*5113495bSYour Name 		wma_send_dbs_scan_selection_params(wma_handle,
9762*5113495bSYour Name 			(struct wmi_dbs_scan_sel_params *)msg->bodyptr);
9763*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9764*5113495bSYour Name 		break;
9765*5113495bSYour Name 	case WMA_SET_ARP_STATS_REQ:
9766*5113495bSYour Name 		wma_set_arp_req_stats(wma_handle,
9767*5113495bSYour Name 			(struct set_arp_stats_params *)msg->bodyptr);
9768*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9769*5113495bSYour Name 		break;
9770*5113495bSYour Name 	case WMA_GET_ARP_STATS_REQ:
9771*5113495bSYour Name 		wma_get_arp_req_stats(wma_handle,
9772*5113495bSYour Name 			(struct get_arp_stats_params *)msg->bodyptr);
9773*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9774*5113495bSYour Name 		break;
9775*5113495bSYour Name 	case SIR_HAL_SET_DEL_PMKID_CACHE:
9776*5113495bSYour Name 		wma_set_del_pmkid_cache(wma_handle, msg->bodyptr);
9777*5113495bSYour Name 		if (msg->bodyptr) {
9778*5113495bSYour Name 			qdf_mem_zero(msg->bodyptr,
9779*5113495bSYour Name 				     sizeof(struct wmi_unified_pmk_cache));
9780*5113495bSYour Name 			qdf_mem_free(msg->bodyptr);
9781*5113495bSYour Name 		}
9782*5113495bSYour Name 		break;
9783*5113495bSYour Name 	case SIR_HAL_HLP_IE_INFO:
9784*5113495bSYour Name 		wma_roam_scan_send_hlp(wma_handle,
9785*5113495bSYour Name 			(struct hlp_params *)msg->bodyptr);
9786*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9787*5113495bSYour Name 		break;
9788*5113495bSYour Name 	case WMA_SET_LIMIT_OFF_CHAN:
9789*5113495bSYour Name 		wma_process_limit_off_chan(wma_handle, msg->bodyptr);
9790*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9791*5113495bSYour Name 		break;
9792*5113495bSYour Name 	case WMA_OBSS_DETECTION_REQ:
9793*5113495bSYour Name 		wma_send_obss_detection_cfg(wma_handle, msg->bodyptr);
9794*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9795*5113495bSYour Name 		break;
9796*5113495bSYour Name 	case WMA_INVOKE_NEIGHBOR_REPORT:
9797*5113495bSYour Name 		wma_send_invoke_neighbor_report(wma_handle, msg->bodyptr);
9798*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9799*5113495bSYour Name 		break;
9800*5113495bSYour Name 	case WMA_OBSS_COLOR_COLLISION_REQ:
9801*5113495bSYour Name 		wma_process_obss_color_collision_req(wma_handle, msg->bodyptr);
9802*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9803*5113495bSYour Name 		break;
9804*5113495bSYour Name 	case WMA_GET_ROAM_SCAN_STATS:
9805*5113495bSYour Name 		wma_get_roam_scan_stats(wma_handle, msg->bodyptr);
9806*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9807*5113495bSYour Name 		break;
9808*5113495bSYour Name #ifdef WLAN_FEATURE_MOTION_DETECTION
9809*5113495bSYour Name 	case WMA_SET_MOTION_DET_CONFIG:
9810*5113495bSYour Name 		wma_set_motion_det_config(
9811*5113495bSYour Name 			wma_handle,
9812*5113495bSYour Name 			(struct sme_motion_det_cfg *)msg->bodyptr);
9813*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9814*5113495bSYour Name 		break;
9815*5113495bSYour Name 	case WMA_SET_MOTION_DET_ENABLE:
9816*5113495bSYour Name 		wma_set_motion_det_enable(
9817*5113495bSYour Name 			wma_handle,
9818*5113495bSYour Name 			(struct sme_motion_det_en *)msg->bodyptr);
9819*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9820*5113495bSYour Name 		break;
9821*5113495bSYour Name 	case WMA_SET_MOTION_DET_BASE_LINE_CONFIG:
9822*5113495bSYour Name 		wma_set_motion_det_base_line_config(
9823*5113495bSYour Name 			wma_handle,
9824*5113495bSYour Name 			(struct sme_motion_det_base_line_cfg *)msg->bodyptr);
9825*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9826*5113495bSYour Name 		break;
9827*5113495bSYour Name 	case WMA_SET_MOTION_DET_BASE_LINE_ENABLE:
9828*5113495bSYour Name 		wma_set_motion_det_base_line_enable(
9829*5113495bSYour Name 			wma_handle,
9830*5113495bSYour Name 			(struct sme_motion_det_base_line_en *)msg->bodyptr);
9831*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9832*5113495bSYour Name 		break;
9833*5113495bSYour Name #endif /* WLAN_FEATURE_MOTION_DETECTION */
9834*5113495bSYour Name #ifdef FW_THERMAL_THROTTLE_SUPPORT
9835*5113495bSYour Name 	case WMA_SET_THERMAL_THROTTLE_CFG:
9836*5113495bSYour Name 		if (!wma_handle->thermal_mgmt_info.thermalMgmtEnabled)
9837*5113495bSYour Name 			wmi_unified_thermal_mitigation_param_cmd_send(
9838*5113495bSYour Name 					wma_handle->wmi_handle, msg->bodyptr);
9839*5113495bSYour Name 		else
9840*5113495bSYour Name 			qdf_status = QDF_STATUS_E_INVAL;
9841*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9842*5113495bSYour Name 		break;
9843*5113495bSYour Name 	case WMA_SET_THERMAL_MGMT:
9844*5113495bSYour Name 		if (!wma_handle->thermal_mgmt_info.thermalMgmtEnabled)
9845*5113495bSYour Name 			wma_set_thermal_mgmt(
9846*5113495bSYour Name 				wma_handle,
9847*5113495bSYour Name 				*((t_thermal_cmd_params *)msg->bodyptr));
9848*5113495bSYour Name 		else
9849*5113495bSYour Name 			qdf_status = QDF_STATUS_E_INVAL;
9850*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9851*5113495bSYour Name 		break;
9852*5113495bSYour Name #endif /* FW_THERMAL_THROTTLE_SUPPORT */
9853*5113495bSYour Name #ifdef WLAN_MWS_INFO_DEBUGFS
9854*5113495bSYour Name 	case WMA_GET_MWS_COEX_INFO_REQ:
9855*5113495bSYour Name 		wma_get_mws_coex_info_req(wma_handle, msg->bodyptr);
9856*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9857*5113495bSYour Name 		break;
9858*5113495bSYour Name #endif
9859*5113495bSYour Name 	case WMA_ROAM_SCAN_CH_REQ:
9860*5113495bSYour Name 		wma_get_roam_scan_ch(wma_handle->wmi_handle, msg->bodyval);
9861*5113495bSYour Name 		break;
9862*5113495bSYour Name 	case WMA_TWT_ADD_DIALOG_REQUEST:
9863*5113495bSYour Name 		wma_twt_process_add_dialog(wma_handle, msg->bodyptr);
9864*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9865*5113495bSYour Name 		break;
9866*5113495bSYour Name 	case WMA_TWT_DEL_DIALOG_REQUEST:
9867*5113495bSYour Name 		wma_twt_process_del_dialog(wma_handle, msg->bodyptr);
9868*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9869*5113495bSYour Name 		break;
9870*5113495bSYour Name 	case WMA_TWT_PAUSE_DIALOG_REQUEST:
9871*5113495bSYour Name 		wma_twt_process_pause_dialog(wma_handle, msg->bodyptr);
9872*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9873*5113495bSYour Name 		break;
9874*5113495bSYour Name 	case WMA_TWT_RESUME_DIALOG_REQUEST:
9875*5113495bSYour Name 		wma_twt_process_resume_dialog(wma_handle, msg->bodyptr);
9876*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9877*5113495bSYour Name 		break;
9878*5113495bSYour Name 	case WMA_TWT_NUDGE_DIALOG_REQUEST:
9879*5113495bSYour Name 		wma_twt_process_nudge_dialog(wma_handle, msg->bodyptr);
9880*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9881*5113495bSYour Name 		break;
9882*5113495bSYour Name 	case WMA_UPDATE_EDCA_PIFS_PARAM_IND:
9883*5113495bSYour Name 		wma_update_edca_pifs_param(
9884*5113495bSYour Name 				wma_handle,
9885*5113495bSYour Name 				(struct edca_pifs_vparam *)msg->bodyptr);
9886*5113495bSYour Name 		qdf_mem_free(msg->bodyptr);
9887*5113495bSYour Name 		break;
9888*5113495bSYour Name 	default:
9889*5113495bSYour Name 		wma_debug("Unhandled WMA message of type %d", msg->type);
9890*5113495bSYour Name 		if (msg->bodyptr)
9891*5113495bSYour Name 			qdf_mem_free(msg->bodyptr);
9892*5113495bSYour Name 	}
9893*5113495bSYour Name end:
9894*5113495bSYour Name 	return qdf_status;
9895*5113495bSYour Name }
9896*5113495bSYour Name 
wma_mc_process_handler(struct scheduler_msg * msg)9897*5113495bSYour Name QDF_STATUS wma_mc_process_handler(struct scheduler_msg *msg)
9898*5113495bSYour Name {
9899*5113495bSYour Name 	return wma_mc_process_msg(msg);
9900*5113495bSYour Name }
9901*5113495bSYour Name 
9902*5113495bSYour Name /**
9903*5113495bSYour Name  * wma_log_completion_timeout() - Log completion timeout
9904*5113495bSYour Name  * @data: Timeout handler data
9905*5113495bSYour Name  *
9906*5113495bSYour Name  * This function is called when log completion timer expires
9907*5113495bSYour Name  *
9908*5113495bSYour Name  * Return: None
9909*5113495bSYour Name  */
wma_log_completion_timeout(void * data)9910*5113495bSYour Name void wma_log_completion_timeout(void *data)
9911*5113495bSYour Name {
9912*5113495bSYour Name 	wma_debug("Timeout occurred for log completion command");
9913*5113495bSYour Name 
9914*5113495bSYour Name 	/* Though we did not receive any event from FW,
9915*5113495bSYour Name 	 * we can flush whatever logs we have with us
9916*5113495bSYour Name 	 */
9917*5113495bSYour Name 	cds_logging_set_fw_flush_complete();
9918*5113495bSYour Name }
9919*5113495bSYour Name 
9920*5113495bSYour Name /**
9921*5113495bSYour Name  * wma_map_pcl_weights() - Map PCL weights
9922*5113495bSYour Name  * @pcl_weight: Internal PCL weights
9923*5113495bSYour Name  *
9924*5113495bSYour Name  * Maps the internal weights of PCL to the weights needed by FW
9925*5113495bSYour Name  *
9926*5113495bSYour Name  * Return: Mapped channel weight of type wmi_pcl_chan_weight
9927*5113495bSYour Name  */
wma_map_pcl_weights(uint32_t pcl_weight)9928*5113495bSYour Name wmi_pcl_chan_weight wma_map_pcl_weights(uint32_t pcl_weight)
9929*5113495bSYour Name {
9930*5113495bSYour Name 	switch (pcl_weight) {
9931*5113495bSYour Name 	case WEIGHT_OF_GROUP1_PCL_CHANNELS:
9932*5113495bSYour Name 		return WMI_PCL_WEIGHT_VERY_HIGH;
9933*5113495bSYour Name 	case WEIGHT_OF_GROUP2_PCL_CHANNELS:
9934*5113495bSYour Name 		return WMI_PCL_WEIGHT_HIGH;
9935*5113495bSYour Name 	case WEIGHT_OF_GROUP3_PCL_CHANNELS:
9936*5113495bSYour Name 		return WMI_PCL_WEIGHT_MEDIUM;
9937*5113495bSYour Name 	case WEIGHT_OF_GROUP4_PCL_CHANNELS:
9938*5113495bSYour Name 		return WMI_PCL_WEIGHT_MEDIUM;
9939*5113495bSYour Name 	case WEIGHT_OF_NON_PCL_CHANNELS:
9940*5113495bSYour Name 		return WMI_PCL_WEIGHT_LOW;
9941*5113495bSYour Name 	default:
9942*5113495bSYour Name 		return WMI_PCL_WEIGHT_DISALLOW;
9943*5113495bSYour Name 	}
9944*5113495bSYour Name }
9945*5113495bSYour Name 
9946*5113495bSYour Name /**
9947*5113495bSYour Name  * wma_send_set_pcl_cmd() - Send WMI_SOC_SET_PCL_CMDID to FW
9948*5113495bSYour Name  * @wma_handle: WMA handle
9949*5113495bSYour Name  * @msg: PCL structure containing the PCL and the number of channels
9950*5113495bSYour Name  *
9951*5113495bSYour Name  * WMI_PDEV_SET_PCL_CMDID provides a Preferred Channel List (PCL) to the WLAN
9952*5113495bSYour Name  * firmware. The DBS Manager is the consumer of this information in the WLAN
9953*5113495bSYour Name  * firmware. The channel list will be used when a Virtual DEVice (VDEV) needs
9954*5113495bSYour Name  * to migrate to a new channel without host driver involvement. An example of
9955*5113495bSYour Name  * this behavior is Legacy Fast Roaming (LFR 3.0). Generally, the host will
9956*5113495bSYour Name  * manage the channel selection without firmware involvement.
9957*5113495bSYour Name  *
9958*5113495bSYour Name  * WMI_PDEV_SET_PCL_CMDID will carry only the weight list and not the actual
9959*5113495bSYour Name  * channel list. The weights corresponds to the channels sent in
9960*5113495bSYour Name  * WMI_SCAN_CHAN_LIST_CMDID. The channels from PCL would be having a higher
9961*5113495bSYour Name  * weightage compared to the non PCL channels.
9962*5113495bSYour Name  *
9963*5113495bSYour Name  * Return: Success if the cmd is sent successfully to the firmware
9964*5113495bSYour Name  */
wma_send_set_pcl_cmd(tp_wma_handle wma_handle,struct set_pcl_req * msg)9965*5113495bSYour Name QDF_STATUS wma_send_set_pcl_cmd(tp_wma_handle wma_handle,
9966*5113495bSYour Name 				struct set_pcl_req *msg)
9967*5113495bSYour Name {
9968*5113495bSYour Name 	uint32_t i;
9969*5113495bSYour Name 	QDF_STATUS status;
9970*5113495bSYour Name 	bool is_channel_allowed;
9971*5113495bSYour Name 
9972*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
9973*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
9974*5113495bSYour Name 
9975*5113495bSYour Name 	/*
9976*5113495bSYour Name 	 * if vdev_id is WLAN_UMAC_VDEV_ID_MAX, then roaming is enabled on
9977*5113495bSYour Name 	 * only one sta, so PDEV PCL command needs to be sent.
9978*5113495bSYour Name 	 * If a valid vdev id is present, then vdev pcl command needs to be
9979*5113495bSYour Name 	 * sent.
9980*5113495bSYour Name 	 */
9981*5113495bSYour Name 	if (msg->vdev_id != WLAN_UMAC_VDEV_ID_MAX)
9982*5113495bSYour Name 		return wlan_cm_roam_send_set_vdev_pcl(wma_handle->psoc, msg);
9983*5113495bSYour Name 
9984*5113495bSYour Name 
9985*5113495bSYour Name 	wma_debug("RSO_CFG: BandCapability:%d, band_mask:%d",
9986*5113495bSYour Name 		  wma_handle->bandcapability, msg->band_mask);
9987*5113495bSYour Name 	for (i = 0; i < wma_handle->saved_chan.num_channels; i++) {
9988*5113495bSYour Name 		msg->chan_weights.saved_chan_list[i] =
9989*5113495bSYour Name 					wma_handle->saved_chan.ch_freq_list[i];
9990*5113495bSYour Name 	}
9991*5113495bSYour Name 
9992*5113495bSYour Name 	msg->chan_weights.saved_num_chan = wma_handle->saved_chan.num_channels;
9993*5113495bSYour Name 
9994*5113495bSYour Name 	status = policy_mgr_get_valid_chan_weights(wma_handle->psoc,
9995*5113495bSYour Name 		(struct policy_mgr_pcl_chan_weights *)&msg->chan_weights,
9996*5113495bSYour Name 		PM_STA_MODE, NULL);
9997*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
9998*5113495bSYour Name 		wma_err("Error in creating weighed pcl");
9999*5113495bSYour Name 		return status;
10000*5113495bSYour Name 	}
10001*5113495bSYour Name 
10002*5113495bSYour Name 	for (i = 0; i < msg->chan_weights.saved_num_chan; i++) {
10003*5113495bSYour Name 		msg->chan_weights.weighed_valid_list[i] =
10004*5113495bSYour Name 			wma_map_pcl_weights(
10005*5113495bSYour Name 				msg->chan_weights.weighed_valid_list[i]);
10006*5113495bSYour Name 
10007*5113495bSYour Name 		is_channel_allowed =
10008*5113495bSYour Name 			policy_mgr_is_sta_chan_valid_for_connect_and_roam(
10009*5113495bSYour Name 					wma_handle->pdev,
10010*5113495bSYour Name 					msg->chan_weights.saved_chan_list[i]);
10011*5113495bSYour Name 		if (!is_channel_allowed) {
10012*5113495bSYour Name 			msg->chan_weights.weighed_valid_list[i] =
10013*5113495bSYour Name 					WEIGHT_OF_DISALLOWED_CHANNELS;
10014*5113495bSYour Name 			continue;
10015*5113495bSYour Name 		}
10016*5113495bSYour Name 
10017*5113495bSYour Name 		if (msg->band_mask ==
10018*5113495bSYour Name 		      (BIT(REG_BAND_2G) | BIT(REG_BAND_5G) | BIT(REG_BAND_6G)))
10019*5113495bSYour Name 			continue;
10020*5113495bSYour Name 
10021*5113495bSYour Name 		/*
10022*5113495bSYour Name 		 * Dont allow roaming on 5G/6G band if only 2G band configured
10023*5113495bSYour Name 		 * as supported roam band mask
10024*5113495bSYour Name 		 */
10025*5113495bSYour Name 		if (((wma_handle->bandcapability == BAND_2G) ||
10026*5113495bSYour Name 		    (msg->band_mask == BIT(REG_BAND_2G))) &&
10027*5113495bSYour Name 		    !WLAN_REG_IS_24GHZ_CH_FREQ(
10028*5113495bSYour Name 		    msg->chan_weights.saved_chan_list[i])) {
10029*5113495bSYour Name 			msg->chan_weights.weighed_valid_list[i] =
10030*5113495bSYour Name 				WEIGHT_OF_DISALLOWED_CHANNELS;
10031*5113495bSYour Name 			continue;
10032*5113495bSYour Name 		}
10033*5113495bSYour Name 
10034*5113495bSYour Name 		/*
10035*5113495bSYour Name 		 * Dont allow roaming on 2G/6G band if only 5G band configured
10036*5113495bSYour Name 		 * as supported roam band mask
10037*5113495bSYour Name 		 */
10038*5113495bSYour Name 		if (((wma_handle->bandcapability == BAND_5G) ||
10039*5113495bSYour Name 		    (msg->band_mask == BIT(REG_BAND_5G))) &&
10040*5113495bSYour Name 		    !WLAN_REG_IS_5GHZ_CH_FREQ(
10041*5113495bSYour Name 		    msg->chan_weights.saved_chan_list[i])) {
10042*5113495bSYour Name 			msg->chan_weights.weighed_valid_list[i] =
10043*5113495bSYour Name 				WEIGHT_OF_DISALLOWED_CHANNELS;
10044*5113495bSYour Name 			continue;
10045*5113495bSYour Name 		}
10046*5113495bSYour Name 
10047*5113495bSYour Name 		/*
10048*5113495bSYour Name 		 * Dont allow roaming on 2G/5G band if only 6G band configured
10049*5113495bSYour Name 		 * as supported roam band mask
10050*5113495bSYour Name 		 */
10051*5113495bSYour Name 		if (msg->band_mask == BIT(REG_BAND_6G) &&
10052*5113495bSYour Name 		    !WLAN_REG_IS_6GHZ_CHAN_FREQ(
10053*5113495bSYour Name 		    msg->chan_weights.saved_chan_list[i])) {
10054*5113495bSYour Name 			msg->chan_weights.weighed_valid_list[i] =
10055*5113495bSYour Name 				WEIGHT_OF_DISALLOWED_CHANNELS;
10056*5113495bSYour Name 			continue;
10057*5113495bSYour Name 		}
10058*5113495bSYour Name 
10059*5113495bSYour Name 		/*
10060*5113495bSYour Name 		 * Dont allow roaming on 6G band if only 2G + 5G band configured
10061*5113495bSYour Name 		 * as supported roam band mask.
10062*5113495bSYour Name 		 */
10063*5113495bSYour Name 		if (msg->band_mask == (BIT(REG_BAND_2G) | BIT(REG_BAND_5G)) &&
10064*5113495bSYour Name 		    (WLAN_REG_IS_6GHZ_CHAN_FREQ(
10065*5113495bSYour Name 		    msg->chan_weights.saved_chan_list[i]))) {
10066*5113495bSYour Name 			msg->chan_weights.weighed_valid_list[i] =
10067*5113495bSYour Name 				WEIGHT_OF_DISALLOWED_CHANNELS;
10068*5113495bSYour Name 			continue;
10069*5113495bSYour Name 		}
10070*5113495bSYour Name 
10071*5113495bSYour Name 		/*
10072*5113495bSYour Name 		 * Dont allow roaming on 2G band if only 5G + 6G band configured
10073*5113495bSYour Name 		 * as supported roam band mask.
10074*5113495bSYour Name 		 */
10075*5113495bSYour Name 		if (msg->band_mask == (BIT(REG_BAND_5G) | BIT(REG_BAND_6G)) &&
10076*5113495bSYour Name 		    (WLAN_REG_IS_24GHZ_CH_FREQ(
10077*5113495bSYour Name 		    msg->chan_weights.saved_chan_list[i]))) {
10078*5113495bSYour Name 			msg->chan_weights.weighed_valid_list[i] =
10079*5113495bSYour Name 				WEIGHT_OF_DISALLOWED_CHANNELS;
10080*5113495bSYour Name 			continue;
10081*5113495bSYour Name 		}
10082*5113495bSYour Name 
10083*5113495bSYour Name 		/*
10084*5113495bSYour Name 		 * Dont allow roaming on 5G band if only 2G + 6G band configured
10085*5113495bSYour Name 		 * as supported roam band mask.
10086*5113495bSYour Name 		 */
10087*5113495bSYour Name 		if (msg->band_mask == (BIT(REG_BAND_2G) | BIT(REG_BAND_6G)) &&
10088*5113495bSYour Name 		    (WLAN_REG_IS_5GHZ_CH_FREQ(
10089*5113495bSYour Name 		    msg->chan_weights.saved_chan_list[i]))) {
10090*5113495bSYour Name 			msg->chan_weights.weighed_valid_list[i] =
10091*5113495bSYour Name 				WEIGHT_OF_DISALLOWED_CHANNELS;
10092*5113495bSYour Name 			continue;
10093*5113495bSYour Name 		}
10094*5113495bSYour Name 	}
10095*5113495bSYour Name 
10096*5113495bSYour Name 	wma_debug("RSO_CFG: Dump PDEV PCL weights for vdev[%d]", msg->vdev_id);
10097*5113495bSYour Name 	policy_mgr_dump_channel_list(msg->chan_weights.saved_num_chan,
10098*5113495bSYour Name 				     msg->chan_weights.saved_chan_list,
10099*5113495bSYour Name 				     msg->chan_weights.weighed_valid_list);
10100*5113495bSYour Name 
10101*5113495bSYour Name 	if (wmi_unified_pdev_set_pcl_cmd(wma_handle->wmi_handle,
10102*5113495bSYour Name 					 &msg->chan_weights))
10103*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
10104*5113495bSYour Name 
10105*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
10106*5113495bSYour Name }
10107*5113495bSYour Name 
10108*5113495bSYour Name /**
10109*5113495bSYour Name  * wma_send_pdev_set_hw_mode_cmd() - Send WMI_PDEV_SET_HW_MODE_CMDID to FW
10110*5113495bSYour Name  * @wma_handle: WMA handle
10111*5113495bSYour Name  * @msg: Structure containing the following parameters
10112*5113495bSYour Name  *
10113*5113495bSYour Name  * - hw_mode_index: The HW_Mode field is a enumerated type that is selected
10114*5113495bSYour Name  * from the HW_Mode table, which is returned in the WMI_SERVICE_READY_EVENTID.
10115*5113495bSYour Name  *
10116*5113495bSYour Name  * Provides notification to the WLAN firmware that host driver is requesting a
10117*5113495bSYour Name  * HardWare (HW) Mode change. This command is needed to support iHelium in the
10118*5113495bSYour Name  * configurations that include the Dual Band Simultaneous (DBS) feature.
10119*5113495bSYour Name  *
10120*5113495bSYour Name  * Return: Success if the cmd is sent successfully to the firmware
10121*5113495bSYour Name  */
wma_send_pdev_set_hw_mode_cmd(tp_wma_handle wma_handle,struct policy_mgr_hw_mode * msg)10122*5113495bSYour Name QDF_STATUS wma_send_pdev_set_hw_mode_cmd(tp_wma_handle wma_handle,
10123*5113495bSYour Name 					 struct policy_mgr_hw_mode *msg)
10124*5113495bSYour Name {
10125*5113495bSYour Name 	struct sir_set_hw_mode_resp *param;
10126*5113495bSYour Name 	struct wma_target_req *timeout_msg;
10127*5113495bSYour Name 
10128*5113495bSYour Name 	if (wma_validate_handle(wma_handle)) {
10129*5113495bSYour Name 		/* Handle is NULL. Will not be able to send failure
10130*5113495bSYour Name 		 * response as well
10131*5113495bSYour Name 		 */
10132*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
10133*5113495bSYour Name 	}
10134*5113495bSYour Name 
10135*5113495bSYour Name 	if (!msg) {
10136*5113495bSYour Name 		wma_err("Set HW mode param is NULL");
10137*5113495bSYour Name 		/* Lets try to free the active command list */
10138*5113495bSYour Name 		goto fail;
10139*5113495bSYour Name 	}
10140*5113495bSYour Name 
10141*5113495bSYour Name 	wma_acquire_wakelock(&wma_handle->wmi_cmd_rsp_wake_lock,
10142*5113495bSYour Name 			     WMA_VDEV_HW_MODE_REQUEST_TIMEOUT);
10143*5113495bSYour Name 	if (wmi_unified_soc_set_hw_mode_cmd(wma_handle->wmi_handle,
10144*5113495bSYour Name 					    msg->hw_mode_index)) {
10145*5113495bSYour Name 		wma_release_wakelock(&wma_handle->wmi_cmd_rsp_wake_lock);
10146*5113495bSYour Name 		goto fail;
10147*5113495bSYour Name 	}
10148*5113495bSYour Name 	timeout_msg = wma_fill_hold_req(wma_handle, 0,
10149*5113495bSYour Name 			SIR_HAL_PDEV_SET_HW_MODE,
10150*5113495bSYour Name 			WMA_PDEV_SET_HW_MODE_RESP, NULL,
10151*5113495bSYour Name 			WMA_VDEV_HW_MODE_REQUEST_TIMEOUT - 1);
10152*5113495bSYour Name 	if (!timeout_msg) {
10153*5113495bSYour Name 		wma_err("Failed to allocate request for SIR_HAL_PDEV_SET_HW_MODE");
10154*5113495bSYour Name 		wma_remove_req(wma_handle, 0, WMA_PDEV_SET_HW_MODE_RESP);
10155*5113495bSYour Name 	}
10156*5113495bSYour Name 
10157*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
10158*5113495bSYour Name fail:
10159*5113495bSYour Name 	param = qdf_mem_malloc(sizeof(*param));
10160*5113495bSYour Name 	if (!param)
10161*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
10162*5113495bSYour Name 
10163*5113495bSYour Name 	param->status = SET_HW_MODE_STATUS_ECANCELED;
10164*5113495bSYour Name 	param->cfgd_hw_mode_index = 0;
10165*5113495bSYour Name 	param->num_vdev_mac_entries = 0;
10166*5113495bSYour Name 	wma_debug("Sending HW mode fail response to LIM");
10167*5113495bSYour Name 	wma_send_msg(wma_handle, SIR_HAL_PDEV_SET_HW_MODE_RESP,
10168*5113495bSYour Name 			(void *) param, 0);
10169*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
10170*5113495bSYour Name }
10171*5113495bSYour Name 
10172*5113495bSYour Name /**
10173*5113495bSYour Name  * wma_send_pdev_set_dual_mac_config() - Set dual mac config to FW
10174*5113495bSYour Name  * @wma_handle: WMA handle
10175*5113495bSYour Name  * @msg: Dual MAC config parameters
10176*5113495bSYour Name  *
10177*5113495bSYour Name  * Configures WLAN firmware with the dual MAC features
10178*5113495bSYour Name  *
10179*5113495bSYour Name  * Return: QDF_STATUS. 0 on success.
10180*5113495bSYour Name  */
wma_send_pdev_set_dual_mac_config(tp_wma_handle wma_handle,struct policy_mgr_dual_mac_config * msg)10181*5113495bSYour Name QDF_STATUS wma_send_pdev_set_dual_mac_config(tp_wma_handle wma_handle,
10182*5113495bSYour Name 		struct policy_mgr_dual_mac_config *msg)
10183*5113495bSYour Name {
10184*5113495bSYour Name 	QDF_STATUS status;
10185*5113495bSYour Name 	struct wma_target_req *req_msg;
10186*5113495bSYour Name 	struct sir_dual_mac_config_resp *resp;
10187*5113495bSYour Name 
10188*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
10189*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
10190*5113495bSYour Name 
10191*5113495bSYour Name 	if (!msg) {
10192*5113495bSYour Name 		wma_err("Set dual mode config is NULL");
10193*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
10194*5113495bSYour Name 	}
10195*5113495bSYour Name 
10196*5113495bSYour Name 	req_msg = wma_fill_hold_req(wma_handle, 0,
10197*5113495bSYour Name 				    SIR_HAL_PDEV_DUAL_MAC_CFG_REQ,
10198*5113495bSYour Name 				    WMA_PDEV_MAC_CFG_RESP, NULL,
10199*5113495bSYour Name 				    WMA_VDEV_DUAL_MAC_CFG_TIMEOUT);
10200*5113495bSYour Name 	if (!req_msg) {
10201*5113495bSYour Name 		wma_err("Failed to allocate request for SIR_HAL_PDEV_DUAL_MAC_CFG_REQ");
10202*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
10203*5113495bSYour Name 	}
10204*5113495bSYour Name 
10205*5113495bSYour Name 	/*
10206*5113495bSYour Name 	 * acquire the wake lock here and release it in response handler function
10207*5113495bSYour Name 	 * In error condition, release the wake lock right away
10208*5113495bSYour Name 	 */
10209*5113495bSYour Name 	wma_acquire_wakelock(&wma_handle->wmi_cmd_rsp_wake_lock,
10210*5113495bSYour Name 			     WMA_VDEV_PLCY_MGR_WAKE_LOCK_TIMEOUT);
10211*5113495bSYour Name 	status = wmi_unified_pdev_set_dual_mac_config_cmd(
10212*5113495bSYour Name 				wma_handle->wmi_handle,
10213*5113495bSYour Name 				(struct policy_mgr_dual_mac_config *)msg);
10214*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
10215*5113495bSYour Name 		wma_err("Failed to send WMI_PDEV_SET_DUAL_MAC_CONFIG_CMDID: %d",
10216*5113495bSYour Name 			status);
10217*5113495bSYour Name 		wma_release_wakelock(&wma_handle->wmi_cmd_rsp_wake_lock);
10218*5113495bSYour Name 		wma_remove_req(wma_handle, 0, WMA_PDEV_MAC_CFG_RESP);
10219*5113495bSYour Name 		goto fail;
10220*5113495bSYour Name 	}
10221*5113495bSYour Name 	policy_mgr_update_dbs_req_config(wma_handle->psoc,
10222*5113495bSYour Name 	msg->scan_config, msg->fw_mode_config);
10223*5113495bSYour Name 
10224*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
10225*5113495bSYour Name 
10226*5113495bSYour Name fail:
10227*5113495bSYour Name 	resp = qdf_mem_malloc(sizeof(*resp));
10228*5113495bSYour Name 	if (!resp)
10229*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
10230*5113495bSYour Name 
10231*5113495bSYour Name 	resp->status = SET_HW_MODE_STATUS_ECANCELED;
10232*5113495bSYour Name 	wma_debug("Sending failure response to LIM");
10233*5113495bSYour Name 	wma_send_msg(wma_handle, SIR_HAL_PDEV_MAC_CFG_RESP, (void *) resp, 0);
10234*5113495bSYour Name 
10235*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
10236*5113495bSYour Name }
10237*5113495bSYour Name 
10238*5113495bSYour Name /**
10239*5113495bSYour Name  * wma_send_pdev_set_antenna_mode() - Set antenna mode to FW
10240*5113495bSYour Name  * @wma_handle: WMA handle
10241*5113495bSYour Name  * @msg: Antenna mode parameters
10242*5113495bSYour Name  *
10243*5113495bSYour Name  * Send WMI_PDEV_SET_ANTENNA_MODE_CMDID to FW requesting to
10244*5113495bSYour Name  * modify the number of TX/RX chains from host
10245*5113495bSYour Name  *
10246*5113495bSYour Name  * Return: QDF_STATUS. 0 on success.
10247*5113495bSYour Name  */
wma_send_pdev_set_antenna_mode(tp_wma_handle wma_handle,struct sir_antenna_mode_param * msg)10248*5113495bSYour Name QDF_STATUS wma_send_pdev_set_antenna_mode(tp_wma_handle wma_handle,
10249*5113495bSYour Name 		struct sir_antenna_mode_param *msg)
10250*5113495bSYour Name {
10251*5113495bSYour Name 	wmi_pdev_set_antenna_mode_cmd_fixed_param *cmd;
10252*5113495bSYour Name 	wmi_buf_t buf;
10253*5113495bSYour Name 	uint32_t len;
10254*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
10255*5113495bSYour Name 	struct sir_antenna_mode_resp *param;
10256*5113495bSYour Name 
10257*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
10258*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
10259*5113495bSYour Name 
10260*5113495bSYour Name 	if (!msg) {
10261*5113495bSYour Name 		wma_err("Set antenna mode param is NULL");
10262*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
10263*5113495bSYour Name 	}
10264*5113495bSYour Name 
10265*5113495bSYour Name 	len = sizeof(*cmd);
10266*5113495bSYour Name 
10267*5113495bSYour Name 	buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
10268*5113495bSYour Name 	if (!buf) {
10269*5113495bSYour Name 		status = QDF_STATUS_E_NOMEM;
10270*5113495bSYour Name 		goto resp;
10271*5113495bSYour Name 	}
10272*5113495bSYour Name 
10273*5113495bSYour Name 	cmd = (wmi_pdev_set_antenna_mode_cmd_fixed_param *) wmi_buf_data(buf);
10274*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
10275*5113495bSYour Name 		WMITLV_TAG_STRUC_wmi_pdev_set_antenna_mode_cmd_fixed_param,
10276*5113495bSYour Name 		WMITLV_GET_STRUCT_TLVLEN(
10277*5113495bSYour Name 			wmi_pdev_set_antenna_mode_cmd_fixed_param));
10278*5113495bSYour Name 
10279*5113495bSYour Name 	cmd->pdev_id = OL_TXRX_PDEV_ID;
10280*5113495bSYour Name 	/* Bits 0-15 is num of RX chains 16-31 is num of TX chains */
10281*5113495bSYour Name 	cmd->num_txrx_chains = msg->num_rx_chains;
10282*5113495bSYour Name 	cmd->num_txrx_chains |= (msg->num_tx_chains << 16);
10283*5113495bSYour Name 
10284*5113495bSYour Name 	wma_debug("Num of chains TX: %d RX: %d txrx_chains: 0x%x",
10285*5113495bSYour Name 		 msg->num_tx_chains,
10286*5113495bSYour Name 		 msg->num_rx_chains, cmd->num_txrx_chains);
10287*5113495bSYour Name 
10288*5113495bSYour Name 	if (wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
10289*5113495bSYour Name 				 WMI_PDEV_SET_ANTENNA_MODE_CMDID)) {
10290*5113495bSYour Name 		wmi_buf_free(buf);
10291*5113495bSYour Name 		status = QDF_STATUS_E_FAILURE;
10292*5113495bSYour Name 		goto resp;
10293*5113495bSYour Name 	}
10294*5113495bSYour Name 	status = QDF_STATUS_SUCCESS;
10295*5113495bSYour Name 
10296*5113495bSYour Name resp:
10297*5113495bSYour Name 	param = qdf_mem_malloc(sizeof(*param));
10298*5113495bSYour Name 	if (!param)
10299*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
10300*5113495bSYour Name 
10301*5113495bSYour Name 	param->status = (status) ?
10302*5113495bSYour Name 		SET_ANTENNA_MODE_STATUS_ECANCELED :
10303*5113495bSYour Name 		SET_ANTENNA_MODE_STATUS_OK;
10304*5113495bSYour Name 	wma_debug("Send antenna mode resp to LIM status: %d",
10305*5113495bSYour Name 		  param->status);
10306*5113495bSYour Name 	wma_send_msg(wma_handle, SIR_HAL_SOC_ANTENNA_MODE_RESP,
10307*5113495bSYour Name 			(void *) param, 0);
10308*5113495bSYour Name 	return status;
10309*5113495bSYour Name }
10310*5113495bSYour Name 
10311*5113495bSYour Name /**
10312*5113495bSYour Name  * wma_crash_inject() - sends command to FW to simulate crash
10313*5113495bSYour Name  * @wma_handle:         pointer of WMA context
10314*5113495bSYour Name  * @type:               subtype of the command
10315*5113495bSYour Name  * @delay_time_ms:      time in milliseconds for FW to delay the crash
10316*5113495bSYour Name  *
10317*5113495bSYour Name  * This function will send a command to FW in order to simulate different
10318*5113495bSYour Name  * kinds of FW crashes.
10319*5113495bSYour Name  *
10320*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS for success or error code
10321*5113495bSYour Name  */
wma_crash_inject(WMA_HANDLE wma_handle,uint32_t type,uint32_t delay_time_ms)10322*5113495bSYour Name QDF_STATUS wma_crash_inject(WMA_HANDLE wma_handle, uint32_t type,
10323*5113495bSYour Name 			    uint32_t delay_time_ms)
10324*5113495bSYour Name {
10325*5113495bSYour Name 	struct crash_inject param;
10326*5113495bSYour Name 	tp_wma_handle wma = (tp_wma_handle)wma_handle;
10327*5113495bSYour Name 
10328*5113495bSYour Name 	param.type = type;
10329*5113495bSYour Name 	param.delay_time_ms = delay_time_ms;
10330*5113495bSYour Name 	return wmi_crash_inject(wma->wmi_handle, &param);
10331*5113495bSYour Name }
10332*5113495bSYour Name 
wma_configure_smps_params(uint32_t vdev_id,uint32_t param_id,uint32_t param_val)10333*5113495bSYour Name QDF_STATUS wma_configure_smps_params(uint32_t vdev_id, uint32_t param_id,
10334*5113495bSYour Name 							uint32_t param_val)
10335*5113495bSYour Name {
10336*5113495bSYour Name 	tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
10337*5113495bSYour Name 	int smps_cmd_value;
10338*5113495bSYour Name 	int status = QDF_STATUS_E_INVAL;
10339*5113495bSYour Name 
10340*5113495bSYour Name 	if (!wma)
10341*5113495bSYour Name 		return status;
10342*5113495bSYour Name 
10343*5113495bSYour Name 	smps_cmd_value = param_id << WMI_SMPS_PARAM_VALUE_S;
10344*5113495bSYour Name 	smps_cmd_value = smps_cmd_value | param_val;
10345*5113495bSYour Name 
10346*5113495bSYour Name 	status = wma_set_smps_params(wma, vdev_id, smps_cmd_value);
10347*5113495bSYour Name 	if (status)
10348*5113495bSYour Name 		wma_err("Failed to set SMPS Param");
10349*5113495bSYour Name 
10350*5113495bSYour Name 	return status;
10351*5113495bSYour Name }
10352*5113495bSYour Name 
10353*5113495bSYour Name 
10354*5113495bSYour Name /**
10355*5113495bSYour Name  * wma_config_bmiss_bcnt_params() - set bmiss config parameters
10356*5113495bSYour Name  * @vdev_id: virtual device for the command
10357*5113495bSYour Name  * @first_cnt: bmiss first value
10358*5113495bSYour Name  * @final_cnt: bmiss final value
10359*5113495bSYour Name  *
10360*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS or non-zero on failure
10361*5113495bSYour Name  */
wma_config_bmiss_bcnt_params(uint32_t vdev_id,uint32_t first_cnt,uint32_t final_cnt)10362*5113495bSYour Name QDF_STATUS wma_config_bmiss_bcnt_params(uint32_t vdev_id, uint32_t first_cnt,
10363*5113495bSYour Name 		uint32_t final_cnt)
10364*5113495bSYour Name {
10365*5113495bSYour Name 	tp_wma_handle wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
10366*5113495bSYour Name 	int status = QDF_STATUS_E_INVAL;
10367*5113495bSYour Name 
10368*5113495bSYour Name 	if (!wma_handle)
10369*5113495bSYour Name 		return status;
10370*5113495bSYour Name 
10371*5113495bSYour Name 	status = wma_roam_scan_bmiss_cnt(wma_handle, first_cnt, final_cnt,
10372*5113495bSYour Name 			vdev_id);
10373*5113495bSYour Name 
10374*5113495bSYour Name 	if (status)
10375*5113495bSYour Name 		wma_err("Failed to set Bmiss Param");
10376*5113495bSYour Name 
10377*5113495bSYour Name 	return status;
10378*5113495bSYour Name }
10379*5113495bSYour Name 
wma_get_rx_chainmask(uint8_t pdev_id,uint32_t * chainmask_2g,uint32_t * chainmask_5g)10380*5113495bSYour Name QDF_STATUS wma_get_rx_chainmask(uint8_t pdev_id, uint32_t *chainmask_2g,
10381*5113495bSYour Name 				uint32_t *chainmask_5g)
10382*5113495bSYour Name {
10383*5113495bSYour Name 	struct wlan_psoc_host_mac_phy_caps *mac_phy_cap;
10384*5113495bSYour Name 	uint8_t total_mac_phy_cnt, idx;
10385*5113495bSYour Name 	struct target_psoc_info *tgt_hdl;
10386*5113495bSYour Name 	uint32_t hw_mode_idx = 0, num_hw_modes = 0;
10387*5113495bSYour Name 
10388*5113495bSYour Name 	tp_wma_handle wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
10389*5113495bSYour Name 	if (!wma_handle)
10390*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
10391*5113495bSYour Name 
10392*5113495bSYour Name 	tgt_hdl = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
10393*5113495bSYour Name 	if (!tgt_hdl) {
10394*5113495bSYour Name 		wma_err("target psoc info is NULL");
10395*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
10396*5113495bSYour Name 	}
10397*5113495bSYour Name 
10398*5113495bSYour Name 	total_mac_phy_cnt = target_psoc_get_total_mac_phy_cnt(tgt_hdl);
10399*5113495bSYour Name 	num_hw_modes = target_psoc_get_num_hw_modes(tgt_hdl);
10400*5113495bSYour Name 	if (total_mac_phy_cnt <= pdev_id) {
10401*5113495bSYour Name 		wma_err("mac phy cnt %d, pdev id %d",
10402*5113495bSYour Name 			total_mac_phy_cnt, pdev_id);
10403*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
10404*5113495bSYour Name 	}
10405*5113495bSYour Name 
10406*5113495bSYour Name 	if ((wma_handle->new_hw_mode_index != WMA_DEFAULT_HW_MODE_INDEX) &&
10407*5113495bSYour Name 	    (wma_handle->new_hw_mode_index <= num_hw_modes))
10408*5113495bSYour Name 		hw_mode_idx = wma_handle->new_hw_mode_index;
10409*5113495bSYour Name 	mac_phy_cap = target_psoc_get_mac_phy_cap(tgt_hdl);
10410*5113495bSYour Name 	if (!mac_phy_cap) {
10411*5113495bSYour Name 		wma_err("Invalid MAC PHY capabilities handle");
10412*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
10413*5113495bSYour Name 	}
10414*5113495bSYour Name 	for (idx = 0; idx < total_mac_phy_cnt; idx++) {
10415*5113495bSYour Name 		if (mac_phy_cap[idx].hw_mode_id != hw_mode_idx)
10416*5113495bSYour Name 			continue;
10417*5113495bSYour Name 		if (mac_phy_cap[idx].supported_bands & WLAN_2G_CAPABILITY)
10418*5113495bSYour Name 			*chainmask_2g = mac_phy_cap[idx].rx_chain_mask_2G;
10419*5113495bSYour Name 		if (mac_phy_cap[idx].supported_bands & WLAN_5G_CAPABILITY)
10420*5113495bSYour Name 			*chainmask_5g = mac_phy_cap[idx].rx_chain_mask_5G;
10421*5113495bSYour Name 	}
10422*5113495bSYour Name 	wma_debug("pdev id: %d, hw_mode_idx: %d, rx chainmask 2g:%d, 5g:%d",
10423*5113495bSYour Name 		 pdev_id, hw_mode_idx, *chainmask_2g, *chainmask_5g);
10424*5113495bSYour Name 
10425*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
10426*5113495bSYour Name }
10427*5113495bSYour Name 
10428*5113495bSYour Name #ifdef FEATURE_ANI_LEVEL_REQUEST
wma_send_ani_level_request(tp_wma_handle wma_handle,uint32_t * freqs,uint8_t num_freqs)10429*5113495bSYour Name QDF_STATUS wma_send_ani_level_request(tp_wma_handle wma_handle,
10430*5113495bSYour Name 				      uint32_t *freqs, uint8_t num_freqs)
10431*5113495bSYour Name {
10432*5113495bSYour Name 	return wmi_unified_ani_level_cmd_send(wma_handle->wmi_handle, freqs,
10433*5113495bSYour Name 					      num_freqs);
10434*5113495bSYour Name }
10435*5113495bSYour Name #endif
10436