blob: aa8dc0de1a5f6eae40cafc28af0b690fdd5a5acd [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05302 * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003 *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004 * Permission to use, copy, modify, and/or distribute this software for
5 * any purpose with or without fee is hereby granted, provided that the
6 * above copyright notice and this permission notice appear in all
7 * copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16 * PERFORMANCE OF THIS SOFTWARE.
17 */
18
19/*
Jeff Johnson360135b2018-07-18 20:51:47 -070020 * DOC: sme_api.c
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053021 *
22 * Definitions for SME APIs
23 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080024
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053025/* Include Files */
Srinivas Girigowda2c263352017-03-17 17:49:53 -070026#include <sir_common.h>
27#include <ani_global.h>
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080028#include "sme_api.h"
29#include "csr_inside_api.h"
30#include "sme_inside.h"
31#include "csr_internal.h"
32#include "wma_types.h"
33#include "wma_if.h"
gaurank kathpalia748c7272018-10-24 22:05:15 +053034#include "wma.h"
Jeff Johnson6136fb92017-03-30 15:21:49 -070035#include "wma_fips_api.h"
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053036#include "qdf_trace.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080037#include "sme_trace.h"
Anurag Chouhan6d760662016-02-20 16:05:43 +053038#include "qdf_types.h"
gaurank kathpalia78af1932018-10-27 20:33:10 +053039#include "qdf_util.h"
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053040#include "qdf_trace.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080041#include "cds_utils.h"
42#include "sap_api.h"
43#include "mac_trace.h"
44#ifdef WLAN_FEATURE_NAN
45#include "nan_api.h"
46#endif
Naveen Rawat3b6068c2016-04-14 19:01:06 -070047#include "cds_regdomain.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080048#include "cfg_api.h"
49#include "sme_power_save_api.h"
50#include "wma.h"
Naveen Rawatb4d37622015-11-13 16:15:25 -080051#include "sch_api.h"
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070052#include "sme_nan_datapath.h"
Agrawal Ashish21ba2572016-09-03 16:40:10 +053053#include "csr_api.h"
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070054#include "wlan_reg_services_api.h"
Abhishek Singh158fe252017-03-23 11:09:34 +053055#include <wlan_scan_ucfg_api.h>
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070056#include "wlan_reg_ucfg_api.h"
Arif Hussainee677012017-01-26 17:50:13 -080057#include "ol_txrx.h"
Naveen Rawatd2657be2017-10-10 14:31:23 -070058#include "wifi_pos_api.h"
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053059#include "net/cfg80211.h"
60#include <qca_vendor.h>
Sandeep Puligilla063a4342018-01-10 02:50:14 -080061#include <wlan_spectral_utils_api.h>
Vignesh Viswanathan21c58cb2018-05-24 15:53:58 +053062#include "wlan_mlme_public_struct.h"
gaurank kathpalia24ed0f42018-11-13 15:37:49 +053063#include "wlan_mlme_main.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080064
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080065static tSelfRecoveryStats g_self_recovery_stats;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080066
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053067static QDF_STATUS init_sme_cmd_list(tpAniSirGlobal pMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080068
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053069static void sme_disconnect_connected_sessions(tpAniSirGlobal pMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080070
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053071static QDF_STATUS sme_handle_generic_change_country_code(tpAniSirGlobal pMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080072 void *pMsgBuf);
73
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053074static QDF_STATUS sme_process_nss_update_resp(tpAniSirGlobal mac, uint8_t *msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080075
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080076/* Channel Change Response Indication Handler */
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053077static QDF_STATUS sme_process_channel_change_resp(tpAniSirGlobal pMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080078 uint16_t msg_type, void *pMsgBuf);
79
Jeff Johnsonfdecd512018-06-10 09:18:32 -070080static QDF_STATUS sme_stats_ext_event(tpAniSirGlobal mac,
Jeff Johnson45843652018-07-04 12:47:34 -070081 struct stats_ext_event *msg);
Jeff Johnsonfdecd512018-06-10 09:18:32 -070082
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080083/* Internal SME APIs */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053084QDF_STATUS sme_acquire_global_lock(tSmeStruct *psSme)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080085{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053086 QDF_STATUS status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080087
88 if (psSme) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053089 if (QDF_IS_STATUS_SUCCESS
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053090 (qdf_mutex_acquire(&psSme->lkSmeGlobalLock)))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053091 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080092 }
93
94 return status;
95}
96
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053097QDF_STATUS sme_release_global_lock(tSmeStruct *psSme)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080098{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053099 QDF_STATUS status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800100
101 if (psSme) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530102 if (QDF_IS_STATUS_SUCCESS
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530103 (qdf_mutex_release(&psSme->lkSmeGlobalLock)))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530104 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800105 }
106
107 return status;
108}
109
Tushnim Bhattacharyya518e80f2017-08-30 17:35:33 -0700110tpAniSirGlobal sme_get_mac_context(void)
Archana Ramachandran2eb7a612017-03-23 22:58:42 -0700111{
112 tpAniSirGlobal mac_ctx;
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800113 mac_handle_t mac_handle;
Archana Ramachandran2eb7a612017-03-23 22:58:42 -0700114
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800115 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
116 if (NULL == mac_handle) {
Archana Ramachandran2eb7a612017-03-23 22:58:42 -0700117 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800118 FL("invalid mac_handle"));
Archana Ramachandran2eb7a612017-03-23 22:58:42 -0700119 return NULL;
120 }
121
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800122 mac_ctx = PMAC_STRUCT(mac_handle);
Archana Ramachandran2eb7a612017-03-23 22:58:42 -0700123
124 return mac_ctx;
125}
126
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800127/**
128 * sme_process_set_hw_mode_resp() - Process set HW mode response
129 * @mac: Global MAC pointer
130 * @msg: HW mode response
131 *
132 * Processes the HW mode response and invokes the HDD callback
133 * to process further
134 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530135static QDF_STATUS sme_process_set_hw_mode_resp(tpAniSirGlobal mac, uint8_t *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800136{
Krunal Sonia8270f52017-02-23 19:51:25 -0800137 tListElem *entry;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800138 tSmeCmd *command = NULL;
139 bool found;
Tushnim Bhattacharyyaeab33dd2017-11-15 15:20:02 -0800140 policy_mgr_pdev_set_hw_mode_cback callback = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800141 struct sir_set_hw_mode_resp *param;
Tushnim Bhattacharyya3b99f4b2018-03-26 14:19:24 -0700142 enum policy_mgr_conn_update_reason reason;
gaurank kathpalia14e2f912017-08-31 14:51:45 +0530143 struct csr_roam_session *session;
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800144 uint32_t session_id;
Sandeep Puligilla344d7252017-09-15 16:23:33 -0700145
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800146 param = (struct sir_set_hw_mode_resp *)msg;
147 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700148 sme_err("HW mode resp param is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800149 /* Not returning. Need to check if active command list
150 * needs to be freed
151 */
152 }
153
Krunal Sonia8270f52017-02-23 19:51:25 -0800154 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800155 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700156 sme_err("No cmd found in active list");
Tushnim Bhattacharyya4a03db82017-11-10 17:58:28 -0800157 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800158 }
159
160 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
161 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700162 sme_err("Base address is NULL");
Tushnim Bhattacharyya4a03db82017-11-10 17:58:28 -0800163 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800164 }
165
166 if (e_sme_command_set_hw_mode != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700167 sme_err("Command mismatch!");
Tushnim Bhattacharyya4a03db82017-11-10 17:58:28 -0800168 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800169 }
170
171 callback = command->u.set_hw_mode_cmd.set_hw_mode_cb;
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +0530172 reason = command->u.set_hw_mode_cmd.reason;
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800173 session_id = command->u.set_hw_mode_cmd.session_id;
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +0530174
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700175 sme_debug("reason: %d session: %d",
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +0530176 command->u.set_hw_mode_cmd.reason,
177 command->u.set_hw_mode_cmd.session_id);
178
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700179 if (!callback) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700180 sme_err("Callback does not exist");
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700181 goto end;
182 }
183
184 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700185 sme_err("Callback failed since HW mode params is NULL");
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700186 goto end;
187 }
188
189 /* Irrespective of the reason for which the hw mode change request
190 * was issued, the policy manager connection table needs to be updated
191 * with the new vdev-mac id mapping, tx/rx spatial streams etc., if the
192 * set hw mode was successful.
193 */
194 callback(param->status,
195 param->cfgd_hw_mode_index,
196 param->num_vdev_mac_entries,
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -0800197 param->vdev_mac_map,
Tushnim Bhattacharyyaeab33dd2017-11-15 15:20:02 -0800198 command->u.set_hw_mode_cmd.next_action,
199 command->u.set_hw_mode_cmd.reason,
200 command->u.set_hw_mode_cmd.session_id,
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -0800201 command->u.set_hw_mode_cmd.context);
Krunal Soni3fa80e22018-01-09 14:16:02 -0800202 if (!CSR_IS_SESSION_VALID(mac, session_id)) {
203 sme_err("session %d is invalid", session_id);
204 goto end;
205 }
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800206 session = CSR_GET_SESSION(mac, session_id);
Tushnim Bhattacharyya3b99f4b2018-03-26 14:19:24 -0700207 if (reason == POLICY_MGR_UPDATE_REASON_HIDDEN_STA) {
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700208 /* In the case of hidden SSID, connection update
209 * (set hw mode) is done after the scan with reason
210 * code eCsrScanForSsid completes. The connect/failure
211 * needs to be handled after the response of set hw
212 * mode
213 */
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800214 if (param->status == SET_HW_MODE_STATUS_OK) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700215 sme_debug("search for ssid success");
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800216 csr_scan_handle_search_for_ssid(mac,
217 session_id);
218 } else {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700219 sme_debug("search for ssid failure");
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800220 csr_scan_handle_search_for_ssid_failure(mac,
221 session_id);
222 }
Deepak Dhamdhere6f7fbbe2017-02-28 13:35:52 -0800223 csr_saved_scan_cmd_free_fields(mac, session);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800224 }
225
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +0530226end:
Krunal Soni72dba662017-02-15 20:13:17 -0800227 found = csr_nonscan_active_ll_remove_entry(mac, entry,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800228 LL_ACCESS_LOCK);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530229 if (found)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800230 /* Now put this command back on the avilable command list */
Krunal Soni78618d92017-02-14 21:46:31 -0800231 csr_release_command(mac, command);
Krunal Sonia8270f52017-02-23 19:51:25 -0800232
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530233 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800234}
235
236/**
237 * sme_process_hw_mode_trans_ind() - Process HW mode transition indication
238 * @mac: Global MAC pointer
239 * @msg: HW mode transition response
240 *
241 * Processes the HW mode transition indication and invoke the HDD callback
242 * to process further
243 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530244static QDF_STATUS sme_process_hw_mode_trans_ind(tpAniSirGlobal mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800245 uint8_t *msg)
246{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800247 struct sir_hw_mode_trans_ind *param;
248
249 param = (struct sir_hw_mode_trans_ind *)msg;
250 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700251 sme_err("HW mode trans ind param is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530252 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800253 }
254
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -0800255 policy_mgr_hw_mode_transition_cb(param->old_hw_mode_index,
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -0800256 param->new_hw_mode_index,
257 param->num_vdev_mac_entries,
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -0800258 param->vdev_mac_map, mac->psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800259
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530260 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800261}
262
Naveen Rawate7d86052015-11-13 12:01:43 -0800263/**
264 * free_sme_cmds() - This function frees memory allocated for SME commands
265 * @mac_ctx: Pointer to Global MAC structure
266 *
267 * This function frees memory allocated for SME commands
268 *
269 * @Return: void
270 */
271static void free_sme_cmds(tpAniSirGlobal mac_ctx)
272{
273 uint32_t idx;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530274
Naveen Rawate7d86052015-11-13 12:01:43 -0800275 if (NULL == mac_ctx->sme.pSmeCmdBufAddr)
276 return;
277
278 for (idx = 0; idx < mac_ctx->sme.totalSmeCmd; idx++)
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530279 qdf_mem_free(mac_ctx->sme.pSmeCmdBufAddr[idx]);
Naveen Rawate7d86052015-11-13 12:01:43 -0800280
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530281 qdf_mem_free(mac_ctx->sme.pSmeCmdBufAddr);
Naveen Rawate7d86052015-11-13 12:01:43 -0800282 mac_ctx->sme.pSmeCmdBufAddr = NULL;
283}
284
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530285static QDF_STATUS init_sme_cmd_list(tpAniSirGlobal pMac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800286{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530287 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800288 tSmeCmd *pCmd;
289 uint32_t cmd_idx;
Naveen Rawate7d86052015-11-13 12:01:43 -0800290 uint32_t sme_cmd_ptr_ary_sz;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800291
292 pMac->sme.totalSmeCmd = SME_TOTAL_COMMAND;
293
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800294
Jeff Johnson616417f2018-06-27 10:20:53 -0700295 status = csr_ll_open(&pMac->sme.smeCmdFreeList);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530296 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800297 goto end;
298
Naveen Rawate7d86052015-11-13 12:01:43 -0800299 /* following pointer contains array of pointers for tSmeCmd* */
300 sme_cmd_ptr_ary_sz = sizeof(void *) * pMac->sme.totalSmeCmd;
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530301 pMac->sme.pSmeCmdBufAddr = qdf_mem_malloc(sme_cmd_ptr_ary_sz);
Arif Hussain0ef77082018-10-10 16:42:53 -0700302 if (!pMac->sme.pSmeCmdBufAddr) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530303 status = QDF_STATUS_E_NOMEM;
Naveen Rawate7d86052015-11-13 12:01:43 -0800304 goto end;
305 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800306
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530307 status = QDF_STATUS_SUCCESS;
Naveen Rawate7d86052015-11-13 12:01:43 -0800308 for (cmd_idx = 0; cmd_idx < pMac->sme.totalSmeCmd; cmd_idx++) {
309 /*
310 * Since total size of all commands together can be huge chunk
311 * of memory, allocate SME cmd individually. These SME CMDs are
312 * moved between pending and active queues. And these freeing of
313 * these queues just manipulates the list but does not actually
314 * frees SME CMD pointers. Hence store each SME CMD address in
315 * the array, sme.pSmeCmdBufAddr. This will later facilitate
316 * freeing up of all SME CMDs with just a for loop.
317 */
318 pMac->sme.pSmeCmdBufAddr[cmd_idx] =
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530319 qdf_mem_malloc(sizeof(tSmeCmd));
Naveen Rawate7d86052015-11-13 12:01:43 -0800320 if (NULL == pMac->sme.pSmeCmdBufAddr[cmd_idx]) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530321 status = QDF_STATUS_E_NOMEM;
Naveen Rawate7d86052015-11-13 12:01:43 -0800322 free_sme_cmds(pMac);
323 goto end;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800324 }
Naveen Rawate7d86052015-11-13 12:01:43 -0800325 pCmd = (tSmeCmd *)pMac->sme.pSmeCmdBufAddr[cmd_idx];
326 csr_ll_insert_tail(&pMac->sme.smeCmdFreeList,
327 &pCmd->Link, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800328 }
329
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800330end:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530331 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700332 sme_err("Failed to initialize sme command list: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800333
334 return status;
335}
336
Krunal Sonia8270f52017-02-23 19:51:25 -0800337void sme_release_command(tpAniSirGlobal mac_ctx, tSmeCmd *sme_cmd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800338{
Krunal Sonia8270f52017-02-23 19:51:25 -0800339 sme_cmd->command = eSmeNoCommand;
340 csr_ll_insert_tail(&mac_ctx->sme.smeCmdFreeList, &sme_cmd->Link,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530341 LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800342}
343
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530344static QDF_STATUS free_sme_cmd_list(tpAniSirGlobal pMac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800345{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530346 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800347
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800348 csr_ll_close(&pMac->sme.smeCmdFreeList);
349
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530350 status = qdf_mutex_acquire(&pMac->sme.lkSmeGlobalLock);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530351 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700352 sme_err("Failed to acquire the lock status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800353 goto done;
354 }
355
Naveen Rawate7d86052015-11-13 12:01:43 -0800356 free_sme_cmds(pMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800357
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530358 status = qdf_mutex_release(&pMac->sme.lkSmeGlobalLock);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530359 if (status != QDF_STATUS_SUCCESS)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700360 sme_err("Failed to release the lock status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800361done:
362 return status;
363}
364
Jeff Johnson49c02f92016-10-07 10:29:09 -0700365static void dump_csr_command_info(tpAniSirGlobal pMac, tSmeCmd *pCmd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800366{
367 switch (pCmd->command) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800368 case eSmeCommandRoam:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700369 sme_debug("roam command reason is %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800370 pCmd->u.roamCmd.roamReason);
371 break;
372
373 case eSmeCommandWmStatusChange:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700374 sme_debug("WMStatusChange command type is %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800375 pCmd->u.wmStatusChangeCmd.Type);
376 break;
377
Pragaspathi Thilagarajb37dad32018-07-01 16:48:01 +0530378 case e_sme_command_del_sta_session:
379 sme_debug("Issue del STA command for session:%d",
380 pCmd->sessionId);
381 break;
382
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800383 default:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700384 sme_debug("default: Unhandled command %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800385 pCmd->command);
386 break;
387 }
388}
389
390tSmeCmd *sme_get_command_buffer(tpAniSirGlobal pMac)
391{
392 tSmeCmd *pRetCmd = NULL, *pTempCmd = NULL;
393 tListElem *pEntry;
394 static int sme_command_queue_full;
395
396 pEntry = csr_ll_remove_head(&pMac->sme.smeCmdFreeList, LL_ACCESS_LOCK);
397
398 /* If we can get another MS Msg buffer, then we are ok. Just link */
399 /* the entry onto the linked list. (We are using the linked list */
400 /* to keep track of tfhe message buffers). */
401 if (pEntry) {
402 pRetCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
403 /* reset when free list is available */
404 sme_command_queue_full = 0;
405 } else {
406 int idx = 1;
407
408 /* Cannot change pRetCmd here since it needs to return later. */
Krunal Sonia8270f52017-02-23 19:51:25 -0800409 pEntry = csr_nonscan_active_ll_peek_head(pMac, LL_ACCESS_LOCK);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530410 if (pEntry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800411 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530412
413 sme_err("Out of command buffer.... command (0x%X) stuck",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800414 (pTempCmd) ? pTempCmd->command : eSmeNoCommand);
415 if (pTempCmd) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530416 if (eSmeCsrCommandMask & pTempCmd->command)
417 /* CSR command is stuck. See what the reason
418 * code is for that command
419 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800420 dump_csr_command_info(pMac, pTempCmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800421 } /* if(pTempCmd) */
422
423 /* dump what is in the pending queue */
Krunal Soni20126cb2017-02-15 16:26:57 -0800424 csr_nonscan_pending_ll_lock(pMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800425 pEntry =
Krunal Sonia8270f52017-02-23 19:51:25 -0800426 csr_nonscan_pending_ll_peek_head(pMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800427 LL_ACCESS_NOLOCK);
428 while (pEntry && !sme_command_queue_full) {
429 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
430 /* Print only 1st five commands from pending queue. */
431 if (idx <= 5)
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530432 sme_err("Out of command buffer.... SME pending command #%d (0x%X)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800433 idx, pTempCmd->command);
434 idx++;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530435 if (eSmeCsrCommandMask & pTempCmd->command)
436 /* CSR command is stuck. See what the reason
437 * code is for that command
438 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800439 dump_csr_command_info(pMac, pTempCmd);
Krunal Soni72dba662017-02-15 20:13:17 -0800440 pEntry = csr_nonscan_pending_ll_next(pMac, pEntry,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800441 LL_ACCESS_NOLOCK);
442 }
Krunal Soni20126cb2017-02-15 16:26:57 -0800443 csr_nonscan_pending_ll_unlock(pMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800444
Vignesh Viswanathana1f3a1a2018-10-04 13:10:46 +0530445 if (pMac->mlme_cfg->gen.fatal_event_trigger)
Abhishek Singh5ea86532016-04-27 14:10:53 +0530446 cds_flush_logs(WLAN_LOG_TYPE_FATAL,
447 WLAN_LOG_INDICATOR_HOST_DRIVER,
448 WLAN_LOG_REASON_SME_OUT_OF_CMD_BUF,
449 false,
Vignesh Viswanathana1f3a1a2018-10-04 13:10:46 +0530450 pMac->mlme_cfg->gen.self_recovery);
Abhishek Singh5ea86532016-04-27 14:10:53 +0530451 else
Anurag Chouhan4085ff72017-10-05 18:09:56 +0530452 cds_trigger_recovery(QDF_GET_MSG_BUFF_FAILURE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800453 }
454
455 /* memset to zero */
456 if (pRetCmd) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530457 qdf_mem_set((uint8_t *)&pRetCmd->command,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800458 sizeof(pRetCmd->command), 0);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530459 qdf_mem_set((uint8_t *)&pRetCmd->sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800460 sizeof(pRetCmd->sessionId), 0);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530461 qdf_mem_set((uint8_t *)&pRetCmd->u, sizeof(pRetCmd->u), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800462 }
463
464 return pRetCmd;
465}
466
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800467/**
Krunal Sonia8270f52017-02-23 19:51:25 -0800468 * sme_ser_handle_active_cmd() - handle command activation callback from
469 * new serialization module
470 * @cmd: pointer to new serialization command
471 *
472 * This API is to handle command activation callback from new serialization
473 * callback
474 *
475 * Return: QDF_STATUS_SUCCESS
476 */
477static
478QDF_STATUS sme_ser_handle_active_cmd(struct wlan_serialization_command *cmd)
479{
480 tSmeCmd *sme_cmd;
Jeff Johnson1f2dabc2018-11-07 15:33:01 -0800481 mac_handle_t hal;
Krunal Sonia8270f52017-02-23 19:51:25 -0800482 tpAniSirGlobal mac_ctx;
483 QDF_STATUS status = QDF_STATUS_SUCCESS;
484 bool do_continue;
485
486 if (!cmd) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700487 sme_err("No serialization command found");
Krunal Sonia8270f52017-02-23 19:51:25 -0800488 return QDF_STATUS_E_FAILURE;
489 }
490
491 hal = cds_get_context(QDF_MODULE_ID_SME);
Pragaspathi Thilagarajb11dbe42018-07-23 16:42:17 +0530492 if (NULL != hal) {
493 mac_ctx = PMAC_STRUCT(hal);
494 } else {
495 sme_err("No hal found");
Krunal Sonia8270f52017-02-23 19:51:25 -0800496 return QDF_STATUS_E_FAILURE;
497 }
498 sme_cmd = cmd->umac_cmd;
499 if (!sme_cmd) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700500 sme_err("No SME command found");
Krunal Sonia8270f52017-02-23 19:51:25 -0800501 return QDF_STATUS_E_FAILURE;
502 }
503
504 switch (sme_cmd->command) {
505 case eSmeCommandRoam:
506 status = csr_roam_process_command(mac_ctx, sme_cmd);
507 break;
508 case eSmeCommandWmStatusChange:
509 csr_roam_process_wm_status_change_command(mac_ctx,
510 sme_cmd);
511 break;
Pragaspathi Thilagarajb37dad32018-07-01 16:48:01 +0530512 case e_sme_command_del_sta_session:
513 csr_process_del_sta_session_command(mac_ctx, sme_cmd);
514 break;
Krunal Sonia8270f52017-02-23 19:51:25 -0800515 case eSmeCommandAddTs:
516 case eSmeCommandDelTs:
517#ifndef WLAN_MDM_CODE_REDUCTION_OPT
518 do_continue = qos_process_command(mac_ctx, sme_cmd);
519 if (do_continue)
520 status = QDF_STATUS_E_FAILURE;
521#endif
522 break;
Krunal Sonia8270f52017-02-23 19:51:25 -0800523 case e_sme_command_set_hw_mode:
524 csr_process_set_hw_mode(mac_ctx, sme_cmd);
525 break;
526 case e_sme_command_nss_update:
527 csr_process_nss_update_req(mac_ctx, sme_cmd);
528 break;
529 case e_sme_command_set_dual_mac_config:
530 csr_process_set_dual_mac_config(mac_ctx, sme_cmd);
531 break;
532 case e_sme_command_set_antenna_mode:
533 csr_process_set_antenna_mode(mac_ctx, sme_cmd);
534 break;
535 default:
536 /* something is wrong */
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700537 sme_err("unknown command %d", sme_cmd->command);
Krunal Sonia8270f52017-02-23 19:51:25 -0800538 status = QDF_STATUS_E_FAILURE;
539 break;
540 }
Krunal Sonia8270f52017-02-23 19:51:25 -0800541 return status;
542}
543
544QDF_STATUS sme_ser_cmd_callback(void *buf,
545 enum wlan_serialization_cb_reason reason)
546{
547 struct wlan_serialization_command *cmd = buf;
Jeff Johnson1f2dabc2018-11-07 15:33:01 -0800548 mac_handle_t hal;
Krunal Sonia8270f52017-02-23 19:51:25 -0800549 tpAniSirGlobal mac_ctx;
550 QDF_STATUS status = QDF_STATUS_SUCCESS;
551 tSmeCmd *sme_cmd;
552
553 hal = cds_get_context(QDF_MODULE_ID_SME);
Pragaspathi Thilagarajb11dbe42018-07-23 16:42:17 +0530554 if (hal != NULL) {
555 mac_ctx = PMAC_STRUCT(hal);
556 } else {
557 sme_err("hal is null");
Krunal Sonia8270f52017-02-23 19:51:25 -0800558 return QDF_STATUS_E_FAILURE;
559 }
560 /*
561 * Do not acquire lock here as sme global lock is already acquired in
562 * caller or MC thread context
563 */
564 if (!cmd) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700565 sme_err("serialization command is null");
Krunal Sonia8270f52017-02-23 19:51:25 -0800566 return QDF_STATUS_E_FAILURE;
567 }
568
569 switch (reason) {
570 case WLAN_SER_CB_ACTIVATE_CMD:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700571 sme_debug("WLAN_SER_CB_ACTIVATE_CMD callback");
Krunal Sonia8270f52017-02-23 19:51:25 -0800572 status = sme_ser_handle_active_cmd(cmd);
573 break;
574 case WLAN_SER_CB_CANCEL_CMD:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700575 sme_debug("WLAN_SER_CB_CANCEL_CMD callback");
Krunal Sonia8270f52017-02-23 19:51:25 -0800576 break;
577 case WLAN_SER_CB_RELEASE_MEM_CMD:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700578 sme_debug("WLAN_SER_CB_RELEASE_MEM_CMD callback");
Vignesh Viswanathan062b5162018-10-11 17:18:41 +0530579 if (cmd->vdev)
580 wlan_objmgr_vdev_release_ref(cmd->vdev,
581 WLAN_LEGACY_SME_ID);
Krunal Sonia8270f52017-02-23 19:51:25 -0800582 sme_cmd = cmd->umac_cmd;
583 csr_release_command_buffer(mac_ctx, sme_cmd);
584 break;
585 case WLAN_SER_CB_ACTIVE_CMD_TIMEOUT:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700586 sme_debug("WLAN_SER_CB_ACTIVE_CMD_TIMEOUT callback");
Krunal Sonia8270f52017-02-23 19:51:25 -0800587 break;
588 default:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700589 sme_debug("STOP: unknown reason code");
Krunal Sonia8270f52017-02-23 19:51:25 -0800590 return QDF_STATUS_E_FAILURE;
591 }
592 return status;
593}
594
Wen Gong3f003382018-05-14 14:26:37 +0800595#ifdef WLAN_FEATURE_MEMDUMP_ENABLE
Krunal Sonia8270f52017-02-23 19:51:25 -0800596/**
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530597 * sme_get_sessionid_from_activelist() - gets session id
598 * @mac: mac context
599 *
600 * This function is used to get session id from sme command
601 * active list
602 *
603 * Return: returns session id
604 */
Jeff Johnson49c02f92016-10-07 10:29:09 -0700605static uint32_t sme_get_sessionid_from_activelist(tpAniSirGlobal mac)
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530606{
607 tListElem *entry;
608 tSmeCmd *command;
609 uint32_t session_id = CSR_SESSION_ID_INVALID;
610
Krunal Sonia8270f52017-02-23 19:51:25 -0800611 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530612 if (entry) {
613 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
614 session_id = command->sessionId;
615 }
616
617 return session_id;
618}
619
620/**
621 * sme_state_info_dump() - prints state information of sme layer
622 * @buf: buffer pointer
623 * @size: size of buffer to be filled
624 *
625 * This function is used to dump state information of sme layer
626 *
627 * Return: None
628 */
629static void sme_state_info_dump(char **buf_ptr, uint16_t *size)
630{
631 uint32_t session_id, active_session_id;
Jeff Johnson1f2dabc2018-11-07 15:33:01 -0800632 mac_handle_t hal;
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530633 tpAniSirGlobal mac;
634 uint16_t len = 0;
635 char *buf = *buf_ptr;
636 eCsrConnectState connect_state;
637
638 hal = cds_get_context(QDF_MODULE_ID_SME);
639 if (hal == NULL) {
640 QDF_ASSERT(0);
641 return;
642 }
643
644 mac = PMAC_STRUCT(hal);
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530645
646 active_session_id = sme_get_sessionid_from_activelist(mac);
647 if (active_session_id != CSR_SESSION_ID_INVALID) {
648 len += qdf_scnprintf(buf + len, *size - len,
649 "\n active command sessionid %d", active_session_id);
650 }
651
652 for (session_id = 0; session_id < CSR_ROAM_SESSION_MAX; session_id++) {
653 if (CSR_IS_SESSION_VALID(mac, session_id)) {
654 connect_state =
655 mac->roam.roamSession[session_id].connectState;
656 if ((eCSR_ASSOC_STATE_TYPE_INFRA_ASSOCIATED ==
657 connect_state)
658 || (eCSR_ASSOC_STATE_TYPE_INFRA_CONNECTED ==
659 connect_state)) {
660 len += qdf_scnprintf(buf + len, *size - len,
661 "\n NeighborRoamState: %d",
662 mac->roam.neighborRoamInfo[session_id].
663 neighborRoamState);
664 len += qdf_scnprintf(buf + len, *size - len,
665 "\n RoamState: %d", mac->roam.
666 curState[session_id]);
667 len += qdf_scnprintf(buf + len, *size - len,
668 "\n RoamSubState: %d", mac->roam.
669 curSubState[session_id]);
670 len += qdf_scnprintf(buf + len, *size - len,
671 "\n ConnectState: %d",
672 connect_state);
673 }
674 }
675 }
676
677 *size -= len;
678 *buf_ptr += len;
679}
680
681/**
682 * sme_register_debug_callback() - registration function sme layer
683 * to print sme state information
684 *
685 * Return: None
686 */
687static void sme_register_debug_callback(void)
688{
689 qdf_register_debug_callback(QDF_MODULE_ID_SME, &sme_state_info_dump);
690}
Wen Gong3f003382018-05-14 14:26:37 +0800691#else /* WLAN_FEATURE_MEMDUMP_ENABLE */
Wen Gongaa6d55d2018-04-26 16:33:21 +0800692static void sme_register_debug_callback(void)
693{
694}
Wen Gong3f003382018-05-14 14:26:37 +0800695#endif /* WLAN_FEATURE_MEMDUMP_ENABLE */
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530696
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800697/* Global APIs */
698
699/**
700 * sme_open() - Initialze all SME modules and put them at idle state
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800701 * @mac_handle: The handle returned by mac_open
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800702 *
703 * The function initializes each module inside SME, PMC, CSR, etc. Upon
704 * successfully return, all modules are at idle state ready to start.
705 * smeOpen must be called before any other SME APIs can be involved.
706 * smeOpen must be called after mac_open.
707 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530708 * Return: QDF_STATUS_SUCCESS - SME is successfully initialized.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800709 * Other status means SME is failed to be initialized
710 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800711QDF_STATUS sme_open(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800712{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530713 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800714 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800715
716 pMac->sme.state = SME_STATE_STOP;
Anurag Chouhan6d760662016-02-20 16:05:43 +0530717 pMac->sme.currDeviceMode = QDF_STA_MODE;
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530718 if (!QDF_IS_STATUS_SUCCESS(qdf_mutex_create(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800719 &pMac->sme.lkSmeGlobalLock))) {
Srinivas Girigowda09625b02018-09-10 15:28:09 -0700720 sme_err("Init lock failed");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530721 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800722 }
723 status = csr_open(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530724 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700725 sme_err("csr_open failed, status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800726 return status;
727 }
728
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800729 status = sme_ps_open(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530730 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700731 sme_err("sme_ps_open failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800732 return status;
733 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800734
735#ifndef WLAN_MDM_CODE_REDUCTION_OPT
736 status = sme_qos_open(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530737 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700738 sme_err("Qos open, status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800739 return status;
740 }
741#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800742 status = init_sme_cmd_list(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530743 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800744 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800745
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800746 status = rrm_open(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530747 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700748 sme_err("rrm_open failed, status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800749 return status;
750 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800751 sme_trace_init(pMac);
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530752 sme_register_debug_callback();
Krunal Soni33787902017-08-29 11:39:28 -0700753 wlan_serialization_legacy_init_callback();
754
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800755 return status;
756}
757
758/*
759 * sme_init_chan_list, triggers channel setup based on country code.
760 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -0800761QDF_STATUS sme_init_chan_list(mac_handle_t hal, uint8_t *alpha2,
Amar Singhala297bfa2015-10-15 15:07:29 -0700762 enum country_src cc_src)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800763{
764 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
765
Amar Singhala297bfa2015-10-15 15:07:29 -0700766 if ((cc_src == SOURCE_USERSPACE) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800767 (pmac->roam.configParam.fSupplicantCountryCodeHasPriority)) {
768 pmac->roam.configParam.Is11dSupportEnabled = false;
769 }
770
771 return csr_init_chan_list(pmac, alpha2);
772}
773
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530774/*
775 * sme_set11dinfo() - Set the 11d information about valid channels
776 * and there power using information from nvRAM
777 * This function is called only for AP.
778 *
779 * This is a synchronous call
780 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800781 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530782 * pSmeConfigParams - a pointer to a caller allocated object of
783 * typedef struct _smeConfigParams.
784 *
785 * Return QDF_STATUS_SUCCESS - SME update the config parameters successfully.
786 *
787 * Other status means SME is failed to update the config parameters.
788 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800789
Jeff Johnson1f2dabc2018-11-07 15:33:01 -0800790QDF_STATUS sme_set11dinfo(mac_handle_t hal, tpSmeConfigParams pSmeConfigParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800791{
Jeff Johnsonff26c612018-06-10 20:57:13 -0700792 tpAniSirGlobal mac_ctx = MAC_CONTEXT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530793 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800794
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530795 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800796 TRACE_CODE_SME_RX_HDD_MSG_SET_11DINFO, NO_SESSION, 0));
797 if (NULL == pSmeConfigParams) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700798 sme_err("SME config params empty");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800799 return status;
800 }
801
Jeff Johnsonff26c612018-06-10 20:57:13 -0700802 status = csr_set_channels(mac_ctx, &pSmeConfigParams->csrConfig);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700803 if (!QDF_IS_STATUS_SUCCESS(status))
804 sme_err("csr_set_channels failed with status: %d", status);
805
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800806 return status;
807}
808
809/**
810 * sme_set_scan_disable() - Dynamically enable/disable scan
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800811 * @mac_handle: Handle to HAL
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800812 *
813 * This command gives the user an option to dynamically
814 * enable or disable scans.
815 *
816 * Return: None
817 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800818void sme_set_scan_disable(mac_handle_t mac_handle, int value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800819{
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800820 tpAniSirGlobal mac_ctx = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530821
Sandeep Puligilla24b7aa72017-10-13 18:05:14 -0700822 sme_info("scan disable %d", value);
Abhishek Singhcaebce02017-10-12 11:07:57 +0530823 ucfg_scan_set_enable(mac_ctx->psoc, !value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800824}
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530825/*
826 * sme_get_soft_ap_domain() - Get the current regulatory domain of softAp.
827 * This is a synchronous call
828 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800829 * mac_handle - The handle returned by HostapdAdapter.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530830 * v_REGDOMAIN_t - The current Regulatory Domain requested for SoftAp.
831 * Return QDF_STATUS_SUCCESS - SME successfully completed the request.
832 * Other status means, failed to get the current regulatory domain.
833 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800834
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800835QDF_STATUS sme_get_soft_ap_domain(mac_handle_t mac_handle,
836 v_REGDOMAIN_t *domainIdSoftAp)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800837{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530838 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800839 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800840
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530841 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800842 TRACE_CODE_SME_RX_HDD_MSG_GET_SOFTAP_DOMAIN,
843 NO_SESSION, 0));
844 if (NULL == domainIdSoftAp) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700845 sme_err("Uninitialized domain Id");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800846 return status;
847 }
848
849 *domainIdSoftAp = pMac->scan.domainIdCurrent;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530850 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800851
852 return status;
853}
854
Krunal Sonie3531942016-04-12 17:43:53 -0700855/**
856 * sme_update_fine_time_measurement_capab() - Update the FTM capabitlies from
857 * incoming val
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800858 * @mac_handle: Handle for Hal layer
Krunal Sonie3531942016-04-12 17:43:53 -0700859 * @val: New FTM capability value
860 *
861 * Return: None
862 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800863void sme_update_fine_time_measurement_capab(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -0800864 uint8_t session_id,
865 uint32_t val)
Krunal Sonie3531942016-04-12 17:43:53 -0700866{
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800867 tpAniSirGlobal mac_ctx = PMAC_STRUCT(mac_handle);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530868 QDF_STATUS status;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530869
Naveen Rawatd2657be2017-10-10 14:31:23 -0700870 ucfg_wifi_pos_set_ftm_cap(mac_ctx->psoc, val);
Krunal Sonie3531942016-04-12 17:43:53 -0700871
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +0530872 if (!val) {
Krunal Sonie3531942016-04-12 17:43:53 -0700873 mac_ctx->rrm.rrmPEContext.rrmEnabledCaps.fine_time_meas_rpt = 0;
874 ((tpRRMCaps)mac_ctx->rrm.rrmSmeContext.
875 rrmConfig.rm_capability)->fine_time_meas_rpt = 0;
876 } else {
877 mac_ctx->rrm.rrmPEContext.rrmEnabledCaps.fine_time_meas_rpt = 1;
878 ((tpRRMCaps)mac_ctx->rrm.rrmSmeContext.
879 rrmConfig.rm_capability)->fine_time_meas_rpt = 1;
880 }
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +0530881
882 /* Inform this RRM IE change to FW */
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530883 status = sme_acquire_global_lock(&mac_ctx->sme);
884 if (QDF_IS_STATUS_SUCCESS(status)) {
885 csr_roam_offload_scan(mac_ctx, session_id,
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +0530886 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
887 REASON_CONNECT_IES_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530888 sme_release_global_lock(&mac_ctx->sme);
889 } else {
890 sme_err("Failed to acquire SME lock");
891 }
Krunal Sonie3531942016-04-12 17:43:53 -0700892}
893
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530894/*
895 * sme_update_config() - Change configurations for all SME moduels
896 * The function updates some configuration for modules in SME, CSR, etc
897 * during SMEs close open sequence.
898 * Modules inside SME apply the new configuration at the next transaction.
899 * This is a synchronous call
900 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800901 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530902 * pSmeConfigParams - a pointer to a caller allocated object of
903 * typedef struct _smeConfigParams.
904 * Return QDF_STATUS_SUCCESS - SME update the config parameters successfully.
905 * Other status means SME is failed to update the config parameters.
906 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800907QDF_STATUS sme_update_config(mac_handle_t mac_handle, tpSmeConfigParams
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530908 pSmeConfigParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800909{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530910 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800911 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800912
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530913 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800914 TRACE_CODE_SME_RX_HDD_MSG_UPDATE_CONFIG, NO_SESSION,
915 0));
916 if (NULL == pSmeConfigParams) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700917 sme_err("SME config params empty");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800918 return status;
919 }
920
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530921 status = csr_change_default_config_param(pMac, &pSmeConfigParams->
922 csrConfig);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800923
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530924 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700925 sme_err("csr_change_default_config_param failed status: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800926 status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800927
Jeff Johnson711fe942018-06-09 23:37:01 -0700928 status = rrm_change_default_config_param(pMac, &pSmeConfigParams->
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530929 rrmConfig);
930
931 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700932 sme_err("rrm_change_default_config_param failed status: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800933 status);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530934
935 /* For SOC, CFG is set before start We don't want to apply global CFG
936 * in connect state because that may cause some side affect
937 */
938 if (csr_is_all_session_disconnected(pMac))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800939 csr_set_global_cfgs(pMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800940
941 /*
942 * If scan offload is enabled then lim has allow the sending of
943 * scan request to firmware even in powersave mode. The firmware has
944 * to take care of exiting from power save mode
945 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800946 status = sme_cfg_set_int(mac_handle, WNI_CFG_SCAN_IN_POWERSAVE, true);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800947
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530948 if (QDF_STATUS_SUCCESS != status)
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530949 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800950 "Could not pass on WNI_CFG_SCAN_IN_POWERSAVE to CFG");
Kapil Gupta4f0c0c12017-02-07 15:21:15 +0530951
952 pMac->snr_monitor_enabled = pSmeConfigParams->snr_monitor_enabled;
953
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800954 return status;
955}
956
957/**
Abhishek Singh158fe252017-03-23 11:09:34 +0530958 * sme_update_scan_roam_params() - Update the scan roaming params
959 * @mac_ctx: mac ctx
960 *
961 * Return: void.
962 */
963static void sme_update_scan_roam_params(tpAniSirGlobal mac_ctx)
964{
965 struct roam_filter_params scan_params = {0};
966 struct roam_ext_params *roam_params_src;
967 uint8_t i;
968 QDF_STATUS status;
969
970 roam_params_src = &mac_ctx->roam.configParam.roam_params;
971
972 scan_params.num_bssid_avoid_list =
973 roam_params_src->num_bssid_avoid_list;
Abhishek Singh158fe252017-03-23 11:09:34 +0530974
975 if (scan_params.num_bssid_avoid_list >
976 MAX_AVOID_LIST_BSSID)
977 scan_params.num_bssid_avoid_list =
978 MAX_AVOID_LIST_BSSID;
979
980 for (i = 0; i < scan_params.num_bssid_avoid_list; i++) {
981 qdf_copy_macaddr(&scan_params.bssid_avoid_list[i],
982 &roam_params_src->bssid_avoid_list[i]);
983 }
984
985 status = ucfg_scan_update_roam_params(mac_ctx->psoc, &scan_params);
986 if (QDF_IS_STATUS_ERROR(status))
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700987 sme_err("ailed to update scan roam params with status=%d",
Abhishek Singh158fe252017-03-23 11:09:34 +0530988 status);
989}
990
991/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800992 * sme_update_roam_params() - Store/Update the roaming params
993 * @hal: Handle for Hal layer
994 * @session_id: SME Session ID
995 * @roam_params_src: The source buffer to copy
996 * @update_param: Type of parameter to be updated
997 *
998 * Return: Return the status of the updation.
999 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08001000QDF_STATUS sme_update_roam_params(mac_handle_t hal,
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001001 uint8_t session_id, struct roam_ext_params *roam_params_src,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001002 int update_param)
1003{
1004 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
1005 struct roam_ext_params *roam_params_dst;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301006 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001007 uint8_t i;
1008
1009 roam_params_dst = &mac_ctx->roam.configParam.roam_params;
1010 switch (update_param) {
1011 case REASON_ROAM_EXT_SCAN_PARAMS_CHANGED:
Wu Gaoca416ff2018-09-17 11:05:07 +08001012 mac_ctx->mlme_cfg->lfr.rssi_boost_threshold_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001013 roam_params_src->raise_rssi_thresh_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +08001014 mac_ctx->mlme_cfg->lfr.rssi_penalize_threshold_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001015 roam_params_src->drop_rssi_thresh_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +08001016 mac_ctx->mlme_cfg->lfr.rssi_boost_factor_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001017 roam_params_src->raise_factor_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +08001018 mac_ctx->mlme_cfg->lfr.rssi_penalize_factor_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001019 roam_params_src->drop_factor_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +08001020 mac_ctx->mlme_cfg->lfr.max_rssi_boost_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001021 roam_params_src->max_raise_rssi_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +08001022 mac_ctx->mlme_cfg->lfr.max_rssi_penalize_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001023 roam_params_src->max_drop_rssi_5g;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001024 roam_params_dst->alert_rssi_threshold =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001025 roam_params_src->alert_rssi_threshold;
Wu Gaoca416ff2018-09-17 11:05:07 +08001026 mac_ctx->mlme_cfg->lfr.enable_5g_band_pref = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001027 break;
1028 case REASON_ROAM_SET_SSID_ALLOWED:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301029 qdf_mem_set(&roam_params_dst->ssid_allowed_list, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001030 sizeof(tSirMacSSid) * MAX_SSID_ALLOWED_LIST);
1031 roam_params_dst->num_ssid_allowed_list =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001032 roam_params_src->num_ssid_allowed_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001033 for (i = 0; i < roam_params_dst->num_ssid_allowed_list; i++) {
1034 roam_params_dst->ssid_allowed_list[i].length =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001035 roam_params_src->ssid_allowed_list[i].length;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301036 qdf_mem_copy(roam_params_dst->ssid_allowed_list[i].ssId,
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001037 roam_params_src->ssid_allowed_list[i].ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001038 roam_params_dst->ssid_allowed_list[i].length);
1039 }
1040 break;
1041 case REASON_ROAM_SET_FAVORED_BSSID:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301042 qdf_mem_set(&roam_params_dst->bssid_favored, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001043 sizeof(tSirMacAddr) * MAX_BSSID_FAVORED);
1044 roam_params_dst->num_bssid_favored =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001045 roam_params_src->num_bssid_favored;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001046 for (i = 0; i < roam_params_dst->num_bssid_favored; i++) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301047 qdf_mem_copy(&roam_params_dst->bssid_favored[i],
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001048 &roam_params_src->bssid_favored[i],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001049 sizeof(tSirMacAddr));
1050 roam_params_dst->bssid_favored_factor[i] =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001051 roam_params_src->bssid_favored_factor[i];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001052 }
1053 break;
1054 case REASON_ROAM_SET_BLACKLIST_BSSID:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301055 qdf_mem_set(&roam_params_dst->bssid_avoid_list, 0,
Anurag Chouhan6d760662016-02-20 16:05:43 +05301056 QDF_MAC_ADDR_SIZE * MAX_BSSID_AVOID_LIST);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001057 roam_params_dst->num_bssid_avoid_list =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001058 roam_params_src->num_bssid_avoid_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001059 for (i = 0; i < roam_params_dst->num_bssid_avoid_list; i++) {
Anurag Chouhanc5548422016-02-24 18:33:27 +05301060 qdf_copy_macaddr(&roam_params_dst->bssid_avoid_list[i],
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001061 &roam_params_src->bssid_avoid_list[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001062 }
1063 break;
1064 case REASON_ROAM_GOOD_RSSI_CHANGED:
1065 roam_params_dst->good_rssi_roam =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001066 roam_params_src->good_rssi_roam;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001067 break;
1068 default:
1069 break;
1070 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301071
1072 status = sme_acquire_global_lock(&mac_ctx->sme);
1073 if (QDF_IS_STATUS_SUCCESS(status)) {
1074 csr_roam_offload_scan(mac_ctx, session_id,
1075 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
1076 update_param);
1077 sme_release_global_lock(&mac_ctx->sme);
1078 } else {
1079 sme_err("Failed to acquire SME lock");
1080 }
Abhishek Singh158fe252017-03-23 11:09:34 +05301081
1082 sme_update_scan_roam_params(mac_ctx);
1083
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001084 return 0;
1085}
1086
Jeff Johnson8131a9d2018-06-10 08:53:09 -07001087/**
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301088 * sme_process_ready_to_suspend() -
Jeff Johnson8131a9d2018-06-10 08:53:09 -07001089 * @mac: Global MAC context
1090 * @pReadyToSuspend: Parameter received along with ready to suspend
1091 * indication from WMA.
1092 *
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301093 * On getting ready to suspend indication, this function calls
1094 * callback registered (HDD callbacks) with SME to inform ready
1095 * to suspend indication.
1096 *
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301097 * Return: None
1098 */
Jeff Johnson8131a9d2018-06-10 08:53:09 -07001099static void sme_process_ready_to_suspend(tpAniSirGlobal mac,
Jeff Johnson49c02f92016-10-07 10:29:09 -07001100 tpSirReadyToSuspendInd pReadyToSuspend)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001101{
Jeff Johnson8131a9d2018-06-10 08:53:09 -07001102 if (NULL == mac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301103 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Jeff Johnson8131a9d2018-06-10 08:53:09 -07001104 "%s: mac is null", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001105 return;
1106 }
1107
Jeff Johnson8131a9d2018-06-10 08:53:09 -07001108 if (NULL != mac->readyToSuspendCallback) {
1109 mac->readyToSuspendCallback(mac->readyToSuspendContext,
1110 pReadyToSuspend->suspended);
1111 mac->readyToSuspendCallback = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001112 }
1113}
1114
1115#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001116
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07001117/**
1118 * sme_process_ready_to_ext_wow() - inform ready to ExtWoW indication.
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001119 * @mac: Global MAC context
1120 * @indication: ready to Ext WoW indication from lower layer
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07001121 *
1122 * On getting ready to Ext WoW indication, this function calls callback
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001123 * registered (HDD callback) with SME to inform ready to ExtWoW indication.
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07001124 *
1125 * Return: None
1126 */
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001127static void sme_process_ready_to_ext_wow(tpAniSirGlobal mac,
1128 tpSirReadyToExtWoWInd indication)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001129{
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001130 if (!mac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301131 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001132 "%s: mac is null", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001133 return;
1134 }
1135
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001136 if (NULL != mac->readyToExtWoWCallback) {
1137 mac->readyToExtWoWCallback(mac->readyToExtWoWContext,
1138 indication->status);
1139 mac->readyToExtWoWCallback = NULL;
1140 mac->readyToExtWoWContext = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001141 }
1142
1143}
1144#endif
1145
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301146/*
1147 * sme_hdd_ready_ind() - SME sends eWNI_SME_SYS_READY_IND to PE to inform
1148 * that the NIC is ready tio run.
1149 * The function is called by HDD at the end of initialization stage so PE/HAL
1150 * can enable the NIC to running state.
1151 * This is a synchronous call
1152 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001153 * @mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301154 * Return QDF_STATUS_SUCCESS - eWNI_SME_SYS_READY_IND is sent to PE
1155 * successfully.
1156 * Other status means SME failed to send the message to PE.
1157 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001158QDF_STATUS sme_hdd_ready_ind(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001159{
Abhishek Singhde410b72017-05-22 15:25:39 +05301160 tSirSmeReadyReq *msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301161 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001162 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001163
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301164 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001165 TRACE_CODE_SME_RX_HDD_MSG_HDDREADYIND, NO_SESSION, 0));
1166 do {
1167
Abhishek Singhde410b72017-05-22 15:25:39 +05301168 msg = qdf_mem_malloc(sizeof(*msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07001169 if (!msg)
Abhishek Singhde410b72017-05-22 15:25:39 +05301170 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -07001171
Abhishek Singhde410b72017-05-22 15:25:39 +05301172 msg->messageType = eWNI_SME_SYS_READY_IND;
1173 msg->length = sizeof(*msg);
Abhishek Singhde410b72017-05-22 15:25:39 +05301174 msg->csr_roam_synch_cb = csr_roam_synch_callback;
Sandeep Puligilla1426d612017-04-12 18:22:06 -07001175 msg->sme_msg_cb = sme_process_msg_callback;
Vignesh Viswanathan3d478032018-08-02 20:18:53 +05301176 msg->stop_roaming_cb = sme_stop_roaming;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001177
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001178 status = u_mac_post_ctrl_msg(mac_handle, (tSirMbMsg *)msg);
Jeff Johnsonc09caa42018-06-07 22:58:55 -07001179 if (QDF_IS_STATUS_ERROR(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001180 sme_err("u_mac_post_ctrl_msg failed to send eWNI_SME_SYS_READY_IND");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001181 break;
1182 }
1183
1184 status = csr_ready(pMac);
Jeff Johnsonc09caa42018-06-07 22:58:55 -07001185 if (QDF_IS_STATUS_ERROR(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001186 sme_err("csr_ready failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001187 break;
1188 }
1189
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001190 pMac->sme.state = SME_STATE_READY;
1191 } while (0);
1192
1193 return status;
1194}
1195
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001196QDF_STATUS sme_get_valid_channels(uint8_t *chan_list, uint32_t *list_len)
1197{
1198 tpAniSirGlobal mac_ctx = sme_get_mac_context();
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001199
1200 if (NULL == mac_ctx) {
1201 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1202 FL("Invalid MAC context"));
1203 return QDF_STATUS_E_FAILURE;
1204 }
1205
Jeff Johnsonc09caa42018-06-07 22:58:55 -07001206 return wlan_cfg_get_str(mac_ctx, WNI_CFG_VALID_CHANNEL_LIST,
1207 chan_list, list_len);
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001208}
1209
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07001210#ifdef WLAN_CONV_SPECTRAL_ENABLE
1211static QDF_STATUS sme_register_spectral_cb(tpAniSirGlobal mac_ctx)
1212{
1213 struct spectral_legacy_cbacks spectral_cb;
1214 QDF_STATUS status;
1215
1216 spectral_cb.vdev_get_chan_freq = sme_get_oper_chan_freq;
1217 spectral_cb.vdev_get_ch_width = sme_get_oper_ch_width;
1218 spectral_cb.vdev_get_sec20chan_freq_mhz = sme_get_sec20chan_freq_mhz;
1219 status = spectral_register_legacy_cb(mac_ctx->psoc, &spectral_cb);
1220
1221 return status;
1222}
1223#else
1224static QDF_STATUS sme_register_spectral_cb(tpAniSirGlobal mac_ctx)
1225{
1226 return QDF_STATUS_SUCCESS;
1227}
1228#endif
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301229/*
1230 * sme_start() - Put all SME modules at ready state.
1231 * The function starts each module in SME, PMC, CSR, etc. . Upon
1232 * successfully return, all modules are ready to run.
1233 * This is a synchronous call
1234 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001235 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301236 * Return QDF_STATUS_SUCCESS - SME is ready.
1237 * Other status means SME is failed to start
1238 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001239QDF_STATUS sme_start(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001240{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301241 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001242 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001243 struct policy_mgr_sme_cbacks sme_cbacks;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001244
1245 do {
1246 status = csr_start(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301247 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001248 sme_err("csr_start failed status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001249 break;
1250 }
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001251 sme_cbacks.sme_get_nss_for_vdev = sme_get_vdev_type_nss;
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001252 sme_cbacks.sme_get_valid_channels = sme_get_valid_channels;
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001253 sme_cbacks.sme_nss_update_request = sme_nss_update_request;
1254 sme_cbacks.sme_pdev_set_hw_mode = sme_pdev_set_hw_mode;
1255 sme_cbacks.sme_pdev_set_pcl = sme_pdev_set_pcl;
1256 sme_cbacks.sme_soc_set_dual_mac_config =
1257 sme_soc_set_dual_mac_config;
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07001258 sme_cbacks.sme_change_mcc_beacon_interval =
1259 sme_change_mcc_beacon_interval;
1260 sme_cbacks.sme_get_ap_channel_from_scan =
1261 sme_get_ap_channel_from_scan;
1262 sme_cbacks.sme_scan_result_purge = sme_scan_result_purge;
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001263 status = policy_mgr_register_sme_cb(pMac->psoc, &sme_cbacks);
1264 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -07001265 sme_err("Failed to register sme cb with Policy Manager: %d",
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001266 status);
1267 break;
1268 }
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07001269 sme_register_spectral_cb(pMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001270 pMac->sme.state = SME_STATE_START;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001271
Sandeep Puligilla66d09c42017-09-06 17:10:27 -07001272 /* START RRM */
1273 status = rrm_start(pMac);
1274 if (!QDF_IS_STATUS_SUCCESS(status)) {
1275 sme_err("Failed to start RRM");
1276 break;
1277 }
1278 } while (0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001279 return status;
1280}
1281
Arif Hussaincd151632017-02-11 16:57:19 -08001282static QDF_STATUS dfs_msg_processor(tpAniSirGlobal mac,
1283 struct scheduler_msg *msg)
1284{
1285 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson172237b2017-11-07 15:32:59 -08001286 struct csr_roam_info roam_info = { 0 };
Arif Hussaincd151632017-02-11 16:57:19 -08001287 tSirSmeCSAIeTxCompleteRsp *csa_ie_tx_complete_rsp;
1288 uint32_t session_id = 0;
1289 eRoamCmdStatus roam_status;
1290 eCsrRoamResult roam_result;
1291
1292 switch (msg->type) {
1293 case eWNI_SME_DFS_RADAR_FOUND:
1294 {
1295 session_id = msg->bodyval;
1296 roam_status = eCSR_ROAM_DFS_RADAR_IND;
1297 roam_result = eCSR_ROAM_RESULT_DFS_RADAR_FOUND_IND;
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301298 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Arif Hussaincd151632017-02-11 16:57:19 -08001299 "sapdfs: Radar indication event occurred");
1300 break;
1301 }
1302 case eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND:
1303 {
1304 csa_ie_tx_complete_rsp =
1305 (tSirSmeCSAIeTxCompleteRsp *) msg->bodyptr;
1306 if (!csa_ie_tx_complete_rsp) {
1307 sme_err("eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND null msg");
1308 return QDF_STATUS_E_FAILURE;
1309 }
1310 session_id = csa_ie_tx_complete_rsp->sessionId;
1311 roam_status = eCSR_ROAM_DFS_CHAN_SW_NOTIFY;
1312 roam_result = eCSR_ROAM_RESULT_DFS_CHANSW_UPDATE_SUCCESS;
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301313 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Arif Hussaincd151632017-02-11 16:57:19 -08001314 "eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND session=%d",
1315 session_id);
1316 break;
1317 }
1318 case eWNI_SME_DFS_CAC_COMPLETE:
1319 {
1320 session_id = msg->bodyval;
1321 roam_status = eCSR_ROAM_CAC_COMPLETE_IND;
1322 roam_result = eCSR_ROAM_RESULT_CAC_END_IND;
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301323 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Arif Hussaincd151632017-02-11 16:57:19 -08001324 "sapdfs: Received eWNI_SME_DFS_CAC_COMPLETE vdevid%d",
1325 session_id);
1326 break;
1327 }
Abhishek Singh20a8e442018-09-12 15:50:44 +05301328 case eWNI_SME_CSA_RESTART_RSP:
1329 {
1330 session_id = msg->bodyval;
1331 roam_status = 0;
1332 roam_result = eCSR_ROAM_RESULT_CSA_RESTART_RSP;
1333 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
1334 "sapdfs: Received eCSR_ROAM_RESULT_DFS_CHANSW_UPDATE_REQ vdevid%d",
1335 session_id);
1336 break;
1337 }
Arif Hussaincd151632017-02-11 16:57:19 -08001338 default:
1339 {
1340 sme_err("Invalid DFS message: 0x%x", msg->type);
1341 status = QDF_STATUS_E_FAILURE;
1342 return status;
1343 }
1344 }
1345
1346 /* Indicate Radar Event to SAP */
1347 csr_roam_call_callback(mac, session_id, &roam_info, 0,
1348 roam_status, roam_result);
1349 return status;
1350}
1351
1352
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001353#ifdef WLAN_FEATURE_11W
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301354/*
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001355 * Handle the unprotected management frame indication from LIM and
1356 * forward it to HDD.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301357 */
Jeff Johnson2ef47442018-06-09 23:43:40 -07001358static QDF_STATUS
1359sme_unprotected_mgmt_frm_ind(tpAniSirGlobal mac,
1360 tpSirSmeUnprotMgmtFrameInd pSmeMgmtFrm)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001361{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301362 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson172237b2017-11-07 15:32:59 -08001363 struct csr_roam_info roam_info = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001364 uint32_t SessionId = pSmeMgmtFrm->sessionId;
1365
Jeff Johnsoneddf5442017-10-04 10:55:53 -07001366 roam_info.nFrameLength = pSmeMgmtFrm->frameLen;
1367 roam_info.pbFrames = pSmeMgmtFrm->frameBuf;
1368 roam_info.frameType = pSmeMgmtFrm->frameType;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001369
1370 /* forward the mgmt frame to HDD */
Jeff Johnson2ef47442018-06-09 23:43:40 -07001371 csr_roam_call_callback(mac, SessionId, &roam_info, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001372 eCSR_ROAM_UNPROT_MGMT_FRAME_IND, 0);
1373
1374 return status;
1375}
1376#endif
1377
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08001378QDF_STATUS sme_update_new_channel_event(mac_handle_t hal, uint8_t session_id)
Kapil Gupta8878ad92017-02-13 11:56:04 +05301379{
1380 QDF_STATUS status = QDF_STATUS_SUCCESS;
1381 tpAniSirGlobal mac = PMAC_STRUCT(hal);
Jeff Johnson172237b2017-11-07 15:32:59 -08001382 struct csr_roam_info *roamInfo;
Kapil Gupta8878ad92017-02-13 11:56:04 +05301383 eRoamCmdStatus roamStatus;
1384 eCsrRoamResult roamResult;
1385
1386 roamInfo = qdf_mem_malloc(sizeof(*roamInfo));
Arif Hussain0ef77082018-10-10 16:42:53 -07001387 if (!roamInfo)
Krunal Soni3fa80e22018-01-09 14:16:02 -08001388 return QDF_STATUS_E_FAILURE;
Kapil Gupta8878ad92017-02-13 11:56:04 +05301389
Arif Hussain0ef77082018-10-10 16:42:53 -07001390 roamInfo->dfs_event.sessionId = session_id;
Kapil Gupta8878ad92017-02-13 11:56:04 +05301391 roamStatus = eCSR_ROAM_CHANNEL_COMPLETE_IND;
1392 roamResult = eCSR_ROAM_RESULT_DFS_RADAR_FOUND_IND;
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301393 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Kapil Gupta8878ad92017-02-13 11:56:04 +05301394 "sapdfs: Updated new channel event");
1395
1396 /* Indicate channel Event to SAP */
1397 csr_roam_call_callback(mac, session_id, roamInfo, 0,
1398 roamStatus, roamResult);
1399
1400 qdf_mem_free(roamInfo);
1401 return status;
1402}
1403
1404
Abhishek Singh518323d2015-10-19 17:42:01 +05301405/**
1406 * sme_extended_change_channel_ind()- function to indicate ECSA
1407 * action frame is received in lim to SAP
1408 * @mac_ctx: pointer to global mac structure
1409 * @msg_buf: contain new channel and session id.
1410 *
1411 * This function is called to post ECSA action frame
1412 * receive event to SAP.
1413 *
1414 * Return: success if msg indicated to SAP else return failure
1415 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301416static QDF_STATUS sme_extended_change_channel_ind(tpAniSirGlobal mac_ctx,
Abhishek Singh518323d2015-10-19 17:42:01 +05301417 void *msg_buf)
1418{
1419 struct sir_sme_ext_cng_chan_ind *ext_chan_ind;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301420 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh518323d2015-10-19 17:42:01 +05301421 uint32_t session_id = 0;
Jeff Johnson172237b2017-11-07 15:32:59 -08001422 struct csr_roam_info roamInfo = {0};
Abhishek Singh518323d2015-10-19 17:42:01 +05301423 eRoamCmdStatus roam_status;
1424 eCsrRoamResult roam_result;
1425
Abhishek Singh518323d2015-10-19 17:42:01 +05301426 ext_chan_ind = msg_buf;
1427 if (NULL == ext_chan_ind) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001428 sme_err("ext_chan_ind is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301429 return QDF_STATUS_E_FAILURE;
Abhishek Singh518323d2015-10-19 17:42:01 +05301430 }
1431 session_id = ext_chan_ind->session_id;
1432 roamInfo.target_channel = ext_chan_ind->new_channel;
1433 roam_status = eCSR_ROAM_EXT_CHG_CHNL_IND;
1434 roam_result = eCSR_ROAM_EXT_CHG_CHNL_UPDATE_IND;
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001435 sme_debug("sapdfs: Received eWNI_SME_EXT_CHANGE_CHANNEL_IND for session id [%d]",
1436 session_id);
Abhishek Singh518323d2015-10-19 17:42:01 +05301437
1438 /* Indicate Ext Channel Change event to SAP */
1439 csr_roam_call_callback(mac_ctx, session_id, &roamInfo, 0,
1440 roam_status, roam_result);
1441 return status;
1442}
1443
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001444#ifdef FEATURE_WLAN_ESE
1445/**
1446 * sme_update_is_ese_feature_enabled() - enable/disable ESE support at runtime
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001447 * @mac_handle: HAL handle
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001448 * @sessionId: session id
1449 * @isEseIniFeatureEnabled: ese ini enabled
1450 *
1451 * It is used at in the REG_DYNAMIC_VARIABLE macro definition of
1452 * isEseIniFeatureEnabled. This is a synchronous call
1453 *
1454 * Return: QDF_STATUS enumeration
1455 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001456QDF_STATUS sme_update_is_ese_feature_enabled(mac_handle_t mac_handle,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001457 uint8_t sessionId, const bool isEseIniFeatureEnabled)
1458{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001459 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301460 QDF_STATUS status;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001461
1462 if (pMac->roam.configParam.isEseIniFeatureEnabled ==
1463 isEseIniFeatureEnabled) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301464 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001465 "%s: ESE Mode is already enabled or disabled, nothing to do (returning) old(%d) new(%d)",
1466 __func__,
1467 pMac->roam.configParam.isEseIniFeatureEnabled,
1468 isEseIniFeatureEnabled);
1469 return QDF_STATUS_SUCCESS;
1470 }
1471
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301472 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001473 "%s: EseEnabled is changed from %d to %d", __func__,
1474 pMac->roam.configParam.isEseIniFeatureEnabled,
1475 isEseIniFeatureEnabled);
1476 pMac->roam.configParam.isEseIniFeatureEnabled = isEseIniFeatureEnabled;
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07001477 csr_neighbor_roam_update_fast_roaming_enabled(
1478 pMac, sessionId, isEseIniFeatureEnabled);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001479
1480 if (true == isEseIniFeatureEnabled)
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001481 sme_update_fast_transition_enabled(mac_handle, true);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001482
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301483 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
1484 status = sme_acquire_global_lock(&pMac->sme);
1485 if (QDF_IS_STATUS_SUCCESS(status)) {
1486 csr_roam_offload_scan(pMac, sessionId,
1487 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
1488 REASON_ESE_INI_CFG_CHANGED);
1489 sme_release_global_lock(&pMac->sme);
1490 } else {
1491 sme_err("Failed to acquire SME lock");
1492 return status;
1493 }
1494 }
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001495 return QDF_STATUS_SUCCESS;
1496}
1497
1498/**
1499 * sme_set_plm_request() - set plm request
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001500 * @mac_handle: HAL handle
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001501 * @pPlmReq: Pointer to input plm request
1502 *
1503 * Return: QDF_STATUS enumeration
1504 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001505QDF_STATUS sme_set_plm_request(mac_handle_t mac_handle, tpSirPlmReq pPlmReq)
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001506{
1507 QDF_STATUS status;
1508 bool ret = false;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001509 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Varun Reddy Yeturu87c8ad82017-10-03 17:48:12 -07001510 uint8_t ch_list[WNI_CFG_VALID_CHANNEL_LIST_LEN] = { 0 };
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001511 uint8_t count, valid_count = 0;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07001512 struct scheduler_msg msg = {0};
gaurank kathpalia14e2f912017-08-31 14:51:45 +05301513 struct csr_roam_session *pSession = CSR_GET_SESSION(pMac,
1514 pPlmReq->sessionId);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001515
1516 status = sme_acquire_global_lock(&pMac->sme);
1517 if (!QDF_IS_STATUS_SUCCESS(status))
1518 return status;
1519
1520 if (!pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001521 sme_err("session %d not found", pPlmReq->sessionId);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001522 sme_release_global_lock(&pMac->sme);
1523 return QDF_STATUS_E_FAILURE;
1524 }
1525
1526 if (!pSession->sessionActive) {
1527 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1528 FL("Invalid Sessionid"));
1529 sme_release_global_lock(&pMac->sme);
1530 return QDF_STATUS_E_FAILURE;
1531 }
1532
1533 if (!pPlmReq->enable)
1534 goto send_plm_start;
1535 /* validating channel numbers */
1536 for (count = 0; count < pPlmReq->plmNumCh; count++) {
1537 ret = csr_is_supported_channel(pMac, pPlmReq->plmChList[count]);
1538 if (ret && pPlmReq->plmChList[count] > 14) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07001539 if (CHANNEL_STATE_DFS == wlan_reg_get_channel_state(
1540 pMac->pdev,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001541 pPlmReq->plmChList[count])) {
1542 /* DFS channel is provided, no PLM bursts can be
1543 * transmitted. Ignoring these channels.
1544 */
1545 QDF_TRACE(QDF_MODULE_ID_SME,
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301546 QDF_TRACE_LEVEL_DEBUG,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001547 FL("DFS channel %d ignored for PLM"),
1548 pPlmReq->plmChList[count]);
1549 continue;
1550 }
1551 } else if (!ret) {
1552 /* Not supported, ignore the channel */
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301553 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001554 FL("Unsupported channel %d ignored for PLM"),
1555 pPlmReq->plmChList[count]);
1556 continue;
1557 }
1558 ch_list[valid_count] = pPlmReq->plmChList[count];
1559 valid_count++;
1560 } /* End of for () */
1561
1562 /* Copying back the valid channel list to plm struct */
1563 qdf_mem_set((void *)pPlmReq->plmChList,
1564 pPlmReq->plmNumCh, 0);
1565 if (valid_count)
1566 qdf_mem_copy(pPlmReq->plmChList, ch_list,
1567 valid_count);
1568 /* All are invalid channels, FW need to send the PLM
1569 * report with "incapable" bit set.
1570 */
1571 pPlmReq->plmNumCh = valid_count;
1572
1573send_plm_start:
1574 /* PLM START */
1575 msg.type = WMA_SET_PLM_REQ;
1576 msg.reserved = 0;
1577 msg.bodyptr = pPlmReq;
1578
gaurank kathpalia36b0c582018-08-28 17:45:43 +05301579 if (!QDF_IS_STATUS_SUCCESS(scheduler_post_message(QDF_MODULE_ID_SME,
1580 QDF_MODULE_ID_WMA,
1581 QDF_MODULE_ID_WMA,
1582 &msg))) {
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001583 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1584 FL("Not able to post WMA_SET_PLM_REQ to WMA"));
1585 sme_release_global_lock(&pMac->sme);
1586 return QDF_STATUS_E_FAILURE;
1587 }
1588
1589 sme_release_global_lock(&pMac->sme);
1590 return status;
1591}
1592
1593/**
1594 * sme_tsm_ie_ind() - sme tsm ie indication
Jeff Johnson24e65b52018-06-10 08:45:26 -07001595 * @mac: Global mac context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001596 * @pSmeTsmIeInd: Pointer to tsm ie indication
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001597 *
1598 * Handle the tsm ie indication from LIM and forward it to HDD.
1599 *
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001600 * Return: QDF_STATUS enumeration
1601 */
Jeff Johnson24e65b52018-06-10 08:45:26 -07001602static QDF_STATUS sme_tsm_ie_ind(tpAniSirGlobal mac,
1603 tSirSmeTsmIEInd *pSmeTsmIeInd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001604{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301605 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson172237b2017-11-07 15:32:59 -08001606 struct csr_roam_info roam_info = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001607 uint32_t SessionId = pSmeTsmIeInd->sessionId;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301608
Jeff Johnsoneddf5442017-10-04 10:55:53 -07001609 roam_info.tsmIe.tsid = pSmeTsmIeInd->tsmIe.tsid;
1610 roam_info.tsmIe.state = pSmeTsmIeInd->tsmIe.state;
1611 roam_info.tsmIe.msmt_interval = pSmeTsmIeInd->tsmIe.msmt_interval;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001612 /* forward the tsm ie information to HDD */
Jeff Johnson24e65b52018-06-10 08:45:26 -07001613 csr_roam_call_callback(mac, SessionId, &roam_info, 0,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301614 eCSR_ROAM_TSM_IE_IND, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001615 return status;
1616}
1617
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001618/**
1619 * sme_set_cckm_ie() - set cckm ie
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001620 * @mac_handle: HAL handle
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001621 * @sessionId: session id
1622 * @pCckmIe: Pointer to CCKM Ie
1623 * @cckmIeLen: Length of @pCckmIe
1624 *
1625 * Function to store the CCKM IE passed from supplicant and use
1626 * it while packing reassociation request.
1627 *
1628 * Return: QDF_STATUS enumeration
1629 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001630QDF_STATUS sme_set_cckm_ie(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001631 uint8_t *pCckmIe, uint8_t cckmIeLen)
1632{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001633 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301634 QDF_STATUS status = QDF_STATUS_SUCCESS;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301635
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001636 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301637 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001638 csr_set_cckm_ie(pMac, sessionId, pCckmIe, cckmIeLen);
1639 sme_release_global_lock(&pMac->sme);
1640 }
1641 return status;
1642}
1643
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001644/**
1645 * sme_set_ese_beacon_request() - set ese beacon request
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001646 * @mac_handle: HAL handle
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001647 * @sessionId: session id
1648 * @pEseBcnReq: Ese beacon report
1649 *
1650 * function to set ESE beacon request parameters
1651 *
1652 * Return: QDF_STATUS enumeration
1653 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001654QDF_STATUS sme_set_ese_beacon_request(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08001655 const uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001656 const tCsrEseBeaconReq *pEseBcnReq)
1657{
Varun Reddy Yeturu7b2a6572017-06-15 11:07:28 -07001658 QDF_STATUS status;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001659 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001660 tpSirBeaconReportReqInd pSmeBcnReportReq = NULL;
1661 tCsrEseBeaconReqParams *pBeaconReq = NULL;
1662 uint8_t counter = 0;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05301663 struct csr_roam_session *pSession = CSR_GET_SESSION(pMac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001664 tpRrmSMEContext pSmeRrmContext = &pMac->rrm.rrmSmeContext;
1665
1666 if (pSmeRrmContext->eseBcnReqInProgress == true) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001667 sme_err("A Beacon Report Req is already in progress");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301668 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001669 }
1670
1671 /* Store the info in RRM context */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301672 qdf_mem_copy(&pSmeRrmContext->eseBcnReqInfo, pEseBcnReq,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001673 sizeof(tCsrEseBeaconReq));
1674
1675 /* Prepare the request to send to SME. */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301676 pSmeBcnReportReq = qdf_mem_malloc(sizeof(tSirBeaconReportReqInd));
Arif Hussain0ef77082018-10-10 16:42:53 -07001677 if (!pSmeBcnReportReq)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301678 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001679
1680 pSmeRrmContext->eseBcnReqInProgress = true;
1681
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001682 sme_debug("Sending Beacon Report Req to SME");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001683
1684 pSmeBcnReportReq->messageType = eWNI_SME_BEACON_REPORT_REQ_IND;
1685 pSmeBcnReportReq->length = sizeof(tSirBeaconReportReqInd);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301686 qdf_mem_copy(pSmeBcnReportReq->bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001687 pSession->connectedProfile.bssid.bytes,
1688 sizeof(tSirMacAddr));
1689 pSmeBcnReportReq->channelInfo.channelNum = 255;
1690 pSmeBcnReportReq->channelList.numChannels = pEseBcnReq->numBcnReqIe;
1691 pSmeBcnReportReq->msgSource = eRRM_MSG_SOURCE_ESE_UPLOAD;
1692
1693 for (counter = 0; counter < pEseBcnReq->numBcnReqIe; counter++) {
1694 pBeaconReq =
1695 (tCsrEseBeaconReqParams *) &pEseBcnReq->bcnReq[counter];
1696 pSmeBcnReportReq->fMeasurementtype[counter] =
1697 pBeaconReq->scanMode;
1698 pSmeBcnReportReq->measurementDuration[counter] =
1699 SYS_TU_TO_MS(pBeaconReq->measurementDuration);
1700 pSmeBcnReportReq->channelList.channelNumber[counter] =
1701 pBeaconReq->channel;
1702 }
1703
1704 status = sme_rrm_process_beacon_report_req_ind(pMac, pSmeBcnReportReq);
1705
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301706 if (status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001707 pSmeRrmContext->eseBcnReqInProgress = false;
1708
Hanumanth Reddy Pothula7f7a2712016-09-07 18:44:47 +05301709 qdf_mem_free(pSmeBcnReportReq);
1710
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001711 return status;
1712}
1713
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001714/**
1715 * sme_get_tsm_stats() - SME get tsm stats
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001716 * @mac_handle: HAL handle
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001717 * @callback: SME sends back the requested stats using the callback
1718 * @staId: The station ID for which the stats is requested for
1719 * @bssId: bssid
1720 * @pContext: user context to be passed back along with the callback
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001721 * @tid: Traffic id
1722 *
1723 * API register a callback to get TSM Stats.
1724 *
1725 * Return: QDF_STATUS enumeration
1726 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001727QDF_STATUS sme_get_tsm_stats(mac_handle_t mac_handle,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001728 tCsrTsmStatsCallback callback,
1729 uint8_t staId, struct qdf_mac_addr bssId,
Jeff Johnson30f84552017-09-13 14:55:25 -07001730 void *pContext, uint8_t tid)
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001731{
1732 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001733 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001734
1735 status = sme_acquire_global_lock(&pMac->sme);
1736 if (QDF_IS_STATUS_SUCCESS(status)) {
1737 status = csr_get_tsm_stats(pMac, callback,
1738 staId, bssId, pContext,
Jeff Johnson30f84552017-09-13 14:55:25 -07001739 tid);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001740 sme_release_global_lock(&pMac->sme);
1741 }
1742 return status;
1743}
1744
1745/**
1746 * sme_set_ese_roam_scan_channel_list() - To set ese roam scan channel list
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001747 * @mac_handle: pointer HAL handle returned by mac_open
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001748 * @sessionId: sme session id
1749 * @pChannelList: Output channel list
1750 * @numChannels: Output number of channels
1751 *
1752 * This routine is called to set ese roam scan channel list.
1753 * This is a synchronous call
1754 *
1755 * Return: QDF_STATUS
1756 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001757QDF_STATUS sme_set_ese_roam_scan_channel_list(mac_handle_t mac_handle,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001758 uint8_t sessionId,
1759 uint8_t *pChannelList,
1760 uint8_t numChannels)
1761{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001762 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001763 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08001764 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
1765 tpCsrChannelInfo curchnl_list_info = NULL;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001766 uint8_t oldChannelList[WNI_CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
1767 uint8_t newChannelList[128] = { 0 };
1768 uint8_t i = 0, j = 0;
1769
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08001770 if (sessionId >= CSR_ROAM_SESSION_MAX) {
1771 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1772 FL("Invalid sme session id: %d"), sessionId);
1773 return QDF_STATUS_E_INVAL;
1774 }
1775
1776 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
1777 curchnl_list_info =
1778 &pNeighborRoamInfo->roamChannelInfo.currentChannelListInfo;
1779
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001780 status = sme_acquire_global_lock(&pMac->sme);
1781 if (!QDF_IS_STATUS_SUCCESS(status)) {
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301782 sme_err("Failed to acquire SME lock");
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001783 return status;
1784 }
1785 if (NULL != curchnl_list_info->ChannelList) {
1786 for (i = 0; i < curchnl_list_info->numOfChannels; i++) {
1787 j += snprintf(oldChannelList + j,
1788 sizeof(oldChannelList) - j, "%d",
1789 curchnl_list_info->ChannelList[i]);
1790 }
1791 }
1792 status = csr_create_roam_scan_channel_list(pMac, sessionId,
1793 pChannelList, numChannels,
Jeff Johnsonbfd24632018-10-30 09:28:50 -07001794 csr_get_current_band(pMac));
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001795 if (QDF_IS_STATUS_SUCCESS(status)) {
1796 if (NULL != curchnl_list_info->ChannelList) {
1797 j = 0;
1798 for (i = 0; i < curchnl_list_info->numOfChannels; i++) {
1799 j += snprintf(newChannelList + j,
1800 sizeof(newChannelList) - j, "%d",
1801 curchnl_list_info->ChannelList[i]);
1802 }
1803 }
1804 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
1805 "ESE roam scan chnl list successfully set to %s-old value is %s-roam state is %d",
1806 newChannelList, oldChannelList,
1807 pNeighborRoamInfo->neighborRoamState);
1808 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301809
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001810 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
1811 csr_roam_offload_scan(pMac, sessionId,
1812 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
1813 REASON_CHANNEL_LIST_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301814
1815 sme_release_global_lock(&pMac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001816 return status;
1817}
1818
1819#endif /* FEATURE_WLAN_ESE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001820
Jeff Johnson49c02f92016-10-07 10:29:09 -07001821static
Jeff Johnsonbfc58a12018-06-10 08:49:08 -07001822QDF_STATUS sme_ibss_peer_info_response_handler(tpAniSirGlobal pMac,
Jeff Johnson49c02f92016-10-07 10:29:09 -07001823 tpSirIbssGetPeerInfoRspParams
1824 pIbssPeerInfoParams)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001825{
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001826 if (NULL == pMac) {
1827 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
1828 "%s: pMac is null", __func__);
1829 return QDF_STATUS_E_FAILURE;
1830 }
1831 if (pMac->sme.peerInfoParams.peerInfoCbk == NULL) {
1832 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1833 "%s: HDD callback is null", __func__);
1834 return QDF_STATUS_E_FAILURE;
1835 }
1836 pMac->sme.peerInfoParams.peerInfoCbk(pMac->sme.peerInfoParams.pUserData,
1837 &pIbssPeerInfoParams->
1838 ibssPeerInfoRspParams);
1839 return QDF_STATUS_SUCCESS;
1840}
1841
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001842/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001843 * sme_process_dual_mac_config_resp() - Process set Dual mac config response
1844 * @mac: Global MAC pointer
1845 * @msg: Dual mac config response
1846 *
1847 * Processes the dual mac configuration response and invokes the HDD callback
1848 * to process further
1849 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301850static QDF_STATUS sme_process_dual_mac_config_resp(tpAniSirGlobal mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001851 uint8_t *msg)
1852{
1853 tListElem *entry = NULL;
1854 tSmeCmd *command = NULL;
1855 bool found;
1856 dual_mac_cb callback = NULL;
1857 struct sir_dual_mac_config_resp *param;
1858
1859 param = (struct sir_dual_mac_config_resp *)msg;
1860 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001861 sme_err("Dual mac config resp param is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001862 /* Not returning. Need to check if active command list
1863 * needs to be freed
1864 */
1865 }
1866
Krunal Sonia8270f52017-02-23 19:51:25 -08001867 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001868 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001869 sme_err("No cmd found in active list");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301870 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001871 }
1872
1873 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
1874 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001875 sme_err("Base address is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301876 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001877 }
1878
1879 if (e_sme_command_set_dual_mac_config != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001880 sme_err("Command mismatch!");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301881 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001882 }
1883
1884 callback = command->u.set_dual_mac_cmd.set_dual_mac_cb;
1885 if (callback) {
1886 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001887 sme_err("Callback failed-Dual mac config is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001888 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001889 sme_debug("Calling HDD callback for Dual mac config");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001890 callback(param->status,
1891 command->u.set_dual_mac_cmd.scan_config,
1892 command->u.set_dual_mac_cmd.fw_mode_config);
1893 }
1894 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001895 sme_err("Callback does not exist");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001896 }
1897
Krunal Soni72dba662017-02-15 20:13:17 -08001898 found = csr_nonscan_active_ll_remove_entry(mac, entry, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001899 if (found)
1900 /* Now put this command back on the available command list */
Krunal Soni78618d92017-02-14 21:46:31 -08001901 csr_release_command(mac, command);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001902
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301903 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001904}
1905
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001906/**
1907 * sme_process_antenna_mode_resp() - Process set antenna mode
1908 * response
1909 * @mac: Global MAC pointer
1910 * @msg: antenna mode response
1911 *
1912 * Processes the antenna mode response and invokes the HDD
1913 * callback to process further
1914 */
1915static QDF_STATUS sme_process_antenna_mode_resp(tpAniSirGlobal mac,
1916 uint8_t *msg)
1917{
1918 tListElem *entry;
1919 tSmeCmd *command;
1920 bool found;
Dundi Raviteja6bb9e322018-05-16 17:04:41 +05301921 void *context = NULL;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001922 antenna_mode_cb callback;
1923 struct sir_antenna_mode_resp *param;
1924
1925 param = (struct sir_antenna_mode_resp *)msg;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301926 if (!param)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001927 sme_err("set antenna mode resp is NULL");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001928 /* Not returning. Need to check if active command list
1929 * needs to be freed
1930 */
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001931
Krunal Sonia8270f52017-02-23 19:51:25 -08001932 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001933 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001934 sme_err("No cmd found in active list");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001935 return QDF_STATUS_E_FAILURE;
1936 }
1937
1938 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
1939 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001940 sme_err("Base address is NULL");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001941 return QDF_STATUS_E_FAILURE;
1942 }
1943
1944 if (e_sme_command_set_antenna_mode != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001945 sme_err("Command mismatch!");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001946 return QDF_STATUS_E_FAILURE;
1947 }
1948
Dundi Raviteja6bb9e322018-05-16 17:04:41 +05301949 context = command->u.set_antenna_mode_cmd.set_antenna_mode_ctx;
1950 callback = command->u.set_antenna_mode_cmd.set_antenna_mode_resp;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001951 if (callback) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301952 if (!param)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001953 sme_err("Set antenna mode call back is NULL");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301954 else
Dundi Raviteja6bb9e322018-05-16 17:04:41 +05301955 callback(param->status, context);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001956 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001957 sme_err("Callback does not exist");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001958 }
1959
Krunal Soni72dba662017-02-15 20:13:17 -08001960 found = csr_nonscan_active_ll_remove_entry(mac, entry, LL_ACCESS_LOCK);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001961 if (found)
1962 /* Now put this command back on the available command list */
Krunal Soni78618d92017-02-14 21:46:31 -08001963 csr_release_command(mac, command);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001964
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001965 return QDF_STATUS_SUCCESS;
1966}
1967
Jeff Johnson5f9ce2d2018-06-09 21:20:45 -07001968QDF_STATUS sme_process_msg(tpAniSirGlobal pMac, struct scheduler_msg *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001969{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301970 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05301971 struct sir_peer_info *peer_stats;
1972 struct sir_peer_info_resp *peer_info_rsp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001973
1974 if (pMsg == NULL) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001975 sme_err("Empty message for SME");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001976 return status;
1977 }
1978 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301979 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001980 sme_warn("Locking failed, bailing out");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001981 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301982 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001983 return status;
1984 }
1985 if (!SME_IS_START(pMac)) {
Rajeev Kumar3887f9b2018-01-10 11:24:01 -08001986 sme_debug("message type %d in stop state ignored", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001987 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301988 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001989 goto release_lock;
1990 }
1991 switch (pMsg->type) {
1992#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001993 case eWNI_SME_HO_FAIL_IND:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301994 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001995 FL("LFR3: Rcvd eWNI_SME_HO_FAIL_IND"));
1996 csr_process_ho_fail_ind(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301997 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001998 break;
1999#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002000 case WNI_CFG_SET_CNF:
2001 case WNI_CFG_DNLD_CNF:
2002 case WNI_CFG_GET_RSP:
2003 case WNI_CFG_ADD_GRP_ADDR_CNF:
2004 case WNI_CFG_DEL_GRP_ADDR_CNF:
2005 break;
2006 case eWNI_SME_ADDTS_RSP:
2007 case eWNI_SME_DELTS_RSP:
2008 case eWNI_SME_DELTS_IND:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002009 case eWNI_SME_FT_AGGR_QOS_RSP:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002010 /* QoS */
2011 if (pMsg->bodyptr) {
2012#ifndef WLAN_MDM_CODE_REDUCTION_OPT
2013 status = sme_qos_msg_processor(pMac, pMsg->type,
2014 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302015 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002016#endif
2017 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002018 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002019 }
2020 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002021 case eWNI_SME_NEIGHBOR_REPORT_IND:
2022 case eWNI_SME_BEACON_REPORT_REQ_IND:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002023 if (pMsg->bodyptr) {
2024 status = sme_rrm_msg_processor(pMac, pMsg->type,
2025 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302026 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002027 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302028 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002029 }
2030 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002031 case eWNI_SME_ADD_STA_SELF_RSP:
2032 if (pMsg->bodyptr) {
2033 status = csr_process_add_sta_session_rsp(pMac,
2034 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302035 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002036 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002037 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002038 }
2039 break;
2040 case eWNI_SME_DEL_STA_SELF_RSP:
2041 if (pMsg->bodyptr) {
2042 status = csr_process_del_sta_session_rsp(pMac,
2043 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302044 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002045 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002046 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002047 }
2048 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002049 case eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE:
2050 if (pMsg->bodyptr) {
2051 status = sme_handle_generic_change_country_code(
2052 (void *)pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302053 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002054 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002055 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002056 }
2057 break;
Sandeep Puligilla8d6011b2017-11-08 00:06:18 -08002058
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002059#ifdef WLAN_FEATURE_11W
2060 case eWNI_SME_UNPROT_MGMT_FRM_IND:
2061 if (pMsg->bodyptr) {
2062 sme_unprotected_mgmt_frm_ind(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302063 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002064 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002065 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002066 }
2067 break;
2068#endif
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002069#ifdef FEATURE_WLAN_ESE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002070 case eWNI_SME_TSM_IE_IND:
2071 if (pMsg->bodyptr) {
2072 sme_tsm_ie_ind(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302073 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002074 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002075 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002076 }
2077 break;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002078#endif /* FEATURE_WLAN_ESE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002079 case eWNI_SME_ROAM_SCAN_OFFLOAD_RSP:
2080 status = csr_roam_offload_scan_rsp_hdlr((void *)pMac,
2081 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302082 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002083 break;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002084 case eWNI_SME_IBSS_PEER_INFO_RSP:
2085 if (pMsg->bodyptr) {
Jeff Johnson49c02f92016-10-07 10:29:09 -07002086 sme_ibss_peer_info_response_handler(pMac,
2087 pMsg->bodyptr);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002088 qdf_mem_free(pMsg->bodyptr);
2089 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002090 sme_err("Empty message for: %d", pMsg->type);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002091 }
2092 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002093 case eWNI_SME_READY_TO_SUSPEND_IND:
2094 if (pMsg->bodyptr) {
2095 sme_process_ready_to_suspend(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302096 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002097 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002098 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002099 }
2100 break;
2101#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
2102 case eWNI_SME_READY_TO_EXTWOW_IND:
2103 if (pMsg->bodyptr) {
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07002104 sme_process_ready_to_ext_wow(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302105 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002106 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002107 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002108 }
2109 break;
2110#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002111#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
2112 case eWNI_SME_AUTO_SHUTDOWN_IND:
2113 if (pMac->sme.pAutoShutdownNotificationCb) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05302114 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002115 FL("Auto shutdown notification"));
2116 pMac->sme.pAutoShutdownNotificationCb();
2117 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302118 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002119 break;
2120#endif
2121 case eWNI_SME_DFS_RADAR_FOUND:
Arif Hussaincd151632017-02-11 16:57:19 -08002122 case eWNI_SME_DFS_CAC_COMPLETE:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002123 case eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND:
Abhishek Singh20a8e442018-09-12 15:50:44 +05302124 case eWNI_SME_CSA_RESTART_RSP:
Arif Hussaincd151632017-02-11 16:57:19 -08002125 status = dfs_msg_processor(pMac, pMsg);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302126 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002127 break;
2128 case eWNI_SME_CHANNEL_CHANGE_RSP:
2129 if (pMsg->bodyptr) {
2130 status = sme_process_channel_change_resp(pMac,
2131 pMsg->type,
2132 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302133 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002134 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002135 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002136 }
2137 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002138 case eWNI_SME_STATS_EXT_EVENT:
Jeff Johnsonfdecd512018-06-10 09:18:32 -07002139 status = sme_stats_ext_event(pMac, pMsg->bodyptr);
2140 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002141 break;
Will Huang558f8082017-05-31 16:22:24 +08002142 case eWNI_SME_GET_PEER_INFO_IND:
2143 if (pMac->sme.pget_peer_info_ind_cb)
2144 pMac->sme.pget_peer_info_ind_cb(pMsg->bodyptr,
2145 pMac->sme.pget_peer_info_cb_context);
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05302146 if (pMsg->bodyptr) {
2147 peer_info_rsp = (struct sir_peer_info_resp *)
2148 (pMsg->bodyptr);
2149 peer_stats = (struct sir_peer_info *)
2150 (peer_info_rsp->info);
2151 if (peer_stats) {
2152 pMac->peer_rssi = peer_stats[0].rssi;
2153 pMac->peer_txrate = peer_stats[0].tx_rate;
2154 pMac->peer_rxrate = peer_stats[0].rx_rate;
2155 }
2156 }
Will Huang558f8082017-05-31 16:22:24 +08002157 qdf_mem_free(pMsg->bodyptr);
2158 break;
2159 case eWNI_SME_GET_PEER_INFO_EXT_IND:
2160 if (pMac->sme.pget_peer_info_ext_ind_cb)
2161 pMac->sme.pget_peer_info_ext_ind_cb(pMsg->bodyptr,
2162 pMac->sme.pget_peer_info_ext_cb_context);
2163 qdf_mem_free(pMsg->bodyptr);
2164 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002165 case eWNI_SME_CSA_OFFLOAD_EVENT:
2166 if (pMsg->bodyptr) {
2167 csr_scan_flush_bss_entry(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302168 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002169 }
2170 break;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07002171 case eWNI_SME_TSF_EVENT:
2172 if (pMac->sme.get_tsf_cb) {
2173 pMac->sme.get_tsf_cb(pMac->sme.get_tsf_cxt,
2174 (struct stsf *)pMsg->bodyptr);
2175 }
2176 if (pMsg->bodyptr)
2177 qdf_mem_free(pMsg->bodyptr);
2178 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002179#ifdef WLAN_FEATURE_NAN
2180 case eWNI_SME_NAN_EVENT:
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05302181 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_WMA_MSG,
2182 NO_SESSION, pMsg->type));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002183 if (pMsg->bodyptr) {
Jeff Johnson5f9ce2d2018-06-09 21:20:45 -07002184 sme_nan_event(MAC_HANDLE(pMac), pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302185 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002186 }
2187 break;
2188#endif /* WLAN_FEATURE_NAN */
2189 case eWNI_SME_LINK_STATUS_IND:
2190 {
2191 tAniGetLinkStatus *pLinkStatus =
2192 (tAniGetLinkStatus *) pMsg->bodyptr;
2193 if (pLinkStatus) {
Jeff Johnsonca7a7162018-07-07 12:56:54 -07002194 if (pMac->sme.link_status_callback)
2195 pMac->sme.link_status_callback(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002196 pLinkStatus->linkStatus,
Jeff Johnsonca7a7162018-07-07 12:56:54 -07002197 pMac->sme.link_status_context);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302198
Jeff Johnsonca7a7162018-07-07 12:56:54 -07002199 pMac->sme.link_status_callback = NULL;
2200 pMac->sme.link_status_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302201 qdf_mem_free(pLinkStatus);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002202 }
2203 break;
2204 }
2205 case eWNI_SME_MSG_GET_TEMPERATURE_IND:
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302206 if (pMac->sme.pGetTemperatureCb)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002207 pMac->sme.pGetTemperatureCb(pMsg->bodyval,
2208 pMac->sme.pTemperatureCbContext);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002209 break;
2210 case eWNI_SME_SNR_IND:
2211 {
2212 tAniGetSnrReq *pSnrReq = (tAniGetSnrReq *) pMsg->bodyptr;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302213
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002214 if (pSnrReq) {
2215 if (pSnrReq->snrCallback) {
2216 ((tCsrSnrCallback)
2217 (pSnrReq->snrCallback))
2218 (pSnrReq->snr, pSnrReq->staId,
2219 pSnrReq->pDevContext);
2220 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302221 qdf_mem_free(pSnrReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002222 }
2223 break;
2224 }
2225#ifdef FEATURE_WLAN_EXTSCAN
2226 case eWNI_SME_EXTSCAN_FULL_SCAN_RESULT_IND:
Jeff Johnson17b12392018-07-03 22:21:15 -07002227 if (pMac->sme.ext_scan_ind_cb)
2228 pMac->sme.ext_scan_ind_cb(pMac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002229 eSIR_EXTSCAN_FULL_SCAN_RESULT_IND,
2230 pMsg->bodyptr);
2231 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002232 sme_err("callback not registered to process: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002233 pMsg->type);
2234
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302235 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002236 break;
2237 case eWNI_SME_EPNO_NETWORK_FOUND_IND:
Jeff Johnson17b12392018-07-03 22:21:15 -07002238 if (pMac->sme.ext_scan_ind_cb)
2239 pMac->sme.ext_scan_ind_cb(pMac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002240 eSIR_EPNO_NETWORK_FOUND_IND,
2241 pMsg->bodyptr);
2242 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002243 sme_err("callback not registered to process: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002244 pMsg->type);
2245
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302246 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002247 break;
2248#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002249 case eWNI_SME_SET_HW_MODE_RESP:
2250 if (pMsg->bodyptr) {
2251 status = sme_process_set_hw_mode_resp(pMac,
2252 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302253 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002254 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002255 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002256 }
2257 break;
2258 case eWNI_SME_HW_MODE_TRANS_IND:
2259 if (pMsg->bodyptr) {
2260 status = sme_process_hw_mode_trans_ind(pMac,
2261 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302262 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002263 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002264 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002265 }
2266 break;
2267 case eWNI_SME_NSS_UPDATE_RSP:
2268 if (pMsg->bodyptr) {
2269 status = sme_process_nss_update_resp(pMac,
2270 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302271 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002272 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002273 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002274 }
2275 break;
Nirav Shah575282c2018-07-08 22:48:00 +05302276#ifdef WLAN_FEATURE_DSRC
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002277 case eWNI_SME_OCB_SET_CONFIG_RSP:
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302278 if (pMac->sme.ocb_set_config_callback)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002279 pMac->sme.ocb_set_config_callback(
2280 pMac->sme.ocb_set_config_context,
2281 pMsg->bodyptr);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302282 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002283 sme_err("No callback for Msg type: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002284 pMac->sme.ocb_set_config_callback = NULL;
2285 pMac->sme.ocb_set_config_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302286 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002287 break;
2288 case eWNI_SME_OCB_GET_TSF_TIMER_RSP:
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302289 if (pMac->sme.ocb_get_tsf_timer_callback)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002290 pMac->sme.ocb_get_tsf_timer_callback(
2291 pMac->sme.ocb_get_tsf_timer_context,
2292 pMsg->bodyptr);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302293 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002294 sme_err("No callback for Msg type: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002295 pMac->sme.ocb_get_tsf_timer_callback = NULL;
2296 pMac->sme.ocb_get_tsf_timer_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302297 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002298 break;
2299 case eWNI_SME_DCC_GET_STATS_RSP:
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302300 if (pMac->sme.dcc_get_stats_callback)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002301 pMac->sme.dcc_get_stats_callback(
2302 pMac->sme.dcc_get_stats_context,
2303 pMsg->bodyptr);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302304 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002305 sme_err("No callback for Msg type: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002306 pMac->sme.dcc_get_stats_callback = NULL;
2307 pMac->sme.dcc_get_stats_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302308 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002309 break;
2310 case eWNI_SME_DCC_UPDATE_NDL_RSP:
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302311 if (pMac->sme.dcc_update_ndl_callback)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002312 pMac->sme.dcc_update_ndl_callback(
2313 pMac->sme.dcc_update_ndl_context,
2314 pMsg->bodyptr);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302315 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002316 sme_err("No callback for Msg type: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002317 pMac->sme.dcc_update_ndl_callback = NULL;
2318 pMac->sme.dcc_update_ndl_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302319 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002320 break;
2321 case eWNI_SME_DCC_STATS_EVENT:
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302322 if (pMac->sme.dcc_stats_event_callback)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002323 pMac->sme.dcc_stats_event_callback(
2324 pMac->sme.dcc_stats_event_context,
2325 pMsg->bodyptr);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302326 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002327 sme_err("No callback for Msg type: %d", pMsg->type);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302328 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002329 break;
Nirav Shah575282c2018-07-08 22:48:00 +05302330#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002331 case eWNI_SME_SET_DUAL_MAC_CFG_RESP:
2332 if (pMsg->bodyptr) {
2333 status = sme_process_dual_mac_config_resp(pMac,
2334 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302335 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002336 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002337 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002338 }
gaurank kathpaliaebe3fc82018-05-07 09:39:46 +05302339 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002340 case eWNI_SME_SET_THERMAL_LEVEL_IND:
2341 if (pMac->sme.set_thermal_level_cb)
Jeff Johnson6aaaa992018-06-30 10:43:04 -07002342 pMac->sme.set_thermal_level_cb(pMac->hdd_handle,
2343 pMsg->bodyval);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002344 break;
Abhishek Singh518323d2015-10-19 17:42:01 +05302345 case eWNI_SME_EXT_CHANGE_CHANNEL_IND:
2346 status = sme_extended_change_channel_ind(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302347 qdf_mem_free(pMsg->bodyptr);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302348 break;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002349 case eWNI_SME_SET_ANTENNA_MODE_RESP:
2350 if (pMsg->bodyptr) {
2351 status = sme_process_antenna_mode_resp(pMac,
2352 pMsg->bodyptr);
2353 qdf_mem_free(pMsg->bodyptr);
2354 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002355 sme_err("Empty message for: %d", pMsg->type);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002356 }
2357 break;
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05302358 case eWNI_SME_LOST_LINK_INFO_IND:
2359 if (pMac->sme.lost_link_info_cb)
Jeff Johnson6aaaa992018-06-30 10:43:04 -07002360 pMac->sme.lost_link_info_cb(pMac->hdd_handle,
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05302361 (struct sir_lost_link_info *)pMsg->bodyptr);
2362 qdf_mem_free(pMsg->bodyptr);
2363 break;
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +05302364 case eWNI_SME_RSO_CMD_STATUS_IND:
2365 if (pMac->sme.rso_cmd_status_cb)
Jeff Johnson6aaaa992018-06-30 10:43:04 -07002366 pMac->sme.rso_cmd_status_cb(pMac->hdd_handle,
2367 pMsg->bodyptr);
lifeng66831662017-05-19 16:01:35 +08002368 qdf_mem_free(pMsg->bodyptr);
2369 break;
Zhang Qiana6e9c102016-12-22 16:47:24 +08002370 case eWMI_SME_LL_STATS_IND:
2371 if (pMac->sme.link_layer_stats_ext_cb)
Jeff Johnson6aaaa992018-06-30 10:43:04 -07002372 pMac->sme.link_layer_stats_ext_cb(pMac->hdd_handle,
Zhang Qiana6e9c102016-12-22 16:47:24 +08002373 pMsg->bodyptr);
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +05302374 qdf_mem_free(pMsg->bodyptr);
2375 break;
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05302376 case eWNI_SME_BT_ACTIVITY_INFO_IND:
2377 if (pMac->sme.bt_activity_info_cb)
Jeff Johnson6aaaa992018-06-30 10:43:04 -07002378 pMac->sme.bt_activity_info_cb(pMac->hdd_handle,
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05302379 pMsg->bodyval);
2380 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002381 default:
2382
2383 if ((pMsg->type >= eWNI_SME_MSG_TYPES_BEGIN)
2384 && (pMsg->type <= eWNI_SME_MSG_TYPES_END)) {
2385 /* CSR */
2386 if (pMsg->bodyptr) {
Jeff Johnsone0349a02018-06-10 11:31:06 -07002387 status = csr_msg_processor(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302388 qdf_mem_free(pMsg->bodyptr);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302389 } else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002390 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002391 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002392 sme_warn("Unknown message type: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002393 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302394 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002395 }
2396 } /* switch */
2397release_lock:
2398 sme_release_global_lock(&pMac->sme);
2399 return status;
2400}
2401
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002402QDF_STATUS sme_mc_process_handler(struct scheduler_msg *msg)
2403{
2404 tpAniSirGlobal mac_ctx = cds_get_context(QDF_MODULE_ID_SME);
2405
2406 if (mac_ctx == NULL) {
2407 QDF_ASSERT(0);
2408 return QDF_STATUS_E_FAILURE;
2409 }
2410
Jeff Johnson5f9ce2d2018-06-09 21:20:45 -07002411 return sme_process_msg(mac_ctx, msg);
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002412}
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002413
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002414/**
2415 * sme_process_nss_update_resp() - Process nss update response
2416 * @mac: Global MAC pointer
2417 * @msg: nss update response
2418 *
2419 * Processes the nss update response and invokes the HDD
2420 * callback to process further
2421 */
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302422static QDF_STATUS sme_process_nss_update_resp(tpAniSirGlobal mac, uint8_t *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002423{
2424 tListElem *entry = NULL;
2425 tSmeCmd *command = NULL;
2426 bool found;
Tushnim Bhattacharyyaeab33dd2017-11-15 15:20:02 -08002427 policy_mgr_nss_update_cback callback = NULL;
Abhishek Singhfc740be2018-10-12 11:34:26 +05302428 struct sir_bcn_update_rsp *param;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002429
Abhishek Singhfc740be2018-10-12 11:34:26 +05302430 param = (struct sir_bcn_update_rsp *)msg;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302431 if (!param)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002432 sme_err("nss update resp param is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002433 /* Not returning. Need to check if active command list
2434 * needs to be freed
2435 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002436
Abhishek Singhfc740be2018-10-12 11:34:26 +05302437 if (param && param->reason != REASON_NSS_UPDATE) {
2438 sme_err("reason not NSS update");
2439 return QDF_STATUS_E_INVAL;
2440 }
Krunal Sonia8270f52017-02-23 19:51:25 -08002441 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002442 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002443 sme_err("No cmd found in active list");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302444 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002445 }
2446
2447 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
2448 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002449 sme_err("Base address is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302450 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002451 }
2452
2453 if (e_sme_command_nss_update != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002454 sme_err("Command mismatch!");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302455 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002456 }
2457
2458 callback = command->u.nss_update_cmd.nss_update_cb;
2459 if (callback) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302460 if (!param)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002461 sme_err("Callback failed since nss update params is NULL");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302462 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002463 callback(command->u.nss_update_cmd.context,
Abhishek Singhfc740be2018-10-12 11:34:26 +05302464 param->status,
2465 param->vdev_id,
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +05302466 command->u.nss_update_cmd.next_action,
Liangwei Dong1ba99482018-10-19 02:57:29 -04002467 command->u.nss_update_cmd.reason,
2468 command->u.nss_update_cmd.original_vdev_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002469 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002470 sme_err("Callback does not exisit");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002471 }
2472
Krunal Soni72dba662017-02-15 20:13:17 -08002473 found = csr_nonscan_active_ll_remove_entry(mac, entry, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002474 if (found) {
2475 /* Now put this command back on the avilable command list */
Krunal Soni78618d92017-02-14 21:46:31 -08002476 csr_release_command(mac, command);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002477 }
Krunal Sonia8270f52017-02-23 19:51:25 -08002478
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302479 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002480}
2481
Jeff Johnson62cd6802018-07-20 12:38:25 -07002482QDF_STATUS sme_stop(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002483{
Jeff Johnson62cd6802018-07-20 12:38:25 -07002484 QDF_STATUS status;
2485 QDF_STATUS ret_status = QDF_STATUS_SUCCESS;
2486 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002487
Jeff Johnson62cd6802018-07-20 12:38:25 -07002488 status = rrm_stop(mac);
2489 if (QDF_IS_STATUS_ERROR(status)) {
2490 ret_status = status;
Sandeep Puligilla66d09c42017-09-06 17:10:27 -07002491 sme_err("rrm_stop failed with status: %d", status);
2492 }
2493
Jeff Johnson62cd6802018-07-20 12:38:25 -07002494 status = csr_stop(mac);
2495 if (QDF_IS_STATUS_ERROR(status)) {
2496 ret_status = status;
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002497 sme_err("csr_stop failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002498 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002499
Jeff Johnson62cd6802018-07-20 12:38:25 -07002500 mac->sme.state = SME_STATE_STOP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002501
Jeff Johnson62cd6802018-07-20 12:38:25 -07002502 return ret_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002503}
2504
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302505/*
2506 * sme_close() - Release all SME modules and their resources.
2507 * The function release each module in SME, PMC, CSR, etc. . Upon
2508 * return, all modules are at closed state.
2509 *
2510 * No SME APIs can be involved after smeClose except smeOpen.
2511 * smeClose must be called before mac_close.
2512 * This is a synchronous call
2513 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002514 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302515 * Return QDF_STATUS_SUCCESS - SME is successfully close.
2516 *
2517 * Other status means SME is failed to be closed but caller still cannot
2518 * call any other SME functions except smeOpen.
2519 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002520QDF_STATUS sme_close(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002521{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302522 QDF_STATUS status = QDF_STATUS_E_FAILURE;
2523 QDF_STATUS fail_status = QDF_STATUS_SUCCESS;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002524 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002525
2526 if (!pMac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302527 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002528
2529 /* Note: pSession will be invalid from here on, do not access */
2530 status = csr_close(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302531 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002532 sme_err("csr_close failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002533 fail_status = status;
2534 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002535#ifndef WLAN_MDM_CODE_REDUCTION_OPT
2536 status = sme_qos_close(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302537 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002538 sme_err("Qos close failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002539 fail_status = status;
2540 }
2541#endif
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002542 status = sme_ps_close(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302543 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002544 sme_err("sme_ps_close failed status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002545 fail_status = status;
2546 }
2547
Jeff Johnson3639a642018-06-09 23:47:44 -07002548 status = rrm_close(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302549 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002550 sme_err("RRM close failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002551 fail_status = status;
2552 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002553
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002554 free_sme_cmd_list(pMac);
2555
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302556 if (!QDF_IS_STATUS_SUCCESS
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302557 (qdf_mutex_destroy(&pMac->sme.lkSmeGlobalLock)))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302558 fail_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002559
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302560 if (!QDF_IS_STATUS_SUCCESS(fail_status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002561 status = fail_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002562
2563 pMac->sme.state = SME_STATE_STOP;
2564
2565 return status;
2566}
2567
2568/**
Abhishek Singhc9941602016-08-09 16:06:22 +05302569 * sme_remove_bssid_from_scan_list() - wrapper to remove the bssid from
2570 * scan list
2571 * @hal: hal context.
2572 * @bssid: bssid to be removed
2573 *
2574 * This function remove the given bssid from scan list.
2575 *
2576 * Return: QDF status.
2577 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08002578QDF_STATUS sme_remove_bssid_from_scan_list(mac_handle_t hal,
Abhishek Singhc9941602016-08-09 16:06:22 +05302579 tSirMacAddr bssid)
2580{
2581 QDF_STATUS status = QDF_STATUS_E_FAILURE;
2582 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
2583
2584 status = sme_acquire_global_lock(&mac_ctx->sme);
2585 if (QDF_IS_STATUS_SUCCESS(status)) {
2586 csr_remove_bssid_from_scan_list(mac_ctx, bssid);
2587 sme_release_global_lock(&mac_ctx->sme);
2588 }
2589
2590 return status;
2591}
2592
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002593
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302594/*
2595 * sme_scan_get_result
2596 * A wrapper function to request scan results from CSR.
2597 * This is a synchronous call
2598 *
2599 * pFilter - If pFilter is NULL, all cached results are returned
2600 * phResult - an object for the result.
2601 * Return QDF_STATUS
2602 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002603QDF_STATUS sme_scan_get_result(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002604 tCsrScanResultFilter *pFilter,
2605 tScanResultHandle *phResult)
2606{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302607 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002608 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002609
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302610 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002611 TRACE_CODE_SME_RX_HDD_MSG_SCAN_GET_RESULTS, sessionId,
2612 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002613 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302614 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnsonadf800d2018-06-10 18:00:00 -07002615 status = csr_scan_get_result(pMac, pFilter, phResult);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002616 sme_release_global_lock(&pMac->sme);
2617 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002618
2619 return status;
2620}
2621
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002622QDF_STATUS sme_scan_get_result_for_bssid(mac_handle_t mac_handle,
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +05302623 struct qdf_mac_addr *bssid,
2624 tCsrScanResultInfo *res)
2625{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002626 tpAniSirGlobal mac_ctx = PMAC_STRUCT(mac_handle);
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +05302627 QDF_STATUS status;
2628
2629 status = sme_acquire_global_lock(&mac_ctx->sme);
2630 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson1b56f6b2018-06-10 18:17:10 -07002631 status = csr_scan_get_result_for_bssid(mac_ctx, bssid, res);
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +05302632 sme_release_global_lock(&mac_ctx->sme);
2633 }
2634
2635 return status;
2636}
2637
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002638/**
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002639 * sme_get_ap_channel_from_scan() - a wrapper function to get
Srinivas Girigowda828ef232017-10-13 22:31:27 -07002640 * AP's channel id from
2641 * CSR by filtering the
2642 * result which matches
2643 * our roam profile.
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002644 * @profile: SAP profile
2645 * @ap_chnl_id: pointer to channel id of SAP. Fill the value after finding the
2646 * best ap from scan cache.
2647 *
2648 * This function is written to get AP's channel id from CSR by filtering
2649 * the result which matches our roam profile. This is a synchronous call.
2650 *
2651 * Return: QDF_STATUS.
2652 */
2653QDF_STATUS sme_get_ap_channel_from_scan(void *profile,
2654 tScanResultHandle *scan_cache,
2655 uint8_t *ap_chnl_id)
2656{
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002657 return sme_get_ap_channel_from_scan_cache((struct csr_roam_profile *)
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002658 profile,
2659 scan_cache,
2660 ap_chnl_id);
2661}
2662
2663/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002664 * sme_get_ap_channel_from_scan_cache() - a wrapper function to get AP's
2665 * channel id from CSR by filtering the
2666 * result which matches our roam profile.
2667 * @profile: SAP adapter
2668 * @ap_chnl_id: pointer to channel id of SAP. Fill the value after finding the
2669 * best ap from scan cache.
2670 *
2671 * This function is written to get AP's channel id from CSR by filtering
2672 * the result which matches our roam profile. This is a synchronous call.
2673 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302674 * Return: QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002675 */
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002676QDF_STATUS sme_get_ap_channel_from_scan_cache(
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002677 struct csr_roam_profile *profile, tScanResultHandle *scan_cache,
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002678 uint8_t *ap_chnl_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002679{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302680 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002681 tpAniSirGlobal mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002682 tCsrScanResultFilter *scan_filter = NULL;
2683 tScanResultHandle filtered_scan_result = NULL;
2684 tSirBssDescription first_ap_profile;
2685
2686 if (NULL == mac_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302687 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002688 FL("mac_ctx is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302689 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002690 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302691 scan_filter = qdf_mem_malloc(sizeof(tCsrScanResultFilter));
Arif Hussain0ef77082018-10-10 16:42:53 -07002692 if (!scan_filter)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302693 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -07002694
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302695 qdf_mem_set(&first_ap_profile, sizeof(tSirBssDescription), 0);
2696 if (NULL == profile) {
2697 scan_filter->EncryptionType.numEntries = 1;
2698 scan_filter->EncryptionType.encryptionType[0]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002699 = eCSR_ENCRYPT_TYPE_NONE;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302700 } else {
2701 /* Here is the profile we need to connect to */
2702 status = csr_roam_prepare_filter_from_profile(mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002703 profile,
2704 scan_filter);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302705 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002706
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302707 if (QDF_STATUS_SUCCESS == status) {
2708 /* Save the WPS info */
2709 if (NULL != profile) {
2710 scan_filter->bWPSAssociation =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002711 profile->bWPSAssociation;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302712 scan_filter->bOSENAssociation =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002713 profile->bOSENAssociation;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002714 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302715 scan_filter->bWPSAssociation = 0;
2716 scan_filter->bOSENAssociation = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002717 }
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302718 } else {
2719 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
2720 FL("Preparing the profile filter failed"));
2721 qdf_mem_free(scan_filter);
2722 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002723 }
2724 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302725 if (QDF_STATUS_SUCCESS == status) {
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002726 status = csr_scan_get_result(mac_ctx, scan_filter,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002727 &filtered_scan_result);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302728 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002729 csr_get_bssdescr_from_scan_handle(filtered_scan_result,
2730 &first_ap_profile);
2731 *scan_cache = filtered_scan_result;
2732 if (0 != first_ap_profile.channelId) {
2733 *ap_chnl_id = first_ap_profile.channelId;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302734 QDF_TRACE(QDF_MODULE_ID_SME,
Abhishek Singh5d8d7332017-08-10 15:15:24 +05302735 QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002736 FL("Found best AP & its on chnl[%d]"),
2737 first_ap_profile.channelId);
2738 } else {
2739 /*
2740 * This means scan result is empty
2741 * so set the channel to zero, caller should
2742 * take of zero channel id case.
2743 */
2744 *ap_chnl_id = 0;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302745 QDF_TRACE(QDF_MODULE_ID_SME,
2746 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002747 FL("Scan is empty, set chnl to 0"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302748 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002749 }
2750 } else {
Sandeep Puligilla1f1e4002018-08-18 12:15:01 -07002751 sme_err("Failed to get scan get result");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302752 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002753 }
2754 csr_free_scan_filter(mac_ctx, scan_filter);
2755 sme_release_global_lock(&mac_ctx->sme);
2756 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302757 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002758 FL("Aquiring lock failed"));
Krunal Sonif9882222016-01-22 17:16:50 -08002759 csr_free_scan_filter(mac_ctx, scan_filter);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302760 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002761 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302762 qdf_mem_free(scan_filter);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002763 return status;
2764}
2765
2766/**
2767 * sme_store_joinreq_param() - This function will pass station's join
2768 * request to store to csr.
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002769 * @mac_handle: pointer to hal context.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002770 * @profile: pointer to station's roam profile.
2771 * @scan_cache: pointer to station's scan cache.
2772 * @roam_id: reference to roam_id variable being passed.
2773 * @session_id: station's session id.
2774 *
2775 * This function will pass station's join request further down to csr
2776 * to store it. this stored parameter will be used later.
2777 *
2778 * Return: true or false based on function's overall success.
2779 **/
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002780bool sme_store_joinreq_param(mac_handle_t mac_handle,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002781 struct csr_roam_profile *profile,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002782 tScanResultHandle scan_cache,
2783 uint32_t *roam_id,
2784 uint32_t session_id)
2785{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002786 tpAniSirGlobal mac_ctx = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302787 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002788 bool ret_status = true;
2789
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302790 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002791 TRACE_CODE_SME_RX_HDD_STORE_JOIN_REQ,
2792 session_id, 0));
2793 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302794 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002795 if (false == csr_store_joinreq_param(mac_ctx, profile,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302796 scan_cache, roam_id, session_id))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002797 ret_status = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002798 sme_release_global_lock(&mac_ctx->sme);
2799 } else {
2800 ret_status = false;
2801 }
2802
2803 return ret_status;
2804}
2805
2806/**
2807 * sme_clear_joinreq_param() - This function will pass station's clear
2808 * the join request to csr.
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002809 * @mac_handle: pointer to hal context.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002810 * @session_id: station's session id.
2811 *
2812 * This function will pass station's clear join request further down to csr
2813 * to cleanup.
2814 *
2815 * Return: true or false based on function's overall success.
2816 **/
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002817bool sme_clear_joinreq_param(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002818 uint32_t session_id)
2819{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002820 tpAniSirGlobal mac_ctx = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302821 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002822 bool ret_status = true;
2823
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302824 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002825 TRACE_CODE_SME_RX_HDD_CLEAR_JOIN_REQ,
2826 session_id, 0));
2827 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302828 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002829 if (false == csr_clear_joinreq_param(mac_ctx,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302830 session_id))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002831 ret_status = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002832 sme_release_global_lock(&mac_ctx->sme);
2833 } else {
2834 ret_status = false;
2835 }
2836
2837 return ret_status;
2838}
2839
2840/**
2841 * sme_issue_stored_joinreq() - This function will issues station's stored
2842 * the join request to csr.
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002843 * @mac_handle: pointer to hal context.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002844 * @roam_id: reference to roam_id variable being passed.
2845 * @session_id: station's session id.
2846 *
2847 * This function will issue station's stored join request further down to csr
2848 * to proceed forward.
2849 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302850 * Return: QDF_STATUS_SUCCESS or QDF_STATUS_E_FAILURE.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002851 **/
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002852QDF_STATUS sme_issue_stored_joinreq(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002853 uint32_t *roam_id,
2854 uint32_t session_id)
2855{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002856 tpAniSirGlobal mac_ctx = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302857 QDF_STATUS status = QDF_STATUS_E_FAILURE;
2858 QDF_STATUS ret_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002859
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302860 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002861 TRACE_CODE_SME_RX_HDD_ISSUE_JOIN_REQ,
2862 session_id, 0));
2863 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302864 if (QDF_STATUS_SUCCESS == status) {
2865 if (QDF_STATUS_SUCCESS != csr_issue_stored_joinreq(mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002866 roam_id,
2867 session_id)) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302868 ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002869 }
2870 sme_release_global_lock(&mac_ctx->sme);
2871 } else {
2872 csr_clear_joinreq_param(mac_ctx, session_id);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302873 ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002874 }
2875 return ret_status;
2876}
2877
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302878/*
2879 * sme_scan_flush_result() -
2880 * A wrapper function to request CSR to clear scan results.
2881 * This is a synchronous call
2882 *
2883 * Return QDF_STATUS
2884 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002885QDF_STATUS sme_scan_flush_result(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002886{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302887 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002888 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002889
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302890 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002891 TRACE_CODE_SME_RX_HDD_MSG_SCAN_FLUSH_RESULTS,
2892 0, 0));
2893 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302894 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnsona1a36512018-06-10 18:20:55 -07002895 status = csr_scan_flush_result(pMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002896 sme_release_global_lock(&pMac->sme);
2897 }
2898
2899 return status;
2900}
2901
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302902/*
2903 * sme_filter_scan_results() -
2904 * A wrapper function to request CSR to clear scan results.
2905 * This is a synchronous call
2906 *
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08002907 * mac_handle_t - HAL context handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302908 * sessionId - session id
2909 * Return QDF_STATUS
2910 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002911QDF_STATUS sme_filter_scan_results(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002912{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302913 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002914 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002915
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302916 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002917 TRACE_CODE_SME_RX_HDD_MSG_SCAN_FLUSH_RESULTS,
2918 sessionId, 0));
2919 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302920 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002921 csr_scan_filter_results(pMac);
2922 sme_release_global_lock(&pMac->sme);
2923 }
2924
2925 return status;
2926}
2927
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002928QDF_STATUS sme_scan_flush_p2p_result(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002929{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302930 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002931 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002932
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302933 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002934 TRACE_CODE_SME_RX_HDD_MSG_SCAN_FLUSH_P2PRESULTS,
2935 sessionId, 0));
2936 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302937 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson1d3f8672018-06-10 18:24:15 -07002938 status = csr_scan_flush_selective_result(pMac, true);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002939 sme_release_global_lock(&pMac->sme);
2940 }
2941
2942 return status;
2943}
2944
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302945/*
2946 * sme_scan_result_get_first() -
2947 * A wrapper function to request CSR to returns the first element of
2948 * scan result.
2949 * This is a synchronous call
2950 *
2951 * hScanResult - returned from csr_scan_get_result
2952 * Return tCsrScanResultInfo * - NULL if no result
2953 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002954tCsrScanResultInfo *sme_scan_result_get_first(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002955 tScanResultHandle hScanResult)
2956{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302957 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002958 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002959 tCsrScanResultInfo *pRet = NULL;
2960
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302961 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002962 TRACE_CODE_SME_RX_HDD_MSG_SCAN_RESULT_GETFIRST,
2963 NO_SESSION, 0));
2964 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302965 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002966 pRet = csr_scan_result_get_first(pMac, hScanResult);
2967 sme_release_global_lock(&pMac->sme);
2968 }
2969
2970 return pRet;
2971}
2972
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302973/*
2974 * sme_scan_result_get_next() -
2975 * A wrapper function to request CSR to returns the next element of
2976 * scan result. It can be called without calling csr_scan_result_get_first first
2977 * This is a synchronous call
2978 *
2979 * hScanResult - returned from csr_scan_get_result
2980 * Return Null if no result or reach the end
2981 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002982tCsrScanResultInfo *sme_scan_result_get_next(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002983 tScanResultHandle hScanResult)
2984{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302985 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002986 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002987 tCsrScanResultInfo *pRet = NULL;
2988
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002989 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302990 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002991 pRet = csr_scan_result_get_next(pMac, hScanResult);
2992 sme_release_global_lock(&pMac->sme);
2993 }
2994
2995 return pRet;
2996}
2997
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302998/*
2999 * sme_scan_result_purge() -
3000 * A wrapper function to request CSR to remove all items(tCsrScanResult)
3001 * in the list and free memory for each item
3002 * This is a synchronous call
3003 *
3004 * hScanResult - returned from csr_scan_get_result. hScanResult is
3005 * considered gone by
3006 * calling this function and even before this function reutrns.
3007 * Return QDF_STATUS
3008 */
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07003009QDF_STATUS sme_scan_result_purge(tScanResultHandle hScanResult)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003010{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303011 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07003012 tpAniSirGlobal mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003013
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303014 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003015 TRACE_CODE_SME_RX_HDD_MSG_SCAN_RESULT_PURGE,
3016 NO_SESSION, 0));
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07003017 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303018 if (QDF_IS_STATUS_SUCCESS(status)) {
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07003019 status = csr_scan_result_purge(mac_ctx, hScanResult);
3020 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003021 }
3022
3023 return status;
3024}
3025
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003026eCsrPhyMode sme_get_phy_mode(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003027{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003028 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303029
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003030 return pMac->roam.configParam.phyMode;
3031}
3032
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303033/*
jiadbdefb252018-01-03 14:27:06 +08003034 * sme_get_channel_bonding_mode5_g() - get the channel bonding mode for 5G band
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303035 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003036 * mac_handle - HAL handle
jiadbdefb252018-01-03 14:27:06 +08003037 * mode - channel bonding mode
3038 *
3039 * Return QDF_STATUS
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303040 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003041QDF_STATUS sme_get_channel_bonding_mode5_g(mac_handle_t mac_handle,
3042 uint32_t *mode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003043{
jiadbdefb252018-01-03 14:27:06 +08003044 tSmeConfigParams *smeConfig;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003045
jiadbdefb252018-01-03 14:27:06 +08003046 if (!mode) {
3047 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
3048 "%s: invalid mode", __func__);
3049 return QDF_STATUS_E_FAILURE;
3050 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003051
jiadbdefb252018-01-03 14:27:06 +08003052 smeConfig = qdf_mem_malloc(sizeof(*smeConfig));
Arif Hussain0ef77082018-10-10 16:42:53 -07003053 if (!smeConfig)
jiadbdefb252018-01-03 14:27:06 +08003054 return QDF_STATUS_E_NOMEM;
jiadbdefb252018-01-03 14:27:06 +08003055
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003056 if (sme_get_config_param(mac_handle, smeConfig) != QDF_STATUS_SUCCESS) {
jiadbdefb252018-01-03 14:27:06 +08003057 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
3058 "%s: sme_get_config_param failed", __func__);
3059 qdf_mem_free(smeConfig);
3060 return QDF_STATUS_E_FAILURE;
3061 }
3062
3063 *mode = smeConfig->csrConfig.channelBondingMode5GHz;
3064 qdf_mem_free(smeConfig);
3065
3066 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003067}
3068
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303069/*
jiadbdefb252018-01-03 14:27:06 +08003070 * sme_get_channel_bonding_mode24_g() - get the channel bonding mode for 2.4G
3071 * band
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303072 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003073 * mac_handle - HAL handle
jiadbdefb252018-01-03 14:27:06 +08003074 * mode - channel bonding mode
3075 *
3076 * Return QDF_STATUS
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303077 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003078QDF_STATUS sme_get_channel_bonding_mode24_g(mac_handle_t mac_handle,
3079 uint32_t *mode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003080{
jiadbdefb252018-01-03 14:27:06 +08003081 tSmeConfigParams *smeConfig;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003082
jiadbdefb252018-01-03 14:27:06 +08003083 if (!mode) {
3084 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
3085 "%s: invalid mode", __func__);
3086 return QDF_STATUS_E_FAILURE;
3087 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003088
jiadbdefb252018-01-03 14:27:06 +08003089 smeConfig = qdf_mem_malloc(sizeof(*smeConfig));
Arif Hussain0ef77082018-10-10 16:42:53 -07003090 if (!smeConfig)
jiadbdefb252018-01-03 14:27:06 +08003091 return QDF_STATUS_E_NOMEM;
jiadbdefb252018-01-03 14:27:06 +08003092
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003093 if (sme_get_config_param(mac_handle, smeConfig) != QDF_STATUS_SUCCESS) {
jiadbdefb252018-01-03 14:27:06 +08003094 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
3095 "%s: sme_get_config_param failed", __func__);
3096 qdf_mem_free(smeConfig);
3097 return QDF_STATUS_E_FAILURE;
3098 }
3099
3100 *mode = smeConfig->csrConfig.channelBondingMode24GHz;
3101 qdf_mem_free(smeConfig);
3102
3103 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003104}
3105
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303106/*
3107 * sme_roam_connect() -
3108 * A wrapper function to request CSR to inititiate an association
3109 * This is an asynchronous call.
3110 *
3111 * sessionId - the sessionId returned by sme_open_session.
3112 * pProfile - description of the network to which to connect
3113 * hBssListIn - a list of BSS descriptor to roam to. It is returned
3114 * from csr_scan_get_result
3115 * pRoamId - to get back the request ID
3116 * Return QDF_STATUS
3117 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003118QDF_STATUS sme_roam_connect(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07003119 struct csr_roam_profile *pProfile,
3120 uint32_t *pRoamId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003121{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303122 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003123 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003124
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303125 if (!pMac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303126 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003127
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303128 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003129 TRACE_CODE_SME_RX_HDD_MSG_CONNECT, sessionId, 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003130 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303131 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003132 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
3133 status =
3134 csr_roam_connect(pMac, sessionId, pProfile,
3135 pRoamId);
3136 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003137 sme_err("Invalid sessionID: %d", sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303138 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003139 }
3140 sme_release_global_lock(&pMac->sme);
3141 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003142 sme_err("sme_acquire_global_lock failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003143 }
3144
3145 return status;
3146}
3147
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303148/*
3149 * sme_set_phy_mode() -
3150 * Changes the PhyMode.
3151 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003152 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303153 * phyMode new phyMode which is to set
3154 * Return QDF_STATUS SUCCESS.
3155 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003156QDF_STATUS sme_set_phy_mode(mac_handle_t mac_handle, eCsrPhyMode phyMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003157{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003158 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003159
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003160 pMac->roam.configParam.phyMode = phyMode;
3161 pMac->roam.configParam.uCfgDot11Mode =
3162 csr_get_cfg_dot11_mode_from_csr_phy_mode(NULL,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303163 pMac->roam.configParam.phyMode,
3164 pMac->roam.configParam.
3165 ProprietaryRatesEnabled);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003166
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303167 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003168}
3169
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303170/*
3171 * sme_roam_reassoc() -
3172 * A wrapper function to request CSR to inititiate a re-association
3173 *
3174 * pProfile - can be NULL to join the currently connected AP. In that
3175 * case modProfileFields should carry the modified field(s) which could trigger
3176 * reassoc
3177 * modProfileFields - fields which are part of tCsrRoamConnectedProfile
3178 * that might need modification dynamically once STA is up & running and this
3179 * could trigger a reassoc
3180 * pRoamId - to get back the request ID
3181 * Return QDF_STATUS
3182 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003183QDF_STATUS sme_roam_reassoc(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07003184 struct csr_roam_profile *pProfile,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003185 tCsrRoamModifyProfileFields modProfileFields,
3186 uint32_t *pRoamId, bool fForce)
3187{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303188 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003189 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003190
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303191 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003192 TRACE_CODE_SME_RX_HDD_ROAM_REASSOC, sessionId, 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003193 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303194 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003195 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303196 if ((NULL == pProfile) && (fForce == 1))
3197 status = csr_reassoc(pMac, sessionId,
3198 &modProfileFields, pRoamId,
3199 fForce);
3200 else
3201 status = csr_roam_reassoc(pMac, sessionId,
3202 pProfile,
3203 modProfileFields, pRoamId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003204 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303205 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003206 }
3207 sme_release_global_lock(&pMac->sme);
3208 }
3209
3210 return status;
3211}
3212
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303213/*
3214 * sme_roam_connect_to_last_profile() -
3215 * A wrapper function to request CSR to disconnect and reconnect with
3216 * the same profile
3217 * This is an asynchronous call.
3218 *
3219 * Return QDF_STATUS. It returns fail if currently connected
3220 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003221QDF_STATUS sme_roam_connect_to_last_profile(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08003222 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003223{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303224 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003225 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003226
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303227 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003228 TRACE_CODE_SME_RX_HDD_ROAM_GET_CONNECTPROFILE,
3229 sessionId, 0));
3230 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303231 if (QDF_IS_STATUS_SUCCESS(status)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303232 if (CSR_IS_SESSION_VALID(pMac, sessionId))
3233 status = csr_roam_connect_to_last_profile(pMac,
3234 sessionId);
3235 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303236 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003237 sme_release_global_lock(&pMac->sme);
3238 }
3239
3240 return status;
3241}
3242
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08003243QDF_STATUS sme_roam_disconnect(mac_handle_t hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003244 eCsrRoamDisconnectReason reason)
3245{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303246 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07003247 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003248
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303249 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07003250 TRACE_CODE_SME_RX_HDD_ROAM_DISCONNECT, session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003251 reason));
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07003252 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303253 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07003254 if (CSR_IS_SESSION_VALID(mac_ctx, session_id))
3255 status = csr_roam_disconnect(mac_ctx, session_id,
3256 reason);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303257 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303258 status = QDF_STATUS_E_INVAL;
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07003259 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003260 }
3261
3262 return status;
3263}
3264
Abhishek Singhca408032016-09-13 15:26:12 +05303265/* sme_dhcp_done_ind() - send dhcp done ind
3266 * @hal: hal context
3267 * @session_id: session id
3268 *
3269 * Return: void.
3270 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08003271void sme_dhcp_done_ind(mac_handle_t hal, uint8_t session_id)
Abhishek Singhca408032016-09-13 15:26:12 +05303272{
3273 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05303274 struct csr_roam_session *session;
Abhishek Singhca408032016-09-13 15:26:12 +05303275
3276 if (!mac_ctx)
3277 return;
3278
3279 session = CSR_GET_SESSION(mac_ctx, session_id);
3280 if (!session) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003281 sme_err("Session: %d not found", session_id);
Abhishek Singhca408032016-09-13 15:26:12 +05303282 return;
3283 }
3284 session->dhcp_done = true;
3285}
3286
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303287/*
3288 * sme_roam_stop_bss() -
3289 * To stop BSS for Soft AP. This is an asynchronous API.
3290 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003291 * mac_handle - Global structure
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303292 * sessionId - sessionId of SoftAP
3293 * Return QDF_STATUS SUCCESS Roam callback will be called to indicate
3294 * actual results
3295 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003296QDF_STATUS sme_roam_stop_bss(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003297{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303298 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003299 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003300
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003301 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303302 if (QDF_IS_STATUS_SUCCESS(status)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303303 if (CSR_IS_SESSION_VALID(pMac, sessionId))
3304 status = csr_roam_issue_stop_bss_cmd(pMac, sessionId,
Himanshu Agarwal75c8d792017-12-19 18:31:04 +05303305 false);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303306 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303307 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003308 sme_release_global_lock(&pMac->sme);
3309 }
3310
3311 return status;
3312}
3313
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05303314/**
3315 * sme_roam_disconnect_sta() - disassociate a station
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003316 * @mac_handle: Global structure
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05303317 * @sessionId: SessionId of SoftAP
3318 * @p_del_sta_params: Pointer to parameters of the station to disassoc
3319 *
3320 * To disassociate a station. This is an asynchronous API.
3321 *
3322 * Return: QDF_STATUS_SUCCESS on success.Roam callback will
3323 * be called to indicate actual result.
3324 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003325QDF_STATUS sme_roam_disconnect_sta(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnsone6bf7192017-11-07 15:16:09 -08003326 struct csr_del_sta_params *p_del_sta_params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003327{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303328 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003329 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003330
3331 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303332 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003333 return status;
3334 }
3335
3336 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303337 if (QDF_IS_STATUS_SUCCESS(status)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303338 if (CSR_IS_SESSION_VALID(pMac, sessionId))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003339 status = csr_roam_issue_disassociate_sta_cmd(pMac,
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05303340 sessionId, p_del_sta_params);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303341 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303342 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003343 sme_release_global_lock(&pMac->sme);
3344 }
3345
3346 return status;
3347}
3348
3349/**
3350 * sme_roam_deauth_sta() - deauthenticate a station
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003351 * @mac_handle: Global structure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003352 * @sessionId: SessionId of SoftAP
3353 * @pDelStaParams: Pointer to parameters of the station to deauthenticate
3354 *
3355 * To disassociate a station. This is an asynchronous API.
3356 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303357 * Return: QDF_STATUS_SUCCESS on success or another QDF_STATUS error
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003358 * code on error. Roam callback will be called to indicate actual
3359 * result
3360 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003361QDF_STATUS sme_roam_deauth_sta(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnsone6bf7192017-11-07 15:16:09 -08003362 struct csr_del_sta_params *pDelStaParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003363{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303364 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003365 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003366
3367 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303368 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003369 return status;
3370 }
3371
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303372 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05303373 TRACE_CODE_SME_RX_HDD_MSG_DEAUTH_STA,
3374 sessionId, pDelStaParams->reason_code));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003375 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303376 if (QDF_IS_STATUS_SUCCESS(status)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303377 if (CSR_IS_SESSION_VALID(pMac, sessionId))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003378 status =
3379 csr_roam_issue_deauth_sta_cmd(pMac, sessionId,
3380 pDelStaParams);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303381 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303382 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003383 sme_release_global_lock(&pMac->sme);
3384 }
3385
3386 return status;
3387}
3388
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303389/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303390 * sme_roam_get_associated_stas() -
3391 * To probe the list of associated stations from various modules
3392 * of CORE stack.
3393 * This is an asynchronous API.
3394 *
3395 * sessionId - sessionId of SoftAP
3396 * modId - Module from whom list of associtated stations is
3397 * to be probed. If an invalid module is passed then
3398 * by default QDF_MODULE_ID_PE will be probed.
3399 * pUsrContext - Opaque HDD context
3400 * pfnSapEventCallback - Sap event callback in HDD
3401 * pAssocBuf - Caller allocated memory to be filled with associatd
3402 * stations info
3403 * Return QDF_STATUS
3404 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003405QDF_STATUS sme_roam_get_associated_stas(mac_handle_t mac_handle,
3406 uint8_t sessionId,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303407 QDF_MODULE_ID modId, void *pUsrContext,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003408 void *pfnSapEventCallback,
3409 uint8_t *pAssocStasBuf)
3410{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303411 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003412 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003413
3414 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303415 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003416 return status;
3417 }
3418
3419 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303420 if (QDF_IS_STATUS_SUCCESS(status)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303421 if (CSR_IS_SESSION_VALID(pMac, sessionId))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003422 status =
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303423 csr_roam_get_associated_stas(pMac, sessionId,
3424 modId,
3425 pUsrContext,
3426 pfnSapEventCallback,
3427 pAssocStasBuf);
3428 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303429 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003430 sme_release_global_lock(&pMac->sme);
3431 }
3432
3433 return status;
3434}
3435
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303436/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303437 * sme_roam_get_connect_state() -
3438 * A wrapper function to request CSR to return the current connect state
3439 * of Roaming
3440 * This is a synchronous call.
3441 *
3442 * Return QDF_STATUS
3443 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003444QDF_STATUS sme_roam_get_connect_state(mac_handle_t mac_handle,
3445 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003446 eCsrConnectState *pState)
3447{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303448 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003449 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003450
3451 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303452 if (QDF_IS_STATUS_SUCCESS(status)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303453 if (CSR_IS_SESSION_VALID(pMac, sessionId))
3454 status = csr_roam_get_connect_state(pMac, sessionId,
3455 pState);
3456 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303457 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003458 sme_release_global_lock(&pMac->sme);
3459 }
3460
3461 return status;
3462}
3463
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303464/*
3465 * sme_roam_get_connect_profile() -
3466 * A wrapper function to request CSR to return the current connect
3467 * profile. Caller must call csr_roam_free_connect_profile after it is done
3468 * and before reuse for another csr_roam_get_connect_profile call.
3469 * This is a synchronous call.
3470 *
3471 * pProfile - pointer to a caller allocated structure
3472 * tCsrRoamConnectedProfile
3473 * eturn QDF_STATUS. Failure if not connected
3474 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003475QDF_STATUS sme_roam_get_connect_profile(mac_handle_t mac_handle,
3476 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003477 tCsrRoamConnectedProfile *pProfile)
3478{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303479 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003480 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003481
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303482 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003483 TRACE_CODE_SME_RX_HDD_ROAM_GET_CONNECTPROFILE,
3484 sessionId, 0));
3485 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303486 if (QDF_IS_STATUS_SUCCESS(status)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303487 if (CSR_IS_SESSION_VALID(pMac, sessionId))
3488 status = csr_roam_get_connect_profile(pMac, sessionId,
3489 pProfile);
3490 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303491 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003492 sme_release_global_lock(&pMac->sme);
3493 }
3494
3495 return status;
3496}
3497
Naveen Rawatdf0a7e72016-01-06 18:35:53 -08003498/**
3499 * sme_roam_free_connect_profile - a wrapper function to request CSR to free and
3500 * reinitialize the profile returned previously by csr_roam_get_connect_profile.
3501 *
3502 * @profile - pointer to a caller allocated structure tCsrRoamConnectedProfile
3503 *
3504 * Return: none
3505 */
3506void sme_roam_free_connect_profile(tCsrRoamConnectedProfile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003507{
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303508 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003509 TRACE_CODE_SME_RX_HDD_ROAM_FREE_CONNECTPROFILE,
3510 NO_SESSION, 0));
Naveen Rawatdf0a7e72016-01-06 18:35:53 -08003511 csr_roam_free_connect_profile(profile);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003512}
3513
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303514/*
3515 * sme_roam_set_pmkid_cache() -
3516 * A wrapper function to request CSR to return the PMKID candidate list
3517 * This is a synchronous call.
3518
3519 * pPMKIDCache - caller allocated buffer point to an array of
3520 * tPmkidCacheInfo
3521 * numItems - a variable that has the number of tPmkidCacheInfo
3522 * allocated when retruning, this is either the number needed
3523 * or number of items put into pPMKIDCache
3524 * update_entire_cache - this bool value specifies if the entire pmkid
3525 * cache should be overwritten or should it be
3526 * updated entry by entry.
3527 * Return QDF_STATUS - when fail, it usually means the buffer allocated is not
3528 * big enough and pNumItems has the number of
3529 * tPmkidCacheInfo.
3530 * \Note: pNumItems is a number of tPmkidCacheInfo,
3531 * not sizeof(tPmkidCacheInfo) * something
3532 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003533QDF_STATUS sme_roam_set_pmkid_cache(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003534 tPmkidCacheInfo *pPMKIDCache,
3535 uint32_t numItems, bool update_entire_cache)
3536{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303537 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003538 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003539
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303540 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003541 TRACE_CODE_SME_RX_HDD_ROAM_SET_PMKIDCACHE, sessionId,
3542 numItems));
3543 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303544 if (QDF_IS_STATUS_SUCCESS(status)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303545 if (CSR_IS_SESSION_VALID(pMac, sessionId))
3546 status = csr_roam_set_pmkid_cache(pMac, sessionId,
3547 pPMKIDCache,
3548 numItems, update_entire_cache);
3549 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303550 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003551 sme_release_global_lock(&pMac->sme);
3552 }
3553
3554 return status;
3555}
3556
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003557QDF_STATUS sme_roam_del_pmkid_from_cache(mac_handle_t mac_handle,
3558 uint8_t sessionId,
Sridhar Selvarajc3684c72017-08-21 14:32:47 +05303559 tPmkidCacheInfo *pmksa,
3560 bool flush_cache)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003561{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303562 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003563 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05303564
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303565 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05303566 TRACE_CODE_SME_RX_HDD_ROAM_DEL_PMKIDCACHE,
3567 sessionId, flush_cache));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003568 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303569 if (QDF_IS_STATUS_SUCCESS(status)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303570 if (CSR_IS_SESSION_VALID(pMac, sessionId))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003571 status = csr_roam_del_pmkid_from_cache(pMac, sessionId,
Sridhar Selvarajc3684c72017-08-21 14:32:47 +05303572 pmksa, flush_cache);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303573 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303574 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003575 sme_release_global_lock(&pMac->sme);
3576 }
3577 return status;
3578}
3579
Abhinav Kumar7830d9c2018-06-27 17:57:48 +05303580#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08003581void sme_get_pmk_info(mac_handle_t hal, uint8_t session_id,
gaurank kathpalia99d06c12018-05-16 16:28:35 +05303582 tPmkidCacheInfo *pmk_cache)
3583{
3584 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
3585 QDF_STATUS status = sme_acquire_global_lock(&mac_ctx->sme);
3586
3587 if (QDF_IS_STATUS_SUCCESS(status)) {
3588 if (CSR_IS_SESSION_VALID(mac_ctx, session_id))
3589 csr_get_pmk_info(mac_ctx, session_id, pmk_cache);
3590 sme_release_global_lock(&mac_ctx->sme);
3591 }
3592}
Abhinav Kumar7830d9c2018-06-27 17:57:48 +05303593#else
3594static inline
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08003595void sme_get_pmk_info(mac_handle_t hal, uint8_t session_id,
Abhinav Kumar7830d9c2018-06-27 17:57:48 +05303596 tPmkidCacheInfo *pmk_cache)
3597{}
3598#endif
3599
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003600#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303601/*
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003602 * \fn sme_roam_set_psk_pmk
3603 * \brief a wrapper function to request CSR to save PSK/PMK
3604 * This is a synchronous call.
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003605 * \param mac_handle - Global structure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003606 * \param sessionId - SME sessionId
3607 * \param pPSK_PMK - pointer to an array of Psk[]/Pmk
3608 * \param pmk_len - Length could be only 16 bytes in case if LEAP
3609 * connections. Need to pass this information to
3610 * firmware.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303611 * \return QDF_STATUS -status whether PSK/PMK is set or not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003612 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003613QDF_STATUS sme_roam_set_psk_pmk(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003614 uint8_t *pPSK_PMK, size_t pmk_len)
3615{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303616 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003617 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303618
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003619 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303620 if (QDF_IS_STATUS_SUCCESS(status)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303621 if (CSR_IS_SESSION_VALID(pMac, sessionId))
3622 status = csr_roam_set_psk_pmk(pMac, sessionId, pPSK_PMK,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003623 pmk_len);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303624 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303625 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003626 sme_release_global_lock(&pMac->sme);
3627 }
3628 return status;
3629}
3630#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003631
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08003632QDF_STATUS sme_roam_get_wpa_rsn_req_ie(mac_handle_t hal, uint8_t session_id,
Jeff Johnson0a078b52018-06-01 16:15:54 -07003633 uint32_t *len, uint8_t *buf)
3634{
3635 QDF_STATUS status;
3636 tpAniSirGlobal mac = PMAC_STRUCT(hal);
3637
3638 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303639 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson0a078b52018-06-01 16:15:54 -07003640 if (CSR_IS_SESSION_VALID(mac, session_id))
3641 status = csr_roam_get_wpa_rsn_req_ie(mac, session_id,
3642 len, buf);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303643 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303644 status = QDF_STATUS_E_INVAL;
Jeff Johnson0a078b52018-06-01 16:15:54 -07003645 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003646 }
3647
3648 return status;
3649}
3650
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08003651QDF_STATUS sme_roam_get_wpa_rsn_rsp_ie(mac_handle_t hal, uint8_t session_id,
Jeff Johnson0a078b52018-06-01 16:15:54 -07003652 uint32_t *len, uint8_t *buf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003653{
Jeff Johnson0a078b52018-06-01 16:15:54 -07003654 QDF_STATUS status;
3655 tpAniSirGlobal mac = PMAC_STRUCT(hal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003656
Jeff Johnson0a078b52018-06-01 16:15:54 -07003657 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303658 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson0a078b52018-06-01 16:15:54 -07003659 if (CSR_IS_SESSION_VALID(mac, session_id))
3660 status = csr_roam_get_wpa_rsn_rsp_ie(mac, session_id,
3661 len, buf);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303662 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303663 status = QDF_STATUS_E_INVAL;
Jeff Johnson0a078b52018-06-01 16:15:54 -07003664 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003665 }
3666
3667 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003668}
3669
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303670/*
3671 * sme_roam_get_num_pmkid_cache() -
3672 * A wrapper function to request CSR to return number of PMKID cache
3673 * entries
3674 * This is a synchronous call.
3675 *
3676 * Return uint32_t - the number of PMKID cache entries
3677 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003678uint32_t sme_roam_get_num_pmkid_cache(mac_handle_t mac_handle,
3679 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003680{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303681 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003682 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003683 uint32_t numPmkidCache = 0;
3684
3685 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303686 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003687 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
3688 numPmkidCache =
3689 csr_roam_get_num_pmkid_cache(pMac, sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303690 status = QDF_STATUS_SUCCESS;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303691 } else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303692 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003693 sme_release_global_lock(&pMac->sme);
3694 }
3695
3696 return numPmkidCache;
3697}
3698
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303699/*
3700 * sme_roam_get_pmkid_cache() -
3701 * A wrapper function to request CSR to return PMKID cache from CSR
3702 * This is a synchronous call.
3703 *
3704 * pNum - caller allocated memory that has the space of the number of
3705 * pBuf tPmkidCacheInfo as input. Upon returned, *pNum has the
3706 * needed or actually number in tPmkidCacheInfo.
3707 * pPmkidCache - Caller allocated memory that contains PMKID cache, if
3708 * any, upon return
3709 * Return QDF_STATUS - when fail, it usually means the buffer allocated is not
3710 * big enough
3711 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003712QDF_STATUS sme_roam_get_pmkid_cache(mac_handle_t mac_handle, uint8_t sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303713 uint32_t *pNum, tPmkidCacheInfo *pPmkidCache)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003714{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303715 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003716 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003717
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303718 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003719 TRACE_CODE_SME_RX_HDD_ROAM_GET_PMKIDCACHE, sessionId,
3720 0));
3721 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303722 if (QDF_IS_STATUS_SUCCESS(status)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303723 if (CSR_IS_SESSION_VALID(pMac, sessionId))
3724 status = csr_roam_get_pmkid_cache(pMac, sessionId, pNum,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003725 pPmkidCache);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303726 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303727 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003728 sme_release_global_lock(&pMac->sme);
3729 }
3730
3731 return status;
3732}
3733
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303734/*
3735 * sme_get_config_param() -
3736 * A wrapper function that HDD calls to get the global settings
3737 * currently maintained by CSR.
3738 * This is a synchronous call.
3739 *
3740 * pParam - caller allocated memory
3741 * Return QDF_STATUS
3742 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003743QDF_STATUS sme_get_config_param(mac_handle_t mac_handle,
3744 tSmeConfigParams *pParam)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003745{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303746 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003747 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003748
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303749 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003750 TRACE_CODE_SME_RX_HDD_GET_CONFIGPARAM, NO_SESSION, 0));
3751 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303752 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003753 status = csr_get_config_param(pMac, &pParam->csrConfig);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303754 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003755 sme_err("csr_get_config_param failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003756 sme_release_global_lock(&pMac->sme);
3757 return status;
3758 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303759 qdf_mem_copy(&pParam->rrmConfig,
Krunal Soni1878d3a2016-01-14 13:00:44 -08003760 &pMac->rrm.rrmSmeContext.rrmConfig,
3761 sizeof(pMac->rrm.rrmSmeContext.rrmConfig));
Kapil Guptaab7961d2017-06-06 13:54:09 +05303762 pParam->snr_monitor_enabled = pMac->snr_monitor_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003763 sme_release_global_lock(&pMac->sme);
3764 }
3765
3766 return status;
3767}
3768
3769/**
3770 * sme_cfg_set_int() - Sets the cfg parameter value.
3771 * @hal: Handle to hal.
3772 * @cfg_id: Configuration parameter ID.
Jeff Johnson560dc562017-03-17 15:19:31 -07003773 * @value: value to be saved in the cfg parameter.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003774 *
3775 * This function sets the string value in cfg parameter.
3776 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303777 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003778 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08003779QDF_STATUS sme_cfg_set_int(mac_handle_t hal, uint16_t cfg_id, uint32_t value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003780{
3781 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303782 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003783
Jeff Johnsonc09caa42018-06-07 22:58:55 -07003784 if (QDF_STATUS_SUCCESS != cfg_set_int(pmac, cfg_id, value))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303785 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003786
3787 return status;
3788}
3789
3790/**
3791 * sme_cfg_set_str() - Sets the cfg parameter string.
3792 * @hal: Handle to hal.
3793 * @cfg_id: Configuration parameter ID.
3794 * @str: Pointer to the string buffer.
3795 * @length: Length of the string.
3796 *
3797 * This function sets the string value in cfg parameter.
3798 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303799 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003800 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08003801QDF_STATUS sme_cfg_set_str(mac_handle_t hal, uint16_t cfg_id, uint8_t *str,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003802 uint32_t length)
3803{
3804 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303805 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003806
Jeff Johnsonc09caa42018-06-07 22:58:55 -07003807 if (QDF_STATUS_SUCCESS != cfg_set_str(pmac, cfg_id, str, length))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303808 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003809
3810 return status;
3811}
3812
3813/**
3814 * sme_cfg_get_int() - Gets the cfg parameter value.
3815 * @hal: Handle to hal.
3816 * @cfg_id: Configuration parameter ID.
3817 * @cfg_value: Pointer to variable in which cfg value
Jeff Johnson560dc562017-03-17 15:19:31 -07003818 * will be saved.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003819 *
3820 * This function gets the value of the cfg parameter.
3821 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303822 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003823 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08003824QDF_STATUS sme_cfg_get_int(mac_handle_t hal, uint16_t cfg_id,
3825 uint32_t *cfg_value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003826{
3827 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303828 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003829
Jeff Johnsonc09caa42018-06-07 22:58:55 -07003830 if (QDF_STATUS_SUCCESS != wlan_cfg_get_int(pmac, cfg_id, cfg_value))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303831 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003832
3833 return status;
3834}
3835
3836/**
3837 * sme_cfg_get_str() - Gets the cfg parameter string.
3838 * @hal: Handle to hal.
3839 * @cfg_id: Configuration parameter ID.
3840 * @str: Pointer to the string buffer.
3841 * @length: Pointer to length of the string.
3842 *
3843 * This function gets the string value of the cfg parameter.
3844 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303845 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003846 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08003847QDF_STATUS sme_cfg_get_str(mac_handle_t hal, uint16_t cfg_id, uint8_t *str,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003848 uint32_t *length)
3849{
3850 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303851 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003852
Jeff Johnsonc09caa42018-06-07 22:58:55 -07003853 if (QDF_STATUS_SUCCESS != wlan_cfg_get_str(pmac, cfg_id, str, length))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303854 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003855
3856 return status;
3857}
3858
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303859/*
3860 * sme_get_modify_profile_fields() -
3861 * HDD or SME - QOS calls this function to get the current values of
3862 * connected profile fields, changing which can cause reassoc.
3863 * This function must be called after CFG is downloaded and STA is in connected
3864 * state. Also, make sure to call this function to get the current profile
3865 * fields before calling the reassoc. So that pModifyProfileFields will have
3866 * all the latest values plus the one(s) has been updated as part of reassoc
3867 * request.
3868 *
3869 * pModifyProfileFields - pointer to the connected profile fields
3870 * changing which can cause reassoc
3871 * Return QDF_STATUS
3872 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003873QDF_STATUS sme_get_modify_profile_fields(mac_handle_t mac_handle,
3874 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003875 tCsrRoamModifyProfileFields *
3876 pModifyProfileFields)
3877{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303878 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003879 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003880
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303881 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003882 TRACE_CODE_SME_RX_HDD_GET_MODPROFFIELDS, sessionId,
3883 0));
3884 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303885 if (QDF_IS_STATUS_SUCCESS(status)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303886 if (CSR_IS_SESSION_VALID(pMac, sessionId))
3887 status = csr_get_modify_profile_fields(pMac, sessionId,
3888 pModifyProfileFields);
3889 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303890 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003891 sme_release_global_lock(&pMac->sme);
3892 }
3893
3894 return status;
3895}
3896
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303897/*
3898 * sme_set_dhcp_till_power_active_flag() -
3899 * Sets/Clears DHCP related flag to disable/enable auto PS
3900 *
3901 * hal - The handle returned by mac_open.
3902 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08003903void sme_set_dhcp_till_power_active_flag(mac_handle_t hal, uint8_t flag)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003904{
3905 tpAniSirGlobal mac = PMAC_STRUCT(hal);
3906 struct ps_global_info *ps_global_info = &mac->sme.ps_global_info;
3907
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303908 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003909 TRACE_CODE_SME_RX_HDD_SET_DHCP_FLAG, NO_SESSION,
3910 flag));
3911 /* Set/Clear the DHCP flag which will disable/enable auto PS */
3912 ps_global_info->remain_in_power_active_till_dhcp = flag;
3913}
3914
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003915#ifdef FEATURE_OEM_DATA_SUPPORT
3916/**
3917 * sme_register_oem_data_rsp_callback() - Register a routine of
3918 * type send_oem_data_rsp_msg
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003919 * @mac_handle: Handle returned by mac_open.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003920 * @callback: Callback to send response
3921 * to oem application.
3922 *
3923 * sme_oem_data_rsp_callback is used to register sme_send_oem_data_rsp_msg
3924 * callback function.
3925 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303926 * Return: QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003927 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003928QDF_STATUS sme_register_oem_data_rsp_callback(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003929 sme_send_oem_data_rsp_msg callback)
3930{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303931 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003932 tpAniSirGlobal pmac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003933
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07003934 pmac->sme.oem_data_rsp_callback = callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003935
3936 return status;
3937
3938}
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303939
3940/**
3941 * sme_deregister_oem_data_rsp_callback() - De-register OEM datarsp callback
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003942 * @mac_handle: Handler return by mac_open
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303943 * This function De-registers the OEM data response callback to SME
3944 *
3945 * Return: None
3946 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003947void sme_deregister_oem_data_rsp_callback(mac_handle_t mac_handle)
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303948{
3949 tpAniSirGlobal pmac;
3950
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003951 if (!mac_handle) {
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303952 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003953 FL("mac_handle is not valid"));
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303954 return;
3955 }
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003956 pmac = PMAC_STRUCT(mac_handle);
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303957
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07003958 pmac->sme.oem_data_rsp_callback = NULL;
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303959}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003960
3961/**
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003962 * sme_oem_update_capability() - update UMAC's oem related capability.
3963 * @hal: Handle returned by mac_open
3964 * @oem_cap: pointer to oem_capability
3965 *
3966 * This function updates OEM capability to UMAC. Currently RTT
3967 * related capabilities are updated. More capabilities can be
3968 * added in future.
3969 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303970 * Return: QDF_STATUS
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003971 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08003972QDF_STATUS sme_oem_update_capability(mac_handle_t hal,
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003973 struct sme_oem_capability *cap)
3974{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303975 QDF_STATUS status = QDF_STATUS_SUCCESS;
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003976 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
3977 uint8_t *bytes;
3978
3979 bytes = pmac->rrm.rrmSmeContext.rrmConfig.rm_capability;
3980
3981 if (cap->ftm_rr)
3982 bytes[4] |= RM_CAP_FTM_RANGE_REPORT;
3983 if (cap->lci_capability)
3984 bytes[4] |= RM_CAP_CIVIC_LOC_MEASUREMENT;
3985
3986 return status;
3987}
3988
3989/**
3990 * sme_oem_get_capability() - get oem capability
3991 * @hal: Handle returned by mac_open
3992 * @oem_cap: pointer to oem_capability
3993 *
3994 * This function is used to get the OEM capability from UMAC.
3995 * Currently RTT related capabilities are received. More
3996 * capabilities can be added in future.
3997 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303998 * Return: QDF_STATUS
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003999 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08004000QDF_STATUS sme_oem_get_capability(mac_handle_t hal,
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004001 struct sme_oem_capability *cap)
4002{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304003 QDF_STATUS status = QDF_STATUS_SUCCESS;
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004004 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
4005 uint8_t *bytes;
4006
4007 bytes = pmac->rrm.rrmSmeContext.rrmConfig.rm_capability;
4008
4009 cap->ftm_rr = bytes[4] & RM_CAP_FTM_RANGE_REPORT;
4010 cap->lci_capability = bytes[4] & RM_CAP_CIVIC_LOC_MEASUREMENT;
4011
4012 return status;
4013}
Naveen Rawat910726a2017-03-06 11:42:51 -08004014#endif
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004015
4016/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004017 * sme_roam_set_key() - To set encryption key.
4018 * @hal: hal global context
4019 * @session_id: session id
4020 * @set_key: pointer to a caller allocated object of tCsrSetContextInfo
4021 * @ptr_roam_id: Upon success return, this is the id caller can use to
4022 * identify the request in roamcallback
4023 *
4024 * This function should be called only when connected. This is an asynchronous
4025 * API.
4026 *
4027 * Return: Status of operation
4028 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08004029QDF_STATUS sme_roam_set_key(mac_handle_t hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004030 tCsrRoamSetKey *set_key, uint32_t *ptr_roam_id)
4031{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304032 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004033 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
4034 uint32_t roam_id;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05304035 struct csr_roam_session *session = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004036 struct ps_global_info *ps_global_info = &mac_ctx->sme.ps_global_info;
4037
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304038 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_SET_KEY,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004039 session_id, 0));
4040 if (set_key->keyLength > CSR_MAX_KEY_LEN) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004041 sme_err("Invalid key length: %d", set_key->keyLength);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304042 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004043 }
4044 /*Once Setkey is done, we can go in BMPS */
4045 if (set_key->keyLength)
4046 ps_global_info->remain_in_power_active_till_dhcp = false;
4047
4048 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304049 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004050 return status;
4051
4052 roam_id = GET_NEXT_ROAM_ID(&mac_ctx->roam);
4053 if (ptr_roam_id)
4054 *ptr_roam_id = roam_id;
4055
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004056 sme_debug("keyLength: %d", set_key->keyLength);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004057
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004058 sme_debug("Session_id: %d roam_id: %d", session_id, roam_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004059 session = CSR_GET_SESSION(mac_ctx, session_id);
4060 if (!session) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004061 sme_err("session %d not found", session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004062 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304063 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004064 }
4065 if (CSR_IS_INFRA_AP(&session->connectedProfile)
4066 && set_key->keyDirection == eSIR_TX_DEFAULT) {
4067 if ((eCSR_ENCRYPT_TYPE_WEP40 == set_key->encType)
4068 || (eCSR_ENCRYPT_TYPE_WEP40_STATICKEY ==
4069 set_key->encType)) {
4070 session->pCurRoamProfile->negotiatedUCEncryptionType =
4071 eCSR_ENCRYPT_TYPE_WEP40_STATICKEY;
4072 }
4073 if ((eCSR_ENCRYPT_TYPE_WEP104 == set_key->encType)
4074 || (eCSR_ENCRYPT_TYPE_WEP104_STATICKEY ==
4075 set_key->encType)) {
4076 session->pCurRoamProfile->negotiatedUCEncryptionType =
4077 eCSR_ENCRYPT_TYPE_WEP104_STATICKEY;
4078 }
4079 }
4080 status = csr_roam_set_key(mac_ctx, session_id, set_key, roam_id);
4081 sme_release_global_lock(&mac_ctx->sme);
4082 return status;
4083}
4084
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05304085/**
4086 * sme_roam_set_default_key_index - To set default wep key idx
4087 * @hal: pointer to hal handler
4088 * @session_id: session id
4089 * @default_idx: default wep key index
4090 *
4091 * This function prepares a message and post to WMA to set wep default
4092 * key index
4093 *
4094 * Return: Success:QDF_STATUS_SUCCESS Failure: Error value
4095 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08004096QDF_STATUS sme_roam_set_default_key_index(mac_handle_t hal, uint8_t session_id,
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05304097 uint8_t default_idx)
4098{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004099 struct scheduler_msg msg = {0};
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05304100 struct wep_update_default_key_idx *update_key;
4101
4102 update_key = qdf_mem_malloc(sizeof(*update_key));
Arif Hussain0ef77082018-10-10 16:42:53 -07004103 if (!update_key)
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05304104 return QDF_STATUS_E_NOMEM;
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05304105
4106 update_key->session_id = session_id;
4107 update_key->default_idx = default_idx;
4108
4109 msg.type = WMA_UPDATE_WEP_DEFAULT_KEY;
4110 msg.reserved = 0;
4111 msg.bodyptr = (void *)update_key;
4112
4113 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304114 scheduler_post_message(QDF_MODULE_ID_SME,
4115 QDF_MODULE_ID_WMA,
4116 QDF_MODULE_ID_WMA, &msg)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004117 sme_err("Failed to post WMA_UPDATE_WEP_DEFAULT_KEY to WMA");
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05304118 qdf_mem_free(update_key);
4119 return QDF_STATUS_E_FAILURE;
4120 }
4121
4122 return QDF_STATUS_SUCCESS;
4123}
4124
4125
Jeff Johnson8bd23352017-09-26 11:39:24 -07004126/**
4127 * sme_get_rssi() - API to retrieve current RSSI
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004128 * @mac_handle: HAL handle for device
Jeff Johnson8bd23352017-09-26 11:39:24 -07004129 * @callback: SME sends back the requested stats using the callback
4130 * @staId: The station ID for which the RSSI is requested for
4131 * @bssid: The bssid of the connected session
4132 * @lastRSSI: RSSI value at time of request. In case fw cannot provide
4133 * RSSI, do not hold up but return this value.
4134 * @pContext: user context to be passed back along with the callback
4135 *
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304136 * A wrapper function that client calls to register a callback to get RSSI
4137 *
Jeff Johnson8bd23352017-09-26 11:39:24 -07004138 * Return: QDF_STATUS
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304139 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004140QDF_STATUS sme_get_rssi(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304141 tCsrRssiCallback callback, uint8_t staId,
4142 struct qdf_mac_addr bssId, int8_t lastRSSI,
Jeff Johnson8bd23352017-09-26 11:39:24 -07004143 void *pContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004144{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304145 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004146 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004147
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304148 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004149 TRACE_CODE_SME_RX_HDD_GET_RSSI, NO_SESSION, 0));
4150 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304151 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004152 status = csr_get_rssi(pMac, callback,
4153 staId, bssId, lastRSSI,
Jeff Johnson8bd23352017-09-26 11:39:24 -07004154 pContext);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004155 sme_release_global_lock(&pMac->sme);
4156 }
4157 return status;
4158}
4159
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304160/*
4161 * sme_get_snr() -
4162 * A wrapper function that client calls to register a callback to get SNR
4163 *
4164 * callback - SME sends back the requested stats using the callback
4165 * staId - The station ID for which the stats is requested for
4166 * pContext - user context to be passed back along with the callback
4167 * p_cds_context - cds context
4168 * \return QDF_STATUS
4169 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004170QDF_STATUS sme_get_snr(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004171 tCsrSnrCallback callback,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304172 uint8_t staId, struct qdf_mac_addr bssId, void *pContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004173{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304174 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004175 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004176
4177 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304178 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004179 status = csr_get_snr(pMac, callback, staId, bssId, pContext);
4180 sme_release_global_lock(&pMac->sme);
4181 }
4182 return status;
4183}
4184
Naveen Rawatfa2a1002018-05-17 16:06:37 -07004185#ifndef QCA_SUPPORT_CP_STATS
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304186/*
4187 * sme_get_statistics() -
4188 * A wrapper function that client calls to register a callback to get
4189 * different PHY level statistics from CSR.
4190 *
4191 * requesterId - different client requesting for statistics,
4192 * HDD, UMA/GAN etc
4193 * statsMask - The different category/categories of stats requester
4194 * is looking for
4195 * callback - SME sends back the requested stats using the callback
4196 * periodicity - If requester needs periodic update in millisec, 0 means
4197 * it's an one time request
4198 * cache - If requester is happy with cached stats
4199 * staId - The station ID for which the stats is requested for
4200 * pContext - user context to be passed back along with the callback
4201 * sessionId - sme session interface
4202 * Return QDF_STATUS
4203 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004204QDF_STATUS sme_get_statistics(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004205 eCsrStatsRequesterType requesterId,
4206 uint32_t statsMask, tCsrStatsCallback callback,
Naveen Rawatd0ca4412017-06-16 14:19:19 -07004207 uint8_t staId, void *pContext, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004208{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304209 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004210 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004211
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004212 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304213 if (QDF_IS_STATUS_SUCCESS(status)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304214 status = csr_get_statistics(pMac, requesterId, statsMask,
4215 callback, staId, pContext,
4216 sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004217 sme_release_global_lock(&pMac->sme);
4218 }
4219
4220 return status;
4221
4222}
Naveen Rawatfa2a1002018-05-17 16:06:37 -07004223#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004224
Jeff Johnsonca7a7162018-07-07 12:56:54 -07004225QDF_STATUS sme_get_link_status(mac_handle_t mac_handle,
4226 csr_link_status_callback callback,
4227 void *context, uint8_t session_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004228{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304229 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonca7a7162018-07-07 12:56:54 -07004230 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
4231 tAniGetLinkStatus *msg;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004232 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004233
Jeff Johnsonca7a7162018-07-07 12:56:54 -07004234 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304235 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnsonca7a7162018-07-07 12:56:54 -07004236 msg = qdf_mem_malloc(sizeof(*msg));
4237 if (!msg) {
Jeff Johnsonca7a7162018-07-07 12:56:54 -07004238 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304239 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004240 }
4241
Jeff Johnsonca7a7162018-07-07 12:56:54 -07004242 msg->msgType = WMA_LINK_STATUS_GET_REQ;
4243 msg->msgLen = sizeof(*msg);
4244 msg->sessionId = session_id;
4245 mac->sme.link_status_context = context;
4246 mac->sme.link_status_callback = callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004247
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08004248 message.type = WMA_LINK_STATUS_GET_REQ;
Jeff Johnsonca7a7162018-07-07 12:56:54 -07004249 message.bodyptr = msg;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08004250 message.reserved = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004251
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304252 status = scheduler_post_message(QDF_MODULE_ID_SME,
4253 QDF_MODULE_ID_WMA,
4254 QDF_MODULE_ID_WMA, &message);
Jeff Johnsonca7a7162018-07-07 12:56:54 -07004255 if (QDF_IS_STATUS_ERROR(status)) {
4256 sme_err("post msg failed, %d", status);
4257 qdf_mem_free(msg);
4258 mac->sme.link_status_context = NULL;
4259 mac->sme.link_status_callback = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004260 }
4261
Jeff Johnsonca7a7162018-07-07 12:56:54 -07004262 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004263 }
4264
4265 return status;
4266}
4267
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304268/*
4269 * sme_get_country_code() -
4270 * To return the current country code. If no country code is applied,
4271 * default country code is used to fill the buffer.
4272 * If 11d supported is turned off, an error is return and the last
4273 * applied/default country code is used.
4274 * This is a synchronous API.
4275 *
4276 * pBuf - pointer to a caller allocated buffer for returned country code.
4277 * pbLen For input, this parameter indicates how big is the buffer.
4278 * Upon return, this parameter has the number of bytes for
4279 * country. If pBuf doesn't have enough space, this function
4280 * returns fail status and this parameter contains the number
4281 * that is needed.
4282 *
4283 * Return QDF_STATUS SUCCESS.
4284 *
4285 * FAILURE or RESOURCES The API finished and failed.
4286 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004287QDF_STATUS sme_get_country_code(mac_handle_t mac_handle, uint8_t *pBuf,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08004288 uint8_t *pbLen)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004289{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004290 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004291
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304292 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004293 TRACE_CODE_SME_RX_HDD_GET_CNTRYCODE, NO_SESSION, 0));
4294
4295 return csr_get_country_code(pMac, pBuf, pbLen);
4296}
4297
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004298/* some support functions */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004299bool sme_is11d_supported(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004300{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004301 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004302
Kiran Kumar Lokere3beeb952017-05-02 18:40:24 -07004303 return wlan_reg_11d_enabled_on_host(pMac->psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004304}
4305
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004306bool sme_is11h_supported(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004307{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004308 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004309
4310 return csr_is11h_supported(pMac);
4311}
4312
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004313bool sme_is_wmm_supported(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004314{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004315 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004316
4317 return csr_is_wmm_supported(pMac);
4318}
4319
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304320/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304321 * sme_generic_change_country_code() -
4322 * Change Country code from upperlayer during WLAN driver operation.
4323 * This is a synchronous API.
4324 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004325 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304326 * pCountry New Country Code String
4327 * reg_domain regulatory domain
4328 * Return QDF_STATUS SUCCESS.
4329 * FAILURE or RESOURCES The API finished and failed.
4330 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004331QDF_STATUS sme_generic_change_country_code(mac_handle_t mac_handle,
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07004332 uint8_t *pCountry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004333{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304334 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004335 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004336 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004337 tAniGenericChangeCountryCodeReq *pMsg;
4338
4339 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304340 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004341 "%s: pMac is null", __func__);
4342 return status;
4343 }
4344
4345 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304346 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304347 pMsg = qdf_mem_malloc(sizeof(tAniGenericChangeCountryCodeReq));
Arif Hussain0ef77082018-10-10 16:42:53 -07004348 if (!pMsg) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004349 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304350 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004351 }
4352
4353 pMsg->msgType = eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE;
4354 pMsg->msgLen =
4355 (uint16_t) sizeof(tAniGenericChangeCountryCodeReq);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304356 qdf_mem_copy(pMsg->countryCode, pCountry, 2);
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07004357 pMsg->countryCode[2] = ' ';
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004358
4359 msg.type = eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE;
4360 msg.bodyptr = pMsg;
4361 msg.reserved = 0;
4362
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304363 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304364 scheduler_post_message(QDF_MODULE_ID_SME,
4365 QDF_MODULE_ID_SME,
4366 QDF_MODULE_ID_SME, &msg)) {
4367 sme_err("sme_generic_change_country_code failed to post msg to self");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304368 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304369 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004370 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004371 sme_release_global_lock(&pMac->sme);
4372 }
4373
4374 return status;
4375}
4376
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304377/*
4378 * sme_dhcp_start_ind() -
4379 * API to signal the FW about the DHCP Start event.
4380 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004381 * mac_handle - HAL handle for device.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304382 * device_mode - mode(AP,SAP etc) of the device.
4383 * macAddr - MAC address of the adapter.
4384 * sessionId - session ID.
4385 * Return QDF_STATUS SUCCESS.
4386 * FAILURE or RESOURCES The API finished and failed.
4387 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004388QDF_STATUS sme_dhcp_start_ind(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004389 uint8_t device_mode,
4390 uint8_t *macAddr, uint8_t sessionId)
4391{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304392 QDF_STATUS status;
4393 QDF_STATUS qdf_status;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004394 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004395 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004396 tAniDHCPInd *pMsg;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05304397 struct csr_roam_session *pSession;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004398
4399 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304400 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004401 pSession = CSR_GET_SESSION(pMac, sessionId);
4402
4403 if (!pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004404 sme_err("Session: %d not found", sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004405 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304406 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004407 }
Arif Hussain3316f402016-11-10 13:08:03 -08004408 pSession->dhcp_done = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004409
Arif Hussain0ef77082018-10-10 16:42:53 -07004410 pMsg = qdf_mem_malloc(sizeof(tAniDHCPInd));
4411 if (!pMsg) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004412 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304413 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004414 }
4415 pMsg->msgType = WMA_DHCP_START_IND;
4416 pMsg->msgLen = (uint16_t) sizeof(tAniDHCPInd);
4417 pMsg->device_mode = device_mode;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304418 qdf_mem_copy(pMsg->adapterMacAddr.bytes, macAddr,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304419 QDF_MAC_ADDR_SIZE);
Anurag Chouhanc5548422016-02-24 18:33:27 +05304420 qdf_copy_macaddr(&pMsg->peerMacAddr,
Srinivas Girigowda296105a2015-09-24 16:31:16 -07004421 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004422
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08004423 message.type = WMA_DHCP_START_IND;
4424 message.bodyptr = pMsg;
4425 message.reserved = 0;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05304426 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08004427 sessionId, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304428 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
4429 QDF_MODULE_ID_WMA,
4430 QDF_MODULE_ID_WMA,
4431 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304432 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304433 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004434 "%s: Post DHCP Start MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304435 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304436 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004437 }
4438 sme_release_global_lock(&pMac->sme);
4439 }
4440 return status;
4441}
4442
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304443/*
4444 * sme_dhcp_stop_ind() -
4445 * API to signal the FW about the DHCP complete event.
4446 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004447 * mac_handle - HAL handle for device.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304448 * device_mode - mode(AP, SAP etc) of the device.
4449 * macAddr - MAC address of the adapter.
4450 * sessionId - session ID.
4451 * Return QDF_STATUS SUCCESS.
4452 * FAILURE or RESOURCES The API finished and failed.
4453 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004454QDF_STATUS sme_dhcp_stop_ind(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004455 uint8_t device_mode,
4456 uint8_t *macAddr, uint8_t sessionId)
4457{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304458 QDF_STATUS status;
4459 QDF_STATUS qdf_status;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004460 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004461 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004462 tAniDHCPInd *pMsg;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05304463 struct csr_roam_session *pSession;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004464
4465 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304466 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004467 pSession = CSR_GET_SESSION(pMac, sessionId);
4468
4469 if (!pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004470 sme_err("Session: %d not found", sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004471 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304472 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004473 }
Arif Hussain3316f402016-11-10 13:08:03 -08004474 pSession->dhcp_done = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004475
Arif Hussain0ef77082018-10-10 16:42:53 -07004476 pMsg = qdf_mem_malloc(sizeof(tAniDHCPInd));
4477 if (!pMsg) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004478 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304479 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004480 }
4481
4482 pMsg->msgType = WMA_DHCP_STOP_IND;
4483 pMsg->msgLen = (uint16_t) sizeof(tAniDHCPInd);
4484 pMsg->device_mode = device_mode;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304485 qdf_mem_copy(pMsg->adapterMacAddr.bytes, macAddr,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304486 QDF_MAC_ADDR_SIZE);
Anurag Chouhanc5548422016-02-24 18:33:27 +05304487 qdf_copy_macaddr(&pMsg->peerMacAddr,
Srinivas Girigowda296105a2015-09-24 16:31:16 -07004488 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004489
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08004490 message.type = WMA_DHCP_STOP_IND;
4491 message.bodyptr = pMsg;
4492 message.reserved = 0;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05304493 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08004494 sessionId, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304495 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
4496 QDF_MODULE_ID_WMA,
4497 QDF_MODULE_ID_WMA,
4498 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304499 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304500 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004501 "%s: Post DHCP Stop MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304502 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304503 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004504 }
4505
4506 sme_release_global_lock(&pMac->sme);
4507 }
4508 return status;
4509}
4510
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304511/*
4512 * sme_TXFailMonitorStopInd() -
4513 * API to signal the FW to start monitoring TX failures
4514 *
4515 * Return QDF_STATUS SUCCESS.
4516 * FAILURE or RESOURCES The API finished and failed.
4517 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004518QDF_STATUS sme_tx_fail_monitor_start_stop_ind(mac_handle_t mac_handle,
4519 uint8_t tx_fail_count,
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08004520 void *txFailIndCallback)
4521{
4522 QDF_STATUS status;
4523 QDF_STATUS qdf_status;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004524 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004525 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08004526 tAniTXFailMonitorInd *pMsg;
4527
4528 status = sme_acquire_global_lock(&pMac->sme);
4529 if (QDF_STATUS_SUCCESS == status) {
Arif Hussain0ef77082018-10-10 16:42:53 -07004530 pMsg = qdf_mem_malloc(sizeof(tAniTXFailMonitorInd));
4531 if (!pMsg) {
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08004532 sme_release_global_lock(&pMac->sme);
4533 return QDF_STATUS_E_NOMEM;
4534 }
4535
4536 pMsg->msgType = WMA_TX_FAIL_MONITOR_IND;
4537 pMsg->msgLen = (uint16_t) sizeof(tAniTXFailMonitorInd);
4538
4539 /* tx_fail_count = 0 should disable the Monitoring in FW */
4540 pMsg->tx_fail_count = tx_fail_count;
4541 pMsg->txFailIndCallback = txFailIndCallback;
4542
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08004543 message.type = WMA_TX_FAIL_MONITOR_IND;
4544 message.bodyptr = pMsg;
4545 message.reserved = 0;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08004546
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304547 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
4548 QDF_MODULE_ID_WMA,
4549 QDF_MODULE_ID_WMA,
4550 &message);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08004551 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
4552 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
4553 "%s: Post TX Fail monitor Start MSG fail",
4554 __func__);
4555 qdf_mem_free(pMsg);
4556 status = QDF_STATUS_E_FAILURE;
4557 }
4558 sme_release_global_lock(&pMac->sme);
4559 }
4560 return status;
4561}
4562
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304563/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304564 * sme_neighbor_report_request() -
4565 * API to request neighbor report.
4566 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004567 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304568 * pRrmNeighborReq - Pointer to a caller allocated object of type
4569 * tRrmNeighborReq. Caller owns the memory and is
4570 * responsible for freeing it.
4571 * Return QDF_STATUS
4572 * QDF_STATUS_E_FAILURE - failure
4573 * QDF_STATUS_SUCCESS success
4574 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004575QDF_STATUS sme_neighbor_report_request(
4576 mac_handle_t mac_handle,
4577 uint8_t sessionId,
4578 tpRrmNeighborReq pRrmNeighborReq,
4579 tpRrmNeighborRspCallbackInfo callbackInfo)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004580{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304581 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004582 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304583
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304584 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004585 TRACE_CODE_SME_RX_HDD_NEIGHBOR_REPORTREQ, NO_SESSION,
4586 0));
4587
Vignesh Viswanathan694e28e2018-01-18 20:53:57 +05304588 if (pRrmNeighborReq->neighbor_report_offload) {
4589 status = csr_invoke_neighbor_report_request(sessionId,
4590 pRrmNeighborReq,
4591 false);
4592 return status;
4593 }
4594
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304595 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004596 status =
Jeff Johnsoned3de522018-06-10 18:27:51 -07004597 sme_rrm_neighbor_report_request(pMac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304598 pRrmNeighborReq, callbackInfo);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004599 sme_release_global_lock(&pMac->sme);
4600 }
4601
4602 return status;
4603}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004604
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304605/*
4606 * sme_get_wcnss_wlan_compiled_version() -
4607 * This API returns the version of the WCNSS WLAN API with
4608 * which the HOST driver was built
4609 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004610 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304611 * pVersion - Points to the Version structure to be filled
4612 * Return QDF_STATUS
4613 * QDF_STATUS_E_INVAL - failure
4614 * QDF_STATUS_SUCCESS success
4615 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004616QDF_STATUS sme_get_wcnss_wlan_compiled_version(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004617 tSirVersionType *pVersion)
4618{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304619 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004620 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004621
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304622 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004623 if (pVersion != NULL)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304624 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004625 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304626 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004627
4628 sme_release_global_lock(&pMac->sme);
4629 }
4630
4631 return status;
4632}
4633
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304634/*
4635 * sme_get_wcnss_wlan_reported_version() -
4636 * This API returns the version of the WCNSS WLAN API with
4637 * which the WCNSS driver reports it was built
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004638 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304639 * pVersion - Points to the Version structure to be filled
4640 * Return QDF_STATUS
4641 * QDF_STATUS_E_INVAL - failure
4642 * QDF_STATUS_SUCCESS success
4643 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004644QDF_STATUS sme_get_wcnss_wlan_reported_version(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004645 tSirVersionType *pVersion)
4646{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304647 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004648 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004649
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304650 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004651 if (pVersion != NULL)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304652 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004653 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304654 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004655
4656 sme_release_global_lock(&pMac->sme);
4657 }
4658
4659 return status;
4660}
4661
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304662/*
4663 * sme_get_wcnss_software_version() -
4664 * This API returns the version string of the WCNSS driver
4665 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004666 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304667 * pVersion - Points to the Version string buffer to be filled
4668 * versionBufferSize - THe size of the Version string buffer
4669 * Return QDF_STATUS
4670 * QDF_STATUS_E_INVAL - failure
4671 * QDF_STATUS_SUCCESS success
4672 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004673QDF_STATUS sme_get_wcnss_software_version(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004674 uint8_t *pVersion,
4675 uint32_t versionBufferSize)
4676{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304677 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004678 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004679
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304680 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304681 if (pVersion != NULL)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004682 status =
Jeff Johnsonabb74042017-08-31 11:44:55 -07004683 wma_get_wcnss_software_version(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004684 pVersion,
4685 versionBufferSize);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304686 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304687 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004688 sme_release_global_lock(&pMac->sme);
4689 }
4690
4691 return status;
4692}
4693
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304694/*
4695 * sme_get_wcnss_hardware_version() -
4696 * This API returns the version string of the WCNSS hardware
4697 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004698 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304699 * pVersion - Points to the Version string buffer to be filled
4700 * versionBufferSize - THe size of the Version string buffer
4701 * Return QDF_STATUS
4702 * QDF_STATUS_E_INVAL - failure
4703 * QDF_STATUS_SUCCESS success
4704 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004705QDF_STATUS sme_get_wcnss_hardware_version(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004706 uint8_t *pVersion,
4707 uint32_t versionBufferSize)
4708{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304709 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004710 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004711
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304712 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004713 if (pVersion != NULL)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304714 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004715 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304716 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004717
4718 sme_release_global_lock(&pMac->sme);
4719 }
4720
4721 return status;
4722}
4723
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004724#ifdef FEATURE_OEM_DATA_SUPPORT
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07004725/**
4726 * sme_oem_data_req() - send oem data request to WMA
4727 * @hal: HAL handle
4728 * @hdd_oem_req: OEM data request from HDD
4729 *
4730 * Return: QDF_STATUS
4731 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08004732QDF_STATUS sme_oem_data_req(mac_handle_t hal, struct oem_data_req *hdd_oem_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004733{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304734 QDF_STATUS status = QDF_STATUS_SUCCESS;
Krishna Kumaar Natarajanc1fa17d2016-08-03 14:19:20 -07004735 struct oem_data_req *oem_data_req;
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07004736 void *wma_handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004737
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004738 SME_ENTER();
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07004739 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
4740 if (!wma_handle) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004741 sme_err("wma_handle is NULL");
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07004742 return QDF_STATUS_E_FAILURE;
4743 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004744
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07004745 oem_data_req = qdf_mem_malloc(sizeof(*oem_data_req));
Arif Hussain0ef77082018-10-10 16:42:53 -07004746 if (!oem_data_req)
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07004747 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004748
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07004749 oem_data_req->data_len = hdd_oem_req->data_len;
4750 oem_data_req->data = qdf_mem_malloc(oem_data_req->data_len);
Arif Hussain0ef77082018-10-10 16:42:53 -07004751 if (!oem_data_req->data)
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07004752 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004753
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07004754 qdf_mem_copy(oem_data_req->data, hdd_oem_req->data,
4755 oem_data_req->data_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004756
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07004757 status = wma_start_oem_data_req(wma_handle, oem_data_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004758
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304759 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004760 sme_err("Post oem data request msg fail");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304761 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004762 sme_debug("OEM request(length: %d) sent to WMA",
4763 oem_data_req->data_len);
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07004764
4765 if (oem_data_req->data_len)
4766 qdf_mem_free(oem_data_req->data);
4767 qdf_mem_free(oem_data_req);
4768
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004769 SME_EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004770 return status;
4771}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004772#endif /*FEATURE_OEM_DATA_SUPPORT */
4773
gaurank kathpalia78af1932018-10-27 20:33:10 +05304774#define STA_NSS_CHAINS_SHIFT 0
4775#define SAP_NSS_CHAINS_SHIFT 3
4776#define P2P_GO_NSS_CHAINS_SHIFT 6
4777#define P2P_CLI_CHAINS_SHIFT 9
4778#define TDLS_CHAINS_SHIFT 12
4779#define IBSS_NSS_CHAINS_SHIFT 15
4780#define P2P_DEV_NSS_CHAINS_SHIFT 18
4781#define OCB_NSS_CHAINS_SHIFT 21
4782#define NAN_NSS_CHAIN_SHIFT 24
4783#define NSS_CHAIN_MASK 0x7
4784#define GET_VDEV_NSS_CHAIN(x, y) (((x) >> (y)) & NSS_CHAIN_MASK)
4785
4786static uint8_t sme_get_nss_chain_shift(enum QDF_OPMODE device_mode)
4787{
4788 switch (device_mode) {
4789 case QDF_STA_MODE:
4790 return STA_NSS_CHAINS_SHIFT;
4791 case QDF_SAP_MODE:
4792 return SAP_NSS_CHAINS_SHIFT;
4793 case QDF_P2P_GO_MODE:
4794 return P2P_GO_NSS_CHAINS_SHIFT;
4795 case QDF_P2P_CLIENT_MODE:
4796 return P2P_CLI_CHAINS_SHIFT;
4797 case QDF_IBSS_MODE:
4798 return IBSS_NSS_CHAINS_SHIFT;
4799 case QDF_P2P_DEVICE_MODE:
4800 return P2P_DEV_NSS_CHAINS_SHIFT;
4801 case QDF_OCB_MODE:
4802 return OCB_NSS_CHAINS_SHIFT;
4803
4804 default:
4805 sme_err("Device mode %d invalid", device_mode);
4806 return STA_NSS_CHAINS_SHIFT;
4807 }
4808}
4809
4810static void
gaurank kathpalia24ed0f42018-11-13 15:37:49 +05304811sme_fill_nss_chain_params(struct mac_context *mac_ctx,
gaurank kathpalia78af1932018-10-27 20:33:10 +05304812 struct wlan_mlme_nss_chains *vdev_ini_cfg,
4813 enum QDF_OPMODE device_mode,
4814 enum nss_chains_band_info band,
4815 uint8_t rf_chains_supported)
4816{
4817 uint8_t nss_chain_shift;
4818 uint8_t max_supported_nss;
4819 struct wlan_mlme_nss_chains *nss_chains_ini_cfg =
4820 &mac_ctx->mlme_cfg->nss_chains_ini_cfg;
4821
4822 nss_chain_shift = sme_get_nss_chain_shift(device_mode);
4823 max_supported_nss = mac_ctx->mlme_cfg->vht_caps.vht_cap_info.enable2x2 ?
4824 MAX_VDEV_NSS : 1;
4825
4826 /* If the fw doesn't support two chains, num rf chains can max be 1 */
4827 vdev_ini_cfg->num_rx_chains[band] =
4828 QDF_MIN(GET_VDEV_NSS_CHAIN(
4829 nss_chains_ini_cfg->num_rx_chains[band],
4830 nss_chain_shift), rf_chains_supported);
4831
4832 vdev_ini_cfg->num_tx_chains[band] =
4833 QDF_MIN(GET_VDEV_NSS_CHAIN(
4834 nss_chains_ini_cfg->num_tx_chains[band],
4835 nss_chain_shift), rf_chains_supported);
4836
4837 /* If 2x2 mode is disabled, then max rx, tx nss can be 1 */
4838 vdev_ini_cfg->rx_nss[band] =
4839 QDF_MIN(GET_VDEV_NSS_CHAIN(
4840 nss_chains_ini_cfg->rx_nss[band],
4841 nss_chain_shift), max_supported_nss);
4842
4843 vdev_ini_cfg->tx_nss[band] =
4844 QDF_MIN(GET_VDEV_NSS_CHAIN(
4845 nss_chains_ini_cfg->tx_nss[band],
4846 nss_chain_shift), max_supported_nss);
4847
4848 vdev_ini_cfg->num_tx_chains_11a =
4849 QDF_MIN(GET_VDEV_NSS_CHAIN(
4850 nss_chains_ini_cfg->num_tx_chains_11a,
4851 nss_chain_shift), rf_chains_supported);
4852
4853 /* If the fw doesn't support two chains, num rf chains can max be 1 */
4854 vdev_ini_cfg->num_tx_chains_11b =
4855 QDF_MIN(GET_VDEV_NSS_CHAIN(
4856 nss_chains_ini_cfg->num_tx_chains_11b,
4857 nss_chain_shift), rf_chains_supported);
4858
4859 vdev_ini_cfg->num_tx_chains_11g =
4860 QDF_MIN(GET_VDEV_NSS_CHAIN(
4861 nss_chains_ini_cfg->num_tx_chains_11g,
4862 nss_chain_shift), rf_chains_supported);
4863
4864 vdev_ini_cfg->disable_rx_mrc[band] =
4865 nss_chains_ini_cfg->disable_rx_mrc[band];
4866
4867 vdev_ini_cfg->disable_tx_mrc[band] =
4868 nss_chains_ini_cfg->disable_tx_mrc[band];
4869}
4870
4871void sme_populate_nss_chain_params(mac_handle_t mac_handle,
4872 struct wlan_mlme_nss_chains *vdev_ini_cfg,
4873 enum QDF_OPMODE device_mode,
4874 uint8_t rf_chains_supported)
4875{
gaurank kathpalia24ed0f42018-11-13 15:37:49 +05304876 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia78af1932018-10-27 20:33:10 +05304877 enum nss_chains_band_info band;
4878
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304879 for (band = NSS_CHAINS_BAND_2GHZ; band < NSS_CHAINS_BAND_MAX; band++)
gaurank kathpalia78af1932018-10-27 20:33:10 +05304880 sme_fill_nss_chain_params(mac_ctx, vdev_ini_cfg,
4881 device_mode, band,
4882 rf_chains_supported);
4883}
4884
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304885void
4886sme_store_nss_chains_cfg_in_vdev(struct wlan_objmgr_vdev *vdev,
4887 struct wlan_mlme_nss_chains *vdev_ini_cfg)
4888{
4889 struct wlan_mlme_nss_chains *ini_cfg;
4890 struct wlan_mlme_nss_chains *dynamic_cfg;
4891
4892 ini_cfg = mlme_get_ini_vdev_config(vdev);
4893 dynamic_cfg = mlme_get_dynamic_vdev_config(vdev);
4894
4895 if (!ini_cfg || !dynamic_cfg) {
4896 sme_err("Nss chains ini/dynamic config NULL vdev_id %d",
4897 vdev->vdev_objmgr.vdev_id);
4898 return;
4899 }
4900
4901 *ini_cfg = *vdev_ini_cfg;
4902 *dynamic_cfg = *vdev_ini_cfg;
4903}
4904
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304905static void
4906sme_populate_user_config(struct wlan_mlme_nss_chains *dynamic_cfg,
4907 struct wlan_mlme_nss_chains *user_cfg,
4908 enum nss_chains_band_info band)
4909{
4910 if (!user_cfg->num_rx_chains[band])
4911 user_cfg->num_rx_chains[band] =
4912 dynamic_cfg->num_rx_chains[band];
4913
4914 if (!user_cfg->num_tx_chains[band])
4915 user_cfg->num_tx_chains[band] =
4916 dynamic_cfg->num_tx_chains[band];
4917
4918 if (!user_cfg->rx_nss[band])
4919 user_cfg->rx_nss[band] =
4920 dynamic_cfg->rx_nss[band];
4921
4922 if (!user_cfg->tx_nss[band])
4923 user_cfg->tx_nss[band] =
4924 dynamic_cfg->tx_nss[band];
4925
4926 if (!user_cfg->num_tx_chains_11a)
4927 user_cfg->num_tx_chains_11a =
4928 dynamic_cfg->num_tx_chains_11a;
4929
4930 if (!user_cfg->num_tx_chains_11b)
4931 user_cfg->num_tx_chains_11b =
4932 dynamic_cfg->num_tx_chains_11b;
4933
4934 if (!user_cfg->num_tx_chains_11g)
4935 user_cfg->num_tx_chains_11g =
4936 dynamic_cfg->num_tx_chains_11g;
4937
4938 if (!user_cfg->disable_rx_mrc[band])
4939 user_cfg->disable_rx_mrc[band] =
4940 dynamic_cfg->disable_rx_mrc[band];
4941
4942 if (!user_cfg->disable_tx_mrc[band])
4943 user_cfg->disable_tx_mrc[band] =
4944 dynamic_cfg->disable_tx_mrc[band];
4945}
4946
4947static QDF_STATUS
4948sme_validate_from_ini_config(struct wlan_mlme_nss_chains *user_cfg,
4949 struct wlan_mlme_nss_chains *ini_cfg,
4950 enum nss_chains_band_info band)
4951{
4952 if (user_cfg->num_rx_chains[band] >
4953 ini_cfg->num_rx_chains[band])
4954 return QDF_STATUS_E_FAILURE;
4955
4956 if (user_cfg->num_tx_chains[band] >
4957 ini_cfg->num_tx_chains[band])
4958 return QDF_STATUS_E_FAILURE;
4959
4960 if (user_cfg->rx_nss[band] >
4961 ini_cfg->rx_nss[band])
4962 return QDF_STATUS_E_FAILURE;
4963
4964 if (user_cfg->tx_nss[band] >
4965 ini_cfg->tx_nss[band])
4966 return QDF_STATUS_E_FAILURE;
4967
4968 if (user_cfg->num_tx_chains_11a >
4969 ini_cfg->num_tx_chains_11a)
4970 return QDF_STATUS_E_FAILURE;
4971
4972 if (user_cfg->num_tx_chains_11b >
4973 ini_cfg->num_tx_chains_11b)
4974 return QDF_STATUS_E_FAILURE;
4975
4976 if (user_cfg->num_tx_chains_11g >
4977 ini_cfg->num_tx_chains_11g)
4978 return QDF_STATUS_E_FAILURE;
4979
4980 return QDF_STATUS_SUCCESS;
4981}
4982
4983static QDF_STATUS
4984sme_validate_user_nss_chain_params(
4985 struct wlan_mlme_nss_chains *user_cfg,
4986 enum nss_chains_band_info band)
4987{
4988 /* Reject as 2x1 modes are not supported in chains yet */
4989
4990 if (user_cfg->num_tx_chains[band] >
4991 user_cfg->num_rx_chains[band])
4992 return QDF_STATUS_E_FAILURE;
4993
4994 /* Also if mode is 2x2, we cant have chains as 1x1, or 1x2, or 2x1 */
4995
4996 if (user_cfg->tx_nss[band] >
4997 user_cfg->num_tx_chains[band])
4998 user_cfg->num_tx_chains[band] =
4999 user_cfg->tx_nss[band];
5000
5001 if (user_cfg->rx_nss[band] >
5002 user_cfg->num_rx_chains[band])
5003 user_cfg->num_rx_chains[band] =
5004 user_cfg->rx_nss[band];
5005
5006 /*
5007 * It may happen that already chains are in 1x1 mode and nss too
5008 * is in 1x1 mode, but the tx 11a/b/g chains in user config comes
5009 * as 2x1, or 1x2 which cannot support respective mode, as tx chains
5010 * for respective band have max of 1x1 only, so these cannot exceed
5011 * respective band num tx chains.
5012 */
5013
5014 if (user_cfg->num_tx_chains_11a >
gaurank kathpaliab414bce2018-11-09 18:44:46 +05305015 user_cfg->num_tx_chains[NSS_CHAINS_BAND_5GHZ])
gaurank kathpalia2b32de02018-10-24 18:31:14 +05305016 user_cfg->num_tx_chains_11a =
gaurank kathpaliab414bce2018-11-09 18:44:46 +05305017 user_cfg->num_tx_chains[NSS_CHAINS_BAND_5GHZ];
gaurank kathpalia2b32de02018-10-24 18:31:14 +05305018
5019 if (user_cfg->num_tx_chains_11b >
gaurank kathpaliab414bce2018-11-09 18:44:46 +05305020 user_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ])
gaurank kathpalia2b32de02018-10-24 18:31:14 +05305021 user_cfg->num_tx_chains_11b =
gaurank kathpaliab414bce2018-11-09 18:44:46 +05305022 user_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ];
gaurank kathpalia2b32de02018-10-24 18:31:14 +05305023
5024 if (user_cfg->num_tx_chains_11g >
gaurank kathpaliab414bce2018-11-09 18:44:46 +05305025 user_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ])
gaurank kathpalia2b32de02018-10-24 18:31:14 +05305026 user_cfg->num_tx_chains_11g =
gaurank kathpaliab414bce2018-11-09 18:44:46 +05305027 user_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ];
gaurank kathpalia2b32de02018-10-24 18:31:14 +05305028
5029 return QDF_STATUS_SUCCESS;
5030}
5031
5032static QDF_STATUS
5033sme_validate_nss_chains_config(struct wlan_objmgr_vdev *vdev,
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05305034 struct wlan_mlme_nss_chains *user_cfg,
5035 struct wlan_mlme_nss_chains *dynamic_cfg)
gaurank kathpalia2b32de02018-10-24 18:31:14 +05305036{
5037 enum nss_chains_band_info band;
5038 struct wlan_mlme_nss_chains *ini_cfg;
gaurank kathpalia2b32de02018-10-24 18:31:14 +05305039 QDF_STATUS status;
5040
5041 ini_cfg = mlme_get_ini_vdev_config(vdev);
5042 if (!ini_cfg) {
5043 sme_err("nss chain ini config NULL");
5044 return QDF_STATUS_E_FAILURE;
5045 }
gaurank kathpalia2b32de02018-10-24 18:31:14 +05305046
gaurank kathpaliab414bce2018-11-09 18:44:46 +05305047 for (band = NSS_CHAINS_BAND_2GHZ; band < NSS_CHAINS_BAND_MAX; band++) {
gaurank kathpalia2b32de02018-10-24 18:31:14 +05305048 sme_populate_user_config(dynamic_cfg,
5049 user_cfg, band);
5050 status = sme_validate_from_ini_config(user_cfg,
5051 ini_cfg,
5052 band);
5053 if (QDF_IS_STATUS_ERROR(status)) {
5054 sme_err("Validation from ini config failed");
5055 return QDF_STATUS_E_FAILURE;
5056 }
5057 status = sme_validate_user_nss_chain_params(user_cfg,
5058 band);
5059 if (QDF_IS_STATUS_ERROR(status)) {
5060 sme_err("User cfg validation failed");
5061 return QDF_STATUS_E_FAILURE;
5062 }
5063 }
5064
5065 return QDF_STATUS_SUCCESS;
5066}
5067
5068QDF_STATUS
5069sme_nss_chains_update(mac_handle_t mac_handle,
5070 struct wlan_mlme_nss_chains *user_cfg,
5071 uint8_t vdev_id)
5072{
gaurank kathpalia24ed0f42018-11-13 15:37:49 +05305073 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia2b32de02018-10-24 18:31:14 +05305074 QDF_STATUS status;
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05305075 struct wlan_mlme_nss_chains *dynamic_cfg;
gaurank kathpalia2b32de02018-10-24 18:31:14 +05305076 struct wlan_objmgr_vdev *vdev =
5077 wlan_objmgr_get_vdev_by_id_from_psoc(mac_ctx->psoc,
5078 vdev_id,
5079 WLAN_LEGACY_SME_ID);
5080 if (!vdev) {
5081 sme_err("Got NULL vdev obj, returning");
5082 return QDF_STATUS_E_FAILURE;
5083 }
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05305084
gaurank kathpalia748c7272018-10-24 22:05:15 +05305085 status = sme_acquire_global_lock(&mac_ctx->sme);
5086 if (QDF_IS_STATUS_ERROR(status))
5087 goto release_ref;
5088
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05305089 dynamic_cfg = mlme_get_dynamic_vdev_config(vdev);
5090 if (!dynamic_cfg) {
5091 sme_err("nss chain dynamic config NULL");
5092 status = QDF_STATUS_E_FAILURE;
5093 goto release_lock;
5094 }
5095
5096 status = sme_validate_nss_chains_config(vdev, user_cfg,
5097 dynamic_cfg);
gaurank kathpalia2b32de02018-10-24 18:31:14 +05305098 if (QDF_IS_STATUS_ERROR(status))
gaurank kathpalia748c7272018-10-24 22:05:15 +05305099 goto release_lock;
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05305100
5101 if (!qdf_mem_cmp(dynamic_cfg, user_cfg,
5102 sizeof(struct wlan_mlme_nss_chains))) {
5103 sme_debug("current config same as user config");
5104 status = QDF_STATUS_SUCCESS;
5105 goto release_lock;
5106 }
gaurank kathpalia748c7272018-10-24 22:05:15 +05305107 sme_debug("User params verified, sending to fw vdev id %d", vdev_id);
gaurank kathpalia2b32de02018-10-24 18:31:14 +05305108
gaurank kathpalia748c7272018-10-24 22:05:15 +05305109 status = wma_vdev_nss_chain_params_send(vdev->vdev_objmgr.vdev_id,
5110 user_cfg);
5111 if (QDF_IS_STATUS_ERROR(status)) {
5112 sme_err("params sent failed to fw vdev id %d", vdev_id);
5113 goto release_lock;
5114 }
5115
gaurank kathpaliab414bce2018-11-09 18:44:46 +05305116 *dynamic_cfg = *user_cfg;
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05305117
gaurank kathpalia748c7272018-10-24 22:05:15 +05305118release_lock:
5119 sme_release_global_lock(&mac_ctx->sme);
5120
5121release_ref:
gaurank kathpalia2b32de02018-10-24 18:31:14 +05305122 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
5123 return status;
5124}
5125
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08005126QDF_STATUS sme_open_session(mac_handle_t hal, struct sme_session_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005127{
Arif Hussainee677012017-01-26 17:50:13 -08005128 QDF_STATUS status = QDF_STATUS_E_INVAL;
Krunal Soni8d184fa2017-11-20 21:52:05 -08005129 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Arif Hussainee677012017-01-26 17:50:13 -08005130 struct cdp_pdev *pdev;
5131 ol_txrx_peer_handle peer;
5132 uint8_t peer_id;
Krishna Kumaar Natarajanb9e1d712017-06-20 17:14:37 -07005133 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005134
Abhishek Singhe4a1f882017-08-10 17:59:44 +05305135 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
Rajeev Kumar7414c8c2017-04-06 15:42:52 -07005136 "%s: type=%d, session_id %d subType=%d addr:%pM",
Krunal Soni8d184fa2017-11-20 21:52:05 -08005137 __func__, params->type_of_persona,
5138 params->sme_session_id, params->subtype_of_persona,
5139 params->self_mac_addr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005140
Arif Hussainee677012017-01-26 17:50:13 -08005141 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
5142
5143 if (NULL == pdev) {
5144 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
5145 "%s: Failed to get pdev handler", __func__);
5146 return status;
5147 }
5148
Krunal Soni8d184fa2017-11-20 21:52:05 -08005149 status = sme_acquire_global_lock(&mac_ctx->sme);
Dustin Brownd28772b2017-03-17 14:16:07 -07005150 if (QDF_IS_STATUS_ERROR(status))
5151 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005152
Krunal Soni8d184fa2017-11-20 21:52:05 -08005153 peer = cdp_peer_find_by_addr(soc, pdev, params->self_mac_addr,
5154 &peer_id);
Arif Hussainee677012017-01-26 17:50:13 -08005155 if (peer) {
5156 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
5157 "%s: Peer=%d exist with same MAC",
5158 __func__, peer_id);
5159 status = QDF_STATUS_E_INVAL;
5160 } else {
Krunal Soni8d184fa2017-11-20 21:52:05 -08005161 status = csr_roam_open_session(mac_ctx, params);
Arif Hussainee677012017-01-26 17:50:13 -08005162 }
Krunal Soni8d184fa2017-11-20 21:52:05 -08005163 sme_release_global_lock(&mac_ctx->sme);
Dustin Brownd28772b2017-03-17 14:16:07 -07005164
5165 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_OPEN_SESSION,
Krunal Soni8d184fa2017-11-20 21:52:05 -08005166 params->sme_session_id, 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005167
5168 return status;
5169}
5170
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08005171QDF_STATUS sme_close_session(mac_handle_t hal, uint8_t session_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005172{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305173 QDF_STATUS status;
Krunal Soni8d184fa2017-11-20 21:52:05 -08005174 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005175
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305176 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Krunal Soni8d184fa2017-11-20 21:52:05 -08005177 TRACE_CODE_SME_RX_HDD_CLOSE_SESSION, session_id, 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005178 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305179 if (QDF_IS_STATUS_SUCCESS(status)) {
Krunal Soni8d184fa2017-11-20 21:52:05 -08005180 status = csr_roam_close_session(pMac, session_id, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005181 sme_release_global_lock(&pMac->sme);
5182 }
5183
5184 return status;
5185}
5186
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305187/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305188 * sme_change_mcc_beacon_interval() -
5189 * To update P2P-GO beaconInterval. This function should be called after
5190 * disassociating all the station is done
5191 * This is an asynchronous API.
5192 *
5193 * @sessionId: Session Identifier
5194 * Return QDF_STATUS SUCCESS
5195 * FAILURE or RESOURCES
5196 * The API finished and failed.
5197 */
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07005198QDF_STATUS sme_change_mcc_beacon_interval(uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005199{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305200 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07005201 tpAniSirGlobal mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005202
Krunal Soni3fa80e22018-01-09 14:16:02 -08005203 if (!mac_ctx) {
5204 sme_err("mac_ctx is NULL");
5205 return status;
5206 }
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07005207 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305208 if (QDF_IS_STATUS_SUCCESS(status)) {
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07005209 status = csr_send_chng_mcc_beacon_interval(mac_ctx,
5210 sessionId);
5211 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005212 }
5213 return status;
5214}
5215
5216/**
5217 * sme_set_host_offload(): API to set the host offload feature.
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005218 * @mac_handle: The handle returned by mac_open.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005219 * @sessionId: Session Identifier
5220 * @request: Pointer to the offload request.
5221 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305222 * Return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005223 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005224QDF_STATUS sme_set_host_offload(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005225 tpSirHostOffloadReq request)
5226{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005227 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305228 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005229
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305230 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005231 TRACE_CODE_SME_RX_HDD_SET_HOSTOFFLOAD, sessionId, 0));
5232 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305233 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005234#ifdef WLAN_NS_OFFLOAD
5235 if (SIR_IPV6_NS_OFFLOAD == request->offloadType) {
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005236 status = sme_set_ps_ns_offload(mac_handle, request,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005237 sessionId);
5238 } else
5239#endif /* WLAN_NS_OFFLOAD */
5240 {
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005241 status = sme_set_ps_host_offload(mac_handle, request,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005242 sessionId);
5243 }
5244 sme_release_global_lock(&pMac->sme);
5245 }
5246
5247 return status;
5248}
5249
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305250/*
5251 * sme_set_keep_alive() -
5252 * API to set the Keep Alive feature.
5253 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005254 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305255 * request - Pointer to the Keep Alive request.
5256 * Return QDF_STATUS
5257 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005258QDF_STATUS sme_set_keep_alive(mac_handle_t mac_handle, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005259 tpSirKeepAliveReq request)
5260{
5261 tpSirKeepAliveReq request_buf;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005262 struct scheduler_msg msg = {0};
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005263 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05305264 struct csr_roam_session *pSession = CSR_GET_SESSION(pMac, session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005265
Abhishek Singhe4a1f882017-08-10 17:59:44 +05305266 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005267 FL("WMA_SET_KEEP_ALIVE message"));
5268
5269 if (pSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305270 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005271 FL("Session not Found"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305272 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005273 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305274 request_buf = qdf_mem_malloc(sizeof(tSirKeepAliveReq));
Arif Hussain0ef77082018-10-10 16:42:53 -07005275 if (!request_buf)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305276 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005277
Anurag Chouhanc5548422016-02-24 18:33:27 +05305278 qdf_copy_macaddr(&request->bssid, &pSession->connectedProfile.bssid);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305279 qdf_mem_copy(request_buf, request, sizeof(tSirKeepAliveReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005280
Abhishek Singhe4a1f882017-08-10 17:59:44 +05305281 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005282 "buff TP %d input TP %d ", request_buf->timePeriod,
5283 request->timePeriod);
5284 request_buf->sessionId = session_id;
5285
5286 msg.type = WMA_SET_KEEP_ALIVE;
5287 msg.reserved = 0;
5288 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05305289 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
5290 session_id, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305291 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305292 scheduler_post_message(QDF_MODULE_ID_SME,
5293 QDF_MODULE_ID_WMA,
5294 QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305295 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305296 "Not able to post WMA_SET_KEEP_ALIVE message to WMA");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305297 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305298 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005299 }
5300
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305301 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005302}
5303
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305304/*
5305 * sme_get_operation_channel() -
5306 * API to get current channel on which STA is parked his function gives
5307 * channel information only of infra station or IBSS station
5308 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005309 * mac_handle, pointer to memory location and sessionId
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305310 * Returns QDF_STATUS_SUCCESS
5311 * QDF_STATUS_E_FAILURE
5312 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005313QDF_STATUS sme_get_operation_channel(mac_handle_t mac_handle,
5314 uint32_t *pChannel,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005315 uint8_t sessionId)
5316{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005317 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05305318 struct csr_roam_session *pSession;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005319
5320 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
5321 pSession = CSR_GET_SESSION(pMac, sessionId);
5322
5323 if ((pSession->connectedProfile.BSSType ==
5324 eCSR_BSS_TYPE_INFRASTRUCTURE)
5325 || (pSession->connectedProfile.BSSType ==
5326 eCSR_BSS_TYPE_IBSS)
5327 || (pSession->connectedProfile.BSSType ==
5328 eCSR_BSS_TYPE_INFRA_AP)
5329 || (pSession->connectedProfile.BSSType ==
5330 eCSR_BSS_TYPE_START_IBSS)) {
5331 *pChannel = pSession->connectedProfile.operationChannel;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305332 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005333 }
5334 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305335 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005336} /* sme_get_operation_channel ends here */
5337
Abhishek Singh7996eb72015-12-30 17:24:02 +05305338/**
5339 * sme_register_mgmt_frame_ind_callback() - Register a callback for
5340 * management frame indication to PE.
5341 *
5342 * @hal: hal pointer
5343 * @callback: callback pointer to be registered
5344 *
5345 * This function is used to register a callback for management
5346 * frame indication to PE.
5347 *
5348 * Return: Success if msg is posted to PE else Failure.
5349 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08005350QDF_STATUS sme_register_mgmt_frame_ind_callback(mac_handle_t hal,
Abhishek Singh7996eb72015-12-30 17:24:02 +05305351 sir_mgmt_frame_ind_callback callback)
5352{
5353 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
5354 struct sir_sme_mgmt_frame_cb_req *msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305355 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh7996eb72015-12-30 17:24:02 +05305356
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305357 if (QDF_STATUS_SUCCESS ==
Abhishek Singh7996eb72015-12-30 17:24:02 +05305358 sme_acquire_global_lock(&mac_ctx->sme)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305359 msg = qdf_mem_malloc(sizeof(*msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07005360 if (!msg) {
Abhishek Singh7996eb72015-12-30 17:24:02 +05305361 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305362 return QDF_STATUS_E_NOMEM;
Abhishek Singh7996eb72015-12-30 17:24:02 +05305363 }
Abhishek Singh7996eb72015-12-30 17:24:02 +05305364 msg->message_type = eWNI_SME_REGISTER_MGMT_FRAME_CB;
5365 msg->length = sizeof(*msg);
5366
5367 msg->callback = callback;
Rajeev Kumard138ac52017-01-30 18:38:37 -08005368 status = umac_send_mb_message_to_mac(msg);
Abhishek Singh7996eb72015-12-30 17:24:02 +05305369 sme_release_global_lock(&mac_ctx->sme);
5370 return status;
5371 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305372 return QDF_STATUS_E_FAILURE;
Abhishek Singh7996eb72015-12-30 17:24:02 +05305373}
5374
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305375/*
5376 * sme_RegisterMgtFrame() -
Jeff Johnson698eacd2018-05-12 17:00:03 -07005377 * To register management frame of specified type and subtype.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305378 *
5379 * frameType - type of the frame that needs to be passed to HDD.
5380 * matchData - data which needs to be matched before passing frame
5381 * to HDD.
5382 * matchDataLen - Length of matched data.
5383 * Return QDF_STATUS
5384 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005385QDF_STATUS sme_register_mgmt_frame(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005386 uint16_t frameType, uint8_t *matchData,
5387 uint16_t matchLen)
5388{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305389 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005390 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005391
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005392 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305393 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005394 tSirRegisterMgmtFrame *pMsg;
5395 uint16_t len;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05305396 struct csr_roam_session *pSession = CSR_GET_SESSION(pMac,
5397 sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005398
5399 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005400 sme_err("Session %d not found", sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005401 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305402 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005403 }
5404
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305405 if (!CSR_IS_SESSION_ANY(sessionId) &&
5406 !pSession->sessionActive) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305407 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005408 "%s Invalid Sessionid", __func__);
5409 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305410 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005411 }
5412
5413 len = sizeof(tSirRegisterMgmtFrame) + matchLen;
5414
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305415 pMsg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005416 if (NULL == pMsg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305417 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005418 else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005419 pMsg->messageType = eWNI_SME_REGISTER_MGMT_FRAME_REQ;
5420 pMsg->length = len;
5421 pMsg->sessionId = sessionId;
5422 pMsg->registerFrame = true;
5423 pMsg->frameType = frameType;
5424 pMsg->matchLen = matchLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305425 qdf_mem_copy(pMsg->matchData, matchData, matchLen);
Rajeev Kumard138ac52017-01-30 18:38:37 -08005426 status = umac_send_mb_message_to_mac(pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005427 }
5428 sme_release_global_lock(&pMac->sme);
5429 }
5430 return status;
5431}
5432
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305433/*
5434 * sme_DeregisterMgtFrame() -
Jeff Johnson698eacd2018-05-12 17:00:03 -07005435 * To De-register management frame of specified type and subtype.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305436 *
5437 * frameType - type of the frame that needs to be passed to HDD.
5438 * matchData - data which needs to be matched before passing frame
5439 * to HDD.
5440 * matchDataLen - Length of matched data.
5441 * Return QDF_STATUS
5442 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005443QDF_STATUS sme_deregister_mgmt_frame(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005444 uint16_t frameType, uint8_t *matchData,
5445 uint16_t matchLen)
5446{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305447 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005448 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005449
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305450 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005451 TRACE_CODE_SME_RX_HDD_DEREGISTER_MGMTFR, sessionId,
5452 0));
5453 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305454 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005455 tSirRegisterMgmtFrame *pMsg;
5456 uint16_t len;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05305457 struct csr_roam_session *pSession = CSR_GET_SESSION(pMac,
5458 sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005459
5460 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005461 sme_err("Session %d not found", sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005462 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305463 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005464 }
5465
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305466 if (!CSR_IS_SESSION_ANY(sessionId) &&
5467 !pSession->sessionActive) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305468 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005469 "%s Invalid Sessionid", __func__);
5470 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305471 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005472 }
5473
5474 len = sizeof(tSirRegisterMgmtFrame) + matchLen;
5475
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305476 pMsg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005477 if (NULL == pMsg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305478 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005479 else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005480 pMsg->messageType = eWNI_SME_REGISTER_MGMT_FRAME_REQ;
5481 pMsg->length = len;
5482 pMsg->registerFrame = false;
5483 pMsg->frameType = frameType;
5484 pMsg->matchLen = matchLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305485 qdf_mem_copy(pMsg->matchData, matchData, matchLen);
Rajeev Kumard138ac52017-01-30 18:38:37 -08005486 status = umac_send_mb_message_to_mac(pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005487 }
5488 sme_release_global_lock(&pMac->sme);
5489 }
5490 return status;
5491}
5492
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05305493/**
5494 * sme_prepare_mgmt_tx() - Prepares mgmt frame
5495 * @hal: The handle returned by mac_open
5496 * @session_id: session id
5497 * @buf: pointer to frame
5498 * @len: frame length
5499 *
5500 * Return: QDF_STATUS
5501 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08005502static QDF_STATUS sme_prepare_mgmt_tx(mac_handle_t hal, uint8_t session_id,
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05305503 const uint8_t *buf, uint32_t len)
5504{
5505 QDF_STATUS status = QDF_STATUS_SUCCESS;
5506 struct sir_mgmt_msg *msg;
5507 uint16_t msg_len;
5508 struct scheduler_msg sch_msg = {0};
5509
5510 sme_debug("prepares auth frame");
5511
5512 msg_len = sizeof(*msg) + len;
5513 msg = qdf_mem_malloc(msg_len);
5514 if (msg == NULL) {
5515 status = QDF_STATUS_E_NOMEM;
5516 } else {
5517 msg->type = eWNI_SME_SEND_MGMT_FRAME_TX;
5518 msg->msg_len = msg_len;
5519 msg->session_id = session_id;
5520 msg->data = (uint8_t *)msg + sizeof(*msg);
5521 qdf_mem_copy(msg->data, buf, len);
5522
5523 sch_msg.type = eWNI_SME_SEND_MGMT_FRAME_TX;
5524 sch_msg.bodyptr = msg;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305525 status = scheduler_post_message(QDF_MODULE_ID_SME,
5526 QDF_MODULE_ID_PE,
5527 QDF_MODULE_ID_PE, &sch_msg);
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05305528 }
5529 return status;
5530}
5531
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08005532QDF_STATUS sme_send_mgmt_tx(mac_handle_t hal, uint8_t session_id,
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05305533 const uint8_t *buf, uint32_t len)
5534{
5535 QDF_STATUS status = QDF_STATUS_SUCCESS;
5536 tpAniSirGlobal mac = PMAC_STRUCT(hal);
5537
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05305538 status = sme_acquire_global_lock(&mac->sme);
5539 if (QDF_IS_STATUS_SUCCESS(status)) {
5540 status = sme_prepare_mgmt_tx(hal, session_id, buf, len);
5541 sme_release_global_lock(&mac->sme);
5542 }
5543
5544 return status;
5545}
5546
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005547#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07005548/**
5549 * sme_configure_ext_wow() - configure Extr WoW
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005550 * @mac_handle - The handle returned by mac_open.
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07005551 * @wlanExtParams - Depicts the wlan Ext params.
5552 * @callback - ext_wow callback to be registered.
5553 * @callback_context - ext_wow callback context
5554 *
5555 * SME will pass this request to lower mac to configure Extr WoW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305556 * Return: QDF_STATUS
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07005557 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005558QDF_STATUS sme_configure_ext_wow(mac_handle_t mac_handle,
5559 tpSirExtWoWParams wlanExtParams,
5560 csr_readyToExtWoWCallback callback,
5561 void *callback_context)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005562{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305563 QDF_STATUS status = QDF_STATUS_SUCCESS;
5564 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005565 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005566 struct scheduler_msg message = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305567 tpSirExtWoWParams MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005568
5569 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305570 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005571
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305572 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005573 TRACE_CODE_SME_RX_HDD_CONFIG_EXTWOW, NO_SESSION, 0));
5574
5575 pMac->readyToExtWoWCallback = callback;
5576 pMac->readyToExtWoWContext = callback_context;
5577
5578 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305579 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005580
5581 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305582 qdf_mem_copy(MsgPtr, wlanExtParams, sizeof(*MsgPtr));
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08005583 message.bodyptr = MsgPtr;
5584 message.type = WMA_WLAN_EXT_WOW;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305585 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
5586 QDF_MODULE_ID_WMA,
5587 QDF_MODULE_ID_WMA,
5588 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305589 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005590 pMac->readyToExtWoWCallback = NULL;
5591 pMac->readyToExtWoWContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305592 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305593 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005594 }
5595 sme_release_global_lock(&pMac->sme);
5596 } else {
5597 pMac->readyToExtWoWCallback = NULL;
5598 pMac->readyToExtWoWContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305599 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005600 }
5601
5602 return status;
5603}
5604
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305605/*
5606 * sme_configure_app_type1_params() -
5607 * SME will pass this request to lower mac to configure Indoor WoW parameters.
5608 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005609 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305610 * wlanAppType1Params- Depicts the wlan App Type 1(Indoor) params
5611 * Return QDF_STATUS
5612 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005613QDF_STATUS sme_configure_app_type1_params(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005614 tpSirAppType1Params wlanAppType1Params)
5615{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305616 QDF_STATUS status = QDF_STATUS_SUCCESS;
5617 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005618 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005619 struct scheduler_msg message = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305620 tpSirAppType1Params MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005621
5622 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305623 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005624
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305625 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005626 TRACE_CODE_SME_RX_HDD_CONFIG_APP_TYPE1, NO_SESSION,
5627 0));
5628
5629 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305630 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005631 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305632 qdf_mem_copy(MsgPtr, wlanAppType1Params, sizeof(*MsgPtr));
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08005633 message.bodyptr = MsgPtr;
5634 message.type = WMA_WLAN_SET_APP_TYPE1_PARAMS;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305635 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
5636 QDF_MODULE_ID_WMA,
5637 QDF_MODULE_ID_WMA,
5638 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305639 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305640 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305641 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005642 }
5643 sme_release_global_lock(&pMac->sme);
5644 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305645 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005646 }
5647
5648 return status;
5649}
5650
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305651/*
5652 * sme_configure_app_type2_params() -
5653 * SME will pass this request to lower mac to configure Indoor WoW parameters.
5654 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005655 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305656 * wlanAppType2Params- Depicts the wlan App Type 2 (Outdoor) params
5657 * Return QDF_STATUS
5658 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005659QDF_STATUS sme_configure_app_type2_params(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305660 tpSirAppType2Params wlanAppType2Params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005661{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305662 QDF_STATUS status = QDF_STATUS_SUCCESS;
5663 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005664 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005665 struct scheduler_msg message = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305666 tpSirAppType2Params MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005667
5668 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305669 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005670
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305671 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005672 TRACE_CODE_SME_RX_HDD_CONFIG_APP_TYPE2, NO_SESSION,
5673 0));
5674
5675 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305676 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005677 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305678 qdf_mem_copy(MsgPtr, wlanAppType2Params, sizeof(*MsgPtr));
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08005679 message.bodyptr = MsgPtr;
5680 message.type = WMA_WLAN_SET_APP_TYPE2_PARAMS;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305681 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
5682 QDF_MODULE_ID_WMA,
5683 QDF_MODULE_ID_WMA,
5684 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305685 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305686 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305687 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005688 }
5689 sme_release_global_lock(&pMac->sme);
5690 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305691 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005692 }
5693
5694 return status;
5695}
5696#endif
5697
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305698/*
5699 * sme_get_infra_session_id
5700 * To get the session ID for infra session, if connected
5701 * This is a synchronous API.
5702 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005703 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305704 * sessionid, -1 if infra session is not connected
5705 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005706int8_t sme_get_infra_session_id(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005707{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305708 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005709 int8_t sessionid = -1;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005710 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005711
5712 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305713 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005714
5715 sessionid = csr_get_infra_session_id(pMac);
5716
5717 sme_release_global_lock(&pMac->sme);
5718 }
5719
5720 return sessionid;
5721}
5722
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305723/*
5724 * sme_get_infra_operation_channel() -
5725 * To get the operating channel for infra session, if connected
5726 * This is a synchronous API.
5727 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005728 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305729 * sessionId - the sessionId returned by sme_open_session.
5730 * Return operating channel, 0 if infra session is not connected
5731 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005732uint8_t sme_get_infra_operation_channel(mac_handle_t mac_handle,
5733 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005734{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305735 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005736 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005737 uint8_t channel = 0;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305738
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005739 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305740 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005741
5742 channel = csr_get_infra_operation_channel(pMac, sessionId);
5743
5744 sme_release_global_lock(&pMac->sme);
5745 }
5746
5747 return channel;
5748}
5749
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305750/* This routine will return poerating channel on which other BSS is operating
5751 * to be used for concurrency mode. If other BSS is not up or not connected it
5752 * will return 0
5753 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005754uint8_t sme_get_concurrent_operation_channel(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005755{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305756 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005757 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005758 uint8_t channel = 0;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305759
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005760 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305761 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005762
5763 channel = csr_get_concurrent_operation_channel(pMac);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305764 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
5765 "%s: Other Concurrent Channel: %d", __func__, channel);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005766 sme_release_global_lock(&pMac->sme);
5767 }
5768
5769 return channel;
5770}
5771
5772#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005773uint16_t sme_check_concurrent_channel_overlap(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08005774 uint16_t sap_ch,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005775 eCsrPhyMode sapPhyMode,
5776 uint8_t cc_switch_mode)
5777{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305778 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005779 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005780 uint16_t channel = 0;
5781
5782 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305783 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005784 channel =
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305785 csr_check_concurrent_channel_overlap(pMac, sap_ch,
5786 sapPhyMode,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005787 cc_switch_mode);
5788 sme_release_global_lock(&pMac->sme);
5789 }
5790
5791 return channel;
5792}
5793#endif
5794
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305795/**
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005796 * sme_set_tsfcb() - Set callback for TSF capture
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005797 * @mac_handle: Handler return by mac_open
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005798 * @cb_fn: Callback function pointer
5799 * @db_ctx: Callback data
5800 *
5801 * Return: QDF_STATUS
5802 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005803QDF_STATUS sme_set_tsfcb(mac_handle_t mac_handle,
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005804 int (*cb_fn)(void *cb_ctx, struct stsf *ptsf), void *cb_ctx)
5805{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005806 tpAniSirGlobal mac = PMAC_STRUCT(mac_handle);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005807 QDF_STATUS status;
5808
Manikandan Mohan976e7562016-03-15 16:33:31 -07005809 status = sme_acquire_global_lock(&mac->sme);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005810 if (QDF_IS_STATUS_SUCCESS(status)) {
Manikandan Mohan976e7562016-03-15 16:33:31 -07005811 mac->sme.get_tsf_cb = cb_fn;
5812 mac->sme.get_tsf_cxt = cb_ctx;
5813 sme_release_global_lock(&mac->sme);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005814 }
5815 return status;
5816}
5817
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305818/**
5819 * sme_reset_tsfcb() - Reset callback for TSF capture
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005820 * @mac_handle: Handler return by mac_open
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305821 *
5822 * This function reset the tsf capture callback to SME
5823 *
5824 * Return: QDF_STATUS
5825 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005826QDF_STATUS sme_reset_tsfcb(mac_handle_t mac_handle)
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305827{
5828 tpAniSirGlobal mac;
5829 QDF_STATUS status;
5830
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005831 if (!mac_handle) {
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305832 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005833 FL("mac_handle is not valid"));
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305834 return QDF_STATUS_E_INVAL;
5835 }
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005836 mac = PMAC_STRUCT(mac_handle);
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305837
5838 status = sme_acquire_global_lock(&mac->sme);
5839 if (QDF_IS_STATUS_SUCCESS(status)) {
5840 mac->sme.get_tsf_cb = NULL;
5841 mac->sme.get_tsf_cxt = NULL;
5842 sme_release_global_lock(&mac->sme);
5843 }
5844 return status;
5845}
5846
yuanl2746f072018-09-21 19:19:16 +08005847#if defined(WLAN_FEATURE_TSF) && !defined(WLAN_FEATURE_TSF_PLUS_NOIRQ)
Manikandan Mohan976e7562016-03-15 16:33:31 -07005848/*
yuanl2746f072018-09-21 19:19:16 +08005849 * sme_set_tsf_gpio() - set gpio pin that be toggled when capture tsf
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005850 * @mac_handle: Handler return by mac_open
Manikandan Mohan976e7562016-03-15 16:33:31 -07005851 * @pinvalue: gpio pin id
5852 *
5853 * Return: QDF_STATUS
5854 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005855QDF_STATUS sme_set_tsf_gpio(mac_handle_t mac_handle, uint32_t pinvalue)
Manikandan Mohan976e7562016-03-15 16:33:31 -07005856{
5857 QDF_STATUS status;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08005858 struct scheduler_msg tsf_msg = {0};
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005859 tpAniSirGlobal mac = PMAC_STRUCT(mac_handle);
Manikandan Mohan976e7562016-03-15 16:33:31 -07005860
5861 status = sme_acquire_global_lock(&mac->sme);
5862 if (QDF_IS_STATUS_SUCCESS(status)) {
5863 tsf_msg.type = WMA_TSF_GPIO_PIN;
5864 tsf_msg.reserved = 0;
5865 tsf_msg.bodyval = pinvalue;
5866
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305867 status = scheduler_post_message(QDF_MODULE_ID_SME,
5868 QDF_MODULE_ID_WMA,
5869 QDF_MODULE_ID_WMA, &tsf_msg);
Manikandan Mohan976e7562016-03-15 16:33:31 -07005870 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005871 sme_err("Unable to post WMA_TSF_GPIO_PIN");
Manikandan Mohan976e7562016-03-15 16:33:31 -07005872 status = QDF_STATUS_E_FAILURE;
5873 }
5874 sme_release_global_lock(&mac->sme);
5875 }
5876 return status;
5877}
5878#endif
5879
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08005880QDF_STATUS sme_get_cfg_valid_channels(uint8_t *aValidChannels,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005881 uint32_t *len)
5882{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305883 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08005884 tpAniSirGlobal mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005885
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08005886 if (NULL == mac_ctx) {
5887 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
5888 FL("Invalid MAC context"));
5889 return QDF_STATUS_E_FAILURE;
5890 }
5891
5892 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305893 if (QDF_IS_STATUS_SUCCESS(status)) {
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08005894 status = csr_get_cfg_valid_channels(mac_ctx,
5895 aValidChannels, len);
5896 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005897 }
5898
5899 return status;
5900}
5901
Amar Singhalf0a94ad2017-11-27 15:20:00 -08005902static uint8_t *sme_reg_hint_to_str(const enum country_src src)
5903{
5904 switch (src) {
5905 case SOURCE_CORE:
5906 return "WORLD MODE";
5907
5908 case SOURCE_DRIVER:
5909 return "BDF file";
5910
5911 case SOURCE_USERSPACE:
5912 return "user-space";
5913
5914 case SOURCE_11D:
5915 return "802.11D IEs in beacons";
5916
5917 default:
5918 return "unknown";
5919 }
5920}
5921
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005922void sme_set_cc_src(mac_handle_t mac_handle, enum country_src cc_src)
Amar Singhal6edf9732016-11-20 21:43:40 -08005923{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005924 tpAniSirGlobal mac_ctx = PMAC_STRUCT(mac_handle);
Amar Singhal6edf9732016-11-20 21:43:40 -08005925
5926 mac_ctx->reg_hint_src = cc_src;
Amar Singhalf0a94ad2017-11-27 15:20:00 -08005927
5928 sme_debug("Country source is %s",
5929 sme_reg_hint_to_str(cc_src));
Amar Singhal6edf9732016-11-20 21:43:40 -08005930}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005931
5932/**
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005933 * sme_handle_generic_change_country_code() - handles country ch req
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005934 * @mac_ctx: mac global context
5935 * @msg: request msg packet
5936 *
5937 * If Supplicant country code is priority than 11d is disabled.
5938 * If 11D is enabled, we update the country code after every scan.
5939 * Hence when Supplicant country code is priority, we don't need 11D info.
5940 * Country code from Supplicant is set as current country code.
5941 *
5942 * Return: status of operation
5943 */
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305944static QDF_STATUS
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005945sme_handle_generic_change_country_code(tpAniSirGlobal mac_ctx,
5946 void *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005947{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305948 QDF_STATUS status = QDF_STATUS_SUCCESS;
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005949 v_REGDOMAIN_t reg_domain_id = 0;
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005950 bool user_ctry_priority =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005951 mac_ctx->roam.configParam.fSupplicantCountryCodeHasPriority;
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005952 tAniGenericChangeCountryCodeReq *msg = pMsgBuf;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005953
Amar Singhal6edf9732016-11-20 21:43:40 -08005954 if (SOURCE_11D != mac_ctx->reg_hint_src) {
5955 if (SOURCE_DRIVER != mac_ctx->reg_hint_src) {
5956 if (user_ctry_priority)
5957 mac_ctx->roam.configParam.Is11dSupportEnabled =
5958 false;
5959 else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305960 if (mac_ctx->roam.configParam.
5961 Is11dSupportEnabled &&
5962 mac_ctx->scan.countryCode11d[0] != 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005963
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005964 sme_debug("restore 11d");
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005965
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305966 status =
5967 csr_get_regulatory_domain_for_country(
Amar Singhal6edf9732016-11-20 21:43:40 -08005968 mac_ctx,
5969 mac_ctx->scan.countryCode11d,
5970 &reg_domain_id,
5971 SOURCE_11D);
5972 return QDF_STATUS_E_FAILURE;
5973 }
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005974 }
5975 }
5976 } else {
5977 /* if kernel gets invalid country code; it
5978 * resets the country code to world
5979 */
5980 if (('0' != msg->countryCode[0]) ||
5981 ('0' != msg->countryCode[1]))
5982 qdf_mem_copy(mac_ctx->scan.countryCode11d,
5983 msg->countryCode,
5984 WNI_CFG_COUNTRY_CODE_LEN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005985 }
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005986
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005987 qdf_mem_copy(mac_ctx->scan.countryCodeCurrent,
5988 msg->countryCode,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005989 WNI_CFG_COUNTRY_CODE_LEN);
Amar Singhal9d5b1fe2016-10-16 20:16:05 -07005990
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005991 /* get the channels based on new cc */
5992 status = csr_get_channel_and_power_list(mac_ctx);
5993
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305994 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005995 sme_err("fail to get Channels");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005996 return status;
5997 }
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005998
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005999 /* reset info based on new cc, and we are done */
6000 csr_apply_channel_power_info_wrapper(mac_ctx);
6001
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006002 csr_scan_filter_results(mac_ctx);
Amar Singhalb6d0dc42016-10-19 09:45:05 -07006003
6004 /* scans after the country is set by User hints or
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006005 * Country IE
6006 */
6007 mac_ctx->scan.curScanType = eSIR_ACTIVE_SCAN;
Amar Singhal9d5b1fe2016-10-16 20:16:05 -07006008
Amar Singhal6edf9732016-11-20 21:43:40 -08006009 mac_ctx->reg_hint_src = SOURCE_UNKNOWN;
6010
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006011 sme_disconnect_connected_sessions(mac_ctx);
Amar Singhalb6d0dc42016-10-19 09:45:05 -07006012
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306013 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006014}
6015
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08006016QDF_STATUS sme_update_channel_list(mac_handle_t hal)
Mukul Sharmaecf8e092017-12-19 22:36:31 +05306017{
Jeff Johnson330c0bf2018-06-01 15:13:12 -07006018 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
6019 QDF_STATUS status;
Mukul Sharmaecf8e092017-12-19 22:36:31 +05306020
6021 status = sme_acquire_global_lock(&mac_ctx->sme);
6022 if (QDF_IS_STATUS_SUCCESS(status)) {
6023 /* Update umac channel (enable/disable) from cds channels */
6024 status = csr_get_channel_and_power_list(mac_ctx);
6025 if (status != QDF_STATUS_SUCCESS) {
6026 sme_err("fail to get Channels");
6027 sme_release_global_lock(&mac_ctx->sme);
6028 return status;
6029 }
6030
6031 csr_apply_channel_power_info_wrapper(mac_ctx);
6032 csr_scan_filter_results(mac_ctx);
6033 sme_disconnect_connected_sessions(mac_ctx);
6034 sme_release_global_lock(&mac_ctx->sme);
6035 }
6036
6037 return status;
6038}
6039
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006040static bool
6041sme_search_in_base_ch_lst(tpAniSirGlobal mac_ctx, uint8_t curr_ch)
6042{
6043 uint8_t i;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05306044 struct csr_channel *ch_lst_info;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306045
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006046 ch_lst_info = &mac_ctx->scan.base_channels;
6047 for (i = 0; i < ch_lst_info->numChannels; i++) {
6048 if (ch_lst_info->channelList[i] == curr_ch)
6049 return true;
6050 }
6051
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006052 return false;
6053}
6054/**
6055 * sme_disconnect_connected_sessions() - Disconnect STA and P2P client session
6056 * if channel is not supported
6057 * @mac_ctx: mac global context
6058 *
6059 * If new country code does not support the channel on which STA/P2P client
6060 * is connetced, it sends the disconnect to the AP/P2P GO
6061 *
6062 * Return: void
6063 */
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306064static void sme_disconnect_connected_sessions(tpAniSirGlobal mac_ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006065{
6066 uint8_t session_id, found = false;
6067 uint8_t curr_ch;
6068
6069 for (session_id = 0; session_id < CSR_ROAM_SESSION_MAX; session_id++) {
6070 if (!csr_is_session_client_and_connected(mac_ctx, session_id))
6071 continue;
6072 found = false;
6073 /* Session is connected.Check the channel */
6074 curr_ch = csr_get_infra_operation_channel(mac_ctx,
6075 session_id);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006076 sme_debug("Current Operating channel : %d, session :%d",
6077 curr_ch, session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006078 found = sme_search_in_base_ch_lst(mac_ctx, curr_ch);
6079 if (!found) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006080 sme_debug("Disconnect Session: %d", session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006081 csr_roam_disconnect(mac_ctx, session_id,
6082 eCSR_DISCONNECT_REASON_UNSPECIFIED);
6083 }
6084 }
6085}
6086
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006087#ifdef WLAN_FEATURE_PACKET_FILTERING
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006088QDF_STATUS sme_8023_multicast_list(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006089 tpSirRcvFltMcAddrList pMulticastAddrs)
6090{
6091 tpSirRcvFltMcAddrList request_buf;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07006092 struct scheduler_msg msg = {0};
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006093 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05306094 struct csr_roam_session *pSession = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006095
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306096 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
6097 "%s: ulMulticastAddrCnt: %d, multicastAddr[0]: %pK", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006098 pMulticastAddrs->ulMulticastAddrCnt,
Srinivas Girigowda98530492015-11-20 17:39:24 -08006099 pMulticastAddrs->multicastAddr[0].bytes);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006100
Ravi Joshi4f447cb2016-07-19 13:42:01 -07006101 /* Find the connected Infra / P2P_client connected session */
Krunal Sonifea06802017-04-13 14:44:48 -07006102 pSession = CSR_GET_SESSION(pMac, sessionId);
6103 if (!CSR_IS_SESSION_VALID(pMac, sessionId) ||
6104 (!csr_is_conn_state_infra(pMac, sessionId) &&
6105 !csr_is_ndi_started(pMac, sessionId))) {
Abhishek Singh5d8d7332017-08-10 15:15:24 +05306106 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Srinivas Girigowdaf2599dd2015-11-16 18:20:46 -08006107 "%s: Unable to find the session Id: %d", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006108 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306109 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006110 }
6111
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306112 request_buf = qdf_mem_malloc(sizeof(tSirRcvFltMcAddrList));
Arif Hussain0ef77082018-10-10 16:42:53 -07006113 if (!request_buf)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306114 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006115
Ravi Joshi4f447cb2016-07-19 13:42:01 -07006116 if (!csr_is_conn_state_connected_infra(pMac, sessionId) &&
6117 !csr_is_ndi_started(pMac, sessionId)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306118 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ravi Joshi4f447cb2016-07-19 13:42:01 -07006119 "%s: Request ignored, session %d is not connected or started",
6120 __func__, sessionId);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306121 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306122 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006123 }
6124
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306125 qdf_mem_copy(request_buf, pMulticastAddrs,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006126 sizeof(tSirRcvFltMcAddrList));
6127
Anurag Chouhanc5548422016-02-24 18:33:27 +05306128 qdf_copy_macaddr(&request_buf->self_macaddr, &pSession->selfMacAddr);
6129 qdf_copy_macaddr(&request_buf->bssid,
Srinivas Girigowda98530492015-11-20 17:39:24 -08006130 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006131
6132 msg.type = WMA_8023_MULTICAST_LIST_REQ;
6133 msg.reserved = 0;
6134 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05306135 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
6136 sessionId, msg.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05306137 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
6138 QDF_MODULE_ID_WMA,
6139 QDF_MODULE_ID_WMA,
6140 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306141 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306142 "%s: Not able to post WMA_8023_MULTICAST_LIST message to WMA",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006143 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306144 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306145 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006146 }
6147
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306148 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006149}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006150#endif /* WLAN_FEATURE_PACKET_FILTERING */
6151
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306152/*
6153 * sme_is_channel_valid() -
6154 * To check if the channel is valid for currently established domain
6155 * This is a synchronous API.
6156 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006157 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306158 * channel - channel to verify
6159 * Return true/false, true if channel is valid
6160 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006161bool sme_is_channel_valid(mac_handle_t mac_handle, uint8_t channel)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006162{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306163 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006164 bool valid = false;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006165 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006166
6167 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306168 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006169
6170 valid = csr_roam_is_channel_valid(pMac, channel);
6171
6172 sme_release_global_lock(&pMac->sme);
6173 }
6174
6175 return valid;
6176}
6177
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306178/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306179 * sme_get_freq_band() -
6180 * Used to get the current band settings.
6181 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006182 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306183 * pBand pointer to hold band value
6184 * Return QDF_STATUS
6185 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006186QDF_STATUS sme_get_freq_band(mac_handle_t mac_handle, enum band_info *pBand)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006187{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306188 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006189 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006190
6191 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306192 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnsonbfd24632018-10-30 09:28:50 -07006193 *pBand = csr_get_current_band(pMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006194 sme_release_global_lock(&pMac->sme);
6195 }
6196 return status;
6197}
6198
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306199/*
6200 * sme_set_max_tx_power_per_band() -
6201 * Set the Maximum Transmit Power specific to band dynamically.
6202 * Note: this setting will not persist over reboots.
6203 *
6204 * band
6205 * power to set in dB
6206 * Return QDF_STATUS
6207 */
Varun Reddy Yeturua48bc412017-11-17 15:33:35 -08006208QDF_STATUS sme_set_max_tx_power_per_band(enum band_info band, int8_t dB)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006209{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07006210 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006211 tpMaxTxPowerPerBandParams pMaxTxPowerPerBandParams = NULL;
6212
6213 pMaxTxPowerPerBandParams =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306214 qdf_mem_malloc(sizeof(tMaxTxPowerPerBandParams));
Arif Hussain0ef77082018-10-10 16:42:53 -07006215 if (!pMaxTxPowerPerBandParams)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306216 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006217
6218 pMaxTxPowerPerBandParams->power = dB;
6219 pMaxTxPowerPerBandParams->bandInfo = band;
6220
6221 msg.type = WMA_SET_MAX_TX_POWER_PER_BAND_REQ;
6222 msg.reserved = 0;
6223 msg.bodyptr = pMaxTxPowerPerBandParams;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05306224 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
6225 NO_SESSION, msg.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05306226 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
6227 QDF_MODULE_ID_WMA,
6228 QDF_MODULE_ID_WMA,
6229 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306230 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006231 "%s:Not able to post WMA_SET_MAX_TX_POWER_PER_BAND_REQ",
6232 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306233 qdf_mem_free(pMaxTxPowerPerBandParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306234 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006235 }
6236
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306237 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006238}
6239
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306240/*
6241 * sme_set_max_tx_power() -
6242 * Set the Maximum Transmit Power dynamically. Note: this setting will
6243 * not persist over reboots.
6244 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006245 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306246 * pBssid BSSID to set the power cap for
6247 * pBssid pSelfMacAddress self MAC Address
6248 * pBssid power to set in dB
6249 * Return QDF_STATUS
6250 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006251QDF_STATUS sme_set_max_tx_power(mac_handle_t mac_handle,
6252 struct qdf_mac_addr pBssid,
Anurag Chouhan6d760662016-02-20 16:05:43 +05306253 struct qdf_mac_addr pSelfMacAddress, int8_t dB)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006254{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07006255 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006256 tpMaxTxPowerParams pMaxTxParams = NULL;
6257
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306258 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006259 TRACE_CODE_SME_RX_HDD_SET_MAXTXPOW, NO_SESSION, 0));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306260 pMaxTxParams = qdf_mem_malloc(sizeof(tMaxTxPowerParams));
Arif Hussain0ef77082018-10-10 16:42:53 -07006261 if (!pMaxTxParams)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306262 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006263
Anurag Chouhanc5548422016-02-24 18:33:27 +05306264 qdf_copy_macaddr(&pMaxTxParams->bssId, &pBssid);
6265 qdf_copy_macaddr(&pMaxTxParams->selfStaMacAddr, &pSelfMacAddress);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006266 pMaxTxParams->power = dB;
6267
6268 msg.type = WMA_SET_MAX_TX_POWER_REQ;
6269 msg.reserved = 0;
6270 msg.bodyptr = pMaxTxParams;
6271
gaurank kathpalia36b0c582018-08-28 17:45:43 +05306272 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
6273 QDF_MODULE_ID_WMA,
6274 QDF_MODULE_ID_WMA,
6275 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306276 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006277 "%s: Not able to post WMA_SET_MAX_TX_POWER_REQ message to WMA",
6278 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306279 qdf_mem_free(pMaxTxParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306280 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006281 }
6282
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306283 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006284}
6285
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306286/*
6287 * sme_set_custom_mac_addr() -
6288 * Set the customer Mac Address.
6289 *
6290 * customMacAddr customer MAC Address
6291 * Return QDF_STATUS
6292 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306293QDF_STATUS sme_set_custom_mac_addr(tSirMacAddr customMacAddr)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006294{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07006295 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006296 tSirMacAddr *pBaseMacAddr;
6297
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306298 pBaseMacAddr = qdf_mem_malloc(sizeof(tSirMacAddr));
Arif Hussain0ef77082018-10-10 16:42:53 -07006299 if (!pBaseMacAddr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306300 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006301
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306302 qdf_mem_copy(*pBaseMacAddr, customMacAddr, sizeof(tSirMacAddr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006303
6304 msg.type = SIR_HAL_SET_BASE_MACADDR_IND;
6305 msg.reserved = 0;
6306 msg.bodyptr = pBaseMacAddr;
6307
gaurank kathpalia36b0c582018-08-28 17:45:43 +05306308 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
6309 QDF_MODULE_ID_WMA,
6310 QDF_MODULE_ID_WMA,
6311 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306312 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306313 "Not able to post SIR_HAL_SET_BASE_MACADDR_IND message to WMA");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306314 qdf_mem_free(pBaseMacAddr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306315 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006316 }
6317
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306318 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006319}
6320
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306321/*
6322 * sme_set_tx_power() -
6323 * Set Transmit Power dynamically.
6324 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006325 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306326 * sessionId Target Session ID
6327 * BSSID
6328 * dev_mode dev_mode such as station, P2PGO, SAP
6329 * dBm power to set
6330 * Return QDF_STATUS
6331 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006332QDF_STATUS sme_set_tx_power(mac_handle_t mac_handle, uint8_t sessionId,
Anurag Chouhan6d760662016-02-20 16:05:43 +05306333 struct qdf_mac_addr pBSSId,
Jeff Johnsonc1e62782017-11-09 09:50:17 -08006334 enum QDF_OPMODE dev_mode, int dBm)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006335{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07006336 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006337 tpMaxTxPowerParams pTxParams = NULL;
6338 int8_t power = (int8_t) dBm;
6339
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306340 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006341 TRACE_CODE_SME_RX_HDD_SET_TXPOW, sessionId, 0));
6342
6343 /* make sure there is no overflow */
6344 if ((int)power != dBm) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306345 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006346 "%s: error, invalid power = %d", __func__, dBm);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306347 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006348 }
6349
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306350 pTxParams = qdf_mem_malloc(sizeof(tMaxTxPowerParams));
Arif Hussain0ef77082018-10-10 16:42:53 -07006351 if (!pTxParams)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306352 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006353
Anurag Chouhanc5548422016-02-24 18:33:27 +05306354 qdf_copy_macaddr(&pTxParams->bssId, &pBSSId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006355 pTxParams->power = power; /* unit is dBm */
6356 pTxParams->dev_mode = dev_mode;
6357 msg.type = WMA_SET_TX_POWER_REQ;
6358 msg.reserved = 0;
6359 msg.bodyptr = pTxParams;
6360
gaurank kathpalia36b0c582018-08-28 17:45:43 +05306361 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
6362 QDF_MODULE_ID_WMA,
6363 QDF_MODULE_ID_WMA,
6364 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306365 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006366 "%s: failed to post WMA_SET_TX_POWER_REQ to WMA",
6367 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306368 qdf_mem_free(pTxParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306369 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006370 }
6371
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306372 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006373}
6374
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08006375QDF_STATUS sme_update_session_param(mac_handle_t hal, uint8_t session_id,
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05306376 uint32_t param_type, uint32_t param_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006377{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306378 QDF_STATUS status = QDF_STATUS_SUCCESS;
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05306379 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006380 uint16_t len;
6381
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05306382 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306383 if (QDF_IS_STATUS_SUCCESS(status)) {
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05306384 struct sir_update_session_param *msg;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05306385 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx,
6386 session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006387
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05306388 if (!session) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006389 sme_err("Session: %d not found", session_id);
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05306390 sme_release_global_lock(&mac_ctx->sme);
6391 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006392 }
6393
Selvaraj, Sridhar5b5a0652017-05-04 11:23:07 +05306394 if (param_type == SIR_PARAM_IGNORE_ASSOC_DISALLOWED)
6395 mac_ctx->ignore_assoc_disallowed = param_val;
6396
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05306397 if (!session->sessionActive)
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306398 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006399
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05306400 len = sizeof(*msg);
6401 msg = qdf_mem_malloc(len);
6402 if (!msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306403 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006404 else {
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05306405 msg->message_type = eWNI_SME_SESSION_UPDATE_PARAM;
6406 msg->length = len;
6407 msg->session_id = session_id;
6408 msg->param_type = param_type;
6409 msg->param_val = param_val;
Rajeev Kumard138ac52017-01-30 18:38:37 -08006410 status = umac_send_mb_message_to_mac(msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006411 }
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05306412 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006413 }
6414 return status;
6415}
6416
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306417/*
6418 * sme_set_tm_level() -
6419 * Set Thermal Mitigation Level to RIVA
6420 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006421 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306422 * newTMLevel - new Thermal Mitigation Level
6423 * tmMode - Thermal Mitigation handle mode, default 0
6424 * Return QDF_STATUS
6425 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006426QDF_STATUS sme_set_tm_level(mac_handle_t mac_handle,
6427 uint16_t newTMLevel,
6428 uint16_t tmMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006429{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306430 QDF_STATUS status = QDF_STATUS_SUCCESS;
6431 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006432 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07006433 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006434 tAniSetTmLevelReq *setTmLevelReq = NULL;
6435
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306436 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006437 TRACE_CODE_SME_RX_HDD_SET_TMLEVEL, NO_SESSION, 0));
6438 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306439 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006440 setTmLevelReq =
6441 (tAniSetTmLevelReq *)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306442 qdf_mem_malloc(sizeof(tAniSetTmLevelReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006443 if (NULL == setTmLevelReq) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006444 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306445 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006446 }
6447
6448 setTmLevelReq->tmMode = tmMode;
6449 setTmLevelReq->newTmLevel = newTMLevel;
6450
6451 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08006452 message.bodyptr = setTmLevelReq;
6453 message.type = WMA_SET_TM_LEVEL_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05306454 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08006455 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05306456 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
6457 QDF_MODULE_ID_WMA,
6458 QDF_MODULE_ID_WMA,
6459 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306460 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306461 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006462 "%s: Post Set TM Level MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306463 qdf_mem_free(setTmLevelReq);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306464 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006465 }
6466 sme_release_global_lock(&pMac->sme);
6467 }
6468 return status;
6469}
6470
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306471/*
6472 * sme_feature_caps_exchange() - SME interface to exchange capabilities between
6473 * Host and FW.
6474 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006475 * mac_handle - HAL handle for device
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306476 * Return NONE
6477 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006478void sme_feature_caps_exchange(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006479{
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306480 MTRACE(qdf_trace
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306481 (QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_CAPS_EXCH,
6482 NO_SESSION, 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006483}
6484
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306485/*
6486 * sme_disable_feature_capablity() - SME interface to disable Active mode
6487 * offload capablity in Host.
6488 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006489 * mac_handle - HAL handle for device
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306490 * Return NONE
6491 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006492void sme_disable_feature_capablity(uint8_t feature_index)
6493{
6494}
6495
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306496/*
6497 * sme_reset_power_values_for5_g
6498 * Reset the power values for 5G band with default power values.
6499 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006500 * mac_handle - HAL handle for device
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306501 * Return NONE
6502 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006503void sme_reset_power_values_for5_g(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006504{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006505 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306506
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306507 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006508 TRACE_CODE_SME_RX_HDD_RESET_PW5G, NO_SESSION, 0));
6509 csr_save_channel_power_for_band(pMac, true);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306510 /* Store the channel+power info in the global place: Cfg */
6511 csr_apply_power2_current(pMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006512}
6513
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306514/*
6515 * sme_update_roam_prefer5_g_hz() -
6516 * Enable/disable Roam prefer 5G runtime option
6517 * This function is called through dynamic setConfig callback function
6518 * to configure the Roam prefer 5G runtime option
6519 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006520 * mac_handle - HAL handle for device
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306521 * nRoamPrefer5GHz Enable/Disable Roam prefer 5G runtime option
6522 * Return Success or failure
6523 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006524
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006525QDF_STATUS sme_update_roam_prefer5_g_hz(mac_handle_t mac_handle,
gaurank kathpalia14e2f912017-08-31 14:51:45 +05306526 bool nRoamPrefer5GHz)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006527{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006528 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306529 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006530
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306531 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006532 TRACE_CODE_SME_RX_HDD_UPDATE_RP5G, NO_SESSION, 0));
6533 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306534 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05306535 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006536 "%s: gRoamPrefer5GHz is changed from %d to %d",
6537 __func__, pMac->roam.configParam.nRoamPrefer5GHz,
6538 nRoamPrefer5GHz);
6539 pMac->roam.configParam.nRoamPrefer5GHz = nRoamPrefer5GHz;
6540 sme_release_global_lock(&pMac->sme);
6541 }
6542
6543 return status;
6544}
6545
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306546/*
6547 * sme_set_roam_intra_band() -
6548 * enable/disable Intra band roaming
6549 * This function is called through dynamic setConfig callback function
6550 * to configure the intra band roaming
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006551 * mac_handle - HAL handle for device
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306552 * nRoamIntraBand Enable/Disable Intra band roaming
6553 * Return Success or failure
6554 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006555QDF_STATUS sme_set_roam_intra_band(mac_handle_t mac_handle,
6556 const bool nRoamIntraBand)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006557{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006558 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306559 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006560
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306561 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006562 TRACE_CODE_SME_RX_HDD_SET_ROAMIBAND, NO_SESSION, 0));
6563 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306564 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05306565 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006566 "%s: gRoamIntraBand is changed from %d to %d",
6567 __func__, pMac->roam.configParam.nRoamIntraBand,
6568 nRoamIntraBand);
6569 pMac->roam.configParam.nRoamIntraBand = nRoamIntraBand;
6570 sme_release_global_lock(&pMac->sme);
6571 }
6572
6573 return status;
6574}
6575
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306576/*
6577 * sme_update_roam_scan_n_probes() -
6578 * Function to update roam scan N probes
6579 * This function is called through dynamic setConfig callback function
6580 * to update roam scan N probes
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006581 * mac_handle - HAL handle for device
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306582 * sessionId - Session Identifier
6583 * nProbes number of probe requests to be sent out
6584 * Return Success or failure
6585 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006586QDF_STATUS sme_update_roam_scan_n_probes(mac_handle_t mac_handle,
6587 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006588 const uint8_t nProbes)
6589{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006590 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306591 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006592
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306593 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006594 TRACE_CODE_SME_RX_HDD_UPDATE_ROAM_SCAN_N_PROBES,
6595 NO_SESSION, 0));
6596 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306597 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05306598 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006599 "%s: gRoamScanNProbes is changed from %d to %d",
6600 __func__, pMac->roam.configParam.nProbes, nProbes);
6601 pMac->roam.configParam.nProbes = nProbes;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306602
6603 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
6604 csr_roam_offload_scan(pMac, sessionId,
6605 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6606 REASON_NPROBES_CHANGED);
6607 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006608 sme_release_global_lock(&pMac->sme);
6609 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006610 return status;
6611}
6612
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306613/*
6614 * sme_update_roam_scan_home_away_time() -
6615 * Function to update roam scan Home away time
6616 * This function is called through dynamic setConfig callback function
6617 * to update roam scan home away time
6618 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006619 * mac_handle - HAL handle for device
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306620 * sessionId - Session Identifier
6621 * nRoamScanAwayTime Scan home away time
6622 * bSendOffloadCmd If true then send offload command to firmware
6623 * If false then command is not sent to firmware
6624 * Return Success or failure
6625 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006626QDF_STATUS sme_update_roam_scan_home_away_time(
6627 mac_handle_t mac_handle,
6628 uint8_t sessionId,
6629 const uint16_t nRoamScanHomeAwayTime,
6630 const bool bSendOffloadCmd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006631{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006632 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306633 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006634
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306635 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006636 TRACE_CODE_SME_RX_HDD_UPDATE_ROAM_SCAN_HOME_AWAY_TIME,
6637 NO_SESSION, 0));
6638 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306639 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05306640 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006641 "%s: gRoamScanHomeAwayTime is changed from %d to %d",
6642 __func__,
6643 pMac->roam.configParam.nRoamScanHomeAwayTime,
6644 nRoamScanHomeAwayTime);
6645 pMac->roam.configParam.nRoamScanHomeAwayTime =
6646 nRoamScanHomeAwayTime;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306647
6648 if (pMac->roam.configParam.isRoamOffloadScanEnabled &&
6649 bSendOffloadCmd) {
6650 csr_roam_offload_scan(pMac, sessionId,
6651 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6652 REASON_HOME_AWAY_TIME_CHANGED);
6653 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006654 sme_release_global_lock(&pMac->sme);
6655 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006656 return status;
6657}
6658
Abhishek Singh518323d2015-10-19 17:42:01 +05306659/**
6660 * sme_ext_change_channel()- function to post send ECSA
6661 * action frame to csr.
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006662 * @mac_handle: Hal context
Abhishek Singh518323d2015-10-19 17:42:01 +05306663 * @channel: new channel to switch
6664 * @session_id: senssion it should be sent on.
6665 *
6666 * This function is called to post ECSA frame to csr.
6667 *
6668 * Return: success if msg is sent else return failure
6669 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006670QDF_STATUS sme_ext_change_channel(mac_handle_t mac_handle, uint32_t channel,
Abhishek Singh518323d2015-10-19 17:42:01 +05306671 uint8_t session_id)
6672{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306673 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006674 tpAniSirGlobal mac_ctx = PMAC_STRUCT(mac_handle);
Abhishek Singh518323d2015-10-19 17:42:01 +05306675 uint8_t channel_state;
6676
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006677 sme_err("Set Channel: %d", channel);
Abhishek Singh518323d2015-10-19 17:42:01 +05306678 channel_state =
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07006679 wlan_reg_get_channel_state(mac_ctx->pdev, channel);
Abhishek Singh518323d2015-10-19 17:42:01 +05306680
6681 if (CHANNEL_STATE_DISABLE == channel_state) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006682 sme_err("Invalid channel: %d", channel);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306683 return QDF_STATUS_E_INVAL;
Abhishek Singh518323d2015-10-19 17:42:01 +05306684 }
6685
6686 status = sme_acquire_global_lock(&mac_ctx->sme);
6687
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306688 if (QDF_STATUS_SUCCESS == status) {
Abhishek Singh518323d2015-10-19 17:42:01 +05306689 /* update the channel list to the firmware */
6690 status = csr_send_ext_change_channel(mac_ctx,
6691 channel, session_id);
6692 sme_release_global_lock(&mac_ctx->sme);
6693 }
6694
6695 return status;
6696}
6697
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306698/*
6699 * sme_get_roam_intra_band() -
6700 * get Intra band roaming
6701 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006702 * mac_handle - HAL handle for device
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306703 * Return Success or failure
6704 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006705bool sme_get_roam_intra_band(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006706{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006707 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306708
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306709 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006710 TRACE_CODE_SME_RX_HDD_GET_ROAMIBAND, NO_SESSION, 0));
6711 return pMac->roam.configParam.nRoamIntraBand;
6712}
6713
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306714/*
6715 * sme_get_roam_scan_n_probes() -
6716 * get N Probes
6717 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006718 * mac_handle - HAL handle for device
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306719 * Return Success or failure
6720 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006721uint8_t sme_get_roam_scan_n_probes(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006722{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006723 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306724
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006725 return pMac->roam.configParam.nProbes;
6726}
6727
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306728/*
6729 * sme_get_roam_scan_home_away_time() -
6730 * get Roam scan home away time
6731 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006732 * mac_handle - HAL handle for device
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306733 * Return Success or failure
6734 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006735uint16_t sme_get_roam_scan_home_away_time(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006736{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006737 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306738
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006739 return pMac->roam.configParam.nRoamScanHomeAwayTime;
6740}
6741
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306742/*
6743 * sme_update_roam_rssi_diff() -
6744 * Update RoamRssiDiff
6745 * This function is called through dynamic setConfig callback function
6746 * to configure RoamRssiDiff
6747 * Usage: adb shell iwpriv wlan0 setConfig RoamRssiDiff=[0 .. 125]
6748 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006749 * mac_handle - HAL handle for device
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306750 * sessionId - Session Identifier
6751 * RoamRssiDiff - minimum rssi difference between potential
6752 * candidate and current AP.
6753 * Return Success or failure
6754 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006755
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006756QDF_STATUS sme_update_roam_rssi_diff(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006757 uint8_t RoamRssiDiff)
6758{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006759 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306760 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006761
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006762 if (sessionId >= CSR_ROAM_SESSION_MAX) {
6763 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6764 FL("Invalid sme session id: %d"), sessionId);
6765 return QDF_STATUS_E_INVAL;
6766 }
6767
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006768 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306769 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306770 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006771 "LFR runtime successfully set roam rssi diff to %d - old value is %d - roam state is %s",
6772 RoamRssiDiff,
6773 pMac->roam.configParam.RoamRssiDiff,
6774 mac_trace_get_neighbour_roam_state(pMac->roam.
6775 neighborRoamInfo
6776 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306777 neighborRoamState));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006778 pMac->roam.configParam.RoamRssiDiff = RoamRssiDiff;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306779
6780 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
6781 csr_roam_offload_scan(pMac, sessionId,
6782 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6783 REASON_RSSI_DIFF_CHANGED);
6784
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006785 sme_release_global_lock(&pMac->sme);
6786 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006787 return status;
6788}
6789
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306790#ifdef WLAN_FEATURE_FILS_SK
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08006791QDF_STATUS sme_update_fils_config(mac_handle_t hal, uint8_t session_id,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07006792 struct csr_roam_profile *src_profile)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306793{
6794 tpAniSirGlobal mac = PMAC_STRUCT(hal);
6795 QDF_STATUS status = QDF_STATUS_SUCCESS;
6796 tpCsrNeighborRoamControlInfo neighbor_roam_info =
6797 &mac->roam.neighborRoamInfo[session_id];
6798
6799 if (session_id >= CSR_ROAM_SESSION_MAX) {
6800 sme_err("Invalid sme session id: %d", session_id);
6801 return QDF_STATUS_E_INVAL;
6802 }
6803
6804 if (!src_profile) {
6805 sme_err("src roam profile NULL");
6806 return QDF_STATUS_E_INVAL;
6807 }
6808
6809 if (!mac->roam.configParam.isFastRoamIniFeatureEnabled ||
6810 (neighbor_roam_info->neighborRoamState !=
6811 eCSR_NEIGHBOR_ROAM_STATE_CONNECTED)) {
6812 sme_info("Fast roam is disabled or not connected(%d)",
6813 neighbor_roam_info->neighborRoamState);
6814 return QDF_STATUS_E_PERM;
6815 }
6816
6817 csr_update_fils_config(mac, session_id, src_profile);
Sridhar Selvaraje5260442017-08-19 10:12:03 +05306818 if (csr_roamIsRoamOffloadEnabled(mac)) {
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306819 status = sme_acquire_global_lock(&mac->sme);
6820 if (QDF_IS_STATUS_SUCCESS(status)) {
6821 sme_debug("Updating fils config to fw");
6822 csr_roam_offload_scan(mac, session_id,
6823 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6824 REASON_FILS_PARAMS_CHANGED);
6825 sme_release_global_lock(&mac->sme);
6826 } else {
6827 sme_err("Failed to acquire SME lock");
6828 }
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306829 } else {
6830 sme_info("LFR3 not enabled");
6831 return QDF_STATUS_E_INVAL;
6832 }
6833
6834 return status;
6835}
6836
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08006837void sme_send_hlp_ie_info(mac_handle_t hal, uint8_t session_id,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07006838 struct csr_roam_profile *profile, uint32_t if_addr)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306839{
6840 int i;
6841 struct scheduler_msg msg;
6842 QDF_STATUS status;
6843 struct hlp_params *params;
6844 tpAniSirGlobal mac = PMAC_STRUCT(hal);
6845 struct csr_roam_session *session = CSR_GET_SESSION(mac, session_id);
6846 tpCsrNeighborRoamControlInfo neighbor_roam_info =
6847 &mac->roam.neighborRoamInfo[session_id];
6848
6849 if (!session) {
6850 sme_err("session NULL");
6851 return;
6852 }
6853
6854 if (!mac->roam.configParam.isFastRoamIniFeatureEnabled ||
6855 (neighbor_roam_info->neighborRoamState !=
6856 eCSR_NEIGHBOR_ROAM_STATE_CONNECTED)) {
6857 sme_debug("Fast roam is disabled or not connected(%d)",
6858 neighbor_roam_info->neighborRoamState);
6859 return;
6860 }
6861
6862 params = qdf_mem_malloc(sizeof(*params));
Arif Hussain0ef77082018-10-10 16:42:53 -07006863 if (!params)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306864 return;
Arif Hussain0ef77082018-10-10 16:42:53 -07006865
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306866 if ((profile->hlp_ie_len +
6867 SIR_IPV4_ADDR_LEN) > FILS_MAX_HLP_DATA_LEN) {
6868 sme_err("HLP IE len exceeds %d",
6869 profile->hlp_ie_len);
6870 qdf_mem_free(params);
6871 return;
6872 }
6873
6874 params->vdev_id = session_id;
6875 params->hlp_ie_len = profile->hlp_ie_len + SIR_IPV4_ADDR_LEN;
6876
6877 for (i = 0; i < SIR_IPV4_ADDR_LEN; i++)
6878 params->hlp_ie[i] = (if_addr >> (i * 8)) & 0xFF;
6879
6880 qdf_mem_copy(params->hlp_ie + SIR_IPV4_ADDR_LEN,
6881 profile->hlp_ie, profile->hlp_ie_len);
6882
6883 msg.type = SIR_HAL_HLP_IE_INFO;
6884 msg.reserved = 0;
6885 msg.bodyptr = params;
6886 status = sme_acquire_global_lock(&mac->sme);
6887 if (status != QDF_STATUS_SUCCESS) {
6888 sme_err("sme lock acquire fails");
6889 qdf_mem_free(params);
6890 return;
6891 }
6892
6893 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05306894 (scheduler_post_message(QDF_MODULE_ID_SME,
6895 QDF_MODULE_ID_WMA,
6896 QDF_MODULE_ID_WMA, &msg))) {
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306897 sme_err("Not able to post WMA_HLP_IE_INFO message to HAL");
6898 sme_release_global_lock(&mac->sme);
6899 qdf_mem_free(params);
6900 return;
6901 }
6902
6903 sme_release_global_lock(&mac->sme);
6904}
6905
Jeff Johnson172237b2017-11-07 15:32:59 -08006906void sme_free_join_rsp_fils_params(struct csr_roam_info *roam_info)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306907{
6908 struct fils_join_rsp_params *roam_fils_params;
6909
6910 if (!roam_info) {
6911 sme_err("FILS Roam Info NULL");
6912 return;
6913 }
6914
6915 roam_fils_params = roam_info->fils_join_rsp;
6916 if (!roam_fils_params) {
6917 sme_err("FILS Roam Param NULL");
6918 return;
6919 }
6920
6921 if (roam_fils_params->fils_pmk)
6922 qdf_mem_free(roam_fils_params->fils_pmk);
6923
6924 qdf_mem_free(roam_fils_params);
6925
6926 roam_info->fils_join_rsp = NULL;
6927}
6928
6929#else
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08006930inline void sme_send_hlp_ie_info(mac_handle_t hal, uint8_t session_id,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07006931 struct csr_roam_profile *profile, uint32_t if_addr)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306932{}
6933#endif
6934
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306935/*
6936 * sme_update_fast_transition_enabled() - enable/disable Fast Transition
6937 * support at runtime
6938 * It is used at in the REG_DYNAMIC_VARIABLE macro definition of
6939 * isFastTransitionEnabled.
6940 * This is a synchronous call
6941 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006942 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306943 * Return QDF_STATUS_SUCCESS - SME update isFastTransitionEnabled config
6944 * successfully.
6945 * Other status means SME is failed to update isFastTransitionEnabled.
6946 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006947QDF_STATUS sme_update_fast_transition_enabled(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006948 bool isFastTransitionEnabled)
6949{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006950 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306951 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006952
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306953 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006954 TRACE_CODE_SME_RX_HDD_UPDATE_FTENABLED, NO_SESSION,
6955 0));
6956 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306957 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05306958 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006959 "%s: FastTransitionEnabled is changed from %d to %d",
6960 __func__,
6961 pMac->roam.configParam.isFastTransitionEnabled,
6962 isFastTransitionEnabled);
6963 pMac->roam.configParam.isFastTransitionEnabled =
6964 isFastTransitionEnabled;
6965 sme_release_global_lock(&pMac->sme);
6966 }
6967
6968 return status;
6969}
6970
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306971/*
6972 * sme_update_wes_mode() -
6973 * Update WES Mode
6974 * This function is called through dynamic setConfig callback function
6975 * to configure isWESModeEnabled
6976 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006977 * mac_handle - HAL handle for device
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306978 * isWESModeEnabled - WES mode
6979 * sessionId - Session Identifier
6980 * Return QDF_STATUS_SUCCESS - SME update isWESModeEnabled config successfully.
6981 * Other status means SME is failed to update isWESModeEnabled.
6982 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006983
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006984QDF_STATUS sme_update_wes_mode(mac_handle_t mac_handle, bool isWESModeEnabled,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006985 uint8_t sessionId)
6986{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006987 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306988 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006989
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006990 if (sessionId >= CSR_ROAM_SESSION_MAX) {
6991 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6992 FL("Invalid sme session id: %d"), sessionId);
6993 return QDF_STATUS_E_INVAL;
6994 }
6995
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006996 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306997 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306998 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006999 "LFR runtime successfully set WES Mode to %d - old value is %d - roam state is %s",
7000 isWESModeEnabled,
7001 pMac->roam.configParam.isWESModeEnabled,
7002 mac_trace_get_neighbour_roam_state(pMac->roam.
7003 neighborRoamInfo
7004 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307005 neighborRoamState));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007006 pMac->roam.configParam.isWESModeEnabled = isWESModeEnabled;
7007 sme_release_global_lock(&pMac->sme);
7008 }
7009
7010 return status;
7011}
7012
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307013/*
7014 * sme_set_roam_scan_control() -
7015 * Set roam scan control
7016 * This function is called to set roam scan control
7017 * if roam scan control is set to 0, roaming scan cache is cleared
7018 * any value other than 0 is treated as invalid value
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007019 * mac_handle - HAL handle for device
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307020 * sessionId - Session Identifier
7021 * Return QDF_STATUS_SUCCESS - SME update config successfully.
7022 * Other status means SME failure to update
7023 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007024QDF_STATUS sme_set_roam_scan_control(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007025 bool roamScanControl)
7026{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007027 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307028 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007029
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307030 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007031 TRACE_CODE_SME_RX_HDD_SET_SCANCTRL, NO_SESSION, 0));
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007032
7033 if (sessionId >= CSR_ROAM_SESSION_MAX) {
7034 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7035 FL("Invalid sme session id: %d"), sessionId);
7036 return QDF_STATUS_E_INVAL;
7037 }
7038
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007039 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307040 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307041 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007042 "LFR runtime successfully set roam scan control to %d - old value is %d - roam state is %s",
7043 roamScanControl,
7044 pMac->roam.configParam.nRoamScanControl,
7045 mac_trace_get_neighbour_roam_state(pMac->roam.
7046 neighborRoamInfo
7047 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307048 neighborRoamState));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007049 pMac->roam.configParam.nRoamScanControl = roamScanControl;
7050 if (0 == roamScanControl) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307051 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007052 "LFR runtime successfully cleared roam scan cache");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307053 csr_flush_cfg_bg_scan_roam_channel_list(pMac,
7054 sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007055 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
7056 csr_roam_offload_scan(pMac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307057 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
7058 REASON_FLUSH_CHANNEL_LIST);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007059 }
7060 }
7061 sme_release_global_lock(&pMac->sme);
7062 }
7063 return status;
7064}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007065
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307066/*
7067 * sme_update_is_fast_roam_ini_feature_enabled() - enable/disable LFR
7068 * support at runtime
7069 * It is used at in the REG_DYNAMIC_VARIABLE macro definition of
7070 * isFastRoamIniFeatureEnabled.
7071 * This is a synchronous call
7072 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007073 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307074 * sessionId - Session Identifier
7075 * Return QDF_STATUS_SUCCESS - SME update isFastRoamIniFeatureEnabled config
7076 * successfully.
7077 * Other status means SME is failed to update isFastRoamIniFeatureEnabled.
7078 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007079QDF_STATUS sme_update_is_fast_roam_ini_feature_enabled(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307080 uint8_t sessionId, const bool isFastRoamIniFeatureEnabled)
7081{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007082 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007083
7084 if (pMac->roam.configParam.isFastRoamIniFeatureEnabled ==
7085 isFastRoamIniFeatureEnabled) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307086 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007087 "%s: FastRoam is already enabled or disabled, nothing to do (returning) old(%d) new(%d)",
7088 __func__,
7089 pMac->roam.configParam.isFastRoamIniFeatureEnabled,
7090 isFastRoamIniFeatureEnabled);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307091 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007092 }
7093
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307094 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007095 "%s: FastRoamEnabled is changed from %d to %d", __func__,
7096 pMac->roam.configParam.isFastRoamIniFeatureEnabled,
7097 isFastRoamIniFeatureEnabled);
7098 pMac->roam.configParam.isFastRoamIniFeatureEnabled =
7099 isFastRoamIniFeatureEnabled;
7100 csr_neighbor_roam_update_fast_roaming_enabled(pMac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307101 isFastRoamIniFeatureEnabled);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007102
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307103 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007104}
7105
Mukul Sharma69c44cd2016-09-12 18:33:57 +05307106/**
7107 * sme_config_fast_roaming() - enable/disable LFR support at runtime
7108 * @hal - The handle returned by macOpen.
7109 * @session_id - Session Identifier
7110 * @is_fast_roam_enabled - flag to enable/disable roaming
7111 *
7112 * When Supplicant issues enabled/disable fast roaming on the basis
7113 * of the Bssid modification in network block (e.g. AutoJoin mode N/W block)
7114 *
7115 * Return: QDF_STATUS
7116 */
7117
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08007118QDF_STATUS sme_config_fast_roaming(mac_handle_t hal, uint8_t session_id,
Mukul Sharma69c44cd2016-09-12 18:33:57 +05307119 const bool is_fast_roam_enabled)
7120{
7121 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05307122 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
Mukul Sharma69c44cd2016-09-12 18:33:57 +05307123 QDF_STATUS status;
7124
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07007125 /*
7126 * supplicant_disabled_roaming flag is set to true in
7127 * wlan_hdd_cfg80211_connect_start when supplicant initiate connect
7128 * request with BSSID. This flag is reset when supplicant sends
7129 * vendor command to enable roaming after association.
Arif Hussaina48a9c02017-01-31 14:37:45 -08007130 *
7131 * This request from wpa_supplicant will be skipped in this function
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07007132 * if roaming is disabled using driver command or INI and
7133 * supplicant_disabled_roaming flag remains set. So make sure to set
7134 * supplicant_disabled_roaming flag as per wpa_supplicant even if roam
7135 * request from wpa_supplicant ignored.
Arif Hussaina48a9c02017-01-31 14:37:45 -08007136 */
7137 if (session && session->pCurRoamProfile)
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07007138 session->pCurRoamProfile->supplicant_disabled_roaming =
7139 !is_fast_roam_enabled;
Arif Hussaina48a9c02017-01-31 14:37:45 -08007140
Mukul Sharma69c44cd2016-09-12 18:33:57 +05307141 if (!mac_ctx->roam.configParam.isFastRoamIniFeatureEnabled) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007142 sme_debug("Fast roam is disabled through ini");
Mukul Sharma69c44cd2016-09-12 18:33:57 +05307143 if (!is_fast_roam_enabled)
7144 return QDF_STATUS_SUCCESS;
7145 return QDF_STATUS_E_FAILURE;
7146 }
Sreelakshmi Konamkibda5bbf2016-09-12 18:38:10 +05307147
Mukul Sharma69c44cd2016-09-12 18:33:57 +05307148 status = csr_neighbor_roam_update_fast_roaming_enabled(mac_ctx,
7149 session_id, is_fast_roam_enabled);
7150 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007151 sme_err("update fast roaming failed. status: %d", status);
Mukul Sharma69c44cd2016-09-12 18:33:57 +05307152 return QDF_STATUS_E_FAILURE;
7153 }
7154
7155 return QDF_STATUS_SUCCESS;
7156}
7157
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307158/*
7159 * sme_update_is_mawc_ini_feature_enabled() -
7160 * Enable/disable LFR MAWC support at runtime
7161 * It is used at in the REG_DYNAMIC_VARIABLE macro definition of
7162 * isMAWCIniFeatureEnabled.
7163 * This is a synchronous call
7164 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007165 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307166 * Return QDF_STATUS_SUCCESS - SME update MAWCEnabled config successfully.
7167 * Other status means SME is failed to update MAWCEnabled.
7168 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007169QDF_STATUS sme_update_is_mawc_ini_feature_enabled(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007170 const bool MAWCEnabled)
7171{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007172 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307173 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007174
7175 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307176 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05307177 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007178 "%s: MAWCEnabled is changed from %d to %d", __func__,
Varun Reddy Yeturu061d4d62017-07-20 09:39:32 -07007179 pMac->roam.configParam.csr_mawc_config.mawc_enabled,
7180 MAWCEnabled);
7181 pMac->roam.configParam.csr_mawc_config.mawc_enabled =
7182 MAWCEnabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007183 sme_release_global_lock(&pMac->sme);
7184 }
7185
7186 return status;
7187
7188}
7189
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07007190/**
7191 * sme_stop_roaming() - Stop roaming for a given sessionId
7192 * This is a synchronous call
7193 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007194 * @mac_handle - The handle returned by mac_open
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07007195 * @sessionId - Session Identifier
7196 *
7197 * Return QDF_STATUS_SUCCESS on success
7198 * Other status on failure
7199 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007200QDF_STATUS sme_stop_roaming(mac_handle_t mac_handle, uint8_t session_id,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08007201 uint8_t reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007202{
Naveen Rawat5c35ae42017-04-18 15:35:07 -07007203 struct scheduler_msg wma_msg = {0};
Jeff Johnsonc09caa42018-06-07 22:58:55 -07007204 QDF_STATUS status;
Naveen Rawat5c35ae42017-04-18 15:35:07 -07007205 tSirRoamOffloadScanReq *req;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007206 tpAniSirGlobal mac_ctx = PMAC_STRUCT(mac_handle);
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07007207 tpCsrNeighborRoamControlInfo roam_info;
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07007208 struct csr_roam_session *session;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007209
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07007210 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Naveen Rawat5c35ae42017-04-18 15:35:07 -07007211 sme_err("incorrect session/vdev ID");
7212 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007213 }
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07007214
7215 session = CSR_GET_SESSION(mac_ctx, session_id);
Abhishek Singh1f217ec2017-12-22 11:48:27 +05307216
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +05307217 /*
7218 * set the driver_disabled_roaming flag to true even if roaming
7219 * is not enabled on this session so that roam start requests for
7220 * this session can be blocked until driver enables roaming
7221 */
Vignesh Viswanathan3d478032018-08-02 20:18:53 +05307222 if (reason == ecsr_driver_disabled && session->pCurRoamProfile &&
7223 session->pCurRoamProfile->csrPersona == QDF_STA_MODE) {
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +05307224 session->pCurRoamProfile->driver_disabled_roaming = true;
7225 sme_debug("driver_disabled_roaming set for session %d",
7226 session_id);
7227 }
7228
Abhishek Singh1f217ec2017-12-22 11:48:27 +05307229 roam_info = &mac_ctx->roam.neighborRoamInfo[session_id];
7230 if (!roam_info->b_roam_scan_offload_started) {
7231 sme_debug("Roaming already disabled for session %d", session_id);
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07007232 return QDF_STATUS_SUCCESS;
7233 }
Naveen Rawat5c35ae42017-04-18 15:35:07 -07007234 req = qdf_mem_malloc(sizeof(*req));
Arif Hussain0ef77082018-10-10 16:42:53 -07007235 if (!req)
Naveen Rawat5c35ae42017-04-18 15:35:07 -07007236 return QDF_STATUS_E_NOMEM;
Naveen Rawat5c35ae42017-04-18 15:35:07 -07007237
7238 req->Command = ROAM_SCAN_OFFLOAD_STOP;
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +05307239 if ((reason == eCsrForcedDisassoc) || reason == ecsr_driver_disabled)
Abhishek Singh533c9da2017-05-04 10:23:34 +05307240 req->reason = REASON_ROAM_STOP_ALL;
7241 else
Varun Reddy Yeturubc1bea02018-02-01 18:12:34 -08007242 req->reason = REASON_SME_ISSUED;
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07007243 req->sessionId = session_id;
7244 if (csr_neighbor_middle_of_roaming(mac_ctx, session_id))
Naveen Rawat5c35ae42017-04-18 15:35:07 -07007245 req->middle_of_roaming = 1;
7246 else
7247 csr_roam_reset_roam_params(mac_ctx);
7248
7249 wma_msg.type = WMA_ROAM_SCAN_OFFLOAD_REQ;
7250 wma_msg.bodyptr = req;
7251
7252 status = wma_post_ctrl_msg(mac_ctx, &wma_msg);
Jeff Johnsonc09caa42018-06-07 22:58:55 -07007253 if (QDF_STATUS_SUCCESS != status) {
Naveen Rawat5c35ae42017-04-18 15:35:07 -07007254 sme_err("WMA_ROAM_SCAN_OFFLOAD_REQ failed, session_id: %d",
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07007255 session_id);
Naveen Rawat5c35ae42017-04-18 15:35:07 -07007256 qdf_mem_free(req);
7257 return QDF_STATUS_E_FAULT;
7258 }
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07007259 roam_info->b_roam_scan_offload_started = false;
7260 roam_info->last_sent_cmd = ROAM_SCAN_OFFLOAD_STOP;
Naveen Rawat5c35ae42017-04-18 15:35:07 -07007261
7262 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007263}
7264
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307265/*
7266 * sme_start_roaming() - Start roaming for a given sessionId
7267 * This is a synchronous call
7268 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007269 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307270 * sessionId - Session Identifier
7271 * Return QDF_STATUS_SUCCESS on success
7272 * Other status on failure
7273 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007274QDF_STATUS sme_start_roaming(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08007275 uint8_t reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007276{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007277 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307278 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007279
7280 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307281 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007282 csr_roam_offload_scan(pMac, sessionId, ROAM_SCAN_OFFLOAD_START,
7283 reason);
7284 sme_release_global_lock(&pMac->sme);
7285 }
7286
7287 return status;
7288}
7289
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307290/*
7291 * sme_update_enable_fast_roam_in_concurrency() - enable/disable LFR if
7292 * Concurrent session exists
7293 * This is a synchronuous call
7294 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007295 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307296 * Return QDF_STATUS_SUCCESS
7297 * Other status means SME is failed
7298 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007299QDF_STATUS sme_update_enable_fast_roam_in_concurrency(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007300 bool
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307301 bFastRoamInConIniFeatureEnabled)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007302{
7303
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007304 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307305 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007306
7307 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307308 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007309 pMac->roam.configParam.bFastRoamInConIniFeatureEnabled =
7310 bFastRoamInConIniFeatureEnabled;
7311 if (0 == pMac->roam.configParam.isRoamOffloadScanEnabled) {
7312 pMac->roam.configParam.bFastRoamInConIniFeatureEnabled =
7313 0;
7314 }
7315 sme_release_global_lock(&pMac->sme);
7316 }
7317
7318 return status;
7319}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007320
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307321/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307322 * sme_set_roam_opportunistic_scan_threshold_diff() -
7323 * Update Opportunistic Scan threshold diff
7324 * This function is called through dynamic setConfig callback function
7325 * to configure nOpportunisticThresholdDiff
7326 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007327 * mac_handle - HAL handle for device
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307328 * sessionId - Session Identifier
7329 * nOpportunisticThresholdDiff - Opportunistic Scan threshold diff
7330 * Return QDF_STATUS_SUCCESS - SME update nOpportunisticThresholdDiff config
7331 * successfully.
7332 * else SME is failed to update nOpportunisticThresholdDiff.
7333 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007334QDF_STATUS sme_set_roam_opportunistic_scan_threshold_diff(
7335 mac_handle_t mac_handle,
7336 uint8_t sessionId,
7337 const uint8_t nOpportunisticThresholdDiff)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007338{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007339 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307340 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007341
7342 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307343 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07007344 status = csr_neighbor_roam_update_config(pMac, sessionId,
7345 nOpportunisticThresholdDiff,
7346 REASON_OPPORTUNISTIC_THRESH_DIFF_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307347 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007348 pMac->roam.configParam.neighborRoamConfig.
7349 nOpportunisticThresholdDiff =
7350 nOpportunisticThresholdDiff;
7351 }
7352 sme_release_global_lock(&pMac->sme);
7353 }
7354 return status;
7355}
7356
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307357/*
7358 * sme_get_roam_opportunistic_scan_threshold_diff()
7359 * gets Opportunistic Scan threshold diff
7360 * This is a synchronous call
7361 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007362 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307363 * Return uint8_t - nOpportunisticThresholdDiff
7364 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007365uint8_t sme_get_roam_opportunistic_scan_threshold_diff(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007366{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007367 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307368
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007369 return pMac->roam.configParam.neighborRoamConfig.
7370 nOpportunisticThresholdDiff;
7371}
7372
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307373/*
7374 * sme_set_roam_rescan_rssi_diff() - Update roam rescan rssi diff
7375 * This function is called through dynamic setConfig callback function
7376 * to configure nRoamRescanRssiDiff
7377 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007378 * mac_handle - HAL handle for device
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307379 * sessionId - Session Identifier
7380 * nRoamRescanRssiDiff - roam rescan rssi diff
7381 * Return QDF_STATUS_SUCCESS - SME update nRoamRescanRssiDiff config
7382 * successfully.
7383 * else SME is failed to update nRoamRescanRssiDiff.
7384 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007385QDF_STATUS sme_set_roam_rescan_rssi_diff(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007386 uint8_t sessionId,
7387 const uint8_t nRoamRescanRssiDiff)
7388{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007389 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307390 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007391
7392 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307393 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07007394 status = csr_neighbor_roam_update_config(pMac, sessionId,
7395 nRoamRescanRssiDiff,
7396 REASON_ROAM_RESCAN_RSSI_DIFF_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307397 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007398 pMac->roam.configParam.neighborRoamConfig.
7399 nRoamRescanRssiDiff = nRoamRescanRssiDiff;
7400 }
7401 sme_release_global_lock(&pMac->sme);
7402 }
7403 return status;
7404}
7405
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307406/*
7407 * sme_get_roam_rescan_rssi_diff()
7408 * gets roam rescan rssi diff
7409 * This is a synchronous call
7410 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007411 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307412 * Return int8_t - nRoamRescanRssiDiff
7413 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007414uint8_t sme_get_roam_rescan_rssi_diff(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007415{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007416 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307417
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007418 return pMac->roam.configParam.neighborRoamConfig.nRoamRescanRssiDiff;
7419}
7420
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307421/*
7422 * sme_set_roam_bmiss_first_bcnt() -
7423 * Update Roam count for first beacon miss
7424 * This function is called through dynamic setConfig callback function
7425 * to configure nRoamBmissFirstBcnt
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007426 * mac_handle - HAL handle for device
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307427 * sessionId - Session Identifier
7428 * nRoamBmissFirstBcnt - Roam first bmiss count
7429 * Return QDF_STATUS_SUCCESS - SME update nRoamBmissFirstBcnt
7430 * successfully.
7431 * else SME is failed to update nRoamBmissFirstBcnt
7432 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007433QDF_STATUS sme_set_roam_bmiss_first_bcnt(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007434 uint8_t sessionId,
7435 const uint8_t nRoamBmissFirstBcnt)
7436{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007437 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307438 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007439
7440 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307441 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07007442 status = csr_neighbor_roam_update_config(pMac, sessionId,
7443 nRoamBmissFirstBcnt,
7444 REASON_ROAM_BMISS_FIRST_BCNT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307445 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007446 pMac->roam.configParam.neighborRoamConfig.
7447 nRoamBmissFirstBcnt = nRoamBmissFirstBcnt;
7448 }
7449 sme_release_global_lock(&pMac->sme);
7450 }
7451 return status;
7452}
7453
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307454/*
7455 * sme_get_roam_bmiss_first_bcnt() -
7456 * get neighbor roam beacon miss first count
7457 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007458 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307459 * Return uint8_t - neighbor roam beacon miss first count
7460 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007461uint8_t sme_get_roam_bmiss_first_bcnt(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007462{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007463 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307464
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007465 return pMac->roam.configParam.neighborRoamConfig.nRoamBmissFirstBcnt;
7466}
7467
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307468/*
7469 * sme_set_roam_bmiss_final_bcnt() -
7470 * Update Roam count for final beacon miss
7471 * This function is called through dynamic setConfig callback function
7472 * to configure nRoamBmissFinalBcnt
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007473 * mac_handle - HAL handle for device
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307474 * sessionId - Session Identifier
7475 * nRoamBmissFinalBcnt - Roam final bmiss count
7476 * Return QDF_STATUS_SUCCESS - SME update nRoamBmissFinalBcnt
7477 * successfully.
7478 * else SME is failed to update nRoamBmissFinalBcnt
7479 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007480QDF_STATUS sme_set_roam_bmiss_final_bcnt(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007481 uint8_t sessionId,
7482 const uint8_t nRoamBmissFinalBcnt)
7483{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007484 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307485 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007486
7487 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307488 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07007489 status = csr_neighbor_roam_update_config(pMac, sessionId,
7490 nRoamBmissFinalBcnt,
7491 REASON_ROAM_BMISS_FINAL_BCNT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307492 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007493 pMac->roam.configParam.neighborRoamConfig.
7494 nRoamBmissFinalBcnt = nRoamBmissFinalBcnt;
7495 }
7496 sme_release_global_lock(&pMac->sme);
7497 }
7498 return status;
7499}
7500
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307501/*
7502 * sme_get_roam_bmiss_final_bcnt() -
7503 * gets Roam count for final beacon miss
7504 * This is a synchronous call
7505 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007506 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307507 * Return uint8_t - nRoamBmissFinalBcnt
7508 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007509uint8_t sme_get_roam_bmiss_final_bcnt(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007510{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007511 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307512
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007513 return pMac->roam.configParam.neighborRoamConfig.nRoamBmissFinalBcnt;
7514}
7515
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307516/*
7517 * sme_set_roam_beacon_rssi_weight() -
7518 * Update Roam beacon rssi weight
7519 * This function is called through dynamic setConfig callback function
7520 * to configure nRoamBeaconRssiWeight
7521 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007522 * mac_handle - HAL handle for device
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307523 * sessionId - Session Identifier
7524 * nRoamBeaconRssiWeight - Roam beacon rssi weight
7525 * Return QDF_STATUS_SUCCESS - SME update nRoamBeaconRssiWeight config
7526 * successfully.
7527 * else SME is failed to update nRoamBeaconRssiWeight
7528 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007529QDF_STATUS sme_set_roam_beacon_rssi_weight(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007530 uint8_t sessionId,
7531 const uint8_t nRoamBeaconRssiWeight)
7532{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007533 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307534 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007535
7536 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307537 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07007538 status = csr_neighbor_roam_update_config(pMac, sessionId,
7539 nRoamBeaconRssiWeight,
7540 REASON_ROAM_BEACON_RSSI_WEIGHT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307541 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007542 pMac->roam.configParam.neighborRoamConfig.
7543 nRoamBeaconRssiWeight = nRoamBeaconRssiWeight;
7544 }
7545 sme_release_global_lock(&pMac->sme);
7546 }
7547 return status;
7548}
7549
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307550/*
7551 * sme_get_roam_beacon_rssi_weight() -
7552 * gets Roam beacon rssi weight
7553 * This is a synchronous call
7554 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007555 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307556 * Return uint8_t - nRoamBeaconRssiWeight
7557 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007558uint8_t sme_get_roam_beacon_rssi_weight(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007559{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007560 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307561
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007562 return pMac->roam.configParam.neighborRoamConfig.nRoamBeaconRssiWeight;
7563}
7564
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307565/*
7566 * sme_set_neighbor_lookup_rssi_threshold() - update neighbor lookup
7567 * rssi threshold
7568 * This is a synchronous call
7569 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007570 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307571 * sessionId - Session Identifier
7572 * Return QDF_STATUS_SUCCESS - SME update config successful.
7573 * Other status means SME is failed to update
7574 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007575QDF_STATUS sme_set_neighbor_lookup_rssi_threshold(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307576 uint8_t sessionId, uint8_t neighborLookupRssiThreshold)
7577{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007578 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307579 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007580
7581 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307582 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07007583 status = csr_neighbor_roam_update_config(pMac,
7584 sessionId, neighborLookupRssiThreshold,
7585 REASON_LOOKUP_THRESH_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307586 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007587 pMac->roam.configParam.neighborRoamConfig.
7588 nNeighborLookupRssiThreshold =
7589 neighborLookupRssiThreshold;
7590 }
7591 sme_release_global_lock(&pMac->sme);
7592 }
7593 return status;
7594}
7595
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307596/*
7597 * sme_set_delay_before_vdev_stop() - update delay before VDEV_STOP
7598 * This is a synchronous call
7599 *
7600 * hal - The handle returned by macOpen.
7601 * session_id - Session Identifier
7602 * delay_before_vdev_stop - value to be set
7603 * Return QDF_STATUS_SUCCESS - SME update config successful.
7604 * Other status means SME is failed to update
7605 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08007606QDF_STATUS sme_set_delay_before_vdev_stop(mac_handle_t hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007607 uint8_t session_id,
7608 uint8_t delay_before_vdev_stop)
7609{
7610 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307611 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007612
7613 if (session_id >= CSR_ROAM_SESSION_MAX) {
7614 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7615 FL("Invalid sme session id: %d"), session_id);
7616 return QDF_STATUS_E_INVAL;
7617 }
7618
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007619 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307620 if (QDF_IS_STATUS_SUCCESS(status)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307621 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
7622 "LFR param delay_before_vdev_stop changed from %d to %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007623 pMac->roam.configParam.neighborRoamConfig.
7624 delay_before_vdev_stop,
7625 delay_before_vdev_stop);
7626 pMac->roam.neighborRoamInfo[session_id].cfgParams.
7627 delay_before_vdev_stop = delay_before_vdev_stop;
7628 pMac->roam.configParam.neighborRoamConfig.
7629 delay_before_vdev_stop = delay_before_vdev_stop;
7630 sme_release_global_lock(&pMac->sme);
7631 }
7632 return status;
7633}
7634
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307635/*
7636 * sme_get_neighbor_lookup_rssi_threshold() - get neighbor lookup
7637 * rssi threshold
7638 * This is a synchronous call
7639 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007640 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307641 * Return QDF_STATUS_SUCCESS - SME update config successful.
7642 * Other status means SME is failed to update
7643 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007644uint8_t sme_get_neighbor_lookup_rssi_threshold(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007645{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007646 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307647
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007648 return pMac->roam.configParam.neighborRoamConfig.
7649 nNeighborLookupRssiThreshold;
7650}
7651
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307652/*
7653 * sme_set_neighbor_scan_refresh_period() - set neighbor scan results
7654 * refresh period
7655 * This is a synchronous call
7656 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007657 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307658 * sessionId - Session Identifier
7659 * Return QDF_STATUS_SUCCESS - SME update config successful.
7660 * Other status means SME is failed to update
7661 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007662QDF_STATUS sme_set_neighbor_scan_refresh_period(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307663 uint8_t sessionId, uint16_t neighborScanResultsRefreshPeriod)
7664{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007665 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307666 QDF_STATUS status = QDF_STATUS_SUCCESS;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05307667 struct csr_neighbor_roamconfig *pNeighborRoamConfig = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007668 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
7669
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007670 if (sessionId >= CSR_ROAM_SESSION_MAX) {
7671 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7672 FL("Invalid sme session id: %d"), sessionId);
7673 return QDF_STATUS_E_INVAL;
7674 }
7675
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007676 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307677 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007678 pNeighborRoamConfig =
7679 &pMac->roam.configParam.neighborRoamConfig;
7680 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307681 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007682 "LFR runtime successfully set roam scan refresh period to %d- old value is %d - roam state is %s",
7683 neighborScanResultsRefreshPeriod,
7684 pMac->roam.configParam.neighborRoamConfig.
7685 nNeighborResultsRefreshPeriod,
7686 mac_trace_get_neighbour_roam_state(pMac->roam.
7687 neighborRoamInfo
7688 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307689 neighborRoamState));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007690 pNeighborRoamConfig->nNeighborResultsRefreshPeriod =
7691 neighborScanResultsRefreshPeriod;
7692 pNeighborRoamInfo->cfgParams.neighborResultsRefreshPeriod =
7693 neighborScanResultsRefreshPeriod;
7694
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307695 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
7696 csr_roam_offload_scan(pMac, sessionId,
7697 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
7698 REASON_NEIGHBOR_SCAN_REFRESH_PERIOD_CHANGED);
7699 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007700 sme_release_global_lock(&pMac->sme);
7701 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307702
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007703 return status;
7704}
7705
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307706/*
7707 * sme_update_roam_scan_offload_enabled() - enable/disable roam scan
7708 * offload feaure
7709 * It is used at in the REG_DYNAMIC_VARIABLE macro definition of
7710 * gRoamScanOffloadEnabled.
7711 * This is a synchronous call
7712 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007713 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307714 * Return QDF_STATUS_SUCCESS - SME update config successfully.
7715 * Other status means SME is failed to update.
7716 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007717QDF_STATUS sme_update_roam_scan_offload_enabled(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007718 bool nRoamScanOffloadEnabled)
7719{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007720 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307721 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007722
7723 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307724 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307725 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307726 "gRoamScanOffloadEnabled is changed from %d to %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007727 pMac->roam.configParam.isRoamOffloadScanEnabled,
7728 nRoamScanOffloadEnabled);
7729 pMac->roam.configParam.isRoamOffloadScanEnabled =
7730 nRoamScanOffloadEnabled;
7731 sme_release_global_lock(&pMac->sme);
7732 }
7733
7734 return status;
7735}
7736
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307737/*
7738 * sme_get_neighbor_scan_refresh_period() - get neighbor scan results
7739 * refresh period
7740 * This is a synchronous call
7741 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007742 * \param mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307743 * \return uint16_t - Neighbor scan results refresh period value
7744 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007745uint16_t sme_get_neighbor_scan_refresh_period(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007746{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007747 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307748
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007749 return pMac->roam.configParam.neighborRoamConfig.
7750 nNeighborResultsRefreshPeriod;
7751}
7752
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307753/*
7754 * sme_get_empty_scan_refresh_period() - get empty scan refresh period
7755 * This is a synchronuous call
7756 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007757 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307758 * Return QDF_STATUS_SUCCESS - SME update config successful.
7759 * Other status means SME is failed to update
7760 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007761uint16_t sme_get_empty_scan_refresh_period(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007762{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007763 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307764
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007765 return pMac->roam.configParam.neighborRoamConfig.
7766 nEmptyScanRefreshPeriod;
7767}
7768
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307769/*
7770 * sme_update_empty_scan_refresh_period
7771 * Update nEmptyScanRefreshPeriod
7772 * This function is called through dynamic setConfig callback function
7773 * to configure nEmptyScanRefreshPeriod
7774 * Usage: adb shell iwpriv wlan0 setConfig
7775 * nEmptyScanRefreshPeriod=[0 .. 60]
7776 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007777 * mac_handle - HAL handle for device
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307778 * sessionId - Session Identifier
7779 * nEmptyScanRefreshPeriod - scan period following empty scan results.
7780 * Return Success or failure
7781 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007782
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007783QDF_STATUS sme_update_empty_scan_refresh_period(mac_handle_t mac_handle,
7784 uint8_t sessionId, uint16_t
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307785 nEmptyScanRefreshPeriod)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007786{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007787 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307788 QDF_STATUS status = QDF_STATUS_SUCCESS;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05307789 struct csr_neighbor_roamconfig *pNeighborRoamConfig = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007790 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
7791
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007792 if (sessionId >= CSR_ROAM_SESSION_MAX) {
7793 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7794 FL("Invalid sme session id: %d"), sessionId);
7795 return QDF_STATUS_E_INVAL;
7796 }
7797
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007798 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307799 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007800 pNeighborRoamConfig =
7801 &pMac->roam.configParam.neighborRoamConfig;
7802 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307803 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007804 "LFR runtime successfully set roam scan period to %d -old value is %d - roam state is %s",
7805 nEmptyScanRefreshPeriod,
7806 pMac->roam.configParam.neighborRoamConfig.
7807 nEmptyScanRefreshPeriod,
7808 mac_trace_get_neighbour_roam_state(pMac->roam.
7809 neighborRoamInfo
7810 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307811 neighborRoamState));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007812 pNeighborRoamConfig->nEmptyScanRefreshPeriod =
7813 nEmptyScanRefreshPeriod;
7814 pNeighborRoamInfo->cfgParams.emptyScanRefreshPeriod =
7815 nEmptyScanRefreshPeriod;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307816
7817 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
7818 csr_roam_offload_scan(pMac, sessionId,
7819 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
7820 REASON_EMPTY_SCAN_REF_PERIOD_CHANGED);
7821 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007822 sme_release_global_lock(&pMac->sme);
7823 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307824
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007825 return status;
7826}
7827
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307828/*
7829 * sme_set_neighbor_scan_min_chan_time() -
7830 * Update nNeighborScanMinChanTime
7831 * This function is called through dynamic setConfig callback function
7832 * to configure gNeighborScanChannelMinTime
7833 * Usage: adb shell iwpriv wlan0 setConfig
7834 * gNeighborScanChannelMinTime=[0 .. 60]
7835 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007836 * mac_handle - HAL handle for device
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307837 * nNeighborScanMinChanTime - Channel minimum dwell time
7838 * sessionId - Session Identifier
7839 * Return Success or failure
7840 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007841QDF_STATUS sme_set_neighbor_scan_min_chan_time(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007842 const uint16_t
7843 nNeighborScanMinChanTime,
7844 uint8_t sessionId)
7845{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007846 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307847 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007848
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007849 if (sessionId >= CSR_ROAM_SESSION_MAX) {
7850 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7851 FL("Invalid sme session id: %d"), sessionId);
7852 return QDF_STATUS_E_INVAL;
7853 }
7854
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007855 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307856 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307857 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007858 "LFR runtime successfully set channel min dwell time to %d - old value is %d - roam state is %s",
7859 nNeighborScanMinChanTime,
7860 pMac->roam.configParam.neighborRoamConfig.
7861 nNeighborScanMinChanTime,
7862 mac_trace_get_neighbour_roam_state(pMac->roam.
7863 neighborRoamInfo
7864 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307865 neighborRoamState));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007866
7867 pMac->roam.configParam.neighborRoamConfig.
7868 nNeighborScanMinChanTime = nNeighborScanMinChanTime;
7869 pMac->roam.neighborRoamInfo[sessionId].cfgParams.
7870 minChannelScanTime = nNeighborScanMinChanTime;
7871 sme_release_global_lock(&pMac->sme);
7872 }
7873
7874 return status;
7875}
7876
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307877/*
7878 * sme_set_neighbor_scan_max_chan_time() -
7879 * Update nNeighborScanMaxChanTime
7880 * This function is called through dynamic setConfig callback function
7881 * to configure gNeighborScanChannelMaxTime
7882 * Usage: adb shell iwpriv wlan0 setConfig
7883 * gNeighborScanChannelMaxTime=[0 .. 60]
7884 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007885 * mac_handle - HAL handle for device
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307886 * sessionId - Session Identifier
7887 * nNeighborScanMinChanTime - Channel maximum dwell time
7888 * Return Success or failure
7889 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007890QDF_STATUS sme_set_neighbor_scan_max_chan_time(mac_handle_t mac_handle,
7891 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007892 const uint16_t
7893 nNeighborScanMaxChanTime)
7894{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007895 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307896 QDF_STATUS status = QDF_STATUS_SUCCESS;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05307897 struct csr_neighbor_roamconfig *pNeighborRoamConfig = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007898 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
7899
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007900 if (sessionId >= CSR_ROAM_SESSION_MAX) {
7901 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7902 FL("Invalid sme session id: %d"), sessionId);
7903 return QDF_STATUS_E_INVAL;
7904 }
7905
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007906 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307907 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007908 pNeighborRoamConfig =
7909 &pMac->roam.configParam.neighborRoamConfig;
7910 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307911 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007912 "LFR runtime successfully set channel max dwell time to %d - old value is %d - roam state is %s",
7913 nNeighborScanMaxChanTime,
7914 pMac->roam.configParam.neighborRoamConfig.
7915 nNeighborScanMaxChanTime,
7916 mac_trace_get_neighbour_roam_state(pMac->roam.
7917 neighborRoamInfo
7918 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307919 neighborRoamState));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007920 pNeighborRoamConfig->nNeighborScanMaxChanTime =
7921 nNeighborScanMaxChanTime;
7922 pNeighborRoamInfo->cfgParams.maxChannelScanTime =
7923 nNeighborScanMaxChanTime;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307924 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
7925 csr_roam_offload_scan(pMac, sessionId,
7926 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
7927 REASON_SCAN_CH_TIME_CHANGED);
7928 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007929 sme_release_global_lock(&pMac->sme);
7930 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307931
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007932
7933 return status;
7934}
7935
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307936/*
7937 * sme_get_neighbor_scan_min_chan_time() -
7938 * get neighbor scan min channel time
7939 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007940 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307941 * sessionId - Session Identifier
7942 * Return uint16_t - channel min time value
7943 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007944uint16_t sme_get_neighbor_scan_min_chan_time(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08007945 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007946{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007947 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007948
7949 if (sessionId >= CSR_ROAM_SESSION_MAX) {
7950 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7951 FL("Invalid sme session id: %d"), sessionId);
7952 return 0;
7953 }
7954
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007955 return pMac->roam.neighborRoamInfo[sessionId].cfgParams.
7956 minChannelScanTime;
7957}
7958
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307959/*
7960 * sme_get_neighbor_roam_state() -
7961 * get neighbor roam state
7962 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007963 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307964 * sessionId - Session Identifier
7965 * Return uint32_t - neighbor roam state
7966 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007967uint32_t sme_get_neighbor_roam_state(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007968{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007969 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007970
7971 if (sessionId >= CSR_ROAM_SESSION_MAX) {
7972 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7973 FL("Invalid sme session id: %d"), sessionId);
7974 return 0;
7975 }
7976
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007977 return pMac->roam.neighborRoamInfo[sessionId].neighborRoamState;
7978}
7979
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307980/*
7981 * sme_get_current_roam_state() -
7982 * get current roam state
7983 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007984 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307985 * sessionId - Session Identifier
7986 * Return uint32_t - current roam state
7987 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007988uint32_t sme_get_current_roam_state(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007989{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007990 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307991
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007992 return pMac->roam.curState[sessionId];
7993}
7994
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307995/*
7996 * sme_get_current_roam_sub_state() -
7997 * \brief get neighbor roam sub state
7998 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007999 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308000 * sessionId - Session Identifier
8001 * Return uint32_t - current roam sub state
8002 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008003uint32_t sme_get_current_roam_sub_state(mac_handle_t mac_handle,
8004 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008005{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008006 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308007
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008008 return pMac->roam.curSubState[sessionId];
8009}
8010
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308011/*
8012 * sme_get_lim_sme_state() -
8013 * get Lim Sme state
8014 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008015 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308016 * Return uint32_t - Lim Sme state
8017 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008018uint32_t sme_get_lim_sme_state(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008019{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008020 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308021
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008022 return pMac->lim.gLimSmeState;
8023}
8024
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308025/*
8026 * sme_get_lim_mlm_state() -
8027 * get Lim Mlm state
8028 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008029 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308030 * Return uint32_t - Lim Mlm state
8031 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008032uint32_t sme_get_lim_mlm_state(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008033{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008034 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308035
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008036 return pMac->lim.gLimMlmState;
8037}
8038
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308039/*
8040 * sme_is_lim_session_valid() -
8041 * is Lim session valid
8042 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008043 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308044 * sessionId - Session Identifier
8045 * Return bool - true or false
8046 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008047bool sme_is_lim_session_valid(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008048{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008049 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Hanumantha Reddy Pothula589fd702015-11-17 15:25:16 +05308050
8051 if (sessionId > pMac->lim.maxBssId)
8052 return false;
8053
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008054 return pMac->lim.gpSession[sessionId].valid;
8055}
8056
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308057/*
8058 * sme_get_lim_sme_session_state() -
8059 * get Lim Sme session state
8060 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008061 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308062 * sessionId - Session Identifier
8063 * Return uint32_t - Lim Sme session state
8064 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008065uint32_t sme_get_lim_sme_session_state(mac_handle_t mac_handle,
8066 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008067{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008068 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308069
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008070 return pMac->lim.gpSession[sessionId].limSmeState;
8071}
8072
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308073/*
8074 * sme_get_lim_mlm_session_state() -
8075 * \brief get Lim Mlm session state
8076 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008077 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308078 * sessionId - Session Identifier
8079 * Return uint32_t - Lim Mlm session state
8080 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008081uint32_t sme_get_lim_mlm_session_state(mac_handle_t mac_handle,
8082 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008083{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008084 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308085
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008086 return pMac->lim.gpSession[sessionId].limMlmState;
8087}
8088
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308089/*
8090 * sme_get_neighbor_scan_max_chan_time() -
8091 * get neighbor scan max channel time
8092 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008093 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308094 * sessionId - Session Identifier
8095 * Return uint16_t - channel max time value
8096 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008097uint16_t sme_get_neighbor_scan_max_chan_time(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08008098 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008099{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008100 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08008101
8102 if (sessionId >= CSR_ROAM_SESSION_MAX) {
8103 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8104 FL("Invalid sme session id: %d"), sessionId);
8105 return 0;
8106 }
8107
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008108 return pMac->roam.neighborRoamInfo[sessionId].cfgParams.
8109 maxChannelScanTime;
8110}
8111
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308112/*
8113 * sme_set_neighbor_scan_period() -
8114 * Update nNeighborScanPeriod
8115 * This function is called through dynamic setConfig callback function
8116 * to configure nNeighborScanPeriod
8117 * Usage: adb shell iwpriv wlan0 setConfig
8118 * nNeighborScanPeriod=[0 .. 1000]
8119 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008120 * mac_handle - HAL handle for device
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308121 * sessionId - Session Identifier
8122 * nNeighborScanPeriod - neighbor scan period
8123 * Return Success or failure
8124 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008125QDF_STATUS sme_set_neighbor_scan_period(mac_handle_t mac_handle,
8126 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008127 const uint16_t nNeighborScanPeriod)
8128{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008129 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308130 QDF_STATUS status = QDF_STATUS_SUCCESS;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05308131 struct csr_neighbor_roamconfig *pNeighborRoamConfig = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008132 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
8133
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08008134 if (sessionId >= CSR_ROAM_SESSION_MAX) {
8135 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8136 FL("Invalid sme session id: %d"), sessionId);
8137 return QDF_STATUS_E_INVAL;
8138 }
8139
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008140 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308141 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008142 pNeighborRoamConfig =
8143 &pMac->roam.configParam.neighborRoamConfig;
8144 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308145 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308146 "LFR runtime successfully set neighbor scan period to %d - old value is %d - roam state is %s",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008147 nNeighborScanPeriod,
8148 pMac->roam.configParam.neighborRoamConfig.
8149 nNeighborScanTimerPeriod,
8150 mac_trace_get_neighbour_roam_state(pMac->roam.
8151 neighborRoamInfo
8152 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308153 neighborRoamState));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008154 pNeighborRoamConfig->nNeighborScanTimerPeriod =
8155 nNeighborScanPeriod;
8156 pNeighborRoamInfo->cfgParams.neighborScanPeriod =
8157 nNeighborScanPeriod;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05308158
8159 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
8160 csr_roam_offload_scan(pMac, sessionId,
8161 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
8162 REASON_SCAN_HOME_TIME_CHANGED);
8163 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008164 sme_release_global_lock(&pMac->sme);
8165 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008166
8167 return status;
8168}
8169
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308170/*
8171 * sme_get_neighbor_scan_period() -
8172 * get neighbor scan period
8173 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008174 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308175 * sessionId - Session Identifier
8176 * Return uint16_t - neighbor scan period
8177 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008178uint16_t sme_get_neighbor_scan_period(mac_handle_t mac_handle,
8179 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008180{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008181 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08008182
8183 if (sessionId >= CSR_ROAM_SESSION_MAX) {
8184 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8185 FL("Invalid sme session id: %d"), sessionId);
8186 return 0;
8187 }
8188
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008189 return pMac->roam.neighborRoamInfo[sessionId].cfgParams.
8190 neighborScanPeriod;
8191}
8192
Sridhar Selvaraj1b2330c2017-07-21 15:16:42 +05308193/**
8194 * sme_set_neighbor_scan_min_period() - Update neighbor_scan_min_period
8195 * This function is called through dynamic setConfig callback function
8196 * to configure neighbor_scan_min_period
8197 *
8198 * @hal - HAL handle for device
8199 * @session_id - Session Identifier
8200 * @neighbor_scan_min_period - neighbor scan min period
8201 *
8202 * Return - QDF_STATUS
8203 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08008204QDF_STATUS sme_set_neighbor_scan_min_period(mac_handle_t hal,
Sridhar Selvaraj1b2330c2017-07-21 15:16:42 +05308205 uint8_t session_id,
8206 const uint16_t
8207 neighbor_scan_min_period)
8208{
8209 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
8210 QDF_STATUS status = QDF_STATUS_SUCCESS;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05308211 struct csr_neighbor_roamconfig *p_neighbor_roam_config = NULL;
Sridhar Selvaraj1b2330c2017-07-21 15:16:42 +05308212 tpCsrNeighborRoamControlInfo p_neighbor_roam_info = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008213
Sridhar Selvaraj1b2330c2017-07-21 15:16:42 +05308214 if (session_id >= CSR_ROAM_SESSION_MAX) {
8215 sme_err("Invalid sme session id: %d", session_id);
8216 return QDF_STATUS_E_INVAL;
8217 }
8218
8219 status = sme_acquire_global_lock(&pmac->sme);
8220 if (QDF_IS_STATUS_SUCCESS(status)) {
8221 p_neighbor_roam_config =
8222 &pmac->roam.configParam.neighborRoamConfig;
8223 p_neighbor_roam_info = &pmac->
8224 roam.neighborRoamInfo[session_id];
8225 sme_debug("LFR:set neighbor scan min period, old:%d, "
8226 "new: %d, state: %s",
8227 pmac->roam.configParam.neighborRoamConfig.
8228 neighbor_scan_min_timer_period,
8229 neighbor_scan_min_period,
8230 mac_trace_get_neighbour_roam_state(pmac->roam.
8231 neighborRoamInfo[session_id].
8232 neighborRoamState));
8233 p_neighbor_roam_config->neighbor_scan_min_timer_period =
8234 neighbor_scan_min_period;
8235 p_neighbor_roam_info->cfgParams.neighbor_scan_min_period =
8236 neighbor_scan_min_period;
8237 sme_release_global_lock(&pmac->sme);
8238 }
8239
8240 return status;
8241}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008242
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308243/*
8244 * sme_get_roam_rssi_diff() - get Roam rssi diff
8245 * This is a synchronous call
8246 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008247 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308248 * Return uint16_t - Rssi diff value
8249 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008250uint8_t sme_get_roam_rssi_diff(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008251{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008252 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308253
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008254 return pMac->roam.configParam.RoamRssiDiff;
8255}
8256
8257/**
8258 * sme_change_roam_scan_channel_list() - to change scan channel list
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008259 * @mac_handle: pointer HAL handle returned by mac_open
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008260 * @sessionId: sme session id
8261 * @pChannelList: Output channel list
8262 * @numChannels: Output number of channels
8263 *
8264 * This routine is called to Change roam scan channel list.
8265 * This is a synchronous call
8266 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308267 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008268 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008269QDF_STATUS sme_change_roam_scan_channel_list(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08008270 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008271 uint8_t *pChannelList,
8272 uint8_t numChannels)
8273{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008274 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308275 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08008276 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008277 uint8_t oldChannelList[WNI_CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
8278 uint8_t newChannelList[WNI_CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
8279 uint8_t i = 0, j = 0;
8280 tCsrChannelInfo *chan_info;
8281
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08008282 if (sessionId >= CSR_ROAM_SESSION_MAX) {
8283 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8284 FL("Invalid sme session id: %d"), sessionId);
8285 return QDF_STATUS_E_INVAL;
8286 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008287
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08008288 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008289 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308290 if (!QDF_IS_STATUS_SUCCESS(status)) {
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05308291 sme_err("Failed to acquire SME lock");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008292 return status;
8293 }
8294 chan_info = &pNeighborRoamInfo->cfgParams.channelInfo;
8295
8296 if (NULL != chan_info->ChannelList) {
8297 for (i = 0; i < chan_info->numOfChannels; i++) {
8298 if (j < sizeof(oldChannelList))
8299 j += snprintf(oldChannelList + j,
8300 sizeof(oldChannelList) -
8301 j, "%d",
8302 chan_info->ChannelList[i]);
8303 else
8304 break;
8305 }
8306 }
8307 csr_flush_cfg_bg_scan_roam_channel_list(pMac, sessionId);
8308 csr_create_bg_scan_roam_channel_list(pMac, sessionId, pChannelList,
8309 numChannels);
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008310 sme_set_roam_scan_control(mac_handle, sessionId, 1);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008311 if (NULL != chan_info->ChannelList) {
8312 j = 0;
8313 for (i = 0; i < chan_info->numOfChannels; i++) {
8314 if (j < sizeof(newChannelList))
8315 j += snprintf(newChannelList + j,
8316 sizeof(newChannelList) -
8317 j, " %d",
8318 chan_info->ChannelList[i]);
8319 else
8320 break;
8321 }
8322 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308323 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308324 "LFR runtime successfully set roam scan channels to %s - old value is %s - roam state is %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008325 newChannelList, oldChannelList,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308326 pMac->roam.neighborRoamInfo[sessionId].neighborRoamState);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008327
8328 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
8329 csr_roam_offload_scan(pMac, sessionId,
8330 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
8331 REASON_CHANNEL_LIST_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05308332
8333 sme_release_global_lock(&pMac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008334 return status;
8335}
8336
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008337/**
8338 * sme_get_roam_scan_channel_list() - To get roam scan channel list
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008339 * @mac_handle: HAL pointer
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008340 * @pChannelList: Output channel list
8341 * @pNumChannels: Output number of channels
8342 * @sessionId: Session Identifier
8343 *
8344 * To get roam scan channel list This is a synchronous call
8345 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308346 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008347 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008348QDF_STATUS sme_get_roam_scan_channel_list(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008349 uint8_t *pChannelList, uint8_t *pNumChannels,
8350 uint8_t sessionId)
8351{
8352 int i = 0;
8353 uint8_t *pOutPtr = pChannelList;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008354 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08008355 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308356 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008357
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08008358 if (sessionId >= CSR_ROAM_SESSION_MAX) {
8359 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8360 FL("Invalid sme session id: %d"), sessionId);
8361 return QDF_STATUS_E_INVAL;
8362 }
8363
8364 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008365 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308366 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008367 return status;
8368 if (NULL == pNeighborRoamInfo->cfgParams.channelInfo.ChannelList) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308369 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008370 FL("Roam Scan channel list is NOT yet initialized"));
8371 *pNumChannels = 0;
8372 sme_release_global_lock(&pMac->sme);
8373 return status;
8374 }
8375
8376 *pNumChannels = pNeighborRoamInfo->cfgParams.channelInfo.numOfChannels;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308377 for (i = 0; i < (*pNumChannels); i++)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008378 pOutPtr[i] =
8379 pNeighborRoamInfo->cfgParams.channelInfo.ChannelList[i];
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308380
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008381 pOutPtr[i] = '\0';
8382 sme_release_global_lock(&pMac->sme);
8383 return status;
8384}
8385
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308386/*
8387 * sme_get_is_ese_feature_enabled() - get ESE feature enabled or not
8388 * This is a synchronuous call
8389 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008390 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308391 * Return true (1) - if the ESE feature is enabled
8392 * false (0) - if feature is disabled (compile or runtime)
8393 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008394bool sme_get_is_ese_feature_enabled(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008395{
8396#ifdef FEATURE_WLAN_ESE
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008397 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308398
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008399 return csr_roam_is_ese_ini_feature_enabled(pMac);
8400#else
8401 return false;
8402#endif
8403}
8404
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308405/*
8406 * sme_get_wes_mode() - get WES Mode
8407 * This is a synchronous call
8408 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008409 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308410 * Return uint8_t - WES Mode Enabled(1)/Disabled(0)
8411 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008412bool sme_get_wes_mode(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008413{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008414 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308415
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008416 return pMac->roam.configParam.isWESModeEnabled;
8417}
8418
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308419/*
8420 * sme_get_roam_scan_control() - get scan control
8421 * This is a synchronous call
8422 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008423 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308424 * Return bool - Enabled(1)/Disabled(0)
8425 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008426bool sme_get_roam_scan_control(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008427{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008428 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308429
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008430 return pMac->roam.configParam.nRoamScanControl;
8431}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008432
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308433/*
8434 * sme_get_is_lfr_feature_enabled() - get LFR feature enabled or not
8435 * This is a synchronuous call
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008436 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308437 * Return true (1) - if the feature is enabled
8438 * false (0) - if feature is disabled (compile or runtime)
8439 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008440bool sme_get_is_lfr_feature_enabled(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008441{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008442 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308443
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008444 return pMac->roam.configParam.isFastRoamIniFeatureEnabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008445}
8446
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308447/*
8448 * sme_get_is_ft_feature_enabled() - get FT feature enabled or not
8449 * This is a synchronuous call
8450 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008451 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308452 * Return true (1) - if the feature is enabled
8453 * false (0) - if feature is disabled (compile or runtime)
8454 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008455bool sme_get_is_ft_feature_enabled(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008456{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008457 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308458
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008459 return pMac->roam.configParam.isFastTransitionEnabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008460}
8461
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07008462/**
8463 * sme_is_feature_supported_by_fw() - check if feature is supported by FW
8464 * @feature: enum value of requested feature.
8465 *
8466 * Retrun: 1 if supported; 0 otherwise
8467 */
8468bool sme_is_feature_supported_by_fw(enum cap_bitmap feature)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008469{
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07008470 return IS_FEATURE_SUPPORTED_BY_FW(feature);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008471}
8472
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008473QDF_STATUS sme_get_link_speed(mac_handle_t mac_handle, tSirLinkSpeedInfo *lsReq,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008474 void *plsContext,
8475 void (*pCallbackfn)(tSirLinkSpeedInfo *indParam,
8476 void *pContext))
8477{
8478
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308479 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnsona5317a62017-01-26 08:51:25 -08008480 tpAniSirGlobal pMac;
Mukul Sharmac3886aa2017-05-04 17:53:22 +05308481 void *wma_handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008482
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008483 if (!mac_handle || !pCallbackfn || !lsReq) {
Jeff Johnsona5317a62017-01-26 08:51:25 -08008484 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8485 FL("Invalid parameter"));
8486 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008487 }
Jeff Johnsona5317a62017-01-26 08:51:25 -08008488
Mukul Sharmac3886aa2017-05-04 17:53:22 +05308489 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
8490 if (!wma_handle) {
8491 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8492 "wma handle is NULL");
8493 return QDF_STATUS_E_FAILURE;
8494 }
8495
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008496 pMac = PMAC_STRUCT(mac_handle);
Jeff Johnsona5317a62017-01-26 08:51:25 -08008497 status = sme_acquire_global_lock(&pMac->sme);
8498 if (QDF_STATUS_SUCCESS != status) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -07008499 sme_err("Failed to acquire global lock");
Jeff Johnsona5317a62017-01-26 08:51:25 -08008500 return QDF_STATUS_E_FAILURE;
8501 }
8502
8503 pMac->sme.pLinkSpeedCbContext = plsContext;
8504 pMac->sme.pLinkSpeedIndCb = pCallbackfn;
gaurank kathpaliaca8f4612018-06-13 14:21:53 +05308505 status = wma_get_link_speed(wma_handle, lsReq);
Jeff Johnsona5317a62017-01-26 08:51:25 -08008506 sme_release_global_lock(&pMac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008507 return status;
8508}
8509
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05308510QDF_STATUS sme_get_peer_stats(tpAniSirGlobal mac,
8511 struct sir_peer_info_req req)
8512{
8513 QDF_STATUS qdf_status;
8514 struct scheduler_msg message = {0};
8515
8516 qdf_status = sme_acquire_global_lock(&mac->sme);
8517 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
8518 sme_debug("Failed to get Lock");
8519 return qdf_status;
8520 }
8521 /* serialize the req through MC thread */
8522 message.bodyptr = qdf_mem_malloc(sizeof(req));
Arif Hussain0ef77082018-10-10 16:42:53 -07008523 if (!message.bodyptr) {
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05308524 sme_release_global_lock(&mac->sme);
8525 return QDF_STATUS_E_NOMEM;
8526 }
8527 qdf_mem_copy(message.bodyptr, &req, sizeof(req));
8528 message.type = WMA_GET_PEER_INFO;
8529 message.reserved = 0;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308530 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
8531 QDF_MODULE_ID_WMA,
8532 QDF_MODULE_ID_WMA, &message);
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05308533 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
8534 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8535 "%s: Post get peer info msg fail", __func__);
8536 qdf_mem_free(message.bodyptr);
8537 qdf_status = QDF_STATUS_E_FAILURE;
8538 }
8539 sme_release_global_lock(&mac->sme);
8540 return qdf_status;
8541}
8542
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08008543QDF_STATUS sme_get_peer_info(mac_handle_t hal, struct sir_peer_info_req req,
Will Huang558f8082017-05-31 16:22:24 +08008544 void *context,
8545 void (*callbackfn)(struct sir_peer_info_resp *param,
8546 void *pcontext))
8547{
8548
8549 QDF_STATUS status;
8550 QDF_STATUS qdf_status;
8551 tpAniSirGlobal mac = PMAC_STRUCT(hal);
Rajeev Kumar658e8492017-12-13 11:35:41 -08008552 struct scheduler_msg message = {0};
Will Huang558f8082017-05-31 16:22:24 +08008553
8554 status = sme_acquire_global_lock(&mac->sme);
8555 if (QDF_STATUS_SUCCESS == status) {
8556 if (NULL == callbackfn) {
8557 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8558 "%s: Indication Call back is NULL",
8559 __func__);
8560 sme_release_global_lock(&mac->sme);
8561 return QDF_STATUS_E_FAILURE;
8562 }
8563
8564 mac->sme.pget_peer_info_ind_cb = callbackfn;
8565 mac->sme.pget_peer_info_cb_context = context;
8566
8567 /* serialize the req through MC thread */
8568 message.bodyptr = qdf_mem_malloc(sizeof(req));
Arif Hussain0ef77082018-10-10 16:42:53 -07008569 if (!message.bodyptr) {
Will Huang558f8082017-05-31 16:22:24 +08008570 sme_release_global_lock(&mac->sme);
8571 return QDF_STATUS_E_NOMEM;
8572 }
8573 qdf_mem_copy(message.bodyptr, &req, sizeof(req));
8574 message.type = WMA_GET_PEER_INFO;
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05308575 message.reserved = 0;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308576 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
8577 QDF_MODULE_ID_WMA,
8578 QDF_MODULE_ID_WMA,
8579 &message);
Will Huang558f8082017-05-31 16:22:24 +08008580 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
8581 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8582 "%s: Post get peer info msg fail", __func__);
8583 qdf_mem_free(message.bodyptr);
8584 status = QDF_STATUS_E_FAILURE;
8585 }
8586 sme_release_global_lock(&mac->sme);
8587 }
8588 return status;
8589}
8590
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08008591QDF_STATUS sme_get_peer_info_ext(mac_handle_t hal,
Will Huang558f8082017-05-31 16:22:24 +08008592 struct sir_peer_info_ext_req *req,
8593 void *context,
8594 void (*callbackfn)(struct sir_peer_info_ext_resp *param,
8595 void *pcontext))
8596{
8597 QDF_STATUS status;
8598 QDF_STATUS qdf_status;
8599 tpAniSirGlobal mac = PMAC_STRUCT(hal);
Rajeev Kumar658e8492017-12-13 11:35:41 -08008600 struct scheduler_msg message = {0};
Will Huang558f8082017-05-31 16:22:24 +08008601
8602 status = sme_acquire_global_lock(&mac->sme);
8603 if (QDF_STATUS_SUCCESS == status) {
8604 if (NULL == callbackfn) {
8605 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8606 "%s: Indication Call back is NULL",
8607 __func__);
8608 sme_release_global_lock(&mac->sme);
8609 return QDF_STATUS_E_FAILURE;
8610 }
8611
8612 mac->sme.pget_peer_info_ext_ind_cb = callbackfn;
8613 mac->sme.pget_peer_info_ext_cb_context = context;
8614
8615 /* serialize the req through MC thread */
8616 message.bodyptr =
8617 qdf_mem_malloc(sizeof(struct sir_peer_info_ext_req));
Arif Hussain0ef77082018-10-10 16:42:53 -07008618 if (!message.bodyptr) {
Will Huang558f8082017-05-31 16:22:24 +08008619 sme_release_global_lock(&mac->sme);
8620 return QDF_STATUS_E_NOMEM;
8621 }
8622 qdf_mem_copy(message.bodyptr,
8623 req,
8624 sizeof(struct sir_peer_info_ext_req));
8625 message.type = WMA_GET_PEER_INFO_EXT;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308626 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
8627 QDF_MODULE_ID_WMA,
8628 QDF_MODULE_ID_WMA,
8629 &message);
Will Huang558f8082017-05-31 16:22:24 +08008630 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
8631 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8632 "%s: Post get rssi msg fail", __func__);
8633 qdf_mem_free(message.bodyptr);
8634 status = QDF_STATUS_E_FAILURE;
8635 }
8636 sme_release_global_lock(&mac->sme);
8637 }
8638 return status;
8639}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008640
8641/*
8642 * SME API to enable/disable WLAN driver initiated SSR
8643 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008644void sme_update_enable_ssr(mac_handle_t mac_handle, bool enableSSR)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008645{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008646 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308647 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008648
8649 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308650 if (QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -07008651 sme_debug("SSR level is changed %d", enableSSR);
Jeff Johnson698eacd2018-05-12 17:00:03 -07008652 /* not serializing this message, as this is only going
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008653 * to set a variable in WMA/WDI
8654 */
8655 WMA_SetEnableSSR(enableSSR);
8656 sme_release_global_lock(&pMac->sme);
8657 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008658}
8659
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008660/*convert the ini value to the ENUM used in csr and MAC for CB state*/
8661ePhyChanBondState sme_get_cb_phy_state_from_cb_ini_value(uint32_t cb_ini_value)
8662{
8663 return csr_convert_cb_ini_value_to_phy_cb_state(cb_ini_value);
8664}
8665
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308666/*
8667 * sme_set_curr_device_mode() - Sets the current operating device mode.
8668 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008669 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308670 * currDeviceMode - Current operating device mode.
8671 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008672void sme_set_curr_device_mode(mac_handle_t mac_handle,
Jeff Johnsonc1e62782017-11-09 09:50:17 -08008673 enum QDF_OPMODE currDeviceMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008674{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008675 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308676
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008677 pMac->sme.currDeviceMode = currDeviceMode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008678}
8679
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308680/*
8681 * sme_handoff_request() - a wrapper function to Request a handoff from CSR.
8682 * This is a synchronous call
8683 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008684 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308685 * sessionId - Session Identifier
8686 * pHandoffInfo - info provided by HDD with the handoff request (namely:
8687 * BSSID, channel etc.)
8688 * Return QDF_STATUS_SUCCESS - SME passed the request to CSR successfully.
8689 * Other status means SME is failed to send the request.
8690 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008691
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008692QDF_STATUS sme_handoff_request(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008693 uint8_t sessionId,
8694 tCsrHandoffRequest *pHandoffInfo)
8695{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008696 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308697 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008698
8699 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308700 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308701 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008702 "%s: invoked", __func__);
8703 status = csr_handoff_request(pMac, sessionId, pHandoffInfo);
8704 sme_release_global_lock(&pMac->sme);
8705 }
8706
8707 return status;
8708}
8709
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008710/*
8711 * SME API to check if there is any infra station or
8712 * P2P client is connected
8713 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008714QDF_STATUS sme_is_sta_p2p_client_connected(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008715{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008716 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308717
8718 if (csr_is_infra_connected(pMac))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308719 return QDF_STATUS_SUCCESS;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308720
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308721 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008722}
8723
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008724/**
8725 * sme_add_periodic_tx_ptrn() - Add Periodic TX Pattern
8726 * @hal: global hal handle
8727 * @addPeriodicTxPtrnParams: request message
8728 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308729 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008730 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308731QDF_STATUS
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08008732sme_add_periodic_tx_ptrn(mac_handle_t hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008733 struct sSirAddPeriodicTxPtrn *addPeriodicTxPtrnParams)
8734{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308735 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008736 tpAniSirGlobal mac = PMAC_STRUCT(hal);
8737 struct sSirAddPeriodicTxPtrn *req_msg;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008738 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008739
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07008740 SME_ENTER();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008741
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308742 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07008743 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308744 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008745
8746 *req_msg = *addPeriodicTxPtrnParams;
8747
8748 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308749 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07008750 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008751 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308752 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008753 return status;
8754 }
8755
8756 /* Serialize the req through MC thread */
8757 msg.bodyptr = req_msg;
8758 msg.type = WMA_ADD_PERIODIC_TX_PTRN_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05308759 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
8760 NO_SESSION, msg.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308761 status = scheduler_post_message(QDF_MODULE_ID_SME,
8762 QDF_MODULE_ID_WMA,
8763 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308764 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07008765 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008766 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308767 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008768 }
8769 sme_release_global_lock(&mac->sme);
8770 return status;
8771}
8772
8773/**
8774 * sme_del_periodic_tx_ptrn() - Delete Periodic TX Pattern
8775 * @hal: global hal handle
8776 * @delPeriodicTxPtrnParams: request message
8777 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308778 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008779 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308780QDF_STATUS
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08008781sme_del_periodic_tx_ptrn(mac_handle_t hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008782 struct sSirDelPeriodicTxPtrn *delPeriodicTxPtrnParams)
8783{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308784 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008785 tpAniSirGlobal mac = PMAC_STRUCT(hal);
8786 struct sSirDelPeriodicTxPtrn *req_msg;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008787 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008788
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07008789 SME_ENTER();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008790
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308791 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07008792 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308793 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008794
8795 *req_msg = *delPeriodicTxPtrnParams;
8796
8797 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308798 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07008799 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008800 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308801 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008802 return status;
8803 }
8804
8805 /* Serialize the req through MC thread */
8806 msg.bodyptr = req_msg;
8807 msg.type = WMA_DEL_PERIODIC_TX_PTRN_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05308808 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
8809 NO_SESSION, msg.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308810 status = scheduler_post_message(QDF_MODULE_ID_SME,
8811 QDF_MODULE_ID_WMA,
8812 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308813 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07008814 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008815 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308816 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008817 }
8818 sme_release_global_lock(&mac->sme);
8819 return status;
8820}
8821
Rachit Kankaneee1735c2018-08-02 13:19:34 +05308822#ifdef FEATURE_WLAN_RMC
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308823/*
8824 * sme_enable_rmc() - enables RMC
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008825 * @mac_handle : Pointer to global HAL handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308826 * @sessionId : Session ID
8827 *
8828 * Return: QDF_STATUS
8829 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008830QDF_STATUS sme_enable_rmc(mac_handle_t mac_handle, uint32_t sessionId)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008831{
8832 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008833 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008834 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008835 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
8836
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07008837 SME_ENTER();
8838
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008839 status = sme_acquire_global_lock(&pMac->sme);
8840 if (QDF_IS_STATUS_SUCCESS(status)) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08008841 message.bodyptr = NULL;
8842 message.type = WMA_RMC_ENABLE_IND;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308843 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
8844 QDF_MODULE_ID_WMA,
8845 QDF_MODULE_ID_WMA,
8846 &message);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008847 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
8848 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8849 "%s: failed to post message to WMA",
8850 __func__);
8851 status = QDF_STATUS_E_FAILURE;
8852 }
8853 sme_release_global_lock(&pMac->sme);
8854 }
8855 return status;
8856}
8857
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308858/*
8859 * sme_disable_rmc() - disables RMC
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008860 * @mac_handle : Pointer to global HAL handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308861 * @sessionId : Session ID
8862 *
8863 * Return: QDF_STATUS
8864 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008865QDF_STATUS sme_disable_rmc(mac_handle_t mac_handle, uint32_t sessionId)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008866{
8867 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008868 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008869 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008870 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
8871
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07008872 SME_ENTER();
8873
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008874 status = sme_acquire_global_lock(&pMac->sme);
8875 if (QDF_IS_STATUS_SUCCESS(status)) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08008876 message.bodyptr = NULL;
8877 message.type = WMA_RMC_DISABLE_IND;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308878 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
8879 QDF_MODULE_ID_WMA,
8880 QDF_MODULE_ID_WMA,
8881 &message);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008882 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
8883 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8884 "%s: failed to post message to WMA",
8885 __func__);
8886 status = QDF_STATUS_E_FAILURE;
8887 }
8888 sme_release_global_lock(&pMac->sme);
8889 }
8890 return status;
8891}
8892
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308893/*
8894 * sme_send_rmc_action_period() - sends RMC action period param to target
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008895 * @mac_handle : Pointer to global HAL handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308896 * @sessionId : Session ID
8897 *
8898 * Return: QDF_STATUS
8899 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008900QDF_STATUS sme_send_rmc_action_period(mac_handle_t mac_handle,
8901 uint32_t sessionId)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008902{
8903 QDF_STATUS status = QDF_STATUS_SUCCESS;
8904 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008905 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008906 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008907
8908 status = sme_acquire_global_lock(&pMac->sme);
8909 if (QDF_STATUS_SUCCESS == status) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08008910 message.bodyptr = NULL;
8911 message.type = WMA_RMC_ACTION_PERIOD_IND;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308912 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
8913 QDF_MODULE_ID_WMA,
8914 QDF_MODULE_ID_WMA,
8915 &message);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008916 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
8917 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8918 "%s: failed to post message to WMA",
8919 __func__);
8920 status = QDF_STATUS_E_FAILURE;
8921 }
8922 sme_release_global_lock(&pMac->sme);
8923 }
8924
8925 return status;
8926}
Rachit Kankaneee1735c2018-08-02 13:19:34 +05308927#endif /* FEATURE_WLAN_RMC */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008928
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308929/*
8930 * sme_request_ibss_peer_info() - request ibss peer info
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008931 * @mac_handle : Pointer to global HAL handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308932 * @pUserData : Pointer to user data
8933 * @peerInfoCbk : Peer info callback
8934 * @allPeerInfoReqd : All peer info required or not
8935 * @staIdx : sta index
8936 *
8937 * Return: QDF_STATUS
8938 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008939QDF_STATUS sme_request_ibss_peer_info(mac_handle_t mac_handle, void *pUserData,
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008940 pIbssPeerInfoCb peerInfoCbk,
8941 bool allPeerInfoReqd, uint8_t staIdx)
8942{
8943 QDF_STATUS status = QDF_STATUS_E_FAILURE;
8944 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008945 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008946 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008947 tSirIbssGetPeerInfoReqParams *pIbssInfoReqParams;
8948
8949 status = sme_acquire_global_lock(&pMac->sme);
8950 if (QDF_STATUS_SUCCESS == status) {
8951 pMac->sme.peerInfoParams.peerInfoCbk = peerInfoCbk;
8952 pMac->sme.peerInfoParams.pUserData = pUserData;
8953
8954 pIbssInfoReqParams = (tSirIbssGetPeerInfoReqParams *)
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308955 qdf_mem_malloc(sizeof(tSirIbssGetPeerInfoReqParams));
Arif Hussain0ef77082018-10-10 16:42:53 -07008956 if (!pIbssInfoReqParams) {
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008957 sme_release_global_lock(&pMac->sme);
8958 return QDF_STATUS_E_NOMEM;
8959 }
8960 pIbssInfoReqParams->allPeerInfoReqd = allPeerInfoReqd;
8961 pIbssInfoReqParams->staIdx = staIdx;
8962
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08008963 message.type = WMA_GET_IBSS_PEER_INFO_REQ;
8964 message.bodyptr = pIbssInfoReqParams;
8965 message.reserved = 0;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008966
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308967 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
8968 QDF_MODULE_ID_WMA,
8969 QDF_MODULE_ID_WMA,
8970 &message);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008971 if (QDF_STATUS_SUCCESS != qdf_status) {
8972 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8973 "%s: Post WMA_GET_IBSS_PEER_INFO_REQ MSG failed",
8974 __func__);
8975 qdf_mem_free(pIbssInfoReqParams);
8976 qdf_status = QDF_STATUS_E_FAILURE;
8977 }
8978 sme_release_global_lock(&pMac->sme);
8979 }
8980
8981 return qdf_status;
8982}
8983
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308984/*
8985 * sme_send_cesium_enable_ind() -
8986 * Used to send proprietary cesium enable indication to fw
8987 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008988 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308989 * sessionId
8990 * Return QDF_STATUS
8991 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008992QDF_STATUS sme_send_cesium_enable_ind(mac_handle_t mac_handle,
8993 uint32_t sessionId)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008994{
8995 QDF_STATUS status = QDF_STATUS_SUCCESS;
8996 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008997 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008998 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008999
9000 status = sme_acquire_global_lock(&pMac->sme);
9001 if (QDF_STATUS_SUCCESS == status) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009002 message.bodyptr = NULL;
9003 message.type = WMA_IBSS_CESIUM_ENABLE_IND;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309004 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
9005 QDF_MODULE_ID_WMA,
9006 QDF_MODULE_ID_WMA,
9007 &message);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08009008 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
9009 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9010 "%s: failed to post message to WMA",
9011 __func__);
9012 status = QDF_STATUS_E_FAILURE;
9013 }
9014 sme_release_global_lock(&pMac->sme);
9015 }
9016
9017 return status;
9018}
9019
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08009020QDF_STATUS sme_set_wlm_latency_level(mac_handle_t hal, uint16_t session_id,
Paul Zhang99fe8842017-12-08 14:43:46 +08009021 uint16_t latency_level)
9022{
9023 QDF_STATUS status;
9024 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
9025 struct wlm_latency_level_param params;
9026 void *wma = cds_get_context(QDF_MODULE_ID_WMA);
9027
Bala Venkatesh7cf5b662018-05-10 15:18:53 +05309028 if (!wma)
9029 return QDF_STATUS_E_FAILURE;
9030
Paul Zhang99fe8842017-12-08 14:43:46 +08009031 if (!mac_ctx->roam.configParam.wlm_latency_enable) {
9032 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9033 "%s: WLM latency level setting is disabled",
9034 __func__);
9035 return QDF_STATUS_E_FAILURE;
9036 }
Krunal Soni3fa80e22018-01-09 14:16:02 -08009037 if (!wma) {
9038 sme_err("wma is NULL");
9039 return QDF_STATUS_E_FAILURE;
9040 }
Paul Zhang99fe8842017-12-08 14:43:46 +08009041
9042 params.wlm_latency_level = latency_level;
9043 params.wlm_latency_flags =
9044 mac_ctx->roam.configParam.wlm_latency_flags[latency_level];
9045 params.vdev_id = session_id;
9046
9047 status = wma_set_wlm_latency_level(wma, &params);
9048 if (!QDF_IS_STATUS_SUCCESS(status))
9049 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9050 "%s: failed to set latency level",
9051 __func__);
9052
9053 return status;
9054}
9055
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009056void sme_get_command_q_status(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009057{
9058 tSmeCmd *pTempCmd = NULL;
9059 tListElem *pEntry;
Pragaspathi Thilagarajb11dbe42018-07-23 16:42:17 +05309060 tpAniSirGlobal pMac;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009061
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009062 if (NULL != mac_handle) {
9063 pMac = PMAC_STRUCT(mac_handle);
Pragaspathi Thilagarajb11dbe42018-07-23 16:42:17 +05309064 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309065 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009066 "%s: Invalid mac_handle pointer", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009067 return;
9068 }
Krunal Sonia8270f52017-02-23 19:51:25 -08009069 pEntry = csr_nonscan_active_ll_peek_head(pMac, LL_ACCESS_LOCK);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309070 if (pEntry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009071 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309072
Kabilan Kannan33fcd682018-03-08 14:29:46 -08009073 sme_err("WLAN_BUG_RCA: Currently smeCmdActiveList has command (0x%X)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009074 (pTempCmd) ? pTempCmd->command : eSmeNoCommand);
9075 if (pTempCmd) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309076 if (eSmeCsrCommandMask & pTempCmd->command)
9077 /* CSR command is stuck. See what the reason code is
9078 * for that command
9079 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009080 dump_csr_command_info(pMac, pTempCmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009081 } /* if(pTempCmd) */
9082
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009083 sme_err("Currently smeCmdPendingList has %d commands",
Krunal Soni72dba662017-02-15 20:13:17 -08009084 csr_nonscan_pending_ll_count(pMac));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009085
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009086}
Kiran Kumar Lokere1aa9c9a2016-10-05 18:50:59 -07009087
Agrawal Ashishb141b092016-09-02 19:59:26 +05309088#ifdef WLAN_FEATURE_DSRC
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009089/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009090 * copy_sir_ocb_config() - Performs deep copy of an OCB configuration
9091 * @src: the source configuration
9092 *
9093 * Return: pointer to the copied OCB configuration
9094 */
9095static struct sir_ocb_config *sme_copy_sir_ocb_config(
9096 struct sir_ocb_config *src)
9097{
9098 struct sir_ocb_config *dst;
9099 uint32_t length;
9100 void *cursor;
9101
9102 length = sizeof(*src) +
9103 src->channel_count * sizeof(*src->channels) +
9104 src->schedule_size * sizeof(*src->schedule) +
9105 src->dcc_ndl_chan_list_len +
9106 src->dcc_ndl_active_state_list_len;
9107
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309108 dst = qdf_mem_malloc(length);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009109 if (!dst)
9110 return NULL;
9111
9112 *dst = *src;
9113
9114 cursor = dst;
9115 cursor += sizeof(*dst);
9116 dst->channels = cursor;
9117 cursor += src->channel_count * sizeof(*src->channels);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309118 qdf_mem_copy(dst->channels, src->channels,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009119 src->channel_count * sizeof(*src->channels));
9120 dst->schedule = cursor;
9121 cursor += src->schedule_size * sizeof(*src->schedule);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309122 qdf_mem_copy(dst->schedule, src->schedule,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009123 src->schedule_size * sizeof(*src->schedule));
9124 dst->dcc_ndl_chan_list = cursor;
9125 cursor += src->dcc_ndl_chan_list_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309126 qdf_mem_copy(dst->dcc_ndl_chan_list, src->dcc_ndl_chan_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009127 src->dcc_ndl_chan_list_len);
9128 dst->dcc_ndl_active_state_list = cursor;
9129 cursor += src->dcc_ndl_active_state_list_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309130 qdf_mem_copy(dst->dcc_ndl_active_state_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009131 src->dcc_ndl_active_state_list,
9132 src->dcc_ndl_active_state_list_len);
9133 return dst;
9134}
9135
9136/**
9137 * sme_ocb_set_config() - Set the OCB configuration
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009138 * @mac_handle: reference to the HAL
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009139 * @context: the context of the call
9140 * @callback: the callback to hdd
9141 * @config: the OCB configuration
9142 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309143 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009144 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009145QDF_STATUS sme_ocb_set_config(mac_handle_t mac_handle, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009146 ocb_callback callback,
9147 struct sir_ocb_config *config)
9148{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309149 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009150 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009151 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009152 struct sir_ocb_config *msg_body;
9153
9154 /* Lock the SME structure */
9155 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309156 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009157 return status;
9158
9159 /*
9160 * Check if there is a pending request and return an error if one
9161 * exists
9162 */
9163 if (pMac->sme.ocb_set_config_callback) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309164 status = QDF_STATUS_E_BUSY;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009165 goto end;
9166 }
9167
9168 msg_body = sme_copy_sir_ocb_config(config);
9169
9170 if (!msg_body) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309171 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009172 goto end;
9173 }
9174
9175 msg.type = WMA_OCB_SET_CONFIG_CMD;
9176 msg.bodyptr = msg_body;
9177
9178 /* Set the request callback and context */
9179 pMac->sme.ocb_set_config_callback = callback;
9180 pMac->sme.ocb_set_config_context = context;
9181
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309182 status = scheduler_post_message(QDF_MODULE_ID_SME,
9183 QDF_MODULE_ID_WMA,
9184 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309185 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309186 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009187 FL("Error posting message to WDA: %d"), status);
9188 pMac->sme.ocb_set_config_callback = callback;
9189 pMac->sme.ocb_set_config_context = context;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309190 qdf_mem_free(msg_body);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009191 goto end;
9192 }
9193
9194end:
9195 sme_release_global_lock(&pMac->sme);
9196
9197 return status;
9198}
9199
9200/**
9201 * sme_ocb_set_utc_time() - Set the OCB UTC time
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009202 * @mac_handle: reference to the HAL
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009203 * @utc: the UTC time struct
9204 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309205 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009206 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009207QDF_STATUS sme_ocb_set_utc_time(mac_handle_t mac_handle,
9208 struct sir_ocb_utc *utc)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009209{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309210 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009211 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009212 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009213 struct sir_ocb_utc *sme_utc;
9214
9215 /* Lock the SME structure */
9216 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309217 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009218 return status;
9219
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309220 sme_utc = qdf_mem_malloc(sizeof(*sme_utc));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009221 if (!sme_utc) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309222 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009223 goto end;
9224 }
9225 *sme_utc = *utc;
9226
9227 msg.type = WMA_OCB_SET_UTC_TIME_CMD;
9228 msg.reserved = 0;
9229 msg.bodyptr = sme_utc;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309230 status = scheduler_post_message(QDF_MODULE_ID_SME,
9231 QDF_MODULE_ID_WMA,
9232 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309233 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309234 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009235 FL("Not able to post message to WDA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309236 qdf_mem_free(utc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009237 goto end;
9238 }
9239
9240end:
9241 sme_release_global_lock(&pMac->sme);
9242
9243 return status;
9244}
9245
9246/**
9247 * sme_ocb_start_timing_advert() - Start sending timing advert frames
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009248 * @mac_handle: reference to the HAL
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009249 * @timing_advert: the timing advertisement struct
9250 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309251 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009252 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009253QDF_STATUS sme_ocb_start_timing_advert(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009254 struct sir_ocb_timing_advert *timing_advert)
9255{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309256 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009257 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009258 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009259 void *buf;
9260 struct sir_ocb_timing_advert *sme_timing_advert;
9261
9262 /* Lock the SME structure */
9263 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309264 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009265 return status;
9266
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309267 buf = qdf_mem_malloc(sizeof(*sme_timing_advert) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009268 timing_advert->template_length);
9269 if (!buf) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309270 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009271 goto end;
9272 }
9273
9274 sme_timing_advert = (struct sir_ocb_timing_advert *)buf;
9275 *sme_timing_advert = *timing_advert;
9276 sme_timing_advert->template_value = buf + sizeof(*sme_timing_advert);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309277 qdf_mem_copy(sme_timing_advert->template_value,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009278 timing_advert->template_value, timing_advert->template_length);
9279
9280 msg.type = WMA_OCB_START_TIMING_ADVERT_CMD;
9281 msg.reserved = 0;
9282 msg.bodyptr = buf;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309283 status = scheduler_post_message(QDF_MODULE_ID_SME,
9284 QDF_MODULE_ID_WMA,
9285 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309286 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309287 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009288 FL("Not able to post msg to WDA"));
9289 goto end;
9290 }
9291
9292end:
9293 sme_release_global_lock(&pMac->sme);
9294
9295 return status;
9296}
9297
9298/**
9299 * sme_ocb_stop_timing_advert() - Stop sending timing advert frames on a channel
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009300 * @mac_handle: reference to the HAL
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009301 * @timing_advert: the timing advertisement struct
9302 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309303 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009304 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009305QDF_STATUS sme_ocb_stop_timing_advert(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009306 struct sir_ocb_timing_advert *timing_advert)
9307{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309308 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009309 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009310 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009311 struct sir_ocb_timing_advert *sme_timing_advert;
9312
9313 /* Lock the SME structure */
9314 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309315 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009316 return status;
9317
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309318 sme_timing_advert = qdf_mem_malloc(sizeof(*timing_advert));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009319 if (!sme_timing_advert) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309320 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009321 goto end;
9322 }
9323 *sme_timing_advert = *timing_advert;
9324
9325 msg.type = WMA_OCB_STOP_TIMING_ADVERT_CMD;
9326 msg.reserved = 0;
9327 msg.bodyptr = sme_timing_advert;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309328 status = scheduler_post_message(QDF_MODULE_ID_SME,
9329 QDF_MODULE_ID_WMA,
9330 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309331 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309332 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009333 FL("Not able to post msg to WDA"));
9334 goto end;
9335 }
9336
9337end:
9338 sme_release_global_lock(&pMac->sme);
9339
9340 return status;
9341}
9342
9343/**
Naveen Rawatb4d37622015-11-13 16:15:25 -08009344 * sme_ocb_gen_timing_advert_frame() - generate TA frame and populate the buffer
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009345 * @mac_handle: reference to the HAL
Naveen Rawatb4d37622015-11-13 16:15:25 -08009346 * @self_addr: the self MAC address
9347 * @buf: the buffer that will contain the frame
9348 * @timestamp_offset: return for the offset of the timestamp field
9349 * @time_value_offset: return for the time_value field in the TA IE
9350 *
9351 * Return: the length of the buffer.
9352 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009353int sme_ocb_gen_timing_advert_frame(mac_handle_t mac_handle,
Naveen Rawatb4d37622015-11-13 16:15:25 -08009354 tSirMacAddr self_addr, uint8_t **buf,
9355 uint32_t *timestamp_offset,
9356 uint32_t *time_value_offset)
9357{
9358 int template_length;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009359 tpAniSirGlobal mac_ctx = PMAC_STRUCT(mac_handle);
Naveen Rawatb4d37622015-11-13 16:15:25 -08009360
9361 template_length = sch_gen_timing_advert_frame(mac_ctx, self_addr, buf,
9362 timestamp_offset,
9363 time_value_offset);
9364 return template_length;
9365}
9366/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009367 * sme_ocb_get_tsf_timer() - Get the TSF timer value
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009368 * @mac_handle: reference to the HAL
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009369 * @context: the context of the call
9370 * @callback: the callback to hdd
9371 * @request: the TSF timer request
9372 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309373 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009374 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009375QDF_STATUS sme_ocb_get_tsf_timer(mac_handle_t mac_handle, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009376 ocb_callback callback,
9377 struct sir_ocb_get_tsf_timer *request)
9378{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309379 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009380 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009381 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009382 struct sir_ocb_get_tsf_timer *msg_body;
9383
9384 /* Lock the SME structure */
9385 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309386 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009387 return status;
9388
9389 /* Allocate memory for the WMI request, and copy the parameter */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309390 msg_body = qdf_mem_malloc(sizeof(*msg_body));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009391 if (!msg_body) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309392 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009393 goto end;
9394 }
9395 *msg_body = *request;
9396
9397 msg.type = WMA_OCB_GET_TSF_TIMER_CMD;
9398 msg.bodyptr = msg_body;
9399
9400 /* Set the request callback and the context */
9401 pMac->sme.ocb_get_tsf_timer_callback = callback;
9402 pMac->sme.ocb_get_tsf_timer_context = context;
9403
9404 /* Post the message to WDA */
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309405 status = scheduler_post_message(QDF_MODULE_ID_SME,
9406 QDF_MODULE_ID_WMA,
9407 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309408 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309409 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009410 FL("Error posting message to WDA: %d"), status);
9411 pMac->sme.ocb_get_tsf_timer_callback = NULL;
9412 pMac->sme.ocb_get_tsf_timer_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309413 qdf_mem_free(msg_body);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009414 goto end;
9415 }
9416
9417end:
9418 sme_release_global_lock(&pMac->sme);
9419
9420 return status;
9421}
9422
9423/**
9424 * sme_dcc_get_stats() - Get the DCC stats
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009425 * @mac_handle: reference to the HAL
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009426 * @context: the context of the call
9427 * @callback: the callback to hdd
9428 * @request: the get DCC stats request
9429 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309430 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009431 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009432QDF_STATUS sme_dcc_get_stats(mac_handle_t mac_handle, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009433 ocb_callback callback,
9434 struct sir_dcc_get_stats *request)
9435{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309436 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009437 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009438 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009439 struct sir_dcc_get_stats *msg_body;
9440
9441 /* Lock the SME structure */
9442 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309443 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009444 return status;
9445
9446 /* Allocate memory for the WMI request, and copy the parameter */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309447 msg_body = qdf_mem_malloc(sizeof(*msg_body) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009448 request->request_array_len);
9449 if (!msg_body) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309450 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009451 goto end;
9452 }
9453 *msg_body = *request;
9454 msg_body->request_array = (void *)msg_body + sizeof(*msg_body);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309455 qdf_mem_copy(msg_body->request_array, request->request_array,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009456 request->request_array_len);
9457
9458 msg.type = WMA_DCC_GET_STATS_CMD;
9459 msg.bodyptr = msg_body;
9460
9461 /* Set the request callback and context */
9462 pMac->sme.dcc_get_stats_callback = callback;
9463 pMac->sme.dcc_get_stats_context = context;
9464
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309465 status = scheduler_post_message(QDF_MODULE_ID_SME,
9466 QDF_MODULE_ID_WMA,
9467 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309468 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309469 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009470 FL("Error posting message to WDA: %d"), status);
9471 pMac->sme.dcc_get_stats_callback = callback;
9472 pMac->sme.dcc_get_stats_context = context;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309473 qdf_mem_free(msg_body);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009474 goto end;
9475 }
9476
9477end:
9478 sme_release_global_lock(&pMac->sme);
9479
9480 return status;
9481}
9482
9483/**
9484 * sme_dcc_clear_stats() - Clear the DCC stats
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009485 * @mac_handle: reference to the HAL
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009486 * @vdev_id: vdev id for OCB interface
9487 * @dcc_stats_bitmap: the entries in the stats to clear
9488 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309489 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009490 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009491QDF_STATUS sme_dcc_clear_stats(mac_handle_t mac_handle, uint32_t vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009492 uint32_t dcc_stats_bitmap)
9493{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309494 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009495 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009496 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009497 struct sir_dcc_clear_stats *request;
9498
9499 /* Lock the SME structure */
9500 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309501 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009502 return status;
9503
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309504 request = qdf_mem_malloc(sizeof(struct sir_dcc_clear_stats));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009505 if (!request) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309506 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009507 goto end;
9508 }
9509
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009510 request->vdev_id = vdev_id;
9511 request->dcc_stats_bitmap = dcc_stats_bitmap;
9512
9513 msg.type = WMA_DCC_CLEAR_STATS_CMD;
9514 msg.bodyptr = request;
9515
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309516 status = scheduler_post_message(QDF_MODULE_ID_SME,
9517 QDF_MODULE_ID_WMA,
9518 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309519 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309520 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009521 FL("Not able to post msg to WDA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309522 qdf_mem_free(request);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009523 goto end;
9524 }
9525
9526end:
9527 sme_release_global_lock(&pMac->sme);
9528
9529 return status;
9530}
9531
9532/**
9533 * sme_dcc_update_ndl() - Update the DCC settings
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009534 * @mac_handle: reference to the HAL
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009535 * @context: the context of the call
9536 * @callback: the callback to hdd
9537 * @request: the update DCC request
9538 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309539 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009540 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009541QDF_STATUS sme_dcc_update_ndl(mac_handle_t mac_handle, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009542 ocb_callback callback,
9543 struct sir_dcc_update_ndl *request)
9544{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309545 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009546 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009547 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009548 struct sir_dcc_update_ndl *msg_body;
9549
9550 /* Lock the SME structure */
9551 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309552 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009553 return status;
9554
9555 /* Allocate memory for the WMI request, and copy the parameter */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309556 msg_body = qdf_mem_malloc(sizeof(*msg_body) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009557 request->dcc_ndl_chan_list_len +
9558 request->dcc_ndl_active_state_list_len);
9559 if (!msg_body) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309560 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009561 goto end;
9562 }
9563
9564 *msg_body = *request;
9565
9566 msg_body->dcc_ndl_chan_list = (void *)msg_body + sizeof(*msg_body);
9567 msg_body->dcc_ndl_active_state_list = msg_body->dcc_ndl_chan_list +
9568 request->dcc_ndl_chan_list_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309569 qdf_mem_copy(msg_body->dcc_ndl_chan_list, request->dcc_ndl_chan_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009570 request->dcc_ndl_active_state_list_len);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309571 qdf_mem_copy(msg_body->dcc_ndl_active_state_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009572 request->dcc_ndl_active_state_list,
9573 request->dcc_ndl_active_state_list_len);
9574
9575 msg.type = WMA_DCC_UPDATE_NDL_CMD;
9576 msg.bodyptr = msg_body;
9577
9578 /* Set the request callback and the context */
9579 pMac->sme.dcc_update_ndl_callback = callback;
9580 pMac->sme.dcc_update_ndl_context = context;
9581
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309582 status = scheduler_post_message(QDF_MODULE_ID_SME,
9583 QDF_MODULE_ID_WMA,
9584 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309585 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309586 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009587 FL("Error posting message to WDA: %d"), status);
9588 pMac->sme.dcc_update_ndl_callback = NULL;
9589 pMac->sme.dcc_update_ndl_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309590 qdf_mem_free(msg_body);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009591 goto end;
9592 }
9593
9594end:
9595 sme_release_global_lock(&pMac->sme);
9596
9597 return status;
9598}
9599
9600/**
9601 * sme_register_for_dcc_stats_event() - Register for the periodic DCC stats
9602 * event
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009603 * @mac_handle: reference to the HAL
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009604 * @context: the context of the call
9605 * @callback: the callback to hdd
9606 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309607 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009608 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009609QDF_STATUS sme_register_for_dcc_stats_event(mac_handle_t mac_handle,
9610 void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009611 ocb_callback callback)
9612{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009613 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309614 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009615
9616 status = sme_acquire_global_lock(&pMac->sme);
9617 pMac->sme.dcc_stats_event_callback = callback;
9618 pMac->sme.dcc_stats_event_context = context;
9619 sme_release_global_lock(&pMac->sme);
9620
9621 return 0;
9622}
9623
Arun Khandavalli4b55da72016-07-19 19:55:01 +05309624/**
9625 * sme_deregister_for_dcc_stats_event() - De-Register for the periodic DCC stats
9626 * event
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009627 * @mac_handle: Hal Handle
Arun Khandavalli4b55da72016-07-19 19:55:01 +05309628 *
9629 * This function de-registers the DCC perioc stats callback
9630 *
9631 * Return: QDF_STATUS Enumeration
9632 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009633QDF_STATUS sme_deregister_for_dcc_stats_event(mac_handle_t mac_handle)
Arun Khandavalli4b55da72016-07-19 19:55:01 +05309634{
9635 tpAniSirGlobal mac;
9636 QDF_STATUS status;
9637
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009638 if (!mac_handle) {
Arun Khandavalli4b55da72016-07-19 19:55:01 +05309639 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009640 FL("mac_handle is not valid"));
Arun Khandavalli4b55da72016-07-19 19:55:01 +05309641 return QDF_STATUS_E_INVAL;
9642 }
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009643 mac = PMAC_STRUCT(mac_handle);
Arun Khandavalli4b55da72016-07-19 19:55:01 +05309644
9645 status = sme_acquire_global_lock(&mac->sme);
9646 if (!QDF_IS_STATUS_SUCCESS(status)) {
9647 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9648 FL("Failed to acquire global lock"));
9649 return status;
9650 }
9651 mac->sme.dcc_stats_event_callback = NULL;
9652 mac->sme.dcc_stats_event_context = NULL;
9653 sme_release_global_lock(&mac->sme);
9654
9655 return status;
9656}
Kiran Kumar Lokere1a43bcf2018-05-15 15:51:58 -07009657#else
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08009658void sme_set_etsi13_srd_ch_in_master_mode(mac_handle_t hal,
Kiran Kumar Lokere1a43bcf2018-05-15 15:51:58 -07009659 bool etsi13_srd_chan_support)
9660{
9661 tpAniSirGlobal mac;
9662
9663 mac = PMAC_STRUCT(hal);
9664 mac->sap.enable_etsi13_srd_chan_support = etsi13_srd_chan_support;
9665 sme_debug("srd_ch_support %d", mac->sap.enable_etsi13_srd_chan_support);
9666}
Agrawal Ashishb141b092016-09-02 19:59:26 +05309667#endif
Arun Khandavalli4b55da72016-07-19 19:55:01 +05309668
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009669void sme_get_recovery_stats(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009670{
9671 uint8_t i;
9672
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309673 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009674 "Self Recovery Stats");
9675 for (i = 0; i < MAX_ACTIVE_CMD_STATS; i++) {
9676 if (eSmeNoCommand !=
9677 g_self_recovery_stats.activeCmdStats[i].command) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309678 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009679 "timestamp %llu: command 0x%0X: reason %d: session %d",
9680 g_self_recovery_stats.activeCmdStats[i].
9681 timestamp,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309682 g_self_recovery_stats.activeCmdStats[i].command,
9683 g_self_recovery_stats.activeCmdStats[i].reason,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009684 g_self_recovery_stats.activeCmdStats[i].
9685 sessionId);
9686 }
9687 }
9688}
9689
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009690QDF_STATUS sme_notify_modem_power_state(mac_handle_t mac_handle, uint32_t value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009691{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009692 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009693 tpSirModemPowerStateInd request_buf;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009694 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009695
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309696 if (NULL == pMac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309697 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009698
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309699 request_buf = qdf_mem_malloc(sizeof(tSirModemPowerStateInd));
Arif Hussain0ef77082018-10-10 16:42:53 -07009700 if (!request_buf)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309701 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009702
9703 request_buf->param = value;
9704
9705 msg.type = WMA_MODEM_POWER_STATE_IND;
9706 msg.reserved = 0;
9707 msg.bodyptr = request_buf;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309708 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309709 (scheduler_post_message(QDF_MODULE_ID_SME,
9710 QDF_MODULE_ID_WMA,
9711 QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309712 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309713 "%s: Not able to post WMA_MODEM_POWER_STATE_IND message to WMA",
9714 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309715 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309716 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009717 }
9718
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309719 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009720}
9721
9722#ifdef QCA_HT_2040_COEX
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009723QDF_STATUS sme_notify_ht2040_mode(mac_handle_t mac_handle, uint16_t staId,
Anurag Chouhan6d760662016-02-20 16:05:43 +05309724 struct qdf_mac_addr macAddrSTA,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009725 uint8_t sessionId,
9726 uint8_t channel_type)
9727{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009728 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009729 tUpdateVHTOpMode *pHtOpMode = NULL;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009730 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009731
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309732 if (NULL == pMac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309733 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009734
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309735 pHtOpMode = qdf_mem_malloc(sizeof(tUpdateVHTOpMode));
Arif Hussain0ef77082018-10-10 16:42:53 -07009736 if (!pHtOpMode)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309737 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009738
9739 switch (channel_type) {
9740 case eHT_CHAN_HT20:
9741 pHtOpMode->opMode = eHT_CHANNEL_WIDTH_20MHZ;
9742 break;
9743
9744 case eHT_CHAN_HT40MINUS:
9745 case eHT_CHAN_HT40PLUS:
9746 pHtOpMode->opMode = eHT_CHANNEL_WIDTH_40MHZ;
9747 break;
9748
9749 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309750 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009751 "%s: Invalid OP mode", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309752 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009753 }
9754
9755 pHtOpMode->staId = staId,
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309756 qdf_mem_copy(pHtOpMode->peer_mac, macAddrSTA.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009757 sizeof(tSirMacAddr));
9758 pHtOpMode->smesessionId = sessionId;
9759
9760 msg.type = WMA_UPDATE_OP_MODE;
9761 msg.reserved = 0;
9762 msg.bodyptr = pHtOpMode;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309763 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309764 (scheduler_post_message(QDF_MODULE_ID_SME,
9765 QDF_MODULE_ID_WMA,
9766 QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309767 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309768 "%s: Not able to post WMA_UPDATE_OP_MODE message to WMA",
9769 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309770 qdf_mem_free(pHtOpMode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309771 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009772 }
9773
Abhishek Singhe4a1f882017-08-10 17:59:44 +05309774 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Jeff Johnson698eacd2018-05-12 17:00:03 -07009775 "%s: Notified FW about OP mode: %d for staId=%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009776 __func__, pHtOpMode->opMode, staId);
9777
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309778 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009779}
9780
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309781/*
9782 * sme_set_ht2040_mode() -
9783 * To update HT Operation beacon IE.
9784 *
9785 * Return QDF_STATUS SUCCESS
9786 * FAILURE or RESOURCES
9787 * The API finished and failed.
9788 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009789QDF_STATUS sme_set_ht2040_mode(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009790 uint8_t channel_type, bool obssEnabled)
9791{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309792 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009793 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009794 ePhyChanBondState cbMode;
Abhishek Singh9d5f4582017-10-11 17:59:48 +05309795 struct csr_roam_session *session = CSR_GET_SESSION(pMac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009796
Abhishek Singh9d5f4582017-10-11 17:59:48 +05309797 if (!CSR_IS_SESSION_VALID(pMac, sessionId)) {
9798 sme_err("Session not valid for session id %d", sessionId);
9799 return QDF_STATUS_E_INVAL;
9800 }
9801 session = CSR_GET_SESSION(pMac, sessionId);
9802 sme_debug("Update HT operation beacon IE, channel_type=%d cur cbmode %d",
9803 channel_type, session->bssParams.cbMode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009804
9805 switch (channel_type) {
9806 case eHT_CHAN_HT20:
Abhishek Singh9d5f4582017-10-11 17:59:48 +05309807 if (!session->bssParams.cbMode)
9808 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009809 cbMode = PHY_SINGLE_CHANNEL_CENTERED;
9810 break;
9811 case eHT_CHAN_HT40MINUS:
Abhishek Singh9d5f4582017-10-11 17:59:48 +05309812 if (session->bssParams.cbMode)
9813 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009814 cbMode = PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
9815 break;
9816 case eHT_CHAN_HT40PLUS:
Abhishek Singh9d5f4582017-10-11 17:59:48 +05309817 if (session->bssParams.cbMode)
9818 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009819 cbMode = PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
9820 break;
9821 default:
Abhishek Singh9d5f4582017-10-11 17:59:48 +05309822 sme_err("Error!!! Invalid HT20/40 mode !");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309823 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009824 }
Abhishek Singh9d5f4582017-10-11 17:59:48 +05309825 session->bssParams.cbMode = cbMode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009826 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309827 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009828 status = csr_set_ht2040_mode(pMac, sessionId,
9829 cbMode, obssEnabled);
9830 sme_release_global_lock(&pMac->sme);
9831 }
9832 return status;
9833}
9834
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009835#endif
9836
9837/*
9838 * SME API to enable/disable idle mode powersave
9839 * This should be called only if powersave offload
9840 * is enabled
9841 */
Arunk Khandavalli847969d2017-09-25 15:15:36 +05309842QDF_STATUS sme_set_idle_powersave_config(bool value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009843{
Anurag Chouhan6d760662016-02-20 16:05:43 +05309844 void *wmaContext = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009845
9846 if (NULL == wmaContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309847 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009848 "%s: wmaContext is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309849 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009850 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309851 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009852 " Idle Ps Set Value %d", value);
9853
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309854 if (QDF_STATUS_SUCCESS != wma_set_idle_ps_config(wmaContext, value)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309855 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009856 " Failed to Set Idle Ps Value %d", value);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309857 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009858 }
Arunk Khandavalli847969d2017-09-25 15:15:36 +05309859
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309860 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009861}
9862
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009863int16_t sme_get_ht_config(mac_handle_t mac_handle, uint8_t session_id,
9864 uint16_t ht_capab)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009865{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009866 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05309867 struct csr_roam_session *pSession = CSR_GET_SESSION(pMac, session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009868
9869 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309870 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009871 "%s: pSession is NULL", __func__);
9872 return -EIO;
9873 }
9874 switch (ht_capab) {
9875 case WNI_CFG_HT_CAP_INFO_ADVANCE_CODING:
9876 return pSession->htConfig.ht_rx_ldpc;
9877 case WNI_CFG_HT_CAP_INFO_TX_STBC:
9878 return pSession->htConfig.ht_tx_stbc;
9879 case WNI_CFG_HT_CAP_INFO_RX_STBC:
9880 return pSession->htConfig.ht_rx_stbc;
9881 case WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ:
Sandeep Puligilla607f34a2016-05-25 14:37:47 -07009882 return pSession->htConfig.ht_sgi20;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009883 case WNI_CFG_HT_CAP_INFO_SHORT_GI_40MHZ:
Sandeep Puligilla607f34a2016-05-25 14:37:47 -07009884 return pSession->htConfig.ht_sgi40;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009885 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309886 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009887 "invalid ht capability");
9888 return -EIO;
9889 }
9890}
9891
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009892int sme_update_ht_config(mac_handle_t mac_handle, uint8_t sessionId,
9893 uint16_t htCapab, int value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009894{
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009895 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05309896 struct csr_roam_session *pSession = CSR_GET_SESSION(pMac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009897
9898 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309899 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009900 "%s: pSession is NULL", __func__);
9901 return -EIO;
9902 }
9903
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309904 if (QDF_STATUS_SUCCESS != wma_set_htconfig(sessionId, htCapab, value)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309905 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009906 "Failed to set ht capability in target");
9907 return -EIO;
9908 }
9909
9910 switch (htCapab) {
9911 case WNI_CFG_HT_CAP_INFO_ADVANCE_CODING:
9912 pSession->htConfig.ht_rx_ldpc = value;
Kiran Kumar Lokeree43a4582018-05-08 19:54:03 -07009913 pMac->roam.configParam.rx_ldpc_enable = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009914 break;
9915 case WNI_CFG_HT_CAP_INFO_TX_STBC:
9916 pSession->htConfig.ht_tx_stbc = value;
9917 break;
9918 case WNI_CFG_HT_CAP_INFO_RX_STBC:
9919 pSession->htConfig.ht_rx_stbc = value;
9920 break;
9921 case WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ:
Krishna Kumaar Natarajana5c5aad2016-12-05 14:12:13 -08009922 value = value ? 1 : 0; /* HT SGI can be only 1 or 0 */
Sandeep Puligilla607f34a2016-05-25 14:37:47 -07009923 pSession->htConfig.ht_sgi20 = value;
9924 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009925 case WNI_CFG_HT_CAP_INFO_SHORT_GI_40MHZ:
Krishna Kumaar Natarajana5c5aad2016-12-05 14:12:13 -08009926 value = value ? 1 : 0; /* HT SGI can be only 1 or 0 */
Sandeep Puligilla607f34a2016-05-25 14:37:47 -07009927 pSession->htConfig.ht_sgi40 = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009928 break;
9929 }
9930
Naveen Rawat8029a402017-06-01 10:54:19 -07009931 csr_roam_update_config(pMac, sessionId, htCapab, value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009932 return 0;
9933}
9934
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08009935int sme_set_addba_accept(mac_handle_t hal, uint8_t session_id, int value)
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08009936{
9937 struct sme_addba_accept *addba_accept;
9938 struct scheduler_msg msg = {0};
9939 QDF_STATUS status;
9940
9941 addba_accept = qdf_mem_malloc(sizeof(*addba_accept));
Arif Hussain0ef77082018-10-10 16:42:53 -07009942 if (!addba_accept)
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08009943 return -EIO;
Arif Hussain0ef77082018-10-10 16:42:53 -07009944
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08009945 addba_accept->session_id = session_id;
9946 addba_accept->addba_accept = value;
9947 qdf_mem_zero(&msg, sizeof(msg));
9948 msg.type = eWNI_SME_SET_ADDBA_ACCEPT;
9949 msg.reserved = 0;
9950 msg.bodyptr = addba_accept;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309951 status = scheduler_post_message(QDF_MODULE_ID_SME,
9952 QDF_MODULE_ID_PE,
9953 QDF_MODULE_ID_PE, &msg);
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08009954 if (status != QDF_STATUS_SUCCESS) {
9955 sme_err("Not able to post addba reject");
9956 qdf_mem_free(addba_accept);
9957 return -EIO;
9958 }
9959 return 0;
9960}
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08009961
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08009962int sme_set_ba_buff_size(mac_handle_t hal, uint8_t session_id,
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08009963 uint16_t buff_size)
9964{
9965 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
9966 if (!buff_size) {
9967 sme_err("invalid buff size %d", buff_size);
9968 return -EINVAL;
9969 }
9970 mac_ctx->usr_cfg_ba_buff_size = buff_size;
9971 sme_debug("addba buff size is set to %d",
9972 mac_ctx->usr_cfg_ba_buff_size);
9973
9974 return 0;
9975}
9976
9977#define DEFAULT_BA_BUFF_SIZE 64
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08009978int sme_send_addba_req(mac_handle_t hal, uint8_t session_id, uint8_t tid,
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08009979 uint16_t buff_size)
9980{
9981 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
9982 uint16_t ba_buff = 0;
9983 QDF_STATUS status;
9984 struct scheduler_msg msg = {0};
9985 struct send_add_ba_req *send_ba_req;
9986 struct csr_roam_session *csr_session = NULL;
9987
9988 if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) {
9989 sme_err("STA not infra/connected state session_id: %d",
9990 session_id);
9991 return -EINVAL;
9992 }
9993 csr_session = CSR_GET_SESSION(mac_ctx, session_id);
9994 if (!csr_session) {
9995 sme_err("CSR session is NULL");
9996 return -EINVAL;
9997 }
9998 send_ba_req = qdf_mem_malloc(sizeof(*send_ba_req));
Arif Hussain0ef77082018-10-10 16:42:53 -07009999 if (!send_ba_req)
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -080010000 return -EIO;
Arif Hussain0ef77082018-10-10 16:42:53 -070010001
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -080010002 qdf_mem_copy(send_ba_req->mac_addr,
10003 csr_session->connectedProfile.bssid.bytes,
10004 QDF_MAC_ADDR_SIZE);
10005 ba_buff = buff_size;
10006 if (!buff_size) {
10007 if (mac_ctx->usr_cfg_ba_buff_size)
10008 ba_buff = mac_ctx->usr_cfg_ba_buff_size;
10009 else
10010 ba_buff = DEFAULT_BA_BUFF_SIZE;
10011 }
10012 send_ba_req->param.vdev_id = session_id;
10013 send_ba_req->param.tidno = tid;
10014 send_ba_req->param.buffersize = ba_buff;
10015 msg.type = WMA_SEND_ADDBA_REQ;
10016 msg.bodyptr = send_ba_req;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010017 status = scheduler_post_message(QDF_MODULE_ID_SME,
10018 QDF_MODULE_ID_WMA,
10019 QDF_MODULE_ID_WMA, &msg);
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -080010020 if (QDF_STATUS_SUCCESS != status) {
10021 sme_err("Failed to post WMA_SEND_ADDBA_REQ");
10022 qdf_mem_free(send_ba_req);
10023 return -EIO;
10024 }
10025 sme_debug("ADDBA_REQ sent to FW: tid %d buff_size %d", tid, ba_buff);
10026
10027 return 0;
10028}
10029
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080010030int sme_set_no_ack_policy(mac_handle_t hal, uint8_t session_id,
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -080010031 uint8_t val, uint8_t ac)
10032{
10033 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
10034 uint8_t i, set_val;
Arif Hussaineb8ba362018-03-07 19:15:13 -080010035 struct scheduler_msg msg = {0};
10036 QDF_STATUS status;
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -080010037
10038 if (ac > MAX_NUM_AC) {
10039 sme_err("invalid ac val %d", ac);
10040 return -EINVAL;
10041 }
10042 if (val)
10043 set_val = 1;
10044 else
10045 set_val = 0;
10046 if (ac == MAX_NUM_AC) {
10047 for (i = 0; i < ac; i++)
10048 mac_ctx->no_ack_policy_cfg[i] = set_val;
10049 } else {
10050 mac_ctx->no_ack_policy_cfg[ac] = set_val;
10051 }
10052 sme_debug("no ack is set to %d for ac %d", set_val, ac);
Arif Hussaineb8ba362018-03-07 19:15:13 -080010053 qdf_mem_zero(&msg, sizeof(msg));
10054 msg.type = eWNI_SME_UPDATE_EDCA_PROFILE;
10055 msg.reserved = 0;
10056 msg.bodyval = session_id;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010057 status = scheduler_post_message(QDF_MODULE_ID_SME,
10058 QDF_MODULE_ID_PE,
10059 QDF_MODULE_ID_PE, &msg);
Arif Hussaineb8ba362018-03-07 19:15:13 -080010060 if (status != QDF_STATUS_SUCCESS) {
10061 sme_err("Not able to post update edca profile");
10062 return -EIO;
10063 }
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -080010064
10065 return 0;
10066}
10067
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080010068int sme_set_auto_rate_he_ltf(mac_handle_t hal, uint8_t session_id,
Kiran Kumar Lokerea006a302018-03-07 20:58:13 -080010069 uint8_t cfg_val)
10070{
10071 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
10072 uint32_t set_val;
10073 uint32_t bit_mask = 0;
10074 int status;
10075
10076 if (cfg_val > QCA_WLAN_HE_LTF_4X) {
10077 sme_err("invalid HE LTF cfg %d", cfg_val);
10078 return -EINVAL;
10079 }
10080
10081 /*set the corresponding HE LTF cfg BIT*/
10082 if (cfg_val == QCA_WLAN_HE_LTF_AUTO)
10083 bit_mask = HE_LTF_ALL;
10084 else
10085 bit_mask = (1 << (cfg_val - 1));
10086
10087 set_val = mac_ctx->he_sgi_ltf_cfg_bit_mask;
10088
10089 SET_AUTO_RATE_HE_LTF_VAL(set_val, bit_mask);
10090
10091 mac_ctx->he_sgi_ltf_cfg_bit_mask = set_val;
10092 status = wma_cli_set_command(session_id,
10093 WMI_VDEV_PARAM_AUTORATE_MISC_CFG,
10094 set_val, VDEV_CMD);
10095 if (status) {
10096 sme_err("failed to set he_ltf_sgi");
10097 return status;
10098 }
10099
10100 sme_debug("HE SGI_LTF is set to 0x%08X",
10101 mac_ctx->he_sgi_ltf_cfg_bit_mask);
10102
10103 return 0;
10104}
10105
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080010106int sme_set_auto_rate_he_sgi(mac_handle_t hal, uint8_t session_id,
Kiran Kumar Lokerea006a302018-03-07 20:58:13 -080010107 uint8_t cfg_val)
10108{
10109 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
10110 uint32_t set_val;
10111 uint32_t sgi_bit_mask = 0;
10112 int status;
10113
10114 if ((cfg_val > AUTO_RATE_GI_3200NS) ||
10115 (cfg_val < AUTO_RATE_GI_400NS)) {
10116 sme_err("invalid auto rate GI cfg %d", cfg_val);
10117 return -EINVAL;
10118 }
10119
10120 sgi_bit_mask = (1 << cfg_val);
10121
10122 set_val = mac_ctx->he_sgi_ltf_cfg_bit_mask;
10123 SET_AUTO_RATE_SGI_VAL(set_val, sgi_bit_mask);
10124
10125 mac_ctx->he_sgi_ltf_cfg_bit_mask = set_val;
10126 status = wma_cli_set_command(session_id,
10127 WMI_VDEV_PARAM_AUTORATE_MISC_CFG,
10128 set_val, VDEV_CMD);
10129 if (status) {
10130 sme_err("failed to set he_ltf_sgi");
10131 return status;
10132 }
10133
10134 sme_debug("auto rate HE SGI_LTF is set to 0x%08X",
10135 mac_ctx->he_sgi_ltf_cfg_bit_mask);
10136
10137 return 0;
10138}
10139
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010140#define HT20_SHORT_GI_MCS7_RATE 722
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010141/*
10142 * sme_send_rate_update_ind() -
10143 * API to Update rate
10144 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010145 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010146 * rateUpdateParams - Pointer to rate update params
10147 * Return QDF_STATUS
10148 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010149QDF_STATUS sme_send_rate_update_ind(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010150 tSirRateUpdateInd *rateUpdateParams)
10151{
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010152 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010153 QDF_STATUS status;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010154 struct scheduler_msg msg = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010155 tSirRateUpdateInd *rate_upd = qdf_mem_malloc(sizeof(tSirRateUpdateInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010156
Arif Hussain0ef77082018-10-10 16:42:53 -070010157 if (!rate_upd)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010158 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -070010159
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010160 *rate_upd = *rateUpdateParams;
10161
10162 if (rate_upd->mcastDataRate24GHz == HT20_SHORT_GI_MCS7_RATE)
10163 rate_upd->mcastDataRate24GHzTxFlag =
Naveen Rawatea1564b2018-05-17 15:56:11 -070010164 TX_RATE_HT20 | TX_RATE_SGI;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010165 else if (rate_upd->reliableMcastDataRate ==
10166 HT20_SHORT_GI_MCS7_RATE)
10167 rate_upd->reliableMcastDataRateTxFlag =
Naveen Rawatea1564b2018-05-17 15:56:11 -070010168 TX_RATE_HT20 | TX_RATE_SGI;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010169
10170 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010171 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010172 msg.type = WMA_RATE_UPDATE_IND;
10173 msg.bodyptr = rate_upd;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053010174 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
10175 NO_SESSION, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010176 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010177 (scheduler_post_message(QDF_MODULE_ID_SME,
10178 QDF_MODULE_ID_WMA,
10179 QDF_MODULE_ID_WMA,
10180 &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010181 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Rachit Kankaneee1735c2018-08-02 13:19:34 +053010182 "%s: Not able to post WMA_RATE_UPDATE_IND to WMA!",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010183 __func__);
10184
10185 sme_release_global_lock(&pMac->sme);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010186 qdf_mem_free(rate_upd);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010187 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010188 }
10189
10190 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010191 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010192 }
10193
10194 return status;
10195}
10196
10197/**
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +053010198 * sme_update_access_policy_vendor_ie() - update vendor ie and access policy.
10199 * @hal: Pointer to the mac context
10200 * @session_id: sme session id
10201 * @vendor_ie: vendor ie
10202 * @access_policy: vendor ie access policy
10203 *
10204 * This function updates the vendor ie and access policy to lim.
10205 *
10206 * Return: success or failure.
10207 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080010208QDF_STATUS sme_update_access_policy_vendor_ie(mac_handle_t hal,
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +053010209 uint8_t session_id, uint8_t *vendor_ie, int access_policy)
10210{
10211 struct sme_update_access_policy_vendor_ie *msg;
10212 uint16_t msg_len;
10213 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +053010214
10215 msg_len = sizeof(*msg);
10216
10217 msg = qdf_mem_malloc(msg_len);
10218 if (!msg) {
Srinivas Girigowda09625b02018-09-10 15:28:09 -070010219 return QDF_STATUS_E_NOMEM;
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +053010220 }
10221
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +053010222 msg->msg_type = (uint16_t)eWNI_SME_UPDATE_ACCESS_POLICY_VENDOR_IE;
10223 msg->length = (uint16_t)msg_len;
10224
10225 qdf_mem_copy(&msg->ie[0], vendor_ie, sizeof(msg->ie));
10226
10227 msg->sme_session_id = session_id;
10228 msg->access_policy = access_policy;
10229
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010230 sme_debug("sme_session_id: %hu, access_policy: %d", session_id,
10231 access_policy);
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +053010232
Rajeev Kumard138ac52017-01-30 18:38:37 -080010233 status = umac_send_mb_message_to_mac(msg);
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +053010234
10235 return status;
10236}
10237
10238/**
Agrawal Ashishda3e9502016-09-21 17:43:51 +053010239 * sme_update_short_retry_limit_threshold() - update short frame retry limit TH
10240 * @hal: Handle returned by mac_open
10241 * @session_id: Session ID on which short frame retry limit needs to be
10242 * updated to FW
10243 * @short_limit_count_th: Retry count TH to retry short frame.
10244 *
10245 * This function is used to configure count to retry short frame.
10246 *
10247 * Return: QDF_STATUS
10248 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010249QDF_STATUS sme_update_short_retry_limit_threshold(mac_handle_t mac_handle,
Agrawal Ashishda3e9502016-09-21 17:43:51 +053010250 struct sme_short_retry_limit *short_retry_limit_th)
10251{
Agrawal Ashishda3e9502016-09-21 17:43:51 +053010252 QDF_STATUS status = QDF_STATUS_SUCCESS;
10253 struct sme_short_retry_limit *srl;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010254 struct scheduler_msg msg = {0};
Agrawal Ashishda3e9502016-09-21 17:43:51 +053010255
10256 srl = qdf_mem_malloc(sizeof(*srl));
Arif Hussain0ef77082018-10-10 16:42:53 -070010257 if (!srl)
Agrawal Ashishda3e9502016-09-21 17:43:51 +053010258 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -070010259
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010260 sme_debug("session_id %d short retry limit count: %d",
Agrawal Ashishda3e9502016-09-21 17:43:51 +053010261 short_retry_limit_th->session_id,
10262 short_retry_limit_th->short_retry_limit);
10263
10264 srl->session_id = short_retry_limit_th->session_id;
10265 srl->short_retry_limit = short_retry_limit_th->short_retry_limit;
10266
10267 qdf_mem_zero(&msg, sizeof(msg));
10268 msg.type = SIR_HAL_SHORT_RETRY_LIMIT_CNT;
10269 msg.reserved = 0;
10270 msg.bodyptr = srl;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010271 status = scheduler_post_message(QDF_MODULE_ID_SME,
10272 QDF_MODULE_ID_WMA,
10273 QDF_MODULE_ID_WMA, &msg);
Agrawal Ashishda3e9502016-09-21 17:43:51 +053010274 if (status != QDF_STATUS_SUCCESS) {
10275 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10276 FL("Not able to post short retry limit count to WDA"));
10277 qdf_mem_free(srl);
10278 return QDF_STATUS_E_FAILURE;
10279 }
10280
10281 return status;
10282}
10283
10284/**
10285 * sme_update_long_retry_limit_threshold() - update long retry limit TH
10286 * @hal: Handle returned by mac_open
10287 * @session_id: Session ID on which long frames retry TH needs to be updated
10288 * to FW
10289 * @long_limit_count_th: Retry count to retry long frame.
10290 *
10291 * This function is used to configure TH to retry long frame.
10292 *
10293 * Return: QDF_STATUS
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010294 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010295QDF_STATUS sme_update_long_retry_limit_threshold(mac_handle_t mac_handle,
Agrawal Ashishda3e9502016-09-21 17:43:51 +053010296 struct sme_long_retry_limit *long_retry_limit_th)
10297{
Agrawal Ashishda3e9502016-09-21 17:43:51 +053010298 QDF_STATUS status = QDF_STATUS_SUCCESS;
10299 struct sme_long_retry_limit *lrl;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010300 struct scheduler_msg msg = {0};
Agrawal Ashishda3e9502016-09-21 17:43:51 +053010301
10302 lrl = qdf_mem_malloc(sizeof(*lrl));
Arif Hussain0ef77082018-10-10 16:42:53 -070010303 if (!lrl)
Agrawal Ashishda3e9502016-09-21 17:43:51 +053010304 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -070010305
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010306 sme_debug("session_id %d long retry limit count: %d",
Agrawal Ashishda3e9502016-09-21 17:43:51 +053010307 long_retry_limit_th->session_id,
10308 long_retry_limit_th->long_retry_limit);
10309
10310 lrl->session_id = long_retry_limit_th->session_id;
10311 lrl->long_retry_limit = long_retry_limit_th->long_retry_limit;
10312
10313 qdf_mem_zero(&msg, sizeof(msg));
10314 msg.type = SIR_HAL_LONG_RETRY_LIMIT_CNT;
10315 msg.reserved = 0;
10316 msg.bodyptr = lrl;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010317 status = scheduler_post_message(QDF_MODULE_ID_SME,
10318 QDF_MODULE_ID_WMA,
10319 QDF_MODULE_ID_WMA, &msg);
Agrawal Ashishda3e9502016-09-21 17:43:51 +053010320
10321 if (status != QDF_STATUS_SUCCESS) {
10322 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10323 FL("Not able to post long retry limit count to WDA"));
10324 qdf_mem_free(lrl);
10325 return QDF_STATUS_E_FAILURE;
10326 }
10327
10328 return status;
10329}
10330
10331/**
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +053010332 * sme_update_sta_inactivity_timeout(): Update sta_inactivity_timeout to FW
10333 * @hal: Handle returned by mac_open
10334 * @session_id: Session ID on which sta_inactivity_timeout needs
10335 * to be updated to FW
10336 * @sta_inactivity_timeout: sta inactivity timeout.
10337 *
10338 * If a station does not send anything in sta_inactivity_timeout seconds, an
10339 * empty data frame is sent to it in order to verify whether it is
10340 * still in range. If this frame is not ACKed, the station will be
10341 * disassociated and then deauthenticated.
10342 *
10343 * Return: QDF_STATUS_SUCCESS or non-zero on failure.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010344 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010345QDF_STATUS sme_update_sta_inactivity_timeout(mac_handle_t mac_handle,
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +053010346 struct sme_sta_inactivity_timeout *sta_inactivity_timer)
10347{
10348 struct sme_sta_inactivity_timeout *inactivity_time;
10349 void *wma_handle;
10350
10351 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
10352 inactivity_time = qdf_mem_malloc(sizeof(*inactivity_time));
Arif Hussain0ef77082018-10-10 16:42:53 -070010353 if (!inactivity_time)
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +053010354 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -070010355
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010356 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +053010357 FL("sta_inactivity_timeout: %d"),
10358 sta_inactivity_timer->sta_inactivity_timeout);
10359 inactivity_time->session_id = sta_inactivity_timer->session_id;
10360 inactivity_time->sta_inactivity_timeout =
10361 sta_inactivity_timer->sta_inactivity_timeout;
10362
10363 wma_update_sta_inactivity_timeout(wma_handle,
10364 inactivity_time);
10365 return QDF_STATUS_SUCCESS;
10366}
10367
10368/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010369 * sme_get_reg_info() - To get registration info
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010370 * @mac_handle: HAL context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010371 * @chanId: channel id
10372 * @regInfo1: first reg info to fill
10373 * @regInfo2: second reg info to fill
10374 *
10375 * This routine will give you reg info
10376 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010377 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010378 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010379QDF_STATUS sme_get_reg_info(mac_handle_t mac_handle, uint8_t chanId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010380 uint32_t *regInfo1, uint32_t *regInfo2)
10381{
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010382 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010383 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010384 uint8_t i;
10385 bool found = false;
10386
10387 status = sme_acquire_global_lock(&pMac->sme);
10388 *regInfo1 = 0;
10389 *regInfo2 = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010390 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010391 return status;
10392
10393 for (i = 0; i < WNI_CFG_VALID_CHANNEL_LIST_LEN; i++) {
Amar Singhala297bfa2015-10-15 15:07:29 -070010394 if (pMac->scan.defaultPowerTable[i].chan_num == chanId) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010395 SME_SET_CHANNEL_REG_POWER(*regInfo1,
Amar Singhal5cccafe2017-02-15 12:42:58 -080010396 pMac->scan.defaultPowerTable[i].tx_power);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010397
10398 SME_SET_CHANNEL_MAX_TX_POWER(*regInfo2,
Amar Singhal5cccafe2017-02-15 12:42:58 -080010399 pMac->scan.defaultPowerTable[i].tx_power);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010400 found = true;
10401 break;
10402 }
10403 }
10404 if (!found)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010405 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010406
10407 sme_release_global_lock(&pMac->sme);
10408 return status;
10409}
10410
10411#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010412/*
10413 * sme_auto_shutdown_cb() -
10414 * Used to plug in callback function for receiving auto shutdown evt
10415 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010416 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010417 * pCallbackfn : callback function pointer should be plugged in
10418 * Return QDF_STATUS
10419 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010420QDF_STATUS sme_set_auto_shutdown_cb(mac_handle_t mac_handle,
10421 void (*pCallbackfn)(void))
10422{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010423 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010424 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010425
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010426 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010427 "%s: Plug in Auto shutdown event callback", __func__);
10428
10429 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010430 if (QDF_STATUS_SUCCESS == status) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010431 if (NULL != pCallbackfn)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010432 pMac->sme.pAutoShutdownNotificationCb = pCallbackfn;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010433 sme_release_global_lock(&pMac->sme);
10434 }
10435
10436 return status;
10437}
10438
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010439/*
10440 * sme_set_auto_shutdown_timer() -
10441 * API to set auto shutdown timer value in FW.
10442 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010443 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010444 * timer_val - The auto shutdown timer value to be set
10445 * Return Configuration message posting status, SUCCESS or Fail
10446 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010447QDF_STATUS sme_set_auto_shutdown_timer(mac_handle_t mac_handle,
10448 uint32_t timer_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010449{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010450 QDF_STATUS status = QDF_STATUS_SUCCESS;
10451 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010452 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010453 tSirAutoShutdownCmdParams *auto_sh_cmd;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010454 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010455
10456 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010457 if (QDF_STATUS_SUCCESS == status) {
Arif Hussain0ef77082018-10-10 16:42:53 -070010458 auto_sh_cmd = qdf_mem_malloc(sizeof(tSirAutoShutdownCmdParams));
10459 if (!auto_sh_cmd) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010460 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010461 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010462 }
10463
10464 auto_sh_cmd->timer_val = timer_val;
10465
10466 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010467 message.bodyptr = auto_sh_cmd;
10468 message.type = WMA_SET_AUTO_SHUTDOWN_TIMER_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010469 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
10470 QDF_MODULE_ID_WMA,
10471 QDF_MODULE_ID_WMA,
10472 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010473 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010474 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010475 "%s: Post Auto shutdown MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010476 qdf_mem_free(auto_sh_cmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010477 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010478 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010479 }
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010480 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010481 "%s: Posted Auto shutdown MSG", __func__);
10482 sme_release_global_lock(&pMac->sme);
10483 }
10484
10485 return status;
10486}
10487#endif
10488
Nirav Shaheb017be2018-02-15 11:20:58 +053010489#ifdef FEATURE_WLAN_CH_AVOID
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010490/*
10491 * sme_ch_avoid_update_req() -
10492 * API to request channel avoidance update from FW.
10493 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010494 * mac_handle - The handle returned by mac_open
Jeff Johnsonc5927de2018-05-11 09:12:53 -070010495 * update_type - The update_type parameter of this request call
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010496 * Return Configuration message posting status, SUCCESS or Fail
10497 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010498QDF_STATUS sme_ch_avoid_update_req(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010499{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010500 QDF_STATUS status = QDF_STATUS_SUCCESS;
10501 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010502 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010503 tSirChAvoidUpdateReq *cauReq;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010504 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010505
10506 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010507 if (QDF_STATUS_SUCCESS == status) {
Arif Hussain0ef77082018-10-10 16:42:53 -070010508 cauReq = qdf_mem_malloc(sizeof(tSirChAvoidUpdateReq));
10509 if (!cauReq) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010510 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010511 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010512 }
10513
10514 cauReq->reserved_param = 0;
10515
10516 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010517 message.bodyptr = cauReq;
10518 message.type = WMA_CH_AVOID_UPDATE_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010519 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
10520 QDF_MODULE_ID_WMA,
10521 QDF_MODULE_ID_WMA,
10522 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010523 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010524 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010525 "%s: Post Ch Avoid Update MSG fail",
10526 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010527 qdf_mem_free(cauReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010528 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010529 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010530 }
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010531 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010532 "%s: Posted Ch Avoid Update MSG", __func__);
10533 sme_release_global_lock(&pMac->sme);
10534 }
10535
10536 return status;
10537}
Nirav Shaheb017be2018-02-15 11:20:58 +053010538#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010539
10540/**
10541 * sme_set_miracast() - Function to set miracast value to UMAC
10542 * @hal: Handle returned by macOpen
10543 * @filter_type: 0-Disabled, 1-Source, 2-sink
10544 *
10545 * This function passes down the value of miracast set by
10546 * framework to UMAC
10547 *
10548 * Return: Configuration message posting status, SUCCESS or Fail
10549 *
10550 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080010551QDF_STATUS sme_set_miracast(mac_handle_t hal, uint8_t filter_type)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010552{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010553 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010554 uint32_t *val;
10555 tpAniSirGlobal mac_ptr = PMAC_STRUCT(hal);
10556
Arif Hussain0ef77082018-10-10 16:42:53 -070010557 if (!mac_ptr) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010558 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010559 "%s: Invalid pointer", __func__);
Arif Hussain0ef77082018-10-10 16:42:53 -070010560 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010561 }
10562
Arif Hussain0ef77082018-10-10 16:42:53 -070010563 val = qdf_mem_malloc(sizeof(*val));
10564 if (!val)
10565 return QDF_STATUS_E_NOMEM;
10566
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010567 *val = filter_type;
10568
10569 msg.type = SIR_HAL_SET_MIRACAST;
10570 msg.reserved = 0;
10571 msg.bodyptr = val;
10572
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010573 if (!QDF_IS_STATUS_SUCCESS(
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010574 scheduler_post_message(QDF_MODULE_ID_SME,
10575 QDF_MODULE_ID_WMA,
10576 QDF_MODULE_ID_WMA,
10577 &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010578 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010579 "%s: Not able to post WDA_SET_MAS_ENABLE_DISABLE to WMA!",
10580 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010581 qdf_mem_free(val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010582 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010583 }
10584
10585 mac_ptr->sme.miracast_value = filter_type;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010586 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010587}
10588
10589/**
10590 * sme_set_mas() - Function to set MAS value to UMAC
10591 * @val: 1-Enable, 0-Disable
10592 *
10593 * This function passes down the value of MAS to the UMAC. A
10594 * value of 1 will enable MAS and a value of 0 will disable MAS
10595 *
10596 * Return: Configuration message posting status, SUCCESS or Fail
10597 *
10598 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010599QDF_STATUS sme_set_mas(uint32_t val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010600{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010601 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010602 uint32_t *ptr_val;
10603
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010604 ptr_val = qdf_mem_malloc(sizeof(*ptr_val));
Arif Hussain0ef77082018-10-10 16:42:53 -070010605 if (!ptr_val)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010606 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010607
10608 *ptr_val = val;
10609
10610 msg.type = SIR_HAL_SET_MAS;
10611 msg.reserved = 0;
10612 msg.bodyptr = ptr_val;
10613
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010614 if (!QDF_IS_STATUS_SUCCESS(
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010615 scheduler_post_message(QDF_MODULE_ID_SME,
10616 QDF_MODULE_ID_WMA,
10617 QDF_MODULE_ID_WMA,
10618 &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010619 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010620 "%s: Not able to post WDA_SET_MAS_ENABLE_DISABLE to WMA!",
10621 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010622 qdf_mem_free(ptr_val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010623 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010624 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010625 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010626}
10627
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080010628/**
10629 * sme_roam_channel_change_req() - Channel change to new target channel
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010630 * @mac_handle: handle returned by mac_open
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080010631 * @bssid: mac address of BSS
10632 * @ch_params: target channel information
10633 * @profile: CSR profile
10634 *
10635 * API to Indicate Channel change to new target channel
10636 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010637 * Return: QDF_STATUS
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080010638 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010639QDF_STATUS sme_roam_channel_change_req(mac_handle_t mac_handle,
Amar Singhale4f28ee2015-10-21 14:36:56 -070010640 struct qdf_mac_addr bssid,
Amar Singhal5cccafe2017-02-15 12:42:58 -080010641 struct ch_params *ch_params,
Jeff Johnson66ee8a92018-03-17 15:24:26 -070010642 struct csr_roam_profile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010643{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010644 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010645 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010646
10647 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010648 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010649
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080010650 status = csr_roam_channel_change_req(pMac, bssid, ch_params,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010651 profile);
10652 sme_release_global_lock(&pMac->sme);
10653 }
10654 return status;
10655}
10656
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010657/*
10658 * sme_process_channel_change_resp() -
10659 * API to Indicate Channel change response message to SAP.
10660 *
10661 * Return QDF_STATUS
10662 */
10663static QDF_STATUS sme_process_channel_change_resp(tpAniSirGlobal pMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010664 uint16_t msg_type, void *pMsgBuf)
10665{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010666 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson172237b2017-11-07 15:32:59 -080010667 struct csr_roam_info proam_info = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010668 eCsrRoamResult roamResult;
10669 tpSwitchChannelParams pChnlParams = (tpSwitchChannelParams) pMsgBuf;
10670 uint32_t SessionId = pChnlParams->peSessionId;
10671
10672 proam_info.channelChangeRespEvent =
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010673 qdf_mem_malloc(sizeof(tSirChanChangeResponse));
Arif Hussain0ef77082018-10-10 16:42:53 -070010674 if (!proam_info.channelChangeRespEvent) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010675 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010676 return status;
10677 }
10678 if (msg_type == eWNI_SME_CHANNEL_CHANGE_RSP) {
10679 proam_info.channelChangeRespEvent->sessionId = SessionId;
10680 proam_info.channelChangeRespEvent->newChannelNumber =
10681 pChnlParams->channelNumber;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010682
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010683 if (pChnlParams->status == QDF_STATUS_SUCCESS) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010684 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010685 "sapdfs: Received success eWNI_SME_CHANNEL_CHANGE_RSP for sessionId[%d]",
10686 SessionId);
10687 proam_info.channelChangeRespEvent->channelChangeStatus =
10688 1;
10689 roamResult = eCSR_ROAM_RESULT_CHANNEL_CHANGE_SUCCESS;
10690 } else {
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010691 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010692 "sapdfs: Received failure eWNI_SME_CHANNEL_CHANGE_RSP for sessionId[%d]",
10693 SessionId);
10694 proam_info.channelChangeRespEvent->channelChangeStatus =
10695 0;
10696 roamResult = eCSR_ROAM_RESULT_CHANNEL_CHANGE_FAILURE;
10697 }
10698
10699 csr_roam_call_callback(pMac, SessionId, &proam_info, 0,
10700 eCSR_ROAM_SET_CHANNEL_RSP, roamResult);
10701
10702 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010703 status = QDF_STATUS_E_FAILURE;
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010704 sme_err("Invalid Channel Change Resp Message: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010705 status);
10706 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010707 qdf_mem_free(proam_info.channelChangeRespEvent);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010708
10709 return status;
10710}
10711
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010712/*
10713 * sme_roam_start_beacon_req() -
10714 * API to Indicate LIM to start Beacon Tx after SAP CAC Wait is completed.
10715 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010716 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010717 * sessionId - session ID
10718 * dfsCacWaitStatus - CAC WAIT status flag
10719 * Return QDF_STATUS
10720 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010721QDF_STATUS sme_roam_start_beacon_req(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080010722 struct qdf_mac_addr bssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010723 uint8_t dfsCacWaitStatus)
10724{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010725 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010726 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010727
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010728 status = sme_acquire_global_lock(&pMac->sme);
10729
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010730 if (QDF_IS_STATUS_SUCCESS(status)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010731 status = csr_roam_start_beacon_req(pMac, bssid,
10732 dfsCacWaitStatus);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010733 sme_release_global_lock(&pMac->sme);
10734 }
10735 return status;
10736}
10737
Abhishek Singh20a8e442018-09-12 15:50:44 +053010738#ifdef CONFIG_VDEV_SM
10739QDF_STATUS sme_csa_restart(tpAniSirGlobal mac_ctx, uint8_t session_id)
10740{
10741 QDF_STATUS status = QDF_STATUS_E_FAILURE;
10742
10743 status = sme_acquire_global_lock(&mac_ctx->sme);
10744 if (QDF_IS_STATUS_SUCCESS(status)) {
10745 status = csr_csa_restart(mac_ctx, session_id);
10746 sme_release_global_lock(&mac_ctx->sme);
10747 }
10748
10749 return status;
10750}
10751#endif
10752
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080010753/**
10754 * sme_roam_csa_ie_request() - request CSA IE transmission from PE
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010755 * @mac_handle: handle returned by mac_open
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080010756 * @bssid: SAP bssid
10757 * @targetChannel: target channel information
10758 * @csaIeReqd: CSA IE Request
10759 * @ch_params: channel information
10760 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010761 * Return: QDF_STATUS
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080010762 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010763QDF_STATUS sme_roam_csa_ie_request(mac_handle_t mac_handle,
10764 struct qdf_mac_addr bssid,
10765 uint8_t targetChannel, uint8_t csaIeReqd,
10766 struct ch_params *ch_params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010767{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010768 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010769 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010770
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010771 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010772 if (QDF_IS_STATUS_SUCCESS(status)) {
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080010773 status = csr_roam_send_chan_sw_ie_request(pMac, bssid,
10774 targetChannel, csaIeReqd, ch_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010775 sme_release_global_lock(&pMac->sme);
10776 }
10777 return status;
10778}
10779
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010780/*
10781 * sme_init_thermal_info() -
10782 * SME API to initialize the thermal mitigation parameters
10783 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010784 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010785 * thermalParam : thermal mitigation parameters
10786 * Return QDF_STATUS
10787 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010788QDF_STATUS sme_init_thermal_info(mac_handle_t mac_handle, tSmeThermalParams
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010789 thermalParam)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010790{
10791 t_thermal_mgmt *pWmaParam;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010792 struct scheduler_msg msg = {0};
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010793 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010794
Arif Hussain0ef77082018-10-10 16:42:53 -070010795 pWmaParam = qdf_mem_malloc(sizeof(t_thermal_mgmt));
10796 if (!pWmaParam)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010797 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010798
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010799 pWmaParam->thermalMgmtEnabled = thermalParam.smeThermalMgmtEnabled;
10800 pWmaParam->throttlePeriod = thermalParam.smeThrottlePeriod;
Poddar, Siddarth83905022016-04-16 17:56:08 -070010801
10802 pWmaParam->throttle_duty_cycle_tbl[0] =
10803 thermalParam.sme_throttle_duty_cycle_tbl[0];
10804 pWmaParam->throttle_duty_cycle_tbl[1] =
10805 thermalParam.sme_throttle_duty_cycle_tbl[1];
10806 pWmaParam->throttle_duty_cycle_tbl[2] =
10807 thermalParam.sme_throttle_duty_cycle_tbl[2];
10808 pWmaParam->throttle_duty_cycle_tbl[3] =
10809 thermalParam.sme_throttle_duty_cycle_tbl[3];
10810
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010811 pWmaParam->thermalLevels[0].minTempThreshold =
10812 thermalParam.smeThermalLevels[0].smeMinTempThreshold;
10813 pWmaParam->thermalLevels[0].maxTempThreshold =
10814 thermalParam.smeThermalLevels[0].smeMaxTempThreshold;
10815 pWmaParam->thermalLevels[1].minTempThreshold =
10816 thermalParam.smeThermalLevels[1].smeMinTempThreshold;
10817 pWmaParam->thermalLevels[1].maxTempThreshold =
10818 thermalParam.smeThermalLevels[1].smeMaxTempThreshold;
10819 pWmaParam->thermalLevels[2].minTempThreshold =
10820 thermalParam.smeThermalLevels[2].smeMinTempThreshold;
10821 pWmaParam->thermalLevels[2].maxTempThreshold =
10822 thermalParam.smeThermalLevels[2].smeMaxTempThreshold;
10823 pWmaParam->thermalLevels[3].minTempThreshold =
10824 thermalParam.smeThermalLevels[3].smeMinTempThreshold;
10825 pWmaParam->thermalLevels[3].maxTempThreshold =
10826 thermalParam.smeThermalLevels[3].smeMaxTempThreshold;
10827
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010828 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010829 msg.type = WMA_INIT_THERMAL_INFO_CMD;
10830 msg.bodyptr = pWmaParam;
10831
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010832 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010833 (scheduler_post_message(QDF_MODULE_ID_SME,
10834 QDF_MODULE_ID_WMA,
10835 QDF_MODULE_ID_WMA,
10836 &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010837 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010838 "%s: Not able to post WMA_SET_THERMAL_INFO_CMD to WMA!",
10839 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010840 qdf_mem_free(pWmaParam);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010841 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010842 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010843 }
10844 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010845 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010846 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010847 qdf_mem_free(pWmaParam);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010848 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010849}
10850
10851/**
10852 * sme_add_set_thermal_level_callback() - Plug in set thermal level callback
10853 * @hal: Handle returned by macOpen
10854 * @callback: sme_set_thermal_level_callback
10855 *
10856 * Plug in set thermal level callback
10857 *
10858 * Return: none
10859 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080010860void sme_add_set_thermal_level_callback(mac_handle_t hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010861 sme_set_thermal_level_callback callback)
10862{
10863 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
10864
10865 pMac->sme.set_thermal_level_cb = callback;
10866}
10867
10868/**
10869 * sme_set_thermal_level() - SME API to set the thermal mitigation level
10870 * @hal: Handler to HAL
10871 * @level: Thermal mitigation level
10872 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010873 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010874 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080010875QDF_STATUS sme_set_thermal_level(mac_handle_t hal, uint8_t level)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010876{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010877 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010878 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010879 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010880
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010881 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010882 qdf_mem_set(&msg, sizeof(msg), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010883 msg.type = WMA_SET_THERMAL_LEVEL;
10884 msg.bodyval = level;
10885
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010886 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
10887 QDF_MODULE_ID_WMA,
10888 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010889 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010890 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010891 "%s: Not able to post WMA_SET_THERMAL_LEVEL to WMA!",
10892 __func__);
10893 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010894 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010895 }
10896 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010897 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010898 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010899 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010900}
10901
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010902/*
10903 * sme_txpower_limit() -
10904 * SME API to set txpower limits
10905 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010906 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010907 * psmetx : power limits for 2g/5g
10908 * Return QDF_STATUS
10909 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010910QDF_STATUS sme_txpower_limit(mac_handle_t mac_handle, tSirTxPowerLimit *psmetx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010911{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010912 QDF_STATUS status = QDF_STATUS_SUCCESS;
10913 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010914 struct scheduler_msg message = {0};
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010915 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080010916 tSirTxPowerLimit *tx_power_limit;
10917
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010918 tx_power_limit = qdf_mem_malloc(sizeof(*tx_power_limit));
Arif Hussain0ef77082018-10-10 16:42:53 -070010919 if (!tx_power_limit)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010920 return QDF_STATUS_E_FAILURE;
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080010921
10922 *tx_power_limit = *psmetx;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010923
10924 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010925 if (QDF_IS_STATUS_SUCCESS(status)) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010926 message.type = WMA_TX_POWER_LIMIT;
10927 message.reserved = 0;
10928 message.bodyptr = tx_power_limit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010929
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010930 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
10931 QDF_MODULE_ID_WMA,
10932 QDF_MODULE_ID_WMA,
10933 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010934 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010935 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010936 "%s: not able to post WMA_TX_POWER_LIMIT",
10937 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010938 status = QDF_STATUS_E_FAILURE;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010939 qdf_mem_free(tx_power_limit);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010940 }
10941 sme_release_global_lock(&pMac->sme);
10942 }
10943 return status;
10944}
10945
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010946QDF_STATUS sme_update_connect_debug(mac_handle_t mac_handle, uint32_t set_value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010947{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010948 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010949 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010950
Dundi Ravitejaf99ce092018-09-27 17:51:59 +053010951 pMac->mlme_cfg->gen.debug_packet_log = set_value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010952 return status;
10953}
10954
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010955/*
10956 * sme_ap_disable_intra_bss_fwd() -
10957 * SME will send message to WMA to set Intra BSS in txrx
10958 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010959 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010960 * sessionId - session id ( vdev id)
10961 * disablefwd - bool value that indicate disable intrabss fwd disable
10962 * Return QDF_STATUS
10963 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010964QDF_STATUS sme_ap_disable_intra_bss_fwd(mac_handle_t mac_handle,
10965 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010966 bool disablefwd)
10967{
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010968 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010969 int status = QDF_STATUS_SUCCESS;
10970 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010971 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010972 tpDisableIntraBssFwd pSapDisableIntraFwd = NULL;
10973
10974 /* Prepare the request to send to SME. */
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010975 pSapDisableIntraFwd = qdf_mem_malloc(sizeof(tDisableIntraBssFwd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010976 if (NULL == pSapDisableIntraFwd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010977 sme_err("Memory Allocation Failure!!!");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010978 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010979 }
10980
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010981 pSapDisableIntraFwd->sessionId = sessionId;
10982 pSapDisableIntraFwd->disableintrabssfwd = disablefwd;
10983
10984 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010985 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010986 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010987 message.bodyptr = pSapDisableIntraFwd;
10988 message.type = WMA_SET_SAP_INTRABSS_DIS;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010989 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
10990 QDF_MODULE_ID_WMA,
10991 QDF_MODULE_ID_WMA,
10992 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010993 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
10994 status = QDF_STATUS_E_FAILURE;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010995 qdf_mem_free(pSapDisableIntraFwd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010996 }
10997 sme_release_global_lock(&pMac->sme);
10998 }
10999 return status;
11000}
11001
11002#ifdef WLAN_FEATURE_STATS_EXT
11003
Jeff Johnson45843652018-07-04 12:47:34 -070011004void sme_stats_ext_register_callback(mac_handle_t mac_handle,
11005 stats_ext_cb callback)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011006{
Jeff Johnson45843652018-07-04 12:47:34 -070011007 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011008
Jeff Johnson45843652018-07-04 12:47:34 -070011009 if (!mac) {
11010 sme_err("Invalid mac context");
Arun Khandavalli4b55da72016-07-19 19:55:01 +053011011 return;
11012 }
11013
Jeff Johnson45843652018-07-04 12:47:34 -070011014 mac->sme.stats_ext_cb = callback;
Arun Khandavalli4b55da72016-07-19 19:55:01 +053011015}
11016
Jeff Johnson45843652018-07-04 12:47:34 -070011017void sme_stats_ext_deregister_callback(mac_handle_t mac_handle)
11018{
11019 sme_stats_ext_register_callback(mac_handle, NULL);
11020}
11021
11022void sme_stats_ext2_register_callback(mac_handle_t mac_handle,
11023 stats_ext2_cb callback)
11024{
11025 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
11026
11027 if (!mac) {
11028 sme_err("Invalid mac context");
11029 return;
11030 }
11031
11032 mac->sme.stats_ext2_cb = callback;
11033}
Arun Khandavalli4b55da72016-07-19 19:55:01 +053011034
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011035/*
11036 * sme_stats_ext_request() -
11037 * Function called when HDD receives STATS EXT vendor command from userspace
11038 *
11039 * sessionID - vdevID for the stats ext request
11040 * input - Stats Ext Request structure ptr
11041 * Return QDF_STATUS
11042 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011043QDF_STATUS sme_stats_ext_request(uint8_t session_id, tpStatsExtRequestReq input)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011044{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011045 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011046 tpStatsExtRequest data;
11047 size_t data_len;
11048
11049 data_len = sizeof(tStatsExtRequest) + input->request_data_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011050 data = qdf_mem_malloc(data_len);
Arif Hussain0ef77082018-10-10 16:42:53 -070011051 if (!data)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011052 return QDF_STATUS_E_NOMEM;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011053
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011054 data->vdev_id = session_id;
11055 data->request_data_len = input->request_data_len;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011056 if (input->request_data_len)
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011057 qdf_mem_copy(data->request_data,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011058 input->request_data, input->request_data_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011059
11060 msg.type = WMA_STATS_EXT_REQUEST;
11061 msg.reserved = 0;
11062 msg.bodyptr = data;
11063
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011064 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
11065 QDF_MODULE_ID_WMA,
11066 QDF_MODULE_ID_WMA,
11067 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011068 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011069 "%s: Not able to post WMA_STATS_EXT_REQUEST message to WMA",
11070 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011071 qdf_mem_free(data);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011072 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011073 }
11074
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011075 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011076}
11077
Jeff Johnsonfdecd512018-06-10 09:18:32 -070011078/**
11079 * sme_stats_ext_event() - eWNI_SME_STATS_EXT_EVENT processor
11080 * @mac: Global MAC context
11081 * @msg: "stats ext" message
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011082
Jeff Johnsonfdecd512018-06-10 09:18:32 -070011083 * This callback function called when SME received eWNI_SME_STATS_EXT_EVENT
11084 * response from WMA
11085 *
11086 * Return: QDF_STATUS
11087 */
11088static QDF_STATUS sme_stats_ext_event(tpAniSirGlobal mac,
Jeff Johnson45843652018-07-04 12:47:34 -070011089 struct stats_ext_event *msg)
Jeff Johnsonfdecd512018-06-10 09:18:32 -070011090{
11091 if (!msg) {
11092 sme_err("Null msg");
11093 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011094 }
11095
Jeff Johnson45843652018-07-04 12:47:34 -070011096 if (mac->sme.stats_ext_cb)
11097 mac->sme.stats_ext_cb(mac->hdd_handle, msg);
Jeff Johnsonfdecd512018-06-10 09:18:32 -070011098
11099 return QDF_STATUS_SUCCESS;
11100}
11101
11102#else
11103
11104static QDF_STATUS sme_stats_ext_event(tpAniSirGlobal mac,
Jeff Johnson45843652018-07-04 12:47:34 -070011105 struct stats_ext_event *msg)
Jeff Johnsonfdecd512018-06-10 09:18:32 -070011106{
11107 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011108}
11109
11110#endif
11111
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011112/*
11113 * sme_update_dfs_scan_mode() -
11114 * Update DFS roam scan mode
11115 * This function is called through dynamic setConfig callback function
11116 * to configure allowDFSChannelRoam.
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011117 * mac_handle - HAL handle for device
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011118 * sessionId - Session Identifier
11119 * allowDFSChannelRoam - DFS roaming scan mode 0 (disable),
11120 * 1 (passive), 2 (active)
11121 * Return QDF_STATUS_SUCCESS - SME update DFS roaming scan config
11122 * successfully.
11123 * Other status means SME failed to update DFS roaming scan config.
11124 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011125QDF_STATUS sme_update_dfs_scan_mode(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011126 uint8_t allowDFSChannelRoam)
11127{
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011128 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011129 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011130
Naveen Rawatc36f7eb2016-11-10 20:01:03 -080011131 if (sessionId >= CSR_ROAM_SESSION_MAX) {
11132 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11133 FL("Invalid sme session id: %d"), sessionId);
11134 return QDF_STATUS_E_INVAL;
11135 }
11136
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011137 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011138 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011139 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011140 "LFR runtime successfully set AllowDFSChannelRoam Mode to %d - old value is %d - roam state is %s",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011141 allowDFSChannelRoam,
11142 pMac->roam.configParam.allowDFSChannelRoam,
11143 mac_trace_get_neighbour_roam_state(pMac->roam.
11144 neighborRoamInfo
11145 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011146 neighborRoamState));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011147 pMac->roam.configParam.allowDFSChannelRoam =
11148 allowDFSChannelRoam;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053011149 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
11150 csr_roam_offload_scan(pMac, sessionId,
11151 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
11152 REASON_ROAM_DFS_SCAN_MODE_CHANGED);
11153 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011154 sme_release_global_lock(&pMac->sme);
11155 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053011156
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011157
11158 return status;
11159}
11160
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011161/*
11162 * sme_get_dfs_scan_mode() - get DFS roam scan mode
11163 * This is a synchronous call
11164 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011165 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011166 * Return DFS roaming scan mode 0 (disable), 1 (passive), 2 (active)
11167 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011168uint8_t sme_get_dfs_scan_mode(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011169{
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011170 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011171
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011172 return pMac->roam.configParam.allowDFSChannelRoam;
11173}
11174
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011175/*
11176 * sme_modify_add_ie() -
11177 * This function sends msg to updates the additional IE buffers in PE
11178 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011179 * mac_handle - global structure
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011180 * pModifyIE - pointer to tModifyIE structure
11181 * updateType - type of buffer
11182 * Return Success or failure
11183 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011184QDF_STATUS sme_modify_add_ie(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011185 tSirModifyIE *pModifyIE, eUpdateIEsType updateType)
11186{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011187 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011188 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011189
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011190 status = sme_acquire_global_lock(&pMac->sme);
11191
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011192 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011193 status = csr_roam_modify_add_ies(pMac, pModifyIE, updateType);
11194 sme_release_global_lock(&pMac->sme);
11195 }
11196 return status;
11197}
11198
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011199/*
11200 * sme_update_add_ie() -
11201 * This function sends msg to updates the additional IE buffers in PE
11202 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011203 * mac_handle - global structure
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011204 * pUpdateIE - pointer to structure tUpdateIE
11205 * updateType - type of buffer
11206 * Return Success or failure
11207 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011208QDF_STATUS sme_update_add_ie(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011209 tSirUpdateIE *pUpdateIE, eUpdateIEsType updateType)
11210{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011211 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011212 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011213
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011214 status = sme_acquire_global_lock(&pMac->sme);
11215
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011216 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011217 status = csr_roam_update_add_ies(pMac, pUpdateIE, updateType);
11218 sme_release_global_lock(&pMac->sme);
11219 }
11220 return status;
11221}
11222
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011223/**
11224 * sme_update_dsc_pto_up_mapping()
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011225 * @mac_handle: HAL context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011226 * @dscpmapping: pointer to DSCP mapping structure
11227 * @sessionId: SME session id
11228 *
11229 * This routine is called to update dscp mapping
11230 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011231 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011232 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011233QDF_STATUS sme_update_dsc_pto_up_mapping(mac_handle_t mac_handle,
Abhishek Singh12be60f2017-08-11 13:52:42 +053011234 enum sme_qos_wmmuptype *dscpmapping,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011235 uint8_t sessionId)
11236{
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011237 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011238 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011239 uint8_t i, j, peSessionId;
gaurank kathpalia14e2f912017-08-31 14:51:45 +053011240 struct csr_roam_session *pCsrSession = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011241 tpPESession pSession = NULL;
11242
11243 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011244 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011245 return status;
11246 pCsrSession = CSR_GET_SESSION(pMac, sessionId);
11247 if (pCsrSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011248 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011249 FL("Session lookup fails for CSR session"));
11250 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011251 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011252 }
11253 if (!CSR_IS_SESSION_VALID(pMac, sessionId)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011254 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011255 FL("Invalid session Id %u"), sessionId);
11256 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011257 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011258 }
11259
11260 pSession = pe_find_session_by_bssid(pMac,
11261 pCsrSession->connectedProfile.bssid.bytes,
11262 &peSessionId);
11263
11264 if (pSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011265 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011266 FL(" Session lookup fails for BSSID"));
11267 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011268 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011269 }
11270
11271 if (!pSession->QosMapSet.present) {
Srinivas Girigowda2b5d47c2017-03-29 00:28:46 -070011272 sme_debug("QOS Mapping IE not present");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011273 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011274 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011275 }
11276 for (i = 0; i < SME_QOS_WMM_UP_MAX; i++) {
11277 for (j = pSession->QosMapSet.dscp_range[i][0];
11278 j <= pSession->QosMapSet.dscp_range[i][1];
11279 j++) {
11280 if ((pSession->QosMapSet.dscp_range[i][0] == 255)
11281 && (pSession->QosMapSet.dscp_range[i][1] ==
11282 255)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011283 QDF_TRACE(QDF_MODULE_ID_SME,
Kiran Kumar Lokere1d411bb2017-11-29 15:24:05 -080011284 QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011285 FL("User Priority %d isn't used"), i);
11286 break;
11287 } else {
11288 dscpmapping[j] = i;
11289 }
11290 }
11291 }
11292 for (i = 0; i < pSession->QosMapSet.num_dscp_exceptions; i++)
11293 if (pSession->QosMapSet.dscp_exceptions[i][0] != 255)
11294 dscpmapping[pSession->QosMapSet.dscp_exceptions[i][0]] =
11295 pSession->QosMapSet.dscp_exceptions[i][1];
11296
11297 sme_release_global_lock(&pMac->sme);
11298 return status;
11299}
11300
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011301/*
11302 * sme_abort_roam_scan() -
11303 * API to abort current roam scan cycle by roam scan offload module.
11304 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011305 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011306 * sessionId - Session Identifier
11307 * Return QDF_STATUS
11308 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011309
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011310QDF_STATUS sme_abort_roam_scan(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011311{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011312 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011313 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011314
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011315 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
11316 /* acquire the lock for the sme object */
11317 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011318 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011319 csr_roam_offload_scan(pMac, sessionId,
11320 ROAM_SCAN_OFFLOAD_ABORT_SCAN,
11321 REASON_ROAM_ABORT_ROAM_SCAN);
11322 /* release the lock for the sme object */
11323 sme_release_global_lock(&pMac->sme);
11324 }
11325 }
11326
11327 return status;
11328}
11329
11330#ifdef FEATURE_WLAN_EXTSCAN
11331/**
11332 * sme_get_valid_channels_by_band() - to fetch valid channels filtered by band
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011333 * @mac_handle: HAL context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011334 * @wifiBand: RF band information
11335 * @aValidChannels: output array to store channel info
11336 * @pNumChannels: output number of channels
11337 *
11338 * SME API to fetch all valid channels filtered by band
11339 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011340 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011341 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011342QDF_STATUS sme_get_valid_channels_by_band(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011343 uint8_t wifiBand,
11344 uint32_t *aValidChannels,
11345 uint8_t *pNumChannels)
11346{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011347 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011348 uint8_t chanList[WNI_CFG_VALID_CHANNEL_LIST_LEN] = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011349 uint8_t numChannels = 0;
11350 uint8_t i = 0;
11351 uint32_t totValidChannels = WNI_CFG_VALID_CHANNEL_LIST_LEN;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011352 tpAniSirGlobal mac_ctx = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011353
11354 if (!aValidChannels || !pNumChannels) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011355 sme_err("Output channel list/NumChannels is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011356 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011357 }
11358
Sreelakshmi Konamki0d17c6a2017-06-08 12:58:54 +053011359 if (wifiBand >= WIFI_BAND_MAX) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011360 sme_err("Invalid wifiBand: %d", wifiBand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011361 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011362 }
11363
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080011364 status = sme_get_cfg_valid_channels(&chanList[0],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011365 &totValidChannels);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011366 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011367 sme_err("Fail to get valid channel list (err=%d)", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011368 return status;
11369 }
11370
11371 switch (wifiBand) {
11372 case WIFI_BAND_UNSPECIFIED:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011373 sme_debug("Unspec Band, return all %d valid channels",
11374 totValidChannels);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011375 numChannels = totValidChannels;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011376 for (i = 0; i < totValidChannels; i++)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011377 aValidChannels[i] = cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011378 break;
11379
11380 case WIFI_BAND_BG:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011381 sme_debug("WIFI_BAND_BG (2.4 GHz)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011382 for (i = 0; i < totValidChannels; i++) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011383 if (WLAN_REG_IS_24GHZ_CH(chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011384 aValidChannels[numChannels++] =
11385 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011386 }
11387 break;
11388
11389 case WIFI_BAND_A:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011390 sme_debug("WIFI_BAND_A (5 GHz without DFS)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011391 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070011392 if (WLAN_REG_IS_5GHZ_CH(chanList[i]) &&
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011393 !wlan_reg_is_dfs_ch(mac_ctx->pdev, chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011394 aValidChannels[numChannels++] =
11395 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011396 }
11397 break;
11398
11399 case WIFI_BAND_ABG:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011400 sme_debug("WIFI_BAND_ABG (2.4 GHz + 5 GHz; no DFS)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011401 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070011402 if ((WLAN_REG_IS_24GHZ_CH(chanList[i]) ||
11403 WLAN_REG_IS_5GHZ_CH(chanList[i])) &&
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011404 !wlan_reg_is_dfs_ch(mac_ctx->pdev, chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011405 aValidChannels[numChannels++] =
11406 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011407 }
11408 break;
11409
11410 case WIFI_BAND_A_DFS_ONLY:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011411 sme_debug("WIFI_BAND_A_DFS (5 GHz DFS only)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011412 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070011413 if (WLAN_REG_IS_5GHZ_CH(chanList[i]) &&
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011414 wlan_reg_is_dfs_ch(mac_ctx->pdev, chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011415 aValidChannels[numChannels++] =
11416 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011417 }
11418 break;
11419
11420 case WIFI_BAND_A_WITH_DFS:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011421 sme_debug("WIFI_BAND_A_WITH_DFS (5 GHz with DFS)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011422 for (i = 0; i < totValidChannels; i++) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011423 if (WLAN_REG_IS_5GHZ_CH(chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011424 aValidChannels[numChannels++] =
11425 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011426 }
11427 break;
11428
11429 case WIFI_BAND_ABG_WITH_DFS:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011430 sme_debug("WIFI_BAND_ABG_WITH_DFS (2.4 GHz+5 GHz with DFS)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011431 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070011432 if (WLAN_REG_IS_24GHZ_CH(chanList[i]) ||
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011433 WLAN_REG_IS_5GHZ_CH(chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011434 aValidChannels[numChannels++] =
11435 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011436 }
11437 break;
11438
11439 default:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011440 sme_err("Unknown wifiBand: %d", wifiBand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011441 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011442 }
11443 *pNumChannels = numChannels;
11444
11445 return status;
11446}
11447
Jeff Johnsonfed9a732018-07-18 12:18:03 -070011448QDF_STATUS
11449sme_ext_scan_get_capabilities(mac_handle_t mac_handle,
11450 struct extscan_capabilities_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011451{
Jeff Johnsonfed9a732018-07-18 12:18:03 -070011452 QDF_STATUS status;
11453 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011454 struct scheduler_msg message = {0};
Jeff Johnsonfed9a732018-07-18 12:18:03 -070011455 struct extscan_capabilities_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011456
Jeff Johnsonfed9a732018-07-18 12:18:03 -070011457 /* per contract must make a copy of the params when messaging */
11458 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
11459 if (!bodyptr)
11460 return QDF_STATUS_E_NOMEM;
11461 *bodyptr = *params;
11462
11463 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011464 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011465 /* Serialize the req through MC thread */
Jeff Johnsonfed9a732018-07-18 12:18:03 -070011466 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011467 message.type = WMA_EXTSCAN_GET_CAPABILITIES_REQ;
Jeff Johnsonfed9a732018-07-18 12:18:03 -070011468 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
11469 NO_SESSION, message.type);
11470 status = scheduler_post_message(QDF_MODULE_ID_SME,
11471 QDF_MODULE_ID_WMA,
11472 QDF_MODULE_ID_WMA,
11473 &message);
11474 sme_release_global_lock(&mac->sme);
11475 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011476
Jeff Johnsonfed9a732018-07-18 12:18:03 -070011477 if (QDF_IS_STATUS_ERROR(status)) {
11478 sme_err("failure: %d", status);
11479 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011480 }
11481 return status;
11482}
11483
Jeff Johnsondab58602018-07-14 15:30:24 -070011484QDF_STATUS
11485sme_ext_scan_start(mac_handle_t mac_handle,
11486 struct wifi_scan_cmd_req_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011487{
Jeff Johnsondab58602018-07-14 15:30:24 -070011488 QDF_STATUS status;
11489 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011490 struct scheduler_msg message = {0};
Jeff Johnsondab58602018-07-14 15:30:24 -070011491 struct wifi_scan_cmd_req_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011492
Jeff Johnsondab58602018-07-14 15:30:24 -070011493 /* per contract must make a copy of the params when messaging */
11494 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
11495 if (!bodyptr)
11496 return QDF_STATUS_E_NOMEM;
11497 *bodyptr = *params;
11498
11499 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011500 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011501 /* Serialize the req through MC thread */
Jeff Johnsondab58602018-07-14 15:30:24 -070011502 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011503 message.type = WMA_EXTSCAN_START_REQ;
Jeff Johnsondab58602018-07-14 15:30:24 -070011504 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
11505 NO_SESSION, message.type);
11506 status = scheduler_post_message(QDF_MODULE_ID_SME,
11507 QDF_MODULE_ID_WMA,
11508 QDF_MODULE_ID_WMA,
11509 &message);
11510 sme_release_global_lock(&mac->sme);
11511 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011512
Jeff Johnsondab58602018-07-14 15:30:24 -070011513 if (QDF_IS_STATUS_ERROR(status)) {
11514 sme_err("failure: %d", status);
11515 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011516 }
11517 return status;
11518}
11519
Jeff Johnson7272ea72018-07-15 17:22:27 -070011520QDF_STATUS sme_ext_scan_stop(mac_handle_t mac_handle,
11521 struct extscan_stop_req_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011522{
Jeff Johnson7272ea72018-07-15 17:22:27 -070011523 QDF_STATUS status;
11524 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011525 struct scheduler_msg message = {0};
Jeff Johnson7272ea72018-07-15 17:22:27 -070011526 struct extscan_stop_req_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011527
Jeff Johnson7272ea72018-07-15 17:22:27 -070011528 /* per contract must make a copy of the params when messaging */
11529 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
11530 if (!bodyptr)
11531 return QDF_STATUS_E_NOMEM;
11532 *bodyptr = *params;
11533
11534 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011535 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011536 /* Serialize the req through MC thread */
Jeff Johnson7272ea72018-07-15 17:22:27 -070011537 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011538 message.type = WMA_EXTSCAN_STOP_REQ;
Jeff Johnson7272ea72018-07-15 17:22:27 -070011539 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
11540 NO_SESSION, message.type);
11541 status = scheduler_post_message(QDF_MODULE_ID_SME,
11542 QDF_MODULE_ID_WMA,
11543 QDF_MODULE_ID_WMA,
11544 &message);
11545 sme_release_global_lock(&mac->sme);
11546 }
11547
11548 if (QDF_IS_STATUS_ERROR(status)) {
11549 sme_err("failure: %d", status);
11550 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011551 }
11552 return status;
11553}
11554
Jeff Johnson1148cb02018-07-13 23:14:32 -070011555QDF_STATUS
11556sme_set_bss_hotlist(mac_handle_t mac_handle,
11557 struct extscan_bssid_hotlist_set_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011558{
Jeff Johnson1148cb02018-07-13 23:14:32 -070011559 QDF_STATUS status;
11560 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011561 struct scheduler_msg message = {0};
Jeff Johnson1148cb02018-07-13 23:14:32 -070011562 struct extscan_bssid_hotlist_set_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011563
Jeff Johnson1148cb02018-07-13 23:14:32 -070011564 /* per contract must make a copy of the params when messaging */
11565 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
Arif Hussain0ef77082018-10-10 16:42:53 -070011566 if (!bodyptr)
Jeff Johnson1148cb02018-07-13 23:14:32 -070011567 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070011568
Jeff Johnson1148cb02018-07-13 23:14:32 -070011569 *bodyptr = *params;
11570
11571 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011572 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011573 /* Serialize the req through MC thread */
Jeff Johnson1148cb02018-07-13 23:14:32 -070011574 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011575 message.type = WMA_EXTSCAN_SET_BSSID_HOTLIST_REQ;
Jeff Johnson1148cb02018-07-13 23:14:32 -070011576 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
11577 NO_SESSION, message.type);
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011578 status = scheduler_post_message(QDF_MODULE_ID_SME,
11579 QDF_MODULE_ID_WMA,
11580 QDF_MODULE_ID_WMA, &message);
Jeff Johnson1148cb02018-07-13 23:14:32 -070011581 sme_release_global_lock(&mac->sme);
11582 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011583
Jeff Johnson1148cb02018-07-13 23:14:32 -070011584 if (QDF_IS_STATUS_ERROR(status)) {
11585 sme_err("failure: %d", status);
11586 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011587 }
11588 return status;
11589}
11590
Jeff Johnson9743eb72018-07-14 10:30:04 -070011591QDF_STATUS
11592sme_reset_bss_hotlist(mac_handle_t mac_handle,
11593 struct extscan_bssid_hotlist_reset_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011594{
Jeff Johnson9743eb72018-07-14 10:30:04 -070011595 QDF_STATUS status;
11596 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011597 struct scheduler_msg message = {0};
Jeff Johnson9743eb72018-07-14 10:30:04 -070011598 struct extscan_bssid_hotlist_reset_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011599
Jeff Johnson9743eb72018-07-14 10:30:04 -070011600 /* per contract must make a copy of the params when messaging */
11601 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
Arif Hussain0ef77082018-10-10 16:42:53 -070011602 if (!bodyptr)
Jeff Johnson9743eb72018-07-14 10:30:04 -070011603 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070011604
Jeff Johnson9743eb72018-07-14 10:30:04 -070011605 *bodyptr = *params;
11606
11607 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011608 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011609 /* Serialize the req through MC thread */
Jeff Johnson9743eb72018-07-14 10:30:04 -070011610 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011611 message.type = WMA_EXTSCAN_RESET_BSSID_HOTLIST_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053011612 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011613 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011614 status = scheduler_post_message(QDF_MODULE_ID_SME,
11615 QDF_MODULE_ID_WMA,
11616 QDF_MODULE_ID_WMA, &message);
Jeff Johnson9743eb72018-07-14 10:30:04 -070011617 sme_release_global_lock(&mac->sme);
11618 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011619
Jeff Johnson9743eb72018-07-14 10:30:04 -070011620 if (QDF_IS_STATUS_ERROR(status)) {
11621 sme_err("failure: %d", status);
11622 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011623 }
11624 return status;
11625}
11626
Jeff Johnsonb43ed032018-07-16 06:59:21 -070011627QDF_STATUS
11628sme_set_significant_change(mac_handle_t mac_handle,
11629 struct extscan_set_sig_changereq_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011630{
Jeff Johnsonb43ed032018-07-16 06:59:21 -070011631 QDF_STATUS status;
11632 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011633 struct scheduler_msg message = {0};
Jeff Johnsonb43ed032018-07-16 06:59:21 -070011634 struct extscan_set_sig_changereq_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011635
Jeff Johnsonb43ed032018-07-16 06:59:21 -070011636 /* per contract must make a copy of the params when messaging */
11637 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
Arif Hussain0ef77082018-10-10 16:42:53 -070011638 if (!bodyptr)
Jeff Johnsonb43ed032018-07-16 06:59:21 -070011639 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070011640
Jeff Johnsonb43ed032018-07-16 06:59:21 -070011641 *bodyptr = *params;
11642
11643 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011644 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011645 /* Serialize the req through MC thread */
Jeff Johnsonb43ed032018-07-16 06:59:21 -070011646 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011647 message.type = WMA_EXTSCAN_SET_SIGNF_CHANGE_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011648 status = scheduler_post_message(QDF_MODULE_ID_SME,
11649 QDF_MODULE_ID_WMA,
11650 QDF_MODULE_ID_WMA,
11651 &message);
Jeff Johnsonb43ed032018-07-16 06:59:21 -070011652 sme_release_global_lock(&mac->sme);
11653 }
Jeff Johnsonb43ed032018-07-16 06:59:21 -070011654 if (QDF_IS_STATUS_ERROR(status)) {
11655 sme_err("failure: %d", status);
11656 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011657 }
11658 return status;
11659}
11660
Jeff Johnson0c8dbc32018-07-16 22:10:48 -070011661QDF_STATUS
11662sme_reset_significant_change(mac_handle_t mac_handle,
11663 struct extscan_capabilities_reset_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011664{
Jeff Johnson0c8dbc32018-07-16 22:10:48 -070011665 QDF_STATUS status;
11666 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011667 struct scheduler_msg message = {0};
Jeff Johnson0c8dbc32018-07-16 22:10:48 -070011668 struct extscan_capabilities_reset_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011669
Jeff Johnson0c8dbc32018-07-16 22:10:48 -070011670 /* per contract must make a copy of the params when messaging */
11671 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
Arif Hussain0ef77082018-10-10 16:42:53 -070011672 if (!bodyptr)
Jeff Johnson0c8dbc32018-07-16 22:10:48 -070011673 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070011674
Jeff Johnson0c8dbc32018-07-16 22:10:48 -070011675 *bodyptr = *params;
11676
11677 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011678 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011679 /* Serialize the req through MC thread */
Jeff Johnson0c8dbc32018-07-16 22:10:48 -070011680 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011681 message.type = WMA_EXTSCAN_RESET_SIGNF_CHANGE_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053011682 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011683 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011684 status = scheduler_post_message(QDF_MODULE_ID_SME,
11685 QDF_MODULE_ID_WMA,
11686 QDF_MODULE_ID_WMA,
11687 &message);
Jeff Johnson0c8dbc32018-07-16 22:10:48 -070011688 sme_release_global_lock(&mac->sme);
11689 }
Jeff Johnson0c8dbc32018-07-16 22:10:48 -070011690 if (QDF_IS_STATUS_ERROR(status)) {
11691 sme_err("failure: %d", status);
11692 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011693 }
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011694
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011695 return status;
11696}
11697
Jeff Johnson2ba60092018-07-17 08:19:37 -070011698QDF_STATUS
11699sme_get_cached_results(mac_handle_t mac_handle,
11700 struct extscan_cached_result_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011701{
Jeff Johnson2ba60092018-07-17 08:19:37 -070011702 QDF_STATUS status;
11703 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011704 struct scheduler_msg message = {0};
Jeff Johnson2ba60092018-07-17 08:19:37 -070011705 struct extscan_cached_result_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011706
Jeff Johnson2ba60092018-07-17 08:19:37 -070011707 /* per contract must make a copy of the params when messaging */
11708 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
11709 if (!bodyptr)
11710 return QDF_STATUS_E_NOMEM;
11711 *bodyptr = *params;
11712
11713 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011714 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011715 /* Serialize the req through MC thread */
Jeff Johnson2ba60092018-07-17 08:19:37 -070011716 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011717 message.type = WMA_EXTSCAN_GET_CACHED_RESULTS_REQ;
Jeff Johnson2ba60092018-07-17 08:19:37 -070011718 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
11719 NO_SESSION, message.type);
11720 status = scheduler_post_message(QDF_MODULE_ID_SME,
11721 QDF_MODULE_ID_WMA,
11722 QDF_MODULE_ID_WMA,
11723 &message);
11724 sme_release_global_lock(&mac->sme);
11725 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011726
Jeff Johnson2ba60092018-07-17 08:19:37 -070011727 if (QDF_IS_STATUS_ERROR(status)) {
11728 sme_err("failure: %d", status);
11729 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011730 }
11731 return status;
11732}
11733
Jeff Johnson360135b2018-07-18 20:51:47 -070011734QDF_STATUS sme_set_epno_list(mac_handle_t mac_handle,
11735 struct wifi_enhanced_pno_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011736{
Jeff Johnson360135b2018-07-18 20:51:47 -070011737 QDF_STATUS status;
11738 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011739 struct scheduler_msg message = {0};
Jeff Johnson360135b2018-07-18 20:51:47 -070011740 struct wifi_enhanced_pno_params *req_msg;
11741 int len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011742
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011743 SME_ENTER();
Jeff Johnson360135b2018-07-18 20:51:47 -070011744
11745 /* per contract must make a copy of the params when messaging */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011746 len = sizeof(*req_msg) +
Jeff Johnson360135b2018-07-18 20:51:47 -070011747 (params->num_networks * sizeof(req_msg->networks[0]));
Mukul Sharmae8c919f2016-10-02 20:35:15 +053011748
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011749 req_msg = qdf_mem_malloc(len);
Arif Hussain0ef77082018-10-10 16:42:53 -070011750 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011751 return QDF_STATUS_E_NOMEM;
Jeff Johnson360135b2018-07-18 20:51:47 -070011752 qdf_mem_copy(req_msg, params, len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011753
11754 status = sme_acquire_global_lock(&mac->sme);
Vignesh Viswanathancbb5b952017-08-02 14:32:49 +053011755 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011756 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011757 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011758 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011759 return status;
11760 }
11761
11762 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011763 message.bodyptr = req_msg;
11764 message.type = WMA_SET_EPNO_LIST_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011765 status = scheduler_post_message(QDF_MODULE_ID_SME,
11766 QDF_MODULE_ID_WMA,
11767 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011768 if (!QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson360135b2018-07-18 20:51:47 -070011769 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011770 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011771 }
11772 sme_release_global_lock(&mac->sme);
Jeff Johnson360135b2018-07-18 20:51:47 -070011773
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011774 return status;
11775}
11776
Jeff Johnson2a7f1012018-07-19 07:21:06 -070011777QDF_STATUS sme_set_passpoint_list(mac_handle_t mac_handle,
11778 struct wifi_passpoint_req_param *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011779{
Jeff Johnson2a7f1012018-07-19 07:21:06 -070011780 QDF_STATUS status;
11781 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011782 struct scheduler_msg message = {0};
Jeff Johnson2a7f1012018-07-19 07:21:06 -070011783 struct wifi_passpoint_req_param *req_msg;
11784 int len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011785
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011786 SME_ENTER();
Jeff Johnson2a7f1012018-07-19 07:21:06 -070011787
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011788 len = sizeof(*req_msg) +
Jeff Johnson2a7f1012018-07-19 07:21:06 -070011789 (params->num_networks * sizeof(params->networks[0]));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011790 req_msg = qdf_mem_malloc(len);
Arif Hussain0ef77082018-10-10 16:42:53 -070011791 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011792 return QDF_STATUS_E_NOMEM;
Jeff Johnson2a7f1012018-07-19 07:21:06 -070011793 qdf_mem_copy(req_msg, params, len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011794
11795 status = sme_acquire_global_lock(&mac->sme);
Vignesh Viswanathancbb5b952017-08-02 14:32:49 +053011796 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011797 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011798 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011799 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011800 return status;
11801 }
11802
11803 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011804 message.bodyptr = req_msg;
11805 message.type = WMA_SET_PASSPOINT_LIST_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011806 status = scheduler_post_message(QDF_MODULE_ID_SME,
11807 QDF_MODULE_ID_WMA,
11808 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011809 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011810 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011811 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011812 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011813 }
11814 sme_release_global_lock(&mac->sme);
11815 return status;
11816}
11817
Jeff Johnson2a7f1012018-07-19 07:21:06 -070011818QDF_STATUS sme_reset_passpoint_list(mac_handle_t mac_handle,
11819 struct wifi_passpoint_req_param *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011820{
Jeff Johnson2a7f1012018-07-19 07:21:06 -070011821 QDF_STATUS status;
11822 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011823 struct scheduler_msg message = {0};
Jeff Johnson2a7f1012018-07-19 07:21:06 -070011824 struct wifi_passpoint_req_param *req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011825
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011826 SME_ENTER();
Jeff Johnson2a7f1012018-07-19 07:21:06 -070011827
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011828 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070011829 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011830 return QDF_STATUS_E_NOMEM;
Jeff Johnson2a7f1012018-07-19 07:21:06 -070011831 *req_msg = *params;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011832
11833 status = sme_acquire_global_lock(&mac->sme);
Vignesh Viswanathancbb5b952017-08-02 14:32:49 +053011834 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011835 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011836 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011837 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011838 return status;
11839 }
11840
11841 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011842 message.bodyptr = req_msg;
11843 message.type = WMA_RESET_PASSPOINT_LIST_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011844 status = scheduler_post_message(QDF_MODULE_ID_SME,
11845 QDF_MODULE_ID_WMA,
11846 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011847 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011848 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011849 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011850 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011851 }
11852 sme_release_global_lock(&mac->sme);
11853 return status;
11854}
11855
Jeff Johnson17b12392018-07-03 22:21:15 -070011856QDF_STATUS sme_ext_scan_register_callback(mac_handle_t mac_handle,
11857 ext_scan_ind_cb ext_scan_ind_cb)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011858{
Jeff Johnson17b12392018-07-03 22:21:15 -070011859 QDF_STATUS status;
11860 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011861
Jeff Johnson17b12392018-07-03 22:21:15 -070011862 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011863 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson17b12392018-07-03 22:21:15 -070011864 mac->sme.ext_scan_ind_cb = ext_scan_ind_cb;
11865 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011866 }
11867 return status;
11868}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011869#endif /* FEATURE_WLAN_EXTSCAN */
11870
Wen Gong7952fbd2018-04-18 11:27:23 +080011871/**
11872 * sme_send_wisa_params(): Pass WISA mode to WMA
11873 * @hal: HAL context
11874 * @wisa_params: pointer to WISA params struct
11875 * @sessionId: SME session id
11876 *
11877 * Pass WISA params to WMA
11878 *
11879 * Return: QDF_STATUS
11880 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080011881QDF_STATUS sme_set_wisa_params(mac_handle_t hal,
Wen Gong7952fbd2018-04-18 11:27:23 +080011882 struct sir_wisa_params *wisa_params)
11883{
11884 QDF_STATUS status = QDF_STATUS_SUCCESS;
11885 tpAniSirGlobal mac = PMAC_STRUCT(hal);
11886 struct scheduler_msg message = {0};
11887 struct sir_wisa_params *cds_msg_wisa_params;
11888
11889 cds_msg_wisa_params = qdf_mem_malloc(sizeof(struct sir_wisa_params));
11890 if (!cds_msg_wisa_params)
11891 return QDF_STATUS_E_NOMEM;
11892
11893 *cds_msg_wisa_params = *wisa_params;
11894 status = sme_acquire_global_lock(&mac->sme);
11895 if (QDF_IS_STATUS_SUCCESS(status)) {
11896 message.bodyptr = cds_msg_wisa_params;
11897 message.type = WMA_SET_WISA_PARAMS;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011898 status = scheduler_post_message(QDF_MODULE_ID_SME,
11899 QDF_MODULE_ID_WMA,
11900 QDF_MODULE_ID_WMA, &message);
Wen Gong7952fbd2018-04-18 11:27:23 +080011901 sme_release_global_lock(&mac->sme);
11902 }
11903 return status;
11904}
11905
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011906#ifdef WLAN_FEATURE_LINK_LAYER_STATS
11907
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011908/*
11909 * sme_ll_stats_clear_req() -
11910 * SME API to clear Link Layer Statistics
11911 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011912 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011913 * pclearStatsReq: Link Layer clear stats request params structure
11914 * Return QDF_STATUS
11915 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011916QDF_STATUS sme_ll_stats_clear_req(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011917 tSirLLStatsClearReq *pclearStatsReq)
11918{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011919 QDF_STATUS status = QDF_STATUS_SUCCESS;
11920 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011921 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011922 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011923 tSirLLStatsClearReq *clear_stats_req;
11924
Abhishek Singhe4a1f882017-08-10 17:59:44 +053011925 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011926 "staId = %u", pclearStatsReq->staId);
Abhishek Singhe4a1f882017-08-10 17:59:44 +053011927 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011928 "statsClearReqMask = 0x%X",
11929 pclearStatsReq->statsClearReqMask);
Abhishek Singhe4a1f882017-08-10 17:59:44 +053011930 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011931 "stopReq = %u", pclearStatsReq->stopReq);
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011932 if (!sme_is_session_id_valid(mac_handle, pclearStatsReq->staId)) {
Deepak Dhamdhere6adc08e2017-07-27 09:33:22 -070011933 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11934 "%s: invalid staId %d",
11935 __func__, pclearStatsReq->staId);
11936 return QDF_STATUS_E_INVAL;
11937 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011938
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011939 clear_stats_req = qdf_mem_malloc(sizeof(*clear_stats_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070011940 if (!clear_stats_req)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011941 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011942
11943 *clear_stats_req = *pclearStatsReq;
11944
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011945 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011946 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011947 message.bodyptr = clear_stats_req;
11948 message.type = WMA_LINK_LAYER_STATS_CLEAR_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053011949 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011950 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011951 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
11952 QDF_MODULE_ID_WMA,
11953 QDF_MODULE_ID_WMA,
11954 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011955 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011956 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011957 "%s: not able to post WMA_LL_STATS_CLEAR_REQ",
11958 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011959 qdf_mem_free(clear_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011960 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011961 }
11962 sme_release_global_lock(&pMac->sme);
11963 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011964 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11965 "%s: sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011966 qdf_mem_free(clear_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011967 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011968 }
11969
11970 return status;
11971}
11972
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011973/*
11974 * sme_ll_stats_set_req() -
11975 * SME API to set the Link Layer Statistics
11976 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011977 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011978 * psetStatsReq: Link Layer set stats request params structure
11979 * Return QDF_STATUS
11980 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011981QDF_STATUS sme_ll_stats_set_req(mac_handle_t mac_handle, tSirLLStatsSetReq
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011982 *psetStatsReq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011983{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011984 QDF_STATUS status = QDF_STATUS_SUCCESS;
11985 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011986 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011987 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011988 tSirLLStatsSetReq *set_stats_req;
11989
Abhishek Singhe4a1f882017-08-10 17:59:44 +053011990 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011991 "%s: MPDU Size = %u", __func__,
11992 psetStatsReq->mpduSizeThreshold);
Abhishek Singhe4a1f882017-08-10 17:59:44 +053011993 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011994 " Aggressive Stats Collections = %u",
11995 psetStatsReq->aggressiveStatisticsGathering);
11996
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011997 set_stats_req = qdf_mem_malloc(sizeof(*set_stats_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070011998 if (!set_stats_req)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011999 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012000
12001 *set_stats_req = *psetStatsReq;
12002
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012003 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012004 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012005 message.bodyptr = set_stats_req;
12006 message.type = WMA_LINK_LAYER_STATS_SET_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053012007 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012008 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012009 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
12010 QDF_MODULE_ID_WMA,
12011 QDF_MODULE_ID_WMA,
12012 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012013 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012014 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012015 "%s: not able to post WMA_LL_STATS_SET_REQ",
12016 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012017 qdf_mem_free(set_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012018 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012019 }
12020 sme_release_global_lock(&pMac->sme);
12021 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012022 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12023 "%s: sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012024 qdf_mem_free(set_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012025 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012026 }
12027
12028 return status;
12029}
12030
Dundi Ravitejae232cf12018-05-16 18:34:34 +053012031QDF_STATUS sme_ll_stats_get_req(mac_handle_t mac_handle,
12032 tSirLLStatsGetReq *get_stats_req,
12033 void *context)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012034{
Dundi Ravitejae232cf12018-05-16 18:34:34 +053012035 QDF_STATUS status = QDF_STATUS_E_FAILURE;
12036 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012037 struct scheduler_msg message = {0};
Dundi Ravitejae232cf12018-05-16 18:34:34 +053012038 tSirLLStatsGetReq *ll_stats_get_req;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012039
Dundi Ravitejae232cf12018-05-16 18:34:34 +053012040 ll_stats_get_req = qdf_mem_malloc(sizeof(*ll_stats_get_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070012041 if (!ll_stats_get_req)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012042 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012043
Dundi Ravitejae232cf12018-05-16 18:34:34 +053012044 *ll_stats_get_req = *get_stats_req;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012045
Dundi Ravitejae232cf12018-05-16 18:34:34 +053012046 mac->sme.ll_stats_context = context;
12047 if (sme_acquire_global_lock(&mac->sme) == QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012048 /* Serialize the req through MC thread */
Dundi Ravitejae232cf12018-05-16 18:34:34 +053012049 message.bodyptr = ll_stats_get_req;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012050 message.type = WMA_LINK_LAYER_STATS_GET_REQ;
Dundi Ravitejae232cf12018-05-16 18:34:34 +053012051 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
12052 NO_SESSION, message.type);
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012053 status = scheduler_post_message(QDF_MODULE_ID_SME,
12054 QDF_MODULE_ID_WMA,
12055 QDF_MODULE_ID_WMA, &message);
Dundi Ravitejae232cf12018-05-16 18:34:34 +053012056 if (!QDF_IS_STATUS_SUCCESS(status)) {
12057 sme_err("Not able to post WMA_LL_STATS_GET_REQ");
12058 qdf_mem_free(ll_stats_get_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012059 }
Dundi Ravitejae232cf12018-05-16 18:34:34 +053012060 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012061 } else {
Dundi Ravitejae232cf12018-05-16 18:34:34 +053012062 sme_err("sme_acquire_global_lock error");
12063 qdf_mem_free(ll_stats_get_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012064 }
12065
12066 return status;
12067}
12068
Jeff Johnson959f3692018-07-03 17:30:40 -070012069QDF_STATUS sme_set_link_layer_stats_ind_cb(mac_handle_t mac_handle,
12070 link_layer_stats_cb callback)
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012071{
Jeff Johnson959f3692018-07-03 17:30:40 -070012072 QDF_STATUS status;
12073 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012074
Jeff Johnson959f3692018-07-03 17:30:40 -070012075 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012076 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson959f3692018-07-03 17:30:40 -070012077 mac->sme.link_layer_stats_cb = callback;
12078 sme_release_global_lock(&mac->sme);
12079 } else {
12080 sme_err("sme_acquire_global_lock error");
12081 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012082
12083 return status;
12084}
12085
Arun Khandavalli4b55da72016-07-19 19:55:01 +053012086/**
Zhang Qiana6e9c102016-12-22 16:47:24 +080012087 * sme_set_link_layer_ext_cb() - Register callback for link layer statistics
12088 * @hal: Mac global handle
12089 * @ll_stats_ext_cb: HDD callback which needs to be invoked after getting
12090 * status notification from FW
12091 *
12092 * Return: eHalStatus
12093 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080012094QDF_STATUS sme_set_link_layer_ext_cb(mac_handle_t hal, void (*ll_stats_ext_cb)
Jeff Johnson2d292122018-06-02 21:02:02 -070012095 (hdd_handle_t callback_ctx, tSirLLStatsResults
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012096 *rsp))
Zhang Qiana6e9c102016-12-22 16:47:24 +080012097{
12098 QDF_STATUS status;
12099 tpAniSirGlobal mac = PMAC_STRUCT(hal);
12100
12101 status = sme_acquire_global_lock(&mac->sme);
12102 if (status == QDF_STATUS_SUCCESS) {
12103 mac->sme.link_layer_stats_ext_cb = ll_stats_ext_cb;
12104 sme_release_global_lock(&mac->sme);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012105 } else
Zhang Qiana6e9c102016-12-22 16:47:24 +080012106 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12107 "%s: sme_qcquire_global_lock error", __func__);
Zhang Qiana6e9c102016-12-22 16:47:24 +080012108 return status;
12109}
12110
12111/**
Arun Khandavalli4b55da72016-07-19 19:55:01 +053012112 * sme_reset_link_layer_stats_ind_cb() - SME API to reset link layer stats
12113 * indication
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012114 * @mac_handle: Hal Handle
Arun Khandavalli4b55da72016-07-19 19:55:01 +053012115 *
12116 * This function reset's the link layer stats indication
12117 *
12118 * Return: QDF_STATUS Enumeration
12119 */
12120
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012121QDF_STATUS sme_reset_link_layer_stats_ind_cb(mac_handle_t mac_handle)
Arun Khandavalli4b55da72016-07-19 19:55:01 +053012122{
12123 QDF_STATUS status;
12124 tpAniSirGlobal pmac;
12125
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012126 if (!mac_handle) {
Arun Khandavalli4b55da72016-07-19 19:55:01 +053012127 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012128 FL("mac_handle is not valid"));
Arun Khandavalli4b55da72016-07-19 19:55:01 +053012129 return QDF_STATUS_E_INVAL;
12130 }
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012131 pmac = PMAC_STRUCT(mac_handle);
Arun Khandavalli4b55da72016-07-19 19:55:01 +053012132
12133 status = sme_acquire_global_lock(&pmac->sme);
12134 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson959f3692018-07-03 17:30:40 -070012135 pmac->sme.link_layer_stats_cb = NULL;
Arun Khandavalli4b55da72016-07-19 19:55:01 +053012136 sme_release_global_lock(&pmac->sme);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012137 } else
12138 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12139 "%s: sme_acquire_global_lock error", __func__);
Arun Khandavalli4b55da72016-07-19 19:55:01 +053012140
12141 return status;
12142}
12143
Zhang Qian73c348a2017-03-13 16:15:55 +080012144/**
12145 * sme_ll_stats_set_thresh - set threshold for mac counters
12146 * @hal, hal layer handle
12147 * @threshold, threshold for mac counters
12148 *
12149 * Return: QDF_STATUS Enumeration
12150 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080012151QDF_STATUS sme_ll_stats_set_thresh(mac_handle_t hal,
Zhang Qian73c348a2017-03-13 16:15:55 +080012152 struct sir_ll_ext_stats_threshold *threshold)
12153{
12154 QDF_STATUS status;
12155 tpAniSirGlobal mac;
Rajeev Kumar658e8492017-12-13 11:35:41 -080012156 struct scheduler_msg message = {0};
Zhang Qian73c348a2017-03-13 16:15:55 +080012157 struct sir_ll_ext_stats_threshold *thresh;
12158
12159 if (!threshold) {
12160 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12161 FL("threshold is not valid"));
12162 return QDF_STATUS_E_INVAL;
12163 }
12164
12165 if (!hal) {
12166 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12167 FL("hal is not valid"));
12168 return QDF_STATUS_E_INVAL;
12169 }
12170 mac = PMAC_STRUCT(hal);
12171
12172 thresh = qdf_mem_malloc(sizeof(*thresh));
Arif Hussain0ef77082018-10-10 16:42:53 -070012173 if (!thresh)
Zhang Qian73c348a2017-03-13 16:15:55 +080012174 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070012175
Zhang Qian73c348a2017-03-13 16:15:55 +080012176 *thresh = *threshold;
12177
12178 status = sme_acquire_global_lock(&mac->sme);
12179 if (QDF_IS_STATUS_SUCCESS(status)) {
12180 /* Serialize the req through MC thread */
12181 message.bodyptr = thresh;
12182 message.type = WDA_LINK_LAYER_STATS_SET_THRESHOLD;
12183 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
12184 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012185 status = scheduler_post_message(QDF_MODULE_ID_SME,
12186 QDF_MODULE_ID_WMA,
12187 QDF_MODULE_ID_WMA, &message);
Zhang Qian73c348a2017-03-13 16:15:55 +080012188 if (!QDF_IS_STATUS_SUCCESS(status)) {
12189 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12190 "%s: not able to post WDA_LL_STATS_GET_REQ",
12191 __func__);
12192 qdf_mem_free(thresh);
12193 }
12194 sme_release_global_lock(&mac->sme);
12195 } else {
12196 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12197 FL("sme_acquire_global_lock error"));
12198 qdf_mem_free(thresh);
12199 }
12200 return status;
12201}
Arun Khandavalli4b55da72016-07-19 19:55:01 +053012202
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012203#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
12204
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053012205#ifdef WLAN_POWER_DEBUGFS
12206/**
12207 * sme_power_debug_stats_req() - SME API to collect Power debug stats
12208 * @callback_fn: Pointer to the callback function for Power stats event
12209 * @power_stats_context: Pointer to context
12210 *
12211 * Return: QDF_STATUS
12212 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080012213QDF_STATUS sme_power_debug_stats_req(mac_handle_t hal, void (*callback_fn)
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053012214 (struct power_stats_response *response,
12215 void *context), void *power_stats_context)
12216{
12217 QDF_STATUS status = QDF_STATUS_SUCCESS;
12218 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012219 struct scheduler_msg msg = {0};
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053012220
12221 status = sme_acquire_global_lock(&mac_ctx->sme);
12222 if (QDF_IS_STATUS_SUCCESS(status)) {
12223 if (!callback_fn) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012224 sme_err("Indication callback did not registered");
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053012225 sme_release_global_lock(&mac_ctx->sme);
12226 return QDF_STATUS_E_FAILURE;
12227 }
12228
12229 mac_ctx->sme.power_debug_stats_context = power_stats_context;
12230 mac_ctx->sme.power_stats_resp_callback = callback_fn;
12231 msg.bodyptr = NULL;
12232 msg.type = WMA_POWER_DEBUG_STATS_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012233 status = scheduler_post_message(QDF_MODULE_ID_SME,
12234 QDF_MODULE_ID_WMA,
12235 QDF_MODULE_ID_WMA, &msg);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012236 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012237 sme_err("not able to post WDA_POWER_DEBUG_STATS_REQ");
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053012238 sme_release_global_lock(&mac_ctx->sme);
12239 }
12240 return status;
12241}
12242#endif
12243
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012244#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070012245/**
12246 * sme_update_roam_key_mgmt_offload_enabled() - enable/disable key mgmt offload
12247 * This is a synchronous call
12248 * @hal_ctx: The handle returned by mac_open.
12249 * @session_id: Session Identifier
12250 * @key_mgmt_offload_enabled: key mgmt enable/disable flag
Deepak Dhamdhere828f1892017-02-09 11:51:19 -080012251 * @pmkid_modes: PMKID modes of PMKSA caching and OKC
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070012252 * Return: QDF_STATUS_SUCCESS - SME updated config successfully.
12253 * Other status means SME is failed to update.
12254 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012255
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080012256QDF_STATUS sme_update_roam_key_mgmt_offload_enabled(mac_handle_t hal_ctx,
Deepak Dhamdhere828f1892017-02-09 11:51:19 -080012257 uint8_t session_id,
12258 bool key_mgmt_offload_enabled,
12259 struct pmkid_mode_bits *pmkid_modes)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012260{
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070012261 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_ctx);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012262 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012263
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070012264 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012265 if (QDF_IS_STATUS_SUCCESS(status)) {
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070012266 if (CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +053012267 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070012268 "%s: LFR3: key_mgmt_offload_enabled changed to %d",
12269 __func__, key_mgmt_offload_enabled);
12270 status = csr_roam_set_key_mgmt_offload(mac_ctx,
12271 session_id,
12272 key_mgmt_offload_enabled,
Deepak Dhamdhere828f1892017-02-09 11:51:19 -080012273 pmkid_modes);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012274 } else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012275 status = QDF_STATUS_E_INVAL;
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070012276 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012277 }
12278
12279 return status;
12280}
Prashanth Bhattabfc25292015-11-05 11:16:21 -080012281#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012282
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012283/*
12284 * sme_get_temperature() -
12285 * SME API to get the pdev temperature
12286 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012287 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012288 * temperature context
12289 * pCallbackfn: callback fn with response (temperature)
12290 * Return QDF_STATUS
12291 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012292QDF_STATUS sme_get_temperature(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012293 void *tempContext,
12294 void (*pCallbackfn)(int temperature,
12295 void *pContext))
12296{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012297 QDF_STATUS status = QDF_STATUS_SUCCESS;
12298 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012299 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012300 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012301
12302 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012303 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012304 if ((NULL == pCallbackfn) &&
12305 (NULL == pMac->sme.pGetTemperatureCb)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012306 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012307 "Indication Call back did not registered");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012308 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012309 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012310 } else if (NULL != pCallbackfn) {
12311 pMac->sme.pTemperatureCbContext = tempContext;
12312 pMac->sme.pGetTemperatureCb = pCallbackfn;
12313 }
12314 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012315 message.bodyptr = NULL;
12316 message.type = WMA_GET_TEMPERATURE_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012317 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
12318 QDF_MODULE_ID_WMA,
12319 QDF_MODULE_ID_WMA,
12320 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012321 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012322 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012323 FL("Post Get Temperature msg fail"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012324 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012325 }
12326 sme_release_global_lock(&pMac->sme);
12327 }
12328 return status;
12329}
12330
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012331/*
12332 * sme_set_scanning_mac_oui() -
12333 * SME API to set scanning mac oui
12334 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012335 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012336 * pScanMacOui: Scanning Mac Oui (input 3 bytes)
12337 * Return QDF_STATUS
12338 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012339QDF_STATUS sme_set_scanning_mac_oui(mac_handle_t mac_handle, tSirScanMacOui
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012340 *pScanMacOui)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012341{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012342 QDF_STATUS status = QDF_STATUS_SUCCESS;
12343 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012344 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012345 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012346
12347 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012348 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012349 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012350 message.bodyptr = pScanMacOui;
12351 message.type = WMA_SET_SCAN_MAC_OUI_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012352 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
12353 QDF_MODULE_ID_WMA,
12354 QDF_MODULE_ID_WMA,
12355 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012356 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012357 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012358 FL("Msg post Set Scan Mac OUI failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012359 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012360 }
12361 sme_release_global_lock(&pMac->sme);
12362 }
12363 return status;
12364}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012365
12366#ifdef DHCP_SERVER_OFFLOAD
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012367/*
12368 * sme_set_dhcp_srv_offload() -
12369 * SME API to set DHCP server offload info
12370 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012371 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012372 * pDhcpSrvInfo : DHCP server offload info struct
12373 * Return QDF_STATUS
12374 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012375QDF_STATUS sme_set_dhcp_srv_offload(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012376 tSirDhcpSrvOffloadInfo *pDhcpSrvInfo)
12377{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012378 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012379 tSirDhcpSrvOffloadInfo *pSmeDhcpSrvInfo;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012380 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012381 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012382
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012383 pSmeDhcpSrvInfo = qdf_mem_malloc(sizeof(*pSmeDhcpSrvInfo));
Arif Hussain0ef77082018-10-10 16:42:53 -070012384 if (!pSmeDhcpSrvInfo)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012385 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012386
12387 *pSmeDhcpSrvInfo = *pDhcpSrvInfo;
12388
12389 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012390 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012391 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012392 message.type = WMA_SET_DHCP_SERVER_OFFLOAD_CMD;
12393 message.bodyptr = pSmeDhcpSrvInfo;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012394
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012395 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012396 (scheduler_post_message(QDF_MODULE_ID_SME,
12397 QDF_MODULE_ID_WMA,
12398 QDF_MODULE_ID_WMA,
12399 &message))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012400 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Varun Reddy Yeturu7b2a6572017-06-15 11:07:28 -070012401 "%s:WMA_SET_DHCP_SERVER_OFFLOAD_CMD failed",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012402 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012403 qdf_mem_free(pSmeDhcpSrvInfo);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012404 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012405 }
12406 sme_release_global_lock(&pMac->sme);
12407 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012408 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012409 "%s: sme_acquire_global_lock error!", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012410 qdf_mem_free(pSmeDhcpSrvInfo);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012411 }
12412
12413 return status;
12414}
12415#endif /* DHCP_SERVER_OFFLOAD */
12416
Krunal Soniaadaa272017-10-04 16:42:55 -070012417QDF_STATUS sme_send_unit_test_cmd(uint32_t vdev_id, uint32_t module_id,
12418 uint32_t arg_count, uint32_t *arg)
12419{
12420 return wma_form_unit_test_cmd_and_send(vdev_id, module_id,
12421 arg_count, arg);
12422}
12423
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012424#ifdef WLAN_FEATURE_GPIO_LED_FLASHING
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012425/*
12426 * sme_set_led_flashing() -
12427 * API to set the Led flashing parameters.
12428 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012429 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012430 * x0, x1 - led flashing parameters
12431 * Return QDF_STATUS
12432 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012433QDF_STATUS sme_set_led_flashing(mac_handle_t mac_handle, uint8_t type,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012434 uint32_t x0, uint32_t x1)
12435{
Jeff Johnson5a6b6602017-10-04 14:44:30 -070012436 QDF_STATUS status;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012437 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012438 struct scheduler_msg message = {0};
Jeff Johnson5a6b6602017-10-04 14:44:30 -070012439 struct flashing_req_params *ledflashing;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012440
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012441 ledflashing = qdf_mem_malloc(sizeof(*ledflashing));
Arif Hussain0ef77082018-10-10 16:42:53 -070012442 if (!ledflashing)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012443 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012444
Jeff Johnson5a6b6602017-10-04 14:44:30 -070012445 ledflashing->req_id = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012446 ledflashing->pattern_id = type;
12447 ledflashing->led_x0 = x0;
12448 ledflashing->led_x1 = x1;
12449
12450 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012451 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012452 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012453 message.bodyptr = ledflashing;
12454 message.type = WMA_LED_FLASHING_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012455 status = scheduler_post_message(QDF_MODULE_ID_SME,
12456 QDF_MODULE_ID_WMA,
12457 QDF_MODULE_ID_WMA, &message);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012458 sme_release_global_lock(&pMac->sme);
12459 }
Jeff Johnson5a6b6602017-10-04 14:44:30 -070012460 if (!QDF_IS_STATUS_SUCCESS(status))
12461 qdf_mem_free(ledflashing);
12462
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012463 return status;
12464}
12465#endif
12466
12467/**
12468 * sme_handle_dfS_chan_scan() - handle DFS channel configuration
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012469 * @mac_handle: corestack handler
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012470 * @dfs_flag: flag indicating dfs channel enable/disable
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012471 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012472 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012473QDF_STATUS sme_handle_dfs_chan_scan(mac_handle_t mac_handle, uint8_t dfs_flag)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012474{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012475 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012476 tpAniSirGlobal mac = PMAC_STRUCT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012477
12478 status = sme_acquire_global_lock(&mac->sme);
12479
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012480 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012481
12482 mac->scan.fEnableDFSChnlScan = dfs_flag;
12483
12484 /* update the channel list to the firmware */
12485 status = csr_update_channel_list(mac);
12486
12487 sme_release_global_lock(&mac->sme);
12488 }
12489
12490 return status;
12491}
12492
Min Liu5eaf7242018-03-13 17:32:15 +080012493/**
12494 * sme_enable_dfS_chan_scan() - set DFS channel scan enable/disable
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012495 * @mac_handle: corestack handler
Min Liu5eaf7242018-03-13 17:32:15 +080012496 * @dfs_flag: flag indicating dfs channel enable/disable
12497 * Return: QDF_STATUS
12498 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012499QDF_STATUS sme_enable_dfs_chan_scan(mac_handle_t mac_handle, uint8_t dfs_flag)
Min Liu5eaf7242018-03-13 17:32:15 +080012500{
12501 QDF_STATUS status = QDF_STATUS_SUCCESS;
12502 tpAniSirGlobal mac;
12503
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012504 if (!mac_handle) {
Min Liu5eaf7242018-03-13 17:32:15 +080012505 sme_err("hal is NULL");
12506 return QDF_STATUS_E_INVAL;
12507 }
12508
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012509 mac = PMAC_STRUCT(mac_handle);
Min Liu5eaf7242018-03-13 17:32:15 +080012510
12511 mac->scan.fEnableDFSChnlScan = dfs_flag;
12512
12513 return status;
12514}
12515
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053012516#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
12517/**
12518 * sme_validate_sap_channel_switch() - validate target channel switch w.r.t
12519 * concurreny rules set to avoid channel interference.
12520 * @hal - Hal context
12521 * @sap_ch - channel to switch
12522 * @sap_phy_mode - phy mode of SAP
12523 * @cc_switch_mode - concurreny switch mode
12524 * @session_id - sme session id.
12525 *
12526 * Return: true if there is no channel interference else return false
12527 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080012528bool sme_validate_sap_channel_switch(mac_handle_t hal,
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053012529 uint16_t sap_ch, eCsrPhyMode sap_phy_mode, uint8_t cc_switch_mode,
12530 uint8_t session_id)
12531{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012532 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053012533 tpAniSirGlobal mac = PMAC_STRUCT(hal);
gaurank kathpalia14e2f912017-08-31 14:51:45 +053012534 struct csr_roam_session *session = CSR_GET_SESSION(mac, session_id);
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053012535 uint16_t intf_channel = 0;
12536
12537 if (!session)
12538 return false;
12539
12540 session->ch_switch_in_progress = true;
12541 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012542 if (QDF_IS_STATUS_SUCCESS(status)) {
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053012543 intf_channel = csr_check_concurrent_channel_overlap(mac, sap_ch,
12544 sap_phy_mode,
12545 cc_switch_mode);
12546 sme_release_global_lock(&mac->sme);
12547 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012548 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053012549 FL("sme_acquire_global_lock error!"));
12550 session->ch_switch_in_progress = false;
12551 return false;
12552 }
12553
12554 session->ch_switch_in_progress = false;
12555 return (intf_channel == 0) ? true : false;
12556}
12557#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012558
12559/**
12560 * sme_configure_stats_avg_factor() - function to config avg. stats factor
12561 * @hal: hal
12562 * @session_id: session ID
12563 * @stats_avg_factor: average stats factor
12564 *
12565 * This function configures the stats avg factor in firmware
12566 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012567 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012568 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080012569QDF_STATUS sme_configure_stats_avg_factor(mac_handle_t hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012570 uint16_t stats_avg_factor)
12571{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012572 struct scheduler_msg msg = {0};
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012573 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012574 tpAniSirGlobal mac = PMAC_STRUCT(hal);
12575 struct sir_stats_avg_factor *stats_factor;
12576
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012577 stats_factor = qdf_mem_malloc(sizeof(*stats_factor));
Arif Hussain0ef77082018-10-10 16:42:53 -070012578 if (!stats_factor)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012579 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012580
12581 status = sme_acquire_global_lock(&mac->sme);
12582
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012583 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012584
12585 stats_factor->vdev_id = session_id;
12586 stats_factor->stats_avg_factor = stats_avg_factor;
12587
12588 /* serialize the req through MC thread */
12589 msg.type = SIR_HAL_CONFIG_STATS_FACTOR;
12590 msg.bodyptr = stats_factor;
12591
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012592 if (!QDF_IS_STATUS_SUCCESS(
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012593 scheduler_post_message(QDF_MODULE_ID_SME,
12594 QDF_MODULE_ID_WMA,
12595 QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012596 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012597 "%s: Not able to post SIR_HAL_CONFIG_STATS_FACTOR to WMA!",
12598 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012599 qdf_mem_free(stats_factor);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012600 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012601 }
12602 sme_release_global_lock(&mac->sme);
12603 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012604 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012605 "%s: sme_acquire_global_lock error!",
12606 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012607 qdf_mem_free(stats_factor);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012608 }
12609
12610 return status;
12611}
12612
12613/**
12614 * sme_configure_guard_time() - function to configure guard time
12615 * @hal: hal
12616 * @session_id: session id
12617 * @guard_time: guard time
12618 *
12619 * This function configures the guard time in firmware
12620 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012621 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012622 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080012623QDF_STATUS sme_configure_guard_time(mac_handle_t hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012624 uint32_t guard_time)
12625{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012626 struct scheduler_msg msg = {0};
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012627 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012628 tpAniSirGlobal mac = PMAC_STRUCT(hal);
12629 struct sir_guard_time_request *g_time;
12630
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012631 g_time = qdf_mem_malloc(sizeof(*g_time));
Arif Hussain0ef77082018-10-10 16:42:53 -070012632 if (!g_time)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012633 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012634
12635 status = sme_acquire_global_lock(&mac->sme);
12636
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012637 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012638
12639 g_time->vdev_id = session_id;
12640 g_time->guard_time = guard_time;
12641
12642 /* serialize the req through MC thread */
12643 msg.type = SIR_HAL_CONFIG_GUARD_TIME;
12644 msg.bodyptr = g_time;
12645
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012646 if (!QDF_IS_STATUS_SUCCESS(
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012647 scheduler_post_message(QDF_MODULE_ID_SME,
12648 QDF_MODULE_ID_WMA,
12649 QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012650 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012651 "%s: Not able to post SIR_HAL_CONFIG_GUARD_TIME to WMA!",
12652 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012653 qdf_mem_free(g_time);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012654 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012655 }
12656 sme_release_global_lock(&mac->sme);
12657 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012658 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012659 "%s: sme_acquire_global_lock error!",
12660 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012661 qdf_mem_free(g_time);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012662 }
12663
12664 return status;
12665}
12666
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012667/*
12668 * sme_wifi_start_logger() - Send the start/stop logging command to WMA
12669 * to either start/stop logging
12670 * @hal: HAL context
12671 * @start_log: Structure containing the wifi start logger params
12672 *
12673 * This function sends the start/stop logging command to WMA
12674 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012675 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012676 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080012677QDF_STATUS sme_wifi_start_logger(mac_handle_t hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012678 struct sir_wifi_start_log start_log)
12679{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012680 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012681 tpAniSirGlobal mac = PMAC_STRUCT(hal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012682 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012683 struct sir_wifi_start_log *req_msg;
12684 uint32_t len;
12685
12686 len = sizeof(*req_msg);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012687 req_msg = qdf_mem_malloc(len);
Arif Hussain0ef77082018-10-10 16:42:53 -070012688 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012689 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012690
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012691 req_msg->verbose_level = start_log.verbose_level;
Poddar, Siddartheefe3482016-09-21 18:12:59 +053012692 req_msg->is_iwpriv_command = start_log.is_iwpriv_command;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012693 req_msg->ring_id = start_log.ring_id;
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -080012694 req_msg->ini_triggered = start_log.ini_triggered;
12695 req_msg->user_triggered = start_log.user_triggered;
Poddar, Siddarth176c4362016-10-03 12:25:00 +053012696 req_msg->size = start_log.size;
Poddar, Siddarthab99a272017-04-10 12:53:26 +053012697 req_msg->is_pktlog_buff_clear = start_log.is_pktlog_buff_clear;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012698
12699 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012700 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012701 sme_err("sme_acquire_global_lock failed(status=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012702 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012703 return status;
12704 }
12705
12706 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012707 message.bodyptr = req_msg;
12708 message.type = SIR_HAL_START_STOP_LOGGING;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012709 status = scheduler_post_message(QDF_MODULE_ID_SME,
12710 QDF_MODULE_ID_WMA,
12711 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012712 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012713 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012714 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012715 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012716 }
12717 sme_release_global_lock(&mac->sme);
12718
12719 return status;
12720}
12721
12722/**
12723 * sme_neighbor_middle_of_roaming() - Function to know if
12724 * STA is in the middle of roaming states
12725 * @hal: Handle returned by macOpen
12726 * @sessionId: sessionId of the STA session
12727 *
12728 * This function is a wrapper to call
12729 * csr_neighbor_middle_of_roaming to know STA is in the
12730 * middle of roaming states
12731 *
12732 * Return: True or False
12733 *
12734 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012735bool sme_neighbor_middle_of_roaming(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012736{
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012737 tpAniSirGlobal mac_ctx = PMAC_STRUCT(mac_handle);
Sandeep Puligillaca631612016-11-08 11:53:52 -080012738 bool val = false;
12739
12740 if (CSR_IS_SESSION_VALID(mac_ctx, sessionId))
12741 val = csr_neighbor_middle_of_roaming(mac_ctx, sessionId);
12742 else
Rajeev Kumar9176ca42018-05-03 09:20:40 -070012743 sme_debug("Invalid Session: %d", sessionId);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012744
Sandeep Puligillaca631612016-11-08 11:53:52 -080012745 return val;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012746}
12747
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +053012748bool sme_is_any_session_in_middle_of_roaming(mac_handle_t hal)
12749{
12750 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
12751 uint8_t session_id;
12752
12753 for (session_id = 0; session_id < CSR_ROAM_SESSION_MAX; session_id++) {
12754 if (CSR_IS_SESSION_VALID(mac_ctx, session_id) &&
12755 csr_neighbor_middle_of_roaming(mac_ctx, session_id))
12756 return true;
12757 }
12758
12759 return false;
12760}
12761
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012762/*
12763 * sme_send_flush_logs_cmd_to_fw() - Flush FW logs
12764 * @mac: MAC handle
12765 *
12766 * This function is used to send the command that will
12767 * be used to flush the logs in the firmware
12768 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070012769 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012770 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012771QDF_STATUS sme_send_flush_logs_cmd_to_fw(tpAniSirGlobal mac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012772{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012773 QDF_STATUS status;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012774 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012775
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012776 /* Serialize the req through MC thread */
12777 message.bodyptr = NULL;
12778 message.type = SIR_HAL_FLUSH_LOG_TO_FW;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012779 status = scheduler_post_message(QDF_MODULE_ID_SME,
12780 QDF_MODULE_ID_WMA,
12781 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012782 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012783 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012784 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012785 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012786 return status;
12787}
12788
Jeff Johnsona1e92612017-09-24 15:33:44 -070012789QDF_STATUS sme_enable_uapsd_for_ac(uint8_t sta_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012790 sme_ac_enum_type ac, uint8_t tid,
12791 uint8_t pri, uint32_t srvc_int,
12792 uint32_t sus_int,
Abhishek Singh12be60f2017-08-11 13:52:42 +053012793 enum sme_qos_wmm_dir_type dir,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012794 uint8_t psb, uint32_t sessionId,
12795 uint32_t delay_interval)
12796{
12797 void *wma_handle;
12798 t_wma_trigger_uapsd_params uapsd_params;
12799 enum uapsd_ac access_category;
12800
12801 if (!psb) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012802 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012803 "No need to configure auto trigger:psb is 0");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012804 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012805 }
12806
Anurag Chouhan6d760662016-02-20 16:05:43 +053012807 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012808 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012809 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012810 "wma_handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012811 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012812 }
12813
12814 switch (ac) {
12815 case SME_AC_BK:
12816 access_category = UAPSD_BK;
12817 break;
12818 case SME_AC_BE:
12819 access_category = UAPSD_BE;
12820 break;
12821 case SME_AC_VI:
12822 access_category = UAPSD_VI;
12823 break;
12824 case SME_AC_VO:
12825 access_category = UAPSD_VO;
12826 break;
12827 default:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012828 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012829 }
12830
12831 uapsd_params.wmm_ac = access_category;
12832 uapsd_params.user_priority = pri;
12833 uapsd_params.service_interval = srvc_int;
12834 uapsd_params.delay_interval = delay_interval;
12835 uapsd_params.suspend_interval = sus_int;
12836
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012837 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012838 wma_trigger_uapsd_params(wma_handle, sessionId, &uapsd_params)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012839 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012840 "Failed to Trigger Uapsd params for sessionId %d",
12841 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012842 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012843 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012844 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012845}
12846
Jeff Johnsona1e92612017-09-24 15:33:44 -070012847QDF_STATUS sme_disable_uapsd_for_ac(uint8_t sta_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012848 sme_ac_enum_type ac,
12849 uint32_t sessionId)
12850{
12851 void *wma_handle;
12852 enum uapsd_ac access_category;
12853
12854 switch (ac) {
12855 case SME_AC_BK:
12856 access_category = UAPSD_BK;
12857 break;
12858 case SME_AC_BE:
12859 access_category = UAPSD_BE;
12860 break;
12861 case SME_AC_VI:
12862 access_category = UAPSD_VI;
12863 break;
12864 case SME_AC_VO:
12865 access_category = UAPSD_VO;
12866 break;
12867 default:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012868 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012869 }
12870
Anurag Chouhan6d760662016-02-20 16:05:43 +053012871 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012872 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012873 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012874 "wma handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012875 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012876 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012877 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012878 wma_disable_uapsd_per_ac(wma_handle, sessionId, access_category)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012879 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012880 "Failed to disable uapsd for ac %d for sessionId %d",
12881 ac, sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012882 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012883 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012884 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012885}
12886
12887/**
12888 * sme_update_nss() - SME API to change the number for spatial streams
12889 * (1 or 2)
12890 * @hal: Handle returned by mac open
12891 * @nss: Number of spatial streams
12892 *
12893 * This function is used to update the number of spatial streams supported.
12894 *
12895 * Return: Success upon successfully changing nss else failure
12896 *
12897 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012898QDF_STATUS sme_update_nss(mac_handle_t mac_handle, uint8_t nss)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012899{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012900 QDF_STATUS status;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012901 tpAniSirGlobal mac_ctx = PMAC_STRUCT(mac_handle);
Vignesh Viswanathan21c58cb2018-05-24 15:53:58 +053012902 uint32_t i;
12903 struct mlme_ht_capabilities_info *ht_cap_info;
gaurank kathpalia14e2f912017-08-31 14:51:45 +053012904 struct csr_roam_session *csr_session;
Abhinav Kumarb074f2f2018-09-15 15:32:11 +053012905 struct mlme_vht_capabilities_info vht_cap_info;
12906
12907 vht_cap_info = mac_ctx->mlme_cfg->vht_caps.vht_cap_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012908
12909 status = sme_acquire_global_lock(&mac_ctx->sme);
12910
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012911 if (QDF_STATUS_SUCCESS == status) {
Abhinav Kumarb074f2f2018-09-15 15:32:11 +053012912 vht_cap_info.enable2x2 = (nss == 1) ? 0 : 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012913
12914 /* get the HT capability info*/
Vignesh Viswanathan21c58cb2018-05-24 15:53:58 +053012915 ht_cap_info = &mac_ctx->mlme_cfg->ht_caps.ht_cap_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012916
12917 for (i = 0; i < CSR_ROAM_SESSION_MAX; i++) {
12918 if (CSR_IS_SESSION_VALID(mac_ctx, i)) {
12919 csr_session = &mac_ctx->roam.roamSession[i];
12920 csr_session->htConfig.ht_tx_stbc =
Vignesh Viswanathan78182502018-08-06 15:13:30 +053012921 ht_cap_info->tx_stbc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012922 }
12923 }
12924
12925 sme_release_global_lock(&mac_ctx->sme);
12926 }
12927 return status;
12928}
12929
12930/**
Archana Ramachandran5041b252016-04-25 14:29:25 -070012931 * sme_update_user_configured_nss() - sets the nss based on user request
12932 * @hal: Pointer to HAL
12933 * @nss: number of streams
12934 *
12935 * Return: None
12936 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080012937void sme_update_user_configured_nss(mac_handle_t hal, uint8_t nss)
Archana Ramachandran5041b252016-04-25 14:29:25 -070012938{
12939 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
12940
12941 mac_ctx->user_configured_nss = nss;
12942}
12943
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080012944int sme_update_tx_bfee_supp(mac_handle_t hal, uint8_t session_id,
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070012945 uint8_t cfg_val)
12946{
Abhinav Kumarb074f2f2018-09-15 15:32:11 +053012947 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Jeff Johnsonc18469b2018-06-11 06:48:59 -070012948
Abhinav Kumarb074f2f2018-09-15 15:32:11 +053012949 mac_ctx->mlme_cfg->vht_caps.vht_cap_info.su_bformee = cfg_val;
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070012950
12951 return sme_update_he_tx_bfee_supp(hal, session_id, cfg_val);
12952}
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070012953
12954int sme_update_tx_bfee_nsts(mac_handle_t hal, uint8_t session_id,
12955 uint8_t usr_cfg_val, uint8_t nsts_val)
12956{
12957 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070012958 uint8_t nsts_set_val;
12959
12960 mac_ctx->usr_cfg_tx_bfee_nsts = usr_cfg_val;
12961 if (usr_cfg_val)
12962 nsts_set_val = usr_cfg_val;
12963 else
12964 nsts_set_val = nsts_val;
Dustin Brown48f27fe2018-10-09 12:47:57 -070012965
12966 mac_ctx->mlme_cfg->vht_caps.vht_cap_info.tx_bfee_ant_supp =
12967 nsts_set_val;
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070012968
Kiran Kumar Lokere86e85592018-07-18 15:34:24 -070012969 if (usr_cfg_val)
12970 sme_set_he_tx_bf_cbf_rates(session_id);
12971
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070012972 return sme_update_he_tx_bfee_nsts(hal, session_id, nsts_set_val);
12973}
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080012974#ifdef WLAN_FEATURE_11AX
Jinwei Chenffaa4672018-08-30 16:55:09 +080012975void sme_update_tgt_he_cap(mac_handle_t mac_handle,
12976 struct wma_tgt_cfg *cfg,
12977 tDot11fIEhe_cap *he_cap_ini)
Jinwei Chen998a1a02018-06-20 17:20:34 +080012978{
Jinwei Chenef742dc2018-06-27 12:57:50 +080012979 tpAniSirGlobal mac_ctx = PMAC_STRUCT(mac_handle);
Jinwei Chen998a1a02018-06-20 17:20:34 +080012980
12981 qdf_mem_copy(&mac_ctx->he_cap_2g,
Jinwei Chenef742dc2018-06-27 12:57:50 +080012982 &cfg->he_cap_2g,
12983 sizeof(tDot11fIEhe_cap));
Jinwei Chen998a1a02018-06-20 17:20:34 +080012984
12985 qdf_mem_copy(&mac_ctx->he_cap_5g,
Jinwei Chenef742dc2018-06-27 12:57:50 +080012986 &cfg->he_cap_5g,
12987 sizeof(tDot11fIEhe_cap));
Jinwei Chenffaa4672018-08-30 16:55:09 +080012988
12989 /* modify HE Caps field according to INI setting */
12990 mac_ctx->he_cap_2g.bfee_sts_lt_80 =
12991 QDF_MIN(cfg->he_cap_2g.bfee_sts_lt_80,
12992 he_cap_ini->bfee_sts_lt_80);
12993
12994 mac_ctx->he_cap_5g.bfee_sts_lt_80 =
12995 QDF_MIN(cfg->he_cap_5g.bfee_sts_lt_80,
12996 he_cap_ini->bfee_sts_lt_80);
Jinwei Chen998a1a02018-06-20 17:20:34 +080012997}
12998
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080012999void sme_update_he_cap_nss(mac_handle_t hal, uint8_t session_id,
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080013000 uint8_t nss)
13001{
13002 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
13003 struct csr_roam_session *csr_session;
13004 uint32_t tx_mcs_map = 0;
13005 uint32_t rx_mcs_map = 0;
Kiran Kumar Lokere8dba1892018-07-24 17:09:52 -070013006 uint32_t mcs_map = 0;
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080013007
13008 if (!nss || (nss > 2)) {
13009 sme_err("invalid Nss value %d", nss);
13010 }
13011 csr_session = CSR_GET_SESSION(mac_ctx, session_id);
Jeff Johnsonc18469b2018-06-11 06:48:59 -070013012 sme_cfg_get_int(hal, WNI_CFG_HE_RX_MCS_MAP_LT_80, &rx_mcs_map);
13013 sme_cfg_get_int(hal, WNI_CFG_HE_TX_MCS_MAP_LT_80, &tx_mcs_map);
Kiran Kumar Lokere8dba1892018-07-24 17:09:52 -070013014 mcs_map = rx_mcs_map & 0x3;
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080013015 if (nss == 1) {
13016 tx_mcs_map = HE_SET_MCS_4_NSS(tx_mcs_map, HE_MCS_DISABLE, 2);
13017 rx_mcs_map = HE_SET_MCS_4_NSS(rx_mcs_map, HE_MCS_DISABLE, 2);
13018 } else {
Kiran Kumar Lokere8dba1892018-07-24 17:09:52 -070013019 tx_mcs_map = HE_SET_MCS_4_NSS(tx_mcs_map, mcs_map, 2);
13020 rx_mcs_map = HE_SET_MCS_4_NSS(rx_mcs_map, mcs_map, 2);
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080013021 }
13022 sme_info("new HE Nss MCS MAP: Rx 0x%0X, Tx: 0x%0X",
13023 rx_mcs_map, tx_mcs_map);
Jeff Johnsonc18469b2018-06-11 06:48:59 -070013024 sme_cfg_set_int(hal, WNI_CFG_HE_RX_MCS_MAP_LT_80, rx_mcs_map);
13025 sme_cfg_set_int(hal, WNI_CFG_HE_TX_MCS_MAP_LT_80, tx_mcs_map);
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080013026 csr_update_session_he_cap(mac_ctx, csr_session);
13027
13028}
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080013029
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080013030int sme_update_he_mcs(mac_handle_t hal, uint8_t session_id, uint16_t he_mcs)
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080013031{
13032 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
13033 struct csr_roam_session *csr_session;
13034 uint16_t mcs_val = 0;
13035 uint16_t mcs_map = HE_MCS_ALL_DISABLED;
13036 uint32_t wni_cfg_tx_param = 0;
13037 uint32_t wni_cfg_rx_param = 0;
13038
13039 csr_session = CSR_GET_SESSION(mac_ctx, session_id);
13040 if (!csr_session) {
13041 sme_err("No session for id %d", session_id);
13042 return -EINVAL;
13043 }
13044 if ((he_mcs & 0x3) == HE_MCS_DISABLE) {
13045 sme_err("Invalid HE MCS 0x%0x, can't disable 0-7 for 1ss",
13046 he_mcs);
13047 return -EINVAL;
13048 }
13049 mcs_val = he_mcs & 0x3;
13050 switch (he_mcs) {
13051 case HE_80_MCS0_7:
13052 case HE_80_MCS0_9:
13053 case HE_80_MCS0_11:
Abhinav Kumarb074f2f2018-09-15 15:32:11 +053013054 if (mac_ctx->mlme_cfg->vht_caps.vht_cap_info.enable2x2) {
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080013055 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1);
13056 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 2);
13057 } else {
13058 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1);
13059 }
13060 wni_cfg_tx_param = WNI_CFG_HE_TX_MCS_MAP_LT_80;
13061 wni_cfg_rx_param = WNI_CFG_HE_RX_MCS_MAP_LT_80;
13062 break;
13063
13064 case HE_160_MCS0_7:
13065 case HE_160_MCS0_9:
13066 case HE_160_MCS0_11:
13067 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1);
13068 wni_cfg_tx_param = WNI_CFG_HE_TX_MCS_MAP_160;
13069 wni_cfg_rx_param = WNI_CFG_HE_RX_MCS_MAP_160;
13070 break;
13071
13072 case HE_80p80_MCS0_7:
13073 case HE_80p80_MCS0_9:
13074 case HE_80p80_MCS0_11:
13075 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1);
13076 wni_cfg_tx_param = WNI_CFG_HE_TX_MCS_MAP_80_80;
13077 wni_cfg_rx_param = WNI_CFG_HE_RX_MCS_MAP_80_80;
13078 break;
13079
13080 default:
13081 sme_err("Invalid HE MCS 0x%0x", he_mcs);
13082 return -EINVAL;
13083 }
13084 sme_info("new HE MCS 0x%0x", mcs_map);
Jeff Johnsonc18469b2018-06-11 06:48:59 -070013085 sme_cfg_set_int(hal, wni_cfg_tx_param, mcs_map);
13086 sme_cfg_set_int(hal, wni_cfg_rx_param, mcs_map);
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080013087 csr_update_session_he_cap(mac_ctx, csr_session);
13088
13089 return 0;
13090}
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080013091
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080013092static int sme_update_he_cap(mac_handle_t hal, uint8_t session_id,
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080013093 uint16_t he_cap, int value)
13094{
13095 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
13096 struct csr_roam_session *session;
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080013097
13098 session = CSR_GET_SESSION(mac_ctx, session_id);
13099 if (!session) {
13100 sme_err("No session for id %d", session_id);
13101 return -EINVAL;
13102 }
Jeff Johnsonc18469b2018-06-11 06:48:59 -070013103 sme_cfg_set_int(hal, he_cap, value);
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080013104 csr_update_session_he_cap(mac_ctx, session);
13105
13106 return 0;
13107}
13108
Kiran Kumar Lokeref54b8552018-07-10 00:53:38 -070013109void sme_set_usr_cfg_mu_edca(mac_handle_t hal, bool val)
13110{
13111 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
13112
13113 mac_ctx->usr_cfg_mu_edca_params = val;
13114}
13115
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070013116int sme_update_mu_edca_params(mac_handle_t hal, uint8_t session_id)
13117{
13118 struct scheduler_msg msg = {0};
13119 QDF_STATUS status;
13120
13121 qdf_mem_zero(&msg, sizeof(msg));
13122 msg.type = WNI_SME_UPDATE_MU_EDCA_PARAMS;
13123 msg.reserved = 0;
13124 msg.bodyval = session_id;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013125 status = scheduler_post_message(QDF_MODULE_ID_SME,
13126 QDF_MODULE_ID_PE,
13127 QDF_MODULE_ID_PE, &msg);
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070013128 if (status != QDF_STATUS_SUCCESS) {
13129 sme_err("Not able to post update edca profile");
13130 return -EIO;
13131 }
13132
13133 return 0;
13134}
13135void sme_set_he_mu_edca_def_cfg(mac_handle_t hal)
13136{
13137 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
13138 uint8_t i;
13139
Kiran Kumar Lokere8dba1892018-07-24 17:09:52 -070013140 sme_debug("Set MU EDCA params to default");
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070013141 for (i = 0; i < MAX_NUM_AC; i++) {
13142 mac_ctx->usr_mu_edca_params[i].aci.aifsn = MU_EDCA_DEF_AIFSN;
13143 mac_ctx->usr_mu_edca_params[i].aci.aci = i;
13144 mac_ctx->usr_mu_edca_params[i].cw.max = MU_EDCA_DEF_CW_MAX;
13145 mac_ctx->usr_mu_edca_params[i].cw.min = MU_EDCA_DEF_CW_MIN;
13146 mac_ctx->usr_mu_edca_params[i].mu_edca_timer =
13147 MU_EDCA_DEF_TIMER;
13148 }
13149}
13150
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080013151int sme_update_he_tx_bfee_supp(mac_handle_t hal, uint8_t session_id,
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070013152 uint8_t cfg_val)
13153{
13154 return sme_update_he_cap(hal, session_id, WNI_CFG_HE_SU_BEAMFORMEE,
13155 cfg_val);
13156}
13157
Kiran Kumar Lokeref54b8552018-07-10 00:53:38 -070013158int sme_update_he_trigger_frm_mac_pad(mac_handle_t hal, uint8_t session_id,
13159 uint8_t cfg_val)
13160{
13161 return sme_update_he_cap(hal, session_id, WNI_CFG_HE_TRIG_PAD,
13162 cfg_val);
13163}
13164
Kiran Kumar Lokeref1a96f42018-08-29 18:53:47 -070013165int sme_update_he_om_ctrl_supp(mac_handle_t hal, uint8_t session_id,
13166 uint8_t cfg_val)
13167{
13168 return sme_update_he_cap(hal, session_id, WNI_CFG_HE_OMI,
13169 cfg_val);
13170}
13171
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070013172int sme_send_he_om_ctrl_bw_update(mac_handle_t hal, uint8_t session_id,
13173 uint8_t cfg_val)
13174{
13175 uint32_t om_ctrl_cmd[NUM_OM_CTRL_UPDATE_CFG_PARAMS] = {0};
13176 QDF_STATUS status;
13177 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
13178 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
13179
13180 if (!session) {
13181 sme_err("Session does not exist, Session_id: %d", session_id);
13182 return -EINVAL;
13183 }
13184 if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) {
13185 sme_info("STA is not connected, Session_id: %d", session_id);
13186 return -EINVAL;
13187 }
13188 if (cfg_val > session->connectedProfile.vht_channel_width) {
13189 sme_info("OM ctrl BW %d is greater than connected BW %d",
13190 cfg_val, session->connectedProfile.vht_channel_width);
13191 return -EINVAL;
13192 }
13193 mac_ctx->he_om_ctrl_cfg_bw_set = true;
13194 mac_ctx->he_om_ctrl_cfg_bw = cfg_val;
13195 om_ctrl_cmd[0] = 1;
13196 qdf_mem_copy((void *)&om_ctrl_cmd[OM_CTRL_CMD_MAC_BITS31],
13197 (void *)session->connectedProfile.bssid.bytes,
13198 sizeof(uint32_t));
13199 qdf_mem_copy((void *)&om_ctrl_cmd[OM_CTRL_CMD_MAC_BITS47],
13200 (void *)&session->connectedProfile.bssid.bytes[4],
13201 sizeof(uint16_t));
13202 if (mac_ctx->he_om_ctrl_cfg_nss_set) {
13203 om_ctrl_cmd[OM_CTRL_CMD_RX_NSS] =
13204 mac_ctx->he_om_ctrl_cfg_nss - 1;
13205 om_ctrl_cmd[OM_CTRL_CMD_TX_NSS] =
13206 mac_ctx->he_om_ctrl_cfg_nss - 1;
13207 } else {
13208 om_ctrl_cmd[OM_CTRL_CMD_RX_NSS] = session->nss - 1;
13209 om_ctrl_cmd[OM_CTRL_CMD_TX_NSS] = session->nss - 1;
13210 }
13211 om_ctrl_cmd[OM_CTRL_CMD_BW] = cfg_val;
13212 om_ctrl_cmd[OM_CTRL_CMD_ULMU] = 1;
13213 status = wma_form_unit_test_cmd_and_send(session_id, 13, 7,
13214 om_ctrl_cmd);
13215 if (QDF_STATUS_SUCCESS != status) {
13216 sme_err("send_unit_test_cmd returned %d", status);
13217 return -EIO;
13218 }
13219
13220 return 0;
13221}
13222
13223int sme_send_he_om_ctrl_nss_update(mac_handle_t hal, uint8_t session_id,
13224 uint8_t cfg_val)
13225{
13226 uint32_t om_ctrl_cmd[NUM_OM_CTRL_UPDATE_CFG_PARAMS] = {0};
13227 QDF_STATUS status;
13228 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
13229 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
13230
13231 if (!session) {
13232 sme_err("Session does not exist, Session_id: %d", session_id);
13233 return -EINVAL;
13234 }
13235 if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) {
13236 sme_info("STA not in connected state Session_id: %d",
13237 session_id);
13238 return -EINVAL;
13239 }
13240 if (cfg_val > session->nss) {
13241 sme_info("OM ctrl Nss %d is greater than connected Nss %d",
13242 cfg_val, session->nss);
13243 return -EINVAL;
13244 }
13245 mac_ctx->he_om_ctrl_cfg_nss_set = true;
13246 mac_ctx->he_om_ctrl_cfg_nss = cfg_val;
13247 om_ctrl_cmd[0] = 1;
13248 qdf_mem_copy((void *)&om_ctrl_cmd[OM_CTRL_CMD_MAC_BITS31],
13249 (void *)session->connectedProfile.bssid.bytes,
13250 sizeof(uint32_t));
13251 qdf_mem_copy((void *)&om_ctrl_cmd[OM_CTRL_CMD_MAC_BITS47],
13252 (void *)&session->connectedProfile.bssid.bytes[4],
13253 sizeof(uint16_t));
13254
13255 if (mac_ctx->he_om_ctrl_cfg_bw_set)
13256 om_ctrl_cmd[OM_CTRL_CMD_BW] = mac_ctx->he_om_ctrl_cfg_bw;
13257 else
13258 om_ctrl_cmd[OM_CTRL_CMD_BW] =
13259 session->connectedProfile.vht_channel_width;
13260
13261 om_ctrl_cmd[OM_CTRL_CMD_RX_NSS] = cfg_val - 1;
13262 om_ctrl_cmd[OM_CTRL_CMD_TX_NSS] = cfg_val - 1;
13263 om_ctrl_cmd[OM_CTRL_CMD_ULMU] = 1;
13264 status = wma_form_unit_test_cmd_and_send(session_id, 13, 7,
13265 om_ctrl_cmd);
13266 if (QDF_STATUS_SUCCESS != status) {
13267 sme_err("send_unit_test_cmd returned %d", status);
13268 return -EIO;
13269 }
13270
13271 return 0;
13272}
13273
13274void sme_reset_he_om_ctrl(mac_handle_t hal)
13275{
13276 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
13277
13278 mac_ctx->he_om_ctrl_cfg_bw_set = false;
13279 mac_ctx->he_om_ctrl_cfg_nss_set = false;
13280 mac_ctx->he_om_ctrl_cfg_bw = 0;
13281 mac_ctx->he_om_ctrl_cfg_nss = 0;
13282}
13283
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070013284int sme_update_he_tx_bfee_nsts(mac_handle_t hal, uint8_t session_id,
13285 uint8_t cfg_val)
13286{
13287 return sme_update_he_cap(hal, session_id, WNI_CFG_HE_BFEE_STS_LT80,
13288 cfg_val);
13289}
13290
Kiran Kumar Lokere86e85592018-07-18 15:34:24 -070013291void sme_set_he_tx_bf_cbf_rates(uint8_t session_id)
13292{
13293 uint32_t tx_bf_cbf_rates_5g[] = {91, 1, 0, 3, 2, 4, 0};
13294 uint32_t tx_bf_cbf_rates_2g[] = {91, 1, 1, 3, 1, 3, 0};
13295 QDF_STATUS status;
13296
13297 status = wma_form_unit_test_cmd_and_send(session_id, 0x48, 7,
13298 tx_bf_cbf_rates_5g);
13299 if (QDF_STATUS_SUCCESS != status)
13300 sme_err("send_unit_test_cmd returned %d", status);
13301
13302 status = wma_form_unit_test_cmd_and_send(session_id, 0x48, 7,
13303 tx_bf_cbf_rates_2g);
13304 if (QDF_STATUS_SUCCESS != status)
13305 sme_err("send_unit_test_cmd returned %d", status);
13306}
13307
Kiran Kumar Lokereefdbd0b2018-09-25 18:53:46 -070013308void sme_config_su_ppdu_queue(uint8_t session_id, bool enable)
13309{
13310 uint32_t su_ppdu_enable[] = {69, 1, 1, 1};
13311 uint32_t su_ppdu_disable[] = {69, 1, 1, 0};
13312 QDF_STATUS status;
13313
13314 if (enable) {
13315 sme_debug("Send Tx SU PPDU queue ENABLE cmd to FW");
13316 status = wma_form_unit_test_cmd_and_send(session_id, 0x48, 4,
13317 su_ppdu_enable);
13318 } else {
13319 sme_debug("Send Tx SU PPDU queue DISABLE cmd to FW");
13320 status = wma_form_unit_test_cmd_and_send(session_id, 0x48, 4,
13321 su_ppdu_disable);
13322 }
13323 if (QDF_STATUS_SUCCESS != status)
13324 sme_err("send_unit_test_cmd returned %d", status);
13325}
13326
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080013327int sme_update_he_tx_stbc_cap(mac_handle_t hal, uint8_t session_id, int value)
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080013328{
13329 int ret;
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080013330 uint32_t he_cap_val = 0;
13331
13332 he_cap_val = value ? 1 : 0;
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080013333
13334 ret = sme_update_he_cap(hal, session_id,
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080013335 WNI_CFG_HE_TX_STBC_LT80, he_cap_val);
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080013336 if (ret)
13337 return ret;
13338
13339 return sme_update_he_cap(hal, session_id,
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080013340 WNI_CFG_HE_TX_STBC_GT80, he_cap_val);
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080013341}
13342
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080013343int sme_update_he_rx_stbc_cap(mac_handle_t hal, uint8_t session_id, int value)
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080013344{
13345 int ret;
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080013346 uint32_t he_cap_val = 0;
13347
13348 he_cap_val = value ? 1 : 0;
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080013349
13350 ret = sme_update_he_cap(hal, session_id,
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080013351 WNI_CFG_HE_RX_STBC_LT80, he_cap_val);
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080013352 if (ret)
13353 return ret;
13354
13355 return sme_update_he_cap(hal, session_id,
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080013356 WNI_CFG_HE_RX_STBC_GT80, he_cap_val);
13357}
13358
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080013359int sme_update_he_frag_supp(mac_handle_t hal, uint8_t session_id,
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080013360 uint16_t he_frag)
13361{
13362 return sme_update_he_cap(hal, session_id,
13363 WNI_CFG_HE_FRAGMENTATION, he_frag);
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080013364}
Kiran Kumar Lokeree43a4582018-05-08 19:54:03 -070013365
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080013366int sme_update_he_ldpc_supp(mac_handle_t hal, uint8_t session_id,
Kiran Kumar Lokeree43a4582018-05-08 19:54:03 -070013367 uint16_t he_ldpc)
13368{
13369 return sme_update_he_cap(hal, session_id, WNI_CFG_HE_LDPC, he_ldpc);
13370}
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080013371#endif
13372
Archana Ramachandran5041b252016-04-25 14:29:25 -070013373/**
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013374 * sme_set_nud_debug_stats_cb() - set nud debug stats callback
13375 * @hal: global hal handle
13376 * @cb: callback function pointer
Dundi Raviteja3bcf3a82018-05-22 13:24:18 +053013377 * @context: callback context
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013378 *
13379 * This function stores nud debug stats callback function.
13380 *
13381 * Return: QDF_STATUS enumeration.
13382 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080013383QDF_STATUS sme_set_nud_debug_stats_cb(mac_handle_t hal,
Dundi Raviteja3bcf3a82018-05-22 13:24:18 +053013384 void (*cb)(void *, struct rsp_stats *, void *),
13385 void *context)
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013386{
13387 QDF_STATUS status = QDF_STATUS_SUCCESS;
13388 tpAniSirGlobal mac;
13389
13390 if (!hal) {
13391 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13392 FL("hal is not valid"));
13393 return QDF_STATUS_E_INVAL;
13394 }
13395 mac = PMAC_STRUCT(hal);
13396
13397 status = sme_acquire_global_lock(&mac->sme);
13398 if (!QDF_IS_STATUS_SUCCESS(status)) {
13399 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13400 FL("sme_acquire_global_lock failed!(status=%d)"),
13401 status);
13402 return status;
13403 }
13404
13405 mac->sme.get_arp_stats_cb = cb;
Dundi Raviteja3bcf3a82018-05-22 13:24:18 +053013406 mac->sme.get_arp_stats_context = context;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013407 sme_release_global_lock(&mac->sme);
13408 return status;
13409}
13410
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013411/**
13412 * sme_is_any_session_in_connected_state() - SME wrapper API to
13413 * check if any session is in connected state or not.
13414 *
13415 * @hal: Handle returned by mac open
13416 *
13417 * This function is used to check if any valid sme session is in
13418 * connected state or not.
13419 *
13420 * Return: true if any session is connected, else false.
13421 *
13422 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013423bool sme_is_any_session_in_connected_state(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013424{
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013425 tpAniSirGlobal mac_ctx = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013426 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013427 bool ret = false;
13428
13429 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013430 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013431 ret = csr_is_any_session_in_connect_state(mac_ctx);
13432 sme_release_global_lock(&mac_ctx->sme);
13433 }
13434 return ret;
13435}
13436
Jeff Johnsonb7fa2562018-07-02 08:36:17 -070013437QDF_STATUS sme_set_chip_pwr_save_fail_cb(mac_handle_t mac_handle,
13438 pwr_save_fail_cb cb)
13439{
13440 QDF_STATUS status;
13441 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +053013442
13443 status = sme_acquire_global_lock(&mac->sme);
13444 if (status != QDF_STATUS_SUCCESS) {
13445 sme_err("sme_AcquireGlobalLock failed!(status=%d)", status);
13446 return status;
13447 }
13448 mac->sme.chip_power_save_fail_cb = cb;
13449 sme_release_global_lock(&mac->sme);
13450 return status;
13451}
13452
Qiwei Caie689a262018-07-26 15:50:22 +080013453#ifdef FEATURE_RSSI_MONITOR
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013454/**
13455 * sme_set_rssi_monitoring() - set rssi monitoring
13456 * @hal: global hal handle
13457 * @input: request message
13458 *
13459 * This function constructs the vos message and fill in message type,
13460 * bodyptr with @input and posts it to WDA queue.
13461 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013462 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013463 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080013464QDF_STATUS sme_set_rssi_monitoring(mac_handle_t hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013465 struct rssi_monitor_req *input)
13466{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013467 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013468 tpAniSirGlobal mac = PMAC_STRUCT(hal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013469 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013470 struct rssi_monitor_req *req_msg;
13471
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013472 SME_ENTER();
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013473 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070013474 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013475 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013476
13477 *req_msg = *input;
13478
13479 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013480 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013481 sme_err("sme_acquire_global_lock failed!(status=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013482 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013483 return status;
13484 }
13485
13486 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080013487 message.bodyptr = req_msg;
13488 message.type = WMA_SET_RSSI_MONITOR_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013489 status = scheduler_post_message(QDF_MODULE_ID_SME,
13490 QDF_MODULE_ID_WMA,
13491 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013492 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013493 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013494 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013495 }
13496 sme_release_global_lock(&mac->sme);
13497
13498 return status;
13499}
13500
Qiwei Caie689a262018-07-26 15:50:22 +080013501QDF_STATUS sme_set_rssi_threshold_breached_cb(mac_handle_t mac_handle,
13502 rssi_threshold_breached_cb cb)
13503{
13504 QDF_STATUS status;
13505 tpAniSirGlobal mac;
13506
13507 mac = MAC_CONTEXT(mac_handle);
13508 if (!mac) {
13509 sme_err("Invalid mac context");
13510 return QDF_STATUS_E_INVAL;
13511 }
13512
13513 status = sme_acquire_global_lock(&mac->sme);
13514 if (!QDF_IS_STATUS_SUCCESS(status)) {
13515 sme_err("sme_acquire_global_lock failed!(status=%d)",
13516 status);
13517 return status;
13518 }
13519
13520 mac->sme.rssi_threshold_breached_cb = cb;
13521 sme_release_global_lock(&mac->sme);
13522 return status;
13523}
13524#endif /* FEATURE_RSSI_MONITOR */
13525
13526QDF_STATUS sme_reset_rssi_threshold_breached_cb(mac_handle_t mac_handle)
13527{
13528 return sme_set_rssi_threshold_breached_cb(mac_handle, NULL);
13529}
13530
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070013531static enum band_info sme_get_connected_roaming_vdev_band(void)
13532{
13533 enum band_info band = BAND_ALL;
13534 tpAniSirGlobal mac = sme_get_mac_context();
13535 struct csr_roam_session *session;
13536 uint8_t session_id, channel;
13537
13538 if (!mac) {
13539 sme_debug("MAC Context is NULL");
13540 return band;
13541 }
13542 session_id = csr_get_roam_enabled_sta_sessionid(mac);
13543 if (session_id != CSR_SESSION_ID_INVALID) {
13544 session = CSR_GET_SESSION(mac, session_id);
13545 channel = session->connectedProfile.operationChannel;
13546 band = csr_get_rf_band(channel);
13547 return band;
13548 }
13549
13550 return band;
13551}
13552
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013553/*
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053013554 * sme_pdev_set_pcl() - Send WMI_PDEV_SET_PCL_CMDID to the WMA
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013555 * @hal: Handle returned by macOpen
13556 * @msg: PCL channel list and length structure
13557 *
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053013558 * Sends the command to WMA to send WMI_PDEV_SET_PCL_CMDID to FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013559 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013560 */
Krunal Soni8a090df2018-05-03 15:02:54 -070013561QDF_STATUS sme_pdev_set_pcl(struct policy_mgr_pcl_list *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013562{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013563 QDF_STATUS status = QDF_STATUS_SUCCESS;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080013564 tpAniSirGlobal mac = sme_get_mac_context();
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013565 struct scheduler_msg message = {0};
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070013566 struct set_pcl_req *req_msg;
13567 uint32_t i;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013568
Krunal Soni3fa80e22018-01-09 14:16:02 -080013569 if (!mac) {
13570 sme_err("mac is NULL");
13571 return QDF_STATUS_E_FAILURE;
13572 }
Krunal Soni8a090df2018-05-03 15:02:54 -070013573
13574 if (!msg) {
13575 sme_err("msg is NULL");
13576 return QDF_STATUS_E_FAILURE;
13577 }
13578
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070013579 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070013580 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013581 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013582
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070013583 req_msg->band = BAND_ALL;
13584 if (CSR_IS_ROAM_INTRA_BAND_ENABLED(mac)) {
13585 req_msg->band = sme_get_connected_roaming_vdev_band();
13586 sme_debug("Connected STA band %d", req_msg->band);
13587 }
Krunal Soni8a090df2018-05-03 15:02:54 -070013588 for (i = 0; i < msg->pcl_len; i++) {
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070013589 req_msg->chan_weights.pcl_list[i] = msg->pcl_list[i];
13590 req_msg->chan_weights.weight_list[i] = msg->weight_list[i];
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053013591 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013592
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070013593 req_msg->chan_weights.pcl_len = msg->pcl_len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013594
13595 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013596 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013597 sme_err("sme_acquire_global_lock failed!(status=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013598 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013599 return status;
13600 }
13601
13602 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080013603 message.bodyptr = req_msg;
13604 message.type = SIR_HAL_PDEV_SET_PCL_TO_FW;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013605 status = scheduler_post_message(QDF_MODULE_ID_SME,
13606 QDF_MODULE_ID_WMA,
13607 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013608 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013609 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013610 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013611 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013612 }
13613 sme_release_global_lock(&mac->sme);
13614
13615 return status;
13616}
13617
13618/*
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053013619 * sme_pdev_set_hw_mode() - Send WMI_PDEV_SET_HW_MODE_CMDID to the WMA
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013620 * @hal: Handle returned by macOpen
13621 * @msg: HW mode structure containing hw mode and callback details
13622 *
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053013623 * Sends the command to CSR to send WMI_PDEV_SET_HW_MODE_CMDID to FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013624 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013625 */
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080013626QDF_STATUS sme_pdev_set_hw_mode(struct policy_mgr_hw_mode msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013627{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013628 QDF_STATUS status = QDF_STATUS_SUCCESS;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080013629 tpAniSirGlobal mac = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013630 tSmeCmd *cmd = NULL;
13631
Krunal Soni3fa80e22018-01-09 14:16:02 -080013632 if (!mac) {
13633 sme_err("mac is NULL");
13634 return QDF_STATUS_E_FAILURE;
13635 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013636 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013637 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013638 sme_err("Failed to acquire lock");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013639 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013640 }
13641
Krunal Soni78618d92017-02-14 21:46:31 -080013642 cmd = csr_get_command_buffer(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013643 if (!cmd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013644 sme_err("Get command buffer failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013645 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013646 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013647 }
13648
13649 cmd->command = e_sme_command_set_hw_mode;
Ganesh Kondabattiniae1c6a22017-05-02 18:02:11 +053013650 cmd->sessionId = msg.session_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013651 cmd->u.set_hw_mode_cmd.hw_mode_index = msg.hw_mode_index;
13652 cmd->u.set_hw_mode_cmd.set_hw_mode_cb = msg.set_hw_mode_cb;
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +053013653 cmd->u.set_hw_mode_cmd.reason = msg.reason;
13654 cmd->u.set_hw_mode_cmd.session_id = msg.session_id;
Tushnim Bhattacharyyaeab33dd2017-11-15 15:20:02 -080013655 cmd->u.set_hw_mode_cmd.next_action = msg.next_action;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080013656 cmd->u.set_hw_mode_cmd.context = msg.context;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013657
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013658 sme_debug("Queuing set hw mode to CSR, session: %d reason: %d",
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053013659 cmd->u.set_hw_mode_cmd.session_id,
13660 cmd->u.set_hw_mode_cmd.reason);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013661 csr_queue_sme_command(mac, cmd, false);
13662
13663 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013664 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013665}
13666
13667/**
13668 * sme_register_hw_mode_trans_cb() - HW mode transition callback registration
13669 * @hal: Handle returned by macOpen
13670 * @callback: HDD callback to be registered
13671 *
13672 * Registers the HDD callback with SME. This callback will be invoked when
13673 * HW mode transition event is received from the FW
13674 *
13675 * Return: None
13676 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080013677void sme_register_hw_mode_trans_cb(mac_handle_t hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013678 hw_mode_transition_cb callback)
13679{
13680 tpAniSirGlobal mac = PMAC_STRUCT(hal);
13681
13682 mac->sme.sme_hw_mode_trans_cb = callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013683}
13684
13685/**
13686 * sme_nss_update_request() - Send beacon templete update to FW with new
13687 * nss value
13688 * @hal: Handle returned by macOpen
13689 * @vdev_id: the session id
13690 * @new_nss: the new nss value
13691 * @cback: hdd callback
13692 * @next_action: next action to happen at policy mgr after beacon update
Liangwei Dong1ba99482018-10-19 02:57:29 -040013693 * @original_vdev_id: original request hwmode change vdev id
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013694 *
13695 * Sends the command to CSR to send to PE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013696 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013697 */
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080013698QDF_STATUS sme_nss_update_request(uint32_t vdev_id,
13699 uint8_t new_nss, policy_mgr_nss_update_cback cback,
13700 uint8_t next_action, struct wlan_objmgr_psoc *psoc,
Liangwei Dong1ba99482018-10-19 02:57:29 -040013701 enum policy_mgr_conn_update_reason reason,
13702 uint32_t original_vdev_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013703{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013704 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080013705 tpAniSirGlobal mac = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013706 tSmeCmd *cmd = NULL;
13707
Krunal Soni3fa80e22018-01-09 14:16:02 -080013708 if (!mac) {
13709 sme_err("mac is null");
13710 return status;
13711 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013712 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013713 if (QDF_IS_STATUS_SUCCESS(status)) {
Krunal Soni78618d92017-02-14 21:46:31 -080013714 cmd = csr_get_command_buffer(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013715 if (!cmd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013716 sme_err("Get command buffer failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013717 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013718 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013719 }
13720 cmd->command = e_sme_command_nss_update;
13721 /* Sessionized modules may require this info */
13722 cmd->sessionId = vdev_id;
13723 cmd->u.nss_update_cmd.new_nss = new_nss;
13724 cmd->u.nss_update_cmd.session_id = vdev_id;
13725 cmd->u.nss_update_cmd.nss_update_cb = cback;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080013726 cmd->u.nss_update_cmd.context = psoc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013727 cmd->u.nss_update_cmd.next_action = next_action;
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053013728 cmd->u.nss_update_cmd.reason = reason;
Liangwei Dong1ba99482018-10-19 02:57:29 -040013729 cmd->u.nss_update_cmd.original_vdev_id = original_vdev_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013730
Liangwei Dong1ba99482018-10-19 02:57:29 -040013731 sme_debug("Queuing e_sme_command_nss_update to CSR:vdev (%d %d) ss %d r %d",
13732 vdev_id, original_vdev_id, new_nss, reason);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013733 csr_queue_sme_command(mac, cmd, false);
13734 sme_release_global_lock(&mac->sme);
13735 }
13736 return status;
13737}
13738
13739/**
13740 * sme_soc_set_dual_mac_config() - Set dual mac configurations
13741 * @hal: Handle returned by macOpen
13742 * @msg: Structure containing the dual mac config parameters
13743 *
13744 * Queues configuration information to CSR to configure
13745 * WLAN firmware for the dual MAC features
13746 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013747 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013748 */
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080013749QDF_STATUS sme_soc_set_dual_mac_config(struct policy_mgr_dual_mac_config msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013750{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013751 QDF_STATUS status = QDF_STATUS_SUCCESS;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080013752 tpAniSirGlobal mac = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013753 tSmeCmd *cmd;
13754
Krunal Soni3fa80e22018-01-09 14:16:02 -080013755 if (!mac) {
13756 sme_err("mac is null");
13757 return QDF_STATUS_E_FAILURE;
13758 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013759 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013760 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013761 sme_err("Failed to acquire lock");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013762 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013763 }
13764
Krunal Soni78618d92017-02-14 21:46:31 -080013765 cmd = csr_get_command_buffer(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013766 if (!cmd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013767 sme_err("Get command buffer failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013768 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013769 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013770 }
13771
13772 cmd->command = e_sme_command_set_dual_mac_config;
13773 cmd->u.set_dual_mac_cmd.scan_config = msg.scan_config;
13774 cmd->u.set_dual_mac_cmd.fw_mode_config = msg.fw_mode_config;
13775 cmd->u.set_dual_mac_cmd.set_dual_mac_cb = msg.set_dual_mac_cb;
13776
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013777 sme_debug("set_dual_mac_config scan_config: %x fw_mode_config: %x",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013778 cmd->u.set_dual_mac_cmd.scan_config,
13779 cmd->u.set_dual_mac_cmd.fw_mode_config);
13780 csr_queue_sme_command(mac, cmd, false);
13781
13782 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013783 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013784}
13785
Ravi Joshi9e891ba2015-11-09 19:03:46 -080013786#ifdef FEATURE_LFR_SUBNET_DETECTION
13787/**
13788 * sme_gateway_param_update() - to update gateway parameters with WMA
13789 * @Hal: hal handle
13790 * @gw_params: request parameters from HDD
13791 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013792 * Return: QDF_STATUS
Ravi Joshi9e891ba2015-11-09 19:03:46 -080013793 *
13794 * This routine will update gateway parameters to WMA
13795 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080013796QDF_STATUS sme_gateway_param_update(mac_handle_t Hal,
Ravi Joshi9e891ba2015-11-09 19:03:46 -080013797 struct gateway_param_update_req *gw_params)
13798{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013799 QDF_STATUS qdf_status;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013800 struct scheduler_msg message = {0};
Ravi Joshi9e891ba2015-11-09 19:03:46 -080013801 struct gateway_param_update_req *request_buf;
13802
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013803 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Arif Hussain0ef77082018-10-10 16:42:53 -070013804 if (!request_buf)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013805 return QDF_STATUS_E_NOMEM;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080013806
13807 *request_buf = *gw_params;
13808
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080013809 message.type = WMA_GW_PARAM_UPDATE_REQ;
13810 message.reserved = 0;
13811 message.bodyptr = request_buf;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013812 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
13813 QDF_MODULE_ID_WMA,
13814 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013815 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013816 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053013817 "Not able to post WMA_GW_PARAM_UPDATE_REQ message to HAL");
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013818 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013819 return QDF_STATUS_E_FAILURE;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080013820 }
13821
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013822 return QDF_STATUS_SUCCESS;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080013823}
13824#endif /* FEATURE_LFR_SUBNET_DETECTION */
13825
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013826/**
Archana Ramachandrana20ef812015-11-13 16:12:13 -080013827 * sme_soc_set_antenna_mode() - set antenna mode
13828 * @hal: Handle returned by macOpen
13829 * @msg: Structure containing the antenna mode parameters
13830 *
13831 * Send the command to CSR to send
13832 * WMI_SOC_SET_ANTENNA_MODE_CMDID to FW
13833 *
13834 * Return: QDF_STATUS
13835 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080013836QDF_STATUS sme_soc_set_antenna_mode(mac_handle_t hal,
Archana Ramachandrana20ef812015-11-13 16:12:13 -080013837 struct sir_antenna_mode_param *msg)
13838{
13839 QDF_STATUS status = QDF_STATUS_SUCCESS;
13840 tpAniSirGlobal mac = PMAC_STRUCT(hal);
13841 tSmeCmd *cmd;
13842
13843 if (NULL == msg) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013844 sme_err("antenna mode mesg is NULL");
Archana Ramachandrana20ef812015-11-13 16:12:13 -080013845 return QDF_STATUS_E_FAILURE;
13846 }
13847
13848 status = sme_acquire_global_lock(&mac->sme);
13849 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013850 sme_err("Failed to acquire lock");
Archana Ramachandrana20ef812015-11-13 16:12:13 -080013851 return QDF_STATUS_E_RESOURCES;
13852 }
13853
Krunal Soni78618d92017-02-14 21:46:31 -080013854 cmd = csr_get_command_buffer(mac);
Archana Ramachandrana20ef812015-11-13 16:12:13 -080013855 if (!cmd) {
13856 sme_release_global_lock(&mac->sme);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013857 sme_err("Get command buffer failed");
Archana Ramachandrana20ef812015-11-13 16:12:13 -080013858 return QDF_STATUS_E_NULL_VALUE;
13859 }
13860
13861 cmd->command = e_sme_command_set_antenna_mode;
13862 cmd->u.set_antenna_mode_cmd = *msg;
13863
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013864 sme_debug("Antenna mode rx_chains: %d tx_chains: %d",
Archana Ramachandrana20ef812015-11-13 16:12:13 -080013865 cmd->u.set_antenna_mode_cmd.num_rx_chains,
13866 cmd->u.set_antenna_mode_cmd.num_tx_chains);
13867
13868 csr_queue_sme_command(mac, cmd, false);
13869 sme_release_global_lock(&mac->sme);
13870
13871 return QDF_STATUS_SUCCESS;
13872}
13873
13874/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013875 * sme_set_peer_authorized() - call peer authorized callback
13876 * @peer_addr: peer mac address
13877 * @auth_cb: auth callback
13878 * @vdev_id: vdev id
13879 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053013880 * Return: QDF Status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013881 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013882QDF_STATUS sme_set_peer_authorized(uint8_t *peer_addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013883 sme_peer_authorized_fp auth_cb,
13884 uint32_t vdev_id)
13885{
13886 void *wma_handle;
13887
Anurag Chouhan6d760662016-02-20 16:05:43 +053013888 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013889 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013890 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013891 "wma handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013892 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013893 }
13894
13895 wma_set_peer_authorized_cb(wma_handle, auth_cb);
13896 return wma_set_peer_param(wma_handle, peer_addr, WMI_PEER_AUTHORIZE,
13897 1, vdev_id);
13898}
13899
13900/*
Amar Singhal7c1e8982016-05-19 15:08:09 -070013901 * sme_handle_set_fcc_channel() - set spec. tx power for non-fcc channel
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013902 * @hal: HAL pointer
Amar Singhal83a047a2016-05-19 15:56:11 -070013903 * @fcc_constraint: flag to enable/disable the constraint
13904 * @scan_pending: whether there is pending scan
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013905 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013906 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013907 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080013908QDF_STATUS sme_handle_set_fcc_channel(mac_handle_t hal, bool fcc_constraint,
Amar Singhal83a047a2016-05-19 15:56:11 -070013909 bool scan_pending)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013910{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013911 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013912 tpAniSirGlobal mac_ptr = PMAC_STRUCT(hal);
13913
13914 status = sme_acquire_global_lock(&mac_ptr->sme);
13915
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013916 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013917
13918 if (fcc_constraint != mac_ptr->scan.fcc_constraint) {
13919 mac_ptr->scan.fcc_constraint = fcc_constraint;
Amar Singhal83a047a2016-05-19 15:56:11 -070013920 if (scan_pending)
13921 mac_ptr->scan.defer_update_channel_list = true;
13922 else
13923 status = csr_update_channel_list(mac_ptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013924 }
13925
13926 sme_release_global_lock(&mac_ptr->sme);
13927 }
13928
13929 return status;
13930}
13931/**
13932 * sme_setdef_dot11mode() - Updates pMac with default dot11mode
13933 * @hal: Global MAC pointer
13934 *
13935 * Return: NULL.
13936 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080013937void sme_setdef_dot11mode(mac_handle_t hal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013938{
13939 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053013940
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013941 csr_set_default_dot11_mode(mac_ctx);
13942}
13943
13944/**
13945 * sme_update_roam_scan_hi_rssi_scan_params() - update high rssi scan
13946 * params
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013947 * @mac_handle - The handle returned by macOpen.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013948 * @session_id - Session Identifier
13949 * @notify_id - Identifies 1 of the 4 parameters to be modified
13950 * @val New value of the parameter
13951 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013952 * Return: QDF_STATUS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013953 * Other status means SME failed to update
13954 */
13955
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013956QDF_STATUS sme_update_roam_scan_hi_rssi_scan_params(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013957 uint8_t session_id,
13958 uint32_t notify_id,
13959 int32_t val)
13960{
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013961 tpAniSirGlobal mac_ctx = PMAC_STRUCT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013962 QDF_STATUS status = QDF_STATUS_SUCCESS;
gaurank kathpalia14e2f912017-08-31 14:51:45 +053013963 struct csr_neighbor_roamconfig *nr_config = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013964 tpCsrNeighborRoamControlInfo nr_info = NULL;
13965 uint32_t reason = 0;
13966
Naveen Rawatc36f7eb2016-11-10 20:01:03 -080013967 if (session_id >= CSR_ROAM_SESSION_MAX) {
13968 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13969 FL("Invalid sme session id: %d"), session_id);
13970 return QDF_STATUS_E_INVAL;
13971 }
13972
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013973 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013974 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013975 nr_config = &mac_ctx->roam.configParam.neighborRoamConfig;
13976 nr_info = &mac_ctx->roam.neighborRoamInfo[session_id];
13977 switch (notify_id) {
13978 case eCSR_HI_RSSI_SCAN_MAXCOUNT_ID:
Abhishek Singhe4a1f882017-08-10 17:59:44 +053013979 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013980 "%s: gRoamScanHirssiMaxCount %d => %d",
13981 __func__, nr_config->nhi_rssi_scan_max_count,
13982 val);
13983 nr_config->nhi_rssi_scan_max_count = val;
13984 nr_info->cfgParams.hi_rssi_scan_max_count = val;
13985 reason = REASON_ROAM_SCAN_HI_RSSI_MAXCOUNT_CHANGED;
13986 break;
13987
13988 case eCSR_HI_RSSI_SCAN_RSSI_DELTA_ID:
Abhishek Singhe4a1f882017-08-10 17:59:44 +053013989 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013990 FL("gRoamScanHiRssiDelta %d => %d"),
13991 nr_config->nhi_rssi_scan_rssi_delta,
13992 val);
13993 nr_config->nhi_rssi_scan_rssi_delta = val;
13994 nr_info->cfgParams.hi_rssi_scan_rssi_delta = val;
13995 reason = REASON_ROAM_SCAN_HI_RSSI_DELTA_CHANGED;
13996 break;
13997
13998 case eCSR_HI_RSSI_SCAN_DELAY_ID:
Abhishek Singhe4a1f882017-08-10 17:59:44 +053013999 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014000 FL("gRoamScanHiRssiDelay %d => %d"),
14001 nr_config->nhi_rssi_scan_delay,
14002 val);
14003 nr_config->nhi_rssi_scan_delay = val;
14004 nr_info->cfgParams.hi_rssi_scan_delay = val;
14005 reason = REASON_ROAM_SCAN_HI_RSSI_DELAY_CHANGED;
14006 break;
14007
14008 case eCSR_HI_RSSI_SCAN_RSSI_UB_ID:
Abhishek Singhe4a1f882017-08-10 17:59:44 +053014009 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014010 FL("gRoamScanHiRssiUpperBound %d => %d"),
14011 nr_config->nhi_rssi_scan_rssi_ub,
14012 val);
14013 nr_config->nhi_rssi_scan_rssi_ub = val;
14014 nr_info->cfgParams.hi_rssi_scan_rssi_ub = val;
14015 reason = REASON_ROAM_SCAN_HI_RSSI_UB_CHANGED;
14016 break;
14017
14018 default:
Abhishek Singhe4a1f882017-08-10 17:59:44 +053014019 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014020 FL("invalid parameter notify_id %d"),
14021 notify_id);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014022 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014023 break;
14024 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053014025
14026 if (mac_ctx->roam.configParam.isRoamOffloadScanEnabled &&
14027 status == QDF_STATUS_SUCCESS) {
14028 csr_roam_offload_scan(mac_ctx, session_id,
14029 ROAM_SCAN_OFFLOAD_UPDATE_CFG, reason);
14030 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014031 sme_release_global_lock(&mac_ctx->sme);
14032 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014033
14034 return status;
14035}
14036
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070014037/**
14038 * sme_update_tgt_services() - update the target services config.
14039 * @hal: HAL pointer.
14040 * @cfg: wma_tgt_services parameters.
14041 *
14042 * update the target services config.
14043 *
14044 * Return: None.
14045 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080014046void sme_update_tgt_services(mac_handle_t hal, struct wma_tgt_services *cfg)
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070014047{
14048 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
14049
Liangwei Dong0da14262018-07-03 03:30:23 -040014050 mac_ctx->obss_scan_offload = cfg->obss_scan_offload;
14051 sme_debug("obss_scan_offload: %d", mac_ctx->obss_scan_offload);
Krunal Sonie6a1cda2017-09-27 15:23:02 -070014052 mac_ctx->lteCoexAntShare = cfg->lte_coex_ant_share;
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070014053 mac_ctx->beacon_offload = cfg->beacon_offload;
mukul sharma72c8b222015-09-04 17:02:01 +053014054 mac_ctx->pmf_offload = cfg->pmf_offload;
Abhishek Singhe4a1f882017-08-10 17:59:44 +053014055 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
mukul sharma72c8b222015-09-04 17:02:01 +053014056 FL("mac_ctx->pmf_offload: %d"), mac_ctx->pmf_offload);
Vignesh Viswanathan731186f2017-09-18 13:47:37 +053014057 mac_ctx->is_fils_roaming_supported =
14058 cfg->is_fils_roaming_supported;
Vignesh Viswanathan694e28e2018-01-18 20:53:57 +053014059 mac_ctx->is_11k_offload_supported =
14060 cfg->is_11k_offload_supported;
14061 sme_debug("pmf_offload: %d fils_roam support %d 11k_offload %d",
14062 mac_ctx->pmf_offload, mac_ctx->is_fils_roaming_supported,
14063 mac_ctx->is_11k_offload_supported);
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070014064}
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053014065
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053014066/**
14067 * sme_is_session_id_valid() - Check if the session id is valid
14068 * @hal: Pointer to HAL
14069 * @session_id: Session id
14070 *
14071 * Checks if the session id is valid or not
14072 *
14073 * Return: True is the session id is valid, false otherwise
14074 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080014075bool sme_is_session_id_valid(mac_handle_t hal, uint32_t session_id)
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053014076{
Pragaspathi Thilagarajb11dbe42018-07-23 16:42:17 +053014077 tpAniSirGlobal mac;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053014078
Pragaspathi Thilagarajb11dbe42018-07-23 16:42:17 +053014079 if (NULL != hal) {
14080 mac = PMAC_STRUCT(hal);
14081 } else {
Chandrasekaran, Manishekard3cb4772016-02-22 22:21:10 +053014082 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14083 "%s: null mac pointer", __func__);
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053014084 return false;
14085 }
14086
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053014087 if (CSR_IS_SESSION_VALID(mac, session_id))
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053014088 return true;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053014089
14090 return false;
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053014091}
14092
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053014093#ifdef FEATURE_WLAN_TDLS
14094
14095/**
14096 * sme_get_opclass() - determine operating class
14097 * @hal: Pointer to HAL
14098 * @channel: channel id
14099 * @bw_offset: bandwidth offset
14100 * @opclass: pointer to operating class
14101 *
14102 * Function will determine operating class from regdm_get_opclass_from_channel
14103 *
14104 * Return: none
14105 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080014106void sme_get_opclass(mac_handle_t hal, uint8_t channel, uint8_t bw_offset,
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053014107 uint8_t *opclass)
14108{
14109 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
14110
14111 /* redgm opclass table contains opclass for 40MHz low primary,
14112 * 40MHz high primary and 20MHz. No support for 80MHz yet. So
14113 * first we will check if bit for 40MHz is set and if so find
14114 * matching opclass either with low primary or high primary
14115 * (a channel would never be in both) and then search for opclass
14116 * matching 20MHz, else for any BW.
14117 */
14118 if (bw_offset & (1 << BW_40_OFFSET_BIT)) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070014119 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053014120 mac_ctx->scan.countryCodeCurrent,
14121 channel, BW40_LOW_PRIMARY);
14122 if (!(*opclass)) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070014123 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053014124 mac_ctx->scan.countryCodeCurrent,
14125 channel, BW40_HIGH_PRIMARY);
14126 }
14127 } else if (bw_offset & (1 << BW_20_OFFSET_BIT)) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070014128 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053014129 mac_ctx->scan.countryCodeCurrent,
14130 channel, BW20);
14131 } else {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070014132 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053014133 mac_ctx->scan.countryCodeCurrent,
14134 channel, BWALL);
14135 }
14136}
14137#endif
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080014138
Sandeep Puligillae0875662016-02-12 16:09:21 -080014139/**
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +053014140 * sme_set_fw_test() - set fw test
14141 * @fw_test: fw test param
14142 *
14143 * Return: Return QDF_STATUS, otherwise appropriate failure code
14144 */
14145QDF_STATUS sme_set_fw_test(struct set_fwtest_params *fw_test)
14146{
14147 void *wma_handle;
14148
14149 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14150 if (!wma_handle) {
14151 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14152 "wma handle is NULL");
14153 return QDF_STATUS_E_FAILURE;
14154 }
14155 wma_process_fw_test_cmd(wma_handle, fw_test);
14156 return QDF_STATUS_SUCCESS;
14157}
14158
14159/**
Sandeep Puligillae0875662016-02-12 16:09:21 -080014160 * sme_ht40_stop_obss_scan() - ht40 obss stop scan
14161 * @hal: mac handel
14162 * @vdev_id: vdev identifier
14163 *
14164 * Return: Return QDF_STATUS, otherwise appropriate failure code
14165 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080014166QDF_STATUS sme_ht40_stop_obss_scan(mac_handle_t hal, uint32_t vdev_id)
Sandeep Puligillae0875662016-02-12 16:09:21 -080014167{
14168 void *wma_handle;
14169
14170 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14171 if (!wma_handle) {
14172 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14173 "wma handle is NULL");
14174 return QDF_STATUS_E_FAILURE;
14175 }
14176 wma_ht40_stop_obss_scan(wma_handle, vdev_id);
14177 return QDF_STATUS_SUCCESS;
14178}
Archana Ramachandran20d2e232016-02-11 16:58:40 -080014179
14180/**
14181 * sme_update_mimo_power_save() - Update MIMO power save
14182 * configuration
14183 * @hal: The handle returned by macOpen
14184 * @is_ht_smps_enabled: enable/disable ht smps
14185 * @ht_smps_mode: smps mode disabled/static/dynamic
Archana Ramachandranfec24812016-02-16 16:31:56 -080014186 * @send_smps_action: flag to send smps force mode command
14187 * to FW
Archana Ramachandran20d2e232016-02-11 16:58:40 -080014188 *
14189 * Return: QDF_STATUS if SME update mimo power save
Jeff Johnson698eacd2018-05-12 17:00:03 -070014190 * configuration success else failure status
Archana Ramachandran20d2e232016-02-11 16:58:40 -080014191 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080014192QDF_STATUS sme_update_mimo_power_save(mac_handle_t hal,
Archana Ramachandran20d2e232016-02-11 16:58:40 -080014193 uint8_t is_ht_smps_enabled,
Archana Ramachandranfec24812016-02-16 16:31:56 -080014194 uint8_t ht_smps_mode,
14195 bool send_smps_action)
Archana Ramachandran20d2e232016-02-11 16:58:40 -080014196{
14197 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Archana Ramachandranfec24812016-02-16 16:31:56 -080014198
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014199 sme_debug("SMPS enable: %d mode: %d send action: %d",
Archana Ramachandranfec24812016-02-16 16:31:56 -080014200 is_ht_smps_enabled, ht_smps_mode,
14201 send_smps_action);
Vignesh Viswanathanddc89e52018-11-02 18:43:42 +053014202 mac_ctx->mlme_cfg->ht_caps.enable_smps =
Archana Ramachandran20d2e232016-02-11 16:58:40 -080014203 is_ht_smps_enabled;
Vignesh Viswanathanddc89e52018-11-02 18:43:42 +053014204 mac_ctx->mlme_cfg->ht_caps.smps = ht_smps_mode;
Archana Ramachandranfec24812016-02-16 16:31:56 -080014205 mac_ctx->roam.configParam.send_smps_action =
14206 send_smps_action;
Archana Ramachandran20d2e232016-02-11 16:58:40 -080014207
14208 return QDF_STATUS_SUCCESS;
14209}
14210
14211/**
14212 * sme_is_sta_smps_allowed() - check if the supported nss for
14213 * the session is greater than 1x1 to enable sta SMPS
14214 * @hal: The handle returned by macOpen
14215 * @session_id: session id
14216 *
14217 * Return: bool returns true if supported nss is greater than
14218 * 1x1 else false
14219 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080014220bool sme_is_sta_smps_allowed(mac_handle_t hal, uint8_t session_id)
Archana Ramachandran20d2e232016-02-11 16:58:40 -080014221{
14222 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
gaurank kathpalia14e2f912017-08-31 14:51:45 +053014223 struct csr_roam_session *csr_session;
Archana Ramachandran20d2e232016-02-11 16:58:40 -080014224
Archana Ramachandran20d2e232016-02-11 16:58:40 -080014225 csr_session = CSR_GET_SESSION(mac_ctx, session_id);
14226 if (NULL == csr_session) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014227 sme_err("SME session not valid: %d", session_id);
Sreelakshmi Konamki58697e12016-05-25 17:30:18 +053014228 return false;
14229 }
14230
14231 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014232 sme_err("CSR session not valid: %d", session_id);
Archana Ramachandran20d2e232016-02-11 16:58:40 -080014233 return false;
14234 }
14235
14236 return (csr_session->supported_nss_1x1 == true) ? false : true;
14237}
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070014238
14239/**
14240 * sme_add_beacon_filter() - set the beacon filter configuration
14241 * @hal: The handle returned by macOpen
14242 * @session_id: session id
14243 * @ie_map: bitwise array of IEs
14244 *
14245 * Return: Return QDF_STATUS, otherwise appropriate failure code
14246 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080014247QDF_STATUS sme_add_beacon_filter(mac_handle_t hal,
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070014248 uint32_t session_id,
14249 uint32_t *ie_map)
14250{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070014251 struct scheduler_msg message = {0};
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070014252 QDF_STATUS qdf_status;
14253 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
14254 struct beacon_filter_param *filter_param;
14255
14256 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014257 sme_err("CSR session not valid: %d", session_id);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070014258 return QDF_STATUS_E_FAILURE;
14259 }
14260
14261 filter_param = qdf_mem_malloc(sizeof(*filter_param));
Arif Hussain0ef77082018-10-10 16:42:53 -070014262 if (!filter_param)
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070014263 return QDF_STATUS_E_FAILURE;
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070014264
14265 filter_param->vdev_id = session_id;
14266
14267 qdf_mem_copy(filter_param->ie_map, ie_map,
14268 BCN_FLT_MAX_ELEMS_IE_LIST * sizeof(uint32_t));
14269
14270 message.type = WMA_ADD_BCN_FILTER_CMDID;
14271 message.bodyptr = filter_param;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014272 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
14273 QDF_MODULE_ID_WMA,
14274 QDF_MODULE_ID_WMA,
14275 &message);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070014276 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
14277 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14278 "%s: Not able to post msg to WDA!",
14279 __func__);
14280
14281 qdf_mem_free(filter_param);
14282 }
14283 return qdf_status;
14284}
14285
14286/**
14287 * sme_remove_beacon_filter() - set the beacon filter configuration
14288 * @hal: The handle returned by macOpen
14289 * @session_id: session id
14290 *
14291 * Return: Return QDF_STATUS, otherwise appropriate failure code
14292 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080014293QDF_STATUS sme_remove_beacon_filter(mac_handle_t hal, uint32_t session_id)
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070014294{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070014295 struct scheduler_msg message = {0};
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070014296 QDF_STATUS qdf_status;
14297 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
14298 struct beacon_filter_param *filter_param;
14299
14300 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014301 sme_err("CSR session not valid: %d", session_id);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070014302 return QDF_STATUS_E_FAILURE;
14303 }
14304
14305 filter_param = qdf_mem_malloc(sizeof(*filter_param));
Arif Hussain0ef77082018-10-10 16:42:53 -070014306 if (!filter_param)
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070014307 return QDF_STATUS_E_FAILURE;
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070014308
14309 filter_param->vdev_id = session_id;
14310
14311 message.type = WMA_REMOVE_BCN_FILTER_CMDID;
14312 message.bodyptr = filter_param;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014313 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
14314 QDF_MODULE_ID_WMA,
14315 QDF_MODULE_ID_WMA,
14316 &message);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070014317 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
14318 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14319 "%s: Not able to post msg to WDA!",
14320 __func__);
14321
14322 qdf_mem_free(filter_param);
14323 }
14324 return qdf_status;
14325}
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014326
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014327/**
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053014328 * sme_send_disassoc_req_frame - send disassoc req
14329 * @hal: handler to hal
14330 * @session_id: session id
14331 * @peer_mac: peer mac address
14332 * @reason: reason for disassociation
14333 * wait_for_ack: wait for acknowledgment
14334 *
14335 * function to send disassoc request to lim
14336 *
14337 * return: none
14338 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080014339void sme_send_disassoc_req_frame(mac_handle_t hal, uint8_t session_id,
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053014340 uint8_t *peer_mac, uint16_t reason, uint8_t wait_for_ack)
14341{
14342 struct sme_send_disassoc_frm_req *msg;
14343 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
14344 A_UINT8 *buf;
14345 A_UINT16 tmp;
14346
14347 msg = qdf_mem_malloc(sizeof(struct sme_send_disassoc_frm_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070014348 if (!msg)
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053014349 return;
14350
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053014351 msg->msg_type = (uint16_t) eWNI_SME_SEND_DISASSOC_FRAME;
14352
14353 msg->length = (uint16_t) sizeof(struct sme_send_disassoc_frm_req);
14354
14355 buf = &msg->session_id;
14356
14357 /* session id */
14358 *buf = (A_UINT8) session_id;
14359 buf += sizeof(A_UINT8);
14360
14361 /* transaction id */
14362 *buf = 0;
14363 *(buf + 1) = 0;
14364 buf += sizeof(A_UINT16);
14365
14366 /* Set the peer MAC address before sending the message to LIM */
14367 qdf_mem_copy(buf, peer_mac, QDF_MAC_ADDR_SIZE);
14368
14369 buf += QDF_MAC_ADDR_SIZE;
14370
14371 /* reasoncode */
14372 tmp = (uint16_t) reason;
14373 qdf_mem_copy(buf, &tmp, sizeof(uint16_t));
14374 buf += sizeof(uint16_t);
14375
14376 *buf = wait_for_ack;
14377 buf += sizeof(uint8_t);
14378
Rajeev Kumard138ac52017-01-30 18:38:37 -080014379 qdf_status = umac_send_mb_message_to_mac(msg);
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053014380
14381 if (qdf_status != QDF_STATUS_SUCCESS)
14382 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14383 FL("cds_send_mb_message Failed"));
14384}
14385
Nachiket Kukade177b5b02018-05-22 20:52:17 +053014386#ifdef FEATURE_WLAN_APF
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080014387QDF_STATUS sme_get_apf_capabilities(mac_handle_t hal,
Nachiket Kukade177b5b02018-05-22 20:52:17 +053014388 apf_get_offload_cb callback,
14389 void *context)
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014390{
14391 QDF_STATUS status = QDF_STATUS_SUCCESS;
14392 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070014393 struct scheduler_msg cds_msg = {0};
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014394
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014395 SME_ENTER();
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014396
14397 status = sme_acquire_global_lock(&mac_ctx->sme);
14398 if (QDF_STATUS_SUCCESS == status) {
14399 /* Serialize the req through MC thread */
Nachiket Kukadee547a482018-05-22 16:43:30 +053014400 mac_ctx->sme.apf_get_offload_cb = callback;
14401 mac_ctx->sme.apf_get_offload_context = context;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014402 cds_msg.bodyptr = NULL;
Nachiket Kukadee547a482018-05-22 16:43:30 +053014403 cds_msg.type = WDA_APF_GET_CAPABILITIES_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014404 status = scheduler_post_message(QDF_MODULE_ID_SME,
14405 QDF_MODULE_ID_WMA,
14406 QDF_MODULE_ID_WMA, &cds_msg);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014407 if (!QDF_IS_STATUS_SUCCESS(status)) {
14408 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Nachiket Kukadee547a482018-05-22 16:43:30 +053014409 FL("Post apf get offload msg fail"));
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014410 status = QDF_STATUS_E_FAILURE;
14411 }
14412 sme_release_global_lock(&mac_ctx->sme);
14413 } else {
14414 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14415 FL("sme_acquire_global_lock error"));
14416 }
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014417 SME_EXIT();
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014418 return status;
14419}
14420
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080014421QDF_STATUS sme_set_apf_instructions(mac_handle_t hal,
Nachiket Kukadee547a482018-05-22 16:43:30 +053014422 struct sir_apf_set_offload *req)
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014423{
14424 QDF_STATUS status = QDF_STATUS_SUCCESS;
14425 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070014426 struct scheduler_msg cds_msg = {0};
Nachiket Kukadee547a482018-05-22 16:43:30 +053014427 struct sir_apf_set_offload *set_offload;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014428
Arun Khandavallica198b52016-04-26 20:53:35 +053014429 set_offload = qdf_mem_malloc(sizeof(*set_offload) +
14430 req->current_length);
Arif Hussain0ef77082018-10-10 16:42:53 -070014431 if (!set_offload)
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014432 return QDF_STATUS_E_NOMEM;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014433
14434 set_offload->session_id = req->session_id;
14435 set_offload->filter_id = req->filter_id;
14436 set_offload->current_offset = req->current_offset;
14437 set_offload->total_length = req->total_length;
Rajeev Kumare5a16822016-07-27 13:11:42 -070014438 set_offload->current_length = req->current_length;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014439 if (set_offload->total_length) {
Arun Khandavallica198b52016-04-26 20:53:35 +053014440 set_offload->program = ((uint8_t *)set_offload) +
14441 sizeof(*set_offload);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014442 qdf_mem_copy(set_offload->program, req->program,
14443 set_offload->current_length);
14444 }
14445 status = sme_acquire_global_lock(&mac_ctx->sme);
14446 if (QDF_STATUS_SUCCESS == status) {
14447 /* Serialize the req through MC thread */
14448 cds_msg.bodyptr = set_offload;
Nachiket Kukadee547a482018-05-22 16:43:30 +053014449 cds_msg.type = WDA_APF_SET_INSTRUCTIONS_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014450 status = scheduler_post_message(QDF_MODULE_ID_SME,
14451 QDF_MODULE_ID_WMA,
14452 QDF_MODULE_ID_WMA, &cds_msg);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014453
14454 if (!QDF_IS_STATUS_SUCCESS(status)) {
14455 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Nachiket Kukadee547a482018-05-22 16:43:30 +053014456 FL("Post APF set offload msg fail"));
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014457 status = QDF_STATUS_E_FAILURE;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014458 qdf_mem_free(set_offload);
14459 }
14460 sme_release_global_lock(&mac_ctx->sme);
14461 } else {
14462 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14463 FL("sme_acquire_global_lock failed"));
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014464 qdf_mem_free(set_offload);
14465 }
14466 return status;
14467}
14468
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080014469QDF_STATUS sme_set_apf_enable_disable(mac_handle_t hal, uint8_t vdev_id,
Nachiket Kukade177b5b02018-05-22 20:52:17 +053014470 bool apf_enable)
14471{
14472 void *wma_handle;
14473
14474 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14475 if (!wma_handle) {
14476 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14477 "wma handle is NULL");
14478 return QDF_STATUS_E_FAILURE;
14479 }
14480
14481 return wma_send_apf_enable_cmd(wma_handle, vdev_id, apf_enable);
14482}
14483
14484QDF_STATUS
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080014485sme_apf_write_work_memory(mac_handle_t hal,
Nachiket Kukade177b5b02018-05-22 20:52:17 +053014486 struct wmi_apf_write_memory_params *write_params)
14487{
14488 void *wma_handle;
14489
14490 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14491 if (!wma_handle) {
14492 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14493 "wma handle is NULL");
14494 return QDF_STATUS_E_FAILURE;
14495 }
14496
14497 return wma_send_apf_write_work_memory_cmd(wma_handle, write_params);
14498}
14499
14500QDF_STATUS
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080014501sme_apf_read_work_memory(mac_handle_t hal,
Nachiket Kukade177b5b02018-05-22 20:52:17 +053014502 struct wmi_apf_read_memory_params *read_params,
14503 apf_read_mem_cb callback)
14504{
14505 QDF_STATUS status = QDF_STATUS_SUCCESS;
14506 tpAniSirGlobal mac = PMAC_STRUCT(hal);
14507 void *wma_handle;
14508
14509 status = sme_acquire_global_lock(&mac->sme);
14510 if (QDF_IS_STATUS_SUCCESS(status)) {
14511 mac->sme.apf_read_mem_cb = callback;
14512 sme_release_global_lock(&mac->sme);
14513 } else {
14514 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14515 FL("sme_acquire_global_lock failed"));
14516 }
14517
14518 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14519 if (!wma_handle) {
14520 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14521 "wma handle is NULL");
14522 return QDF_STATUS_E_FAILURE;
14523 }
14524
14525 return wma_send_apf_read_work_memory_cmd(wma_handle, read_params);
14526}
14527#endif /* FEATURE_WLAN_APF */
14528
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014529/**
Abhishek Singh1c676222016-05-09 14:20:28 +053014530 * sme_get_wni_dot11_mode() - return configured wni dot11mode
14531 * @hal: hal pointer
14532 *
14533 * Return: wni dot11 mode.
14534 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080014535uint32_t sme_get_wni_dot11_mode(mac_handle_t hal)
Abhishek Singh1c676222016-05-09 14:20:28 +053014536{
14537 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
14538
14539 return csr_translate_to_wni_cfg_dot11_mode(mac_ctx,
14540 mac_ctx->roam.configParam.uCfgDot11Mode);
14541}
14542
14543/**
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070014544 * sme_create_mon_session() - post message to create PE session for monitormode
14545 * operation
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014546 * @mac_handle: Handle to the HAL
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070014547 * @bssid: pointer to bssid
Rajeev Kumar Sirasanagandlae3b59912018-08-24 15:53:31 +053014548 * @vdev_id: sme session id
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070014549 *
14550 * Return: QDF_STATUS_SUCCESS on success, non-zero error code on failure.
14551 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014552QDF_STATUS sme_create_mon_session(mac_handle_t mac_handle, tSirMacAddr bss_id,
Rajeev Kumar Sirasanagandlae3b59912018-08-24 15:53:31 +053014553 uint8_t vdev_id)
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070014554{
14555 QDF_STATUS status = QDF_STATUS_E_FAILURE;
14556 struct sir_create_session *msg;
14557
14558 msg = qdf_mem_malloc(sizeof(*msg));
chenguo92af4bf2018-10-25 13:54:58 +080014559 if (msg) {
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070014560 msg->type = eWNI_SME_MON_INIT_SESSION;
Rajeev Kumar Sirasanagandlae3b59912018-08-24 15:53:31 +053014561 msg->vdev_id = vdev_id;
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070014562 msg->msg_len = sizeof(*msg);
14563 qdf_mem_copy(msg->bss_id.bytes, bss_id, QDF_MAC_ADDR_SIZE);
Rajeev Kumard138ac52017-01-30 18:38:37 -080014564 status = umac_send_mb_message_to_mac(msg);
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070014565 }
14566 return status;
14567}
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053014568
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014569void sme_set_chan_info_callback(mac_handle_t mac_handle,
Kapil Gupta4f0c0c12017-02-07 15:21:15 +053014570 void (*callback)(struct scan_chan_info *chan_info))
14571{
14572 tpAniSirGlobal mac;
14573
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014574 if (mac_handle == NULL) {
Kapil Gupta4f0c0c12017-02-07 15:21:15 +053014575 QDF_ASSERT(0);
14576 return;
14577 }
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014578 mac = PMAC_STRUCT(mac_handle);
Kapil Gupta4f0c0c12017-02-07 15:21:15 +053014579 mac->chan_info_cb = callback;
14580}
14581
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053014582/**
14583 * sme_set_adaptive_dwelltime_config() - Update Adaptive dwelltime configuration
14584 * @hal: The handle returned by macOpen
14585 * @params: adaptive_dwelltime_params config
14586 *
14587 * Return: QDF_STATUS if adaptive dwell time update
Jeff Johnson698eacd2018-05-12 17:00:03 -070014588 * configuration success else failure status
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053014589 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080014590QDF_STATUS sme_set_adaptive_dwelltime_config(mac_handle_t hal,
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053014591 struct adaptive_dwelltime_params *params)
14592{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070014593 struct scheduler_msg message = {0};
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053014594 QDF_STATUS status;
14595 struct adaptive_dwelltime_params *dwelltime_params;
14596
14597 dwelltime_params = qdf_mem_malloc(sizeof(*dwelltime_params));
Arif Hussain0ef77082018-10-10 16:42:53 -070014598 if (!dwelltime_params)
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053014599 return QDF_STATUS_E_NOMEM;
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053014600
14601 dwelltime_params->is_enabled = params->is_enabled;
14602 dwelltime_params->dwelltime_mode = params->dwelltime_mode;
14603 dwelltime_params->lpf_weight = params->lpf_weight;
14604 dwelltime_params->passive_mon_intval = params->passive_mon_intval;
14605 dwelltime_params->wifi_act_threshold = params->wifi_act_threshold;
14606
14607 message.type = WMA_SET_ADAPT_DWELLTIME_CONF_PARAMS;
14608 message.bodyptr = dwelltime_params;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014609 status = scheduler_post_message(QDF_MODULE_ID_SME,
14610 QDF_MODULE_ID_WMA,
14611 QDF_MODULE_ID_WMA, &message);
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053014612 if (!QDF_IS_STATUS_SUCCESS(status)) {
14613 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14614 "%s: Not able to post msg to WMA!", __func__);
14615
14616 qdf_mem_free(dwelltime_params);
14617 }
14618 return status;
14619}
Naveen Rawata410c5a2016-09-19 14:22:33 -070014620
14621/**
14622 * sme_set_vdev_ies_per_band() - sends the per band IEs to vdev
14623 * @hal: Pointer to HAL
14624 * @vdev_id: vdev_id for which IE is targeted
14625 *
14626 * Return: None
14627 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080014628void sme_set_vdev_ies_per_band(mac_handle_t hal, uint8_t vdev_id)
Naveen Rawata410c5a2016-09-19 14:22:33 -070014629{
Naveen Rawata410c5a2016-09-19 14:22:33 -070014630 struct sir_set_vdev_ies_per_band *p_msg;
14631 QDF_STATUS status = QDF_STATUS_E_FAILURE;
14632
14633 p_msg = qdf_mem_malloc(sizeof(*p_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070014634 if (!p_msg)
Naveen Rawata410c5a2016-09-19 14:22:33 -070014635 return;
Naveen Rawata410c5a2016-09-19 14:22:33 -070014636
14637 p_msg->vdev_id = vdev_id;
14638 p_msg->msg_type = eWNI_SME_SET_VDEV_IES_PER_BAND;
14639 p_msg->len = sizeof(*p_msg);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014640 sme_debug("sending eWNI_SME_SET_VDEV_IES_PER_BAND: vdev_id: %d",
Naveen Rawata410c5a2016-09-19 14:22:33 -070014641 vdev_id);
Rajeev Kumard138ac52017-01-30 18:38:37 -080014642 status = umac_send_mb_message_to_mac(p_msg);
Naveen Rawata410c5a2016-09-19 14:22:33 -070014643 if (QDF_STATUS_SUCCESS != status)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014644 sme_err("Send eWNI_SME_SET_VDEV_IES_PER_BAND fail");
Naveen Rawata410c5a2016-09-19 14:22:33 -070014645}
14646
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070014647/**
14648 * sme_set_pdev_ht_vht_ies() - sends the set pdev IE req
14649 * @hal: Pointer to HAL
14650 * @enable2x2: 1x1 or 2x2 mode.
14651 *
14652 * Sends the set pdev IE req with Nss value.
14653 *
14654 * Return: None
14655 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080014656void sme_set_pdev_ht_vht_ies(mac_handle_t hal, bool enable2x2)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070014657{
14658 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
14659 struct sir_set_ht_vht_cfg *ht_vht_cfg;
14660 QDF_STATUS status = QDF_STATUS_E_FAILURE;
14661
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070014662 if (!((mac_ctx->roam.configParam.uCfgDot11Mode ==
14663 eCSR_CFG_DOT11_MODE_AUTO) ||
14664 (mac_ctx->roam.configParam.uCfgDot11Mode ==
14665 eCSR_CFG_DOT11_MODE_11N) ||
14666 (mac_ctx->roam.configParam.uCfgDot11Mode ==
14667 eCSR_CFG_DOT11_MODE_11N_ONLY) ||
14668 (mac_ctx->roam.configParam.uCfgDot11Mode ==
14669 eCSR_CFG_DOT11_MODE_11AC) ||
14670 (mac_ctx->roam.configParam.uCfgDot11Mode ==
14671 eCSR_CFG_DOT11_MODE_11AC_ONLY)))
14672 return;
14673
14674 status = sme_acquire_global_lock(&mac_ctx->sme);
14675 if (QDF_STATUS_SUCCESS == status) {
14676 ht_vht_cfg = qdf_mem_malloc(sizeof(*ht_vht_cfg));
Arif Hussain0ef77082018-10-10 16:42:53 -070014677 if (!ht_vht_cfg) {
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070014678 sme_release_global_lock(&mac_ctx->sme);
14679 return;
14680 }
14681
14682 ht_vht_cfg->pdev_id = 0;
14683 if (enable2x2)
14684 ht_vht_cfg->nss = 2;
14685 else
14686 ht_vht_cfg->nss = 1;
14687 ht_vht_cfg->dot11mode =
14688 (uint8_t)csr_translate_to_wni_cfg_dot11_mode(mac_ctx,
14689 mac_ctx->roam.configParam.uCfgDot11Mode);
14690
14691 ht_vht_cfg->msg_type = eWNI_SME_PDEV_SET_HT_VHT_IE;
14692 ht_vht_cfg->len = sizeof(*ht_vht_cfg);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014693 sme_debug("SET_HT_VHT_IE with nss: %d, dot11mode: %d",
14694 ht_vht_cfg->nss,
14695 ht_vht_cfg->dot11mode);
Rajeev Kumard138ac52017-01-30 18:38:37 -080014696 status = umac_send_mb_message_to_mac(ht_vht_cfg);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053014697 if (QDF_STATUS_SUCCESS != status)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014698 sme_err("Send SME_PDEV_SET_HT_VHT_IE fail");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053014699
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070014700 sme_release_global_lock(&mac_ctx->sme);
14701 }
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070014702}
14703
14704/**
14705 * sme_update_vdev_type_nss() - sets the nss per vdev type
14706 * @hal: Pointer to HAL
14707 * @max_supp_nss: max_supported Nss
14708 * @band: 5G or 2.4G band
14709 *
14710 * Sets the per band Nss for each vdev type based on INI and configured
14711 * chain mask value.
14712 *
14713 * Return: None
14714 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080014715void sme_update_vdev_type_nss(mac_handle_t hal, uint8_t max_supp_nss,
Varun Reddy Yeturua48bc412017-11-17 15:33:35 -080014716 uint32_t vdev_type_nss, enum band_info band)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070014717{
14718 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
14719 struct vdev_type_nss *vdev_nss;
14720
Varun Reddy Yeturua48bc412017-11-17 15:33:35 -080014721 if (BAND_5G == band)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070014722 vdev_nss = &mac_ctx->vdev_type_nss_5g;
14723 else
14724 vdev_nss = &mac_ctx->vdev_type_nss_2g;
14725
14726 vdev_nss->sta = QDF_MIN(max_supp_nss, CFG_STA_NSS(vdev_type_nss));
14727 vdev_nss->sap = QDF_MIN(max_supp_nss, CFG_SAP_NSS(vdev_type_nss));
14728 vdev_nss->p2p_go = QDF_MIN(max_supp_nss,
14729 CFG_P2P_GO_NSS(vdev_type_nss));
14730 vdev_nss->p2p_cli = QDF_MIN(max_supp_nss,
14731 CFG_P2P_CLI_NSS(vdev_type_nss));
14732 vdev_nss->p2p_dev = QDF_MIN(max_supp_nss,
14733 CFG_P2P_DEV_NSS(vdev_type_nss));
14734 vdev_nss->ibss = QDF_MIN(max_supp_nss, CFG_IBSS_NSS(vdev_type_nss));
14735 vdev_nss->tdls = QDF_MIN(max_supp_nss, CFG_TDLS_NSS(vdev_type_nss));
14736 vdev_nss->ocb = QDF_MIN(max_supp_nss, CFG_OCB_NSS(vdev_type_nss));
14737
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014738 sme_debug("band %d NSS:sta %d sap %d cli %d go %d dev %d ibss %d tdls %d ocb %d",
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070014739 band, vdev_nss->sta, vdev_nss->sap, vdev_nss->p2p_cli,
14740 vdev_nss->p2p_go, vdev_nss->p2p_dev, vdev_nss->ibss,
14741 vdev_nss->tdls, vdev_nss->ocb);
14742}
Peng Xu8fdaa492016-06-22 10:20:47 -070014743
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070014744#ifdef WLAN_FEATURE_11AX_BSS_COLOR
14745#define MAX_BSS_COLOR_VAL 63
14746#define MIN_BSS_COLOR_VAL 1
14747
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080014748QDF_STATUS sme_set_he_bss_color(mac_handle_t hal, uint8_t session_id,
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070014749 uint8_t bss_color)
14750
14751{
14752 struct sir_set_he_bss_color *bss_color_msg;
14753 uint8_t len;
14754
14755 if (!hal) {
14756 sme_err("Invalid hal pointer");
14757 return QDF_STATUS_E_FAULT;
14758 }
14759
14760 sme_debug("Set HE bss_color %d", bss_color);
14761
14762 if (bss_color < MIN_BSS_COLOR_VAL || bss_color > MAX_BSS_COLOR_VAL) {
14763 sme_debug("Invalid HE bss_color %d", bss_color);
14764 return QDF_STATUS_E_INVAL;
14765 }
14766 len = sizeof(*bss_color_msg);
14767 bss_color_msg = qdf_mem_malloc(len);
Arif Hussain0ef77082018-10-10 16:42:53 -070014768 if (!bss_color_msg)
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070014769 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070014770
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070014771 bss_color_msg->message_type = eWNI_SME_SET_HE_BSS_COLOR;
14772 bss_color_msg->length = len;
14773 bss_color_msg->session_id = session_id;
14774 bss_color_msg->bss_color = bss_color;
14775 return umac_send_mb_message_to_mac(bss_color_msg);
14776}
14777#endif
14778
Peng Xu8fdaa492016-06-22 10:20:47 -070014779/**
Nitesh Shahdb5ea0d2017-03-22 15:17:47 +053014780 * sme_update_hw_dbs_capable() - sets the HW DBS capability
14781 * @hal: Pointer to HAL
14782 * @hw_dbs_capable: HW DBS capability
14783 *
14784 * Sets HW DBS capability based on INI and fw capability.
14785 *
14786 * Return: None
14787 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080014788void sme_update_hw_dbs_capable(mac_handle_t hal, uint8_t hw_dbs_capable)
Nitesh Shahdb5ea0d2017-03-22 15:17:47 +053014789{
14790 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053014791
Nitesh Shahdb5ea0d2017-03-22 15:17:47 +053014792 mac_ctx->hw_dbs_capable = hw_dbs_capable;
14793}
14794
Rachit Kankane026e77a2018-07-31 16:21:09 +053014795#ifdef FEATURE_P2P_LISTEN_OFFLOAD
Nitesh Shahdb5ea0d2017-03-22 15:17:47 +053014796/**
Peng Xu8fdaa492016-06-22 10:20:47 -070014797 * sme_register_p2p_lo_event() - Register for the p2p lo event
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014798 * @mac_handle: reference to the HAL
Peng Xu8fdaa492016-06-22 10:20:47 -070014799 * @context: the context of the call
14800 * @callback: the callback to hdd
14801 *
14802 * This function registers the callback function for P2P listen
14803 * offload stop event.
14804 *
14805 * Return: none
14806 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014807void sme_register_p2p_lo_event(mac_handle_t mac_handle, void *context,
Jeff Johnsonf7e36d62018-07-04 21:14:02 -070014808 p2p_lo_callback callback)
Peng Xu8fdaa492016-06-22 10:20:47 -070014809{
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014810 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Peng Xu8fdaa492016-06-22 10:20:47 -070014811 QDF_STATUS status = QDF_STATUS_E_FAILURE;
14812
14813 status = sme_acquire_global_lock(&pMac->sme);
14814 pMac->sme.p2p_lo_event_callback = callback;
14815 pMac->sme.p2p_lo_event_context = context;
14816 sme_release_global_lock(&pMac->sme);
14817}
Rachit Kankane026e77a2018-07-31 16:21:09 +053014818#endif
Manjeet Singhf82ed072016-07-08 11:40:00 +053014819
14820/**
14821 * sme_process_mac_pwr_dbg_cmd() - enable mac pwr debugging
14822 * @hal: The handle returned by macOpen
14823 * @session_id: session id
14824 * @dbg_args: args for mac pwr debug command
14825 * Return: Return QDF_STATUS, otherwise appropriate failure code
14826 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080014827QDF_STATUS sme_process_mac_pwr_dbg_cmd(mac_handle_t hal, uint32_t session_id,
Manjeet Singhf82ed072016-07-08 11:40:00 +053014828 struct sir_mac_pwr_dbg_cmd*
14829 dbg_args)
14830{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070014831 struct scheduler_msg message = {0};
Manjeet Singhf82ed072016-07-08 11:40:00 +053014832 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
14833 struct sir_mac_pwr_dbg_cmd *req;
14834 int i;
14835
14836 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014837 sme_err("CSR session not valid: %d", session_id);
Manjeet Singhf82ed072016-07-08 11:40:00 +053014838 return QDF_STATUS_E_FAILURE;
14839 }
14840
14841 req = qdf_mem_malloc(sizeof(*req));
Arif Hussain0ef77082018-10-10 16:42:53 -070014842 if (!req)
Manjeet Singhf82ed072016-07-08 11:40:00 +053014843 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -070014844
Manjeet Singhf82ed072016-07-08 11:40:00 +053014845 req->module_id = dbg_args->module_id;
14846 req->pdev_id = dbg_args->pdev_id;
14847 req->num_args = dbg_args->num_args;
14848 for (i = 0; i < req->num_args; i++)
14849 req->args[i] = dbg_args->args[i];
14850
14851 message.type = SIR_HAL_POWER_DBG_CMD;
14852 message.bodyptr = req;
14853
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014854 if (!QDF_IS_STATUS_SUCCESS(scheduler_post_message(QDF_MODULE_ID_SME,
14855 QDF_MODULE_ID_WMA,
14856 QDF_MODULE_ID_WMA,
14857 &message))) {
Manjeet Singhf82ed072016-07-08 11:40:00 +053014858 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14859 "%s: Not able to post msg to WDA!",
14860 __func__);
14861 qdf_mem_free(req);
14862 }
14863 return QDF_STATUS_SUCCESS;
14864}
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070014865/**
14866 * sme_get_vdev_type_nss() - gets the nss per vdev type
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070014867 * @dev_mode: connection type.
14868 * @nss2g: Pointer to the 2G Nss parameter.
14869 * @nss5g: Pointer to the 5G Nss parameter.
14870 *
14871 * Fills the 2G and 5G Nss values based on connection type.
14872 *
14873 * Return: None
14874 */
Jeff Johnsonc1e62782017-11-09 09:50:17 -080014875void sme_get_vdev_type_nss(enum QDF_OPMODE dev_mode,
14876 uint8_t *nss_2g, uint8_t *nss_5g)
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070014877{
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080014878 tpAniSirGlobal mac_ctx = sme_get_mac_context();
14879
14880 if (NULL == mac_ctx) {
14881 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14882 FL("Invalid MAC context"));
14883 return;
14884 }
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070014885 csr_get_vdev_type_nss(mac_ctx, dev_mode, nss_2g, nss_5g);
14886}
Agrawal Ashish21ba2572016-09-03 16:40:10 +053014887
14888/**
14889 * sme_update_sta_roam_policy() - update sta roam policy for
14890 * unsafe and DFS channels.
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014891 * @mac_handle: hal handle for getting global mac struct
Agrawal Ashish21ba2572016-09-03 16:40:10 +053014892 * @dfs_mode: dfs mode which tell if dfs channel needs to be
14893 * skipped or not
14894 * @skip_unsafe_channels: Param to tell if driver needs to
14895 * skip unsafe channels or not.
14896 * @param session_id: sme_session_id
Agrawal, Ashish9f84c402016-11-30 16:19:44 +053014897 * @sap_operating_band: Band on which SAP is operating
Agrawal Ashish21ba2572016-09-03 16:40:10 +053014898 *
14899 * sme_update_sta_roam_policy update sta rome policies to csr
14900 * this function will call csrUpdateChannelList as well
14901 * to include/exclude DFS channels and unsafe channels.
14902 *
14903 * Return: eHAL_STATUS_SUCCESS or non-zero on failure.
14904 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014905QDF_STATUS sme_update_sta_roam_policy(mac_handle_t mac_handle,
Agrawal Ashish21ba2572016-09-03 16:40:10 +053014906 enum sta_roam_policy_dfs_mode dfs_mode,
14907 bool skip_unsafe_channels,
Agrawal, Ashish9f84c402016-11-30 16:19:44 +053014908 uint8_t session_id, uint8_t sap_operating_band)
Agrawal Ashish21ba2572016-09-03 16:40:10 +053014909{
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014910 tpAniSirGlobal mac_ctx = PMAC_STRUCT(mac_handle);
Agrawal Ashish21ba2572016-09-03 16:40:10 +053014911 QDF_STATUS status = QDF_STATUS_SUCCESS;
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053014912 tSmeConfigParams *sme_config;
Agrawal Ashish21ba2572016-09-03 16:40:10 +053014913
14914 if (!mac_ctx) {
14915 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
14916 "%s: mac_ctx is null", __func__);
14917 return QDF_STATUS_E_FAILURE;
14918 }
Agrawal Ashish21ba2572016-09-03 16:40:10 +053014919
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053014920 sme_config = qdf_mem_malloc(sizeof(*sme_config));
Arif Hussain0ef77082018-10-10 16:42:53 -070014921 if (!sme_config)
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053014922 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -070014923
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053014924 qdf_mem_zero(sme_config, sizeof(*sme_config));
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014925 sme_get_config_param(mac_handle, sme_config);
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053014926
14927 sme_config->csrConfig.sta_roam_policy_params.dfs_mode =
Agrawal Ashish21ba2572016-09-03 16:40:10 +053014928 dfs_mode;
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053014929 sme_config->csrConfig.sta_roam_policy_params.skip_unsafe_channels =
Agrawal Ashish21ba2572016-09-03 16:40:10 +053014930 skip_unsafe_channels;
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053014931 sme_config->csrConfig.sta_roam_policy_params.sap_operating_band =
Agrawal, Ashish9f84c402016-11-30 16:19:44 +053014932 sap_operating_band;
Agrawal Ashish21ba2572016-09-03 16:40:10 +053014933
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014934 sme_update_config(mac_handle, sme_config);
Agrawal Ashish21ba2572016-09-03 16:40:10 +053014935
14936 status = csr_update_channel_list(mac_ctx);
14937 if (QDF_STATUS_SUCCESS != status) {
14938 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14939 FL("failed to update the supported channel list"));
14940 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053014941
14942 if (mac_ctx->roam.configParam.isRoamOffloadScanEnabled) {
14943 status = sme_acquire_global_lock(&mac_ctx->sme);
14944 if (QDF_IS_STATUS_SUCCESS(status)) {
14945 csr_roam_offload_scan(mac_ctx, session_id,
Agrawal Ashish21ba2572016-09-03 16:40:10 +053014946 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
14947 REASON_ROAM_SCAN_STA_ROAM_POLICY_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053014948 sme_release_global_lock(&mac_ctx->sme);
14949 } else {
14950 sme_err("Failed to acquire SME lock");
14951 }
14952 }
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053014953 qdf_mem_free(sme_config);
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053014954 return status;
14955}
14956
14957/**
14958 * sme_enable_disable_chanavoidind_event - configure ca event ind
14959 * @hal: handler to hal
14960 * @set_value: enable/disable
14961 *
14962 * function to enable/disable chan avoidance indication
14963 *
14964 * Return: QDF_STATUS
14965 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080014966QDF_STATUS sme_enable_disable_chanavoidind_event(mac_handle_t hal,
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053014967 uint8_t set_value)
14968{
14969 QDF_STATUS status;
14970 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070014971 struct scheduler_msg msg = {0};
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053014972
Vignesh Viswanathana1f3a1a2018-10-04 13:10:46 +053014973 if (!mac_ctx->mlme_cfg->gen.optimize_ca_event) {
14974 sme_err("optimize_ca_event not enabled in ini");
14975 return QDF_STATUS_E_NOSUPPORT;
14976 }
14977
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014978 sme_debug("set_value: %d", set_value);
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053014979 status = sme_acquire_global_lock(&mac_ctx->sme);
14980 if (QDF_STATUS_SUCCESS == status) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080014981 qdf_mem_zero(&msg, sizeof(struct scheduler_msg));
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053014982 msg.type = WMA_SEND_FREQ_RANGE_CONTROL_IND;
14983 msg.bodyval = set_value;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014984 status = scheduler_post_message(QDF_MODULE_ID_SME,
14985 QDF_MODULE_ID_WMA,
14986 QDF_MODULE_ID_WMA, &msg);
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053014987 sme_release_global_lock(&mac_ctx->sme);
14988 return status;
14989 }
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053014990 return status;
14991}
Agrawal Ashish21ba2572016-09-03 16:40:10 +053014992
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053014993/*
14994 * sme_set_default_scan_ie() - API to send default scan IE to LIM
14995 * @hal: reference to the HAL
14996 * @session_id: current session ID
14997 * @ie_data: Pointer to Scan IE data
14998 * @ie_len: Length of @ie_data
14999 *
15000 * Return: QDF_STATUS
15001 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080015002QDF_STATUS sme_set_default_scan_ie(mac_handle_t hal, uint16_t session_id,
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053015003 uint8_t *ie_data, uint16_t ie_len)
15004{
15005 QDF_STATUS status;
15006 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15007 struct hdd_default_scan_ie *set_ie_params;
15008
Rajeev Kumar5d17dd52017-12-19 16:17:42 -080015009 if (!ie_data)
15010 return QDF_STATUS_E_INVAL;
15011
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053015012 status = sme_acquire_global_lock(&mac_ctx->sme);
15013 if (QDF_IS_STATUS_SUCCESS(status)) {
15014 set_ie_params = qdf_mem_malloc(sizeof(*set_ie_params));
15015 if (!set_ie_params)
15016 status = QDF_STATUS_E_NOMEM;
15017 else {
15018 set_ie_params->message_type = eWNI_SME_DEFAULT_SCAN_IE;
15019 set_ie_params->length = sizeof(*set_ie_params);
15020 set_ie_params->session_id = session_id;
15021 set_ie_params->ie_len = ie_len;
15022 qdf_mem_copy(set_ie_params->ie_data, ie_data, ie_len);
Rajeev Kumard138ac52017-01-30 18:38:37 -080015023 status = umac_send_mb_message_to_mac(set_ie_params);
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053015024 }
15025 sme_release_global_lock(&mac_ctx->sme);
15026 }
Agrawal Ashish21ba2572016-09-03 16:40:10 +053015027 return status;
15028}
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053015029
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080015030QDF_STATUS sme_get_sar_power_limits(mac_handle_t hal,
Jeff Johnsonf0e54b02017-12-18 15:22:25 -080015031 wma_sar_cb callback, void *context)
15032{
15033 void *wma_handle;
15034
15035 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
15036 if (!wma_handle) {
15037 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15038 "wma handle is NULL");
15039 return QDF_STATUS_E_FAILURE;
15040 }
15041
15042 return wma_get_sar_limit(wma_handle, callback, context);
15043}
15044
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080015045QDF_STATUS sme_set_sar_power_limits(mac_handle_t hal,
Kabilan Kannan3c0a7352016-12-02 18:49:38 -080015046 struct sar_limit_cmd_params *sar_limit_cmd)
15047{
15048 void *wma_handle;
15049
15050 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
15051 if (!wma_handle) {
15052 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15053 "wma handle is NULL");
15054 return QDF_STATUS_E_FAILURE;
15055 }
15056
15057 return wma_set_sar_limit(wma_handle, sar_limit_cmd);
15058}
15059
Dundi Raviteja3b637092018-09-12 13:42:50 +053015060QDF_STATUS sme_send_coex_config_cmd(struct coex_config_params *coex_cfg_params)
15061{
15062 void *wma_handle;
15063
15064 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
15065 if (!wma_handle) {
15066 sme_err("wma handle is NULL");
15067 return QDF_STATUS_E_FAILURE;
15068 }
15069 return wma_send_coex_config_cmd(wma_handle, coex_cfg_params);
15070}
15071
Jeff Johnson6136fb92017-03-30 15:21:49 -070015072#ifdef WLAN_FEATURE_FIPS
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080015073QDF_STATUS sme_fips_request(mac_handle_t hal, struct fips_params *param,
Jeff Johnson6136fb92017-03-30 15:21:49 -070015074 wma_fips_cb callback, void *context)
15075{
15076 void *wma_handle;
15077
15078 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
15079 if (!wma_handle) {
15080 sme_err("wma handle is NULL");
15081 return QDF_STATUS_E_FAILURE;
15082 }
15083
15084 return wma_fips_request(wma_handle, param, callback, context);
15085}
15086#endif
15087
Jeff Johnsonb460dd72018-11-08 10:26:51 -080015088QDF_STATUS sme_set_cts2self_for_p2p_go(mac_handle_t mac_handle)
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053015089{
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053015090 void *wma_handle;
15091
15092 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
15093 if (!wma_handle) {
15094 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15095 "wma_handle is NULL");
15096 return QDF_STATUS_E_FAILURE;
15097 }
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053015098 if (QDF_STATUS_SUCCESS !=
15099 wma_set_cts2self_for_p2p_go(wma_handle, true)) {
15100 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15101 "%s: Failed to set cts2self for p2p GO to firmware",
15102 __func__);
15103 return QDF_STATUS_E_FAILURE;
15104 }
15105 return QDF_STATUS_SUCCESS;
15106}
Yingying Tang95409972016-10-20 15:16:15 +080015107
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053015108/**
15109 * sme_update_tx_fail_cnt_threshold() - update tx fail count Threshold
Jeff Johnsonb460dd72018-11-08 10:26:51 -080015110 * @mac_handle: Handle returned by mac_open
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053015111 * @session_id: Session ID on which tx fail count needs to be updated to FW
15112 * @tx_fail_count: Count for tx fail threshold after which FW will disconnect
15113 *
15114 * This function is used to set tx fail count threshold to firmware.
15115 * firmware will issue disocnnect with peer device once this threshold is
15116 * reached.
15117 *
15118 * Return: Return QDF_STATUS, otherwise appropriate failure code
15119 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080015120QDF_STATUS sme_update_tx_fail_cnt_threshold(mac_handle_t mac_handle,
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053015121 uint8_t session_id, uint32_t tx_fail_count)
15122{
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053015123 QDF_STATUS status = QDF_STATUS_E_FAILURE;
15124 struct sme_tx_fail_cnt_threshold *tx_fail_cnt;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070015125 struct scheduler_msg msg = {0};
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053015126
15127 tx_fail_cnt = qdf_mem_malloc(sizeof(*tx_fail_cnt));
Arif Hussain0ef77082018-10-10 16:42:53 -070015128 if (!tx_fail_cnt)
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053015129 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -070015130
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070015131 sme_debug("session_id: %d tx_fail_count: %d",
15132 session_id, tx_fail_count);
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053015133 tx_fail_cnt->session_id = session_id;
15134 tx_fail_cnt->tx_fail_cnt_threshold = tx_fail_count;
15135
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080015136 qdf_mem_zero(&msg, sizeof(struct scheduler_msg));
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053015137 msg.type = SIR_HAL_UPDATE_TX_FAIL_CNT_TH;
15138 msg.reserved = 0;
15139 msg.bodyptr = tx_fail_cnt;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053015140 status = scheduler_post_message(QDF_MODULE_ID_SME,
15141 QDF_MODULE_ID_WMA,
15142 QDF_MODULE_ID_WMA, &msg);
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053015143
15144 if (!QDF_IS_STATUS_SUCCESS(status)) {
15145 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053015146 FL("Not able to post Tx fail count message to WDA"));
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053015147 qdf_mem_free(tx_fail_cnt);
15148 }
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053015149 return status;
15150}
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053015151
Jeff Johnsondc198ec2018-07-04 17:39:53 -070015152QDF_STATUS sme_set_lost_link_info_cb(mac_handle_t mac_handle,
15153 lost_link_info_cb cb)
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053015154{
Jeff Johnsondc198ec2018-07-04 17:39:53 -070015155 QDF_STATUS status;
15156 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053015157
15158 status = sme_acquire_global_lock(&mac->sme);
15159 if (QDF_IS_STATUS_SUCCESS(status)) {
15160 mac->sme.lost_link_info_cb = cb;
15161 sme_release_global_lock(&mac->sme);
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053015162 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053015163 sme_err("sme_acquire_global_lock error status: %d", status);
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053015164 }
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053015165
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053015166 return status;
15167}
Yingying Tang95409972016-10-20 15:16:15 +080015168
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053015169#ifdef FEATURE_WLAN_ESE
Jeff Johnson172237b2017-11-07 15:32:59 -080015170bool sme_roam_is_ese_assoc(struct csr_roam_info *roam_info)
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053015171{
15172 return roam_info->isESEAssoc;
15173}
Manjeet Singh2f785062017-03-08 18:14:18 +053015174#endif
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053015175
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080015176bool sme_neighbor_roam_is11r_assoc(mac_handle_t hal_ctx, uint8_t session_id)
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053015177{
15178 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_ctx);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053015179
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053015180 return csr_neighbor_roam_is11r_assoc(mac_ctx, session_id);
15181}
Yingying Tang95409972016-10-20 15:16:15 +080015182
15183#ifdef WLAN_FEATURE_WOW_PULSE
15184/**
15185 * sme_set_wow_pulse() - set wow pulse info
15186 * @wow_pulse_set_info: wow_pulse_mode structure pointer
15187 *
15188 * Return: QDF_STATUS
15189 */
15190QDF_STATUS sme_set_wow_pulse(struct wow_pulse_mode *wow_pulse_set_info)
15191{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070015192 struct scheduler_msg message = {0};
Yingying Tang95409972016-10-20 15:16:15 +080015193 QDF_STATUS status;
15194 struct wow_pulse_mode *wow_pulse_set_cmd;
15195
15196 if (!wow_pulse_set_info) {
15197 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15198 "%s: invalid wow_pulse_set_info pointer", __func__);
15199 return QDF_STATUS_E_FAILURE;
15200 }
15201
15202 wow_pulse_set_cmd = qdf_mem_malloc(sizeof(*wow_pulse_set_cmd));
Arif Hussain0ef77082018-10-10 16:42:53 -070015203 if (!wow_pulse_set_cmd)
Yingying Tang95409972016-10-20 15:16:15 +080015204 return QDF_STATUS_E_NOMEM;
Yingying Tang95409972016-10-20 15:16:15 +080015205
15206 *wow_pulse_set_cmd = *wow_pulse_set_info;
15207
15208 message.type = WMA_SET_WOW_PULSE_CMD;
15209 message.bodyptr = wow_pulse_set_cmd;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053015210 status = scheduler_post_message(QDF_MODULE_ID_SME,
15211 QDF_MODULE_ID_WMA,
15212 QDF_MODULE_ID_WMA,
Yingying Tang95409972016-10-20 15:16:15 +080015213 &message);
15214 if (!QDF_IS_STATUS_SUCCESS(status)) {
15215 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15216 "%s: Not able to post msg to WDA!",
15217 __func__);
15218 qdf_mem_free(wow_pulse_set_cmd);
15219 status = QDF_STATUS_E_FAILURE;
15220 }
15221
15222 return status;
15223}
15224#endif
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015225
15226/**
15227 * sme_prepare_beacon_from_bss_descp() - prepares beacon frame by populating
15228 * different fields and IEs from bss descriptor.
15229 * @frame_buf: frame buffer to populate
15230 * @bss_descp: bss descriptor
15231 * @bssid: bssid of the beacon frame to populate
15232 * @ie_len: length of IE fields
15233 *
15234 * Return: None
15235 */
15236static void sme_prepare_beacon_from_bss_descp(uint8_t *frame_buf,
15237 tSirBssDescription *bss_descp,
15238 const tSirMacAddr bssid,
Naveen Rawat6dabf4e2017-02-08 15:55:49 -080015239 uint32_t ie_len)
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015240{
15241 tDot11fBeacon1 *bcn_fixed;
15242 tpSirMacMgmtHdr mac_hdr = (tpSirMacMgmtHdr)frame_buf;
15243
15244 /* populate mac header first to indicate beacon */
15245 mac_hdr->fc.protVer = SIR_MAC_PROTOCOL_VERSION;
15246 mac_hdr->fc.type = SIR_MAC_MGMT_FRAME;
15247 mac_hdr->fc.subType = SIR_MAC_MGMT_BEACON;
15248 qdf_mem_copy((uint8_t *) mac_hdr->da,
15249 (uint8_t *) "\xFF\xFF\xFF\xFF\xFF\xFF",
15250 sizeof(struct qdf_mac_addr));
15251 qdf_mem_copy((uint8_t *) mac_hdr->sa, bssid,
15252 sizeof(struct qdf_mac_addr));
15253 qdf_mem_copy((uint8_t *) mac_hdr->bssId, bssid,
15254 sizeof(struct qdf_mac_addr));
15255
15256 /* now populate fixed params */
15257 bcn_fixed = (tDot11fBeacon1 *)(frame_buf + SIR_MAC_HDR_LEN_3A);
15258 /* populate timestamp */
15259 qdf_mem_copy(&bcn_fixed->TimeStamp.timestamp, &bss_descp->timeStamp,
15260 sizeof(bss_descp->timeStamp));
15261 /* populate beacon interval */
15262 bcn_fixed->BeaconInterval.interval = bss_descp->beaconInterval;
15263 /* populate capability */
15264 qdf_mem_copy(&bcn_fixed->Capabilities, &bss_descp->capabilityInfo,
15265 sizeof(bss_descp->capabilityInfo));
15266
15267 /* copy IEs now */
15268 qdf_mem_copy(frame_buf + SIR_MAC_HDR_LEN_3A
15269 + SIR_MAC_B_PR_SSID_OFFSET,
15270 &bss_descp->ieFields, ie_len);
15271}
15272
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080015273QDF_STATUS sme_get_rssi_snr_by_bssid(mac_handle_t hal,
Jeff Johnson66ee8a92018-03-17 15:24:26 -070015274 struct csr_roam_profile *profile,
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053015275 const uint8_t *bssid,
15276 int8_t *rssi, int8_t *snr)
15277{
15278 tSirBssDescription *bss_descp;
15279 tCsrScanResultFilter *scan_filter;
15280 struct scan_result_list *bss_list;
15281 tScanResultHandle result_handle = NULL;
15282 QDF_STATUS status = QDF_STATUS_SUCCESS;
15283 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15284
15285 scan_filter = qdf_mem_malloc(sizeof(tCsrScanResultFilter));
Arif Hussain0ef77082018-10-10 16:42:53 -070015286 if (!scan_filter) {
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053015287 status = QDF_STATUS_E_NOMEM;
15288 goto free_scan_flter;
15289 }
15290
15291 status = csr_roam_prepare_filter_from_profile(mac_ctx,
15292 profile, scan_filter);
15293 if (QDF_STATUS_SUCCESS != status) {
15294 sme_err("prepare_filter failed");
15295 goto free_scan_flter;
15296 }
15297
15298 /* update filter to get scan result with just target BSSID */
15299 if (NULL == scan_filter->BSSIDs.bssid) {
15300 scan_filter->BSSIDs.bssid =
15301 qdf_mem_malloc(sizeof(struct qdf_mac_addr));
Arif Hussain0ef77082018-10-10 16:42:53 -070015302 if (!scan_filter->BSSIDs.bssid) {
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053015303 status = QDF_STATUS_E_NOMEM;
15304 goto free_scan_flter;
15305 }
15306 }
15307
15308 scan_filter->BSSIDs.numOfBSSIDs = 1;
15309 qdf_mem_copy(scan_filter->BSSIDs.bssid[0].bytes,
15310 bssid, sizeof(struct qdf_mac_addr));
15311
15312 status = csr_scan_get_result(mac_ctx, scan_filter, &result_handle);
15313 if (QDF_STATUS_SUCCESS != status) {
15314 sme_err("parse_scan_result failed");
15315 goto free_scan_flter;
15316 }
15317
15318 bss_list = (struct scan_result_list *)result_handle;
15319 bss_descp = csr_get_fst_bssdescr_ptr(bss_list);
15320 if (!bss_descp) {
15321 sme_err("unable to fetch bss descriptor");
15322 status = QDF_STATUS_E_FAULT;
15323 goto free_scan_flter;
15324 }
15325
15326 sme_debug("snr: %d, rssi: %d, raw_rssi: %d",
15327 bss_descp->sinr, bss_descp->rssi, bss_descp->rssi_raw);
15328
15329 if (rssi)
15330 *rssi = bss_descp->rssi;
15331 if (snr)
15332 *snr = bss_descp->sinr;
15333
15334free_scan_flter:
15335 /* free scan filter and exit */
15336 if (scan_filter) {
15337 csr_free_scan_filter(mac_ctx, scan_filter);
15338 qdf_mem_free(scan_filter);
15339 }
15340
15341 if (result_handle)
15342 csr_scan_result_purge(mac_ctx, result_handle);
15343
15344 return status;
15345}
15346
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080015347QDF_STATUS sme_get_beacon_frm(mac_handle_t hal,
15348 struct csr_roam_profile *profile,
Jeff Johnson66ee8a92018-03-17 15:24:26 -070015349 const tSirMacAddr bssid,
15350 uint8_t **frame_buf, uint32_t *frame_len,
15351 int *channel)
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015352{
15353 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawat56b4de82017-02-17 14:38:49 -080015354 tScanResultHandle result_handle = NULL;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015355 tCsrScanResultFilter *scan_filter;
15356 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15357 tSirBssDescription *bss_descp;
Yeshwanth Sriram Guntuka36c09902017-09-26 11:34:26 +053015358 struct scan_result_list *bss_list;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015359 uint32_t ie_len;
15360
15361 scan_filter = qdf_mem_malloc(sizeof(tCsrScanResultFilter));
Arif Hussain0ef77082018-10-10 16:42:53 -070015362 if (!scan_filter) {
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015363 status = QDF_STATUS_E_NOMEM;
15364 goto free_scan_flter;
15365 }
15366 status = csr_roam_prepare_filter_from_profile(mac_ctx,
15367 profile, scan_filter);
15368 if (QDF_IS_STATUS_ERROR(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070015369 sme_err("prepare_filter failed");
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053015370 status = QDF_STATUS_E_FAULT;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015371 goto free_scan_flter;
15372 }
15373
15374 /* update filter to get scan result with just target BSSID */
15375 if (NULL == scan_filter->BSSIDs.bssid) {
15376 scan_filter->BSSIDs.bssid =
15377 qdf_mem_malloc(sizeof(struct qdf_mac_addr));
Arif Hussain0ef77082018-10-10 16:42:53 -070015378 if (!scan_filter->BSSIDs.bssid) {
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015379 status = QDF_STATUS_E_NOMEM;
15380 goto free_scan_flter;
15381 }
15382 }
15383 scan_filter->BSSIDs.numOfBSSIDs = 1;
15384 qdf_mem_copy(scan_filter->BSSIDs.bssid[0].bytes,
15385 bssid, sizeof(struct qdf_mac_addr));
15386
15387 status = csr_scan_get_result(mac_ctx, scan_filter, &result_handle);
15388 if (QDF_STATUS_SUCCESS != status) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070015389 sme_err("parse_scan_result failed");
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053015390 status = QDF_STATUS_E_FAULT;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015391 goto free_scan_flter;
15392 }
15393
Yeshwanth Sriram Guntuka36c09902017-09-26 11:34:26 +053015394 bss_list = (struct scan_result_list *)result_handle;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015395 bss_descp = csr_get_fst_bssdescr_ptr(bss_list);
Naveen Rawatae0aaa82017-02-17 14:41:19 -080015396 if (!bss_descp) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -070015397 sme_err("unable to fetch bss descriptor");
Naveen Rawatae0aaa82017-02-17 14:41:19 -080015398 status = QDF_STATUS_E_FAULT;
15399 goto free_scan_flter;
15400 }
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015401
Naveen Rawat81f058c2017-06-02 16:02:39 -070015402 /**
15403 * Length of BSS descriptor is without length of
15404 * length itself and length of pointer that holds ieFields.
15405 *
15406 * tSirBssDescription
15407 * +--------+---------------------------------+---------------+
15408 * | length | other fields | pointer to IEs|
15409 * +--------+---------------------------------+---------------+
15410 * ^
15411 * ieFields
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015412 */
Naveen Rawat81f058c2017-06-02 16:02:39 -070015413 ie_len = bss_descp->length + sizeof(bss_descp->length)
15414 - (uint16_t)(offsetof(tSirBssDescription, ieFields[0]));
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053015415 sme_debug("found bss_descriptor ie_len: %d channel %d",
15416 ie_len, bss_descp->channelId);
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015417
15418 /* include mac header and fixed params along with IEs in frame */
15419 *frame_len = SIR_MAC_HDR_LEN_3A + SIR_MAC_B_PR_SSID_OFFSET + ie_len;
15420 *frame_buf = qdf_mem_malloc(*frame_len);
Arif Hussain0ef77082018-10-10 16:42:53 -070015421 if (!*frame_buf) {
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015422 status = QDF_STATUS_E_NOMEM;
15423 goto free_scan_flter;
15424 }
15425
15426 sme_prepare_beacon_from_bss_descp(*frame_buf, bss_descp, bssid, ie_len);
15427
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053015428 if (!*channel)
15429 *channel = bss_descp->channelId;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015430free_scan_flter:
15431 /* free scan filter and exit */
15432 if (scan_filter) {
15433 csr_free_scan_filter(mac_ctx, scan_filter);
15434 qdf_mem_free(scan_filter);
15435 }
Arif Hussainfdb25e22017-02-05 17:38:16 -080015436 if (result_handle)
15437 csr_scan_result_purge(mac_ctx, result_handle);
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015438
Naveen Rawatae0aaa82017-02-17 14:41:19 -080015439 return status;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015440}
15441
Paul Zhangc3fc0a82018-01-09 16:38:20 +080015442#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080015443QDF_STATUS sme_fast_reassoc(mac_handle_t hal, struct csr_roam_profile *profile,
Naveen Rawat4195c5e2017-05-22 17:07:45 -070015444 const tSirMacAddr bssid, int channel,
Krunal Soni332f4af2017-06-01 14:36:17 -070015445 uint8_t vdev_id, const tSirMacAddr connected_bssid)
Naveen Rawat4195c5e2017-05-22 17:07:45 -070015446{
15447 QDF_STATUS status;
15448 struct wma_roam_invoke_cmd *fastreassoc;
15449 struct scheduler_msg msg = {0};
Padma, Santhosh Kumar5bc0c242017-11-29 15:44:27 +053015450 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Abhinav Kumareab25932018-07-13 11:48:43 +053015451 struct csr_roam_session *session;
15452 struct csr_roam_profile *roam_profile;
Naveen Rawat4195c5e2017-05-22 17:07:45 -070015453
Abhinav Kumareab25932018-07-13 11:48:43 +053015454 session = CSR_GET_SESSION(mac_ctx, vdev_id);
15455 if (!session || !session->pCurRoamProfile) {
15456 sme_err("session %d not found", vdev_id);
15457 return QDF_STATUS_E_FAILURE;
15458 }
15459
15460 roam_profile = session->pCurRoamProfile;
15461 if (roam_profile->supplicant_disabled_roaming ||
15462 roam_profile->driver_disabled_roaming) {
15463 sme_debug("roaming status in Supplicant %d and in driver %d",
15464 roam_profile->supplicant_disabled_roaming,
15465 roam_profile->driver_disabled_roaming);
15466 return QDF_STATUS_E_FAILURE;
15467 }
Naveen Rawat4195c5e2017-05-22 17:07:45 -070015468 fastreassoc = qdf_mem_malloc(sizeof(*fastreassoc));
Arif Hussain0ef77082018-10-10 16:42:53 -070015469 if (!fastreassoc)
Naveen Rawat4195c5e2017-05-22 17:07:45 -070015470 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070015471
Krunal Soni332f4af2017-06-01 14:36:17 -070015472 /* if both are same then set the flag */
15473 if (!qdf_mem_cmp(connected_bssid, bssid, ETH_ALEN)) {
15474 fastreassoc->is_same_bssid = true;
15475 sme_debug("bssid same, bssid[%pM]", bssid);
15476 }
Naveen Rawat4195c5e2017-05-22 17:07:45 -070015477 fastreassoc->vdev_id = vdev_id;
Naveen Rawat4195c5e2017-05-22 17:07:45 -070015478 fastreassoc->bssid[0] = bssid[0];
15479 fastreassoc->bssid[1] = bssid[1];
15480 fastreassoc->bssid[2] = bssid[2];
15481 fastreassoc->bssid[3] = bssid[3];
15482 fastreassoc->bssid[4] = bssid[4];
15483 fastreassoc->bssid[5] = bssid[5];
15484
15485 status = sme_get_beacon_frm(hal, profile, bssid,
15486 &fastreassoc->frame_buf,
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053015487 &fastreassoc->frame_len,
15488 &channel);
Naveen Rawat4195c5e2017-05-22 17:07:45 -070015489
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053015490 if (!channel) {
15491 sme_err("channel retrieval from BSS desc fails!");
15492 qdf_mem_free(fastreassoc);
15493 return QDF_STATUS_E_FAULT;
15494 }
15495
15496 fastreassoc->channel = channel;
Naveen Rawat4195c5e2017-05-22 17:07:45 -070015497 if (QDF_STATUS_SUCCESS != status) {
15498 sme_warn("sme_get_beacon_frm failed");
15499 fastreassoc->frame_buf = NULL;
15500 fastreassoc->frame_len = 0;
15501 }
15502
Padma, Santhosh Kumar5bc0c242017-11-29 15:44:27 +053015503 if (csr_is_auth_type_ese(mac_ctx->roam.roamSession[vdev_id].
15504 connectedProfile.AuthType)) {
15505 sme_debug("Beacon is not required for ESE");
15506 if (fastreassoc->frame_len) {
15507 qdf_mem_free(fastreassoc->frame_buf);
15508 fastreassoc->frame_buf = NULL;
15509 fastreassoc->frame_len = 0;
15510 }
15511 }
15512
Paul Zhang624f88d2018-11-07 15:29:45 +080015513 msg.type = eWNI_SME_ROAM_INVOKE;
Naveen Rawat4195c5e2017-05-22 17:07:45 -070015514 msg.reserved = 0;
15515 msg.bodyptr = fastreassoc;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053015516 status = scheduler_post_message(QDF_MODULE_ID_SME,
Paul Zhang624f88d2018-11-07 15:29:45 +080015517 QDF_MODULE_ID_PE,
15518 QDF_MODULE_ID_PE, &msg);
Naveen Rawat4195c5e2017-05-22 17:07:45 -070015519 if (QDF_STATUS_SUCCESS != status) {
Paul Zhang624f88d2018-11-07 15:29:45 +080015520 sme_err("Not able to post ROAM_INVOKE_CMD message to PE");
Naveen Rawat4195c5e2017-05-22 17:07:45 -070015521 qdf_mem_free(fastreassoc);
15522 }
15523
15524 return status;
15525}
Paul Zhangc3fc0a82018-01-09 16:38:20 +080015526#endif
Naveen Rawat4195c5e2017-05-22 17:07:45 -070015527
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080015528QDF_STATUS sme_set_del_pmkid_cache(mac_handle_t hal, uint8_t session_id,
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053015529 tPmkidCacheInfo *pmk_cache_info,
15530 bool is_add)
15531{
15532 struct wmi_unified_pmk_cache *pmk_cache;
15533 struct scheduler_msg msg;
15534
15535 pmk_cache = qdf_mem_malloc(sizeof(*pmk_cache));
Arif Hussain0ef77082018-10-10 16:42:53 -070015536 if (!pmk_cache)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053015537 return QDF_STATUS_E_NOMEM;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053015538
Vignesh Viswanathane8a26b22017-10-11 20:38:47 +053015539 qdf_mem_set(pmk_cache, sizeof(*pmk_cache), 0);
15540
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053015541 pmk_cache->session_id = session_id;
15542
Vignesh Viswanathane8a26b22017-10-11 20:38:47 +053015543 if (!pmk_cache_info)
15544 goto send_flush_cmd;
15545
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053015546 if (!pmk_cache_info->ssid_len) {
15547 pmk_cache->cat_flag = WMI_PMK_CACHE_CAT_FLAG_BSSID;
15548 WMI_CHAR_ARRAY_TO_MAC_ADDR(pmk_cache_info->BSSID.bytes,
15549 &pmk_cache->bssid);
15550 } else {
15551 pmk_cache->cat_flag = WMI_PMK_CACHE_CAT_FLAG_SSID_CACHE_ID;
15552 pmk_cache->ssid.length = pmk_cache_info->ssid_len;
15553 qdf_mem_copy(pmk_cache->ssid.mac_ssid,
15554 pmk_cache_info->ssid,
15555 pmk_cache->ssid.length);
15556 }
15557 pmk_cache->cache_id = (uint32_t) (pmk_cache_info->cache_id[0] << 8 |
15558 pmk_cache_info->cache_id[1]);
15559
15560 if (is_add)
15561 pmk_cache->action_flag = WMI_PMK_CACHE_ACTION_FLAG_ADD_ENTRY;
15562 else
15563 pmk_cache->action_flag = WMI_PMK_CACHE_ACTION_FLAG_DEL_ENTRY;
15564
15565 pmk_cache->pmkid_len = CSR_RSN_PMKID_SIZE;
15566 qdf_mem_copy(pmk_cache->pmkid, pmk_cache_info->PMKID,
15567 CSR_RSN_PMKID_SIZE);
15568
15569 pmk_cache->pmk_len = pmk_cache_info->pmk_len;
15570 qdf_mem_copy(pmk_cache->pmk, pmk_cache_info->pmk,
15571 pmk_cache->pmk_len);
15572
Vignesh Viswanathane8a26b22017-10-11 20:38:47 +053015573send_flush_cmd:
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053015574 msg.type = SIR_HAL_SET_DEL_PMKID_CACHE;
15575 msg.reserved = 0;
15576 msg.bodyptr = pmk_cache;
15577 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +053015578 scheduler_post_message(QDF_MODULE_ID_SME,
15579 QDF_MODULE_ID_WMA,
15580 QDF_MODULE_ID_WMA, &msg)) {
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053015581 sme_err("Not able to post message to WDA");
15582 qdf_mem_free(pmk_cache);
15583 return QDF_STATUS_E_FAILURE;
15584 }
15585
15586 return QDF_STATUS_SUCCESS;
15587}
15588
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053015589/* ARP DEBUG STATS */
15590
15591/**
15592 * sme_set_nud_debug_stats() - sme api to set nud debug stats
15593 * @hal: handle to hal
15594 * @set_stats_param: pointer to set stats param
15595 *
15596 * Return: Return QDF_STATUS.
15597 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080015598QDF_STATUS sme_set_nud_debug_stats(mac_handle_t hal,
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053015599 struct set_arp_stats_params
15600 *set_stats_param)
15601{
15602 struct set_arp_stats_params *arp_set_param;
15603 struct scheduler_msg msg;
15604
15605 arp_set_param = qdf_mem_malloc(sizeof(*arp_set_param));
Arif Hussain0ef77082018-10-10 16:42:53 -070015606 if (!arp_set_param)
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053015607 return QDF_STATUS_E_NOMEM;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053015608
15609 qdf_mem_copy(arp_set_param, set_stats_param, sizeof(*arp_set_param));
15610
15611 msg.type = WMA_SET_ARP_STATS_REQ;
15612 msg.reserved = 0;
15613 msg.bodyptr = arp_set_param;
15614
15615 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +053015616 scheduler_post_message(QDF_MODULE_ID_SME,
15617 QDF_MODULE_ID_WMA,
15618 QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053015619 sme_err("Not able to post message to WDA");
15620 qdf_mem_free(arp_set_param);
15621 return QDF_STATUS_E_FAILURE;
15622 }
15623
15624 return QDF_STATUS_SUCCESS;
15625}
15626
15627/**
15628 * sme_get_nud_debug_stats() - sme api to get nud debug stats
15629 * @hal: handle to hal
15630 * @get_stats_param: pointer to set stats param
15631 *
15632 * Return: Return QDF_STATUS.
15633 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080015634QDF_STATUS sme_get_nud_debug_stats(mac_handle_t hal,
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053015635 struct get_arp_stats_params
15636 *get_stats_param)
15637{
15638 struct get_arp_stats_params *arp_get_param;
15639 struct scheduler_msg msg;
15640
15641 arp_get_param = qdf_mem_malloc(sizeof(*arp_get_param));
Arif Hussain0ef77082018-10-10 16:42:53 -070015642 if (!arp_get_param)
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053015643 return QDF_STATUS_E_NOMEM;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053015644
15645 qdf_mem_copy(arp_get_param, get_stats_param, sizeof(*arp_get_param));
15646
15647 msg.type = WMA_GET_ARP_STATS_REQ;
15648 msg.reserved = 0;
15649 msg.bodyptr = arp_get_param;
15650
15651 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +053015652 scheduler_post_message(QDF_MODULE_ID_SME,
15653 QDF_MODULE_ID_WMA,
15654 QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053015655 sme_err("Not able to post message to WDA");
15656 qdf_mem_free(arp_get_param);
15657 return QDF_STATUS_E_FAILURE;
15658 }
15659
15660 return QDF_STATUS_SUCCESS;
15661}
15662
Krishna Kumaar Natarajanf1581df2017-02-21 13:42:08 -080015663QDF_STATUS sme_set_peer_param(uint8_t *peer_addr, uint32_t param_id,
15664 uint32_t param_value, uint32_t vdev_id)
15665{
15666 void *wma_handle;
15667
15668 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
15669 if (!wma_handle) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -070015670 sme_err("wma handle is NULL");
Krishna Kumaar Natarajanf1581df2017-02-21 13:42:08 -080015671 return QDF_STATUS_E_FAILURE;
15672 }
15673
15674 return wma_set_peer_param(wma_handle, peer_addr, param_id,
15675 param_value, vdev_id);
15676}
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080015677
Jeff Johnsonb460dd72018-11-08 10:26:51 -080015678QDF_STATUS sme_register_set_connection_info_cb(mac_handle_t mac_handle,
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080015679 bool (*set_connection_info_cb)(bool),
15680 bool (*get_connection_info_cb)(uint8_t *session_id,
15681 enum scan_reject_states *reason))
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080015682{
15683 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080015684 tpAniSirGlobal pMac = PMAC_STRUCT(mac_handle);
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080015685
15686 status = sme_acquire_global_lock(&pMac->sme);
15687 if (QDF_IS_STATUS_SUCCESS(status)) {
15688 pMac->sme.set_connection_info_cb = set_connection_info_cb;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080015689 pMac->sme.get_connection_info_cb = get_connection_info_cb;
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080015690 sme_release_global_lock(&pMac->sme);
15691 }
15692 return status;
15693}
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053015694
Jeff Johnson43975142018-07-04 15:33:47 -070015695QDF_STATUS sme_rso_cmd_status_cb(mac_handle_t mac_handle,
15696 rso_cmd_status_cb cb)
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053015697{
15698 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson43975142018-07-04 15:33:47 -070015699 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053015700
15701 mac->sme.rso_cmd_status_cb = cb;
Srinivas Girigowda2c263352017-03-17 17:49:53 -070015702 sme_debug("Registered RSO command status callback");
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053015703 return status;
15704}
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070015705
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080015706QDF_STATUS sme_set_dbs_scan_selection_config(mac_handle_t hal,
Nitesh Shahf9a09ff2017-05-22 15:46:25 +053015707 struct wmi_dbs_scan_sel_params *params)
15708{
15709 struct scheduler_msg message = {0};
15710 QDF_STATUS status;
15711 struct wmi_dbs_scan_sel_params *dbs_scan_params;
15712 uint32_t i;
15713
15714 if (0 == params->num_clients) {
15715 sme_err("Num of clients is 0");
15716 return QDF_STATUS_E_FAILURE;
15717 }
15718
15719 dbs_scan_params = qdf_mem_malloc(sizeof(*dbs_scan_params));
Arif Hussain0ef77082018-10-10 16:42:53 -070015720 if (!dbs_scan_params)
Nitesh Shahf9a09ff2017-05-22 15:46:25 +053015721 return QDF_STATUS_E_NOMEM;
Nitesh Shahf9a09ff2017-05-22 15:46:25 +053015722
15723 dbs_scan_params->num_clients = params->num_clients;
15724 dbs_scan_params->pdev_id = params->pdev_id;
15725 for (i = 0; i < params->num_clients; i++) {
15726 dbs_scan_params->module_id[i] = params->module_id[i];
15727 dbs_scan_params->num_dbs_scans[i] = params->num_dbs_scans[i];
15728 dbs_scan_params->num_non_dbs_scans[i] =
15729 params->num_non_dbs_scans[i];
15730 }
15731 message.type = WMA_SET_DBS_SCAN_SEL_CONF_PARAMS;
15732 message.bodyptr = dbs_scan_params;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053015733 status = scheduler_post_message(QDF_MODULE_ID_SME,
15734 QDF_MODULE_ID_WMA,
15735 QDF_MODULE_ID_WMA, &message);
Nitesh Shahf9a09ff2017-05-22 15:46:25 +053015736 if (!QDF_IS_STATUS_SUCCESS(status)) {
15737 sme_err("Not able to post msg to WMA!");
15738 qdf_mem_free(dbs_scan_params);
15739 }
15740
15741 return status;
15742}
15743
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080015744QDF_STATUS sme_get_rcpi(mac_handle_t hal, struct sme_rcpi_req *rcpi)
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053015745{
15746 QDF_STATUS status = QDF_STATUS_E_FAILURE;
15747 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
Naveen Rawatb7be1ed2017-11-16 16:52:08 -080015748 struct scheduler_msg msg = {0};
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053015749 struct sme_rcpi_req *rcpi_req;
15750
15751 rcpi_req = qdf_mem_malloc(sizeof(*rcpi_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070015752 if (!rcpi_req)
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053015753 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070015754
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053015755 qdf_mem_copy(rcpi_req, rcpi, sizeof(*rcpi_req));
15756
15757 status = sme_acquire_global_lock(&pMac->sme);
15758 if (QDF_IS_STATUS_SUCCESS(status)) {
15759 msg.bodyptr = rcpi_req;
15760 msg.type = WMA_GET_RCPI_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053015761 status = scheduler_post_message(QDF_MODULE_ID_SME,
15762 QDF_MODULE_ID_WMA,
15763 QDF_MODULE_ID_WMA, &msg);
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053015764 sme_release_global_lock(&pMac->sme);
15765 if (!QDF_IS_STATUS_SUCCESS(status)) {
15766 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15767 FL("post get rcpi req failed"));
15768 status = QDF_STATUS_E_FAILURE;
15769 qdf_mem_free(rcpi_req);
15770 }
15771 } else {
15772 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15773 FL("sme_acquire_global_lock failed"));
15774 qdf_mem_free(rcpi_req);
15775 }
15776
15777 return status;
15778}
15779
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080015780void sme_store_pdev(mac_handle_t hal, struct wlan_objmgr_pdev *pdev)
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070015781{
15782 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15783 void *wma_handle;
15784 QDF_STATUS status;
15785
Kiran Kumar Lokeref089a3a2017-04-20 21:39:26 -070015786 status = wlan_objmgr_pdev_try_get_ref(pdev, WLAN_LEGACY_MAC_ID);
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070015787 if (QDF_STATUS_SUCCESS != status) {
15788 mac_ctx->pdev = NULL;
15789 return;
15790 }
15791 mac_ctx->pdev = pdev;
15792 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
15793 if (!wma_handle) {
15794 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Kiran Kumar Lokeref089a3a2017-04-20 21:39:26 -070015795 FL("wma handle is NULL"));
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070015796 return;
15797 }
15798 wma_store_pdev(wma_handle, pdev);
15799}
15800
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080015801QDF_STATUS sme_congestion_register_callback(mac_handle_t hal,
Jeff Johnsonf6182e42018-07-03 14:46:17 -070015802 congestion_cb congestion_cb)
Padma, Santhosh Kumar16dacfb2017-03-21 19:05:40 +053015803{
15804 QDF_STATUS status;
15805 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15806
15807 status = sme_acquire_global_lock(&mac->sme);
15808 if (QDF_IS_STATUS_SUCCESS(status)) {
15809 mac->sme.congestion_cb = congestion_cb;
15810 sme_release_global_lock(&mac->sme);
Srinivas Girigowda2c263352017-03-17 17:49:53 -070015811 sme_debug("congestion callback set");
Padma, Santhosh Kumar16dacfb2017-03-21 19:05:40 +053015812 } else {
Srinivas Girigowda2c263352017-03-17 17:49:53 -070015813 sme_err("Aquiring lock failed %d", status);
Padma, Santhosh Kumar16dacfb2017-03-21 19:05:40 +053015814 }
15815
15816 return status;
15817}
Sandeep Puligillaf587adf2017-04-27 19:53:21 -070015818
Jeff Johnsonda2afa42018-07-04 10:25:42 -070015819QDF_STATUS sme_register_tx_queue_cb(mac_handle_t mac_handle,
15820 tx_queue_cb tx_queue_cb)
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080015821{
15822 QDF_STATUS status;
Jeff Johnsonda2afa42018-07-04 10:25:42 -070015823 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080015824
15825 status = sme_acquire_global_lock(&mac->sme);
15826 if (QDF_IS_STATUS_SUCCESS(status)) {
15827 mac->sme.tx_queue_cb = tx_queue_cb;
15828 sme_release_global_lock(&mac->sme);
15829 sme_debug("Tx queue callback set");
15830 } else {
15831 sme_err("Aquiring lock failed %d", status);
15832 }
15833
15834 return status;
15835}
15836
Jeff Johnsonda2afa42018-07-04 10:25:42 -070015837QDF_STATUS sme_deregister_tx_queue_cb(mac_handle_t mac_handle)
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080015838{
Jeff Johnsonda2afa42018-07-04 10:25:42 -070015839 return sme_register_tx_queue_cb(mac_handle, NULL);
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080015840}
15841
Varun Reddy Yeturud33033f2018-06-11 10:58:30 -070015842#ifdef WLAN_SUPPORT_TWT
Jeff Johnson3a08ff92018-07-03 19:40:44 -070015843QDF_STATUS sme_register_twt_enable_complete_cb(mac_handle_t mac_handle,
15844 twt_enable_cb twt_enable_cb)
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070015845{
15846 QDF_STATUS status;
Jeff Johnson3a08ff92018-07-03 19:40:44 -070015847 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070015848
15849 status = sme_acquire_global_lock(&mac->sme);
15850 if (QDF_IS_STATUS_SUCCESS(status)) {
15851 mac->sme.twt_enable_cb = twt_enable_cb;
15852 sme_release_global_lock(&mac->sme);
15853 sme_debug("TWT: enable callback set");
15854 } else {
15855 sme_err("Aquiring lock failed %d", status);
15856 }
15857
15858 return status;
15859}
15860
Jeff Johnson3a08ff92018-07-03 19:40:44 -070015861QDF_STATUS sme_register_twt_disable_complete_cb(mac_handle_t mac_handle,
15862 twt_disable_cb twt_disable_cb)
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070015863{
15864 QDF_STATUS status;
Jeff Johnson3a08ff92018-07-03 19:40:44 -070015865 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070015866
15867 status = sme_acquire_global_lock(&mac->sme);
15868 if (QDF_IS_STATUS_SUCCESS(status)) {
15869 mac->sme.twt_disable_cb = twt_disable_cb;
15870 sme_release_global_lock(&mac->sme);
15871 sme_debug("TWT: disable callback set");
15872 } else {
15873 sme_err("Aquiring lock failed %d", status);
15874 }
15875
15876 return status;
15877}
15878
Jeff Johnson3a08ff92018-07-03 19:40:44 -070015879QDF_STATUS sme_deregister_twt_enable_complete_cb(mac_handle_t mac_handle)
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070015880{
Jeff Johnson3a08ff92018-07-03 19:40:44 -070015881 return sme_register_twt_enable_complete_cb(mac_handle, NULL);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070015882}
15883
Jeff Johnson3a08ff92018-07-03 19:40:44 -070015884QDF_STATUS sme_deregister_twt_disable_complete_cb(mac_handle_t mac_handle)
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070015885{
Jeff Johnson3a08ff92018-07-03 19:40:44 -070015886 return sme_register_twt_disable_complete_cb(mac_handle, NULL);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070015887}
15888#endif
15889
Ashish Kumar Dhanotiyab28338c2017-07-21 20:12:34 +053015890QDF_STATUS sme_set_smps_cfg(uint32_t vdev_id, uint32_t param_id,
15891 uint32_t param_val)
15892{
15893 return wma_configure_smps_params(vdev_id, param_id, param_val);
15894}
15895
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080015896QDF_STATUS sme_ipa_uc_stat_request(mac_handle_t hal, uint32_t vdev_id,
Sandeep Puligillaf587adf2017-04-27 19:53:21 -070015897 uint32_t param_id, uint32_t param_val, uint32_t req_cat)
15898{
Sandeep Puligillae64099d2017-05-11 16:38:27 -070015899 wma_cli_set_cmd_t *iwcmd;
15900 QDF_STATUS status = QDF_STATUS_SUCCESS;
Sandeep Puligillaf587adf2017-04-27 19:53:21 -070015901
Sandeep Puligillae64099d2017-05-11 16:38:27 -070015902 iwcmd = qdf_mem_malloc(sizeof(*iwcmd));
Arif Hussain0ef77082018-10-10 16:42:53 -070015903 if (!iwcmd)
Sandeep Puligillaf587adf2017-04-27 19:53:21 -070015904 return QDF_STATUS_E_NOMEM;
Sandeep Puligillae64099d2017-05-11 16:38:27 -070015905
15906 qdf_mem_zero(iwcmd, sizeof(*iwcmd));
15907 iwcmd->param_sec_value = 0;
15908 iwcmd->param_vdev_id = vdev_id;
15909 iwcmd->param_id = param_id;
15910 iwcmd->param_vp_dev = req_cat;
15911 iwcmd->param_value = param_val;
15912 wma_ipa_uc_stat_request(iwcmd);
15913 qdf_mem_free(iwcmd);
Sandeep Puligillaf587adf2017-04-27 19:53:21 -070015914
15915 return status;
15916}
lifeng66831662017-05-19 16:01:35 +080015917
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080015918QDF_STATUS sme_set_reorder_timeout(mac_handle_t hal,
lifeng66831662017-05-19 16:01:35 +080015919 struct sir_set_rx_reorder_timeout_val *req)
15920{
15921 QDF_STATUS status;
Zhang Qian1e7649e2018-06-04 13:07:18 +080015922 tp_wma_handle wma_handle;
lifeng66831662017-05-19 16:01:35 +080015923
Zhang Qian1e7649e2018-06-04 13:07:18 +080015924 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
15925 status = wma_set_rx_reorder_timeout_val(wma_handle, req);
lifeng66831662017-05-19 16:01:35 +080015926
15927 return status;
15928}
15929
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080015930QDF_STATUS sme_set_rx_set_blocksize(mac_handle_t hal,
lifeng66831662017-05-19 16:01:35 +080015931 struct sir_peer_set_rx_blocksize *req)
15932{
15933 QDF_STATUS status;
Zhang Qian1e7649e2018-06-04 13:07:18 +080015934 tp_wma_handle wma_handle;
lifeng66831662017-05-19 16:01:35 +080015935
Zhang Qian1e7649e2018-06-04 13:07:18 +080015936 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
15937 status = wma_set_rx_blocksize(wma_handle, req);
lifeng66831662017-05-19 16:01:35 +080015938
15939 return status;
15940}
Naveen Rawat247a8682017-06-05 15:00:31 -070015941
15942int sme_cli_set_command(int vdev_id, int param_id, int sval, int vpdev)
15943{
15944 return wma_cli_set_command(vdev_id, param_id, sval, vpdev);
15945}
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +053015946
Vignesh Viswanathana851d752018-10-03 19:44:38 +053015947int sme_set_enable_mem_deep_sleep(mac_handle_t mac_handle, int vdev_id)
15948{
15949 tpAniSirGlobal mac_ctx = MAC_CONTEXT(mac_handle);
15950
15951 return wma_cli_set_command(vdev_id, WMI_PDEV_PARAM_HYST_EN,
15952 mac_ctx->mlme_cfg->gen.memory_deep_sleep,
15953 PDEV_CMD);
15954}
15955
15956int sme_set_cck_tx_fir_override(mac_handle_t mac_handle, int vdev_id)
15957{
15958 tpAniSirGlobal mac_ctx = MAC_CONTEXT(mac_handle);
15959
15960 return wma_cli_set_command(vdev_id,
15961 WMI_PDEV_PARAM_ENABLE_CCK_TXFIR_OVERRIDE,
15962 mac_ctx->mlme_cfg->gen.cck_tx_fir_override,
15963 PDEV_CMD);
15964}
15965
Jeff Johnsond0b6c7e2018-07-04 14:53:06 -070015966QDF_STATUS sme_set_bt_activity_info_cb(mac_handle_t mac_handle,
15967 bt_activity_info_cb cb)
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +053015968{
15969 QDF_STATUS status;
Jeff Johnsond0b6c7e2018-07-04 14:53:06 -070015970 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +053015971
15972 status = sme_acquire_global_lock(&mac->sme);
15973 if (QDF_IS_STATUS_SUCCESS(status)) {
15974 mac->sme.bt_activity_info_cb = cb;
15975 sme_release_global_lock(&mac->sme);
15976 sme_debug("bt activity info callback set");
15977 } else {
15978 sme_debug("sme_acquire_global_lock failed %d", status);
15979 }
15980
15981 return status;
15982}
lifengd217d192017-05-09 19:44:16 +080015983
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080015984QDF_STATUS sme_get_chain_rssi(mac_handle_t hal,
lifengd217d192017-05-09 19:44:16 +080015985 struct get_chain_rssi_req_params *input,
15986 get_chain_rssi_callback callback,
15987 void *context)
15988{
15989 QDF_STATUS status = QDF_STATUS_SUCCESS;
15990 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Zhang Qian1e7649e2018-06-04 13:07:18 +080015991 tp_wma_handle wma_handle;
lifengd217d192017-05-09 19:44:16 +080015992
15993 SME_ENTER();
15994
15995 if (NULL == input) {
15996 sme_err("Invalid req params");
15997 return QDF_STATUS_E_INVAL;
15998 }
15999
16000 mac_ctx->sme.get_chain_rssi_cb = callback;
16001 mac_ctx->sme.get_chain_rssi_context = context;
Zhang Qian1e7649e2018-06-04 13:07:18 +080016002 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
16003 wma_get_chain_rssi(wma_handle, input);
lifengd217d192017-05-09 19:44:16 +080016004
16005 SME_EXIT();
16006 return status;
16007}
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053016008
Jeff Johnson5f9ce2d2018-06-09 21:20:45 -070016009QDF_STATUS sme_process_msg_callback(tpAniSirGlobal mac,
16010 struct scheduler_msg *msg)
Sandeep Puligilla1426d612017-04-12 18:22:06 -070016011{
16012 QDF_STATUS status = QDF_STATUS_E_FAILURE;
16013
16014 if (msg == NULL) {
16015 sme_err("Empty message for SME Msg callback");
16016 return status;
16017 }
Jeff Johnson5f9ce2d2018-06-09 21:20:45 -070016018 status = sme_process_msg(mac, msg);
Sandeep Puligilla1426d612017-04-12 18:22:06 -070016019 return status;
16020}
16021
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080016022void sme_display_disconnect_stats(mac_handle_t hal, uint8_t session_id)
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053016023{
16024 struct csr_roam_session *session;
16025 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16026
16027 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
16028 sme_err("%s Invalid session id: %d", __func__, session_id);
16029 return;
16030 }
16031
16032 session = CSR_GET_SESSION(mac_ctx, session_id);
16033 if (!session) {
16034 sme_err("%s Failed to get session for id: %d",
16035 __func__, session_id);
16036 return;
16037 }
16038
Nirav Shahe6194ac2018-07-13 11:04:41 +053016039 sme_nofl_info("Total No. of Disconnections: %d",
16040 session->disconnect_stats.disconnection_cnt);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053016041
Nirav Shahe6194ac2018-07-13 11:04:41 +053016042 sme_nofl_info("No. of Diconnects Triggered by Application: %d",
16043 session->disconnect_stats.disconnection_by_app);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053016044
Nirav Shahe6194ac2018-07-13 11:04:41 +053016045 sme_nofl_info("No. of Disassoc Sent by Peer: %d",
16046 session->disconnect_stats.disassoc_by_peer);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053016047
Nirav Shahe6194ac2018-07-13 11:04:41 +053016048 sme_nofl_info("No. of Deauth Sent by Peer: %d",
16049 session->disconnect_stats.deauth_by_peer);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053016050
Nirav Shahe6194ac2018-07-13 11:04:41 +053016051 sme_nofl_info("No. of Disconnections due to Beacon Miss: %d",
16052 session->disconnect_stats.bmiss);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053016053
Nirav Shahe6194ac2018-07-13 11:04:41 +053016054 sme_nofl_info("No. of Disconnections due to Peer Kickout: %d",
16055 session->disconnect_stats.peer_kickout);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053016056}
Nachiket Kukadeaaf8a712017-07-27 19:15:36 +053016057
Rachit Kankanef6834c42018-08-02 18:47:50 +053016058#ifdef FEATURE_WLAN_DYNAMIC_CVM
Nachiket Kukade8983cf62017-10-12 18:14:48 +053016059 /**
16060 * sme_set_vc_mode_config() - Set voltage corner config to FW
16061 * @bitmap: Bitmap that referes to voltage corner config with
16062 * different phymode and bw configuration
16063 *
16064 * Return: QDF_STATUS
16065 */
16066QDF_STATUS sme_set_vc_mode_config(uint32_t vc_bitmap)
16067{
16068 void *wma_handle;
16069
16070 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
16071 if (!wma_handle) {
16072 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16073 "wma_handle is NULL");
16074 return QDF_STATUS_E_FAILURE;
16075 }
16076 if (QDF_STATUS_SUCCESS !=
16077 wma_set_vc_mode_config(wma_handle, vc_bitmap)) {
16078 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16079 "%s: Failed to set Voltage Control config to FW",
16080 __func__);
16081 return QDF_STATUS_E_FAILURE;
16082 }
16083 return QDF_STATUS_SUCCESS;
16084}
Rachit Kankanef6834c42018-08-02 18:47:50 +053016085#endif
Nachiket Kukade8983cf62017-10-12 18:14:48 +053016086
Nachiket Kukadeaaf8a712017-07-27 19:15:36 +053016087/**
16088 * sme_set_bmiss_bcnt() - set bmiss config parameters
16089 * @vdev_id: virtual device for the command
16090 * @first_cnt: bmiss first value
16091 * @final_cnt: bmiss final value
16092 *
16093 * Return: QDF_STATUS_SUCCESS or non-zero on failure
16094 */
16095QDF_STATUS sme_set_bmiss_bcnt(uint32_t vdev_id, uint32_t first_cnt,
16096 uint32_t final_cnt)
16097{
16098 return wma_config_bmiss_bcnt_params(vdev_id, first_cnt, final_cnt);
16099}
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053016100
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080016101QDF_STATUS sme_send_limit_off_channel_params(mac_handle_t hal, uint8_t vdev_id,
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053016102 bool is_tos_active, uint32_t max_off_chan_time,
16103 uint32_t rest_time, bool skip_dfs_chan)
16104{
16105 struct sir_limit_off_chan *cmd;
16106 struct scheduler_msg msg = {0};
16107
16108 cmd = qdf_mem_malloc(sizeof(*cmd));
Arif Hussain0ef77082018-10-10 16:42:53 -070016109 if (!cmd)
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053016110 return QDF_STATUS_E_NOMEM;
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053016111
16112 cmd->vdev_id = vdev_id;
16113 cmd->is_tos_active = is_tos_active;
16114 cmd->max_off_chan_time = max_off_chan_time;
16115 cmd->rest_time = rest_time;
16116 cmd->skip_dfs_chans = skip_dfs_chan;
16117
16118 msg.type = WMA_SET_LIMIT_OFF_CHAN;
16119 msg.reserved = 0;
16120 msg.bodyptr = cmd;
16121
gaurank kathpalia36b0c582018-08-28 17:45:43 +053016122 if (!QDF_IS_STATUS_SUCCESS(scheduler_post_message(QDF_MODULE_ID_SME,
16123 QDF_MODULE_ID_WMA,
16124 QDF_MODULE_ID_WMA,
16125 &msg))) {
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053016126 sme_err("Not able to post WMA_SET_LIMIT_OFF_CHAN to WMA");
16127 qdf_mem_free(cmd);
16128 return QDF_STATUS_E_FAILURE;
16129 }
16130
16131 return QDF_STATUS_SUCCESS;
16132}
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053016133
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080016134uint32_t sme_unpack_rsn_ie(mac_handle_t hal, uint8_t *buf,
Qiwei Caie689a262018-07-26 15:50:22 +080016135 uint8_t buf_len, tDot11fIERSN *rsn_ie,
16136 bool append_ie)
16137{
16138 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16139
16140 return dot11f_unpack_ie_rsn(mac_ctx, buf, buf_len, rsn_ie, append_ie);
16141}
16142
16143#ifdef FEATURE_BSS_TRANSITION
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053016144/**
16145 * sme_get_status_for_candidate() - Get bss transition status for candidate
16146 * @hal: Handle for HAL
16147 * @conn_bss_desc: connected bss descriptor
16148 * @bss_desc: candidate bss descriptor
16149 * @info: candiadate bss information
16150 * @trans_reason: transition reason code
16151 * @is_bt_in_progress: bt activity indicator
16152 *
16153 * Return : true if candidate is rejected and reject reason is filled
16154 * @info->status. Otherwise returns false.
16155 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080016156static bool sme_get_status_for_candidate(mac_handle_t hal,
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053016157 tSirBssDescription *conn_bss_desc,
16158 tSirBssDescription *bss_desc,
16159 struct bss_candidate_info *info,
16160 uint8_t trans_reason,
16161 bool is_bt_in_progress)
16162{
16163 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053016164 struct wlan_mlme_mbo *mbo_cfg;
16165 int8_t current_rssi_mcc_thres;
16166
16167 if (!(mac_ctx->mlme_cfg)) {
16168 pe_err("mlme cfg is NULL");
16169 return false;
16170 }
16171 mbo_cfg = &mac_ctx->mlme_cfg->mbo_cfg;
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053016172
16173 /*
16174 * Low RSSI based rejection
16175 * If candidate rssi is less than mbo_candidate_rssi_thres and connected
16176 * bss rssi is greater than mbo_current_rssi_thres, then reject the
16177 * candidate with MBO reason code 4.
16178 */
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053016179 if ((bss_desc->rssi < mbo_cfg->mbo_candidate_rssi_thres) &&
16180 (conn_bss_desc->rssi > mbo_cfg->mbo_current_rssi_thres)) {
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053016181 sme_err("Candidate BSS "MAC_ADDRESS_STR" has LOW RSSI(%d), hence reject",
16182 MAC_ADDR_ARRAY(bss_desc->bssId), bss_desc->rssi);
16183 info->status = QCA_STATUS_REJECT_LOW_RSSI;
16184 return true;
16185 }
16186
16187 if (trans_reason == MBO_TRANSITION_REASON_LOAD_BALANCING ||
16188 trans_reason == MBO_TRANSITION_REASON_TRANSITIONING_TO_PREMIUM_AP) {
16189 /*
16190 * MCC rejection
16191 * If moving to candidate's channel will result in MCC scenario
16192 * and the rssi of connected bss is greater than
16193 * mbo_current_rssi_mss_thres, then reject the candidate with
16194 * MBO reason code 3.
16195 */
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053016196 current_rssi_mcc_thres = mbo_cfg->mbo_current_rssi_mcc_thres;
16197 if ((conn_bss_desc->rssi > current_rssi_mcc_thres) &&
Jeff Johnson9d118852018-06-10 16:54:59 -070016198 csr_is_mcc_channel(mac_ctx, bss_desc->channelId)) {
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053016199 sme_err("Candidate BSS "MAC_ADDRESS_STR" causes MCC, hence reject",
16200 MAC_ADDR_ARRAY(bss_desc->bssId));
16201 info->status =
16202 QCA_STATUS_REJECT_INSUFFICIENT_QOS_CAPACITY;
16203 return true;
16204 }
16205
16206 /*
16207 * BT coex rejection
16208 * If AP is trying to move the client from 5G to 2.4G and moving
16209 * to 2.4G will result in BT coex and candidate channel rssi is
16210 * less than mbo_candidate_rssi_btc_thres, then reject the
16211 * candidate with MBO reason code 2.
16212 */
16213 if (WLAN_REG_IS_5GHZ_CH(conn_bss_desc->channelId) &&
16214 WLAN_REG_IS_24GHZ_CH(bss_desc->channelId) &&
16215 is_bt_in_progress &&
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053016216 (bss_desc->rssi < mbo_cfg->mbo_candidate_rssi_btc_thres)) {
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053016217 sme_err("Candidate BSS "MAC_ADDRESS_STR" causes BT coex, hence reject",
16218 MAC_ADDR_ARRAY(bss_desc->bssId));
16219 info->status =
16220 QCA_STATUS_REJECT_EXCESSIVE_DELAY_EXPECTED;
16221 return true;
16222 }
16223
16224 /*
16225 * LTE coex rejection
16226 * If moving to candidate's channel can cause LTE coex, then
16227 * reject the candidate with MBO reason code 5.
16228 */
16229 if (policy_mgr_is_safe_channel(mac_ctx->psoc,
16230 conn_bss_desc->channelId) &&
16231 !(policy_mgr_is_safe_channel(mac_ctx->psoc,
16232 bss_desc->channelId))) {
16233 sme_err("High interference expected if transitioned to BSS "
16234 MAC_ADDRESS_STR" hence reject",
16235 MAC_ADDR_ARRAY(bss_desc->bssId));
16236 info->status =
16237 QCA_STATUS_REJECT_HIGH_INTERFERENCE;
16238 return true;
16239 }
16240 }
16241
16242 return false;
16243}
16244
16245/**
16246 * wlan_hdd_get_bss_transition_status() - get bss transition status all cadidates
16247 * @adapter : Pointer to adapter
16248 * @transition_reason : Transition reason
16249 * @info : bss candidate information
16250 * @n_candidates : number of candidates
16251 *
16252 * Return : 0 on success otherwise errno
16253 */
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080016254int sme_get_bss_transition_status(mac_handle_t hal,
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053016255 uint8_t transition_reason,
16256 struct qdf_mac_addr *bssid,
16257 struct bss_candidate_info *info,
16258 uint16_t n_candidates,
16259 bool is_bt_in_progress)
16260{
16261 QDF_STATUS status = QDF_STATUS_SUCCESS;
16262 tSirBssDescription *bss_desc, *conn_bss_desc;
16263 tCsrScanResultInfo *res, *conn_res;
16264 uint16_t i;
16265
16266 if (!n_candidates || !info) {
16267 sme_err("No candidate info available");
16268 return QDF_STATUS_E_INVAL;
16269 }
16270
16271 conn_res = qdf_mem_malloc(sizeof(tCsrScanResultInfo));
Arif Hussain0ef77082018-10-10 16:42:53 -070016272 if (!conn_res)
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053016273 return QDF_STATUS_E_NOMEM;
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053016274
16275 res = qdf_mem_malloc(sizeof(tCsrScanResultInfo));
16276 if (!res) {
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053016277 status = QDF_STATUS_E_NOMEM;
16278 goto free;
16279 }
16280
16281 /* Get the connected BSS descriptor */
16282 status = sme_scan_get_result_for_bssid(hal, bssid, conn_res);
16283 if (!QDF_IS_STATUS_SUCCESS(status)) {
16284 sme_err("Failed to find connected BSS in scan list");
16285 goto free;
16286 }
16287 conn_bss_desc = &conn_res->BssDescriptor;
16288
16289 for (i = 0; i < n_candidates; i++) {
16290 /* Get candidate BSS descriptors */
16291 status = sme_scan_get_result_for_bssid(hal, &info[i].bssid,
16292 res);
16293 if (!QDF_IS_STATUS_SUCCESS(status)) {
16294 sme_err("BSS "MAC_ADDRESS_STR" not present in scan list",
16295 MAC_ADDR_ARRAY(info[i].bssid.bytes));
16296 info[i].status = QCA_STATUS_REJECT_UNKNOWN;
16297 continue;
16298 }
16299
16300 bss_desc = &res->BssDescriptor;
16301 if (!sme_get_status_for_candidate(hal, conn_bss_desc, bss_desc,
16302 &info[i], transition_reason, is_bt_in_progress)) {
16303 /*
16304 * If status is not over written, it means it is a
16305 * candidate for accept.
16306 */
16307 info[i].status = QCA_STATUS_ACCEPT;
16308 }
16309 }
16310
16311 /* success */
16312 status = QDF_STATUS_SUCCESS;
16313
16314free:
16315 /* free allocated memory */
16316 if (conn_res)
16317 qdf_mem_free(conn_res);
16318 if (res)
16319 qdf_mem_free(res);
16320
16321 return status;
16322}
Qiwei Caie689a262018-07-26 15:50:22 +080016323#endif /* FEATURE_BSS_TRANSITION */
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053016324
Vignesh Viswanathan79f7e3f2018-09-30 23:56:10 +053016325bool sme_is_conn_state_connected(mac_handle_t hal, uint8_t session_id)
16326{
16327 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16328
16329 return csr_is_conn_state_connected(mac_ctx, session_id);
16330}
16331
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080016332void sme_enable_roaming_on_connected_sta(mac_handle_t hal)
Abhishek Singh1f217ec2017-12-22 11:48:27 +053016333{
16334 uint8_t session_id;
16335 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16336 QDF_STATUS status;
16337
16338 session_id = csr_get_roam_enabled_sta_sessionid(mac_ctx);
16339 if (session_id != CSR_SESSION_ID_INVALID)
16340 return;
16341
16342 session_id = csr_get_connected_infra(mac_ctx);
16343 if (session_id == CSR_SESSION_ID_INVALID) {
16344 sme_debug("No STA in conencted state");
16345 return;
16346 }
16347
16348 sme_debug("Roaming not enabled on any STA, enable roaming on session %d",
16349 session_id);
16350 status = sme_acquire_global_lock(&mac_ctx->sme);
16351 if (QDF_IS_STATUS_SUCCESS(status)) {
16352 csr_roam_offload_scan(mac_ctx, session_id,
16353 ROAM_SCAN_OFFLOAD_START,
16354 REASON_CTX_INIT);
16355 sme_release_global_lock(&mac_ctx->sme);
16356 }
Sandeep Puligilla063a4342018-01-10 02:50:14 -080016357}
Abhishek Singh1f217ec2017-12-22 11:48:27 +053016358
Sandeep Puligilla063a4342018-01-10 02:50:14 -080016359int16_t sme_get_oper_chan_freq(struct wlan_objmgr_vdev *vdev)
16360{
16361 uint8_t vdev_id, chan;
16362 struct csr_roam_session *session;
16363 tpAniSirGlobal mac_ctx;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080016364 mac_handle_t mac_handle;
Sandeep Puligilla063a4342018-01-10 02:50:14 -080016365 int16_t freq = 0;
16366
16367 if (vdev == NULL) {
16368 sme_err("Invalid vdev id is passed");
16369 return 0;
16370 }
16371
Jeff Johnsonb460dd72018-11-08 10:26:51 -080016372 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
16373 if (!mac_handle) {
16374 sme_err("mac_handle is null");
Arif Hussaind15902c2018-03-02 00:08:29 -080016375 return 0;
16376 }
Jeff Johnsonb460dd72018-11-08 10:26:51 -080016377 mac_ctx = PMAC_STRUCT(mac_handle);
Sandeep Puligilla063a4342018-01-10 02:50:14 -080016378 vdev_id = wlan_vdev_get_id(vdev);
16379 if (!CSR_IS_SESSION_VALID(mac_ctx, vdev_id)) {
16380 sme_err("Invalid vdev id is passed");
16381 return 0;
16382 }
16383
16384 session = CSR_GET_SESSION(mac_ctx, vdev_id);
16385 chan = csr_get_infra_operation_channel(mac_ctx, vdev_id);
16386 if (chan)
16387 freq = cds_chan_to_freq(chan);
16388
16389 return freq;
16390}
16391
16392enum phy_ch_width sme_get_oper_ch_width(struct wlan_objmgr_vdev *vdev)
16393{
16394 uint8_t vdev_id;
16395 struct csr_roam_session *session;
16396 tpAniSirGlobal mac_ctx;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080016397 mac_handle_t mac_handle;
Sandeep Puligilla063a4342018-01-10 02:50:14 -080016398 enum phy_ch_width ch_width = CH_WIDTH_20MHZ;
16399
16400 if (vdev == NULL) {
16401 sme_err("Invalid vdev id is passed");
16402 return CH_WIDTH_INVALID;
16403 }
16404
Jeff Johnsonb460dd72018-11-08 10:26:51 -080016405 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
16406 if (!mac_handle) {
16407 sme_err("mac_handle is null");
Arif Hussaind15902c2018-03-02 00:08:29 -080016408 return CH_WIDTH_INVALID;
16409 }
Jeff Johnsonb460dd72018-11-08 10:26:51 -080016410 mac_ctx = PMAC_STRUCT(mac_handle);
Sandeep Puligilla063a4342018-01-10 02:50:14 -080016411 vdev_id = wlan_vdev_get_id(vdev);
16412 if (!CSR_IS_SESSION_VALID(mac_ctx, vdev_id)) {
16413 sme_err("Invalid vdev id is passed");
16414 return CH_WIDTH_INVALID;
16415 }
16416
16417 session = CSR_GET_SESSION(mac_ctx, vdev_id);
16418
16419 if (csr_is_conn_state_connected(mac_ctx, vdev_id))
16420 ch_width = session->connectedProfile.vht_channel_width;
16421
16422 return ch_width;
16423}
16424
16425int sme_get_sec20chan_freq_mhz(struct wlan_objmgr_vdev *vdev,
16426 uint16_t *sec20chan_freq)
16427{
16428 uint8_t vdev_id;
16429
16430 vdev_id = wlan_vdev_get_id(vdev);
16431 /* Need to extend */
16432 return 0;
Abhishek Singh1f217ec2017-12-22 11:48:27 +053016433}
16434
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053016435#ifdef WLAN_FEATURE_SAE
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080016436QDF_STATUS sme_handle_sae_msg(mac_handle_t hal, uint8_t session_id,
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053016437 uint8_t sae_status)
16438{
16439 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
16440 tpAniSirGlobal mac = PMAC_STRUCT(hal);
16441 struct sir_sae_msg *sae_msg;
16442 struct scheduler_msg sch_msg = {0};
16443
16444 qdf_status = sme_acquire_global_lock(&mac->sme);
16445 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
16446 sae_msg = qdf_mem_malloc(sizeof(*sae_msg));
16447 if (!sae_msg) {
16448 qdf_status = QDF_STATUS_E_NOMEM;
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053016449 } else {
16450 sae_msg->message_type = eWNI_SME_SEND_SAE_MSG;
16451 sae_msg->length = sizeof(*sae_msg);
16452 sae_msg->session_id = session_id;
16453 sae_msg->sae_status = sae_status;
16454 sme_debug("SAE: sae_status %d session_id %d",
16455 sae_msg->sae_status,
16456 sae_msg->session_id);
16457
16458 sch_msg.type = eWNI_SME_SEND_SAE_MSG;
16459 sch_msg.bodyptr = sae_msg;
16460
16461 qdf_status =
gaurank kathpalia36b0c582018-08-28 17:45:43 +053016462 scheduler_post_message(QDF_MODULE_ID_SME,
16463 QDF_MODULE_ID_PE,
16464 QDF_MODULE_ID_PE,
16465 &sch_msg);
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053016466 }
16467 sme_release_global_lock(&mac->sme);
16468 }
16469
16470 return qdf_status;
16471}
16472#endif
Vignesh Viswanathan0a569292018-02-14 15:34:47 +053016473
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080016474bool sme_is_sta_key_exchange_in_progress(mac_handle_t hal, uint8_t session_id)
Vignesh Viswanathan0a569292018-02-14 15:34:47 +053016475{
16476 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16477
16478 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
16479 sme_err("Invalid session id: %d", session_id);
16480 return false;
16481 }
16482
16483 return CSR_IS_WAIT_FOR_KEY(mac_ctx, session_id);
16484}
Vignesh Viswanathana2f5ce582018-05-09 20:38:39 +053016485
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080016486bool sme_validate_channel_list(mac_handle_t hal,
Vignesh Viswanathana2f5ce582018-05-09 20:38:39 +053016487 uint8_t *chan_list,
16488 uint8_t num_channels)
16489{
16490 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16491 uint8_t i = 0;
16492 uint8_t j;
16493 bool found;
16494 struct csr_channel *ch_lst_info = &mac_ctx->scan.base_channels;
16495
16496 if (!chan_list || !num_channels) {
16497 sme_err("Chan list empty %pK or num_channels is 0", chan_list);
16498 return false;
16499 }
16500
16501 while (i < num_channels) {
16502 found = false;
16503 for (j = 0; j < ch_lst_info->numChannels; j++) {
16504 if (ch_lst_info->channelList[j] == chan_list[i]) {
16505 found = true;
16506 break;
16507 }
16508 }
16509
16510 if (!found) {
16511 sme_debug("Invalid channel %d", chan_list[i]);
16512 return false;
16513 }
16514
16515 i++;
16516 }
Arif Hussain0e246802018-05-01 18:13:44 -070016517
Vignesh Viswanathana2f5ce582018-05-09 20:38:39 +053016518 return true;
16519}
Arif Hussain0e246802018-05-01 18:13:44 -070016520
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080016521void sme_set_amsdu(mac_handle_t hal, bool enable)
Arif Hussain0e246802018-05-01 18:13:44 -070016522{
16523 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16524 mac_ctx->is_usr_cfg_amsdu_enabled = enable;
16525}
Naveen Rawatfa2a1002018-05-17 16:06:37 -070016526
16527uint8_t sme_get_mcs_idx(uint16_t max_rate, uint8_t rate_flags,
Hanumanth Reddy Pothula834f9432018-05-30 14:20:32 +053016528 uint8_t *nss, uint8_t *mcs_rate_flags)
Naveen Rawatfa2a1002018-05-17 16:06:37 -070016529{
16530 return wma_get_mcs_idx(max_rate, rate_flags, nss, mcs_rate_flags);
16531}
Chaoli Zhou75b062f2018-06-11 12:36:54 +080016532
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080016533bool sme_find_session_by_bssid(mac_handle_t hal, uint8_t *bssid)
Chaoli Zhou75b062f2018-06-11 12:36:54 +080016534{
16535 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16536 bool ret;
16537
16538 ret = csr_find_session_by_bssid(mac_ctx, bssid);
16539
16540 return ret;
16541}
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053016542
16543QDF_STATUS
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080016544sme_get_roam_scan_stats(mac_handle_t hal, roam_scan_stats_cb cb, void *context,
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053016545 uint32_t vdev_id)
16546{
16547 QDF_STATUS status = QDF_STATUS_E_FAILURE;
16548 tpAniSirGlobal mac = PMAC_STRUCT(hal);
16549 struct scheduler_msg msg = {0};
16550 struct sir_roam_scan_stats *req;
16551
16552 req = qdf_mem_malloc(sizeof(*req));
Arif Hussain0ef77082018-10-10 16:42:53 -070016553 if (!req)
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053016554 return QDF_STATUS_E_NOMEM;
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053016555
16556 req->vdev_id = vdev_id;
16557 req->cb = cb;
16558 req->context = context;
16559
16560 status = sme_acquire_global_lock(&mac->sme);
16561 if (QDF_IS_STATUS_SUCCESS(status)) {
16562 msg.bodyptr = req;
16563 msg.type = WMA_GET_ROAM_SCAN_STATS;
16564 msg.reserved = 0;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053016565 status = scheduler_post_message(QDF_MODULE_ID_SME,
16566 QDF_MODULE_ID_WMA,
16567 QDF_MODULE_ID_WMA,
16568 &msg);
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053016569 sme_release_global_lock(&mac->sme);
16570 if (!QDF_IS_STATUS_SUCCESS(status)) {
16571 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16572 FL("post roam scan stats req failed"));
16573 status = QDF_STATUS_E_FAILURE;
16574 qdf_mem_free(req);
16575 }
16576 } else {
16577 sme_err("sme_acquire_global_lock failed");
16578 qdf_mem_free(req);
16579 }
16580
16581 return status;
16582}
Vignesh Viswanathan987f0bb2018-09-17 17:00:29 +053016583
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080016584void sme_update_score_config(mac_handle_t hal,
Vignesh Viswanathan987f0bb2018-09-17 17:00:29 +053016585 struct scoring_config *score_config)
16586{
16587 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16588 struct wlan_mlme_scoring_cfg *mlme_scoring_cfg;
16589
16590 mlme_scoring_cfg = &mac_ctx->mlme_cfg->scoring;
16591
16592 score_config->weight_cfg.rssi_weightage =
16593 mlme_scoring_cfg->weight_cfg.rssi_weightage;
16594 score_config->weight_cfg.ht_caps_weightage =
16595 mlme_scoring_cfg->weight_cfg.ht_caps_weightage;
16596 score_config->weight_cfg.vht_caps_weightage =
16597 mlme_scoring_cfg->weight_cfg.vht_caps_weightage;
16598 score_config->weight_cfg.he_caps_weightage =
16599 mlme_scoring_cfg->weight_cfg.he_caps_weightage;
16600 score_config->weight_cfg.chan_width_weightage =
16601 mlme_scoring_cfg->weight_cfg.chan_width_weightage;
16602 score_config->weight_cfg.chan_band_weightage =
16603 mlme_scoring_cfg->weight_cfg.chan_band_weightage;
16604 score_config->weight_cfg.nss_weightage =
16605 mlme_scoring_cfg->weight_cfg.nss_weightage;
16606 score_config->weight_cfg.beamforming_cap_weightage =
16607 mlme_scoring_cfg->weight_cfg.beamforming_cap_weightage;
16608 score_config->weight_cfg.pcl_weightage =
16609 mlme_scoring_cfg->weight_cfg.pcl_weightage;
16610 score_config->weight_cfg.channel_congestion_weightage =
16611 mlme_scoring_cfg->weight_cfg.channel_congestion_weightage;
16612 score_config->weight_cfg.oce_wan_weightage =
16613 mlme_scoring_cfg->weight_cfg.oce_wan_weightage;
16614
16615 score_config->bandwidth_weight_per_index =
16616 mlme_scoring_cfg->bandwidth_weight_per_index;
16617 score_config->nss_weight_per_index =
16618 mlme_scoring_cfg->nss_weight_per_index;
16619 score_config->band_weight_per_index =
16620 mlme_scoring_cfg->band_weight_per_index;
16621
16622 score_config->rssi_score.best_rssi_threshold =
16623 mlme_scoring_cfg->rssi_score.best_rssi_threshold;
16624 score_config->rssi_score.good_rssi_threshold =
16625 mlme_scoring_cfg->rssi_score.good_rssi_threshold;
16626 score_config->rssi_score.bad_rssi_threshold =
16627 mlme_scoring_cfg->rssi_score.bad_rssi_threshold;
16628 score_config->rssi_score.good_rssi_pcnt =
16629 mlme_scoring_cfg->rssi_score.good_rssi_pcnt;
16630 score_config->rssi_score.bad_rssi_pcnt =
16631 mlme_scoring_cfg->rssi_score.bad_rssi_pcnt;
16632 score_config->rssi_score.good_rssi_bucket_size =
16633 mlme_scoring_cfg->rssi_score.good_rssi_bucket_size;
16634 score_config->rssi_score.bad_rssi_bucket_size =
16635 mlme_scoring_cfg->rssi_score.bad_rssi_bucket_size;
16636 score_config->rssi_score.rssi_pref_5g_rssi_thresh =
16637 mlme_scoring_cfg->rssi_score.rssi_pref_5g_rssi_thresh;
16638
16639 score_config->esp_qbss_scoring.num_slot =
16640 mlme_scoring_cfg->esp_qbss_scoring.num_slot;
16641 score_config->esp_qbss_scoring.score_pcnt3_to_0 =
16642 mlme_scoring_cfg->esp_qbss_scoring.score_pcnt3_to_0;
16643 score_config->esp_qbss_scoring.score_pcnt7_to_4 =
16644 mlme_scoring_cfg->esp_qbss_scoring.score_pcnt7_to_4;
16645 score_config->esp_qbss_scoring.score_pcnt11_to_8 =
16646 mlme_scoring_cfg->esp_qbss_scoring.score_pcnt11_to_8;
16647 score_config->esp_qbss_scoring.score_pcnt15_to_12 =
16648 mlme_scoring_cfg->esp_qbss_scoring.score_pcnt15_to_12;
16649
16650 score_config->oce_wan_scoring.num_slot =
16651 mlme_scoring_cfg->oce_wan_scoring.num_slot;
16652 score_config->oce_wan_scoring.score_pcnt3_to_0 =
16653 mlme_scoring_cfg->oce_wan_scoring.score_pcnt3_to_0;
16654 score_config->oce_wan_scoring.score_pcnt7_to_4 =
16655 mlme_scoring_cfg->oce_wan_scoring.score_pcnt7_to_4;
16656 score_config->oce_wan_scoring.score_pcnt11_to_8 =
16657 mlme_scoring_cfg->oce_wan_scoring.score_pcnt11_to_8;
16658 score_config->oce_wan_scoring.score_pcnt15_to_12 =
16659 mlme_scoring_cfg->oce_wan_scoring.score_pcnt15_to_12;
16660}