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, ¶m);
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