blob: 476d6caf29f611c5a294c9aec5cf46906dc91009 [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"
Jeff Johnson6136fb92017-03-30 15:21:49 -070034#include "wma_fips_api.h"
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053035#include "qdf_trace.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080036#include "sme_trace.h"
Anurag Chouhan6d760662016-02-20 16:05:43 +053037#include "qdf_types.h"
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053038#include "qdf_trace.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080039#include "cds_utils.h"
40#include "sap_api.h"
41#include "mac_trace.h"
42#ifdef WLAN_FEATURE_NAN
43#include "nan_api.h"
44#endif
Naveen Rawat3b6068c2016-04-14 19:01:06 -070045#include "cds_regdomain.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080046#include "cfg_api.h"
47#include "sme_power_save_api.h"
48#include "wma.h"
Naveen Rawatb4d37622015-11-13 16:15:25 -080049#include "sch_api.h"
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070050#include "sme_nan_datapath.h"
Agrawal Ashish21ba2572016-09-03 16:40:10 +053051#include "csr_api.h"
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070052#include "wlan_reg_services_api.h"
Abhishek Singh158fe252017-03-23 11:09:34 +053053#include <wlan_scan_ucfg_api.h>
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070054#include "wlan_reg_ucfg_api.h"
Arif Hussainee677012017-01-26 17:50:13 -080055#include "ol_txrx.h"
Naveen Rawatd2657be2017-10-10 14:31:23 -070056#include "wifi_pos_api.h"
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053057#include "net/cfg80211.h"
58#include <qca_vendor.h>
Sandeep Puligilla063a4342018-01-10 02:50:14 -080059#include <wlan_spectral_utils_api.h>
Vignesh Viswanathan21c58cb2018-05-24 15:53:58 +053060#include "wlan_mlme_public_struct.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080061
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080062static tSelfRecoveryStats g_self_recovery_stats;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080063
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053064static QDF_STATUS init_sme_cmd_list(tpAniSirGlobal pMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080065
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053066static void sme_disconnect_connected_sessions(tpAniSirGlobal pMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080067
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053068static QDF_STATUS sme_handle_generic_change_country_code(tpAniSirGlobal pMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080069 void *pMsgBuf);
70
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053071static QDF_STATUS sme_process_nss_update_resp(tpAniSirGlobal mac, uint8_t *msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080072
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080073/* Channel Change Response Indication Handler */
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053074static QDF_STATUS sme_process_channel_change_resp(tpAniSirGlobal pMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080075 uint16_t msg_type, void *pMsgBuf);
76
Jeff Johnsonfdecd512018-06-10 09:18:32 -070077static QDF_STATUS sme_stats_ext_event(tpAniSirGlobal mac,
Jeff Johnson45843652018-07-04 12:47:34 -070078 struct stats_ext_event *msg);
Jeff Johnsonfdecd512018-06-10 09:18:32 -070079
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080080/* Internal SME APIs */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053081QDF_STATUS sme_acquire_global_lock(tSmeStruct *psSme)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080082{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053083 QDF_STATUS status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080084
85 if (psSme) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053086 if (QDF_IS_STATUS_SUCCESS
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053087 (qdf_mutex_acquire(&psSme->lkSmeGlobalLock)))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053088 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080089 }
90
91 return status;
92}
93
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053094QDF_STATUS sme_release_global_lock(tSmeStruct *psSme)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080095{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053096 QDF_STATUS status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080097
98 if (psSme) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053099 if (QDF_IS_STATUS_SUCCESS
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530100 (qdf_mutex_release(&psSme->lkSmeGlobalLock)))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530101 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800102 }
103
104 return status;
105}
106
Tushnim Bhattacharyya518e80f2017-08-30 17:35:33 -0700107tpAniSirGlobal sme_get_mac_context(void)
Archana Ramachandran2eb7a612017-03-23 22:58:42 -0700108{
109 tpAniSirGlobal mac_ctx;
110 tHalHandle h_hal;
111
112 h_hal = cds_get_context(QDF_MODULE_ID_SME);
113 if (NULL == h_hal) {
114 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
115 FL("invalid h_hal"));
116 return NULL;
117 }
118
119 mac_ctx = PMAC_STRUCT(h_hal);
Archana Ramachandran2eb7a612017-03-23 22:58:42 -0700120
121 return mac_ctx;
122}
123
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800124/**
125 * sme_process_set_hw_mode_resp() - Process set HW mode response
126 * @mac: Global MAC pointer
127 * @msg: HW mode response
128 *
129 * Processes the HW mode response and invokes the HDD callback
130 * to process further
131 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530132static QDF_STATUS sme_process_set_hw_mode_resp(tpAniSirGlobal mac, uint8_t *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800133{
Krunal Sonia8270f52017-02-23 19:51:25 -0800134 tListElem *entry;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800135 tSmeCmd *command = NULL;
136 bool found;
Tushnim Bhattacharyyaeab33dd2017-11-15 15:20:02 -0800137 policy_mgr_pdev_set_hw_mode_cback callback = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800138 struct sir_set_hw_mode_resp *param;
Tushnim Bhattacharyya3b99f4b2018-03-26 14:19:24 -0700139 enum policy_mgr_conn_update_reason reason;
gaurank kathpalia14e2f912017-08-31 14:51:45 +0530140 struct csr_roam_session *session;
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800141 uint32_t session_id;
Sandeep Puligilla344d7252017-09-15 16:23:33 -0700142
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800143 param = (struct sir_set_hw_mode_resp *)msg;
144 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700145 sme_err("HW mode resp param is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800146 /* Not returning. Need to check if active command list
147 * needs to be freed
148 */
149 }
150
Krunal Sonia8270f52017-02-23 19:51:25 -0800151 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800152 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700153 sme_err("No cmd found in active list");
Tushnim Bhattacharyya4a03db82017-11-10 17:58:28 -0800154 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800155 }
156
157 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
158 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700159 sme_err("Base address is NULL");
Tushnim Bhattacharyya4a03db82017-11-10 17:58:28 -0800160 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800161 }
162
163 if (e_sme_command_set_hw_mode != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700164 sme_err("Command mismatch!");
Tushnim Bhattacharyya4a03db82017-11-10 17:58:28 -0800165 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800166 }
167
168 callback = command->u.set_hw_mode_cmd.set_hw_mode_cb;
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +0530169 reason = command->u.set_hw_mode_cmd.reason;
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800170 session_id = command->u.set_hw_mode_cmd.session_id;
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +0530171
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700172 sme_debug("reason: %d session: %d",
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +0530173 command->u.set_hw_mode_cmd.reason,
174 command->u.set_hw_mode_cmd.session_id);
175
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700176 if (!callback) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700177 sme_err("Callback does not exist");
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700178 goto end;
179 }
180
181 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700182 sme_err("Callback failed since HW mode params is NULL");
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700183 goto end;
184 }
185
186 /* Irrespective of the reason for which the hw mode change request
187 * was issued, the policy manager connection table needs to be updated
188 * with the new vdev-mac id mapping, tx/rx spatial streams etc., if the
189 * set hw mode was successful.
190 */
191 callback(param->status,
192 param->cfgd_hw_mode_index,
193 param->num_vdev_mac_entries,
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -0800194 param->vdev_mac_map,
Tushnim Bhattacharyyaeab33dd2017-11-15 15:20:02 -0800195 command->u.set_hw_mode_cmd.next_action,
196 command->u.set_hw_mode_cmd.reason,
197 command->u.set_hw_mode_cmd.session_id,
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -0800198 command->u.set_hw_mode_cmd.context);
Krunal Soni3fa80e22018-01-09 14:16:02 -0800199 if (!CSR_IS_SESSION_VALID(mac, session_id)) {
200 sme_err("session %d is invalid", session_id);
201 goto end;
202 }
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800203 session = CSR_GET_SESSION(mac, session_id);
Tushnim Bhattacharyya3b99f4b2018-03-26 14:19:24 -0700204 if (reason == POLICY_MGR_UPDATE_REASON_HIDDEN_STA) {
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700205 /* In the case of hidden SSID, connection update
206 * (set hw mode) is done after the scan with reason
207 * code eCsrScanForSsid completes. The connect/failure
208 * needs to be handled after the response of set hw
209 * mode
210 */
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800211 if (param->status == SET_HW_MODE_STATUS_OK) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700212 sme_debug("search for ssid success");
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800213 csr_scan_handle_search_for_ssid(mac,
214 session_id);
215 } else {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700216 sme_debug("search for ssid failure");
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800217 csr_scan_handle_search_for_ssid_failure(mac,
218 session_id);
219 }
Deepak Dhamdhere6f7fbbe2017-02-28 13:35:52 -0800220 csr_saved_scan_cmd_free_fields(mac, session);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800221 }
222
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +0530223end:
Krunal Soni72dba662017-02-15 20:13:17 -0800224 found = csr_nonscan_active_ll_remove_entry(mac, entry,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800225 LL_ACCESS_LOCK);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530226 if (found)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800227 /* Now put this command back on the avilable command list */
Krunal Soni78618d92017-02-14 21:46:31 -0800228 csr_release_command(mac, command);
Krunal Sonia8270f52017-02-23 19:51:25 -0800229
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530230 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800231}
232
233/**
234 * sme_process_hw_mode_trans_ind() - Process HW mode transition indication
235 * @mac: Global MAC pointer
236 * @msg: HW mode transition response
237 *
238 * Processes the HW mode transition indication and invoke the HDD callback
239 * to process further
240 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530241static QDF_STATUS sme_process_hw_mode_trans_ind(tpAniSirGlobal mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800242 uint8_t *msg)
243{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800244 struct sir_hw_mode_trans_ind *param;
245
246 param = (struct sir_hw_mode_trans_ind *)msg;
247 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700248 sme_err("HW mode trans ind param is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530249 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800250 }
251
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -0800252 policy_mgr_hw_mode_transition_cb(param->old_hw_mode_index,
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -0800253 param->new_hw_mode_index,
254 param->num_vdev_mac_entries,
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -0800255 param->vdev_mac_map, mac->psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800256
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530257 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800258}
259
Naveen Rawate7d86052015-11-13 12:01:43 -0800260/**
261 * free_sme_cmds() - This function frees memory allocated for SME commands
262 * @mac_ctx: Pointer to Global MAC structure
263 *
264 * This function frees memory allocated for SME commands
265 *
266 * @Return: void
267 */
268static void free_sme_cmds(tpAniSirGlobal mac_ctx)
269{
270 uint32_t idx;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530271
Naveen Rawate7d86052015-11-13 12:01:43 -0800272 if (NULL == mac_ctx->sme.pSmeCmdBufAddr)
273 return;
274
275 for (idx = 0; idx < mac_ctx->sme.totalSmeCmd; idx++)
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530276 qdf_mem_free(mac_ctx->sme.pSmeCmdBufAddr[idx]);
Naveen Rawate7d86052015-11-13 12:01:43 -0800277
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530278 qdf_mem_free(mac_ctx->sme.pSmeCmdBufAddr);
Naveen Rawate7d86052015-11-13 12:01:43 -0800279 mac_ctx->sme.pSmeCmdBufAddr = NULL;
280}
281
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530282static QDF_STATUS init_sme_cmd_list(tpAniSirGlobal pMac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800283{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530284 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800285 tSmeCmd *pCmd;
286 uint32_t cmd_idx;
Naveen Rawate7d86052015-11-13 12:01:43 -0800287 uint32_t sme_cmd_ptr_ary_sz;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800288
289 pMac->sme.totalSmeCmd = SME_TOTAL_COMMAND;
290
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800291
Jeff Johnson616417f2018-06-27 10:20:53 -0700292 status = csr_ll_open(&pMac->sme.smeCmdFreeList);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530293 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800294 goto end;
295
Naveen Rawate7d86052015-11-13 12:01:43 -0800296 /* following pointer contains array of pointers for tSmeCmd* */
297 sme_cmd_ptr_ary_sz = sizeof(void *) * pMac->sme.totalSmeCmd;
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530298 pMac->sme.pSmeCmdBufAddr = qdf_mem_malloc(sme_cmd_ptr_ary_sz);
Arif Hussain0ef77082018-10-10 16:42:53 -0700299 if (!pMac->sme.pSmeCmdBufAddr) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530300 status = QDF_STATUS_E_NOMEM;
Naveen Rawate7d86052015-11-13 12:01:43 -0800301 goto end;
302 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800303
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530304 status = QDF_STATUS_SUCCESS;
Naveen Rawate7d86052015-11-13 12:01:43 -0800305 for (cmd_idx = 0; cmd_idx < pMac->sme.totalSmeCmd; cmd_idx++) {
306 /*
307 * Since total size of all commands together can be huge chunk
308 * of memory, allocate SME cmd individually. These SME CMDs are
309 * moved between pending and active queues. And these freeing of
310 * these queues just manipulates the list but does not actually
311 * frees SME CMD pointers. Hence store each SME CMD address in
312 * the array, sme.pSmeCmdBufAddr. This will later facilitate
313 * freeing up of all SME CMDs with just a for loop.
314 */
315 pMac->sme.pSmeCmdBufAddr[cmd_idx] =
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530316 qdf_mem_malloc(sizeof(tSmeCmd));
Naveen Rawate7d86052015-11-13 12:01:43 -0800317 if (NULL == pMac->sme.pSmeCmdBufAddr[cmd_idx]) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530318 status = QDF_STATUS_E_NOMEM;
Naveen Rawate7d86052015-11-13 12:01:43 -0800319 free_sme_cmds(pMac);
320 goto end;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800321 }
Naveen Rawate7d86052015-11-13 12:01:43 -0800322 pCmd = (tSmeCmd *)pMac->sme.pSmeCmdBufAddr[cmd_idx];
323 csr_ll_insert_tail(&pMac->sme.smeCmdFreeList,
324 &pCmd->Link, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800325 }
326
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800327end:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530328 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700329 sme_err("Failed to initialize sme command list: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800330
331 return status;
332}
333
Krunal Sonia8270f52017-02-23 19:51:25 -0800334void sme_release_command(tpAniSirGlobal mac_ctx, tSmeCmd *sme_cmd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800335{
Krunal Sonia8270f52017-02-23 19:51:25 -0800336 sme_cmd->command = eSmeNoCommand;
337 csr_ll_insert_tail(&mac_ctx->sme.smeCmdFreeList, &sme_cmd->Link,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530338 LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800339}
340
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530341static QDF_STATUS free_sme_cmd_list(tpAniSirGlobal pMac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800342{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530343 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800344
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800345 csr_ll_close(&pMac->sme.smeCmdFreeList);
346
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530347 status = qdf_mutex_acquire(&pMac->sme.lkSmeGlobalLock);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530348 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700349 sme_err("Failed to acquire the lock status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800350 goto done;
351 }
352
Naveen Rawate7d86052015-11-13 12:01:43 -0800353 free_sme_cmds(pMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800354
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530355 status = qdf_mutex_release(&pMac->sme.lkSmeGlobalLock);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530356 if (status != QDF_STATUS_SUCCESS)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700357 sme_err("Failed to release the lock status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800358done:
359 return status;
360}
361
Jeff Johnson49c02f92016-10-07 10:29:09 -0700362static void dump_csr_command_info(tpAniSirGlobal pMac, tSmeCmd *pCmd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800363{
364 switch (pCmd->command) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800365 case eSmeCommandRoam:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700366 sme_debug("roam command reason is %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800367 pCmd->u.roamCmd.roamReason);
368 break;
369
370 case eSmeCommandWmStatusChange:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700371 sme_debug("WMStatusChange command type is %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800372 pCmd->u.wmStatusChangeCmd.Type);
373 break;
374
Pragaspathi Thilagarajb37dad32018-07-01 16:48:01 +0530375 case e_sme_command_del_sta_session:
376 sme_debug("Issue del STA command for session:%d",
377 pCmd->sessionId);
378 break;
379
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800380 default:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700381 sme_debug("default: Unhandled command %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800382 pCmd->command);
383 break;
384 }
385}
386
387tSmeCmd *sme_get_command_buffer(tpAniSirGlobal pMac)
388{
389 tSmeCmd *pRetCmd = NULL, *pTempCmd = NULL;
390 tListElem *pEntry;
391 static int sme_command_queue_full;
392
393 pEntry = csr_ll_remove_head(&pMac->sme.smeCmdFreeList, LL_ACCESS_LOCK);
394
395 /* If we can get another MS Msg buffer, then we are ok. Just link */
396 /* the entry onto the linked list. (We are using the linked list */
397 /* to keep track of tfhe message buffers). */
398 if (pEntry) {
399 pRetCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
400 /* reset when free list is available */
401 sme_command_queue_full = 0;
402 } else {
403 int idx = 1;
404
405 /* Cannot change pRetCmd here since it needs to return later. */
Krunal Sonia8270f52017-02-23 19:51:25 -0800406 pEntry = csr_nonscan_active_ll_peek_head(pMac, LL_ACCESS_LOCK);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530407 if (pEntry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800408 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530409
410 sme_err("Out of command buffer.... command (0x%X) stuck",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800411 (pTempCmd) ? pTempCmd->command : eSmeNoCommand);
412 if (pTempCmd) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530413 if (eSmeCsrCommandMask & pTempCmd->command)
414 /* CSR command is stuck. See what the reason
415 * code is for that command
416 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800417 dump_csr_command_info(pMac, pTempCmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800418 } /* if(pTempCmd) */
419
420 /* dump what is in the pending queue */
Krunal Soni20126cb2017-02-15 16:26:57 -0800421 csr_nonscan_pending_ll_lock(pMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800422 pEntry =
Krunal Sonia8270f52017-02-23 19:51:25 -0800423 csr_nonscan_pending_ll_peek_head(pMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800424 LL_ACCESS_NOLOCK);
425 while (pEntry && !sme_command_queue_full) {
426 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
427 /* Print only 1st five commands from pending queue. */
428 if (idx <= 5)
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530429 sme_err("Out of command buffer.... SME pending command #%d (0x%X)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800430 idx, pTempCmd->command);
431 idx++;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530432 if (eSmeCsrCommandMask & pTempCmd->command)
433 /* CSR command is stuck. See what the reason
434 * code is for that command
435 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800436 dump_csr_command_info(pMac, pTempCmd);
Krunal Soni72dba662017-02-15 20:13:17 -0800437 pEntry = csr_nonscan_pending_ll_next(pMac, pEntry,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800438 LL_ACCESS_NOLOCK);
439 }
Krunal Soni20126cb2017-02-15 16:26:57 -0800440 csr_nonscan_pending_ll_unlock(pMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800441
Vignesh Viswanathana1f3a1a2018-10-04 13:10:46 +0530442 if (pMac->mlme_cfg->gen.fatal_event_trigger)
Abhishek Singh5ea86532016-04-27 14:10:53 +0530443 cds_flush_logs(WLAN_LOG_TYPE_FATAL,
444 WLAN_LOG_INDICATOR_HOST_DRIVER,
445 WLAN_LOG_REASON_SME_OUT_OF_CMD_BUF,
446 false,
Vignesh Viswanathana1f3a1a2018-10-04 13:10:46 +0530447 pMac->mlme_cfg->gen.self_recovery);
Abhishek Singh5ea86532016-04-27 14:10:53 +0530448 else
Anurag Chouhan4085ff72017-10-05 18:09:56 +0530449 cds_trigger_recovery(QDF_GET_MSG_BUFF_FAILURE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800450 }
451
452 /* memset to zero */
453 if (pRetCmd) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530454 qdf_mem_set((uint8_t *)&pRetCmd->command,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800455 sizeof(pRetCmd->command), 0);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530456 qdf_mem_set((uint8_t *)&pRetCmd->sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800457 sizeof(pRetCmd->sessionId), 0);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530458 qdf_mem_set((uint8_t *)&pRetCmd->u, sizeof(pRetCmd->u), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800459 }
460
461 return pRetCmd;
462}
463
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800464/**
Krunal Sonia8270f52017-02-23 19:51:25 -0800465 * sme_ser_handle_active_cmd() - handle command activation callback from
466 * new serialization module
467 * @cmd: pointer to new serialization command
468 *
469 * This API is to handle command activation callback from new serialization
470 * callback
471 *
472 * Return: QDF_STATUS_SUCCESS
473 */
474static
475QDF_STATUS sme_ser_handle_active_cmd(struct wlan_serialization_command *cmd)
476{
477 tSmeCmd *sme_cmd;
478 tHalHandle hal;
479 tpAniSirGlobal mac_ctx;
480 QDF_STATUS status = QDF_STATUS_SUCCESS;
481 bool do_continue;
482
483 if (!cmd) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700484 sme_err("No serialization command found");
Krunal Sonia8270f52017-02-23 19:51:25 -0800485 return QDF_STATUS_E_FAILURE;
486 }
487
488 hal = cds_get_context(QDF_MODULE_ID_SME);
Pragaspathi Thilagarajb11dbe42018-07-23 16:42:17 +0530489 if (NULL != hal) {
490 mac_ctx = PMAC_STRUCT(hal);
491 } else {
492 sme_err("No hal found");
Krunal Sonia8270f52017-02-23 19:51:25 -0800493 return QDF_STATUS_E_FAILURE;
494 }
495 sme_cmd = cmd->umac_cmd;
496 if (!sme_cmd) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700497 sme_err("No SME command found");
Krunal Sonia8270f52017-02-23 19:51:25 -0800498 return QDF_STATUS_E_FAILURE;
499 }
500
501 switch (sme_cmd->command) {
502 case eSmeCommandRoam:
503 status = csr_roam_process_command(mac_ctx, sme_cmd);
504 break;
505 case eSmeCommandWmStatusChange:
506 csr_roam_process_wm_status_change_command(mac_ctx,
507 sme_cmd);
508 break;
Pragaspathi Thilagarajb37dad32018-07-01 16:48:01 +0530509 case e_sme_command_del_sta_session:
510 csr_process_del_sta_session_command(mac_ctx, sme_cmd);
511 break;
Krunal Sonia8270f52017-02-23 19:51:25 -0800512 case eSmeCommandAddTs:
513 case eSmeCommandDelTs:
514#ifndef WLAN_MDM_CODE_REDUCTION_OPT
515 do_continue = qos_process_command(mac_ctx, sme_cmd);
516 if (do_continue)
517 status = QDF_STATUS_E_FAILURE;
518#endif
519 break;
Krunal Sonia8270f52017-02-23 19:51:25 -0800520 case e_sme_command_set_hw_mode:
521 csr_process_set_hw_mode(mac_ctx, sme_cmd);
522 break;
523 case e_sme_command_nss_update:
524 csr_process_nss_update_req(mac_ctx, sme_cmd);
525 break;
526 case e_sme_command_set_dual_mac_config:
527 csr_process_set_dual_mac_config(mac_ctx, sme_cmd);
528 break;
529 case e_sme_command_set_antenna_mode:
530 csr_process_set_antenna_mode(mac_ctx, sme_cmd);
531 break;
532 default:
533 /* something is wrong */
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700534 sme_err("unknown command %d", sme_cmd->command);
Krunal Sonia8270f52017-02-23 19:51:25 -0800535 status = QDF_STATUS_E_FAILURE;
536 break;
537 }
Krunal Sonia8270f52017-02-23 19:51:25 -0800538 return status;
539}
540
541QDF_STATUS sme_ser_cmd_callback(void *buf,
542 enum wlan_serialization_cb_reason reason)
543{
544 struct wlan_serialization_command *cmd = buf;
545 tHalHandle hal;
546 tpAniSirGlobal mac_ctx;
547 QDF_STATUS status = QDF_STATUS_SUCCESS;
548 tSmeCmd *sme_cmd;
549
550 hal = cds_get_context(QDF_MODULE_ID_SME);
Pragaspathi Thilagarajb11dbe42018-07-23 16:42:17 +0530551 if (hal != NULL) {
552 mac_ctx = PMAC_STRUCT(hal);
553 } else {
554 sme_err("hal is null");
Krunal Sonia8270f52017-02-23 19:51:25 -0800555 return QDF_STATUS_E_FAILURE;
556 }
557 /*
558 * Do not acquire lock here as sme global lock is already acquired in
559 * caller or MC thread context
560 */
561 if (!cmd) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700562 sme_err("serialization command is null");
Krunal Sonia8270f52017-02-23 19:51:25 -0800563 return QDF_STATUS_E_FAILURE;
564 }
565
566 switch (reason) {
567 case WLAN_SER_CB_ACTIVATE_CMD:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700568 sme_debug("WLAN_SER_CB_ACTIVATE_CMD callback");
Krunal Sonia8270f52017-02-23 19:51:25 -0800569 status = sme_ser_handle_active_cmd(cmd);
570 break;
571 case WLAN_SER_CB_CANCEL_CMD:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700572 sme_debug("WLAN_SER_CB_CANCEL_CMD callback");
Krunal Sonia8270f52017-02-23 19:51:25 -0800573 break;
574 case WLAN_SER_CB_RELEASE_MEM_CMD:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700575 sme_debug("WLAN_SER_CB_RELEASE_MEM_CMD callback");
Vignesh Viswanathan062b5162018-10-11 17:18:41 +0530576 if (cmd->vdev)
577 wlan_objmgr_vdev_release_ref(cmd->vdev,
578 WLAN_LEGACY_SME_ID);
Krunal Sonia8270f52017-02-23 19:51:25 -0800579 sme_cmd = cmd->umac_cmd;
580 csr_release_command_buffer(mac_ctx, sme_cmd);
581 break;
582 case WLAN_SER_CB_ACTIVE_CMD_TIMEOUT:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700583 sme_debug("WLAN_SER_CB_ACTIVE_CMD_TIMEOUT callback");
Krunal Sonia8270f52017-02-23 19:51:25 -0800584 break;
585 default:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700586 sme_debug("STOP: unknown reason code");
Krunal Sonia8270f52017-02-23 19:51:25 -0800587 return QDF_STATUS_E_FAILURE;
588 }
589 return status;
590}
591
Wen Gong3f003382018-05-14 14:26:37 +0800592#ifdef WLAN_FEATURE_MEMDUMP_ENABLE
Krunal Sonia8270f52017-02-23 19:51:25 -0800593/**
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530594 * sme_get_sessionid_from_activelist() - gets session id
595 * @mac: mac context
596 *
597 * This function is used to get session id from sme command
598 * active list
599 *
600 * Return: returns session id
601 */
Jeff Johnson49c02f92016-10-07 10:29:09 -0700602static uint32_t sme_get_sessionid_from_activelist(tpAniSirGlobal mac)
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530603{
604 tListElem *entry;
605 tSmeCmd *command;
606 uint32_t session_id = CSR_SESSION_ID_INVALID;
607
Krunal Sonia8270f52017-02-23 19:51:25 -0800608 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530609 if (entry) {
610 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
611 session_id = command->sessionId;
612 }
613
614 return session_id;
615}
616
617/**
618 * sme_state_info_dump() - prints state information of sme layer
619 * @buf: buffer pointer
620 * @size: size of buffer to be filled
621 *
622 * This function is used to dump state information of sme layer
623 *
624 * Return: None
625 */
626static void sme_state_info_dump(char **buf_ptr, uint16_t *size)
627{
628 uint32_t session_id, active_session_id;
629 tHalHandle hal;
630 tpAniSirGlobal mac;
631 uint16_t len = 0;
632 char *buf = *buf_ptr;
633 eCsrConnectState connect_state;
634
635 hal = cds_get_context(QDF_MODULE_ID_SME);
636 if (hal == NULL) {
637 QDF_ASSERT(0);
638 return;
639 }
640
641 mac = PMAC_STRUCT(hal);
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530642
643 active_session_id = sme_get_sessionid_from_activelist(mac);
644 if (active_session_id != CSR_SESSION_ID_INVALID) {
645 len += qdf_scnprintf(buf + len, *size - len,
646 "\n active command sessionid %d", active_session_id);
647 }
648
649 for (session_id = 0; session_id < CSR_ROAM_SESSION_MAX; session_id++) {
650 if (CSR_IS_SESSION_VALID(mac, session_id)) {
651 connect_state =
652 mac->roam.roamSession[session_id].connectState;
653 if ((eCSR_ASSOC_STATE_TYPE_INFRA_ASSOCIATED ==
654 connect_state)
655 || (eCSR_ASSOC_STATE_TYPE_INFRA_CONNECTED ==
656 connect_state)) {
657 len += qdf_scnprintf(buf + len, *size - len,
658 "\n NeighborRoamState: %d",
659 mac->roam.neighborRoamInfo[session_id].
660 neighborRoamState);
661 len += qdf_scnprintf(buf + len, *size - len,
662 "\n RoamState: %d", mac->roam.
663 curState[session_id]);
664 len += qdf_scnprintf(buf + len, *size - len,
665 "\n RoamSubState: %d", mac->roam.
666 curSubState[session_id]);
667 len += qdf_scnprintf(buf + len, *size - len,
668 "\n ConnectState: %d",
669 connect_state);
670 }
671 }
672 }
673
674 *size -= len;
675 *buf_ptr += len;
676}
677
678/**
679 * sme_register_debug_callback() - registration function sme layer
680 * to print sme state information
681 *
682 * Return: None
683 */
684static void sme_register_debug_callback(void)
685{
686 qdf_register_debug_callback(QDF_MODULE_ID_SME, &sme_state_info_dump);
687}
Wen Gong3f003382018-05-14 14:26:37 +0800688#else /* WLAN_FEATURE_MEMDUMP_ENABLE */
Wen Gongaa6d55d2018-04-26 16:33:21 +0800689static void sme_register_debug_callback(void)
690{
691}
Wen Gong3f003382018-05-14 14:26:37 +0800692#endif /* WLAN_FEATURE_MEMDUMP_ENABLE */
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530693
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800694/* Global APIs */
695
696/**
697 * sme_open() - Initialze all SME modules and put them at idle state
698 * @hHal: The handle returned by mac_open
699 *
700 * The function initializes each module inside SME, PMC, CSR, etc. Upon
701 * successfully return, all modules are at idle state ready to start.
702 * smeOpen must be called before any other SME APIs can be involved.
703 * smeOpen must be called after mac_open.
704 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530705 * Return: QDF_STATUS_SUCCESS - SME is successfully initialized.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800706 * Other status means SME is failed to be initialized
707 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530708QDF_STATUS sme_open(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800709{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530710 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800711 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800712
713 pMac->sme.state = SME_STATE_STOP;
Anurag Chouhan6d760662016-02-20 16:05:43 +0530714 pMac->sme.currDeviceMode = QDF_STA_MODE;
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530715 if (!QDF_IS_STATUS_SUCCESS(qdf_mutex_create(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800716 &pMac->sme.lkSmeGlobalLock))) {
Srinivas Girigowda09625b02018-09-10 15:28:09 -0700717 sme_err("Init lock failed");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530718 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800719 }
720 status = csr_open(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530721 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700722 sme_err("csr_open failed, status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800723 return status;
724 }
725
726 status = sme_ps_open(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530727 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700728 sme_err("sme_ps_open failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800729 return status;
730 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800731
732#ifndef WLAN_MDM_CODE_REDUCTION_OPT
733 status = sme_qos_open(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530734 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700735 sme_err("Qos open, status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800736 return status;
737 }
738#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800739 status = init_sme_cmd_list(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530740 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800741 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800742
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800743 status = rrm_open(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530744 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700745 sme_err("rrm_open failed, status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800746 return status;
747 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800748 sme_trace_init(pMac);
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530749 sme_register_debug_callback();
Krunal Soni33787902017-08-29 11:39:28 -0700750 wlan_serialization_legacy_init_callback();
751
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800752 return status;
753}
754
755/*
756 * sme_init_chan_list, triggers channel setup based on country code.
757 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530758QDF_STATUS sme_init_chan_list(tHalHandle hal, uint8_t *alpha2,
Amar Singhala297bfa2015-10-15 15:07:29 -0700759 enum country_src cc_src)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800760{
761 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
762
Amar Singhala297bfa2015-10-15 15:07:29 -0700763 if ((cc_src == SOURCE_USERSPACE) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800764 (pmac->roam.configParam.fSupplicantCountryCodeHasPriority)) {
765 pmac->roam.configParam.Is11dSupportEnabled = false;
766 }
767
768 return csr_init_chan_list(pmac, alpha2);
769}
770
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530771/*
772 * sme_set11dinfo() - Set the 11d information about valid channels
773 * and there power using information from nvRAM
774 * This function is called only for AP.
775 *
776 * This is a synchronous call
777 *
778 * hHal - The handle returned by mac_open.
779 * pSmeConfigParams - a pointer to a caller allocated object of
780 * typedef struct _smeConfigParams.
781 *
782 * Return QDF_STATUS_SUCCESS - SME update the config parameters successfully.
783 *
784 * Other status means SME is failed to update the config parameters.
785 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800786
Jeff Johnsonff26c612018-06-10 20:57:13 -0700787QDF_STATUS sme_set11dinfo(tHalHandle hal, tpSmeConfigParams pSmeConfigParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800788{
Jeff Johnsonff26c612018-06-10 20:57:13 -0700789 tpAniSirGlobal mac_ctx = MAC_CONTEXT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530790 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800791
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530792 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800793 TRACE_CODE_SME_RX_HDD_MSG_SET_11DINFO, NO_SESSION, 0));
794 if (NULL == pSmeConfigParams) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700795 sme_err("SME config params empty");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800796 return status;
797 }
798
Jeff Johnsonff26c612018-06-10 20:57:13 -0700799 status = csr_set_channels(mac_ctx, &pSmeConfigParams->csrConfig);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700800 if (!QDF_IS_STATUS_SUCCESS(status))
801 sme_err("csr_set_channels failed with status: %d", status);
802
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800803 return status;
804}
805
806/**
807 * sme_set_scan_disable() - Dynamically enable/disable scan
808 * @h_hal: Handle to HAL
809 *
810 * This command gives the user an option to dynamically
811 * enable or disable scans.
812 *
813 * Return: None
814 */
815void sme_set_scan_disable(tHalHandle h_hal, int value)
816{
817 tpAniSirGlobal mac_ctx = PMAC_STRUCT(h_hal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530818
Sandeep Puligilla24b7aa72017-10-13 18:05:14 -0700819 sme_info("scan disable %d", value);
Abhishek Singhcaebce02017-10-12 11:07:57 +0530820 ucfg_scan_set_enable(mac_ctx->psoc, !value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800821}
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530822/*
823 * sme_get_soft_ap_domain() - Get the current regulatory domain of softAp.
824 * This is a synchronous call
825 *
826 * hHal - The handle returned by HostapdAdapter.
827 * v_REGDOMAIN_t - The current Regulatory Domain requested for SoftAp.
828 * Return QDF_STATUS_SUCCESS - SME successfully completed the request.
829 * Other status means, failed to get the current regulatory domain.
830 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800831
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530832QDF_STATUS sme_get_soft_ap_domain(tHalHandle hHal, v_REGDOMAIN_t
833 *domainIdSoftAp)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800834{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530835 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800836 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
837
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530838 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800839 TRACE_CODE_SME_RX_HDD_MSG_GET_SOFTAP_DOMAIN,
840 NO_SESSION, 0));
841 if (NULL == domainIdSoftAp) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700842 sme_err("Uninitialized domain Id");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800843 return status;
844 }
845
846 *domainIdSoftAp = pMac->scan.domainIdCurrent;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530847 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800848
849 return status;
850}
851
Krunal Sonie3531942016-04-12 17:43:53 -0700852/**
853 * sme_update_fine_time_measurement_capab() - Update the FTM capabitlies from
854 * incoming val
855 * @hal: Handle for Hal layer
856 * @val: New FTM capability value
857 *
858 * Return: None
859 */
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +0530860void sme_update_fine_time_measurement_capab(tHalHandle hal, uint8_t session_id,
861 uint32_t val)
Krunal Sonie3531942016-04-12 17:43:53 -0700862{
863 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530864 QDF_STATUS status;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530865
Naveen Rawatd2657be2017-10-10 14:31:23 -0700866 ucfg_wifi_pos_set_ftm_cap(mac_ctx->psoc, val);
Krunal Sonie3531942016-04-12 17:43:53 -0700867
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +0530868 if (!val) {
Krunal Sonie3531942016-04-12 17:43:53 -0700869 mac_ctx->rrm.rrmPEContext.rrmEnabledCaps.fine_time_meas_rpt = 0;
870 ((tpRRMCaps)mac_ctx->rrm.rrmSmeContext.
871 rrmConfig.rm_capability)->fine_time_meas_rpt = 0;
872 } else {
873 mac_ctx->rrm.rrmPEContext.rrmEnabledCaps.fine_time_meas_rpt = 1;
874 ((tpRRMCaps)mac_ctx->rrm.rrmSmeContext.
875 rrmConfig.rm_capability)->fine_time_meas_rpt = 1;
876 }
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +0530877
878 /* Inform this RRM IE change to FW */
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530879 status = sme_acquire_global_lock(&mac_ctx->sme);
880 if (QDF_IS_STATUS_SUCCESS(status)) {
881 csr_roam_offload_scan(mac_ctx, session_id,
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +0530882 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
883 REASON_CONNECT_IES_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530884 sme_release_global_lock(&mac_ctx->sme);
885 } else {
886 sme_err("Failed to acquire SME lock");
887 }
Krunal Sonie3531942016-04-12 17:43:53 -0700888}
889
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530890/*
891 * sme_update_config() - Change configurations for all SME moduels
892 * The function updates some configuration for modules in SME, CSR, etc
893 * during SMEs close open sequence.
894 * Modules inside SME apply the new configuration at the next transaction.
895 * This is a synchronous call
896 *
897 * hHal - The handle returned by mac_open.
898 * pSmeConfigParams - a pointer to a caller allocated object of
899 * typedef struct _smeConfigParams.
900 * Return QDF_STATUS_SUCCESS - SME update the config parameters successfully.
901 * Other status means SME is failed to update the config parameters.
902 */
903QDF_STATUS sme_update_config(tHalHandle hHal, tpSmeConfigParams
904 pSmeConfigParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800905{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530906 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800907 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
908
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530909 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800910 TRACE_CODE_SME_RX_HDD_MSG_UPDATE_CONFIG, NO_SESSION,
911 0));
912 if (NULL == pSmeConfigParams) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700913 sme_err("SME config params empty");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800914 return status;
915 }
916
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530917 status = csr_change_default_config_param(pMac, &pSmeConfigParams->
918 csrConfig);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800919
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530920 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700921 sme_err("csr_change_default_config_param failed status: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800922 status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800923
Jeff Johnson711fe942018-06-09 23:37:01 -0700924 status = rrm_change_default_config_param(pMac, &pSmeConfigParams->
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530925 rrmConfig);
926
927 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700928 sme_err("rrm_change_default_config_param failed status: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800929 status);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530930
931 /* For SOC, CFG is set before start We don't want to apply global CFG
932 * in connect state because that may cause some side affect
933 */
934 if (csr_is_all_session_disconnected(pMac))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800935 csr_set_global_cfgs(pMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800936
937 /*
938 * If scan offload is enabled then lim has allow the sending of
939 * scan request to firmware even in powersave mode. The firmware has
940 * to take care of exiting from power save mode
941 */
942 status = sme_cfg_set_int(hHal, WNI_CFG_SCAN_IN_POWERSAVE, true);
943
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530944 if (QDF_STATUS_SUCCESS != status)
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530945 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800946 "Could not pass on WNI_CFG_SCAN_IN_POWERSAVE to CFG");
Kapil Gupta4f0c0c12017-02-07 15:21:15 +0530947
948 pMac->snr_monitor_enabled = pSmeConfigParams->snr_monitor_enabled;
949
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800950 return status;
951}
952
953/**
Abhishek Singh158fe252017-03-23 11:09:34 +0530954 * sme_update_scan_roam_params() - Update the scan roaming params
955 * @mac_ctx: mac ctx
956 *
957 * Return: void.
958 */
959static void sme_update_scan_roam_params(tpAniSirGlobal mac_ctx)
960{
961 struct roam_filter_params scan_params = {0};
962 struct roam_ext_params *roam_params_src;
963 uint8_t i;
964 QDF_STATUS status;
965
966 roam_params_src = &mac_ctx->roam.configParam.roam_params;
967
968 scan_params.num_bssid_avoid_list =
969 roam_params_src->num_bssid_avoid_list;
Abhishek Singh158fe252017-03-23 11:09:34 +0530970
971 if (scan_params.num_bssid_avoid_list >
972 MAX_AVOID_LIST_BSSID)
973 scan_params.num_bssid_avoid_list =
974 MAX_AVOID_LIST_BSSID;
975
976 for (i = 0; i < scan_params.num_bssid_avoid_list; i++) {
977 qdf_copy_macaddr(&scan_params.bssid_avoid_list[i],
978 &roam_params_src->bssid_avoid_list[i]);
979 }
980
981 status = ucfg_scan_update_roam_params(mac_ctx->psoc, &scan_params);
982 if (QDF_IS_STATUS_ERROR(status))
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700983 sme_err("ailed to update scan roam params with status=%d",
Abhishek Singh158fe252017-03-23 11:09:34 +0530984 status);
985}
986
987/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800988 * sme_update_roam_params() - Store/Update the roaming params
989 * @hal: Handle for Hal layer
990 * @session_id: SME Session ID
991 * @roam_params_src: The source buffer to copy
992 * @update_param: Type of parameter to be updated
993 *
994 * Return: Return the status of the updation.
995 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530996QDF_STATUS sme_update_roam_params(tHalHandle hal,
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700997 uint8_t session_id, struct roam_ext_params *roam_params_src,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800998 int update_param)
999{
1000 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
1001 struct roam_ext_params *roam_params_dst;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301002 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001003 uint8_t i;
1004
1005 roam_params_dst = &mac_ctx->roam.configParam.roam_params;
1006 switch (update_param) {
1007 case REASON_ROAM_EXT_SCAN_PARAMS_CHANGED:
Wu Gaoca416ff2018-09-17 11:05:07 +08001008 mac_ctx->mlme_cfg->lfr.rssi_boost_threshold_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001009 roam_params_src->raise_rssi_thresh_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +08001010 mac_ctx->mlme_cfg->lfr.rssi_penalize_threshold_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001011 roam_params_src->drop_rssi_thresh_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +08001012 mac_ctx->mlme_cfg->lfr.rssi_boost_factor_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001013 roam_params_src->raise_factor_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +08001014 mac_ctx->mlme_cfg->lfr.rssi_penalize_factor_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001015 roam_params_src->drop_factor_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +08001016 mac_ctx->mlme_cfg->lfr.max_rssi_boost_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001017 roam_params_src->max_raise_rssi_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +08001018 mac_ctx->mlme_cfg->lfr.max_rssi_penalize_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001019 roam_params_src->max_drop_rssi_5g;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001020 roam_params_dst->alert_rssi_threshold =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001021 roam_params_src->alert_rssi_threshold;
Wu Gaoca416ff2018-09-17 11:05:07 +08001022 mac_ctx->mlme_cfg->lfr.enable_5g_band_pref = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001023 break;
1024 case REASON_ROAM_SET_SSID_ALLOWED:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301025 qdf_mem_set(&roam_params_dst->ssid_allowed_list, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001026 sizeof(tSirMacSSid) * MAX_SSID_ALLOWED_LIST);
1027 roam_params_dst->num_ssid_allowed_list =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001028 roam_params_src->num_ssid_allowed_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001029 for (i = 0; i < roam_params_dst->num_ssid_allowed_list; i++) {
1030 roam_params_dst->ssid_allowed_list[i].length =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001031 roam_params_src->ssid_allowed_list[i].length;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301032 qdf_mem_copy(roam_params_dst->ssid_allowed_list[i].ssId,
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001033 roam_params_src->ssid_allowed_list[i].ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001034 roam_params_dst->ssid_allowed_list[i].length);
1035 }
1036 break;
1037 case REASON_ROAM_SET_FAVORED_BSSID:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301038 qdf_mem_set(&roam_params_dst->bssid_favored, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001039 sizeof(tSirMacAddr) * MAX_BSSID_FAVORED);
1040 roam_params_dst->num_bssid_favored =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001041 roam_params_src->num_bssid_favored;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001042 for (i = 0; i < roam_params_dst->num_bssid_favored; i++) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301043 qdf_mem_copy(&roam_params_dst->bssid_favored[i],
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001044 &roam_params_src->bssid_favored[i],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001045 sizeof(tSirMacAddr));
1046 roam_params_dst->bssid_favored_factor[i] =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001047 roam_params_src->bssid_favored_factor[i];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001048 }
1049 break;
1050 case REASON_ROAM_SET_BLACKLIST_BSSID:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301051 qdf_mem_set(&roam_params_dst->bssid_avoid_list, 0,
Anurag Chouhan6d760662016-02-20 16:05:43 +05301052 QDF_MAC_ADDR_SIZE * MAX_BSSID_AVOID_LIST);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001053 roam_params_dst->num_bssid_avoid_list =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001054 roam_params_src->num_bssid_avoid_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001055 for (i = 0; i < roam_params_dst->num_bssid_avoid_list; i++) {
Anurag Chouhanc5548422016-02-24 18:33:27 +05301056 qdf_copy_macaddr(&roam_params_dst->bssid_avoid_list[i],
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001057 &roam_params_src->bssid_avoid_list[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001058 }
1059 break;
1060 case REASON_ROAM_GOOD_RSSI_CHANGED:
1061 roam_params_dst->good_rssi_roam =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001062 roam_params_src->good_rssi_roam;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001063 break;
1064 default:
1065 break;
1066 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301067
1068 status = sme_acquire_global_lock(&mac_ctx->sme);
1069 if (QDF_IS_STATUS_SUCCESS(status)) {
1070 csr_roam_offload_scan(mac_ctx, session_id,
1071 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
1072 update_param);
1073 sme_release_global_lock(&mac_ctx->sme);
1074 } else {
1075 sme_err("Failed to acquire SME lock");
1076 }
Abhishek Singh158fe252017-03-23 11:09:34 +05301077
1078 sme_update_scan_roam_params(mac_ctx);
1079
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001080 return 0;
1081}
1082
Jeff Johnson8131a9d2018-06-10 08:53:09 -07001083/**
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301084 * sme_process_ready_to_suspend() -
Jeff Johnson8131a9d2018-06-10 08:53:09 -07001085 * @mac: Global MAC context
1086 * @pReadyToSuspend: Parameter received along with ready to suspend
1087 * indication from WMA.
1088 *
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301089 * On getting ready to suspend indication, this function calls
1090 * callback registered (HDD callbacks) with SME to inform ready
1091 * to suspend indication.
1092 *
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301093 * Return: None
1094 */
Jeff Johnson8131a9d2018-06-10 08:53:09 -07001095static void sme_process_ready_to_suspend(tpAniSirGlobal mac,
Jeff Johnson49c02f92016-10-07 10:29:09 -07001096 tpSirReadyToSuspendInd pReadyToSuspend)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001097{
Jeff Johnson8131a9d2018-06-10 08:53:09 -07001098 if (NULL == mac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301099 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Jeff Johnson8131a9d2018-06-10 08:53:09 -07001100 "%s: mac is null", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001101 return;
1102 }
1103
Jeff Johnson8131a9d2018-06-10 08:53:09 -07001104 if (NULL != mac->readyToSuspendCallback) {
1105 mac->readyToSuspendCallback(mac->readyToSuspendContext,
1106 pReadyToSuspend->suspended);
1107 mac->readyToSuspendCallback = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001108 }
1109}
1110
1111#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001112
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07001113/**
1114 * sme_process_ready_to_ext_wow() - inform ready to ExtWoW indication.
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001115 * @mac: Global MAC context
1116 * @indication: ready to Ext WoW indication from lower layer
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07001117 *
1118 * On getting ready to Ext WoW indication, this function calls callback
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001119 * registered (HDD callback) with SME to inform ready to ExtWoW indication.
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07001120 *
1121 * Return: None
1122 */
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001123static void sme_process_ready_to_ext_wow(tpAniSirGlobal mac,
1124 tpSirReadyToExtWoWInd indication)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001125{
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001126 if (!mac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301127 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001128 "%s: mac is null", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001129 return;
1130 }
1131
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001132 if (NULL != mac->readyToExtWoWCallback) {
1133 mac->readyToExtWoWCallback(mac->readyToExtWoWContext,
1134 indication->status);
1135 mac->readyToExtWoWCallback = NULL;
1136 mac->readyToExtWoWContext = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001137 }
1138
1139}
1140#endif
1141
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301142/*
1143 * sme_hdd_ready_ind() - SME sends eWNI_SME_SYS_READY_IND to PE to inform
1144 * that the NIC is ready tio run.
1145 * The function is called by HDD at the end of initialization stage so PE/HAL
1146 * can enable the NIC to running state.
1147 * This is a synchronous call
1148 *
1149 * @hHal - The handle returned by mac_open.
1150 * Return QDF_STATUS_SUCCESS - eWNI_SME_SYS_READY_IND is sent to PE
1151 * successfully.
1152 * Other status means SME failed to send the message to PE.
1153 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301154QDF_STATUS sme_hdd_ready_ind(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001155{
Abhishek Singhde410b72017-05-22 15:25:39 +05301156 tSirSmeReadyReq *msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301157 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001158 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1159
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301160 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001161 TRACE_CODE_SME_RX_HDD_MSG_HDDREADYIND, NO_SESSION, 0));
1162 do {
1163
Abhishek Singhde410b72017-05-22 15:25:39 +05301164 msg = qdf_mem_malloc(sizeof(*msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07001165 if (!msg)
Abhishek Singhde410b72017-05-22 15:25:39 +05301166 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -07001167
Abhishek Singhde410b72017-05-22 15:25:39 +05301168 msg->messageType = eWNI_SME_SYS_READY_IND;
1169 msg->length = sizeof(*msg);
Abhishek Singhde410b72017-05-22 15:25:39 +05301170 msg->csr_roam_synch_cb = csr_roam_synch_callback;
Sandeep Puligilla1426d612017-04-12 18:22:06 -07001171 msg->sme_msg_cb = sme_process_msg_callback;
Vignesh Viswanathan3d478032018-08-02 20:18:53 +05301172 msg->stop_roaming_cb = sme_stop_roaming;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001173
Jeff Johnsonc09caa42018-06-07 22:58:55 -07001174 status = u_mac_post_ctrl_msg(hHal, (tSirMbMsg *)msg);
1175 if (QDF_IS_STATUS_ERROR(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001176 sme_err("u_mac_post_ctrl_msg failed to send eWNI_SME_SYS_READY_IND");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001177 break;
1178 }
1179
1180 status = csr_ready(pMac);
Jeff Johnsonc09caa42018-06-07 22:58:55 -07001181 if (QDF_IS_STATUS_ERROR(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001182 sme_err("csr_ready failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001183 break;
1184 }
1185
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001186 pMac->sme.state = SME_STATE_READY;
1187 } while (0);
1188
1189 return status;
1190}
1191
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001192QDF_STATUS sme_get_valid_channels(uint8_t *chan_list, uint32_t *list_len)
1193{
1194 tpAniSirGlobal mac_ctx = sme_get_mac_context();
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001195
1196 if (NULL == mac_ctx) {
1197 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1198 FL("Invalid MAC context"));
1199 return QDF_STATUS_E_FAILURE;
1200 }
1201
Jeff Johnsonc09caa42018-06-07 22:58:55 -07001202 return wlan_cfg_get_str(mac_ctx, WNI_CFG_VALID_CHANNEL_LIST,
1203 chan_list, list_len);
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001204}
1205
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07001206#ifdef WLAN_CONV_SPECTRAL_ENABLE
1207static QDF_STATUS sme_register_spectral_cb(tpAniSirGlobal mac_ctx)
1208{
1209 struct spectral_legacy_cbacks spectral_cb;
1210 QDF_STATUS status;
1211
1212 spectral_cb.vdev_get_chan_freq = sme_get_oper_chan_freq;
1213 spectral_cb.vdev_get_ch_width = sme_get_oper_ch_width;
1214 spectral_cb.vdev_get_sec20chan_freq_mhz = sme_get_sec20chan_freq_mhz;
1215 status = spectral_register_legacy_cb(mac_ctx->psoc, &spectral_cb);
1216
1217 return status;
1218}
1219#else
1220static QDF_STATUS sme_register_spectral_cb(tpAniSirGlobal mac_ctx)
1221{
1222 return QDF_STATUS_SUCCESS;
1223}
1224#endif
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301225/*
1226 * sme_start() - Put all SME modules at ready state.
1227 * The function starts each module in SME, PMC, CSR, etc. . Upon
1228 * successfully return, all modules are ready to run.
1229 * This is a synchronous call
1230 *
1231 * hHal - The handle returned by mac_open.
1232 * Return QDF_STATUS_SUCCESS - SME is ready.
1233 * Other status means SME is failed to start
1234 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301235QDF_STATUS sme_start(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001236{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301237 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001238 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001239 struct policy_mgr_sme_cbacks sme_cbacks;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001240
1241 do {
1242 status = csr_start(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301243 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001244 sme_err("csr_start failed status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001245 break;
1246 }
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001247 sme_cbacks.sme_get_nss_for_vdev = sme_get_vdev_type_nss;
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001248 sme_cbacks.sme_get_valid_channels = sme_get_valid_channels;
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001249 sme_cbacks.sme_nss_update_request = sme_nss_update_request;
1250 sme_cbacks.sme_pdev_set_hw_mode = sme_pdev_set_hw_mode;
1251 sme_cbacks.sme_pdev_set_pcl = sme_pdev_set_pcl;
1252 sme_cbacks.sme_soc_set_dual_mac_config =
1253 sme_soc_set_dual_mac_config;
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07001254 sme_cbacks.sme_change_mcc_beacon_interval =
1255 sme_change_mcc_beacon_interval;
1256 sme_cbacks.sme_get_ap_channel_from_scan =
1257 sme_get_ap_channel_from_scan;
1258 sme_cbacks.sme_scan_result_purge = sme_scan_result_purge;
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001259 status = policy_mgr_register_sme_cb(pMac->psoc, &sme_cbacks);
1260 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -07001261 sme_err("Failed to register sme cb with Policy Manager: %d",
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001262 status);
1263 break;
1264 }
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07001265 sme_register_spectral_cb(pMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001266 pMac->sme.state = SME_STATE_START;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001267
Sandeep Puligilla66d09c42017-09-06 17:10:27 -07001268 /* START RRM */
1269 status = rrm_start(pMac);
1270 if (!QDF_IS_STATUS_SUCCESS(status)) {
1271 sme_err("Failed to start RRM");
1272 break;
1273 }
1274 } while (0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001275 return status;
1276}
1277
Arif Hussaincd151632017-02-11 16:57:19 -08001278static QDF_STATUS dfs_msg_processor(tpAniSirGlobal mac,
1279 struct scheduler_msg *msg)
1280{
1281 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson172237b2017-11-07 15:32:59 -08001282 struct csr_roam_info roam_info = { 0 };
Arif Hussaincd151632017-02-11 16:57:19 -08001283 tSirSmeCSAIeTxCompleteRsp *csa_ie_tx_complete_rsp;
1284 uint32_t session_id = 0;
1285 eRoamCmdStatus roam_status;
1286 eCsrRoamResult roam_result;
1287
1288 switch (msg->type) {
1289 case eWNI_SME_DFS_RADAR_FOUND:
1290 {
1291 session_id = msg->bodyval;
1292 roam_status = eCSR_ROAM_DFS_RADAR_IND;
1293 roam_result = eCSR_ROAM_RESULT_DFS_RADAR_FOUND_IND;
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301294 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Arif Hussaincd151632017-02-11 16:57:19 -08001295 "sapdfs: Radar indication event occurred");
1296 break;
1297 }
1298 case eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND:
1299 {
1300 csa_ie_tx_complete_rsp =
1301 (tSirSmeCSAIeTxCompleteRsp *) msg->bodyptr;
1302 if (!csa_ie_tx_complete_rsp) {
1303 sme_err("eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND null msg");
1304 return QDF_STATUS_E_FAILURE;
1305 }
1306 session_id = csa_ie_tx_complete_rsp->sessionId;
1307 roam_status = eCSR_ROAM_DFS_CHAN_SW_NOTIFY;
1308 roam_result = eCSR_ROAM_RESULT_DFS_CHANSW_UPDATE_SUCCESS;
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301309 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Arif Hussaincd151632017-02-11 16:57:19 -08001310 "eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND session=%d",
1311 session_id);
1312 break;
1313 }
1314 case eWNI_SME_DFS_CAC_COMPLETE:
1315 {
1316 session_id = msg->bodyval;
1317 roam_status = eCSR_ROAM_CAC_COMPLETE_IND;
1318 roam_result = eCSR_ROAM_RESULT_CAC_END_IND;
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301319 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Arif Hussaincd151632017-02-11 16:57:19 -08001320 "sapdfs: Received eWNI_SME_DFS_CAC_COMPLETE vdevid%d",
1321 session_id);
1322 break;
1323 }
Abhishek Singh20a8e442018-09-12 15:50:44 +05301324 case eWNI_SME_CSA_RESTART_RSP:
1325 {
1326 session_id = msg->bodyval;
1327 roam_status = 0;
1328 roam_result = eCSR_ROAM_RESULT_CSA_RESTART_RSP;
1329 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
1330 "sapdfs: Received eCSR_ROAM_RESULT_DFS_CHANSW_UPDATE_REQ vdevid%d",
1331 session_id);
1332 break;
1333 }
Arif Hussaincd151632017-02-11 16:57:19 -08001334 default:
1335 {
1336 sme_err("Invalid DFS message: 0x%x", msg->type);
1337 status = QDF_STATUS_E_FAILURE;
1338 return status;
1339 }
1340 }
1341
1342 /* Indicate Radar Event to SAP */
1343 csr_roam_call_callback(mac, session_id, &roam_info, 0,
1344 roam_status, roam_result);
1345 return status;
1346}
1347
1348
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001349#ifdef WLAN_FEATURE_11W
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301350/*
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001351 * Handle the unprotected management frame indication from LIM and
1352 * forward it to HDD.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301353 */
Jeff Johnson2ef47442018-06-09 23:43:40 -07001354static QDF_STATUS
1355sme_unprotected_mgmt_frm_ind(tpAniSirGlobal mac,
1356 tpSirSmeUnprotMgmtFrameInd pSmeMgmtFrm)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001357{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301358 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson172237b2017-11-07 15:32:59 -08001359 struct csr_roam_info roam_info = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001360 uint32_t SessionId = pSmeMgmtFrm->sessionId;
1361
Jeff Johnsoneddf5442017-10-04 10:55:53 -07001362 roam_info.nFrameLength = pSmeMgmtFrm->frameLen;
1363 roam_info.pbFrames = pSmeMgmtFrm->frameBuf;
1364 roam_info.frameType = pSmeMgmtFrm->frameType;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001365
1366 /* forward the mgmt frame to HDD */
Jeff Johnson2ef47442018-06-09 23:43:40 -07001367 csr_roam_call_callback(mac, SessionId, &roam_info, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001368 eCSR_ROAM_UNPROT_MGMT_FRAME_IND, 0);
1369
1370 return status;
1371}
1372#endif
1373
Kapil Gupta8878ad92017-02-13 11:56:04 +05301374QDF_STATUS sme_update_new_channel_event(tHalHandle hal, uint8_t session_id)
1375{
1376 QDF_STATUS status = QDF_STATUS_SUCCESS;
1377 tpAniSirGlobal mac = PMAC_STRUCT(hal);
Jeff Johnson172237b2017-11-07 15:32:59 -08001378 struct csr_roam_info *roamInfo;
Kapil Gupta8878ad92017-02-13 11:56:04 +05301379 eRoamCmdStatus roamStatus;
1380 eCsrRoamResult roamResult;
1381
1382 roamInfo = qdf_mem_malloc(sizeof(*roamInfo));
Arif Hussain0ef77082018-10-10 16:42:53 -07001383 if (!roamInfo)
Krunal Soni3fa80e22018-01-09 14:16:02 -08001384 return QDF_STATUS_E_FAILURE;
Kapil Gupta8878ad92017-02-13 11:56:04 +05301385
Arif Hussain0ef77082018-10-10 16:42:53 -07001386 roamInfo->dfs_event.sessionId = session_id;
Kapil Gupta8878ad92017-02-13 11:56:04 +05301387 roamStatus = eCSR_ROAM_CHANNEL_COMPLETE_IND;
1388 roamResult = eCSR_ROAM_RESULT_DFS_RADAR_FOUND_IND;
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301389 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Kapil Gupta8878ad92017-02-13 11:56:04 +05301390 "sapdfs: Updated new channel event");
1391
1392 /* Indicate channel Event to SAP */
1393 csr_roam_call_callback(mac, session_id, roamInfo, 0,
1394 roamStatus, roamResult);
1395
1396 qdf_mem_free(roamInfo);
1397 return status;
1398}
1399
1400
Abhishek Singh518323d2015-10-19 17:42:01 +05301401/**
1402 * sme_extended_change_channel_ind()- function to indicate ECSA
1403 * action frame is received in lim to SAP
1404 * @mac_ctx: pointer to global mac structure
1405 * @msg_buf: contain new channel and session id.
1406 *
1407 * This function is called to post ECSA action frame
1408 * receive event to SAP.
1409 *
1410 * Return: success if msg indicated to SAP else return failure
1411 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301412static QDF_STATUS sme_extended_change_channel_ind(tpAniSirGlobal mac_ctx,
Abhishek Singh518323d2015-10-19 17:42:01 +05301413 void *msg_buf)
1414{
1415 struct sir_sme_ext_cng_chan_ind *ext_chan_ind;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301416 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh518323d2015-10-19 17:42:01 +05301417 uint32_t session_id = 0;
Jeff Johnson172237b2017-11-07 15:32:59 -08001418 struct csr_roam_info roamInfo = {0};
Abhishek Singh518323d2015-10-19 17:42:01 +05301419 eRoamCmdStatus roam_status;
1420 eCsrRoamResult roam_result;
1421
Abhishek Singh518323d2015-10-19 17:42:01 +05301422 ext_chan_ind = msg_buf;
1423 if (NULL == ext_chan_ind) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001424 sme_err("ext_chan_ind is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301425 return QDF_STATUS_E_FAILURE;
Abhishek Singh518323d2015-10-19 17:42:01 +05301426 }
1427 session_id = ext_chan_ind->session_id;
1428 roamInfo.target_channel = ext_chan_ind->new_channel;
1429 roam_status = eCSR_ROAM_EXT_CHG_CHNL_IND;
1430 roam_result = eCSR_ROAM_EXT_CHG_CHNL_UPDATE_IND;
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001431 sme_debug("sapdfs: Received eWNI_SME_EXT_CHANGE_CHANNEL_IND for session id [%d]",
1432 session_id);
Abhishek Singh518323d2015-10-19 17:42:01 +05301433
1434 /* Indicate Ext Channel Change event to SAP */
1435 csr_roam_call_callback(mac_ctx, session_id, &roamInfo, 0,
1436 roam_status, roam_result);
1437 return status;
1438}
1439
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001440#ifdef FEATURE_WLAN_ESE
1441/**
1442 * sme_update_is_ese_feature_enabled() - enable/disable ESE support at runtime
1443 * @hHal: HAL handle
1444 * @sessionId: session id
1445 * @isEseIniFeatureEnabled: ese ini enabled
1446 *
1447 * It is used at in the REG_DYNAMIC_VARIABLE macro definition of
1448 * isEseIniFeatureEnabled. This is a synchronous call
1449 *
1450 * Return: QDF_STATUS enumeration
1451 */
1452QDF_STATUS sme_update_is_ese_feature_enabled(tHalHandle hHal,
1453 uint8_t sessionId, const bool isEseIniFeatureEnabled)
1454{
1455 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301456 QDF_STATUS status;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001457
1458 if (pMac->roam.configParam.isEseIniFeatureEnabled ==
1459 isEseIniFeatureEnabled) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301460 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001461 "%s: ESE Mode is already enabled or disabled, nothing to do (returning) old(%d) new(%d)",
1462 __func__,
1463 pMac->roam.configParam.isEseIniFeatureEnabled,
1464 isEseIniFeatureEnabled);
1465 return QDF_STATUS_SUCCESS;
1466 }
1467
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301468 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001469 "%s: EseEnabled is changed from %d to %d", __func__,
1470 pMac->roam.configParam.isEseIniFeatureEnabled,
1471 isEseIniFeatureEnabled);
1472 pMac->roam.configParam.isEseIniFeatureEnabled = isEseIniFeatureEnabled;
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07001473 csr_neighbor_roam_update_fast_roaming_enabled(
1474 pMac, sessionId, isEseIniFeatureEnabled);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001475
1476 if (true == isEseIniFeatureEnabled)
1477 sme_update_fast_transition_enabled(hHal, true);
1478
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301479 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
1480 status = sme_acquire_global_lock(&pMac->sme);
1481 if (QDF_IS_STATUS_SUCCESS(status)) {
1482 csr_roam_offload_scan(pMac, sessionId,
1483 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
1484 REASON_ESE_INI_CFG_CHANGED);
1485 sme_release_global_lock(&pMac->sme);
1486 } else {
1487 sme_err("Failed to acquire SME lock");
1488 return status;
1489 }
1490 }
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001491 return QDF_STATUS_SUCCESS;
1492}
1493
1494/**
1495 * sme_set_plm_request() - set plm request
1496 * @hHal: HAL handle
1497 * @pPlmReq: Pointer to input plm request
1498 *
1499 * Return: QDF_STATUS enumeration
1500 */
1501QDF_STATUS sme_set_plm_request(tHalHandle hHal, tpSirPlmReq pPlmReq)
1502{
1503 QDF_STATUS status;
1504 bool ret = false;
1505 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Varun Reddy Yeturu87c8ad82017-10-03 17:48:12 -07001506 uint8_t ch_list[WNI_CFG_VALID_CHANNEL_LIST_LEN] = { 0 };
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001507 uint8_t count, valid_count = 0;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07001508 struct scheduler_msg msg = {0};
gaurank kathpalia14e2f912017-08-31 14:51:45 +05301509 struct csr_roam_session *pSession = CSR_GET_SESSION(pMac,
1510 pPlmReq->sessionId);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001511
1512 status = sme_acquire_global_lock(&pMac->sme);
1513 if (!QDF_IS_STATUS_SUCCESS(status))
1514 return status;
1515
1516 if (!pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001517 sme_err("session %d not found", pPlmReq->sessionId);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001518 sme_release_global_lock(&pMac->sme);
1519 return QDF_STATUS_E_FAILURE;
1520 }
1521
1522 if (!pSession->sessionActive) {
1523 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1524 FL("Invalid Sessionid"));
1525 sme_release_global_lock(&pMac->sme);
1526 return QDF_STATUS_E_FAILURE;
1527 }
1528
1529 if (!pPlmReq->enable)
1530 goto send_plm_start;
1531 /* validating channel numbers */
1532 for (count = 0; count < pPlmReq->plmNumCh; count++) {
1533 ret = csr_is_supported_channel(pMac, pPlmReq->plmChList[count]);
1534 if (ret && pPlmReq->plmChList[count] > 14) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07001535 if (CHANNEL_STATE_DFS == wlan_reg_get_channel_state(
1536 pMac->pdev,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001537 pPlmReq->plmChList[count])) {
1538 /* DFS channel is provided, no PLM bursts can be
1539 * transmitted. Ignoring these channels.
1540 */
1541 QDF_TRACE(QDF_MODULE_ID_SME,
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301542 QDF_TRACE_LEVEL_DEBUG,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001543 FL("DFS channel %d ignored for PLM"),
1544 pPlmReq->plmChList[count]);
1545 continue;
1546 }
1547 } else if (!ret) {
1548 /* Not supported, ignore the channel */
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301549 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001550 FL("Unsupported channel %d ignored for PLM"),
1551 pPlmReq->plmChList[count]);
1552 continue;
1553 }
1554 ch_list[valid_count] = pPlmReq->plmChList[count];
1555 valid_count++;
1556 } /* End of for () */
1557
1558 /* Copying back the valid channel list to plm struct */
1559 qdf_mem_set((void *)pPlmReq->plmChList,
1560 pPlmReq->plmNumCh, 0);
1561 if (valid_count)
1562 qdf_mem_copy(pPlmReq->plmChList, ch_list,
1563 valid_count);
1564 /* All are invalid channels, FW need to send the PLM
1565 * report with "incapable" bit set.
1566 */
1567 pPlmReq->plmNumCh = valid_count;
1568
1569send_plm_start:
1570 /* PLM START */
1571 msg.type = WMA_SET_PLM_REQ;
1572 msg.reserved = 0;
1573 msg.bodyptr = pPlmReq;
1574
gaurank kathpalia36b0c582018-08-28 17:45:43 +05301575 if (!QDF_IS_STATUS_SUCCESS(scheduler_post_message(QDF_MODULE_ID_SME,
1576 QDF_MODULE_ID_WMA,
1577 QDF_MODULE_ID_WMA,
1578 &msg))) {
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001579 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1580 FL("Not able to post WMA_SET_PLM_REQ to WMA"));
1581 sme_release_global_lock(&pMac->sme);
1582 return QDF_STATUS_E_FAILURE;
1583 }
1584
1585 sme_release_global_lock(&pMac->sme);
1586 return status;
1587}
1588
1589/**
1590 * sme_tsm_ie_ind() - sme tsm ie indication
Jeff Johnson24e65b52018-06-10 08:45:26 -07001591 * @mac: Global mac context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001592 * @pSmeTsmIeInd: Pointer to tsm ie indication
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001593 *
1594 * Handle the tsm ie indication from LIM and forward it to HDD.
1595 *
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001596 * Return: QDF_STATUS enumeration
1597 */
Jeff Johnson24e65b52018-06-10 08:45:26 -07001598static QDF_STATUS sme_tsm_ie_ind(tpAniSirGlobal mac,
1599 tSirSmeTsmIEInd *pSmeTsmIeInd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001600{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301601 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson172237b2017-11-07 15:32:59 -08001602 struct csr_roam_info roam_info = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001603 uint32_t SessionId = pSmeTsmIeInd->sessionId;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301604
Jeff Johnsoneddf5442017-10-04 10:55:53 -07001605 roam_info.tsmIe.tsid = pSmeTsmIeInd->tsmIe.tsid;
1606 roam_info.tsmIe.state = pSmeTsmIeInd->tsmIe.state;
1607 roam_info.tsmIe.msmt_interval = pSmeTsmIeInd->tsmIe.msmt_interval;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001608 /* forward the tsm ie information to HDD */
Jeff Johnson24e65b52018-06-10 08:45:26 -07001609 csr_roam_call_callback(mac, SessionId, &roam_info, 0,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301610 eCSR_ROAM_TSM_IE_IND, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001611 return status;
1612}
1613
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001614/**
1615 * sme_set_cckm_ie() - set cckm ie
1616 * @hHal: HAL handle
1617 * @sessionId: session id
1618 * @pCckmIe: Pointer to CCKM Ie
1619 * @cckmIeLen: Length of @pCckmIe
1620 *
1621 * Function to store the CCKM IE passed from supplicant and use
1622 * it while packing reassociation request.
1623 *
1624 * Return: QDF_STATUS enumeration
1625 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301626QDF_STATUS sme_set_cckm_ie(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001627 uint8_t *pCckmIe, uint8_t cckmIeLen)
1628{
1629 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301630 QDF_STATUS status = QDF_STATUS_SUCCESS;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301631
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001632 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301633 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001634 csr_set_cckm_ie(pMac, sessionId, pCckmIe, cckmIeLen);
1635 sme_release_global_lock(&pMac->sme);
1636 }
1637 return status;
1638}
1639
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001640/**
1641 * sme_set_ese_beacon_request() - set ese beacon request
1642 * @hHal: HAL handle
1643 * @sessionId: session id
1644 * @pEseBcnReq: Ese beacon report
1645 *
1646 * function to set ESE beacon request parameters
1647 *
1648 * Return: QDF_STATUS enumeration
1649 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301650QDF_STATUS sme_set_ese_beacon_request(tHalHandle hHal, const uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001651 const tCsrEseBeaconReq *pEseBcnReq)
1652{
Varun Reddy Yeturu7b2a6572017-06-15 11:07:28 -07001653 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001654 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1655 tpSirBeaconReportReqInd pSmeBcnReportReq = NULL;
1656 tCsrEseBeaconReqParams *pBeaconReq = NULL;
1657 uint8_t counter = 0;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05301658 struct csr_roam_session *pSession = CSR_GET_SESSION(pMac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001659 tpRrmSMEContext pSmeRrmContext = &pMac->rrm.rrmSmeContext;
1660
1661 if (pSmeRrmContext->eseBcnReqInProgress == true) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001662 sme_err("A Beacon Report Req is already in progress");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301663 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001664 }
1665
1666 /* Store the info in RRM context */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301667 qdf_mem_copy(&pSmeRrmContext->eseBcnReqInfo, pEseBcnReq,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001668 sizeof(tCsrEseBeaconReq));
1669
1670 /* Prepare the request to send to SME. */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301671 pSmeBcnReportReq = qdf_mem_malloc(sizeof(tSirBeaconReportReqInd));
Arif Hussain0ef77082018-10-10 16:42:53 -07001672 if (!pSmeBcnReportReq)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301673 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001674
1675 pSmeRrmContext->eseBcnReqInProgress = true;
1676
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001677 sme_debug("Sending Beacon Report Req to SME");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001678
1679 pSmeBcnReportReq->messageType = eWNI_SME_BEACON_REPORT_REQ_IND;
1680 pSmeBcnReportReq->length = sizeof(tSirBeaconReportReqInd);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301681 qdf_mem_copy(pSmeBcnReportReq->bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001682 pSession->connectedProfile.bssid.bytes,
1683 sizeof(tSirMacAddr));
1684 pSmeBcnReportReq->channelInfo.channelNum = 255;
1685 pSmeBcnReportReq->channelList.numChannels = pEseBcnReq->numBcnReqIe;
1686 pSmeBcnReportReq->msgSource = eRRM_MSG_SOURCE_ESE_UPLOAD;
1687
1688 for (counter = 0; counter < pEseBcnReq->numBcnReqIe; counter++) {
1689 pBeaconReq =
1690 (tCsrEseBeaconReqParams *) &pEseBcnReq->bcnReq[counter];
1691 pSmeBcnReportReq->fMeasurementtype[counter] =
1692 pBeaconReq->scanMode;
1693 pSmeBcnReportReq->measurementDuration[counter] =
1694 SYS_TU_TO_MS(pBeaconReq->measurementDuration);
1695 pSmeBcnReportReq->channelList.channelNumber[counter] =
1696 pBeaconReq->channel;
1697 }
1698
1699 status = sme_rrm_process_beacon_report_req_ind(pMac, pSmeBcnReportReq);
1700
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301701 if (status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001702 pSmeRrmContext->eseBcnReqInProgress = false;
1703
Hanumanth Reddy Pothula7f7a2712016-09-07 18:44:47 +05301704 qdf_mem_free(pSmeBcnReportReq);
1705
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001706 return status;
1707}
1708
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001709/**
1710 * sme_get_tsm_stats() - SME get tsm stats
1711 * @hHal: HAL handle
1712 * @callback: SME sends back the requested stats using the callback
1713 * @staId: The station ID for which the stats is requested for
1714 * @bssId: bssid
1715 * @pContext: user context to be passed back along with the callback
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001716 * @tid: Traffic id
1717 *
1718 * API register a callback to get TSM Stats.
1719 *
1720 * Return: QDF_STATUS enumeration
1721 */
1722QDF_STATUS sme_get_tsm_stats(tHalHandle hHal,
1723 tCsrTsmStatsCallback callback,
1724 uint8_t staId, struct qdf_mac_addr bssId,
Jeff Johnson30f84552017-09-13 14:55:25 -07001725 void *pContext, uint8_t tid)
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001726{
1727 QDF_STATUS status = QDF_STATUS_E_FAILURE;
1728 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1729
1730 status = sme_acquire_global_lock(&pMac->sme);
1731 if (QDF_IS_STATUS_SUCCESS(status)) {
1732 status = csr_get_tsm_stats(pMac, callback,
1733 staId, bssId, pContext,
Jeff Johnson30f84552017-09-13 14:55:25 -07001734 tid);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001735 sme_release_global_lock(&pMac->sme);
1736 }
1737 return status;
1738}
1739
1740/**
1741 * sme_set_ese_roam_scan_channel_list() - To set ese roam scan channel list
1742 * @hHal: pointer HAL handle returned by mac_open
1743 * @sessionId: sme session id
1744 * @pChannelList: Output channel list
1745 * @numChannels: Output number of channels
1746 *
1747 * This routine is called to set ese roam scan channel list.
1748 * This is a synchronous call
1749 *
1750 * Return: QDF_STATUS
1751 */
1752QDF_STATUS sme_set_ese_roam_scan_channel_list(tHalHandle hHal,
1753 uint8_t sessionId,
1754 uint8_t *pChannelList,
1755 uint8_t numChannels)
1756{
1757 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1758 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08001759 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
1760 tpCsrChannelInfo curchnl_list_info = NULL;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001761 uint8_t oldChannelList[WNI_CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
1762 uint8_t newChannelList[128] = { 0 };
1763 uint8_t i = 0, j = 0;
1764
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08001765 if (sessionId >= CSR_ROAM_SESSION_MAX) {
1766 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1767 FL("Invalid sme session id: %d"), sessionId);
1768 return QDF_STATUS_E_INVAL;
1769 }
1770
1771 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
1772 curchnl_list_info =
1773 &pNeighborRoamInfo->roamChannelInfo.currentChannelListInfo;
1774
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001775 status = sme_acquire_global_lock(&pMac->sme);
1776 if (!QDF_IS_STATUS_SUCCESS(status)) {
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301777 sme_err("Failed to acquire SME lock");
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001778 return status;
1779 }
1780 if (NULL != curchnl_list_info->ChannelList) {
1781 for (i = 0; i < curchnl_list_info->numOfChannels; i++) {
1782 j += snprintf(oldChannelList + j,
1783 sizeof(oldChannelList) - j, "%d",
1784 curchnl_list_info->ChannelList[i]);
1785 }
1786 }
1787 status = csr_create_roam_scan_channel_list(pMac, sessionId,
1788 pChannelList, numChannels,
Jeff Johnsonbfd24632018-10-30 09:28:50 -07001789 csr_get_current_band(pMac));
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001790 if (QDF_IS_STATUS_SUCCESS(status)) {
1791 if (NULL != curchnl_list_info->ChannelList) {
1792 j = 0;
1793 for (i = 0; i < curchnl_list_info->numOfChannels; i++) {
1794 j += snprintf(newChannelList + j,
1795 sizeof(newChannelList) - j, "%d",
1796 curchnl_list_info->ChannelList[i]);
1797 }
1798 }
1799 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
1800 "ESE roam scan chnl list successfully set to %s-old value is %s-roam state is %d",
1801 newChannelList, oldChannelList,
1802 pNeighborRoamInfo->neighborRoamState);
1803 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301804
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001805 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
1806 csr_roam_offload_scan(pMac, sessionId,
1807 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
1808 REASON_CHANNEL_LIST_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301809
1810 sme_release_global_lock(&pMac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001811 return status;
1812}
1813
1814#endif /* FEATURE_WLAN_ESE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001815
Jeff Johnson49c02f92016-10-07 10:29:09 -07001816static
Jeff Johnsonbfc58a12018-06-10 08:49:08 -07001817QDF_STATUS sme_ibss_peer_info_response_handler(tpAniSirGlobal pMac,
Jeff Johnson49c02f92016-10-07 10:29:09 -07001818 tpSirIbssGetPeerInfoRspParams
1819 pIbssPeerInfoParams)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001820{
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001821 if (NULL == pMac) {
1822 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
1823 "%s: pMac is null", __func__);
1824 return QDF_STATUS_E_FAILURE;
1825 }
1826 if (pMac->sme.peerInfoParams.peerInfoCbk == NULL) {
1827 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1828 "%s: HDD callback is null", __func__);
1829 return QDF_STATUS_E_FAILURE;
1830 }
1831 pMac->sme.peerInfoParams.peerInfoCbk(pMac->sme.peerInfoParams.pUserData,
1832 &pIbssPeerInfoParams->
1833 ibssPeerInfoRspParams);
1834 return QDF_STATUS_SUCCESS;
1835}
1836
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001837/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001838 * sme_process_dual_mac_config_resp() - Process set Dual mac config response
1839 * @mac: Global MAC pointer
1840 * @msg: Dual mac config response
1841 *
1842 * Processes the dual mac configuration response and invokes the HDD callback
1843 * to process further
1844 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301845static QDF_STATUS sme_process_dual_mac_config_resp(tpAniSirGlobal mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001846 uint8_t *msg)
1847{
1848 tListElem *entry = NULL;
1849 tSmeCmd *command = NULL;
1850 bool found;
1851 dual_mac_cb callback = NULL;
1852 struct sir_dual_mac_config_resp *param;
1853
1854 param = (struct sir_dual_mac_config_resp *)msg;
1855 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001856 sme_err("Dual mac config resp param is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001857 /* Not returning. Need to check if active command list
1858 * needs to be freed
1859 */
1860 }
1861
Krunal Sonia8270f52017-02-23 19:51:25 -08001862 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001863 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001864 sme_err("No cmd found in active list");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301865 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001866 }
1867
1868 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
1869 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001870 sme_err("Base address is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301871 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001872 }
1873
1874 if (e_sme_command_set_dual_mac_config != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001875 sme_err("Command mismatch!");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301876 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001877 }
1878
1879 callback = command->u.set_dual_mac_cmd.set_dual_mac_cb;
1880 if (callback) {
1881 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001882 sme_err("Callback failed-Dual mac config is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001883 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001884 sme_debug("Calling HDD callback for Dual mac config");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001885 callback(param->status,
1886 command->u.set_dual_mac_cmd.scan_config,
1887 command->u.set_dual_mac_cmd.fw_mode_config);
1888 }
1889 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001890 sme_err("Callback does not exist");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001891 }
1892
Krunal Soni72dba662017-02-15 20:13:17 -08001893 found = csr_nonscan_active_ll_remove_entry(mac, entry, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001894 if (found)
1895 /* Now put this command back on the available command list */
Krunal Soni78618d92017-02-14 21:46:31 -08001896 csr_release_command(mac, command);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001897
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301898 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001899}
1900
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001901/**
1902 * sme_process_antenna_mode_resp() - Process set antenna mode
1903 * response
1904 * @mac: Global MAC pointer
1905 * @msg: antenna mode response
1906 *
1907 * Processes the antenna mode response and invokes the HDD
1908 * callback to process further
1909 */
1910static QDF_STATUS sme_process_antenna_mode_resp(tpAniSirGlobal mac,
1911 uint8_t *msg)
1912{
1913 tListElem *entry;
1914 tSmeCmd *command;
1915 bool found;
Dundi Raviteja6bb9e322018-05-16 17:04:41 +05301916 void *context = NULL;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001917 antenna_mode_cb callback;
1918 struct sir_antenna_mode_resp *param;
1919
1920 param = (struct sir_antenna_mode_resp *)msg;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301921 if (!param)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001922 sme_err("set antenna mode resp is NULL");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001923 /* Not returning. Need to check if active command list
1924 * needs to be freed
1925 */
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001926
Krunal Sonia8270f52017-02-23 19:51:25 -08001927 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001928 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001929 sme_err("No cmd found in active list");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001930 return QDF_STATUS_E_FAILURE;
1931 }
1932
1933 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
1934 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001935 sme_err("Base address is NULL");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001936 return QDF_STATUS_E_FAILURE;
1937 }
1938
1939 if (e_sme_command_set_antenna_mode != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001940 sme_err("Command mismatch!");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001941 return QDF_STATUS_E_FAILURE;
1942 }
1943
Dundi Raviteja6bb9e322018-05-16 17:04:41 +05301944 context = command->u.set_antenna_mode_cmd.set_antenna_mode_ctx;
1945 callback = command->u.set_antenna_mode_cmd.set_antenna_mode_resp;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001946 if (callback) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301947 if (!param)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001948 sme_err("Set antenna mode call back is NULL");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301949 else
Dundi Raviteja6bb9e322018-05-16 17:04:41 +05301950 callback(param->status, context);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001951 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001952 sme_err("Callback does not exist");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001953 }
1954
Krunal Soni72dba662017-02-15 20:13:17 -08001955 found = csr_nonscan_active_ll_remove_entry(mac, entry, LL_ACCESS_LOCK);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001956 if (found)
1957 /* Now put this command back on the available command list */
Krunal Soni78618d92017-02-14 21:46:31 -08001958 csr_release_command(mac, command);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001959
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001960 return QDF_STATUS_SUCCESS;
1961}
1962
Jeff Johnson5f9ce2d2018-06-09 21:20:45 -07001963QDF_STATUS sme_process_msg(tpAniSirGlobal pMac, struct scheduler_msg *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001964{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301965 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05301966 struct sir_peer_info *peer_stats;
1967 struct sir_peer_info_resp *peer_info_rsp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001968
1969 if (pMsg == NULL) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001970 sme_err("Empty message for SME");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001971 return status;
1972 }
1973 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301974 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001975 sme_warn("Locking failed, bailing out");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001976 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301977 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001978 return status;
1979 }
1980 if (!SME_IS_START(pMac)) {
Rajeev Kumar3887f9b2018-01-10 11:24:01 -08001981 sme_debug("message type %d in stop state ignored", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001982 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301983 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001984 goto release_lock;
1985 }
1986 switch (pMsg->type) {
1987#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001988 case eWNI_SME_HO_FAIL_IND:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301989 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001990 FL("LFR3: Rcvd eWNI_SME_HO_FAIL_IND"));
1991 csr_process_ho_fail_ind(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301992 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001993 break;
1994#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001995 case WNI_CFG_SET_CNF:
1996 case WNI_CFG_DNLD_CNF:
1997 case WNI_CFG_GET_RSP:
1998 case WNI_CFG_ADD_GRP_ADDR_CNF:
1999 case WNI_CFG_DEL_GRP_ADDR_CNF:
2000 break;
2001 case eWNI_SME_ADDTS_RSP:
2002 case eWNI_SME_DELTS_RSP:
2003 case eWNI_SME_DELTS_IND:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002004 case eWNI_SME_FT_AGGR_QOS_RSP:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002005 /* QoS */
2006 if (pMsg->bodyptr) {
2007#ifndef WLAN_MDM_CODE_REDUCTION_OPT
2008 status = sme_qos_msg_processor(pMac, pMsg->type,
2009 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302010 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002011#endif
2012 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002013 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002014 }
2015 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002016 case eWNI_SME_NEIGHBOR_REPORT_IND:
2017 case eWNI_SME_BEACON_REPORT_REQ_IND:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002018 if (pMsg->bodyptr) {
2019 status = sme_rrm_msg_processor(pMac, pMsg->type,
2020 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302021 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002022 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302023 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002024 }
2025 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002026 case eWNI_SME_ADD_STA_SELF_RSP:
2027 if (pMsg->bodyptr) {
2028 status = csr_process_add_sta_session_rsp(pMac,
2029 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302030 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002031 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002032 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002033 }
2034 break;
2035 case eWNI_SME_DEL_STA_SELF_RSP:
2036 if (pMsg->bodyptr) {
2037 status = csr_process_del_sta_session_rsp(pMac,
2038 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302039 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002040 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002041 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002042 }
2043 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002044 case eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE:
2045 if (pMsg->bodyptr) {
2046 status = sme_handle_generic_change_country_code(
2047 (void *)pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302048 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002049 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002050 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002051 }
2052 break;
Sandeep Puligilla8d6011b2017-11-08 00:06:18 -08002053
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002054#ifdef WLAN_FEATURE_11W
2055 case eWNI_SME_UNPROT_MGMT_FRM_IND:
2056 if (pMsg->bodyptr) {
2057 sme_unprotected_mgmt_frm_ind(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302058 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002059 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002060 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002061 }
2062 break;
2063#endif
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002064#ifdef FEATURE_WLAN_ESE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002065 case eWNI_SME_TSM_IE_IND:
2066 if (pMsg->bodyptr) {
2067 sme_tsm_ie_ind(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302068 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002069 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002070 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002071 }
2072 break;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002073#endif /* FEATURE_WLAN_ESE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002074 case eWNI_SME_ROAM_SCAN_OFFLOAD_RSP:
2075 status = csr_roam_offload_scan_rsp_hdlr((void *)pMac,
2076 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302077 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002078 break;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002079 case eWNI_SME_IBSS_PEER_INFO_RSP:
2080 if (pMsg->bodyptr) {
Jeff Johnson49c02f92016-10-07 10:29:09 -07002081 sme_ibss_peer_info_response_handler(pMac,
2082 pMsg->bodyptr);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002083 qdf_mem_free(pMsg->bodyptr);
2084 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002085 sme_err("Empty message for: %d", pMsg->type);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002086 }
2087 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002088 case eWNI_SME_READY_TO_SUSPEND_IND:
2089 if (pMsg->bodyptr) {
2090 sme_process_ready_to_suspend(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302091 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002092 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002093 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002094 }
2095 break;
2096#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
2097 case eWNI_SME_READY_TO_EXTWOW_IND:
2098 if (pMsg->bodyptr) {
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07002099 sme_process_ready_to_ext_wow(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302100 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002101 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002102 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002103 }
2104 break;
2105#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002106#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
2107 case eWNI_SME_AUTO_SHUTDOWN_IND:
2108 if (pMac->sme.pAutoShutdownNotificationCb) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05302109 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002110 FL("Auto shutdown notification"));
2111 pMac->sme.pAutoShutdownNotificationCb();
2112 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302113 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002114 break;
2115#endif
2116 case eWNI_SME_DFS_RADAR_FOUND:
Arif Hussaincd151632017-02-11 16:57:19 -08002117 case eWNI_SME_DFS_CAC_COMPLETE:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002118 case eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND:
Abhishek Singh20a8e442018-09-12 15:50:44 +05302119 case eWNI_SME_CSA_RESTART_RSP:
Arif Hussaincd151632017-02-11 16:57:19 -08002120 status = dfs_msg_processor(pMac, pMsg);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302121 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002122 break;
2123 case eWNI_SME_CHANNEL_CHANGE_RSP:
2124 if (pMsg->bodyptr) {
2125 status = sme_process_channel_change_resp(pMac,
2126 pMsg->type,
2127 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302128 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002129 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002130 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002131 }
2132 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002133 case eWNI_SME_STATS_EXT_EVENT:
Jeff Johnsonfdecd512018-06-10 09:18:32 -07002134 status = sme_stats_ext_event(pMac, pMsg->bodyptr);
2135 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002136 break;
Will Huang558f8082017-05-31 16:22:24 +08002137 case eWNI_SME_GET_PEER_INFO_IND:
2138 if (pMac->sme.pget_peer_info_ind_cb)
2139 pMac->sme.pget_peer_info_ind_cb(pMsg->bodyptr,
2140 pMac->sme.pget_peer_info_cb_context);
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05302141 if (pMsg->bodyptr) {
2142 peer_info_rsp = (struct sir_peer_info_resp *)
2143 (pMsg->bodyptr);
2144 peer_stats = (struct sir_peer_info *)
2145 (peer_info_rsp->info);
2146 if (peer_stats) {
2147 pMac->peer_rssi = peer_stats[0].rssi;
2148 pMac->peer_txrate = peer_stats[0].tx_rate;
2149 pMac->peer_rxrate = peer_stats[0].rx_rate;
2150 }
2151 }
Will Huang558f8082017-05-31 16:22:24 +08002152 qdf_mem_free(pMsg->bodyptr);
2153 break;
2154 case eWNI_SME_GET_PEER_INFO_EXT_IND:
2155 if (pMac->sme.pget_peer_info_ext_ind_cb)
2156 pMac->sme.pget_peer_info_ext_ind_cb(pMsg->bodyptr,
2157 pMac->sme.pget_peer_info_ext_cb_context);
2158 qdf_mem_free(pMsg->bodyptr);
2159 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002160 case eWNI_SME_CSA_OFFLOAD_EVENT:
2161 if (pMsg->bodyptr) {
2162 csr_scan_flush_bss_entry(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302163 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002164 }
2165 break;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07002166 case eWNI_SME_TSF_EVENT:
2167 if (pMac->sme.get_tsf_cb) {
2168 pMac->sme.get_tsf_cb(pMac->sme.get_tsf_cxt,
2169 (struct stsf *)pMsg->bodyptr);
2170 }
2171 if (pMsg->bodyptr)
2172 qdf_mem_free(pMsg->bodyptr);
2173 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002174#ifdef WLAN_FEATURE_NAN
2175 case eWNI_SME_NAN_EVENT:
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05302176 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_WMA_MSG,
2177 NO_SESSION, pMsg->type));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002178 if (pMsg->bodyptr) {
Jeff Johnson5f9ce2d2018-06-09 21:20:45 -07002179 sme_nan_event(MAC_HANDLE(pMac), pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302180 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002181 }
2182 break;
2183#endif /* WLAN_FEATURE_NAN */
2184 case eWNI_SME_LINK_STATUS_IND:
2185 {
2186 tAniGetLinkStatus *pLinkStatus =
2187 (tAniGetLinkStatus *) pMsg->bodyptr;
2188 if (pLinkStatus) {
Jeff Johnsonca7a7162018-07-07 12:56:54 -07002189 if (pMac->sme.link_status_callback)
2190 pMac->sme.link_status_callback(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002191 pLinkStatus->linkStatus,
Jeff Johnsonca7a7162018-07-07 12:56:54 -07002192 pMac->sme.link_status_context);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302193
Jeff Johnsonca7a7162018-07-07 12:56:54 -07002194 pMac->sme.link_status_callback = NULL;
2195 pMac->sme.link_status_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302196 qdf_mem_free(pLinkStatus);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002197 }
2198 break;
2199 }
2200 case eWNI_SME_MSG_GET_TEMPERATURE_IND:
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302201 if (pMac->sme.pGetTemperatureCb)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002202 pMac->sme.pGetTemperatureCb(pMsg->bodyval,
2203 pMac->sme.pTemperatureCbContext);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002204 break;
2205 case eWNI_SME_SNR_IND:
2206 {
2207 tAniGetSnrReq *pSnrReq = (tAniGetSnrReq *) pMsg->bodyptr;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302208
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002209 if (pSnrReq) {
2210 if (pSnrReq->snrCallback) {
2211 ((tCsrSnrCallback)
2212 (pSnrReq->snrCallback))
2213 (pSnrReq->snr, pSnrReq->staId,
2214 pSnrReq->pDevContext);
2215 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302216 qdf_mem_free(pSnrReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002217 }
2218 break;
2219 }
2220#ifdef FEATURE_WLAN_EXTSCAN
2221 case eWNI_SME_EXTSCAN_FULL_SCAN_RESULT_IND:
Jeff Johnson17b12392018-07-03 22:21:15 -07002222 if (pMac->sme.ext_scan_ind_cb)
2223 pMac->sme.ext_scan_ind_cb(pMac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002224 eSIR_EXTSCAN_FULL_SCAN_RESULT_IND,
2225 pMsg->bodyptr);
2226 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002227 sme_err("callback not registered to process: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002228 pMsg->type);
2229
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302230 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002231 break;
2232 case eWNI_SME_EPNO_NETWORK_FOUND_IND:
Jeff Johnson17b12392018-07-03 22:21:15 -07002233 if (pMac->sme.ext_scan_ind_cb)
2234 pMac->sme.ext_scan_ind_cb(pMac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002235 eSIR_EPNO_NETWORK_FOUND_IND,
2236 pMsg->bodyptr);
2237 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002238 sme_err("callback not registered to process: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002239 pMsg->type);
2240
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302241 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002242 break;
2243#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002244 case eWNI_SME_SET_HW_MODE_RESP:
2245 if (pMsg->bodyptr) {
2246 status = sme_process_set_hw_mode_resp(pMac,
2247 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302248 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002249 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002250 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002251 }
2252 break;
2253 case eWNI_SME_HW_MODE_TRANS_IND:
2254 if (pMsg->bodyptr) {
2255 status = sme_process_hw_mode_trans_ind(pMac,
2256 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302257 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002258 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002259 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002260 }
2261 break;
2262 case eWNI_SME_NSS_UPDATE_RSP:
2263 if (pMsg->bodyptr) {
2264 status = sme_process_nss_update_resp(pMac,
2265 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302266 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002267 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002268 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002269 }
2270 break;
Nirav Shah575282c2018-07-08 22:48:00 +05302271#ifdef WLAN_FEATURE_DSRC
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002272 case eWNI_SME_OCB_SET_CONFIG_RSP:
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302273 if (pMac->sme.ocb_set_config_callback)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002274 pMac->sme.ocb_set_config_callback(
2275 pMac->sme.ocb_set_config_context,
2276 pMsg->bodyptr);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302277 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002278 sme_err("No callback for Msg type: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002279 pMac->sme.ocb_set_config_callback = NULL;
2280 pMac->sme.ocb_set_config_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302281 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002282 break;
2283 case eWNI_SME_OCB_GET_TSF_TIMER_RSP:
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302284 if (pMac->sme.ocb_get_tsf_timer_callback)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002285 pMac->sme.ocb_get_tsf_timer_callback(
2286 pMac->sme.ocb_get_tsf_timer_context,
2287 pMsg->bodyptr);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302288 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002289 sme_err("No callback for Msg type: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002290 pMac->sme.ocb_get_tsf_timer_callback = NULL;
2291 pMac->sme.ocb_get_tsf_timer_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302292 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002293 break;
2294 case eWNI_SME_DCC_GET_STATS_RSP:
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302295 if (pMac->sme.dcc_get_stats_callback)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002296 pMac->sme.dcc_get_stats_callback(
2297 pMac->sme.dcc_get_stats_context,
2298 pMsg->bodyptr);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302299 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002300 sme_err("No callback for Msg type: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002301 pMac->sme.dcc_get_stats_callback = NULL;
2302 pMac->sme.dcc_get_stats_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302303 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002304 break;
2305 case eWNI_SME_DCC_UPDATE_NDL_RSP:
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302306 if (pMac->sme.dcc_update_ndl_callback)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002307 pMac->sme.dcc_update_ndl_callback(
2308 pMac->sme.dcc_update_ndl_context,
2309 pMsg->bodyptr);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302310 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002311 sme_err("No callback for Msg type: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002312 pMac->sme.dcc_update_ndl_callback = NULL;
2313 pMac->sme.dcc_update_ndl_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302314 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002315 break;
2316 case eWNI_SME_DCC_STATS_EVENT:
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302317 if (pMac->sme.dcc_stats_event_callback)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002318 pMac->sme.dcc_stats_event_callback(
2319 pMac->sme.dcc_stats_event_context,
2320 pMsg->bodyptr);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302321 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002322 sme_err("No callback for Msg type: %d", pMsg->type);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302323 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002324 break;
Nirav Shah575282c2018-07-08 22:48:00 +05302325#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002326 case eWNI_SME_SET_DUAL_MAC_CFG_RESP:
2327 if (pMsg->bodyptr) {
2328 status = sme_process_dual_mac_config_resp(pMac,
2329 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302330 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002331 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002332 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002333 }
gaurank kathpaliaebe3fc82018-05-07 09:39:46 +05302334 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002335 case eWNI_SME_SET_THERMAL_LEVEL_IND:
2336 if (pMac->sme.set_thermal_level_cb)
Jeff Johnson6aaaa992018-06-30 10:43:04 -07002337 pMac->sme.set_thermal_level_cb(pMac->hdd_handle,
2338 pMsg->bodyval);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002339 break;
Abhishek Singh518323d2015-10-19 17:42:01 +05302340 case eWNI_SME_EXT_CHANGE_CHANNEL_IND:
2341 status = sme_extended_change_channel_ind(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302342 qdf_mem_free(pMsg->bodyptr);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302343 break;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002344 case eWNI_SME_SET_ANTENNA_MODE_RESP:
2345 if (pMsg->bodyptr) {
2346 status = sme_process_antenna_mode_resp(pMac,
2347 pMsg->bodyptr);
2348 qdf_mem_free(pMsg->bodyptr);
2349 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002350 sme_err("Empty message for: %d", pMsg->type);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002351 }
2352 break;
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05302353 case eWNI_SME_LOST_LINK_INFO_IND:
2354 if (pMac->sme.lost_link_info_cb)
Jeff Johnson6aaaa992018-06-30 10:43:04 -07002355 pMac->sme.lost_link_info_cb(pMac->hdd_handle,
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05302356 (struct sir_lost_link_info *)pMsg->bodyptr);
2357 qdf_mem_free(pMsg->bodyptr);
2358 break;
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +05302359 case eWNI_SME_RSO_CMD_STATUS_IND:
2360 if (pMac->sme.rso_cmd_status_cb)
Jeff Johnson6aaaa992018-06-30 10:43:04 -07002361 pMac->sme.rso_cmd_status_cb(pMac->hdd_handle,
2362 pMsg->bodyptr);
lifeng66831662017-05-19 16:01:35 +08002363 qdf_mem_free(pMsg->bodyptr);
2364 break;
Zhang Qiana6e9c102016-12-22 16:47:24 +08002365 case eWMI_SME_LL_STATS_IND:
2366 if (pMac->sme.link_layer_stats_ext_cb)
Jeff Johnson6aaaa992018-06-30 10:43:04 -07002367 pMac->sme.link_layer_stats_ext_cb(pMac->hdd_handle,
Zhang Qiana6e9c102016-12-22 16:47:24 +08002368 pMsg->bodyptr);
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +05302369 qdf_mem_free(pMsg->bodyptr);
2370 break;
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05302371 case eWNI_SME_BT_ACTIVITY_INFO_IND:
2372 if (pMac->sme.bt_activity_info_cb)
Jeff Johnson6aaaa992018-06-30 10:43:04 -07002373 pMac->sme.bt_activity_info_cb(pMac->hdd_handle,
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05302374 pMsg->bodyval);
2375 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002376 default:
2377
2378 if ((pMsg->type >= eWNI_SME_MSG_TYPES_BEGIN)
2379 && (pMsg->type <= eWNI_SME_MSG_TYPES_END)) {
2380 /* CSR */
2381 if (pMsg->bodyptr) {
Jeff Johnsone0349a02018-06-10 11:31:06 -07002382 status = csr_msg_processor(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302383 qdf_mem_free(pMsg->bodyptr);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302384 } else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002385 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002386 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002387 sme_warn("Unknown message type: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002388 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302389 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002390 }
2391 } /* switch */
2392release_lock:
2393 sme_release_global_lock(&pMac->sme);
2394 return status;
2395}
2396
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002397QDF_STATUS sme_mc_process_handler(struct scheduler_msg *msg)
2398{
2399 tpAniSirGlobal mac_ctx = cds_get_context(QDF_MODULE_ID_SME);
2400
2401 if (mac_ctx == NULL) {
2402 QDF_ASSERT(0);
2403 return QDF_STATUS_E_FAILURE;
2404 }
2405
Jeff Johnson5f9ce2d2018-06-09 21:20:45 -07002406 return sme_process_msg(mac_ctx, msg);
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002407}
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002408
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002409/**
2410 * sme_process_nss_update_resp() - Process nss update response
2411 * @mac: Global MAC pointer
2412 * @msg: nss update response
2413 *
2414 * Processes the nss update response and invokes the HDD
2415 * callback to process further
2416 */
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302417static QDF_STATUS sme_process_nss_update_resp(tpAniSirGlobal mac, uint8_t *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002418{
2419 tListElem *entry = NULL;
2420 tSmeCmd *command = NULL;
2421 bool found;
Tushnim Bhattacharyyaeab33dd2017-11-15 15:20:02 -08002422 policy_mgr_nss_update_cback callback = NULL;
Abhishek Singhfc740be2018-10-12 11:34:26 +05302423 struct sir_bcn_update_rsp *param;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002424
Abhishek Singhfc740be2018-10-12 11:34:26 +05302425 param = (struct sir_bcn_update_rsp *)msg;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302426 if (!param)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002427 sme_err("nss update resp param is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002428 /* Not returning. Need to check if active command list
2429 * needs to be freed
2430 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002431
Abhishek Singhfc740be2018-10-12 11:34:26 +05302432 if (param && param->reason != REASON_NSS_UPDATE) {
2433 sme_err("reason not NSS update");
2434 return QDF_STATUS_E_INVAL;
2435 }
Krunal Sonia8270f52017-02-23 19:51:25 -08002436 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002437 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002438 sme_err("No cmd found in active list");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302439 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002440 }
2441
2442 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
2443 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002444 sme_err("Base address is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302445 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002446 }
2447
2448 if (e_sme_command_nss_update != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002449 sme_err("Command mismatch!");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302450 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002451 }
2452
2453 callback = command->u.nss_update_cmd.nss_update_cb;
2454 if (callback) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302455 if (!param)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002456 sme_err("Callback failed since nss update params is NULL");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302457 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002458 callback(command->u.nss_update_cmd.context,
Abhishek Singhfc740be2018-10-12 11:34:26 +05302459 param->status,
2460 param->vdev_id,
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +05302461 command->u.nss_update_cmd.next_action,
Liangwei Dong1ba99482018-10-19 02:57:29 -04002462 command->u.nss_update_cmd.reason,
2463 command->u.nss_update_cmd.original_vdev_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002464 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002465 sme_err("Callback does not exisit");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002466 }
2467
Krunal Soni72dba662017-02-15 20:13:17 -08002468 found = csr_nonscan_active_ll_remove_entry(mac, entry, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002469 if (found) {
2470 /* Now put this command back on the avilable command list */
Krunal Soni78618d92017-02-14 21:46:31 -08002471 csr_release_command(mac, command);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002472 }
Krunal Sonia8270f52017-02-23 19:51:25 -08002473
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302474 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002475}
2476
Jeff Johnson62cd6802018-07-20 12:38:25 -07002477QDF_STATUS sme_stop(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002478{
Jeff Johnson62cd6802018-07-20 12:38:25 -07002479 QDF_STATUS status;
2480 QDF_STATUS ret_status = QDF_STATUS_SUCCESS;
2481 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002482
Jeff Johnson62cd6802018-07-20 12:38:25 -07002483 status = rrm_stop(mac);
2484 if (QDF_IS_STATUS_ERROR(status)) {
2485 ret_status = status;
Sandeep Puligilla66d09c42017-09-06 17:10:27 -07002486 sme_err("rrm_stop failed with status: %d", status);
2487 }
2488
Jeff Johnson62cd6802018-07-20 12:38:25 -07002489 status = csr_stop(mac);
2490 if (QDF_IS_STATUS_ERROR(status)) {
2491 ret_status = status;
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002492 sme_err("csr_stop failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002493 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002494
Jeff Johnson62cd6802018-07-20 12:38:25 -07002495 mac->sme.state = SME_STATE_STOP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002496
Jeff Johnson62cd6802018-07-20 12:38:25 -07002497 return ret_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002498}
2499
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302500/*
2501 * sme_close() - Release all SME modules and their resources.
2502 * The function release each module in SME, PMC, CSR, etc. . Upon
2503 * return, all modules are at closed state.
2504 *
2505 * No SME APIs can be involved after smeClose except smeOpen.
2506 * smeClose must be called before mac_close.
2507 * This is a synchronous call
2508 *
2509 * hHal - The handle returned by mac_open
2510 * Return QDF_STATUS_SUCCESS - SME is successfully close.
2511 *
2512 * Other status means SME is failed to be closed but caller still cannot
2513 * call any other SME functions except smeOpen.
2514 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302515QDF_STATUS sme_close(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002516{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302517 QDF_STATUS status = QDF_STATUS_E_FAILURE;
2518 QDF_STATUS fail_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002519 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2520
2521 if (!pMac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302522 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002523
2524 /* Note: pSession will be invalid from here on, do not access */
2525 status = csr_close(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302526 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002527 sme_err("csr_close failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002528 fail_status = status;
2529 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002530#ifndef WLAN_MDM_CODE_REDUCTION_OPT
2531 status = sme_qos_close(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302532 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002533 sme_err("Qos close failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002534 fail_status = status;
2535 }
2536#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002537 status = sme_ps_close(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302538 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002539 sme_err("sme_ps_close failed status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002540 fail_status = status;
2541 }
2542
Jeff Johnson3639a642018-06-09 23:47:44 -07002543 status = rrm_close(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302544 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002545 sme_err("RRM close failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002546 fail_status = status;
2547 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002548
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002549 free_sme_cmd_list(pMac);
2550
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302551 if (!QDF_IS_STATUS_SUCCESS
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302552 (qdf_mutex_destroy(&pMac->sme.lkSmeGlobalLock)))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302553 fail_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002554
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302555 if (!QDF_IS_STATUS_SUCCESS(fail_status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002556 status = fail_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002557
2558 pMac->sme.state = SME_STATE_STOP;
2559
2560 return status;
2561}
2562
2563/**
Abhishek Singhc9941602016-08-09 16:06:22 +05302564 * sme_remove_bssid_from_scan_list() - wrapper to remove the bssid from
2565 * scan list
2566 * @hal: hal context.
2567 * @bssid: bssid to be removed
2568 *
2569 * This function remove the given bssid from scan list.
2570 *
2571 * Return: QDF status.
2572 */
2573QDF_STATUS sme_remove_bssid_from_scan_list(tHalHandle hal,
2574 tSirMacAddr bssid)
2575{
2576 QDF_STATUS status = QDF_STATUS_E_FAILURE;
2577 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
2578
2579 status = sme_acquire_global_lock(&mac_ctx->sme);
2580 if (QDF_IS_STATUS_SUCCESS(status)) {
2581 csr_remove_bssid_from_scan_list(mac_ctx, bssid);
2582 sme_release_global_lock(&mac_ctx->sme);
2583 }
2584
2585 return status;
2586}
2587
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002588
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302589/*
2590 * sme_scan_get_result
2591 * A wrapper function to request scan results from CSR.
2592 * This is a synchronous call
2593 *
2594 * pFilter - If pFilter is NULL, all cached results are returned
2595 * phResult - an object for the result.
2596 * Return QDF_STATUS
2597 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302598QDF_STATUS sme_scan_get_result(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002599 tCsrScanResultFilter *pFilter,
2600 tScanResultHandle *phResult)
2601{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302602 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002603 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2604
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302605 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002606 TRACE_CODE_SME_RX_HDD_MSG_SCAN_GET_RESULTS, sessionId,
2607 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002608 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302609 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnsonadf800d2018-06-10 18:00:00 -07002610 status = csr_scan_get_result(pMac, pFilter, phResult);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002611 sme_release_global_lock(&pMac->sme);
2612 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002613
2614 return status;
2615}
2616
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +05302617QDF_STATUS sme_scan_get_result_for_bssid(tHalHandle hal_handle,
2618 struct qdf_mac_addr *bssid,
2619 tCsrScanResultInfo *res)
2620{
2621 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
2622 QDF_STATUS status;
2623
2624 status = sme_acquire_global_lock(&mac_ctx->sme);
2625 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson1b56f6b2018-06-10 18:17:10 -07002626 status = csr_scan_get_result_for_bssid(mac_ctx, bssid, res);
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +05302627 sme_release_global_lock(&mac_ctx->sme);
2628 }
2629
2630 return status;
2631}
2632
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002633/**
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002634 * sme_get_ap_channel_from_scan() - a wrapper function to get
Srinivas Girigowda828ef232017-10-13 22:31:27 -07002635 * AP's channel id from
2636 * CSR by filtering the
2637 * result which matches
2638 * our roam profile.
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002639 * @profile: SAP profile
2640 * @ap_chnl_id: pointer to channel id of SAP. Fill the value after finding the
2641 * best ap from scan cache.
2642 *
2643 * This function is written to get AP's channel id from CSR by filtering
2644 * the result which matches our roam profile. This is a synchronous call.
2645 *
2646 * Return: QDF_STATUS.
2647 */
2648QDF_STATUS sme_get_ap_channel_from_scan(void *profile,
2649 tScanResultHandle *scan_cache,
2650 uint8_t *ap_chnl_id)
2651{
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002652 return sme_get_ap_channel_from_scan_cache((struct csr_roam_profile *)
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002653 profile,
2654 scan_cache,
2655 ap_chnl_id);
2656}
2657
2658/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002659 * sme_get_ap_channel_from_scan_cache() - a wrapper function to get AP's
2660 * channel id from CSR by filtering the
2661 * result which matches our roam profile.
2662 * @profile: SAP adapter
2663 * @ap_chnl_id: pointer to channel id of SAP. Fill the value after finding the
2664 * best ap from scan cache.
2665 *
2666 * This function is written to get AP's channel id from CSR by filtering
2667 * the result which matches our roam profile. This is a synchronous call.
2668 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302669 * Return: QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002670 */
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002671QDF_STATUS sme_get_ap_channel_from_scan_cache(
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002672 struct csr_roam_profile *profile, tScanResultHandle *scan_cache,
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002673 uint8_t *ap_chnl_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002674{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302675 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002676 tpAniSirGlobal mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002677 tCsrScanResultFilter *scan_filter = NULL;
2678 tScanResultHandle filtered_scan_result = NULL;
2679 tSirBssDescription first_ap_profile;
2680
2681 if (NULL == mac_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302682 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002683 FL("mac_ctx is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302684 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002685 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302686 scan_filter = qdf_mem_malloc(sizeof(tCsrScanResultFilter));
Arif Hussain0ef77082018-10-10 16:42:53 -07002687 if (!scan_filter)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302688 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -07002689
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302690 qdf_mem_set(&first_ap_profile, sizeof(tSirBssDescription), 0);
2691 if (NULL == profile) {
2692 scan_filter->EncryptionType.numEntries = 1;
2693 scan_filter->EncryptionType.encryptionType[0]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002694 = eCSR_ENCRYPT_TYPE_NONE;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302695 } else {
2696 /* Here is the profile we need to connect to */
2697 status = csr_roam_prepare_filter_from_profile(mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002698 profile,
2699 scan_filter);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302700 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002701
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302702 if (QDF_STATUS_SUCCESS == status) {
2703 /* Save the WPS info */
2704 if (NULL != profile) {
2705 scan_filter->bWPSAssociation =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002706 profile->bWPSAssociation;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302707 scan_filter->bOSENAssociation =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002708 profile->bOSENAssociation;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002709 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302710 scan_filter->bWPSAssociation = 0;
2711 scan_filter->bOSENAssociation = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002712 }
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302713 } else {
2714 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
2715 FL("Preparing the profile filter failed"));
2716 qdf_mem_free(scan_filter);
2717 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002718 }
2719 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302720 if (QDF_STATUS_SUCCESS == status) {
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002721 status = csr_scan_get_result(mac_ctx, scan_filter,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002722 &filtered_scan_result);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302723 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002724 csr_get_bssdescr_from_scan_handle(filtered_scan_result,
2725 &first_ap_profile);
2726 *scan_cache = filtered_scan_result;
2727 if (0 != first_ap_profile.channelId) {
2728 *ap_chnl_id = first_ap_profile.channelId;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302729 QDF_TRACE(QDF_MODULE_ID_SME,
Abhishek Singh5d8d7332017-08-10 15:15:24 +05302730 QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002731 FL("Found best AP & its on chnl[%d]"),
2732 first_ap_profile.channelId);
2733 } else {
2734 /*
2735 * This means scan result is empty
2736 * so set the channel to zero, caller should
2737 * take of zero channel id case.
2738 */
2739 *ap_chnl_id = 0;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302740 QDF_TRACE(QDF_MODULE_ID_SME,
2741 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002742 FL("Scan is empty, set chnl to 0"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302743 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002744 }
2745 } else {
Sandeep Puligilla1f1e4002018-08-18 12:15:01 -07002746 sme_err("Failed to get scan get result");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302747 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002748 }
2749 csr_free_scan_filter(mac_ctx, scan_filter);
2750 sme_release_global_lock(&mac_ctx->sme);
2751 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302752 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002753 FL("Aquiring lock failed"));
Krunal Sonif9882222016-01-22 17:16:50 -08002754 csr_free_scan_filter(mac_ctx, scan_filter);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302755 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002756 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302757 qdf_mem_free(scan_filter);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002758 return status;
2759}
2760
2761/**
2762 * sme_store_joinreq_param() - This function will pass station's join
2763 * request to store to csr.
2764 * @hal_handle: pointer to hal context.
2765 * @profile: pointer to station's roam profile.
2766 * @scan_cache: pointer to station's scan cache.
2767 * @roam_id: reference to roam_id variable being passed.
2768 * @session_id: station's session id.
2769 *
2770 * This function will pass station's join request further down to csr
2771 * to store it. this stored parameter will be used later.
2772 *
2773 * Return: true or false based on function's overall success.
2774 **/
2775bool sme_store_joinreq_param(tHalHandle hal_handle,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002776 struct csr_roam_profile *profile,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002777 tScanResultHandle scan_cache,
2778 uint32_t *roam_id,
2779 uint32_t session_id)
2780{
2781 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302782 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002783 bool ret_status = true;
2784
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302785 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002786 TRACE_CODE_SME_RX_HDD_STORE_JOIN_REQ,
2787 session_id, 0));
2788 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302789 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002790 if (false == csr_store_joinreq_param(mac_ctx, profile,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302791 scan_cache, roam_id, session_id))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002792 ret_status = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002793 sme_release_global_lock(&mac_ctx->sme);
2794 } else {
2795 ret_status = false;
2796 }
2797
2798 return ret_status;
2799}
2800
2801/**
2802 * sme_clear_joinreq_param() - This function will pass station's clear
2803 * the join request to csr.
2804 * @hal_handle: pointer to hal context.
2805 * @session_id: station's session id.
2806 *
2807 * This function will pass station's clear join request further down to csr
2808 * to cleanup.
2809 *
2810 * Return: true or false based on function's overall success.
2811 **/
2812bool sme_clear_joinreq_param(tHalHandle hal_handle,
2813 uint32_t session_id)
2814{
2815 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302816 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002817 bool ret_status = true;
2818
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302819 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002820 TRACE_CODE_SME_RX_HDD_CLEAR_JOIN_REQ,
2821 session_id, 0));
2822 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302823 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002824 if (false == csr_clear_joinreq_param(mac_ctx,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302825 session_id))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002826 ret_status = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002827 sme_release_global_lock(&mac_ctx->sme);
2828 } else {
2829 ret_status = false;
2830 }
2831
2832 return ret_status;
2833}
2834
2835/**
2836 * sme_issue_stored_joinreq() - This function will issues station's stored
2837 * the join request to csr.
2838 * @hal_handle: pointer to hal context.
2839 * @roam_id: reference to roam_id variable being passed.
2840 * @session_id: station's session id.
2841 *
2842 * This function will issue station's stored join request further down to csr
2843 * to proceed forward.
2844 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302845 * Return: QDF_STATUS_SUCCESS or QDF_STATUS_E_FAILURE.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002846 **/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302847QDF_STATUS sme_issue_stored_joinreq(tHalHandle hal_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002848 uint32_t *roam_id,
2849 uint32_t session_id)
2850{
2851 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302852 QDF_STATUS status = QDF_STATUS_E_FAILURE;
2853 QDF_STATUS ret_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002854
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302855 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002856 TRACE_CODE_SME_RX_HDD_ISSUE_JOIN_REQ,
2857 session_id, 0));
2858 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302859 if (QDF_STATUS_SUCCESS == status) {
2860 if (QDF_STATUS_SUCCESS != csr_issue_stored_joinreq(mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002861 roam_id,
2862 session_id)) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302863 ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002864 }
2865 sme_release_global_lock(&mac_ctx->sme);
2866 } else {
2867 csr_clear_joinreq_param(mac_ctx, 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 return ret_status;
2871}
2872
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302873/*
2874 * sme_scan_flush_result() -
2875 * A wrapper function to request CSR to clear scan results.
2876 * This is a synchronous call
2877 *
2878 * Return QDF_STATUS
2879 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302880QDF_STATUS sme_scan_flush_result(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002881{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302882 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002883 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2884
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302885 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002886 TRACE_CODE_SME_RX_HDD_MSG_SCAN_FLUSH_RESULTS,
2887 0, 0));
2888 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302889 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnsona1a36512018-06-10 18:20:55 -07002890 status = csr_scan_flush_result(pMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002891 sme_release_global_lock(&pMac->sme);
2892 }
2893
2894 return status;
2895}
2896
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302897/*
2898 * sme_filter_scan_results() -
2899 * A wrapper function to request CSR to clear scan results.
2900 * This is a synchronous call
2901 *
2902 * tHalHandle - HAL context handle
2903 * sessionId - session id
2904 * Return QDF_STATUS
2905 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302906QDF_STATUS sme_filter_scan_results(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002907{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302908 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002909 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2910
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302911 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002912 TRACE_CODE_SME_RX_HDD_MSG_SCAN_FLUSH_RESULTS,
2913 sessionId, 0));
2914 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302915 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002916 csr_scan_filter_results(pMac);
2917 sme_release_global_lock(&pMac->sme);
2918 }
2919
2920 return status;
2921}
2922
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302923QDF_STATUS sme_scan_flush_p2p_result(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002924{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302925 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002926 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2927
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302928 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002929 TRACE_CODE_SME_RX_HDD_MSG_SCAN_FLUSH_P2PRESULTS,
2930 sessionId, 0));
2931 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302932 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson1d3f8672018-06-10 18:24:15 -07002933 status = csr_scan_flush_selective_result(pMac, true);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002934 sme_release_global_lock(&pMac->sme);
2935 }
2936
2937 return status;
2938}
2939
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302940/*
2941 * sme_scan_result_get_first() -
2942 * A wrapper function to request CSR to returns the first element of
2943 * scan result.
2944 * This is a synchronous call
2945 *
2946 * hScanResult - returned from csr_scan_get_result
2947 * Return tCsrScanResultInfo * - NULL if no result
2948 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002949tCsrScanResultInfo *sme_scan_result_get_first(tHalHandle hHal,
2950 tScanResultHandle hScanResult)
2951{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302952 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002953 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2954 tCsrScanResultInfo *pRet = NULL;
2955
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302956 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002957 TRACE_CODE_SME_RX_HDD_MSG_SCAN_RESULT_GETFIRST,
2958 NO_SESSION, 0));
2959 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302960 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002961 pRet = csr_scan_result_get_first(pMac, hScanResult);
2962 sme_release_global_lock(&pMac->sme);
2963 }
2964
2965 return pRet;
2966}
2967
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302968/*
2969 * sme_scan_result_get_next() -
2970 * A wrapper function to request CSR to returns the next element of
2971 * scan result. It can be called without calling csr_scan_result_get_first first
2972 * This is a synchronous call
2973 *
2974 * hScanResult - returned from csr_scan_get_result
2975 * Return Null if no result or reach the end
2976 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002977tCsrScanResultInfo *sme_scan_result_get_next(tHalHandle hHal,
2978 tScanResultHandle hScanResult)
2979{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302980 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002981 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2982 tCsrScanResultInfo *pRet = NULL;
2983
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002984 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302985 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002986 pRet = csr_scan_result_get_next(pMac, hScanResult);
2987 sme_release_global_lock(&pMac->sme);
2988 }
2989
2990 return pRet;
2991}
2992
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302993/*
2994 * sme_scan_result_purge() -
2995 * A wrapper function to request CSR to remove all items(tCsrScanResult)
2996 * in the list and free memory for each item
2997 * This is a synchronous call
2998 *
2999 * hScanResult - returned from csr_scan_get_result. hScanResult is
3000 * considered gone by
3001 * calling this function and even before this function reutrns.
3002 * Return QDF_STATUS
3003 */
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07003004QDF_STATUS sme_scan_result_purge(tScanResultHandle hScanResult)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003005{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303006 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07003007 tpAniSirGlobal mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003008
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303009 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003010 TRACE_CODE_SME_RX_HDD_MSG_SCAN_RESULT_PURGE,
3011 NO_SESSION, 0));
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07003012 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303013 if (QDF_IS_STATUS_SUCCESS(status)) {
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07003014 status = csr_scan_result_purge(mac_ctx, hScanResult);
3015 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003016 }
3017
3018 return status;
3019}
3020
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003021eCsrPhyMode sme_get_phy_mode(tHalHandle hHal)
3022{
3023 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303024
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003025 return pMac->roam.configParam.phyMode;
3026}
3027
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303028/*
jiadbdefb252018-01-03 14:27:06 +08003029 * sme_get_channel_bonding_mode5_g() - get the channel bonding mode for 5G band
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303030 *
3031 * hHal - HAL handle
jiadbdefb252018-01-03 14:27:06 +08003032 * mode - channel bonding mode
3033 *
3034 * Return QDF_STATUS
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303035 */
jiadbdefb252018-01-03 14:27:06 +08003036QDF_STATUS sme_get_channel_bonding_mode5_g(tHalHandle hHal, uint32_t *mode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003037{
jiadbdefb252018-01-03 14:27:06 +08003038 tSmeConfigParams *smeConfig;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003039
jiadbdefb252018-01-03 14:27:06 +08003040 if (!mode) {
3041 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
3042 "%s: invalid mode", __func__);
3043 return QDF_STATUS_E_FAILURE;
3044 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003045
jiadbdefb252018-01-03 14:27:06 +08003046 smeConfig = qdf_mem_malloc(sizeof(*smeConfig));
Arif Hussain0ef77082018-10-10 16:42:53 -07003047 if (!smeConfig)
jiadbdefb252018-01-03 14:27:06 +08003048 return QDF_STATUS_E_NOMEM;
jiadbdefb252018-01-03 14:27:06 +08003049
Jeff Johnson0a38afe2018-06-09 23:11:27 -07003050 if (sme_get_config_param(hHal, smeConfig) != QDF_STATUS_SUCCESS) {
jiadbdefb252018-01-03 14:27:06 +08003051 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
3052 "%s: sme_get_config_param failed", __func__);
3053 qdf_mem_free(smeConfig);
3054 return QDF_STATUS_E_FAILURE;
3055 }
3056
3057 *mode = smeConfig->csrConfig.channelBondingMode5GHz;
3058 qdf_mem_free(smeConfig);
3059
3060 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003061}
3062
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303063/*
jiadbdefb252018-01-03 14:27:06 +08003064 * sme_get_channel_bonding_mode24_g() - get the channel bonding mode for 2.4G
3065 * band
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303066 *
3067 * hHal - HAL handle
jiadbdefb252018-01-03 14:27:06 +08003068 * mode - channel bonding mode
3069 *
3070 * Return QDF_STATUS
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303071 */
jiadbdefb252018-01-03 14:27:06 +08003072QDF_STATUS sme_get_channel_bonding_mode24_g(tHalHandle hHal, uint32_t *mode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003073{
jiadbdefb252018-01-03 14:27:06 +08003074 tSmeConfigParams *smeConfig;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003075
jiadbdefb252018-01-03 14:27:06 +08003076 if (!mode) {
3077 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
3078 "%s: invalid mode", __func__);
3079 return QDF_STATUS_E_FAILURE;
3080 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003081
jiadbdefb252018-01-03 14:27:06 +08003082 smeConfig = qdf_mem_malloc(sizeof(*smeConfig));
Arif Hussain0ef77082018-10-10 16:42:53 -07003083 if (!smeConfig)
jiadbdefb252018-01-03 14:27:06 +08003084 return QDF_STATUS_E_NOMEM;
jiadbdefb252018-01-03 14:27:06 +08003085
Jeff Johnson0a38afe2018-06-09 23:11:27 -07003086 if (sme_get_config_param(hHal, smeConfig) != QDF_STATUS_SUCCESS) {
jiadbdefb252018-01-03 14:27:06 +08003087 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
3088 "%s: sme_get_config_param failed", __func__);
3089 qdf_mem_free(smeConfig);
3090 return QDF_STATUS_E_FAILURE;
3091 }
3092
3093 *mode = smeConfig->csrConfig.channelBondingMode24GHz;
3094 qdf_mem_free(smeConfig);
3095
3096 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003097}
3098
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303099/*
3100 * sme_roam_connect() -
3101 * A wrapper function to request CSR to inititiate an association
3102 * This is an asynchronous call.
3103 *
3104 * sessionId - the sessionId returned by sme_open_session.
3105 * pProfile - description of the network to which to connect
3106 * hBssListIn - a list of BSS descriptor to roam to. It is returned
3107 * from csr_scan_get_result
3108 * pRoamId - to get back the request ID
3109 * Return QDF_STATUS
3110 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303111QDF_STATUS sme_roam_connect(tHalHandle hHal, uint8_t sessionId,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07003112 struct csr_roam_profile *pProfile,
3113 uint32_t *pRoamId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003114{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303115 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003116 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3117
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303118 if (!pMac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303119 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003120
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303121 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003122 TRACE_CODE_SME_RX_HDD_MSG_CONNECT, sessionId, 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003123 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303124 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003125 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
3126 status =
3127 csr_roam_connect(pMac, sessionId, pProfile,
3128 pRoamId);
3129 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003130 sme_err("Invalid sessionID: %d", sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303131 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003132 }
3133 sme_release_global_lock(&pMac->sme);
3134 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003135 sme_err("sme_acquire_global_lock failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003136 }
3137
3138 return status;
3139}
3140
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303141/*
3142 * sme_set_phy_mode() -
3143 * Changes the PhyMode.
3144 *
3145 * hHal - The handle returned by mac_open.
3146 * phyMode new phyMode which is to set
3147 * Return QDF_STATUS SUCCESS.
3148 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303149QDF_STATUS sme_set_phy_mode(tHalHandle hHal, eCsrPhyMode phyMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003150{
3151 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3152
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003153 pMac->roam.configParam.phyMode = phyMode;
3154 pMac->roam.configParam.uCfgDot11Mode =
3155 csr_get_cfg_dot11_mode_from_csr_phy_mode(NULL,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303156 pMac->roam.configParam.phyMode,
3157 pMac->roam.configParam.
3158 ProprietaryRatesEnabled);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003159
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303160 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003161}
3162
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303163/*
3164 * sme_roam_reassoc() -
3165 * A wrapper function to request CSR to inititiate a re-association
3166 *
3167 * pProfile - can be NULL to join the currently connected AP. In that
3168 * case modProfileFields should carry the modified field(s) which could trigger
3169 * reassoc
3170 * modProfileFields - fields which are part of tCsrRoamConnectedProfile
3171 * that might need modification dynamically once STA is up & running and this
3172 * could trigger a reassoc
3173 * pRoamId - to get back the request ID
3174 * Return QDF_STATUS
3175 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303176QDF_STATUS sme_roam_reassoc(tHalHandle hHal, uint8_t sessionId,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07003177 struct csr_roam_profile *pProfile,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003178 tCsrRoamModifyProfileFields modProfileFields,
3179 uint32_t *pRoamId, bool fForce)
3180{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303181 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003182 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3183
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303184 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003185 TRACE_CODE_SME_RX_HDD_ROAM_REASSOC, sessionId, 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003186 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303187 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003188 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303189 if ((NULL == pProfile) && (fForce == 1))
3190 status = csr_reassoc(pMac, sessionId,
3191 &modProfileFields, pRoamId,
3192 fForce);
3193 else
3194 status = csr_roam_reassoc(pMac, sessionId,
3195 pProfile,
3196 modProfileFields, pRoamId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003197 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303198 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003199 }
3200 sme_release_global_lock(&pMac->sme);
3201 }
3202
3203 return status;
3204}
3205
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303206/*
3207 * sme_roam_connect_to_last_profile() -
3208 * A wrapper function to request CSR to disconnect and reconnect with
3209 * the same profile
3210 * This is an asynchronous call.
3211 *
3212 * Return QDF_STATUS. It returns fail if currently connected
3213 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303214QDF_STATUS sme_roam_connect_to_last_profile(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003215{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303216 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003217 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3218
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303219 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003220 TRACE_CODE_SME_RX_HDD_ROAM_GET_CONNECTPROFILE,
3221 sessionId, 0));
3222 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303223 if (QDF_IS_STATUS_SUCCESS(status)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303224 if (CSR_IS_SESSION_VALID(pMac, sessionId))
3225 status = csr_roam_connect_to_last_profile(pMac,
3226 sessionId);
3227 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303228 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003229 sme_release_global_lock(&pMac->sme);
3230 }
3231
3232 return status;
3233}
3234
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07003235QDF_STATUS sme_roam_disconnect(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003236 eCsrRoamDisconnectReason reason)
3237{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303238 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07003239 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003240
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303241 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07003242 TRACE_CODE_SME_RX_HDD_ROAM_DISCONNECT, session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003243 reason));
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07003244 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303245 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07003246 if (CSR_IS_SESSION_VALID(mac_ctx, session_id))
3247 status = csr_roam_disconnect(mac_ctx, session_id,
3248 reason);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303249 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303250 status = QDF_STATUS_E_INVAL;
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07003251 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003252 }
3253
3254 return status;
3255}
3256
Abhishek Singhca408032016-09-13 15:26:12 +05303257/* sme_dhcp_done_ind() - send dhcp done ind
3258 * @hal: hal context
3259 * @session_id: session id
3260 *
3261 * Return: void.
3262 */
3263void sme_dhcp_done_ind(tHalHandle hal, uint8_t session_id)
3264{
3265 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05303266 struct csr_roam_session *session;
Abhishek Singhca408032016-09-13 15:26:12 +05303267
3268 if (!mac_ctx)
3269 return;
3270
3271 session = CSR_GET_SESSION(mac_ctx, session_id);
3272 if (!session) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003273 sme_err("Session: %d not found", session_id);
Abhishek Singhca408032016-09-13 15:26:12 +05303274 return;
3275 }
3276 session->dhcp_done = true;
3277}
3278
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303279/*
3280 * sme_roam_stop_bss() -
3281 * To stop BSS for Soft AP. This is an asynchronous API.
3282 *
3283 * hHal - Global structure
3284 * sessionId - sessionId of SoftAP
3285 * Return QDF_STATUS SUCCESS Roam callback will be called to indicate
3286 * actual results
3287 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303288QDF_STATUS sme_roam_stop_bss(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003289{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303290 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003291 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3292
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003293 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303294 if (QDF_IS_STATUS_SUCCESS(status)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303295 if (CSR_IS_SESSION_VALID(pMac, sessionId))
3296 status = csr_roam_issue_stop_bss_cmd(pMac, sessionId,
Himanshu Agarwal75c8d792017-12-19 18:31:04 +05303297 false);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303298 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303299 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003300 sme_release_global_lock(&pMac->sme);
3301 }
3302
3303 return status;
3304}
3305
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05303306/**
3307 * sme_roam_disconnect_sta() - disassociate a station
3308 * @hHal: Global structure
3309 * @sessionId: SessionId of SoftAP
3310 * @p_del_sta_params: Pointer to parameters of the station to disassoc
3311 *
3312 * To disassociate a station. This is an asynchronous API.
3313 *
3314 * Return: QDF_STATUS_SUCCESS on success.Roam callback will
3315 * be called to indicate actual result.
3316 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303317QDF_STATUS sme_roam_disconnect_sta(tHalHandle hHal, uint8_t sessionId,
Jeff Johnsone6bf7192017-11-07 15:16:09 -08003318 struct csr_del_sta_params *p_del_sta_params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003319{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303320 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003321 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3322
3323 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303324 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003325 return status;
3326 }
3327
3328 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303329 if (QDF_IS_STATUS_SUCCESS(status)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303330 if (CSR_IS_SESSION_VALID(pMac, sessionId))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003331 status = csr_roam_issue_disassociate_sta_cmd(pMac,
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05303332 sessionId, p_del_sta_params);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303333 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303334 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003335 sme_release_global_lock(&pMac->sme);
3336 }
3337
3338 return status;
3339}
3340
3341/**
3342 * sme_roam_deauth_sta() - deauthenticate a station
3343 * @hHal: Global structure
3344 * @sessionId: SessionId of SoftAP
3345 * @pDelStaParams: Pointer to parameters of the station to deauthenticate
3346 *
3347 * To disassociate a station. This is an asynchronous API.
3348 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303349 * Return: QDF_STATUS_SUCCESS on success or another QDF_STATUS error
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003350 * code on error. Roam callback will be called to indicate actual
3351 * result
3352 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303353QDF_STATUS sme_roam_deauth_sta(tHalHandle hHal, uint8_t sessionId,
Jeff Johnsone6bf7192017-11-07 15:16:09 -08003354 struct csr_del_sta_params *pDelStaParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003355{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303356 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003357 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3358
3359 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303360 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003361 return status;
3362 }
3363
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303364 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05303365 TRACE_CODE_SME_RX_HDD_MSG_DEAUTH_STA,
3366 sessionId, pDelStaParams->reason_code));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003367 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303368 if (QDF_IS_STATUS_SUCCESS(status)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303369 if (CSR_IS_SESSION_VALID(pMac, sessionId))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003370 status =
3371 csr_roam_issue_deauth_sta_cmd(pMac, sessionId,
3372 pDelStaParams);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303373 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303374 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003375 sme_release_global_lock(&pMac->sme);
3376 }
3377
3378 return status;
3379}
3380
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303381/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303382 * sme_roam_get_associated_stas() -
3383 * To probe the list of associated stations from various modules
3384 * of CORE stack.
3385 * This is an asynchronous API.
3386 *
3387 * sessionId - sessionId of SoftAP
3388 * modId - Module from whom list of associtated stations is
3389 * to be probed. If an invalid module is passed then
3390 * by default QDF_MODULE_ID_PE will be probed.
3391 * pUsrContext - Opaque HDD context
3392 * pfnSapEventCallback - Sap event callback in HDD
3393 * pAssocBuf - Caller allocated memory to be filled with associatd
3394 * stations info
3395 * Return QDF_STATUS
3396 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303397QDF_STATUS sme_roam_get_associated_stas(tHalHandle hHal, uint8_t sessionId,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303398 QDF_MODULE_ID modId, void *pUsrContext,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003399 void *pfnSapEventCallback,
3400 uint8_t *pAssocStasBuf)
3401{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303402 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003403 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3404
3405 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303406 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003407 return status;
3408 }
3409
3410 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303411 if (QDF_IS_STATUS_SUCCESS(status)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303412 if (CSR_IS_SESSION_VALID(pMac, sessionId))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003413 status =
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303414 csr_roam_get_associated_stas(pMac, sessionId,
3415 modId,
3416 pUsrContext,
3417 pfnSapEventCallback,
3418 pAssocStasBuf);
3419 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303420 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003421 sme_release_global_lock(&pMac->sme);
3422 }
3423
3424 return status;
3425}
3426
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303427/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303428 * sme_roam_get_connect_state() -
3429 * A wrapper function to request CSR to return the current connect state
3430 * of Roaming
3431 * This is a synchronous call.
3432 *
3433 * Return QDF_STATUS
3434 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303435QDF_STATUS sme_roam_get_connect_state(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003436 eCsrConnectState *pState)
3437{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303438 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003439 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3440
3441 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303442 if (QDF_IS_STATUS_SUCCESS(status)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303443 if (CSR_IS_SESSION_VALID(pMac, sessionId))
3444 status = csr_roam_get_connect_state(pMac, sessionId,
3445 pState);
3446 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303447 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003448 sme_release_global_lock(&pMac->sme);
3449 }
3450
3451 return status;
3452}
3453
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303454/*
3455 * sme_roam_get_connect_profile() -
3456 * A wrapper function to request CSR to return the current connect
3457 * profile. Caller must call csr_roam_free_connect_profile after it is done
3458 * and before reuse for another csr_roam_get_connect_profile call.
3459 * This is a synchronous call.
3460 *
3461 * pProfile - pointer to a caller allocated structure
3462 * tCsrRoamConnectedProfile
3463 * eturn QDF_STATUS. Failure if not connected
3464 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303465QDF_STATUS sme_roam_get_connect_profile(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003466 tCsrRoamConnectedProfile *pProfile)
3467{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303468 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003469 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3470
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303471 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003472 TRACE_CODE_SME_RX_HDD_ROAM_GET_CONNECTPROFILE,
3473 sessionId, 0));
3474 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303475 if (QDF_IS_STATUS_SUCCESS(status)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303476 if (CSR_IS_SESSION_VALID(pMac, sessionId))
3477 status = csr_roam_get_connect_profile(pMac, sessionId,
3478 pProfile);
3479 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303480 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003481 sme_release_global_lock(&pMac->sme);
3482 }
3483
3484 return status;
3485}
3486
Naveen Rawatdf0a7e72016-01-06 18:35:53 -08003487/**
3488 * sme_roam_free_connect_profile - a wrapper function to request CSR to free and
3489 * reinitialize the profile returned previously by csr_roam_get_connect_profile.
3490 *
3491 * @profile - pointer to a caller allocated structure tCsrRoamConnectedProfile
3492 *
3493 * Return: none
3494 */
3495void sme_roam_free_connect_profile(tCsrRoamConnectedProfile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003496{
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303497 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003498 TRACE_CODE_SME_RX_HDD_ROAM_FREE_CONNECTPROFILE,
3499 NO_SESSION, 0));
Naveen Rawatdf0a7e72016-01-06 18:35:53 -08003500 csr_roam_free_connect_profile(profile);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003501}
3502
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303503/*
3504 * sme_roam_set_pmkid_cache() -
3505 * A wrapper function to request CSR to return the PMKID candidate list
3506 * This is a synchronous call.
3507
3508 * pPMKIDCache - caller allocated buffer point to an array of
3509 * tPmkidCacheInfo
3510 * numItems - a variable that has the number of tPmkidCacheInfo
3511 * allocated when retruning, this is either the number needed
3512 * or number of items put into pPMKIDCache
3513 * update_entire_cache - this bool value specifies if the entire pmkid
3514 * cache should be overwritten or should it be
3515 * updated entry by entry.
3516 * Return QDF_STATUS - when fail, it usually means the buffer allocated is not
3517 * big enough and pNumItems has the number of
3518 * tPmkidCacheInfo.
3519 * \Note: pNumItems is a number of tPmkidCacheInfo,
3520 * not sizeof(tPmkidCacheInfo) * something
3521 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303522QDF_STATUS sme_roam_set_pmkid_cache(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003523 tPmkidCacheInfo *pPMKIDCache,
3524 uint32_t numItems, bool update_entire_cache)
3525{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303526 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003527 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3528
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303529 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003530 TRACE_CODE_SME_RX_HDD_ROAM_SET_PMKIDCACHE, sessionId,
3531 numItems));
3532 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303533 if (QDF_IS_STATUS_SUCCESS(status)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303534 if (CSR_IS_SESSION_VALID(pMac, sessionId))
3535 status = csr_roam_set_pmkid_cache(pMac, sessionId,
3536 pPMKIDCache,
3537 numItems, update_entire_cache);
3538 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303539 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003540 sme_release_global_lock(&pMac->sme);
3541 }
3542
3543 return status;
3544}
3545
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303546QDF_STATUS sme_roam_del_pmkid_from_cache(tHalHandle hHal, uint8_t sessionId,
Sridhar Selvarajc3684c72017-08-21 14:32:47 +05303547 tPmkidCacheInfo *pmksa,
3548 bool flush_cache)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003549{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303550 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003551 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05303552
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303553 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05303554 TRACE_CODE_SME_RX_HDD_ROAM_DEL_PMKIDCACHE,
3555 sessionId, flush_cache));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003556 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303557 if (QDF_IS_STATUS_SUCCESS(status)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303558 if (CSR_IS_SESSION_VALID(pMac, sessionId))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003559 status = csr_roam_del_pmkid_from_cache(pMac, sessionId,
Sridhar Selvarajc3684c72017-08-21 14:32:47 +05303560 pmksa, flush_cache);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303561 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303562 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003563 sme_release_global_lock(&pMac->sme);
3564 }
3565 return status;
3566}
3567
Abhinav Kumar7830d9c2018-06-27 17:57:48 +05303568#ifdef WLAN_FEATURE_ROAM_OFFLOAD
gaurank kathpalia99d06c12018-05-16 16:28:35 +05303569void sme_get_pmk_info(tHalHandle hal, uint8_t session_id,
3570 tPmkidCacheInfo *pmk_cache)
3571{
3572 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
3573 QDF_STATUS status = sme_acquire_global_lock(&mac_ctx->sme);
3574
3575 if (QDF_IS_STATUS_SUCCESS(status)) {
3576 if (CSR_IS_SESSION_VALID(mac_ctx, session_id))
3577 csr_get_pmk_info(mac_ctx, session_id, pmk_cache);
3578 sme_release_global_lock(&mac_ctx->sme);
3579 }
3580}
Abhinav Kumar7830d9c2018-06-27 17:57:48 +05303581#else
3582static inline
3583void sme_get_pmk_info(tHalHandle hal, uint8_t session_id,
3584 tPmkidCacheInfo *pmk_cache)
3585{}
3586#endif
3587
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003588#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303589/*
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003590 * \fn sme_roam_set_psk_pmk
3591 * \brief a wrapper function to request CSR to save PSK/PMK
3592 * This is a synchronous call.
3593 * \param hHal - Global structure
3594 * \param sessionId - SME sessionId
3595 * \param pPSK_PMK - pointer to an array of Psk[]/Pmk
3596 * \param pmk_len - Length could be only 16 bytes in case if LEAP
3597 * connections. Need to pass this information to
3598 * firmware.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303599 * \return QDF_STATUS -status whether PSK/PMK is set or not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003600 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303601QDF_STATUS sme_roam_set_psk_pmk(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003602 uint8_t *pPSK_PMK, size_t pmk_len)
3603{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303604 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003605 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303606
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003607 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303608 if (QDF_IS_STATUS_SUCCESS(status)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303609 if (CSR_IS_SESSION_VALID(pMac, sessionId))
3610 status = csr_roam_set_psk_pmk(pMac, sessionId, pPSK_PMK,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003611 pmk_len);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303612 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303613 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003614 sme_release_global_lock(&pMac->sme);
3615 }
3616 return status;
3617}
3618#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003619
Jeff Johnson0a078b52018-06-01 16:15:54 -07003620QDF_STATUS sme_roam_get_wpa_rsn_req_ie(tHalHandle hal, uint8_t session_id,
3621 uint32_t *len, uint8_t *buf)
3622{
3623 QDF_STATUS status;
3624 tpAniSirGlobal mac = PMAC_STRUCT(hal);
3625
3626 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303627 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson0a078b52018-06-01 16:15:54 -07003628 if (CSR_IS_SESSION_VALID(mac, session_id))
3629 status = csr_roam_get_wpa_rsn_req_ie(mac, session_id,
3630 len, buf);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303631 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303632 status = QDF_STATUS_E_INVAL;
Jeff Johnson0a078b52018-06-01 16:15:54 -07003633 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003634 }
3635
3636 return status;
3637}
3638
Jeff Johnson0a078b52018-06-01 16:15:54 -07003639QDF_STATUS sme_roam_get_wpa_rsn_rsp_ie(tHalHandle hal, uint8_t session_id,
3640 uint32_t *len, uint8_t *buf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003641{
Jeff Johnson0a078b52018-06-01 16:15:54 -07003642 QDF_STATUS status;
3643 tpAniSirGlobal mac = PMAC_STRUCT(hal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003644
Jeff Johnson0a078b52018-06-01 16:15:54 -07003645 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303646 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson0a078b52018-06-01 16:15:54 -07003647 if (CSR_IS_SESSION_VALID(mac, session_id))
3648 status = csr_roam_get_wpa_rsn_rsp_ie(mac, session_id,
3649 len, buf);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303650 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303651 status = QDF_STATUS_E_INVAL;
Jeff Johnson0a078b52018-06-01 16:15:54 -07003652 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003653 }
3654
3655 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003656}
3657
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303658/*
3659 * sme_roam_get_num_pmkid_cache() -
3660 * A wrapper function to request CSR to return number of PMKID cache
3661 * entries
3662 * This is a synchronous call.
3663 *
3664 * Return uint32_t - the number of PMKID cache entries
3665 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003666uint32_t sme_roam_get_num_pmkid_cache(tHalHandle hHal, uint8_t sessionId)
3667{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303668 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003669 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3670 uint32_t numPmkidCache = 0;
3671
3672 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303673 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003674 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
3675 numPmkidCache =
3676 csr_roam_get_num_pmkid_cache(pMac, sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303677 status = QDF_STATUS_SUCCESS;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303678 } else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303679 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003680 sme_release_global_lock(&pMac->sme);
3681 }
3682
3683 return numPmkidCache;
3684}
3685
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303686/*
3687 * sme_roam_get_pmkid_cache() -
3688 * A wrapper function to request CSR to return PMKID cache from CSR
3689 * This is a synchronous call.
3690 *
3691 * pNum - caller allocated memory that has the space of the number of
3692 * pBuf tPmkidCacheInfo as input. Upon returned, *pNum has the
3693 * needed or actually number in tPmkidCacheInfo.
3694 * pPmkidCache - Caller allocated memory that contains PMKID cache, if
3695 * any, upon return
3696 * Return QDF_STATUS - when fail, it usually means the buffer allocated is not
3697 * big enough
3698 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303699QDF_STATUS sme_roam_get_pmkid_cache(tHalHandle hHal, uint8_t sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303700 uint32_t *pNum, tPmkidCacheInfo *pPmkidCache)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003701{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303702 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003703 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3704
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303705 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003706 TRACE_CODE_SME_RX_HDD_ROAM_GET_PMKIDCACHE, sessionId,
3707 0));
3708 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303709 if (QDF_IS_STATUS_SUCCESS(status)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303710 if (CSR_IS_SESSION_VALID(pMac, sessionId))
3711 status = csr_roam_get_pmkid_cache(pMac, sessionId, pNum,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003712 pPmkidCache);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303713 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303714 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003715 sme_release_global_lock(&pMac->sme);
3716 }
3717
3718 return status;
3719}
3720
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303721/*
3722 * sme_get_config_param() -
3723 * A wrapper function that HDD calls to get the global settings
3724 * currently maintained by CSR.
3725 * This is a synchronous call.
3726 *
3727 * pParam - caller allocated memory
3728 * Return QDF_STATUS
3729 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303730QDF_STATUS sme_get_config_param(tHalHandle hHal, tSmeConfigParams *pParam)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003731{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303732 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003733 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3734
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303735 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003736 TRACE_CODE_SME_RX_HDD_GET_CONFIGPARAM, NO_SESSION, 0));
3737 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303738 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003739 status = csr_get_config_param(pMac, &pParam->csrConfig);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303740 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003741 sme_err("csr_get_config_param failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003742 sme_release_global_lock(&pMac->sme);
3743 return status;
3744 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303745 qdf_mem_copy(&pParam->rrmConfig,
Krunal Soni1878d3a2016-01-14 13:00:44 -08003746 &pMac->rrm.rrmSmeContext.rrmConfig,
3747 sizeof(pMac->rrm.rrmSmeContext.rrmConfig));
Kapil Guptaab7961d2017-06-06 13:54:09 +05303748 pParam->snr_monitor_enabled = pMac->snr_monitor_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003749 sme_release_global_lock(&pMac->sme);
3750 }
3751
3752 return status;
3753}
3754
3755/**
3756 * sme_cfg_set_int() - Sets the cfg parameter value.
3757 * @hal: Handle to hal.
3758 * @cfg_id: Configuration parameter ID.
Jeff Johnson560dc562017-03-17 15:19:31 -07003759 * @value: value to be saved in the cfg parameter.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003760 *
3761 * This function sets the string value in cfg parameter.
3762 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303763 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003764 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303765QDF_STATUS sme_cfg_set_int(tHalHandle hal, uint16_t cfg_id, uint32_t value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003766{
3767 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303768 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003769
Jeff Johnsonc09caa42018-06-07 22:58:55 -07003770 if (QDF_STATUS_SUCCESS != cfg_set_int(pmac, cfg_id, value))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303771 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003772
3773 return status;
3774}
3775
3776/**
3777 * sme_cfg_set_str() - Sets the cfg parameter string.
3778 * @hal: Handle to hal.
3779 * @cfg_id: Configuration parameter ID.
3780 * @str: Pointer to the string buffer.
3781 * @length: Length of the string.
3782 *
3783 * This function sets the string value in cfg parameter.
3784 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303785 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003786 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303787QDF_STATUS sme_cfg_set_str(tHalHandle hal, uint16_t cfg_id, uint8_t *str,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003788 uint32_t length)
3789{
3790 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303791 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003792
Jeff Johnsonc09caa42018-06-07 22:58:55 -07003793 if (QDF_STATUS_SUCCESS != cfg_set_str(pmac, cfg_id, str, length))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303794 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003795
3796 return status;
3797}
3798
3799/**
3800 * sme_cfg_get_int() - Gets the cfg parameter value.
3801 * @hal: Handle to hal.
3802 * @cfg_id: Configuration parameter ID.
3803 * @cfg_value: Pointer to variable in which cfg value
Jeff Johnson560dc562017-03-17 15:19:31 -07003804 * will be saved.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003805 *
3806 * This function gets the value of the cfg parameter.
3807 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303808 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003809 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303810QDF_STATUS sme_cfg_get_int(tHalHandle hal, uint16_t cfg_id, uint32_t *cfg_value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003811{
3812 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303813 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003814
Jeff Johnsonc09caa42018-06-07 22:58:55 -07003815 if (QDF_STATUS_SUCCESS != wlan_cfg_get_int(pmac, cfg_id, cfg_value))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303816 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003817
3818 return status;
3819}
3820
3821/**
3822 * sme_cfg_get_str() - Gets the cfg parameter string.
3823 * @hal: Handle to hal.
3824 * @cfg_id: Configuration parameter ID.
3825 * @str: Pointer to the string buffer.
3826 * @length: Pointer to length of the string.
3827 *
3828 * This function gets the string value of the cfg parameter.
3829 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303830 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003831 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303832QDF_STATUS sme_cfg_get_str(tHalHandle hal, uint16_t cfg_id, uint8_t *str,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003833 uint32_t *length)
3834{
3835 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303836 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003837
Jeff Johnsonc09caa42018-06-07 22:58:55 -07003838 if (QDF_STATUS_SUCCESS != wlan_cfg_get_str(pmac, cfg_id, str, length))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303839 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003840
3841 return status;
3842}
3843
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303844/*
3845 * sme_get_modify_profile_fields() -
3846 * HDD or SME - QOS calls this function to get the current values of
3847 * connected profile fields, changing which can cause reassoc.
3848 * This function must be called after CFG is downloaded and STA is in connected
3849 * state. Also, make sure to call this function to get the current profile
3850 * fields before calling the reassoc. So that pModifyProfileFields will have
3851 * all the latest values plus the one(s) has been updated as part of reassoc
3852 * request.
3853 *
3854 * pModifyProfileFields - pointer to the connected profile fields
3855 * changing which can cause reassoc
3856 * Return QDF_STATUS
3857 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303858QDF_STATUS sme_get_modify_profile_fields(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003859 tCsrRoamModifyProfileFields *
3860 pModifyProfileFields)
3861{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303862 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003863 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3864
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303865 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003866 TRACE_CODE_SME_RX_HDD_GET_MODPROFFIELDS, sessionId,
3867 0));
3868 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303869 if (QDF_IS_STATUS_SUCCESS(status)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303870 if (CSR_IS_SESSION_VALID(pMac, sessionId))
3871 status = csr_get_modify_profile_fields(pMac, sessionId,
3872 pModifyProfileFields);
3873 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303874 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003875 sme_release_global_lock(&pMac->sme);
3876 }
3877
3878 return status;
3879}
3880
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303881/*
3882 * sme_set_dhcp_till_power_active_flag() -
3883 * Sets/Clears DHCP related flag to disable/enable auto PS
3884 *
3885 * hal - The handle returned by mac_open.
3886 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003887void sme_set_dhcp_till_power_active_flag(tHalHandle hal, uint8_t flag)
3888{
3889 tpAniSirGlobal mac = PMAC_STRUCT(hal);
3890 struct ps_global_info *ps_global_info = &mac->sme.ps_global_info;
3891
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303892 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003893 TRACE_CODE_SME_RX_HDD_SET_DHCP_FLAG, NO_SESSION,
3894 flag));
3895 /* Set/Clear the DHCP flag which will disable/enable auto PS */
3896 ps_global_info->remain_in_power_active_till_dhcp = flag;
3897}
3898
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003899#ifdef FEATURE_OEM_DATA_SUPPORT
3900/**
3901 * sme_register_oem_data_rsp_callback() - Register a routine of
3902 * type send_oem_data_rsp_msg
3903 * @h_hal: Handle returned by mac_open.
3904 * @callback: Callback to send response
3905 * to oem application.
3906 *
3907 * sme_oem_data_rsp_callback is used to register sme_send_oem_data_rsp_msg
3908 * callback function.
3909 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303910 * Return: QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003911 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303912QDF_STATUS sme_register_oem_data_rsp_callback(tHalHandle h_hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003913 sme_send_oem_data_rsp_msg callback)
3914{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303915 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003916 tpAniSirGlobal pmac = PMAC_STRUCT(h_hal);
3917
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07003918 pmac->sme.oem_data_rsp_callback = callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003919
3920 return status;
3921
3922}
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303923
3924/**
3925 * sme_deregister_oem_data_rsp_callback() - De-register OEM datarsp callback
3926 * @h_hal: Handler return by mac_open
3927 * This function De-registers the OEM data response callback to SME
3928 *
3929 * Return: None
3930 */
3931void sme_deregister_oem_data_rsp_callback(tHalHandle h_hal)
3932{
3933 tpAniSirGlobal pmac;
3934
3935 if (!h_hal) {
3936 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
3937 FL("hHal is not valid"));
3938 return;
3939 }
3940 pmac = PMAC_STRUCT(h_hal);
3941
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07003942 pmac->sme.oem_data_rsp_callback = NULL;
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303943}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003944
3945/**
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003946 * sme_oem_update_capability() - update UMAC's oem related capability.
3947 * @hal: Handle returned by mac_open
3948 * @oem_cap: pointer to oem_capability
3949 *
3950 * This function updates OEM capability to UMAC. Currently RTT
3951 * related capabilities are updated. More capabilities can be
3952 * added in future.
3953 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303954 * Return: QDF_STATUS
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003955 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303956QDF_STATUS sme_oem_update_capability(tHalHandle hal,
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003957 struct sme_oem_capability *cap)
3958{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303959 QDF_STATUS status = QDF_STATUS_SUCCESS;
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003960 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
3961 uint8_t *bytes;
3962
3963 bytes = pmac->rrm.rrmSmeContext.rrmConfig.rm_capability;
3964
3965 if (cap->ftm_rr)
3966 bytes[4] |= RM_CAP_FTM_RANGE_REPORT;
3967 if (cap->lci_capability)
3968 bytes[4] |= RM_CAP_CIVIC_LOC_MEASUREMENT;
3969
3970 return status;
3971}
3972
3973/**
3974 * sme_oem_get_capability() - get oem capability
3975 * @hal: Handle returned by mac_open
3976 * @oem_cap: pointer to oem_capability
3977 *
3978 * This function is used to get the OEM capability from UMAC.
3979 * Currently RTT related capabilities are received. More
3980 * capabilities can be added in future.
3981 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303982 * Return: QDF_STATUS
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003983 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303984QDF_STATUS sme_oem_get_capability(tHalHandle hal,
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003985 struct sme_oem_capability *cap)
3986{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303987 QDF_STATUS status = QDF_STATUS_SUCCESS;
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003988 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
3989 uint8_t *bytes;
3990
3991 bytes = pmac->rrm.rrmSmeContext.rrmConfig.rm_capability;
3992
3993 cap->ftm_rr = bytes[4] & RM_CAP_FTM_RANGE_REPORT;
3994 cap->lci_capability = bytes[4] & RM_CAP_CIVIC_LOC_MEASUREMENT;
3995
3996 return status;
3997}
Naveen Rawat910726a2017-03-06 11:42:51 -08003998#endif
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003999
4000/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004001 * sme_roam_set_key() - To set encryption key.
4002 * @hal: hal global context
4003 * @session_id: session id
4004 * @set_key: pointer to a caller allocated object of tCsrSetContextInfo
4005 * @ptr_roam_id: Upon success return, this is the id caller can use to
4006 * identify the request in roamcallback
4007 *
4008 * This function should be called only when connected. This is an asynchronous
4009 * API.
4010 *
4011 * Return: Status of operation
4012 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304013QDF_STATUS sme_roam_set_key(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004014 tCsrRoamSetKey *set_key, uint32_t *ptr_roam_id)
4015{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304016 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004017 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
4018 uint32_t roam_id;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05304019 struct csr_roam_session *session = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004020 struct ps_global_info *ps_global_info = &mac_ctx->sme.ps_global_info;
4021
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304022 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_SET_KEY,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004023 session_id, 0));
4024 if (set_key->keyLength > CSR_MAX_KEY_LEN) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004025 sme_err("Invalid key length: %d", set_key->keyLength);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304026 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004027 }
4028 /*Once Setkey is done, we can go in BMPS */
4029 if (set_key->keyLength)
4030 ps_global_info->remain_in_power_active_till_dhcp = false;
4031
4032 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304033 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004034 return status;
4035
4036 roam_id = GET_NEXT_ROAM_ID(&mac_ctx->roam);
4037 if (ptr_roam_id)
4038 *ptr_roam_id = roam_id;
4039
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004040 sme_debug("keyLength: %d", set_key->keyLength);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004041
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004042 sme_debug("Session_id: %d roam_id: %d", session_id, roam_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004043 session = CSR_GET_SESSION(mac_ctx, session_id);
4044 if (!session) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004045 sme_err("session %d not found", session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004046 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304047 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004048 }
4049 if (CSR_IS_INFRA_AP(&session->connectedProfile)
4050 && set_key->keyDirection == eSIR_TX_DEFAULT) {
4051 if ((eCSR_ENCRYPT_TYPE_WEP40 == set_key->encType)
4052 || (eCSR_ENCRYPT_TYPE_WEP40_STATICKEY ==
4053 set_key->encType)) {
4054 session->pCurRoamProfile->negotiatedUCEncryptionType =
4055 eCSR_ENCRYPT_TYPE_WEP40_STATICKEY;
4056 }
4057 if ((eCSR_ENCRYPT_TYPE_WEP104 == set_key->encType)
4058 || (eCSR_ENCRYPT_TYPE_WEP104_STATICKEY ==
4059 set_key->encType)) {
4060 session->pCurRoamProfile->negotiatedUCEncryptionType =
4061 eCSR_ENCRYPT_TYPE_WEP104_STATICKEY;
4062 }
4063 }
4064 status = csr_roam_set_key(mac_ctx, session_id, set_key, roam_id);
4065 sme_release_global_lock(&mac_ctx->sme);
4066 return status;
4067}
4068
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05304069/**
4070 * sme_roam_set_default_key_index - To set default wep key idx
4071 * @hal: pointer to hal handler
4072 * @session_id: session id
4073 * @default_idx: default wep key index
4074 *
4075 * This function prepares a message and post to WMA to set wep default
4076 * key index
4077 *
4078 * Return: Success:QDF_STATUS_SUCCESS Failure: Error value
4079 */
4080QDF_STATUS sme_roam_set_default_key_index(tHalHandle hal, uint8_t session_id,
4081 uint8_t default_idx)
4082{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004083 struct scheduler_msg msg = {0};
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05304084 struct wep_update_default_key_idx *update_key;
4085
4086 update_key = qdf_mem_malloc(sizeof(*update_key));
Arif Hussain0ef77082018-10-10 16:42:53 -07004087 if (!update_key)
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05304088 return QDF_STATUS_E_NOMEM;
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05304089
4090 update_key->session_id = session_id;
4091 update_key->default_idx = default_idx;
4092
4093 msg.type = WMA_UPDATE_WEP_DEFAULT_KEY;
4094 msg.reserved = 0;
4095 msg.bodyptr = (void *)update_key;
4096
4097 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304098 scheduler_post_message(QDF_MODULE_ID_SME,
4099 QDF_MODULE_ID_WMA,
4100 QDF_MODULE_ID_WMA, &msg)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004101 sme_err("Failed to post WMA_UPDATE_WEP_DEFAULT_KEY to WMA");
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05304102 qdf_mem_free(update_key);
4103 return QDF_STATUS_E_FAILURE;
4104 }
4105
4106 return QDF_STATUS_SUCCESS;
4107}
4108
4109
Jeff Johnson8bd23352017-09-26 11:39:24 -07004110/**
4111 * sme_get_rssi() - API to retrieve current RSSI
4112 * @hHal: HAL handle for device
4113 * @callback: SME sends back the requested stats using the callback
4114 * @staId: The station ID for which the RSSI is requested for
4115 * @bssid: The bssid of the connected session
4116 * @lastRSSI: RSSI value at time of request. In case fw cannot provide
4117 * RSSI, do not hold up but return this value.
4118 * @pContext: user context to be passed back along with the callback
4119 *
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304120 * A wrapper function that client calls to register a callback to get RSSI
4121 *
Jeff Johnson8bd23352017-09-26 11:39:24 -07004122 * Return: QDF_STATUS
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304123 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304124QDF_STATUS sme_get_rssi(tHalHandle hHal,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304125 tCsrRssiCallback callback, uint8_t staId,
4126 struct qdf_mac_addr bssId, int8_t lastRSSI,
Jeff Johnson8bd23352017-09-26 11:39:24 -07004127 void *pContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004128{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304129 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004130 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4131
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304132 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004133 TRACE_CODE_SME_RX_HDD_GET_RSSI, NO_SESSION, 0));
4134 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304135 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004136 status = csr_get_rssi(pMac, callback,
4137 staId, bssId, lastRSSI,
Jeff Johnson8bd23352017-09-26 11:39:24 -07004138 pContext);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004139 sme_release_global_lock(&pMac->sme);
4140 }
4141 return status;
4142}
4143
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304144/*
4145 * sme_get_snr() -
4146 * A wrapper function that client calls to register a callback to get SNR
4147 *
4148 * callback - SME sends back the requested stats using the callback
4149 * staId - The station ID for which the stats is requested for
4150 * pContext - user context to be passed back along with the callback
4151 * p_cds_context - cds context
4152 * \return QDF_STATUS
4153 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304154QDF_STATUS sme_get_snr(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004155 tCsrSnrCallback callback,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304156 uint8_t staId, struct qdf_mac_addr bssId, void *pContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004157{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304158 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004159 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4160
4161 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304162 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004163 status = csr_get_snr(pMac, callback, staId, bssId, pContext);
4164 sme_release_global_lock(&pMac->sme);
4165 }
4166 return status;
4167}
4168
Naveen Rawatfa2a1002018-05-17 16:06:37 -07004169#ifndef QCA_SUPPORT_CP_STATS
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304170/*
4171 * sme_get_statistics() -
4172 * A wrapper function that client calls to register a callback to get
4173 * different PHY level statistics from CSR.
4174 *
4175 * requesterId - different client requesting for statistics,
4176 * HDD, UMA/GAN etc
4177 * statsMask - The different category/categories of stats requester
4178 * is looking for
4179 * callback - SME sends back the requested stats using the callback
4180 * periodicity - If requester needs periodic update in millisec, 0 means
4181 * it's an one time request
4182 * cache - If requester is happy with cached stats
4183 * staId - The station ID for which the stats is requested for
4184 * pContext - user context to be passed back along with the callback
4185 * sessionId - sme session interface
4186 * Return QDF_STATUS
4187 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304188QDF_STATUS sme_get_statistics(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004189 eCsrStatsRequesterType requesterId,
4190 uint32_t statsMask, tCsrStatsCallback callback,
Naveen Rawatd0ca4412017-06-16 14:19:19 -07004191 uint8_t staId, void *pContext, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004192{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304193 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004194 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4195
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004196 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304197 if (QDF_IS_STATUS_SUCCESS(status)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304198 status = csr_get_statistics(pMac, requesterId, statsMask,
4199 callback, staId, pContext,
4200 sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004201 sme_release_global_lock(&pMac->sme);
4202 }
4203
4204 return status;
4205
4206}
Naveen Rawatfa2a1002018-05-17 16:06:37 -07004207#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004208
Jeff Johnsonca7a7162018-07-07 12:56:54 -07004209QDF_STATUS sme_get_link_status(mac_handle_t mac_handle,
4210 csr_link_status_callback callback,
4211 void *context, uint8_t session_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004212{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304213 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnsonca7a7162018-07-07 12:56:54 -07004214 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
4215 tAniGetLinkStatus *msg;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004216 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004217
Jeff Johnsonca7a7162018-07-07 12:56:54 -07004218 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304219 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnsonca7a7162018-07-07 12:56:54 -07004220 msg = qdf_mem_malloc(sizeof(*msg));
4221 if (!msg) {
Jeff Johnsonca7a7162018-07-07 12:56:54 -07004222 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304223 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004224 }
4225
Jeff Johnsonca7a7162018-07-07 12:56:54 -07004226 msg->msgType = WMA_LINK_STATUS_GET_REQ;
4227 msg->msgLen = sizeof(*msg);
4228 msg->sessionId = session_id;
4229 mac->sme.link_status_context = context;
4230 mac->sme.link_status_callback = callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004231
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08004232 message.type = WMA_LINK_STATUS_GET_REQ;
Jeff Johnsonca7a7162018-07-07 12:56:54 -07004233 message.bodyptr = msg;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08004234 message.reserved = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004235
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304236 status = scheduler_post_message(QDF_MODULE_ID_SME,
4237 QDF_MODULE_ID_WMA,
4238 QDF_MODULE_ID_WMA, &message);
Jeff Johnsonca7a7162018-07-07 12:56:54 -07004239 if (QDF_IS_STATUS_ERROR(status)) {
4240 sme_err("post msg failed, %d", status);
4241 qdf_mem_free(msg);
4242 mac->sme.link_status_context = NULL;
4243 mac->sme.link_status_callback = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004244 }
4245
Jeff Johnsonca7a7162018-07-07 12:56:54 -07004246 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004247 }
4248
4249 return status;
4250}
4251
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304252/*
4253 * sme_get_country_code() -
4254 * To return the current country code. If no country code is applied,
4255 * default country code is used to fill the buffer.
4256 * If 11d supported is turned off, an error is return and the last
4257 * applied/default country code is used.
4258 * This is a synchronous API.
4259 *
4260 * pBuf - pointer to a caller allocated buffer for returned country code.
4261 * pbLen For input, this parameter indicates how big is the buffer.
4262 * Upon return, this parameter has the number of bytes for
4263 * country. If pBuf doesn't have enough space, this function
4264 * returns fail status and this parameter contains the number
4265 * that is needed.
4266 *
4267 * Return QDF_STATUS SUCCESS.
4268 *
4269 * FAILURE or RESOURCES The API finished and failed.
4270 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304271QDF_STATUS sme_get_country_code(tHalHandle hHal, uint8_t *pBuf, uint8_t *pbLen)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004272{
4273 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4274
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304275 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004276 TRACE_CODE_SME_RX_HDD_GET_CNTRYCODE, NO_SESSION, 0));
4277
4278 return csr_get_country_code(pMac, pBuf, pbLen);
4279}
4280
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004281/* some support functions */
4282bool sme_is11d_supported(tHalHandle hHal)
4283{
4284 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4285
Kiran Kumar Lokere3beeb952017-05-02 18:40:24 -07004286 return wlan_reg_11d_enabled_on_host(pMac->psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004287}
4288
4289bool sme_is11h_supported(tHalHandle hHal)
4290{
4291 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4292
4293 return csr_is11h_supported(pMac);
4294}
4295
4296bool sme_is_wmm_supported(tHalHandle hHal)
4297{
4298 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4299
4300 return csr_is_wmm_supported(pMac);
4301}
4302
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304303/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304304 * sme_generic_change_country_code() -
4305 * Change Country code from upperlayer during WLAN driver operation.
4306 * This is a synchronous API.
4307 *
4308 * hHal - The handle returned by mac_open.
4309 * pCountry New Country Code String
4310 * reg_domain regulatory domain
4311 * Return QDF_STATUS SUCCESS.
4312 * FAILURE or RESOURCES The API finished and failed.
4313 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304314QDF_STATUS sme_generic_change_country_code(tHalHandle hHal,
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07004315 uint8_t *pCountry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004316{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304317 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004318 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004319 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004320 tAniGenericChangeCountryCodeReq *pMsg;
4321
4322 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304323 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004324 "%s: pMac is null", __func__);
4325 return status;
4326 }
4327
4328 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304329 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304330 pMsg = qdf_mem_malloc(sizeof(tAniGenericChangeCountryCodeReq));
Arif Hussain0ef77082018-10-10 16:42:53 -07004331 if (!pMsg) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004332 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304333 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004334 }
4335
4336 pMsg->msgType = eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE;
4337 pMsg->msgLen =
4338 (uint16_t) sizeof(tAniGenericChangeCountryCodeReq);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304339 qdf_mem_copy(pMsg->countryCode, pCountry, 2);
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07004340 pMsg->countryCode[2] = ' ';
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004341
4342 msg.type = eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE;
4343 msg.bodyptr = pMsg;
4344 msg.reserved = 0;
4345
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304346 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304347 scheduler_post_message(QDF_MODULE_ID_SME,
4348 QDF_MODULE_ID_SME,
4349 QDF_MODULE_ID_SME, &msg)) {
4350 sme_err("sme_generic_change_country_code failed to post msg to self");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304351 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304352 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004353 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004354 sme_release_global_lock(&pMac->sme);
4355 }
4356
4357 return status;
4358}
4359
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304360/*
4361 * sme_dhcp_start_ind() -
4362 * API to signal the FW about the DHCP Start event.
4363 *
4364 * hHal - HAL handle for device.
4365 * device_mode - mode(AP,SAP etc) of the device.
4366 * macAddr - MAC address of the adapter.
4367 * sessionId - session ID.
4368 * Return QDF_STATUS SUCCESS.
4369 * FAILURE or RESOURCES The API finished and failed.
4370 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304371QDF_STATUS sme_dhcp_start_ind(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004372 uint8_t device_mode,
4373 uint8_t *macAddr, uint8_t sessionId)
4374{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304375 QDF_STATUS status;
4376 QDF_STATUS qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004377 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004378 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004379 tAniDHCPInd *pMsg;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05304380 struct csr_roam_session *pSession;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004381
4382 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304383 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004384 pSession = CSR_GET_SESSION(pMac, sessionId);
4385
4386 if (!pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004387 sme_err("Session: %d not found", sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004388 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304389 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004390 }
Arif Hussain3316f402016-11-10 13:08:03 -08004391 pSession->dhcp_done = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004392
Arif Hussain0ef77082018-10-10 16:42:53 -07004393 pMsg = qdf_mem_malloc(sizeof(tAniDHCPInd));
4394 if (!pMsg) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004395 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304396 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004397 }
4398 pMsg->msgType = WMA_DHCP_START_IND;
4399 pMsg->msgLen = (uint16_t) sizeof(tAniDHCPInd);
4400 pMsg->device_mode = device_mode;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304401 qdf_mem_copy(pMsg->adapterMacAddr.bytes, macAddr,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304402 QDF_MAC_ADDR_SIZE);
Anurag Chouhanc5548422016-02-24 18:33:27 +05304403 qdf_copy_macaddr(&pMsg->peerMacAddr,
Srinivas Girigowda296105a2015-09-24 16:31:16 -07004404 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004405
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08004406 message.type = WMA_DHCP_START_IND;
4407 message.bodyptr = pMsg;
4408 message.reserved = 0;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05304409 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08004410 sessionId, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304411 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
4412 QDF_MODULE_ID_WMA,
4413 QDF_MODULE_ID_WMA,
4414 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304415 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304416 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004417 "%s: Post DHCP Start MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304418 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304419 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004420 }
4421 sme_release_global_lock(&pMac->sme);
4422 }
4423 return status;
4424}
4425
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304426/*
4427 * sme_dhcp_stop_ind() -
4428 * API to signal the FW about the DHCP complete event.
4429 *
4430 * hHal - HAL handle for device.
4431 * device_mode - mode(AP, SAP etc) of the device.
4432 * macAddr - MAC address of the adapter.
4433 * sessionId - session ID.
4434 * Return QDF_STATUS SUCCESS.
4435 * FAILURE or RESOURCES The API finished and failed.
4436 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304437QDF_STATUS sme_dhcp_stop_ind(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004438 uint8_t device_mode,
4439 uint8_t *macAddr, uint8_t sessionId)
4440{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304441 QDF_STATUS status;
4442 QDF_STATUS qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004443 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004444 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004445 tAniDHCPInd *pMsg;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05304446 struct csr_roam_session *pSession;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004447
4448 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304449 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004450 pSession = CSR_GET_SESSION(pMac, sessionId);
4451
4452 if (!pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004453 sme_err("Session: %d not found", sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004454 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304455 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004456 }
Arif Hussain3316f402016-11-10 13:08:03 -08004457 pSession->dhcp_done = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004458
Arif Hussain0ef77082018-10-10 16:42:53 -07004459 pMsg = qdf_mem_malloc(sizeof(tAniDHCPInd));
4460 if (!pMsg) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004461 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304462 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004463 }
4464
4465 pMsg->msgType = WMA_DHCP_STOP_IND;
4466 pMsg->msgLen = (uint16_t) sizeof(tAniDHCPInd);
4467 pMsg->device_mode = device_mode;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304468 qdf_mem_copy(pMsg->adapterMacAddr.bytes, macAddr,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304469 QDF_MAC_ADDR_SIZE);
Anurag Chouhanc5548422016-02-24 18:33:27 +05304470 qdf_copy_macaddr(&pMsg->peerMacAddr,
Srinivas Girigowda296105a2015-09-24 16:31:16 -07004471 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004472
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08004473 message.type = WMA_DHCP_STOP_IND;
4474 message.bodyptr = pMsg;
4475 message.reserved = 0;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05304476 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08004477 sessionId, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304478 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
4479 QDF_MODULE_ID_WMA,
4480 QDF_MODULE_ID_WMA,
4481 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304482 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304483 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004484 "%s: Post DHCP Stop MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304485 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304486 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004487 }
4488
4489 sme_release_global_lock(&pMac->sme);
4490 }
4491 return status;
4492}
4493
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304494/*
4495 * sme_TXFailMonitorStopInd() -
4496 * API to signal the FW to start monitoring TX failures
4497 *
4498 * Return QDF_STATUS SUCCESS.
4499 * FAILURE or RESOURCES The API finished and failed.
4500 */
4501QDF_STATUS sme_tx_fail_monitor_start_stop_ind(tHalHandle hHal, uint8_t
4502 tx_fail_count,
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08004503 void *txFailIndCallback)
4504{
4505 QDF_STATUS status;
4506 QDF_STATUS qdf_status;
4507 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004508 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08004509 tAniTXFailMonitorInd *pMsg;
4510
4511 status = sme_acquire_global_lock(&pMac->sme);
4512 if (QDF_STATUS_SUCCESS == status) {
Arif Hussain0ef77082018-10-10 16:42:53 -07004513 pMsg = qdf_mem_malloc(sizeof(tAniTXFailMonitorInd));
4514 if (!pMsg) {
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08004515 sme_release_global_lock(&pMac->sme);
4516 return QDF_STATUS_E_NOMEM;
4517 }
4518
4519 pMsg->msgType = WMA_TX_FAIL_MONITOR_IND;
4520 pMsg->msgLen = (uint16_t) sizeof(tAniTXFailMonitorInd);
4521
4522 /* tx_fail_count = 0 should disable the Monitoring in FW */
4523 pMsg->tx_fail_count = tx_fail_count;
4524 pMsg->txFailIndCallback = txFailIndCallback;
4525
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08004526 message.type = WMA_TX_FAIL_MONITOR_IND;
4527 message.bodyptr = pMsg;
4528 message.reserved = 0;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08004529
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304530 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
4531 QDF_MODULE_ID_WMA,
4532 QDF_MODULE_ID_WMA,
4533 &message);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08004534 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
4535 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
4536 "%s: Post TX Fail monitor Start MSG fail",
4537 __func__);
4538 qdf_mem_free(pMsg);
4539 status = QDF_STATUS_E_FAILURE;
4540 }
4541 sme_release_global_lock(&pMac->sme);
4542 }
4543 return status;
4544}
4545
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304546/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304547 * sme_neighbor_report_request() -
4548 * API to request neighbor report.
4549 *
4550 * hHal - The handle returned by mac_open.
4551 * pRrmNeighborReq - Pointer to a caller allocated object of type
4552 * tRrmNeighborReq. Caller owns the memory and is
4553 * responsible for freeing it.
4554 * Return QDF_STATUS
4555 * QDF_STATUS_E_FAILURE - failure
4556 * QDF_STATUS_SUCCESS success
4557 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304558QDF_STATUS sme_neighbor_report_request(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004559 tpRrmNeighborReq pRrmNeighborReq,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304560 tpRrmNeighborRspCallbackInfo callbackInfo)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004561{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304562 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004563 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304564
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304565 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004566 TRACE_CODE_SME_RX_HDD_NEIGHBOR_REPORTREQ, NO_SESSION,
4567 0));
4568
Vignesh Viswanathan694e28e2018-01-18 20:53:57 +05304569 if (pRrmNeighborReq->neighbor_report_offload) {
4570 status = csr_invoke_neighbor_report_request(sessionId,
4571 pRrmNeighborReq,
4572 false);
4573 return status;
4574 }
4575
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304576 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004577 status =
Jeff Johnsoned3de522018-06-10 18:27:51 -07004578 sme_rrm_neighbor_report_request(pMac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304579 pRrmNeighborReq, callbackInfo);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004580 sme_release_global_lock(&pMac->sme);
4581 }
4582
4583 return status;
4584}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004585
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304586/*
4587 * sme_get_wcnss_wlan_compiled_version() -
4588 * This API returns the version of the WCNSS WLAN API with
4589 * which the HOST driver was built
4590 *
4591 * hHal - The handle returned by mac_open.
4592 * pVersion - Points to the Version structure to be filled
4593 * Return QDF_STATUS
4594 * QDF_STATUS_E_INVAL - failure
4595 * QDF_STATUS_SUCCESS success
4596 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304597QDF_STATUS sme_get_wcnss_wlan_compiled_version(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004598 tSirVersionType *pVersion)
4599{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304600 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004601 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4602
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304603 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004604 if (pVersion != NULL)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304605 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004606 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304607 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004608
4609 sme_release_global_lock(&pMac->sme);
4610 }
4611
4612 return status;
4613}
4614
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304615/*
4616 * sme_get_wcnss_wlan_reported_version() -
4617 * This API returns the version of the WCNSS WLAN API with
4618 * which the WCNSS driver reports it was built
4619 * hHal - The handle returned by mac_open.
4620 * pVersion - Points to the Version structure to be filled
4621 * Return QDF_STATUS
4622 * QDF_STATUS_E_INVAL - failure
4623 * QDF_STATUS_SUCCESS success
4624 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304625QDF_STATUS sme_get_wcnss_wlan_reported_version(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004626 tSirVersionType *pVersion)
4627{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304628 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004629 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4630
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304631 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004632 if (pVersion != NULL)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304633 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004634 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304635 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004636
4637 sme_release_global_lock(&pMac->sme);
4638 }
4639
4640 return status;
4641}
4642
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304643/*
4644 * sme_get_wcnss_software_version() -
4645 * This API returns the version string of the WCNSS driver
4646 *
4647 * hHal - The handle returned by mac_open.
4648 * pVersion - Points to the Version string buffer to be filled
4649 * versionBufferSize - THe size of the Version string buffer
4650 * Return QDF_STATUS
4651 * QDF_STATUS_E_INVAL - failure
4652 * QDF_STATUS_SUCCESS success
4653 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304654QDF_STATUS sme_get_wcnss_software_version(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004655 uint8_t *pVersion,
4656 uint32_t versionBufferSize)
4657{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304658 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004659 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004660
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304661 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304662 if (pVersion != NULL)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004663 status =
Jeff Johnsonabb74042017-08-31 11:44:55 -07004664 wma_get_wcnss_software_version(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004665 pVersion,
4666 versionBufferSize);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304667 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304668 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004669 sme_release_global_lock(&pMac->sme);
4670 }
4671
4672 return status;
4673}
4674
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304675/*
4676 * sme_get_wcnss_hardware_version() -
4677 * This API returns the version string of the WCNSS hardware
4678 *
4679 * hHal - The handle returned by mac_open.
4680 * pVersion - Points to the Version string buffer to be filled
4681 * versionBufferSize - THe size of the Version string buffer
4682 * Return QDF_STATUS
4683 * QDF_STATUS_E_INVAL - failure
4684 * QDF_STATUS_SUCCESS success
4685 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304686QDF_STATUS sme_get_wcnss_hardware_version(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004687 uint8_t *pVersion,
4688 uint32_t versionBufferSize)
4689{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304690 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004691 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4692
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304693 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004694 if (pVersion != NULL)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304695 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004696 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304697 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004698
4699 sme_release_global_lock(&pMac->sme);
4700 }
4701
4702 return status;
4703}
4704
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004705#ifdef FEATURE_OEM_DATA_SUPPORT
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07004706/**
4707 * sme_oem_data_req() - send oem data request to WMA
4708 * @hal: HAL handle
4709 * @hdd_oem_req: OEM data request from HDD
4710 *
4711 * Return: QDF_STATUS
4712 */
Krishna Kumaar Natarajanc1fa17d2016-08-03 14:19:20 -07004713QDF_STATUS sme_oem_data_req(tHalHandle hal, struct oem_data_req *hdd_oem_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004714{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304715 QDF_STATUS status = QDF_STATUS_SUCCESS;
Krishna Kumaar Natarajanc1fa17d2016-08-03 14:19:20 -07004716 struct oem_data_req *oem_data_req;
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07004717 void *wma_handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004718
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004719 SME_ENTER();
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07004720 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
4721 if (!wma_handle) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004722 sme_err("wma_handle is NULL");
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07004723 return QDF_STATUS_E_FAILURE;
4724 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004725
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07004726 oem_data_req = qdf_mem_malloc(sizeof(*oem_data_req));
Arif Hussain0ef77082018-10-10 16:42:53 -07004727 if (!oem_data_req)
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07004728 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004729
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07004730 oem_data_req->data_len = hdd_oem_req->data_len;
4731 oem_data_req->data = qdf_mem_malloc(oem_data_req->data_len);
Arif Hussain0ef77082018-10-10 16:42:53 -07004732 if (!oem_data_req->data)
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07004733 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004734
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07004735 qdf_mem_copy(oem_data_req->data, hdd_oem_req->data,
4736 oem_data_req->data_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004737
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07004738 status = wma_start_oem_data_req(wma_handle, oem_data_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004739
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304740 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004741 sme_err("Post oem data request msg fail");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304742 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004743 sme_debug("OEM request(length: %d) sent to WMA",
4744 oem_data_req->data_len);
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07004745
4746 if (oem_data_req->data_len)
4747 qdf_mem_free(oem_data_req->data);
4748 qdf_mem_free(oem_data_req);
4749
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004750 SME_EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004751 return status;
4752}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004753#endif /*FEATURE_OEM_DATA_SUPPORT */
4754
Krunal Soni8d184fa2017-11-20 21:52:05 -08004755QDF_STATUS sme_open_session(tHalHandle hal, struct sme_session_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004756{
Arif Hussainee677012017-01-26 17:50:13 -08004757 QDF_STATUS status = QDF_STATUS_E_INVAL;
Krunal Soni8d184fa2017-11-20 21:52:05 -08004758 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Arif Hussainee677012017-01-26 17:50:13 -08004759 struct cdp_pdev *pdev;
4760 ol_txrx_peer_handle peer;
4761 uint8_t peer_id;
Krishna Kumaar Natarajanb9e1d712017-06-20 17:14:37 -07004762 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004763
Abhishek Singhe4a1f882017-08-10 17:59:44 +05304764 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
Rajeev Kumar7414c8c2017-04-06 15:42:52 -07004765 "%s: type=%d, session_id %d subType=%d addr:%pM",
Krunal Soni8d184fa2017-11-20 21:52:05 -08004766 __func__, params->type_of_persona,
4767 params->sme_session_id, params->subtype_of_persona,
4768 params->self_mac_addr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004769
Arif Hussainee677012017-01-26 17:50:13 -08004770 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
4771
4772 if (NULL == pdev) {
4773 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
4774 "%s: Failed to get pdev handler", __func__);
4775 return status;
4776 }
4777
Krunal Soni8d184fa2017-11-20 21:52:05 -08004778 status = sme_acquire_global_lock(&mac_ctx->sme);
Dustin Brownd28772b2017-03-17 14:16:07 -07004779 if (QDF_IS_STATUS_ERROR(status))
4780 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004781
Krunal Soni8d184fa2017-11-20 21:52:05 -08004782 peer = cdp_peer_find_by_addr(soc, pdev, params->self_mac_addr,
4783 &peer_id);
Arif Hussainee677012017-01-26 17:50:13 -08004784 if (peer) {
4785 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
4786 "%s: Peer=%d exist with same MAC",
4787 __func__, peer_id);
4788 status = QDF_STATUS_E_INVAL;
4789 } else {
Krunal Soni8d184fa2017-11-20 21:52:05 -08004790 status = csr_roam_open_session(mac_ctx, params);
Arif Hussainee677012017-01-26 17:50:13 -08004791 }
Krunal Soni8d184fa2017-11-20 21:52:05 -08004792 sme_release_global_lock(&mac_ctx->sme);
Dustin Brownd28772b2017-03-17 14:16:07 -07004793
4794 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_OPEN_SESSION,
Krunal Soni8d184fa2017-11-20 21:52:05 -08004795 params->sme_session_id, 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004796
4797 return status;
4798}
4799
Krunal Soni8d184fa2017-11-20 21:52:05 -08004800QDF_STATUS sme_close_session(tHalHandle hal, uint8_t session_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004801{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304802 QDF_STATUS status;
Krunal Soni8d184fa2017-11-20 21:52:05 -08004803 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004804
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304805 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Krunal Soni8d184fa2017-11-20 21:52:05 -08004806 TRACE_CODE_SME_RX_HDD_CLOSE_SESSION, session_id, 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004807 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304808 if (QDF_IS_STATUS_SUCCESS(status)) {
Krunal Soni8d184fa2017-11-20 21:52:05 -08004809 status = csr_roam_close_session(pMac, session_id, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004810 sme_release_global_lock(&pMac->sme);
4811 }
4812
4813 return status;
4814}
4815
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304816/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304817 * sme_change_mcc_beacon_interval() -
4818 * To update P2P-GO beaconInterval. This function should be called after
4819 * disassociating all the station is done
4820 * This is an asynchronous API.
4821 *
4822 * @sessionId: Session Identifier
4823 * Return QDF_STATUS SUCCESS
4824 * FAILURE or RESOURCES
4825 * The API finished and failed.
4826 */
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07004827QDF_STATUS sme_change_mcc_beacon_interval(uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004828{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304829 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07004830 tpAniSirGlobal mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004831
Krunal Soni3fa80e22018-01-09 14:16:02 -08004832 if (!mac_ctx) {
4833 sme_err("mac_ctx is NULL");
4834 return status;
4835 }
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07004836 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304837 if (QDF_IS_STATUS_SUCCESS(status)) {
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07004838 status = csr_send_chng_mcc_beacon_interval(mac_ctx,
4839 sessionId);
4840 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004841 }
4842 return status;
4843}
4844
4845/**
4846 * sme_set_host_offload(): API to set the host offload feature.
4847 * @hHal: The handle returned by mac_open.
4848 * @sessionId: Session Identifier
4849 * @request: Pointer to the offload request.
4850 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304851 * Return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004852 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304853QDF_STATUS sme_set_host_offload(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004854 tpSirHostOffloadReq request)
4855{
4856 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304857 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004858
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304859 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004860 TRACE_CODE_SME_RX_HDD_SET_HOSTOFFLOAD, sessionId, 0));
4861 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304862 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004863#ifdef WLAN_NS_OFFLOAD
4864 if (SIR_IPV6_NS_OFFLOAD == request->offloadType) {
4865 status = sme_set_ps_ns_offload(hHal, request,
4866 sessionId);
4867 } else
4868#endif /* WLAN_NS_OFFLOAD */
4869 {
4870 status = sme_set_ps_host_offload(hHal, request,
4871 sessionId);
4872 }
4873 sme_release_global_lock(&pMac->sme);
4874 }
4875
4876 return status;
4877}
4878
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304879/*
4880 * sme_set_keep_alive() -
4881 * API to set the Keep Alive feature.
4882 *
4883 * hHal - The handle returned by mac_open.
4884 * request - Pointer to the Keep Alive request.
4885 * Return QDF_STATUS
4886 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304887QDF_STATUS sme_set_keep_alive(tHalHandle hHal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004888 tpSirKeepAliveReq request)
4889{
4890 tpSirKeepAliveReq request_buf;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004891 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004892 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05304893 struct csr_roam_session *pSession = CSR_GET_SESSION(pMac, session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004894
Abhishek Singhe4a1f882017-08-10 17:59:44 +05304895 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004896 FL("WMA_SET_KEEP_ALIVE message"));
4897
4898 if (pSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304899 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004900 FL("Session not Found"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304901 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004902 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304903 request_buf = qdf_mem_malloc(sizeof(tSirKeepAliveReq));
Arif Hussain0ef77082018-10-10 16:42:53 -07004904 if (!request_buf)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304905 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004906
Anurag Chouhanc5548422016-02-24 18:33:27 +05304907 qdf_copy_macaddr(&request->bssid, &pSession->connectedProfile.bssid);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304908 qdf_mem_copy(request_buf, request, sizeof(tSirKeepAliveReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004909
Abhishek Singhe4a1f882017-08-10 17:59:44 +05304910 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004911 "buff TP %d input TP %d ", request_buf->timePeriod,
4912 request->timePeriod);
4913 request_buf->sessionId = session_id;
4914
4915 msg.type = WMA_SET_KEEP_ALIVE;
4916 msg.reserved = 0;
4917 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05304918 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
4919 session_id, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304920 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304921 scheduler_post_message(QDF_MODULE_ID_SME,
4922 QDF_MODULE_ID_WMA,
4923 QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304924 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304925 "Not able to post WMA_SET_KEEP_ALIVE message to WMA");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304926 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304927 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004928 }
4929
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304930 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004931}
4932
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304933/*
4934 * sme_get_operation_channel() -
4935 * API to get current channel on which STA is parked his function gives
4936 * channel information only of infra station or IBSS station
4937 *
4938 * hHal, pointer to memory location and sessionId
4939 * Returns QDF_STATUS_SUCCESS
4940 * QDF_STATUS_E_FAILURE
4941 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304942QDF_STATUS sme_get_operation_channel(tHalHandle hHal, uint32_t *pChannel,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004943 uint8_t sessionId)
4944{
4945 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05304946 struct csr_roam_session *pSession;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004947
4948 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4949 pSession = CSR_GET_SESSION(pMac, sessionId);
4950
4951 if ((pSession->connectedProfile.BSSType ==
4952 eCSR_BSS_TYPE_INFRASTRUCTURE)
4953 || (pSession->connectedProfile.BSSType ==
4954 eCSR_BSS_TYPE_IBSS)
4955 || (pSession->connectedProfile.BSSType ==
4956 eCSR_BSS_TYPE_INFRA_AP)
4957 || (pSession->connectedProfile.BSSType ==
4958 eCSR_BSS_TYPE_START_IBSS)) {
4959 *pChannel = pSession->connectedProfile.operationChannel;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304960 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004961 }
4962 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304963 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004964} /* sme_get_operation_channel ends here */
4965
Abhishek Singh7996eb72015-12-30 17:24:02 +05304966/**
4967 * sme_register_mgmt_frame_ind_callback() - Register a callback for
4968 * management frame indication to PE.
4969 *
4970 * @hal: hal pointer
4971 * @callback: callback pointer to be registered
4972 *
4973 * This function is used to register a callback for management
4974 * frame indication to PE.
4975 *
4976 * Return: Success if msg is posted to PE else Failure.
4977 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304978QDF_STATUS sme_register_mgmt_frame_ind_callback(tHalHandle hal,
Abhishek Singh7996eb72015-12-30 17:24:02 +05304979 sir_mgmt_frame_ind_callback callback)
4980{
4981 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
4982 struct sir_sme_mgmt_frame_cb_req *msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304983 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh7996eb72015-12-30 17:24:02 +05304984
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304985 if (QDF_STATUS_SUCCESS ==
Abhishek Singh7996eb72015-12-30 17:24:02 +05304986 sme_acquire_global_lock(&mac_ctx->sme)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304987 msg = qdf_mem_malloc(sizeof(*msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07004988 if (!msg) {
Abhishek Singh7996eb72015-12-30 17:24:02 +05304989 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304990 return QDF_STATUS_E_NOMEM;
Abhishek Singh7996eb72015-12-30 17:24:02 +05304991 }
Abhishek Singh7996eb72015-12-30 17:24:02 +05304992 msg->message_type = eWNI_SME_REGISTER_MGMT_FRAME_CB;
4993 msg->length = sizeof(*msg);
4994
4995 msg->callback = callback;
Rajeev Kumard138ac52017-01-30 18:38:37 -08004996 status = umac_send_mb_message_to_mac(msg);
Abhishek Singh7996eb72015-12-30 17:24:02 +05304997 sme_release_global_lock(&mac_ctx->sme);
4998 return status;
4999 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305000 return QDF_STATUS_E_FAILURE;
Abhishek Singh7996eb72015-12-30 17:24:02 +05305001}
5002
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305003/*
5004 * sme_RegisterMgtFrame() -
Jeff Johnson698eacd2018-05-12 17:00:03 -07005005 * To register management frame of specified type and subtype.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305006 *
5007 * frameType - type of the frame that needs to be passed to HDD.
5008 * matchData - data which needs to be matched before passing frame
5009 * to HDD.
5010 * matchDataLen - Length of matched data.
5011 * Return QDF_STATUS
5012 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305013QDF_STATUS sme_register_mgmt_frame(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005014 uint16_t frameType, uint8_t *matchData,
5015 uint16_t matchLen)
5016{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305017 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005018 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5019
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005020 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305021 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005022 tSirRegisterMgmtFrame *pMsg;
5023 uint16_t len;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05305024 struct csr_roam_session *pSession = CSR_GET_SESSION(pMac,
5025 sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005026
5027 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005028 sme_err("Session %d not found", sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005029 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305030 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005031 }
5032
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305033 if (!CSR_IS_SESSION_ANY(sessionId) &&
5034 !pSession->sessionActive) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305035 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005036 "%s Invalid Sessionid", __func__);
5037 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305038 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005039 }
5040
5041 len = sizeof(tSirRegisterMgmtFrame) + matchLen;
5042
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305043 pMsg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005044 if (NULL == pMsg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305045 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005046 else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005047 pMsg->messageType = eWNI_SME_REGISTER_MGMT_FRAME_REQ;
5048 pMsg->length = len;
5049 pMsg->sessionId = sessionId;
5050 pMsg->registerFrame = true;
5051 pMsg->frameType = frameType;
5052 pMsg->matchLen = matchLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305053 qdf_mem_copy(pMsg->matchData, matchData, matchLen);
Rajeev Kumard138ac52017-01-30 18:38:37 -08005054 status = umac_send_mb_message_to_mac(pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005055 }
5056 sme_release_global_lock(&pMac->sme);
5057 }
5058 return status;
5059}
5060
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305061/*
5062 * sme_DeregisterMgtFrame() -
Jeff Johnson698eacd2018-05-12 17:00:03 -07005063 * To De-register management frame of specified type and subtype.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305064 *
5065 * frameType - type of the frame that needs to be passed to HDD.
5066 * matchData - data which needs to be matched before passing frame
5067 * to HDD.
5068 * matchDataLen - Length of matched data.
5069 * Return QDF_STATUS
5070 */
5071QDF_STATUS sme_deregister_mgmt_frame(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005072 uint16_t frameType, uint8_t *matchData,
5073 uint16_t matchLen)
5074{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305075 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005076 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5077
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305078 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005079 TRACE_CODE_SME_RX_HDD_DEREGISTER_MGMTFR, sessionId,
5080 0));
5081 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305082 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005083 tSirRegisterMgmtFrame *pMsg;
5084 uint16_t len;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05305085 struct csr_roam_session *pSession = CSR_GET_SESSION(pMac,
5086 sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005087
5088 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005089 sme_err("Session %d not found", sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005090 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305091 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005092 }
5093
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305094 if (!CSR_IS_SESSION_ANY(sessionId) &&
5095 !pSession->sessionActive) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305096 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005097 "%s Invalid Sessionid", __func__);
5098 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305099 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005100 }
5101
5102 len = sizeof(tSirRegisterMgmtFrame) + matchLen;
5103
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305104 pMsg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005105 if (NULL == pMsg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305106 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005107 else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005108 pMsg->messageType = eWNI_SME_REGISTER_MGMT_FRAME_REQ;
5109 pMsg->length = len;
5110 pMsg->registerFrame = false;
5111 pMsg->frameType = frameType;
5112 pMsg->matchLen = matchLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305113 qdf_mem_copy(pMsg->matchData, matchData, matchLen);
Rajeev Kumard138ac52017-01-30 18:38:37 -08005114 status = umac_send_mb_message_to_mac(pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005115 }
5116 sme_release_global_lock(&pMac->sme);
5117 }
5118 return status;
5119}
5120
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05305121/**
5122 * sme_prepare_mgmt_tx() - Prepares mgmt frame
5123 * @hal: The handle returned by mac_open
5124 * @session_id: session id
5125 * @buf: pointer to frame
5126 * @len: frame length
5127 *
5128 * Return: QDF_STATUS
5129 */
5130static QDF_STATUS sme_prepare_mgmt_tx(tHalHandle hal, uint8_t session_id,
5131 const uint8_t *buf, uint32_t len)
5132{
5133 QDF_STATUS status = QDF_STATUS_SUCCESS;
5134 struct sir_mgmt_msg *msg;
5135 uint16_t msg_len;
5136 struct scheduler_msg sch_msg = {0};
5137
5138 sme_debug("prepares auth frame");
5139
5140 msg_len = sizeof(*msg) + len;
5141 msg = qdf_mem_malloc(msg_len);
5142 if (msg == NULL) {
5143 status = QDF_STATUS_E_NOMEM;
5144 } else {
5145 msg->type = eWNI_SME_SEND_MGMT_FRAME_TX;
5146 msg->msg_len = msg_len;
5147 msg->session_id = session_id;
5148 msg->data = (uint8_t *)msg + sizeof(*msg);
5149 qdf_mem_copy(msg->data, buf, len);
5150
5151 sch_msg.type = eWNI_SME_SEND_MGMT_FRAME_TX;
5152 sch_msg.bodyptr = msg;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305153 status = scheduler_post_message(QDF_MODULE_ID_SME,
5154 QDF_MODULE_ID_PE,
5155 QDF_MODULE_ID_PE, &sch_msg);
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05305156 }
5157 return status;
5158}
5159
5160QDF_STATUS sme_send_mgmt_tx(tHalHandle hal, uint8_t session_id,
5161 const uint8_t *buf, uint32_t len)
5162{
5163 QDF_STATUS status = QDF_STATUS_SUCCESS;
5164 tpAniSirGlobal mac = PMAC_STRUCT(hal);
5165
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05305166 status = sme_acquire_global_lock(&mac->sme);
5167 if (QDF_IS_STATUS_SUCCESS(status)) {
5168 status = sme_prepare_mgmt_tx(hal, session_id, buf, len);
5169 sme_release_global_lock(&mac->sme);
5170 }
5171
5172 return status;
5173}
5174
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005175#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07005176/**
5177 * sme_configure_ext_wow() - configure Extr WoW
5178 * @hHal - The handle returned by mac_open.
5179 * @wlanExtParams - Depicts the wlan Ext params.
5180 * @callback - ext_wow callback to be registered.
5181 * @callback_context - ext_wow callback context
5182 *
5183 * SME will pass this request to lower mac to configure Extr WoW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305184 * Return: QDF_STATUS
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07005185 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305186QDF_STATUS sme_configure_ext_wow(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005187 tpSirExtWoWParams wlanExtParams,
5188 csr_readyToExtWoWCallback callback,
5189 void *callback_context)
5190{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305191 QDF_STATUS status = QDF_STATUS_SUCCESS;
5192 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005193 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005194 struct scheduler_msg message = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305195 tpSirExtWoWParams MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005196
5197 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305198 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005199
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305200 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005201 TRACE_CODE_SME_RX_HDD_CONFIG_EXTWOW, NO_SESSION, 0));
5202
5203 pMac->readyToExtWoWCallback = callback;
5204 pMac->readyToExtWoWContext = callback_context;
5205
5206 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305207 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005208
5209 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305210 qdf_mem_copy(MsgPtr, wlanExtParams, sizeof(*MsgPtr));
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08005211 message.bodyptr = MsgPtr;
5212 message.type = WMA_WLAN_EXT_WOW;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305213 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
5214 QDF_MODULE_ID_WMA,
5215 QDF_MODULE_ID_WMA,
5216 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305217 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005218 pMac->readyToExtWoWCallback = NULL;
5219 pMac->readyToExtWoWContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305220 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305221 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005222 }
5223 sme_release_global_lock(&pMac->sme);
5224 } else {
5225 pMac->readyToExtWoWCallback = NULL;
5226 pMac->readyToExtWoWContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305227 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005228 }
5229
5230 return status;
5231}
5232
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305233/*
5234 * sme_configure_app_type1_params() -
5235 * SME will pass this request to lower mac to configure Indoor WoW parameters.
5236 *
5237 * hHal - The handle returned by mac_open.
5238 * wlanAppType1Params- Depicts the wlan App Type 1(Indoor) params
5239 * Return QDF_STATUS
5240 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305241QDF_STATUS sme_configure_app_type1_params(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005242 tpSirAppType1Params wlanAppType1Params)
5243{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305244 QDF_STATUS status = QDF_STATUS_SUCCESS;
5245 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005246 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005247 struct scheduler_msg message = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305248 tpSirAppType1Params MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005249
5250 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305251 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005252
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305253 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005254 TRACE_CODE_SME_RX_HDD_CONFIG_APP_TYPE1, NO_SESSION,
5255 0));
5256
5257 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305258 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005259 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305260 qdf_mem_copy(MsgPtr, wlanAppType1Params, sizeof(*MsgPtr));
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08005261 message.bodyptr = MsgPtr;
5262 message.type = WMA_WLAN_SET_APP_TYPE1_PARAMS;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305263 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
5264 QDF_MODULE_ID_WMA,
5265 QDF_MODULE_ID_WMA,
5266 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305267 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305268 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305269 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005270 }
5271 sme_release_global_lock(&pMac->sme);
5272 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305273 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005274 }
5275
5276 return status;
5277}
5278
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305279/*
5280 * sme_configure_app_type2_params() -
5281 * SME will pass this request to lower mac to configure Indoor WoW parameters.
5282 *
5283 * hHal - The handle returned by mac_open.
5284 * wlanAppType2Params- Depicts the wlan App Type 2 (Outdoor) params
5285 * Return QDF_STATUS
5286 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305287QDF_STATUS sme_configure_app_type2_params(tHalHandle hHal,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305288 tpSirAppType2Params wlanAppType2Params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005289{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305290 QDF_STATUS status = QDF_STATUS_SUCCESS;
5291 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005292 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005293 struct scheduler_msg message = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305294 tpSirAppType2Params MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005295
5296 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305297 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005298
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305299 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005300 TRACE_CODE_SME_RX_HDD_CONFIG_APP_TYPE2, NO_SESSION,
5301 0));
5302
5303 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305304 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005305 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305306 qdf_mem_copy(MsgPtr, wlanAppType2Params, sizeof(*MsgPtr));
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08005307 message.bodyptr = MsgPtr;
5308 message.type = WMA_WLAN_SET_APP_TYPE2_PARAMS;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305309 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
5310 QDF_MODULE_ID_WMA,
5311 QDF_MODULE_ID_WMA,
5312 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305313 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305314 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305315 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005316 }
5317 sme_release_global_lock(&pMac->sme);
5318 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305319 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005320 }
5321
5322 return status;
5323}
5324#endif
5325
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305326/*
5327 * sme_get_infra_session_id
5328 * To get the session ID for infra session, if connected
5329 * This is a synchronous API.
5330 *
5331 * hHal - The handle returned by mac_open.
5332 * sessionid, -1 if infra session is not connected
5333 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005334int8_t sme_get_infra_session_id(tHalHandle hHal)
5335{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305336 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005337 int8_t sessionid = -1;
5338 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5339
5340 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305341 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005342
5343 sessionid = csr_get_infra_session_id(pMac);
5344
5345 sme_release_global_lock(&pMac->sme);
5346 }
5347
5348 return sessionid;
5349}
5350
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305351/*
5352 * sme_get_infra_operation_channel() -
5353 * To get the operating channel for infra session, if connected
5354 * This is a synchronous API.
5355 *
5356 * hHal - The handle returned by mac_open.
5357 * sessionId - the sessionId returned by sme_open_session.
5358 * Return operating channel, 0 if infra session is not connected
5359 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005360uint8_t sme_get_infra_operation_channel(tHalHandle hHal, uint8_t sessionId)
5361{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305362 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005363 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5364 uint8_t channel = 0;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305365
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005366 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305367 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005368
5369 channel = csr_get_infra_operation_channel(pMac, sessionId);
5370
5371 sme_release_global_lock(&pMac->sme);
5372 }
5373
5374 return channel;
5375}
5376
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305377/* This routine will return poerating channel on which other BSS is operating
5378 * to be used for concurrency mode. If other BSS is not up or not connected it
5379 * will return 0
5380 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005381uint8_t sme_get_concurrent_operation_channel(tHalHandle hHal)
5382{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305383 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005384 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5385 uint8_t channel = 0;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305386
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005387 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305388 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005389
5390 channel = csr_get_concurrent_operation_channel(pMac);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305391 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
5392 "%s: Other Concurrent Channel: %d", __func__, channel);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005393 sme_release_global_lock(&pMac->sme);
5394 }
5395
5396 return channel;
5397}
5398
5399#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
5400uint16_t sme_check_concurrent_channel_overlap(tHalHandle hHal, uint16_t sap_ch,
5401 eCsrPhyMode sapPhyMode,
5402 uint8_t cc_switch_mode)
5403{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305404 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005405 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5406 uint16_t channel = 0;
5407
5408 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305409 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005410 channel =
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305411 csr_check_concurrent_channel_overlap(pMac, sap_ch,
5412 sapPhyMode,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005413 cc_switch_mode);
5414 sme_release_global_lock(&pMac->sme);
5415 }
5416
5417 return channel;
5418}
5419#endif
5420
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305421/**
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005422 * sme_set_tsfcb() - Set callback for TSF capture
Manikandan Mohan976e7562016-03-15 16:33:31 -07005423 * @h_hal: Handler return by mac_open
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005424 * @cb_fn: Callback function pointer
5425 * @db_ctx: Callback data
5426 *
5427 * Return: QDF_STATUS
5428 */
Manikandan Mohan976e7562016-03-15 16:33:31 -07005429QDF_STATUS sme_set_tsfcb(tHalHandle h_hal,
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005430 int (*cb_fn)(void *cb_ctx, struct stsf *ptsf), void *cb_ctx)
5431{
Manikandan Mohan976e7562016-03-15 16:33:31 -07005432 tpAniSirGlobal mac = PMAC_STRUCT(h_hal);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005433 QDF_STATUS status;
5434
Manikandan Mohan976e7562016-03-15 16:33:31 -07005435 status = sme_acquire_global_lock(&mac->sme);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005436 if (QDF_IS_STATUS_SUCCESS(status)) {
Manikandan Mohan976e7562016-03-15 16:33:31 -07005437 mac->sme.get_tsf_cb = cb_fn;
5438 mac->sme.get_tsf_cxt = cb_ctx;
5439 sme_release_global_lock(&mac->sme);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005440 }
5441 return status;
5442}
5443
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305444/**
5445 * sme_reset_tsfcb() - Reset callback for TSF capture
5446 * @h_hal: Handler return by mac_open
5447 *
5448 * This function reset the tsf capture callback to SME
5449 *
5450 * Return: QDF_STATUS
5451 */
5452QDF_STATUS sme_reset_tsfcb(tHalHandle h_hal)
5453{
5454 tpAniSirGlobal mac;
5455 QDF_STATUS status;
5456
5457 if (!h_hal) {
5458 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
5459 FL("h_hal is not valid"));
5460 return QDF_STATUS_E_INVAL;
5461 }
5462 mac = PMAC_STRUCT(h_hal);
5463
5464 status = sme_acquire_global_lock(&mac->sme);
5465 if (QDF_IS_STATUS_SUCCESS(status)) {
5466 mac->sme.get_tsf_cb = NULL;
5467 mac->sme.get_tsf_cxt = NULL;
5468 sme_release_global_lock(&mac->sme);
5469 }
5470 return status;
5471}
5472
yuanl2746f072018-09-21 19:19:16 +08005473#if defined(WLAN_FEATURE_TSF) && !defined(WLAN_FEATURE_TSF_PLUS_NOIRQ)
Manikandan Mohan976e7562016-03-15 16:33:31 -07005474/*
yuanl2746f072018-09-21 19:19:16 +08005475 * sme_set_tsf_gpio() - set gpio pin that be toggled when capture tsf
Manikandan Mohan976e7562016-03-15 16:33:31 -07005476 * @h_hal: Handler return by mac_open
5477 * @pinvalue: gpio pin id
5478 *
5479 * Return: QDF_STATUS
5480 */
5481QDF_STATUS sme_set_tsf_gpio(tHalHandle h_hal, uint32_t pinvalue)
5482{
5483 QDF_STATUS status;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08005484 struct scheduler_msg tsf_msg = {0};
Manikandan Mohan976e7562016-03-15 16:33:31 -07005485 tpAniSirGlobal mac = PMAC_STRUCT(h_hal);
5486
5487 status = sme_acquire_global_lock(&mac->sme);
5488 if (QDF_IS_STATUS_SUCCESS(status)) {
5489 tsf_msg.type = WMA_TSF_GPIO_PIN;
5490 tsf_msg.reserved = 0;
5491 tsf_msg.bodyval = pinvalue;
5492
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305493 status = scheduler_post_message(QDF_MODULE_ID_SME,
5494 QDF_MODULE_ID_WMA,
5495 QDF_MODULE_ID_WMA, &tsf_msg);
Manikandan Mohan976e7562016-03-15 16:33:31 -07005496 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005497 sme_err("Unable to post WMA_TSF_GPIO_PIN");
Manikandan Mohan976e7562016-03-15 16:33:31 -07005498 status = QDF_STATUS_E_FAILURE;
5499 }
5500 sme_release_global_lock(&mac->sme);
5501 }
5502 return status;
5503}
5504#endif
5505
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08005506QDF_STATUS sme_get_cfg_valid_channels(uint8_t *aValidChannels,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005507 uint32_t *len)
5508{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305509 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08005510 tpAniSirGlobal mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005511
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08005512 if (NULL == mac_ctx) {
5513 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
5514 FL("Invalid MAC context"));
5515 return QDF_STATUS_E_FAILURE;
5516 }
5517
5518 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305519 if (QDF_IS_STATUS_SUCCESS(status)) {
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08005520 status = csr_get_cfg_valid_channels(mac_ctx,
5521 aValidChannels, len);
5522 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005523 }
5524
5525 return status;
5526}
5527
Amar Singhalf0a94ad2017-11-27 15:20:00 -08005528static uint8_t *sme_reg_hint_to_str(const enum country_src src)
5529{
5530 switch (src) {
5531 case SOURCE_CORE:
5532 return "WORLD MODE";
5533
5534 case SOURCE_DRIVER:
5535 return "BDF file";
5536
5537 case SOURCE_USERSPACE:
5538 return "user-space";
5539
5540 case SOURCE_11D:
5541 return "802.11D IEs in beacons";
5542
5543 default:
5544 return "unknown";
5545 }
5546}
5547
Amar Singhal6edf9732016-11-20 21:43:40 -08005548void sme_set_cc_src(tHalHandle hHal, enum country_src cc_src)
5549{
5550 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hHal);
5551
5552 mac_ctx->reg_hint_src = cc_src;
Amar Singhalf0a94ad2017-11-27 15:20:00 -08005553
5554 sme_debug("Country source is %s",
5555 sme_reg_hint_to_str(cc_src));
Amar Singhal6edf9732016-11-20 21:43:40 -08005556}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005557
5558/**
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005559 * sme_handle_generic_change_country_code() - handles country ch req
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005560 * @mac_ctx: mac global context
5561 * @msg: request msg packet
5562 *
5563 * If Supplicant country code is priority than 11d is disabled.
5564 * If 11D is enabled, we update the country code after every scan.
5565 * Hence when Supplicant country code is priority, we don't need 11D info.
5566 * Country code from Supplicant is set as current country code.
5567 *
5568 * Return: status of operation
5569 */
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305570static QDF_STATUS
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005571sme_handle_generic_change_country_code(tpAniSirGlobal mac_ctx,
5572 void *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005573{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305574 QDF_STATUS status = QDF_STATUS_SUCCESS;
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005575 v_REGDOMAIN_t reg_domain_id = 0;
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005576 bool user_ctry_priority =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005577 mac_ctx->roam.configParam.fSupplicantCountryCodeHasPriority;
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005578 tAniGenericChangeCountryCodeReq *msg = pMsgBuf;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005579
Amar Singhal6edf9732016-11-20 21:43:40 -08005580 if (SOURCE_11D != mac_ctx->reg_hint_src) {
5581 if (SOURCE_DRIVER != mac_ctx->reg_hint_src) {
5582 if (user_ctry_priority)
5583 mac_ctx->roam.configParam.Is11dSupportEnabled =
5584 false;
5585 else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305586 if (mac_ctx->roam.configParam.
5587 Is11dSupportEnabled &&
5588 mac_ctx->scan.countryCode11d[0] != 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005589
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005590 sme_debug("restore 11d");
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005591
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305592 status =
5593 csr_get_regulatory_domain_for_country(
Amar Singhal6edf9732016-11-20 21:43:40 -08005594 mac_ctx,
5595 mac_ctx->scan.countryCode11d,
5596 &reg_domain_id,
5597 SOURCE_11D);
5598 return QDF_STATUS_E_FAILURE;
5599 }
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005600 }
5601 }
5602 } else {
5603 /* if kernel gets invalid country code; it
5604 * resets the country code to world
5605 */
5606 if (('0' != msg->countryCode[0]) ||
5607 ('0' != msg->countryCode[1]))
5608 qdf_mem_copy(mac_ctx->scan.countryCode11d,
5609 msg->countryCode,
5610 WNI_CFG_COUNTRY_CODE_LEN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005611 }
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005612
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005613 qdf_mem_copy(mac_ctx->scan.countryCodeCurrent,
5614 msg->countryCode,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005615 WNI_CFG_COUNTRY_CODE_LEN);
Amar Singhal9d5b1fe2016-10-16 20:16:05 -07005616
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005617 /* get the channels based on new cc */
5618 status = csr_get_channel_and_power_list(mac_ctx);
5619
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305620 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005621 sme_err("fail to get Channels");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005622 return status;
5623 }
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005624
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005625 /* reset info based on new cc, and we are done */
5626 csr_apply_channel_power_info_wrapper(mac_ctx);
5627
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005628 csr_scan_filter_results(mac_ctx);
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005629
5630 /* scans after the country is set by User hints or
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005631 * Country IE
5632 */
5633 mac_ctx->scan.curScanType = eSIR_ACTIVE_SCAN;
Amar Singhal9d5b1fe2016-10-16 20:16:05 -07005634
Amar Singhal6edf9732016-11-20 21:43:40 -08005635 mac_ctx->reg_hint_src = SOURCE_UNKNOWN;
5636
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005637 sme_disconnect_connected_sessions(mac_ctx);
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005638
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305639 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005640}
5641
Jeff Johnson330c0bf2018-06-01 15:13:12 -07005642QDF_STATUS sme_update_channel_list(tHalHandle hal)
Mukul Sharmaecf8e092017-12-19 22:36:31 +05305643{
Jeff Johnson330c0bf2018-06-01 15:13:12 -07005644 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
5645 QDF_STATUS status;
Mukul Sharmaecf8e092017-12-19 22:36:31 +05305646
5647 status = sme_acquire_global_lock(&mac_ctx->sme);
5648 if (QDF_IS_STATUS_SUCCESS(status)) {
5649 /* Update umac channel (enable/disable) from cds channels */
5650 status = csr_get_channel_and_power_list(mac_ctx);
5651 if (status != QDF_STATUS_SUCCESS) {
5652 sme_err("fail to get Channels");
5653 sme_release_global_lock(&mac_ctx->sme);
5654 return status;
5655 }
5656
5657 csr_apply_channel_power_info_wrapper(mac_ctx);
5658 csr_scan_filter_results(mac_ctx);
5659 sme_disconnect_connected_sessions(mac_ctx);
5660 sme_release_global_lock(&mac_ctx->sme);
5661 }
5662
5663 return status;
5664}
5665
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005666static bool
5667sme_search_in_base_ch_lst(tpAniSirGlobal mac_ctx, uint8_t curr_ch)
5668{
5669 uint8_t i;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05305670 struct csr_channel *ch_lst_info;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305671
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005672 ch_lst_info = &mac_ctx->scan.base_channels;
5673 for (i = 0; i < ch_lst_info->numChannels; i++) {
5674 if (ch_lst_info->channelList[i] == curr_ch)
5675 return true;
5676 }
5677
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005678 return false;
5679}
5680/**
5681 * sme_disconnect_connected_sessions() - Disconnect STA and P2P client session
5682 * if channel is not supported
5683 * @mac_ctx: mac global context
5684 *
5685 * If new country code does not support the channel on which STA/P2P client
5686 * is connetced, it sends the disconnect to the AP/P2P GO
5687 *
5688 * Return: void
5689 */
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305690static void sme_disconnect_connected_sessions(tpAniSirGlobal mac_ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005691{
5692 uint8_t session_id, found = false;
5693 uint8_t curr_ch;
5694
5695 for (session_id = 0; session_id < CSR_ROAM_SESSION_MAX; session_id++) {
5696 if (!csr_is_session_client_and_connected(mac_ctx, session_id))
5697 continue;
5698 found = false;
5699 /* Session is connected.Check the channel */
5700 curr_ch = csr_get_infra_operation_channel(mac_ctx,
5701 session_id);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005702 sme_debug("Current Operating channel : %d, session :%d",
5703 curr_ch, session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005704 found = sme_search_in_base_ch_lst(mac_ctx, curr_ch);
5705 if (!found) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005706 sme_debug("Disconnect Session: %d", session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005707 csr_roam_disconnect(mac_ctx, session_id,
5708 eCSR_DISCONNECT_REASON_UNSPECIFIED);
5709 }
5710 }
5711}
5712
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005713#ifdef WLAN_FEATURE_PACKET_FILTERING
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305714QDF_STATUS sme_8023_multicast_list(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005715 tpSirRcvFltMcAddrList pMulticastAddrs)
5716{
5717 tpSirRcvFltMcAddrList request_buf;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005718 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005719 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05305720 struct csr_roam_session *pSession = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005721
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305722 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
5723 "%s: ulMulticastAddrCnt: %d, multicastAddr[0]: %pK", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005724 pMulticastAddrs->ulMulticastAddrCnt,
Srinivas Girigowda98530492015-11-20 17:39:24 -08005725 pMulticastAddrs->multicastAddr[0].bytes);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005726
Ravi Joshi4f447cb2016-07-19 13:42:01 -07005727 /* Find the connected Infra / P2P_client connected session */
Krunal Sonifea06802017-04-13 14:44:48 -07005728 pSession = CSR_GET_SESSION(pMac, sessionId);
5729 if (!CSR_IS_SESSION_VALID(pMac, sessionId) ||
5730 (!csr_is_conn_state_infra(pMac, sessionId) &&
5731 !csr_is_ndi_started(pMac, sessionId))) {
Abhishek Singh5d8d7332017-08-10 15:15:24 +05305732 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Srinivas Girigowdaf2599dd2015-11-16 18:20:46 -08005733 "%s: Unable to find the session Id: %d", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005734 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305735 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005736 }
5737
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305738 request_buf = qdf_mem_malloc(sizeof(tSirRcvFltMcAddrList));
Arif Hussain0ef77082018-10-10 16:42:53 -07005739 if (!request_buf)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305740 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005741
Ravi Joshi4f447cb2016-07-19 13:42:01 -07005742 if (!csr_is_conn_state_connected_infra(pMac, sessionId) &&
5743 !csr_is_ndi_started(pMac, sessionId)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305744 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ravi Joshi4f447cb2016-07-19 13:42:01 -07005745 "%s: Request ignored, session %d is not connected or started",
5746 __func__, sessionId);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305747 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305748 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005749 }
5750
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305751 qdf_mem_copy(request_buf, pMulticastAddrs,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005752 sizeof(tSirRcvFltMcAddrList));
5753
Anurag Chouhanc5548422016-02-24 18:33:27 +05305754 qdf_copy_macaddr(&request_buf->self_macaddr, &pSession->selfMacAddr);
5755 qdf_copy_macaddr(&request_buf->bssid,
Srinivas Girigowda98530492015-11-20 17:39:24 -08005756 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005757
5758 msg.type = WMA_8023_MULTICAST_LIST_REQ;
5759 msg.reserved = 0;
5760 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05305761 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
5762 sessionId, msg.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305763 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5764 QDF_MODULE_ID_WMA,
5765 QDF_MODULE_ID_WMA,
5766 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305767 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305768 "%s: Not able to post WMA_8023_MULTICAST_LIST message to WMA",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005769 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305770 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305771 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005772 }
5773
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305774 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005775}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005776#endif /* WLAN_FEATURE_PACKET_FILTERING */
5777
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305778/*
5779 * sme_is_channel_valid() -
5780 * To check if the channel is valid for currently established domain
5781 * This is a synchronous API.
5782 *
5783 * hHal - The handle returned by mac_open.
5784 * channel - channel to verify
5785 * Return true/false, true if channel is valid
5786 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005787bool sme_is_channel_valid(tHalHandle hHal, uint8_t channel)
5788{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305789 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005790 bool valid = false;
5791 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5792
5793 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305794 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005795
5796 valid = csr_roam_is_channel_valid(pMac, channel);
5797
5798 sme_release_global_lock(&pMac->sme);
5799 }
5800
5801 return valid;
5802}
5803
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305804/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305805 * sme_get_freq_band() -
5806 * Used to get the current band settings.
5807 *
5808 * hHal
5809 * pBand pointer to hold band value
5810 * Return QDF_STATUS
5811 */
Varun Reddy Yeturua48bc412017-11-17 15:33:35 -08005812QDF_STATUS sme_get_freq_band(tHalHandle hHal, enum band_info *pBand)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005813{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305814 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005815 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5816
5817 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305818 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnsonbfd24632018-10-30 09:28:50 -07005819 *pBand = csr_get_current_band(pMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005820 sme_release_global_lock(&pMac->sme);
5821 }
5822 return status;
5823}
5824
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305825/*
5826 * sme_set_max_tx_power_per_band() -
5827 * Set the Maximum Transmit Power specific to band dynamically.
5828 * Note: this setting will not persist over reboots.
5829 *
5830 * band
5831 * power to set in dB
5832 * Return QDF_STATUS
5833 */
Varun Reddy Yeturua48bc412017-11-17 15:33:35 -08005834QDF_STATUS sme_set_max_tx_power_per_band(enum band_info band, int8_t dB)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005835{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005836 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005837 tpMaxTxPowerPerBandParams pMaxTxPowerPerBandParams = NULL;
5838
5839 pMaxTxPowerPerBandParams =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305840 qdf_mem_malloc(sizeof(tMaxTxPowerPerBandParams));
Arif Hussain0ef77082018-10-10 16:42:53 -07005841 if (!pMaxTxPowerPerBandParams)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305842 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005843
5844 pMaxTxPowerPerBandParams->power = dB;
5845 pMaxTxPowerPerBandParams->bandInfo = band;
5846
5847 msg.type = WMA_SET_MAX_TX_POWER_PER_BAND_REQ;
5848 msg.reserved = 0;
5849 msg.bodyptr = pMaxTxPowerPerBandParams;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05305850 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
5851 NO_SESSION, msg.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305852 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5853 QDF_MODULE_ID_WMA,
5854 QDF_MODULE_ID_WMA,
5855 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305856 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005857 "%s:Not able to post WMA_SET_MAX_TX_POWER_PER_BAND_REQ",
5858 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305859 qdf_mem_free(pMaxTxPowerPerBandParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305860 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005861 }
5862
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305863 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005864}
5865
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305866/*
5867 * sme_set_max_tx_power() -
5868 * Set the Maximum Transmit Power dynamically. Note: this setting will
5869 * not persist over reboots.
5870 *
5871 * hHal
5872 * pBssid BSSID to set the power cap for
5873 * pBssid pSelfMacAddress self MAC Address
5874 * pBssid power to set in dB
5875 * Return QDF_STATUS
5876 */
Anurag Chouhan6d760662016-02-20 16:05:43 +05305877QDF_STATUS sme_set_max_tx_power(tHalHandle hHal, struct qdf_mac_addr pBssid,
5878 struct qdf_mac_addr pSelfMacAddress, int8_t dB)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005879{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005880 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005881 tpMaxTxPowerParams pMaxTxParams = NULL;
5882
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305883 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005884 TRACE_CODE_SME_RX_HDD_SET_MAXTXPOW, NO_SESSION, 0));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305885 pMaxTxParams = qdf_mem_malloc(sizeof(tMaxTxPowerParams));
Arif Hussain0ef77082018-10-10 16:42:53 -07005886 if (!pMaxTxParams)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305887 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005888
Anurag Chouhanc5548422016-02-24 18:33:27 +05305889 qdf_copy_macaddr(&pMaxTxParams->bssId, &pBssid);
5890 qdf_copy_macaddr(&pMaxTxParams->selfStaMacAddr, &pSelfMacAddress);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005891 pMaxTxParams->power = dB;
5892
5893 msg.type = WMA_SET_MAX_TX_POWER_REQ;
5894 msg.reserved = 0;
5895 msg.bodyptr = pMaxTxParams;
5896
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305897 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5898 QDF_MODULE_ID_WMA,
5899 QDF_MODULE_ID_WMA,
5900 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305901 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005902 "%s: Not able to post WMA_SET_MAX_TX_POWER_REQ message to WMA",
5903 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305904 qdf_mem_free(pMaxTxParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305905 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005906 }
5907
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305908 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005909}
5910
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305911/*
5912 * sme_set_custom_mac_addr() -
5913 * Set the customer Mac Address.
5914 *
5915 * customMacAddr customer MAC Address
5916 * Return QDF_STATUS
5917 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305918QDF_STATUS sme_set_custom_mac_addr(tSirMacAddr customMacAddr)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005919{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005920 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005921 tSirMacAddr *pBaseMacAddr;
5922
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305923 pBaseMacAddr = qdf_mem_malloc(sizeof(tSirMacAddr));
Arif Hussain0ef77082018-10-10 16:42:53 -07005924 if (!pBaseMacAddr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305925 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005926
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305927 qdf_mem_copy(*pBaseMacAddr, customMacAddr, sizeof(tSirMacAddr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005928
5929 msg.type = SIR_HAL_SET_BASE_MACADDR_IND;
5930 msg.reserved = 0;
5931 msg.bodyptr = pBaseMacAddr;
5932
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305933 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5934 QDF_MODULE_ID_WMA,
5935 QDF_MODULE_ID_WMA,
5936 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305937 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305938 "Not able to post SIR_HAL_SET_BASE_MACADDR_IND message to WMA");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305939 qdf_mem_free(pBaseMacAddr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305940 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005941 }
5942
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305943 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005944}
5945
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305946/*
5947 * sme_set_tx_power() -
5948 * Set Transmit Power dynamically.
5949 *
5950 * hHal
5951 * sessionId Target Session ID
5952 * BSSID
5953 * dev_mode dev_mode such as station, P2PGO, SAP
5954 * dBm power to set
5955 * Return QDF_STATUS
5956 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305957QDF_STATUS sme_set_tx_power(tHalHandle hHal, uint8_t sessionId,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305958 struct qdf_mac_addr pBSSId,
Jeff Johnsonc1e62782017-11-09 09:50:17 -08005959 enum QDF_OPMODE dev_mode, int dBm)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005960{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005961 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005962 tpMaxTxPowerParams pTxParams = NULL;
5963 int8_t power = (int8_t) dBm;
5964
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305965 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005966 TRACE_CODE_SME_RX_HDD_SET_TXPOW, sessionId, 0));
5967
5968 /* make sure there is no overflow */
5969 if ((int)power != dBm) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305970 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005971 "%s: error, invalid power = %d", __func__, dBm);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305972 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005973 }
5974
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305975 pTxParams = qdf_mem_malloc(sizeof(tMaxTxPowerParams));
Arif Hussain0ef77082018-10-10 16:42:53 -07005976 if (!pTxParams)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305977 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005978
Anurag Chouhanc5548422016-02-24 18:33:27 +05305979 qdf_copy_macaddr(&pTxParams->bssId, &pBSSId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005980 pTxParams->power = power; /* unit is dBm */
5981 pTxParams->dev_mode = dev_mode;
5982 msg.type = WMA_SET_TX_POWER_REQ;
5983 msg.reserved = 0;
5984 msg.bodyptr = pTxParams;
5985
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305986 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5987 QDF_MODULE_ID_WMA,
5988 QDF_MODULE_ID_WMA,
5989 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305990 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005991 "%s: failed to post WMA_SET_TX_POWER_REQ to WMA",
5992 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305993 qdf_mem_free(pTxParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305994 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005995 }
5996
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305997 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005998}
5999
Vignesh Viswanathan32761e42017-09-25 17:10:54 +05306000QDF_STATUS sme_update_session_param(tHalHandle hal, uint8_t session_id,
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05306001 uint32_t param_type, uint32_t param_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006002{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306003 QDF_STATUS status = QDF_STATUS_SUCCESS;
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05306004 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006005 uint16_t len;
6006
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05306007 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306008 if (QDF_IS_STATUS_SUCCESS(status)) {
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05306009 struct sir_update_session_param *msg;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05306010 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx,
6011 session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006012
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05306013 if (!session) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006014 sme_err("Session: %d not found", session_id);
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05306015 sme_release_global_lock(&mac_ctx->sme);
6016 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006017 }
6018
Selvaraj, Sridhar5b5a0652017-05-04 11:23:07 +05306019 if (param_type == SIR_PARAM_IGNORE_ASSOC_DISALLOWED)
6020 mac_ctx->ignore_assoc_disallowed = param_val;
6021
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05306022 if (!session->sessionActive)
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306023 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006024
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05306025 len = sizeof(*msg);
6026 msg = qdf_mem_malloc(len);
6027 if (!msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306028 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006029 else {
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05306030 msg->message_type = eWNI_SME_SESSION_UPDATE_PARAM;
6031 msg->length = len;
6032 msg->session_id = session_id;
6033 msg->param_type = param_type;
6034 msg->param_val = param_val;
Rajeev Kumard138ac52017-01-30 18:38:37 -08006035 status = umac_send_mb_message_to_mac(msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006036 }
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05306037 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006038 }
6039 return status;
6040}
6041
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306042/*
6043 * sme_set_tm_level() -
6044 * Set Thermal Mitigation Level to RIVA
6045 *
6046 * hHal - The handle returned by mac_open.
6047 * newTMLevel - new Thermal Mitigation Level
6048 * tmMode - Thermal Mitigation handle mode, default 0
6049 * Return QDF_STATUS
6050 */
6051QDF_STATUS sme_set_tm_level(tHalHandle hHal, uint16_t newTMLevel, uint16_t
6052 tmMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006053{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306054 QDF_STATUS status = QDF_STATUS_SUCCESS;
6055 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006056 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07006057 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006058 tAniSetTmLevelReq *setTmLevelReq = NULL;
6059
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306060 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006061 TRACE_CODE_SME_RX_HDD_SET_TMLEVEL, NO_SESSION, 0));
6062 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306063 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006064 setTmLevelReq =
6065 (tAniSetTmLevelReq *)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306066 qdf_mem_malloc(sizeof(tAniSetTmLevelReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006067 if (NULL == setTmLevelReq) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006068 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306069 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006070 }
6071
6072 setTmLevelReq->tmMode = tmMode;
6073 setTmLevelReq->newTmLevel = newTMLevel;
6074
6075 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08006076 message.bodyptr = setTmLevelReq;
6077 message.type = WMA_SET_TM_LEVEL_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05306078 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08006079 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05306080 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
6081 QDF_MODULE_ID_WMA,
6082 QDF_MODULE_ID_WMA,
6083 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306084 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306085 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006086 "%s: Post Set TM Level MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306087 qdf_mem_free(setTmLevelReq);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306088 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006089 }
6090 sme_release_global_lock(&pMac->sme);
6091 }
6092 return status;
6093}
6094
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306095/*
6096 * sme_feature_caps_exchange() - SME interface to exchange capabilities between
6097 * Host and FW.
6098 *
6099 * hHal - HAL handle for device
6100 * Return NONE
6101 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006102void sme_feature_caps_exchange(tHalHandle hHal)
6103{
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306104 MTRACE(qdf_trace
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306105 (QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_CAPS_EXCH,
6106 NO_SESSION, 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006107}
6108
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306109/*
6110 * sme_disable_feature_capablity() - SME interface to disable Active mode
6111 * offload capablity in Host.
6112 *
6113 * hHal - HAL handle for device
6114 * Return NONE
6115 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006116void sme_disable_feature_capablity(uint8_t feature_index)
6117{
6118}
6119
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306120/*
6121 * sme_reset_power_values_for5_g
6122 * Reset the power values for 5G band with default power values.
6123 *
6124 * hHal - HAL handle for device
6125 * Return NONE
6126 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006127void sme_reset_power_values_for5_g(tHalHandle hHal)
6128{
6129 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306130
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306131 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006132 TRACE_CODE_SME_RX_HDD_RESET_PW5G, NO_SESSION, 0));
6133 csr_save_channel_power_for_band(pMac, true);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306134 /* Store the channel+power info in the global place: Cfg */
6135 csr_apply_power2_current(pMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006136}
6137
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306138/*
6139 * sme_update_roam_prefer5_g_hz() -
6140 * Enable/disable Roam prefer 5G runtime option
6141 * This function is called through dynamic setConfig callback function
6142 * to configure the Roam prefer 5G runtime option
6143 *
6144 * hHal - HAL handle for device
6145 * nRoamPrefer5GHz Enable/Disable Roam prefer 5G runtime option
6146 * Return Success or failure
6147 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006148
gaurank kathpalia14e2f912017-08-31 14:51:45 +05306149QDF_STATUS sme_update_roam_prefer5_g_hz(tHalHandle hHal,
6150 bool nRoamPrefer5GHz)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006151{
6152 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306153 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006154
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306155 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006156 TRACE_CODE_SME_RX_HDD_UPDATE_RP5G, NO_SESSION, 0));
6157 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306158 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05306159 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006160 "%s: gRoamPrefer5GHz is changed from %d to %d",
6161 __func__, pMac->roam.configParam.nRoamPrefer5GHz,
6162 nRoamPrefer5GHz);
6163 pMac->roam.configParam.nRoamPrefer5GHz = nRoamPrefer5GHz;
6164 sme_release_global_lock(&pMac->sme);
6165 }
6166
6167 return status;
6168}
6169
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306170/*
6171 * sme_set_roam_intra_band() -
6172 * enable/disable Intra band roaming
6173 * This function is called through dynamic setConfig callback function
6174 * to configure the intra band roaming
6175 * hHal - HAL handle for device
6176 * nRoamIntraBand Enable/Disable Intra band roaming
6177 * Return Success or failure
6178 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306179QDF_STATUS sme_set_roam_intra_band(tHalHandle hHal, const bool nRoamIntraBand)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006180{
6181 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306182 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006183
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306184 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006185 TRACE_CODE_SME_RX_HDD_SET_ROAMIBAND, NO_SESSION, 0));
6186 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306187 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05306188 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006189 "%s: gRoamIntraBand is changed from %d to %d",
6190 __func__, pMac->roam.configParam.nRoamIntraBand,
6191 nRoamIntraBand);
6192 pMac->roam.configParam.nRoamIntraBand = nRoamIntraBand;
6193 sme_release_global_lock(&pMac->sme);
6194 }
6195
6196 return status;
6197}
6198
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306199/*
6200 * sme_update_roam_scan_n_probes() -
6201 * Function to update roam scan N probes
6202 * This function is called through dynamic setConfig callback function
6203 * to update roam scan N probes
6204 * hHal - HAL handle for device
6205 * sessionId - Session Identifier
6206 * nProbes number of probe requests to be sent out
6207 * Return Success or failure
6208 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306209QDF_STATUS sme_update_roam_scan_n_probes(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006210 const uint8_t nProbes)
6211{
6212 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306213 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006214
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306215 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006216 TRACE_CODE_SME_RX_HDD_UPDATE_ROAM_SCAN_N_PROBES,
6217 NO_SESSION, 0));
6218 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306219 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05306220 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006221 "%s: gRoamScanNProbes is changed from %d to %d",
6222 __func__, pMac->roam.configParam.nProbes, nProbes);
6223 pMac->roam.configParam.nProbes = nProbes;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306224
6225 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
6226 csr_roam_offload_scan(pMac, sessionId,
6227 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6228 REASON_NPROBES_CHANGED);
6229 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006230 sme_release_global_lock(&pMac->sme);
6231 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006232 return status;
6233}
6234
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306235/*
6236 * sme_update_roam_scan_home_away_time() -
6237 * Function to update roam scan Home away time
6238 * This function is called through dynamic setConfig callback function
6239 * to update roam scan home away time
6240 *
6241 * hHal - HAL handle for device
6242 * sessionId - Session Identifier
6243 * nRoamScanAwayTime Scan home away time
6244 * bSendOffloadCmd If true then send offload command to firmware
6245 * If false then command is not sent to firmware
6246 * Return Success or failure
6247 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306248QDF_STATUS sme_update_roam_scan_home_away_time(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006249 uint8_t sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306250 const uint16_t nRoamScanHomeAwayTime,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006251 const bool bSendOffloadCmd)
6252{
6253 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306254 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006255
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306256 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006257 TRACE_CODE_SME_RX_HDD_UPDATE_ROAM_SCAN_HOME_AWAY_TIME,
6258 NO_SESSION, 0));
6259 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306260 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05306261 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006262 "%s: gRoamScanHomeAwayTime is changed from %d to %d",
6263 __func__,
6264 pMac->roam.configParam.nRoamScanHomeAwayTime,
6265 nRoamScanHomeAwayTime);
6266 pMac->roam.configParam.nRoamScanHomeAwayTime =
6267 nRoamScanHomeAwayTime;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306268
6269 if (pMac->roam.configParam.isRoamOffloadScanEnabled &&
6270 bSendOffloadCmd) {
6271 csr_roam_offload_scan(pMac, sessionId,
6272 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6273 REASON_HOME_AWAY_TIME_CHANGED);
6274 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006275 sme_release_global_lock(&pMac->sme);
6276 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006277 return status;
6278}
6279
Abhishek Singh518323d2015-10-19 17:42:01 +05306280/**
6281 * sme_ext_change_channel()- function to post send ECSA
6282 * action frame to csr.
6283 * @hHal: Hal context
6284 * @channel: new channel to switch
6285 * @session_id: senssion it should be sent on.
6286 *
6287 * This function is called to post ECSA frame to csr.
6288 *
6289 * Return: success if msg is sent else return failure
6290 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306291QDF_STATUS sme_ext_change_channel(tHalHandle h_hal, uint32_t channel,
Abhishek Singh518323d2015-10-19 17:42:01 +05306292 uint8_t session_id)
6293{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306294 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh518323d2015-10-19 17:42:01 +05306295 tpAniSirGlobal mac_ctx = PMAC_STRUCT(h_hal);
6296 uint8_t channel_state;
6297
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006298 sme_err("Set Channel: %d", channel);
Abhishek Singh518323d2015-10-19 17:42:01 +05306299 channel_state =
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07006300 wlan_reg_get_channel_state(mac_ctx->pdev, channel);
Abhishek Singh518323d2015-10-19 17:42:01 +05306301
6302 if (CHANNEL_STATE_DISABLE == channel_state) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006303 sme_err("Invalid channel: %d", channel);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306304 return QDF_STATUS_E_INVAL;
Abhishek Singh518323d2015-10-19 17:42:01 +05306305 }
6306
6307 status = sme_acquire_global_lock(&mac_ctx->sme);
6308
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306309 if (QDF_STATUS_SUCCESS == status) {
Abhishek Singh518323d2015-10-19 17:42:01 +05306310 /* update the channel list to the firmware */
6311 status = csr_send_ext_change_channel(mac_ctx,
6312 channel, session_id);
6313 sme_release_global_lock(&mac_ctx->sme);
6314 }
6315
6316 return status;
6317}
6318
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306319/*
6320 * sme_get_roam_intra_band() -
6321 * get Intra band roaming
6322 *
6323 * hHal - HAL handle for device
6324 * Return Success or failure
6325 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006326bool sme_get_roam_intra_band(tHalHandle hHal)
6327{
6328 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306329
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306330 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006331 TRACE_CODE_SME_RX_HDD_GET_ROAMIBAND, NO_SESSION, 0));
6332 return pMac->roam.configParam.nRoamIntraBand;
6333}
6334
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306335/*
6336 * sme_get_roam_scan_n_probes() -
6337 * get N Probes
6338 *
6339 * hHal - HAL handle for device
6340 * Return Success or failure
6341 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006342uint8_t sme_get_roam_scan_n_probes(tHalHandle hHal)
6343{
6344 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306345
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006346 return pMac->roam.configParam.nProbes;
6347}
6348
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306349/*
6350 * sme_get_roam_scan_home_away_time() -
6351 * get Roam scan home away time
6352 *
6353 * hHal - HAL handle for device
6354 * Return Success or failure
6355 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006356uint16_t sme_get_roam_scan_home_away_time(tHalHandle hHal)
6357{
6358 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306359
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006360 return pMac->roam.configParam.nRoamScanHomeAwayTime;
6361}
6362
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306363/*
6364 * sme_update_roam_rssi_diff() -
6365 * Update RoamRssiDiff
6366 * This function is called through dynamic setConfig callback function
6367 * to configure RoamRssiDiff
6368 * Usage: adb shell iwpriv wlan0 setConfig RoamRssiDiff=[0 .. 125]
6369 *
6370 * hHal - HAL handle for device
6371 * sessionId - Session Identifier
6372 * RoamRssiDiff - minimum rssi difference between potential
6373 * candidate and current AP.
6374 * Return Success or failure
6375 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006376
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306377QDF_STATUS sme_update_roam_rssi_diff(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006378 uint8_t RoamRssiDiff)
6379{
6380 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306381 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006382
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006383 if (sessionId >= CSR_ROAM_SESSION_MAX) {
6384 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6385 FL("Invalid sme session id: %d"), sessionId);
6386 return QDF_STATUS_E_INVAL;
6387 }
6388
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006389 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306390 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306391 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006392 "LFR runtime successfully set roam rssi diff to %d - old value is %d - roam state is %s",
6393 RoamRssiDiff,
6394 pMac->roam.configParam.RoamRssiDiff,
6395 mac_trace_get_neighbour_roam_state(pMac->roam.
6396 neighborRoamInfo
6397 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306398 neighborRoamState));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006399 pMac->roam.configParam.RoamRssiDiff = RoamRssiDiff;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306400
6401 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
6402 csr_roam_offload_scan(pMac, sessionId,
6403 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6404 REASON_RSSI_DIFF_CHANGED);
6405
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006406 sme_release_global_lock(&pMac->sme);
6407 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006408 return status;
6409}
6410
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306411#ifdef WLAN_FEATURE_FILS_SK
6412QDF_STATUS sme_update_fils_config(tHalHandle hal, uint8_t session_id,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07006413 struct csr_roam_profile *src_profile)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306414{
6415 tpAniSirGlobal mac = PMAC_STRUCT(hal);
6416 QDF_STATUS status = QDF_STATUS_SUCCESS;
6417 tpCsrNeighborRoamControlInfo neighbor_roam_info =
6418 &mac->roam.neighborRoamInfo[session_id];
6419
6420 if (session_id >= CSR_ROAM_SESSION_MAX) {
6421 sme_err("Invalid sme session id: %d", session_id);
6422 return QDF_STATUS_E_INVAL;
6423 }
6424
6425 if (!src_profile) {
6426 sme_err("src roam profile NULL");
6427 return QDF_STATUS_E_INVAL;
6428 }
6429
6430 if (!mac->roam.configParam.isFastRoamIniFeatureEnabled ||
6431 (neighbor_roam_info->neighborRoamState !=
6432 eCSR_NEIGHBOR_ROAM_STATE_CONNECTED)) {
6433 sme_info("Fast roam is disabled or not connected(%d)",
6434 neighbor_roam_info->neighborRoamState);
6435 return QDF_STATUS_E_PERM;
6436 }
6437
6438 csr_update_fils_config(mac, session_id, src_profile);
Sridhar Selvaraje5260442017-08-19 10:12:03 +05306439 if (csr_roamIsRoamOffloadEnabled(mac)) {
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306440 status = sme_acquire_global_lock(&mac->sme);
6441 if (QDF_IS_STATUS_SUCCESS(status)) {
6442 sme_debug("Updating fils config to fw");
6443 csr_roam_offload_scan(mac, session_id,
6444 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6445 REASON_FILS_PARAMS_CHANGED);
6446 sme_release_global_lock(&mac->sme);
6447 } else {
6448 sme_err("Failed to acquire SME lock");
6449 }
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306450 } else {
6451 sme_info("LFR3 not enabled");
6452 return QDF_STATUS_E_INVAL;
6453 }
6454
6455 return status;
6456}
6457
6458void sme_send_hlp_ie_info(tHalHandle hal, uint8_t session_id,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07006459 struct csr_roam_profile *profile, uint32_t if_addr)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306460{
6461 int i;
6462 struct scheduler_msg msg;
6463 QDF_STATUS status;
6464 struct hlp_params *params;
6465 tpAniSirGlobal mac = PMAC_STRUCT(hal);
6466 struct csr_roam_session *session = CSR_GET_SESSION(mac, session_id);
6467 tpCsrNeighborRoamControlInfo neighbor_roam_info =
6468 &mac->roam.neighborRoamInfo[session_id];
6469
6470 if (!session) {
6471 sme_err("session NULL");
6472 return;
6473 }
6474
6475 if (!mac->roam.configParam.isFastRoamIniFeatureEnabled ||
6476 (neighbor_roam_info->neighborRoamState !=
6477 eCSR_NEIGHBOR_ROAM_STATE_CONNECTED)) {
6478 sme_debug("Fast roam is disabled or not connected(%d)",
6479 neighbor_roam_info->neighborRoamState);
6480 return;
6481 }
6482
6483 params = qdf_mem_malloc(sizeof(*params));
Arif Hussain0ef77082018-10-10 16:42:53 -07006484 if (!params)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306485 return;
Arif Hussain0ef77082018-10-10 16:42:53 -07006486
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306487 if ((profile->hlp_ie_len +
6488 SIR_IPV4_ADDR_LEN) > FILS_MAX_HLP_DATA_LEN) {
6489 sme_err("HLP IE len exceeds %d",
6490 profile->hlp_ie_len);
6491 qdf_mem_free(params);
6492 return;
6493 }
6494
6495 params->vdev_id = session_id;
6496 params->hlp_ie_len = profile->hlp_ie_len + SIR_IPV4_ADDR_LEN;
6497
6498 for (i = 0; i < SIR_IPV4_ADDR_LEN; i++)
6499 params->hlp_ie[i] = (if_addr >> (i * 8)) & 0xFF;
6500
6501 qdf_mem_copy(params->hlp_ie + SIR_IPV4_ADDR_LEN,
6502 profile->hlp_ie, profile->hlp_ie_len);
6503
6504 msg.type = SIR_HAL_HLP_IE_INFO;
6505 msg.reserved = 0;
6506 msg.bodyptr = params;
6507 status = sme_acquire_global_lock(&mac->sme);
6508 if (status != QDF_STATUS_SUCCESS) {
6509 sme_err("sme lock acquire fails");
6510 qdf_mem_free(params);
6511 return;
6512 }
6513
6514 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05306515 (scheduler_post_message(QDF_MODULE_ID_SME,
6516 QDF_MODULE_ID_WMA,
6517 QDF_MODULE_ID_WMA, &msg))) {
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306518 sme_err("Not able to post WMA_HLP_IE_INFO message to HAL");
6519 sme_release_global_lock(&mac->sme);
6520 qdf_mem_free(params);
6521 return;
6522 }
6523
6524 sme_release_global_lock(&mac->sme);
6525}
6526
Jeff Johnson172237b2017-11-07 15:32:59 -08006527void sme_free_join_rsp_fils_params(struct csr_roam_info *roam_info)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306528{
6529 struct fils_join_rsp_params *roam_fils_params;
6530
6531 if (!roam_info) {
6532 sme_err("FILS Roam Info NULL");
6533 return;
6534 }
6535
6536 roam_fils_params = roam_info->fils_join_rsp;
6537 if (!roam_fils_params) {
6538 sme_err("FILS Roam Param NULL");
6539 return;
6540 }
6541
6542 if (roam_fils_params->fils_pmk)
6543 qdf_mem_free(roam_fils_params->fils_pmk);
6544
6545 qdf_mem_free(roam_fils_params);
6546
6547 roam_info->fils_join_rsp = NULL;
6548}
6549
6550#else
6551inline void sme_send_hlp_ie_info(tHalHandle hal, uint8_t session_id,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07006552 struct csr_roam_profile *profile, uint32_t if_addr)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306553{}
6554#endif
6555
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306556/*
6557 * sme_update_fast_transition_enabled() - enable/disable Fast Transition
6558 * support at runtime
6559 * It is used at in the REG_DYNAMIC_VARIABLE macro definition of
6560 * isFastTransitionEnabled.
6561 * This is a synchronous call
6562 *
6563 * hHal - The handle returned by mac_open.
6564 * Return QDF_STATUS_SUCCESS - SME update isFastTransitionEnabled config
6565 * successfully.
6566 * Other status means SME is failed to update isFastTransitionEnabled.
6567 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306568QDF_STATUS sme_update_fast_transition_enabled(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006569 bool isFastTransitionEnabled)
6570{
6571 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306572 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006573
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306574 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006575 TRACE_CODE_SME_RX_HDD_UPDATE_FTENABLED, NO_SESSION,
6576 0));
6577 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306578 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05306579 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006580 "%s: FastTransitionEnabled is changed from %d to %d",
6581 __func__,
6582 pMac->roam.configParam.isFastTransitionEnabled,
6583 isFastTransitionEnabled);
6584 pMac->roam.configParam.isFastTransitionEnabled =
6585 isFastTransitionEnabled;
6586 sme_release_global_lock(&pMac->sme);
6587 }
6588
6589 return status;
6590}
6591
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306592/*
6593 * sme_update_wes_mode() -
6594 * Update WES Mode
6595 * This function is called through dynamic setConfig callback function
6596 * to configure isWESModeEnabled
6597 *
6598 * hHal - HAL handle for device
6599 * isWESModeEnabled - WES mode
6600 * sessionId - Session Identifier
6601 * Return QDF_STATUS_SUCCESS - SME update isWESModeEnabled config successfully.
6602 * Other status means SME is failed to update isWESModeEnabled.
6603 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006604
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306605QDF_STATUS sme_update_wes_mode(tHalHandle hHal, bool isWESModeEnabled,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006606 uint8_t sessionId)
6607{
6608 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306609 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006610
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006611 if (sessionId >= CSR_ROAM_SESSION_MAX) {
6612 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6613 FL("Invalid sme session id: %d"), sessionId);
6614 return QDF_STATUS_E_INVAL;
6615 }
6616
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006617 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306618 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306619 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006620 "LFR runtime successfully set WES Mode to %d - old value is %d - roam state is %s",
6621 isWESModeEnabled,
6622 pMac->roam.configParam.isWESModeEnabled,
6623 mac_trace_get_neighbour_roam_state(pMac->roam.
6624 neighborRoamInfo
6625 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306626 neighborRoamState));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006627 pMac->roam.configParam.isWESModeEnabled = isWESModeEnabled;
6628 sme_release_global_lock(&pMac->sme);
6629 }
6630
6631 return status;
6632}
6633
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306634/*
6635 * sme_set_roam_scan_control() -
6636 * Set roam scan control
6637 * This function is called to set roam scan control
6638 * if roam scan control is set to 0, roaming scan cache is cleared
6639 * any value other than 0 is treated as invalid value
6640 * hHal - HAL handle for device
6641 * sessionId - Session Identifier
6642 * Return QDF_STATUS_SUCCESS - SME update config successfully.
6643 * Other status means SME failure to update
6644 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306645QDF_STATUS sme_set_roam_scan_control(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006646 bool roamScanControl)
6647{
6648 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306649 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006650
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306651 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006652 TRACE_CODE_SME_RX_HDD_SET_SCANCTRL, NO_SESSION, 0));
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006653
6654 if (sessionId >= CSR_ROAM_SESSION_MAX) {
6655 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6656 FL("Invalid sme session id: %d"), sessionId);
6657 return QDF_STATUS_E_INVAL;
6658 }
6659
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006660 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306661 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306662 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006663 "LFR runtime successfully set roam scan control to %d - old value is %d - roam state is %s",
6664 roamScanControl,
6665 pMac->roam.configParam.nRoamScanControl,
6666 mac_trace_get_neighbour_roam_state(pMac->roam.
6667 neighborRoamInfo
6668 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306669 neighborRoamState));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006670 pMac->roam.configParam.nRoamScanControl = roamScanControl;
6671 if (0 == roamScanControl) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306672 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006673 "LFR runtime successfully cleared roam scan cache");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306674 csr_flush_cfg_bg_scan_roam_channel_list(pMac,
6675 sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006676 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
6677 csr_roam_offload_scan(pMac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306678 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6679 REASON_FLUSH_CHANNEL_LIST);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006680 }
6681 }
6682 sme_release_global_lock(&pMac->sme);
6683 }
6684 return status;
6685}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006686
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306687/*
6688 * sme_update_is_fast_roam_ini_feature_enabled() - enable/disable LFR
6689 * support at runtime
6690 * It is used at in the REG_DYNAMIC_VARIABLE macro definition of
6691 * isFastRoamIniFeatureEnabled.
6692 * This is a synchronous call
6693 *
6694 * hHal - The handle returned by mac_open.
6695 * sessionId - Session Identifier
6696 * Return QDF_STATUS_SUCCESS - SME update isFastRoamIniFeatureEnabled config
6697 * successfully.
6698 * Other status means SME is failed to update isFastRoamIniFeatureEnabled.
6699 */
6700QDF_STATUS sme_update_is_fast_roam_ini_feature_enabled(tHalHandle hHal,
6701 uint8_t sessionId, const bool isFastRoamIniFeatureEnabled)
6702{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006703 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6704
6705 if (pMac->roam.configParam.isFastRoamIniFeatureEnabled ==
6706 isFastRoamIniFeatureEnabled) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306707 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006708 "%s: FastRoam is already enabled or disabled, nothing to do (returning) old(%d) new(%d)",
6709 __func__,
6710 pMac->roam.configParam.isFastRoamIniFeatureEnabled,
6711 isFastRoamIniFeatureEnabled);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306712 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006713 }
6714
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306715 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006716 "%s: FastRoamEnabled is changed from %d to %d", __func__,
6717 pMac->roam.configParam.isFastRoamIniFeatureEnabled,
6718 isFastRoamIniFeatureEnabled);
6719 pMac->roam.configParam.isFastRoamIniFeatureEnabled =
6720 isFastRoamIniFeatureEnabled;
6721 csr_neighbor_roam_update_fast_roaming_enabled(pMac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306722 isFastRoamIniFeatureEnabled);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006723
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306724 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006725}
6726
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306727/**
6728 * sme_config_fast_roaming() - enable/disable LFR support at runtime
6729 * @hal - The handle returned by macOpen.
6730 * @session_id - Session Identifier
6731 * @is_fast_roam_enabled - flag to enable/disable roaming
6732 *
6733 * When Supplicant issues enabled/disable fast roaming on the basis
6734 * of the Bssid modification in network block (e.g. AutoJoin mode N/W block)
6735 *
6736 * Return: QDF_STATUS
6737 */
6738
6739QDF_STATUS sme_config_fast_roaming(tHalHandle hal, uint8_t session_id,
6740 const bool is_fast_roam_enabled)
6741{
6742 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05306743 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306744 QDF_STATUS status;
6745
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006746 /*
6747 * supplicant_disabled_roaming flag is set to true in
6748 * wlan_hdd_cfg80211_connect_start when supplicant initiate connect
6749 * request with BSSID. This flag is reset when supplicant sends
6750 * vendor command to enable roaming after association.
Arif Hussaina48a9c02017-01-31 14:37:45 -08006751 *
6752 * This request from wpa_supplicant will be skipped in this function
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006753 * if roaming is disabled using driver command or INI and
6754 * supplicant_disabled_roaming flag remains set. So make sure to set
6755 * supplicant_disabled_roaming flag as per wpa_supplicant even if roam
6756 * request from wpa_supplicant ignored.
Arif Hussaina48a9c02017-01-31 14:37:45 -08006757 */
6758 if (session && session->pCurRoamProfile)
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006759 session->pCurRoamProfile->supplicant_disabled_roaming =
6760 !is_fast_roam_enabled;
Arif Hussaina48a9c02017-01-31 14:37:45 -08006761
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306762 if (!mac_ctx->roam.configParam.isFastRoamIniFeatureEnabled) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006763 sme_debug("Fast roam is disabled through ini");
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306764 if (!is_fast_roam_enabled)
6765 return QDF_STATUS_SUCCESS;
6766 return QDF_STATUS_E_FAILURE;
6767 }
Sreelakshmi Konamkibda5bbf2016-09-12 18:38:10 +05306768
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306769 status = csr_neighbor_roam_update_fast_roaming_enabled(mac_ctx,
6770 session_id, is_fast_roam_enabled);
6771 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006772 sme_err("update fast roaming failed. status: %d", status);
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306773 return QDF_STATUS_E_FAILURE;
6774 }
6775
6776 return QDF_STATUS_SUCCESS;
6777}
6778
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306779/*
6780 * sme_update_is_mawc_ini_feature_enabled() -
6781 * Enable/disable LFR MAWC support at runtime
6782 * It is used at in the REG_DYNAMIC_VARIABLE macro definition of
6783 * isMAWCIniFeatureEnabled.
6784 * This is a synchronous call
6785 *
6786 * hHal - The handle returned by mac_open.
6787 * Return QDF_STATUS_SUCCESS - SME update MAWCEnabled config successfully.
6788 * Other status means SME is failed to update MAWCEnabled.
6789 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306790QDF_STATUS sme_update_is_mawc_ini_feature_enabled(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006791 const bool MAWCEnabled)
6792{
6793 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306794 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006795
6796 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306797 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05306798 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006799 "%s: MAWCEnabled is changed from %d to %d", __func__,
Varun Reddy Yeturu061d4d62017-07-20 09:39:32 -07006800 pMac->roam.configParam.csr_mawc_config.mawc_enabled,
6801 MAWCEnabled);
6802 pMac->roam.configParam.csr_mawc_config.mawc_enabled =
6803 MAWCEnabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006804 sme_release_global_lock(&pMac->sme);
6805 }
6806
6807 return status;
6808
6809}
6810
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006811/**
6812 * sme_stop_roaming() - Stop roaming for a given sessionId
6813 * This is a synchronous call
6814 *
6815 * @hHal - The handle returned by mac_open
6816 * @sessionId - Session Identifier
6817 *
6818 * Return QDF_STATUS_SUCCESS on success
6819 * Other status on failure
6820 */
6821QDF_STATUS sme_stop_roaming(tHalHandle hal, uint8_t session_id, uint8_t reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006822{
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006823 struct scheduler_msg wma_msg = {0};
Jeff Johnsonc09caa42018-06-07 22:58:55 -07006824 QDF_STATUS status;
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006825 tSirRoamOffloadScanReq *req;
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006826 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
6827 tpCsrNeighborRoamControlInfo roam_info;
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006828 struct csr_roam_session *session;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006829
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006830 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006831 sme_err("incorrect session/vdev ID");
6832 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006833 }
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006834
6835 session = CSR_GET_SESSION(mac_ctx, session_id);
Abhishek Singh1f217ec2017-12-22 11:48:27 +05306836
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +05306837 /*
6838 * set the driver_disabled_roaming flag to true even if roaming
6839 * is not enabled on this session so that roam start requests for
6840 * this session can be blocked until driver enables roaming
6841 */
Vignesh Viswanathan3d478032018-08-02 20:18:53 +05306842 if (reason == ecsr_driver_disabled && session->pCurRoamProfile &&
6843 session->pCurRoamProfile->csrPersona == QDF_STA_MODE) {
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +05306844 session->pCurRoamProfile->driver_disabled_roaming = true;
6845 sme_debug("driver_disabled_roaming set for session %d",
6846 session_id);
6847 }
6848
Abhishek Singh1f217ec2017-12-22 11:48:27 +05306849 roam_info = &mac_ctx->roam.neighborRoamInfo[session_id];
6850 if (!roam_info->b_roam_scan_offload_started) {
6851 sme_debug("Roaming already disabled for session %d", session_id);
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006852 return QDF_STATUS_SUCCESS;
6853 }
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006854 req = qdf_mem_malloc(sizeof(*req));
Arif Hussain0ef77082018-10-10 16:42:53 -07006855 if (!req)
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006856 return QDF_STATUS_E_NOMEM;
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006857
6858 req->Command = ROAM_SCAN_OFFLOAD_STOP;
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +05306859 if ((reason == eCsrForcedDisassoc) || reason == ecsr_driver_disabled)
Abhishek Singh533c9da2017-05-04 10:23:34 +05306860 req->reason = REASON_ROAM_STOP_ALL;
6861 else
Varun Reddy Yeturubc1bea02018-02-01 18:12:34 -08006862 req->reason = REASON_SME_ISSUED;
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006863 req->sessionId = session_id;
6864 if (csr_neighbor_middle_of_roaming(mac_ctx, session_id))
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006865 req->middle_of_roaming = 1;
6866 else
6867 csr_roam_reset_roam_params(mac_ctx);
6868
6869 wma_msg.type = WMA_ROAM_SCAN_OFFLOAD_REQ;
6870 wma_msg.bodyptr = req;
6871
6872 status = wma_post_ctrl_msg(mac_ctx, &wma_msg);
Jeff Johnsonc09caa42018-06-07 22:58:55 -07006873 if (QDF_STATUS_SUCCESS != status) {
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006874 sme_err("WMA_ROAM_SCAN_OFFLOAD_REQ failed, session_id: %d",
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006875 session_id);
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006876 qdf_mem_free(req);
6877 return QDF_STATUS_E_FAULT;
6878 }
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006879 roam_info->b_roam_scan_offload_started = false;
6880 roam_info->last_sent_cmd = ROAM_SCAN_OFFLOAD_STOP;
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006881
6882 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006883}
6884
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306885/*
6886 * sme_start_roaming() - Start roaming for a given sessionId
6887 * This is a synchronous call
6888 *
6889 * hHal - The handle returned by mac_open
6890 * sessionId - Session Identifier
6891 * Return QDF_STATUS_SUCCESS on success
6892 * Other status on failure
6893 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306894QDF_STATUS sme_start_roaming(tHalHandle hHal, uint8_t sessionId, uint8_t reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006895{
6896 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306897 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006898
6899 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306900 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006901 csr_roam_offload_scan(pMac, sessionId, ROAM_SCAN_OFFLOAD_START,
6902 reason);
6903 sme_release_global_lock(&pMac->sme);
6904 }
6905
6906 return status;
6907}
6908
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306909/*
6910 * sme_update_enable_fast_roam_in_concurrency() - enable/disable LFR if
6911 * Concurrent session exists
6912 * This is a synchronuous call
6913 *
6914 * hHal - The handle returned by mac_open.
6915 * Return QDF_STATUS_SUCCESS
6916 * Other status means SME is failed
6917 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306918QDF_STATUS sme_update_enable_fast_roam_in_concurrency(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006919 bool
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306920 bFastRoamInConIniFeatureEnabled)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006921{
6922
6923 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306924 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006925
6926 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306927 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006928 pMac->roam.configParam.bFastRoamInConIniFeatureEnabled =
6929 bFastRoamInConIniFeatureEnabled;
6930 if (0 == pMac->roam.configParam.isRoamOffloadScanEnabled) {
6931 pMac->roam.configParam.bFastRoamInConIniFeatureEnabled =
6932 0;
6933 }
6934 sme_release_global_lock(&pMac->sme);
6935 }
6936
6937 return status;
6938}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006939
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306940/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306941 * sme_set_roam_opportunistic_scan_threshold_diff() -
6942 * Update Opportunistic Scan threshold diff
6943 * This function is called through dynamic setConfig callback function
6944 * to configure nOpportunisticThresholdDiff
6945 *
6946 * hHal - HAL handle for device
6947 * sessionId - Session Identifier
6948 * nOpportunisticThresholdDiff - Opportunistic Scan threshold diff
6949 * Return QDF_STATUS_SUCCESS - SME update nOpportunisticThresholdDiff config
6950 * successfully.
6951 * else SME is failed to update nOpportunisticThresholdDiff.
6952 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306953QDF_STATUS sme_set_roam_opportunistic_scan_threshold_diff(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006954 uint8_t sessionId,
6955 const uint8_t
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306956 nOpportunisticThresholdDiff)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006957{
6958 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306959 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006960
6961 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306962 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07006963 status = csr_neighbor_roam_update_config(pMac, sessionId,
6964 nOpportunisticThresholdDiff,
6965 REASON_OPPORTUNISTIC_THRESH_DIFF_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306966 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006967 pMac->roam.configParam.neighborRoamConfig.
6968 nOpportunisticThresholdDiff =
6969 nOpportunisticThresholdDiff;
6970 }
6971 sme_release_global_lock(&pMac->sme);
6972 }
6973 return status;
6974}
6975
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306976/*
6977 * sme_get_roam_opportunistic_scan_threshold_diff()
6978 * gets Opportunistic Scan threshold diff
6979 * This is a synchronous call
6980 *
6981 * hHal - The handle returned by mac_open
6982 * Return uint8_t - nOpportunisticThresholdDiff
6983 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006984uint8_t sme_get_roam_opportunistic_scan_threshold_diff(tHalHandle hHal)
6985{
6986 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306987
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006988 return pMac->roam.configParam.neighborRoamConfig.
6989 nOpportunisticThresholdDiff;
6990}
6991
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306992/*
6993 * sme_set_roam_rescan_rssi_diff() - Update roam rescan rssi diff
6994 * This function is called through dynamic setConfig callback function
6995 * to configure nRoamRescanRssiDiff
6996 *
6997 * hHal - HAL handle for device
6998 * sessionId - Session Identifier
6999 * nRoamRescanRssiDiff - roam rescan rssi diff
7000 * Return QDF_STATUS_SUCCESS - SME update nRoamRescanRssiDiff config
7001 * successfully.
7002 * else SME is failed to update nRoamRescanRssiDiff.
7003 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307004QDF_STATUS sme_set_roam_rescan_rssi_diff(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007005 uint8_t sessionId,
7006 const uint8_t nRoamRescanRssiDiff)
7007{
7008 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307009 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007010
7011 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307012 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07007013 status = csr_neighbor_roam_update_config(pMac, sessionId,
7014 nRoamRescanRssiDiff,
7015 REASON_ROAM_RESCAN_RSSI_DIFF_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307016 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007017 pMac->roam.configParam.neighborRoamConfig.
7018 nRoamRescanRssiDiff = nRoamRescanRssiDiff;
7019 }
7020 sme_release_global_lock(&pMac->sme);
7021 }
7022 return status;
7023}
7024
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307025/*
7026 * sme_get_roam_rescan_rssi_diff()
7027 * gets roam rescan rssi diff
7028 * This is a synchronous call
7029 *
7030 * hHal - The handle returned by mac_open
7031 * Return int8_t - nRoamRescanRssiDiff
7032 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007033uint8_t sme_get_roam_rescan_rssi_diff(tHalHandle hHal)
7034{
7035 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307036
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007037 return pMac->roam.configParam.neighborRoamConfig.nRoamRescanRssiDiff;
7038}
7039
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307040/*
7041 * sme_set_roam_bmiss_first_bcnt() -
7042 * Update Roam count for first beacon miss
7043 * This function is called through dynamic setConfig callback function
7044 * to configure nRoamBmissFirstBcnt
7045 * hHal - HAL handle for device
7046 * sessionId - Session Identifier
7047 * nRoamBmissFirstBcnt - Roam first bmiss count
7048 * Return QDF_STATUS_SUCCESS - SME update nRoamBmissFirstBcnt
7049 * successfully.
7050 * else SME is failed to update nRoamBmissFirstBcnt
7051 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307052QDF_STATUS sme_set_roam_bmiss_first_bcnt(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007053 uint8_t sessionId,
7054 const uint8_t nRoamBmissFirstBcnt)
7055{
7056 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307057 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007058
7059 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307060 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07007061 status = csr_neighbor_roam_update_config(pMac, sessionId,
7062 nRoamBmissFirstBcnt,
7063 REASON_ROAM_BMISS_FIRST_BCNT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307064 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007065 pMac->roam.configParam.neighborRoamConfig.
7066 nRoamBmissFirstBcnt = nRoamBmissFirstBcnt;
7067 }
7068 sme_release_global_lock(&pMac->sme);
7069 }
7070 return status;
7071}
7072
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307073/*
7074 * sme_get_roam_bmiss_first_bcnt() -
7075 * get neighbor roam beacon miss first count
7076 *
7077 * hHal - The handle returned by mac_open.
7078 * Return uint8_t - neighbor roam beacon miss first count
7079 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007080uint8_t sme_get_roam_bmiss_first_bcnt(tHalHandle hHal)
7081{
7082 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307083
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007084 return pMac->roam.configParam.neighborRoamConfig.nRoamBmissFirstBcnt;
7085}
7086
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307087/*
7088 * sme_set_roam_bmiss_final_bcnt() -
7089 * Update Roam count for final beacon miss
7090 * This function is called through dynamic setConfig callback function
7091 * to configure nRoamBmissFinalBcnt
7092 * hHal - HAL handle for device
7093 * sessionId - Session Identifier
7094 * nRoamBmissFinalBcnt - Roam final bmiss count
7095 * Return QDF_STATUS_SUCCESS - SME update nRoamBmissFinalBcnt
7096 * successfully.
7097 * else SME is failed to update nRoamBmissFinalBcnt
7098 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307099QDF_STATUS sme_set_roam_bmiss_final_bcnt(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007100 uint8_t sessionId,
7101 const uint8_t nRoamBmissFinalBcnt)
7102{
7103 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307104 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007105
7106 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307107 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07007108 status = csr_neighbor_roam_update_config(pMac, sessionId,
7109 nRoamBmissFinalBcnt,
7110 REASON_ROAM_BMISS_FINAL_BCNT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307111 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007112 pMac->roam.configParam.neighborRoamConfig.
7113 nRoamBmissFinalBcnt = nRoamBmissFinalBcnt;
7114 }
7115 sme_release_global_lock(&pMac->sme);
7116 }
7117 return status;
7118}
7119
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307120/*
7121 * sme_get_roam_bmiss_final_bcnt() -
7122 * gets Roam count for final beacon miss
7123 * This is a synchronous call
7124 *
7125 * hHal - The handle returned by mac_open
7126 * Return uint8_t - nRoamBmissFinalBcnt
7127 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007128uint8_t sme_get_roam_bmiss_final_bcnt(tHalHandle hHal)
7129{
7130 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307131
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007132 return pMac->roam.configParam.neighborRoamConfig.nRoamBmissFinalBcnt;
7133}
7134
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307135/*
7136 * sme_set_roam_beacon_rssi_weight() -
7137 * Update Roam beacon rssi weight
7138 * This function is called through dynamic setConfig callback function
7139 * to configure nRoamBeaconRssiWeight
7140 *
7141 * hHal - HAL handle for device
7142 * sessionId - Session Identifier
7143 * nRoamBeaconRssiWeight - Roam beacon rssi weight
7144 * Return QDF_STATUS_SUCCESS - SME update nRoamBeaconRssiWeight config
7145 * successfully.
7146 * else SME is failed to update nRoamBeaconRssiWeight
7147 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307148QDF_STATUS sme_set_roam_beacon_rssi_weight(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007149 uint8_t sessionId,
7150 const uint8_t nRoamBeaconRssiWeight)
7151{
7152 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307153 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007154
7155 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307156 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07007157 status = csr_neighbor_roam_update_config(pMac, sessionId,
7158 nRoamBeaconRssiWeight,
7159 REASON_ROAM_BEACON_RSSI_WEIGHT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307160 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007161 pMac->roam.configParam.neighborRoamConfig.
7162 nRoamBeaconRssiWeight = nRoamBeaconRssiWeight;
7163 }
7164 sme_release_global_lock(&pMac->sme);
7165 }
7166 return status;
7167}
7168
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307169/*
7170 * sme_get_roam_beacon_rssi_weight() -
7171 * gets Roam beacon rssi weight
7172 * This is a synchronous call
7173 *
7174 * hHal - The handle returned by mac_open
7175 * Return uint8_t - nRoamBeaconRssiWeight
7176 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007177uint8_t sme_get_roam_beacon_rssi_weight(tHalHandle hHal)
7178{
7179 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307180
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007181 return pMac->roam.configParam.neighborRoamConfig.nRoamBeaconRssiWeight;
7182}
7183
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307184/*
7185 * sme_set_neighbor_lookup_rssi_threshold() - update neighbor lookup
7186 * rssi threshold
7187 * This is a synchronous call
7188 *
7189 * hHal - The handle returned by mac_open.
7190 * sessionId - Session Identifier
7191 * Return QDF_STATUS_SUCCESS - SME update config successful.
7192 * Other status means SME is failed to update
7193 */
7194QDF_STATUS sme_set_neighbor_lookup_rssi_threshold(tHalHandle hHal,
7195 uint8_t sessionId, uint8_t neighborLookupRssiThreshold)
7196{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007197 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307198 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007199
7200 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307201 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07007202 status = csr_neighbor_roam_update_config(pMac,
7203 sessionId, neighborLookupRssiThreshold,
7204 REASON_LOOKUP_THRESH_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307205 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007206 pMac->roam.configParam.neighborRoamConfig.
7207 nNeighborLookupRssiThreshold =
7208 neighborLookupRssiThreshold;
7209 }
7210 sme_release_global_lock(&pMac->sme);
7211 }
7212 return status;
7213}
7214
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307215/*
7216 * sme_set_delay_before_vdev_stop() - update delay before VDEV_STOP
7217 * This is a synchronous call
7218 *
7219 * hal - The handle returned by macOpen.
7220 * session_id - Session Identifier
7221 * delay_before_vdev_stop - value to be set
7222 * Return QDF_STATUS_SUCCESS - SME update config successful.
7223 * Other status means SME is failed to update
7224 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307225QDF_STATUS sme_set_delay_before_vdev_stop(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007226 uint8_t session_id,
7227 uint8_t delay_before_vdev_stop)
7228{
7229 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307230 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007231
7232 if (session_id >= CSR_ROAM_SESSION_MAX) {
7233 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7234 FL("Invalid sme session id: %d"), session_id);
7235 return QDF_STATUS_E_INVAL;
7236 }
7237
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007238 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307239 if (QDF_IS_STATUS_SUCCESS(status)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307240 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
7241 "LFR param delay_before_vdev_stop changed from %d to %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007242 pMac->roam.configParam.neighborRoamConfig.
7243 delay_before_vdev_stop,
7244 delay_before_vdev_stop);
7245 pMac->roam.neighborRoamInfo[session_id].cfgParams.
7246 delay_before_vdev_stop = delay_before_vdev_stop;
7247 pMac->roam.configParam.neighborRoamConfig.
7248 delay_before_vdev_stop = delay_before_vdev_stop;
7249 sme_release_global_lock(&pMac->sme);
7250 }
7251 return status;
7252}
7253
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307254/*
7255 * sme_get_neighbor_lookup_rssi_threshold() - get neighbor lookup
7256 * rssi threshold
7257 * This is a synchronous call
7258 *
7259 * hHal - The handle returned by mac_open.
7260 * Return QDF_STATUS_SUCCESS - SME update config successful.
7261 * Other status means SME is failed to update
7262 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007263uint8_t sme_get_neighbor_lookup_rssi_threshold(tHalHandle hHal)
7264{
7265 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307266
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007267 return pMac->roam.configParam.neighborRoamConfig.
7268 nNeighborLookupRssiThreshold;
7269}
7270
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307271/*
7272 * sme_set_neighbor_scan_refresh_period() - set neighbor scan results
7273 * refresh period
7274 * This is a synchronous call
7275 *
7276 * hHal - The handle returned by mac_open.
7277 * sessionId - Session Identifier
7278 * Return QDF_STATUS_SUCCESS - SME update config successful.
7279 * Other status means SME is failed to update
7280 */
7281QDF_STATUS sme_set_neighbor_scan_refresh_period(tHalHandle hHal,
7282 uint8_t sessionId, uint16_t neighborScanResultsRefreshPeriod)
7283{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007284 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307285 QDF_STATUS status = QDF_STATUS_SUCCESS;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05307286 struct csr_neighbor_roamconfig *pNeighborRoamConfig = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007287 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
7288
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007289 if (sessionId >= CSR_ROAM_SESSION_MAX) {
7290 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7291 FL("Invalid sme session id: %d"), sessionId);
7292 return QDF_STATUS_E_INVAL;
7293 }
7294
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007295 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307296 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007297 pNeighborRoamConfig =
7298 &pMac->roam.configParam.neighborRoamConfig;
7299 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307300 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007301 "LFR runtime successfully set roam scan refresh period to %d- old value is %d - roam state is %s",
7302 neighborScanResultsRefreshPeriod,
7303 pMac->roam.configParam.neighborRoamConfig.
7304 nNeighborResultsRefreshPeriod,
7305 mac_trace_get_neighbour_roam_state(pMac->roam.
7306 neighborRoamInfo
7307 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307308 neighborRoamState));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007309 pNeighborRoamConfig->nNeighborResultsRefreshPeriod =
7310 neighborScanResultsRefreshPeriod;
7311 pNeighborRoamInfo->cfgParams.neighborResultsRefreshPeriod =
7312 neighborScanResultsRefreshPeriod;
7313
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307314 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
7315 csr_roam_offload_scan(pMac, sessionId,
7316 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
7317 REASON_NEIGHBOR_SCAN_REFRESH_PERIOD_CHANGED);
7318 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007319 sme_release_global_lock(&pMac->sme);
7320 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307321
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007322 return status;
7323}
7324
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307325/*
7326 * sme_update_roam_scan_offload_enabled() - enable/disable roam scan
7327 * offload feaure
7328 * It is used at in the REG_DYNAMIC_VARIABLE macro definition of
7329 * gRoamScanOffloadEnabled.
7330 * This is a synchronous call
7331 *
7332 * hHal - The handle returned by mac_open.
7333 * Return QDF_STATUS_SUCCESS - SME update config successfully.
7334 * Other status means SME is failed to update.
7335 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307336QDF_STATUS sme_update_roam_scan_offload_enabled(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007337 bool nRoamScanOffloadEnabled)
7338{
7339 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
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)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307344 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307345 "gRoamScanOffloadEnabled is changed from %d to %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007346 pMac->roam.configParam.isRoamOffloadScanEnabled,
7347 nRoamScanOffloadEnabled);
7348 pMac->roam.configParam.isRoamOffloadScanEnabled =
7349 nRoamScanOffloadEnabled;
7350 sme_release_global_lock(&pMac->sme);
7351 }
7352
7353 return status;
7354}
7355
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307356/*
7357 * sme_get_neighbor_scan_refresh_period() - get neighbor scan results
7358 * refresh period
7359 * This is a synchronous call
7360 *
7361 * \param hHal - The handle returned by mac_open.
7362 * \return uint16_t - Neighbor scan results refresh period value
7363 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007364uint16_t sme_get_neighbor_scan_refresh_period(tHalHandle hHal)
7365{
7366 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307367
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007368 return pMac->roam.configParam.neighborRoamConfig.
7369 nNeighborResultsRefreshPeriod;
7370}
7371
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307372/*
7373 * sme_get_empty_scan_refresh_period() - get empty scan refresh period
7374 * This is a synchronuous call
7375 *
7376 * hHal - The handle returned by mac_open.
7377 * Return QDF_STATUS_SUCCESS - SME update config successful.
7378 * Other status means SME is failed to update
7379 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007380uint16_t sme_get_empty_scan_refresh_period(tHalHandle hHal)
7381{
7382 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307383
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007384 return pMac->roam.configParam.neighborRoamConfig.
7385 nEmptyScanRefreshPeriod;
7386}
7387
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307388/*
7389 * sme_update_empty_scan_refresh_period
7390 * Update nEmptyScanRefreshPeriod
7391 * This function is called through dynamic setConfig callback function
7392 * to configure nEmptyScanRefreshPeriod
7393 * Usage: adb shell iwpriv wlan0 setConfig
7394 * nEmptyScanRefreshPeriod=[0 .. 60]
7395 *
7396 * hHal - HAL handle for device
7397 * sessionId - Session Identifier
7398 * nEmptyScanRefreshPeriod - scan period following empty scan results.
7399 * Return Success or failure
7400 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007401
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307402QDF_STATUS sme_update_empty_scan_refresh_period(tHalHandle hHal, uint8_t
7403 sessionId, uint16_t
7404 nEmptyScanRefreshPeriod)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007405{
7406 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307407 QDF_STATUS status = QDF_STATUS_SUCCESS;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05307408 struct csr_neighbor_roamconfig *pNeighborRoamConfig = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007409 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
7410
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007411 if (sessionId >= CSR_ROAM_SESSION_MAX) {
7412 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7413 FL("Invalid sme session id: %d"), sessionId);
7414 return QDF_STATUS_E_INVAL;
7415 }
7416
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007417 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307418 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007419 pNeighborRoamConfig =
7420 &pMac->roam.configParam.neighborRoamConfig;
7421 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307422 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007423 "LFR runtime successfully set roam scan period to %d -old value is %d - roam state is %s",
7424 nEmptyScanRefreshPeriod,
7425 pMac->roam.configParam.neighborRoamConfig.
7426 nEmptyScanRefreshPeriod,
7427 mac_trace_get_neighbour_roam_state(pMac->roam.
7428 neighborRoamInfo
7429 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307430 neighborRoamState));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007431 pNeighborRoamConfig->nEmptyScanRefreshPeriod =
7432 nEmptyScanRefreshPeriod;
7433 pNeighborRoamInfo->cfgParams.emptyScanRefreshPeriod =
7434 nEmptyScanRefreshPeriod;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307435
7436 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
7437 csr_roam_offload_scan(pMac, sessionId,
7438 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
7439 REASON_EMPTY_SCAN_REF_PERIOD_CHANGED);
7440 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007441 sme_release_global_lock(&pMac->sme);
7442 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307443
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007444 return status;
7445}
7446
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307447/*
7448 * sme_set_neighbor_scan_min_chan_time() -
7449 * Update nNeighborScanMinChanTime
7450 * This function is called through dynamic setConfig callback function
7451 * to configure gNeighborScanChannelMinTime
7452 * Usage: adb shell iwpriv wlan0 setConfig
7453 * gNeighborScanChannelMinTime=[0 .. 60]
7454 *
7455 * hHal - HAL handle for device
7456 * nNeighborScanMinChanTime - Channel minimum dwell time
7457 * sessionId - Session Identifier
7458 * Return Success or failure
7459 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307460QDF_STATUS sme_set_neighbor_scan_min_chan_time(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007461 const uint16_t
7462 nNeighborScanMinChanTime,
7463 uint8_t sessionId)
7464{
7465 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307466 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007467
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007468 if (sessionId >= CSR_ROAM_SESSION_MAX) {
7469 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7470 FL("Invalid sme session id: %d"), sessionId);
7471 return QDF_STATUS_E_INVAL;
7472 }
7473
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007474 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307475 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307476 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007477 "LFR runtime successfully set channel min dwell time to %d - old value is %d - roam state is %s",
7478 nNeighborScanMinChanTime,
7479 pMac->roam.configParam.neighborRoamConfig.
7480 nNeighborScanMinChanTime,
7481 mac_trace_get_neighbour_roam_state(pMac->roam.
7482 neighborRoamInfo
7483 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307484 neighborRoamState));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007485
7486 pMac->roam.configParam.neighborRoamConfig.
7487 nNeighborScanMinChanTime = nNeighborScanMinChanTime;
7488 pMac->roam.neighborRoamInfo[sessionId].cfgParams.
7489 minChannelScanTime = nNeighborScanMinChanTime;
7490 sme_release_global_lock(&pMac->sme);
7491 }
7492
7493 return status;
7494}
7495
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307496/*
7497 * sme_set_neighbor_scan_max_chan_time() -
7498 * Update nNeighborScanMaxChanTime
7499 * This function is called through dynamic setConfig callback function
7500 * to configure gNeighborScanChannelMaxTime
7501 * Usage: adb shell iwpriv wlan0 setConfig
7502 * gNeighborScanChannelMaxTime=[0 .. 60]
7503 *
7504 * hHal - HAL handle for device
7505 * sessionId - Session Identifier
7506 * nNeighborScanMinChanTime - Channel maximum dwell time
7507 * Return Success or failure
7508 */
7509QDF_STATUS sme_set_neighbor_scan_max_chan_time(tHalHandle hHal, uint8_t
7510 sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007511 const uint16_t
7512 nNeighborScanMaxChanTime)
7513{
7514 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307515 QDF_STATUS status = QDF_STATUS_SUCCESS;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05307516 struct csr_neighbor_roamconfig *pNeighborRoamConfig = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007517 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
7518
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007519 if (sessionId >= CSR_ROAM_SESSION_MAX) {
7520 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7521 FL("Invalid sme session id: %d"), sessionId);
7522 return QDF_STATUS_E_INVAL;
7523 }
7524
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007525 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307526 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007527 pNeighborRoamConfig =
7528 &pMac->roam.configParam.neighborRoamConfig;
7529 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307530 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007531 "LFR runtime successfully set channel max dwell time to %d - old value is %d - roam state is %s",
7532 nNeighborScanMaxChanTime,
7533 pMac->roam.configParam.neighborRoamConfig.
7534 nNeighborScanMaxChanTime,
7535 mac_trace_get_neighbour_roam_state(pMac->roam.
7536 neighborRoamInfo
7537 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307538 neighborRoamState));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007539 pNeighborRoamConfig->nNeighborScanMaxChanTime =
7540 nNeighborScanMaxChanTime;
7541 pNeighborRoamInfo->cfgParams.maxChannelScanTime =
7542 nNeighborScanMaxChanTime;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307543 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
7544 csr_roam_offload_scan(pMac, sessionId,
7545 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
7546 REASON_SCAN_CH_TIME_CHANGED);
7547 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007548 sme_release_global_lock(&pMac->sme);
7549 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307550
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007551
7552 return status;
7553}
7554
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307555/*
7556 * sme_get_neighbor_scan_min_chan_time() -
7557 * get neighbor scan min channel time
7558 *
7559 * hHal - The handle returned by mac_open.
7560 * sessionId - Session Identifier
7561 * Return uint16_t - channel min time value
7562 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007563uint16_t sme_get_neighbor_scan_min_chan_time(tHalHandle hHal, uint8_t sessionId)
7564{
7565 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007566
7567 if (sessionId >= CSR_ROAM_SESSION_MAX) {
7568 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7569 FL("Invalid sme session id: %d"), sessionId);
7570 return 0;
7571 }
7572
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007573 return pMac->roam.neighborRoamInfo[sessionId].cfgParams.
7574 minChannelScanTime;
7575}
7576
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307577/*
7578 * sme_get_neighbor_roam_state() -
7579 * get neighbor roam state
7580 *
7581 * hHal - The handle returned by mac_open.
7582 * sessionId - Session Identifier
7583 * Return uint32_t - neighbor roam state
7584 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007585uint32_t sme_get_neighbor_roam_state(tHalHandle hHal, uint8_t sessionId)
7586{
7587 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007588
7589 if (sessionId >= CSR_ROAM_SESSION_MAX) {
7590 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7591 FL("Invalid sme session id: %d"), sessionId);
7592 return 0;
7593 }
7594
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007595 return pMac->roam.neighborRoamInfo[sessionId].neighborRoamState;
7596}
7597
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307598/*
7599 * sme_get_current_roam_state() -
7600 * get current roam state
7601 *
7602 * hHal - The handle returned by mac_open.
7603 * sessionId - Session Identifier
7604 * Return uint32_t - current roam state
7605 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007606uint32_t sme_get_current_roam_state(tHalHandle hHal, uint8_t sessionId)
7607{
7608 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307609
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007610 return pMac->roam.curState[sessionId];
7611}
7612
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307613/*
7614 * sme_get_current_roam_sub_state() -
7615 * \brief get neighbor roam sub state
7616 *
7617 * hHal - The handle returned by mac_open.
7618 * sessionId - Session Identifier
7619 * Return uint32_t - current roam sub state
7620 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007621uint32_t sme_get_current_roam_sub_state(tHalHandle hHal, uint8_t sessionId)
7622{
7623 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307624
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007625 return pMac->roam.curSubState[sessionId];
7626}
7627
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307628/*
7629 * sme_get_lim_sme_state() -
7630 * get Lim Sme state
7631 *
7632 * hHal - The handle returned by mac_open.
7633 * Return uint32_t - Lim Sme state
7634 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007635uint32_t sme_get_lim_sme_state(tHalHandle hHal)
7636{
7637 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307638
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007639 return pMac->lim.gLimSmeState;
7640}
7641
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307642/*
7643 * sme_get_lim_mlm_state() -
7644 * get Lim Mlm state
7645 *
7646 * hHal - The handle returned by mac_open.
7647 * Return uint32_t - Lim Mlm state
7648 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007649uint32_t sme_get_lim_mlm_state(tHalHandle hHal)
7650{
7651 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307652
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007653 return pMac->lim.gLimMlmState;
7654}
7655
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307656/*
7657 * sme_is_lim_session_valid() -
7658 * is Lim session valid
7659 *
7660 * hHal - The handle returned by mac_open.
7661 * sessionId - Session Identifier
7662 * Return bool - true or false
7663 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007664bool sme_is_lim_session_valid(tHalHandle hHal, uint8_t sessionId)
7665{
7666 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Hanumantha Reddy Pothula589fd702015-11-17 15:25:16 +05307667
7668 if (sessionId > pMac->lim.maxBssId)
7669 return false;
7670
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007671 return pMac->lim.gpSession[sessionId].valid;
7672}
7673
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307674/*
7675 * sme_get_lim_sme_session_state() -
7676 * get Lim Sme session state
7677 *
7678 * hHal - The handle returned by mac_open.
7679 * sessionId - Session Identifier
7680 * Return uint32_t - Lim Sme session state
7681 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007682uint32_t sme_get_lim_sme_session_state(tHalHandle hHal, uint8_t sessionId)
7683{
7684 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307685
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007686 return pMac->lim.gpSession[sessionId].limSmeState;
7687}
7688
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307689/*
7690 * sme_get_lim_mlm_session_state() -
7691 * \brief get Lim Mlm session state
7692 *
7693 * hHal - The handle returned by mac_open.
7694 * sessionId - Session Identifier
7695 * Return uint32_t - Lim Mlm session state
7696 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007697uint32_t sme_get_lim_mlm_session_state(tHalHandle hHal, uint8_t sessionId)
7698{
7699 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307700
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007701 return pMac->lim.gpSession[sessionId].limMlmState;
7702}
7703
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307704/*
7705 * sme_get_neighbor_scan_max_chan_time() -
7706 * get neighbor scan max channel time
7707 *
7708 * hHal - The handle returned by mac_open.
7709 * sessionId - Session Identifier
7710 * Return uint16_t - channel max time value
7711 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007712uint16_t sme_get_neighbor_scan_max_chan_time(tHalHandle hHal, uint8_t sessionId)
7713{
7714 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007715
7716 if (sessionId >= CSR_ROAM_SESSION_MAX) {
7717 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7718 FL("Invalid sme session id: %d"), sessionId);
7719 return 0;
7720 }
7721
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007722 return pMac->roam.neighborRoamInfo[sessionId].cfgParams.
7723 maxChannelScanTime;
7724}
7725
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307726/*
7727 * sme_set_neighbor_scan_period() -
7728 * Update nNeighborScanPeriod
7729 * This function is called through dynamic setConfig callback function
7730 * to configure nNeighborScanPeriod
7731 * Usage: adb shell iwpriv wlan0 setConfig
7732 * nNeighborScanPeriod=[0 .. 1000]
7733 *
7734 * hHal - HAL handle for device
7735 * sessionId - Session Identifier
7736 * nNeighborScanPeriod - neighbor scan period
7737 * Return Success or failure
7738 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307739QDF_STATUS sme_set_neighbor_scan_period(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007740 const uint16_t nNeighborScanPeriod)
7741{
7742 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307743 QDF_STATUS status = QDF_STATUS_SUCCESS;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05307744 struct csr_neighbor_roamconfig *pNeighborRoamConfig = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007745 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
7746
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007747 if (sessionId >= CSR_ROAM_SESSION_MAX) {
7748 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7749 FL("Invalid sme session id: %d"), sessionId);
7750 return QDF_STATUS_E_INVAL;
7751 }
7752
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007753 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307754 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007755 pNeighborRoamConfig =
7756 &pMac->roam.configParam.neighborRoamConfig;
7757 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307758 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307759 "LFR runtime successfully set neighbor scan period to %d - old value is %d - roam state is %s",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007760 nNeighborScanPeriod,
7761 pMac->roam.configParam.neighborRoamConfig.
7762 nNeighborScanTimerPeriod,
7763 mac_trace_get_neighbour_roam_state(pMac->roam.
7764 neighborRoamInfo
7765 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307766 neighborRoamState));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007767 pNeighborRoamConfig->nNeighborScanTimerPeriod =
7768 nNeighborScanPeriod;
7769 pNeighborRoamInfo->cfgParams.neighborScanPeriod =
7770 nNeighborScanPeriod;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307771
7772 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
7773 csr_roam_offload_scan(pMac, sessionId,
7774 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
7775 REASON_SCAN_HOME_TIME_CHANGED);
7776 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007777 sme_release_global_lock(&pMac->sme);
7778 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007779
7780 return status;
7781}
7782
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307783/*
7784 * sme_get_neighbor_scan_period() -
7785 * get neighbor scan period
7786 *
7787 * hHal - The handle returned by mac_open.
7788 * sessionId - Session Identifier
7789 * Return uint16_t - neighbor scan period
7790 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007791uint16_t sme_get_neighbor_scan_period(tHalHandle hHal, uint8_t sessionId)
7792{
7793 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007794
7795 if (sessionId >= CSR_ROAM_SESSION_MAX) {
7796 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7797 FL("Invalid sme session id: %d"), sessionId);
7798 return 0;
7799 }
7800
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007801 return pMac->roam.neighborRoamInfo[sessionId].cfgParams.
7802 neighborScanPeriod;
7803}
7804
Sridhar Selvaraj1b2330c2017-07-21 15:16:42 +05307805/**
7806 * sme_set_neighbor_scan_min_period() - Update neighbor_scan_min_period
7807 * This function is called through dynamic setConfig callback function
7808 * to configure neighbor_scan_min_period
7809 *
7810 * @hal - HAL handle for device
7811 * @session_id - Session Identifier
7812 * @neighbor_scan_min_period - neighbor scan min period
7813 *
7814 * Return - QDF_STATUS
7815 */
7816QDF_STATUS sme_set_neighbor_scan_min_period(tHalHandle hal,
7817 uint8_t session_id,
7818 const uint16_t
7819 neighbor_scan_min_period)
7820{
7821 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
7822 QDF_STATUS status = QDF_STATUS_SUCCESS;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05307823 struct csr_neighbor_roamconfig *p_neighbor_roam_config = NULL;
Sridhar Selvaraj1b2330c2017-07-21 15:16:42 +05307824 tpCsrNeighborRoamControlInfo p_neighbor_roam_info = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007825
Sridhar Selvaraj1b2330c2017-07-21 15:16:42 +05307826 if (session_id >= CSR_ROAM_SESSION_MAX) {
7827 sme_err("Invalid sme session id: %d", session_id);
7828 return QDF_STATUS_E_INVAL;
7829 }
7830
7831 status = sme_acquire_global_lock(&pmac->sme);
7832 if (QDF_IS_STATUS_SUCCESS(status)) {
7833 p_neighbor_roam_config =
7834 &pmac->roam.configParam.neighborRoamConfig;
7835 p_neighbor_roam_info = &pmac->
7836 roam.neighborRoamInfo[session_id];
7837 sme_debug("LFR:set neighbor scan min period, old:%d, "
7838 "new: %d, state: %s",
7839 pmac->roam.configParam.neighborRoamConfig.
7840 neighbor_scan_min_timer_period,
7841 neighbor_scan_min_period,
7842 mac_trace_get_neighbour_roam_state(pmac->roam.
7843 neighborRoamInfo[session_id].
7844 neighborRoamState));
7845 p_neighbor_roam_config->neighbor_scan_min_timer_period =
7846 neighbor_scan_min_period;
7847 p_neighbor_roam_info->cfgParams.neighbor_scan_min_period =
7848 neighbor_scan_min_period;
7849 sme_release_global_lock(&pmac->sme);
7850 }
7851
7852 return status;
7853}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007854
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307855/*
7856 * sme_get_roam_rssi_diff() - get Roam rssi diff
7857 * This is a synchronous call
7858 *
7859 * hHal - The handle returned by mac_open.
7860 * Return uint16_t - Rssi diff value
7861 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007862uint8_t sme_get_roam_rssi_diff(tHalHandle hHal)
7863{
7864 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307865
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007866 return pMac->roam.configParam.RoamRssiDiff;
7867}
7868
7869/**
7870 * sme_change_roam_scan_channel_list() - to change scan channel list
7871 * @hHal: pointer HAL handle returned by mac_open
7872 * @sessionId: sme session id
7873 * @pChannelList: Output channel list
7874 * @numChannels: Output number of channels
7875 *
7876 * This routine is called to Change roam scan channel list.
7877 * This is a synchronous call
7878 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307879 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007880 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307881QDF_STATUS sme_change_roam_scan_channel_list(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007882 uint8_t *pChannelList,
7883 uint8_t numChannels)
7884{
7885 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307886 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007887 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007888 uint8_t oldChannelList[WNI_CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
7889 uint8_t newChannelList[WNI_CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
7890 uint8_t i = 0, j = 0;
7891 tCsrChannelInfo *chan_info;
7892
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007893 if (sessionId >= CSR_ROAM_SESSION_MAX) {
7894 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7895 FL("Invalid sme session id: %d"), sessionId);
7896 return QDF_STATUS_E_INVAL;
7897 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007898
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007899 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007900 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307901 if (!QDF_IS_STATUS_SUCCESS(status)) {
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307902 sme_err("Failed to acquire SME lock");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007903 return status;
7904 }
7905 chan_info = &pNeighborRoamInfo->cfgParams.channelInfo;
7906
7907 if (NULL != chan_info->ChannelList) {
7908 for (i = 0; i < chan_info->numOfChannels; i++) {
7909 if (j < sizeof(oldChannelList))
7910 j += snprintf(oldChannelList + j,
7911 sizeof(oldChannelList) -
7912 j, "%d",
7913 chan_info->ChannelList[i]);
7914 else
7915 break;
7916 }
7917 }
7918 csr_flush_cfg_bg_scan_roam_channel_list(pMac, sessionId);
7919 csr_create_bg_scan_roam_channel_list(pMac, sessionId, pChannelList,
7920 numChannels);
7921 sme_set_roam_scan_control(hHal, sessionId, 1);
7922 if (NULL != chan_info->ChannelList) {
7923 j = 0;
7924 for (i = 0; i < chan_info->numOfChannels; i++) {
7925 if (j < sizeof(newChannelList))
7926 j += snprintf(newChannelList + j,
7927 sizeof(newChannelList) -
7928 j, " %d",
7929 chan_info->ChannelList[i]);
7930 else
7931 break;
7932 }
7933 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307934 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307935 "LFR runtime successfully set roam scan channels to %s - old value is %s - roam state is %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007936 newChannelList, oldChannelList,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307937 pMac->roam.neighborRoamInfo[sessionId].neighborRoamState);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007938
7939 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
7940 csr_roam_offload_scan(pMac, sessionId,
7941 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
7942 REASON_CHANNEL_LIST_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307943
7944 sme_release_global_lock(&pMac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007945 return status;
7946}
7947
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007948/**
7949 * sme_get_roam_scan_channel_list() - To get roam scan channel list
7950 * @hHal: HAL pointer
7951 * @pChannelList: Output channel list
7952 * @pNumChannels: Output number of channels
7953 * @sessionId: Session Identifier
7954 *
7955 * To get roam scan channel list This is a synchronous call
7956 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307957 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007958 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307959QDF_STATUS sme_get_roam_scan_channel_list(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007960 uint8_t *pChannelList, uint8_t *pNumChannels,
7961 uint8_t sessionId)
7962{
7963 int i = 0;
7964 uint8_t *pOutPtr = pChannelList;
7965 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007966 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307967 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007968
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007969 if (sessionId >= CSR_ROAM_SESSION_MAX) {
7970 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7971 FL("Invalid sme session id: %d"), sessionId);
7972 return QDF_STATUS_E_INVAL;
7973 }
7974
7975 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007976 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307977 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007978 return status;
7979 if (NULL == pNeighborRoamInfo->cfgParams.channelInfo.ChannelList) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307980 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007981 FL("Roam Scan channel list is NOT yet initialized"));
7982 *pNumChannels = 0;
7983 sme_release_global_lock(&pMac->sme);
7984 return status;
7985 }
7986
7987 *pNumChannels = pNeighborRoamInfo->cfgParams.channelInfo.numOfChannels;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307988 for (i = 0; i < (*pNumChannels); i++)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007989 pOutPtr[i] =
7990 pNeighborRoamInfo->cfgParams.channelInfo.ChannelList[i];
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307991
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007992 pOutPtr[i] = '\0';
7993 sme_release_global_lock(&pMac->sme);
7994 return status;
7995}
7996
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307997/*
7998 * sme_get_is_ese_feature_enabled() - get ESE feature enabled or not
7999 * This is a synchronuous call
8000 *
8001 * hHal - The handle returned by mac_open.
8002 * Return true (1) - if the ESE feature is enabled
8003 * false (0) - if feature is disabled (compile or runtime)
8004 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008005bool sme_get_is_ese_feature_enabled(tHalHandle hHal)
8006{
8007#ifdef FEATURE_WLAN_ESE
8008 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308009
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008010 return csr_roam_is_ese_ini_feature_enabled(pMac);
8011#else
8012 return false;
8013#endif
8014}
8015
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308016/*
8017 * sme_get_wes_mode() - get WES Mode
8018 * This is a synchronous call
8019 *
8020 * hHal - The handle returned by mac_open
8021 * Return uint8_t - WES Mode Enabled(1)/Disabled(0)
8022 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008023bool sme_get_wes_mode(tHalHandle hHal)
8024{
8025 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308026
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008027 return pMac->roam.configParam.isWESModeEnabled;
8028}
8029
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308030/*
8031 * sme_get_roam_scan_control() - get scan control
8032 * This is a synchronous call
8033 *
8034 * hHal - The handle returned by mac_open.
8035 * Return bool - Enabled(1)/Disabled(0)
8036 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008037bool sme_get_roam_scan_control(tHalHandle hHal)
8038{
8039 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308040
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008041 return pMac->roam.configParam.nRoamScanControl;
8042}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008043
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308044/*
8045 * sme_get_is_lfr_feature_enabled() - get LFR feature enabled or not
8046 * This is a synchronuous call
8047 * hHal - The handle returned by mac_open.
8048 * Return true (1) - if the feature is enabled
8049 * false (0) - if feature is disabled (compile or runtime)
8050 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008051bool sme_get_is_lfr_feature_enabled(tHalHandle hHal)
8052{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008053 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308054
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008055 return pMac->roam.configParam.isFastRoamIniFeatureEnabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008056}
8057
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308058/*
8059 * sme_get_is_ft_feature_enabled() - get FT feature enabled or not
8060 * This is a synchronuous call
8061 *
8062 * hHal - The handle returned by mac_open.
8063 * Return true (1) - if the feature is enabled
8064 * false (0) - if feature is disabled (compile or runtime)
8065 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008066bool sme_get_is_ft_feature_enabled(tHalHandle hHal)
8067{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008068 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308069
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008070 return pMac->roam.configParam.isFastTransitionEnabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008071}
8072
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07008073/**
8074 * sme_is_feature_supported_by_fw() - check if feature is supported by FW
8075 * @feature: enum value of requested feature.
8076 *
8077 * Retrun: 1 if supported; 0 otherwise
8078 */
8079bool sme_is_feature_supported_by_fw(enum cap_bitmap feature)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008080{
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07008081 return IS_FEATURE_SUPPORTED_BY_FW(feature);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008082}
8083
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308084QDF_STATUS sme_get_link_speed(tHalHandle hHal, tSirLinkSpeedInfo *lsReq,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008085 void *plsContext,
8086 void (*pCallbackfn)(tSirLinkSpeedInfo *indParam,
8087 void *pContext))
8088{
8089
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308090 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnsona5317a62017-01-26 08:51:25 -08008091 tpAniSirGlobal pMac;
Mukul Sharmac3886aa2017-05-04 17:53:22 +05308092 void *wma_handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008093
Jeff Johnsona5317a62017-01-26 08:51:25 -08008094 if (!hHal || !pCallbackfn || !lsReq) {
8095 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8096 FL("Invalid parameter"));
8097 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008098 }
Jeff Johnsona5317a62017-01-26 08:51:25 -08008099
Mukul Sharmac3886aa2017-05-04 17:53:22 +05308100 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
8101 if (!wma_handle) {
8102 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8103 "wma handle is NULL");
8104 return QDF_STATUS_E_FAILURE;
8105 }
8106
Jeff Johnsona5317a62017-01-26 08:51:25 -08008107 pMac = PMAC_STRUCT(hHal);
Jeff Johnsona5317a62017-01-26 08:51:25 -08008108 status = sme_acquire_global_lock(&pMac->sme);
8109 if (QDF_STATUS_SUCCESS != status) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -07008110 sme_err("Failed to acquire global lock");
Jeff Johnsona5317a62017-01-26 08:51:25 -08008111 return QDF_STATUS_E_FAILURE;
8112 }
8113
8114 pMac->sme.pLinkSpeedCbContext = plsContext;
8115 pMac->sme.pLinkSpeedIndCb = pCallbackfn;
gaurank kathpaliaca8f4612018-06-13 14:21:53 +05308116 status = wma_get_link_speed(wma_handle, lsReq);
Jeff Johnsona5317a62017-01-26 08:51:25 -08008117 sme_release_global_lock(&pMac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008118 return status;
8119}
8120
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05308121QDF_STATUS sme_get_peer_stats(tpAniSirGlobal mac,
8122 struct sir_peer_info_req req)
8123{
8124 QDF_STATUS qdf_status;
8125 struct scheduler_msg message = {0};
8126
8127 qdf_status = sme_acquire_global_lock(&mac->sme);
8128 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
8129 sme_debug("Failed to get Lock");
8130 return qdf_status;
8131 }
8132 /* serialize the req through MC thread */
8133 message.bodyptr = qdf_mem_malloc(sizeof(req));
Arif Hussain0ef77082018-10-10 16:42:53 -07008134 if (!message.bodyptr) {
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05308135 sme_release_global_lock(&mac->sme);
8136 return QDF_STATUS_E_NOMEM;
8137 }
8138 qdf_mem_copy(message.bodyptr, &req, sizeof(req));
8139 message.type = WMA_GET_PEER_INFO;
8140 message.reserved = 0;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308141 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
8142 QDF_MODULE_ID_WMA,
8143 QDF_MODULE_ID_WMA, &message);
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05308144 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
8145 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8146 "%s: Post get peer info msg fail", __func__);
8147 qdf_mem_free(message.bodyptr);
8148 qdf_status = QDF_STATUS_E_FAILURE;
8149 }
8150 sme_release_global_lock(&mac->sme);
8151 return qdf_status;
8152}
8153
Will Huang558f8082017-05-31 16:22:24 +08008154QDF_STATUS sme_get_peer_info(tHalHandle hal, struct sir_peer_info_req req,
8155 void *context,
8156 void (*callbackfn)(struct sir_peer_info_resp *param,
8157 void *pcontext))
8158{
8159
8160 QDF_STATUS status;
8161 QDF_STATUS qdf_status;
8162 tpAniSirGlobal mac = PMAC_STRUCT(hal);
Rajeev Kumar658e8492017-12-13 11:35:41 -08008163 struct scheduler_msg message = {0};
Will Huang558f8082017-05-31 16:22:24 +08008164
8165 status = sme_acquire_global_lock(&mac->sme);
8166 if (QDF_STATUS_SUCCESS == status) {
8167 if (NULL == callbackfn) {
8168 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8169 "%s: Indication Call back is NULL",
8170 __func__);
8171 sme_release_global_lock(&mac->sme);
8172 return QDF_STATUS_E_FAILURE;
8173 }
8174
8175 mac->sme.pget_peer_info_ind_cb = callbackfn;
8176 mac->sme.pget_peer_info_cb_context = context;
8177
8178 /* serialize the req through MC thread */
8179 message.bodyptr = qdf_mem_malloc(sizeof(req));
Arif Hussain0ef77082018-10-10 16:42:53 -07008180 if (!message.bodyptr) {
Will Huang558f8082017-05-31 16:22:24 +08008181 sme_release_global_lock(&mac->sme);
8182 return QDF_STATUS_E_NOMEM;
8183 }
8184 qdf_mem_copy(message.bodyptr, &req, sizeof(req));
8185 message.type = WMA_GET_PEER_INFO;
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05308186 message.reserved = 0;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308187 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
8188 QDF_MODULE_ID_WMA,
8189 QDF_MODULE_ID_WMA,
8190 &message);
Will Huang558f8082017-05-31 16:22:24 +08008191 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
8192 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8193 "%s: Post get peer info msg fail", __func__);
8194 qdf_mem_free(message.bodyptr);
8195 status = QDF_STATUS_E_FAILURE;
8196 }
8197 sme_release_global_lock(&mac->sme);
8198 }
8199 return status;
8200}
8201
8202QDF_STATUS sme_get_peer_info_ext(tHalHandle hal,
8203 struct sir_peer_info_ext_req *req,
8204 void *context,
8205 void (*callbackfn)(struct sir_peer_info_ext_resp *param,
8206 void *pcontext))
8207{
8208 QDF_STATUS status;
8209 QDF_STATUS qdf_status;
8210 tpAniSirGlobal mac = PMAC_STRUCT(hal);
Rajeev Kumar658e8492017-12-13 11:35:41 -08008211 struct scheduler_msg message = {0};
Will Huang558f8082017-05-31 16:22:24 +08008212
8213 status = sme_acquire_global_lock(&mac->sme);
8214 if (QDF_STATUS_SUCCESS == status) {
8215 if (NULL == callbackfn) {
8216 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8217 "%s: Indication Call back is NULL",
8218 __func__);
8219 sme_release_global_lock(&mac->sme);
8220 return QDF_STATUS_E_FAILURE;
8221 }
8222
8223 mac->sme.pget_peer_info_ext_ind_cb = callbackfn;
8224 mac->sme.pget_peer_info_ext_cb_context = context;
8225
8226 /* serialize the req through MC thread */
8227 message.bodyptr =
8228 qdf_mem_malloc(sizeof(struct sir_peer_info_ext_req));
Arif Hussain0ef77082018-10-10 16:42:53 -07008229 if (!message.bodyptr) {
Will Huang558f8082017-05-31 16:22:24 +08008230 sme_release_global_lock(&mac->sme);
8231 return QDF_STATUS_E_NOMEM;
8232 }
8233 qdf_mem_copy(message.bodyptr,
8234 req,
8235 sizeof(struct sir_peer_info_ext_req));
8236 message.type = WMA_GET_PEER_INFO_EXT;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308237 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
8238 QDF_MODULE_ID_WMA,
8239 QDF_MODULE_ID_WMA,
8240 &message);
Will Huang558f8082017-05-31 16:22:24 +08008241 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
8242 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8243 "%s: Post get rssi msg fail", __func__);
8244 qdf_mem_free(message.bodyptr);
8245 status = QDF_STATUS_E_FAILURE;
8246 }
8247 sme_release_global_lock(&mac->sme);
8248 }
8249 return status;
8250}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008251
8252/*
8253 * SME API to enable/disable WLAN driver initiated SSR
8254 */
8255void sme_update_enable_ssr(tHalHandle hHal, bool enableSSR)
8256{
8257 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308258 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008259
8260 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308261 if (QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -07008262 sme_debug("SSR level is changed %d", enableSSR);
Jeff Johnson698eacd2018-05-12 17:00:03 -07008263 /* not serializing this message, as this is only going
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008264 * to set a variable in WMA/WDI
8265 */
8266 WMA_SetEnableSSR(enableSSR);
8267 sme_release_global_lock(&pMac->sme);
8268 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008269}
8270
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008271/*convert the ini value to the ENUM used in csr and MAC for CB state*/
8272ePhyChanBondState sme_get_cb_phy_state_from_cb_ini_value(uint32_t cb_ini_value)
8273{
8274 return csr_convert_cb_ini_value_to_phy_cb_state(cb_ini_value);
8275}
8276
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308277/*
8278 * sme_set_curr_device_mode() - Sets the current operating device mode.
8279 *
8280 * hHal - The handle returned by mac_open.
8281 * currDeviceMode - Current operating device mode.
8282 */
Peng Xuf5d60c82015-10-02 17:17:03 -07008283void sme_set_curr_device_mode(tHalHandle hHal,
Jeff Johnsonc1e62782017-11-09 09:50:17 -08008284 enum QDF_OPMODE currDeviceMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008285{
8286 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308287
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008288 pMac->sme.currDeviceMode = currDeviceMode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008289}
8290
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308291/*
8292 * sme_handoff_request() - a wrapper function to Request a handoff from CSR.
8293 * This is a synchronous call
8294 *
8295 * hHal - The handle returned by mac_open
8296 * sessionId - Session Identifier
8297 * pHandoffInfo - info provided by HDD with the handoff request (namely:
8298 * BSSID, channel etc.)
8299 * Return QDF_STATUS_SUCCESS - SME passed the request to CSR successfully.
8300 * Other status means SME is failed to send the request.
8301 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008302
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308303QDF_STATUS sme_handoff_request(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008304 uint8_t sessionId,
8305 tCsrHandoffRequest *pHandoffInfo)
8306{
8307 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308308 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008309
8310 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308311 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308312 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008313 "%s: invoked", __func__);
8314 status = csr_handoff_request(pMac, sessionId, pHandoffInfo);
8315 sme_release_global_lock(&pMac->sme);
8316 }
8317
8318 return status;
8319}
8320
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008321/*
8322 * SME API to check if there is any infra station or
8323 * P2P client is connected
8324 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308325QDF_STATUS sme_is_sta_p2p_client_connected(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008326{
8327 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308328
8329 if (csr_is_infra_connected(pMac))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308330 return QDF_STATUS_SUCCESS;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308331
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308332 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008333}
8334
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008335/**
8336 * sme_add_periodic_tx_ptrn() - Add Periodic TX Pattern
8337 * @hal: global hal handle
8338 * @addPeriodicTxPtrnParams: request message
8339 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308340 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008341 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308342QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008343sme_add_periodic_tx_ptrn(tHalHandle hal,
8344 struct sSirAddPeriodicTxPtrn *addPeriodicTxPtrnParams)
8345{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308346 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008347 tpAniSirGlobal mac = PMAC_STRUCT(hal);
8348 struct sSirAddPeriodicTxPtrn *req_msg;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008349 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008350
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07008351 SME_ENTER();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008352
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308353 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07008354 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308355 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008356
8357 *req_msg = *addPeriodicTxPtrnParams;
8358
8359 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308360 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07008361 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008362 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308363 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008364 return status;
8365 }
8366
8367 /* Serialize the req through MC thread */
8368 msg.bodyptr = req_msg;
8369 msg.type = WMA_ADD_PERIODIC_TX_PTRN_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05308370 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
8371 NO_SESSION, msg.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308372 status = scheduler_post_message(QDF_MODULE_ID_SME,
8373 QDF_MODULE_ID_WMA,
8374 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308375 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07008376 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008377 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308378 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008379 }
8380 sme_release_global_lock(&mac->sme);
8381 return status;
8382}
8383
8384/**
8385 * sme_del_periodic_tx_ptrn() - Delete Periodic TX Pattern
8386 * @hal: global hal handle
8387 * @delPeriodicTxPtrnParams: request message
8388 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308389 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008390 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308391QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008392sme_del_periodic_tx_ptrn(tHalHandle hal,
8393 struct sSirDelPeriodicTxPtrn *delPeriodicTxPtrnParams)
8394{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308395 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008396 tpAniSirGlobal mac = PMAC_STRUCT(hal);
8397 struct sSirDelPeriodicTxPtrn *req_msg;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008398 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008399
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07008400 SME_ENTER();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008401
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308402 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07008403 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308404 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008405
8406 *req_msg = *delPeriodicTxPtrnParams;
8407
8408 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308409 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07008410 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008411 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308412 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008413 return status;
8414 }
8415
8416 /* Serialize the req through MC thread */
8417 msg.bodyptr = req_msg;
8418 msg.type = WMA_DEL_PERIODIC_TX_PTRN_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05308419 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
8420 NO_SESSION, msg.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308421 status = scheduler_post_message(QDF_MODULE_ID_SME,
8422 QDF_MODULE_ID_WMA,
8423 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308424 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07008425 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008426 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308427 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008428 }
8429 sme_release_global_lock(&mac->sme);
8430 return status;
8431}
8432
Rachit Kankaneee1735c2018-08-02 13:19:34 +05308433#ifdef FEATURE_WLAN_RMC
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308434/*
8435 * sme_enable_rmc() - enables RMC
8436 * @hHal : Pointer to global HAL handle
8437 * @sessionId : Session ID
8438 *
8439 * Return: QDF_STATUS
8440 */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008441QDF_STATUS sme_enable_rmc(tHalHandle hHal, uint32_t sessionId)
8442{
8443 QDF_STATUS status = QDF_STATUS_E_FAILURE;
8444 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008445 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008446 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
8447
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07008448 SME_ENTER();
8449
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008450 status = sme_acquire_global_lock(&pMac->sme);
8451 if (QDF_IS_STATUS_SUCCESS(status)) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08008452 message.bodyptr = NULL;
8453 message.type = WMA_RMC_ENABLE_IND;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308454 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
8455 QDF_MODULE_ID_WMA,
8456 QDF_MODULE_ID_WMA,
8457 &message);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008458 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
8459 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8460 "%s: failed to post message to WMA",
8461 __func__);
8462 status = QDF_STATUS_E_FAILURE;
8463 }
8464 sme_release_global_lock(&pMac->sme);
8465 }
8466 return status;
8467}
8468
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308469/*
8470 * sme_disable_rmc() - disables RMC
8471 * @hHal : Pointer to global HAL handle
8472 * @sessionId : Session ID
8473 *
8474 * Return: QDF_STATUS
8475 */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008476QDF_STATUS sme_disable_rmc(tHalHandle hHal, uint32_t sessionId)
8477{
8478 QDF_STATUS status = QDF_STATUS_E_FAILURE;
8479 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008480 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008481 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
8482
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07008483 SME_ENTER();
8484
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008485 status = sme_acquire_global_lock(&pMac->sme);
8486 if (QDF_IS_STATUS_SUCCESS(status)) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08008487 message.bodyptr = NULL;
8488 message.type = WMA_RMC_DISABLE_IND;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308489 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
8490 QDF_MODULE_ID_WMA,
8491 QDF_MODULE_ID_WMA,
8492 &message);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008493 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
8494 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8495 "%s: failed to post message to WMA",
8496 __func__);
8497 status = QDF_STATUS_E_FAILURE;
8498 }
8499 sme_release_global_lock(&pMac->sme);
8500 }
8501 return status;
8502}
8503
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308504/*
8505 * sme_send_rmc_action_period() - sends RMC action period param to target
8506 * @hHal : Pointer to global HAL handle
8507 * @sessionId : Session ID
8508 *
8509 * Return: QDF_STATUS
8510 */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008511QDF_STATUS sme_send_rmc_action_period(tHalHandle hHal, uint32_t sessionId)
8512{
8513 QDF_STATUS status = QDF_STATUS_SUCCESS;
8514 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
8515 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008516 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008517
8518 status = sme_acquire_global_lock(&pMac->sme);
8519 if (QDF_STATUS_SUCCESS == status) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08008520 message.bodyptr = NULL;
8521 message.type = WMA_RMC_ACTION_PERIOD_IND;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308522 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
8523 QDF_MODULE_ID_WMA,
8524 QDF_MODULE_ID_WMA,
8525 &message);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008526 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
8527 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8528 "%s: failed to post message to WMA",
8529 __func__);
8530 status = QDF_STATUS_E_FAILURE;
8531 }
8532 sme_release_global_lock(&pMac->sme);
8533 }
8534
8535 return status;
8536}
Rachit Kankaneee1735c2018-08-02 13:19:34 +05308537#endif /* FEATURE_WLAN_RMC */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008538
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308539/*
8540 * sme_request_ibss_peer_info() - request ibss peer info
8541 * @hHal : Pointer to global HAL handle
8542 * @pUserData : Pointer to user data
8543 * @peerInfoCbk : Peer info callback
8544 * @allPeerInfoReqd : All peer info required or not
8545 * @staIdx : sta index
8546 *
8547 * Return: QDF_STATUS
8548 */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008549QDF_STATUS sme_request_ibss_peer_info(tHalHandle hHal, void *pUserData,
8550 pIbssPeerInfoCb peerInfoCbk,
8551 bool allPeerInfoReqd, uint8_t staIdx)
8552{
8553 QDF_STATUS status = QDF_STATUS_E_FAILURE;
8554 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
8555 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008556 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008557 tSirIbssGetPeerInfoReqParams *pIbssInfoReqParams;
8558
8559 status = sme_acquire_global_lock(&pMac->sme);
8560 if (QDF_STATUS_SUCCESS == status) {
8561 pMac->sme.peerInfoParams.peerInfoCbk = peerInfoCbk;
8562 pMac->sme.peerInfoParams.pUserData = pUserData;
8563
8564 pIbssInfoReqParams = (tSirIbssGetPeerInfoReqParams *)
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308565 qdf_mem_malloc(sizeof(tSirIbssGetPeerInfoReqParams));
Arif Hussain0ef77082018-10-10 16:42:53 -07008566 if (!pIbssInfoReqParams) {
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008567 sme_release_global_lock(&pMac->sme);
8568 return QDF_STATUS_E_NOMEM;
8569 }
8570 pIbssInfoReqParams->allPeerInfoReqd = allPeerInfoReqd;
8571 pIbssInfoReqParams->staIdx = staIdx;
8572
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08008573 message.type = WMA_GET_IBSS_PEER_INFO_REQ;
8574 message.bodyptr = pIbssInfoReqParams;
8575 message.reserved = 0;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008576
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308577 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
8578 QDF_MODULE_ID_WMA,
8579 QDF_MODULE_ID_WMA,
8580 &message);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008581 if (QDF_STATUS_SUCCESS != qdf_status) {
8582 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8583 "%s: Post WMA_GET_IBSS_PEER_INFO_REQ MSG failed",
8584 __func__);
8585 qdf_mem_free(pIbssInfoReqParams);
8586 qdf_status = QDF_STATUS_E_FAILURE;
8587 }
8588 sme_release_global_lock(&pMac->sme);
8589 }
8590
8591 return qdf_status;
8592}
8593
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308594/*
8595 * sme_send_cesium_enable_ind() -
8596 * Used to send proprietary cesium enable indication to fw
8597 *
8598 * hHal
8599 * sessionId
8600 * Return QDF_STATUS
8601 */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008602QDF_STATUS sme_send_cesium_enable_ind(tHalHandle hHal, uint32_t sessionId)
8603{
8604 QDF_STATUS status = QDF_STATUS_SUCCESS;
8605 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
8606 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008607 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008608
8609 status = sme_acquire_global_lock(&pMac->sme);
8610 if (QDF_STATUS_SUCCESS == status) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08008611 message.bodyptr = NULL;
8612 message.type = WMA_IBSS_CESIUM_ENABLE_IND;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308613 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
8614 QDF_MODULE_ID_WMA,
8615 QDF_MODULE_ID_WMA,
8616 &message);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008617 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
8618 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8619 "%s: failed to post message to WMA",
8620 __func__);
8621 status = QDF_STATUS_E_FAILURE;
8622 }
8623 sme_release_global_lock(&pMac->sme);
8624 }
8625
8626 return status;
8627}
8628
Paul Zhang99fe8842017-12-08 14:43:46 +08008629QDF_STATUS sme_set_wlm_latency_level(tHalHandle hal, uint16_t session_id,
8630 uint16_t latency_level)
8631{
8632 QDF_STATUS status;
8633 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
8634 struct wlm_latency_level_param params;
8635 void *wma = cds_get_context(QDF_MODULE_ID_WMA);
8636
Bala Venkatesh7cf5b662018-05-10 15:18:53 +05308637 if (!wma)
8638 return QDF_STATUS_E_FAILURE;
8639
Paul Zhang99fe8842017-12-08 14:43:46 +08008640 if (!mac_ctx->roam.configParam.wlm_latency_enable) {
8641 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8642 "%s: WLM latency level setting is disabled",
8643 __func__);
8644 return QDF_STATUS_E_FAILURE;
8645 }
Krunal Soni3fa80e22018-01-09 14:16:02 -08008646 if (!wma) {
8647 sme_err("wma is NULL");
8648 return QDF_STATUS_E_FAILURE;
8649 }
Paul Zhang99fe8842017-12-08 14:43:46 +08008650
8651 params.wlm_latency_level = latency_level;
8652 params.wlm_latency_flags =
8653 mac_ctx->roam.configParam.wlm_latency_flags[latency_level];
8654 params.vdev_id = session_id;
8655
8656 status = wma_set_wlm_latency_level(wma, &params);
8657 if (!QDF_IS_STATUS_SUCCESS(status))
8658 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8659 "%s: failed to set latency level",
8660 __func__);
8661
8662 return status;
8663}
8664
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008665void sme_get_command_q_status(tHalHandle hHal)
8666{
8667 tSmeCmd *pTempCmd = NULL;
8668 tListElem *pEntry;
Pragaspathi Thilagarajb11dbe42018-07-23 16:42:17 +05308669 tpAniSirGlobal pMac;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008670
Pragaspathi Thilagarajb11dbe42018-07-23 16:42:17 +05308671 if (NULL != hHal) {
8672 pMac = PMAC_STRUCT(hHal);
8673 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308674 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Pragaspathi Thilagarajb11dbe42018-07-23 16:42:17 +05308675 "%s: Invalid hHal pointer", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008676 return;
8677 }
Krunal Sonia8270f52017-02-23 19:51:25 -08008678 pEntry = csr_nonscan_active_ll_peek_head(pMac, LL_ACCESS_LOCK);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308679 if (pEntry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008680 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308681
Kabilan Kannan33fcd682018-03-08 14:29:46 -08008682 sme_err("WLAN_BUG_RCA: Currently smeCmdActiveList has command (0x%X)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008683 (pTempCmd) ? pTempCmd->command : eSmeNoCommand);
8684 if (pTempCmd) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308685 if (eSmeCsrCommandMask & pTempCmd->command)
8686 /* CSR command is stuck. See what the reason code is
8687 * for that command
8688 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008689 dump_csr_command_info(pMac, pTempCmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008690 } /* if(pTempCmd) */
8691
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07008692 sme_err("Currently smeCmdPendingList has %d commands",
Krunal Soni72dba662017-02-15 20:13:17 -08008693 csr_nonscan_pending_ll_count(pMac));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008694
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008695}
Kiran Kumar Lokere1aa9c9a2016-10-05 18:50:59 -07008696
Agrawal Ashishb141b092016-09-02 19:59:26 +05308697#ifdef WLAN_FEATURE_DSRC
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008698/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008699 * copy_sir_ocb_config() - Performs deep copy of an OCB configuration
8700 * @src: the source configuration
8701 *
8702 * Return: pointer to the copied OCB configuration
8703 */
8704static struct sir_ocb_config *sme_copy_sir_ocb_config(
8705 struct sir_ocb_config *src)
8706{
8707 struct sir_ocb_config *dst;
8708 uint32_t length;
8709 void *cursor;
8710
8711 length = sizeof(*src) +
8712 src->channel_count * sizeof(*src->channels) +
8713 src->schedule_size * sizeof(*src->schedule) +
8714 src->dcc_ndl_chan_list_len +
8715 src->dcc_ndl_active_state_list_len;
8716
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308717 dst = qdf_mem_malloc(length);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008718 if (!dst)
8719 return NULL;
8720
8721 *dst = *src;
8722
8723 cursor = dst;
8724 cursor += sizeof(*dst);
8725 dst->channels = cursor;
8726 cursor += src->channel_count * sizeof(*src->channels);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308727 qdf_mem_copy(dst->channels, src->channels,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008728 src->channel_count * sizeof(*src->channels));
8729 dst->schedule = cursor;
8730 cursor += src->schedule_size * sizeof(*src->schedule);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308731 qdf_mem_copy(dst->schedule, src->schedule,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008732 src->schedule_size * sizeof(*src->schedule));
8733 dst->dcc_ndl_chan_list = cursor;
8734 cursor += src->dcc_ndl_chan_list_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308735 qdf_mem_copy(dst->dcc_ndl_chan_list, src->dcc_ndl_chan_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008736 src->dcc_ndl_chan_list_len);
8737 dst->dcc_ndl_active_state_list = cursor;
8738 cursor += src->dcc_ndl_active_state_list_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308739 qdf_mem_copy(dst->dcc_ndl_active_state_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008740 src->dcc_ndl_active_state_list,
8741 src->dcc_ndl_active_state_list_len);
8742 return dst;
8743}
8744
8745/**
8746 * sme_ocb_set_config() - Set the OCB configuration
8747 * @hHal: reference to the HAL
8748 * @context: the context of the call
8749 * @callback: the callback to hdd
8750 * @config: the OCB configuration
8751 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308752 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008753 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308754QDF_STATUS sme_ocb_set_config(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008755 ocb_callback callback,
8756 struct sir_ocb_config *config)
8757{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308758 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008759 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08008760 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008761 struct sir_ocb_config *msg_body;
8762
8763 /* Lock the SME structure */
8764 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308765 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008766 return status;
8767
8768 /*
8769 * Check if there is a pending request and return an error if one
8770 * exists
8771 */
8772 if (pMac->sme.ocb_set_config_callback) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308773 status = QDF_STATUS_E_BUSY;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008774 goto end;
8775 }
8776
8777 msg_body = sme_copy_sir_ocb_config(config);
8778
8779 if (!msg_body) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308780 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008781 goto end;
8782 }
8783
8784 msg.type = WMA_OCB_SET_CONFIG_CMD;
8785 msg.bodyptr = msg_body;
8786
8787 /* Set the request callback and context */
8788 pMac->sme.ocb_set_config_callback = callback;
8789 pMac->sme.ocb_set_config_context = context;
8790
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308791 status = scheduler_post_message(QDF_MODULE_ID_SME,
8792 QDF_MODULE_ID_WMA,
8793 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308794 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308795 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008796 FL("Error posting message to WDA: %d"), status);
8797 pMac->sme.ocb_set_config_callback = callback;
8798 pMac->sme.ocb_set_config_context = context;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308799 qdf_mem_free(msg_body);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008800 goto end;
8801 }
8802
8803end:
8804 sme_release_global_lock(&pMac->sme);
8805
8806 return status;
8807}
8808
8809/**
8810 * sme_ocb_set_utc_time() - Set the OCB UTC time
8811 * @hHal: reference to the HAL
8812 * @utc: the UTC time struct
8813 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308814 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008815 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308816QDF_STATUS sme_ocb_set_utc_time(tHalHandle hHal, struct sir_ocb_utc *utc)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008817{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308818 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008819 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08008820 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008821 struct sir_ocb_utc *sme_utc;
8822
8823 /* Lock the SME structure */
8824 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308825 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008826 return status;
8827
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308828 sme_utc = qdf_mem_malloc(sizeof(*sme_utc));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008829 if (!sme_utc) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308830 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008831 goto end;
8832 }
8833 *sme_utc = *utc;
8834
8835 msg.type = WMA_OCB_SET_UTC_TIME_CMD;
8836 msg.reserved = 0;
8837 msg.bodyptr = sme_utc;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308838 status = scheduler_post_message(QDF_MODULE_ID_SME,
8839 QDF_MODULE_ID_WMA,
8840 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308841 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308842 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008843 FL("Not able to post message to WDA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308844 qdf_mem_free(utc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008845 goto end;
8846 }
8847
8848end:
8849 sme_release_global_lock(&pMac->sme);
8850
8851 return status;
8852}
8853
8854/**
8855 * sme_ocb_start_timing_advert() - Start sending timing advert frames
8856 * @hHal: reference to the HAL
8857 * @timing_advert: the timing advertisement struct
8858 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308859 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008860 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308861QDF_STATUS sme_ocb_start_timing_advert(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008862 struct sir_ocb_timing_advert *timing_advert)
8863{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308864 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008865 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08008866 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008867 void *buf;
8868 struct sir_ocb_timing_advert *sme_timing_advert;
8869
8870 /* Lock the SME structure */
8871 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308872 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008873 return status;
8874
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308875 buf = qdf_mem_malloc(sizeof(*sme_timing_advert) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008876 timing_advert->template_length);
8877 if (!buf) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308878 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008879 goto end;
8880 }
8881
8882 sme_timing_advert = (struct sir_ocb_timing_advert *)buf;
8883 *sme_timing_advert = *timing_advert;
8884 sme_timing_advert->template_value = buf + sizeof(*sme_timing_advert);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308885 qdf_mem_copy(sme_timing_advert->template_value,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008886 timing_advert->template_value, timing_advert->template_length);
8887
8888 msg.type = WMA_OCB_START_TIMING_ADVERT_CMD;
8889 msg.reserved = 0;
8890 msg.bodyptr = buf;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308891 status = scheduler_post_message(QDF_MODULE_ID_SME,
8892 QDF_MODULE_ID_WMA,
8893 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308894 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308895 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008896 FL("Not able to post msg to WDA"));
8897 goto end;
8898 }
8899
8900end:
8901 sme_release_global_lock(&pMac->sme);
8902
8903 return status;
8904}
8905
8906/**
8907 * sme_ocb_stop_timing_advert() - Stop sending timing advert frames on a channel
8908 * @hHal: reference to the HAL
8909 * @timing_advert: the timing advertisement struct
8910 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308911 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008912 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308913QDF_STATUS sme_ocb_stop_timing_advert(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008914 struct sir_ocb_timing_advert *timing_advert)
8915{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308916 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008917 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08008918 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008919 struct sir_ocb_timing_advert *sme_timing_advert;
8920
8921 /* Lock the SME structure */
8922 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308923 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008924 return status;
8925
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308926 sme_timing_advert = qdf_mem_malloc(sizeof(*timing_advert));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008927 if (!sme_timing_advert) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308928 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008929 goto end;
8930 }
8931 *sme_timing_advert = *timing_advert;
8932
8933 msg.type = WMA_OCB_STOP_TIMING_ADVERT_CMD;
8934 msg.reserved = 0;
8935 msg.bodyptr = sme_timing_advert;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308936 status = scheduler_post_message(QDF_MODULE_ID_SME,
8937 QDF_MODULE_ID_WMA,
8938 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308939 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308940 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008941 FL("Not able to post msg to WDA"));
8942 goto end;
8943 }
8944
8945end:
8946 sme_release_global_lock(&pMac->sme);
8947
8948 return status;
8949}
8950
8951/**
Naveen Rawatb4d37622015-11-13 16:15:25 -08008952 * sme_ocb_gen_timing_advert_frame() - generate TA frame and populate the buffer
8953 * @hal_handle: reference to the HAL
8954 * @self_addr: the self MAC address
8955 * @buf: the buffer that will contain the frame
8956 * @timestamp_offset: return for the offset of the timestamp field
8957 * @time_value_offset: return for the time_value field in the TA IE
8958 *
8959 * Return: the length of the buffer.
8960 */
8961int sme_ocb_gen_timing_advert_frame(tHalHandle hal_handle,
8962 tSirMacAddr self_addr, uint8_t **buf,
8963 uint32_t *timestamp_offset,
8964 uint32_t *time_value_offset)
8965{
8966 int template_length;
8967 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
8968
8969 template_length = sch_gen_timing_advert_frame(mac_ctx, self_addr, buf,
8970 timestamp_offset,
8971 time_value_offset);
8972 return template_length;
8973}
8974/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008975 * sme_ocb_get_tsf_timer() - Get the TSF timer value
8976 * @hHal: reference to the HAL
8977 * @context: the context of the call
8978 * @callback: the callback to hdd
8979 * @request: the TSF timer request
8980 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308981 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008982 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308983QDF_STATUS sme_ocb_get_tsf_timer(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008984 ocb_callback callback,
8985 struct sir_ocb_get_tsf_timer *request)
8986{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308987 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008988 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08008989 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008990 struct sir_ocb_get_tsf_timer *msg_body;
8991
8992 /* Lock the SME structure */
8993 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308994 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008995 return status;
8996
8997 /* Allocate memory for the WMI request, and copy the parameter */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308998 msg_body = qdf_mem_malloc(sizeof(*msg_body));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008999 if (!msg_body) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309000 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009001 goto end;
9002 }
9003 *msg_body = *request;
9004
9005 msg.type = WMA_OCB_GET_TSF_TIMER_CMD;
9006 msg.bodyptr = msg_body;
9007
9008 /* Set the request callback and the context */
9009 pMac->sme.ocb_get_tsf_timer_callback = callback;
9010 pMac->sme.ocb_get_tsf_timer_context = context;
9011
9012 /* Post the message to WDA */
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309013 status = scheduler_post_message(QDF_MODULE_ID_SME,
9014 QDF_MODULE_ID_WMA,
9015 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309016 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309017 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009018 FL("Error posting message to WDA: %d"), status);
9019 pMac->sme.ocb_get_tsf_timer_callback = NULL;
9020 pMac->sme.ocb_get_tsf_timer_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309021 qdf_mem_free(msg_body);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009022 goto end;
9023 }
9024
9025end:
9026 sme_release_global_lock(&pMac->sme);
9027
9028 return status;
9029}
9030
9031/**
9032 * sme_dcc_get_stats() - Get the DCC stats
9033 * @hHal: reference to the HAL
9034 * @context: the context of the call
9035 * @callback: the callback to hdd
9036 * @request: the get DCC stats request
9037 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309038 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009039 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309040QDF_STATUS sme_dcc_get_stats(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009041 ocb_callback callback,
9042 struct sir_dcc_get_stats *request)
9043{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309044 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009045 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009046 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009047 struct sir_dcc_get_stats *msg_body;
9048
9049 /* Lock the SME structure */
9050 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309051 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009052 return status;
9053
9054 /* Allocate memory for the WMI request, and copy the parameter */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309055 msg_body = qdf_mem_malloc(sizeof(*msg_body) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009056 request->request_array_len);
9057 if (!msg_body) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309058 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009059 goto end;
9060 }
9061 *msg_body = *request;
9062 msg_body->request_array = (void *)msg_body + sizeof(*msg_body);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309063 qdf_mem_copy(msg_body->request_array, request->request_array,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009064 request->request_array_len);
9065
9066 msg.type = WMA_DCC_GET_STATS_CMD;
9067 msg.bodyptr = msg_body;
9068
9069 /* Set the request callback and context */
9070 pMac->sme.dcc_get_stats_callback = callback;
9071 pMac->sme.dcc_get_stats_context = context;
9072
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309073 status = scheduler_post_message(QDF_MODULE_ID_SME,
9074 QDF_MODULE_ID_WMA,
9075 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309076 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309077 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009078 FL("Error posting message to WDA: %d"), status);
9079 pMac->sme.dcc_get_stats_callback = callback;
9080 pMac->sme.dcc_get_stats_context = context;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309081 qdf_mem_free(msg_body);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009082 goto end;
9083 }
9084
9085end:
9086 sme_release_global_lock(&pMac->sme);
9087
9088 return status;
9089}
9090
9091/**
9092 * sme_dcc_clear_stats() - Clear the DCC stats
9093 * @hHal: reference to the HAL
9094 * @vdev_id: vdev id for OCB interface
9095 * @dcc_stats_bitmap: the entries in the stats to clear
9096 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309097 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009098 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309099QDF_STATUS sme_dcc_clear_stats(tHalHandle hHal, uint32_t vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009100 uint32_t dcc_stats_bitmap)
9101{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309102 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009103 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009104 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009105 struct sir_dcc_clear_stats *request;
9106
9107 /* Lock the SME structure */
9108 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309109 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009110 return status;
9111
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309112 request = qdf_mem_malloc(sizeof(struct sir_dcc_clear_stats));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009113 if (!request) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309114 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009115 goto end;
9116 }
9117
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009118 request->vdev_id = vdev_id;
9119 request->dcc_stats_bitmap = dcc_stats_bitmap;
9120
9121 msg.type = WMA_DCC_CLEAR_STATS_CMD;
9122 msg.bodyptr = request;
9123
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309124 status = scheduler_post_message(QDF_MODULE_ID_SME,
9125 QDF_MODULE_ID_WMA,
9126 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309127 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309128 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009129 FL("Not able to post msg to WDA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309130 qdf_mem_free(request);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009131 goto end;
9132 }
9133
9134end:
9135 sme_release_global_lock(&pMac->sme);
9136
9137 return status;
9138}
9139
9140/**
9141 * sme_dcc_update_ndl() - Update the DCC settings
9142 * @hHal: reference to the HAL
9143 * @context: the context of the call
9144 * @callback: the callback to hdd
9145 * @request: the update DCC request
9146 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309147 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009148 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309149QDF_STATUS sme_dcc_update_ndl(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009150 ocb_callback callback,
9151 struct sir_dcc_update_ndl *request)
9152{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309153 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009154 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009155 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009156 struct sir_dcc_update_ndl *msg_body;
9157
9158 /* Lock the SME structure */
9159 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309160 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009161 return status;
9162
9163 /* Allocate memory for the WMI request, and copy the parameter */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309164 msg_body = qdf_mem_malloc(sizeof(*msg_body) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009165 request->dcc_ndl_chan_list_len +
9166 request->dcc_ndl_active_state_list_len);
9167 if (!msg_body) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309168 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009169 goto end;
9170 }
9171
9172 *msg_body = *request;
9173
9174 msg_body->dcc_ndl_chan_list = (void *)msg_body + sizeof(*msg_body);
9175 msg_body->dcc_ndl_active_state_list = msg_body->dcc_ndl_chan_list +
9176 request->dcc_ndl_chan_list_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309177 qdf_mem_copy(msg_body->dcc_ndl_chan_list, request->dcc_ndl_chan_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009178 request->dcc_ndl_active_state_list_len);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309179 qdf_mem_copy(msg_body->dcc_ndl_active_state_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009180 request->dcc_ndl_active_state_list,
9181 request->dcc_ndl_active_state_list_len);
9182
9183 msg.type = WMA_DCC_UPDATE_NDL_CMD;
9184 msg.bodyptr = msg_body;
9185
9186 /* Set the request callback and the context */
9187 pMac->sme.dcc_update_ndl_callback = callback;
9188 pMac->sme.dcc_update_ndl_context = context;
9189
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309190 status = scheduler_post_message(QDF_MODULE_ID_SME,
9191 QDF_MODULE_ID_WMA,
9192 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309193 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309194 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009195 FL("Error posting message to WDA: %d"), status);
9196 pMac->sme.dcc_update_ndl_callback = NULL;
9197 pMac->sme.dcc_update_ndl_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309198 qdf_mem_free(msg_body);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009199 goto end;
9200 }
9201
9202end:
9203 sme_release_global_lock(&pMac->sme);
9204
9205 return status;
9206}
9207
9208/**
9209 * sme_register_for_dcc_stats_event() - Register for the periodic DCC stats
9210 * event
9211 * @hHal: reference to the HAL
9212 * @context: the context of the call
9213 * @callback: the callback to hdd
9214 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309215 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009216 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309217QDF_STATUS sme_register_for_dcc_stats_event(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009218 ocb_callback callback)
9219{
9220 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309221 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009222
9223 status = sme_acquire_global_lock(&pMac->sme);
9224 pMac->sme.dcc_stats_event_callback = callback;
9225 pMac->sme.dcc_stats_event_context = context;
9226 sme_release_global_lock(&pMac->sme);
9227
9228 return 0;
9229}
9230
Arun Khandavalli4b55da72016-07-19 19:55:01 +05309231/**
9232 * sme_deregister_for_dcc_stats_event() - De-Register for the periodic DCC stats
9233 * event
9234 * @h_hal: Hal Handle
9235 *
9236 * This function de-registers the DCC perioc stats callback
9237 *
9238 * Return: QDF_STATUS Enumeration
9239 */
9240QDF_STATUS sme_deregister_for_dcc_stats_event(tHalHandle h_hal)
9241{
9242 tpAniSirGlobal mac;
9243 QDF_STATUS status;
9244
9245 if (!h_hal) {
9246 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9247 FL("h_hal is not valid"));
9248 return QDF_STATUS_E_INVAL;
9249 }
9250 mac = PMAC_STRUCT(h_hal);
9251
9252 status = sme_acquire_global_lock(&mac->sme);
9253 if (!QDF_IS_STATUS_SUCCESS(status)) {
9254 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9255 FL("Failed to acquire global lock"));
9256 return status;
9257 }
9258 mac->sme.dcc_stats_event_callback = NULL;
9259 mac->sme.dcc_stats_event_context = NULL;
9260 sme_release_global_lock(&mac->sme);
9261
9262 return status;
9263}
Kiran Kumar Lokere1a43bcf2018-05-15 15:51:58 -07009264#else
9265void sme_set_etsi13_srd_ch_in_master_mode(tHalHandle hal,
9266 bool etsi13_srd_chan_support)
9267{
9268 tpAniSirGlobal mac;
9269
9270 mac = PMAC_STRUCT(hal);
9271 mac->sap.enable_etsi13_srd_chan_support = etsi13_srd_chan_support;
9272 sme_debug("srd_ch_support %d", mac->sap.enable_etsi13_srd_chan_support);
9273}
Agrawal Ashishb141b092016-09-02 19:59:26 +05309274#endif
Arun Khandavalli4b55da72016-07-19 19:55:01 +05309275
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009276void sme_get_recovery_stats(tHalHandle hHal)
9277{
9278 uint8_t i;
9279
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309280 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009281 "Self Recovery Stats");
9282 for (i = 0; i < MAX_ACTIVE_CMD_STATS; i++) {
9283 if (eSmeNoCommand !=
9284 g_self_recovery_stats.activeCmdStats[i].command) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309285 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009286 "timestamp %llu: command 0x%0X: reason %d: session %d",
9287 g_self_recovery_stats.activeCmdStats[i].
9288 timestamp,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309289 g_self_recovery_stats.activeCmdStats[i].command,
9290 g_self_recovery_stats.activeCmdStats[i].reason,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009291 g_self_recovery_stats.activeCmdStats[i].
9292 sessionId);
9293 }
9294 }
9295}
9296
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309297QDF_STATUS sme_notify_modem_power_state(tHalHandle hHal, uint32_t value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009298{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009299 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009300 tpSirModemPowerStateInd request_buf;
9301 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9302
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309303 if (NULL == pMac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309304 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009305
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309306 request_buf = qdf_mem_malloc(sizeof(tSirModemPowerStateInd));
Arif Hussain0ef77082018-10-10 16:42:53 -07009307 if (!request_buf)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309308 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009309
9310 request_buf->param = value;
9311
9312 msg.type = WMA_MODEM_POWER_STATE_IND;
9313 msg.reserved = 0;
9314 msg.bodyptr = request_buf;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309315 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309316 (scheduler_post_message(QDF_MODULE_ID_SME,
9317 QDF_MODULE_ID_WMA,
9318 QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309319 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309320 "%s: Not able to post WMA_MODEM_POWER_STATE_IND message to WMA",
9321 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309322 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309323 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009324 }
9325
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309326 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009327}
9328
9329#ifdef QCA_HT_2040_COEX
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309330QDF_STATUS sme_notify_ht2040_mode(tHalHandle hHal, uint16_t staId,
Anurag Chouhan6d760662016-02-20 16:05:43 +05309331 struct qdf_mac_addr macAddrSTA,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009332 uint8_t sessionId,
9333 uint8_t channel_type)
9334{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009335 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009336 tUpdateVHTOpMode *pHtOpMode = NULL;
9337 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9338
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309339 if (NULL == pMac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309340 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009341
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309342 pHtOpMode = qdf_mem_malloc(sizeof(tUpdateVHTOpMode));
Arif Hussain0ef77082018-10-10 16:42:53 -07009343 if (!pHtOpMode)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309344 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009345
9346 switch (channel_type) {
9347 case eHT_CHAN_HT20:
9348 pHtOpMode->opMode = eHT_CHANNEL_WIDTH_20MHZ;
9349 break;
9350
9351 case eHT_CHAN_HT40MINUS:
9352 case eHT_CHAN_HT40PLUS:
9353 pHtOpMode->opMode = eHT_CHANNEL_WIDTH_40MHZ;
9354 break;
9355
9356 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309357 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009358 "%s: Invalid OP mode", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309359 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009360 }
9361
9362 pHtOpMode->staId = staId,
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309363 qdf_mem_copy(pHtOpMode->peer_mac, macAddrSTA.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009364 sizeof(tSirMacAddr));
9365 pHtOpMode->smesessionId = sessionId;
9366
9367 msg.type = WMA_UPDATE_OP_MODE;
9368 msg.reserved = 0;
9369 msg.bodyptr = pHtOpMode;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309370 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309371 (scheduler_post_message(QDF_MODULE_ID_SME,
9372 QDF_MODULE_ID_WMA,
9373 QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309374 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309375 "%s: Not able to post WMA_UPDATE_OP_MODE message to WMA",
9376 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309377 qdf_mem_free(pHtOpMode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309378 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009379 }
9380
Abhishek Singhe4a1f882017-08-10 17:59:44 +05309381 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Jeff Johnson698eacd2018-05-12 17:00:03 -07009382 "%s: Notified FW about OP mode: %d for staId=%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009383 __func__, pHtOpMode->opMode, staId);
9384
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309385 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009386}
9387
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309388/*
9389 * sme_set_ht2040_mode() -
9390 * To update HT Operation beacon IE.
9391 *
9392 * Return QDF_STATUS SUCCESS
9393 * FAILURE or RESOURCES
9394 * The API finished and failed.
9395 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309396QDF_STATUS sme_set_ht2040_mode(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009397 uint8_t channel_type, bool obssEnabled)
9398{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309399 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009400 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9401 ePhyChanBondState cbMode;
Abhishek Singh9d5f4582017-10-11 17:59:48 +05309402 struct csr_roam_session *session = CSR_GET_SESSION(pMac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009403
Abhishek Singh9d5f4582017-10-11 17:59:48 +05309404 if (!CSR_IS_SESSION_VALID(pMac, sessionId)) {
9405 sme_err("Session not valid for session id %d", sessionId);
9406 return QDF_STATUS_E_INVAL;
9407 }
9408 session = CSR_GET_SESSION(pMac, sessionId);
9409 sme_debug("Update HT operation beacon IE, channel_type=%d cur cbmode %d",
9410 channel_type, session->bssParams.cbMode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009411
9412 switch (channel_type) {
9413 case eHT_CHAN_HT20:
Abhishek Singh9d5f4582017-10-11 17:59:48 +05309414 if (!session->bssParams.cbMode)
9415 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009416 cbMode = PHY_SINGLE_CHANNEL_CENTERED;
9417 break;
9418 case eHT_CHAN_HT40MINUS:
Abhishek Singh9d5f4582017-10-11 17:59:48 +05309419 if (session->bssParams.cbMode)
9420 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009421 cbMode = PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
9422 break;
9423 case eHT_CHAN_HT40PLUS:
Abhishek Singh9d5f4582017-10-11 17:59:48 +05309424 if (session->bssParams.cbMode)
9425 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009426 cbMode = PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
9427 break;
9428 default:
Abhishek Singh9d5f4582017-10-11 17:59:48 +05309429 sme_err("Error!!! Invalid HT20/40 mode !");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309430 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009431 }
Abhishek Singh9d5f4582017-10-11 17:59:48 +05309432 session->bssParams.cbMode = cbMode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009433 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309434 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009435 status = csr_set_ht2040_mode(pMac, sessionId,
9436 cbMode, obssEnabled);
9437 sme_release_global_lock(&pMac->sme);
9438 }
9439 return status;
9440}
9441
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009442#endif
9443
9444/*
9445 * SME API to enable/disable idle mode powersave
9446 * This should be called only if powersave offload
9447 * is enabled
9448 */
Arunk Khandavalli847969d2017-09-25 15:15:36 +05309449QDF_STATUS sme_set_idle_powersave_config(bool value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009450{
Anurag Chouhan6d760662016-02-20 16:05:43 +05309451 void *wmaContext = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009452
9453 if (NULL == wmaContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309454 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009455 "%s: wmaContext is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309456 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009457 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309458 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009459 " Idle Ps Set Value %d", value);
9460
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309461 if (QDF_STATUS_SUCCESS != wma_set_idle_ps_config(wmaContext, value)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309462 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009463 " Failed to Set Idle Ps Value %d", value);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309464 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009465 }
Arunk Khandavalli847969d2017-09-25 15:15:36 +05309466
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309467 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009468}
9469
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309470int16_t sme_get_ht_config(tHalHandle hHal, uint8_t session_id,
9471 uint16_t ht_capab)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009472{
9473 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05309474 struct csr_roam_session *pSession = CSR_GET_SESSION(pMac, session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009475
9476 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309477 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009478 "%s: pSession is NULL", __func__);
9479 return -EIO;
9480 }
9481 switch (ht_capab) {
9482 case WNI_CFG_HT_CAP_INFO_ADVANCE_CODING:
9483 return pSession->htConfig.ht_rx_ldpc;
9484 case WNI_CFG_HT_CAP_INFO_TX_STBC:
9485 return pSession->htConfig.ht_tx_stbc;
9486 case WNI_CFG_HT_CAP_INFO_RX_STBC:
9487 return pSession->htConfig.ht_rx_stbc;
9488 case WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ:
Sandeep Puligilla607f34a2016-05-25 14:37:47 -07009489 return pSession->htConfig.ht_sgi20;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009490 case WNI_CFG_HT_CAP_INFO_SHORT_GI_40MHZ:
Sandeep Puligilla607f34a2016-05-25 14:37:47 -07009491 return pSession->htConfig.ht_sgi40;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009492 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309493 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009494 "invalid ht capability");
9495 return -EIO;
9496 }
9497}
9498
9499int sme_update_ht_config(tHalHandle hHal, uint8_t sessionId, uint16_t htCapab,
9500 int value)
9501{
9502 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05309503 struct csr_roam_session *pSession = CSR_GET_SESSION(pMac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009504
9505 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309506 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009507 "%s: pSession is NULL", __func__);
9508 return -EIO;
9509 }
9510
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309511 if (QDF_STATUS_SUCCESS != wma_set_htconfig(sessionId, htCapab, value)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309512 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009513 "Failed to set ht capability in target");
9514 return -EIO;
9515 }
9516
9517 switch (htCapab) {
9518 case WNI_CFG_HT_CAP_INFO_ADVANCE_CODING:
9519 pSession->htConfig.ht_rx_ldpc = value;
Kiran Kumar Lokeree43a4582018-05-08 19:54:03 -07009520 pMac->roam.configParam.rx_ldpc_enable = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009521 break;
9522 case WNI_CFG_HT_CAP_INFO_TX_STBC:
9523 pSession->htConfig.ht_tx_stbc = value;
9524 break;
9525 case WNI_CFG_HT_CAP_INFO_RX_STBC:
9526 pSession->htConfig.ht_rx_stbc = value;
9527 break;
9528 case WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ:
Krishna Kumaar Natarajana5c5aad2016-12-05 14:12:13 -08009529 value = value ? 1 : 0; /* HT SGI can be only 1 or 0 */
Sandeep Puligilla607f34a2016-05-25 14:37:47 -07009530 pSession->htConfig.ht_sgi20 = value;
9531 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009532 case WNI_CFG_HT_CAP_INFO_SHORT_GI_40MHZ:
Krishna Kumaar Natarajana5c5aad2016-12-05 14:12:13 -08009533 value = value ? 1 : 0; /* HT SGI can be only 1 or 0 */
Sandeep Puligilla607f34a2016-05-25 14:37:47 -07009534 pSession->htConfig.ht_sgi40 = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009535 break;
9536 }
9537
Naveen Rawat8029a402017-06-01 10:54:19 -07009538 csr_roam_update_config(pMac, sessionId, htCapab, value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009539 return 0;
9540}
9541
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08009542int sme_set_addba_accept(tHalHandle hal, uint8_t session_id, int value)
9543{
9544 struct sme_addba_accept *addba_accept;
9545 struct scheduler_msg msg = {0};
9546 QDF_STATUS status;
9547
9548 addba_accept = qdf_mem_malloc(sizeof(*addba_accept));
Arif Hussain0ef77082018-10-10 16:42:53 -07009549 if (!addba_accept)
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08009550 return -EIO;
Arif Hussain0ef77082018-10-10 16:42:53 -07009551
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08009552 addba_accept->session_id = session_id;
9553 addba_accept->addba_accept = value;
9554 qdf_mem_zero(&msg, sizeof(msg));
9555 msg.type = eWNI_SME_SET_ADDBA_ACCEPT;
9556 msg.reserved = 0;
9557 msg.bodyptr = addba_accept;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309558 status = scheduler_post_message(QDF_MODULE_ID_SME,
9559 QDF_MODULE_ID_PE,
9560 QDF_MODULE_ID_PE, &msg);
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08009561 if (status != QDF_STATUS_SUCCESS) {
9562 sme_err("Not able to post addba reject");
9563 qdf_mem_free(addba_accept);
9564 return -EIO;
9565 }
9566 return 0;
9567}
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08009568
9569int sme_set_ba_buff_size(tHalHandle hal, uint8_t session_id,
9570 uint16_t buff_size)
9571{
9572 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
9573 if (!buff_size) {
9574 sme_err("invalid buff size %d", buff_size);
9575 return -EINVAL;
9576 }
9577 mac_ctx->usr_cfg_ba_buff_size = buff_size;
9578 sme_debug("addba buff size is set to %d",
9579 mac_ctx->usr_cfg_ba_buff_size);
9580
9581 return 0;
9582}
9583
9584#define DEFAULT_BA_BUFF_SIZE 64
9585int sme_send_addba_req(tHalHandle hal, uint8_t session_id, uint8_t tid,
9586 uint16_t buff_size)
9587{
9588 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
9589 uint16_t ba_buff = 0;
9590 QDF_STATUS status;
9591 struct scheduler_msg msg = {0};
9592 struct send_add_ba_req *send_ba_req;
9593 struct csr_roam_session *csr_session = NULL;
9594
9595 if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) {
9596 sme_err("STA not infra/connected state session_id: %d",
9597 session_id);
9598 return -EINVAL;
9599 }
9600 csr_session = CSR_GET_SESSION(mac_ctx, session_id);
9601 if (!csr_session) {
9602 sme_err("CSR session is NULL");
9603 return -EINVAL;
9604 }
9605 send_ba_req = qdf_mem_malloc(sizeof(*send_ba_req));
Arif Hussain0ef77082018-10-10 16:42:53 -07009606 if (!send_ba_req)
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08009607 return -EIO;
Arif Hussain0ef77082018-10-10 16:42:53 -07009608
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08009609 qdf_mem_copy(send_ba_req->mac_addr,
9610 csr_session->connectedProfile.bssid.bytes,
9611 QDF_MAC_ADDR_SIZE);
9612 ba_buff = buff_size;
9613 if (!buff_size) {
9614 if (mac_ctx->usr_cfg_ba_buff_size)
9615 ba_buff = mac_ctx->usr_cfg_ba_buff_size;
9616 else
9617 ba_buff = DEFAULT_BA_BUFF_SIZE;
9618 }
9619 send_ba_req->param.vdev_id = session_id;
9620 send_ba_req->param.tidno = tid;
9621 send_ba_req->param.buffersize = ba_buff;
9622 msg.type = WMA_SEND_ADDBA_REQ;
9623 msg.bodyptr = send_ba_req;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309624 status = scheduler_post_message(QDF_MODULE_ID_SME,
9625 QDF_MODULE_ID_WMA,
9626 QDF_MODULE_ID_WMA, &msg);
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08009627 if (QDF_STATUS_SUCCESS != status) {
9628 sme_err("Failed to post WMA_SEND_ADDBA_REQ");
9629 qdf_mem_free(send_ba_req);
9630 return -EIO;
9631 }
9632 sme_debug("ADDBA_REQ sent to FW: tid %d buff_size %d", tid, ba_buff);
9633
9634 return 0;
9635}
9636
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08009637int sme_set_no_ack_policy(tHalHandle hal, uint8_t session_id,
9638 uint8_t val, uint8_t ac)
9639{
9640 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
9641 uint8_t i, set_val;
Arif Hussaineb8ba362018-03-07 19:15:13 -08009642 struct scheduler_msg msg = {0};
9643 QDF_STATUS status;
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08009644
9645 if (ac > MAX_NUM_AC) {
9646 sme_err("invalid ac val %d", ac);
9647 return -EINVAL;
9648 }
9649 if (val)
9650 set_val = 1;
9651 else
9652 set_val = 0;
9653 if (ac == MAX_NUM_AC) {
9654 for (i = 0; i < ac; i++)
9655 mac_ctx->no_ack_policy_cfg[i] = set_val;
9656 } else {
9657 mac_ctx->no_ack_policy_cfg[ac] = set_val;
9658 }
9659 sme_debug("no ack is set to %d for ac %d", set_val, ac);
Arif Hussaineb8ba362018-03-07 19:15:13 -08009660 qdf_mem_zero(&msg, sizeof(msg));
9661 msg.type = eWNI_SME_UPDATE_EDCA_PROFILE;
9662 msg.reserved = 0;
9663 msg.bodyval = session_id;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309664 status = scheduler_post_message(QDF_MODULE_ID_SME,
9665 QDF_MODULE_ID_PE,
9666 QDF_MODULE_ID_PE, &msg);
Arif Hussaineb8ba362018-03-07 19:15:13 -08009667 if (status != QDF_STATUS_SUCCESS) {
9668 sme_err("Not able to post update edca profile");
9669 return -EIO;
9670 }
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08009671
9672 return 0;
9673}
9674
Kiran Kumar Lokerea006a302018-03-07 20:58:13 -08009675int sme_set_auto_rate_he_ltf(tHalHandle hal, uint8_t session_id,
9676 uint8_t cfg_val)
9677{
9678 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
9679 uint32_t set_val;
9680 uint32_t bit_mask = 0;
9681 int status;
9682
9683 if (cfg_val > QCA_WLAN_HE_LTF_4X) {
9684 sme_err("invalid HE LTF cfg %d", cfg_val);
9685 return -EINVAL;
9686 }
9687
9688 /*set the corresponding HE LTF cfg BIT*/
9689 if (cfg_val == QCA_WLAN_HE_LTF_AUTO)
9690 bit_mask = HE_LTF_ALL;
9691 else
9692 bit_mask = (1 << (cfg_val - 1));
9693
9694 set_val = mac_ctx->he_sgi_ltf_cfg_bit_mask;
9695
9696 SET_AUTO_RATE_HE_LTF_VAL(set_val, bit_mask);
9697
9698 mac_ctx->he_sgi_ltf_cfg_bit_mask = set_val;
9699 status = wma_cli_set_command(session_id,
9700 WMI_VDEV_PARAM_AUTORATE_MISC_CFG,
9701 set_val, VDEV_CMD);
9702 if (status) {
9703 sme_err("failed to set he_ltf_sgi");
9704 return status;
9705 }
9706
9707 sme_debug("HE SGI_LTF is set to 0x%08X",
9708 mac_ctx->he_sgi_ltf_cfg_bit_mask);
9709
9710 return 0;
9711}
9712
9713int sme_set_auto_rate_he_sgi(tHalHandle hal, uint8_t session_id,
9714 uint8_t cfg_val)
9715{
9716 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
9717 uint32_t set_val;
9718 uint32_t sgi_bit_mask = 0;
9719 int status;
9720
9721 if ((cfg_val > AUTO_RATE_GI_3200NS) ||
9722 (cfg_val < AUTO_RATE_GI_400NS)) {
9723 sme_err("invalid auto rate GI cfg %d", cfg_val);
9724 return -EINVAL;
9725 }
9726
9727 sgi_bit_mask = (1 << cfg_val);
9728
9729 set_val = mac_ctx->he_sgi_ltf_cfg_bit_mask;
9730 SET_AUTO_RATE_SGI_VAL(set_val, sgi_bit_mask);
9731
9732 mac_ctx->he_sgi_ltf_cfg_bit_mask = set_val;
9733 status = wma_cli_set_command(session_id,
9734 WMI_VDEV_PARAM_AUTORATE_MISC_CFG,
9735 set_val, VDEV_CMD);
9736 if (status) {
9737 sme_err("failed to set he_ltf_sgi");
9738 return status;
9739 }
9740
9741 sme_debug("auto rate HE SGI_LTF is set to 0x%08X",
9742 mac_ctx->he_sgi_ltf_cfg_bit_mask);
9743
9744 return 0;
9745}
9746
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009747#define HT20_SHORT_GI_MCS7_RATE 722
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309748/*
9749 * sme_send_rate_update_ind() -
9750 * API to Update rate
9751 *
9752 * hHal - The handle returned by mac_open
9753 * rateUpdateParams - Pointer to rate update params
9754 * Return QDF_STATUS
9755 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309756QDF_STATUS sme_send_rate_update_ind(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009757 tSirRateUpdateInd *rateUpdateParams)
9758{
9759 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309760 QDF_STATUS status;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009761 struct scheduler_msg msg = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309762 tSirRateUpdateInd *rate_upd = qdf_mem_malloc(sizeof(tSirRateUpdateInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009763
Arif Hussain0ef77082018-10-10 16:42:53 -07009764 if (!rate_upd)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309765 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -07009766
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009767 *rate_upd = *rateUpdateParams;
9768
9769 if (rate_upd->mcastDataRate24GHz == HT20_SHORT_GI_MCS7_RATE)
9770 rate_upd->mcastDataRate24GHzTxFlag =
Naveen Rawatea1564b2018-05-17 15:56:11 -07009771 TX_RATE_HT20 | TX_RATE_SGI;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009772 else if (rate_upd->reliableMcastDataRate ==
9773 HT20_SHORT_GI_MCS7_RATE)
9774 rate_upd->reliableMcastDataRateTxFlag =
Naveen Rawatea1564b2018-05-17 15:56:11 -07009775 TX_RATE_HT20 | TX_RATE_SGI;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009776
9777 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309778 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009779 msg.type = WMA_RATE_UPDATE_IND;
9780 msg.bodyptr = rate_upd;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05309781 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
9782 NO_SESSION, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309783 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309784 (scheduler_post_message(QDF_MODULE_ID_SME,
9785 QDF_MODULE_ID_WMA,
9786 QDF_MODULE_ID_WMA,
9787 &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309788 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Rachit Kankaneee1735c2018-08-02 13:19:34 +05309789 "%s: Not able to post WMA_RATE_UPDATE_IND to WMA!",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009790 __func__);
9791
9792 sme_release_global_lock(&pMac->sme);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309793 qdf_mem_free(rate_upd);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309794 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009795 }
9796
9797 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309798 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009799 }
9800
9801 return status;
9802}
9803
9804/**
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05309805 * sme_update_access_policy_vendor_ie() - update vendor ie and access policy.
9806 * @hal: Pointer to the mac context
9807 * @session_id: sme session id
9808 * @vendor_ie: vendor ie
9809 * @access_policy: vendor ie access policy
9810 *
9811 * This function updates the vendor ie and access policy to lim.
9812 *
9813 * Return: success or failure.
9814 */
9815QDF_STATUS sme_update_access_policy_vendor_ie(tHalHandle hal,
9816 uint8_t session_id, uint8_t *vendor_ie, int access_policy)
9817{
9818 struct sme_update_access_policy_vendor_ie *msg;
9819 uint16_t msg_len;
9820 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05309821
9822 msg_len = sizeof(*msg);
9823
9824 msg = qdf_mem_malloc(msg_len);
9825 if (!msg) {
Srinivas Girigowda09625b02018-09-10 15:28:09 -07009826 return QDF_STATUS_E_NOMEM;
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05309827 }
9828
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05309829 msg->msg_type = (uint16_t)eWNI_SME_UPDATE_ACCESS_POLICY_VENDOR_IE;
9830 msg->length = (uint16_t)msg_len;
9831
9832 qdf_mem_copy(&msg->ie[0], vendor_ie, sizeof(msg->ie));
9833
9834 msg->sme_session_id = session_id;
9835 msg->access_policy = access_policy;
9836
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009837 sme_debug("sme_session_id: %hu, access_policy: %d", session_id,
9838 access_policy);
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05309839
Rajeev Kumard138ac52017-01-30 18:38:37 -08009840 status = umac_send_mb_message_to_mac(msg);
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05309841
9842 return status;
9843}
9844
9845/**
Agrawal Ashishda3e9502016-09-21 17:43:51 +05309846 * sme_update_short_retry_limit_threshold() - update short frame retry limit TH
9847 * @hal: Handle returned by mac_open
9848 * @session_id: Session ID on which short frame retry limit needs to be
9849 * updated to FW
9850 * @short_limit_count_th: Retry count TH to retry short frame.
9851 *
9852 * This function is used to configure count to retry short frame.
9853 *
9854 * Return: QDF_STATUS
9855 */
9856QDF_STATUS sme_update_short_retry_limit_threshold(tHalHandle hal_handle,
9857 struct sme_short_retry_limit *short_retry_limit_th)
9858{
Agrawal Ashishda3e9502016-09-21 17:43:51 +05309859 QDF_STATUS status = QDF_STATUS_SUCCESS;
9860 struct sme_short_retry_limit *srl;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009861 struct scheduler_msg msg = {0};
Agrawal Ashishda3e9502016-09-21 17:43:51 +05309862
9863 srl = qdf_mem_malloc(sizeof(*srl));
Arif Hussain0ef77082018-10-10 16:42:53 -07009864 if (!srl)
Agrawal Ashishda3e9502016-09-21 17:43:51 +05309865 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -07009866
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009867 sme_debug("session_id %d short retry limit count: %d",
Agrawal Ashishda3e9502016-09-21 17:43:51 +05309868 short_retry_limit_th->session_id,
9869 short_retry_limit_th->short_retry_limit);
9870
9871 srl->session_id = short_retry_limit_th->session_id;
9872 srl->short_retry_limit = short_retry_limit_th->short_retry_limit;
9873
9874 qdf_mem_zero(&msg, sizeof(msg));
9875 msg.type = SIR_HAL_SHORT_RETRY_LIMIT_CNT;
9876 msg.reserved = 0;
9877 msg.bodyptr = srl;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309878 status = scheduler_post_message(QDF_MODULE_ID_SME,
9879 QDF_MODULE_ID_WMA,
9880 QDF_MODULE_ID_WMA, &msg);
Agrawal Ashishda3e9502016-09-21 17:43:51 +05309881 if (status != QDF_STATUS_SUCCESS) {
9882 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9883 FL("Not able to post short retry limit count to WDA"));
9884 qdf_mem_free(srl);
9885 return QDF_STATUS_E_FAILURE;
9886 }
9887
9888 return status;
9889}
9890
9891/**
9892 * sme_update_long_retry_limit_threshold() - update long retry limit TH
9893 * @hal: Handle returned by mac_open
9894 * @session_id: Session ID on which long frames retry TH needs to be updated
9895 * to FW
9896 * @long_limit_count_th: Retry count to retry long frame.
9897 *
9898 * This function is used to configure TH to retry long frame.
9899 *
9900 * Return: QDF_STATUS
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309901 */
Agrawal Ashishda3e9502016-09-21 17:43:51 +05309902QDF_STATUS sme_update_long_retry_limit_threshold(tHalHandle hal_handle,
9903 struct sme_long_retry_limit *long_retry_limit_th)
9904{
Agrawal Ashishda3e9502016-09-21 17:43:51 +05309905 QDF_STATUS status = QDF_STATUS_SUCCESS;
9906 struct sme_long_retry_limit *lrl;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009907 struct scheduler_msg msg = {0};
Agrawal Ashishda3e9502016-09-21 17:43:51 +05309908
9909 lrl = qdf_mem_malloc(sizeof(*lrl));
Arif Hussain0ef77082018-10-10 16:42:53 -07009910 if (!lrl)
Agrawal Ashishda3e9502016-09-21 17:43:51 +05309911 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -07009912
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009913 sme_debug("session_id %d long retry limit count: %d",
Agrawal Ashishda3e9502016-09-21 17:43:51 +05309914 long_retry_limit_th->session_id,
9915 long_retry_limit_th->long_retry_limit);
9916
9917 lrl->session_id = long_retry_limit_th->session_id;
9918 lrl->long_retry_limit = long_retry_limit_th->long_retry_limit;
9919
9920 qdf_mem_zero(&msg, sizeof(msg));
9921 msg.type = SIR_HAL_LONG_RETRY_LIMIT_CNT;
9922 msg.reserved = 0;
9923 msg.bodyptr = lrl;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309924 status = scheduler_post_message(QDF_MODULE_ID_SME,
9925 QDF_MODULE_ID_WMA,
9926 QDF_MODULE_ID_WMA, &msg);
Agrawal Ashishda3e9502016-09-21 17:43:51 +05309927
9928 if (status != QDF_STATUS_SUCCESS) {
9929 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9930 FL("Not able to post long retry limit count to WDA"));
9931 qdf_mem_free(lrl);
9932 return QDF_STATUS_E_FAILURE;
9933 }
9934
9935 return status;
9936}
9937
9938/**
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05309939 * sme_update_sta_inactivity_timeout(): Update sta_inactivity_timeout to FW
9940 * @hal: Handle returned by mac_open
9941 * @session_id: Session ID on which sta_inactivity_timeout needs
9942 * to be updated to FW
9943 * @sta_inactivity_timeout: sta inactivity timeout.
9944 *
9945 * If a station does not send anything in sta_inactivity_timeout seconds, an
9946 * empty data frame is sent to it in order to verify whether it is
9947 * still in range. If this frame is not ACKed, the station will be
9948 * disassociated and then deauthenticated.
9949 *
9950 * Return: QDF_STATUS_SUCCESS or non-zero on failure.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309951 */
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05309952QDF_STATUS sme_update_sta_inactivity_timeout(tHalHandle hal_handle,
9953 struct sme_sta_inactivity_timeout *sta_inactivity_timer)
9954{
9955 struct sme_sta_inactivity_timeout *inactivity_time;
9956 void *wma_handle;
9957
9958 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
9959 inactivity_time = qdf_mem_malloc(sizeof(*inactivity_time));
Arif Hussain0ef77082018-10-10 16:42:53 -07009960 if (!inactivity_time)
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05309961 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -07009962
Abhishek Singhe4a1f882017-08-10 17:59:44 +05309963 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05309964 FL("sta_inactivity_timeout: %d"),
9965 sta_inactivity_timer->sta_inactivity_timeout);
9966 inactivity_time->session_id = sta_inactivity_timer->session_id;
9967 inactivity_time->sta_inactivity_timeout =
9968 sta_inactivity_timer->sta_inactivity_timeout;
9969
9970 wma_update_sta_inactivity_timeout(wma_handle,
9971 inactivity_time);
9972 return QDF_STATUS_SUCCESS;
9973}
9974
9975/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009976 * sme_get_reg_info() - To get registration info
9977 * @hHal: HAL context
9978 * @chanId: channel id
9979 * @regInfo1: first reg info to fill
9980 * @regInfo2: second reg info to fill
9981 *
9982 * This routine will give you reg info
9983 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309984 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009985 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309986QDF_STATUS sme_get_reg_info(tHalHandle hHal, uint8_t chanId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009987 uint32_t *regInfo1, uint32_t *regInfo2)
9988{
9989 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309990 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009991 uint8_t i;
9992 bool found = false;
9993
9994 status = sme_acquire_global_lock(&pMac->sme);
9995 *regInfo1 = 0;
9996 *regInfo2 = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309997 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009998 return status;
9999
10000 for (i = 0; i < WNI_CFG_VALID_CHANNEL_LIST_LEN; i++) {
Amar Singhala297bfa2015-10-15 15:07:29 -070010001 if (pMac->scan.defaultPowerTable[i].chan_num == chanId) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010002 SME_SET_CHANNEL_REG_POWER(*regInfo1,
Amar Singhal5cccafe2017-02-15 12:42:58 -080010003 pMac->scan.defaultPowerTable[i].tx_power);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010004
10005 SME_SET_CHANNEL_MAX_TX_POWER(*regInfo2,
Amar Singhal5cccafe2017-02-15 12:42:58 -080010006 pMac->scan.defaultPowerTable[i].tx_power);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010007 found = true;
10008 break;
10009 }
10010 }
10011 if (!found)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010012 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010013
10014 sme_release_global_lock(&pMac->sme);
10015 return status;
10016}
10017
10018#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010019/*
10020 * sme_auto_shutdown_cb() -
10021 * Used to plug in callback function for receiving auto shutdown evt
10022 *
10023 * hHal
10024 * pCallbackfn : callback function pointer should be plugged in
10025 * Return QDF_STATUS
10026 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010027QDF_STATUS sme_set_auto_shutdown_cb(tHalHandle hHal, void (*pCallbackfn)(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010028 ) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010029 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010030 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10031
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010032 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010033 "%s: Plug in Auto shutdown event callback", __func__);
10034
10035 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010036 if (QDF_STATUS_SUCCESS == status) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010037 if (NULL != pCallbackfn)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010038 pMac->sme.pAutoShutdownNotificationCb = pCallbackfn;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010039 sme_release_global_lock(&pMac->sme);
10040 }
10041
10042 return status;
10043}
10044
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010045/*
10046 * sme_set_auto_shutdown_timer() -
10047 * API to set auto shutdown timer value in FW.
10048 *
10049 * hHal - The handle returned by mac_open
10050 * timer_val - The auto shutdown timer value to be set
10051 * Return Configuration message posting status, SUCCESS or Fail
10052 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010053QDF_STATUS sme_set_auto_shutdown_timer(tHalHandle hHal, uint32_t timer_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010054{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010055 QDF_STATUS status = QDF_STATUS_SUCCESS;
10056 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010057 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10058 tSirAutoShutdownCmdParams *auto_sh_cmd;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010059 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010060
10061 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010062 if (QDF_STATUS_SUCCESS == status) {
Arif Hussain0ef77082018-10-10 16:42:53 -070010063 auto_sh_cmd = qdf_mem_malloc(sizeof(tSirAutoShutdownCmdParams));
10064 if (!auto_sh_cmd) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010065 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010066 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010067 }
10068
10069 auto_sh_cmd->timer_val = timer_val;
10070
10071 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010072 message.bodyptr = auto_sh_cmd;
10073 message.type = WMA_SET_AUTO_SHUTDOWN_TIMER_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010074 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
10075 QDF_MODULE_ID_WMA,
10076 QDF_MODULE_ID_WMA,
10077 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010078 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010079 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010080 "%s: Post Auto shutdown MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010081 qdf_mem_free(auto_sh_cmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010082 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010083 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010084 }
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010085 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010086 "%s: Posted Auto shutdown MSG", __func__);
10087 sme_release_global_lock(&pMac->sme);
10088 }
10089
10090 return status;
10091}
10092#endif
10093
Nirav Shaheb017be2018-02-15 11:20:58 +053010094#ifdef FEATURE_WLAN_CH_AVOID
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010095/*
10096 * sme_ch_avoid_update_req() -
10097 * API to request channel avoidance update from FW.
10098 *
10099 * hHal - The handle returned by mac_open
Jeff Johnsonc5927de2018-05-11 09:12:53 -070010100 * update_type - The update_type parameter of this request call
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010101 * Return Configuration message posting status, SUCCESS or Fail
10102 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010103QDF_STATUS sme_ch_avoid_update_req(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010104{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010105 QDF_STATUS status = QDF_STATUS_SUCCESS;
10106 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010107 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10108 tSirChAvoidUpdateReq *cauReq;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010109 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010110
10111 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010112 if (QDF_STATUS_SUCCESS == status) {
Arif Hussain0ef77082018-10-10 16:42:53 -070010113 cauReq = qdf_mem_malloc(sizeof(tSirChAvoidUpdateReq));
10114 if (!cauReq) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010115 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010116 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010117 }
10118
10119 cauReq->reserved_param = 0;
10120
10121 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010122 message.bodyptr = cauReq;
10123 message.type = WMA_CH_AVOID_UPDATE_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010124 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
10125 QDF_MODULE_ID_WMA,
10126 QDF_MODULE_ID_WMA,
10127 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010128 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010129 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010130 "%s: Post Ch Avoid Update MSG fail",
10131 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010132 qdf_mem_free(cauReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010133 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010134 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010135 }
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010136 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010137 "%s: Posted Ch Avoid Update MSG", __func__);
10138 sme_release_global_lock(&pMac->sme);
10139 }
10140
10141 return status;
10142}
Nirav Shaheb017be2018-02-15 11:20:58 +053010143#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010144
10145/**
10146 * sme_set_miracast() - Function to set miracast value to UMAC
10147 * @hal: Handle returned by macOpen
10148 * @filter_type: 0-Disabled, 1-Source, 2-sink
10149 *
10150 * This function passes down the value of miracast set by
10151 * framework to UMAC
10152 *
10153 * Return: Configuration message posting status, SUCCESS or Fail
10154 *
10155 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010156QDF_STATUS sme_set_miracast(tHalHandle hal, uint8_t filter_type)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010157{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010158 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010159 uint32_t *val;
10160 tpAniSirGlobal mac_ptr = PMAC_STRUCT(hal);
10161
Arif Hussain0ef77082018-10-10 16:42:53 -070010162 if (!mac_ptr) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010163 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010164 "%s: Invalid pointer", __func__);
Arif Hussain0ef77082018-10-10 16:42:53 -070010165 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010166 }
10167
Arif Hussain0ef77082018-10-10 16:42:53 -070010168 val = qdf_mem_malloc(sizeof(*val));
10169 if (!val)
10170 return QDF_STATUS_E_NOMEM;
10171
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010172 *val = filter_type;
10173
10174 msg.type = SIR_HAL_SET_MIRACAST;
10175 msg.reserved = 0;
10176 msg.bodyptr = val;
10177
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010178 if (!QDF_IS_STATUS_SUCCESS(
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010179 scheduler_post_message(QDF_MODULE_ID_SME,
10180 QDF_MODULE_ID_WMA,
10181 QDF_MODULE_ID_WMA,
10182 &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010183 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010184 "%s: Not able to post WDA_SET_MAS_ENABLE_DISABLE to WMA!",
10185 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010186 qdf_mem_free(val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010187 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010188 }
10189
10190 mac_ptr->sme.miracast_value = filter_type;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010191 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010192}
10193
10194/**
10195 * sme_set_mas() - Function to set MAS value to UMAC
10196 * @val: 1-Enable, 0-Disable
10197 *
10198 * This function passes down the value of MAS to the UMAC. A
10199 * value of 1 will enable MAS and a value of 0 will disable MAS
10200 *
10201 * Return: Configuration message posting status, SUCCESS or Fail
10202 *
10203 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010204QDF_STATUS sme_set_mas(uint32_t val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010205{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010206 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010207 uint32_t *ptr_val;
10208
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010209 ptr_val = qdf_mem_malloc(sizeof(*ptr_val));
Arif Hussain0ef77082018-10-10 16:42:53 -070010210 if (!ptr_val)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010211 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010212
10213 *ptr_val = val;
10214
10215 msg.type = SIR_HAL_SET_MAS;
10216 msg.reserved = 0;
10217 msg.bodyptr = ptr_val;
10218
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010219 if (!QDF_IS_STATUS_SUCCESS(
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010220 scheduler_post_message(QDF_MODULE_ID_SME,
10221 QDF_MODULE_ID_WMA,
10222 QDF_MODULE_ID_WMA,
10223 &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010224 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010225 "%s: Not able to post WDA_SET_MAS_ENABLE_DISABLE to WMA!",
10226 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010227 qdf_mem_free(ptr_val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010228 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010229 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010230 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010231}
10232
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080010233/**
10234 * sme_roam_channel_change_req() - Channel change to new target channel
10235 * @hHal: handle returned by mac_open
10236 * @bssid: mac address of BSS
10237 * @ch_params: target channel information
10238 * @profile: CSR profile
10239 *
10240 * API to Indicate Channel change to new target channel
10241 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010242 * Return: QDF_STATUS
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080010243 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010244QDF_STATUS sme_roam_channel_change_req(tHalHandle hHal,
Amar Singhale4f28ee2015-10-21 14:36:56 -070010245 struct qdf_mac_addr bssid,
Amar Singhal5cccafe2017-02-15 12:42:58 -080010246 struct ch_params *ch_params,
Jeff Johnson66ee8a92018-03-17 15:24:26 -070010247 struct csr_roam_profile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010248{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010249 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010250 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010251
10252 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010253 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010254
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080010255 status = csr_roam_channel_change_req(pMac, bssid, ch_params,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010256 profile);
10257 sme_release_global_lock(&pMac->sme);
10258 }
10259 return status;
10260}
10261
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010262/*
10263 * sme_process_channel_change_resp() -
10264 * API to Indicate Channel change response message to SAP.
10265 *
10266 * Return QDF_STATUS
10267 */
10268static QDF_STATUS sme_process_channel_change_resp(tpAniSirGlobal pMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010269 uint16_t msg_type, void *pMsgBuf)
10270{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010271 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson172237b2017-11-07 15:32:59 -080010272 struct csr_roam_info proam_info = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010273 eCsrRoamResult roamResult;
10274 tpSwitchChannelParams pChnlParams = (tpSwitchChannelParams) pMsgBuf;
10275 uint32_t SessionId = pChnlParams->peSessionId;
10276
10277 proam_info.channelChangeRespEvent =
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010278 qdf_mem_malloc(sizeof(tSirChanChangeResponse));
Arif Hussain0ef77082018-10-10 16:42:53 -070010279 if (!proam_info.channelChangeRespEvent) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010280 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010281 return status;
10282 }
10283 if (msg_type == eWNI_SME_CHANNEL_CHANGE_RSP) {
10284 proam_info.channelChangeRespEvent->sessionId = SessionId;
10285 proam_info.channelChangeRespEvent->newChannelNumber =
10286 pChnlParams->channelNumber;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010287
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010288 if (pChnlParams->status == QDF_STATUS_SUCCESS) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010289 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010290 "sapdfs: Received success eWNI_SME_CHANNEL_CHANGE_RSP for sessionId[%d]",
10291 SessionId);
10292 proam_info.channelChangeRespEvent->channelChangeStatus =
10293 1;
10294 roamResult = eCSR_ROAM_RESULT_CHANNEL_CHANGE_SUCCESS;
10295 } else {
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010296 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010297 "sapdfs: Received failure eWNI_SME_CHANNEL_CHANGE_RSP for sessionId[%d]",
10298 SessionId);
10299 proam_info.channelChangeRespEvent->channelChangeStatus =
10300 0;
10301 roamResult = eCSR_ROAM_RESULT_CHANNEL_CHANGE_FAILURE;
10302 }
10303
10304 csr_roam_call_callback(pMac, SessionId, &proam_info, 0,
10305 eCSR_ROAM_SET_CHANNEL_RSP, roamResult);
10306
10307 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010308 status = QDF_STATUS_E_FAILURE;
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010309 sme_err("Invalid Channel Change Resp Message: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010310 status);
10311 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010312 qdf_mem_free(proam_info.channelChangeRespEvent);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010313
10314 return status;
10315}
10316
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010317/*
10318 * sme_roam_start_beacon_req() -
10319 * API to Indicate LIM to start Beacon Tx after SAP CAC Wait is completed.
10320 *
10321 * hHal - The handle returned by mac_open
10322 * sessionId - session ID
10323 * dfsCacWaitStatus - CAC WAIT status flag
10324 * Return QDF_STATUS
10325 */
Anurag Chouhan6d760662016-02-20 16:05:43 +053010326QDF_STATUS sme_roam_start_beacon_req(tHalHandle hHal, struct qdf_mac_addr bssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010327 uint8_t dfsCacWaitStatus)
10328{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010329 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010330 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010331
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010332 status = sme_acquire_global_lock(&pMac->sme);
10333
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010334 if (QDF_IS_STATUS_SUCCESS(status)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010335 status = csr_roam_start_beacon_req(pMac, bssid,
10336 dfsCacWaitStatus);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010337 sme_release_global_lock(&pMac->sme);
10338 }
10339 return status;
10340}
10341
Abhishek Singh20a8e442018-09-12 15:50:44 +053010342#ifdef CONFIG_VDEV_SM
10343QDF_STATUS sme_csa_restart(tpAniSirGlobal mac_ctx, uint8_t session_id)
10344{
10345 QDF_STATUS status = QDF_STATUS_E_FAILURE;
10346
10347 status = sme_acquire_global_lock(&mac_ctx->sme);
10348 if (QDF_IS_STATUS_SUCCESS(status)) {
10349 status = csr_csa_restart(mac_ctx, session_id);
10350 sme_release_global_lock(&mac_ctx->sme);
10351 }
10352
10353 return status;
10354}
10355#endif
10356
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080010357/**
10358 * sme_roam_csa_ie_request() - request CSA IE transmission from PE
10359 * @hHal: handle returned by mac_open
10360 * @bssid: SAP bssid
10361 * @targetChannel: target channel information
10362 * @csaIeReqd: CSA IE Request
10363 * @ch_params: channel information
10364 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010365 * Return: QDF_STATUS
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080010366 */
Anurag Chouhan6d760662016-02-20 16:05:43 +053010367QDF_STATUS sme_roam_csa_ie_request(tHalHandle hHal, struct qdf_mac_addr bssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010368 uint8_t targetChannel, uint8_t csaIeReqd,
Amar Singhal5cccafe2017-02-15 12:42:58 -080010369 struct ch_params *ch_params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010370{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010371 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010372 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010373
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010374 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010375 if (QDF_IS_STATUS_SUCCESS(status)) {
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080010376 status = csr_roam_send_chan_sw_ie_request(pMac, bssid,
10377 targetChannel, csaIeReqd, ch_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010378 sme_release_global_lock(&pMac->sme);
10379 }
10380 return status;
10381}
10382
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010383/*
10384 * sme_init_thermal_info() -
10385 * SME API to initialize the thermal mitigation parameters
10386 *
10387 * hHal
10388 * thermalParam : thermal mitigation parameters
10389 * Return QDF_STATUS
10390 */
10391QDF_STATUS sme_init_thermal_info(tHalHandle hHal, tSmeThermalParams
10392 thermalParam)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010393{
10394 t_thermal_mgmt *pWmaParam;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010395 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010396 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10397
Arif Hussain0ef77082018-10-10 16:42:53 -070010398 pWmaParam = qdf_mem_malloc(sizeof(t_thermal_mgmt));
10399 if (!pWmaParam)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010400 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010401
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010402 pWmaParam->thermalMgmtEnabled = thermalParam.smeThermalMgmtEnabled;
10403 pWmaParam->throttlePeriod = thermalParam.smeThrottlePeriod;
Poddar, Siddarth83905022016-04-16 17:56:08 -070010404
10405 pWmaParam->throttle_duty_cycle_tbl[0] =
10406 thermalParam.sme_throttle_duty_cycle_tbl[0];
10407 pWmaParam->throttle_duty_cycle_tbl[1] =
10408 thermalParam.sme_throttle_duty_cycle_tbl[1];
10409 pWmaParam->throttle_duty_cycle_tbl[2] =
10410 thermalParam.sme_throttle_duty_cycle_tbl[2];
10411 pWmaParam->throttle_duty_cycle_tbl[3] =
10412 thermalParam.sme_throttle_duty_cycle_tbl[3];
10413
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010414 pWmaParam->thermalLevels[0].minTempThreshold =
10415 thermalParam.smeThermalLevels[0].smeMinTempThreshold;
10416 pWmaParam->thermalLevels[0].maxTempThreshold =
10417 thermalParam.smeThermalLevels[0].smeMaxTempThreshold;
10418 pWmaParam->thermalLevels[1].minTempThreshold =
10419 thermalParam.smeThermalLevels[1].smeMinTempThreshold;
10420 pWmaParam->thermalLevels[1].maxTempThreshold =
10421 thermalParam.smeThermalLevels[1].smeMaxTempThreshold;
10422 pWmaParam->thermalLevels[2].minTempThreshold =
10423 thermalParam.smeThermalLevels[2].smeMinTempThreshold;
10424 pWmaParam->thermalLevels[2].maxTempThreshold =
10425 thermalParam.smeThermalLevels[2].smeMaxTempThreshold;
10426 pWmaParam->thermalLevels[3].minTempThreshold =
10427 thermalParam.smeThermalLevels[3].smeMinTempThreshold;
10428 pWmaParam->thermalLevels[3].maxTempThreshold =
10429 thermalParam.smeThermalLevels[3].smeMaxTempThreshold;
10430
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010431 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010432 msg.type = WMA_INIT_THERMAL_INFO_CMD;
10433 msg.bodyptr = pWmaParam;
10434
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010435 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010436 (scheduler_post_message(QDF_MODULE_ID_SME,
10437 QDF_MODULE_ID_WMA,
10438 QDF_MODULE_ID_WMA,
10439 &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010440 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010441 "%s: Not able to post WMA_SET_THERMAL_INFO_CMD to WMA!",
10442 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010443 qdf_mem_free(pWmaParam);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010444 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010445 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010446 }
10447 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010448 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010449 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010450 qdf_mem_free(pWmaParam);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010451 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010452}
10453
10454/**
10455 * sme_add_set_thermal_level_callback() - Plug in set thermal level callback
10456 * @hal: Handle returned by macOpen
10457 * @callback: sme_set_thermal_level_callback
10458 *
10459 * Plug in set thermal level callback
10460 *
10461 * Return: none
10462 */
10463void sme_add_set_thermal_level_callback(tHalHandle hal,
10464 sme_set_thermal_level_callback callback)
10465{
10466 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
10467
10468 pMac->sme.set_thermal_level_cb = callback;
10469}
10470
10471/**
10472 * sme_set_thermal_level() - SME API to set the thermal mitigation level
10473 * @hal: Handler to HAL
10474 * @level: Thermal mitigation level
10475 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010476 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010477 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010478QDF_STATUS sme_set_thermal_level(tHalHandle hal, uint8_t level)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010479{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010480 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010481 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010482 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010483
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010484 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010485 qdf_mem_set(&msg, sizeof(msg), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010486 msg.type = WMA_SET_THERMAL_LEVEL;
10487 msg.bodyval = level;
10488
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010489 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
10490 QDF_MODULE_ID_WMA,
10491 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010492 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010493 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010494 "%s: Not able to post WMA_SET_THERMAL_LEVEL to WMA!",
10495 __func__);
10496 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010497 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010498 }
10499 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010500 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010501 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010502 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010503}
10504
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010505/*
10506 * sme_txpower_limit() -
10507 * SME API to set txpower limits
10508 *
10509 * hHal
10510 * psmetx : power limits for 2g/5g
10511 * Return QDF_STATUS
10512 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010513QDF_STATUS sme_txpower_limit(tHalHandle hHal, tSirTxPowerLimit *psmetx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010514{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010515 QDF_STATUS status = QDF_STATUS_SUCCESS;
10516 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010517 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010518 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080010519 tSirTxPowerLimit *tx_power_limit;
10520
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010521 tx_power_limit = qdf_mem_malloc(sizeof(*tx_power_limit));
Arif Hussain0ef77082018-10-10 16:42:53 -070010522 if (!tx_power_limit)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010523 return QDF_STATUS_E_FAILURE;
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080010524
10525 *tx_power_limit = *psmetx;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010526
10527 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010528 if (QDF_IS_STATUS_SUCCESS(status)) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010529 message.type = WMA_TX_POWER_LIMIT;
10530 message.reserved = 0;
10531 message.bodyptr = tx_power_limit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010532
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010533 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
10534 QDF_MODULE_ID_WMA,
10535 QDF_MODULE_ID_WMA,
10536 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010537 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010538 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010539 "%s: not able to post WMA_TX_POWER_LIMIT",
10540 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010541 status = QDF_STATUS_E_FAILURE;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010542 qdf_mem_free(tx_power_limit);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010543 }
10544 sme_release_global_lock(&pMac->sme);
10545 }
10546 return status;
10547}
10548
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010549QDF_STATUS sme_update_connect_debug(tHalHandle hHal, uint32_t set_value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010550{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010551 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010552 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010553
Dundi Ravitejaf99ce092018-09-27 17:51:59 +053010554 pMac->mlme_cfg->gen.debug_packet_log = set_value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010555 return status;
10556}
10557
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010558/*
10559 * sme_ap_disable_intra_bss_fwd() -
10560 * SME will send message to WMA to set Intra BSS in txrx
10561 *
10562 * hHal - The handle returned by mac_open
10563 * sessionId - session id ( vdev id)
10564 * disablefwd - bool value that indicate disable intrabss fwd disable
10565 * Return QDF_STATUS
10566 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010567QDF_STATUS sme_ap_disable_intra_bss_fwd(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010568 bool disablefwd)
10569{
10570 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010571 int status = QDF_STATUS_SUCCESS;
10572 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010573 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010574 tpDisableIntraBssFwd pSapDisableIntraFwd = NULL;
10575
10576 /* Prepare the request to send to SME. */
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010577 pSapDisableIntraFwd = qdf_mem_malloc(sizeof(tDisableIntraBssFwd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010578 if (NULL == pSapDisableIntraFwd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010579 sme_err("Memory Allocation Failure!!!");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010580 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010581 }
10582
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010583 pSapDisableIntraFwd->sessionId = sessionId;
10584 pSapDisableIntraFwd->disableintrabssfwd = disablefwd;
10585
10586 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010587 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010588 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010589 message.bodyptr = pSapDisableIntraFwd;
10590 message.type = WMA_SET_SAP_INTRABSS_DIS;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010591 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
10592 QDF_MODULE_ID_WMA,
10593 QDF_MODULE_ID_WMA,
10594 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010595 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
10596 status = QDF_STATUS_E_FAILURE;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010597 qdf_mem_free(pSapDisableIntraFwd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010598 }
10599 sme_release_global_lock(&pMac->sme);
10600 }
10601 return status;
10602}
10603
10604#ifdef WLAN_FEATURE_STATS_EXT
10605
Jeff Johnson45843652018-07-04 12:47:34 -070010606void sme_stats_ext_register_callback(mac_handle_t mac_handle,
10607 stats_ext_cb callback)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010608{
Jeff Johnson45843652018-07-04 12:47:34 -070010609 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010610
Jeff Johnson45843652018-07-04 12:47:34 -070010611 if (!mac) {
10612 sme_err("Invalid mac context");
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010613 return;
10614 }
10615
Jeff Johnson45843652018-07-04 12:47:34 -070010616 mac->sme.stats_ext_cb = callback;
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010617}
10618
Jeff Johnson45843652018-07-04 12:47:34 -070010619void sme_stats_ext_deregister_callback(mac_handle_t mac_handle)
10620{
10621 sme_stats_ext_register_callback(mac_handle, NULL);
10622}
10623
10624void sme_stats_ext2_register_callback(mac_handle_t mac_handle,
10625 stats_ext2_cb callback)
10626{
10627 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
10628
10629 if (!mac) {
10630 sme_err("Invalid mac context");
10631 return;
10632 }
10633
10634 mac->sme.stats_ext2_cb = callback;
10635}
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010636
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010637/*
10638 * sme_stats_ext_request() -
10639 * Function called when HDD receives STATS EXT vendor command from userspace
10640 *
10641 * sessionID - vdevID for the stats ext request
10642 * input - Stats Ext Request structure ptr
10643 * Return QDF_STATUS
10644 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010645QDF_STATUS sme_stats_ext_request(uint8_t session_id, tpStatsExtRequestReq input)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010646{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010647 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010648 tpStatsExtRequest data;
10649 size_t data_len;
10650
10651 data_len = sizeof(tStatsExtRequest) + input->request_data_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010652 data = qdf_mem_malloc(data_len);
Arif Hussain0ef77082018-10-10 16:42:53 -070010653 if (!data)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010654 return QDF_STATUS_E_NOMEM;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010655
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010656 data->vdev_id = session_id;
10657 data->request_data_len = input->request_data_len;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010658 if (input->request_data_len)
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010659 qdf_mem_copy(data->request_data,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010660 input->request_data, input->request_data_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010661
10662 msg.type = WMA_STATS_EXT_REQUEST;
10663 msg.reserved = 0;
10664 msg.bodyptr = data;
10665
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010666 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
10667 QDF_MODULE_ID_WMA,
10668 QDF_MODULE_ID_WMA,
10669 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010670 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010671 "%s: Not able to post WMA_STATS_EXT_REQUEST message to WMA",
10672 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010673 qdf_mem_free(data);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010674 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010675 }
10676
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010677 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010678}
10679
Jeff Johnsonfdecd512018-06-10 09:18:32 -070010680/**
10681 * sme_stats_ext_event() - eWNI_SME_STATS_EXT_EVENT processor
10682 * @mac: Global MAC context
10683 * @msg: "stats ext" message
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010684
Jeff Johnsonfdecd512018-06-10 09:18:32 -070010685 * This callback function called when SME received eWNI_SME_STATS_EXT_EVENT
10686 * response from WMA
10687 *
10688 * Return: QDF_STATUS
10689 */
10690static QDF_STATUS sme_stats_ext_event(tpAniSirGlobal mac,
Jeff Johnson45843652018-07-04 12:47:34 -070010691 struct stats_ext_event *msg)
Jeff Johnsonfdecd512018-06-10 09:18:32 -070010692{
10693 if (!msg) {
10694 sme_err("Null msg");
10695 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010696 }
10697
Jeff Johnson45843652018-07-04 12:47:34 -070010698 if (mac->sme.stats_ext_cb)
10699 mac->sme.stats_ext_cb(mac->hdd_handle, msg);
Jeff Johnsonfdecd512018-06-10 09:18:32 -070010700
10701 return QDF_STATUS_SUCCESS;
10702}
10703
10704#else
10705
10706static QDF_STATUS sme_stats_ext_event(tpAniSirGlobal mac,
Jeff Johnson45843652018-07-04 12:47:34 -070010707 struct stats_ext_event *msg)
Jeff Johnsonfdecd512018-06-10 09:18:32 -070010708{
10709 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010710}
10711
10712#endif
10713
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010714/*
10715 * sme_update_dfs_scan_mode() -
10716 * Update DFS roam scan mode
10717 * This function is called through dynamic setConfig callback function
10718 * to configure allowDFSChannelRoam.
10719 * hHal - HAL handle for device
10720 * sessionId - Session Identifier
10721 * allowDFSChannelRoam - DFS roaming scan mode 0 (disable),
10722 * 1 (passive), 2 (active)
10723 * Return QDF_STATUS_SUCCESS - SME update DFS roaming scan config
10724 * successfully.
10725 * Other status means SME failed to update DFS roaming scan config.
10726 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010727QDF_STATUS sme_update_dfs_scan_mode(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010728 uint8_t allowDFSChannelRoam)
10729{
10730 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010731 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010732
Naveen Rawatc36f7eb2016-11-10 20:01:03 -080010733 if (sessionId >= CSR_ROAM_SESSION_MAX) {
10734 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10735 FL("Invalid sme session id: %d"), sessionId);
10736 return QDF_STATUS_E_INVAL;
10737 }
10738
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010739 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010740 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010741 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010742 "LFR runtime successfully set AllowDFSChannelRoam Mode to %d - old value is %d - roam state is %s",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010743 allowDFSChannelRoam,
10744 pMac->roam.configParam.allowDFSChannelRoam,
10745 mac_trace_get_neighbour_roam_state(pMac->roam.
10746 neighborRoamInfo
10747 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010748 neighborRoamState));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010749 pMac->roam.configParam.allowDFSChannelRoam =
10750 allowDFSChannelRoam;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053010751 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
10752 csr_roam_offload_scan(pMac, sessionId,
10753 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
10754 REASON_ROAM_DFS_SCAN_MODE_CHANGED);
10755 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010756 sme_release_global_lock(&pMac->sme);
10757 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053010758
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010759
10760 return status;
10761}
10762
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010763/*
10764 * sme_get_dfs_scan_mode() - get DFS roam scan mode
10765 * This is a synchronous call
10766 *
10767 * hHal - The handle returned by mac_open.
10768 * Return DFS roaming scan mode 0 (disable), 1 (passive), 2 (active)
10769 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010770uint8_t sme_get_dfs_scan_mode(tHalHandle hHal)
10771{
10772 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010773
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010774 return pMac->roam.configParam.allowDFSChannelRoam;
10775}
10776
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010777/*
10778 * sme_modify_add_ie() -
10779 * This function sends msg to updates the additional IE buffers in PE
10780 *
10781 * hHal - global structure
10782 * pModifyIE - pointer to tModifyIE structure
10783 * updateType - type of buffer
10784 * Return Success or failure
10785 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010786QDF_STATUS sme_modify_add_ie(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010787 tSirModifyIE *pModifyIE, eUpdateIEsType updateType)
10788{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010789 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010790 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010791
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010792 status = sme_acquire_global_lock(&pMac->sme);
10793
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010794 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010795 status = csr_roam_modify_add_ies(pMac, pModifyIE, updateType);
10796 sme_release_global_lock(&pMac->sme);
10797 }
10798 return status;
10799}
10800
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010801/*
10802 * sme_update_add_ie() -
10803 * This function sends msg to updates the additional IE buffers in PE
10804 *
10805 * hHal - global structure
10806 * pUpdateIE - pointer to structure tUpdateIE
10807 * updateType - type of buffer
10808 * Return Success or failure
10809 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010810QDF_STATUS sme_update_add_ie(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010811 tSirUpdateIE *pUpdateIE, eUpdateIEsType updateType)
10812{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010813 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010814 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010815
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010816 status = sme_acquire_global_lock(&pMac->sme);
10817
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010818 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010819 status = csr_roam_update_add_ies(pMac, pUpdateIE, updateType);
10820 sme_release_global_lock(&pMac->sme);
10821 }
10822 return status;
10823}
10824
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010825/**
10826 * sme_update_dsc_pto_up_mapping()
10827 * @hHal: HAL context
10828 * @dscpmapping: pointer to DSCP mapping structure
10829 * @sessionId: SME session id
10830 *
10831 * This routine is called to update dscp mapping
10832 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010833 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010834 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010835QDF_STATUS sme_update_dsc_pto_up_mapping(tHalHandle hHal,
Abhishek Singh12be60f2017-08-11 13:52:42 +053010836 enum sme_qos_wmmuptype *dscpmapping,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010837 uint8_t sessionId)
10838{
10839 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010840 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010841 uint8_t i, j, peSessionId;
gaurank kathpalia14e2f912017-08-31 14:51:45 +053010842 struct csr_roam_session *pCsrSession = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010843 tpPESession pSession = NULL;
10844
10845 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010846 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010847 return status;
10848 pCsrSession = CSR_GET_SESSION(pMac, sessionId);
10849 if (pCsrSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010850 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010851 FL("Session lookup fails for CSR session"));
10852 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010853 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010854 }
10855 if (!CSR_IS_SESSION_VALID(pMac, sessionId)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010856 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010857 FL("Invalid session Id %u"), sessionId);
10858 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010859 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010860 }
10861
10862 pSession = pe_find_session_by_bssid(pMac,
10863 pCsrSession->connectedProfile.bssid.bytes,
10864 &peSessionId);
10865
10866 if (pSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010867 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010868 FL(" Session lookup fails for BSSID"));
10869 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010870 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010871 }
10872
10873 if (!pSession->QosMapSet.present) {
Srinivas Girigowda2b5d47c2017-03-29 00:28:46 -070010874 sme_debug("QOS Mapping IE not present");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010875 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010876 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010877 }
10878 for (i = 0; i < SME_QOS_WMM_UP_MAX; i++) {
10879 for (j = pSession->QosMapSet.dscp_range[i][0];
10880 j <= pSession->QosMapSet.dscp_range[i][1];
10881 j++) {
10882 if ((pSession->QosMapSet.dscp_range[i][0] == 255)
10883 && (pSession->QosMapSet.dscp_range[i][1] ==
10884 255)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010885 QDF_TRACE(QDF_MODULE_ID_SME,
Kiran Kumar Lokere1d411bb2017-11-29 15:24:05 -080010886 QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010887 FL("User Priority %d isn't used"), i);
10888 break;
10889 } else {
10890 dscpmapping[j] = i;
10891 }
10892 }
10893 }
10894 for (i = 0; i < pSession->QosMapSet.num_dscp_exceptions; i++)
10895 if (pSession->QosMapSet.dscp_exceptions[i][0] != 255)
10896 dscpmapping[pSession->QosMapSet.dscp_exceptions[i][0]] =
10897 pSession->QosMapSet.dscp_exceptions[i][1];
10898
10899 sme_release_global_lock(&pMac->sme);
10900 return status;
10901}
10902
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010903/*
10904 * sme_abort_roam_scan() -
10905 * API to abort current roam scan cycle by roam scan offload module.
10906 *
10907 * hHal - The handle returned by mac_open.
10908 * sessionId - Session Identifier
10909 * Return QDF_STATUS
10910 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010911
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010912QDF_STATUS sme_abort_roam_scan(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010913{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010914 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010915 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10916
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010917 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
10918 /* acquire the lock for the sme object */
10919 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010920 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010921 csr_roam_offload_scan(pMac, sessionId,
10922 ROAM_SCAN_OFFLOAD_ABORT_SCAN,
10923 REASON_ROAM_ABORT_ROAM_SCAN);
10924 /* release the lock for the sme object */
10925 sme_release_global_lock(&pMac->sme);
10926 }
10927 }
10928
10929 return status;
10930}
10931
10932#ifdef FEATURE_WLAN_EXTSCAN
10933/**
10934 * sme_get_valid_channels_by_band() - to fetch valid channels filtered by band
10935 * @hHal: HAL context
10936 * @wifiBand: RF band information
10937 * @aValidChannels: output array to store channel info
10938 * @pNumChannels: output number of channels
10939 *
10940 * SME API to fetch all valid channels filtered by band
10941 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010942 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010943 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010944QDF_STATUS sme_get_valid_channels_by_band(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010945 uint8_t wifiBand,
10946 uint32_t *aValidChannels,
10947 uint8_t *pNumChannels)
10948{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010949 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010950 uint8_t chanList[WNI_CFG_VALID_CHANNEL_LIST_LEN] = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010951 uint8_t numChannels = 0;
10952 uint8_t i = 0;
10953 uint32_t totValidChannels = WNI_CFG_VALID_CHANNEL_LIST_LEN;
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070010954 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hHal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010955
10956 if (!aValidChannels || !pNumChannels) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010957 sme_err("Output channel list/NumChannels is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010958 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010959 }
10960
Sreelakshmi Konamki0d17c6a2017-06-08 12:58:54 +053010961 if (wifiBand >= WIFI_BAND_MAX) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010962 sme_err("Invalid wifiBand: %d", wifiBand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010963 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010964 }
10965
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080010966 status = sme_get_cfg_valid_channels(&chanList[0],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010967 &totValidChannels);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010968 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010969 sme_err("Fail to get valid channel list (err=%d)", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010970 return status;
10971 }
10972
10973 switch (wifiBand) {
10974 case WIFI_BAND_UNSPECIFIED:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010975 sme_debug("Unspec Band, return all %d valid channels",
10976 totValidChannels);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010977 numChannels = totValidChannels;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010978 for (i = 0; i < totValidChannels; i++)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010979 aValidChannels[i] = cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010980 break;
10981
10982 case WIFI_BAND_BG:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010983 sme_debug("WIFI_BAND_BG (2.4 GHz)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010984 for (i = 0; i < totValidChannels; i++) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010985 if (WLAN_REG_IS_24GHZ_CH(chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010986 aValidChannels[numChannels++] =
10987 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010988 }
10989 break;
10990
10991 case WIFI_BAND_A:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010992 sme_debug("WIFI_BAND_A (5 GHz without DFS)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010993 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070010994 if (WLAN_REG_IS_5GHZ_CH(chanList[i]) &&
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010995 !wlan_reg_is_dfs_ch(mac_ctx->pdev, chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010996 aValidChannels[numChannels++] =
10997 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010998 }
10999 break;
11000
11001 case WIFI_BAND_ABG:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011002 sme_debug("WIFI_BAND_ABG (2.4 GHz + 5 GHz; no DFS)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011003 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070011004 if ((WLAN_REG_IS_24GHZ_CH(chanList[i]) ||
11005 WLAN_REG_IS_5GHZ_CH(chanList[i])) &&
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011006 !wlan_reg_is_dfs_ch(mac_ctx->pdev, chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011007 aValidChannels[numChannels++] =
11008 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011009 }
11010 break;
11011
11012 case WIFI_BAND_A_DFS_ONLY:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011013 sme_debug("WIFI_BAND_A_DFS (5 GHz DFS only)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011014 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070011015 if (WLAN_REG_IS_5GHZ_CH(chanList[i]) &&
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011016 wlan_reg_is_dfs_ch(mac_ctx->pdev, chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011017 aValidChannels[numChannels++] =
11018 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011019 }
11020 break;
11021
11022 case WIFI_BAND_A_WITH_DFS:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011023 sme_debug("WIFI_BAND_A_WITH_DFS (5 GHz with DFS)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011024 for (i = 0; i < totValidChannels; i++) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011025 if (WLAN_REG_IS_5GHZ_CH(chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011026 aValidChannels[numChannels++] =
11027 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011028 }
11029 break;
11030
11031 case WIFI_BAND_ABG_WITH_DFS:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011032 sme_debug("WIFI_BAND_ABG_WITH_DFS (2.4 GHz+5 GHz with DFS)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011033 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070011034 if (WLAN_REG_IS_24GHZ_CH(chanList[i]) ||
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011035 WLAN_REG_IS_5GHZ_CH(chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011036 aValidChannels[numChannels++] =
11037 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011038 }
11039 break;
11040
11041 default:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011042 sme_err("Unknown wifiBand: %d", wifiBand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011043 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011044 }
11045 *pNumChannels = numChannels;
11046
11047 return status;
11048}
11049
Jeff Johnsonfed9a732018-07-18 12:18:03 -070011050QDF_STATUS
11051sme_ext_scan_get_capabilities(mac_handle_t mac_handle,
11052 struct extscan_capabilities_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011053{
Jeff Johnsonfed9a732018-07-18 12:18:03 -070011054 QDF_STATUS status;
11055 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011056 struct scheduler_msg message = {0};
Jeff Johnsonfed9a732018-07-18 12:18:03 -070011057 struct extscan_capabilities_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011058
Jeff Johnsonfed9a732018-07-18 12:18:03 -070011059 /* per contract must make a copy of the params when messaging */
11060 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
11061 if (!bodyptr)
11062 return QDF_STATUS_E_NOMEM;
11063 *bodyptr = *params;
11064
11065 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011066 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011067 /* Serialize the req through MC thread */
Jeff Johnsonfed9a732018-07-18 12:18:03 -070011068 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011069 message.type = WMA_EXTSCAN_GET_CAPABILITIES_REQ;
Jeff Johnsonfed9a732018-07-18 12:18:03 -070011070 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
11071 NO_SESSION, message.type);
11072 status = scheduler_post_message(QDF_MODULE_ID_SME,
11073 QDF_MODULE_ID_WMA,
11074 QDF_MODULE_ID_WMA,
11075 &message);
11076 sme_release_global_lock(&mac->sme);
11077 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011078
Jeff Johnsonfed9a732018-07-18 12:18:03 -070011079 if (QDF_IS_STATUS_ERROR(status)) {
11080 sme_err("failure: %d", status);
11081 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011082 }
11083 return status;
11084}
11085
Jeff Johnsondab58602018-07-14 15:30:24 -070011086QDF_STATUS
11087sme_ext_scan_start(mac_handle_t mac_handle,
11088 struct wifi_scan_cmd_req_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011089{
Jeff Johnsondab58602018-07-14 15:30:24 -070011090 QDF_STATUS status;
11091 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011092 struct scheduler_msg message = {0};
Jeff Johnsondab58602018-07-14 15:30:24 -070011093 struct wifi_scan_cmd_req_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011094
Jeff Johnsondab58602018-07-14 15:30:24 -070011095 /* per contract must make a copy of the params when messaging */
11096 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
11097 if (!bodyptr)
11098 return QDF_STATUS_E_NOMEM;
11099 *bodyptr = *params;
11100
11101 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011102 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011103 /* Serialize the req through MC thread */
Jeff Johnsondab58602018-07-14 15:30:24 -070011104 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011105 message.type = WMA_EXTSCAN_START_REQ;
Jeff Johnsondab58602018-07-14 15:30:24 -070011106 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
11107 NO_SESSION, message.type);
11108 status = scheduler_post_message(QDF_MODULE_ID_SME,
11109 QDF_MODULE_ID_WMA,
11110 QDF_MODULE_ID_WMA,
11111 &message);
11112 sme_release_global_lock(&mac->sme);
11113 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011114
Jeff Johnsondab58602018-07-14 15:30:24 -070011115 if (QDF_IS_STATUS_ERROR(status)) {
11116 sme_err("failure: %d", status);
11117 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011118 }
11119 return status;
11120}
11121
Jeff Johnson7272ea72018-07-15 17:22:27 -070011122QDF_STATUS sme_ext_scan_stop(mac_handle_t mac_handle,
11123 struct extscan_stop_req_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011124{
Jeff Johnson7272ea72018-07-15 17:22:27 -070011125 QDF_STATUS status;
11126 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011127 struct scheduler_msg message = {0};
Jeff Johnson7272ea72018-07-15 17:22:27 -070011128 struct extscan_stop_req_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011129
Jeff Johnson7272ea72018-07-15 17:22:27 -070011130 /* per contract must make a copy of the params when messaging */
11131 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
11132 if (!bodyptr)
11133 return QDF_STATUS_E_NOMEM;
11134 *bodyptr = *params;
11135
11136 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011137 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011138 /* Serialize the req through MC thread */
Jeff Johnson7272ea72018-07-15 17:22:27 -070011139 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011140 message.type = WMA_EXTSCAN_STOP_REQ;
Jeff Johnson7272ea72018-07-15 17:22:27 -070011141 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
11142 NO_SESSION, message.type);
11143 status = scheduler_post_message(QDF_MODULE_ID_SME,
11144 QDF_MODULE_ID_WMA,
11145 QDF_MODULE_ID_WMA,
11146 &message);
11147 sme_release_global_lock(&mac->sme);
11148 }
11149
11150 if (QDF_IS_STATUS_ERROR(status)) {
11151 sme_err("failure: %d", status);
11152 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011153 }
11154 return status;
11155}
11156
Jeff Johnson1148cb02018-07-13 23:14:32 -070011157QDF_STATUS
11158sme_set_bss_hotlist(mac_handle_t mac_handle,
11159 struct extscan_bssid_hotlist_set_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011160{
Jeff Johnson1148cb02018-07-13 23:14:32 -070011161 QDF_STATUS status;
11162 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011163 struct scheduler_msg message = {0};
Jeff Johnson1148cb02018-07-13 23:14:32 -070011164 struct extscan_bssid_hotlist_set_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011165
Jeff Johnson1148cb02018-07-13 23:14:32 -070011166 /* per contract must make a copy of the params when messaging */
11167 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
Arif Hussain0ef77082018-10-10 16:42:53 -070011168 if (!bodyptr)
Jeff Johnson1148cb02018-07-13 23:14:32 -070011169 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070011170
Jeff Johnson1148cb02018-07-13 23:14:32 -070011171 *bodyptr = *params;
11172
11173 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011174 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011175 /* Serialize the req through MC thread */
Jeff Johnson1148cb02018-07-13 23:14:32 -070011176 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011177 message.type = WMA_EXTSCAN_SET_BSSID_HOTLIST_REQ;
Jeff Johnson1148cb02018-07-13 23:14:32 -070011178 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
11179 NO_SESSION, message.type);
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011180 status = scheduler_post_message(QDF_MODULE_ID_SME,
11181 QDF_MODULE_ID_WMA,
11182 QDF_MODULE_ID_WMA, &message);
Jeff Johnson1148cb02018-07-13 23:14:32 -070011183 sme_release_global_lock(&mac->sme);
11184 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011185
Jeff Johnson1148cb02018-07-13 23:14:32 -070011186 if (QDF_IS_STATUS_ERROR(status)) {
11187 sme_err("failure: %d", status);
11188 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011189 }
11190 return status;
11191}
11192
Jeff Johnson9743eb72018-07-14 10:30:04 -070011193QDF_STATUS
11194sme_reset_bss_hotlist(mac_handle_t mac_handle,
11195 struct extscan_bssid_hotlist_reset_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011196{
Jeff Johnson9743eb72018-07-14 10:30:04 -070011197 QDF_STATUS status;
11198 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011199 struct scheduler_msg message = {0};
Jeff Johnson9743eb72018-07-14 10:30:04 -070011200 struct extscan_bssid_hotlist_reset_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011201
Jeff Johnson9743eb72018-07-14 10:30:04 -070011202 /* per contract must make a copy of the params when messaging */
11203 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
Arif Hussain0ef77082018-10-10 16:42:53 -070011204 if (!bodyptr)
Jeff Johnson9743eb72018-07-14 10:30:04 -070011205 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070011206
Jeff Johnson9743eb72018-07-14 10:30:04 -070011207 *bodyptr = *params;
11208
11209 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011210 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011211 /* Serialize the req through MC thread */
Jeff Johnson9743eb72018-07-14 10:30:04 -070011212 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011213 message.type = WMA_EXTSCAN_RESET_BSSID_HOTLIST_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053011214 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011215 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011216 status = scheduler_post_message(QDF_MODULE_ID_SME,
11217 QDF_MODULE_ID_WMA,
11218 QDF_MODULE_ID_WMA, &message);
Jeff Johnson9743eb72018-07-14 10:30:04 -070011219 sme_release_global_lock(&mac->sme);
11220 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011221
Jeff Johnson9743eb72018-07-14 10:30:04 -070011222 if (QDF_IS_STATUS_ERROR(status)) {
11223 sme_err("failure: %d", status);
11224 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011225 }
11226 return status;
11227}
11228
Jeff Johnsonb43ed032018-07-16 06:59:21 -070011229QDF_STATUS
11230sme_set_significant_change(mac_handle_t mac_handle,
11231 struct extscan_set_sig_changereq_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011232{
Jeff Johnsonb43ed032018-07-16 06:59:21 -070011233 QDF_STATUS status;
11234 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011235 struct scheduler_msg message = {0};
Jeff Johnsonb43ed032018-07-16 06:59:21 -070011236 struct extscan_set_sig_changereq_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011237
Jeff Johnsonb43ed032018-07-16 06:59:21 -070011238 /* per contract must make a copy of the params when messaging */
11239 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
Arif Hussain0ef77082018-10-10 16:42:53 -070011240 if (!bodyptr)
Jeff Johnsonb43ed032018-07-16 06:59:21 -070011241 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070011242
Jeff Johnsonb43ed032018-07-16 06:59:21 -070011243 *bodyptr = *params;
11244
11245 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011246 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011247 /* Serialize the req through MC thread */
Jeff Johnsonb43ed032018-07-16 06:59:21 -070011248 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011249 message.type = WMA_EXTSCAN_SET_SIGNF_CHANGE_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011250 status = scheduler_post_message(QDF_MODULE_ID_SME,
11251 QDF_MODULE_ID_WMA,
11252 QDF_MODULE_ID_WMA,
11253 &message);
Jeff Johnsonb43ed032018-07-16 06:59:21 -070011254 sme_release_global_lock(&mac->sme);
11255 }
Jeff Johnsonb43ed032018-07-16 06:59:21 -070011256 if (QDF_IS_STATUS_ERROR(status)) {
11257 sme_err("failure: %d", status);
11258 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011259 }
11260 return status;
11261}
11262
Jeff Johnson0c8dbc32018-07-16 22:10:48 -070011263QDF_STATUS
11264sme_reset_significant_change(mac_handle_t mac_handle,
11265 struct extscan_capabilities_reset_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011266{
Jeff Johnson0c8dbc32018-07-16 22:10:48 -070011267 QDF_STATUS status;
11268 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011269 struct scheduler_msg message = {0};
Jeff Johnson0c8dbc32018-07-16 22:10:48 -070011270 struct extscan_capabilities_reset_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011271
Jeff Johnson0c8dbc32018-07-16 22:10:48 -070011272 /* per contract must make a copy of the params when messaging */
11273 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
Arif Hussain0ef77082018-10-10 16:42:53 -070011274 if (!bodyptr)
Jeff Johnson0c8dbc32018-07-16 22:10:48 -070011275 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070011276
Jeff Johnson0c8dbc32018-07-16 22:10:48 -070011277 *bodyptr = *params;
11278
11279 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011280 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011281 /* Serialize the req through MC thread */
Jeff Johnson0c8dbc32018-07-16 22:10:48 -070011282 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011283 message.type = WMA_EXTSCAN_RESET_SIGNF_CHANGE_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053011284 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011285 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011286 status = scheduler_post_message(QDF_MODULE_ID_SME,
11287 QDF_MODULE_ID_WMA,
11288 QDF_MODULE_ID_WMA,
11289 &message);
Jeff Johnson0c8dbc32018-07-16 22:10:48 -070011290 sme_release_global_lock(&mac->sme);
11291 }
Jeff Johnson0c8dbc32018-07-16 22:10:48 -070011292 if (QDF_IS_STATUS_ERROR(status)) {
11293 sme_err("failure: %d", status);
11294 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011295 }
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011296
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011297 return status;
11298}
11299
Jeff Johnson2ba60092018-07-17 08:19:37 -070011300QDF_STATUS
11301sme_get_cached_results(mac_handle_t mac_handle,
11302 struct extscan_cached_result_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011303{
Jeff Johnson2ba60092018-07-17 08:19:37 -070011304 QDF_STATUS status;
11305 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011306 struct scheduler_msg message = {0};
Jeff Johnson2ba60092018-07-17 08:19:37 -070011307 struct extscan_cached_result_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011308
Jeff Johnson2ba60092018-07-17 08:19:37 -070011309 /* per contract must make a copy of the params when messaging */
11310 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
11311 if (!bodyptr)
11312 return QDF_STATUS_E_NOMEM;
11313 *bodyptr = *params;
11314
11315 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011316 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011317 /* Serialize the req through MC thread */
Jeff Johnson2ba60092018-07-17 08:19:37 -070011318 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011319 message.type = WMA_EXTSCAN_GET_CACHED_RESULTS_REQ;
Jeff Johnson2ba60092018-07-17 08:19:37 -070011320 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
11321 NO_SESSION, message.type);
11322 status = scheduler_post_message(QDF_MODULE_ID_SME,
11323 QDF_MODULE_ID_WMA,
11324 QDF_MODULE_ID_WMA,
11325 &message);
11326 sme_release_global_lock(&mac->sme);
11327 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011328
Jeff Johnson2ba60092018-07-17 08:19:37 -070011329 if (QDF_IS_STATUS_ERROR(status)) {
11330 sme_err("failure: %d", status);
11331 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011332 }
11333 return status;
11334}
11335
Jeff Johnson360135b2018-07-18 20:51:47 -070011336QDF_STATUS sme_set_epno_list(mac_handle_t mac_handle,
11337 struct wifi_enhanced_pno_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011338{
Jeff Johnson360135b2018-07-18 20:51:47 -070011339 QDF_STATUS status;
11340 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011341 struct scheduler_msg message = {0};
Jeff Johnson360135b2018-07-18 20:51:47 -070011342 struct wifi_enhanced_pno_params *req_msg;
11343 int len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011344
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011345 SME_ENTER();
Jeff Johnson360135b2018-07-18 20:51:47 -070011346
11347 /* per contract must make a copy of the params when messaging */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011348 len = sizeof(*req_msg) +
Jeff Johnson360135b2018-07-18 20:51:47 -070011349 (params->num_networks * sizeof(req_msg->networks[0]));
Mukul Sharmae8c919f2016-10-02 20:35:15 +053011350
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011351 req_msg = qdf_mem_malloc(len);
Arif Hussain0ef77082018-10-10 16:42:53 -070011352 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011353 return QDF_STATUS_E_NOMEM;
Jeff Johnson360135b2018-07-18 20:51:47 -070011354 qdf_mem_copy(req_msg, params, len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011355
11356 status = sme_acquire_global_lock(&mac->sme);
Vignesh Viswanathancbb5b952017-08-02 14:32:49 +053011357 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011358 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011359 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011360 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011361 return status;
11362 }
11363
11364 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011365 message.bodyptr = req_msg;
11366 message.type = WMA_SET_EPNO_LIST_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011367 status = scheduler_post_message(QDF_MODULE_ID_SME,
11368 QDF_MODULE_ID_WMA,
11369 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011370 if (!QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson360135b2018-07-18 20:51:47 -070011371 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011372 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011373 }
11374 sme_release_global_lock(&mac->sme);
Jeff Johnson360135b2018-07-18 20:51:47 -070011375
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011376 return status;
11377}
11378
Jeff Johnson2a7f1012018-07-19 07:21:06 -070011379QDF_STATUS sme_set_passpoint_list(mac_handle_t mac_handle,
11380 struct wifi_passpoint_req_param *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011381{
Jeff Johnson2a7f1012018-07-19 07:21:06 -070011382 QDF_STATUS status;
11383 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011384 struct scheduler_msg message = {0};
Jeff Johnson2a7f1012018-07-19 07:21:06 -070011385 struct wifi_passpoint_req_param *req_msg;
11386 int len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011387
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011388 SME_ENTER();
Jeff Johnson2a7f1012018-07-19 07:21:06 -070011389
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011390 len = sizeof(*req_msg) +
Jeff Johnson2a7f1012018-07-19 07:21:06 -070011391 (params->num_networks * sizeof(params->networks[0]));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011392 req_msg = qdf_mem_malloc(len);
Arif Hussain0ef77082018-10-10 16:42:53 -070011393 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011394 return QDF_STATUS_E_NOMEM;
Jeff Johnson2a7f1012018-07-19 07:21:06 -070011395 qdf_mem_copy(req_msg, params, len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011396
11397 status = sme_acquire_global_lock(&mac->sme);
Vignesh Viswanathancbb5b952017-08-02 14:32:49 +053011398 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011399 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011400 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011401 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011402 return status;
11403 }
11404
11405 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011406 message.bodyptr = req_msg;
11407 message.type = WMA_SET_PASSPOINT_LIST_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011408 status = scheduler_post_message(QDF_MODULE_ID_SME,
11409 QDF_MODULE_ID_WMA,
11410 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011411 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011412 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011413 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011414 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011415 }
11416 sme_release_global_lock(&mac->sme);
11417 return status;
11418}
11419
Jeff Johnson2a7f1012018-07-19 07:21:06 -070011420QDF_STATUS sme_reset_passpoint_list(mac_handle_t mac_handle,
11421 struct wifi_passpoint_req_param *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011422{
Jeff Johnson2a7f1012018-07-19 07:21:06 -070011423 QDF_STATUS status;
11424 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011425 struct scheduler_msg message = {0};
Jeff Johnson2a7f1012018-07-19 07:21:06 -070011426 struct wifi_passpoint_req_param *req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011427
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011428 SME_ENTER();
Jeff Johnson2a7f1012018-07-19 07:21:06 -070011429
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011430 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070011431 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011432 return QDF_STATUS_E_NOMEM;
Jeff Johnson2a7f1012018-07-19 07:21:06 -070011433 *req_msg = *params;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011434
11435 status = sme_acquire_global_lock(&mac->sme);
Vignesh Viswanathancbb5b952017-08-02 14:32:49 +053011436 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011437 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011438 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011439 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011440 return status;
11441 }
11442
11443 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011444 message.bodyptr = req_msg;
11445 message.type = WMA_RESET_PASSPOINT_LIST_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011446 status = scheduler_post_message(QDF_MODULE_ID_SME,
11447 QDF_MODULE_ID_WMA,
11448 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011449 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011450 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011451 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011452 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011453 }
11454 sme_release_global_lock(&mac->sme);
11455 return status;
11456}
11457
Jeff Johnson17b12392018-07-03 22:21:15 -070011458QDF_STATUS sme_ext_scan_register_callback(mac_handle_t mac_handle,
11459 ext_scan_ind_cb ext_scan_ind_cb)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011460{
Jeff Johnson17b12392018-07-03 22:21:15 -070011461 QDF_STATUS status;
11462 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011463
Jeff Johnson17b12392018-07-03 22:21:15 -070011464 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011465 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson17b12392018-07-03 22:21:15 -070011466 mac->sme.ext_scan_ind_cb = ext_scan_ind_cb;
11467 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011468 }
11469 return status;
11470}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011471#endif /* FEATURE_WLAN_EXTSCAN */
11472
Wen Gong7952fbd2018-04-18 11:27:23 +080011473/**
11474 * sme_send_wisa_params(): Pass WISA mode to WMA
11475 * @hal: HAL context
11476 * @wisa_params: pointer to WISA params struct
11477 * @sessionId: SME session id
11478 *
11479 * Pass WISA params to WMA
11480 *
11481 * Return: QDF_STATUS
11482 */
11483QDF_STATUS sme_set_wisa_params(tHalHandle hal,
11484 struct sir_wisa_params *wisa_params)
11485{
11486 QDF_STATUS status = QDF_STATUS_SUCCESS;
11487 tpAniSirGlobal mac = PMAC_STRUCT(hal);
11488 struct scheduler_msg message = {0};
11489 struct sir_wisa_params *cds_msg_wisa_params;
11490
11491 cds_msg_wisa_params = qdf_mem_malloc(sizeof(struct sir_wisa_params));
11492 if (!cds_msg_wisa_params)
11493 return QDF_STATUS_E_NOMEM;
11494
11495 *cds_msg_wisa_params = *wisa_params;
11496 status = sme_acquire_global_lock(&mac->sme);
11497 if (QDF_IS_STATUS_SUCCESS(status)) {
11498 message.bodyptr = cds_msg_wisa_params;
11499 message.type = WMA_SET_WISA_PARAMS;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011500 status = scheduler_post_message(QDF_MODULE_ID_SME,
11501 QDF_MODULE_ID_WMA,
11502 QDF_MODULE_ID_WMA, &message);
Wen Gong7952fbd2018-04-18 11:27:23 +080011503 sme_release_global_lock(&mac->sme);
11504 }
11505 return status;
11506}
11507
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011508#ifdef WLAN_FEATURE_LINK_LAYER_STATS
11509
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011510/*
11511 * sme_ll_stats_clear_req() -
11512 * SME API to clear Link Layer Statistics
11513 *
11514 * hHal
11515 * pclearStatsReq: Link Layer clear stats request params structure
11516 * Return QDF_STATUS
11517 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011518QDF_STATUS sme_ll_stats_clear_req(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011519 tSirLLStatsClearReq *pclearStatsReq)
11520{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011521 QDF_STATUS status = QDF_STATUS_SUCCESS;
11522 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011523 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011524 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011525 tSirLLStatsClearReq *clear_stats_req;
11526
Abhishek Singhe4a1f882017-08-10 17:59:44 +053011527 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011528 "staId = %u", pclearStatsReq->staId);
Abhishek Singhe4a1f882017-08-10 17:59:44 +053011529 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011530 "statsClearReqMask = 0x%X",
11531 pclearStatsReq->statsClearReqMask);
Abhishek Singhe4a1f882017-08-10 17:59:44 +053011532 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011533 "stopReq = %u", pclearStatsReq->stopReq);
Deepak Dhamdhere6adc08e2017-07-27 09:33:22 -070011534 if (!sme_is_session_id_valid(hHal, pclearStatsReq->staId)) {
11535 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11536 "%s: invalid staId %d",
11537 __func__, pclearStatsReq->staId);
11538 return QDF_STATUS_E_INVAL;
11539 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011540
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011541 clear_stats_req = qdf_mem_malloc(sizeof(*clear_stats_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070011542 if (!clear_stats_req)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011543 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011544
11545 *clear_stats_req = *pclearStatsReq;
11546
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011547 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011548 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011549 message.bodyptr = clear_stats_req;
11550 message.type = WMA_LINK_LAYER_STATS_CLEAR_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053011551 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011552 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011553 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
11554 QDF_MODULE_ID_WMA,
11555 QDF_MODULE_ID_WMA,
11556 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011557 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011558 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011559 "%s: not able to post WMA_LL_STATS_CLEAR_REQ",
11560 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011561 qdf_mem_free(clear_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011562 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011563 }
11564 sme_release_global_lock(&pMac->sme);
11565 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011566 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11567 "%s: sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011568 qdf_mem_free(clear_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011569 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011570 }
11571
11572 return status;
11573}
11574
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011575/*
11576 * sme_ll_stats_set_req() -
11577 * SME API to set the Link Layer Statistics
11578 *
11579 * hHal
11580 * psetStatsReq: Link Layer set stats request params structure
11581 * Return QDF_STATUS
11582 */
11583QDF_STATUS sme_ll_stats_set_req(tHalHandle hHal, tSirLLStatsSetReq
11584 *psetStatsReq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011585{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011586 QDF_STATUS status = QDF_STATUS_SUCCESS;
11587 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011588 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011589 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011590 tSirLLStatsSetReq *set_stats_req;
11591
Abhishek Singhe4a1f882017-08-10 17:59:44 +053011592 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011593 "%s: MPDU Size = %u", __func__,
11594 psetStatsReq->mpduSizeThreshold);
Abhishek Singhe4a1f882017-08-10 17:59:44 +053011595 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011596 " Aggressive Stats Collections = %u",
11597 psetStatsReq->aggressiveStatisticsGathering);
11598
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011599 set_stats_req = qdf_mem_malloc(sizeof(*set_stats_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070011600 if (!set_stats_req)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011601 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011602
11603 *set_stats_req = *psetStatsReq;
11604
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011605 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011606 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011607 message.bodyptr = set_stats_req;
11608 message.type = WMA_LINK_LAYER_STATS_SET_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053011609 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011610 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011611 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
11612 QDF_MODULE_ID_WMA,
11613 QDF_MODULE_ID_WMA,
11614 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011615 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011616 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011617 "%s: not able to post WMA_LL_STATS_SET_REQ",
11618 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011619 qdf_mem_free(set_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011620 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011621 }
11622 sme_release_global_lock(&pMac->sme);
11623 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011624 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11625 "%s: sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011626 qdf_mem_free(set_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011627 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011628 }
11629
11630 return status;
11631}
11632
Dundi Ravitejae232cf12018-05-16 18:34:34 +053011633QDF_STATUS sme_ll_stats_get_req(mac_handle_t mac_handle,
11634 tSirLLStatsGetReq *get_stats_req,
11635 void *context)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011636{
Dundi Ravitejae232cf12018-05-16 18:34:34 +053011637 QDF_STATUS status = QDF_STATUS_E_FAILURE;
11638 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011639 struct scheduler_msg message = {0};
Dundi Ravitejae232cf12018-05-16 18:34:34 +053011640 tSirLLStatsGetReq *ll_stats_get_req;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011641
Dundi Ravitejae232cf12018-05-16 18:34:34 +053011642 ll_stats_get_req = qdf_mem_malloc(sizeof(*ll_stats_get_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070011643 if (!ll_stats_get_req)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011644 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011645
Dundi Ravitejae232cf12018-05-16 18:34:34 +053011646 *ll_stats_get_req = *get_stats_req;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011647
Dundi Ravitejae232cf12018-05-16 18:34:34 +053011648 mac->sme.ll_stats_context = context;
11649 if (sme_acquire_global_lock(&mac->sme) == QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011650 /* Serialize the req through MC thread */
Dundi Ravitejae232cf12018-05-16 18:34:34 +053011651 message.bodyptr = ll_stats_get_req;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011652 message.type = WMA_LINK_LAYER_STATS_GET_REQ;
Dundi Ravitejae232cf12018-05-16 18:34:34 +053011653 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
11654 NO_SESSION, message.type);
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011655 status = scheduler_post_message(QDF_MODULE_ID_SME,
11656 QDF_MODULE_ID_WMA,
11657 QDF_MODULE_ID_WMA, &message);
Dundi Ravitejae232cf12018-05-16 18:34:34 +053011658 if (!QDF_IS_STATUS_SUCCESS(status)) {
11659 sme_err("Not able to post WMA_LL_STATS_GET_REQ");
11660 qdf_mem_free(ll_stats_get_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011661 }
Dundi Ravitejae232cf12018-05-16 18:34:34 +053011662 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011663 } else {
Dundi Ravitejae232cf12018-05-16 18:34:34 +053011664 sme_err("sme_acquire_global_lock error");
11665 qdf_mem_free(ll_stats_get_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011666 }
11667
11668 return status;
11669}
11670
Jeff Johnson959f3692018-07-03 17:30:40 -070011671QDF_STATUS sme_set_link_layer_stats_ind_cb(mac_handle_t mac_handle,
11672 link_layer_stats_cb callback)
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011673{
Jeff Johnson959f3692018-07-03 17:30:40 -070011674 QDF_STATUS status;
11675 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011676
Jeff Johnson959f3692018-07-03 17:30:40 -070011677 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011678 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson959f3692018-07-03 17:30:40 -070011679 mac->sme.link_layer_stats_cb = callback;
11680 sme_release_global_lock(&mac->sme);
11681 } else {
11682 sme_err("sme_acquire_global_lock error");
11683 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011684
11685 return status;
11686}
11687
Arun Khandavalli4b55da72016-07-19 19:55:01 +053011688/**
Zhang Qiana6e9c102016-12-22 16:47:24 +080011689 * sme_set_link_layer_ext_cb() - Register callback for link layer statistics
11690 * @hal: Mac global handle
11691 * @ll_stats_ext_cb: HDD callback which needs to be invoked after getting
11692 * status notification from FW
11693 *
11694 * Return: eHalStatus
11695 */
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011696QDF_STATUS sme_set_link_layer_ext_cb(tHalHandle hal, void (*ll_stats_ext_cb)
Jeff Johnson2d292122018-06-02 21:02:02 -070011697 (hdd_handle_t callback_ctx, tSirLLStatsResults
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011698 *rsp))
Zhang Qiana6e9c102016-12-22 16:47:24 +080011699{
11700 QDF_STATUS status;
11701 tpAniSirGlobal mac = PMAC_STRUCT(hal);
11702
11703 status = sme_acquire_global_lock(&mac->sme);
11704 if (status == QDF_STATUS_SUCCESS) {
11705 mac->sme.link_layer_stats_ext_cb = ll_stats_ext_cb;
11706 sme_release_global_lock(&mac->sme);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011707 } else
Zhang Qiana6e9c102016-12-22 16:47:24 +080011708 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11709 "%s: sme_qcquire_global_lock error", __func__);
Zhang Qiana6e9c102016-12-22 16:47:24 +080011710 return status;
11711}
11712
11713/**
Arun Khandavalli4b55da72016-07-19 19:55:01 +053011714 * sme_reset_link_layer_stats_ind_cb() - SME API to reset link layer stats
11715 * indication
11716 * @h_hal: Hal Handle
11717 *
11718 * This function reset's the link layer stats indication
11719 *
11720 * Return: QDF_STATUS Enumeration
11721 */
11722
11723QDF_STATUS sme_reset_link_layer_stats_ind_cb(tHalHandle h_hal)
11724{
11725 QDF_STATUS status;
11726 tpAniSirGlobal pmac;
11727
11728 if (!h_hal) {
11729 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11730 FL("hHal is not valid"));
11731 return QDF_STATUS_E_INVAL;
11732 }
11733 pmac = PMAC_STRUCT(h_hal);
11734
11735 status = sme_acquire_global_lock(&pmac->sme);
11736 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson959f3692018-07-03 17:30:40 -070011737 pmac->sme.link_layer_stats_cb = NULL;
Arun Khandavalli4b55da72016-07-19 19:55:01 +053011738 sme_release_global_lock(&pmac->sme);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011739 } else
11740 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11741 "%s: sme_acquire_global_lock error", __func__);
Arun Khandavalli4b55da72016-07-19 19:55:01 +053011742
11743 return status;
11744}
11745
Zhang Qian73c348a2017-03-13 16:15:55 +080011746/**
11747 * sme_ll_stats_set_thresh - set threshold for mac counters
11748 * @hal, hal layer handle
11749 * @threshold, threshold for mac counters
11750 *
11751 * Return: QDF_STATUS Enumeration
11752 */
11753QDF_STATUS sme_ll_stats_set_thresh(tHalHandle hal,
11754 struct sir_ll_ext_stats_threshold *threshold)
11755{
11756 QDF_STATUS status;
11757 tpAniSirGlobal mac;
Rajeev Kumar658e8492017-12-13 11:35:41 -080011758 struct scheduler_msg message = {0};
Zhang Qian73c348a2017-03-13 16:15:55 +080011759 struct sir_ll_ext_stats_threshold *thresh;
11760
11761 if (!threshold) {
11762 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11763 FL("threshold is not valid"));
11764 return QDF_STATUS_E_INVAL;
11765 }
11766
11767 if (!hal) {
11768 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11769 FL("hal is not valid"));
11770 return QDF_STATUS_E_INVAL;
11771 }
11772 mac = PMAC_STRUCT(hal);
11773
11774 thresh = qdf_mem_malloc(sizeof(*thresh));
Arif Hussain0ef77082018-10-10 16:42:53 -070011775 if (!thresh)
Zhang Qian73c348a2017-03-13 16:15:55 +080011776 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070011777
Zhang Qian73c348a2017-03-13 16:15:55 +080011778 *thresh = *threshold;
11779
11780 status = sme_acquire_global_lock(&mac->sme);
11781 if (QDF_IS_STATUS_SUCCESS(status)) {
11782 /* Serialize the req through MC thread */
11783 message.bodyptr = thresh;
11784 message.type = WDA_LINK_LAYER_STATS_SET_THRESHOLD;
11785 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
11786 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011787 status = scheduler_post_message(QDF_MODULE_ID_SME,
11788 QDF_MODULE_ID_WMA,
11789 QDF_MODULE_ID_WMA, &message);
Zhang Qian73c348a2017-03-13 16:15:55 +080011790 if (!QDF_IS_STATUS_SUCCESS(status)) {
11791 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11792 "%s: not able to post WDA_LL_STATS_GET_REQ",
11793 __func__);
11794 qdf_mem_free(thresh);
11795 }
11796 sme_release_global_lock(&mac->sme);
11797 } else {
11798 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11799 FL("sme_acquire_global_lock error"));
11800 qdf_mem_free(thresh);
11801 }
11802 return status;
11803}
Arun Khandavalli4b55da72016-07-19 19:55:01 +053011804
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011805#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
11806
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053011807#ifdef WLAN_POWER_DEBUGFS
11808/**
11809 * sme_power_debug_stats_req() - SME API to collect Power debug stats
11810 * @callback_fn: Pointer to the callback function for Power stats event
11811 * @power_stats_context: Pointer to context
11812 *
11813 * Return: QDF_STATUS
11814 */
11815QDF_STATUS sme_power_debug_stats_req(tHalHandle hal, void (*callback_fn)
11816 (struct power_stats_response *response,
11817 void *context), void *power_stats_context)
11818{
11819 QDF_STATUS status = QDF_STATUS_SUCCESS;
11820 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011821 struct scheduler_msg msg = {0};
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053011822
11823 status = sme_acquire_global_lock(&mac_ctx->sme);
11824 if (QDF_IS_STATUS_SUCCESS(status)) {
11825 if (!callback_fn) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011826 sme_err("Indication callback did not registered");
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053011827 sme_release_global_lock(&mac_ctx->sme);
11828 return QDF_STATUS_E_FAILURE;
11829 }
11830
11831 mac_ctx->sme.power_debug_stats_context = power_stats_context;
11832 mac_ctx->sme.power_stats_resp_callback = callback_fn;
11833 msg.bodyptr = NULL;
11834 msg.type = WMA_POWER_DEBUG_STATS_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011835 status = scheduler_post_message(QDF_MODULE_ID_SME,
11836 QDF_MODULE_ID_WMA,
11837 QDF_MODULE_ID_WMA, &msg);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011838 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011839 sme_err("not able to post WDA_POWER_DEBUG_STATS_REQ");
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053011840 sme_release_global_lock(&mac_ctx->sme);
11841 }
11842 return status;
11843}
11844#endif
11845
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011846#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070011847/**
11848 * sme_update_roam_key_mgmt_offload_enabled() - enable/disable key mgmt offload
11849 * This is a synchronous call
11850 * @hal_ctx: The handle returned by mac_open.
11851 * @session_id: Session Identifier
11852 * @key_mgmt_offload_enabled: key mgmt enable/disable flag
Deepak Dhamdhere828f1892017-02-09 11:51:19 -080011853 * @pmkid_modes: PMKID modes of PMKSA caching and OKC
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070011854 * Return: QDF_STATUS_SUCCESS - SME updated config successfully.
11855 * Other status means SME is failed to update.
11856 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011857
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070011858QDF_STATUS sme_update_roam_key_mgmt_offload_enabled(tHalHandle hal_ctx,
Deepak Dhamdhere828f1892017-02-09 11:51:19 -080011859 uint8_t session_id,
11860 bool key_mgmt_offload_enabled,
11861 struct pmkid_mode_bits *pmkid_modes)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011862{
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070011863 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_ctx);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011864 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011865
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070011866 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011867 if (QDF_IS_STATUS_SUCCESS(status)) {
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070011868 if (CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +053011869 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070011870 "%s: LFR3: key_mgmt_offload_enabled changed to %d",
11871 __func__, key_mgmt_offload_enabled);
11872 status = csr_roam_set_key_mgmt_offload(mac_ctx,
11873 session_id,
11874 key_mgmt_offload_enabled,
Deepak Dhamdhere828f1892017-02-09 11:51:19 -080011875 pmkid_modes);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011876 } else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011877 status = QDF_STATUS_E_INVAL;
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070011878 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011879 }
11880
11881 return status;
11882}
Prashanth Bhattabfc25292015-11-05 11:16:21 -080011883#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011884
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011885/*
11886 * sme_get_temperature() -
11887 * SME API to get the pdev temperature
11888 *
11889 * hHal
11890 * temperature context
11891 * pCallbackfn: callback fn with response (temperature)
11892 * Return QDF_STATUS
11893 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011894QDF_STATUS sme_get_temperature(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011895 void *tempContext,
11896 void (*pCallbackfn)(int temperature,
11897 void *pContext))
11898{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011899 QDF_STATUS status = QDF_STATUS_SUCCESS;
11900 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011901 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011902 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011903
11904 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011905 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011906 if ((NULL == pCallbackfn) &&
11907 (NULL == pMac->sme.pGetTemperatureCb)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011908 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011909 "Indication Call back did not registered");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011910 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011911 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011912 } else if (NULL != pCallbackfn) {
11913 pMac->sme.pTemperatureCbContext = tempContext;
11914 pMac->sme.pGetTemperatureCb = pCallbackfn;
11915 }
11916 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011917 message.bodyptr = NULL;
11918 message.type = WMA_GET_TEMPERATURE_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011919 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
11920 QDF_MODULE_ID_WMA,
11921 QDF_MODULE_ID_WMA,
11922 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011923 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011924 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011925 FL("Post Get Temperature msg fail"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011926 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011927 }
11928 sme_release_global_lock(&pMac->sme);
11929 }
11930 return status;
11931}
11932
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011933/*
11934 * sme_set_scanning_mac_oui() -
11935 * SME API to set scanning mac oui
11936 *
11937 * hHal
11938 * pScanMacOui: Scanning Mac Oui (input 3 bytes)
11939 * Return QDF_STATUS
11940 */
11941QDF_STATUS sme_set_scanning_mac_oui(tHalHandle hHal, tSirScanMacOui
11942 *pScanMacOui)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011943{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011944 QDF_STATUS status = QDF_STATUS_SUCCESS;
11945 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011946 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011947 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011948
11949 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011950 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011951 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011952 message.bodyptr = pScanMacOui;
11953 message.type = WMA_SET_SCAN_MAC_OUI_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011954 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
11955 QDF_MODULE_ID_WMA,
11956 QDF_MODULE_ID_WMA,
11957 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011958 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011959 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011960 FL("Msg post Set Scan Mac OUI failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011961 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011962 }
11963 sme_release_global_lock(&pMac->sme);
11964 }
11965 return status;
11966}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011967
11968#ifdef DHCP_SERVER_OFFLOAD
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053011969/*
11970 * sme_set_dhcp_srv_offload() -
11971 * SME API to set DHCP server offload info
11972 *
11973 * hHal
11974 * pDhcpSrvInfo : DHCP server offload info struct
11975 * Return QDF_STATUS
11976 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011977QDF_STATUS sme_set_dhcp_srv_offload(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011978 tSirDhcpSrvOffloadInfo *pDhcpSrvInfo)
11979{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011980 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011981 tSirDhcpSrvOffloadInfo *pSmeDhcpSrvInfo;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011982 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011983 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11984
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011985 pSmeDhcpSrvInfo = qdf_mem_malloc(sizeof(*pSmeDhcpSrvInfo));
Arif Hussain0ef77082018-10-10 16:42:53 -070011986 if (!pSmeDhcpSrvInfo)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011987 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011988
11989 *pSmeDhcpSrvInfo = *pDhcpSrvInfo;
11990
11991 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011992 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011993 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011994 message.type = WMA_SET_DHCP_SERVER_OFFLOAD_CMD;
11995 message.bodyptr = pSmeDhcpSrvInfo;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011996
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011997 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011998 (scheduler_post_message(QDF_MODULE_ID_SME,
11999 QDF_MODULE_ID_WMA,
12000 QDF_MODULE_ID_WMA,
12001 &message))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012002 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Varun Reddy Yeturu7b2a6572017-06-15 11:07:28 -070012003 "%s:WMA_SET_DHCP_SERVER_OFFLOAD_CMD failed",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012004 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012005 qdf_mem_free(pSmeDhcpSrvInfo);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012006 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012007 }
12008 sme_release_global_lock(&pMac->sme);
12009 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012010 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012011 "%s: sme_acquire_global_lock error!", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012012 qdf_mem_free(pSmeDhcpSrvInfo);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012013 }
12014
12015 return status;
12016}
12017#endif /* DHCP_SERVER_OFFLOAD */
12018
Krunal Soniaadaa272017-10-04 16:42:55 -070012019QDF_STATUS sme_send_unit_test_cmd(uint32_t vdev_id, uint32_t module_id,
12020 uint32_t arg_count, uint32_t *arg)
12021{
12022 return wma_form_unit_test_cmd_and_send(vdev_id, module_id,
12023 arg_count, arg);
12024}
12025
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012026#ifdef WLAN_FEATURE_GPIO_LED_FLASHING
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012027/*
12028 * sme_set_led_flashing() -
12029 * API to set the Led flashing parameters.
12030 *
12031 * hHal - The handle returned by mac_open.
12032 * x0, x1 - led flashing parameters
12033 * Return QDF_STATUS
12034 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012035QDF_STATUS sme_set_led_flashing(tHalHandle hHal, uint8_t type,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012036 uint32_t x0, uint32_t x1)
12037{
Jeff Johnson5a6b6602017-10-04 14:44:30 -070012038 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012039 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012040 struct scheduler_msg message = {0};
Jeff Johnson5a6b6602017-10-04 14:44:30 -070012041 struct flashing_req_params *ledflashing;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012042
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012043 ledflashing = qdf_mem_malloc(sizeof(*ledflashing));
Arif Hussain0ef77082018-10-10 16:42:53 -070012044 if (!ledflashing)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012045 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012046
Jeff Johnson5a6b6602017-10-04 14:44:30 -070012047 ledflashing->req_id = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012048 ledflashing->pattern_id = type;
12049 ledflashing->led_x0 = x0;
12050 ledflashing->led_x1 = x1;
12051
12052 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012053 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012054 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012055 message.bodyptr = ledflashing;
12056 message.type = WMA_LED_FLASHING_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012057 status = scheduler_post_message(QDF_MODULE_ID_SME,
12058 QDF_MODULE_ID_WMA,
12059 QDF_MODULE_ID_WMA, &message);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012060 sme_release_global_lock(&pMac->sme);
12061 }
Jeff Johnson5a6b6602017-10-04 14:44:30 -070012062 if (!QDF_IS_STATUS_SUCCESS(status))
12063 qdf_mem_free(ledflashing);
12064
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012065 return status;
12066}
12067#endif
12068
12069/**
12070 * sme_handle_dfS_chan_scan() - handle DFS channel configuration
12071 * @h_hal: corestack handler
12072 * @dfs_flag: flag indicating dfs channel enable/disable
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012073 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012074 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012075QDF_STATUS sme_handle_dfs_chan_scan(tHalHandle h_hal, uint8_t dfs_flag)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012076{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012077 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012078 tpAniSirGlobal mac = PMAC_STRUCT(h_hal);
12079
12080 status = sme_acquire_global_lock(&mac->sme);
12081
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012082 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012083
12084 mac->scan.fEnableDFSChnlScan = dfs_flag;
12085
12086 /* update the channel list to the firmware */
12087 status = csr_update_channel_list(mac);
12088
12089 sme_release_global_lock(&mac->sme);
12090 }
12091
12092 return status;
12093}
12094
Min Liu5eaf7242018-03-13 17:32:15 +080012095/**
12096 * sme_enable_dfS_chan_scan() - set DFS channel scan enable/disable
12097 * @h_hal: corestack handler
12098 * @dfs_flag: flag indicating dfs channel enable/disable
12099 * Return: QDF_STATUS
12100 */
12101QDF_STATUS sme_enable_dfs_chan_scan(tHalHandle h_hal, uint8_t dfs_flag)
12102{
12103 QDF_STATUS status = QDF_STATUS_SUCCESS;
12104 tpAniSirGlobal mac;
12105
12106 if (!h_hal) {
12107 sme_err("hal is NULL");
12108 return QDF_STATUS_E_INVAL;
12109 }
12110
12111 mac = PMAC_STRUCT(h_hal);
Min Liu5eaf7242018-03-13 17:32:15 +080012112
12113 mac->scan.fEnableDFSChnlScan = dfs_flag;
12114
12115 return status;
12116}
12117
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053012118#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
12119/**
12120 * sme_validate_sap_channel_switch() - validate target channel switch w.r.t
12121 * concurreny rules set to avoid channel interference.
12122 * @hal - Hal context
12123 * @sap_ch - channel to switch
12124 * @sap_phy_mode - phy mode of SAP
12125 * @cc_switch_mode - concurreny switch mode
12126 * @session_id - sme session id.
12127 *
12128 * Return: true if there is no channel interference else return false
12129 */
12130bool sme_validate_sap_channel_switch(tHalHandle hal,
12131 uint16_t sap_ch, eCsrPhyMode sap_phy_mode, uint8_t cc_switch_mode,
12132 uint8_t session_id)
12133{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012134 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053012135 tpAniSirGlobal mac = PMAC_STRUCT(hal);
gaurank kathpalia14e2f912017-08-31 14:51:45 +053012136 struct csr_roam_session *session = CSR_GET_SESSION(mac, session_id);
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053012137 uint16_t intf_channel = 0;
12138
12139 if (!session)
12140 return false;
12141
12142 session->ch_switch_in_progress = true;
12143 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012144 if (QDF_IS_STATUS_SUCCESS(status)) {
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053012145 intf_channel = csr_check_concurrent_channel_overlap(mac, sap_ch,
12146 sap_phy_mode,
12147 cc_switch_mode);
12148 sme_release_global_lock(&mac->sme);
12149 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012150 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053012151 FL("sme_acquire_global_lock error!"));
12152 session->ch_switch_in_progress = false;
12153 return false;
12154 }
12155
12156 session->ch_switch_in_progress = false;
12157 return (intf_channel == 0) ? true : false;
12158}
12159#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012160
12161/**
12162 * sme_configure_stats_avg_factor() - function to config avg. stats factor
12163 * @hal: hal
12164 * @session_id: session ID
12165 * @stats_avg_factor: average stats factor
12166 *
12167 * This function configures the stats avg factor in firmware
12168 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012169 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012170 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012171QDF_STATUS sme_configure_stats_avg_factor(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012172 uint16_t stats_avg_factor)
12173{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012174 struct scheduler_msg msg = {0};
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012175 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012176 tpAniSirGlobal mac = PMAC_STRUCT(hal);
12177 struct sir_stats_avg_factor *stats_factor;
12178
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012179 stats_factor = qdf_mem_malloc(sizeof(*stats_factor));
Arif Hussain0ef77082018-10-10 16:42:53 -070012180 if (!stats_factor)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012181 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012182
12183 status = sme_acquire_global_lock(&mac->sme);
12184
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012185 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012186
12187 stats_factor->vdev_id = session_id;
12188 stats_factor->stats_avg_factor = stats_avg_factor;
12189
12190 /* serialize the req through MC thread */
12191 msg.type = SIR_HAL_CONFIG_STATS_FACTOR;
12192 msg.bodyptr = stats_factor;
12193
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012194 if (!QDF_IS_STATUS_SUCCESS(
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012195 scheduler_post_message(QDF_MODULE_ID_SME,
12196 QDF_MODULE_ID_WMA,
12197 QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012198 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012199 "%s: Not able to post SIR_HAL_CONFIG_STATS_FACTOR to WMA!",
12200 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012201 qdf_mem_free(stats_factor);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012202 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012203 }
12204 sme_release_global_lock(&mac->sme);
12205 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012206 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012207 "%s: sme_acquire_global_lock error!",
12208 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012209 qdf_mem_free(stats_factor);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012210 }
12211
12212 return status;
12213}
12214
12215/**
12216 * sme_configure_guard_time() - function to configure guard time
12217 * @hal: hal
12218 * @session_id: session id
12219 * @guard_time: guard time
12220 *
12221 * This function configures the guard time in firmware
12222 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012223 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012224 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012225QDF_STATUS sme_configure_guard_time(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012226 uint32_t guard_time)
12227{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012228 struct scheduler_msg msg = {0};
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012229 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012230 tpAniSirGlobal mac = PMAC_STRUCT(hal);
12231 struct sir_guard_time_request *g_time;
12232
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012233 g_time = qdf_mem_malloc(sizeof(*g_time));
Arif Hussain0ef77082018-10-10 16:42:53 -070012234 if (!g_time)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012235 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012236
12237 status = sme_acquire_global_lock(&mac->sme);
12238
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012239 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012240
12241 g_time->vdev_id = session_id;
12242 g_time->guard_time = guard_time;
12243
12244 /* serialize the req through MC thread */
12245 msg.type = SIR_HAL_CONFIG_GUARD_TIME;
12246 msg.bodyptr = g_time;
12247
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012248 if (!QDF_IS_STATUS_SUCCESS(
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012249 scheduler_post_message(QDF_MODULE_ID_SME,
12250 QDF_MODULE_ID_WMA,
12251 QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012252 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012253 "%s: Not able to post SIR_HAL_CONFIG_GUARD_TIME to WMA!",
12254 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012255 qdf_mem_free(g_time);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012256 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012257 }
12258 sme_release_global_lock(&mac->sme);
12259 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012260 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012261 "%s: sme_acquire_global_lock error!",
12262 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012263 qdf_mem_free(g_time);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012264 }
12265
12266 return status;
12267}
12268
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012269/*
12270 * sme_wifi_start_logger() - Send the start/stop logging command to WMA
12271 * to either start/stop logging
12272 * @hal: HAL context
12273 * @start_log: Structure containing the wifi start logger params
12274 *
12275 * This function sends the start/stop logging command to WMA
12276 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012277 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012278 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012279QDF_STATUS sme_wifi_start_logger(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012280 struct sir_wifi_start_log start_log)
12281{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012282 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012283 tpAniSirGlobal mac = PMAC_STRUCT(hal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012284 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012285 struct sir_wifi_start_log *req_msg;
12286 uint32_t len;
12287
12288 len = sizeof(*req_msg);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012289 req_msg = qdf_mem_malloc(len);
Arif Hussain0ef77082018-10-10 16:42:53 -070012290 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012291 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012292
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012293 req_msg->verbose_level = start_log.verbose_level;
Poddar, Siddartheefe3482016-09-21 18:12:59 +053012294 req_msg->is_iwpriv_command = start_log.is_iwpriv_command;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012295 req_msg->ring_id = start_log.ring_id;
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -080012296 req_msg->ini_triggered = start_log.ini_triggered;
12297 req_msg->user_triggered = start_log.user_triggered;
Poddar, Siddarth176c4362016-10-03 12:25:00 +053012298 req_msg->size = start_log.size;
Poddar, Siddarthab99a272017-04-10 12:53:26 +053012299 req_msg->is_pktlog_buff_clear = start_log.is_pktlog_buff_clear;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012300
12301 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012302 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012303 sme_err("sme_acquire_global_lock failed(status=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012304 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012305 return status;
12306 }
12307
12308 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012309 message.bodyptr = req_msg;
12310 message.type = SIR_HAL_START_STOP_LOGGING;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012311 status = scheduler_post_message(QDF_MODULE_ID_SME,
12312 QDF_MODULE_ID_WMA,
12313 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012314 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012315 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012316 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012317 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012318 }
12319 sme_release_global_lock(&mac->sme);
12320
12321 return status;
12322}
12323
12324/**
12325 * sme_neighbor_middle_of_roaming() - Function to know if
12326 * STA is in the middle of roaming states
12327 * @hal: Handle returned by macOpen
12328 * @sessionId: sessionId of the STA session
12329 *
12330 * This function is a wrapper to call
12331 * csr_neighbor_middle_of_roaming to know STA is in the
12332 * middle of roaming states
12333 *
12334 * Return: True or False
12335 *
12336 */
12337bool sme_neighbor_middle_of_roaming(tHalHandle hHal, uint8_t sessionId)
12338{
Sandeep Puligillaca631612016-11-08 11:53:52 -080012339 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hHal);
12340 bool val = false;
12341
12342 if (CSR_IS_SESSION_VALID(mac_ctx, sessionId))
12343 val = csr_neighbor_middle_of_roaming(mac_ctx, sessionId);
12344 else
Rajeev Kumar9176ca42018-05-03 09:20:40 -070012345 sme_debug("Invalid Session: %d", sessionId);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012346
Sandeep Puligillaca631612016-11-08 11:53:52 -080012347 return val;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012348}
12349
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +053012350bool sme_is_any_session_in_middle_of_roaming(mac_handle_t hal)
12351{
12352 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
12353 uint8_t session_id;
12354
12355 for (session_id = 0; session_id < CSR_ROAM_SESSION_MAX; session_id++) {
12356 if (CSR_IS_SESSION_VALID(mac_ctx, session_id) &&
12357 csr_neighbor_middle_of_roaming(mac_ctx, session_id))
12358 return true;
12359 }
12360
12361 return false;
12362}
12363
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012364/*
12365 * sme_send_flush_logs_cmd_to_fw() - Flush FW logs
12366 * @mac: MAC handle
12367 *
12368 * This function is used to send the command that will
12369 * be used to flush the logs in the firmware
12370 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070012371 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012372 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012373QDF_STATUS sme_send_flush_logs_cmd_to_fw(tpAniSirGlobal mac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012374{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012375 QDF_STATUS status;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012376 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012377
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012378 /* Serialize the req through MC thread */
12379 message.bodyptr = NULL;
12380 message.type = SIR_HAL_FLUSH_LOG_TO_FW;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012381 status = scheduler_post_message(QDF_MODULE_ID_SME,
12382 QDF_MODULE_ID_WMA,
12383 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012384 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012385 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012386 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012387 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012388 return status;
12389}
12390
Jeff Johnsona1e92612017-09-24 15:33:44 -070012391QDF_STATUS sme_enable_uapsd_for_ac(uint8_t sta_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012392 sme_ac_enum_type ac, uint8_t tid,
12393 uint8_t pri, uint32_t srvc_int,
12394 uint32_t sus_int,
Abhishek Singh12be60f2017-08-11 13:52:42 +053012395 enum sme_qos_wmm_dir_type dir,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012396 uint8_t psb, uint32_t sessionId,
12397 uint32_t delay_interval)
12398{
12399 void *wma_handle;
12400 t_wma_trigger_uapsd_params uapsd_params;
12401 enum uapsd_ac access_category;
12402
12403 if (!psb) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012404 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012405 "No need to configure auto trigger:psb is 0");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012406 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012407 }
12408
Anurag Chouhan6d760662016-02-20 16:05:43 +053012409 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012410 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012411 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012412 "wma_handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012413 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012414 }
12415
12416 switch (ac) {
12417 case SME_AC_BK:
12418 access_category = UAPSD_BK;
12419 break;
12420 case SME_AC_BE:
12421 access_category = UAPSD_BE;
12422 break;
12423 case SME_AC_VI:
12424 access_category = UAPSD_VI;
12425 break;
12426 case SME_AC_VO:
12427 access_category = UAPSD_VO;
12428 break;
12429 default:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012430 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012431 }
12432
12433 uapsd_params.wmm_ac = access_category;
12434 uapsd_params.user_priority = pri;
12435 uapsd_params.service_interval = srvc_int;
12436 uapsd_params.delay_interval = delay_interval;
12437 uapsd_params.suspend_interval = sus_int;
12438
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012439 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012440 wma_trigger_uapsd_params(wma_handle, sessionId, &uapsd_params)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012441 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012442 "Failed to Trigger Uapsd params for sessionId %d",
12443 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012444 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012445 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012446 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012447}
12448
Jeff Johnsona1e92612017-09-24 15:33:44 -070012449QDF_STATUS sme_disable_uapsd_for_ac(uint8_t sta_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012450 sme_ac_enum_type ac,
12451 uint32_t sessionId)
12452{
12453 void *wma_handle;
12454 enum uapsd_ac access_category;
12455
12456 switch (ac) {
12457 case SME_AC_BK:
12458 access_category = UAPSD_BK;
12459 break;
12460 case SME_AC_BE:
12461 access_category = UAPSD_BE;
12462 break;
12463 case SME_AC_VI:
12464 access_category = UAPSD_VI;
12465 break;
12466 case SME_AC_VO:
12467 access_category = UAPSD_VO;
12468 break;
12469 default:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012470 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012471 }
12472
Anurag Chouhan6d760662016-02-20 16:05:43 +053012473 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012474 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012475 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012476 "wma handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012477 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012478 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012479 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012480 wma_disable_uapsd_per_ac(wma_handle, sessionId, access_category)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012481 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012482 "Failed to disable uapsd for ac %d for sessionId %d",
12483 ac, sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012484 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012485 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012486 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012487}
12488
12489/**
12490 * sme_update_nss() - SME API to change the number for spatial streams
12491 * (1 or 2)
12492 * @hal: Handle returned by mac open
12493 * @nss: Number of spatial streams
12494 *
12495 * This function is used to update the number of spatial streams supported.
12496 *
12497 * Return: Success upon successfully changing nss else failure
12498 *
12499 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012500QDF_STATUS sme_update_nss(tHalHandle h_hal, uint8_t nss)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012501{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012502 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012503 tpAniSirGlobal mac_ctx = PMAC_STRUCT(h_hal);
Vignesh Viswanathan21c58cb2018-05-24 15:53:58 +053012504 uint32_t i;
12505 struct mlme_ht_capabilities_info *ht_cap_info;
gaurank kathpalia14e2f912017-08-31 14:51:45 +053012506 struct csr_roam_session *csr_session;
Abhinav Kumarb074f2f2018-09-15 15:32:11 +053012507 struct mlme_vht_capabilities_info vht_cap_info;
12508
12509 vht_cap_info = mac_ctx->mlme_cfg->vht_caps.vht_cap_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012510
12511 status = sme_acquire_global_lock(&mac_ctx->sme);
12512
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012513 if (QDF_STATUS_SUCCESS == status) {
Abhinav Kumarb074f2f2018-09-15 15:32:11 +053012514 vht_cap_info.enable2x2 = (nss == 1) ? 0 : 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012515
12516 /* get the HT capability info*/
Vignesh Viswanathan21c58cb2018-05-24 15:53:58 +053012517 ht_cap_info = &mac_ctx->mlme_cfg->ht_caps.ht_cap_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012518
12519 for (i = 0; i < CSR_ROAM_SESSION_MAX; i++) {
12520 if (CSR_IS_SESSION_VALID(mac_ctx, i)) {
12521 csr_session = &mac_ctx->roam.roamSession[i];
12522 csr_session->htConfig.ht_tx_stbc =
Vignesh Viswanathan78182502018-08-06 15:13:30 +053012523 ht_cap_info->tx_stbc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012524 }
12525 }
12526
12527 sme_release_global_lock(&mac_ctx->sme);
12528 }
12529 return status;
12530}
12531
12532/**
Archana Ramachandran5041b252016-04-25 14:29:25 -070012533 * sme_update_user_configured_nss() - sets the nss based on user request
12534 * @hal: Pointer to HAL
12535 * @nss: number of streams
12536 *
12537 * Return: None
12538 */
12539void sme_update_user_configured_nss(tHalHandle hal, uint8_t nss)
12540{
12541 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
12542
12543 mac_ctx->user_configured_nss = nss;
12544}
12545
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070012546int sme_update_tx_bfee_supp(tHalHandle hal, uint8_t session_id,
12547 uint8_t cfg_val)
12548{
Abhinav Kumarb074f2f2018-09-15 15:32:11 +053012549 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Jeff Johnsonc18469b2018-06-11 06:48:59 -070012550
Abhinav Kumarb074f2f2018-09-15 15:32:11 +053012551 mac_ctx->mlme_cfg->vht_caps.vht_cap_info.su_bformee = cfg_val;
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070012552
12553 return sme_update_he_tx_bfee_supp(hal, session_id, cfg_val);
12554}
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070012555
12556int sme_update_tx_bfee_nsts(mac_handle_t hal, uint8_t session_id,
12557 uint8_t usr_cfg_val, uint8_t nsts_val)
12558{
12559 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070012560 uint8_t nsts_set_val;
12561
12562 mac_ctx->usr_cfg_tx_bfee_nsts = usr_cfg_val;
12563 if (usr_cfg_val)
12564 nsts_set_val = usr_cfg_val;
12565 else
12566 nsts_set_val = nsts_val;
Dustin Brown48f27fe2018-10-09 12:47:57 -070012567
12568 mac_ctx->mlme_cfg->vht_caps.vht_cap_info.tx_bfee_ant_supp =
12569 nsts_set_val;
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070012570
Kiran Kumar Lokere86e85592018-07-18 15:34:24 -070012571 if (usr_cfg_val)
12572 sme_set_he_tx_bf_cbf_rates(session_id);
12573
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070012574 return sme_update_he_tx_bfee_nsts(hal, session_id, nsts_set_val);
12575}
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080012576#ifdef WLAN_FEATURE_11AX
Jinwei Chenffaa4672018-08-30 16:55:09 +080012577void sme_update_tgt_he_cap(mac_handle_t mac_handle,
12578 struct wma_tgt_cfg *cfg,
12579 tDot11fIEhe_cap *he_cap_ini)
Jinwei Chen998a1a02018-06-20 17:20:34 +080012580{
Jinwei Chenef742dc2018-06-27 12:57:50 +080012581 tpAniSirGlobal mac_ctx = PMAC_STRUCT(mac_handle);
Jinwei Chen998a1a02018-06-20 17:20:34 +080012582
12583 qdf_mem_copy(&mac_ctx->he_cap_2g,
Jinwei Chenef742dc2018-06-27 12:57:50 +080012584 &cfg->he_cap_2g,
12585 sizeof(tDot11fIEhe_cap));
Jinwei Chen998a1a02018-06-20 17:20:34 +080012586
12587 qdf_mem_copy(&mac_ctx->he_cap_5g,
Jinwei Chenef742dc2018-06-27 12:57:50 +080012588 &cfg->he_cap_5g,
12589 sizeof(tDot11fIEhe_cap));
Jinwei Chenffaa4672018-08-30 16:55:09 +080012590
12591 /* modify HE Caps field according to INI setting */
12592 mac_ctx->he_cap_2g.bfee_sts_lt_80 =
12593 QDF_MIN(cfg->he_cap_2g.bfee_sts_lt_80,
12594 he_cap_ini->bfee_sts_lt_80);
12595
12596 mac_ctx->he_cap_5g.bfee_sts_lt_80 =
12597 QDF_MIN(cfg->he_cap_5g.bfee_sts_lt_80,
12598 he_cap_ini->bfee_sts_lt_80);
Jinwei Chen998a1a02018-06-20 17:20:34 +080012599}
12600
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080012601void sme_update_he_cap_nss(tHalHandle hal, uint8_t session_id,
12602 uint8_t nss)
12603{
12604 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
12605 struct csr_roam_session *csr_session;
12606 uint32_t tx_mcs_map = 0;
12607 uint32_t rx_mcs_map = 0;
Kiran Kumar Lokere8dba1892018-07-24 17:09:52 -070012608 uint32_t mcs_map = 0;
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080012609
12610 if (!nss || (nss > 2)) {
12611 sme_err("invalid Nss value %d", nss);
12612 }
12613 csr_session = CSR_GET_SESSION(mac_ctx, session_id);
Jeff Johnsonc18469b2018-06-11 06:48:59 -070012614 sme_cfg_get_int(hal, WNI_CFG_HE_RX_MCS_MAP_LT_80, &rx_mcs_map);
12615 sme_cfg_get_int(hal, WNI_CFG_HE_TX_MCS_MAP_LT_80, &tx_mcs_map);
Kiran Kumar Lokere8dba1892018-07-24 17:09:52 -070012616 mcs_map = rx_mcs_map & 0x3;
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080012617 if (nss == 1) {
12618 tx_mcs_map = HE_SET_MCS_4_NSS(tx_mcs_map, HE_MCS_DISABLE, 2);
12619 rx_mcs_map = HE_SET_MCS_4_NSS(rx_mcs_map, HE_MCS_DISABLE, 2);
12620 } else {
Kiran Kumar Lokere8dba1892018-07-24 17:09:52 -070012621 tx_mcs_map = HE_SET_MCS_4_NSS(tx_mcs_map, mcs_map, 2);
12622 rx_mcs_map = HE_SET_MCS_4_NSS(rx_mcs_map, mcs_map, 2);
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080012623 }
12624 sme_info("new HE Nss MCS MAP: Rx 0x%0X, Tx: 0x%0X",
12625 rx_mcs_map, tx_mcs_map);
Jeff Johnsonc18469b2018-06-11 06:48:59 -070012626 sme_cfg_set_int(hal, WNI_CFG_HE_RX_MCS_MAP_LT_80, rx_mcs_map);
12627 sme_cfg_set_int(hal, WNI_CFG_HE_TX_MCS_MAP_LT_80, tx_mcs_map);
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080012628 csr_update_session_he_cap(mac_ctx, csr_session);
12629
12630}
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080012631
12632int sme_update_he_mcs(tHalHandle hal, uint8_t session_id, uint16_t he_mcs)
12633{
12634 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
12635 struct csr_roam_session *csr_session;
12636 uint16_t mcs_val = 0;
12637 uint16_t mcs_map = HE_MCS_ALL_DISABLED;
12638 uint32_t wni_cfg_tx_param = 0;
12639 uint32_t wni_cfg_rx_param = 0;
12640
12641 csr_session = CSR_GET_SESSION(mac_ctx, session_id);
12642 if (!csr_session) {
12643 sme_err("No session for id %d", session_id);
12644 return -EINVAL;
12645 }
12646 if ((he_mcs & 0x3) == HE_MCS_DISABLE) {
12647 sme_err("Invalid HE MCS 0x%0x, can't disable 0-7 for 1ss",
12648 he_mcs);
12649 return -EINVAL;
12650 }
12651 mcs_val = he_mcs & 0x3;
12652 switch (he_mcs) {
12653 case HE_80_MCS0_7:
12654 case HE_80_MCS0_9:
12655 case HE_80_MCS0_11:
Abhinav Kumarb074f2f2018-09-15 15:32:11 +053012656 if (mac_ctx->mlme_cfg->vht_caps.vht_cap_info.enable2x2) {
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080012657 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1);
12658 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 2);
12659 } else {
12660 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1);
12661 }
12662 wni_cfg_tx_param = WNI_CFG_HE_TX_MCS_MAP_LT_80;
12663 wni_cfg_rx_param = WNI_CFG_HE_RX_MCS_MAP_LT_80;
12664 break;
12665
12666 case HE_160_MCS0_7:
12667 case HE_160_MCS0_9:
12668 case HE_160_MCS0_11:
12669 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1);
12670 wni_cfg_tx_param = WNI_CFG_HE_TX_MCS_MAP_160;
12671 wni_cfg_rx_param = WNI_CFG_HE_RX_MCS_MAP_160;
12672 break;
12673
12674 case HE_80p80_MCS0_7:
12675 case HE_80p80_MCS0_9:
12676 case HE_80p80_MCS0_11:
12677 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1);
12678 wni_cfg_tx_param = WNI_CFG_HE_TX_MCS_MAP_80_80;
12679 wni_cfg_rx_param = WNI_CFG_HE_RX_MCS_MAP_80_80;
12680 break;
12681
12682 default:
12683 sme_err("Invalid HE MCS 0x%0x", he_mcs);
12684 return -EINVAL;
12685 }
12686 sme_info("new HE MCS 0x%0x", mcs_map);
Jeff Johnsonc18469b2018-06-11 06:48:59 -070012687 sme_cfg_set_int(hal, wni_cfg_tx_param, mcs_map);
12688 sme_cfg_set_int(hal, wni_cfg_rx_param, mcs_map);
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080012689 csr_update_session_he_cap(mac_ctx, csr_session);
12690
12691 return 0;
12692}
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080012693
12694static int sme_update_he_cap(tHalHandle hal, uint8_t session_id,
12695 uint16_t he_cap, int value)
12696{
12697 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
12698 struct csr_roam_session *session;
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080012699
12700 session = CSR_GET_SESSION(mac_ctx, session_id);
12701 if (!session) {
12702 sme_err("No session for id %d", session_id);
12703 return -EINVAL;
12704 }
Jeff Johnsonc18469b2018-06-11 06:48:59 -070012705 sme_cfg_set_int(hal, he_cap, value);
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080012706 csr_update_session_he_cap(mac_ctx, session);
12707
12708 return 0;
12709}
12710
Kiran Kumar Lokeref54b8552018-07-10 00:53:38 -070012711void sme_set_usr_cfg_mu_edca(mac_handle_t hal, bool val)
12712{
12713 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
12714
12715 mac_ctx->usr_cfg_mu_edca_params = val;
12716}
12717
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070012718int sme_update_mu_edca_params(mac_handle_t hal, uint8_t session_id)
12719{
12720 struct scheduler_msg msg = {0};
12721 QDF_STATUS status;
12722
12723 qdf_mem_zero(&msg, sizeof(msg));
12724 msg.type = WNI_SME_UPDATE_MU_EDCA_PARAMS;
12725 msg.reserved = 0;
12726 msg.bodyval = session_id;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012727 status = scheduler_post_message(QDF_MODULE_ID_SME,
12728 QDF_MODULE_ID_PE,
12729 QDF_MODULE_ID_PE, &msg);
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070012730 if (status != QDF_STATUS_SUCCESS) {
12731 sme_err("Not able to post update edca profile");
12732 return -EIO;
12733 }
12734
12735 return 0;
12736}
12737void sme_set_he_mu_edca_def_cfg(mac_handle_t hal)
12738{
12739 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
12740 uint8_t i;
12741
Kiran Kumar Lokere8dba1892018-07-24 17:09:52 -070012742 sme_debug("Set MU EDCA params to default");
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070012743 for (i = 0; i < MAX_NUM_AC; i++) {
12744 mac_ctx->usr_mu_edca_params[i].aci.aifsn = MU_EDCA_DEF_AIFSN;
12745 mac_ctx->usr_mu_edca_params[i].aci.aci = i;
12746 mac_ctx->usr_mu_edca_params[i].cw.max = MU_EDCA_DEF_CW_MAX;
12747 mac_ctx->usr_mu_edca_params[i].cw.min = MU_EDCA_DEF_CW_MIN;
12748 mac_ctx->usr_mu_edca_params[i].mu_edca_timer =
12749 MU_EDCA_DEF_TIMER;
12750 }
12751}
12752
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070012753int sme_update_he_tx_bfee_supp(tHalHandle hal, uint8_t session_id,
12754 uint8_t cfg_val)
12755{
12756 return sme_update_he_cap(hal, session_id, WNI_CFG_HE_SU_BEAMFORMEE,
12757 cfg_val);
12758}
12759
Kiran Kumar Lokeref54b8552018-07-10 00:53:38 -070012760int sme_update_he_trigger_frm_mac_pad(mac_handle_t hal, uint8_t session_id,
12761 uint8_t cfg_val)
12762{
12763 return sme_update_he_cap(hal, session_id, WNI_CFG_HE_TRIG_PAD,
12764 cfg_val);
12765}
12766
Kiran Kumar Lokeref1a96f42018-08-29 18:53:47 -070012767int sme_update_he_om_ctrl_supp(mac_handle_t hal, uint8_t session_id,
12768 uint8_t cfg_val)
12769{
12770 return sme_update_he_cap(hal, session_id, WNI_CFG_HE_OMI,
12771 cfg_val);
12772}
12773
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070012774int sme_send_he_om_ctrl_bw_update(mac_handle_t hal, uint8_t session_id,
12775 uint8_t cfg_val)
12776{
12777 uint32_t om_ctrl_cmd[NUM_OM_CTRL_UPDATE_CFG_PARAMS] = {0};
12778 QDF_STATUS status;
12779 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
12780 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
12781
12782 if (!session) {
12783 sme_err("Session does not exist, Session_id: %d", session_id);
12784 return -EINVAL;
12785 }
12786 if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) {
12787 sme_info("STA is not connected, Session_id: %d", session_id);
12788 return -EINVAL;
12789 }
12790 if (cfg_val > session->connectedProfile.vht_channel_width) {
12791 sme_info("OM ctrl BW %d is greater than connected BW %d",
12792 cfg_val, session->connectedProfile.vht_channel_width);
12793 return -EINVAL;
12794 }
12795 mac_ctx->he_om_ctrl_cfg_bw_set = true;
12796 mac_ctx->he_om_ctrl_cfg_bw = cfg_val;
12797 om_ctrl_cmd[0] = 1;
12798 qdf_mem_copy((void *)&om_ctrl_cmd[OM_CTRL_CMD_MAC_BITS31],
12799 (void *)session->connectedProfile.bssid.bytes,
12800 sizeof(uint32_t));
12801 qdf_mem_copy((void *)&om_ctrl_cmd[OM_CTRL_CMD_MAC_BITS47],
12802 (void *)&session->connectedProfile.bssid.bytes[4],
12803 sizeof(uint16_t));
12804 if (mac_ctx->he_om_ctrl_cfg_nss_set) {
12805 om_ctrl_cmd[OM_CTRL_CMD_RX_NSS] =
12806 mac_ctx->he_om_ctrl_cfg_nss - 1;
12807 om_ctrl_cmd[OM_CTRL_CMD_TX_NSS] =
12808 mac_ctx->he_om_ctrl_cfg_nss - 1;
12809 } else {
12810 om_ctrl_cmd[OM_CTRL_CMD_RX_NSS] = session->nss - 1;
12811 om_ctrl_cmd[OM_CTRL_CMD_TX_NSS] = session->nss - 1;
12812 }
12813 om_ctrl_cmd[OM_CTRL_CMD_BW] = cfg_val;
12814 om_ctrl_cmd[OM_CTRL_CMD_ULMU] = 1;
12815 status = wma_form_unit_test_cmd_and_send(session_id, 13, 7,
12816 om_ctrl_cmd);
12817 if (QDF_STATUS_SUCCESS != status) {
12818 sme_err("send_unit_test_cmd returned %d", status);
12819 return -EIO;
12820 }
12821
12822 return 0;
12823}
12824
12825int sme_send_he_om_ctrl_nss_update(mac_handle_t hal, uint8_t session_id,
12826 uint8_t cfg_val)
12827{
12828 uint32_t om_ctrl_cmd[NUM_OM_CTRL_UPDATE_CFG_PARAMS] = {0};
12829 QDF_STATUS status;
12830 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
12831 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
12832
12833 if (!session) {
12834 sme_err("Session does not exist, Session_id: %d", session_id);
12835 return -EINVAL;
12836 }
12837 if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) {
12838 sme_info("STA not in connected state Session_id: %d",
12839 session_id);
12840 return -EINVAL;
12841 }
12842 if (cfg_val > session->nss) {
12843 sme_info("OM ctrl Nss %d is greater than connected Nss %d",
12844 cfg_val, session->nss);
12845 return -EINVAL;
12846 }
12847 mac_ctx->he_om_ctrl_cfg_nss_set = true;
12848 mac_ctx->he_om_ctrl_cfg_nss = cfg_val;
12849 om_ctrl_cmd[0] = 1;
12850 qdf_mem_copy((void *)&om_ctrl_cmd[OM_CTRL_CMD_MAC_BITS31],
12851 (void *)session->connectedProfile.bssid.bytes,
12852 sizeof(uint32_t));
12853 qdf_mem_copy((void *)&om_ctrl_cmd[OM_CTRL_CMD_MAC_BITS47],
12854 (void *)&session->connectedProfile.bssid.bytes[4],
12855 sizeof(uint16_t));
12856
12857 if (mac_ctx->he_om_ctrl_cfg_bw_set)
12858 om_ctrl_cmd[OM_CTRL_CMD_BW] = mac_ctx->he_om_ctrl_cfg_bw;
12859 else
12860 om_ctrl_cmd[OM_CTRL_CMD_BW] =
12861 session->connectedProfile.vht_channel_width;
12862
12863 om_ctrl_cmd[OM_CTRL_CMD_RX_NSS] = cfg_val - 1;
12864 om_ctrl_cmd[OM_CTRL_CMD_TX_NSS] = cfg_val - 1;
12865 om_ctrl_cmd[OM_CTRL_CMD_ULMU] = 1;
12866 status = wma_form_unit_test_cmd_and_send(session_id, 13, 7,
12867 om_ctrl_cmd);
12868 if (QDF_STATUS_SUCCESS != status) {
12869 sme_err("send_unit_test_cmd returned %d", status);
12870 return -EIO;
12871 }
12872
12873 return 0;
12874}
12875
12876void sme_reset_he_om_ctrl(mac_handle_t hal)
12877{
12878 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
12879
12880 mac_ctx->he_om_ctrl_cfg_bw_set = false;
12881 mac_ctx->he_om_ctrl_cfg_nss_set = false;
12882 mac_ctx->he_om_ctrl_cfg_bw = 0;
12883 mac_ctx->he_om_ctrl_cfg_nss = 0;
12884}
12885
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070012886int sme_update_he_tx_bfee_nsts(mac_handle_t hal, uint8_t session_id,
12887 uint8_t cfg_val)
12888{
12889 return sme_update_he_cap(hal, session_id, WNI_CFG_HE_BFEE_STS_LT80,
12890 cfg_val);
12891}
12892
Kiran Kumar Lokere86e85592018-07-18 15:34:24 -070012893void sme_set_he_tx_bf_cbf_rates(uint8_t session_id)
12894{
12895 uint32_t tx_bf_cbf_rates_5g[] = {91, 1, 0, 3, 2, 4, 0};
12896 uint32_t tx_bf_cbf_rates_2g[] = {91, 1, 1, 3, 1, 3, 0};
12897 QDF_STATUS status;
12898
12899 status = wma_form_unit_test_cmd_and_send(session_id, 0x48, 7,
12900 tx_bf_cbf_rates_5g);
12901 if (QDF_STATUS_SUCCESS != status)
12902 sme_err("send_unit_test_cmd returned %d", status);
12903
12904 status = wma_form_unit_test_cmd_and_send(session_id, 0x48, 7,
12905 tx_bf_cbf_rates_2g);
12906 if (QDF_STATUS_SUCCESS != status)
12907 sme_err("send_unit_test_cmd returned %d", status);
12908}
12909
Kiran Kumar Lokereefdbd0b2018-09-25 18:53:46 -070012910void sme_config_su_ppdu_queue(uint8_t session_id, bool enable)
12911{
12912 uint32_t su_ppdu_enable[] = {69, 1, 1, 1};
12913 uint32_t su_ppdu_disable[] = {69, 1, 1, 0};
12914 QDF_STATUS status;
12915
12916 if (enable) {
12917 sme_debug("Send Tx SU PPDU queue ENABLE cmd to FW");
12918 status = wma_form_unit_test_cmd_and_send(session_id, 0x48, 4,
12919 su_ppdu_enable);
12920 } else {
12921 sme_debug("Send Tx SU PPDU queue DISABLE cmd to FW");
12922 status = wma_form_unit_test_cmd_and_send(session_id, 0x48, 4,
12923 su_ppdu_disable);
12924 }
12925 if (QDF_STATUS_SUCCESS != status)
12926 sme_err("send_unit_test_cmd returned %d", status);
12927}
12928
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080012929int sme_update_he_tx_stbc_cap(tHalHandle hal, uint8_t session_id, int value)
12930{
12931 int ret;
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080012932 uint32_t he_cap_val = 0;
12933
12934 he_cap_val = value ? 1 : 0;
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080012935
12936 ret = sme_update_he_cap(hal, session_id,
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080012937 WNI_CFG_HE_TX_STBC_LT80, he_cap_val);
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080012938 if (ret)
12939 return ret;
12940
12941 return sme_update_he_cap(hal, session_id,
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080012942 WNI_CFG_HE_TX_STBC_GT80, he_cap_val);
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080012943}
12944
12945int sme_update_he_rx_stbc_cap(tHalHandle hal, uint8_t session_id, int value)
12946{
12947 int ret;
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080012948 uint32_t he_cap_val = 0;
12949
12950 he_cap_val = value ? 1 : 0;
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080012951
12952 ret = sme_update_he_cap(hal, session_id,
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080012953 WNI_CFG_HE_RX_STBC_LT80, he_cap_val);
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080012954 if (ret)
12955 return ret;
12956
12957 return sme_update_he_cap(hal, session_id,
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080012958 WNI_CFG_HE_RX_STBC_GT80, he_cap_val);
12959}
12960
12961int sme_update_he_frag_supp(tHalHandle hal, uint8_t session_id,
12962 uint16_t he_frag)
12963{
12964 return sme_update_he_cap(hal, session_id,
12965 WNI_CFG_HE_FRAGMENTATION, he_frag);
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080012966}
Kiran Kumar Lokeree43a4582018-05-08 19:54:03 -070012967
12968int sme_update_he_ldpc_supp(tHalHandle hal, uint8_t session_id,
12969 uint16_t he_ldpc)
12970{
12971 return sme_update_he_cap(hal, session_id, WNI_CFG_HE_LDPC, he_ldpc);
12972}
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080012973#endif
12974
Archana Ramachandran5041b252016-04-25 14:29:25 -070012975/**
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053012976 * sme_set_nud_debug_stats_cb() - set nud debug stats callback
12977 * @hal: global hal handle
12978 * @cb: callback function pointer
Dundi Raviteja3bcf3a82018-05-22 13:24:18 +053012979 * @context: callback context
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053012980 *
12981 * This function stores nud debug stats callback function.
12982 *
12983 * Return: QDF_STATUS enumeration.
12984 */
12985QDF_STATUS sme_set_nud_debug_stats_cb(tHalHandle hal,
Dundi Raviteja3bcf3a82018-05-22 13:24:18 +053012986 void (*cb)(void *, struct rsp_stats *, void *),
12987 void *context)
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053012988{
12989 QDF_STATUS status = QDF_STATUS_SUCCESS;
12990 tpAniSirGlobal mac;
12991
12992 if (!hal) {
12993 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12994 FL("hal is not valid"));
12995 return QDF_STATUS_E_INVAL;
12996 }
12997 mac = PMAC_STRUCT(hal);
12998
12999 status = sme_acquire_global_lock(&mac->sme);
13000 if (!QDF_IS_STATUS_SUCCESS(status)) {
13001 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13002 FL("sme_acquire_global_lock failed!(status=%d)"),
13003 status);
13004 return status;
13005 }
13006
13007 mac->sme.get_arp_stats_cb = cb;
Dundi Raviteja3bcf3a82018-05-22 13:24:18 +053013008 mac->sme.get_arp_stats_context = context;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013009 sme_release_global_lock(&mac->sme);
13010 return status;
13011}
13012
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013013/**
13014 * sme_is_any_session_in_connected_state() - SME wrapper API to
13015 * check if any session is in connected state or not.
13016 *
13017 * @hal: Handle returned by mac open
13018 *
13019 * This function is used to check if any valid sme session is in
13020 * connected state or not.
13021 *
13022 * Return: true if any session is connected, else false.
13023 *
13024 */
13025bool sme_is_any_session_in_connected_state(tHalHandle h_hal)
13026{
13027 tpAniSirGlobal mac_ctx = PMAC_STRUCT(h_hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013028 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013029 bool ret = false;
13030
13031 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013032 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013033 ret = csr_is_any_session_in_connect_state(mac_ctx);
13034 sme_release_global_lock(&mac_ctx->sme);
13035 }
13036 return ret;
13037}
13038
Jeff Johnsonb7fa2562018-07-02 08:36:17 -070013039QDF_STATUS sme_set_chip_pwr_save_fail_cb(mac_handle_t mac_handle,
13040 pwr_save_fail_cb cb)
13041{
13042 QDF_STATUS status;
13043 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +053013044
13045 status = sme_acquire_global_lock(&mac->sme);
13046 if (status != QDF_STATUS_SUCCESS) {
13047 sme_err("sme_AcquireGlobalLock failed!(status=%d)", status);
13048 return status;
13049 }
13050 mac->sme.chip_power_save_fail_cb = cb;
13051 sme_release_global_lock(&mac->sme);
13052 return status;
13053}
13054
Qiwei Caie689a262018-07-26 15:50:22 +080013055#ifdef FEATURE_RSSI_MONITOR
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013056/**
13057 * sme_set_rssi_monitoring() - set rssi monitoring
13058 * @hal: global hal handle
13059 * @input: request message
13060 *
13061 * This function constructs the vos message and fill in message type,
13062 * bodyptr with @input and posts it to WDA queue.
13063 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013064 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013065 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013066QDF_STATUS sme_set_rssi_monitoring(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013067 struct rssi_monitor_req *input)
13068{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013069 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013070 tpAniSirGlobal mac = PMAC_STRUCT(hal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013071 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013072 struct rssi_monitor_req *req_msg;
13073
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013074 SME_ENTER();
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013075 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070013076 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013077 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013078
13079 *req_msg = *input;
13080
13081 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013082 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013083 sme_err("sme_acquire_global_lock failed!(status=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013084 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013085 return status;
13086 }
13087
13088 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080013089 message.bodyptr = req_msg;
13090 message.type = WMA_SET_RSSI_MONITOR_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013091 status = scheduler_post_message(QDF_MODULE_ID_SME,
13092 QDF_MODULE_ID_WMA,
13093 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013094 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013095 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013096 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013097 }
13098 sme_release_global_lock(&mac->sme);
13099
13100 return status;
13101}
13102
Qiwei Caie689a262018-07-26 15:50:22 +080013103QDF_STATUS sme_set_rssi_threshold_breached_cb(mac_handle_t mac_handle,
13104 rssi_threshold_breached_cb cb)
13105{
13106 QDF_STATUS status;
13107 tpAniSirGlobal mac;
13108
13109 mac = MAC_CONTEXT(mac_handle);
13110 if (!mac) {
13111 sme_err("Invalid mac context");
13112 return QDF_STATUS_E_INVAL;
13113 }
13114
13115 status = sme_acquire_global_lock(&mac->sme);
13116 if (!QDF_IS_STATUS_SUCCESS(status)) {
13117 sme_err("sme_acquire_global_lock failed!(status=%d)",
13118 status);
13119 return status;
13120 }
13121
13122 mac->sme.rssi_threshold_breached_cb = cb;
13123 sme_release_global_lock(&mac->sme);
13124 return status;
13125}
13126#endif /* FEATURE_RSSI_MONITOR */
13127
13128QDF_STATUS sme_reset_rssi_threshold_breached_cb(mac_handle_t mac_handle)
13129{
13130 return sme_set_rssi_threshold_breached_cb(mac_handle, NULL);
13131}
13132
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070013133static enum band_info sme_get_connected_roaming_vdev_band(void)
13134{
13135 enum band_info band = BAND_ALL;
13136 tpAniSirGlobal mac = sme_get_mac_context();
13137 struct csr_roam_session *session;
13138 uint8_t session_id, channel;
13139
13140 if (!mac) {
13141 sme_debug("MAC Context is NULL");
13142 return band;
13143 }
13144 session_id = csr_get_roam_enabled_sta_sessionid(mac);
13145 if (session_id != CSR_SESSION_ID_INVALID) {
13146 session = CSR_GET_SESSION(mac, session_id);
13147 channel = session->connectedProfile.operationChannel;
13148 band = csr_get_rf_band(channel);
13149 return band;
13150 }
13151
13152 return band;
13153}
13154
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013155/*
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053013156 * sme_pdev_set_pcl() - Send WMI_PDEV_SET_PCL_CMDID to the WMA
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013157 * @hal: Handle returned by macOpen
13158 * @msg: PCL channel list and length structure
13159 *
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053013160 * Sends the command to WMA to send WMI_PDEV_SET_PCL_CMDID to FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013161 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013162 */
Krunal Soni8a090df2018-05-03 15:02:54 -070013163QDF_STATUS sme_pdev_set_pcl(struct policy_mgr_pcl_list *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013164{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013165 QDF_STATUS status = QDF_STATUS_SUCCESS;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080013166 tpAniSirGlobal mac = sme_get_mac_context();
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013167 struct scheduler_msg message = {0};
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070013168 struct set_pcl_req *req_msg;
13169 uint32_t i;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013170
Krunal Soni3fa80e22018-01-09 14:16:02 -080013171 if (!mac) {
13172 sme_err("mac is NULL");
13173 return QDF_STATUS_E_FAILURE;
13174 }
Krunal Soni8a090df2018-05-03 15:02:54 -070013175
13176 if (!msg) {
13177 sme_err("msg is NULL");
13178 return QDF_STATUS_E_FAILURE;
13179 }
13180
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070013181 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070013182 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013183 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013184
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070013185 req_msg->band = BAND_ALL;
13186 if (CSR_IS_ROAM_INTRA_BAND_ENABLED(mac)) {
13187 req_msg->band = sme_get_connected_roaming_vdev_band();
13188 sme_debug("Connected STA band %d", req_msg->band);
13189 }
Krunal Soni8a090df2018-05-03 15:02:54 -070013190 for (i = 0; i < msg->pcl_len; i++) {
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070013191 req_msg->chan_weights.pcl_list[i] = msg->pcl_list[i];
13192 req_msg->chan_weights.weight_list[i] = msg->weight_list[i];
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053013193 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013194
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070013195 req_msg->chan_weights.pcl_len = msg->pcl_len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013196
13197 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013198 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013199 sme_err("sme_acquire_global_lock failed!(status=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013200 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013201 return status;
13202 }
13203
13204 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080013205 message.bodyptr = req_msg;
13206 message.type = SIR_HAL_PDEV_SET_PCL_TO_FW;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013207 status = scheduler_post_message(QDF_MODULE_ID_SME,
13208 QDF_MODULE_ID_WMA,
13209 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013210 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013211 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013212 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013213 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013214 }
13215 sme_release_global_lock(&mac->sme);
13216
13217 return status;
13218}
13219
13220/*
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053013221 * sme_pdev_set_hw_mode() - Send WMI_PDEV_SET_HW_MODE_CMDID to the WMA
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013222 * @hal: Handle returned by macOpen
13223 * @msg: HW mode structure containing hw mode and callback details
13224 *
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053013225 * Sends the command to CSR to send WMI_PDEV_SET_HW_MODE_CMDID to FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013226 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013227 */
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080013228QDF_STATUS sme_pdev_set_hw_mode(struct policy_mgr_hw_mode msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013229{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013230 QDF_STATUS status = QDF_STATUS_SUCCESS;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080013231 tpAniSirGlobal mac = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013232 tSmeCmd *cmd = NULL;
13233
Krunal Soni3fa80e22018-01-09 14:16:02 -080013234 if (!mac) {
13235 sme_err("mac is NULL");
13236 return QDF_STATUS_E_FAILURE;
13237 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013238 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013239 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013240 sme_err("Failed to acquire lock");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013241 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013242 }
13243
Krunal Soni78618d92017-02-14 21:46:31 -080013244 cmd = csr_get_command_buffer(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013245 if (!cmd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013246 sme_err("Get command buffer failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013247 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013248 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013249 }
13250
13251 cmd->command = e_sme_command_set_hw_mode;
Ganesh Kondabattiniae1c6a22017-05-02 18:02:11 +053013252 cmd->sessionId = msg.session_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013253 cmd->u.set_hw_mode_cmd.hw_mode_index = msg.hw_mode_index;
13254 cmd->u.set_hw_mode_cmd.set_hw_mode_cb = msg.set_hw_mode_cb;
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +053013255 cmd->u.set_hw_mode_cmd.reason = msg.reason;
13256 cmd->u.set_hw_mode_cmd.session_id = msg.session_id;
Tushnim Bhattacharyyaeab33dd2017-11-15 15:20:02 -080013257 cmd->u.set_hw_mode_cmd.next_action = msg.next_action;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080013258 cmd->u.set_hw_mode_cmd.context = msg.context;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013259
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013260 sme_debug("Queuing set hw mode to CSR, session: %d reason: %d",
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053013261 cmd->u.set_hw_mode_cmd.session_id,
13262 cmd->u.set_hw_mode_cmd.reason);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013263 csr_queue_sme_command(mac, cmd, false);
13264
13265 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013266 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013267}
13268
13269/**
13270 * sme_register_hw_mode_trans_cb() - HW mode transition callback registration
13271 * @hal: Handle returned by macOpen
13272 * @callback: HDD callback to be registered
13273 *
13274 * Registers the HDD callback with SME. This callback will be invoked when
13275 * HW mode transition event is received from the FW
13276 *
13277 * Return: None
13278 */
13279void sme_register_hw_mode_trans_cb(tHalHandle hal,
13280 hw_mode_transition_cb callback)
13281{
13282 tpAniSirGlobal mac = PMAC_STRUCT(hal);
13283
13284 mac->sme.sme_hw_mode_trans_cb = callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013285}
13286
13287/**
13288 * sme_nss_update_request() - Send beacon templete update to FW with new
13289 * nss value
13290 * @hal: Handle returned by macOpen
13291 * @vdev_id: the session id
13292 * @new_nss: the new nss value
13293 * @cback: hdd callback
13294 * @next_action: next action to happen at policy mgr after beacon update
Liangwei Dong1ba99482018-10-19 02:57:29 -040013295 * @original_vdev_id: original request hwmode change vdev id
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013296 *
13297 * Sends the command to CSR to send to PE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013298 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013299 */
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080013300QDF_STATUS sme_nss_update_request(uint32_t vdev_id,
13301 uint8_t new_nss, policy_mgr_nss_update_cback cback,
13302 uint8_t next_action, struct wlan_objmgr_psoc *psoc,
Liangwei Dong1ba99482018-10-19 02:57:29 -040013303 enum policy_mgr_conn_update_reason reason,
13304 uint32_t original_vdev_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013305{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013306 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080013307 tpAniSirGlobal mac = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013308 tSmeCmd *cmd = NULL;
13309
Krunal Soni3fa80e22018-01-09 14:16:02 -080013310 if (!mac) {
13311 sme_err("mac is null");
13312 return status;
13313 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013314 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013315 if (QDF_IS_STATUS_SUCCESS(status)) {
Krunal Soni78618d92017-02-14 21:46:31 -080013316 cmd = csr_get_command_buffer(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013317 if (!cmd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013318 sme_err("Get command buffer failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013319 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013320 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013321 }
13322 cmd->command = e_sme_command_nss_update;
13323 /* Sessionized modules may require this info */
13324 cmd->sessionId = vdev_id;
13325 cmd->u.nss_update_cmd.new_nss = new_nss;
13326 cmd->u.nss_update_cmd.session_id = vdev_id;
13327 cmd->u.nss_update_cmd.nss_update_cb = cback;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080013328 cmd->u.nss_update_cmd.context = psoc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013329 cmd->u.nss_update_cmd.next_action = next_action;
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053013330 cmd->u.nss_update_cmd.reason = reason;
Liangwei Dong1ba99482018-10-19 02:57:29 -040013331 cmd->u.nss_update_cmd.original_vdev_id = original_vdev_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013332
Liangwei Dong1ba99482018-10-19 02:57:29 -040013333 sme_debug("Queuing e_sme_command_nss_update to CSR:vdev (%d %d) ss %d r %d",
13334 vdev_id, original_vdev_id, new_nss, reason);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013335 csr_queue_sme_command(mac, cmd, false);
13336 sme_release_global_lock(&mac->sme);
13337 }
13338 return status;
13339}
13340
13341/**
13342 * sme_soc_set_dual_mac_config() - Set dual mac configurations
13343 * @hal: Handle returned by macOpen
13344 * @msg: Structure containing the dual mac config parameters
13345 *
13346 * Queues configuration information to CSR to configure
13347 * WLAN firmware for the dual MAC features
13348 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013349 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013350 */
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080013351QDF_STATUS sme_soc_set_dual_mac_config(struct policy_mgr_dual_mac_config msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013352{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013353 QDF_STATUS status = QDF_STATUS_SUCCESS;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080013354 tpAniSirGlobal mac = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013355 tSmeCmd *cmd;
13356
Krunal Soni3fa80e22018-01-09 14:16:02 -080013357 if (!mac) {
13358 sme_err("mac is null");
13359 return QDF_STATUS_E_FAILURE;
13360 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013361 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013362 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013363 sme_err("Failed to acquire lock");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013364 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013365 }
13366
Krunal Soni78618d92017-02-14 21:46:31 -080013367 cmd = csr_get_command_buffer(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013368 if (!cmd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013369 sme_err("Get command buffer failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013370 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013371 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013372 }
13373
13374 cmd->command = e_sme_command_set_dual_mac_config;
13375 cmd->u.set_dual_mac_cmd.scan_config = msg.scan_config;
13376 cmd->u.set_dual_mac_cmd.fw_mode_config = msg.fw_mode_config;
13377 cmd->u.set_dual_mac_cmd.set_dual_mac_cb = msg.set_dual_mac_cb;
13378
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013379 sme_debug("set_dual_mac_config scan_config: %x fw_mode_config: %x",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013380 cmd->u.set_dual_mac_cmd.scan_config,
13381 cmd->u.set_dual_mac_cmd.fw_mode_config);
13382 csr_queue_sme_command(mac, cmd, false);
13383
13384 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013385 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013386}
13387
Ravi Joshi9e891ba2015-11-09 19:03:46 -080013388#ifdef FEATURE_LFR_SUBNET_DETECTION
13389/**
13390 * sme_gateway_param_update() - to update gateway parameters with WMA
13391 * @Hal: hal handle
13392 * @gw_params: request parameters from HDD
13393 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013394 * Return: QDF_STATUS
Ravi Joshi9e891ba2015-11-09 19:03:46 -080013395 *
13396 * This routine will update gateway parameters to WMA
13397 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013398QDF_STATUS sme_gateway_param_update(tHalHandle Hal,
Ravi Joshi9e891ba2015-11-09 19:03:46 -080013399 struct gateway_param_update_req *gw_params)
13400{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013401 QDF_STATUS qdf_status;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013402 struct scheduler_msg message = {0};
Ravi Joshi9e891ba2015-11-09 19:03:46 -080013403 struct gateway_param_update_req *request_buf;
13404
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013405 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Arif Hussain0ef77082018-10-10 16:42:53 -070013406 if (!request_buf)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013407 return QDF_STATUS_E_NOMEM;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080013408
13409 *request_buf = *gw_params;
13410
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080013411 message.type = WMA_GW_PARAM_UPDATE_REQ;
13412 message.reserved = 0;
13413 message.bodyptr = request_buf;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013414 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
13415 QDF_MODULE_ID_WMA,
13416 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013417 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013418 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053013419 "Not able to post WMA_GW_PARAM_UPDATE_REQ message to HAL");
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013420 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013421 return QDF_STATUS_E_FAILURE;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080013422 }
13423
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013424 return QDF_STATUS_SUCCESS;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080013425}
13426#endif /* FEATURE_LFR_SUBNET_DETECTION */
13427
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013428/**
Archana Ramachandrana20ef812015-11-13 16:12:13 -080013429 * sme_soc_set_antenna_mode() - set antenna mode
13430 * @hal: Handle returned by macOpen
13431 * @msg: Structure containing the antenna mode parameters
13432 *
13433 * Send the command to CSR to send
13434 * WMI_SOC_SET_ANTENNA_MODE_CMDID to FW
13435 *
13436 * Return: QDF_STATUS
13437 */
13438QDF_STATUS sme_soc_set_antenna_mode(tHalHandle hal,
13439 struct sir_antenna_mode_param *msg)
13440{
13441 QDF_STATUS status = QDF_STATUS_SUCCESS;
13442 tpAniSirGlobal mac = PMAC_STRUCT(hal);
13443 tSmeCmd *cmd;
13444
13445 if (NULL == msg) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013446 sme_err("antenna mode mesg is NULL");
Archana Ramachandrana20ef812015-11-13 16:12:13 -080013447 return QDF_STATUS_E_FAILURE;
13448 }
13449
13450 status = sme_acquire_global_lock(&mac->sme);
13451 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013452 sme_err("Failed to acquire lock");
Archana Ramachandrana20ef812015-11-13 16:12:13 -080013453 return QDF_STATUS_E_RESOURCES;
13454 }
13455
Krunal Soni78618d92017-02-14 21:46:31 -080013456 cmd = csr_get_command_buffer(mac);
Archana Ramachandrana20ef812015-11-13 16:12:13 -080013457 if (!cmd) {
13458 sme_release_global_lock(&mac->sme);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013459 sme_err("Get command buffer failed");
Archana Ramachandrana20ef812015-11-13 16:12:13 -080013460 return QDF_STATUS_E_NULL_VALUE;
13461 }
13462
13463 cmd->command = e_sme_command_set_antenna_mode;
13464 cmd->u.set_antenna_mode_cmd = *msg;
13465
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013466 sme_debug("Antenna mode rx_chains: %d tx_chains: %d",
Archana Ramachandrana20ef812015-11-13 16:12:13 -080013467 cmd->u.set_antenna_mode_cmd.num_rx_chains,
13468 cmd->u.set_antenna_mode_cmd.num_tx_chains);
13469
13470 csr_queue_sme_command(mac, cmd, false);
13471 sme_release_global_lock(&mac->sme);
13472
13473 return QDF_STATUS_SUCCESS;
13474}
13475
13476/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013477 * sme_set_peer_authorized() - call peer authorized callback
13478 * @peer_addr: peer mac address
13479 * @auth_cb: auth callback
13480 * @vdev_id: vdev id
13481 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053013482 * Return: QDF Status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013483 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013484QDF_STATUS sme_set_peer_authorized(uint8_t *peer_addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013485 sme_peer_authorized_fp auth_cb,
13486 uint32_t vdev_id)
13487{
13488 void *wma_handle;
13489
Anurag Chouhan6d760662016-02-20 16:05:43 +053013490 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013491 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013492 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013493 "wma handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013494 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013495 }
13496
13497 wma_set_peer_authorized_cb(wma_handle, auth_cb);
13498 return wma_set_peer_param(wma_handle, peer_addr, WMI_PEER_AUTHORIZE,
13499 1, vdev_id);
13500}
13501
13502/*
Amar Singhal7c1e8982016-05-19 15:08:09 -070013503 * sme_handle_set_fcc_channel() - set spec. tx power for non-fcc channel
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013504 * @hal: HAL pointer
Amar Singhal83a047a2016-05-19 15:56:11 -070013505 * @fcc_constraint: flag to enable/disable the constraint
13506 * @scan_pending: whether there is pending scan
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013507 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013508 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013509 */
Amar Singhal83a047a2016-05-19 15:56:11 -070013510QDF_STATUS sme_handle_set_fcc_channel(tHalHandle hal, bool fcc_constraint,
13511 bool scan_pending)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013512{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013513 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013514 tpAniSirGlobal mac_ptr = PMAC_STRUCT(hal);
13515
13516 status = sme_acquire_global_lock(&mac_ptr->sme);
13517
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013518 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013519
13520 if (fcc_constraint != mac_ptr->scan.fcc_constraint) {
13521 mac_ptr->scan.fcc_constraint = fcc_constraint;
Amar Singhal83a047a2016-05-19 15:56:11 -070013522 if (scan_pending)
13523 mac_ptr->scan.defer_update_channel_list = true;
13524 else
13525 status = csr_update_channel_list(mac_ptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013526 }
13527
13528 sme_release_global_lock(&mac_ptr->sme);
13529 }
13530
13531 return status;
13532}
13533/**
13534 * sme_setdef_dot11mode() - Updates pMac with default dot11mode
13535 * @hal: Global MAC pointer
13536 *
13537 * Return: NULL.
13538 */
13539void sme_setdef_dot11mode(tHalHandle hal)
13540{
13541 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053013542
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013543 csr_set_default_dot11_mode(mac_ctx);
13544}
13545
13546/**
13547 * sme_update_roam_scan_hi_rssi_scan_params() - update high rssi scan
13548 * params
13549 * @hal_handle - The handle returned by macOpen.
13550 * @session_id - Session Identifier
13551 * @notify_id - Identifies 1 of the 4 parameters to be modified
13552 * @val New value of the parameter
13553 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013554 * Return: QDF_STATUS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013555 * Other status means SME failed to update
13556 */
13557
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013558QDF_STATUS sme_update_roam_scan_hi_rssi_scan_params(tHalHandle hal_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013559 uint8_t session_id,
13560 uint32_t notify_id,
13561 int32_t val)
13562{
13563 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013564 QDF_STATUS status = QDF_STATUS_SUCCESS;
gaurank kathpalia14e2f912017-08-31 14:51:45 +053013565 struct csr_neighbor_roamconfig *nr_config = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013566 tpCsrNeighborRoamControlInfo nr_info = NULL;
13567 uint32_t reason = 0;
13568
Naveen Rawatc36f7eb2016-11-10 20:01:03 -080013569 if (session_id >= CSR_ROAM_SESSION_MAX) {
13570 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13571 FL("Invalid sme session id: %d"), session_id);
13572 return QDF_STATUS_E_INVAL;
13573 }
13574
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013575 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013576 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013577 nr_config = &mac_ctx->roam.configParam.neighborRoamConfig;
13578 nr_info = &mac_ctx->roam.neighborRoamInfo[session_id];
13579 switch (notify_id) {
13580 case eCSR_HI_RSSI_SCAN_MAXCOUNT_ID:
Abhishek Singhe4a1f882017-08-10 17:59:44 +053013581 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013582 "%s: gRoamScanHirssiMaxCount %d => %d",
13583 __func__, nr_config->nhi_rssi_scan_max_count,
13584 val);
13585 nr_config->nhi_rssi_scan_max_count = val;
13586 nr_info->cfgParams.hi_rssi_scan_max_count = val;
13587 reason = REASON_ROAM_SCAN_HI_RSSI_MAXCOUNT_CHANGED;
13588 break;
13589
13590 case eCSR_HI_RSSI_SCAN_RSSI_DELTA_ID:
Abhishek Singhe4a1f882017-08-10 17:59:44 +053013591 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013592 FL("gRoamScanHiRssiDelta %d => %d"),
13593 nr_config->nhi_rssi_scan_rssi_delta,
13594 val);
13595 nr_config->nhi_rssi_scan_rssi_delta = val;
13596 nr_info->cfgParams.hi_rssi_scan_rssi_delta = val;
13597 reason = REASON_ROAM_SCAN_HI_RSSI_DELTA_CHANGED;
13598 break;
13599
13600 case eCSR_HI_RSSI_SCAN_DELAY_ID:
Abhishek Singhe4a1f882017-08-10 17:59:44 +053013601 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013602 FL("gRoamScanHiRssiDelay %d => %d"),
13603 nr_config->nhi_rssi_scan_delay,
13604 val);
13605 nr_config->nhi_rssi_scan_delay = val;
13606 nr_info->cfgParams.hi_rssi_scan_delay = val;
13607 reason = REASON_ROAM_SCAN_HI_RSSI_DELAY_CHANGED;
13608 break;
13609
13610 case eCSR_HI_RSSI_SCAN_RSSI_UB_ID:
Abhishek Singhe4a1f882017-08-10 17:59:44 +053013611 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013612 FL("gRoamScanHiRssiUpperBound %d => %d"),
13613 nr_config->nhi_rssi_scan_rssi_ub,
13614 val);
13615 nr_config->nhi_rssi_scan_rssi_ub = val;
13616 nr_info->cfgParams.hi_rssi_scan_rssi_ub = val;
13617 reason = REASON_ROAM_SCAN_HI_RSSI_UB_CHANGED;
13618 break;
13619
13620 default:
Abhishek Singhe4a1f882017-08-10 17:59:44 +053013621 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013622 FL("invalid parameter notify_id %d"),
13623 notify_id);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013624 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013625 break;
13626 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053013627
13628 if (mac_ctx->roam.configParam.isRoamOffloadScanEnabled &&
13629 status == QDF_STATUS_SUCCESS) {
13630 csr_roam_offload_scan(mac_ctx, session_id,
13631 ROAM_SCAN_OFFLOAD_UPDATE_CFG, reason);
13632 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013633 sme_release_global_lock(&mac_ctx->sme);
13634 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013635
13636 return status;
13637}
13638
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070013639/**
13640 * sme_update_tgt_services() - update the target services config.
13641 * @hal: HAL pointer.
13642 * @cfg: wma_tgt_services parameters.
13643 *
13644 * update the target services config.
13645 *
13646 * Return: None.
13647 */
13648void sme_update_tgt_services(tHalHandle hal, struct wma_tgt_services *cfg)
13649{
13650 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
13651
Liangwei Dong0da14262018-07-03 03:30:23 -040013652 mac_ctx->obss_scan_offload = cfg->obss_scan_offload;
13653 sme_debug("obss_scan_offload: %d", mac_ctx->obss_scan_offload);
Krunal Sonie6a1cda2017-09-27 15:23:02 -070013654 mac_ctx->lteCoexAntShare = cfg->lte_coex_ant_share;
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070013655 mac_ctx->beacon_offload = cfg->beacon_offload;
mukul sharma72c8b222015-09-04 17:02:01 +053013656 mac_ctx->pmf_offload = cfg->pmf_offload;
Abhishek Singhe4a1f882017-08-10 17:59:44 +053013657 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
mukul sharma72c8b222015-09-04 17:02:01 +053013658 FL("mac_ctx->pmf_offload: %d"), mac_ctx->pmf_offload);
Vignesh Viswanathan731186f2017-09-18 13:47:37 +053013659 mac_ctx->is_fils_roaming_supported =
13660 cfg->is_fils_roaming_supported;
Vignesh Viswanathan694e28e2018-01-18 20:53:57 +053013661 mac_ctx->is_11k_offload_supported =
13662 cfg->is_11k_offload_supported;
13663 sme_debug("pmf_offload: %d fils_roam support %d 11k_offload %d",
13664 mac_ctx->pmf_offload, mac_ctx->is_fils_roaming_supported,
13665 mac_ctx->is_11k_offload_supported);
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070013666}
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053013667
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053013668/**
13669 * sme_is_session_id_valid() - Check if the session id is valid
13670 * @hal: Pointer to HAL
13671 * @session_id: Session id
13672 *
13673 * Checks if the session id is valid or not
13674 *
13675 * Return: True is the session id is valid, false otherwise
13676 */
13677bool sme_is_session_id_valid(tHalHandle hal, uint32_t session_id)
13678{
Pragaspathi Thilagarajb11dbe42018-07-23 16:42:17 +053013679 tpAniSirGlobal mac;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053013680
Pragaspathi Thilagarajb11dbe42018-07-23 16:42:17 +053013681 if (NULL != hal) {
13682 mac = PMAC_STRUCT(hal);
13683 } else {
Chandrasekaran, Manishekard3cb4772016-02-22 22:21:10 +053013684 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13685 "%s: null mac pointer", __func__);
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053013686 return false;
13687 }
13688
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053013689 if (CSR_IS_SESSION_VALID(mac, session_id))
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053013690 return true;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053013691
13692 return false;
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053013693}
13694
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053013695#ifdef FEATURE_WLAN_TDLS
13696
13697/**
13698 * sme_get_opclass() - determine operating class
13699 * @hal: Pointer to HAL
13700 * @channel: channel id
13701 * @bw_offset: bandwidth offset
13702 * @opclass: pointer to operating class
13703 *
13704 * Function will determine operating class from regdm_get_opclass_from_channel
13705 *
13706 * Return: none
13707 */
13708void sme_get_opclass(tHalHandle hal, uint8_t channel, uint8_t bw_offset,
13709 uint8_t *opclass)
13710{
13711 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
13712
13713 /* redgm opclass table contains opclass for 40MHz low primary,
13714 * 40MHz high primary and 20MHz. No support for 80MHz yet. So
13715 * first we will check if bit for 40MHz is set and if so find
13716 * matching opclass either with low primary or high primary
13717 * (a channel would never be in both) and then search for opclass
13718 * matching 20MHz, else for any BW.
13719 */
13720 if (bw_offset & (1 << BW_40_OFFSET_BIT)) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070013721 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053013722 mac_ctx->scan.countryCodeCurrent,
13723 channel, BW40_LOW_PRIMARY);
13724 if (!(*opclass)) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070013725 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053013726 mac_ctx->scan.countryCodeCurrent,
13727 channel, BW40_HIGH_PRIMARY);
13728 }
13729 } else if (bw_offset & (1 << BW_20_OFFSET_BIT)) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070013730 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053013731 mac_ctx->scan.countryCodeCurrent,
13732 channel, BW20);
13733 } else {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070013734 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053013735 mac_ctx->scan.countryCodeCurrent,
13736 channel, BWALL);
13737 }
13738}
13739#endif
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080013740
Sandeep Puligillae0875662016-02-12 16:09:21 -080013741/**
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +053013742 * sme_set_fw_test() - set fw test
13743 * @fw_test: fw test param
13744 *
13745 * Return: Return QDF_STATUS, otherwise appropriate failure code
13746 */
13747QDF_STATUS sme_set_fw_test(struct set_fwtest_params *fw_test)
13748{
13749 void *wma_handle;
13750
13751 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13752 if (!wma_handle) {
13753 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13754 "wma handle is NULL");
13755 return QDF_STATUS_E_FAILURE;
13756 }
13757 wma_process_fw_test_cmd(wma_handle, fw_test);
13758 return QDF_STATUS_SUCCESS;
13759}
13760
13761/**
Sandeep Puligillae0875662016-02-12 16:09:21 -080013762 * sme_ht40_stop_obss_scan() - ht40 obss stop scan
13763 * @hal: mac handel
13764 * @vdev_id: vdev identifier
13765 *
13766 * Return: Return QDF_STATUS, otherwise appropriate failure code
13767 */
13768QDF_STATUS sme_ht40_stop_obss_scan(tHalHandle hal, uint32_t vdev_id)
13769{
13770 void *wma_handle;
13771
13772 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13773 if (!wma_handle) {
13774 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13775 "wma handle is NULL");
13776 return QDF_STATUS_E_FAILURE;
13777 }
13778 wma_ht40_stop_obss_scan(wma_handle, vdev_id);
13779 return QDF_STATUS_SUCCESS;
13780}
Archana Ramachandran20d2e232016-02-11 16:58:40 -080013781
13782/**
13783 * sme_update_mimo_power_save() - Update MIMO power save
13784 * configuration
13785 * @hal: The handle returned by macOpen
13786 * @is_ht_smps_enabled: enable/disable ht smps
13787 * @ht_smps_mode: smps mode disabled/static/dynamic
Archana Ramachandranfec24812016-02-16 16:31:56 -080013788 * @send_smps_action: flag to send smps force mode command
13789 * to FW
Archana Ramachandran20d2e232016-02-11 16:58:40 -080013790 *
13791 * Return: QDF_STATUS if SME update mimo power save
Jeff Johnson698eacd2018-05-12 17:00:03 -070013792 * configuration success else failure status
Archana Ramachandran20d2e232016-02-11 16:58:40 -080013793 */
13794QDF_STATUS sme_update_mimo_power_save(tHalHandle hal,
13795 uint8_t is_ht_smps_enabled,
Archana Ramachandranfec24812016-02-16 16:31:56 -080013796 uint8_t ht_smps_mode,
13797 bool send_smps_action)
Archana Ramachandran20d2e232016-02-11 16:58:40 -080013798{
13799 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Archana Ramachandranfec24812016-02-16 16:31:56 -080013800
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013801 sme_debug("SMPS enable: %d mode: %d send action: %d",
Archana Ramachandranfec24812016-02-16 16:31:56 -080013802 is_ht_smps_enabled, ht_smps_mode,
13803 send_smps_action);
Vignesh Viswanathanddc89e52018-11-02 18:43:42 +053013804 mac_ctx->mlme_cfg->ht_caps.enable_smps =
Archana Ramachandran20d2e232016-02-11 16:58:40 -080013805 is_ht_smps_enabled;
Vignesh Viswanathanddc89e52018-11-02 18:43:42 +053013806 mac_ctx->mlme_cfg->ht_caps.smps = ht_smps_mode;
Archana Ramachandranfec24812016-02-16 16:31:56 -080013807 mac_ctx->roam.configParam.send_smps_action =
13808 send_smps_action;
Archana Ramachandran20d2e232016-02-11 16:58:40 -080013809
13810 return QDF_STATUS_SUCCESS;
13811}
13812
13813/**
13814 * sme_is_sta_smps_allowed() - check if the supported nss for
13815 * the session is greater than 1x1 to enable sta SMPS
13816 * @hal: The handle returned by macOpen
13817 * @session_id: session id
13818 *
13819 * Return: bool returns true if supported nss is greater than
13820 * 1x1 else false
13821 */
13822bool sme_is_sta_smps_allowed(tHalHandle hal, uint8_t session_id)
13823{
13824 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
gaurank kathpalia14e2f912017-08-31 14:51:45 +053013825 struct csr_roam_session *csr_session;
Archana Ramachandran20d2e232016-02-11 16:58:40 -080013826
Archana Ramachandran20d2e232016-02-11 16:58:40 -080013827 csr_session = CSR_GET_SESSION(mac_ctx, session_id);
13828 if (NULL == csr_session) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013829 sme_err("SME session not valid: %d", session_id);
Sreelakshmi Konamki58697e12016-05-25 17:30:18 +053013830 return false;
13831 }
13832
13833 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013834 sme_err("CSR session not valid: %d", session_id);
Archana Ramachandran20d2e232016-02-11 16:58:40 -080013835 return false;
13836 }
13837
13838 return (csr_session->supported_nss_1x1 == true) ? false : true;
13839}
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070013840
13841/**
13842 * sme_add_beacon_filter() - set the beacon filter configuration
13843 * @hal: The handle returned by macOpen
13844 * @session_id: session id
13845 * @ie_map: bitwise array of IEs
13846 *
13847 * Return: Return QDF_STATUS, otherwise appropriate failure code
13848 */
13849QDF_STATUS sme_add_beacon_filter(tHalHandle hal,
13850 uint32_t session_id,
13851 uint32_t *ie_map)
13852{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013853 struct scheduler_msg message = {0};
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070013854 QDF_STATUS qdf_status;
13855 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
13856 struct beacon_filter_param *filter_param;
13857
13858 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013859 sme_err("CSR session not valid: %d", session_id);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070013860 return QDF_STATUS_E_FAILURE;
13861 }
13862
13863 filter_param = qdf_mem_malloc(sizeof(*filter_param));
Arif Hussain0ef77082018-10-10 16:42:53 -070013864 if (!filter_param)
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070013865 return QDF_STATUS_E_FAILURE;
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070013866
13867 filter_param->vdev_id = session_id;
13868
13869 qdf_mem_copy(filter_param->ie_map, ie_map,
13870 BCN_FLT_MAX_ELEMS_IE_LIST * sizeof(uint32_t));
13871
13872 message.type = WMA_ADD_BCN_FILTER_CMDID;
13873 message.bodyptr = filter_param;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013874 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
13875 QDF_MODULE_ID_WMA,
13876 QDF_MODULE_ID_WMA,
13877 &message);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070013878 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
13879 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13880 "%s: Not able to post msg to WDA!",
13881 __func__);
13882
13883 qdf_mem_free(filter_param);
13884 }
13885 return qdf_status;
13886}
13887
13888/**
13889 * sme_remove_beacon_filter() - set the beacon filter configuration
13890 * @hal: The handle returned by macOpen
13891 * @session_id: session id
13892 *
13893 * Return: Return QDF_STATUS, otherwise appropriate failure code
13894 */
13895QDF_STATUS sme_remove_beacon_filter(tHalHandle hal, uint32_t session_id)
13896{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013897 struct scheduler_msg message = {0};
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070013898 QDF_STATUS qdf_status;
13899 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
13900 struct beacon_filter_param *filter_param;
13901
13902 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013903 sme_err("CSR session not valid: %d", session_id);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070013904 return QDF_STATUS_E_FAILURE;
13905 }
13906
13907 filter_param = qdf_mem_malloc(sizeof(*filter_param));
Arif Hussain0ef77082018-10-10 16:42:53 -070013908 if (!filter_param)
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070013909 return QDF_STATUS_E_FAILURE;
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070013910
13911 filter_param->vdev_id = session_id;
13912
13913 message.type = WMA_REMOVE_BCN_FILTER_CMDID;
13914 message.bodyptr = filter_param;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013915 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
13916 QDF_MODULE_ID_WMA,
13917 QDF_MODULE_ID_WMA,
13918 &message);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070013919 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
13920 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13921 "%s: Not able to post msg to WDA!",
13922 __func__);
13923
13924 qdf_mem_free(filter_param);
13925 }
13926 return qdf_status;
13927}
Arun Khandavalli2476ef52016-04-26 20:19:43 +053013928
Arun Khandavalli2476ef52016-04-26 20:19:43 +053013929/**
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053013930 * sme_send_disassoc_req_frame - send disassoc req
13931 * @hal: handler to hal
13932 * @session_id: session id
13933 * @peer_mac: peer mac address
13934 * @reason: reason for disassociation
13935 * wait_for_ack: wait for acknowledgment
13936 *
13937 * function to send disassoc request to lim
13938 *
13939 * return: none
13940 */
13941void sme_send_disassoc_req_frame(tHalHandle hal, uint8_t session_id,
13942 uint8_t *peer_mac, uint16_t reason, uint8_t wait_for_ack)
13943{
13944 struct sme_send_disassoc_frm_req *msg;
13945 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
13946 A_UINT8 *buf;
13947 A_UINT16 tmp;
13948
13949 msg = qdf_mem_malloc(sizeof(struct sme_send_disassoc_frm_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070013950 if (!msg)
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053013951 return;
13952
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053013953 msg->msg_type = (uint16_t) eWNI_SME_SEND_DISASSOC_FRAME;
13954
13955 msg->length = (uint16_t) sizeof(struct sme_send_disassoc_frm_req);
13956
13957 buf = &msg->session_id;
13958
13959 /* session id */
13960 *buf = (A_UINT8) session_id;
13961 buf += sizeof(A_UINT8);
13962
13963 /* transaction id */
13964 *buf = 0;
13965 *(buf + 1) = 0;
13966 buf += sizeof(A_UINT16);
13967
13968 /* Set the peer MAC address before sending the message to LIM */
13969 qdf_mem_copy(buf, peer_mac, QDF_MAC_ADDR_SIZE);
13970
13971 buf += QDF_MAC_ADDR_SIZE;
13972
13973 /* reasoncode */
13974 tmp = (uint16_t) reason;
13975 qdf_mem_copy(buf, &tmp, sizeof(uint16_t));
13976 buf += sizeof(uint16_t);
13977
13978 *buf = wait_for_ack;
13979 buf += sizeof(uint8_t);
13980
Rajeev Kumard138ac52017-01-30 18:38:37 -080013981 qdf_status = umac_send_mb_message_to_mac(msg);
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053013982
13983 if (qdf_status != QDF_STATUS_SUCCESS)
13984 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13985 FL("cds_send_mb_message Failed"));
13986}
13987
Nachiket Kukade177b5b02018-05-22 20:52:17 +053013988#ifdef FEATURE_WLAN_APF
13989QDF_STATUS sme_get_apf_capabilities(tHalHandle hal,
13990 apf_get_offload_cb callback,
13991 void *context)
Arun Khandavalli2476ef52016-04-26 20:19:43 +053013992{
13993 QDF_STATUS status = QDF_STATUS_SUCCESS;
13994 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013995 struct scheduler_msg cds_msg = {0};
Arun Khandavalli2476ef52016-04-26 20:19:43 +053013996
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013997 SME_ENTER();
Arun Khandavalli2476ef52016-04-26 20:19:43 +053013998
13999 status = sme_acquire_global_lock(&mac_ctx->sme);
14000 if (QDF_STATUS_SUCCESS == status) {
14001 /* Serialize the req through MC thread */
Nachiket Kukadee547a482018-05-22 16:43:30 +053014002 mac_ctx->sme.apf_get_offload_cb = callback;
14003 mac_ctx->sme.apf_get_offload_context = context;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014004 cds_msg.bodyptr = NULL;
Nachiket Kukadee547a482018-05-22 16:43:30 +053014005 cds_msg.type = WDA_APF_GET_CAPABILITIES_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014006 status = scheduler_post_message(QDF_MODULE_ID_SME,
14007 QDF_MODULE_ID_WMA,
14008 QDF_MODULE_ID_WMA, &cds_msg);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014009 if (!QDF_IS_STATUS_SUCCESS(status)) {
14010 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Nachiket Kukadee547a482018-05-22 16:43:30 +053014011 FL("Post apf get offload msg fail"));
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014012 status = QDF_STATUS_E_FAILURE;
14013 }
14014 sme_release_global_lock(&mac_ctx->sme);
14015 } else {
14016 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14017 FL("sme_acquire_global_lock error"));
14018 }
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014019 SME_EXIT();
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014020 return status;
14021}
14022
Nachiket Kukadee547a482018-05-22 16:43:30 +053014023QDF_STATUS sme_set_apf_instructions(tHalHandle hal,
14024 struct sir_apf_set_offload *req)
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014025{
14026 QDF_STATUS status = QDF_STATUS_SUCCESS;
14027 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070014028 struct scheduler_msg cds_msg = {0};
Nachiket Kukadee547a482018-05-22 16:43:30 +053014029 struct sir_apf_set_offload *set_offload;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014030
Arun Khandavallica198b52016-04-26 20:53:35 +053014031 set_offload = qdf_mem_malloc(sizeof(*set_offload) +
14032 req->current_length);
Arif Hussain0ef77082018-10-10 16:42:53 -070014033 if (!set_offload)
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014034 return QDF_STATUS_E_NOMEM;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014035
14036 set_offload->session_id = req->session_id;
14037 set_offload->filter_id = req->filter_id;
14038 set_offload->current_offset = req->current_offset;
14039 set_offload->total_length = req->total_length;
Rajeev Kumare5a16822016-07-27 13:11:42 -070014040 set_offload->current_length = req->current_length;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014041 if (set_offload->total_length) {
Arun Khandavallica198b52016-04-26 20:53:35 +053014042 set_offload->program = ((uint8_t *)set_offload) +
14043 sizeof(*set_offload);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014044 qdf_mem_copy(set_offload->program, req->program,
14045 set_offload->current_length);
14046 }
14047 status = sme_acquire_global_lock(&mac_ctx->sme);
14048 if (QDF_STATUS_SUCCESS == status) {
14049 /* Serialize the req through MC thread */
14050 cds_msg.bodyptr = set_offload;
Nachiket Kukadee547a482018-05-22 16:43:30 +053014051 cds_msg.type = WDA_APF_SET_INSTRUCTIONS_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014052 status = scheduler_post_message(QDF_MODULE_ID_SME,
14053 QDF_MODULE_ID_WMA,
14054 QDF_MODULE_ID_WMA, &cds_msg);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014055
14056 if (!QDF_IS_STATUS_SUCCESS(status)) {
14057 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Nachiket Kukadee547a482018-05-22 16:43:30 +053014058 FL("Post APF set offload msg fail"));
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014059 status = QDF_STATUS_E_FAILURE;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014060 qdf_mem_free(set_offload);
14061 }
14062 sme_release_global_lock(&mac_ctx->sme);
14063 } else {
14064 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14065 FL("sme_acquire_global_lock failed"));
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014066 qdf_mem_free(set_offload);
14067 }
14068 return status;
14069}
14070
Nachiket Kukade177b5b02018-05-22 20:52:17 +053014071QDF_STATUS sme_set_apf_enable_disable(tHalHandle hal, uint8_t vdev_id,
14072 bool apf_enable)
14073{
14074 void *wma_handle;
14075
14076 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14077 if (!wma_handle) {
14078 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14079 "wma handle is NULL");
14080 return QDF_STATUS_E_FAILURE;
14081 }
14082
14083 return wma_send_apf_enable_cmd(wma_handle, vdev_id, apf_enable);
14084}
14085
14086QDF_STATUS
14087sme_apf_write_work_memory(tHalHandle hal,
14088 struct wmi_apf_write_memory_params *write_params)
14089{
14090 void *wma_handle;
14091
14092 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14093 if (!wma_handle) {
14094 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14095 "wma handle is NULL");
14096 return QDF_STATUS_E_FAILURE;
14097 }
14098
14099 return wma_send_apf_write_work_memory_cmd(wma_handle, write_params);
14100}
14101
14102QDF_STATUS
14103sme_apf_read_work_memory(tHalHandle hal,
14104 struct wmi_apf_read_memory_params *read_params,
14105 apf_read_mem_cb callback)
14106{
14107 QDF_STATUS status = QDF_STATUS_SUCCESS;
14108 tpAniSirGlobal mac = PMAC_STRUCT(hal);
14109 void *wma_handle;
14110
14111 status = sme_acquire_global_lock(&mac->sme);
14112 if (QDF_IS_STATUS_SUCCESS(status)) {
14113 mac->sme.apf_read_mem_cb = callback;
14114 sme_release_global_lock(&mac->sme);
14115 } else {
14116 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14117 FL("sme_acquire_global_lock failed"));
14118 }
14119
14120 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14121 if (!wma_handle) {
14122 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14123 "wma handle is NULL");
14124 return QDF_STATUS_E_FAILURE;
14125 }
14126
14127 return wma_send_apf_read_work_memory_cmd(wma_handle, read_params);
14128}
14129#endif /* FEATURE_WLAN_APF */
14130
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014131/**
Abhishek Singh1c676222016-05-09 14:20:28 +053014132 * sme_get_wni_dot11_mode() - return configured wni dot11mode
14133 * @hal: hal pointer
14134 *
14135 * Return: wni dot11 mode.
14136 */
14137uint32_t sme_get_wni_dot11_mode(tHalHandle hal)
14138{
14139 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
14140
14141 return csr_translate_to_wni_cfg_dot11_mode(mac_ctx,
14142 mac_ctx->roam.configParam.uCfgDot11Mode);
14143}
14144
14145/**
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070014146 * sme_create_mon_session() - post message to create PE session for monitormode
14147 * operation
14148 * @hal_handle: Handle to the HAL
14149 * @bssid: pointer to bssid
Rajeev Kumar Sirasanagandlae3b59912018-08-24 15:53:31 +053014150 * @vdev_id: sme session id
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070014151 *
14152 * Return: QDF_STATUS_SUCCESS on success, non-zero error code on failure.
14153 */
Rajeev Kumar Sirasanagandlae3b59912018-08-24 15:53:31 +053014154QDF_STATUS sme_create_mon_session(tHalHandle hal_handle, tSirMacAddr bss_id,
14155 uint8_t vdev_id)
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070014156{
14157 QDF_STATUS status = QDF_STATUS_E_FAILURE;
14158 struct sir_create_session *msg;
14159
14160 msg = qdf_mem_malloc(sizeof(*msg));
chenguo92af4bf2018-10-25 13:54:58 +080014161 if (msg) {
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070014162 msg->type = eWNI_SME_MON_INIT_SESSION;
Rajeev Kumar Sirasanagandlae3b59912018-08-24 15:53:31 +053014163 msg->vdev_id = vdev_id;
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070014164 msg->msg_len = sizeof(*msg);
14165 qdf_mem_copy(msg->bss_id.bytes, bss_id, QDF_MAC_ADDR_SIZE);
Rajeev Kumard138ac52017-01-30 18:38:37 -080014166 status = umac_send_mb_message_to_mac(msg);
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070014167 }
14168 return status;
14169}
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053014170
Kapil Gupta4f0c0c12017-02-07 15:21:15 +053014171void sme_set_chan_info_callback(tHalHandle hal_handle,
14172 void (*callback)(struct scan_chan_info *chan_info))
14173{
14174 tpAniSirGlobal mac;
14175
14176 if (hal_handle == NULL) {
14177 QDF_ASSERT(0);
14178 return;
14179 }
14180 mac = PMAC_STRUCT(hal_handle);
14181 mac->chan_info_cb = callback;
14182}
14183
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053014184/**
14185 * sme_set_adaptive_dwelltime_config() - Update Adaptive dwelltime configuration
14186 * @hal: The handle returned by macOpen
14187 * @params: adaptive_dwelltime_params config
14188 *
14189 * Return: QDF_STATUS if adaptive dwell time update
Jeff Johnson698eacd2018-05-12 17:00:03 -070014190 * configuration success else failure status
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053014191 */
14192QDF_STATUS sme_set_adaptive_dwelltime_config(tHalHandle hal,
14193 struct adaptive_dwelltime_params *params)
14194{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070014195 struct scheduler_msg message = {0};
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053014196 QDF_STATUS status;
14197 struct adaptive_dwelltime_params *dwelltime_params;
14198
14199 dwelltime_params = qdf_mem_malloc(sizeof(*dwelltime_params));
Arif Hussain0ef77082018-10-10 16:42:53 -070014200 if (!dwelltime_params)
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053014201 return QDF_STATUS_E_NOMEM;
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053014202
14203 dwelltime_params->is_enabled = params->is_enabled;
14204 dwelltime_params->dwelltime_mode = params->dwelltime_mode;
14205 dwelltime_params->lpf_weight = params->lpf_weight;
14206 dwelltime_params->passive_mon_intval = params->passive_mon_intval;
14207 dwelltime_params->wifi_act_threshold = params->wifi_act_threshold;
14208
14209 message.type = WMA_SET_ADAPT_DWELLTIME_CONF_PARAMS;
14210 message.bodyptr = dwelltime_params;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014211 status = scheduler_post_message(QDF_MODULE_ID_SME,
14212 QDF_MODULE_ID_WMA,
14213 QDF_MODULE_ID_WMA, &message);
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053014214 if (!QDF_IS_STATUS_SUCCESS(status)) {
14215 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14216 "%s: Not able to post msg to WMA!", __func__);
14217
14218 qdf_mem_free(dwelltime_params);
14219 }
14220 return status;
14221}
Naveen Rawata410c5a2016-09-19 14:22:33 -070014222
14223/**
14224 * sme_set_vdev_ies_per_band() - sends the per band IEs to vdev
14225 * @hal: Pointer to HAL
14226 * @vdev_id: vdev_id for which IE is targeted
14227 *
14228 * Return: None
14229 */
14230void sme_set_vdev_ies_per_band(tHalHandle hal, uint8_t vdev_id)
14231{
Naveen Rawata410c5a2016-09-19 14:22:33 -070014232 struct sir_set_vdev_ies_per_band *p_msg;
14233 QDF_STATUS status = QDF_STATUS_E_FAILURE;
14234
14235 p_msg = qdf_mem_malloc(sizeof(*p_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070014236 if (!p_msg)
Naveen Rawata410c5a2016-09-19 14:22:33 -070014237 return;
Naveen Rawata410c5a2016-09-19 14:22:33 -070014238
14239 p_msg->vdev_id = vdev_id;
14240 p_msg->msg_type = eWNI_SME_SET_VDEV_IES_PER_BAND;
14241 p_msg->len = sizeof(*p_msg);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014242 sme_debug("sending eWNI_SME_SET_VDEV_IES_PER_BAND: vdev_id: %d",
Naveen Rawata410c5a2016-09-19 14:22:33 -070014243 vdev_id);
Rajeev Kumard138ac52017-01-30 18:38:37 -080014244 status = umac_send_mb_message_to_mac(p_msg);
Naveen Rawata410c5a2016-09-19 14:22:33 -070014245 if (QDF_STATUS_SUCCESS != status)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014246 sme_err("Send eWNI_SME_SET_VDEV_IES_PER_BAND fail");
Naveen Rawata410c5a2016-09-19 14:22:33 -070014247}
14248
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070014249/**
14250 * sme_set_pdev_ht_vht_ies() - sends the set pdev IE req
14251 * @hal: Pointer to HAL
14252 * @enable2x2: 1x1 or 2x2 mode.
14253 *
14254 * Sends the set pdev IE req with Nss value.
14255 *
14256 * Return: None
14257 */
14258void sme_set_pdev_ht_vht_ies(tHalHandle hal, bool enable2x2)
14259{
14260 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
14261 struct sir_set_ht_vht_cfg *ht_vht_cfg;
14262 QDF_STATUS status = QDF_STATUS_E_FAILURE;
14263
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070014264 if (!((mac_ctx->roam.configParam.uCfgDot11Mode ==
14265 eCSR_CFG_DOT11_MODE_AUTO) ||
14266 (mac_ctx->roam.configParam.uCfgDot11Mode ==
14267 eCSR_CFG_DOT11_MODE_11N) ||
14268 (mac_ctx->roam.configParam.uCfgDot11Mode ==
14269 eCSR_CFG_DOT11_MODE_11N_ONLY) ||
14270 (mac_ctx->roam.configParam.uCfgDot11Mode ==
14271 eCSR_CFG_DOT11_MODE_11AC) ||
14272 (mac_ctx->roam.configParam.uCfgDot11Mode ==
14273 eCSR_CFG_DOT11_MODE_11AC_ONLY)))
14274 return;
14275
14276 status = sme_acquire_global_lock(&mac_ctx->sme);
14277 if (QDF_STATUS_SUCCESS == status) {
14278 ht_vht_cfg = qdf_mem_malloc(sizeof(*ht_vht_cfg));
Arif Hussain0ef77082018-10-10 16:42:53 -070014279 if (!ht_vht_cfg) {
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070014280 sme_release_global_lock(&mac_ctx->sme);
14281 return;
14282 }
14283
14284 ht_vht_cfg->pdev_id = 0;
14285 if (enable2x2)
14286 ht_vht_cfg->nss = 2;
14287 else
14288 ht_vht_cfg->nss = 1;
14289 ht_vht_cfg->dot11mode =
14290 (uint8_t)csr_translate_to_wni_cfg_dot11_mode(mac_ctx,
14291 mac_ctx->roam.configParam.uCfgDot11Mode);
14292
14293 ht_vht_cfg->msg_type = eWNI_SME_PDEV_SET_HT_VHT_IE;
14294 ht_vht_cfg->len = sizeof(*ht_vht_cfg);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014295 sme_debug("SET_HT_VHT_IE with nss: %d, dot11mode: %d",
14296 ht_vht_cfg->nss,
14297 ht_vht_cfg->dot11mode);
Rajeev Kumard138ac52017-01-30 18:38:37 -080014298 status = umac_send_mb_message_to_mac(ht_vht_cfg);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053014299 if (QDF_STATUS_SUCCESS != status)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014300 sme_err("Send SME_PDEV_SET_HT_VHT_IE fail");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053014301
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070014302 sme_release_global_lock(&mac_ctx->sme);
14303 }
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070014304}
14305
14306/**
14307 * sme_update_vdev_type_nss() - sets the nss per vdev type
14308 * @hal: Pointer to HAL
14309 * @max_supp_nss: max_supported Nss
14310 * @band: 5G or 2.4G band
14311 *
14312 * Sets the per band Nss for each vdev type based on INI and configured
14313 * chain mask value.
14314 *
14315 * Return: None
14316 */
14317void sme_update_vdev_type_nss(tHalHandle hal, uint8_t max_supp_nss,
Varun Reddy Yeturua48bc412017-11-17 15:33:35 -080014318 uint32_t vdev_type_nss, enum band_info band)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070014319{
14320 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
14321 struct vdev_type_nss *vdev_nss;
14322
Varun Reddy Yeturua48bc412017-11-17 15:33:35 -080014323 if (BAND_5G == band)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070014324 vdev_nss = &mac_ctx->vdev_type_nss_5g;
14325 else
14326 vdev_nss = &mac_ctx->vdev_type_nss_2g;
14327
14328 vdev_nss->sta = QDF_MIN(max_supp_nss, CFG_STA_NSS(vdev_type_nss));
14329 vdev_nss->sap = QDF_MIN(max_supp_nss, CFG_SAP_NSS(vdev_type_nss));
14330 vdev_nss->p2p_go = QDF_MIN(max_supp_nss,
14331 CFG_P2P_GO_NSS(vdev_type_nss));
14332 vdev_nss->p2p_cli = QDF_MIN(max_supp_nss,
14333 CFG_P2P_CLI_NSS(vdev_type_nss));
14334 vdev_nss->p2p_dev = QDF_MIN(max_supp_nss,
14335 CFG_P2P_DEV_NSS(vdev_type_nss));
14336 vdev_nss->ibss = QDF_MIN(max_supp_nss, CFG_IBSS_NSS(vdev_type_nss));
14337 vdev_nss->tdls = QDF_MIN(max_supp_nss, CFG_TDLS_NSS(vdev_type_nss));
14338 vdev_nss->ocb = QDF_MIN(max_supp_nss, CFG_OCB_NSS(vdev_type_nss));
14339
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014340 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 -070014341 band, vdev_nss->sta, vdev_nss->sap, vdev_nss->p2p_cli,
14342 vdev_nss->p2p_go, vdev_nss->p2p_dev, vdev_nss->ibss,
14343 vdev_nss->tdls, vdev_nss->ocb);
14344}
Peng Xu8fdaa492016-06-22 10:20:47 -070014345
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070014346#ifdef WLAN_FEATURE_11AX_BSS_COLOR
14347#define MAX_BSS_COLOR_VAL 63
14348#define MIN_BSS_COLOR_VAL 1
14349
14350QDF_STATUS sme_set_he_bss_color(tHalHandle hal, uint8_t session_id,
14351 uint8_t bss_color)
14352
14353{
14354 struct sir_set_he_bss_color *bss_color_msg;
14355 uint8_t len;
14356
14357 if (!hal) {
14358 sme_err("Invalid hal pointer");
14359 return QDF_STATUS_E_FAULT;
14360 }
14361
14362 sme_debug("Set HE bss_color %d", bss_color);
14363
14364 if (bss_color < MIN_BSS_COLOR_VAL || bss_color > MAX_BSS_COLOR_VAL) {
14365 sme_debug("Invalid HE bss_color %d", bss_color);
14366 return QDF_STATUS_E_INVAL;
14367 }
14368 len = sizeof(*bss_color_msg);
14369 bss_color_msg = qdf_mem_malloc(len);
Arif Hussain0ef77082018-10-10 16:42:53 -070014370 if (!bss_color_msg)
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070014371 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070014372
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070014373 bss_color_msg->message_type = eWNI_SME_SET_HE_BSS_COLOR;
14374 bss_color_msg->length = len;
14375 bss_color_msg->session_id = session_id;
14376 bss_color_msg->bss_color = bss_color;
14377 return umac_send_mb_message_to_mac(bss_color_msg);
14378}
14379#endif
14380
Peng Xu8fdaa492016-06-22 10:20:47 -070014381/**
Nitesh Shahdb5ea0d2017-03-22 15:17:47 +053014382 * sme_update_hw_dbs_capable() - sets the HW DBS capability
14383 * @hal: Pointer to HAL
14384 * @hw_dbs_capable: HW DBS capability
14385 *
14386 * Sets HW DBS capability based on INI and fw capability.
14387 *
14388 * Return: None
14389 */
14390void sme_update_hw_dbs_capable(tHalHandle hal, uint8_t hw_dbs_capable)
14391{
14392 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053014393
Nitesh Shahdb5ea0d2017-03-22 15:17:47 +053014394 mac_ctx->hw_dbs_capable = hw_dbs_capable;
14395}
14396
Rachit Kankane026e77a2018-07-31 16:21:09 +053014397#ifdef FEATURE_P2P_LISTEN_OFFLOAD
Nitesh Shahdb5ea0d2017-03-22 15:17:47 +053014398/**
Peng Xu8fdaa492016-06-22 10:20:47 -070014399 * sme_register_p2p_lo_event() - Register for the p2p lo event
14400 * @hHal: reference to the HAL
14401 * @context: the context of the call
14402 * @callback: the callback to hdd
14403 *
14404 * This function registers the callback function for P2P listen
14405 * offload stop event.
14406 *
14407 * Return: none
14408 */
14409void sme_register_p2p_lo_event(tHalHandle hHal, void *context,
Jeff Johnsonf7e36d62018-07-04 21:14:02 -070014410 p2p_lo_callback callback)
Peng Xu8fdaa492016-06-22 10:20:47 -070014411{
14412 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14413 QDF_STATUS status = QDF_STATUS_E_FAILURE;
14414
14415 status = sme_acquire_global_lock(&pMac->sme);
14416 pMac->sme.p2p_lo_event_callback = callback;
14417 pMac->sme.p2p_lo_event_context = context;
14418 sme_release_global_lock(&pMac->sme);
14419}
Rachit Kankane026e77a2018-07-31 16:21:09 +053014420#endif
Manjeet Singhf82ed072016-07-08 11:40:00 +053014421
14422/**
14423 * sme_process_mac_pwr_dbg_cmd() - enable mac pwr debugging
14424 * @hal: The handle returned by macOpen
14425 * @session_id: session id
14426 * @dbg_args: args for mac pwr debug command
14427 * Return: Return QDF_STATUS, otherwise appropriate failure code
14428 */
14429QDF_STATUS sme_process_mac_pwr_dbg_cmd(tHalHandle hal, uint32_t session_id,
14430 struct sir_mac_pwr_dbg_cmd*
14431 dbg_args)
14432{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070014433 struct scheduler_msg message = {0};
Manjeet Singhf82ed072016-07-08 11:40:00 +053014434 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
14435 struct sir_mac_pwr_dbg_cmd *req;
14436 int i;
14437
14438 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014439 sme_err("CSR session not valid: %d", session_id);
Manjeet Singhf82ed072016-07-08 11:40:00 +053014440 return QDF_STATUS_E_FAILURE;
14441 }
14442
14443 req = qdf_mem_malloc(sizeof(*req));
Arif Hussain0ef77082018-10-10 16:42:53 -070014444 if (!req)
Manjeet Singhf82ed072016-07-08 11:40:00 +053014445 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -070014446
Manjeet Singhf82ed072016-07-08 11:40:00 +053014447 req->module_id = dbg_args->module_id;
14448 req->pdev_id = dbg_args->pdev_id;
14449 req->num_args = dbg_args->num_args;
14450 for (i = 0; i < req->num_args; i++)
14451 req->args[i] = dbg_args->args[i];
14452
14453 message.type = SIR_HAL_POWER_DBG_CMD;
14454 message.bodyptr = req;
14455
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014456 if (!QDF_IS_STATUS_SUCCESS(scheduler_post_message(QDF_MODULE_ID_SME,
14457 QDF_MODULE_ID_WMA,
14458 QDF_MODULE_ID_WMA,
14459 &message))) {
Manjeet Singhf82ed072016-07-08 11:40:00 +053014460 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14461 "%s: Not able to post msg to WDA!",
14462 __func__);
14463 qdf_mem_free(req);
14464 }
14465 return QDF_STATUS_SUCCESS;
14466}
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070014467/**
14468 * sme_get_vdev_type_nss() - gets the nss per vdev type
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070014469 * @dev_mode: connection type.
14470 * @nss2g: Pointer to the 2G Nss parameter.
14471 * @nss5g: Pointer to the 5G Nss parameter.
14472 *
14473 * Fills the 2G and 5G Nss values based on connection type.
14474 *
14475 * Return: None
14476 */
Jeff Johnsonc1e62782017-11-09 09:50:17 -080014477void sme_get_vdev_type_nss(enum QDF_OPMODE dev_mode,
14478 uint8_t *nss_2g, uint8_t *nss_5g)
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070014479{
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080014480 tpAniSirGlobal mac_ctx = sme_get_mac_context();
14481
14482 if (NULL == mac_ctx) {
14483 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14484 FL("Invalid MAC context"));
14485 return;
14486 }
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070014487 csr_get_vdev_type_nss(mac_ctx, dev_mode, nss_2g, nss_5g);
14488}
Agrawal Ashish21ba2572016-09-03 16:40:10 +053014489
14490/**
14491 * sme_update_sta_roam_policy() - update sta roam policy for
14492 * unsafe and DFS channels.
14493 * @hal_handle: hal handle for getting global mac struct
14494 * @dfs_mode: dfs mode which tell if dfs channel needs to be
14495 * skipped or not
14496 * @skip_unsafe_channels: Param to tell if driver needs to
14497 * skip unsafe channels or not.
14498 * @param session_id: sme_session_id
Agrawal, Ashish9f84c402016-11-30 16:19:44 +053014499 * @sap_operating_band: Band on which SAP is operating
Agrawal Ashish21ba2572016-09-03 16:40:10 +053014500 *
14501 * sme_update_sta_roam_policy update sta rome policies to csr
14502 * this function will call csrUpdateChannelList as well
14503 * to include/exclude DFS channels and unsafe channels.
14504 *
14505 * Return: eHAL_STATUS_SUCCESS or non-zero on failure.
14506 */
14507QDF_STATUS sme_update_sta_roam_policy(tHalHandle hal_handle,
14508 enum sta_roam_policy_dfs_mode dfs_mode,
14509 bool skip_unsafe_channels,
Agrawal, Ashish9f84c402016-11-30 16:19:44 +053014510 uint8_t session_id, uint8_t sap_operating_band)
Agrawal Ashish21ba2572016-09-03 16:40:10 +053014511{
14512 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
14513 QDF_STATUS status = QDF_STATUS_SUCCESS;
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053014514 tSmeConfigParams *sme_config;
Agrawal Ashish21ba2572016-09-03 16:40:10 +053014515
14516 if (!mac_ctx) {
14517 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
14518 "%s: mac_ctx is null", __func__);
14519 return QDF_STATUS_E_FAILURE;
14520 }
Agrawal Ashish21ba2572016-09-03 16:40:10 +053014521
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053014522 sme_config = qdf_mem_malloc(sizeof(*sme_config));
Arif Hussain0ef77082018-10-10 16:42:53 -070014523 if (!sme_config)
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053014524 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -070014525
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053014526 qdf_mem_zero(sme_config, sizeof(*sme_config));
14527 sme_get_config_param(hal_handle, sme_config);
14528
14529 sme_config->csrConfig.sta_roam_policy_params.dfs_mode =
Agrawal Ashish21ba2572016-09-03 16:40:10 +053014530 dfs_mode;
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053014531 sme_config->csrConfig.sta_roam_policy_params.skip_unsafe_channels =
Agrawal Ashish21ba2572016-09-03 16:40:10 +053014532 skip_unsafe_channels;
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053014533 sme_config->csrConfig.sta_roam_policy_params.sap_operating_band =
Agrawal, Ashish9f84c402016-11-30 16:19:44 +053014534 sap_operating_band;
Agrawal Ashish21ba2572016-09-03 16:40:10 +053014535
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053014536 sme_update_config(hal_handle, sme_config);
Agrawal Ashish21ba2572016-09-03 16:40:10 +053014537
14538 status = csr_update_channel_list(mac_ctx);
14539 if (QDF_STATUS_SUCCESS != status) {
14540 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14541 FL("failed to update the supported channel list"));
14542 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053014543
14544 if (mac_ctx->roam.configParam.isRoamOffloadScanEnabled) {
14545 status = sme_acquire_global_lock(&mac_ctx->sme);
14546 if (QDF_IS_STATUS_SUCCESS(status)) {
14547 csr_roam_offload_scan(mac_ctx, session_id,
Agrawal Ashish21ba2572016-09-03 16:40:10 +053014548 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
14549 REASON_ROAM_SCAN_STA_ROAM_POLICY_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053014550 sme_release_global_lock(&mac_ctx->sme);
14551 } else {
14552 sme_err("Failed to acquire SME lock");
14553 }
14554 }
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053014555 qdf_mem_free(sme_config);
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053014556 return status;
14557}
14558
14559/**
14560 * sme_enable_disable_chanavoidind_event - configure ca event ind
14561 * @hal: handler to hal
14562 * @set_value: enable/disable
14563 *
14564 * function to enable/disable chan avoidance indication
14565 *
14566 * Return: QDF_STATUS
14567 */
14568QDF_STATUS sme_enable_disable_chanavoidind_event(tHalHandle hal,
14569 uint8_t set_value)
14570{
14571 QDF_STATUS status;
14572 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070014573 struct scheduler_msg msg = {0};
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053014574
Vignesh Viswanathana1f3a1a2018-10-04 13:10:46 +053014575 if (!mac_ctx->mlme_cfg->gen.optimize_ca_event) {
14576 sme_err("optimize_ca_event not enabled in ini");
14577 return QDF_STATUS_E_NOSUPPORT;
14578 }
14579
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014580 sme_debug("set_value: %d", set_value);
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053014581 status = sme_acquire_global_lock(&mac_ctx->sme);
14582 if (QDF_STATUS_SUCCESS == status) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080014583 qdf_mem_zero(&msg, sizeof(struct scheduler_msg));
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053014584 msg.type = WMA_SEND_FREQ_RANGE_CONTROL_IND;
14585 msg.bodyval = set_value;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014586 status = scheduler_post_message(QDF_MODULE_ID_SME,
14587 QDF_MODULE_ID_WMA,
14588 QDF_MODULE_ID_WMA, &msg);
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053014589 sme_release_global_lock(&mac_ctx->sme);
14590 return status;
14591 }
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053014592 return status;
14593}
Agrawal Ashish21ba2572016-09-03 16:40:10 +053014594
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053014595/*
14596 * sme_set_default_scan_ie() - API to send default scan IE to LIM
14597 * @hal: reference to the HAL
14598 * @session_id: current session ID
14599 * @ie_data: Pointer to Scan IE data
14600 * @ie_len: Length of @ie_data
14601 *
14602 * Return: QDF_STATUS
14603 */
14604QDF_STATUS sme_set_default_scan_ie(tHalHandle hal, uint16_t session_id,
14605 uint8_t *ie_data, uint16_t ie_len)
14606{
14607 QDF_STATUS status;
14608 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
14609 struct hdd_default_scan_ie *set_ie_params;
14610
Rajeev Kumar5d17dd52017-12-19 16:17:42 -080014611 if (!ie_data)
14612 return QDF_STATUS_E_INVAL;
14613
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053014614 status = sme_acquire_global_lock(&mac_ctx->sme);
14615 if (QDF_IS_STATUS_SUCCESS(status)) {
14616 set_ie_params = qdf_mem_malloc(sizeof(*set_ie_params));
14617 if (!set_ie_params)
14618 status = QDF_STATUS_E_NOMEM;
14619 else {
14620 set_ie_params->message_type = eWNI_SME_DEFAULT_SCAN_IE;
14621 set_ie_params->length = sizeof(*set_ie_params);
14622 set_ie_params->session_id = session_id;
14623 set_ie_params->ie_len = ie_len;
14624 qdf_mem_copy(set_ie_params->ie_data, ie_data, ie_len);
Rajeev Kumard138ac52017-01-30 18:38:37 -080014625 status = umac_send_mb_message_to_mac(set_ie_params);
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053014626 }
14627 sme_release_global_lock(&mac_ctx->sme);
14628 }
Agrawal Ashish21ba2572016-09-03 16:40:10 +053014629 return status;
14630}
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053014631
Jeff Johnsonf0e54b02017-12-18 15:22:25 -080014632QDF_STATUS sme_get_sar_power_limits(tHalHandle hal,
14633 wma_sar_cb callback, void *context)
14634{
14635 void *wma_handle;
14636
14637 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14638 if (!wma_handle) {
14639 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14640 "wma handle is NULL");
14641 return QDF_STATUS_E_FAILURE;
14642 }
14643
14644 return wma_get_sar_limit(wma_handle, callback, context);
14645}
14646
Kabilan Kannan3c0a7352016-12-02 18:49:38 -080014647QDF_STATUS sme_set_sar_power_limits(tHalHandle hal,
14648 struct sar_limit_cmd_params *sar_limit_cmd)
14649{
14650 void *wma_handle;
14651
14652 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14653 if (!wma_handle) {
14654 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14655 "wma handle is NULL");
14656 return QDF_STATUS_E_FAILURE;
14657 }
14658
14659 return wma_set_sar_limit(wma_handle, sar_limit_cmd);
14660}
14661
Dundi Raviteja3b637092018-09-12 13:42:50 +053014662QDF_STATUS sme_send_coex_config_cmd(struct coex_config_params *coex_cfg_params)
14663{
14664 void *wma_handle;
14665
14666 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14667 if (!wma_handle) {
14668 sme_err("wma handle is NULL");
14669 return QDF_STATUS_E_FAILURE;
14670 }
14671 return wma_send_coex_config_cmd(wma_handle, coex_cfg_params);
14672}
14673
Jeff Johnson6136fb92017-03-30 15:21:49 -070014674#ifdef WLAN_FEATURE_FIPS
14675QDF_STATUS sme_fips_request(tHalHandle hal, struct fips_params *param,
14676 wma_fips_cb callback, void *context)
14677{
14678 void *wma_handle;
14679
14680 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14681 if (!wma_handle) {
14682 sme_err("wma handle is NULL");
14683 return QDF_STATUS_E_FAILURE;
14684 }
14685
14686 return wma_fips_request(wma_handle, param, callback, context);
14687}
14688#endif
14689
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053014690QDF_STATUS sme_set_cts2self_for_p2p_go(tHalHandle hal_handle)
14691{
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053014692 void *wma_handle;
14693
14694 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14695 if (!wma_handle) {
14696 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14697 "wma_handle is NULL");
14698 return QDF_STATUS_E_FAILURE;
14699 }
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053014700 if (QDF_STATUS_SUCCESS !=
14701 wma_set_cts2self_for_p2p_go(wma_handle, true)) {
14702 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14703 "%s: Failed to set cts2self for p2p GO to firmware",
14704 __func__);
14705 return QDF_STATUS_E_FAILURE;
14706 }
14707 return QDF_STATUS_SUCCESS;
14708}
Yingying Tang95409972016-10-20 15:16:15 +080014709
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053014710/**
14711 * sme_update_tx_fail_cnt_threshold() - update tx fail count Threshold
14712 * @hal: Handle returned by mac_open
14713 * @session_id: Session ID on which tx fail count needs to be updated to FW
14714 * @tx_fail_count: Count for tx fail threshold after which FW will disconnect
14715 *
14716 * This function is used to set tx fail count threshold to firmware.
14717 * firmware will issue disocnnect with peer device once this threshold is
14718 * reached.
14719 *
14720 * Return: Return QDF_STATUS, otherwise appropriate failure code
14721 */
14722QDF_STATUS sme_update_tx_fail_cnt_threshold(tHalHandle hal_handle,
14723 uint8_t session_id, uint32_t tx_fail_count)
14724{
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053014725 QDF_STATUS status = QDF_STATUS_E_FAILURE;
14726 struct sme_tx_fail_cnt_threshold *tx_fail_cnt;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070014727 struct scheduler_msg msg = {0};
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053014728
14729 tx_fail_cnt = qdf_mem_malloc(sizeof(*tx_fail_cnt));
Arif Hussain0ef77082018-10-10 16:42:53 -070014730 if (!tx_fail_cnt)
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053014731 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -070014732
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014733 sme_debug("session_id: %d tx_fail_count: %d",
14734 session_id, tx_fail_count);
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053014735 tx_fail_cnt->session_id = session_id;
14736 tx_fail_cnt->tx_fail_cnt_threshold = tx_fail_count;
14737
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080014738 qdf_mem_zero(&msg, sizeof(struct scheduler_msg));
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053014739 msg.type = SIR_HAL_UPDATE_TX_FAIL_CNT_TH;
14740 msg.reserved = 0;
14741 msg.bodyptr = tx_fail_cnt;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014742 status = scheduler_post_message(QDF_MODULE_ID_SME,
14743 QDF_MODULE_ID_WMA,
14744 QDF_MODULE_ID_WMA, &msg);
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053014745
14746 if (!QDF_IS_STATUS_SUCCESS(status)) {
14747 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053014748 FL("Not able to post Tx fail count message to WDA"));
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053014749 qdf_mem_free(tx_fail_cnt);
14750 }
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053014751 return status;
14752}
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053014753
Jeff Johnsondc198ec2018-07-04 17:39:53 -070014754QDF_STATUS sme_set_lost_link_info_cb(mac_handle_t mac_handle,
14755 lost_link_info_cb cb)
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053014756{
Jeff Johnsondc198ec2018-07-04 17:39:53 -070014757 QDF_STATUS status;
14758 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053014759
14760 status = sme_acquire_global_lock(&mac->sme);
14761 if (QDF_IS_STATUS_SUCCESS(status)) {
14762 mac->sme.lost_link_info_cb = cb;
14763 sme_release_global_lock(&mac->sme);
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053014764 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053014765 sme_err("sme_acquire_global_lock error status: %d", status);
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053014766 }
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053014767
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053014768 return status;
14769}
Yingying Tang95409972016-10-20 15:16:15 +080014770
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053014771#ifdef FEATURE_WLAN_ESE
Jeff Johnson172237b2017-11-07 15:32:59 -080014772bool sme_roam_is_ese_assoc(struct csr_roam_info *roam_info)
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053014773{
14774 return roam_info->isESEAssoc;
14775}
Manjeet Singh2f785062017-03-08 18:14:18 +053014776#endif
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053014777
14778bool sme_neighbor_roam_is11r_assoc(tHalHandle hal_ctx, uint8_t session_id)
14779{
14780 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_ctx);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053014781
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053014782 return csr_neighbor_roam_is11r_assoc(mac_ctx, session_id);
14783}
Yingying Tang95409972016-10-20 15:16:15 +080014784
14785#ifdef WLAN_FEATURE_WOW_PULSE
14786/**
14787 * sme_set_wow_pulse() - set wow pulse info
14788 * @wow_pulse_set_info: wow_pulse_mode structure pointer
14789 *
14790 * Return: QDF_STATUS
14791 */
14792QDF_STATUS sme_set_wow_pulse(struct wow_pulse_mode *wow_pulse_set_info)
14793{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070014794 struct scheduler_msg message = {0};
Yingying Tang95409972016-10-20 15:16:15 +080014795 QDF_STATUS status;
14796 struct wow_pulse_mode *wow_pulse_set_cmd;
14797
14798 if (!wow_pulse_set_info) {
14799 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14800 "%s: invalid wow_pulse_set_info pointer", __func__);
14801 return QDF_STATUS_E_FAILURE;
14802 }
14803
14804 wow_pulse_set_cmd = qdf_mem_malloc(sizeof(*wow_pulse_set_cmd));
Arif Hussain0ef77082018-10-10 16:42:53 -070014805 if (!wow_pulse_set_cmd)
Yingying Tang95409972016-10-20 15:16:15 +080014806 return QDF_STATUS_E_NOMEM;
Yingying Tang95409972016-10-20 15:16:15 +080014807
14808 *wow_pulse_set_cmd = *wow_pulse_set_info;
14809
14810 message.type = WMA_SET_WOW_PULSE_CMD;
14811 message.bodyptr = wow_pulse_set_cmd;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014812 status = scheduler_post_message(QDF_MODULE_ID_SME,
14813 QDF_MODULE_ID_WMA,
14814 QDF_MODULE_ID_WMA,
Yingying Tang95409972016-10-20 15:16:15 +080014815 &message);
14816 if (!QDF_IS_STATUS_SUCCESS(status)) {
14817 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14818 "%s: Not able to post msg to WDA!",
14819 __func__);
14820 qdf_mem_free(wow_pulse_set_cmd);
14821 status = QDF_STATUS_E_FAILURE;
14822 }
14823
14824 return status;
14825}
14826#endif
Naveen Rawat664a7cb2017-01-19 17:58:14 -080014827
14828/**
14829 * sme_prepare_beacon_from_bss_descp() - prepares beacon frame by populating
14830 * different fields and IEs from bss descriptor.
14831 * @frame_buf: frame buffer to populate
14832 * @bss_descp: bss descriptor
14833 * @bssid: bssid of the beacon frame to populate
14834 * @ie_len: length of IE fields
14835 *
14836 * Return: None
14837 */
14838static void sme_prepare_beacon_from_bss_descp(uint8_t *frame_buf,
14839 tSirBssDescription *bss_descp,
14840 const tSirMacAddr bssid,
Naveen Rawat6dabf4e2017-02-08 15:55:49 -080014841 uint32_t ie_len)
Naveen Rawat664a7cb2017-01-19 17:58:14 -080014842{
14843 tDot11fBeacon1 *bcn_fixed;
14844 tpSirMacMgmtHdr mac_hdr = (tpSirMacMgmtHdr)frame_buf;
14845
14846 /* populate mac header first to indicate beacon */
14847 mac_hdr->fc.protVer = SIR_MAC_PROTOCOL_VERSION;
14848 mac_hdr->fc.type = SIR_MAC_MGMT_FRAME;
14849 mac_hdr->fc.subType = SIR_MAC_MGMT_BEACON;
14850 qdf_mem_copy((uint8_t *) mac_hdr->da,
14851 (uint8_t *) "\xFF\xFF\xFF\xFF\xFF\xFF",
14852 sizeof(struct qdf_mac_addr));
14853 qdf_mem_copy((uint8_t *) mac_hdr->sa, bssid,
14854 sizeof(struct qdf_mac_addr));
14855 qdf_mem_copy((uint8_t *) mac_hdr->bssId, bssid,
14856 sizeof(struct qdf_mac_addr));
14857
14858 /* now populate fixed params */
14859 bcn_fixed = (tDot11fBeacon1 *)(frame_buf + SIR_MAC_HDR_LEN_3A);
14860 /* populate timestamp */
14861 qdf_mem_copy(&bcn_fixed->TimeStamp.timestamp, &bss_descp->timeStamp,
14862 sizeof(bss_descp->timeStamp));
14863 /* populate beacon interval */
14864 bcn_fixed->BeaconInterval.interval = bss_descp->beaconInterval;
14865 /* populate capability */
14866 qdf_mem_copy(&bcn_fixed->Capabilities, &bss_descp->capabilityInfo,
14867 sizeof(bss_descp->capabilityInfo));
14868
14869 /* copy IEs now */
14870 qdf_mem_copy(frame_buf + SIR_MAC_HDR_LEN_3A
14871 + SIR_MAC_B_PR_SSID_OFFSET,
14872 &bss_descp->ieFields, ie_len);
14873}
14874
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053014875QDF_STATUS sme_get_rssi_snr_by_bssid(tHalHandle hal,
Jeff Johnson66ee8a92018-03-17 15:24:26 -070014876 struct csr_roam_profile *profile,
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053014877 const uint8_t *bssid,
14878 int8_t *rssi, int8_t *snr)
14879{
14880 tSirBssDescription *bss_descp;
14881 tCsrScanResultFilter *scan_filter;
14882 struct scan_result_list *bss_list;
14883 tScanResultHandle result_handle = NULL;
14884 QDF_STATUS status = QDF_STATUS_SUCCESS;
14885 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
14886
14887 scan_filter = qdf_mem_malloc(sizeof(tCsrScanResultFilter));
Arif Hussain0ef77082018-10-10 16:42:53 -070014888 if (!scan_filter) {
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053014889 status = QDF_STATUS_E_NOMEM;
14890 goto free_scan_flter;
14891 }
14892
14893 status = csr_roam_prepare_filter_from_profile(mac_ctx,
14894 profile, scan_filter);
14895 if (QDF_STATUS_SUCCESS != status) {
14896 sme_err("prepare_filter failed");
14897 goto free_scan_flter;
14898 }
14899
14900 /* update filter to get scan result with just target BSSID */
14901 if (NULL == scan_filter->BSSIDs.bssid) {
14902 scan_filter->BSSIDs.bssid =
14903 qdf_mem_malloc(sizeof(struct qdf_mac_addr));
Arif Hussain0ef77082018-10-10 16:42:53 -070014904 if (!scan_filter->BSSIDs.bssid) {
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053014905 status = QDF_STATUS_E_NOMEM;
14906 goto free_scan_flter;
14907 }
14908 }
14909
14910 scan_filter->BSSIDs.numOfBSSIDs = 1;
14911 qdf_mem_copy(scan_filter->BSSIDs.bssid[0].bytes,
14912 bssid, sizeof(struct qdf_mac_addr));
14913
14914 status = csr_scan_get_result(mac_ctx, scan_filter, &result_handle);
14915 if (QDF_STATUS_SUCCESS != status) {
14916 sme_err("parse_scan_result failed");
14917 goto free_scan_flter;
14918 }
14919
14920 bss_list = (struct scan_result_list *)result_handle;
14921 bss_descp = csr_get_fst_bssdescr_ptr(bss_list);
14922 if (!bss_descp) {
14923 sme_err("unable to fetch bss descriptor");
14924 status = QDF_STATUS_E_FAULT;
14925 goto free_scan_flter;
14926 }
14927
14928 sme_debug("snr: %d, rssi: %d, raw_rssi: %d",
14929 bss_descp->sinr, bss_descp->rssi, bss_descp->rssi_raw);
14930
14931 if (rssi)
14932 *rssi = bss_descp->rssi;
14933 if (snr)
14934 *snr = bss_descp->sinr;
14935
14936free_scan_flter:
14937 /* free scan filter and exit */
14938 if (scan_filter) {
14939 csr_free_scan_filter(mac_ctx, scan_filter);
14940 qdf_mem_free(scan_filter);
14941 }
14942
14943 if (result_handle)
14944 csr_scan_result_purge(mac_ctx, result_handle);
14945
14946 return status;
14947}
14948
Jeff Johnson66ee8a92018-03-17 15:24:26 -070014949QDF_STATUS sme_get_beacon_frm(tHalHandle hal, struct csr_roam_profile *profile,
14950 const tSirMacAddr bssid,
14951 uint8_t **frame_buf, uint32_t *frame_len,
14952 int *channel)
Naveen Rawat664a7cb2017-01-19 17:58:14 -080014953{
14954 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawat56b4de82017-02-17 14:38:49 -080014955 tScanResultHandle result_handle = NULL;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080014956 tCsrScanResultFilter *scan_filter;
14957 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
14958 tSirBssDescription *bss_descp;
Yeshwanth Sriram Guntuka36c09902017-09-26 11:34:26 +053014959 struct scan_result_list *bss_list;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080014960 uint32_t ie_len;
14961
14962 scan_filter = qdf_mem_malloc(sizeof(tCsrScanResultFilter));
Arif Hussain0ef77082018-10-10 16:42:53 -070014963 if (!scan_filter) {
Naveen Rawat664a7cb2017-01-19 17:58:14 -080014964 status = QDF_STATUS_E_NOMEM;
14965 goto free_scan_flter;
14966 }
14967 status = csr_roam_prepare_filter_from_profile(mac_ctx,
14968 profile, scan_filter);
14969 if (QDF_IS_STATUS_ERROR(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014970 sme_err("prepare_filter failed");
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053014971 status = QDF_STATUS_E_FAULT;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080014972 goto free_scan_flter;
14973 }
14974
14975 /* update filter to get scan result with just target BSSID */
14976 if (NULL == scan_filter->BSSIDs.bssid) {
14977 scan_filter->BSSIDs.bssid =
14978 qdf_mem_malloc(sizeof(struct qdf_mac_addr));
Arif Hussain0ef77082018-10-10 16:42:53 -070014979 if (!scan_filter->BSSIDs.bssid) {
Naveen Rawat664a7cb2017-01-19 17:58:14 -080014980 status = QDF_STATUS_E_NOMEM;
14981 goto free_scan_flter;
14982 }
14983 }
14984 scan_filter->BSSIDs.numOfBSSIDs = 1;
14985 qdf_mem_copy(scan_filter->BSSIDs.bssid[0].bytes,
14986 bssid, sizeof(struct qdf_mac_addr));
14987
14988 status = csr_scan_get_result(mac_ctx, scan_filter, &result_handle);
14989 if (QDF_STATUS_SUCCESS != status) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014990 sme_err("parse_scan_result failed");
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053014991 status = QDF_STATUS_E_FAULT;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080014992 goto free_scan_flter;
14993 }
14994
Yeshwanth Sriram Guntuka36c09902017-09-26 11:34:26 +053014995 bss_list = (struct scan_result_list *)result_handle;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080014996 bss_descp = csr_get_fst_bssdescr_ptr(bss_list);
Naveen Rawatae0aaa82017-02-17 14:41:19 -080014997 if (!bss_descp) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -070014998 sme_err("unable to fetch bss descriptor");
Naveen Rawatae0aaa82017-02-17 14:41:19 -080014999 status = QDF_STATUS_E_FAULT;
15000 goto free_scan_flter;
15001 }
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015002
Naveen Rawat81f058c2017-06-02 16:02:39 -070015003 /**
15004 * Length of BSS descriptor is without length of
15005 * length itself and length of pointer that holds ieFields.
15006 *
15007 * tSirBssDescription
15008 * +--------+---------------------------------+---------------+
15009 * | length | other fields | pointer to IEs|
15010 * +--------+---------------------------------+---------------+
15011 * ^
15012 * ieFields
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015013 */
Naveen Rawat81f058c2017-06-02 16:02:39 -070015014 ie_len = bss_descp->length + sizeof(bss_descp->length)
15015 - (uint16_t)(offsetof(tSirBssDescription, ieFields[0]));
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053015016 sme_debug("found bss_descriptor ie_len: %d channel %d",
15017 ie_len, bss_descp->channelId);
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015018
15019 /* include mac header and fixed params along with IEs in frame */
15020 *frame_len = SIR_MAC_HDR_LEN_3A + SIR_MAC_B_PR_SSID_OFFSET + ie_len;
15021 *frame_buf = qdf_mem_malloc(*frame_len);
Arif Hussain0ef77082018-10-10 16:42:53 -070015022 if (!*frame_buf) {
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015023 status = QDF_STATUS_E_NOMEM;
15024 goto free_scan_flter;
15025 }
15026
15027 sme_prepare_beacon_from_bss_descp(*frame_buf, bss_descp, bssid, ie_len);
15028
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053015029 if (!*channel)
15030 *channel = bss_descp->channelId;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015031free_scan_flter:
15032 /* free scan filter and exit */
15033 if (scan_filter) {
15034 csr_free_scan_filter(mac_ctx, scan_filter);
15035 qdf_mem_free(scan_filter);
15036 }
Arif Hussainfdb25e22017-02-05 17:38:16 -080015037 if (result_handle)
15038 csr_scan_result_purge(mac_ctx, result_handle);
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015039
Naveen Rawatae0aaa82017-02-17 14:41:19 -080015040 return status;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015041}
15042
Paul Zhangc3fc0a82018-01-09 16:38:20 +080015043#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Jeff Johnson66ee8a92018-03-17 15:24:26 -070015044QDF_STATUS sme_fast_reassoc(tHalHandle hal, struct csr_roam_profile *profile,
Naveen Rawat4195c5e2017-05-22 17:07:45 -070015045 const tSirMacAddr bssid, int channel,
Krunal Soni332f4af2017-06-01 14:36:17 -070015046 uint8_t vdev_id, const tSirMacAddr connected_bssid)
Naveen Rawat4195c5e2017-05-22 17:07:45 -070015047{
15048 QDF_STATUS status;
15049 struct wma_roam_invoke_cmd *fastreassoc;
15050 struct scheduler_msg msg = {0};
Padma, Santhosh Kumar5bc0c242017-11-29 15:44:27 +053015051 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Abhinav Kumareab25932018-07-13 11:48:43 +053015052 struct csr_roam_session *session;
15053 struct csr_roam_profile *roam_profile;
Naveen Rawat4195c5e2017-05-22 17:07:45 -070015054
Abhinav Kumareab25932018-07-13 11:48:43 +053015055 session = CSR_GET_SESSION(mac_ctx, vdev_id);
15056 if (!session || !session->pCurRoamProfile) {
15057 sme_err("session %d not found", vdev_id);
15058 return QDF_STATUS_E_FAILURE;
15059 }
15060
15061 roam_profile = session->pCurRoamProfile;
15062 if (roam_profile->supplicant_disabled_roaming ||
15063 roam_profile->driver_disabled_roaming) {
15064 sme_debug("roaming status in Supplicant %d and in driver %d",
15065 roam_profile->supplicant_disabled_roaming,
15066 roam_profile->driver_disabled_roaming);
15067 return QDF_STATUS_E_FAILURE;
15068 }
Naveen Rawat4195c5e2017-05-22 17:07:45 -070015069 fastreassoc = qdf_mem_malloc(sizeof(*fastreassoc));
Arif Hussain0ef77082018-10-10 16:42:53 -070015070 if (!fastreassoc)
Naveen Rawat4195c5e2017-05-22 17:07:45 -070015071 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070015072
Krunal Soni332f4af2017-06-01 14:36:17 -070015073 /* if both are same then set the flag */
15074 if (!qdf_mem_cmp(connected_bssid, bssid, ETH_ALEN)) {
15075 fastreassoc->is_same_bssid = true;
15076 sme_debug("bssid same, bssid[%pM]", bssid);
15077 }
Naveen Rawat4195c5e2017-05-22 17:07:45 -070015078 fastreassoc->vdev_id = vdev_id;
Naveen Rawat4195c5e2017-05-22 17:07:45 -070015079 fastreassoc->bssid[0] = bssid[0];
15080 fastreassoc->bssid[1] = bssid[1];
15081 fastreassoc->bssid[2] = bssid[2];
15082 fastreassoc->bssid[3] = bssid[3];
15083 fastreassoc->bssid[4] = bssid[4];
15084 fastreassoc->bssid[5] = bssid[5];
15085
15086 status = sme_get_beacon_frm(hal, profile, bssid,
15087 &fastreassoc->frame_buf,
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053015088 &fastreassoc->frame_len,
15089 &channel);
Naveen Rawat4195c5e2017-05-22 17:07:45 -070015090
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053015091 if (!channel) {
15092 sme_err("channel retrieval from BSS desc fails!");
15093 qdf_mem_free(fastreassoc);
15094 return QDF_STATUS_E_FAULT;
15095 }
15096
15097 fastreassoc->channel = channel;
Naveen Rawat4195c5e2017-05-22 17:07:45 -070015098 if (QDF_STATUS_SUCCESS != status) {
15099 sme_warn("sme_get_beacon_frm failed");
15100 fastreassoc->frame_buf = NULL;
15101 fastreassoc->frame_len = 0;
15102 }
15103
Padma, Santhosh Kumar5bc0c242017-11-29 15:44:27 +053015104 if (csr_is_auth_type_ese(mac_ctx->roam.roamSession[vdev_id].
15105 connectedProfile.AuthType)) {
15106 sme_debug("Beacon is not required for ESE");
15107 if (fastreassoc->frame_len) {
15108 qdf_mem_free(fastreassoc->frame_buf);
15109 fastreassoc->frame_buf = NULL;
15110 fastreassoc->frame_len = 0;
15111 }
15112 }
15113
Paul Zhang624f88d2018-11-07 15:29:45 +080015114 msg.type = eWNI_SME_ROAM_INVOKE;
Naveen Rawat4195c5e2017-05-22 17:07:45 -070015115 msg.reserved = 0;
15116 msg.bodyptr = fastreassoc;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053015117 status = scheduler_post_message(QDF_MODULE_ID_SME,
Paul Zhang624f88d2018-11-07 15:29:45 +080015118 QDF_MODULE_ID_PE,
15119 QDF_MODULE_ID_PE, &msg);
Naveen Rawat4195c5e2017-05-22 17:07:45 -070015120 if (QDF_STATUS_SUCCESS != status) {
Paul Zhang624f88d2018-11-07 15:29:45 +080015121 sme_err("Not able to post ROAM_INVOKE_CMD message to PE");
Naveen Rawat4195c5e2017-05-22 17:07:45 -070015122 qdf_mem_free(fastreassoc);
15123 }
15124
15125 return status;
15126}
Paul Zhangc3fc0a82018-01-09 16:38:20 +080015127#endif
Naveen Rawat4195c5e2017-05-22 17:07:45 -070015128
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053015129QDF_STATUS sme_set_del_pmkid_cache(tHalHandle hal, uint8_t session_id,
15130 tPmkidCacheInfo *pmk_cache_info,
15131 bool is_add)
15132{
15133 struct wmi_unified_pmk_cache *pmk_cache;
15134 struct scheduler_msg msg;
15135
15136 pmk_cache = qdf_mem_malloc(sizeof(*pmk_cache));
Arif Hussain0ef77082018-10-10 16:42:53 -070015137 if (!pmk_cache)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053015138 return QDF_STATUS_E_NOMEM;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053015139
Vignesh Viswanathane8a26b22017-10-11 20:38:47 +053015140 qdf_mem_set(pmk_cache, sizeof(*pmk_cache), 0);
15141
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053015142 pmk_cache->session_id = session_id;
15143
Vignesh Viswanathane8a26b22017-10-11 20:38:47 +053015144 if (!pmk_cache_info)
15145 goto send_flush_cmd;
15146
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053015147 if (!pmk_cache_info->ssid_len) {
15148 pmk_cache->cat_flag = WMI_PMK_CACHE_CAT_FLAG_BSSID;
15149 WMI_CHAR_ARRAY_TO_MAC_ADDR(pmk_cache_info->BSSID.bytes,
15150 &pmk_cache->bssid);
15151 } else {
15152 pmk_cache->cat_flag = WMI_PMK_CACHE_CAT_FLAG_SSID_CACHE_ID;
15153 pmk_cache->ssid.length = pmk_cache_info->ssid_len;
15154 qdf_mem_copy(pmk_cache->ssid.mac_ssid,
15155 pmk_cache_info->ssid,
15156 pmk_cache->ssid.length);
15157 }
15158 pmk_cache->cache_id = (uint32_t) (pmk_cache_info->cache_id[0] << 8 |
15159 pmk_cache_info->cache_id[1]);
15160
15161 if (is_add)
15162 pmk_cache->action_flag = WMI_PMK_CACHE_ACTION_FLAG_ADD_ENTRY;
15163 else
15164 pmk_cache->action_flag = WMI_PMK_CACHE_ACTION_FLAG_DEL_ENTRY;
15165
15166 pmk_cache->pmkid_len = CSR_RSN_PMKID_SIZE;
15167 qdf_mem_copy(pmk_cache->pmkid, pmk_cache_info->PMKID,
15168 CSR_RSN_PMKID_SIZE);
15169
15170 pmk_cache->pmk_len = pmk_cache_info->pmk_len;
15171 qdf_mem_copy(pmk_cache->pmk, pmk_cache_info->pmk,
15172 pmk_cache->pmk_len);
15173
Vignesh Viswanathane8a26b22017-10-11 20:38:47 +053015174send_flush_cmd:
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053015175 msg.type = SIR_HAL_SET_DEL_PMKID_CACHE;
15176 msg.reserved = 0;
15177 msg.bodyptr = pmk_cache;
15178 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +053015179 scheduler_post_message(QDF_MODULE_ID_SME,
15180 QDF_MODULE_ID_WMA,
15181 QDF_MODULE_ID_WMA, &msg)) {
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053015182 sme_err("Not able to post message to WDA");
15183 qdf_mem_free(pmk_cache);
15184 return QDF_STATUS_E_FAILURE;
15185 }
15186
15187 return QDF_STATUS_SUCCESS;
15188}
15189
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053015190/* ARP DEBUG STATS */
15191
15192/**
15193 * sme_set_nud_debug_stats() - sme api to set nud debug stats
15194 * @hal: handle to hal
15195 * @set_stats_param: pointer to set stats param
15196 *
15197 * Return: Return QDF_STATUS.
15198 */
15199QDF_STATUS sme_set_nud_debug_stats(tHalHandle hal,
15200 struct set_arp_stats_params
15201 *set_stats_param)
15202{
15203 struct set_arp_stats_params *arp_set_param;
15204 struct scheduler_msg msg;
15205
15206 arp_set_param = qdf_mem_malloc(sizeof(*arp_set_param));
Arif Hussain0ef77082018-10-10 16:42:53 -070015207 if (!arp_set_param)
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053015208 return QDF_STATUS_E_NOMEM;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053015209
15210 qdf_mem_copy(arp_set_param, set_stats_param, sizeof(*arp_set_param));
15211
15212 msg.type = WMA_SET_ARP_STATS_REQ;
15213 msg.reserved = 0;
15214 msg.bodyptr = arp_set_param;
15215
15216 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +053015217 scheduler_post_message(QDF_MODULE_ID_SME,
15218 QDF_MODULE_ID_WMA,
15219 QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053015220 sme_err("Not able to post message to WDA");
15221 qdf_mem_free(arp_set_param);
15222 return QDF_STATUS_E_FAILURE;
15223 }
15224
15225 return QDF_STATUS_SUCCESS;
15226}
15227
15228/**
15229 * sme_get_nud_debug_stats() - sme api to get nud debug stats
15230 * @hal: handle to hal
15231 * @get_stats_param: pointer to set stats param
15232 *
15233 * Return: Return QDF_STATUS.
15234 */
15235QDF_STATUS sme_get_nud_debug_stats(tHalHandle hal,
15236 struct get_arp_stats_params
15237 *get_stats_param)
15238{
15239 struct get_arp_stats_params *arp_get_param;
15240 struct scheduler_msg msg;
15241
15242 arp_get_param = qdf_mem_malloc(sizeof(*arp_get_param));
Arif Hussain0ef77082018-10-10 16:42:53 -070015243 if (!arp_get_param)
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053015244 return QDF_STATUS_E_NOMEM;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053015245
15246 qdf_mem_copy(arp_get_param, get_stats_param, sizeof(*arp_get_param));
15247
15248 msg.type = WMA_GET_ARP_STATS_REQ;
15249 msg.reserved = 0;
15250 msg.bodyptr = arp_get_param;
15251
15252 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +053015253 scheduler_post_message(QDF_MODULE_ID_SME,
15254 QDF_MODULE_ID_WMA,
15255 QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053015256 sme_err("Not able to post message to WDA");
15257 qdf_mem_free(arp_get_param);
15258 return QDF_STATUS_E_FAILURE;
15259 }
15260
15261 return QDF_STATUS_SUCCESS;
15262}
15263
Krishna Kumaar Natarajanf1581df2017-02-21 13:42:08 -080015264QDF_STATUS sme_set_peer_param(uint8_t *peer_addr, uint32_t param_id,
15265 uint32_t param_value, uint32_t vdev_id)
15266{
15267 void *wma_handle;
15268
15269 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
15270 if (!wma_handle) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -070015271 sme_err("wma handle is NULL");
Krishna Kumaar Natarajanf1581df2017-02-21 13:42:08 -080015272 return QDF_STATUS_E_FAILURE;
15273 }
15274
15275 return wma_set_peer_param(wma_handle, peer_addr, param_id,
15276 param_value, vdev_id);
15277}
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080015278
15279QDF_STATUS sme_register_set_connection_info_cb(tHalHandle hHal,
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080015280 bool (*set_connection_info_cb)(bool),
15281 bool (*get_connection_info_cb)(uint8_t *session_id,
15282 enum scan_reject_states *reason))
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080015283{
15284 QDF_STATUS status = QDF_STATUS_SUCCESS;
15285 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
15286
15287 status = sme_acquire_global_lock(&pMac->sme);
15288 if (QDF_IS_STATUS_SUCCESS(status)) {
15289 pMac->sme.set_connection_info_cb = set_connection_info_cb;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080015290 pMac->sme.get_connection_info_cb = get_connection_info_cb;
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080015291 sme_release_global_lock(&pMac->sme);
15292 }
15293 return status;
15294}
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053015295
Jeff Johnson43975142018-07-04 15:33:47 -070015296QDF_STATUS sme_rso_cmd_status_cb(mac_handle_t mac_handle,
15297 rso_cmd_status_cb cb)
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053015298{
15299 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson43975142018-07-04 15:33:47 -070015300 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053015301
15302 mac->sme.rso_cmd_status_cb = cb;
Srinivas Girigowda2c263352017-03-17 17:49:53 -070015303 sme_debug("Registered RSO command status callback");
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053015304 return status;
15305}
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070015306
Nitesh Shahf9a09ff2017-05-22 15:46:25 +053015307QDF_STATUS sme_set_dbs_scan_selection_config(tHalHandle hal,
15308 struct wmi_dbs_scan_sel_params *params)
15309{
15310 struct scheduler_msg message = {0};
15311 QDF_STATUS status;
15312 struct wmi_dbs_scan_sel_params *dbs_scan_params;
15313 uint32_t i;
15314
15315 if (0 == params->num_clients) {
15316 sme_err("Num of clients is 0");
15317 return QDF_STATUS_E_FAILURE;
15318 }
15319
15320 dbs_scan_params = qdf_mem_malloc(sizeof(*dbs_scan_params));
Arif Hussain0ef77082018-10-10 16:42:53 -070015321 if (!dbs_scan_params)
Nitesh Shahf9a09ff2017-05-22 15:46:25 +053015322 return QDF_STATUS_E_NOMEM;
Nitesh Shahf9a09ff2017-05-22 15:46:25 +053015323
15324 dbs_scan_params->num_clients = params->num_clients;
15325 dbs_scan_params->pdev_id = params->pdev_id;
15326 for (i = 0; i < params->num_clients; i++) {
15327 dbs_scan_params->module_id[i] = params->module_id[i];
15328 dbs_scan_params->num_dbs_scans[i] = params->num_dbs_scans[i];
15329 dbs_scan_params->num_non_dbs_scans[i] =
15330 params->num_non_dbs_scans[i];
15331 }
15332 message.type = WMA_SET_DBS_SCAN_SEL_CONF_PARAMS;
15333 message.bodyptr = dbs_scan_params;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053015334 status = scheduler_post_message(QDF_MODULE_ID_SME,
15335 QDF_MODULE_ID_WMA,
15336 QDF_MODULE_ID_WMA, &message);
Nitesh Shahf9a09ff2017-05-22 15:46:25 +053015337 if (!QDF_IS_STATUS_SUCCESS(status)) {
15338 sme_err("Not able to post msg to WMA!");
15339 qdf_mem_free(dbs_scan_params);
15340 }
15341
15342 return status;
15343}
15344
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053015345QDF_STATUS sme_get_rcpi(tHalHandle hal, struct sme_rcpi_req *rcpi)
15346{
15347 QDF_STATUS status = QDF_STATUS_E_FAILURE;
15348 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
Naveen Rawatb7be1ed2017-11-16 16:52:08 -080015349 struct scheduler_msg msg = {0};
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053015350 struct sme_rcpi_req *rcpi_req;
15351
15352 rcpi_req = qdf_mem_malloc(sizeof(*rcpi_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070015353 if (!rcpi_req)
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053015354 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070015355
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053015356 qdf_mem_copy(rcpi_req, rcpi, sizeof(*rcpi_req));
15357
15358 status = sme_acquire_global_lock(&pMac->sme);
15359 if (QDF_IS_STATUS_SUCCESS(status)) {
15360 msg.bodyptr = rcpi_req;
15361 msg.type = WMA_GET_RCPI_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053015362 status = scheduler_post_message(QDF_MODULE_ID_SME,
15363 QDF_MODULE_ID_WMA,
15364 QDF_MODULE_ID_WMA, &msg);
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053015365 sme_release_global_lock(&pMac->sme);
15366 if (!QDF_IS_STATUS_SUCCESS(status)) {
15367 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15368 FL("post get rcpi req failed"));
15369 status = QDF_STATUS_E_FAILURE;
15370 qdf_mem_free(rcpi_req);
15371 }
15372 } else {
15373 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15374 FL("sme_acquire_global_lock failed"));
15375 qdf_mem_free(rcpi_req);
15376 }
15377
15378 return status;
15379}
15380
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070015381void sme_store_pdev(tHalHandle hal, struct wlan_objmgr_pdev *pdev)
15382{
15383 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15384 void *wma_handle;
15385 QDF_STATUS status;
15386
Kiran Kumar Lokeref089a3a2017-04-20 21:39:26 -070015387 status = wlan_objmgr_pdev_try_get_ref(pdev, WLAN_LEGACY_MAC_ID);
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070015388 if (QDF_STATUS_SUCCESS != status) {
15389 mac_ctx->pdev = NULL;
15390 return;
15391 }
15392 mac_ctx->pdev = pdev;
15393 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
15394 if (!wma_handle) {
15395 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Kiran Kumar Lokeref089a3a2017-04-20 21:39:26 -070015396 FL("wma handle is NULL"));
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070015397 return;
15398 }
15399 wma_store_pdev(wma_handle, pdev);
15400}
15401
Padma, Santhosh Kumar16dacfb2017-03-21 19:05:40 +053015402QDF_STATUS sme_congestion_register_callback(tHalHandle hal,
Jeff Johnsonf6182e42018-07-03 14:46:17 -070015403 congestion_cb congestion_cb)
Padma, Santhosh Kumar16dacfb2017-03-21 19:05:40 +053015404{
15405 QDF_STATUS status;
15406 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15407
15408 status = sme_acquire_global_lock(&mac->sme);
15409 if (QDF_IS_STATUS_SUCCESS(status)) {
15410 mac->sme.congestion_cb = congestion_cb;
15411 sme_release_global_lock(&mac->sme);
Srinivas Girigowda2c263352017-03-17 17:49:53 -070015412 sme_debug("congestion callback set");
Padma, Santhosh Kumar16dacfb2017-03-21 19:05:40 +053015413 } else {
Srinivas Girigowda2c263352017-03-17 17:49:53 -070015414 sme_err("Aquiring lock failed %d", status);
Padma, Santhosh Kumar16dacfb2017-03-21 19:05:40 +053015415 }
15416
15417 return status;
15418}
Sandeep Puligillaf587adf2017-04-27 19:53:21 -070015419
Jeff Johnsonda2afa42018-07-04 10:25:42 -070015420QDF_STATUS sme_register_tx_queue_cb(mac_handle_t mac_handle,
15421 tx_queue_cb tx_queue_cb)
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080015422{
15423 QDF_STATUS status;
Jeff Johnsonda2afa42018-07-04 10:25:42 -070015424 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080015425
15426 status = sme_acquire_global_lock(&mac->sme);
15427 if (QDF_IS_STATUS_SUCCESS(status)) {
15428 mac->sme.tx_queue_cb = tx_queue_cb;
15429 sme_release_global_lock(&mac->sme);
15430 sme_debug("Tx queue callback set");
15431 } else {
15432 sme_err("Aquiring lock failed %d", status);
15433 }
15434
15435 return status;
15436}
15437
Jeff Johnsonda2afa42018-07-04 10:25:42 -070015438QDF_STATUS sme_deregister_tx_queue_cb(mac_handle_t mac_handle)
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080015439{
Jeff Johnsonda2afa42018-07-04 10:25:42 -070015440 return sme_register_tx_queue_cb(mac_handle, NULL);
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080015441}
15442
Varun Reddy Yeturud33033f2018-06-11 10:58:30 -070015443#ifdef WLAN_SUPPORT_TWT
Jeff Johnson3a08ff92018-07-03 19:40:44 -070015444QDF_STATUS sme_register_twt_enable_complete_cb(mac_handle_t mac_handle,
15445 twt_enable_cb twt_enable_cb)
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070015446{
15447 QDF_STATUS status;
Jeff Johnson3a08ff92018-07-03 19:40:44 -070015448 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070015449
15450 status = sme_acquire_global_lock(&mac->sme);
15451 if (QDF_IS_STATUS_SUCCESS(status)) {
15452 mac->sme.twt_enable_cb = twt_enable_cb;
15453 sme_release_global_lock(&mac->sme);
15454 sme_debug("TWT: enable callback set");
15455 } else {
15456 sme_err("Aquiring lock failed %d", status);
15457 }
15458
15459 return status;
15460}
15461
Jeff Johnson3a08ff92018-07-03 19:40:44 -070015462QDF_STATUS sme_register_twt_disable_complete_cb(mac_handle_t mac_handle,
15463 twt_disable_cb twt_disable_cb)
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070015464{
15465 QDF_STATUS status;
Jeff Johnson3a08ff92018-07-03 19:40:44 -070015466 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070015467
15468 status = sme_acquire_global_lock(&mac->sme);
15469 if (QDF_IS_STATUS_SUCCESS(status)) {
15470 mac->sme.twt_disable_cb = twt_disable_cb;
15471 sme_release_global_lock(&mac->sme);
15472 sme_debug("TWT: disable callback set");
15473 } else {
15474 sme_err("Aquiring lock failed %d", status);
15475 }
15476
15477 return status;
15478}
15479
Jeff Johnson3a08ff92018-07-03 19:40:44 -070015480QDF_STATUS sme_deregister_twt_enable_complete_cb(mac_handle_t mac_handle)
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070015481{
Jeff Johnson3a08ff92018-07-03 19:40:44 -070015482 return sme_register_twt_enable_complete_cb(mac_handle, NULL);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070015483}
15484
Jeff Johnson3a08ff92018-07-03 19:40:44 -070015485QDF_STATUS sme_deregister_twt_disable_complete_cb(mac_handle_t mac_handle)
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070015486{
Jeff Johnson3a08ff92018-07-03 19:40:44 -070015487 return sme_register_twt_disable_complete_cb(mac_handle, NULL);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070015488}
15489#endif
15490
Ashish Kumar Dhanotiyab28338c2017-07-21 20:12:34 +053015491QDF_STATUS sme_set_smps_cfg(uint32_t vdev_id, uint32_t param_id,
15492 uint32_t param_val)
15493{
15494 return wma_configure_smps_params(vdev_id, param_id, param_val);
15495}
15496
Sandeep Puligillaf587adf2017-04-27 19:53:21 -070015497QDF_STATUS sme_ipa_uc_stat_request(tHalHandle hal, uint32_t vdev_id,
15498 uint32_t param_id, uint32_t param_val, uint32_t req_cat)
15499{
Sandeep Puligillae64099d2017-05-11 16:38:27 -070015500 wma_cli_set_cmd_t *iwcmd;
15501 QDF_STATUS status = QDF_STATUS_SUCCESS;
Sandeep Puligillaf587adf2017-04-27 19:53:21 -070015502
Sandeep Puligillae64099d2017-05-11 16:38:27 -070015503 iwcmd = qdf_mem_malloc(sizeof(*iwcmd));
Arif Hussain0ef77082018-10-10 16:42:53 -070015504 if (!iwcmd)
Sandeep Puligillaf587adf2017-04-27 19:53:21 -070015505 return QDF_STATUS_E_NOMEM;
Sandeep Puligillae64099d2017-05-11 16:38:27 -070015506
15507 qdf_mem_zero(iwcmd, sizeof(*iwcmd));
15508 iwcmd->param_sec_value = 0;
15509 iwcmd->param_vdev_id = vdev_id;
15510 iwcmd->param_id = param_id;
15511 iwcmd->param_vp_dev = req_cat;
15512 iwcmd->param_value = param_val;
15513 wma_ipa_uc_stat_request(iwcmd);
15514 qdf_mem_free(iwcmd);
Sandeep Puligillaf587adf2017-04-27 19:53:21 -070015515
15516 return status;
15517}
lifeng66831662017-05-19 16:01:35 +080015518
15519QDF_STATUS sme_set_reorder_timeout(tHalHandle hal,
15520 struct sir_set_rx_reorder_timeout_val *req)
15521{
15522 QDF_STATUS status;
Zhang Qian1e7649e2018-06-04 13:07:18 +080015523 tp_wma_handle wma_handle;
lifeng66831662017-05-19 16:01:35 +080015524
Zhang Qian1e7649e2018-06-04 13:07:18 +080015525 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
15526 status = wma_set_rx_reorder_timeout_val(wma_handle, req);
lifeng66831662017-05-19 16:01:35 +080015527
15528 return status;
15529}
15530
15531QDF_STATUS sme_set_rx_set_blocksize(tHalHandle hal,
15532 struct sir_peer_set_rx_blocksize *req)
15533{
15534 QDF_STATUS status;
Zhang Qian1e7649e2018-06-04 13:07:18 +080015535 tp_wma_handle wma_handle;
lifeng66831662017-05-19 16:01:35 +080015536
Zhang Qian1e7649e2018-06-04 13:07:18 +080015537 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
15538 status = wma_set_rx_blocksize(wma_handle, req);
lifeng66831662017-05-19 16:01:35 +080015539
15540 return status;
15541}
Naveen Rawat247a8682017-06-05 15:00:31 -070015542
15543int sme_cli_set_command(int vdev_id, int param_id, int sval, int vpdev)
15544{
15545 return wma_cli_set_command(vdev_id, param_id, sval, vpdev);
15546}
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +053015547
Vignesh Viswanathana851d752018-10-03 19:44:38 +053015548int sme_set_enable_mem_deep_sleep(mac_handle_t mac_handle, int vdev_id)
15549{
15550 tpAniSirGlobal mac_ctx = MAC_CONTEXT(mac_handle);
15551
15552 return wma_cli_set_command(vdev_id, WMI_PDEV_PARAM_HYST_EN,
15553 mac_ctx->mlme_cfg->gen.memory_deep_sleep,
15554 PDEV_CMD);
15555}
15556
15557int sme_set_cck_tx_fir_override(mac_handle_t mac_handle, int vdev_id)
15558{
15559 tpAniSirGlobal mac_ctx = MAC_CONTEXT(mac_handle);
15560
15561 return wma_cli_set_command(vdev_id,
15562 WMI_PDEV_PARAM_ENABLE_CCK_TXFIR_OVERRIDE,
15563 mac_ctx->mlme_cfg->gen.cck_tx_fir_override,
15564 PDEV_CMD);
15565}
15566
Jeff Johnsond0b6c7e2018-07-04 14:53:06 -070015567QDF_STATUS sme_set_bt_activity_info_cb(mac_handle_t mac_handle,
15568 bt_activity_info_cb cb)
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +053015569{
15570 QDF_STATUS status;
Jeff Johnsond0b6c7e2018-07-04 14:53:06 -070015571 tpAniSirGlobal mac = MAC_CONTEXT(mac_handle);
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +053015572
15573 status = sme_acquire_global_lock(&mac->sme);
15574 if (QDF_IS_STATUS_SUCCESS(status)) {
15575 mac->sme.bt_activity_info_cb = cb;
15576 sme_release_global_lock(&mac->sme);
15577 sme_debug("bt activity info callback set");
15578 } else {
15579 sme_debug("sme_acquire_global_lock failed %d", status);
15580 }
15581
15582 return status;
15583}
lifengd217d192017-05-09 19:44:16 +080015584
15585QDF_STATUS sme_get_chain_rssi(tHalHandle hal,
15586 struct get_chain_rssi_req_params *input,
15587 get_chain_rssi_callback callback,
15588 void *context)
15589{
15590 QDF_STATUS status = QDF_STATUS_SUCCESS;
15591 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Zhang Qian1e7649e2018-06-04 13:07:18 +080015592 tp_wma_handle wma_handle;
lifengd217d192017-05-09 19:44:16 +080015593
15594 SME_ENTER();
15595
15596 if (NULL == input) {
15597 sme_err("Invalid req params");
15598 return QDF_STATUS_E_INVAL;
15599 }
15600
15601 mac_ctx->sme.get_chain_rssi_cb = callback;
15602 mac_ctx->sme.get_chain_rssi_context = context;
Zhang Qian1e7649e2018-06-04 13:07:18 +080015603 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
15604 wma_get_chain_rssi(wma_handle, input);
lifengd217d192017-05-09 19:44:16 +080015605
15606 SME_EXIT();
15607 return status;
15608}
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053015609
Jeff Johnson5f9ce2d2018-06-09 21:20:45 -070015610QDF_STATUS sme_process_msg_callback(tpAniSirGlobal mac,
15611 struct scheduler_msg *msg)
Sandeep Puligilla1426d612017-04-12 18:22:06 -070015612{
15613 QDF_STATUS status = QDF_STATUS_E_FAILURE;
15614
15615 if (msg == NULL) {
15616 sme_err("Empty message for SME Msg callback");
15617 return status;
15618 }
Jeff Johnson5f9ce2d2018-06-09 21:20:45 -070015619 status = sme_process_msg(mac, msg);
Sandeep Puligilla1426d612017-04-12 18:22:06 -070015620 return status;
15621}
15622
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053015623void sme_display_disconnect_stats(tHalHandle hal, uint8_t session_id)
15624{
15625 struct csr_roam_session *session;
15626 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15627
15628 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
15629 sme_err("%s Invalid session id: %d", __func__, session_id);
15630 return;
15631 }
15632
15633 session = CSR_GET_SESSION(mac_ctx, session_id);
15634 if (!session) {
15635 sme_err("%s Failed to get session for id: %d",
15636 __func__, session_id);
15637 return;
15638 }
15639
Nirav Shahe6194ac2018-07-13 11:04:41 +053015640 sme_nofl_info("Total No. of Disconnections: %d",
15641 session->disconnect_stats.disconnection_cnt);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053015642
Nirav Shahe6194ac2018-07-13 11:04:41 +053015643 sme_nofl_info("No. of Diconnects Triggered by Application: %d",
15644 session->disconnect_stats.disconnection_by_app);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053015645
Nirav Shahe6194ac2018-07-13 11:04:41 +053015646 sme_nofl_info("No. of Disassoc Sent by Peer: %d",
15647 session->disconnect_stats.disassoc_by_peer);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053015648
Nirav Shahe6194ac2018-07-13 11:04:41 +053015649 sme_nofl_info("No. of Deauth Sent by Peer: %d",
15650 session->disconnect_stats.deauth_by_peer);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053015651
Nirav Shahe6194ac2018-07-13 11:04:41 +053015652 sme_nofl_info("No. of Disconnections due to Beacon Miss: %d",
15653 session->disconnect_stats.bmiss);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053015654
Nirav Shahe6194ac2018-07-13 11:04:41 +053015655 sme_nofl_info("No. of Disconnections due to Peer Kickout: %d",
15656 session->disconnect_stats.peer_kickout);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053015657}
Nachiket Kukadeaaf8a712017-07-27 19:15:36 +053015658
Rachit Kankanef6834c42018-08-02 18:47:50 +053015659#ifdef FEATURE_WLAN_DYNAMIC_CVM
Nachiket Kukade8983cf62017-10-12 18:14:48 +053015660 /**
15661 * sme_set_vc_mode_config() - Set voltage corner config to FW
15662 * @bitmap: Bitmap that referes to voltage corner config with
15663 * different phymode and bw configuration
15664 *
15665 * Return: QDF_STATUS
15666 */
15667QDF_STATUS sme_set_vc_mode_config(uint32_t vc_bitmap)
15668{
15669 void *wma_handle;
15670
15671 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
15672 if (!wma_handle) {
15673 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15674 "wma_handle is NULL");
15675 return QDF_STATUS_E_FAILURE;
15676 }
15677 if (QDF_STATUS_SUCCESS !=
15678 wma_set_vc_mode_config(wma_handle, vc_bitmap)) {
15679 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15680 "%s: Failed to set Voltage Control config to FW",
15681 __func__);
15682 return QDF_STATUS_E_FAILURE;
15683 }
15684 return QDF_STATUS_SUCCESS;
15685}
Rachit Kankanef6834c42018-08-02 18:47:50 +053015686#endif
Nachiket Kukade8983cf62017-10-12 18:14:48 +053015687
Nachiket Kukadeaaf8a712017-07-27 19:15:36 +053015688/**
15689 * sme_set_bmiss_bcnt() - set bmiss config parameters
15690 * @vdev_id: virtual device for the command
15691 * @first_cnt: bmiss first value
15692 * @final_cnt: bmiss final value
15693 *
15694 * Return: QDF_STATUS_SUCCESS or non-zero on failure
15695 */
15696QDF_STATUS sme_set_bmiss_bcnt(uint32_t vdev_id, uint32_t first_cnt,
15697 uint32_t final_cnt)
15698{
15699 return wma_config_bmiss_bcnt_params(vdev_id, first_cnt, final_cnt);
15700}
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053015701
15702QDF_STATUS sme_send_limit_off_channel_params(tHalHandle hal, uint8_t vdev_id,
15703 bool is_tos_active, uint32_t max_off_chan_time,
15704 uint32_t rest_time, bool skip_dfs_chan)
15705{
15706 struct sir_limit_off_chan *cmd;
15707 struct scheduler_msg msg = {0};
15708
15709 cmd = qdf_mem_malloc(sizeof(*cmd));
Arif Hussain0ef77082018-10-10 16:42:53 -070015710 if (!cmd)
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053015711 return QDF_STATUS_E_NOMEM;
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053015712
15713 cmd->vdev_id = vdev_id;
15714 cmd->is_tos_active = is_tos_active;
15715 cmd->max_off_chan_time = max_off_chan_time;
15716 cmd->rest_time = rest_time;
15717 cmd->skip_dfs_chans = skip_dfs_chan;
15718
15719 msg.type = WMA_SET_LIMIT_OFF_CHAN;
15720 msg.reserved = 0;
15721 msg.bodyptr = cmd;
15722
gaurank kathpalia36b0c582018-08-28 17:45:43 +053015723 if (!QDF_IS_STATUS_SUCCESS(scheduler_post_message(QDF_MODULE_ID_SME,
15724 QDF_MODULE_ID_WMA,
15725 QDF_MODULE_ID_WMA,
15726 &msg))) {
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053015727 sme_err("Not able to post WMA_SET_LIMIT_OFF_CHAN to WMA");
15728 qdf_mem_free(cmd);
15729 return QDF_STATUS_E_FAILURE;
15730 }
15731
15732 return QDF_STATUS_SUCCESS;
15733}
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053015734
Qiwei Caie689a262018-07-26 15:50:22 +080015735uint32_t sme_unpack_rsn_ie(tHalHandle hal, uint8_t *buf,
15736 uint8_t buf_len, tDot11fIERSN *rsn_ie,
15737 bool append_ie)
15738{
15739 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15740
15741 return dot11f_unpack_ie_rsn(mac_ctx, buf, buf_len, rsn_ie, append_ie);
15742}
15743
15744#ifdef FEATURE_BSS_TRANSITION
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053015745/**
15746 * sme_get_status_for_candidate() - Get bss transition status for candidate
15747 * @hal: Handle for HAL
15748 * @conn_bss_desc: connected bss descriptor
15749 * @bss_desc: candidate bss descriptor
15750 * @info: candiadate bss information
15751 * @trans_reason: transition reason code
15752 * @is_bt_in_progress: bt activity indicator
15753 *
15754 * Return : true if candidate is rejected and reject reason is filled
15755 * @info->status. Otherwise returns false.
15756 */
Jeff Johnson22256fe2018-06-04 20:25:53 -070015757static bool sme_get_status_for_candidate(tHalHandle hal,
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053015758 tSirBssDescription *conn_bss_desc,
15759 tSirBssDescription *bss_desc,
15760 struct bss_candidate_info *info,
15761 uint8_t trans_reason,
15762 bool is_bt_in_progress)
15763{
15764 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053015765 struct wlan_mlme_mbo *mbo_cfg;
15766 int8_t current_rssi_mcc_thres;
15767
15768 if (!(mac_ctx->mlme_cfg)) {
15769 pe_err("mlme cfg is NULL");
15770 return false;
15771 }
15772 mbo_cfg = &mac_ctx->mlme_cfg->mbo_cfg;
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053015773
15774 /*
15775 * Low RSSI based rejection
15776 * If candidate rssi is less than mbo_candidate_rssi_thres and connected
15777 * bss rssi is greater than mbo_current_rssi_thres, then reject the
15778 * candidate with MBO reason code 4.
15779 */
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053015780 if ((bss_desc->rssi < mbo_cfg->mbo_candidate_rssi_thres) &&
15781 (conn_bss_desc->rssi > mbo_cfg->mbo_current_rssi_thres)) {
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053015782 sme_err("Candidate BSS "MAC_ADDRESS_STR" has LOW RSSI(%d), hence reject",
15783 MAC_ADDR_ARRAY(bss_desc->bssId), bss_desc->rssi);
15784 info->status = QCA_STATUS_REJECT_LOW_RSSI;
15785 return true;
15786 }
15787
15788 if (trans_reason == MBO_TRANSITION_REASON_LOAD_BALANCING ||
15789 trans_reason == MBO_TRANSITION_REASON_TRANSITIONING_TO_PREMIUM_AP) {
15790 /*
15791 * MCC rejection
15792 * If moving to candidate's channel will result in MCC scenario
15793 * and the rssi of connected bss is greater than
15794 * mbo_current_rssi_mss_thres, then reject the candidate with
15795 * MBO reason code 3.
15796 */
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053015797 current_rssi_mcc_thres = mbo_cfg->mbo_current_rssi_mcc_thres;
15798 if ((conn_bss_desc->rssi > current_rssi_mcc_thres) &&
Jeff Johnson9d118852018-06-10 16:54:59 -070015799 csr_is_mcc_channel(mac_ctx, bss_desc->channelId)) {
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053015800 sme_err("Candidate BSS "MAC_ADDRESS_STR" causes MCC, hence reject",
15801 MAC_ADDR_ARRAY(bss_desc->bssId));
15802 info->status =
15803 QCA_STATUS_REJECT_INSUFFICIENT_QOS_CAPACITY;
15804 return true;
15805 }
15806
15807 /*
15808 * BT coex rejection
15809 * If AP is trying to move the client from 5G to 2.4G and moving
15810 * to 2.4G will result in BT coex and candidate channel rssi is
15811 * less than mbo_candidate_rssi_btc_thres, then reject the
15812 * candidate with MBO reason code 2.
15813 */
15814 if (WLAN_REG_IS_5GHZ_CH(conn_bss_desc->channelId) &&
15815 WLAN_REG_IS_24GHZ_CH(bss_desc->channelId) &&
15816 is_bt_in_progress &&
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053015817 (bss_desc->rssi < mbo_cfg->mbo_candidate_rssi_btc_thres)) {
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053015818 sme_err("Candidate BSS "MAC_ADDRESS_STR" causes BT coex, hence reject",
15819 MAC_ADDR_ARRAY(bss_desc->bssId));
15820 info->status =
15821 QCA_STATUS_REJECT_EXCESSIVE_DELAY_EXPECTED;
15822 return true;
15823 }
15824
15825 /*
15826 * LTE coex rejection
15827 * If moving to candidate's channel can cause LTE coex, then
15828 * reject the candidate with MBO reason code 5.
15829 */
15830 if (policy_mgr_is_safe_channel(mac_ctx->psoc,
15831 conn_bss_desc->channelId) &&
15832 !(policy_mgr_is_safe_channel(mac_ctx->psoc,
15833 bss_desc->channelId))) {
15834 sme_err("High interference expected if transitioned to BSS "
15835 MAC_ADDRESS_STR" hence reject",
15836 MAC_ADDR_ARRAY(bss_desc->bssId));
15837 info->status =
15838 QCA_STATUS_REJECT_HIGH_INTERFERENCE;
15839 return true;
15840 }
15841 }
15842
15843 return false;
15844}
15845
15846/**
15847 * wlan_hdd_get_bss_transition_status() - get bss transition status all cadidates
15848 * @adapter : Pointer to adapter
15849 * @transition_reason : Transition reason
15850 * @info : bss candidate information
15851 * @n_candidates : number of candidates
15852 *
15853 * Return : 0 on success otherwise errno
15854 */
15855int sme_get_bss_transition_status(tHalHandle hal,
15856 uint8_t transition_reason,
15857 struct qdf_mac_addr *bssid,
15858 struct bss_candidate_info *info,
15859 uint16_t n_candidates,
15860 bool is_bt_in_progress)
15861{
15862 QDF_STATUS status = QDF_STATUS_SUCCESS;
15863 tSirBssDescription *bss_desc, *conn_bss_desc;
15864 tCsrScanResultInfo *res, *conn_res;
15865 uint16_t i;
15866
15867 if (!n_candidates || !info) {
15868 sme_err("No candidate info available");
15869 return QDF_STATUS_E_INVAL;
15870 }
15871
15872 conn_res = qdf_mem_malloc(sizeof(tCsrScanResultInfo));
Arif Hussain0ef77082018-10-10 16:42:53 -070015873 if (!conn_res)
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053015874 return QDF_STATUS_E_NOMEM;
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053015875
15876 res = qdf_mem_malloc(sizeof(tCsrScanResultInfo));
15877 if (!res) {
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053015878 status = QDF_STATUS_E_NOMEM;
15879 goto free;
15880 }
15881
15882 /* Get the connected BSS descriptor */
15883 status = sme_scan_get_result_for_bssid(hal, bssid, conn_res);
15884 if (!QDF_IS_STATUS_SUCCESS(status)) {
15885 sme_err("Failed to find connected BSS in scan list");
15886 goto free;
15887 }
15888 conn_bss_desc = &conn_res->BssDescriptor;
15889
15890 for (i = 0; i < n_candidates; i++) {
15891 /* Get candidate BSS descriptors */
15892 status = sme_scan_get_result_for_bssid(hal, &info[i].bssid,
15893 res);
15894 if (!QDF_IS_STATUS_SUCCESS(status)) {
15895 sme_err("BSS "MAC_ADDRESS_STR" not present in scan list",
15896 MAC_ADDR_ARRAY(info[i].bssid.bytes));
15897 info[i].status = QCA_STATUS_REJECT_UNKNOWN;
15898 continue;
15899 }
15900
15901 bss_desc = &res->BssDescriptor;
15902 if (!sme_get_status_for_candidate(hal, conn_bss_desc, bss_desc,
15903 &info[i], transition_reason, is_bt_in_progress)) {
15904 /*
15905 * If status is not over written, it means it is a
15906 * candidate for accept.
15907 */
15908 info[i].status = QCA_STATUS_ACCEPT;
15909 }
15910 }
15911
15912 /* success */
15913 status = QDF_STATUS_SUCCESS;
15914
15915free:
15916 /* free allocated memory */
15917 if (conn_res)
15918 qdf_mem_free(conn_res);
15919 if (res)
15920 qdf_mem_free(res);
15921
15922 return status;
15923}
Qiwei Caie689a262018-07-26 15:50:22 +080015924#endif /* FEATURE_BSS_TRANSITION */
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053015925
Vignesh Viswanathan79f7e3f2018-09-30 23:56:10 +053015926bool sme_is_conn_state_connected(mac_handle_t hal, uint8_t session_id)
15927{
15928 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15929
15930 return csr_is_conn_state_connected(mac_ctx, session_id);
15931}
15932
Abhishek Singh1f217ec2017-12-22 11:48:27 +053015933void sme_enable_roaming_on_connected_sta(tHalHandle hal)
15934{
15935 uint8_t session_id;
15936 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15937 QDF_STATUS status;
15938
15939 session_id = csr_get_roam_enabled_sta_sessionid(mac_ctx);
15940 if (session_id != CSR_SESSION_ID_INVALID)
15941 return;
15942
15943 session_id = csr_get_connected_infra(mac_ctx);
15944 if (session_id == CSR_SESSION_ID_INVALID) {
15945 sme_debug("No STA in conencted state");
15946 return;
15947 }
15948
15949 sme_debug("Roaming not enabled on any STA, enable roaming on session %d",
15950 session_id);
15951 status = sme_acquire_global_lock(&mac_ctx->sme);
15952 if (QDF_IS_STATUS_SUCCESS(status)) {
15953 csr_roam_offload_scan(mac_ctx, session_id,
15954 ROAM_SCAN_OFFLOAD_START,
15955 REASON_CTX_INIT);
15956 sme_release_global_lock(&mac_ctx->sme);
15957 }
Sandeep Puligilla063a4342018-01-10 02:50:14 -080015958}
Abhishek Singh1f217ec2017-12-22 11:48:27 +053015959
Sandeep Puligilla063a4342018-01-10 02:50:14 -080015960int16_t sme_get_oper_chan_freq(struct wlan_objmgr_vdev *vdev)
15961{
15962 uint8_t vdev_id, chan;
15963 struct csr_roam_session *session;
15964 tpAniSirGlobal mac_ctx;
15965 tHalHandle h_hal;
15966 int16_t freq = 0;
15967
15968 if (vdev == NULL) {
15969 sme_err("Invalid vdev id is passed");
15970 return 0;
15971 }
15972
15973 h_hal = cds_get_context(QDF_MODULE_ID_SME);
Arif Hussaind15902c2018-03-02 00:08:29 -080015974 if (!h_hal) {
15975 sme_err("h_hal is null");
15976 return 0;
15977 }
Sandeep Puligilla063a4342018-01-10 02:50:14 -080015978 mac_ctx = PMAC_STRUCT(h_hal);
15979 vdev_id = wlan_vdev_get_id(vdev);
15980 if (!CSR_IS_SESSION_VALID(mac_ctx, vdev_id)) {
15981 sme_err("Invalid vdev id is passed");
15982 return 0;
15983 }
15984
15985 session = CSR_GET_SESSION(mac_ctx, vdev_id);
15986 chan = csr_get_infra_operation_channel(mac_ctx, vdev_id);
15987 if (chan)
15988 freq = cds_chan_to_freq(chan);
15989
15990 return freq;
15991}
15992
15993enum phy_ch_width sme_get_oper_ch_width(struct wlan_objmgr_vdev *vdev)
15994{
15995 uint8_t vdev_id;
15996 struct csr_roam_session *session;
15997 tpAniSirGlobal mac_ctx;
15998 tHalHandle h_hal;
15999 enum phy_ch_width ch_width = CH_WIDTH_20MHZ;
16000
16001 if (vdev == NULL) {
16002 sme_err("Invalid vdev id is passed");
16003 return CH_WIDTH_INVALID;
16004 }
16005
16006 h_hal = cds_get_context(QDF_MODULE_ID_SME);
Arif Hussaind15902c2018-03-02 00:08:29 -080016007 if (!h_hal) {
16008 sme_err("h_hal is null");
16009 return CH_WIDTH_INVALID;
16010 }
Sandeep Puligilla063a4342018-01-10 02:50:14 -080016011 mac_ctx = PMAC_STRUCT(h_hal);
16012 vdev_id = wlan_vdev_get_id(vdev);
16013 if (!CSR_IS_SESSION_VALID(mac_ctx, vdev_id)) {
16014 sme_err("Invalid vdev id is passed");
16015 return CH_WIDTH_INVALID;
16016 }
16017
16018 session = CSR_GET_SESSION(mac_ctx, vdev_id);
16019
16020 if (csr_is_conn_state_connected(mac_ctx, vdev_id))
16021 ch_width = session->connectedProfile.vht_channel_width;
16022
16023 return ch_width;
16024}
16025
16026int sme_get_sec20chan_freq_mhz(struct wlan_objmgr_vdev *vdev,
16027 uint16_t *sec20chan_freq)
16028{
16029 uint8_t vdev_id;
16030
16031 vdev_id = wlan_vdev_get_id(vdev);
16032 /* Need to extend */
16033 return 0;
Abhishek Singh1f217ec2017-12-22 11:48:27 +053016034}
16035
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053016036#ifdef WLAN_FEATURE_SAE
16037QDF_STATUS sme_handle_sae_msg(tHalHandle hal, uint8_t session_id,
16038 uint8_t sae_status)
16039{
16040 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
16041 tpAniSirGlobal mac = PMAC_STRUCT(hal);
16042 struct sir_sae_msg *sae_msg;
16043 struct scheduler_msg sch_msg = {0};
16044
16045 qdf_status = sme_acquire_global_lock(&mac->sme);
16046 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
16047 sae_msg = qdf_mem_malloc(sizeof(*sae_msg));
16048 if (!sae_msg) {
16049 qdf_status = QDF_STATUS_E_NOMEM;
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053016050 } else {
16051 sae_msg->message_type = eWNI_SME_SEND_SAE_MSG;
16052 sae_msg->length = sizeof(*sae_msg);
16053 sae_msg->session_id = session_id;
16054 sae_msg->sae_status = sae_status;
16055 sme_debug("SAE: sae_status %d session_id %d",
16056 sae_msg->sae_status,
16057 sae_msg->session_id);
16058
16059 sch_msg.type = eWNI_SME_SEND_SAE_MSG;
16060 sch_msg.bodyptr = sae_msg;
16061
16062 qdf_status =
gaurank kathpalia36b0c582018-08-28 17:45:43 +053016063 scheduler_post_message(QDF_MODULE_ID_SME,
16064 QDF_MODULE_ID_PE,
16065 QDF_MODULE_ID_PE,
16066 &sch_msg);
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053016067 }
16068 sme_release_global_lock(&mac->sme);
16069 }
16070
16071 return qdf_status;
16072}
16073#endif
Vignesh Viswanathan0a569292018-02-14 15:34:47 +053016074
16075bool sme_is_sta_key_exchange_in_progress(tHalHandle hal, uint8_t session_id)
16076{
16077 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16078
16079 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
16080 sme_err("Invalid session id: %d", session_id);
16081 return false;
16082 }
16083
16084 return CSR_IS_WAIT_FOR_KEY(mac_ctx, session_id);
16085}
Vignesh Viswanathana2f5ce582018-05-09 20:38:39 +053016086
16087bool sme_validate_channel_list(tHalHandle hal,
16088 uint8_t *chan_list,
16089 uint8_t num_channels)
16090{
16091 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16092 uint8_t i = 0;
16093 uint8_t j;
16094 bool found;
16095 struct csr_channel *ch_lst_info = &mac_ctx->scan.base_channels;
16096
16097 if (!chan_list || !num_channels) {
16098 sme_err("Chan list empty %pK or num_channels is 0", chan_list);
16099 return false;
16100 }
16101
16102 while (i < num_channels) {
16103 found = false;
16104 for (j = 0; j < ch_lst_info->numChannels; j++) {
16105 if (ch_lst_info->channelList[j] == chan_list[i]) {
16106 found = true;
16107 break;
16108 }
16109 }
16110
16111 if (!found) {
16112 sme_debug("Invalid channel %d", chan_list[i]);
16113 return false;
16114 }
16115
16116 i++;
16117 }
Arif Hussain0e246802018-05-01 18:13:44 -070016118
Vignesh Viswanathana2f5ce582018-05-09 20:38:39 +053016119 return true;
16120}
Arif Hussain0e246802018-05-01 18:13:44 -070016121
16122void sme_set_amsdu(tHalHandle hal, bool enable)
16123{
16124 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16125 mac_ctx->is_usr_cfg_amsdu_enabled = enable;
16126}
Naveen Rawatfa2a1002018-05-17 16:06:37 -070016127
16128uint8_t sme_get_mcs_idx(uint16_t max_rate, uint8_t rate_flags,
Hanumanth Reddy Pothula834f9432018-05-30 14:20:32 +053016129 uint8_t *nss, uint8_t *mcs_rate_flags)
Naveen Rawatfa2a1002018-05-17 16:06:37 -070016130{
16131 return wma_get_mcs_idx(max_rate, rate_flags, nss, mcs_rate_flags);
16132}
Chaoli Zhou75b062f2018-06-11 12:36:54 +080016133
16134bool sme_find_session_by_bssid(tHalHandle hal, uint8_t *bssid)
16135{
16136 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16137 bool ret;
16138
16139 ret = csr_find_session_by_bssid(mac_ctx, bssid);
16140
16141 return ret;
16142}
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053016143
16144QDF_STATUS
16145sme_get_roam_scan_stats(tHalHandle hal, roam_scan_stats_cb cb, void *context,
16146 uint32_t vdev_id)
16147{
16148 QDF_STATUS status = QDF_STATUS_E_FAILURE;
16149 tpAniSirGlobal mac = PMAC_STRUCT(hal);
16150 struct scheduler_msg msg = {0};
16151 struct sir_roam_scan_stats *req;
16152
16153 req = qdf_mem_malloc(sizeof(*req));
Arif Hussain0ef77082018-10-10 16:42:53 -070016154 if (!req)
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053016155 return QDF_STATUS_E_NOMEM;
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053016156
16157 req->vdev_id = vdev_id;
16158 req->cb = cb;
16159 req->context = context;
16160
16161 status = sme_acquire_global_lock(&mac->sme);
16162 if (QDF_IS_STATUS_SUCCESS(status)) {
16163 msg.bodyptr = req;
16164 msg.type = WMA_GET_ROAM_SCAN_STATS;
16165 msg.reserved = 0;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053016166 status = scheduler_post_message(QDF_MODULE_ID_SME,
16167 QDF_MODULE_ID_WMA,
16168 QDF_MODULE_ID_WMA,
16169 &msg);
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053016170 sme_release_global_lock(&mac->sme);
16171 if (!QDF_IS_STATUS_SUCCESS(status)) {
16172 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16173 FL("post roam scan stats req failed"));
16174 status = QDF_STATUS_E_FAILURE;
16175 qdf_mem_free(req);
16176 }
16177 } else {
16178 sme_err("sme_acquire_global_lock failed");
16179 qdf_mem_free(req);
16180 }
16181
16182 return status;
16183}
Vignesh Viswanathan987f0bb2018-09-17 17:00:29 +053016184
16185void sme_update_score_config(tHalHandle hal,
16186 struct scoring_config *score_config)
16187{
16188 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16189 struct wlan_mlme_scoring_cfg *mlme_scoring_cfg;
16190
16191 mlme_scoring_cfg = &mac_ctx->mlme_cfg->scoring;
16192
16193 score_config->weight_cfg.rssi_weightage =
16194 mlme_scoring_cfg->weight_cfg.rssi_weightage;
16195 score_config->weight_cfg.ht_caps_weightage =
16196 mlme_scoring_cfg->weight_cfg.ht_caps_weightage;
16197 score_config->weight_cfg.vht_caps_weightage =
16198 mlme_scoring_cfg->weight_cfg.vht_caps_weightage;
16199 score_config->weight_cfg.he_caps_weightage =
16200 mlme_scoring_cfg->weight_cfg.he_caps_weightage;
16201 score_config->weight_cfg.chan_width_weightage =
16202 mlme_scoring_cfg->weight_cfg.chan_width_weightage;
16203 score_config->weight_cfg.chan_band_weightage =
16204 mlme_scoring_cfg->weight_cfg.chan_band_weightage;
16205 score_config->weight_cfg.nss_weightage =
16206 mlme_scoring_cfg->weight_cfg.nss_weightage;
16207 score_config->weight_cfg.beamforming_cap_weightage =
16208 mlme_scoring_cfg->weight_cfg.beamforming_cap_weightage;
16209 score_config->weight_cfg.pcl_weightage =
16210 mlme_scoring_cfg->weight_cfg.pcl_weightage;
16211 score_config->weight_cfg.channel_congestion_weightage =
16212 mlme_scoring_cfg->weight_cfg.channel_congestion_weightage;
16213 score_config->weight_cfg.oce_wan_weightage =
16214 mlme_scoring_cfg->weight_cfg.oce_wan_weightage;
16215
16216 score_config->bandwidth_weight_per_index =
16217 mlme_scoring_cfg->bandwidth_weight_per_index;
16218 score_config->nss_weight_per_index =
16219 mlme_scoring_cfg->nss_weight_per_index;
16220 score_config->band_weight_per_index =
16221 mlme_scoring_cfg->band_weight_per_index;
16222
16223 score_config->rssi_score.best_rssi_threshold =
16224 mlme_scoring_cfg->rssi_score.best_rssi_threshold;
16225 score_config->rssi_score.good_rssi_threshold =
16226 mlme_scoring_cfg->rssi_score.good_rssi_threshold;
16227 score_config->rssi_score.bad_rssi_threshold =
16228 mlme_scoring_cfg->rssi_score.bad_rssi_threshold;
16229 score_config->rssi_score.good_rssi_pcnt =
16230 mlme_scoring_cfg->rssi_score.good_rssi_pcnt;
16231 score_config->rssi_score.bad_rssi_pcnt =
16232 mlme_scoring_cfg->rssi_score.bad_rssi_pcnt;
16233 score_config->rssi_score.good_rssi_bucket_size =
16234 mlme_scoring_cfg->rssi_score.good_rssi_bucket_size;
16235 score_config->rssi_score.bad_rssi_bucket_size =
16236 mlme_scoring_cfg->rssi_score.bad_rssi_bucket_size;
16237 score_config->rssi_score.rssi_pref_5g_rssi_thresh =
16238 mlme_scoring_cfg->rssi_score.rssi_pref_5g_rssi_thresh;
16239
16240 score_config->esp_qbss_scoring.num_slot =
16241 mlme_scoring_cfg->esp_qbss_scoring.num_slot;
16242 score_config->esp_qbss_scoring.score_pcnt3_to_0 =
16243 mlme_scoring_cfg->esp_qbss_scoring.score_pcnt3_to_0;
16244 score_config->esp_qbss_scoring.score_pcnt7_to_4 =
16245 mlme_scoring_cfg->esp_qbss_scoring.score_pcnt7_to_4;
16246 score_config->esp_qbss_scoring.score_pcnt11_to_8 =
16247 mlme_scoring_cfg->esp_qbss_scoring.score_pcnt11_to_8;
16248 score_config->esp_qbss_scoring.score_pcnt15_to_12 =
16249 mlme_scoring_cfg->esp_qbss_scoring.score_pcnt15_to_12;
16250
16251 score_config->oce_wan_scoring.num_slot =
16252 mlme_scoring_cfg->oce_wan_scoring.num_slot;
16253 score_config->oce_wan_scoring.score_pcnt3_to_0 =
16254 mlme_scoring_cfg->oce_wan_scoring.score_pcnt3_to_0;
16255 score_config->oce_wan_scoring.score_pcnt7_to_4 =
16256 mlme_scoring_cfg->oce_wan_scoring.score_pcnt7_to_4;
16257 score_config->oce_wan_scoring.score_pcnt11_to_8 =
16258 mlme_scoring_cfg->oce_wan_scoring.score_pcnt11_to_8;
16259 score_config->oce_wan_scoring.score_pcnt15_to_12 =
16260 mlme_scoring_cfg->oce_wan_scoring.score_pcnt15_to_12;
16261}